Use Google3 style guide with .clang-format

Test: style change only, builds ok
Change-Id: I885180e24cb2e7b58cfb4967c3bcb40058ce4078
diff --git a/tools/aapt2/.clang-format b/tools/aapt2/.clang-format
new file mode 100644
index 0000000..71c5ef2
--- /dev/null
+++ b/tools/aapt2/.clang-format
@@ -0,0 +1,3 @@
+BasedOnStyle: Google
+ColumnLimit: 100
+
diff --git a/tools/aapt2/AppInfo.h b/tools/aapt2/AppInfo.h
index a9794a4..2cbe117 100644
--- a/tools/aapt2/AppInfo.h
+++ b/tools/aapt2/AppInfo.h
@@ -28,27 +28,27 @@
  * will come from the app's AndroidManifest.
  */
 struct AppInfo {
-    /**
-     * App's package name.
-     */
-    std::string package;
+  /**
+   * App's package name.
+   */
+  std::string package;
 
-    /**
-     * The App's minimum SDK version.
-     */
-    Maybe<std::string> minSdkVersion;
+  /**
+   * The App's minimum SDK version.
+   */
+  Maybe<std::string> minSdkVersion;
 
-    /**
-     * The Version code of the app.
-     */
-    Maybe<uint32_t> versionCode;
+  /**
+   * The Version code of the app.
+   */
+  Maybe<uint32_t> versionCode;
 
-    /**
-     * The revision code of the app.
-     */
-    Maybe<uint32_t> revisionCode;
+  /**
+   * The revision code of the app.
+   */
+  Maybe<uint32_t> revisionCode;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_APP_INFO_H
+#endif  // AAPT_APP_INFO_H
diff --git a/tools/aapt2/ConfigDescription.cpp b/tools/aapt2/ConfigDescription.cpp
index 1812d96..6598d63 100644
--- a/tools/aapt2/ConfigDescription.cpp
+++ b/tools/aapt2/ConfigDescription.cpp
@@ -31,854 +31,869 @@
 static const char* kWildcardName = "any";
 
 const ConfigDescription& ConfigDescription::defaultConfig() {
-    static ConfigDescription config = {};
-    return config;
+  static ConfigDescription config = {};
+  return config;
 }
 
 static bool parseMcc(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->mcc = 0;
-        return true;
-    }
-    const char* c = name;
-    if (tolower(*c) != 'm') return false;
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out) out->mcc = 0;
+    return true;
+  }
+  const char* c = name;
+  if (tolower(*c) != 'm') return false;
+  c++;
+  if (tolower(*c) != 'c') return false;
+  c++;
+  if (tolower(*c) != 'c') return false;
+  c++;
+
+  const char* val = c;
+
+  while (*c >= '0' && *c <= '9') {
     c++;
-    if (tolower(*c) != 'c') return false;
-    c++;
-    if (tolower(*c) != 'c') return false;
-    c++;
+  }
+  if (*c != 0) return false;
+  if (c - val != 3) return false;
 
-    const char* val = c;
+  int d = atoi(val);
+  if (d != 0) {
+    if (out) out->mcc = d;
+    return true;
+  }
 
-    while (*c >= '0' && *c <= '9') {
-        c++;
-    }
-    if (*c != 0) return false;
-    if (c-val != 3) return false;
-
-    int d = atoi(val);
-    if (d != 0) {
-        if (out) out->mcc = d;
-        return true;
-    }
-
-    return false;
+  return false;
 }
 
 static bool parseMnc(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->mcc = 0;
-        return true;
-    }
-    const char* c = name;
-    if (tolower(*c) != 'm') return false;
-    c++;
-    if (tolower(*c) != 'n') return false;
-    c++;
-    if (tolower(*c) != 'c') return false;
-    c++;
-
-    const char* val = c;
-
-    while (*c >= '0' && *c <= '9') {
-        c++;
-    }
-    if (*c != 0) return false;
-    if (c-val == 0 || c-val > 3) return false;
-
-    if (out) {
-        out->mnc = atoi(val);
-        if (out->mnc == 0) {
-            out->mnc = ACONFIGURATION_MNC_ZERO;
-        }
-    }
-
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out) out->mcc = 0;
     return true;
+  }
+  const char* c = name;
+  if (tolower(*c) != 'm') return false;
+  c++;
+  if (tolower(*c) != 'n') return false;
+  c++;
+  if (tolower(*c) != 'c') return false;
+  c++;
+
+  const char* val = c;
+
+  while (*c >= '0' && *c <= '9') {
+    c++;
+  }
+  if (*c != 0) return false;
+  if (c - val == 0 || c - val > 3) return false;
+
+  if (out) {
+    out->mnc = atoi(val);
+    if (out->mnc == 0) {
+      out->mnc = ACONFIGURATION_MNC_ZERO;
+    }
+  }
+
+  return true;
 }
 
 static bool parseLayoutDirection(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->screenLayout =
-                (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
-                | ResTable_config::LAYOUTDIR_ANY;
-        return true;
-    } else if (strcmp(name, "ldltr") == 0) {
-        if (out) out->screenLayout =
-                (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
-                | ResTable_config::LAYOUTDIR_LTR;
-        return true;
-    } else if (strcmp(name, "ldrtl") == 0) {
-        if (out) out->screenLayout =
-                (out->screenLayout&~ResTable_config::MASK_LAYOUTDIR)
-                | ResTable_config::LAYOUTDIR_RTL;
-        return true;
-    }
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out)
+      out->screenLayout =
+          (out->screenLayout & ~ResTable_config::MASK_LAYOUTDIR) |
+          ResTable_config::LAYOUTDIR_ANY;
+    return true;
+  } else if (strcmp(name, "ldltr") == 0) {
+    if (out)
+      out->screenLayout =
+          (out->screenLayout & ~ResTable_config::MASK_LAYOUTDIR) |
+          ResTable_config::LAYOUTDIR_LTR;
+    return true;
+  } else if (strcmp(name, "ldrtl") == 0) {
+    if (out)
+      out->screenLayout =
+          (out->screenLayout & ~ResTable_config::MASK_LAYOUTDIR) |
+          ResTable_config::LAYOUTDIR_RTL;
+    return true;
+  }
 
-    return false;
+  return false;
 }
 
 static bool parseScreenLayoutSize(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->screenLayout =
-                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
-                | ResTable_config::SCREENSIZE_ANY;
-        return true;
-    } else if (strcmp(name, "small") == 0) {
-        if (out) out->screenLayout =
-                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
-                | ResTable_config::SCREENSIZE_SMALL;
-        return true;
-    } else if (strcmp(name, "normal") == 0) {
-        if (out) out->screenLayout =
-                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
-                | ResTable_config::SCREENSIZE_NORMAL;
-        return true;
-    } else if (strcmp(name, "large") == 0) {
-        if (out) out->screenLayout =
-                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
-                | ResTable_config::SCREENSIZE_LARGE;
-        return true;
-    } else if (strcmp(name, "xlarge") == 0) {
-        if (out) out->screenLayout =
-                (out->screenLayout&~ResTable_config::MASK_SCREENSIZE)
-                | ResTable_config::SCREENSIZE_XLARGE;
-        return true;
-    }
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out)
+      out->screenLayout =
+          (out->screenLayout & ~ResTable_config::MASK_SCREENSIZE) |
+          ResTable_config::SCREENSIZE_ANY;
+    return true;
+  } else if (strcmp(name, "small") == 0) {
+    if (out)
+      out->screenLayout =
+          (out->screenLayout & ~ResTable_config::MASK_SCREENSIZE) |
+          ResTable_config::SCREENSIZE_SMALL;
+    return true;
+  } else if (strcmp(name, "normal") == 0) {
+    if (out)
+      out->screenLayout =
+          (out->screenLayout & ~ResTable_config::MASK_SCREENSIZE) |
+          ResTable_config::SCREENSIZE_NORMAL;
+    return true;
+  } else if (strcmp(name, "large") == 0) {
+    if (out)
+      out->screenLayout =
+          (out->screenLayout & ~ResTable_config::MASK_SCREENSIZE) |
+          ResTable_config::SCREENSIZE_LARGE;
+    return true;
+  } else if (strcmp(name, "xlarge") == 0) {
+    if (out)
+      out->screenLayout =
+          (out->screenLayout & ~ResTable_config::MASK_SCREENSIZE) |
+          ResTable_config::SCREENSIZE_XLARGE;
+    return true;
+  }
 
-    return false;
+  return false;
 }
 
 static bool parseScreenLayoutLong(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->screenLayout =
-                (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
-                | ResTable_config::SCREENLONG_ANY;
-        return true;
-    } else if (strcmp(name, "long") == 0) {
-        if (out) out->screenLayout =
-                (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
-                | ResTable_config::SCREENLONG_YES;
-        return true;
-    } else if (strcmp(name, "notlong") == 0) {
-        if (out) out->screenLayout =
-                (out->screenLayout&~ResTable_config::MASK_SCREENLONG)
-                | ResTable_config::SCREENLONG_NO;
-        return true;
-    }
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out)
+      out->screenLayout =
+          (out->screenLayout & ~ResTable_config::MASK_SCREENLONG) |
+          ResTable_config::SCREENLONG_ANY;
+    return true;
+  } else if (strcmp(name, "long") == 0) {
+    if (out)
+      out->screenLayout =
+          (out->screenLayout & ~ResTable_config::MASK_SCREENLONG) |
+          ResTable_config::SCREENLONG_YES;
+    return true;
+  } else if (strcmp(name, "notlong") == 0) {
+    if (out)
+      out->screenLayout =
+          (out->screenLayout & ~ResTable_config::MASK_SCREENLONG) |
+          ResTable_config::SCREENLONG_NO;
+    return true;
+  }
 
-    return false;
+  return false;
 }
 
 static bool parseScreenRound(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->screenLayout2 =
-                (out->screenLayout2&~ResTable_config::MASK_SCREENROUND)
-                | ResTable_config::SCREENROUND_ANY;
-        return true;
-    } else if (strcmp(name, "round") == 0) {
-        if (out) out->screenLayout2 =
-                (out->screenLayout2&~ResTable_config::MASK_SCREENROUND)
-                | ResTable_config::SCREENROUND_YES;
-        return true;
-    } else if (strcmp(name, "notround") == 0) {
-        if (out) out->screenLayout2 =
-                (out->screenLayout2&~ResTable_config::MASK_SCREENROUND)
-                | ResTable_config::SCREENROUND_NO;
-        return true;
-    }
-    return false;
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out)
+      out->screenLayout2 =
+          (out->screenLayout2 & ~ResTable_config::MASK_SCREENROUND) |
+          ResTable_config::SCREENROUND_ANY;
+    return true;
+  } else if (strcmp(name, "round") == 0) {
+    if (out)
+      out->screenLayout2 =
+          (out->screenLayout2 & ~ResTable_config::MASK_SCREENROUND) |
+          ResTable_config::SCREENROUND_YES;
+    return true;
+  } else if (strcmp(name, "notround") == 0) {
+    if (out)
+      out->screenLayout2 =
+          (out->screenLayout2 & ~ResTable_config::MASK_SCREENROUND) |
+          ResTable_config::SCREENROUND_NO;
+    return true;
+  }
+  return false;
 }
 
 static bool parseOrientation(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->orientation = out->ORIENTATION_ANY;
-        return true;
-    } else if (strcmp(name, "port") == 0) {
-        if (out) out->orientation = out->ORIENTATION_PORT;
-        return true;
-    } else if (strcmp(name, "land") == 0) {
-        if (out) out->orientation = out->ORIENTATION_LAND;
-        return true;
-    } else if (strcmp(name, "square") == 0) {
-        if (out) out->orientation = out->ORIENTATION_SQUARE;
-        return true;
-    }
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out) out->orientation = out->ORIENTATION_ANY;
+    return true;
+  } else if (strcmp(name, "port") == 0) {
+    if (out) out->orientation = out->ORIENTATION_PORT;
+    return true;
+  } else if (strcmp(name, "land") == 0) {
+    if (out) out->orientation = out->ORIENTATION_LAND;
+    return true;
+  } else if (strcmp(name, "square") == 0) {
+    if (out) out->orientation = out->ORIENTATION_SQUARE;
+    return true;
+  }
 
-    return false;
+  return false;
 }
 
 static bool parseUiModeType(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->uiMode =
-                (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
-                | ResTable_config::UI_MODE_TYPE_ANY;
-        return true;
-    } else if (strcmp(name, "desk") == 0) {
-      if (out) out->uiMode =
-              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
-              | ResTable_config::UI_MODE_TYPE_DESK;
-        return true;
-    } else if (strcmp(name, "car") == 0) {
-      if (out) out->uiMode =
-              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
-              | ResTable_config::UI_MODE_TYPE_CAR;
-        return true;
-    } else if (strcmp(name, "television") == 0) {
-      if (out) out->uiMode =
-              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
-              | ResTable_config::UI_MODE_TYPE_TELEVISION;
-        return true;
-    } else if (strcmp(name, "appliance") == 0) {
-      if (out) out->uiMode =
-              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
-              | ResTable_config::UI_MODE_TYPE_APPLIANCE;
-        return true;
-    } else if (strcmp(name, "watch") == 0) {
-      if (out) out->uiMode =
-              (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE)
-              | ResTable_config::UI_MODE_TYPE_WATCH;
-        return true;
-    }
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out)
+      out->uiMode = (out->uiMode & ~ResTable_config::MASK_UI_MODE_TYPE) |
+                    ResTable_config::UI_MODE_TYPE_ANY;
+    return true;
+  } else if (strcmp(name, "desk") == 0) {
+    if (out)
+      out->uiMode = (out->uiMode & ~ResTable_config::MASK_UI_MODE_TYPE) |
+                    ResTable_config::UI_MODE_TYPE_DESK;
+    return true;
+  } else if (strcmp(name, "car") == 0) {
+    if (out)
+      out->uiMode = (out->uiMode & ~ResTable_config::MASK_UI_MODE_TYPE) |
+                    ResTable_config::UI_MODE_TYPE_CAR;
+    return true;
+  } else if (strcmp(name, "television") == 0) {
+    if (out)
+      out->uiMode = (out->uiMode & ~ResTable_config::MASK_UI_MODE_TYPE) |
+                    ResTable_config::UI_MODE_TYPE_TELEVISION;
+    return true;
+  } else if (strcmp(name, "appliance") == 0) {
+    if (out)
+      out->uiMode = (out->uiMode & ~ResTable_config::MASK_UI_MODE_TYPE) |
+                    ResTable_config::UI_MODE_TYPE_APPLIANCE;
+    return true;
+  } else if (strcmp(name, "watch") == 0) {
+    if (out)
+      out->uiMode = (out->uiMode & ~ResTable_config::MASK_UI_MODE_TYPE) |
+                    ResTable_config::UI_MODE_TYPE_WATCH;
+    return true;
+  }
 
-    return false;
+  return false;
 }
 
 static bool parseUiModeNight(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->uiMode =
-                (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
-                | ResTable_config::UI_MODE_NIGHT_ANY;
-        return true;
-    } else if (strcmp(name, "night") == 0) {
-        if (out) out->uiMode =
-                (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
-                | ResTable_config::UI_MODE_NIGHT_YES;
-        return true;
-    } else if (strcmp(name, "notnight") == 0) {
-      if (out) out->uiMode =
-              (out->uiMode&~ResTable_config::MASK_UI_MODE_NIGHT)
-              | ResTable_config::UI_MODE_NIGHT_NO;
-        return true;
-    }
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out)
+      out->uiMode = (out->uiMode & ~ResTable_config::MASK_UI_MODE_NIGHT) |
+                    ResTable_config::UI_MODE_NIGHT_ANY;
+    return true;
+  } else if (strcmp(name, "night") == 0) {
+    if (out)
+      out->uiMode = (out->uiMode & ~ResTable_config::MASK_UI_MODE_NIGHT) |
+                    ResTable_config::UI_MODE_NIGHT_YES;
+    return true;
+  } else if (strcmp(name, "notnight") == 0) {
+    if (out)
+      out->uiMode = (out->uiMode & ~ResTable_config::MASK_UI_MODE_NIGHT) |
+                    ResTable_config::UI_MODE_NIGHT_NO;
+    return true;
+  }
 
-    return false;
+  return false;
 }
 
 static bool parseDensity(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->density = ResTable_config::DENSITY_DEFAULT;
-        return true;
-    }
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out) out->density = ResTable_config::DENSITY_DEFAULT;
+    return true;
+  }
 
-    if (strcmp(name, "anydpi") == 0) {
-        if (out) out->density = ResTable_config::DENSITY_ANY;
-        return true;
-    }
+  if (strcmp(name, "anydpi") == 0) {
+    if (out) out->density = ResTable_config::DENSITY_ANY;
+    return true;
+  }
 
-    if (strcmp(name, "nodpi") == 0) {
-        if (out) out->density = ResTable_config::DENSITY_NONE;
-        return true;
-    }
+  if (strcmp(name, "nodpi") == 0) {
+    if (out) out->density = ResTable_config::DENSITY_NONE;
+    return true;
+  }
 
-    if (strcmp(name, "ldpi") == 0) {
-        if (out) out->density = ResTable_config::DENSITY_LOW;
-        return true;
-    }
+  if (strcmp(name, "ldpi") == 0) {
+    if (out) out->density = ResTable_config::DENSITY_LOW;
+    return true;
+  }
 
-    if (strcmp(name, "mdpi") == 0) {
-        if (out) out->density = ResTable_config::DENSITY_MEDIUM;
-        return true;
-    }
+  if (strcmp(name, "mdpi") == 0) {
+    if (out) out->density = ResTable_config::DENSITY_MEDIUM;
+    return true;
+  }
 
-    if (strcmp(name, "tvdpi") == 0) {
-        if (out) out->density = ResTable_config::DENSITY_TV;
-        return true;
-    }
+  if (strcmp(name, "tvdpi") == 0) {
+    if (out) out->density = ResTable_config::DENSITY_TV;
+    return true;
+  }
 
-    if (strcmp(name, "hdpi") == 0) {
-        if (out) out->density = ResTable_config::DENSITY_HIGH;
-        return true;
-    }
+  if (strcmp(name, "hdpi") == 0) {
+    if (out) out->density = ResTable_config::DENSITY_HIGH;
+    return true;
+  }
 
-    if (strcmp(name, "xhdpi") == 0) {
-        if (out) out->density = ResTable_config::DENSITY_XHIGH;
-        return true;
-    }
+  if (strcmp(name, "xhdpi") == 0) {
+    if (out) out->density = ResTable_config::DENSITY_XHIGH;
+    return true;
+  }
 
-    if (strcmp(name, "xxhdpi") == 0) {
-        if (out) out->density = ResTable_config::DENSITY_XXHIGH;
-        return true;
-    }
+  if (strcmp(name, "xxhdpi") == 0) {
+    if (out) out->density = ResTable_config::DENSITY_XXHIGH;
+    return true;
+  }
 
-    if (strcmp(name, "xxxhdpi") == 0) {
-        if (out) out->density = ResTable_config::DENSITY_XXXHIGH;
-        return true;
-    }
+  if (strcmp(name, "xxxhdpi") == 0) {
+    if (out) out->density = ResTable_config::DENSITY_XXXHIGH;
+    return true;
+  }
 
-    char* c = (char*)name;
-    while (*c >= '0' && *c <= '9') {
-        c++;
-    }
+  char* c = (char*)name;
+  while (*c >= '0' && *c <= '9') {
+    c++;
+  }
 
-    // check that we have 'dpi' after the last digit.
-    if (toupper(c[0]) != 'D' ||
-            toupper(c[1]) != 'P' ||
-            toupper(c[2]) != 'I' ||
-            c[3] != 0) {
-        return false;
-    }
-
-    // temporarily replace the first letter with \0 to
-    // use atoi.
-    char tmp = c[0];
-    c[0] = '\0';
-
-    int d = atoi(name);
-    c[0] = tmp;
-
-    if (d != 0) {
-        if (out) out->density = d;
-        return true;
-    }
-
+  // check that we have 'dpi' after the last digit.
+  if (toupper(c[0]) != 'D' || toupper(c[1]) != 'P' || toupper(c[2]) != 'I' ||
+      c[3] != 0) {
     return false;
+  }
+
+  // temporarily replace the first letter with \0 to
+  // use atoi.
+  char tmp = c[0];
+  c[0] = '\0';
+
+  int d = atoi(name);
+  c[0] = tmp;
+
+  if (d != 0) {
+    if (out) out->density = d;
+    return true;
+  }
+
+  return false;
 }
 
 static bool parseTouchscreen(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->touchscreen = out->TOUCHSCREEN_ANY;
-        return true;
-    } else if (strcmp(name, "notouch") == 0) {
-        if (out) out->touchscreen = out->TOUCHSCREEN_NOTOUCH;
-        return true;
-    } else if (strcmp(name, "stylus") == 0) {
-        if (out) out->touchscreen = out->TOUCHSCREEN_STYLUS;
-        return true;
-    } else if (strcmp(name, "finger") == 0) {
-        if (out) out->touchscreen = out->TOUCHSCREEN_FINGER;
-        return true;
-    }
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out) out->touchscreen = out->TOUCHSCREEN_ANY;
+    return true;
+  } else if (strcmp(name, "notouch") == 0) {
+    if (out) out->touchscreen = out->TOUCHSCREEN_NOTOUCH;
+    return true;
+  } else if (strcmp(name, "stylus") == 0) {
+    if (out) out->touchscreen = out->TOUCHSCREEN_STYLUS;
+    return true;
+  } else if (strcmp(name, "finger") == 0) {
+    if (out) out->touchscreen = out->TOUCHSCREEN_FINGER;
+    return true;
+  }
 
-    return false;
+  return false;
 }
 
 static bool parseKeysHidden(const char* name, ResTable_config* out) {
-    uint8_t mask = 0;
-    uint8_t value = 0;
-    if (strcmp(name, kWildcardName) == 0) {
-        mask = ResTable_config::MASK_KEYSHIDDEN;
-        value = ResTable_config::KEYSHIDDEN_ANY;
-    } else if (strcmp(name, "keysexposed") == 0) {
-        mask = ResTable_config::MASK_KEYSHIDDEN;
-        value = ResTable_config::KEYSHIDDEN_NO;
-    } else if (strcmp(name, "keyshidden") == 0) {
-        mask = ResTable_config::MASK_KEYSHIDDEN;
-        value = ResTable_config::KEYSHIDDEN_YES;
-    } else if (strcmp(name, "keyssoft") == 0) {
-        mask = ResTable_config::MASK_KEYSHIDDEN;
-        value = ResTable_config::KEYSHIDDEN_SOFT;
-    }
+  uint8_t mask = 0;
+  uint8_t value = 0;
+  if (strcmp(name, kWildcardName) == 0) {
+    mask = ResTable_config::MASK_KEYSHIDDEN;
+    value = ResTable_config::KEYSHIDDEN_ANY;
+  } else if (strcmp(name, "keysexposed") == 0) {
+    mask = ResTable_config::MASK_KEYSHIDDEN;
+    value = ResTable_config::KEYSHIDDEN_NO;
+  } else if (strcmp(name, "keyshidden") == 0) {
+    mask = ResTable_config::MASK_KEYSHIDDEN;
+    value = ResTable_config::KEYSHIDDEN_YES;
+  } else if (strcmp(name, "keyssoft") == 0) {
+    mask = ResTable_config::MASK_KEYSHIDDEN;
+    value = ResTable_config::KEYSHIDDEN_SOFT;
+  }
 
-    if (mask != 0) {
-        if (out) out->inputFlags = (out->inputFlags&~mask) | value;
-        return true;
-    }
+  if (mask != 0) {
+    if (out) out->inputFlags = (out->inputFlags & ~mask) | value;
+    return true;
+  }
 
-    return false;
+  return false;
 }
 
 static bool parseKeyboard(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->keyboard = out->KEYBOARD_ANY;
-        return true;
-    } else if (strcmp(name, "nokeys") == 0) {
-        if (out) out->keyboard = out->KEYBOARD_NOKEYS;
-        return true;
-    } else if (strcmp(name, "qwerty") == 0) {
-        if (out) out->keyboard = out->KEYBOARD_QWERTY;
-        return true;
-    } else if (strcmp(name, "12key") == 0) {
-        if (out) out->keyboard = out->KEYBOARD_12KEY;
-        return true;
-    }
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out) out->keyboard = out->KEYBOARD_ANY;
+    return true;
+  } else if (strcmp(name, "nokeys") == 0) {
+    if (out) out->keyboard = out->KEYBOARD_NOKEYS;
+    return true;
+  } else if (strcmp(name, "qwerty") == 0) {
+    if (out) out->keyboard = out->KEYBOARD_QWERTY;
+    return true;
+  } else if (strcmp(name, "12key") == 0) {
+    if (out) out->keyboard = out->KEYBOARD_12KEY;
+    return true;
+  }
 
-    return false;
+  return false;
 }
 
 static bool parseNavHidden(const char* name, ResTable_config* out) {
-    uint8_t mask = 0;
-    uint8_t value = 0;
-    if (strcmp(name, kWildcardName) == 0) {
-        mask = ResTable_config::MASK_NAVHIDDEN;
-        value = ResTable_config::NAVHIDDEN_ANY;
-    } else if (strcmp(name, "navexposed") == 0) {
-        mask = ResTable_config::MASK_NAVHIDDEN;
-        value = ResTable_config::NAVHIDDEN_NO;
-    } else if (strcmp(name, "navhidden") == 0) {
-        mask = ResTable_config::MASK_NAVHIDDEN;
-        value = ResTable_config::NAVHIDDEN_YES;
-    }
+  uint8_t mask = 0;
+  uint8_t value = 0;
+  if (strcmp(name, kWildcardName) == 0) {
+    mask = ResTable_config::MASK_NAVHIDDEN;
+    value = ResTable_config::NAVHIDDEN_ANY;
+  } else if (strcmp(name, "navexposed") == 0) {
+    mask = ResTable_config::MASK_NAVHIDDEN;
+    value = ResTable_config::NAVHIDDEN_NO;
+  } else if (strcmp(name, "navhidden") == 0) {
+    mask = ResTable_config::MASK_NAVHIDDEN;
+    value = ResTable_config::NAVHIDDEN_YES;
+  }
 
-    if (mask != 0) {
-        if (out) out->inputFlags = (out->inputFlags&~mask) | value;
-        return true;
-    }
+  if (mask != 0) {
+    if (out) out->inputFlags = (out->inputFlags & ~mask) | value;
+    return true;
+  }
 
-    return false;
+  return false;
 }
 
 static bool parseNavigation(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->navigation = out->NAVIGATION_ANY;
-        return true;
-    } else if (strcmp(name, "nonav") == 0) {
-        if (out) out->navigation = out->NAVIGATION_NONAV;
-        return true;
-    } else if (strcmp(name, "dpad") == 0) {
-        if (out) out->navigation = out->NAVIGATION_DPAD;
-        return true;
-    } else if (strcmp(name, "trackball") == 0) {
-        if (out) out->navigation = out->NAVIGATION_TRACKBALL;
-        return true;
-    } else if (strcmp(name, "wheel") == 0) {
-        if (out) out->navigation = out->NAVIGATION_WHEEL;
-        return true;
-    }
+  if (strcmp(name, kWildcardName) == 0) {
+    if (out) out->navigation = out->NAVIGATION_ANY;
+    return true;
+  } else if (strcmp(name, "nonav") == 0) {
+    if (out) out->navigation = out->NAVIGATION_NONAV;
+    return true;
+  } else if (strcmp(name, "dpad") == 0) {
+    if (out) out->navigation = out->NAVIGATION_DPAD;
+    return true;
+  } else if (strcmp(name, "trackball") == 0) {
+    if (out) out->navigation = out->NAVIGATION_TRACKBALL;
+    return true;
+  } else if (strcmp(name, "wheel") == 0) {
+    if (out) out->navigation = out->NAVIGATION_WHEEL;
+    return true;
+  }
 
-    return false;
+  return false;
 }
 
 static bool parseScreenSize(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) {
-            out->screenWidth = out->SCREENWIDTH_ANY;
-            out->screenHeight = out->SCREENHEIGHT_ANY;
-        }
-        return true;
-    }
-
-    const char* x = name;
-    while (*x >= '0' && *x <= '9') x++;
-    if (x == name || *x != 'x') return false;
-    std::string xName(name, x-name);
-    x++;
-
-    const char* y = x;
-    while (*y >= '0' && *y <= '9') y++;
-    if (y == name || *y != 0) return false;
-    std::string yName(x, y-x);
-
-    uint16_t w = (uint16_t)atoi(xName.c_str());
-    uint16_t h = (uint16_t)atoi(yName.c_str());
-    if (w < h) {
-        return false;
-    }
-
+  if (strcmp(name, kWildcardName) == 0) {
     if (out) {
-        out->screenWidth = w;
-        out->screenHeight = h;
+      out->screenWidth = out->SCREENWIDTH_ANY;
+      out->screenHeight = out->SCREENHEIGHT_ANY;
     }
-
     return true;
+  }
+
+  const char* x = name;
+  while (*x >= '0' && *x <= '9') x++;
+  if (x == name || *x != 'x') return false;
+  std::string xName(name, x - name);
+  x++;
+
+  const char* y = x;
+  while (*y >= '0' && *y <= '9') y++;
+  if (y == name || *y != 0) return false;
+  std::string yName(x, y - x);
+
+  uint16_t w = (uint16_t)atoi(xName.c_str());
+  uint16_t h = (uint16_t)atoi(yName.c_str());
+  if (w < h) {
+    return false;
+  }
+
+  if (out) {
+    out->screenWidth = w;
+    out->screenHeight = h;
+  }
+
+  return true;
 }
 
 static bool parseSmallestScreenWidthDp(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) {
-            out->smallestScreenWidthDp = out->SCREENWIDTH_ANY;
-        }
-        return true;
-    }
-
-    if (*name != 's') return false;
-    name++;
-    if (*name != 'w') return false;
-    name++;
-    const char* x = name;
-    while (*x >= '0' && *x <= '9') x++;
-    if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
-    std::string xName(name, x-name);
-
+  if (strcmp(name, kWildcardName) == 0) {
     if (out) {
-        out->smallestScreenWidthDp = (uint16_t)atoi(xName.c_str());
+      out->smallestScreenWidthDp = out->SCREENWIDTH_ANY;
     }
-
     return true;
+  }
+
+  if (*name != 's') return false;
+  name++;
+  if (*name != 'w') return false;
+  name++;
+  const char* x = name;
+  while (*x >= '0' && *x <= '9') x++;
+  if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
+  std::string xName(name, x - name);
+
+  if (out) {
+    out->smallestScreenWidthDp = (uint16_t)atoi(xName.c_str());
+  }
+
+  return true;
 }
 
 static bool parseScreenWidthDp(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) {
-            out->screenWidthDp = out->SCREENWIDTH_ANY;
-        }
-        return true;
-    }
-
-    if (*name != 'w') return false;
-    name++;
-    const char* x = name;
-    while (*x >= '0' && *x <= '9') x++;
-    if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
-    std::string xName(name, x-name);
-
+  if (strcmp(name, kWildcardName) == 0) {
     if (out) {
-        out->screenWidthDp = (uint16_t)atoi(xName.c_str());
+      out->screenWidthDp = out->SCREENWIDTH_ANY;
     }
-
     return true;
+  }
+
+  if (*name != 'w') return false;
+  name++;
+  const char* x = name;
+  while (*x >= '0' && *x <= '9') x++;
+  if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
+  std::string xName(name, x - name);
+
+  if (out) {
+    out->screenWidthDp = (uint16_t)atoi(xName.c_str());
+  }
+
+  return true;
 }
 
 static bool parseScreenHeightDp(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) {
-            out->screenHeightDp = out->SCREENWIDTH_ANY;
-        }
-        return true;
-    }
-
-    if (*name != 'h') return false;
-    name++;
-    const char* x = name;
-    while (*x >= '0' && *x <= '9') x++;
-    if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
-    std::string xName(name, x-name);
-
+  if (strcmp(name, kWildcardName) == 0) {
     if (out) {
-        out->screenHeightDp = (uint16_t)atoi(xName.c_str());
+      out->screenHeightDp = out->SCREENWIDTH_ANY;
     }
-
     return true;
+  }
+
+  if (*name != 'h') return false;
+  name++;
+  const char* x = name;
+  while (*x >= '0' && *x <= '9') x++;
+  if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
+  std::string xName(name, x - name);
+
+  if (out) {
+    out->screenHeightDp = (uint16_t)atoi(xName.c_str());
+  }
+
+  return true;
 }
 
 static bool parseVersion(const char* name, ResTable_config* out) {
-    if (strcmp(name, kWildcardName) == 0) {
-        if (out) {
-            out->sdkVersion = out->SDKVERSION_ANY;
-            out->minorVersion = out->MINORVERSION_ANY;
-        }
-        return true;
-    }
-
-    if (*name != 'v') {
-        return false;
-    }
-
-    name++;
-    const char* s = name;
-    while (*s >= '0' && *s <= '9') s++;
-    if (s == name || *s != 0) return false;
-    std::string sdkName(name, s-name);
-
+  if (strcmp(name, kWildcardName) == 0) {
     if (out) {
-        out->sdkVersion = (uint16_t)atoi(sdkName.c_str());
-        out->minorVersion = 0;
+      out->sdkVersion = out->SDKVERSION_ANY;
+      out->minorVersion = out->MINORVERSION_ANY;
     }
-
     return true;
+  }
+
+  if (*name != 'v') {
+    return false;
+  }
+
+  name++;
+  const char* s = name;
+  while (*s >= '0' && *s <= '9') s++;
+  if (s == name || *s != 0) return false;
+  std::string sdkName(name, s - name);
+
+  if (out) {
+    out->sdkVersion = (uint16_t)atoi(sdkName.c_str());
+    out->minorVersion = 0;
+  }
+
+  return true;
 }
 
 bool ConfigDescription::parse(const StringPiece& str, ConfigDescription* out) {
-    std::vector<std::string> parts = util::splitAndLowercase(str, '-');
+  std::vector<std::string> parts = util::splitAndLowercase(str, '-');
 
-    ConfigDescription config;
-    ssize_t partsConsumed = 0;
-    LocaleValue locale;
+  ConfigDescription config;
+  ssize_t partsConsumed = 0;
+  LocaleValue locale;
 
-    const auto partsEnd = parts.end();
-    auto partIter = parts.begin();
+  const auto partsEnd = parts.end();
+  auto partIter = parts.begin();
 
-    if (str.size() == 0) {
-        goto success;
+  if (str.size() == 0) {
+    goto success;
+  }
+
+  if (parseMcc(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
     }
+  }
 
-    if (parseMcc(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
+  if (parseMnc(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
     }
+  }
 
-    if (parseMnc(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    // Locale spans a few '-' separators, so we let it
-    // control the index.
-    partsConsumed = locale.initFromParts(partIter, partsEnd);
-    if (partsConsumed < 0) {
-        return false;
-    } else {
-        locale.writeTo(&config);
-        partIter += partsConsumed;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseLayoutDirection(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseSmallestScreenWidthDp(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseScreenWidthDp(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseScreenHeightDp(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseScreenLayoutSize(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseScreenLayoutLong(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseScreenRound(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseOrientation(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseUiModeType(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseUiModeNight(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseDensity(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseTouchscreen(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseKeysHidden(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseKeyboard(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseNavHidden(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseNavigation(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseScreenSize(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    if (parseVersion(partIter->c_str(), &config)) {
-        ++partIter;
-        if (partIter == partsEnd) {
-            goto success;
-        }
-    }
-
-    // Unrecognized.
+  // Locale spans a few '-' separators, so we let it
+  // control the index.
+  partsConsumed = locale.initFromParts(partIter, partsEnd);
+  if (partsConsumed < 0) {
     return false;
+  } else {
+    locale.writeTo(&config);
+    partIter += partsConsumed;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseLayoutDirection(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseSmallestScreenWidthDp(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseScreenWidthDp(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseScreenHeightDp(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseScreenLayoutSize(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseScreenLayoutLong(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseScreenRound(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseOrientation(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseUiModeType(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseUiModeNight(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseDensity(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseTouchscreen(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseKeysHidden(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseKeyboard(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseNavHidden(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseNavigation(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseScreenSize(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  if (parseVersion(partIter->c_str(), &config)) {
+    ++partIter;
+    if (partIter == partsEnd) {
+      goto success;
+    }
+  }
+
+  // Unrecognized.
+  return false;
 
 success:
-    if (out != NULL) {
-        applyVersionForCompatibility(&config);
-        *out = config;
-    }
-    return true;
+  if (out != NULL) {
+    applyVersionForCompatibility(&config);
+    *out = config;
+  }
+  return true;
 }
 
-void ConfigDescription::applyVersionForCompatibility(ConfigDescription* config) {
-    uint16_t minSdk = 0;
-    if (config->screenLayout2 & ResTable_config::MASK_SCREENROUND) {
-        minSdk = SDK_MARSHMALLOW;
-    } else if (config->density == ResTable_config::DENSITY_ANY) {
-        minSdk = SDK_LOLLIPOP;
-    } else if (config->smallestScreenWidthDp != ResTable_config::SCREENWIDTH_ANY
-            || config->screenWidthDp != ResTable_config::SCREENWIDTH_ANY
-            || config->screenHeightDp != ResTable_config::SCREENHEIGHT_ANY) {
-        minSdk = SDK_HONEYCOMB_MR2;
-    } else if ((config->uiMode & ResTable_config::MASK_UI_MODE_TYPE)
-                != ResTable_config::UI_MODE_TYPE_ANY
-            ||  (config->uiMode & ResTable_config::MASK_UI_MODE_NIGHT)
-                != ResTable_config::UI_MODE_NIGHT_ANY) {
-        minSdk = SDK_FROYO;
-    } else if ((config->screenLayout & ResTable_config::MASK_SCREENSIZE)
-                != ResTable_config::SCREENSIZE_ANY
-            ||  (config->screenLayout & ResTable_config::MASK_SCREENLONG)
-                != ResTable_config::SCREENLONG_ANY
-            || config->density != ResTable_config::DENSITY_DEFAULT) {
-        minSdk = SDK_DONUT;
-    }
+void ConfigDescription::applyVersionForCompatibility(
+    ConfigDescription* config) {
+  uint16_t minSdk = 0;
+  if (config->screenLayout2 & ResTable_config::MASK_SCREENROUND) {
+    minSdk = SDK_MARSHMALLOW;
+  } else if (config->density == ResTable_config::DENSITY_ANY) {
+    minSdk = SDK_LOLLIPOP;
+  } else if (config->smallestScreenWidthDp !=
+                 ResTable_config::SCREENWIDTH_ANY ||
+             config->screenWidthDp != ResTable_config::SCREENWIDTH_ANY ||
+             config->screenHeightDp != ResTable_config::SCREENHEIGHT_ANY) {
+    minSdk = SDK_HONEYCOMB_MR2;
+  } else if ((config->uiMode & ResTable_config::MASK_UI_MODE_TYPE) !=
+                 ResTable_config::UI_MODE_TYPE_ANY ||
+             (config->uiMode & ResTable_config::MASK_UI_MODE_NIGHT) !=
+                 ResTable_config::UI_MODE_NIGHT_ANY) {
+    minSdk = SDK_FROYO;
+  } else if ((config->screenLayout & ResTable_config::MASK_SCREENSIZE) !=
+                 ResTable_config::SCREENSIZE_ANY ||
+             (config->screenLayout & ResTable_config::MASK_SCREENLONG) !=
+                 ResTable_config::SCREENLONG_ANY ||
+             config->density != ResTable_config::DENSITY_DEFAULT) {
+    minSdk = SDK_DONUT;
+  }
 
-    if (minSdk > config->sdkVersion) {
-        config->sdkVersion = minSdk;
-    }
+  if (minSdk > config->sdkVersion) {
+    config->sdkVersion = minSdk;
+  }
 }
 
 ConfigDescription ConfigDescription::copyWithoutSdkVersion() const {
-    ConfigDescription copy = *this;
-    copy.sdkVersion = 0;
-    return copy;
+  ConfigDescription copy = *this;
+  copy.sdkVersion = 0;
+  return copy;
 }
 
 bool ConfigDescription::dominates(const ConfigDescription& o) const {
-    if (*this == defaultConfig() || *this == o) {
-        return true;
-    }
-    return matchWithDensity(o)
-            && !o.matchWithDensity(*this)
-            && !isMoreSpecificThan(o)
-            && !o.hasHigherPrecedenceThan(*this);
+  if (*this == defaultConfig() || *this == o) {
+    return true;
+  }
+  return matchWithDensity(o) && !o.matchWithDensity(*this) &&
+         !isMoreSpecificThan(o) && !o.hasHigherPrecedenceThan(*this);
 }
 
-bool ConfigDescription::hasHigherPrecedenceThan(const ConfigDescription& o) const {
-    // The order of the following tests defines the importance of one
-    // configuration parameter over another. Those tests first are more
-    // important, trumping any values in those following them.
-    // The ordering should be the same as ResTable_config#isBetterThan.
-    if (mcc || o.mcc) return (!o.mcc);
-    if (mnc || o.mnc) return (!o.mnc);
-    if (language[0] || o.language[0]) return (!o.language[0]);
-    if (country[0] || o.country[0]) return (!o.country[0]);
-    // Script and variant require either a language or country, both of which
-    // have higher precedence.
-    if ((screenLayout | o.screenLayout) & MASK_LAYOUTDIR) {
-        return !(o.screenLayout & MASK_LAYOUTDIR);
-    }
-    if (smallestScreenWidthDp || o.smallestScreenWidthDp) return (!o.smallestScreenWidthDp);
-    if (screenWidthDp || o.screenWidthDp) return (!o.screenWidthDp);
-    if (screenHeightDp || o.screenHeightDp) return (!o.screenHeightDp);
-    if ((screenLayout | o.screenLayout) & MASK_SCREENSIZE) {
-        return !(o.screenLayout & MASK_SCREENSIZE);
-    }
-    if ((screenLayout | o.screenLayout) & MASK_SCREENLONG) {
-        return !(o.screenLayout & MASK_SCREENLONG);
-    }
-    if ((screenLayout2 | o.screenLayout2) & MASK_SCREENROUND) {
-        return !(o.screenLayout2 & MASK_SCREENROUND);
-    }
-    if (orientation || o.orientation) return (!o.orientation);
-    if ((uiMode | o.uiMode) & MASK_UI_MODE_TYPE) {
-        return !(o.uiMode & MASK_UI_MODE_TYPE);
-    }
-    if ((uiMode | o.uiMode) & MASK_UI_MODE_NIGHT) {
-        return !(o.uiMode & MASK_UI_MODE_NIGHT);
-    }
-    if (density || o.density) return (!o.density);
-    if (touchscreen || o.touchscreen) return (!o.touchscreen);
-    if ((inputFlags | o.inputFlags) & MASK_KEYSHIDDEN) {
-        return !(o.inputFlags & MASK_KEYSHIDDEN);
-    }
-    if ((inputFlags | o.inputFlags) & MASK_NAVHIDDEN) {
-        return !(o.inputFlags & MASK_NAVHIDDEN);
-    }
-    if (keyboard || o.keyboard) return (!o.keyboard);
-    if (navigation || o.navigation) return (!o.navigation);
-    if (screenWidth || o.screenWidth) return (!o.screenWidth);
-    if (screenHeight || o.screenHeight) return (!o.screenHeight);
-    if (sdkVersion || o.sdkVersion) return (!o.sdkVersion);
-    if (minorVersion || o.minorVersion) return (!o.minorVersion);
-    // Both configurations have nothing defined except some possible future
-    // value. Returning the comparison of the two configurations is a
-    // "best effort" at this point to protect against incorrect dominations.
-    return *this != o;
+bool ConfigDescription::hasHigherPrecedenceThan(
+    const ConfigDescription& o) const {
+  // The order of the following tests defines the importance of one
+  // configuration parameter over another. Those tests first are more
+  // important, trumping any values in those following them.
+  // The ordering should be the same as ResTable_config#isBetterThan.
+  if (mcc || o.mcc) return (!o.mcc);
+  if (mnc || o.mnc) return (!o.mnc);
+  if (language[0] || o.language[0]) return (!o.language[0]);
+  if (country[0] || o.country[0]) return (!o.country[0]);
+  // Script and variant require either a language or country, both of which
+  // have higher precedence.
+  if ((screenLayout | o.screenLayout) & MASK_LAYOUTDIR) {
+    return !(o.screenLayout & MASK_LAYOUTDIR);
+  }
+  if (smallestScreenWidthDp || o.smallestScreenWidthDp)
+    return (!o.smallestScreenWidthDp);
+  if (screenWidthDp || o.screenWidthDp) return (!o.screenWidthDp);
+  if (screenHeightDp || o.screenHeightDp) return (!o.screenHeightDp);
+  if ((screenLayout | o.screenLayout) & MASK_SCREENSIZE) {
+    return !(o.screenLayout & MASK_SCREENSIZE);
+  }
+  if ((screenLayout | o.screenLayout) & MASK_SCREENLONG) {
+    return !(o.screenLayout & MASK_SCREENLONG);
+  }
+  if ((screenLayout2 | o.screenLayout2) & MASK_SCREENROUND) {
+    return !(o.screenLayout2 & MASK_SCREENROUND);
+  }
+  if (orientation || o.orientation) return (!o.orientation);
+  if ((uiMode | o.uiMode) & MASK_UI_MODE_TYPE) {
+    return !(o.uiMode & MASK_UI_MODE_TYPE);
+  }
+  if ((uiMode | o.uiMode) & MASK_UI_MODE_NIGHT) {
+    return !(o.uiMode & MASK_UI_MODE_NIGHT);
+  }
+  if (density || o.density) return (!o.density);
+  if (touchscreen || o.touchscreen) return (!o.touchscreen);
+  if ((inputFlags | o.inputFlags) & MASK_KEYSHIDDEN) {
+    return !(o.inputFlags & MASK_KEYSHIDDEN);
+  }
+  if ((inputFlags | o.inputFlags) & MASK_NAVHIDDEN) {
+    return !(o.inputFlags & MASK_NAVHIDDEN);
+  }
+  if (keyboard || o.keyboard) return (!o.keyboard);
+  if (navigation || o.navigation) return (!o.navigation);
+  if (screenWidth || o.screenWidth) return (!o.screenWidth);
+  if (screenHeight || o.screenHeight) return (!o.screenHeight);
+  if (sdkVersion || o.sdkVersion) return (!o.sdkVersion);
+  if (minorVersion || o.minorVersion) return (!o.minorVersion);
+  // Both configurations have nothing defined except some possible future
+  // value. Returning the comparison of the two configurations is a
+  // "best effort" at this point to protect against incorrect dominations.
+  return *this != o;
 }
 
 bool ConfigDescription::conflictsWith(const ConfigDescription& o) const {
-    // This method should be updated as new configuration parameters are
-    // introduced (e.g. screenConfig2).
-    auto pred = [](const uint32_t a, const uint32_t b) -> bool {
-        return a == 0 || b == 0 || a == b;
-    };
-    // The values here can be found in ResTable_config#match. Density and range
-    // values can't lead to conflicts, and are ignored.
-    return !pred(mcc, o.mcc)
-            || !pred(mnc, o.mnc)
-            || !pred(locale, o.locale)
-            || !pred(screenLayout & MASK_LAYOUTDIR, o.screenLayout & MASK_LAYOUTDIR)
-            || !pred(screenLayout & MASK_SCREENLONG, o.screenLayout & MASK_SCREENLONG)
-            || !pred(screenLayout & MASK_UI_MODE_TYPE, o.screenLayout & MASK_UI_MODE_TYPE)
-            || !pred(uiMode & MASK_UI_MODE_TYPE, o.uiMode & MASK_UI_MODE_TYPE)
-            || !pred(uiMode & MASK_UI_MODE_NIGHT, o.uiMode & MASK_UI_MODE_NIGHT)
-            || !pred(screenLayout2 & MASK_SCREENROUND, o.screenLayout2 & MASK_SCREENROUND)
-            || !pred(orientation, o.orientation)
-            || !pred(touchscreen, o.touchscreen)
-            || !pred(inputFlags & MASK_KEYSHIDDEN, o.inputFlags & MASK_KEYSHIDDEN)
-            || !pred(inputFlags & MASK_NAVHIDDEN, o.inputFlags & MASK_NAVHIDDEN)
-            || !pred(keyboard, o.keyboard)
-            || !pred(navigation, o.navigation);
+  // This method should be updated as new configuration parameters are
+  // introduced (e.g. screenConfig2).
+  auto pred = [](const uint32_t a, const uint32_t b) -> bool {
+    return a == 0 || b == 0 || a == b;
+  };
+  // The values here can be found in ResTable_config#match. Density and range
+  // values can't lead to conflicts, and are ignored.
+  return !pred(mcc, o.mcc) || !pred(mnc, o.mnc) || !pred(locale, o.locale) ||
+         !pred(screenLayout & MASK_LAYOUTDIR,
+               o.screenLayout & MASK_LAYOUTDIR) ||
+         !pred(screenLayout & MASK_SCREENLONG,
+               o.screenLayout & MASK_SCREENLONG) ||
+         !pred(screenLayout & MASK_UI_MODE_TYPE,
+               o.screenLayout & MASK_UI_MODE_TYPE) ||
+         !pred(uiMode & MASK_UI_MODE_TYPE, o.uiMode & MASK_UI_MODE_TYPE) ||
+         !pred(uiMode & MASK_UI_MODE_NIGHT, o.uiMode & MASK_UI_MODE_NIGHT) ||
+         !pred(screenLayout2 & MASK_SCREENROUND,
+               o.screenLayout2 & MASK_SCREENROUND) ||
+         !pred(orientation, o.orientation) ||
+         !pred(touchscreen, o.touchscreen) ||
+         !pred(inputFlags & MASK_KEYSHIDDEN, o.inputFlags & MASK_KEYSHIDDEN) ||
+         !pred(inputFlags & MASK_NAVHIDDEN, o.inputFlags & MASK_NAVHIDDEN) ||
+         !pred(keyboard, o.keyboard) || !pred(navigation, o.navigation);
 }
 
 bool ConfigDescription::isCompatibleWith(const ConfigDescription& o) const {
-    return !conflictsWith(o) && !dominates(o) && !o.dominates(*this);
+  return !conflictsWith(o) && !dominates(o) && !o.dominates(*this);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/ConfigDescription.h b/tools/aapt2/ConfigDescription.h
index d801621..bb54886 100644
--- a/tools/aapt2/ConfigDescription.h
+++ b/tools/aapt2/ConfigDescription.h
@@ -29,148 +29,152 @@
  * initialization and comparison methods.
  */
 struct ConfigDescription : public android::ResTable_config {
-    /**
-     * Returns an immutable default config.
-     */
-    static const ConfigDescription& defaultConfig();
+  /**
+   * Returns an immutable default config.
+   */
+  static const ConfigDescription& defaultConfig();
 
-    /*
-     * Parse a string of the form 'fr-sw600dp-land' and fill in the
-     * given ResTable_config with resulting configuration parameters.
-     *
-     * The resulting configuration has the appropriate sdkVersion defined
-     * for backwards compatibility.
-     */
-    static bool parse(const StringPiece& str, ConfigDescription* out = nullptr);
+  /*
+   * Parse a string of the form 'fr-sw600dp-land' and fill in the
+   * given ResTable_config with resulting configuration parameters.
+   *
+   * The resulting configuration has the appropriate sdkVersion defined
+   * for backwards compatibility.
+   */
+  static bool parse(const StringPiece& str, ConfigDescription* out = nullptr);
 
-    /**
-     * If the configuration uses an axis that was added after
-     * the original Android release, make sure the SDK version
-     * is set accordingly.
-     */
-    static void applyVersionForCompatibility(ConfigDescription* config);
+  /**
+   * If the configuration uses an axis that was added after
+   * the original Android release, make sure the SDK version
+   * is set accordingly.
+   */
+  static void applyVersionForCompatibility(ConfigDescription* config);
 
-    ConfigDescription();
-    ConfigDescription(const android::ResTable_config& o);  // NOLINT(implicit)
-    ConfigDescription(const ConfigDescription& o);
-    ConfigDescription(ConfigDescription&& o);
+  ConfigDescription();
+  ConfigDescription(const android::ResTable_config& o);  // NOLINT(implicit)
+  ConfigDescription(const ConfigDescription& o);
+  ConfigDescription(ConfigDescription&& o);
 
-    ConfigDescription& operator=(const android::ResTable_config& o);
-    ConfigDescription& operator=(const ConfigDescription& o);
-    ConfigDescription& operator=(ConfigDescription&& o);
+  ConfigDescription& operator=(const android::ResTable_config& o);
+  ConfigDescription& operator=(const ConfigDescription& o);
+  ConfigDescription& operator=(ConfigDescription&& o);
 
-    ConfigDescription copyWithoutSdkVersion() const;
+  ConfigDescription copyWithoutSdkVersion() const;
 
-    /**
-     * A configuration X dominates another configuration Y, if X has at least the
-     * precedence of Y and X is strictly more general than Y: for any type defined
-     * by X, the same type is defined by Y with a value equal to or, in the case
-     * of ranges, more specific than that of X.
-     *
-     * For example, the configuration 'en-w800dp' dominates 'en-rGB-w1024dp'. It
-     * does not dominate 'fr', 'en-w720dp', or 'mcc001-en-w800dp'.
-     */
-    bool dominates(const ConfigDescription& o) const;
+  /**
+   * A configuration X dominates another configuration Y, if X has at least the
+   * precedence of Y and X is strictly more general than Y: for any type defined
+   * by X, the same type is defined by Y with a value equal to or, in the case
+   * of ranges, more specific than that of X.
+   *
+   * For example, the configuration 'en-w800dp' dominates 'en-rGB-w1024dp'. It
+   * does not dominate 'fr', 'en-w720dp', or 'mcc001-en-w800dp'.
+   */
+  bool dominates(const ConfigDescription& o) const;
 
-    /**
-     * Returns true if this configuration defines a more important configuration
-     * parameter than o. For example, "en" has higher precedence than "v23",
-     * whereas "en" has the same precedence as "en-v23".
-     */
-    bool hasHigherPrecedenceThan(const ConfigDescription& o) const;
+  /**
+   * Returns true if this configuration defines a more important configuration
+   * parameter than o. For example, "en" has higher precedence than "v23",
+   * whereas "en" has the same precedence as "en-v23".
+   */
+  bool hasHigherPrecedenceThan(const ConfigDescription& o) const;
 
-    /**
-     * A configuration conflicts with another configuration if both
-     * configurations define an incompatible configuration parameter. An
-     * incompatible configuration parameter is a non-range, non-density parameter
-     * that is defined in both configurations as a different, non-default value.
-     */
-    bool conflictsWith(const ConfigDescription& o) const;
+  /**
+   * A configuration conflicts with another configuration if both
+   * configurations define an incompatible configuration parameter. An
+   * incompatible configuration parameter is a non-range, non-density parameter
+   * that is defined in both configurations as a different, non-default value.
+   */
+  bool conflictsWith(const ConfigDescription& o) const;
 
-    /**
-     * A configuration is compatible with another configuration if both
-     * configurations can match a common concrete device configuration and are
-     * unrelated by domination. For example, land-v11 conflicts with port-v21
-     * but is compatible with v21 (both land-v11 and v21 would match en-land-v23).
-     */
-    bool isCompatibleWith(const ConfigDescription& o) const;
+  /**
+   * A configuration is compatible with another configuration if both
+   * configurations can match a common concrete device configuration and are
+   * unrelated by domination. For example, land-v11 conflicts with port-v21
+   * but is compatible with v21 (both land-v11 and v21 would match en-land-v23).
+   */
+  bool isCompatibleWith(const ConfigDescription& o) const;
 
-    bool matchWithDensity(const ConfigDescription& o) const;
+  bool matchWithDensity(const ConfigDescription& o) const;
 
-    bool operator<(const ConfigDescription& o) const;
-    bool operator<=(const ConfigDescription& o) const;
-    bool operator==(const ConfigDescription& o) const;
-    bool operator!=(const ConfigDescription& o) const;
-    bool operator>=(const ConfigDescription& o) const;
-    bool operator>(const ConfigDescription& o) const;
+  bool operator<(const ConfigDescription& o) const;
+  bool operator<=(const ConfigDescription& o) const;
+  bool operator==(const ConfigDescription& o) const;
+  bool operator!=(const ConfigDescription& o) const;
+  bool operator>=(const ConfigDescription& o) const;
+  bool operator>(const ConfigDescription& o) const;
 };
 
 inline ConfigDescription::ConfigDescription() {
-    memset(this, 0, sizeof(*this));
-    size = sizeof(android::ResTable_config);
+  memset(this, 0, sizeof(*this));
+  size = sizeof(android::ResTable_config);
 }
 
 inline ConfigDescription::ConfigDescription(const android::ResTable_config& o) {
-    *static_cast<android::ResTable_config*>(this) = o;
-    size = sizeof(android::ResTable_config);
+  *static_cast<android::ResTable_config*>(this) = o;
+  size = sizeof(android::ResTable_config);
 }
 
 inline ConfigDescription::ConfigDescription(const ConfigDescription& o) {
-    *static_cast<android::ResTable_config*>(this) = o;
+  *static_cast<android::ResTable_config*>(this) = o;
 }
 
 inline ConfigDescription::ConfigDescription(ConfigDescription&& o) {
-    *this = o;
+  *this = o;
 }
 
-inline ConfigDescription& ConfigDescription::operator=(const android::ResTable_config& o) {
-    *static_cast<android::ResTable_config*>(this) = o;
-    size = sizeof(android::ResTable_config);
-    return *this;
+inline ConfigDescription& ConfigDescription::operator=(
+    const android::ResTable_config& o) {
+  *static_cast<android::ResTable_config*>(this) = o;
+  size = sizeof(android::ResTable_config);
+  return *this;
 }
 
-inline ConfigDescription& ConfigDescription::operator=(const ConfigDescription& o) {
-    *static_cast<android::ResTable_config*>(this) = o;
-    return *this;
+inline ConfigDescription& ConfigDescription::operator=(
+    const ConfigDescription& o) {
+  *static_cast<android::ResTable_config*>(this) = o;
+  return *this;
 }
 
 inline ConfigDescription& ConfigDescription::operator=(ConfigDescription&& o) {
-    *this = o;
-    return *this;
+  *this = o;
+  return *this;
 }
 
-inline bool ConfigDescription::matchWithDensity(const ConfigDescription& o) const {
-    return match(o) && (density == 0 || density == o.density);
+inline bool ConfigDescription::matchWithDensity(
+    const ConfigDescription& o) const {
+  return match(o) && (density == 0 || density == o.density);
 }
 
 inline bool ConfigDescription::operator<(const ConfigDescription& o) const {
-    return compare(o) < 0;
+  return compare(o) < 0;
 }
 
 inline bool ConfigDescription::operator<=(const ConfigDescription& o) const {
-    return compare(o) <= 0;
+  return compare(o) <= 0;
 }
 
 inline bool ConfigDescription::operator==(const ConfigDescription& o) const {
-    return compare(o) == 0;
+  return compare(o) == 0;
 }
 
 inline bool ConfigDescription::operator!=(const ConfigDescription& o) const {
-    return compare(o) != 0;
+  return compare(o) != 0;
 }
 
 inline bool ConfigDescription::operator>=(const ConfigDescription& o) const {
-    return compare(o) >= 0;
+  return compare(o) >= 0;
 }
 
 inline bool ConfigDescription::operator>(const ConfigDescription& o) const {
-    return compare(o) > 0;
+  return compare(o) > 0;
 }
 
-inline ::std::ostream& operator<<(::std::ostream& out, const ConfigDescription& o) {
-    return out << o.toString().string();
+inline ::std::ostream& operator<<(::std::ostream& out,
+                                  const ConfigDescription& o) {
+  return out << o.toString().string();
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_CONFIG_DESCRIPTION_H
+#endif  // AAPT_CONFIG_DESCRIPTION_H
diff --git a/tools/aapt2/ConfigDescription_test.cpp b/tools/aapt2/ConfigDescription_test.cpp
index 455a57f..66b7d47 100644
--- a/tools/aapt2/ConfigDescription_test.cpp
+++ b/tools/aapt2/ConfigDescription_test.cpp
@@ -23,76 +23,79 @@
 
 namespace aapt {
 
-static ::testing::AssertionResult TestParse(const StringPiece& input,
-                                            ConfigDescription* config = nullptr) {
-    if (ConfigDescription::parse(input, config)) {
-        return ::testing::AssertionSuccess() << input << " was successfully parsed";
-    }
-    return ::testing::AssertionFailure() << input << " could not be parsed";
+static ::testing::AssertionResult TestParse(
+    const StringPiece& input, ConfigDescription* config = nullptr) {
+  if (ConfigDescription::parse(input, config)) {
+    return ::testing::AssertionSuccess() << input << " was successfully parsed";
+  }
+  return ::testing::AssertionFailure() << input << " could not be parsed";
 }
 
 TEST(ConfigDescriptionTest, ParseFailWhenQualifiersAreOutOfOrder) {
-    EXPECT_FALSE(TestParse("en-sw600dp-ldrtl"));
-    EXPECT_FALSE(TestParse("land-en"));
-    EXPECT_FALSE(TestParse("hdpi-320dpi"));
+  EXPECT_FALSE(TestParse("en-sw600dp-ldrtl"));
+  EXPECT_FALSE(TestParse("land-en"));
+  EXPECT_FALSE(TestParse("hdpi-320dpi"));
 }
 
 TEST(ConfigDescriptionTest, ParseFailWhenQualifiersAreNotMatched) {
-    EXPECT_FALSE(TestParse("en-sw600dp-ILLEGAL"));
+  EXPECT_FALSE(TestParse("en-sw600dp-ILLEGAL"));
 }
 
 TEST(ConfigDescriptionTest, ParseFailWhenQualifiersHaveTrailingDash) {
-    EXPECT_FALSE(TestParse("en-sw600dp-land-"));
+  EXPECT_FALSE(TestParse("en-sw600dp-land-"));
 }
 
 TEST(ConfigDescriptionTest, ParseBasicQualifiers) {
-    ConfigDescription config;
-    EXPECT_TRUE(TestParse("", &config));
-    EXPECT_EQ(std::string(""), config.toString().string());
+  ConfigDescription config;
+  EXPECT_TRUE(TestParse("", &config));
+  EXPECT_EQ(std::string(""), config.toString().string());
 
-    EXPECT_TRUE(TestParse("fr-land", &config));
-    EXPECT_EQ(std::string("fr-land"), config.toString().string());
+  EXPECT_TRUE(TestParse("fr-land", &config));
+  EXPECT_EQ(std::string("fr-land"), config.toString().string());
 
-    EXPECT_TRUE(TestParse("mcc310-pl-sw720dp-normal-long-port-night-"
-                "xhdpi-keyssoft-qwerty-navexposed-nonav", &config));
-    EXPECT_EQ(std::string("mcc310-pl-sw720dp-normal-long-port-night-"
-                "xhdpi-keyssoft-qwerty-navexposed-nonav-v13"), config.toString().string());
+  EXPECT_TRUE(
+      TestParse("mcc310-pl-sw720dp-normal-long-port-night-"
+                "xhdpi-keyssoft-qwerty-navexposed-nonav",
+                &config));
+  EXPECT_EQ(std::string("mcc310-pl-sw720dp-normal-long-port-night-"
+                        "xhdpi-keyssoft-qwerty-navexposed-nonav-v13"),
+            config.toString().string());
 }
 
 TEST(ConfigDescriptionTest, ParseLocales) {
-    ConfigDescription config;
-    EXPECT_TRUE(TestParse("en-rUS", &config));
-    EXPECT_EQ(std::string("en-rUS"), config.toString().string());
+  ConfigDescription config;
+  EXPECT_TRUE(TestParse("en-rUS", &config));
+  EXPECT_EQ(std::string("en-rUS"), config.toString().string());
 }
 
 TEST(ConfigDescriptionTest, ParseQualifierAddedInApi13) {
-    ConfigDescription config;
-    EXPECT_TRUE(TestParse("sw600dp", &config));
-    EXPECT_EQ(std::string("sw600dp-v13"), config.toString().string());
+  ConfigDescription config;
+  EXPECT_TRUE(TestParse("sw600dp", &config));
+  EXPECT_EQ(std::string("sw600dp-v13"), config.toString().string());
 
-    EXPECT_TRUE(TestParse("sw600dp-v8", &config));
-    EXPECT_EQ(std::string("sw600dp-v13"), config.toString().string());
+  EXPECT_TRUE(TestParse("sw600dp-v8", &config));
+  EXPECT_EQ(std::string("sw600dp-v13"), config.toString().string());
 }
 
 TEST(ConfigDescriptionTest, ParseCarAttribute) {
-    ConfigDescription config;
-    EXPECT_TRUE(TestParse("car", &config));
-    EXPECT_EQ(android::ResTable_config::UI_MODE_TYPE_CAR, config.uiMode);
+  ConfigDescription config;
+  EXPECT_TRUE(TestParse("car", &config));
+  EXPECT_EQ(android::ResTable_config::UI_MODE_TYPE_CAR, config.uiMode);
 }
 
 TEST(ConfigDescriptionTest, TestParsingRoundQualifier) {
-    ConfigDescription config;
-    EXPECT_TRUE(TestParse("round", &config));
-    EXPECT_EQ(android::ResTable_config::SCREENROUND_YES,
-    config.screenLayout2 & android::ResTable_config::MASK_SCREENROUND);
-    EXPECT_EQ(SDK_MARSHMALLOW, config.sdkVersion);
-    EXPECT_EQ(std::string("round-v23"), config.toString().string());
+  ConfigDescription config;
+  EXPECT_TRUE(TestParse("round", &config));
+  EXPECT_EQ(android::ResTable_config::SCREENROUND_YES,
+            config.screenLayout2 & android::ResTable_config::MASK_SCREENROUND);
+  EXPECT_EQ(SDK_MARSHMALLOW, config.sdkVersion);
+  EXPECT_EQ(std::string("round-v23"), config.toString().string());
 
-    EXPECT_TRUE(TestParse("notround", &config));
-    EXPECT_EQ(android::ResTable_config::SCREENROUND_NO,
-              config.screenLayout2 & android::ResTable_config::MASK_SCREENROUND);
-    EXPECT_EQ(SDK_MARSHMALLOW, config.sdkVersion);
-    EXPECT_EQ(std::string("notround-v23"), config.toString().string());
+  EXPECT_TRUE(TestParse("notround", &config));
+  EXPECT_EQ(android::ResTable_config::SCREENROUND_NO,
+            config.screenLayout2 & android::ResTable_config::MASK_SCREENROUND);
+  EXPECT_EQ(SDK_MARSHMALLOW, config.sdkVersion);
+  EXPECT_EQ(std::string("notround-v23"), config.toString().string());
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/Debug.cpp b/tools/aapt2/Debug.cpp
index 304e571..965db9e 100644
--- a/tools/aapt2/Debug.cpp
+++ b/tools/aapt2/Debug.cpp
@@ -17,8 +17,8 @@
 #include "Debug.h"
 #include "ResourceTable.h"
 #include "ResourceValues.h"
-#include "util/Util.h"
 #include "ValueVisitor.h"
+#include "util/Util.h"
 
 #include <algorithm>
 #include <iostream>
@@ -31,275 +31,279 @@
 namespace aapt {
 
 class PrintVisitor : public ValueVisitor {
-public:
-    using ValueVisitor::visit;
+ public:
+  using ValueVisitor::visit;
 
-    void visit(Attribute* attr) override {
-        std::cout << "(attr) type=";
-        attr->printMask(&std::cout);
-        static constexpr uint32_t kMask = android::ResTable_map::TYPE_ENUM |
-            android::ResTable_map::TYPE_FLAGS;
-        if (attr->typeMask & kMask) {
-            for (const auto& symbol : attr->symbols) {
-                std::cout << "\n        " << symbol.symbol.name.value().entry;
-                if (symbol.symbol.id) {
-                    std::cout << " (" << symbol.symbol.id.value() << ")";
-                }
-                std::cout << " = " << symbol.value;
-            }
+  void visit(Attribute* attr) override {
+    std::cout << "(attr) type=";
+    attr->printMask(&std::cout);
+    static constexpr uint32_t kMask =
+        android::ResTable_map::TYPE_ENUM | android::ResTable_map::TYPE_FLAGS;
+    if (attr->typeMask & kMask) {
+      for (const auto& symbol : attr->symbols) {
+        std::cout << "\n        " << symbol.symbol.name.value().entry;
+        if (symbol.symbol.id) {
+          std::cout << " (" << symbol.symbol.id.value() << ")";
         }
+        std::cout << " = " << symbol.value;
+      }
     }
+  }
 
-    void visit(Style* style) override {
-        std::cout << "(style)";
-        if (style->parent) {
-            const Reference& parentRef = style->parent.value();
-            std::cout << " parent=";
-            if (parentRef.name) {
-                if (parentRef.privateReference) {
-                    std::cout << "*";
-                }
-                std::cout << parentRef.name.value() << " ";
-            }
-
-            if (parentRef.id) {
-                std::cout << parentRef.id.value();
-            }
+  void visit(Style* style) override {
+    std::cout << "(style)";
+    if (style->parent) {
+      const Reference& parentRef = style->parent.value();
+      std::cout << " parent=";
+      if (parentRef.name) {
+        if (parentRef.privateReference) {
+          std::cout << "*";
         }
+        std::cout << parentRef.name.value() << " ";
+      }
 
-        for (const auto& entry : style->entries) {
-            std::cout << "\n        ";
-            if (entry.key.name) {
-                const ResourceName& name = entry.key.name.value();
-                if (!name.package.empty()) {
-                    std::cout << name.package << ":";
-                }
-                std::cout << name.entry;
-            }
+      if (parentRef.id) {
+        std::cout << parentRef.id.value();
+      }
+    }
 
-            if (entry.key.id) {
-                std::cout << "(" << entry.key.id.value() << ")";
-            }
-
-            std::cout << "=" << *entry.value;
+    for (const auto& entry : style->entries) {
+      std::cout << "\n        ";
+      if (entry.key.name) {
+        const ResourceName& name = entry.key.name.value();
+        if (!name.package.empty()) {
+          std::cout << name.package << ":";
         }
+        std::cout << name.entry;
+      }
+
+      if (entry.key.id) {
+        std::cout << "(" << entry.key.id.value() << ")";
+      }
+
+      std::cout << "=" << *entry.value;
     }
+  }
 
-    void visit(Array* array) override {
-        array->print(&std::cout);
-    }
+  void visit(Array* array) override { array->print(&std::cout); }
 
-    void visit(Plural* plural) override {
-        plural->print(&std::cout);
-    }
+  void visit(Plural* plural) override { plural->print(&std::cout); }
 
-    void visit(Styleable* styleable) override {
-        std::cout << "(styleable)";
-        for (const auto& attr : styleable->entries) {
-            std::cout << "\n        ";
-            if (attr.name) {
-                const ResourceName& name = attr.name.value();
-                if (!name.package.empty()) {
-                    std::cout << name.package << ":";
-                }
-                std::cout << name.entry;
-            }
-
-            if (attr.id) {
-                std::cout << "(" << attr.id.value() << ")";
-            }
+  void visit(Styleable* styleable) override {
+    std::cout << "(styleable)";
+    for (const auto& attr : styleable->entries) {
+      std::cout << "\n        ";
+      if (attr.name) {
+        const ResourceName& name = attr.name.value();
+        if (!name.package.empty()) {
+          std::cout << name.package << ":";
         }
-    }
+        std::cout << name.entry;
+      }
 
-    void visitItem(Item* item) override {
-        item->print(&std::cout);
+      if (attr.id) {
+        std::cout << "(" << attr.id.value() << ")";
+      }
     }
+  }
+
+  void visitItem(Item* item) override { item->print(&std::cout); }
 };
 
-void Debug::printTable(ResourceTable* table, const DebugPrintTableOptions& options) {
-    PrintVisitor visitor;
+void Debug::printTable(ResourceTable* table,
+                       const DebugPrintTableOptions& options) {
+  PrintVisitor visitor;
 
-    for (auto& package : table->packages) {
-        std::cout << "Package name=" << package->name;
-        if (package->id) {
-            std::cout << " id=" << std::hex << (int) package->id.value() << std::dec;
+  for (auto& package : table->packages) {
+    std::cout << "Package name=" << package->name;
+    if (package->id) {
+      std::cout << " id=" << std::hex << (int)package->id.value() << std::dec;
+    }
+    std::cout << std::endl;
+
+    for (const auto& type : package->types) {
+      std::cout << "\n  type " << type->type;
+      if (type->id) {
+        std::cout << " id=" << std::hex << (int)type->id.value() << std::dec;
+      }
+      std::cout << " entryCount=" << type->entries.size() << std::endl;
+
+      std::vector<const ResourceEntry*> sortedEntries;
+      for (const auto& entry : type->entries) {
+        auto iter = std::lower_bound(
+            sortedEntries.begin(), sortedEntries.end(), entry.get(),
+            [](const ResourceEntry* a, const ResourceEntry* b) -> bool {
+              if (a->id && b->id) {
+                return a->id.value() < b->id.value();
+              } else if (a->id) {
+                return true;
+              } else {
+                return false;
+              }
+            });
+        sortedEntries.insert(iter, entry.get());
+      }
+
+      for (const ResourceEntry* entry : sortedEntries) {
+        ResourceId id(package->id ? package->id.value() : uint8_t(0),
+                      type->id ? type->id.value() : uint8_t(0),
+                      entry->id ? entry->id.value() : uint16_t(0));
+        ResourceName name(package->name, type->type, entry->name);
+
+        std::cout << "    spec resource " << id << " " << name;
+        switch (entry->symbolStatus.state) {
+          case SymbolState::kPublic:
+            std::cout << " PUBLIC";
+            break;
+          case SymbolState::kPrivate:
+            std::cout << " _PRIVATE_";
+            break;
+          default:
+            break;
         }
+
         std::cout << std::endl;
 
-        for (const auto& type : package->types) {
-            std::cout << "\n  type " << type->type;
-            if (type->id) {
-                std::cout << " id=" << std::hex << (int) type->id.value() << std::dec;
-            }
-            std::cout << " entryCount=" << type->entries.size() << std::endl;
-
-            std::vector<const ResourceEntry*> sortedEntries;
-            for (const auto& entry : type->entries) {
-                auto iter = std::lower_bound(sortedEntries.begin(), sortedEntries.end(), entry.get(),
-                        [](const ResourceEntry* a, const ResourceEntry* b) -> bool {
-                            if (a->id && b->id) {
-                                return a->id.value() < b->id.value();
-                            } else if (a->id) {
-                                return true;
-                            } else {
-                                return false;
-                            }
-                        });
-                sortedEntries.insert(iter, entry.get());
-            }
-
-            for (const ResourceEntry* entry : sortedEntries) {
-                ResourceId id(package->id ? package->id.value() : uint8_t(0),
-                              type->id ? type->id.value() : uint8_t(0),
-                              entry->id ? entry->id.value() : uint16_t(0));
-                ResourceName name(package->name, type->type, entry->name);
-
-                std::cout << "    spec resource " << id << " " << name;
-                switch (entry->symbolStatus.state) {
-                case SymbolState::kPublic: std::cout << " PUBLIC"; break;
-                case SymbolState::kPrivate: std::cout << " _PRIVATE_"; break;
-                default: break;
-                }
-
-                std::cout << std::endl;
-
-                for (const auto& value : entry->values) {
-                    std::cout << "      (" << value->config << ") ";
-                    value->value->accept(&visitor);
-                    if (options.showSources && !value->value->getSource().path.empty()) {
-                        std::cout << " src=" << value->value->getSource();
-                    }
-                    std::cout << std::endl;
-                }
-            }
+        for (const auto& value : entry->values) {
+          std::cout << "      (" << value->config << ") ";
+          value->value->accept(&visitor);
+          if (options.showSources && !value->value->getSource().path.empty()) {
+            std::cout << " src=" << value->value->getSource();
+          }
+          std::cout << std::endl;
         }
+      }
     }
+  }
 }
 
-static size_t getNodeIndex(const std::vector<ResourceName>& names, const ResourceName& name) {
-    auto iter = std::lower_bound(names.begin(), names.end(), name);
-    assert(iter != names.end() && *iter == name);
-    return std::distance(names.begin(), iter);
+static size_t getNodeIndex(const std::vector<ResourceName>& names,
+                           const ResourceName& name) {
+  auto iter = std::lower_bound(names.begin(), names.end(), name);
+  assert(iter != names.end() && *iter == name);
+  return std::distance(names.begin(), iter);
 }
 
-void Debug::printStyleGraph(ResourceTable* table, const ResourceName& targetStyle) {
-    std::map<ResourceName, std::set<ResourceName>> graph;
+void Debug::printStyleGraph(ResourceTable* table,
+                            const ResourceName& targetStyle) {
+  std::map<ResourceName, std::set<ResourceName>> graph;
 
-    std::queue<ResourceName> stylesToVisit;
-    stylesToVisit.push(targetStyle);
-    for (; !stylesToVisit.empty(); stylesToVisit.pop()) {
-        const ResourceName& styleName = stylesToVisit.front();
-        std::set<ResourceName>& parents = graph[styleName];
-        if (!parents.empty()) {
-            // We've already visited this style.
-            continue;
+  std::queue<ResourceName> stylesToVisit;
+  stylesToVisit.push(targetStyle);
+  for (; !stylesToVisit.empty(); stylesToVisit.pop()) {
+    const ResourceName& styleName = stylesToVisit.front();
+    std::set<ResourceName>& parents = graph[styleName];
+    if (!parents.empty()) {
+      // We've already visited this style.
+      continue;
+    }
+
+    Maybe<ResourceTable::SearchResult> result = table->findResource(styleName);
+    if (result) {
+      ResourceEntry* entry = result.value().entry;
+      for (const auto& value : entry->values) {
+        if (Style* style = valueCast<Style>(value->value.get())) {
+          if (style->parent && style->parent.value().name) {
+            parents.insert(style->parent.value().name.value());
+            stylesToVisit.push(style->parent.value().name.value());
+          }
         }
-
-        Maybe<ResourceTable::SearchResult> result = table->findResource(styleName);
-        if (result) {
-            ResourceEntry* entry = result.value().entry;
-            for (const auto& value : entry->values) {
-                if (Style* style = valueCast<Style>(value->value.get())) {
-                    if (style->parent && style->parent.value().name) {
-                        parents.insert(style->parent.value().name.value());
-                        stylesToVisit.push(style->parent.value().name.value());
-                    }
-                }
-            }
-        }
+      }
     }
+  }
 
-    std::vector<ResourceName> names;
-    for (const auto& entry : graph) {
-        names.push_back(entry.first);
+  std::vector<ResourceName> names;
+  for (const auto& entry : graph) {
+    names.push_back(entry.first);
+  }
+
+  std::cout << "digraph styles {\n";
+  for (const auto& name : names) {
+    std::cout << "  node_" << getNodeIndex(names, name) << " [label=\"" << name
+              << "\"];\n";
+  }
+
+  for (const auto& entry : graph) {
+    const ResourceName& styleName = entry.first;
+    size_t styleNodeIndex = getNodeIndex(names, styleName);
+
+    for (const auto& parentName : entry.second) {
+      std::cout << "  node_" << styleNodeIndex << " -> "
+                << "node_" << getNodeIndex(names, parentName) << ";\n";
     }
+  }
 
-    std::cout << "digraph styles {\n";
-    for (const auto& name : names) {
-        std::cout << "  node_" << getNodeIndex(names, name)
-                  << " [label=\"" << name << "\"];\n";
-    }
-
-    for (const auto& entry : graph) {
-        const ResourceName& styleName = entry.first;
-        size_t styleNodeIndex = getNodeIndex(names, styleName);
-
-        for (const auto& parentName : entry.second) {
-            std::cout << "  node_" << styleNodeIndex << " -> "
-                      << "node_" << getNodeIndex(names, parentName) << ";\n";
-        }
-    }
-
-    std::cout << "}" << std::endl;
+  std::cout << "}" << std::endl;
 }
 
 void Debug::dumpHex(const void* data, size_t len) {
-    const uint8_t* d = (const uint8_t*) data;
-    for (size_t i = 0; i < len; i++) {
-        std::cerr << std::hex << std::setfill('0') << std::setw(2) << (uint32_t) d[i] << " ";
-        if (i % 8 == 7) {
-            std::cerr << "\n";
-        }
+  const uint8_t* d = (const uint8_t*)data;
+  for (size_t i = 0; i < len; i++) {
+    std::cerr << std::hex << std::setfill('0') << std::setw(2) << (uint32_t)d[i]
+              << " ";
+    if (i % 8 == 7) {
+      std::cerr << "\n";
     }
+  }
 
-    if (len - 1 % 8 != 7) {
-        std::cerr << std::endl;
-    }
+  if (len - 1 % 8 != 7) {
+    std::cerr << std::endl;
+  }
 }
 
 namespace {
 
 class XmlPrinter : public xml::Visitor {
-public:
-    using xml::Visitor::visit;
+ public:
+  using xml::Visitor::visit;
 
-    void visit(xml::Element* el) override {
-        std::cerr << mPrefix;
-        std::cerr << "E: ";
-        if (!el->namespaceUri.empty()) {
-            std::cerr << el->namespaceUri << ":";
-        }
-        std::cerr << el->name << " (line=" << el->lineNumber << ")\n";
+  void visit(xml::Element* el) override {
+    std::cerr << mPrefix;
+    std::cerr << "E: ";
+    if (!el->namespaceUri.empty()) {
+      std::cerr << el->namespaceUri << ":";
+    }
+    std::cerr << el->name << " (line=" << el->lineNumber << ")\n";
 
-        for (const xml::Attribute& attr : el->attributes) {
-            std::cerr << mPrefix << "  A: ";
-            if (!attr.namespaceUri.empty()) {
-                std::cerr << attr.namespaceUri << ":";
-            }
-            std::cerr << attr.name << "=" << attr.value << "\n";
-        }
-
-        const size_t previousSize = mPrefix.size();
-        mPrefix += "  ";
-        xml::Visitor::visit(el);
-        mPrefix.resize(previousSize);
+    for (const xml::Attribute& attr : el->attributes) {
+      std::cerr << mPrefix << "  A: ";
+      if (!attr.namespaceUri.empty()) {
+        std::cerr << attr.namespaceUri << ":";
+      }
+      std::cerr << attr.name << "=" << attr.value << "\n";
     }
 
-    void visit(xml::Namespace* ns) override {
-        std::cerr << mPrefix;
-        std::cerr << "N: " << ns->namespacePrefix << "=" << ns->namespaceUri
-                << " (line=" << ns->lineNumber << ")\n";
+    const size_t previousSize = mPrefix.size();
+    mPrefix += "  ";
+    xml::Visitor::visit(el);
+    mPrefix.resize(previousSize);
+  }
 
-        const size_t previousSize = mPrefix.size();
-        mPrefix += "  ";
-        xml::Visitor::visit(ns);
-        mPrefix.resize(previousSize);
-    }
+  void visit(xml::Namespace* ns) override {
+    std::cerr << mPrefix;
+    std::cerr << "N: " << ns->namespacePrefix << "=" << ns->namespaceUri
+              << " (line=" << ns->lineNumber << ")\n";
 
-    void visit(xml::Text* text) override {
-        std::cerr << mPrefix;
-        std::cerr << "T: '" << text->text << "'\n";
-    }
+    const size_t previousSize = mPrefix.size();
+    mPrefix += "  ";
+    xml::Visitor::visit(ns);
+    mPrefix.resize(previousSize);
+  }
 
-private:
-    std::string mPrefix;
+  void visit(xml::Text* text) override {
+    std::cerr << mPrefix;
+    std::cerr << "T: '" << text->text << "'\n";
+  }
+
+ private:
+  std::string mPrefix;
 };
 
-} // namespace
+}  // namespace
 
 void Debug::dumpXml(xml::XmlResource* doc) {
-    XmlPrinter printer;
-    doc->root->accept(&printer);
+  XmlPrinter printer;
+  doc->root->accept(&printer);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/Debug.h b/tools/aapt2/Debug.h
index c0fcbf1..bd92ec1 100644
--- a/tools/aapt2/Debug.h
+++ b/tools/aapt2/Debug.h
@@ -27,17 +27,18 @@
 namespace aapt {
 
 struct DebugPrintTableOptions {
-    bool showSources = false;
+  bool showSources = false;
 };
 
 struct Debug {
-    static void printTable(ResourceTable* table, const DebugPrintTableOptions& options = {});
-    static void printStyleGraph(ResourceTable* table,
-                                const ResourceName& targetStyle);
-    static void dumpHex(const void* data, size_t len);
-    static void dumpXml(xml::XmlResource* doc);
+  static void printTable(ResourceTable* table,
+                         const DebugPrintTableOptions& options = {});
+  static void printStyleGraph(ResourceTable* table,
+                              const ResourceName& targetStyle);
+  static void dumpHex(const void* data, size_t len);
+  static void dumpXml(xml::XmlResource* doc);
 };
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_DEBUG_H
+#endif  // AAPT_DEBUG_H
diff --git a/tools/aapt2/Diagnostics.h b/tools/aapt2/Diagnostics.h
index 725027c..d39cf4c 100644
--- a/tools/aapt2/Diagnostics.h
+++ b/tools/aapt2/Diagnostics.h
@@ -29,119 +29,112 @@
 namespace aapt {
 
 struct DiagMessageActual {
-    Source source;
-    std::string message;
+  Source source;
+  std::string message;
 };
 
 struct DiagMessage {
-private:
-    Source mSource;
-    std::stringstream mMessage;
+ private:
+  Source mSource;
+  std::stringstream mMessage;
 
-public:
-    DiagMessage() = default;
+ public:
+  DiagMessage() = default;
 
-    explicit DiagMessage(const StringPiece& src) : mSource(src) {
-    }
+  explicit DiagMessage(const StringPiece& src) : mSource(src) {}
 
-    explicit DiagMessage(const Source& src) : mSource(src) {
-    }
+  explicit DiagMessage(const Source& src) : mSource(src) {}
 
-    explicit DiagMessage(size_t line) : mSource(Source().withLine(line)) {
-    }
+  explicit DiagMessage(size_t line) : mSource(Source().withLine(line)) {}
 
-    template <typename T>
-    DiagMessage& operator<<(const T& value) {
-        mMessage << value;
-        return *this;
-    }
+  template <typename T>
+  DiagMessage& operator<<(const T& value) {
+    mMessage << value;
+    return *this;
+  }
 
-    DiagMessageActual build() const {
-        return DiagMessageActual{ mSource, mMessage.str() };
-    }
+  DiagMessageActual build() const {
+    return DiagMessageActual{mSource, mMessage.str()};
+  }
 };
 
 struct IDiagnostics {
-    virtual ~IDiagnostics() = default;
+  virtual ~IDiagnostics() = default;
 
-    enum class Level {
-        Note,
-        Warn,
-        Error
-    };
+  enum class Level { Note, Warn, Error };
 
-    virtual void log(Level level, DiagMessageActual& actualMsg) = 0;
+  virtual void log(Level level, DiagMessageActual& actualMsg) = 0;
 
-    virtual void error(const DiagMessage& message) {
-        DiagMessageActual actual = message.build();
-        log(Level::Error, actual);
-    }
+  virtual void error(const DiagMessage& message) {
+    DiagMessageActual actual = message.build();
+    log(Level::Error, actual);
+  }
 
-    virtual void warn(const DiagMessage& message) {
-        DiagMessageActual actual = message.build();
-        log(Level::Warn, actual);
-    }
+  virtual void warn(const DiagMessage& message) {
+    DiagMessageActual actual = message.build();
+    log(Level::Warn, actual);
+  }
 
-    virtual void note(const DiagMessage& message) {
-        DiagMessageActual actual = message.build();
-        log(Level::Note, actual);
-    }
+  virtual void note(const DiagMessage& message) {
+    DiagMessageActual actual = message.build();
+    log(Level::Note, actual);
+  }
 };
 
 class StdErrDiagnostics : public IDiagnostics {
-public:
-    StdErrDiagnostics() = default;
+ public:
+  StdErrDiagnostics() = default;
 
-    void log(Level level, DiagMessageActual& actualMsg) override {
-        const char* tag;
+  void log(Level level, DiagMessageActual& actualMsg) override {
+    const char* tag;
 
-        switch (level) {
-        case Level::Error:
-            mNumErrors++;
-            if (mNumErrors > 20) {
-                return;
-            }
-            tag = "error";
-            break;
-
-        case Level::Warn:
-            tag = "warn";
-            break;
-
-        case Level::Note:
-            tag = "note";
-            break;
+    switch (level) {
+      case Level::Error:
+        mNumErrors++;
+        if (mNumErrors > 20) {
+          return;
         }
+        tag = "error";
+        break;
 
-        if (!actualMsg.source.path.empty()) {
-            std::cerr << actualMsg.source << ": ";
-        }
-        std::cerr << tag << ": " << actualMsg.message << "." << std::endl;
+      case Level::Warn:
+        tag = "warn";
+        break;
+
+      case Level::Note:
+        tag = "note";
+        break;
     }
 
-private:
-    size_t mNumErrors = 0;
+    if (!actualMsg.source.path.empty()) {
+      std::cerr << actualMsg.source << ": ";
+    }
+    std::cerr << tag << ": " << actualMsg.message << "." << std::endl;
+  }
 
-    DISALLOW_COPY_AND_ASSIGN(StdErrDiagnostics);
+ private:
+  size_t mNumErrors = 0;
+
+  DISALLOW_COPY_AND_ASSIGN(StdErrDiagnostics);
 };
 
 class SourcePathDiagnostics : public IDiagnostics {
-public:
-    SourcePathDiagnostics(const Source& src, IDiagnostics* diag) : mSource(src), mDiag(diag) {
-    }
+ public:
+  SourcePathDiagnostics(const Source& src, IDiagnostics* diag)
+      : mSource(src), mDiag(diag) {}
 
-    void log(Level level, DiagMessageActual& actualMsg) override {
-        actualMsg.source.path = mSource.path;
-        mDiag->log(level, actualMsg);
-    }
+  void log(Level level, DiagMessageActual& actualMsg) override {
+    actualMsg.source.path = mSource.path;
+    mDiag->log(level, actualMsg);
+  }
 
-private:
-    Source mSource;
-    IDiagnostics* mDiag;
+ private:
+  Source mSource;
+  IDiagnostics* mDiag;
 
-    DISALLOW_COPY_AND_ASSIGN(SourcePathDiagnostics);
+  DISALLOW_COPY_AND_ASSIGN(SourcePathDiagnostics);
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_DIAGNOSTICS_H */
diff --git a/tools/aapt2/DominatorTree.cpp b/tools/aapt2/DominatorTree.cpp
index 29587a8..8f6f783 100644
--- a/tools/aapt2/DominatorTree.cpp
+++ b/tools/aapt2/DominatorTree.cpp
@@ -14,76 +14,78 @@
  * limitations under the License.
  */
 
-#include "ConfigDescription.h"
 #include "DominatorTree.h"
+#include "ConfigDescription.h"
 
 #include <algorithm>
 
 namespace aapt {
 
 DominatorTree::DominatorTree(
-        const std::vector<std::unique_ptr<ResourceConfigValue>>& configs) {
-    for (const auto& config : configs) {
-        mProductRoots[config->product].tryAddChild(
-                util::make_unique<Node>(config.get(), nullptr));
-    }
+    const std::vector<std::unique_ptr<ResourceConfigValue>>& configs) {
+  for (const auto& config : configs) {
+    mProductRoots[config->product].tryAddChild(
+        util::make_unique<Node>(config.get(), nullptr));
+  }
 }
 
 void DominatorTree::accept(Visitor* visitor) {
-    for (auto& entry : mProductRoots) {
-        visitor->visitTree(entry.first, &entry.second);
-    }
+  for (auto& entry : mProductRoots) {
+    visitor->visitTree(entry.first, &entry.second);
+  }
 }
 
 bool DominatorTree::Node::tryAddChild(std::unique_ptr<Node> newChild) {
-    assert(newChild->mValue && "cannot add a root or empty node as a child");
-    if (mValue && !dominates(newChild.get())) {
-        // This is not the root and the child dominates us.
-        return false;
-    }
-    return addChild(std::move(newChild));
+  assert(newChild->mValue && "cannot add a root or empty node as a child");
+  if (mValue && !dominates(newChild.get())) {
+    // This is not the root and the child dominates us.
+    return false;
+  }
+  return addChild(std::move(newChild));
 }
 
 bool DominatorTree::Node::addChild(std::unique_ptr<Node> newChild) {
-    bool hasDominatedChildren = false;
-    // Demote children dominated by the new config.
-    for (auto& child : mChildren) {
-        if (newChild->dominates(child.get())) {
-            child->mParent = newChild.get();
-            newChild->mChildren.push_back(std::move(child));
-            child = {};
-            hasDominatedChildren = true;
-        }
+  bool hasDominatedChildren = false;
+  // Demote children dominated by the new config.
+  for (auto& child : mChildren) {
+    if (newChild->dominates(child.get())) {
+      child->mParent = newChild.get();
+      newChild->mChildren.push_back(std::move(child));
+      child = {};
+      hasDominatedChildren = true;
     }
-    // Remove dominated children.
-    if (hasDominatedChildren) {
-        mChildren.erase(std::remove_if(mChildren.begin(), mChildren.end(),
-                [](const std::unique_ptr<Node>& child) -> bool {
-            return child == nullptr;
-        }), mChildren.end());
+  }
+  // Remove dominated children.
+  if (hasDominatedChildren) {
+    mChildren.erase(
+        std::remove_if(mChildren.begin(), mChildren.end(),
+                       [](const std::unique_ptr<Node>& child) -> bool {
+                         return child == nullptr;
+                       }),
+        mChildren.end());
+  }
+  // Add the new config to a child if a child dominates the new config.
+  for (auto& child : mChildren) {
+    if (child->dominates(newChild.get())) {
+      child->addChild(std::move(newChild));
+      return true;
     }
-    // Add the new config to a child if a child dominates the new config.
-    for (auto& child : mChildren) {
-        if (child->dominates(newChild.get())) {
-            child->addChild(std::move(newChild));
-            return true;
-        }
-    }
-    // The new config is not dominated by a child, so add it here.
-    newChild->mParent = this;
-    mChildren.push_back(std::move(newChild));
-    return true;
+  }
+  // The new config is not dominated by a child, so add it here.
+  newChild->mParent = this;
+  mChildren.push_back(std::move(newChild));
+  return true;
 }
 
 bool DominatorTree::Node::dominates(const Node* other) const {
-    // Check root node dominations.
-    if (other->isRootNode()) {
-        return isRootNode();
-    } else if (isRootNode()) {
-        return true;
-    }
-    // Neither node is a root node; compare the configurations.
-    return mValue->config.dominates(other->mValue->config);
+  // Check root node dominations.
+  if (other->isRootNode()) {
+    return isRootNode();
+  } else if (isRootNode()) {
+    return true;
+  }
+  // Neither node is a root node; compare the configurations.
+  return mValue->config.dominates(other->mValue->config);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/DominatorTree.h b/tools/aapt2/DominatorTree.h
index ad2df0e..6d45b5d 100644
--- a/tools/aapt2/DominatorTree.h
+++ b/tools/aapt2/DominatorTree.h
@@ -46,82 +46,76 @@
  * will exhibit undefined behavior.
  */
 class DominatorTree {
-public:
-    explicit DominatorTree(const std::vector<std::unique_ptr<ResourceConfigValue>>& configs);
+ public:
+  explicit DominatorTree(
+      const std::vector<std::unique_ptr<ResourceConfigValue>>& configs);
 
-    class Node {
-    public:
-        explicit Node(ResourceConfigValue* value = nullptr, Node* parent = nullptr) :
-                mValue(value), mParent(parent) {
-        }
+  class Node {
+   public:
+    explicit Node(ResourceConfigValue* value = nullptr, Node* parent = nullptr)
+        : mValue(value), mParent(parent) {}
 
-        inline ResourceConfigValue* value() const {
-            return mValue;
-        }
+    inline ResourceConfigValue* value() const { return mValue; }
 
-        inline Node* parent() const {
-            return mParent;
-        }
+    inline Node* parent() const { return mParent; }
 
-        inline bool isRootNode() const {
-            return !mValue;
-        }
+    inline bool isRootNode() const { return !mValue; }
 
-        inline const std::vector<std::unique_ptr<Node>>& children() const {
-            return mChildren;
-        }
-
-        bool tryAddChild(std::unique_ptr<Node> newChild);
-
-    private:
-        bool addChild(std::unique_ptr<Node> newChild);
-        bool dominates(const Node* other) const;
-
-        ResourceConfigValue* mValue;
-        Node* mParent;
-        std::vector<std::unique_ptr<Node>> mChildren;
-
-        DISALLOW_COPY_AND_ASSIGN(Node);
-    };
-
-    struct Visitor {
-        virtual ~Visitor() = default;
-        virtual void visitTree(const std::string& product, Node* root) = 0;
-    };
-
-    class BottomUpVisitor : public Visitor {
-    public:
-        virtual ~BottomUpVisitor() = default;
-
-        void visitTree(const std::string& product, Node* root) override {
-            for (auto& child : root->children()) {
-                visitNode(child.get());
-            }
-        }
-
-        virtual void visitConfig(Node* node) = 0;
-
-    private:
-        void visitNode(Node* node) {
-            for (auto& child : node->children()) {
-                visitNode(child.get());
-            }
-            visitConfig(node);
-        }
-    };
-
-    void accept(Visitor* visitor);
-
-    inline const std::map<std::string, Node>& getProductRoots() const {
-        return mProductRoots;
+    inline const std::vector<std::unique_ptr<Node>>& children() const {
+      return mChildren;
     }
 
-private:
-    DISALLOW_COPY_AND_ASSIGN(DominatorTree);
+    bool tryAddChild(std::unique_ptr<Node> newChild);
 
-    std::map<std::string, Node> mProductRoots;
+   private:
+    bool addChild(std::unique_ptr<Node> newChild);
+    bool dominates(const Node* other) const;
+
+    ResourceConfigValue* mValue;
+    Node* mParent;
+    std::vector<std::unique_ptr<Node>> mChildren;
+
+    DISALLOW_COPY_AND_ASSIGN(Node);
+  };
+
+  struct Visitor {
+    virtual ~Visitor() = default;
+    virtual void visitTree(const std::string& product, Node* root) = 0;
+  };
+
+  class BottomUpVisitor : public Visitor {
+   public:
+    virtual ~BottomUpVisitor() = default;
+
+    void visitTree(const std::string& product, Node* root) override {
+      for (auto& child : root->children()) {
+        visitNode(child.get());
+      }
+    }
+
+    virtual void visitConfig(Node* node) = 0;
+
+   private:
+    void visitNode(Node* node) {
+      for (auto& child : node->children()) {
+        visitNode(child.get());
+      }
+      visitConfig(node);
+    }
+  };
+
+  void accept(Visitor* visitor);
+
+  inline const std::map<std::string, Node>& getProductRoots() const {
+    return mProductRoots;
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(DominatorTree);
+
+  std::map<std::string, Node> mProductRoots;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_DOMINATOR_TREE_H
+#endif  // AAPT_DOMINATOR_TREE_H
diff --git a/tools/aapt2/DominatorTree_test.cpp b/tools/aapt2/DominatorTree_test.cpp
index fb850e4..a42d2f7 100644
--- a/tools/aapt2/DominatorTree_test.cpp
+++ b/tools/aapt2/DominatorTree_test.cpp
@@ -27,125 +27,132 @@
 namespace {
 
 class PrettyPrinter : public DominatorTree::Visitor {
-public:
-    explicit PrettyPrinter(const int indent = 2) : mIndent(indent) {
-    }
+ public:
+  explicit PrettyPrinter(const int indent = 2) : mIndent(indent) {}
 
-    void visitTree(const std::string& product, DominatorTree::Node* root) override {
-        for (auto& child : root->children()) {
-            visitNode(child.get(), 0);
-        }
+  void visitTree(const std::string& product,
+                 DominatorTree::Node* root) override {
+    for (auto& child : root->children()) {
+      visitNode(child.get(), 0);
     }
+  }
 
-    std::string toString(DominatorTree* tree) {
-        mBuffer.str("");
-        mBuffer.clear();
-        tree->accept(this);
-        return mBuffer.str();
+  std::string toString(DominatorTree* tree) {
+    mBuffer.str("");
+    mBuffer.clear();
+    tree->accept(this);
+    return mBuffer.str();
+  }
+
+ private:
+  void visitConfig(const DominatorTree::Node* node, const int indent) {
+    auto configString = node->value()->config.toString();
+    mBuffer << std::string(indent, ' ')
+            << (configString.isEmpty() ? "<default>" : configString)
+            << std::endl;
+  }
+
+  void visitNode(const DominatorTree::Node* node, const int indent) {
+    visitConfig(node, indent);
+    for (const auto& child : node->children()) {
+      visitNode(child.get(), indent + mIndent);
     }
+  }
 
-private:
-    void visitConfig(const DominatorTree::Node* node, const int indent) {
-        auto configString = node->value()->config.toString();
-        mBuffer << std::string(indent, ' ')
-                << (configString.isEmpty() ? "<default>" : configString)
-                << std::endl;
-    }
-
-    void visitNode(const DominatorTree::Node* node, const int indent) {
-        visitConfig(node, indent);
-        for (const auto& child : node->children()) {
-            visitNode(child.get(), indent + mIndent);
-        }
-    }
-
-    std::stringstream mBuffer;
-    const int mIndent = 2;
+  std::stringstream mBuffer;
+  const int mIndent = 2;
 };
 
-} // namespace
+}  // namespace
 
 TEST(DominatorTreeTest, DefaultDominatesEverything) {
-    const ConfigDescription defaultConfig = {};
-    const ConfigDescription landConfig = test::parseConfigOrDie("land");
-    const ConfigDescription sw600dpLandConfig = test::parseConfigOrDie("sw600dp-land-v13");
+  const ConfigDescription defaultConfig = {};
+  const ConfigDescription landConfig = test::parseConfigOrDie("land");
+  const ConfigDescription sw600dpLandConfig =
+      test::parseConfigOrDie("sw600dp-land-v13");
 
-    std::vector<std::unique_ptr<ResourceConfigValue>> configs;
-    configs.push_back(util::make_unique<ResourceConfigValue>(defaultConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(landConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(sw600dpLandConfig, ""));
+  std::vector<std::unique_ptr<ResourceConfigValue>> configs;
+  configs.push_back(util::make_unique<ResourceConfigValue>(defaultConfig, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(landConfig, ""));
+  configs.push_back(
+      util::make_unique<ResourceConfigValue>(sw600dpLandConfig, ""));
 
-    DominatorTree tree(configs);
-    PrettyPrinter printer;
+  DominatorTree tree(configs);
+  PrettyPrinter printer;
 
-    std::string expected =
-            "<default>\n"
-            "  land\n"
-            "  sw600dp-land-v13\n";
-    EXPECT_EQ(expected, printer.toString(&tree));
+  std::string expected =
+      "<default>\n"
+      "  land\n"
+      "  sw600dp-land-v13\n";
+  EXPECT_EQ(expected, printer.toString(&tree));
 }
 
 TEST(DominatorTreeTest, ProductsAreDominatedSeparately) {
-    const ConfigDescription defaultConfig = {};
-    const ConfigDescription landConfig = test::parseConfigOrDie("land");
-    const ConfigDescription sw600dpLandConfig = test::parseConfigOrDie("sw600dp-land-v13");
+  const ConfigDescription defaultConfig = {};
+  const ConfigDescription landConfig = test::parseConfigOrDie("land");
+  const ConfigDescription sw600dpLandConfig =
+      test::parseConfigOrDie("sw600dp-land-v13");
 
-    std::vector<std::unique_ptr<ResourceConfigValue>> configs;
-    configs.push_back(util::make_unique<ResourceConfigValue>(defaultConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(landConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(defaultConfig, "phablet"));
-    configs.push_back(util::make_unique<ResourceConfigValue>(sw600dpLandConfig, "phablet"));
+  std::vector<std::unique_ptr<ResourceConfigValue>> configs;
+  configs.push_back(util::make_unique<ResourceConfigValue>(defaultConfig, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(landConfig, ""));
+  configs.push_back(
+      util::make_unique<ResourceConfigValue>(defaultConfig, "phablet"));
+  configs.push_back(
+      util::make_unique<ResourceConfigValue>(sw600dpLandConfig, "phablet"));
 
-    DominatorTree tree(configs);
-    PrettyPrinter printer;
+  DominatorTree tree(configs);
+  PrettyPrinter printer;
 
-    std::string expected =
-            "<default>\n"
-            "  land\n"
-            "<default>\n"
-            "  sw600dp-land-v13\n";
-    EXPECT_EQ(expected, printer.toString(&tree));
+  std::string expected =
+      "<default>\n"
+      "  land\n"
+      "<default>\n"
+      "  sw600dp-land-v13\n";
+  EXPECT_EQ(expected, printer.toString(&tree));
 }
 
 TEST(DominatorTreeTest, MoreSpecificConfigurationsAreDominated) {
-    const ConfigDescription defaultConfig = {};
-    const ConfigDescription enConfig = test::parseConfigOrDie("en");
-    const ConfigDescription enV21Config = test::parseConfigOrDie("en-v21");
-    const ConfigDescription ldrtlConfig = test::parseConfigOrDie("ldrtl-v4");
-    const ConfigDescription ldrtlXhdpiConfig = test::parseConfigOrDie("ldrtl-xhdpi-v4");
-    const ConfigDescription sw300dpConfig = test::parseConfigOrDie("sw300dp-v13");
-    const ConfigDescription sw540dpConfig = test::parseConfigOrDie("sw540dp-v14");
-    const ConfigDescription sw600dpConfig = test::parseConfigOrDie("sw600dp-v14");
-    const ConfigDescription sw720dpConfig = test::parseConfigOrDie("sw720dp-v13");
-    const ConfigDescription v20Config = test::parseConfigOrDie("v20");
+  const ConfigDescription defaultConfig = {};
+  const ConfigDescription enConfig = test::parseConfigOrDie("en");
+  const ConfigDescription enV21Config = test::parseConfigOrDie("en-v21");
+  const ConfigDescription ldrtlConfig = test::parseConfigOrDie("ldrtl-v4");
+  const ConfigDescription ldrtlXhdpiConfig =
+      test::parseConfigOrDie("ldrtl-xhdpi-v4");
+  const ConfigDescription sw300dpConfig = test::parseConfigOrDie("sw300dp-v13");
+  const ConfigDescription sw540dpConfig = test::parseConfigOrDie("sw540dp-v14");
+  const ConfigDescription sw600dpConfig = test::parseConfigOrDie("sw600dp-v14");
+  const ConfigDescription sw720dpConfig = test::parseConfigOrDie("sw720dp-v13");
+  const ConfigDescription v20Config = test::parseConfigOrDie("v20");
 
-    std::vector<std::unique_ptr<ResourceConfigValue>> configs;
-    configs.push_back(util::make_unique<ResourceConfigValue>(defaultConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(enConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(enV21Config, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(ldrtlConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(ldrtlXhdpiConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(sw300dpConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(sw540dpConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(sw600dpConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(sw720dpConfig, ""));
-    configs.push_back(util::make_unique<ResourceConfigValue>(v20Config, ""));
+  std::vector<std::unique_ptr<ResourceConfigValue>> configs;
+  configs.push_back(util::make_unique<ResourceConfigValue>(defaultConfig, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(enConfig, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(enV21Config, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(ldrtlConfig, ""));
+  configs.push_back(
+      util::make_unique<ResourceConfigValue>(ldrtlXhdpiConfig, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(sw300dpConfig, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(sw540dpConfig, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(sw600dpConfig, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(sw720dpConfig, ""));
+  configs.push_back(util::make_unique<ResourceConfigValue>(v20Config, ""));
 
-    DominatorTree tree(configs);
-    PrettyPrinter printer;
+  DominatorTree tree(configs);
+  PrettyPrinter printer;
 
-    std::string expected =
-            "<default>\n"
-            "  en\n"
-            "    en-v21\n"
-            "  ldrtl-v4\n"
-            "    ldrtl-xhdpi-v4\n"
-            "  sw300dp-v13\n"
-            "    sw540dp-v14\n"
-            "      sw600dp-v14\n"
-            "    sw720dp-v13\n"
-            "  v20\n";
-    EXPECT_EQ(expected, printer.toString(&tree));
+  std::string expected =
+      "<default>\n"
+      "  en\n"
+      "    en-v21\n"
+      "  ldrtl-v4\n"
+      "    ldrtl-xhdpi-v4\n"
+      "  sw300dp-v13\n"
+      "    sw540dp-v14\n"
+      "      sw600dp-v14\n"
+      "    sw720dp-v13\n"
+      "  v20\n";
+  EXPECT_EQ(expected, printer.toString(&tree));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/Flags.cpp b/tools/aapt2/Flags.cpp
index 3731ac7..cb16196 100644
--- a/tools/aapt2/Flags.cpp
+++ b/tools/aapt2/Flags.cpp
@@ -25,155 +25,167 @@
 
 namespace aapt {
 
-Flags& Flags::requiredFlag(const StringPiece& name, const StringPiece& description,
-                         std::string* value) {
-    auto func = [value](const StringPiece& arg) -> bool {
-        *value = arg.toString();
-        return true;
-    };
+Flags& Flags::requiredFlag(const StringPiece& name,
+                           const StringPiece& description, std::string* value) {
+  auto func = [value](const StringPiece& arg) -> bool {
+    *value = arg.toString();
+    return true;
+  };
 
-    mFlags.push_back(Flag{ name.toString(), description.toString(), func, true, 1, false});
-    return *this;
+  mFlags.push_back(
+      Flag{name.toString(), description.toString(), func, true, 1, false});
+  return *this;
 }
 
-Flags& Flags::requiredFlagList(const StringPiece& name, const StringPiece& description,
+Flags& Flags::requiredFlagList(const StringPiece& name,
+                               const StringPiece& description,
                                std::vector<std::string>* value) {
-    auto func = [value](const StringPiece& arg) -> bool {
-        value->push_back(arg.toString());
-        return true;
-    };
+  auto func = [value](const StringPiece& arg) -> bool {
+    value->push_back(arg.toString());
+    return true;
+  };
 
-    mFlags.push_back(Flag{ name.toString(), description.toString(), func, true, 1, false });
-    return *this;
+  mFlags.push_back(
+      Flag{name.toString(), description.toString(), func, true, 1, false});
+  return *this;
 }
 
-Flags& Flags::optionalFlag(const StringPiece& name, const StringPiece& description,
+Flags& Flags::optionalFlag(const StringPiece& name,
+                           const StringPiece& description,
                            Maybe<std::string>* value) {
-    auto func = [value](const StringPiece& arg) -> bool {
-        *value = arg.toString();
-        return true;
-    };
+  auto func = [value](const StringPiece& arg) -> bool {
+    *value = arg.toString();
+    return true;
+  };
 
-    mFlags.push_back(Flag{ name.toString(), description.toString(), func, false, 1, false });
-    return *this;
+  mFlags.push_back(
+      Flag{name.toString(), description.toString(), func, false, 1, false});
+  return *this;
 }
 
-Flags& Flags::optionalFlagList(const StringPiece& name, const StringPiece& description,
+Flags& Flags::optionalFlagList(const StringPiece& name,
+                               const StringPiece& description,
                                std::vector<std::string>* value) {
-    auto func = [value](const StringPiece& arg) -> bool {
-        value->push_back(arg.toString());
-        return true;
-    };
+  auto func = [value](const StringPiece& arg) -> bool {
+    value->push_back(arg.toString());
+    return true;
+  };
 
-    mFlags.push_back(Flag{ name.toString(), description.toString(), func, false, 1, false });
-    return *this;
+  mFlags.push_back(
+      Flag{name.toString(), description.toString(), func, false, 1, false});
+  return *this;
 }
 
-Flags& Flags::optionalFlagList(const StringPiece& name, const StringPiece& description,
+Flags& Flags::optionalFlagList(const StringPiece& name,
+                               const StringPiece& description,
                                std::unordered_set<std::string>* value) {
-    auto func = [value](const StringPiece& arg) -> bool {
-        value->insert(arg.toString());
-        return true;
-    };
+  auto func = [value](const StringPiece& arg) -> bool {
+    value->insert(arg.toString());
+    return true;
+  };
 
-    mFlags.push_back(Flag{ name.toString(), description.toString(), func, false, 1, false });
-    return *this;
+  mFlags.push_back(
+      Flag{name.toString(), description.toString(), func, false, 1, false});
+  return *this;
 }
 
-Flags& Flags::optionalSwitch(const StringPiece& name, const StringPiece& description,
-                             bool* value) {
-    auto func = [value](const StringPiece& arg) -> bool {
-        *value = true;
-        return true;
-    };
+Flags& Flags::optionalSwitch(const StringPiece& name,
+                             const StringPiece& description, bool* value) {
+  auto func = [value](const StringPiece& arg) -> bool {
+    *value = true;
+    return true;
+  };
 
-    mFlags.push_back(Flag{ name.toString(), description.toString(), func, false, 0, false });
-    return *this;
+  mFlags.push_back(
+      Flag{name.toString(), description.toString(), func, false, 0, false});
+  return *this;
 }
 
 void Flags::usage(const StringPiece& command, std::ostream* out) {
-    constexpr size_t kWidth = 50;
+  constexpr size_t kWidth = 50;
 
-    *out << command << " [options]";
-    for (const Flag& flag : mFlags) {
-        if (flag.required) {
-            *out << " " << flag.name << " arg";
-        }
+  *out << command << " [options]";
+  for (const Flag& flag : mFlags) {
+    if (flag.required) {
+      *out << " " << flag.name << " arg";
+    }
+  }
+
+  *out << " files...\n\nOptions:\n";
+
+  for (const Flag& flag : mFlags) {
+    std::string argLine = flag.name;
+    if (flag.numArgs > 0) {
+      argLine += " arg";
     }
 
-    *out << " files...\n\nOptions:\n";
-
-    for (const Flag& flag : mFlags) {
-        std::string argLine = flag.name;
-        if (flag.numArgs > 0) {
-            argLine += " arg";
-        }
-
-        // Split the description by newlines and write out the argument (which is empty after
-        // the first line) followed by the description line. This will make sure that multiline
-        // descriptions are still right justified and aligned.
-        for (StringPiece line : util::tokenize(flag.description, '\n')) {
-            *out << " " << std::setw(kWidth) << std::left << argLine << line << "\n";
-            argLine = " ";
-        }
+    // Split the description by newlines and write out the argument (which is
+    // empty after
+    // the first line) followed by the description line. This will make sure
+    // that multiline
+    // descriptions are still right justified and aligned.
+    for (StringPiece line : util::tokenize(flag.description, '\n')) {
+      *out << " " << std::setw(kWidth) << std::left << argLine << line << "\n";
+      argLine = " ";
     }
-    *out << " " << std::setw(kWidth) << std::left << "-h" << "Displays this help menu\n";
-    out->flush();
+  }
+  *out << " " << std::setw(kWidth) << std::left << "-h"
+       << "Displays this help menu\n";
+  out->flush();
 }
 
-bool Flags::parse(const StringPiece& command, const std::vector<StringPiece>& args,
+bool Flags::parse(const StringPiece& command,
+                  const std::vector<StringPiece>& args,
                   std::ostream* outError) {
-    for (size_t i = 0; i < args.size(); i++) {
-        StringPiece arg = args[i];
-        if (*(arg.data()) != '-') {
-            mArgs.push_back(arg.toString());
-            continue;
-        }
-
-        if (arg == "-h" || arg == "--help") {
-            usage(command, outError);
-            return false;
-        }
-
-        bool match = false;
-        for (Flag& flag : mFlags) {
-            if (arg == flag.name) {
-                if (flag.numArgs > 0) {
-                    i++;
-                    if (i >= args.size()) {
-                        *outError << flag.name << " missing argument.\n\n";
-                        usage(command, outError);
-                        return false;
-                    }
-                    flag.action(args[i]);
-                } else {
-                    flag.action({});
-                }
-                flag.parsed = true;
-                match = true;
-                break;
-            }
-        }
-
-        if (!match) {
-            *outError << "unknown option '" << arg << "'.\n\n";
-            usage(command, outError);
-            return false;
-        }
+  for (size_t i = 0; i < args.size(); i++) {
+    StringPiece arg = args[i];
+    if (*(arg.data()) != '-') {
+      mArgs.push_back(arg.toString());
+      continue;
     }
 
-    for (const Flag& flag : mFlags) {
-        if (flag.required && !flag.parsed) {
-            *outError << "missing required flag " << flag.name << "\n\n";
+    if (arg == "-h" || arg == "--help") {
+      usage(command, outError);
+      return false;
+    }
+
+    bool match = false;
+    for (Flag& flag : mFlags) {
+      if (arg == flag.name) {
+        if (flag.numArgs > 0) {
+          i++;
+          if (i >= args.size()) {
+            *outError << flag.name << " missing argument.\n\n";
             usage(command, outError);
             return false;
+          }
+          flag.action(args[i]);
+        } else {
+          flag.action({});
         }
+        flag.parsed = true;
+        match = true;
+        break;
+      }
     }
-    return true;
+
+    if (!match) {
+      *outError << "unknown option '" << arg << "'.\n\n";
+      usage(command, outError);
+      return false;
+    }
+  }
+
+  for (const Flag& flag : mFlags) {
+    if (flag.required && !flag.parsed) {
+      *outError << "missing required flag " << flag.name << "\n\n";
+      usage(command, outError);
+      return false;
+    }
+  }
+  return true;
 }
 
-const std::vector<std::string>& Flags::getArgs() {
-    return mArgs;
-}
+const std::vector<std::string>& Flags::getArgs() { return mArgs; }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/Flags.h b/tools/aapt2/Flags.h
index b092855..4a0efdb 100644
--- a/tools/aapt2/Flags.h
+++ b/tools/aapt2/Flags.h
@@ -29,42 +29,45 @@
 namespace aapt {
 
 class Flags {
-public:
-    Flags& requiredFlag(const StringPiece& name, const StringPiece& description,
-                        std::string* value);
-    Flags& requiredFlagList(const StringPiece& name, const StringPiece& description,
-                            std::vector<std::string>* value);
-    Flags& optionalFlag(const StringPiece& name, const StringPiece& description,
-                        Maybe<std::string>* value);
-    Flags& optionalFlagList(const StringPiece& name, const StringPiece& description,
-                            std::vector<std::string>* value);
-    Flags& optionalFlagList(const StringPiece& name, const StringPiece& description,
-                            std::unordered_set<std::string>* value);
-    Flags& optionalSwitch(const StringPiece& name, const StringPiece& description,
-                          bool* value);
+ public:
+  Flags& requiredFlag(const StringPiece& name, const StringPiece& description,
+                      std::string* value);
+  Flags& requiredFlagList(const StringPiece& name,
+                          const StringPiece& description,
+                          std::vector<std::string>* value);
+  Flags& optionalFlag(const StringPiece& name, const StringPiece& description,
+                      Maybe<std::string>* value);
+  Flags& optionalFlagList(const StringPiece& name,
+                          const StringPiece& description,
+                          std::vector<std::string>* value);
+  Flags& optionalFlagList(const StringPiece& name,
+                          const StringPiece& description,
+                          std::unordered_set<std::string>* value);
+  Flags& optionalSwitch(const StringPiece& name, const StringPiece& description,
+                        bool* value);
 
-    void usage(const StringPiece& command, std::ostream* out);
+  void usage(const StringPiece& command, std::ostream* out);
 
-    bool parse(const StringPiece& command, const std::vector<StringPiece>& args,
-               std::ostream* outError);
+  bool parse(const StringPiece& command, const std::vector<StringPiece>& args,
+             std::ostream* outError);
 
-    const std::vector<std::string>& getArgs();
+  const std::vector<std::string>& getArgs();
 
-private:
-    struct Flag {
-        std::string name;
-        std::string description;
-        std::function<bool(const StringPiece& value)> action;
-        bool required;
-        size_t numArgs;
+ private:
+  struct Flag {
+    std::string name;
+    std::string description;
+    std::function<bool(const StringPiece& value)> action;
+    bool required;
+    size_t numArgs;
 
-        bool parsed;
-    };
+    bool parsed;
+  };
 
-    std::vector<Flag> mFlags;
-    std::vector<std::string> mArgs;
+  std::vector<Flag> mFlags;
+  std::vector<std::string> mArgs;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_FLAGS_H
+#endif  // AAPT_FLAGS_H
diff --git a/tools/aapt2/Locale.cpp b/tools/aapt2/Locale.cpp
index f7956c0..a0f7641 100644
--- a/tools/aapt2/Locale.cpp
+++ b/tools/aapt2/Locale.cpp
@@ -17,8 +17,8 @@
 #include "Locale.h"
 #include "util/Util.h"
 
-#include <algorithm>
 #include <ctype.h>
+#include <algorithm>
 #include <string>
 #include <vector>
 
@@ -27,225 +27,226 @@
 using android::ResTable_config;
 
 void LocaleValue::setLanguage(const char* languageChars) {
-     size_t i = 0;
-     while ((*languageChars) != '\0') {
-          language[i++] = ::tolower(*languageChars);
-          languageChars++;
-     }
+  size_t i = 0;
+  while ((*languageChars) != '\0') {
+    language[i++] = ::tolower(*languageChars);
+    languageChars++;
+  }
 }
 
 void LocaleValue::setRegion(const char* regionChars) {
-    size_t i = 0;
-    while ((*regionChars) != '\0') {
-         region[i++] = ::toupper(*regionChars);
-         regionChars++;
-    }
+  size_t i = 0;
+  while ((*regionChars) != '\0') {
+    region[i++] = ::toupper(*regionChars);
+    regionChars++;
+  }
 }
 
 void LocaleValue::setScript(const char* scriptChars) {
-    size_t i = 0;
-    while ((*scriptChars) != '\0') {
-         if (i == 0) {
-             script[i++] = ::toupper(*scriptChars);
-         } else {
-             script[i++] = ::tolower(*scriptChars);
-         }
-         scriptChars++;
+  size_t i = 0;
+  while ((*scriptChars) != '\0') {
+    if (i == 0) {
+      script[i++] = ::toupper(*scriptChars);
+    } else {
+      script[i++] = ::tolower(*scriptChars);
     }
+    scriptChars++;
+  }
 }
 
 void LocaleValue::setVariant(const char* variantChars) {
-     size_t i = 0;
-     while ((*variantChars) != '\0') {
-          variant[i++] = *variantChars;
-          variantChars++;
-     }
+  size_t i = 0;
+  while ((*variantChars) != '\0') {
+    variant[i++] = *variantChars;
+    variantChars++;
+  }
 }
 
 static inline bool isAlpha(const std::string& str) {
-    return std::all_of(std::begin(str), std::end(str), ::isalpha);
+  return std::all_of(std::begin(str), std::end(str), ::isalpha);
 }
 
 static inline bool isNumber(const std::string& str) {
-    return std::all_of(std::begin(str), std::end(str), ::isdigit);
+  return std::all_of(std::begin(str), std::end(str), ::isdigit);
 }
 
 bool LocaleValue::initFromFilterString(const StringPiece& str) {
-     // A locale (as specified in the filter) is an underscore separated name such
-     // as "en_US", "en_Latn_US", or "en_US_POSIX".
-     std::vector<std::string> parts = util::splitAndLowercase(str, '_');
+  // A locale (as specified in the filter) is an underscore separated name such
+  // as "en_US", "en_Latn_US", or "en_US_POSIX".
+  std::vector<std::string> parts = util::splitAndLowercase(str, '_');
 
-     const int numTags = parts.size();
-     bool valid = false;
-     if (numTags >= 1) {
-         const std::string& lang = parts[0];
-         if (isAlpha(lang) && (lang.length() == 2 || lang.length() == 3)) {
-             setLanguage(lang.c_str());
-             valid = true;
-         }
-     }
+  const int numTags = parts.size();
+  bool valid = false;
+  if (numTags >= 1) {
+    const std::string& lang = parts[0];
+    if (isAlpha(lang) && (lang.length() == 2 || lang.length() == 3)) {
+      setLanguage(lang.c_str());
+      valid = true;
+    }
+  }
 
-     if (!valid || numTags == 1) {
-         return valid;
-     }
+  if (!valid || numTags == 1) {
+    return valid;
+  }
 
-     // At this point, valid == true && numTags > 1.
-     const std::string& part2 = parts[1];
-     if ((part2.length() == 2 && isAlpha(part2)) ||
-         (part2.length() == 3 && isNumber(part2))) {
-         setRegion(part2.c_str());
-     } else if (part2.length() == 4 && isAlpha(part2)) {
-         setScript(part2.c_str());
-     } else if (part2.length() >= 4 && part2.length() <= 8) {
-         setVariant(part2.c_str());
-     } else {
-         valid = false;
-     }
+  // At this point, valid == true && numTags > 1.
+  const std::string& part2 = parts[1];
+  if ((part2.length() == 2 && isAlpha(part2)) ||
+      (part2.length() == 3 && isNumber(part2))) {
+    setRegion(part2.c_str());
+  } else if (part2.length() == 4 && isAlpha(part2)) {
+    setScript(part2.c_str());
+  } else if (part2.length() >= 4 && part2.length() <= 8) {
+    setVariant(part2.c_str());
+  } else {
+    valid = false;
+  }
 
-     if (!valid || numTags == 2) {
-         return valid;
-     }
+  if (!valid || numTags == 2) {
+    return valid;
+  }
 
-     // At this point, valid == true && numTags > 1.
-     const std::string& part3 = parts[2];
-     if (((part3.length() == 2 && isAlpha(part3)) ||
-         (part3.length() == 3 && isNumber(part3))) && script[0]) {
-         setRegion(part3.c_str());
-     } else if (part3.length() >= 4 && part3.length() <= 8) {
-         setVariant(part3.c_str());
-     } else {
-         valid = false;
-     }
+  // At this point, valid == true && numTags > 1.
+  const std::string& part3 = parts[2];
+  if (((part3.length() == 2 && isAlpha(part3)) ||
+       (part3.length() == 3 && isNumber(part3))) &&
+      script[0]) {
+    setRegion(part3.c_str());
+  } else if (part3.length() >= 4 && part3.length() <= 8) {
+    setVariant(part3.c_str());
+  } else {
+    valid = false;
+  }
 
-     if (!valid || numTags == 3) {
-         return valid;
-     }
+  if (!valid || numTags == 3) {
+    return valid;
+  }
 
-     const std::string& part4 = parts[3];
-     if (part4.length() >= 4 && part4.length() <= 8) {
-         setVariant(part4.c_str());
-     } else {
-         valid = false;
-     }
+  const std::string& part4 = parts[3];
+  if (part4.length() >= 4 && part4.length() <= 8) {
+    setVariant(part4.c_str());
+  } else {
+    valid = false;
+  }
 
-     if (!valid || numTags > 4) {
-         return false;
-     }
+  if (!valid || numTags > 4) {
+    return false;
+  }
 
-     return true;
+  return true;
 }
 
 ssize_t LocaleValue::initFromParts(std::vector<std::string>::iterator iter,
-        std::vector<std::string>::iterator end) {
-    const std::vector<std::string>::iterator startIter = iter;
+                                   std::vector<std::string>::iterator end) {
+  const std::vector<std::string>::iterator startIter = iter;
 
-    std::string& part = *iter;
-    if (part[0] == 'b' && part[1] == '+') {
-        // This is a "modified" BCP 47 language tag. Same semantics as BCP 47 tags,
-        // except that the separator is "+" and not "-".
-        std::vector<std::string> subtags = util::splitAndLowercase(part, '+');
-        subtags.erase(subtags.begin());
-        if (subtags.size() == 1) {
-            setLanguage(subtags[0].c_str());
-        } else if (subtags.size() == 2) {
-            setLanguage(subtags[0].c_str());
+  std::string& part = *iter;
+  if (part[0] == 'b' && part[1] == '+') {
+    // This is a "modified" BCP 47 language tag. Same semantics as BCP 47 tags,
+    // except that the separator is "+" and not "-".
+    std::vector<std::string> subtags = util::splitAndLowercase(part, '+');
+    subtags.erase(subtags.begin());
+    if (subtags.size() == 1) {
+      setLanguage(subtags[0].c_str());
+    } else if (subtags.size() == 2) {
+      setLanguage(subtags[0].c_str());
 
-            // The second tag can either be a region, a variant or a script.
-            switch (subtags[1].size()) {
-                case 2:
-                case 3:
-                    setRegion(subtags[1].c_str());
-                    break;
-                case 4:
-                    if ('0' <= subtags[1][0] && subtags[1][0] <= '9') {
-                        // This is a variant: fall through
-                    } else {
-                        setScript(subtags[1].c_str());
-                        break;
-                    }
-                case 5:
-                case 6:
-                case 7:
-                case 8:
-                    setVariant(subtags[1].c_str());
-                    break;
-                default:
-                    return -1;
-            }
-        } else if (subtags.size() == 3) {
-            // The language is always the first subtag.
-            setLanguage(subtags[0].c_str());
-
-            // The second subtag can either be a script or a region code.
-            // If its size is 4, it's a script code, else it's a region code.
-            if (subtags[1].size() == 4) {
-                setScript(subtags[1].c_str());
-            } else if (subtags[1].size() == 2 || subtags[1].size() == 3) {
-                setRegion(subtags[1].c_str());
-            } else {
-                return -1;
-            }
-
-            // The third tag can either be a region code (if the second tag was
-            // a script), else a variant code.
-            if (subtags[2].size() >= 4) {
-                setVariant(subtags[2].c_str());
-            } else {
-                setRegion(subtags[2].c_str());
-            }
-        } else if (subtags.size() == 4) {
-            setLanguage(subtags[0].c_str());
+      // The second tag can either be a region, a variant or a script.
+      switch (subtags[1].size()) {
+        case 2:
+        case 3:
+          setRegion(subtags[1].c_str());
+          break;
+        case 4:
+          if ('0' <= subtags[1][0] && subtags[1][0] <= '9') {
+            // This is a variant: fall through
+          } else {
             setScript(subtags[1].c_str());
-            setRegion(subtags[2].c_str());
-            setVariant(subtags[3].c_str());
-        } else {
-            return -1;
-        }
+            break;
+          }
+        case 5:
+        case 6:
+        case 7:
+        case 8:
+          setVariant(subtags[1].c_str());
+          break;
+        default:
+          return -1;
+      }
+    } else if (subtags.size() == 3) {
+      // The language is always the first subtag.
+      setLanguage(subtags[0].c_str());
 
-        ++iter;
+      // The second subtag can either be a script or a region code.
+      // If its size is 4, it's a script code, else it's a region code.
+      if (subtags[1].size() == 4) {
+        setScript(subtags[1].c_str());
+      } else if (subtags[1].size() == 2 || subtags[1].size() == 3) {
+        setRegion(subtags[1].c_str());
+      } else {
+        return -1;
+      }
 
+      // The third tag can either be a region code (if the second tag was
+      // a script), else a variant code.
+      if (subtags[2].size() >= 4) {
+        setVariant(subtags[2].c_str());
+      } else {
+        setRegion(subtags[2].c_str());
+      }
+    } else if (subtags.size() == 4) {
+      setLanguage(subtags[0].c_str());
+      setScript(subtags[1].c_str());
+      setRegion(subtags[2].c_str());
+      setVariant(subtags[3].c_str());
     } else {
-        if ((part.length() == 2 || part.length() == 3)
-                && isAlpha(part) && part != "car") {
-            setLanguage(part.c_str());
-            ++iter;
-
-            if (iter != end) {
-                const std::string& regionPart = *iter;
-                if (regionPart.c_str()[0] == 'r' && regionPart.length() == 3) {
-                    setRegion(regionPart.c_str() + 1);
-                    ++iter;
-                }
-            }
-        }
+      return -1;
     }
 
-    return static_cast<ssize_t>(iter - startIter);
+    ++iter;
+
+  } else {
+    if ((part.length() == 2 || part.length() == 3) && isAlpha(part) &&
+        part != "car") {
+      setLanguage(part.c_str());
+      ++iter;
+
+      if (iter != end) {
+        const std::string& regionPart = *iter;
+        if (regionPart.c_str()[0] == 'r' && regionPart.length() == 3) {
+          setRegion(regionPart.c_str() + 1);
+          ++iter;
+        }
+      }
+    }
+  }
+
+  return static_cast<ssize_t>(iter - startIter);
 }
 
 void LocaleValue::initFromResTable(const ResTable_config& config) {
-    config.unpackLanguage(language);
-    config.unpackRegion(region);
-    if (config.localeScript[0] && !config.localeScriptWasComputed) {
-        memcpy(script, config.localeScript, sizeof(config.localeScript));
-    }
+  config.unpackLanguage(language);
+  config.unpackRegion(region);
+  if (config.localeScript[0] && !config.localeScriptWasComputed) {
+    memcpy(script, config.localeScript, sizeof(config.localeScript));
+  }
 
-    if (config.localeVariant[0]) {
-        memcpy(variant, config.localeVariant, sizeof(config.localeVariant));
-    }
+  if (config.localeVariant[0]) {
+    memcpy(variant, config.localeVariant, sizeof(config.localeVariant));
+  }
 }
 
 void LocaleValue::writeTo(ResTable_config* out) const {
-    out->packLanguage(language);
-    out->packRegion(region);
+  out->packLanguage(language);
+  out->packRegion(region);
 
-    if (script[0]) {
-        memcpy(out->localeScript, script, sizeof(out->localeScript));
-    }
+  if (script[0]) {
+    memcpy(out->localeScript, script, sizeof(out->localeScript));
+  }
 
-    if (variant[0]) {
-        memcpy(out->localeVariant, variant, sizeof(out->localeVariant));
-    }
+  if (variant[0]) {
+    memcpy(out->localeVariant, variant, sizeof(out->localeVariant));
+  }
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/Locale.h b/tools/aapt2/Locale.h
index 33f80ad..0f75850 100644
--- a/tools/aapt2/Locale.h
+++ b/tools/aapt2/Locale.h
@@ -29,86 +29,84 @@
  * A convenience class to build and parse locales.
  */
 struct LocaleValue {
-    char language[4];
-    char region[4];
-    char script[4];
-    char variant[8];
+  char language[4];
+  char region[4];
+  char script[4];
+  char variant[8];
 
-    inline LocaleValue();
+  inline LocaleValue();
 
-    /**
-     * Initialize this LocaleValue from a config string.
-     */
-    bool initFromFilterString(const StringPiece& config);
+  /**
+   * Initialize this LocaleValue from a config string.
+   */
+  bool initFromFilterString(const StringPiece& config);
 
-    /**
-     * Initialize this LocaleValue from parts of a vector.
-     */
-    ssize_t initFromParts(std::vector<std::string>::iterator iter,
-            std::vector<std::string>::iterator end);
+  /**
+   * Initialize this LocaleValue from parts of a vector.
+   */
+  ssize_t initFromParts(std::vector<std::string>::iterator iter,
+                        std::vector<std::string>::iterator end);
 
-    /**
-     * Initialize this LocaleValue from a ResTable_config.
-     */
-    void initFromResTable(const android::ResTable_config& config);
+  /**
+   * Initialize this LocaleValue from a ResTable_config.
+   */
+  void initFromResTable(const android::ResTable_config& config);
 
-    /**
-     * Set the locale in a ResTable_config from this LocaleValue.
-     */
-    void writeTo(android::ResTable_config* out) const;
+  /**
+   * Set the locale in a ResTable_config from this LocaleValue.
+   */
+  void writeTo(android::ResTable_config* out) const;
 
-    inline int compare(const LocaleValue& other) const;
+  inline int compare(const LocaleValue& other) const;
 
-    inline bool operator<(const LocaleValue& o) const;
-    inline bool operator<=(const LocaleValue& o) const;
-    inline bool operator==(const LocaleValue& o) const;
-    inline bool operator!=(const LocaleValue& o) const;
-    inline bool operator>=(const LocaleValue& o) const;
-    inline bool operator>(const LocaleValue& o) const;
+  inline bool operator<(const LocaleValue& o) const;
+  inline bool operator<=(const LocaleValue& o) const;
+  inline bool operator==(const LocaleValue& o) const;
+  inline bool operator!=(const LocaleValue& o) const;
+  inline bool operator>=(const LocaleValue& o) const;
+  inline bool operator>(const LocaleValue& o) const;
 
-private:
-     void setLanguage(const char* language);
-     void setRegion(const char* language);
-     void setScript(const char* script);
-     void setVariant(const char* variant);
+ private:
+  void setLanguage(const char* language);
+  void setRegion(const char* language);
+  void setScript(const char* script);
+  void setVariant(const char* variant);
 };
 
 //
 // Implementation
 //
 
-LocaleValue::LocaleValue() {
-    memset(this, 0, sizeof(LocaleValue));
-}
+LocaleValue::LocaleValue() { memset(this, 0, sizeof(LocaleValue)); }
 
 int LocaleValue::compare(const LocaleValue& other) const {
-    return memcmp(this, &other, sizeof(LocaleValue));
+  return memcmp(this, &other, sizeof(LocaleValue));
 }
 
 bool LocaleValue::operator<(const LocaleValue& o) const {
-    return compare(o) < 0;
+  return compare(o) < 0;
 }
 
 bool LocaleValue::operator<=(const LocaleValue& o) const {
-    return compare(o) <= 0;
+  return compare(o) <= 0;
 }
 
 bool LocaleValue::operator==(const LocaleValue& o) const {
-    return compare(o) == 0;
+  return compare(o) == 0;
 }
 
 bool LocaleValue::operator!=(const LocaleValue& o) const {
-    return compare(o) != 0;
+  return compare(o) != 0;
 }
 
 bool LocaleValue::operator>=(const LocaleValue& o) const {
-    return compare(o) >= 0;
+  return compare(o) >= 0;
 }
 
 bool LocaleValue::operator>(const LocaleValue& o) const {
-    return compare(o) > 0;
+  return compare(o) > 0;
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_LOCALE_VALUE_H
+#endif  // AAPT_LOCALE_VALUE_H
diff --git a/tools/aapt2/Locale_test.cpp b/tools/aapt2/Locale_test.cpp
index e4b8ce7..b82d2b9 100644
--- a/tools/aapt2/Locale_test.cpp
+++ b/tools/aapt2/Locale_test.cpp
@@ -22,61 +22,73 @@
 
 namespace aapt {
 
-static ::testing::AssertionResult TestLanguage(const char* input, const char* lang) {
-    std::vector<std::string> parts = util::splitAndLowercase(input, '-');
-    LocaleValue lv;
-    ssize_t count = lv.initFromParts(std::begin(parts), std::end(parts));
-    if (count < 0) {
-        return ::testing::AssertionFailure() << " failed to parse '" << input << "'.";
-    }
+static ::testing::AssertionResult TestLanguage(const char* input,
+                                               const char* lang) {
+  std::vector<std::string> parts = util::splitAndLowercase(input, '-');
+  LocaleValue lv;
+  ssize_t count = lv.initFromParts(std::begin(parts), std::end(parts));
+  if (count < 0) {
+    return ::testing::AssertionFailure() << " failed to parse '" << input
+                                         << "'.";
+  }
 
-    if (count != 1) {
-        return ::testing::AssertionFailure() << count
-            << " parts were consumed parsing '" << input << "' but expected 1.";
-    }
+  if (count != 1) {
+    return ::testing::AssertionFailure()
+           << count << " parts were consumed parsing '" << input
+           << "' but expected 1.";
+  }
 
-    if (memcmp(lv.language, lang, std::min(strlen(lang), sizeof(lv.language))) != 0) {
-        return ::testing::AssertionFailure() << "expected " << lang << " but got "
-            << std::string(lv.language, sizeof(lv.language)) << ".";
-    }
+  if (memcmp(lv.language, lang, std::min(strlen(lang), sizeof(lv.language))) !=
+      0) {
+    return ::testing::AssertionFailure()
+           << "expected " << lang << " but got "
+           << std::string(lv.language, sizeof(lv.language)) << ".";
+  }
 
-    return ::testing::AssertionSuccess();
+  return ::testing::AssertionSuccess();
 }
 
-static ::testing::AssertionResult TestLanguageRegion(const char* input, const char* lang,
+static ::testing::AssertionResult TestLanguageRegion(const char* input,
+                                                     const char* lang,
                                                      const char* region) {
-    std::vector<std::string> parts = util::splitAndLowercase(input, '-');
-    LocaleValue lv;
-    ssize_t count = lv.initFromParts(std::begin(parts), std::end(parts));
-    if (count < 0) {
-        return ::testing::AssertionFailure() << " failed to parse '" << input << "'.";
-    }
+  std::vector<std::string> parts = util::splitAndLowercase(input, '-');
+  LocaleValue lv;
+  ssize_t count = lv.initFromParts(std::begin(parts), std::end(parts));
+  if (count < 0) {
+    return ::testing::AssertionFailure() << " failed to parse '" << input
+                                         << "'.";
+  }
 
-    if (count != 2) {
-        return ::testing::AssertionFailure() << count
-            << " parts were consumed parsing '" << input << "' but expected 2.";
-    }
+  if (count != 2) {
+    return ::testing::AssertionFailure()
+           << count << " parts were consumed parsing '" << input
+           << "' but expected 2.";
+  }
 
-    if (memcmp(lv.language, lang, std::min(strlen(lang), sizeof(lv.language))) != 0) {
-        return ::testing::AssertionFailure() << "expected " << input << " but got "
-            << std::string(lv.language, sizeof(lv.language)) << ".";
-    }
+  if (memcmp(lv.language, lang, std::min(strlen(lang), sizeof(lv.language))) !=
+      0) {
+    return ::testing::AssertionFailure()
+           << "expected " << input << " but got "
+           << std::string(lv.language, sizeof(lv.language)) << ".";
+  }
 
-    if (memcmp(lv.region, region, std::min(strlen(region), sizeof(lv.region))) != 0) {
-        return ::testing::AssertionFailure() << "expected " << region << " but got "
-            << std::string(lv.region, sizeof(lv.region)) << ".";
-    }
+  if (memcmp(lv.region, region, std::min(strlen(region), sizeof(lv.region))) !=
+      0) {
+    return ::testing::AssertionFailure()
+           << "expected " << region << " but got "
+           << std::string(lv.region, sizeof(lv.region)) << ".";
+  }
 
-    return ::testing::AssertionSuccess();
+  return ::testing::AssertionSuccess();
 }
 
 TEST(ConfigDescriptionTest, ParseLanguage) {
-    EXPECT_TRUE(TestLanguage("en", "en"));
-    EXPECT_TRUE(TestLanguage("fr", "fr"));
-    EXPECT_FALSE(TestLanguage("land", ""));
-    EXPECT_TRUE(TestLanguage("fr-land", "fr"));
+  EXPECT_TRUE(TestLanguage("en", "en"));
+  EXPECT_TRUE(TestLanguage("fr", "fr"));
+  EXPECT_FALSE(TestLanguage("land", ""));
+  EXPECT_TRUE(TestLanguage("fr-land", "fr"));
 
-    EXPECT_TRUE(TestLanguageRegion("fr-rCA", "fr", "CA"));
+  EXPECT_TRUE(TestLanguageRegion("fr-rCA", "fr", "CA"));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/Main.cpp b/tools/aapt2/Main.cpp
index f3f70d6..8aedd44 100644
--- a/tools/aapt2/Main.cpp
+++ b/tools/aapt2/Main.cpp
@@ -28,9 +28,9 @@
 static const char* sMinorVersion = "2";
 
 int printVersion() {
-    std::cerr << "Android Asset Packaging Tool (aapt) "
-            << sMajorVersion << "." << sMinorVersion << std::endl;
-    return 0;
+  std::cerr << "Android Asset Packaging Tool (aapt) " << sMajorVersion << "."
+            << sMinorVersion << std::endl;
+  return 0;
 }
 
 extern int compile(const std::vector<StringPiece>& args);
@@ -38,35 +38,36 @@
 extern int dump(const std::vector<StringPiece>& args);
 extern int diff(const std::vector<StringPiece>& args);
 
-} // namespace aapt
+}  // namespace aapt
 
 int main(int argc, char** argv) {
-    if (argc >= 2) {
-        argv += 1;
-        argc -= 1;
+  if (argc >= 2) {
+    argv += 1;
+    argc -= 1;
 
-        std::vector<aapt::StringPiece> args;
-        for (int i = 1; i < argc; i++) {
-            args.push_back(argv[i]);
-        }
-
-        aapt::StringPiece command(argv[0]);
-        if (command == "compile" || command == "c") {
-            return aapt::compile(args);
-        } else if (command == "link" || command == "l") {
-            return aapt::link(args);
-        } else if (command == "dump" || command == "d") {
-            return aapt::dump(args);
-        } else if (command == "diff") {
-            return aapt::diff(args);
-        } else if (command == "version") {
-            return aapt::printVersion();
-        }
-        std::cerr << "unknown command '" << command << "'\n";
-    } else {
-        std::cerr << "no command specified\n";
+    std::vector<aapt::StringPiece> args;
+    for (int i = 1; i < argc; i++) {
+      args.push_back(argv[i]);
     }
 
-    std::cerr << "\nusage: aapt2 [compile|link|dump|diff|version] ..." << std::endl;
-    return 1;
+    aapt::StringPiece command(argv[0]);
+    if (command == "compile" || command == "c") {
+      return aapt::compile(args);
+    } else if (command == "link" || command == "l") {
+      return aapt::link(args);
+    } else if (command == "dump" || command == "d") {
+      return aapt::dump(args);
+    } else if (command == "diff") {
+      return aapt::diff(args);
+    } else if (command == "version") {
+      return aapt::printVersion();
+    }
+    std::cerr << "unknown command '" << command << "'\n";
+  } else {
+    std::cerr << "no command specified\n";
+  }
+
+  std::cerr << "\nusage: aapt2 [compile|link|dump|diff|version] ..."
+            << std::endl;
+  return 1;
 }
diff --git a/tools/aapt2/NameMangler.h b/tools/aapt2/NameMangler.h
index b6aaa4d..6d244aa 100644
--- a/tools/aapt2/NameMangler.h
+++ b/tools/aapt2/NameMangler.h
@@ -26,69 +26,71 @@
 namespace aapt {
 
 struct NameManglerPolicy {
-    /**
-     * Represents the package we are trying to build. References pointing
-     * to this package are not mangled, and mangled references inherit this package name.
-     */
-    std::string targetPackageName;
+  /**
+   * Represents the package we are trying to build. References pointing
+   * to this package are not mangled, and mangled references inherit this
+   * package name.
+   */
+  std::string targetPackageName;
 
-    /**
-     * We must know which references to mangle, and which to keep (android vs. com.android.support).
-     */
-    std::set<std::string> packagesToMangle;
+  /**
+   * We must know which references to mangle, and which to keep (android vs.
+   * com.android.support).
+   */
+  std::set<std::string> packagesToMangle;
 };
 
 class NameMangler {
-private:
-    NameManglerPolicy mPolicy;
+ private:
+  NameManglerPolicy mPolicy;
 
-public:
-    explicit NameMangler(NameManglerPolicy policy) : mPolicy(policy) {
+ public:
+  explicit NameMangler(NameManglerPolicy policy) : mPolicy(policy) {}
+
+  Maybe<ResourceName> mangleName(const ResourceName& name) {
+    if (mPolicy.targetPackageName == name.package ||
+        mPolicy.packagesToMangle.count(name.package) == 0) {
+      return {};
     }
 
-    Maybe<ResourceName> mangleName(const ResourceName& name) {
-        if (mPolicy.targetPackageName == name.package ||
-                mPolicy.packagesToMangle.count(name.package) == 0) {
-            return {};
-        }
+    std::string mangledEntryName = mangleEntry(name.package, name.entry);
+    return ResourceName(mPolicy.targetPackageName, name.type, mangledEntryName);
+  }
 
-        std::string mangledEntryName = mangleEntry(name.package, name.entry);
-        return ResourceName(mPolicy.targetPackageName, name.type, mangledEntryName);
+  bool shouldMangle(const std::string& package) const {
+    if (package.empty() || mPolicy.targetPackageName == package) {
+      return false;
+    }
+    return mPolicy.packagesToMangle.count(package) != 0;
+  }
+
+  /**
+   * Returns a mangled name that is a combination of `name` and `package`.
+   * The mangled name should contain symbols that are illegal to define in XML,
+   * so that there will never be name mangling collisions.
+   */
+  static std::string mangleEntry(const std::string& package,
+                                 const std::string& name) {
+    return package + "$" + name;
+  }
+
+  /**
+   * Unmangles the name in `outName`, storing the correct name back in `outName`
+   * and the package in `outPackage`. Returns true if the name was unmangled or
+   * false if the name was never mangled to begin with.
+   */
+  static bool unmangle(std::string* outName, std::string* outPackage) {
+    size_t pivot = outName->find('$');
+    if (pivot == std::string::npos) {
+      return false;
     }
 
-    bool shouldMangle(const std::string& package) const {
-        if (package.empty() || mPolicy.targetPackageName == package) {
-            return false;
-        }
-        return mPolicy.packagesToMangle.count(package) != 0;
-    }
-
-    /**
-     * Returns a mangled name that is a combination of `name` and `package`.
-     * The mangled name should contain symbols that are illegal to define in XML,
-     * so that there will never be name mangling collisions.
-     */
-    static std::string mangleEntry(const std::string& package, const std::string& name) {
-        return package + "$" + name;
-    }
-
-    /**
-     * Unmangles the name in `outName`, storing the correct name back in `outName`
-     * and the package in `outPackage`. Returns true if the name was unmangled or
-     * false if the name was never mangled to begin with.
-     */
-    static bool unmangle(std::string* outName, std::string* outPackage) {
-        size_t pivot = outName->find('$');
-        if (pivot == std::string::npos) {
-            return false;
-        }
-
-        outPackage->assign(outName->data(), pivot);
-        outName->assign(outName->data() + pivot + 1, outName->size() - (pivot + 1));
-        return true;
-    }
+    outPackage->assign(outName->data(), pivot);
+    outName->assign(outName->data() + pivot + 1, outName->size() - (pivot + 1));
+    return true;
+  }
 };
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_NAME_MANGLER_H
+#endif  // AAPT_NAME_MANGLER_H
diff --git a/tools/aapt2/NameMangler_test.cpp b/tools/aapt2/NameMangler_test.cpp
index f624df2..b02986d 100644
--- a/tools/aapt2/NameMangler_test.cpp
+++ b/tools/aapt2/NameMangler_test.cpp
@@ -22,25 +22,25 @@
 namespace aapt {
 
 TEST(NameManglerTest, MangleName) {
-    std::string package = "android.appcompat";
-    std::string name = "Platform.AppCompat";
+  std::string package = "android.appcompat";
+  std::string name = "Platform.AppCompat";
 
-    std::string mangledName = NameMangler::mangleEntry(package, name);
-    EXPECT_EQ(mangledName, "android.appcompat$Platform.AppCompat");
+  std::string mangledName = NameMangler::mangleEntry(package, name);
+  EXPECT_EQ(mangledName, "android.appcompat$Platform.AppCompat");
 
-    std::string unmangledPackage;
-    std::string unmangledName = mangledName;
-    ASSERT_TRUE(NameMangler::unmangle(&unmangledName, &unmangledPackage));
-    EXPECT_EQ(unmangledName, "Platform.AppCompat");
-    EXPECT_EQ(unmangledPackage, "android.appcompat");
+  std::string unmangledPackage;
+  std::string unmangledName = mangledName;
+  ASSERT_TRUE(NameMangler::unmangle(&unmangledName, &unmangledPackage));
+  EXPECT_EQ(unmangledName, "Platform.AppCompat");
+  EXPECT_EQ(unmangledPackage, "android.appcompat");
 }
 
 TEST(NameManglerTest, IgnoreUnmangledName) {
-    std::string package;
-    std::string name = "foo_bar";
+  std::string package;
+  std::string name = "foo_bar";
 
-    EXPECT_FALSE(NameMangler::unmangle(&name, &package));
-    EXPECT_EQ(name, "foo_bar");
+  EXPECT_FALSE(NameMangler::unmangle(&name, &package));
+  EXPECT_EQ(name, "foo_bar");
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/Resource.cpp b/tools/aapt2/Resource.cpp
index b7a091e..6805631 100644
--- a/tools/aapt2/Resource.cpp
+++ b/tools/aapt2/Resource.cpp
@@ -23,74 +23,97 @@
 namespace aapt {
 
 StringPiece toString(ResourceType type) {
-    switch (type) {
-        case ResourceType::kAnim:          return "anim";
-        case ResourceType::kAnimator:      return "animator";
-        case ResourceType::kArray:         return "array";
-        case ResourceType::kAttr:          return "attr";
-        case ResourceType::kAttrPrivate:   return "^attr-private";
-        case ResourceType::kBool:          return "bool";
-        case ResourceType::kColor:         return "color";
-        case ResourceType::kDimen:         return "dimen";
-        case ResourceType::kDrawable:      return "drawable";
-        case ResourceType::kFraction:      return "fraction";
-        case ResourceType::kId:            return "id";
-        case ResourceType::kInteger:       return "integer";
-        case ResourceType::kInterpolator:  return "interpolator";
-        case ResourceType::kLayout:        return "layout";
-        case ResourceType::kMenu:          return "menu";
-        case ResourceType::kMipmap:        return "mipmap";
-        case ResourceType::kPlurals:       return "plurals";
-        case ResourceType::kRaw:           return "raw";
-        case ResourceType::kString:        return "string";
-        case ResourceType::kStyle:         return "style";
-        case ResourceType::kStyleable:     return "styleable";
-        case ResourceType::kTransition:    return "transition";
-        case ResourceType::kXml:           return "xml";
-    }
-    return {};
+  switch (type) {
+    case ResourceType::kAnim:
+      return "anim";
+    case ResourceType::kAnimator:
+      return "animator";
+    case ResourceType::kArray:
+      return "array";
+    case ResourceType::kAttr:
+      return "attr";
+    case ResourceType::kAttrPrivate:
+      return "^attr-private";
+    case ResourceType::kBool:
+      return "bool";
+    case ResourceType::kColor:
+      return "color";
+    case ResourceType::kDimen:
+      return "dimen";
+    case ResourceType::kDrawable:
+      return "drawable";
+    case ResourceType::kFraction:
+      return "fraction";
+    case ResourceType::kId:
+      return "id";
+    case ResourceType::kInteger:
+      return "integer";
+    case ResourceType::kInterpolator:
+      return "interpolator";
+    case ResourceType::kLayout:
+      return "layout";
+    case ResourceType::kMenu:
+      return "menu";
+    case ResourceType::kMipmap:
+      return "mipmap";
+    case ResourceType::kPlurals:
+      return "plurals";
+    case ResourceType::kRaw:
+      return "raw";
+    case ResourceType::kString:
+      return "string";
+    case ResourceType::kStyle:
+      return "style";
+    case ResourceType::kStyleable:
+      return "styleable";
+    case ResourceType::kTransition:
+      return "transition";
+    case ResourceType::kXml:
+      return "xml";
+  }
+  return {};
 }
 
-static const std::map<StringPiece, ResourceType> sResourceTypeMap {
-        { "anim", ResourceType::kAnim },
-        { "animator", ResourceType::kAnimator },
-        { "array", ResourceType::kArray },
-        { "attr", ResourceType::kAttr },
-        { "^attr-private", ResourceType::kAttrPrivate },
-        { "bool", ResourceType::kBool },
-        { "color", ResourceType::kColor },
-        { "dimen", ResourceType::kDimen },
-        { "drawable", ResourceType::kDrawable },
-        { "fraction", ResourceType::kFraction },
-        { "id", ResourceType::kId },
-        { "integer", ResourceType::kInteger },
-        { "interpolator", ResourceType::kInterpolator },
-        { "layout", ResourceType::kLayout },
-        { "menu", ResourceType::kMenu },
-        { "mipmap", ResourceType::kMipmap },
-        { "plurals", ResourceType::kPlurals },
-        { "raw", ResourceType::kRaw },
-        { "string", ResourceType::kString },
-        { "style", ResourceType::kStyle },
-        { "styleable", ResourceType::kStyleable },
-        { "transition", ResourceType::kTransition },
-        { "xml", ResourceType::kXml },
+static const std::map<StringPiece, ResourceType> sResourceTypeMap{
+    {"anim", ResourceType::kAnim},
+    {"animator", ResourceType::kAnimator},
+    {"array", ResourceType::kArray},
+    {"attr", ResourceType::kAttr},
+    {"^attr-private", ResourceType::kAttrPrivate},
+    {"bool", ResourceType::kBool},
+    {"color", ResourceType::kColor},
+    {"dimen", ResourceType::kDimen},
+    {"drawable", ResourceType::kDrawable},
+    {"fraction", ResourceType::kFraction},
+    {"id", ResourceType::kId},
+    {"integer", ResourceType::kInteger},
+    {"interpolator", ResourceType::kInterpolator},
+    {"layout", ResourceType::kLayout},
+    {"menu", ResourceType::kMenu},
+    {"mipmap", ResourceType::kMipmap},
+    {"plurals", ResourceType::kPlurals},
+    {"raw", ResourceType::kRaw},
+    {"string", ResourceType::kString},
+    {"style", ResourceType::kStyle},
+    {"styleable", ResourceType::kStyleable},
+    {"transition", ResourceType::kTransition},
+    {"xml", ResourceType::kXml},
 };
 
 const ResourceType* parseResourceType(const StringPiece& str) {
-    auto iter = sResourceTypeMap.find(str);
-    if (iter == std::end(sResourceTypeMap)) {
-        return nullptr;
-    }
-    return &iter->second;
+  auto iter = sResourceTypeMap.find(str);
+  if (iter == std::end(sResourceTypeMap)) {
+    return nullptr;
+  }
+  return &iter->second;
 }
 
 bool operator<(const ResourceKey& a, const ResourceKey& b) {
-    return std::tie(a.name, a.config) < std::tie(b.name, b.config);
+  return std::tie(a.name, a.config) < std::tie(b.name, b.config);
 }
 
 bool operator<(const ResourceKeyRef& a, const ResourceKeyRef& b) {
-    return std::tie(a.name, a.config) < std::tie(b.name, b.config);
+  return std::tie(a.name, a.config) < std::tie(b.name, b.config);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/Resource.h b/tools/aapt2/Resource.h
index 2969b8c..30739db 100644
--- a/tools/aapt2/Resource.h
+++ b/tools/aapt2/Resource.h
@@ -37,29 +37,29 @@
  * to the 'type' in package:type/entry.
  */
 enum class ResourceType {
-    kAnim,
-    kAnimator,
-    kArray,
-    kAttr,
-    kAttrPrivate,
-    kBool,
-    kColor,
-    kDimen,
-    kDrawable,
-    kFraction,
-    kId,
-    kInteger,
-    kInterpolator,
-    kLayout,
-    kMenu,
-    kMipmap,
-    kPlurals,
-    kRaw,
-    kString,
-    kStyle,
-    kStyleable,
-    kTransition,
-    kXml,
+  kAnim,
+  kAnimator,
+  kArray,
+  kAttr,
+  kAttrPrivate,
+  kBool,
+  kColor,
+  kDimen,
+  kDrawable,
+  kFraction,
+  kId,
+  kInteger,
+  kInterpolator,
+  kLayout,
+  kMenu,
+  kMipmap,
+  kPlurals,
+  kRaw,
+  kString,
+  kStyle,
+  kStyleable,
+  kTransition,
+  kXml,
 };
 
 StringPiece toString(ResourceType type);
@@ -75,17 +75,17 @@
  * a resource in the ResourceTable.
  */
 struct ResourceName {
-    std::string package;
-    ResourceType type;
-    std::string entry;
+  std::string package;
+  ResourceType type;
+  std::string entry;
 
-    ResourceName() : type(ResourceType::kRaw) {}
-    ResourceName(const StringPiece& p, ResourceType t, const StringPiece& e);
+  ResourceName() : type(ResourceType::kRaw) {}
+  ResourceName(const StringPiece& p, ResourceType t, const StringPiece& e);
 
-    int compare(const ResourceName& other) const;
+  int compare(const ResourceName& other) const;
 
-    bool isValid() const;
-    std::string toString() const;
+  bool isValid() const;
+  std::string toString() const;
 };
 
 /**
@@ -95,21 +95,21 @@
  * of the original string.
  */
 struct ResourceNameRef {
-    StringPiece package;
-    ResourceType type;
-    StringPiece entry;
+  StringPiece package;
+  ResourceType type;
+  StringPiece entry;
 
-    ResourceNameRef() = default;
-    ResourceNameRef(const ResourceNameRef&) = default;
-    ResourceNameRef(ResourceNameRef&&) = default;
-    ResourceNameRef(const ResourceName& rhs);  // NOLINT(implicit)
-    ResourceNameRef(const StringPiece& p, ResourceType t, const StringPiece& e);
-    ResourceNameRef& operator=(const ResourceNameRef& rhs) = default;
-    ResourceNameRef& operator=(ResourceNameRef&& rhs) = default;
-    ResourceNameRef& operator=(const ResourceName& rhs);
+  ResourceNameRef() = default;
+  ResourceNameRef(const ResourceNameRef&) = default;
+  ResourceNameRef(ResourceNameRef&&) = default;
+  ResourceNameRef(const ResourceName& rhs);  // NOLINT(implicit)
+  ResourceNameRef(const StringPiece& p, ResourceType t, const StringPiece& e);
+  ResourceNameRef& operator=(const ResourceNameRef& rhs) = default;
+  ResourceNameRef& operator=(ResourceNameRef&& rhs) = default;
+  ResourceNameRef& operator=(const ResourceName& rhs);
 
-    ResourceName toResourceName() const;
-    bool isValid() const;
+  ResourceName toResourceName() const;
+  bool isValid() const;
 };
 
 /**
@@ -124,64 +124,66 @@
  * EEEE: 16 bit entry identifier.
  */
 struct ResourceId {
-    uint32_t id;
+  uint32_t id;
 
-    ResourceId();
-    ResourceId(const ResourceId& rhs);
-    ResourceId(uint32_t resId);  // NOLINT(implicit)
-    ResourceId(uint8_t p, uint8_t t, uint16_t e);
+  ResourceId();
+  ResourceId(const ResourceId& rhs);
+  ResourceId(uint32_t resId);  // NOLINT(implicit)
+  ResourceId(uint8_t p, uint8_t t, uint16_t e);
 
-    bool isValid() const;
-    uint8_t packageId() const;
-    uint8_t typeId() const;
-    uint16_t entryId() const;
+  bool isValid() const;
+  uint8_t packageId() const;
+  uint8_t typeId() const;
+  uint16_t entryId() const;
 };
 
 struct SourcedResourceName {
-    ResourceName name;
-    size_t line;
+  ResourceName name;
+  size_t line;
 };
 
 struct ResourceFile {
-    // Name
-    ResourceName name;
+  // Name
+  ResourceName name;
 
-    // Configuration
-    ConfigDescription config;
+  // Configuration
+  ConfigDescription config;
 
-    // Source
-    Source source;
+  // Source
+  Source source;
 
-    // Exported symbols
-    std::vector<SourcedResourceName> exportedSymbols;
+  // Exported symbols
+  std::vector<SourcedResourceName> exportedSymbols;
 };
 
 /**
- * Useful struct used as a key to represent a unique resource in associative containers.
+ * Useful struct used as a key to represent a unique resource in associative
+ * containers.
  */
 struct ResourceKey {
-    ResourceName name;
-    ConfigDescription config;
+  ResourceName name;
+  ConfigDescription config;
 };
 
 bool operator<(const ResourceKey& a, const ResourceKey& b);
 
 /**
- * Useful struct used as a key to represent a unique resource in associative containers.
+ * Useful struct used as a key to represent a unique resource in associative
+ * containers.
  * Holds a reference to the name, so that name better live longer than this key!
  */
 struct ResourceKeyRef {
-    ResourceNameRef name;
-    ConfigDescription config;
+  ResourceNameRef name;
+  ConfigDescription config;
 
-    ResourceKeyRef() = default;
-    ResourceKeyRef(const ResourceNameRef& n, const ConfigDescription& c) : name(n), config(c) {
-    }
+  ResourceKeyRef() = default;
+  ResourceKeyRef(const ResourceNameRef& n, const ConfigDescription& c)
+      : name(n), config(c) {}
 
-    /**
-     * Prevent taking a reference to a temporary. This is bad.
-     */
-    ResourceKeyRef(ResourceName&& n, const ConfigDescription& c) = delete;
+  /**
+   * Prevent taking a reference to a temporary. This is bad.
+   */
+  ResourceKeyRef(ResourceName&& n, const ConfigDescription& c) = delete;
 };
 
 bool operator<(const ResourceKeyRef& a, const ResourceKeyRef& b);
@@ -190,193 +192,194 @@
 // ResourceId implementation.
 //
 
-inline ResourceId::ResourceId() : id(0) {
-}
+inline ResourceId::ResourceId() : id(0) {}
 
-inline ResourceId::ResourceId(const ResourceId& rhs) : id(rhs.id) {
-}
+inline ResourceId::ResourceId(const ResourceId& rhs) : id(rhs.id) {}
 
-inline ResourceId::ResourceId(uint32_t resId) : id(resId) {
-}
+inline ResourceId::ResourceId(uint32_t resId) : id(resId) {}
 
-inline ResourceId::ResourceId(uint8_t p, uint8_t t, uint16_t e) : id((p << 24) | (t << 16) | e) {
-}
+inline ResourceId::ResourceId(uint8_t p, uint8_t t, uint16_t e)
+    : id((p << 24) | (t << 16) | e) {}
 
 inline bool ResourceId::isValid() const {
-    return (id & 0xff000000u) != 0 && (id & 0x00ff0000u) != 0;
+  return (id & 0xff000000u) != 0 && (id & 0x00ff0000u) != 0;
 }
 
 inline uint8_t ResourceId::packageId() const {
-    return static_cast<uint8_t>(id >> 24);
+  return static_cast<uint8_t>(id >> 24);
 }
 
 inline uint8_t ResourceId::typeId() const {
-    return static_cast<uint8_t>(id >> 16);
+  return static_cast<uint8_t>(id >> 16);
 }
 
 inline uint16_t ResourceId::entryId() const {
-    return static_cast<uint16_t>(id);
+  return static_cast<uint16_t>(id);
 }
 
 inline bool operator<(const ResourceId& lhs, const ResourceId& rhs) {
-    return lhs.id < rhs.id;
+  return lhs.id < rhs.id;
 }
 
 inline bool operator>(const ResourceId& lhs, const ResourceId& rhs) {
-    return lhs.id > rhs.id;
+  return lhs.id > rhs.id;
 }
 
 inline bool operator==(const ResourceId& lhs, const ResourceId& rhs) {
-    return lhs.id == rhs.id;
+  return lhs.id == rhs.id;
 }
 
 inline bool operator!=(const ResourceId& lhs, const ResourceId& rhs) {
-    return lhs.id != rhs.id;
+  return lhs.id != rhs.id;
 }
 
-inline ::std::ostream& operator<<(::std::ostream& out, const ResourceId& resId) {
-    std::ios_base::fmtflags oldFlags = out.flags();
-    char oldFill = out.fill();
-    out << "0x" << std::internal << std::setfill('0') << std::setw(8)
-        << std::hex << resId.id;
-    out.flags(oldFlags);
-    out.fill(oldFill);
-    return out;
+inline ::std::ostream& operator<<(::std::ostream& out,
+                                  const ResourceId& resId) {
+  std::ios_base::fmtflags oldFlags = out.flags();
+  char oldFill = out.fill();
+  out << "0x" << std::internal << std::setfill('0') << std::setw(8) << std::hex
+      << resId.id;
+  out.flags(oldFlags);
+  out.fill(oldFill);
+  return out;
 }
 
 //
 // ResourceType implementation.
 //
 
-inline ::std::ostream& operator<<(::std::ostream& out, const ResourceType& val) {
-    return out << toString(val);
+inline ::std::ostream& operator<<(::std::ostream& out,
+                                  const ResourceType& val) {
+  return out << toString(val);
 }
 
 //
 // ResourceName implementation.
 //
 
-inline ResourceName::ResourceName(const StringPiece& p, ResourceType t, const StringPiece& e) :
-        package(p.toString()), type(t), entry(e.toString()) {
-}
+inline ResourceName::ResourceName(const StringPiece& p, ResourceType t,
+                                  const StringPiece& e)
+    : package(p.toString()), type(t), entry(e.toString()) {}
 
 inline int ResourceName::compare(const ResourceName& other) const {
-    int cmp = package.compare(other.package);
-    if (cmp != 0) return cmp;
-    cmp = static_cast<int>(type) - static_cast<int>(other.type);
-    if (cmp != 0) return cmp;
-    cmp = entry.compare(other.entry);
-    return cmp;
+  int cmp = package.compare(other.package);
+  if (cmp != 0) return cmp;
+  cmp = static_cast<int>(type) - static_cast<int>(other.type);
+  if (cmp != 0) return cmp;
+  cmp = entry.compare(other.entry);
+  return cmp;
 }
 
 inline bool ResourceName::isValid() const {
-    return !package.empty() && !entry.empty();
+  return !package.empty() && !entry.empty();
 }
 
 inline bool operator<(const ResourceName& lhs, const ResourceName& rhs) {
-    return std::tie(lhs.package, lhs.type, lhs.entry)
-            < std::tie(rhs.package, rhs.type, rhs.entry);
+  return std::tie(lhs.package, lhs.type, lhs.entry) <
+         std::tie(rhs.package, rhs.type, rhs.entry);
 }
 
 inline bool operator==(const ResourceName& lhs, const ResourceName& rhs) {
-    return std::tie(lhs.package, lhs.type, lhs.entry)
-            == std::tie(rhs.package, rhs.type, rhs.entry);
+  return std::tie(lhs.package, lhs.type, lhs.entry) ==
+         std::tie(rhs.package, rhs.type, rhs.entry);
 }
 
 inline bool operator!=(const ResourceName& lhs, const ResourceName& rhs) {
-    return std::tie(lhs.package, lhs.type, lhs.entry)
-            != std::tie(rhs.package, rhs.type, rhs.entry);
+  return std::tie(lhs.package, lhs.type, lhs.entry) !=
+         std::tie(rhs.package, rhs.type, rhs.entry);
 }
 
-inline ::std::ostream& operator<<(::std::ostream& out, const ResourceName& name) {
-    if (!name.package.empty()) {
-        out << name.package << ":";
-    }
-    return out << name.type << "/" << name.entry;
+inline ::std::ostream& operator<<(::std::ostream& out,
+                                  const ResourceName& name) {
+  if (!name.package.empty()) {
+    out << name.package << ":";
+  }
+  return out << name.type << "/" << name.entry;
 }
 
 inline std::string ResourceName::toString() const {
-    std::stringstream stream;
-    stream << *this;
-    return stream.str();
+  std::stringstream stream;
+  stream << *this;
+  return stream.str();
 }
 
 //
 // ResourceNameRef implementation.
 //
 
-inline ResourceNameRef::ResourceNameRef(const ResourceName& rhs) :
-        package(rhs.package), type(rhs.type), entry(rhs.entry) {
-}
+inline ResourceNameRef::ResourceNameRef(const ResourceName& rhs)
+    : package(rhs.package), type(rhs.type), entry(rhs.entry) {}
 
 inline ResourceNameRef::ResourceNameRef(const StringPiece& p, ResourceType t,
-                                        const StringPiece& e) :
-        package(p), type(t), entry(e) {
-}
+                                        const StringPiece& e)
+    : package(p), type(t), entry(e) {}
 
 inline ResourceNameRef& ResourceNameRef::operator=(const ResourceName& rhs) {
-    package = rhs.package;
-    type = rhs.type;
-    entry = rhs.entry;
-    return *this;
+  package = rhs.package;
+  type = rhs.type;
+  entry = rhs.entry;
+  return *this;
 }
 
 inline ResourceName ResourceNameRef::toResourceName() const {
-    return ResourceName(package, type, entry);
+  return ResourceName(package, type, entry);
 }
 
 inline bool ResourceNameRef::isValid() const {
-    return !package.empty() && !entry.empty();
+  return !package.empty() && !entry.empty();
 }
 
 inline bool operator<(const ResourceNameRef& lhs, const ResourceNameRef& rhs) {
-    return std::tie(lhs.package, lhs.type, lhs.entry)
-            < std::tie(rhs.package, rhs.type, rhs.entry);
+  return std::tie(lhs.package, lhs.type, lhs.entry) <
+         std::tie(rhs.package, rhs.type, rhs.entry);
 }
 
 inline bool operator==(const ResourceNameRef& lhs, const ResourceNameRef& rhs) {
-    return std::tie(lhs.package, lhs.type, lhs.entry)
-            == std::tie(rhs.package, rhs.type, rhs.entry);
+  return std::tie(lhs.package, lhs.type, lhs.entry) ==
+         std::tie(rhs.package, rhs.type, rhs.entry);
 }
 
 inline bool operator!=(const ResourceNameRef& lhs, const ResourceNameRef& rhs) {
-    return std::tie(lhs.package, lhs.type, lhs.entry)
-            != std::tie(rhs.package, rhs.type, rhs.entry);
+  return std::tie(lhs.package, lhs.type, lhs.entry) !=
+         std::tie(rhs.package, rhs.type, rhs.entry);
 }
 
-inline ::std::ostream& operator<<(::std::ostream& out, const ResourceNameRef& name) {
-    if (!name.package.empty()) {
-        out << name.package << ":";
-    }
-    return out << name.type << "/" << name.entry;
+inline ::std::ostream& operator<<(::std::ostream& out,
+                                  const ResourceNameRef& name) {
+  if (!name.package.empty()) {
+    out << name.package << ":";
+  }
+  return out << name.type << "/" << name.entry;
 }
 
 inline bool operator<(const ResourceName& lhs, const ResourceNameRef& b) {
-    return ResourceNameRef(lhs) < b;
+  return ResourceNameRef(lhs) < b;
 }
 
 inline bool operator!=(const ResourceName& lhs, const ResourceNameRef& rhs) {
-    return ResourceNameRef(lhs) != rhs;
+  return ResourceNameRef(lhs) != rhs;
 }
 
-inline bool operator==(const SourcedResourceName& lhs, const SourcedResourceName& rhs) {
-    return lhs.name == rhs.name && lhs.line == rhs.line;
+inline bool operator==(const SourcedResourceName& lhs,
+                       const SourcedResourceName& rhs) {
+  return lhs.name == rhs.name && lhs.line == rhs.line;
 }
 
-} // namespace aapt
+}  // namespace aapt
 
 namespace std {
 
-template <> struct hash<aapt::ResourceName> {
-    size_t operator()(const aapt::ResourceName& name) const {
-        android::hash_t h = 0;
-        h = android::JenkinsHashMix(h, hash<string>()(name.package));
-        h = android::JenkinsHashMix(h, static_cast<uint32_t>(name.type));
-        h = android::JenkinsHashMix(h, hash<string>()(name.entry));
-        return static_cast<size_t>(h);
-    }
+template <>
+struct hash<aapt::ResourceName> {
+  size_t operator()(const aapt::ResourceName& name) const {
+    android::hash_t h = 0;
+    h = android::JenkinsHashMix(h, hash<string>()(name.package));
+    h = android::JenkinsHashMix(h, static_cast<uint32_t>(name.type));
+    h = android::JenkinsHashMix(h, hash<string>()(name.entry));
+    return static_cast<size_t>(h);
+  }
 };
 
-} // namespace std
+}  // namespace std
 
-#endif // AAPT_RESOURCE_H
+#endif  // AAPT_RESOURCE_H
diff --git a/tools/aapt2/ResourceParser.cpp b/tools/aapt2/ResourceParser.cpp
index c430c46..51aed13 100644
--- a/tools/aapt2/ResourceParser.cpp
+++ b/tools/aapt2/ResourceParser.cpp
@@ -28,445 +28,488 @@
 
 namespace aapt {
 
-constexpr const char* sXliffNamespaceUri = "urn:oasis:names:tc:xliff:document:1.2";
+constexpr const char* sXliffNamespaceUri =
+    "urn:oasis:names:tc:xliff:document:1.2";
 
 /**
- * Returns true if the element is <skip> or <eat-comment> and can be safely ignored.
+ * Returns true if the element is <skip> or <eat-comment> and can be safely
+ * ignored.
  */
-static bool shouldIgnoreElement(const StringPiece& ns, const StringPiece& name) {
-    return ns.empty() && (name == "skip" || name == "eat-comment");
+static bool shouldIgnoreElement(const StringPiece& ns,
+                                const StringPiece& name) {
+  return ns.empty() && (name == "skip" || name == "eat-comment");
 }
 
 static uint32_t parseFormatType(const StringPiece& piece) {
-    if (piece == "reference")      return android::ResTable_map::TYPE_REFERENCE;
-    else if (piece == "string")    return android::ResTable_map::TYPE_STRING;
-    else if (piece == "integer")   return android::ResTable_map::TYPE_INTEGER;
-    else if (piece == "boolean")   return android::ResTable_map::TYPE_BOOLEAN;
-    else if (piece == "color")     return android::ResTable_map::TYPE_COLOR;
-    else if (piece == "float")     return android::ResTable_map::TYPE_FLOAT;
-    else if (piece == "dimension") return android::ResTable_map::TYPE_DIMENSION;
-    else if (piece == "fraction")  return android::ResTable_map::TYPE_FRACTION;
-    else if (piece == "enum")      return android::ResTable_map::TYPE_ENUM;
-    else if (piece == "flags")     return android::ResTable_map::TYPE_FLAGS;
-    return 0;
+  if (piece == "reference")
+    return android::ResTable_map::TYPE_REFERENCE;
+  else if (piece == "string")
+    return android::ResTable_map::TYPE_STRING;
+  else if (piece == "integer")
+    return android::ResTable_map::TYPE_INTEGER;
+  else if (piece == "boolean")
+    return android::ResTable_map::TYPE_BOOLEAN;
+  else if (piece == "color")
+    return android::ResTable_map::TYPE_COLOR;
+  else if (piece == "float")
+    return android::ResTable_map::TYPE_FLOAT;
+  else if (piece == "dimension")
+    return android::ResTable_map::TYPE_DIMENSION;
+  else if (piece == "fraction")
+    return android::ResTable_map::TYPE_FRACTION;
+  else if (piece == "enum")
+    return android::ResTable_map::TYPE_ENUM;
+  else if (piece == "flags")
+    return android::ResTable_map::TYPE_FLAGS;
+  return 0;
 }
 
 static uint32_t parseFormatAttribute(const StringPiece& str) {
-    uint32_t mask = 0;
-    for (StringPiece part : util::tokenize(str, '|')) {
-        StringPiece trimmedPart = util::trimWhitespace(part);
-        uint32_t type = parseFormatType(trimmedPart);
-        if (type == 0) {
-            return 0;
-        }
-        mask |= type;
+  uint32_t mask = 0;
+  for (StringPiece part : util::tokenize(str, '|')) {
+    StringPiece trimmedPart = util::trimWhitespace(part);
+    uint32_t type = parseFormatType(trimmedPart);
+    if (type == 0) {
+      return 0;
     }
-    return mask;
+    mask |= type;
+  }
+  return mask;
 }
 
 /**
  * A parsed resource ready to be added to the ResourceTable.
  */
 struct ParsedResource {
-    ResourceName name;
-    ConfigDescription config;
-    std::string product;
-    Source source;
-    ResourceId id;
-    Maybe<SymbolState> symbolState;
-    std::string comment;
-    std::unique_ptr<Value> value;
-    std::list<ParsedResource> childResources;
+  ResourceName name;
+  ConfigDescription config;
+  std::string product;
+  Source source;
+  ResourceId id;
+  Maybe<SymbolState> symbolState;
+  std::string comment;
+  std::unique_ptr<Value> value;
+  std::list<ParsedResource> childResources;
 };
 
 // Recursively adds resources to the ResourceTable.
-static bool addResourcesToTable(ResourceTable* table, IDiagnostics* diag, ParsedResource* res) {
-    StringPiece trimmedComment = util::trimWhitespace(res->comment);
-    if (trimmedComment.size() != res->comment.size()) {
-        // Only if there was a change do we re-assign.
-        res->comment = trimmedComment.toString();
-    }
+static bool addResourcesToTable(ResourceTable* table, IDiagnostics* diag,
+                                ParsedResource* res) {
+  StringPiece trimmedComment = util::trimWhitespace(res->comment);
+  if (trimmedComment.size() != res->comment.size()) {
+    // Only if there was a change do we re-assign.
+    res->comment = trimmedComment.toString();
+  }
 
-    if (res->symbolState) {
-        Symbol symbol;
-        symbol.state = res->symbolState.value();
-        symbol.source = res->source;
-        symbol.comment = res->comment;
-        if (!table->setSymbolState(res->name, res->id, symbol, diag)) {
-            return false;
-        }
+  if (res->symbolState) {
+    Symbol symbol;
+    symbol.state = res->symbolState.value();
+    symbol.source = res->source;
+    symbol.comment = res->comment;
+    if (!table->setSymbolState(res->name, res->id, symbol, diag)) {
+      return false;
     }
+  }
 
-    if (res->value) {
-        // Attach the comment, source and config to the value.
-        res->value->setComment(std::move(res->comment));
-        res->value->setSource(std::move(res->source));
+  if (res->value) {
+    // Attach the comment, source and config to the value.
+    res->value->setComment(std::move(res->comment));
+    res->value->setSource(std::move(res->source));
 
-        if (!table->addResource(res->name, res->id, res->config, res->product,
-                                std::move(res->value), diag)) {
-            return false;
-        }
+    if (!table->addResource(res->name, res->id, res->config, res->product,
+                            std::move(res->value), diag)) {
+      return false;
     }
+  }
 
-    bool error = false;
-    for (ParsedResource& child : res->childResources) {
-        error |= !addResourcesToTable(table, diag, &child);
-    }
-    return !error;
+  bool error = false;
+  for (ParsedResource& child : res->childResources) {
+    error |= !addResourcesToTable(table, diag, &child);
+  }
+  return !error;
 }
 
 // Convenient aliases for more readable function calls.
-enum {
-    kAllowRawString = true,
-    kNoRawString = false
-};
+enum { kAllowRawString = true, kNoRawString = false };
 
-ResourceParser::ResourceParser(IDiagnostics* diag, ResourceTable* table, const Source& source,
+ResourceParser::ResourceParser(IDiagnostics* diag, ResourceTable* table,
+                               const Source& source,
                                const ConfigDescription& config,
-                               const ResourceParserOptions& options) :
-        mDiag(diag), mTable(table), mSource(source), mConfig(config), mOptions(options) {
-}
+                               const ResourceParserOptions& options)
+    : mDiag(diag),
+      mTable(table),
+      mSource(source),
+      mConfig(config),
+      mOptions(options) {}
 
 /**
  * Build a string from XML that converts nested elements into Span objects.
  */
-bool ResourceParser::flattenXmlSubtree(xml::XmlPullParser* parser, std::string* outRawString,
+bool ResourceParser::flattenXmlSubtree(xml::XmlPullParser* parser,
+                                       std::string* outRawString,
                                        StyleString* outStyleString) {
-    std::vector<Span> spanStack;
+  std::vector<Span> spanStack;
 
-    bool error = false;
-    outRawString->clear();
-    outStyleString->spans.clear();
-    util::StringBuilder builder;
-    size_t depth = 1;
-    while (xml::XmlPullParser::isGoodEvent(parser->next())) {
-        const xml::XmlPullParser::Event event = parser->getEvent();
-        if (event == xml::XmlPullParser::Event::kEndElement) {
-            if (!parser->getElementNamespace().empty()) {
-                // We already warned and skipped the start element, so just skip here too
-                continue;
-            }
+  bool error = false;
+  outRawString->clear();
+  outStyleString->spans.clear();
+  util::StringBuilder builder;
+  size_t depth = 1;
+  while (xml::XmlPullParser::isGoodEvent(parser->next())) {
+    const xml::XmlPullParser::Event event = parser->getEvent();
+    if (event == xml::XmlPullParser::Event::kEndElement) {
+      if (!parser->getElementNamespace().empty()) {
+        // We already warned and skipped the start element, so just skip here
+        // too
+        continue;
+      }
 
-            depth--;
-            if (depth == 0) {
-                break;
-            }
+      depth--;
+      if (depth == 0) {
+        break;
+      }
 
-            spanStack.back().lastChar = builder.utf16Len() - 1;
-            outStyleString->spans.push_back(spanStack.back());
-            spanStack.pop_back();
+      spanStack.back().lastChar = builder.utf16Len() - 1;
+      outStyleString->spans.push_back(spanStack.back());
+      spanStack.pop_back();
 
-        } else if (event == xml::XmlPullParser::Event::kText) {
-            outRawString->append(parser->getText());
-            builder.append(parser->getText());
+    } else if (event == xml::XmlPullParser::Event::kText) {
+      outRawString->append(parser->getText());
+      builder.append(parser->getText());
 
-        } else if (event == xml::XmlPullParser::Event::kStartElement) {
-            if (!parser->getElementNamespace().empty()) {
-                if (parser->getElementNamespace() != sXliffNamespaceUri) {
-                    // Only warn if this isn't an xliff namespace.
-                    mDiag->warn(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                                << "skipping element '"
-                                << parser->getElementName()
-                                << "' with unknown namespace '"
-                                << parser->getElementNamespace()
-                                << "'");
-                }
-                continue;
-            }
-            depth++;
-
-            // Build a span object out of the nested element.
-            std::string spanName = parser->getElementName();
-            const auto endAttrIter = parser->endAttributes();
-            for (auto attrIter = parser->beginAttributes(); attrIter != endAttrIter; ++attrIter) {
-                spanName += ";";
-                spanName += attrIter->name;
-                spanName += "=";
-                spanName += attrIter->value;
-            }
-
-            if (builder.utf16Len() > std::numeric_limits<uint32_t>::max()) {
-                mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                             << "style string '" << builder.str() << "' is too long");
-                error = true;
-            } else {
-                spanStack.push_back(Span{ spanName, static_cast<uint32_t>(builder.utf16Len()) });
-            }
-
-        } else if (event == xml::XmlPullParser::Event::kComment) {
-            // Skip
-        } else {
-            assert(false);
+    } else if (event == xml::XmlPullParser::Event::kStartElement) {
+      if (!parser->getElementNamespace().empty()) {
+        if (parser->getElementNamespace() != sXliffNamespaceUri) {
+          // Only warn if this isn't an xliff namespace.
+          mDiag->warn(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                      << "skipping element '" << parser->getElementName()
+                      << "' with unknown namespace '"
+                      << parser->getElementNamespace() << "'");
         }
-    }
-    assert(spanStack.empty() && "spans haven't been fully processed");
+        continue;
+      }
+      depth++;
 
-    outStyleString->str = builder.str();
-    return !error;
+      // Build a span object out of the nested element.
+      std::string spanName = parser->getElementName();
+      const auto endAttrIter = parser->endAttributes();
+      for (auto attrIter = parser->beginAttributes(); attrIter != endAttrIter;
+           ++attrIter) {
+        spanName += ";";
+        spanName += attrIter->name;
+        spanName += "=";
+        spanName += attrIter->value;
+      }
+
+      if (builder.utf16Len() > std::numeric_limits<uint32_t>::max()) {
+        mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                     << "style string '" << builder.str() << "' is too long");
+        error = true;
+      } else {
+        spanStack.push_back(
+            Span{spanName, static_cast<uint32_t>(builder.utf16Len())});
+      }
+
+    } else if (event == xml::XmlPullParser::Event::kComment) {
+      // Skip
+    } else {
+      assert(false);
+    }
+  }
+  assert(spanStack.empty() && "spans haven't been fully processed");
+
+  outStyleString->str = builder.str();
+  return !error;
 }
 
 bool ResourceParser::parse(xml::XmlPullParser* parser) {
-    bool error = false;
-    const size_t depth = parser->getDepth();
-    while (xml::XmlPullParser::nextChildNode(parser, depth)) {
-        if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
-            // Skip comments and text.
-            continue;
-        }
-
-        if (!parser->getElementNamespace().empty() || parser->getElementName() != "resources") {
-            mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                         << "root element must be <resources>");
-            return false;
-        }
-
-        error |= !parseResources(parser);
-        break;
-    };
-
-    if (parser->getEvent() == xml::XmlPullParser::Event::kBadDocument) {
-        mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                     << "xml parser error: " << parser->getLastError());
-        return false;
+  bool error = false;
+  const size_t depth = parser->getDepth();
+  while (xml::XmlPullParser::nextChildNode(parser, depth)) {
+    if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
+      // Skip comments and text.
+      continue;
     }
-    return !error;
+
+    if (!parser->getElementNamespace().empty() ||
+        parser->getElementName() != "resources") {
+      mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                   << "root element must be <resources>");
+      return false;
+    }
+
+    error |= !parseResources(parser);
+    break;
+  };
+
+  if (parser->getEvent() == xml::XmlPullParser::Event::kBadDocument) {
+    mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                 << "xml parser error: " << parser->getLastError());
+    return false;
+  }
+  return !error;
 }
 
 bool ResourceParser::parseResources(xml::XmlPullParser* parser) {
-    std::set<ResourceName> strippedResources;
+  std::set<ResourceName> strippedResources;
 
-    bool error = false;
-    std::string comment;
-    const size_t depth = parser->getDepth();
-    while (xml::XmlPullParser::nextChildNode(parser, depth)) {
-        const xml::XmlPullParser::Event event = parser->getEvent();
-        if (event == xml::XmlPullParser::Event::kComment) {
-            comment = parser->getComment();
-            continue;
-        }
-
-        if (event == xml::XmlPullParser::Event::kText) {
-            if (!util::trimWhitespace(parser->getText()).empty()) {
-                mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                             << "plain text not allowed here");
-                error = true;
-            }
-            continue;
-        }
-
-        assert(event == xml::XmlPullParser::Event::kStartElement);
-
-        if (!parser->getElementNamespace().empty()) {
-            // Skip unknown namespace.
-            continue;
-        }
-
-        std::string elementName = parser->getElementName();
-        if (elementName == "skip" || elementName == "eat-comment") {
-            comment = "";
-            continue;
-        }
-
-        ParsedResource parsedResource;
-        parsedResource.config = mConfig;
-        parsedResource.source = mSource.withLine(parser->getLineNumber());
-        parsedResource.comment = std::move(comment);
-
-        // Extract the product name if it exists.
-        if (Maybe<StringPiece> maybeProduct = xml::findNonEmptyAttribute(parser, "product")) {
-            parsedResource.product = maybeProduct.value().toString();
-        }
-
-        // Parse the resource regardless of product.
-        if (!parseResource(parser, &parsedResource)) {
-            error = true;
-            continue;
-        }
-
-        if (!addResourcesToTable(mTable, mDiag, &parsedResource)) {
-            error = true;
-        }
+  bool error = false;
+  std::string comment;
+  const size_t depth = parser->getDepth();
+  while (xml::XmlPullParser::nextChildNode(parser, depth)) {
+    const xml::XmlPullParser::Event event = parser->getEvent();
+    if (event == xml::XmlPullParser::Event::kComment) {
+      comment = parser->getComment();
+      continue;
     }
 
-    // Check that we included at least one variant of each stripped resource.
-    for (const ResourceName& strippedResource : strippedResources) {
-        if (!mTable->findResource(strippedResource)) {
-            // Failed to find the resource.
-            mDiag->error(DiagMessage(mSource) << "resource '" << strippedResource << "' "
-                         "was filtered out but no product variant remains");
-            error = true;
-        }
+    if (event == xml::XmlPullParser::Event::kText) {
+      if (!util::trimWhitespace(parser->getText()).empty()) {
+        mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                     << "plain text not allowed here");
+        error = true;
+      }
+      continue;
     }
 
-    return !error;
+    assert(event == xml::XmlPullParser::Event::kStartElement);
+
+    if (!parser->getElementNamespace().empty()) {
+      // Skip unknown namespace.
+      continue;
+    }
+
+    std::string elementName = parser->getElementName();
+    if (elementName == "skip" || elementName == "eat-comment") {
+      comment = "";
+      continue;
+    }
+
+    ParsedResource parsedResource;
+    parsedResource.config = mConfig;
+    parsedResource.source = mSource.withLine(parser->getLineNumber());
+    parsedResource.comment = std::move(comment);
+
+    // Extract the product name if it exists.
+    if (Maybe<StringPiece> maybeProduct =
+            xml::findNonEmptyAttribute(parser, "product")) {
+      parsedResource.product = maybeProduct.value().toString();
+    }
+
+    // Parse the resource regardless of product.
+    if (!parseResource(parser, &parsedResource)) {
+      error = true;
+      continue;
+    }
+
+    if (!addResourcesToTable(mTable, mDiag, &parsedResource)) {
+      error = true;
+    }
+  }
+
+  // Check that we included at least one variant of each stripped resource.
+  for (const ResourceName& strippedResource : strippedResources) {
+    if (!mTable->findResource(strippedResource)) {
+      // Failed to find the resource.
+      mDiag->error(DiagMessage(mSource)
+                   << "resource '" << strippedResource
+                   << "' "
+                      "was filtered out but no product variant remains");
+      error = true;
+    }
+  }
+
+  return !error;
 }
 
+bool ResourceParser::parseResource(xml::XmlPullParser* parser,
+                                   ParsedResource* outResource) {
+  struct ItemTypeFormat {
+    ResourceType type;
+    uint32_t format;
+  };
 
-bool ResourceParser::parseResource(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    struct ItemTypeFormat {
-        ResourceType type;
-        uint32_t format;
-    };
+  using BagParseFunc = std::function<bool(ResourceParser*, xml::XmlPullParser*,
+                                          ParsedResource*)>;
 
-    using BagParseFunc = std::function<bool(ResourceParser*, xml::XmlPullParser*, ParsedResource*)>;
+  static const auto elToItemMap =
+      ImmutableMap<std::string, ItemTypeFormat>::createPreSorted({
+          {"bool", {ResourceType::kBool, android::ResTable_map::TYPE_BOOLEAN}},
+          {"color", {ResourceType::kColor, android::ResTable_map::TYPE_COLOR}},
+          {"dimen",
+           {ResourceType::kDimen, android::ResTable_map::TYPE_FLOAT |
+                                      android::ResTable_map::TYPE_FRACTION |
+                                      android::ResTable_map::TYPE_DIMENSION}},
+          {"drawable",
+           {ResourceType::kDrawable, android::ResTable_map::TYPE_COLOR}},
+          {"fraction",
+           {ResourceType::kFraction,
+            android::ResTable_map::TYPE_FLOAT |
+                android::ResTable_map::TYPE_FRACTION |
+                android::ResTable_map::TYPE_DIMENSION}},
+          {"integer",
+           {ResourceType::kInteger, android::ResTable_map::TYPE_INTEGER}},
+          {"string",
+           {ResourceType::kString, android::ResTable_map::TYPE_STRING}},
+      });
 
-    static const auto elToItemMap = ImmutableMap<std::string, ItemTypeFormat>::createPreSorted({
-            { "bool",      { ResourceType::kBool, android::ResTable_map::TYPE_BOOLEAN } },
-            { "color",     { ResourceType::kColor, android::ResTable_map::TYPE_COLOR } },
-            { "dimen",     { ResourceType::kDimen, android::ResTable_map::TYPE_FLOAT
-                                                    | android::ResTable_map::TYPE_FRACTION
-                                                    | android::ResTable_map::TYPE_DIMENSION } },
-            { "drawable",  { ResourceType::kDrawable, android::ResTable_map::TYPE_COLOR } },
-            { "fraction",  { ResourceType::kFraction, android::ResTable_map::TYPE_FLOAT
-                                                       | android::ResTable_map::TYPE_FRACTION
-                                                       | android::ResTable_map::TYPE_DIMENSION } },
-            { "integer",   { ResourceType::kInteger, android::ResTable_map::TYPE_INTEGER } },
-            { "string",    { ResourceType::kString, android::ResTable_map::TYPE_STRING } },
-    });
+  static const auto elToBagMap =
+      ImmutableMap<std::string, BagParseFunc>::createPreSorted({
+          {"add-resource", std::mem_fn(&ResourceParser::parseAddResource)},
+          {"array", std::mem_fn(&ResourceParser::parseArray)},
+          {"attr", std::mem_fn(&ResourceParser::parseAttr)},
+          {"declare-styleable",
+           std::mem_fn(&ResourceParser::parseDeclareStyleable)},
+          {"integer-array", std::mem_fn(&ResourceParser::parseIntegerArray)},
+          {"java-symbol", std::mem_fn(&ResourceParser::parseSymbol)},
+          {"plurals", std::mem_fn(&ResourceParser::parsePlural)},
+          {"public", std::mem_fn(&ResourceParser::parsePublic)},
+          {"public-group", std::mem_fn(&ResourceParser::parsePublicGroup)},
+          {"string-array", std::mem_fn(&ResourceParser::parseStringArray)},
+          {"style", std::mem_fn(&ResourceParser::parseStyle)},
+          {"symbol", std::mem_fn(&ResourceParser::parseSymbol)},
+      });
 
-    static const auto elToBagMap = ImmutableMap<std::string, BagParseFunc>::createPreSorted({
-            { "add-resource",      std::mem_fn(&ResourceParser::parseAddResource) },
-            { "array",             std::mem_fn(&ResourceParser::parseArray) },
-            { "attr",              std::mem_fn(&ResourceParser::parseAttr) },
-            { "declare-styleable", std::mem_fn(&ResourceParser::parseDeclareStyleable) },
-            { "integer-array",     std::mem_fn(&ResourceParser::parseIntegerArray) },
-            { "java-symbol",       std::mem_fn(&ResourceParser::parseSymbol) },
-            { "plurals",           std::mem_fn(&ResourceParser::parsePlural) },
-            { "public",            std::mem_fn(&ResourceParser::parsePublic) },
-            { "public-group",      std::mem_fn(&ResourceParser::parsePublicGroup) },
-            { "string-array",      std::mem_fn(&ResourceParser::parseStringArray) },
-            { "style",             std::mem_fn(&ResourceParser::parseStyle) },
-            { "symbol",            std::mem_fn(&ResourceParser::parseSymbol) },
-    });
+  std::string resourceType = parser->getElementName();
 
-    std::string resourceType = parser->getElementName();
+  // The value format accepted for this resource.
+  uint32_t resourceFormat = 0u;
 
-    // The value format accepted for this resource.
-    uint32_t resourceFormat = 0u;
-
-    if (resourceType == "item") {
-        // Items have their type encoded in the type attribute.
-        if (Maybe<StringPiece> maybeType = xml::findNonEmptyAttribute(parser, "type")) {
-            resourceType = maybeType.value().toString();
-        } else {
-            mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                         << "<item> must have a 'type' attribute");
-            return false;
-        }
-
-        if (Maybe<StringPiece> maybeFormat = xml::findNonEmptyAttribute(parser, "format")) {
-            // An explicit format for this resource was specified. The resource will retain
-            // its type in its name, but the accepted value for this type is overridden.
-            resourceFormat = parseFormatType(maybeFormat.value());
-            if (!resourceFormat) {
-                mDiag->error(DiagMessage(outResource->source)
-                             << "'" << maybeFormat.value() << "' is an invalid format");
-                return false;
-            }
-        }
+  if (resourceType == "item") {
+    // Items have their type encoded in the type attribute.
+    if (Maybe<StringPiece> maybeType =
+            xml::findNonEmptyAttribute(parser, "type")) {
+      resourceType = maybeType.value().toString();
+    } else {
+      mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                   << "<item> must have a 'type' attribute");
+      return false;
     }
 
-    // Get the name of the resource. This will be checked later, because not all
-    // XML elements require a name.
-    Maybe<StringPiece> maybeName = xml::findNonEmptyAttribute(parser, "name");
-
-    if (resourceType == "id") {
-        if (!maybeName) {
-            mDiag->error(DiagMessage(outResource->source)
-                         << "<" << parser->getElementName() << "> missing 'name' attribute");
-            return false;
-        }
-
-        outResource->name.type = ResourceType::kId;
-        outResource->name.entry = maybeName.value().toString();
-        outResource->value = util::make_unique<Id>();
-        return true;
-    }
-
-    const auto itemIter = elToItemMap.find(resourceType);
-    if (itemIter != elToItemMap.end()) {
-        // This is an item, record its type and format and start parsing.
-
-        if (!maybeName) {
-            mDiag->error(DiagMessage(outResource->source)
-                         << "<" << parser->getElementName() << "> missing 'name' attribute");
-            return false;
-        }
-
-        outResource->name.type = itemIter->second.type;
-        outResource->name.entry = maybeName.value().toString();
-
-        // Only use the implicit format for this type if it wasn't overridden.
-        if (!resourceFormat) {
-            resourceFormat = itemIter->second.format;
-        }
-
-        if (!parseItem(parser, outResource, resourceFormat)) {
-            return false;
-        }
-        return true;
-    }
-
-    // This might be a bag or something.
-    const auto bagIter = elToBagMap.find(resourceType);
-    if (bagIter != elToBagMap.end()) {
-        // Ensure we have a name (unless this is a <public-group>).
-        if (resourceType != "public-group") {
-            if (!maybeName) {
-                mDiag->error(DiagMessage(outResource->source)
-                             << "<" << parser->getElementName() << "> missing 'name' attribute");
-                return false;
-            }
-
-            outResource->name.entry = maybeName.value().toString();
-        }
-
-        // Call the associated parse method. The type will be filled in by the
-        // parse func.
-        if (!bagIter->second(this, parser, outResource)) {
-            return false;
-        }
-        return true;
-    }
-
-    // Try parsing the elementName (or type) as a resource. These shall only be
-    // resources like 'layout' or 'xml' and they can only be references.
-    const ResourceType* parsedType = parseResourceType(resourceType);
-    if (parsedType) {
-        if (!maybeName) {
-            mDiag->error(DiagMessage(outResource->source)
-                         << "<" << parser->getElementName() << "> missing 'name' attribute");
-            return false;
-        }
-
-        outResource->name.type = *parsedType;
-        outResource->name.entry = maybeName.value().toString();
-        outResource->value = parseXml(parser, android::ResTable_map::TYPE_REFERENCE, kNoRawString);
-        if (!outResource->value) {
-            mDiag->error(DiagMessage(outResource->source)
-                         << "invalid value for type '" << *parsedType << "'. Expected a reference");
-            return false;
-        }
-        return true;
-    }
-
-    mDiag->warn(DiagMessage(outResource->source)
-                << "unknown resource type '" << parser->getElementName() << "'");
-    return false;
-}
-
-bool ResourceParser::parseItem(xml::XmlPullParser* parser, ParsedResource* outResource,
-                               const uint32_t format) {
-    if (format == android::ResTable_map::TYPE_STRING) {
-        return parseString(parser, outResource);
-    }
-
-    outResource->value = parseXml(parser, format, kNoRawString);
-    if (!outResource->value) {
-        mDiag->error(DiagMessage(outResource->source) << "invalid " << outResource->name.type);
+    if (Maybe<StringPiece> maybeFormat =
+            xml::findNonEmptyAttribute(parser, "format")) {
+      // An explicit format for this resource was specified. The resource will
+      // retain
+      // its type in its name, but the accepted value for this type is
+      // overridden.
+      resourceFormat = parseFormatType(maybeFormat.value());
+      if (!resourceFormat) {
+        mDiag->error(DiagMessage(outResource->source)
+                     << "'" << maybeFormat.value() << "' is an invalid format");
         return false;
+      }
+    }
+  }
+
+  // Get the name of the resource. This will be checked later, because not all
+  // XML elements require a name.
+  Maybe<StringPiece> maybeName = xml::findNonEmptyAttribute(parser, "name");
+
+  if (resourceType == "id") {
+    if (!maybeName) {
+      mDiag->error(DiagMessage(outResource->source)
+                   << "<" << parser->getElementName()
+                   << "> missing 'name' attribute");
+      return false;
+    }
+
+    outResource->name.type = ResourceType::kId;
+    outResource->name.entry = maybeName.value().toString();
+    outResource->value = util::make_unique<Id>();
+    return true;
+  }
+
+  const auto itemIter = elToItemMap.find(resourceType);
+  if (itemIter != elToItemMap.end()) {
+    // This is an item, record its type and format and start parsing.
+
+    if (!maybeName) {
+      mDiag->error(DiagMessage(outResource->source)
+                   << "<" << parser->getElementName()
+                   << "> missing 'name' attribute");
+      return false;
+    }
+
+    outResource->name.type = itemIter->second.type;
+    outResource->name.entry = maybeName.value().toString();
+
+    // Only use the implicit format for this type if it wasn't overridden.
+    if (!resourceFormat) {
+      resourceFormat = itemIter->second.format;
+    }
+
+    if (!parseItem(parser, outResource, resourceFormat)) {
+      return false;
     }
     return true;
+  }
+
+  // This might be a bag or something.
+  const auto bagIter = elToBagMap.find(resourceType);
+  if (bagIter != elToBagMap.end()) {
+    // Ensure we have a name (unless this is a <public-group>).
+    if (resourceType != "public-group") {
+      if (!maybeName) {
+        mDiag->error(DiagMessage(outResource->source)
+                     << "<" << parser->getElementName()
+                     << "> missing 'name' attribute");
+        return false;
+      }
+
+      outResource->name.entry = maybeName.value().toString();
+    }
+
+    // Call the associated parse method. The type will be filled in by the
+    // parse func.
+    if (!bagIter->second(this, parser, outResource)) {
+      return false;
+    }
+    return true;
+  }
+
+  // Try parsing the elementName (or type) as a resource. These shall only be
+  // resources like 'layout' or 'xml' and they can only be references.
+  const ResourceType* parsedType = parseResourceType(resourceType);
+  if (parsedType) {
+    if (!maybeName) {
+      mDiag->error(DiagMessage(outResource->source)
+                   << "<" << parser->getElementName()
+                   << "> missing 'name' attribute");
+      return false;
+    }
+
+    outResource->name.type = *parsedType;
+    outResource->name.entry = maybeName.value().toString();
+    outResource->value =
+        parseXml(parser, android::ResTable_map::TYPE_REFERENCE, kNoRawString);
+    if (!outResource->value) {
+      mDiag->error(DiagMessage(outResource->source)
+                   << "invalid value for type '" << *parsedType
+                   << "'. Expected a reference");
+      return false;
+    }
+    return true;
+  }
+
+  mDiag->warn(DiagMessage(outResource->source)
+              << "unknown resource type '" << parser->getElementName() << "'");
+  return false;
+}
+
+bool ResourceParser::parseItem(xml::XmlPullParser* parser,
+                               ParsedResource* outResource,
+                               const uint32_t format) {
+  if (format == android::ResTable_map::TYPE_STRING) {
+    return parseString(parser, outResource);
+  }
+
+  outResource->value = parseXml(parser, format, kNoRawString);
+  if (!outResource->value) {
+    mDiag->error(DiagMessage(outResource->source) << "invalid "
+                                                  << outResource->name.type);
+    return false;
+  }
+  return true;
 }
 
 /**
@@ -476,771 +519,834 @@
  * an Item. If allowRawValue is false, nullptr is returned in this
  * case.
  */
-std::unique_ptr<Item> ResourceParser::parseXml(xml::XmlPullParser* parser, const uint32_t typeMask,
+std::unique_ptr<Item> ResourceParser::parseXml(xml::XmlPullParser* parser,
+                                               const uint32_t typeMask,
                                                const bool allowRawValue) {
-    const size_t beginXmlLine = parser->getLineNumber();
+  const size_t beginXmlLine = parser->getLineNumber();
 
-    std::string rawValue;
-    StyleString styleString;
-    if (!flattenXmlSubtree(parser, &rawValue, &styleString)) {
-        return {};
-    }
-
-    if (!styleString.spans.empty()) {
-        // This can only be a StyledString.
-        return util::make_unique<StyledString>(
-                mTable->stringPool.makeRef(styleString, StringPool::Context{ 1, mConfig }));
-    }
-
-    auto onCreateReference = [&](const ResourceName& name) {
-        // name.package can be empty here, as it will assume the package name of the table.
-        std::unique_ptr<Id> id = util::make_unique<Id>();
-        id->setSource(mSource.withLine(beginXmlLine));
-        mTable->addResource(name, {}, {}, std::move(id), mDiag);
-    };
-
-    // Process the raw value.
-    std::unique_ptr<Item> processedItem = ResourceUtils::tryParseItemForAttribute(
-            rawValue, typeMask, onCreateReference);
-    if (processedItem) {
-        // Fix up the reference.
-        if (Reference* ref = valueCast<Reference>(processedItem.get())) {
-            transformReferenceFromNamespace(parser, "", ref);
-        }
-        return processedItem;
-    }
-
-    // Try making a regular string.
-    if (typeMask & android::ResTable_map::TYPE_STRING) {
-        // Use the trimmed, escaped string.
-        return util::make_unique<String>(
-                mTable->stringPool.makeRef(styleString.str, StringPool::Context{ 1, mConfig }));
-    }
-
-    if (allowRawValue) {
-        // We can't parse this so return a RawString if we are allowed.
-        return util::make_unique<RawString>(
-                mTable->stringPool.makeRef(rawValue, StringPool::Context{ 1, mConfig }));
-    }
+  std::string rawValue;
+  StyleString styleString;
+  if (!flattenXmlSubtree(parser, &rawValue, &styleString)) {
     return {};
+  }
+
+  if (!styleString.spans.empty()) {
+    // This can only be a StyledString.
+    return util::make_unique<StyledString>(mTable->stringPool.makeRef(
+        styleString, StringPool::Context{1, mConfig}));
+  }
+
+  auto onCreateReference = [&](const ResourceName& name) {
+    // name.package can be empty here, as it will assume the package name of the
+    // table.
+    std::unique_ptr<Id> id = util::make_unique<Id>();
+    id->setSource(mSource.withLine(beginXmlLine));
+    mTable->addResource(name, {}, {}, std::move(id), mDiag);
+  };
+
+  // Process the raw value.
+  std::unique_ptr<Item> processedItem = ResourceUtils::tryParseItemForAttribute(
+      rawValue, typeMask, onCreateReference);
+  if (processedItem) {
+    // Fix up the reference.
+    if (Reference* ref = valueCast<Reference>(processedItem.get())) {
+      transformReferenceFromNamespace(parser, "", ref);
+    }
+    return processedItem;
+  }
+
+  // Try making a regular string.
+  if (typeMask & android::ResTable_map::TYPE_STRING) {
+    // Use the trimmed, escaped string.
+    return util::make_unique<String>(mTable->stringPool.makeRef(
+        styleString.str, StringPool::Context{1, mConfig}));
+  }
+
+  if (allowRawValue) {
+    // We can't parse this so return a RawString if we are allowed.
+    return util::make_unique<RawString>(
+        mTable->stringPool.makeRef(rawValue, StringPool::Context{1, mConfig}));
+  }
+  return {};
 }
 
-bool ResourceParser::parseString(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    bool formatted = true;
-    if (Maybe<StringPiece> formattedAttr = xml::findAttribute(parser, "formatted")) {
-        Maybe<bool> maybeFormatted = ResourceUtils::parseBool(formattedAttr.value());
-        if (!maybeFormatted) {
-            mDiag->error(DiagMessage(outResource->source)
-                         << "invalid value for 'formatted'. Must be a boolean");
-            return false;
-        }
-        formatted = maybeFormatted.value();
+bool ResourceParser::parseString(xml::XmlPullParser* parser,
+                                 ParsedResource* outResource) {
+  bool formatted = true;
+  if (Maybe<StringPiece> formattedAttr =
+          xml::findAttribute(parser, "formatted")) {
+    Maybe<bool> maybeFormatted =
+        ResourceUtils::parseBool(formattedAttr.value());
+    if (!maybeFormatted) {
+      mDiag->error(DiagMessage(outResource->source)
+                   << "invalid value for 'formatted'. Must be a boolean");
+      return false;
     }
+    formatted = maybeFormatted.value();
+  }
 
-    bool translateable = mOptions.translatable;
-    if (Maybe<StringPiece> translateableAttr = xml::findAttribute(parser, "translatable")) {
-        Maybe<bool> maybeTranslateable = ResourceUtils::parseBool(translateableAttr.value());
-        if (!maybeTranslateable) {
-            mDiag->error(DiagMessage(outResource->source)
-                         << "invalid value for 'translatable'. Must be a boolean");
-            return false;
-        }
-        translateable = maybeTranslateable.value();
+  bool translateable = mOptions.translatable;
+  if (Maybe<StringPiece> translateableAttr =
+          xml::findAttribute(parser, "translatable")) {
+    Maybe<bool> maybeTranslateable =
+        ResourceUtils::parseBool(translateableAttr.value());
+    if (!maybeTranslateable) {
+      mDiag->error(DiagMessage(outResource->source)
+                   << "invalid value for 'translatable'. Must be a boolean");
+      return false;
     }
+    translateable = maybeTranslateable.value();
+  }
 
-    outResource->value = parseXml(parser, android::ResTable_map::TYPE_STRING, kNoRawString);
-    if (!outResource->value) {
-        mDiag->error(DiagMessage(outResource->source) << "not a valid string");
-        return false;
-    }
+  outResource->value =
+      parseXml(parser, android::ResTable_map::TYPE_STRING, kNoRawString);
+  if (!outResource->value) {
+    mDiag->error(DiagMessage(outResource->source) << "not a valid string");
+    return false;
+  }
 
-    if (String* stringValue = valueCast<String>(outResource->value.get())) {
-        stringValue->setTranslateable(translateable);
+  if (String* stringValue = valueCast<String>(outResource->value.get())) {
+    stringValue->setTranslateable(translateable);
 
-        if (formatted && translateable) {
-            if (!util::verifyJavaStringFormat(*stringValue->value)) {
-                DiagMessage msg(outResource->source);
-                msg << "multiple substitutions specified in non-positional format; "
-                       "did you mean to add the formatted=\"false\" attribute?";
-                if (mOptions.errorOnPositionalArguments) {
-                    mDiag->error(msg);
-                    return false;
-                }
-
-                mDiag->warn(msg);
-            }
+    if (formatted && translateable) {
+      if (!util::verifyJavaStringFormat(*stringValue->value)) {
+        DiagMessage msg(outResource->source);
+        msg << "multiple substitutions specified in non-positional format; "
+               "did you mean to add the formatted=\"false\" attribute?";
+        if (mOptions.errorOnPositionalArguments) {
+          mDiag->error(msg);
+          return false;
         }
 
-    } else if (StyledString* stringValue = valueCast<StyledString>(outResource->value.get())) {
-        stringValue->setTranslateable(translateable);
+        mDiag->warn(msg);
+      }
     }
-    return true;
+
+  } else if (StyledString* stringValue =
+                 valueCast<StyledString>(outResource->value.get())) {
+    stringValue->setTranslateable(translateable);
+  }
+  return true;
 }
 
-bool ResourceParser::parsePublic(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    Maybe<StringPiece> maybeType = xml::findNonEmptyAttribute(parser, "type");
-    if (!maybeType) {
-        mDiag->error(DiagMessage(outResource->source) << "<public> must have a 'type' attribute");
-        return false;
-    }
+bool ResourceParser::parsePublic(xml::XmlPullParser* parser,
+                                 ParsedResource* outResource) {
+  Maybe<StringPiece> maybeType = xml::findNonEmptyAttribute(parser, "type");
+  if (!maybeType) {
+    mDiag->error(DiagMessage(outResource->source)
+                 << "<public> must have a 'type' attribute");
+    return false;
+  }
 
-    const ResourceType* parsedType = parseResourceType(maybeType.value());
-    if (!parsedType) {
-        mDiag->error(DiagMessage(outResource->source)
-                     << "invalid resource type '" << maybeType.value() << "' in <public>");
-        return false;
-    }
+  const ResourceType* parsedType = parseResourceType(maybeType.value());
+  if (!parsedType) {
+    mDiag->error(DiagMessage(outResource->source) << "invalid resource type '"
+                                                  << maybeType.value()
+                                                  << "' in <public>");
+    return false;
+  }
 
-    outResource->name.type = *parsedType;
+  outResource->name.type = *parsedType;
 
-    if (Maybe<StringPiece> maybeIdStr = xml::findNonEmptyAttribute(parser, "id")) {
-        Maybe<ResourceId> maybeId = ResourceUtils::parseResourceId(maybeIdStr.value());
-        if (!maybeId) {
-            mDiag->error(DiagMessage(outResource->source)
-                         << "invalid resource ID '" << maybeId.value() << "' in <public>");
-            return false;
-        }
-        outResource->id = maybeId.value();
-    }
-
-    if (*parsedType == ResourceType::kId) {
-        // An ID marked as public is also the definition of an ID.
-        outResource->value = util::make_unique<Id>();
-    }
-
-    outResource->symbolState = SymbolState::kPublic;
-    return true;
-}
-
-bool ResourceParser::parsePublicGroup(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    Maybe<StringPiece> maybeType = xml::findNonEmptyAttribute(parser, "type");
-    if (!maybeType) {
-        mDiag->error(DiagMessage(outResource->source)
-                     << "<public-group> must have a 'type' attribute");
-        return false;
-    }
-
-    const ResourceType* parsedType = parseResourceType(maybeType.value());
-    if (!parsedType) {
-        mDiag->error(DiagMessage(outResource->source)
-                     << "invalid resource type '" << maybeType.value() << "' in <public-group>");
-        return false;
-    }
-
-    Maybe<StringPiece> maybeIdStr = xml::findNonEmptyAttribute(parser, "first-id");
-    if (!maybeIdStr) {
-        mDiag->error(DiagMessage(outResource->source)
-                     << "<public-group> must have a 'first-id' attribute");
-        return false;
-    }
-
-    Maybe<ResourceId> maybeId = ResourceUtils::parseResourceId(maybeIdStr.value());
+  if (Maybe<StringPiece> maybeIdStr =
+          xml::findNonEmptyAttribute(parser, "id")) {
+    Maybe<ResourceId> maybeId =
+        ResourceUtils::parseResourceId(maybeIdStr.value());
     if (!maybeId) {
-        mDiag->error(DiagMessage(outResource->source)
-                     << "invalid resource ID '" << maybeIdStr.value() << "' in <public-group>");
-        return false;
+      mDiag->error(DiagMessage(outResource->source) << "invalid resource ID '"
+                                                    << maybeId.value()
+                                                    << "' in <public>");
+      return false;
     }
+    outResource->id = maybeId.value();
+  }
 
-    ResourceId nextId = maybeId.value();
+  if (*parsedType == ResourceType::kId) {
+    // An ID marked as public is also the definition of an ID.
+    outResource->value = util::make_unique<Id>();
+  }
 
-    std::string comment;
-    bool error = false;
-    const size_t depth = parser->getDepth();
-    while (xml::XmlPullParser::nextChildNode(parser, depth)) {
-        if (parser->getEvent() == xml::XmlPullParser::Event::kComment) {
-            comment = util::trimWhitespace(parser->getComment()).toString();
-            continue;
-        } else if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
-            // Skip text.
-            continue;
-        }
-
-        const Source itemSource = mSource.withLine(parser->getLineNumber());
-        const std::string& elementNamespace = parser->getElementNamespace();
-        const std::string& elementName = parser->getElementName();
-        if (elementNamespace.empty() && elementName == "public") {
-            Maybe<StringPiece> maybeName = xml::findNonEmptyAttribute(parser, "name");
-            if (!maybeName) {
-                mDiag->error(DiagMessage(itemSource) << "<public> must have a 'name' attribute");
-                error = true;
-                continue;
-            }
-
-            if (xml::findNonEmptyAttribute(parser, "id")) {
-                mDiag->error(DiagMessage(itemSource) << "'id' is ignored within <public-group>");
-                error = true;
-                continue;
-            }
-
-            if (xml::findNonEmptyAttribute(parser, "type")) {
-                mDiag->error(DiagMessage(itemSource) << "'type' is ignored within <public-group>");
-                error = true;
-                continue;
-            }
-
-            ParsedResource childResource;
-            childResource.name.type = *parsedType;
-            childResource.name.entry = maybeName.value().toString();
-            childResource.id = nextId;
-            childResource.comment = std::move(comment);
-            childResource.source = itemSource;
-            childResource.symbolState = SymbolState::kPublic;
-            outResource->childResources.push_back(std::move(childResource));
-
-            nextId.id += 1;
-
-        } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
-            mDiag->error(DiagMessage(itemSource) << ":" << elementName << ">");
-            error = true;
-        }
-    }
-    return !error;
+  outResource->symbolState = SymbolState::kPublic;
+  return true;
 }
 
-bool ResourceParser::parseSymbolImpl(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    Maybe<StringPiece> maybeType = xml::findNonEmptyAttribute(parser, "type");
-    if (!maybeType) {
-        mDiag->error(DiagMessage(outResource->source)
-                     << "<" << parser->getElementName() << "> must have a 'type' attribute");
-        return false;
-    }
-
-    const ResourceType* parsedType = parseResourceType(maybeType.value());
-    if (!parsedType) {
-        mDiag->error(DiagMessage(outResource->source)
-                     << "invalid resource type '" << maybeType.value()
-                     << "' in <" << parser->getElementName() << ">");
-        return false;
-    }
-
-    outResource->name.type = *parsedType;
-    return true;
-}
-
-bool ResourceParser::parseSymbol(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    if (parseSymbolImpl(parser, outResource)) {
-        outResource->symbolState = SymbolState::kPrivate;
-        return true;
-    }
+bool ResourceParser::parsePublicGroup(xml::XmlPullParser* parser,
+                                      ParsedResource* outResource) {
+  Maybe<StringPiece> maybeType = xml::findNonEmptyAttribute(parser, "type");
+  if (!maybeType) {
+    mDiag->error(DiagMessage(outResource->source)
+                 << "<public-group> must have a 'type' attribute");
     return false;
-}
+  }
 
-bool ResourceParser::parseAddResource(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    if (parseSymbolImpl(parser, outResource)) {
-        outResource->symbolState = SymbolState::kUndefined;
-        return true;
-    }
+  const ResourceType* parsedType = parseResourceType(maybeType.value());
+  if (!parsedType) {
+    mDiag->error(DiagMessage(outResource->source) << "invalid resource type '"
+                                                  << maybeType.value()
+                                                  << "' in <public-group>");
     return false;
+  }
+
+  Maybe<StringPiece> maybeIdStr =
+      xml::findNonEmptyAttribute(parser, "first-id");
+  if (!maybeIdStr) {
+    mDiag->error(DiagMessage(outResource->source)
+                 << "<public-group> must have a 'first-id' attribute");
+    return false;
+  }
+
+  Maybe<ResourceId> maybeId =
+      ResourceUtils::parseResourceId(maybeIdStr.value());
+  if (!maybeId) {
+    mDiag->error(DiagMessage(outResource->source) << "invalid resource ID '"
+                                                  << maybeIdStr.value()
+                                                  << "' in <public-group>");
+    return false;
+  }
+
+  ResourceId nextId = maybeId.value();
+
+  std::string comment;
+  bool error = false;
+  const size_t depth = parser->getDepth();
+  while (xml::XmlPullParser::nextChildNode(parser, depth)) {
+    if (parser->getEvent() == xml::XmlPullParser::Event::kComment) {
+      comment = util::trimWhitespace(parser->getComment()).toString();
+      continue;
+    } else if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
+      // Skip text.
+      continue;
+    }
+
+    const Source itemSource = mSource.withLine(parser->getLineNumber());
+    const std::string& elementNamespace = parser->getElementNamespace();
+    const std::string& elementName = parser->getElementName();
+    if (elementNamespace.empty() && elementName == "public") {
+      Maybe<StringPiece> maybeName = xml::findNonEmptyAttribute(parser, "name");
+      if (!maybeName) {
+        mDiag->error(DiagMessage(itemSource)
+                     << "<public> must have a 'name' attribute");
+        error = true;
+        continue;
+      }
+
+      if (xml::findNonEmptyAttribute(parser, "id")) {
+        mDiag->error(DiagMessage(itemSource)
+                     << "'id' is ignored within <public-group>");
+        error = true;
+        continue;
+      }
+
+      if (xml::findNonEmptyAttribute(parser, "type")) {
+        mDiag->error(DiagMessage(itemSource)
+                     << "'type' is ignored within <public-group>");
+        error = true;
+        continue;
+      }
+
+      ParsedResource childResource;
+      childResource.name.type = *parsedType;
+      childResource.name.entry = maybeName.value().toString();
+      childResource.id = nextId;
+      childResource.comment = std::move(comment);
+      childResource.source = itemSource;
+      childResource.symbolState = SymbolState::kPublic;
+      outResource->childResources.push_back(std::move(childResource));
+
+      nextId.id += 1;
+
+    } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
+      mDiag->error(DiagMessage(itemSource) << ":" << elementName << ">");
+      error = true;
+    }
+  }
+  return !error;
 }
 
+bool ResourceParser::parseSymbolImpl(xml::XmlPullParser* parser,
+                                     ParsedResource* outResource) {
+  Maybe<StringPiece> maybeType = xml::findNonEmptyAttribute(parser, "type");
+  if (!maybeType) {
+    mDiag->error(DiagMessage(outResource->source)
+                 << "<" << parser->getElementName()
+                 << "> must have a 'type' attribute");
+    return false;
+  }
 
-bool ResourceParser::parseAttr(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    return parseAttrImpl(parser, outResource, false);
+  const ResourceType* parsedType = parseResourceType(maybeType.value());
+  if (!parsedType) {
+    mDiag->error(DiagMessage(outResource->source)
+                 << "invalid resource type '" << maybeType.value() << "' in <"
+                 << parser->getElementName() << ">");
+    return false;
+  }
+
+  outResource->name.type = *parsedType;
+  return true;
 }
 
-bool ResourceParser::parseAttrImpl(xml::XmlPullParser* parser, ParsedResource* outResource,
-                                   bool weak) {
-    outResource->name.type = ResourceType::kAttr;
-
-    // Attributes only end up in default configuration.
-    if (outResource->config != ConfigDescription::defaultConfig()) {
-        mDiag->warn(DiagMessage(outResource->source) << "ignoring configuration '"
-                    << outResource->config << "' for attribute " << outResource->name);
-        outResource->config = ConfigDescription::defaultConfig();
-    }
-
-    uint32_t typeMask = 0;
-
-    Maybe<StringPiece> maybeFormat = xml::findAttribute(parser, "format");
-    if (maybeFormat) {
-        typeMask = parseFormatAttribute(maybeFormat.value());
-        if (typeMask == 0) {
-            mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                         << "invalid attribute format '" << maybeFormat.value() << "'");
-            return false;
-        }
-    }
-
-    Maybe<int32_t> maybeMin, maybeMax;
-
-    if (Maybe<StringPiece> maybeMinStr = xml::findAttribute(parser, "min")) {
-        StringPiece minStr = util::trimWhitespace(maybeMinStr.value());
-        if (!minStr.empty()) {
-            std::u16string minStr16 = util::utf8ToUtf16(minStr);
-            android::Res_value value;
-            if (android::ResTable::stringToInt(minStr16.data(), minStr16.size(), &value)) {
-                maybeMin = static_cast<int32_t>(value.data);
-            }
-        }
-
-        if (!maybeMin) {
-            mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                         << "invalid 'min' value '" << minStr << "'");
-            return false;
-        }
-    }
-
-    if (Maybe<StringPiece> maybeMaxStr = xml::findAttribute(parser, "max")) {
-        StringPiece maxStr = util::trimWhitespace(maybeMaxStr.value());
-        if (!maxStr.empty()) {
-            std::u16string maxStr16 = util::utf8ToUtf16(maxStr);
-            android::Res_value value;
-            if (android::ResTable::stringToInt(maxStr16.data(), maxStr16.size(), &value)) {
-                maybeMax = static_cast<int32_t>(value.data);
-            }
-        }
-
-        if (!maybeMax) {
-            mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                         << "invalid 'max' value '" << maxStr << "'");
-            return false;
-        }
-    }
-
-    if ((maybeMin || maybeMax) && (typeMask & android::ResTable_map::TYPE_INTEGER) == 0) {
-        mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                     << "'min' and 'max' can only be used when format='integer'");
-        return false;
-    }
-
-    struct SymbolComparator {
-        bool operator()(const Attribute::Symbol& a, const Attribute::Symbol& b) {
-            return a.symbol.name.value() < b.symbol.name.value();
-        }
-    };
-
-    std::set<Attribute::Symbol, SymbolComparator> items;
-
-    std::string comment;
-    bool error = false;
-    const size_t depth = parser->getDepth();
-    while (xml::XmlPullParser::nextChildNode(parser, depth)) {
-        if (parser->getEvent() == xml::XmlPullParser::Event::kComment) {
-            comment = util::trimWhitespace(parser->getComment()).toString();
-            continue;
-        } else if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
-            // Skip text.
-            continue;
-        }
-
-        const Source itemSource = mSource.withLine(parser->getLineNumber());
-        const std::string& elementNamespace = parser->getElementNamespace();
-        const std::string& elementName = parser->getElementName();
-        if (elementNamespace.empty() && (elementName == "flag" || elementName == "enum")) {
-            if (elementName == "enum") {
-                if (typeMask & android::ResTable_map::TYPE_FLAGS) {
-                    mDiag->error(DiagMessage(itemSource)
-                                 << "can not define an <enum>; already defined a <flag>");
-                    error = true;
-                    continue;
-                }
-                typeMask |= android::ResTable_map::TYPE_ENUM;
-
-            } else if (elementName == "flag") {
-                if (typeMask & android::ResTable_map::TYPE_ENUM) {
-                    mDiag->error(DiagMessage(itemSource)
-                                 << "can not define a <flag>; already defined an <enum>");
-                    error = true;
-                    continue;
-                }
-                typeMask |= android::ResTable_map::TYPE_FLAGS;
-            }
-
-            if (Maybe<Attribute::Symbol> s = parseEnumOrFlagItem(parser, elementName)) {
-                Attribute::Symbol& symbol = s.value();
-                ParsedResource childResource;
-                childResource.name = symbol.symbol.name.value();
-                childResource.source = itemSource;
-                childResource.value = util::make_unique<Id>();
-                outResource->childResources.push_back(std::move(childResource));
-
-                symbol.symbol.setComment(std::move(comment));
-                symbol.symbol.setSource(itemSource);
-
-                auto insertResult = items.insert(std::move(symbol));
-                if (!insertResult.second) {
-                    const Attribute::Symbol& existingSymbol = *insertResult.first;
-                    mDiag->error(DiagMessage(itemSource)
-                                 << "duplicate symbol '" << existingSymbol.symbol.name.value().entry
-                                 << "'");
-
-                    mDiag->note(DiagMessage(existingSymbol.symbol.getSource())
-                                << "first defined here");
-                    error = true;
-                }
-            } else {
-                error = true;
-            }
-        } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
-            mDiag->error(DiagMessage(itemSource) << ":" << elementName << ">");
-            error = true;
-        }
-
-        comment = {};
-    }
-
-    if (error) {
-        return false;
-    }
-
-    std::unique_ptr<Attribute> attr = util::make_unique<Attribute>(weak);
-    attr->symbols = std::vector<Attribute::Symbol>(items.begin(), items.end());
-    attr->typeMask = typeMask ? typeMask : uint32_t(android::ResTable_map::TYPE_ANY);
-    if (maybeMin) {
-        attr->minInt = maybeMin.value();
-    }
-
-    if (maybeMax) {
-        attr->maxInt = maybeMax.value();
-    }
-    outResource->value = std::move(attr);
+bool ResourceParser::parseSymbol(xml::XmlPullParser* parser,
+                                 ParsedResource* outResource) {
+  if (parseSymbolImpl(parser, outResource)) {
+    outResource->symbolState = SymbolState::kPrivate;
     return true;
+  }
+  return false;
 }
 
-Maybe<Attribute::Symbol> ResourceParser::parseEnumOrFlagItem(xml::XmlPullParser* parser,
-                                                             const StringPiece& tag) {
-    const Source source = mSource.withLine(parser->getLineNumber());
+bool ResourceParser::parseAddResource(xml::XmlPullParser* parser,
+                                      ParsedResource* outResource) {
+  if (parseSymbolImpl(parser, outResource)) {
+    outResource->symbolState = SymbolState::kUndefined;
+    return true;
+  }
+  return false;
+}
 
-    Maybe<StringPiece> maybeName = xml::findNonEmptyAttribute(parser, "name");
-    if (!maybeName) {
-        mDiag->error(DiagMessage(source) << "no attribute 'name' found for tag <" << tag << ">");
-        return {};
+bool ResourceParser::parseAttr(xml::XmlPullParser* parser,
+                               ParsedResource* outResource) {
+  return parseAttrImpl(parser, outResource, false);
+}
+
+bool ResourceParser::parseAttrImpl(xml::XmlPullParser* parser,
+                                   ParsedResource* outResource, bool weak) {
+  outResource->name.type = ResourceType::kAttr;
+
+  // Attributes only end up in default configuration.
+  if (outResource->config != ConfigDescription::defaultConfig()) {
+    mDiag->warn(DiagMessage(outResource->source)
+                << "ignoring configuration '" << outResource->config
+                << "' for attribute " << outResource->name);
+    outResource->config = ConfigDescription::defaultConfig();
+  }
+
+  uint32_t typeMask = 0;
+
+  Maybe<StringPiece> maybeFormat = xml::findAttribute(parser, "format");
+  if (maybeFormat) {
+    typeMask = parseFormatAttribute(maybeFormat.value());
+    if (typeMask == 0) {
+      mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                   << "invalid attribute format '" << maybeFormat.value()
+                   << "'");
+      return false;
+    }
+  }
+
+  Maybe<int32_t> maybeMin, maybeMax;
+
+  if (Maybe<StringPiece> maybeMinStr = xml::findAttribute(parser, "min")) {
+    StringPiece minStr = util::trimWhitespace(maybeMinStr.value());
+    if (!minStr.empty()) {
+      std::u16string minStr16 = util::utf8ToUtf16(minStr);
+      android::Res_value value;
+      if (android::ResTable::stringToInt(minStr16.data(), minStr16.size(),
+                                         &value)) {
+        maybeMin = static_cast<int32_t>(value.data);
+      }
     }
 
-    Maybe<StringPiece> maybeValue = xml::findNonEmptyAttribute(parser, "value");
-    if (!maybeValue) {
-        mDiag->error(DiagMessage(source) << "no attribute 'value' found for tag <" << tag << ">");
-        return {};
+    if (!maybeMin) {
+      mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                   << "invalid 'min' value '" << minStr << "'");
+      return false;
+    }
+  }
+
+  if (Maybe<StringPiece> maybeMaxStr = xml::findAttribute(parser, "max")) {
+    StringPiece maxStr = util::trimWhitespace(maybeMaxStr.value());
+    if (!maxStr.empty()) {
+      std::u16string maxStr16 = util::utf8ToUtf16(maxStr);
+      android::Res_value value;
+      if (android::ResTable::stringToInt(maxStr16.data(), maxStr16.size(),
+                                         &value)) {
+        maybeMax = static_cast<int32_t>(value.data);
+      }
     }
 
-    std::u16string value16 = util::utf8ToUtf16(maybeValue.value());
-    android::Res_value val;
-    if (!android::ResTable::stringToInt(value16.data(), value16.size(), &val)) {
-        mDiag->error(DiagMessage(source) << "invalid value '" << maybeValue.value()
-                     << "' for <" << tag << ">; must be an integer");
-        return {};
+    if (!maybeMax) {
+      mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                   << "invalid 'max' value '" << maxStr << "'");
+      return false;
+    }
+  }
+
+  if ((maybeMin || maybeMax) &&
+      (typeMask & android::ResTable_map::TYPE_INTEGER) == 0) {
+    mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                 << "'min' and 'max' can only be used when format='integer'");
+    return false;
+  }
+
+  struct SymbolComparator {
+    bool operator()(const Attribute::Symbol& a, const Attribute::Symbol& b) {
+      return a.symbol.name.value() < b.symbol.name.value();
+    }
+  };
+
+  std::set<Attribute::Symbol, SymbolComparator> items;
+
+  std::string comment;
+  bool error = false;
+  const size_t depth = parser->getDepth();
+  while (xml::XmlPullParser::nextChildNode(parser, depth)) {
+    if (parser->getEvent() == xml::XmlPullParser::Event::kComment) {
+      comment = util::trimWhitespace(parser->getComment()).toString();
+      continue;
+    } else if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
+      // Skip text.
+      continue;
     }
 
-    return Attribute::Symbol{
-            Reference(ResourceNameRef({}, ResourceType::kId, maybeName.value())), val.data };
+    const Source itemSource = mSource.withLine(parser->getLineNumber());
+    const std::string& elementNamespace = parser->getElementNamespace();
+    const std::string& elementName = parser->getElementName();
+    if (elementNamespace.empty() &&
+        (elementName == "flag" || elementName == "enum")) {
+      if (elementName == "enum") {
+        if (typeMask & android::ResTable_map::TYPE_FLAGS) {
+          mDiag->error(DiagMessage(itemSource)
+                       << "can not define an <enum>; already defined a <flag>");
+          error = true;
+          continue;
+        }
+        typeMask |= android::ResTable_map::TYPE_ENUM;
+
+      } else if (elementName == "flag") {
+        if (typeMask & android::ResTable_map::TYPE_ENUM) {
+          mDiag->error(DiagMessage(itemSource)
+                       << "can not define a <flag>; already defined an <enum>");
+          error = true;
+          continue;
+        }
+        typeMask |= android::ResTable_map::TYPE_FLAGS;
+      }
+
+      if (Maybe<Attribute::Symbol> s =
+              parseEnumOrFlagItem(parser, elementName)) {
+        Attribute::Symbol& symbol = s.value();
+        ParsedResource childResource;
+        childResource.name = symbol.symbol.name.value();
+        childResource.source = itemSource;
+        childResource.value = util::make_unique<Id>();
+        outResource->childResources.push_back(std::move(childResource));
+
+        symbol.symbol.setComment(std::move(comment));
+        symbol.symbol.setSource(itemSource);
+
+        auto insertResult = items.insert(std::move(symbol));
+        if (!insertResult.second) {
+          const Attribute::Symbol& existingSymbol = *insertResult.first;
+          mDiag->error(DiagMessage(itemSource)
+                       << "duplicate symbol '"
+                       << existingSymbol.symbol.name.value().entry << "'");
+
+          mDiag->note(DiagMessage(existingSymbol.symbol.getSource())
+                      << "first defined here");
+          error = true;
+        }
+      } else {
+        error = true;
+      }
+    } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
+      mDiag->error(DiagMessage(itemSource) << ":" << elementName << ">");
+      error = true;
+    }
+
+    comment = {};
+  }
+
+  if (error) {
+    return false;
+  }
+
+  std::unique_ptr<Attribute> attr = util::make_unique<Attribute>(weak);
+  attr->symbols = std::vector<Attribute::Symbol>(items.begin(), items.end());
+  attr->typeMask =
+      typeMask ? typeMask : uint32_t(android::ResTable_map::TYPE_ANY);
+  if (maybeMin) {
+    attr->minInt = maybeMin.value();
+  }
+
+  if (maybeMax) {
+    attr->maxInt = maybeMax.value();
+  }
+  outResource->value = std::move(attr);
+  return true;
+}
+
+Maybe<Attribute::Symbol> ResourceParser::parseEnumOrFlagItem(
+    xml::XmlPullParser* parser, const StringPiece& tag) {
+  const Source source = mSource.withLine(parser->getLineNumber());
+
+  Maybe<StringPiece> maybeName = xml::findNonEmptyAttribute(parser, "name");
+  if (!maybeName) {
+    mDiag->error(DiagMessage(source) << "no attribute 'name' found for tag <"
+                                     << tag << ">");
+    return {};
+  }
+
+  Maybe<StringPiece> maybeValue = xml::findNonEmptyAttribute(parser, "value");
+  if (!maybeValue) {
+    mDiag->error(DiagMessage(source) << "no attribute 'value' found for tag <"
+                                     << tag << ">");
+    return {};
+  }
+
+  std::u16string value16 = util::utf8ToUtf16(maybeValue.value());
+  android::Res_value val;
+  if (!android::ResTable::stringToInt(value16.data(), value16.size(), &val)) {
+    mDiag->error(DiagMessage(source) << "invalid value '" << maybeValue.value()
+                                     << "' for <" << tag
+                                     << ">; must be an integer");
+    return {};
+  }
+
+  return Attribute::Symbol{
+      Reference(ResourceNameRef({}, ResourceType::kId, maybeName.value())),
+      val.data};
 }
 
 bool ResourceParser::parseStyleItem(xml::XmlPullParser* parser, Style* style) {
-    const Source source = mSource.withLine(parser->getLineNumber());
+  const Source source = mSource.withLine(parser->getLineNumber());
 
-    Maybe<StringPiece> maybeName = xml::findNonEmptyAttribute(parser, "name");
-    if (!maybeName) {
-        mDiag->error(DiagMessage(source) << "<item> must have a 'name' attribute");
+  Maybe<StringPiece> maybeName = xml::findNonEmptyAttribute(parser, "name");
+  if (!maybeName) {
+    mDiag->error(DiagMessage(source) << "<item> must have a 'name' attribute");
+    return false;
+  }
+
+  Maybe<Reference> maybeKey =
+      ResourceUtils::parseXmlAttributeName(maybeName.value());
+  if (!maybeKey) {
+    mDiag->error(DiagMessage(source) << "invalid attribute name '"
+                                     << maybeName.value() << "'");
+    return false;
+  }
+
+  transformReferenceFromNamespace(parser, "", &maybeKey.value());
+  maybeKey.value().setSource(source);
+
+  std::unique_ptr<Item> value = parseXml(parser, 0, kAllowRawString);
+  if (!value) {
+    mDiag->error(DiagMessage(source) << "could not parse style item");
+    return false;
+  }
+
+  style->entries.push_back(
+      Style::Entry{std::move(maybeKey.value()), std::move(value)});
+  return true;
+}
+
+bool ResourceParser::parseStyle(xml::XmlPullParser* parser,
+                                ParsedResource* outResource) {
+  outResource->name.type = ResourceType::kStyle;
+
+  std::unique_ptr<Style> style = util::make_unique<Style>();
+
+  Maybe<StringPiece> maybeParent = xml::findAttribute(parser, "parent");
+  if (maybeParent) {
+    // If the parent is empty, we don't have a parent, but we also don't infer
+    // either.
+    if (!maybeParent.value().empty()) {
+      std::string errStr;
+      style->parent = ResourceUtils::parseStyleParentReference(
+          maybeParent.value(), &errStr);
+      if (!style->parent) {
+        mDiag->error(DiagMessage(outResource->source) << errStr);
         return false;
+      }
+
+      // Transform the namespace prefix to the actual package name, and mark the
+      // reference as
+      // private if appropriate.
+      transformReferenceFromNamespace(parser, "", &style->parent.value());
     }
 
-    Maybe<Reference> maybeKey = ResourceUtils::parseXmlAttributeName(maybeName.value());
-    if (!maybeKey) {
-        mDiag->error(DiagMessage(source) << "invalid attribute name '" << maybeName.value() << "'");
-        return false;
+  } else {
+    // No parent was specified, so try inferring it from the style name.
+    std::string styleName = outResource->name.entry;
+    size_t pos = styleName.find_last_of(u'.');
+    if (pos != std::string::npos) {
+      style->parentInferred = true;
+      style->parent = Reference(
+          ResourceName({}, ResourceType::kStyle, styleName.substr(0, pos)));
+    }
+  }
+
+  bool error = false;
+  const size_t depth = parser->getDepth();
+  while (xml::XmlPullParser::nextChildNode(parser, depth)) {
+    if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
+      // Skip text and comments.
+      continue;
     }
 
-    transformReferenceFromNamespace(parser, "", &maybeKey.value());
-    maybeKey.value().setSource(source);
+    const std::string& elementNamespace = parser->getElementNamespace();
+    const std::string& elementName = parser->getElementName();
+    if (elementNamespace == "" && elementName == "item") {
+      error |= !parseStyleItem(parser, style.get());
 
-    std::unique_ptr<Item> value = parseXml(parser, 0, kAllowRawString);
-    if (!value) {
-        mDiag->error(DiagMessage(source) << "could not parse style item");
-        return false;
+    } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
+      mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                   << ":" << elementName << ">");
+      error = true;
     }
+  }
 
-    style->entries.push_back(Style::Entry{ std::move(maybeKey.value()), std::move(value) });
-    return true;
+  if (error) {
+    return false;
+  }
+
+  outResource->value = std::move(style);
+  return true;
 }
 
-bool ResourceParser::parseStyle(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    outResource->name.type = ResourceType::kStyle;
-
-    std::unique_ptr<Style> style = util::make_unique<Style>();
-
-    Maybe<StringPiece> maybeParent = xml::findAttribute(parser, "parent");
-    if (maybeParent) {
-        // If the parent is empty, we don't have a parent, but we also don't infer either.
-        if (!maybeParent.value().empty()) {
-            std::string errStr;
-            style->parent = ResourceUtils::parseStyleParentReference(maybeParent.value(), &errStr);
-            if (!style->parent) {
-                mDiag->error(DiagMessage(outResource->source) << errStr);
-                return false;
-            }
-
-            // Transform the namespace prefix to the actual package name, and mark the reference as
-            // private if appropriate.
-            transformReferenceFromNamespace(parser, "", &style->parent.value());
-        }
-
-    } else {
-        // No parent was specified, so try inferring it from the style name.
-        std::string styleName = outResource->name.entry;
-        size_t pos = styleName.find_last_of(u'.');
-        if (pos != std::string::npos) {
-            style->parentInferred = true;
-            style->parent = Reference(ResourceName({}, ResourceType::kStyle,
-                                                   styleName.substr(0, pos)));
-        }
-    }
-
-    bool error = false;
-    const size_t depth = parser->getDepth();
-    while (xml::XmlPullParser::nextChildNode(parser, depth)) {
-        if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
-            // Skip text and comments.
-            continue;
-        }
-
-        const std::string& elementNamespace = parser->getElementNamespace();
-        const std::string& elementName = parser->getElementName();
-        if (elementNamespace == "" && elementName == "item") {
-            error |= !parseStyleItem(parser, style.get());
-
-        } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
-            mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                         << ":" << elementName << ">");
-            error = true;
-        }
-    }
-
-    if (error) {
-        return false;
-    }
-
-    outResource->value = std::move(style);
-    return true;
+bool ResourceParser::parseArray(xml::XmlPullParser* parser,
+                                ParsedResource* outResource) {
+  return parseArrayImpl(parser, outResource, android::ResTable_map::TYPE_ANY);
 }
 
-bool ResourceParser::parseArray(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    return parseArrayImpl(parser, outResource, android::ResTable_map::TYPE_ANY);
+bool ResourceParser::parseIntegerArray(xml::XmlPullParser* parser,
+                                       ParsedResource* outResource) {
+  return parseArrayImpl(parser, outResource,
+                        android::ResTable_map::TYPE_INTEGER);
 }
 
-bool ResourceParser::parseIntegerArray(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    return parseArrayImpl(parser, outResource, android::ResTable_map::TYPE_INTEGER);
+bool ResourceParser::parseStringArray(xml::XmlPullParser* parser,
+                                      ParsedResource* outResource) {
+  return parseArrayImpl(parser, outResource,
+                        android::ResTable_map::TYPE_STRING);
 }
 
-bool ResourceParser::parseStringArray(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    return parseArrayImpl(parser, outResource, android::ResTable_map::TYPE_STRING);
-}
-
-bool ResourceParser::parseArrayImpl(xml::XmlPullParser* parser, ParsedResource* outResource,
+bool ResourceParser::parseArrayImpl(xml::XmlPullParser* parser,
+                                    ParsedResource* outResource,
                                     const uint32_t typeMask) {
-    outResource->name.type = ResourceType::kArray;
+  outResource->name.type = ResourceType::kArray;
 
-    std::unique_ptr<Array> array = util::make_unique<Array>();
+  std::unique_ptr<Array> array = util::make_unique<Array>();
 
-    bool translateable = mOptions.translatable;
-    if (Maybe<StringPiece> translateableAttr = xml::findAttribute(parser, "translatable")) {
-        Maybe<bool> maybeTranslateable = ResourceUtils::parseBool(translateableAttr.value());
-        if (!maybeTranslateable) {
-            mDiag->error(DiagMessage(outResource->source)
-                         << "invalid value for 'translatable'. Must be a boolean");
-            return false;
-        }
-        translateable = maybeTranslateable.value();
+  bool translateable = mOptions.translatable;
+  if (Maybe<StringPiece> translateableAttr =
+          xml::findAttribute(parser, "translatable")) {
+    Maybe<bool> maybeTranslateable =
+        ResourceUtils::parseBool(translateableAttr.value());
+    if (!maybeTranslateable) {
+      mDiag->error(DiagMessage(outResource->source)
+                   << "invalid value for 'translatable'. Must be a boolean");
+      return false;
     }
-    array->setTranslateable(translateable);
+    translateable = maybeTranslateable.value();
+  }
+  array->setTranslateable(translateable);
 
-
-    bool error = false;
-    const size_t depth = parser->getDepth();
-    while (xml::XmlPullParser::nextChildNode(parser, depth)) {
-        if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
-            // Skip text and comments.
-            continue;
-        }
-
-        const Source itemSource = mSource.withLine(parser->getLineNumber());
-        const std::string& elementNamespace = parser->getElementNamespace();
-        const std::string& elementName = parser->getElementName();
-        if (elementNamespace.empty() && elementName == "item") {
-            std::unique_ptr<Item> item = parseXml(parser, typeMask, kNoRawString);
-            if (!item) {
-                mDiag->error(DiagMessage(itemSource) << "could not parse array item");
-                error = true;
-                continue;
-            }
-            item->setSource(itemSource);
-            array->items.emplace_back(std::move(item));
-
-        } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
-            mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
-                         << "unknown tag <" << elementNamespace << ":" << elementName << ">");
-            error = true;
-        }
+  bool error = false;
+  const size_t depth = parser->getDepth();
+  while (xml::XmlPullParser::nextChildNode(parser, depth)) {
+    if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
+      // Skip text and comments.
+      continue;
     }
 
-    if (error) {
-        return false;
-    }
+    const Source itemSource = mSource.withLine(parser->getLineNumber());
+    const std::string& elementNamespace = parser->getElementNamespace();
+    const std::string& elementName = parser->getElementName();
+    if (elementNamespace.empty() && elementName == "item") {
+      std::unique_ptr<Item> item = parseXml(parser, typeMask, kNoRawString);
+      if (!item) {
+        mDiag->error(DiagMessage(itemSource) << "could not parse array item");
+        error = true;
+        continue;
+      }
+      item->setSource(itemSource);
+      array->items.emplace_back(std::move(item));
 
-    outResource->value = std::move(array);
-    return true;
+    } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
+      mDiag->error(DiagMessage(mSource.withLine(parser->getLineNumber()))
+                   << "unknown tag <" << elementNamespace << ":" << elementName
+                   << ">");
+      error = true;
+    }
+  }
+
+  if (error) {
+    return false;
+  }
+
+  outResource->value = std::move(array);
+  return true;
 }
 
-bool ResourceParser::parsePlural(xml::XmlPullParser* parser, ParsedResource* outResource) {
-    outResource->name.type = ResourceType::kPlurals;
+bool ResourceParser::parsePlural(xml::XmlPullParser* parser,
+                                 ParsedResource* outResource) {
+  outResource->name.type = ResourceType::kPlurals;
 
-    std::unique_ptr<Plural> plural = util::make_unique<Plural>();
+  std::unique_ptr<Plural> plural = util::make_unique<Plural>();
 
-    bool error = false;
-    const size_t depth = parser->getDepth();
-    while (xml::XmlPullParser::nextChildNode(parser, depth)) {
-        if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
-            // Skip text and comments.
-            continue;
-        }
-
-        const Source itemSource = mSource.withLine(parser->getLineNumber());
-        const std::string& elementNamespace = parser->getElementNamespace();
-        const std::string& elementName = parser->getElementName();
-        if (elementNamespace.empty() && elementName == "item") {
-            Maybe<StringPiece> maybeQuantity = xml::findNonEmptyAttribute(parser, "quantity");
-            if (!maybeQuantity) {
-                mDiag->error(DiagMessage(itemSource) << "<item> in <plurals> requires attribute "
-                             << "'quantity'");
-                error = true;
-                continue;
-            }
-
-            StringPiece trimmedQuantity = util::trimWhitespace(maybeQuantity.value());
-            size_t index = 0;
-            if (trimmedQuantity == "zero") {
-                index = Plural::Zero;
-            } else if (trimmedQuantity == "one") {
-                index = Plural::One;
-            } else if (trimmedQuantity == "two") {
-                index = Plural::Two;
-            } else if (trimmedQuantity == "few") {
-                index = Plural::Few;
-            } else if (trimmedQuantity == "many") {
-                index = Plural::Many;
-            } else if (trimmedQuantity == "other") {
-                index = Plural::Other;
-            } else {
-                mDiag->error(DiagMessage(itemSource)
-                             << "<item> in <plural> has invalid value '" << trimmedQuantity
-                             << "' for attribute 'quantity'");
-                error = true;
-                continue;
-            }
-
-            if (plural->values[index]) {
-                mDiag->error(DiagMessage(itemSource)
-                             << "duplicate quantity '" << trimmedQuantity << "'");
-                error = true;
-                continue;
-            }
-
-            if (!(plural->values[index] = parseXml(parser, android::ResTable_map::TYPE_STRING,
-                                                   kNoRawString))) {
-                error = true;
-            }
-            plural->values[index]->setSource(itemSource);
-
-        } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
-            mDiag->error(DiagMessage(itemSource) << "unknown tag <" << elementNamespace << ":"
-                         << elementName << ">");
-            error = true;
-        }
+  bool error = false;
+  const size_t depth = parser->getDepth();
+  while (xml::XmlPullParser::nextChildNode(parser, depth)) {
+    if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
+      // Skip text and comments.
+      continue;
     }
 
-    if (error) {
-        return false;
-    }
+    const Source itemSource = mSource.withLine(parser->getLineNumber());
+    const std::string& elementNamespace = parser->getElementNamespace();
+    const std::string& elementName = parser->getElementName();
+    if (elementNamespace.empty() && elementName == "item") {
+      Maybe<StringPiece> maybeQuantity =
+          xml::findNonEmptyAttribute(parser, "quantity");
+      if (!maybeQuantity) {
+        mDiag->error(DiagMessage(itemSource)
+                     << "<item> in <plurals> requires attribute "
+                     << "'quantity'");
+        error = true;
+        continue;
+      }
 
-    outResource->value = std::move(plural);
-    return true;
+      StringPiece trimmedQuantity = util::trimWhitespace(maybeQuantity.value());
+      size_t index = 0;
+      if (trimmedQuantity == "zero") {
+        index = Plural::Zero;
+      } else if (trimmedQuantity == "one") {
+        index = Plural::One;
+      } else if (trimmedQuantity == "two") {
+        index = Plural::Two;
+      } else if (trimmedQuantity == "few") {
+        index = Plural::Few;
+      } else if (trimmedQuantity == "many") {
+        index = Plural::Many;
+      } else if (trimmedQuantity == "other") {
+        index = Plural::Other;
+      } else {
+        mDiag->error(DiagMessage(itemSource)
+                     << "<item> in <plural> has invalid value '"
+                     << trimmedQuantity << "' for attribute 'quantity'");
+        error = true;
+        continue;
+      }
+
+      if (plural->values[index]) {
+        mDiag->error(DiagMessage(itemSource) << "duplicate quantity '"
+                                             << trimmedQuantity << "'");
+        error = true;
+        continue;
+      }
+
+      if (!(plural->values[index] = parseXml(
+                parser, android::ResTable_map::TYPE_STRING, kNoRawString))) {
+        error = true;
+      }
+      plural->values[index]->setSource(itemSource);
+
+    } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
+      mDiag->error(DiagMessage(itemSource)
+                   << "unknown tag <" << elementNamespace << ":" << elementName
+                   << ">");
+      error = true;
+    }
+  }
+
+  if (error) {
+    return false;
+  }
+
+  outResource->value = std::move(plural);
+  return true;
 }
 
 bool ResourceParser::parseDeclareStyleable(xml::XmlPullParser* parser,
                                            ParsedResource* outResource) {
-    outResource->name.type = ResourceType::kStyleable;
+  outResource->name.type = ResourceType::kStyleable;
 
-    // Declare-styleable is kPrivate by default, because it technically only exists in R.java.
-    outResource->symbolState = SymbolState::kPublic;
+  // Declare-styleable is kPrivate by default, because it technically only
+  // exists in R.java.
+  outResource->symbolState = SymbolState::kPublic;
 
-    // Declare-styleable only ends up in default config;
-    if (outResource->config != ConfigDescription::defaultConfig()) {
-        mDiag->warn(DiagMessage(outResource->source) << "ignoring configuration '"
-                            << outResource->config << "' for styleable "
-                            << outResource->name.entry);
-        outResource->config = ConfigDescription::defaultConfig();
+  // Declare-styleable only ends up in default config;
+  if (outResource->config != ConfigDescription::defaultConfig()) {
+    mDiag->warn(DiagMessage(outResource->source)
+                << "ignoring configuration '" << outResource->config
+                << "' for styleable " << outResource->name.entry);
+    outResource->config = ConfigDescription::defaultConfig();
+  }
+
+  std::unique_ptr<Styleable> styleable = util::make_unique<Styleable>();
+
+  std::string comment;
+  bool error = false;
+  const size_t depth = parser->getDepth();
+  while (xml::XmlPullParser::nextChildNode(parser, depth)) {
+    if (parser->getEvent() == xml::XmlPullParser::Event::kComment) {
+      comment = util::trimWhitespace(parser->getComment()).toString();
+      continue;
+    } else if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
+      // Ignore text.
+      continue;
     }
 
-    std::unique_ptr<Styleable> styleable = util::make_unique<Styleable>();
+    const Source itemSource = mSource.withLine(parser->getLineNumber());
+    const std::string& elementNamespace = parser->getElementNamespace();
+    const std::string& elementName = parser->getElementName();
+    if (elementNamespace.empty() && elementName == "attr") {
+      Maybe<StringPiece> maybeName = xml::findNonEmptyAttribute(parser, "name");
+      if (!maybeName) {
+        mDiag->error(DiagMessage(itemSource)
+                     << "<attr> tag must have a 'name' attribute");
+        error = true;
+        continue;
+      }
 
-    std::string comment;
-    bool error = false;
-    const size_t depth = parser->getDepth();
-    while (xml::XmlPullParser::nextChildNode(parser, depth)) {
-        if (parser->getEvent() == xml::XmlPullParser::Event::kComment) {
-            comment = util::trimWhitespace(parser->getComment()).toString();
-            continue;
-        } else if (parser->getEvent() != xml::XmlPullParser::Event::kStartElement) {
-            // Ignore text.
-            continue;
-        }
+      // If this is a declaration, the package name may be in the name. Separate
+      // these out.
+      // Eg. <attr name="android:text" />
+      Maybe<Reference> maybeRef =
+          ResourceUtils::parseXmlAttributeName(maybeName.value());
+      if (!maybeRef) {
+        mDiag->error(DiagMessage(itemSource) << "<attr> tag has invalid name '"
+                                             << maybeName.value() << "'");
+        error = true;
+        continue;
+      }
 
-        const Source itemSource = mSource.withLine(parser->getLineNumber());
-        const std::string& elementNamespace = parser->getElementNamespace();
-        const std::string& elementName = parser->getElementName();
-        if (elementNamespace.empty() && elementName == "attr") {
-            Maybe<StringPiece> maybeName = xml::findNonEmptyAttribute(parser, "name");
-            if (!maybeName) {
-                mDiag->error(DiagMessage(itemSource) << "<attr> tag must have a 'name' attribute");
-                error = true;
-                continue;
-            }
+      Reference& childRef = maybeRef.value();
+      xml::transformReferenceFromNamespace(parser, "", &childRef);
 
-            // If this is a declaration, the package name may be in the name. Separate these out.
-            // Eg. <attr name="android:text" />
-            Maybe<Reference> maybeRef = ResourceUtils::parseXmlAttributeName(maybeName.value());
-            if (!maybeRef) {
-                mDiag->error(DiagMessage(itemSource) << "<attr> tag has invalid name '"
-                             << maybeName.value() << "'");
-                error = true;
-                continue;
-            }
+      // Create the ParsedResource that will add the attribute to the table.
+      ParsedResource childResource;
+      childResource.name = childRef.name.value();
+      childResource.source = itemSource;
+      childResource.comment = std::move(comment);
 
-            Reference& childRef = maybeRef.value();
-            xml::transformReferenceFromNamespace(parser, "", &childRef);
+      if (!parseAttrImpl(parser, &childResource, true)) {
+        error = true;
+        continue;
+      }
 
-            // Create the ParsedResource that will add the attribute to the table.
-            ParsedResource childResource;
-            childResource.name = childRef.name.value();
-            childResource.source = itemSource;
-            childResource.comment = std::move(comment);
+      // Create the reference to this attribute.
+      childRef.setComment(childResource.comment);
+      childRef.setSource(itemSource);
+      styleable->entries.push_back(std::move(childRef));
 
-            if (!parseAttrImpl(parser, &childResource, true)) {
-                error = true;
-                continue;
-            }
+      outResource->childResources.push_back(std::move(childResource));
 
-            // Create the reference to this attribute.
-            childRef.setComment(childResource.comment);
-            childRef.setSource(itemSource);
-            styleable->entries.push_back(std::move(childRef));
-
-            outResource->childResources.push_back(std::move(childResource));
-
-        } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
-            mDiag->error(DiagMessage(itemSource) << "unknown tag <" << elementNamespace << ":"
-                         << elementName << ">");
-            error = true;
-        }
-
-        comment = {};
+    } else if (!shouldIgnoreElement(elementNamespace, elementName)) {
+      mDiag->error(DiagMessage(itemSource)
+                   << "unknown tag <" << elementNamespace << ":" << elementName
+                   << ">");
+      error = true;
     }
 
-    if (error) {
-        return false;
-    }
+    comment = {};
+  }
 
-    outResource->value = std::move(styleable);
-    return true;
+  if (error) {
+    return false;
+  }
+
+  outResource->value = std::move(styleable);
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/ResourceParser.h b/tools/aapt2/ResourceParser.h
index ece3090..644ed49 100644
--- a/tools/aapt2/ResourceParser.h
+++ b/tools/aapt2/ResourceParser.h
@@ -33,79 +33,92 @@
 struct ParsedResource;
 
 struct ResourceParserOptions {
-    /**
-     * Whether the default setting for this parser is to allow translation.
-     */
-    bool translatable = true;
+  /**
+   * Whether the default setting for this parser is to allow translation.
+   */
+  bool translatable = true;
 
-    /**
-     * Whether positional arguments in formatted strings are treated as errors or warnings.
-     */
-    bool errorOnPositionalArguments = true;
+  /**
+   * Whether positional arguments in formatted strings are treated as errors or
+   * warnings.
+   */
+  bool errorOnPositionalArguments = true;
 };
 
 /*
  * Parses an XML file for resources and adds them to a ResourceTable.
  */
 class ResourceParser {
-public:
-    ResourceParser(IDiagnostics* diag, ResourceTable* table, const Source& source,
-                   const ConfigDescription& config, const ResourceParserOptions& options = {});
+ public:
+  ResourceParser(IDiagnostics* diag, ResourceTable* table, const Source& source,
+                 const ConfigDescription& config,
+                 const ResourceParserOptions& options = {});
 
-    ResourceParser(const ResourceParser&) = delete; // No copy.
+  ResourceParser(const ResourceParser&) = delete;  // No copy.
 
-    bool parse(xml::XmlPullParser* parser);
+  bool parse(xml::XmlPullParser* parser);
 
-private:
-    /*
-     * Parses the XML subtree as a StyleString (flattened XML representation for strings
-     * with formatting). If successful, `outStyleString`
-     * contains the escaped and whitespace trimmed text, while `outRawString`
-     * contains the unescaped text. Returns true on success.
-     */
-    bool flattenXmlSubtree(xml::XmlPullParser* parser, std::string* outRawString,
-                           StyleString* outStyleString);
+ private:
+  /*
+   * Parses the XML subtree as a StyleString (flattened XML representation for
+   * strings
+   * with formatting). If successful, `outStyleString`
+   * contains the escaped and whitespace trimmed text, while `outRawString`
+   * contains the unescaped text. Returns true on success.
+   */
+  bool flattenXmlSubtree(xml::XmlPullParser* parser, std::string* outRawString,
+                         StyleString* outStyleString);
 
-    /*
-     * Parses the XML subtree and returns an Item.
-     * The type of Item that can be parsed is denoted by the `typeMask`.
-     * If `allowRawValue` is true and the subtree can not be parsed as a regular Item, then a
-     * RawString is returned. Otherwise this returns false;
-     */
-    std::unique_ptr<Item> parseXml(xml::XmlPullParser* parser, const uint32_t typeMask,
-                                   const bool allowRawValue);
+  /*
+   * Parses the XML subtree and returns an Item.
+   * The type of Item that can be parsed is denoted by the `typeMask`.
+   * If `allowRawValue` is true and the subtree can not be parsed as a regular
+   * Item, then a
+   * RawString is returned. Otherwise this returns false;
+   */
+  std::unique_ptr<Item> parseXml(xml::XmlPullParser* parser,
+                                 const uint32_t typeMask,
+                                 const bool allowRawValue);
 
-    bool parseResources(xml::XmlPullParser* parser);
-    bool parseResource(xml::XmlPullParser* parser, ParsedResource* outResource);
+  bool parseResources(xml::XmlPullParser* parser);
+  bool parseResource(xml::XmlPullParser* parser, ParsedResource* outResource);
 
-    bool parseItem(xml::XmlPullParser* parser, ParsedResource* outResource, uint32_t format);
-    bool parseString(xml::XmlPullParser* parser, ParsedResource* outResource);
+  bool parseItem(xml::XmlPullParser* parser, ParsedResource* outResource,
+                 uint32_t format);
+  bool parseString(xml::XmlPullParser* parser, ParsedResource* outResource);
 
-    bool parsePublic(xml::XmlPullParser* parser, ParsedResource* outResource);
-    bool parsePublicGroup(xml::XmlPullParser* parser, ParsedResource* outResource);
-    bool parseSymbolImpl(xml::XmlPullParser* parser, ParsedResource* outResource);
-    bool parseSymbol(xml::XmlPullParser* parser, ParsedResource* outResource);
-    bool parseAddResource(xml::XmlPullParser* parser, ParsedResource* outResource);
-    bool parseAttr(xml::XmlPullParser* parser, ParsedResource* outResource);
-    bool parseAttrImpl(xml::XmlPullParser* parser, ParsedResource* outResource, bool weak);
-    Maybe<Attribute::Symbol> parseEnumOrFlagItem(xml::XmlPullParser* parser,
-                                                 const StringPiece& tag);
-    bool parseStyle(xml::XmlPullParser* parser, ParsedResource* outResource);
-    bool parseStyleItem(xml::XmlPullParser* parser, Style* style);
-    bool parseDeclareStyleable(xml::XmlPullParser* parser, ParsedResource* outResource);
-    bool parseArray(xml::XmlPullParser* parser, ParsedResource* outResource);
-    bool parseIntegerArray(xml::XmlPullParser* parser, ParsedResource* outResource);
-    bool parseStringArray(xml::XmlPullParser* parser, ParsedResource* outResource);
-    bool parseArrayImpl(xml::XmlPullParser* parser, ParsedResource* outResource, uint32_t typeMask);
-    bool parsePlural(xml::XmlPullParser* parser, ParsedResource* outResource);
+  bool parsePublic(xml::XmlPullParser* parser, ParsedResource* outResource);
+  bool parsePublicGroup(xml::XmlPullParser* parser,
+                        ParsedResource* outResource);
+  bool parseSymbolImpl(xml::XmlPullParser* parser, ParsedResource* outResource);
+  bool parseSymbol(xml::XmlPullParser* parser, ParsedResource* outResource);
+  bool parseAddResource(xml::XmlPullParser* parser,
+                        ParsedResource* outResource);
+  bool parseAttr(xml::XmlPullParser* parser, ParsedResource* outResource);
+  bool parseAttrImpl(xml::XmlPullParser* parser, ParsedResource* outResource,
+                     bool weak);
+  Maybe<Attribute::Symbol> parseEnumOrFlagItem(xml::XmlPullParser* parser,
+                                               const StringPiece& tag);
+  bool parseStyle(xml::XmlPullParser* parser, ParsedResource* outResource);
+  bool parseStyleItem(xml::XmlPullParser* parser, Style* style);
+  bool parseDeclareStyleable(xml::XmlPullParser* parser,
+                             ParsedResource* outResource);
+  bool parseArray(xml::XmlPullParser* parser, ParsedResource* outResource);
+  bool parseIntegerArray(xml::XmlPullParser* parser,
+                         ParsedResource* outResource);
+  bool parseStringArray(xml::XmlPullParser* parser,
+                        ParsedResource* outResource);
+  bool parseArrayImpl(xml::XmlPullParser* parser, ParsedResource* outResource,
+                      uint32_t typeMask);
+  bool parsePlural(xml::XmlPullParser* parser, ParsedResource* outResource);
 
-    IDiagnostics* mDiag;
-    ResourceTable* mTable;
-    Source mSource;
-    ConfigDescription mConfig;
-    ResourceParserOptions mOptions;
+  IDiagnostics* mDiag;
+  ResourceTable* mTable;
+  Source mSource;
+  ConfigDescription mConfig;
+  ResourceParserOptions mOptions;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_RESOURCE_PARSER_H
+#endif  // AAPT_RESOURCE_PARSER_H
diff --git a/tools/aapt2/ResourceParser_test.cpp b/tools/aapt2/ResourceParser_test.cpp
index e097740..b6d57c0 100644
--- a/tools/aapt2/ResourceParser_test.cpp
+++ b/tools/aapt2/ResourceParser_test.cpp
@@ -26,512 +26,559 @@
 
 namespace aapt {
 
-constexpr const char* kXmlPreamble = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
+constexpr const char* kXmlPreamble =
+    "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
 
 TEST(ResourceParserSingleTest, FailToParseWithNoRootResourcesElement) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
-    std::stringstream input(kXmlPreamble);
-    input << "<attr name=\"foo\"/>" << std::endl;
-    ResourceTable table;
-    ResourceParser parser(context->getDiagnostics(), &table, Source{ "test" }, {});
-    xml::XmlPullParser xmlParser(input);
-    ASSERT_FALSE(parser.parse(&xmlParser));
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::stringstream input(kXmlPreamble);
+  input << "<attr name=\"foo\"/>" << std::endl;
+  ResourceTable table;
+  ResourceParser parser(context->getDiagnostics(), &table, Source{"test"}, {});
+  xml::XmlPullParser xmlParser(input);
+  ASSERT_FALSE(parser.parse(&xmlParser));
 }
 
 struct ResourceParserTest : public ::testing::Test {
-    ResourceTable mTable;
-    std::unique_ptr<IAaptContext> mContext;
+  ResourceTable mTable;
+  std::unique_ptr<IAaptContext> mContext;
 
-    void SetUp() override {
-        mContext = test::ContextBuilder().build();
-    }
+  void SetUp() override { mContext = test::ContextBuilder().build(); }
 
-    ::testing::AssertionResult testParse(const StringPiece& str) {
-        return testParse(str, ConfigDescription{});
-    }
+  ::testing::AssertionResult testParse(const StringPiece& str) {
+    return testParse(str, ConfigDescription{});
+  }
 
-    ::testing::AssertionResult testParse(const StringPiece& str, const ConfigDescription& config) {
-        std::stringstream input(kXmlPreamble);
-        input << "<resources>\n" << str << "\n</resources>" << std::endl;
-        ResourceParserOptions parserOptions;
-        ResourceParser parser(mContext->getDiagnostics(), &mTable, Source{ "test" }, config,
-                              parserOptions);
-        xml::XmlPullParser xmlParser(input);
-        if (parser.parse(&xmlParser)) {
-            return ::testing::AssertionSuccess();
-        }
-        return ::testing::AssertionFailure();
+  ::testing::AssertionResult testParse(const StringPiece& str,
+                                       const ConfigDescription& config) {
+    std::stringstream input(kXmlPreamble);
+    input << "<resources>\n" << str << "\n</resources>" << std::endl;
+    ResourceParserOptions parserOptions;
+    ResourceParser parser(mContext->getDiagnostics(), &mTable, Source{"test"},
+                          config, parserOptions);
+    xml::XmlPullParser xmlParser(input);
+    if (parser.parse(&xmlParser)) {
+      return ::testing::AssertionSuccess();
     }
+    return ::testing::AssertionFailure();
+  }
 };
 
 TEST_F(ResourceParserTest, ParseQuotedString) {
-    std::string input = "<string name=\"foo\">   \"  hey there \" </string>";
-    ASSERT_TRUE(testParse(input));
+  std::string input = "<string name=\"foo\">   \"  hey there \" </string>";
+  ASSERT_TRUE(testParse(input));
 
-    String* str = test::getValue<String>(&mTable, "string/foo");
-    ASSERT_NE(nullptr, str);
-    EXPECT_EQ(std::string("  hey there "), *str->value);
+  String* str = test::getValue<String>(&mTable, "string/foo");
+  ASSERT_NE(nullptr, str);
+  EXPECT_EQ(std::string("  hey there "), *str->value);
 }
 
 TEST_F(ResourceParserTest, ParseEscapedString) {
-    std::string input = "<string name=\"foo\">\\?123</string>";
-    ASSERT_TRUE(testParse(input));
+  std::string input = "<string name=\"foo\">\\?123</string>";
+  ASSERT_TRUE(testParse(input));
 
-    String* str = test::getValue<String>(&mTable, "string/foo");
-    ASSERT_NE(nullptr, str);
-    EXPECT_EQ(std::string("?123"), *str->value);
+  String* str = test::getValue<String>(&mTable, "string/foo");
+  ASSERT_NE(nullptr, str);
+  EXPECT_EQ(std::string("?123"), *str->value);
 }
 
 TEST_F(ResourceParserTest, ParseFormattedString) {
-    std::string input = "<string name=\"foo\">%d %s</string>";
-    ASSERT_FALSE(testParse(input));
+  std::string input = "<string name=\"foo\">%d %s</string>";
+  ASSERT_FALSE(testParse(input));
 
-    input = "<string name=\"foo\">%1$d %2$s</string>";
-    ASSERT_TRUE(testParse(input));
+  input = "<string name=\"foo\">%1$d %2$s</string>";
+  ASSERT_TRUE(testParse(input));
 }
 
 TEST_F(ResourceParserTest, ParseStyledString) {
-    // Use a surrogate pair unicode point so that we can verify that the span indices
-    // use UTF-16 length and not UTF-18 length.
-    std::string input = "<string name=\"foo\">This is my aunt\u2019s <b>string</b></string>";
-    ASSERT_TRUE(testParse(input));
+  // Use a surrogate pair unicode point so that we can verify that the span
+  // indices
+  // use UTF-16 length and not UTF-18 length.
+  std::string input =
+      "<string name=\"foo\">This is my aunt\u2019s <b>string</b></string>";
+  ASSERT_TRUE(testParse(input));
 
-    StyledString* str = test::getValue<StyledString>(&mTable, "string/foo");
-    ASSERT_NE(nullptr, str);
+  StyledString* str = test::getValue<StyledString>(&mTable, "string/foo");
+  ASSERT_NE(nullptr, str);
 
-    const std::string expectedStr = "This is my aunt\u2019s string";
-    EXPECT_EQ(expectedStr, *str->value->str);
-    EXPECT_EQ(1u, str->value->spans.size());
+  const std::string expectedStr = "This is my aunt\u2019s string";
+  EXPECT_EQ(expectedStr, *str->value->str);
+  EXPECT_EQ(1u, str->value->spans.size());
 
-    EXPECT_EQ(std::string("b"), *str->value->spans[0].name);
-    EXPECT_EQ(17u, str->value->spans[0].firstChar);
-    EXPECT_EQ(23u, str->value->spans[0].lastChar);
+  EXPECT_EQ(std::string("b"), *str->value->spans[0].name);
+  EXPECT_EQ(17u, str->value->spans[0].firstChar);
+  EXPECT_EQ(23u, str->value->spans[0].lastChar);
 }
 
 TEST_F(ResourceParserTest, ParseStringWithWhitespace) {
-    std::string input = "<string name=\"foo\">  This is what  I think  </string>";
-    ASSERT_TRUE(testParse(input));
+  std::string input = "<string name=\"foo\">  This is what  I think  </string>";
+  ASSERT_TRUE(testParse(input));
 
-    String* str = test::getValue<String>(&mTable, "string/foo");
-    ASSERT_NE(nullptr, str);
-    EXPECT_EQ(std::string("This is what I think"), *str->value);
+  String* str = test::getValue<String>(&mTable, "string/foo");
+  ASSERT_NE(nullptr, str);
+  EXPECT_EQ(std::string("This is what I think"), *str->value);
 
-    input = "<string name=\"foo2\">\"  This is what  I think  \"</string>";
-    ASSERT_TRUE(testParse(input));
+  input = "<string name=\"foo2\">\"  This is what  I think  \"</string>";
+  ASSERT_TRUE(testParse(input));
 
-    str = test::getValue<String>(&mTable, "string/foo2");
-    ASSERT_NE(nullptr, str);
-    EXPECT_EQ(std::string("  This is what  I think  "), *str->value);
+  str = test::getValue<String>(&mTable, "string/foo2");
+  ASSERT_NE(nullptr, str);
+  EXPECT_EQ(std::string("  This is what  I think  "), *str->value);
 }
 
 TEST_F(ResourceParserTest, IgnoreXliffTags) {
-    std::string input = "<string name=\"foo\" \n"
-                        "        xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">\n"
-                        "  There are <xliff:g id=\"count\">%1$d</xliff:g> apples</string>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<string name=\"foo\" \n"
+      "        xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">\n"
+      "  There are <xliff:g id=\"count\">%1$d</xliff:g> apples</string>";
+  ASSERT_TRUE(testParse(input));
 
-    String* str = test::getValue<String>(&mTable, "string/foo");
-    ASSERT_NE(nullptr, str);
-    EXPECT_EQ(StringPiece("There are %1$d apples"), StringPiece(*str->value));
+  String* str = test::getValue<String>(&mTable, "string/foo");
+  ASSERT_NE(nullptr, str);
+  EXPECT_EQ(StringPiece("There are %1$d apples"), StringPiece(*str->value));
 }
 
 TEST_F(ResourceParserTest, ParseNull) {
-    std::string input = "<integer name=\"foo\">@null</integer>";
-    ASSERT_TRUE(testParse(input));
+  std::string input = "<integer name=\"foo\">@null</integer>";
+  ASSERT_TRUE(testParse(input));
 
-    // The Android runtime treats a value of android::Res_value::TYPE_NULL as
-    // a non-existing value, and this causes problems in styles when trying to resolve
-    // an attribute. Null values must be encoded as android::Res_value::TYPE_REFERENCE
-    // with a data value of 0.
-    BinaryPrimitive* integer = test::getValue<BinaryPrimitive>(&mTable, "integer/foo");
-    ASSERT_NE(nullptr, integer);
-    EXPECT_EQ(uint16_t(android::Res_value::TYPE_REFERENCE), integer->value.dataType);
-    EXPECT_EQ(0u, integer->value.data);
+  // The Android runtime treats a value of android::Res_value::TYPE_NULL as
+  // a non-existing value, and this causes problems in styles when trying to
+  // resolve
+  // an attribute. Null values must be encoded as
+  // android::Res_value::TYPE_REFERENCE
+  // with a data value of 0.
+  BinaryPrimitive* integer =
+      test::getValue<BinaryPrimitive>(&mTable, "integer/foo");
+  ASSERT_NE(nullptr, integer);
+  EXPECT_EQ(uint16_t(android::Res_value::TYPE_REFERENCE),
+            integer->value.dataType);
+  EXPECT_EQ(0u, integer->value.data);
 }
 
 TEST_F(ResourceParserTest, ParseEmpty) {
-    std::string input = "<integer name=\"foo\">@empty</integer>";
-    ASSERT_TRUE(testParse(input));
+  std::string input = "<integer name=\"foo\">@empty</integer>";
+  ASSERT_TRUE(testParse(input));
 
-    BinaryPrimitive* integer = test::getValue<BinaryPrimitive>(&mTable, "integer/foo");
-    ASSERT_NE(nullptr, integer);
-    EXPECT_EQ(uint16_t(android::Res_value::TYPE_NULL), integer->value.dataType);
-    EXPECT_EQ(uint32_t(android::Res_value::DATA_NULL_EMPTY), integer->value.data);
+  BinaryPrimitive* integer =
+      test::getValue<BinaryPrimitive>(&mTable, "integer/foo");
+  ASSERT_NE(nullptr, integer);
+  EXPECT_EQ(uint16_t(android::Res_value::TYPE_NULL), integer->value.dataType);
+  EXPECT_EQ(uint32_t(android::Res_value::DATA_NULL_EMPTY), integer->value.data);
 }
 
 TEST_F(ResourceParserTest, ParseAttr) {
-    std::string input = "<attr name=\"foo\" format=\"string\"/>\n"
-                        "<attr name=\"bar\"/>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<attr name=\"foo\" format=\"string\"/>\n"
+      "<attr name=\"bar\"/>";
+  ASSERT_TRUE(testParse(input));
 
-    Attribute* attr = test::getValue<Attribute>(&mTable, "attr/foo");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_STRING), attr->typeMask);
+  Attribute* attr = test::getValue<Attribute>(&mTable, "attr/foo");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_STRING), attr->typeMask);
 
-    attr = test::getValue<Attribute>(&mTable, "attr/bar");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_ANY), attr->typeMask);
+  attr = test::getValue<Attribute>(&mTable, "attr/bar");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_ANY), attr->typeMask);
 }
 
-// Old AAPT allowed attributes to be defined under different configurations, but ultimately
-// stored them with the default configuration. Check that we have the same behavior.
-TEST_F(ResourceParserTest, ParseAttrAndDeclareStyleableUnderConfigButRecordAsNoConfig) {
-    const ConfigDescription watchConfig = test::parseConfigOrDie("watch");
-    std::string input = R"EOF(
+// Old AAPT allowed attributes to be defined under different configurations, but
+// ultimately
+// stored them with the default configuration. Check that we have the same
+// behavior.
+TEST_F(ResourceParserTest,
+       ParseAttrAndDeclareStyleableUnderConfigButRecordAsNoConfig) {
+  const ConfigDescription watchConfig = test::parseConfigOrDie("watch");
+  std::string input = R"EOF(
         <attr name="foo" />
         <declare-styleable name="bar">
           <attr name="baz" />
         </declare-styleable>)EOF";
-    ASSERT_TRUE(testParse(input, watchConfig));
+  ASSERT_TRUE(testParse(input, watchConfig));
 
-    EXPECT_EQ(nullptr, test::getValueForConfig<Attribute>(&mTable, "attr/foo", watchConfig));
-    EXPECT_EQ(nullptr, test::getValueForConfig<Attribute>(&mTable, "attr/baz", watchConfig));
-    EXPECT_EQ(nullptr, test::getValueForConfig<Styleable>(&mTable, "styleable/bar", watchConfig));
+  EXPECT_EQ(nullptr, test::getValueForConfig<Attribute>(&mTable, "attr/foo",
+                                                        watchConfig));
+  EXPECT_EQ(nullptr, test::getValueForConfig<Attribute>(&mTable, "attr/baz",
+                                                        watchConfig));
+  EXPECT_EQ(nullptr, test::getValueForConfig<Styleable>(
+                         &mTable, "styleable/bar", watchConfig));
 
-    EXPECT_NE(nullptr, test::getValue<Attribute>(&mTable, "attr/foo"));
-    EXPECT_NE(nullptr, test::getValue<Attribute>(&mTable, "attr/baz"));
-    EXPECT_NE(nullptr, test::getValue<Styleable>(&mTable, "styleable/bar"));
+  EXPECT_NE(nullptr, test::getValue<Attribute>(&mTable, "attr/foo"));
+  EXPECT_NE(nullptr, test::getValue<Attribute>(&mTable, "attr/baz"));
+  EXPECT_NE(nullptr, test::getValue<Styleable>(&mTable, "styleable/bar"));
 }
 
 TEST_F(ResourceParserTest, ParseAttrWithMinMax) {
-    std::string input = "<attr name=\"foo\" min=\"10\" max=\"23\" format=\"integer\"/>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<attr name=\"foo\" min=\"10\" max=\"23\" format=\"integer\"/>";
+  ASSERT_TRUE(testParse(input));
 
-    Attribute* attr = test::getValue<Attribute>(&mTable, "attr/foo");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_INTEGER), attr->typeMask);
-    EXPECT_EQ(10, attr->minInt);
-    EXPECT_EQ(23, attr->maxInt);
+  Attribute* attr = test::getValue<Attribute>(&mTable, "attr/foo");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_INTEGER), attr->typeMask);
+  EXPECT_EQ(10, attr->minInt);
+  EXPECT_EQ(23, attr->maxInt);
 }
 
 TEST_F(ResourceParserTest, FailParseAttrWithMinMaxButNotInteger) {
-    std::string input = "<attr name=\"foo\" min=\"10\" max=\"23\" format=\"string\"/>";
-    ASSERT_FALSE(testParse(input));
+  std::string input =
+      "<attr name=\"foo\" min=\"10\" max=\"23\" format=\"string\"/>";
+  ASSERT_FALSE(testParse(input));
 }
 
 TEST_F(ResourceParserTest, ParseUseAndDeclOfAttr) {
-    std::string input = "<declare-styleable name=\"Styleable\">\n"
-                        "  <attr name=\"foo\" />\n"
-                        "</declare-styleable>\n"
-                        "<attr name=\"foo\" format=\"string\"/>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<declare-styleable name=\"Styleable\">\n"
+      "  <attr name=\"foo\" />\n"
+      "</declare-styleable>\n"
+      "<attr name=\"foo\" format=\"string\"/>";
+  ASSERT_TRUE(testParse(input));
 
-    Attribute* attr = test::getValue<Attribute>(&mTable, "attr/foo");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_STRING), attr->typeMask);
+  Attribute* attr = test::getValue<Attribute>(&mTable, "attr/foo");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_STRING), attr->typeMask);
 }
 
 TEST_F(ResourceParserTest, ParseDoubleUseOfAttr) {
-    std::string input = "<declare-styleable name=\"Theme\">"
-                        "  <attr name=\"foo\" />\n"
-                        "</declare-styleable>\n"
-                        "<declare-styleable name=\"Window\">\n"
-                        "  <attr name=\"foo\" format=\"boolean\"/>\n"
-                        "</declare-styleable>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<declare-styleable name=\"Theme\">"
+      "  <attr name=\"foo\" />\n"
+      "</declare-styleable>\n"
+      "<declare-styleable name=\"Window\">\n"
+      "  <attr name=\"foo\" format=\"boolean\"/>\n"
+      "</declare-styleable>";
+  ASSERT_TRUE(testParse(input));
 
-    Attribute* attr = test::getValue<Attribute>(&mTable, "attr/foo");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_BOOLEAN), attr->typeMask);
+  Attribute* attr = test::getValue<Attribute>(&mTable, "attr/foo");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ(uint32_t(android::ResTable_map::TYPE_BOOLEAN), attr->typeMask);
 }
 
 TEST_F(ResourceParserTest, ParseEnumAttr) {
-    std::string input = "<attr name=\"foo\">\n"
-                        "  <enum name=\"bar\" value=\"0\"/>\n"
-                        "  <enum name=\"bat\" value=\"1\"/>\n"
-                        "  <enum name=\"baz\" value=\"2\"/>\n"
-                        "</attr>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<attr name=\"foo\">\n"
+      "  <enum name=\"bar\" value=\"0\"/>\n"
+      "  <enum name=\"bat\" value=\"1\"/>\n"
+      "  <enum name=\"baz\" value=\"2\"/>\n"
+      "</attr>";
+  ASSERT_TRUE(testParse(input));
 
-    Attribute* enumAttr = test::getValue<Attribute>(&mTable, "attr/foo");
-    ASSERT_NE(enumAttr, nullptr);
-    EXPECT_EQ(enumAttr->typeMask, android::ResTable_map::TYPE_ENUM);
-    ASSERT_EQ(enumAttr->symbols.size(), 3u);
+  Attribute* enumAttr = test::getValue<Attribute>(&mTable, "attr/foo");
+  ASSERT_NE(enumAttr, nullptr);
+  EXPECT_EQ(enumAttr->typeMask, android::ResTable_map::TYPE_ENUM);
+  ASSERT_EQ(enumAttr->symbols.size(), 3u);
 
-    AAPT_ASSERT_TRUE(enumAttr->symbols[0].symbol.name);
-    EXPECT_EQ(enumAttr->symbols[0].symbol.name.value().entry, "bar");
-    EXPECT_EQ(enumAttr->symbols[0].value, 0u);
+  AAPT_ASSERT_TRUE(enumAttr->symbols[0].symbol.name);
+  EXPECT_EQ(enumAttr->symbols[0].symbol.name.value().entry, "bar");
+  EXPECT_EQ(enumAttr->symbols[0].value, 0u);
 
-    AAPT_ASSERT_TRUE(enumAttr->symbols[1].symbol.name);
-    EXPECT_EQ(enumAttr->symbols[1].symbol.name.value().entry, "bat");
-    EXPECT_EQ(enumAttr->symbols[1].value, 1u);
+  AAPT_ASSERT_TRUE(enumAttr->symbols[1].symbol.name);
+  EXPECT_EQ(enumAttr->symbols[1].symbol.name.value().entry, "bat");
+  EXPECT_EQ(enumAttr->symbols[1].value, 1u);
 
-    AAPT_ASSERT_TRUE(enumAttr->symbols[2].symbol.name);
-    EXPECT_EQ(enumAttr->symbols[2].symbol.name.value().entry, "baz");
-    EXPECT_EQ(enumAttr->symbols[2].value, 2u);
+  AAPT_ASSERT_TRUE(enumAttr->symbols[2].symbol.name);
+  EXPECT_EQ(enumAttr->symbols[2].symbol.name.value().entry, "baz");
+  EXPECT_EQ(enumAttr->symbols[2].value, 2u);
 }
 
 TEST_F(ResourceParserTest, ParseFlagAttr) {
-    std::string input = "<attr name=\"foo\">\n"
-                        "  <flag name=\"bar\" value=\"0\"/>\n"
-                        "  <flag name=\"bat\" value=\"1\"/>\n"
-                        "  <flag name=\"baz\" value=\"2\"/>\n"
-                        "</attr>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<attr name=\"foo\">\n"
+      "  <flag name=\"bar\" value=\"0\"/>\n"
+      "  <flag name=\"bat\" value=\"1\"/>\n"
+      "  <flag name=\"baz\" value=\"2\"/>\n"
+      "</attr>";
+  ASSERT_TRUE(testParse(input));
 
-    Attribute* flagAttr = test::getValue<Attribute>(&mTable, "attr/foo");
-    ASSERT_NE(nullptr, flagAttr);
-    EXPECT_EQ(flagAttr->typeMask, android::ResTable_map::TYPE_FLAGS);
-    ASSERT_EQ(flagAttr->symbols.size(), 3u);
+  Attribute* flagAttr = test::getValue<Attribute>(&mTable, "attr/foo");
+  ASSERT_NE(nullptr, flagAttr);
+  EXPECT_EQ(flagAttr->typeMask, android::ResTable_map::TYPE_FLAGS);
+  ASSERT_EQ(flagAttr->symbols.size(), 3u);
 
-    AAPT_ASSERT_TRUE(flagAttr->symbols[0].symbol.name);
-    EXPECT_EQ(flagAttr->symbols[0].symbol.name.value().entry, "bar");
-    EXPECT_EQ(flagAttr->symbols[0].value, 0u);
+  AAPT_ASSERT_TRUE(flagAttr->symbols[0].symbol.name);
+  EXPECT_EQ(flagAttr->symbols[0].symbol.name.value().entry, "bar");
+  EXPECT_EQ(flagAttr->symbols[0].value, 0u);
 
-    AAPT_ASSERT_TRUE(flagAttr->symbols[1].symbol.name);
-    EXPECT_EQ(flagAttr->symbols[1].symbol.name.value().entry, "bat");
-    EXPECT_EQ(flagAttr->symbols[1].value, 1u);
+  AAPT_ASSERT_TRUE(flagAttr->symbols[1].symbol.name);
+  EXPECT_EQ(flagAttr->symbols[1].symbol.name.value().entry, "bat");
+  EXPECT_EQ(flagAttr->symbols[1].value, 1u);
 
-    AAPT_ASSERT_TRUE(flagAttr->symbols[2].symbol.name);
-    EXPECT_EQ(flagAttr->symbols[2].symbol.name.value().entry, "baz");
-    EXPECT_EQ(flagAttr->symbols[2].value, 2u);
+  AAPT_ASSERT_TRUE(flagAttr->symbols[2].symbol.name);
+  EXPECT_EQ(flagAttr->symbols[2].symbol.name.value().entry, "baz");
+  EXPECT_EQ(flagAttr->symbols[2].value, 2u);
 
-    std::unique_ptr<BinaryPrimitive> flagValue = ResourceUtils::tryParseFlagSymbol(flagAttr,
-                                                                                   "baz|bat");
-    ASSERT_NE(nullptr, flagValue);
-    EXPECT_EQ(flagValue->value.data, 1u | 2u);
+  std::unique_ptr<BinaryPrimitive> flagValue =
+      ResourceUtils::tryParseFlagSymbol(flagAttr, "baz|bat");
+  ASSERT_NE(nullptr, flagValue);
+  EXPECT_EQ(flagValue->value.data, 1u | 2u);
 }
 
 TEST_F(ResourceParserTest, FailToParseEnumAttrWithNonUniqueKeys) {
-    std::string input = "<attr name=\"foo\">\n"
-                        "  <enum name=\"bar\" value=\"0\"/>\n"
-                        "  <enum name=\"bat\" value=\"1\"/>\n"
-                        "  <enum name=\"bat\" value=\"2\"/>\n"
-                        "</attr>";
-    ASSERT_FALSE(testParse(input));
+  std::string input =
+      "<attr name=\"foo\">\n"
+      "  <enum name=\"bar\" value=\"0\"/>\n"
+      "  <enum name=\"bat\" value=\"1\"/>\n"
+      "  <enum name=\"bat\" value=\"2\"/>\n"
+      "</attr>";
+  ASSERT_FALSE(testParse(input));
 }
 
 TEST_F(ResourceParserTest, ParseStyle) {
-    std::string input = "<style name=\"foo\" parent=\"@style/fu\">\n"
-                        "  <item name=\"bar\">#ffffffff</item>\n"
-                        "  <item name=\"bat\">@string/hey</item>\n"
-                        "  <item name=\"baz\"><b>hey</b></item>\n"
-                        "</style>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<style name=\"foo\" parent=\"@style/fu\">\n"
+      "  <item name=\"bar\">#ffffffff</item>\n"
+      "  <item name=\"bat\">@string/hey</item>\n"
+      "  <item name=\"baz\"><b>hey</b></item>\n"
+      "</style>";
+  ASSERT_TRUE(testParse(input));
 
-    Style* style = test::getValue<Style>(&mTable, "style/foo");
-    ASSERT_NE(nullptr, style);
-    AAPT_ASSERT_TRUE(style->parent);
-    AAPT_ASSERT_TRUE(style->parent.value().name);
-    EXPECT_EQ(test::parseNameOrDie("style/fu"), style->parent.value().name.value());
-    ASSERT_EQ(3u, style->entries.size());
+  Style* style = test::getValue<Style>(&mTable, "style/foo");
+  ASSERT_NE(nullptr, style);
+  AAPT_ASSERT_TRUE(style->parent);
+  AAPT_ASSERT_TRUE(style->parent.value().name);
+  EXPECT_EQ(test::parseNameOrDie("style/fu"),
+            style->parent.value().name.value());
+  ASSERT_EQ(3u, style->entries.size());
 
-    AAPT_ASSERT_TRUE(style->entries[0].key.name);
-    EXPECT_EQ(test::parseNameOrDie("attr/bar"), style->entries[0].key.name.value());
+  AAPT_ASSERT_TRUE(style->entries[0].key.name);
+  EXPECT_EQ(test::parseNameOrDie("attr/bar"),
+            style->entries[0].key.name.value());
 
-    AAPT_ASSERT_TRUE(style->entries[1].key.name);
-    EXPECT_EQ(test::parseNameOrDie("attr/bat"), style->entries[1].key.name.value());
+  AAPT_ASSERT_TRUE(style->entries[1].key.name);
+  EXPECT_EQ(test::parseNameOrDie("attr/bat"),
+            style->entries[1].key.name.value());
 
-    AAPT_ASSERT_TRUE(style->entries[2].key.name);
-    EXPECT_EQ(test::parseNameOrDie("attr/baz"), style->entries[2].key.name.value());
+  AAPT_ASSERT_TRUE(style->entries[2].key.name);
+  EXPECT_EQ(test::parseNameOrDie("attr/baz"),
+            style->entries[2].key.name.value());
 }
 
 TEST_F(ResourceParserTest, ParseStyleWithShorthandParent) {
-    std::string input = "<style name=\"foo\" parent=\"com.app:Theme\"/>";
-    ASSERT_TRUE(testParse(input));
+  std::string input = "<style name=\"foo\" parent=\"com.app:Theme\"/>";
+  ASSERT_TRUE(testParse(input));
 
-    Style* style = test::getValue<Style>(&mTable, "style/foo");
-    ASSERT_NE(nullptr, style);
-    AAPT_ASSERT_TRUE(style->parent);
-    AAPT_ASSERT_TRUE(style->parent.value().name);
-    EXPECT_EQ(test::parseNameOrDie("com.app:style/Theme"), style->parent.value().name.value());
+  Style* style = test::getValue<Style>(&mTable, "style/foo");
+  ASSERT_NE(nullptr, style);
+  AAPT_ASSERT_TRUE(style->parent);
+  AAPT_ASSERT_TRUE(style->parent.value().name);
+  EXPECT_EQ(test::parseNameOrDie("com.app:style/Theme"),
+            style->parent.value().name.value());
 }
 
 TEST_F(ResourceParserTest, ParseStyleWithPackageAliasedParent) {
-    std::string input = "<style xmlns:app=\"http://schemas.android.com/apk/res/android\"\n"
-                        "       name=\"foo\" parent=\"app:Theme\"/>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<style xmlns:app=\"http://schemas.android.com/apk/res/android\"\n"
+      "       name=\"foo\" parent=\"app:Theme\"/>";
+  ASSERT_TRUE(testParse(input));
 
-    Style* style = test::getValue<Style>(&mTable, "style/foo");
-    ASSERT_NE(nullptr, style);
-    AAPT_ASSERT_TRUE(style->parent);
-    AAPT_ASSERT_TRUE(style->parent.value().name);
-    EXPECT_EQ(test::parseNameOrDie("android:style/Theme"), style->parent.value().name.value());
+  Style* style = test::getValue<Style>(&mTable, "style/foo");
+  ASSERT_NE(nullptr, style);
+  AAPT_ASSERT_TRUE(style->parent);
+  AAPT_ASSERT_TRUE(style->parent.value().name);
+  EXPECT_EQ(test::parseNameOrDie("android:style/Theme"),
+            style->parent.value().name.value());
 }
 
 TEST_F(ResourceParserTest, ParseStyleWithPackageAliasedItems) {
-    std::string input =
-            "<style xmlns:app=\"http://schemas.android.com/apk/res/android\" name=\"foo\">\n"
-            "  <item name=\"app:bar\">0</item>\n"
-            "</style>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<style xmlns:app=\"http://schemas.android.com/apk/res/android\" "
+      "name=\"foo\">\n"
+      "  <item name=\"app:bar\">0</item>\n"
+      "</style>";
+  ASSERT_TRUE(testParse(input));
 
-    Style* style = test::getValue<Style>(&mTable, "style/foo");
-    ASSERT_NE(nullptr, style);
-    ASSERT_EQ(1u, style->entries.size());
-    EXPECT_EQ(test::parseNameOrDie("android:attr/bar"), style->entries[0].key.name.value());
+  Style* style = test::getValue<Style>(&mTable, "style/foo");
+  ASSERT_NE(nullptr, style);
+  ASSERT_EQ(1u, style->entries.size());
+  EXPECT_EQ(test::parseNameOrDie("android:attr/bar"),
+            style->entries[0].key.name.value());
 }
 
 TEST_F(ResourceParserTest, ParseStyleWithInferredParent) {
-    std::string input = "<style name=\"foo.bar\"/>";
-    ASSERT_TRUE(testParse(input));
+  std::string input = "<style name=\"foo.bar\"/>";
+  ASSERT_TRUE(testParse(input));
 
-    Style* style = test::getValue<Style>(&mTable, "style/foo.bar");
-    ASSERT_NE(nullptr, style);
-    AAPT_ASSERT_TRUE(style->parent);
-    AAPT_ASSERT_TRUE(style->parent.value().name);
-    EXPECT_EQ(style->parent.value().name.value(), test::parseNameOrDie("style/foo"));
-    EXPECT_TRUE(style->parentInferred);
+  Style* style = test::getValue<Style>(&mTable, "style/foo.bar");
+  ASSERT_NE(nullptr, style);
+  AAPT_ASSERT_TRUE(style->parent);
+  AAPT_ASSERT_TRUE(style->parent.value().name);
+  EXPECT_EQ(style->parent.value().name.value(),
+            test::parseNameOrDie("style/foo"));
+  EXPECT_TRUE(style->parentInferred);
 }
 
-TEST_F(ResourceParserTest, ParseStyleWithInferredParentOverridenByEmptyParentAttribute) {
-    std::string input = "<style name=\"foo.bar\" parent=\"\"/>";
-    ASSERT_TRUE(testParse(input));
+TEST_F(ResourceParserTest,
+       ParseStyleWithInferredParentOverridenByEmptyParentAttribute) {
+  std::string input = "<style name=\"foo.bar\" parent=\"\"/>";
+  ASSERT_TRUE(testParse(input));
 
-    Style* style = test::getValue<Style>(&mTable, "style/foo.bar");
-    ASSERT_NE(nullptr, style);
-    AAPT_EXPECT_FALSE(style->parent);
-    EXPECT_FALSE(style->parentInferred);
+  Style* style = test::getValue<Style>(&mTable, "style/foo.bar");
+  ASSERT_NE(nullptr, style);
+  AAPT_EXPECT_FALSE(style->parent);
+  EXPECT_FALSE(style->parentInferred);
 }
 
 TEST_F(ResourceParserTest, ParseStyleWithPrivateParentReference) {
-    std::string input = R"EOF(<style name="foo" parent="*android:style/bar" />)EOF";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      R"EOF(<style name="foo" parent="*android:style/bar" />)EOF";
+  ASSERT_TRUE(testParse(input));
 
-    Style* style = test::getValue<Style>(&mTable, "style/foo");
-    ASSERT_NE(nullptr, style);
-    AAPT_ASSERT_TRUE(style->parent);
-    EXPECT_TRUE(style->parent.value().privateReference);
+  Style* style = test::getValue<Style>(&mTable, "style/foo");
+  ASSERT_NE(nullptr, style);
+  AAPT_ASSERT_TRUE(style->parent);
+  EXPECT_TRUE(style->parent.value().privateReference);
 }
 
 TEST_F(ResourceParserTest, ParseAutoGeneratedIdReference) {
-    std::string input = "<string name=\"foo\">@+id/bar</string>";
-    ASSERT_TRUE(testParse(input));
+  std::string input = "<string name=\"foo\">@+id/bar</string>";
+  ASSERT_TRUE(testParse(input));
 
-    Id* id = test::getValue<Id>(&mTable, "id/bar");
-    ASSERT_NE(id, nullptr);
+  Id* id = test::getValue<Id>(&mTable, "id/bar");
+  ASSERT_NE(id, nullptr);
 }
 
 TEST_F(ResourceParserTest, ParseAttributesDeclareStyleable) {
-    std::string input = "<declare-styleable name=\"foo\">\n"
-                        "  <attr name=\"bar\" />\n"
-                        "  <attr name=\"bat\" format=\"string|reference\"/>\n"
-                        "  <attr name=\"baz\">\n"
-                        "    <enum name=\"foo\" value=\"1\"/>\n"
-                        "  </attr>\n"
-                        "</declare-styleable>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<declare-styleable name=\"foo\">\n"
+      "  <attr name=\"bar\" />\n"
+      "  <attr name=\"bat\" format=\"string|reference\"/>\n"
+      "  <attr name=\"baz\">\n"
+      "    <enum name=\"foo\" value=\"1\"/>\n"
+      "  </attr>\n"
+      "</declare-styleable>";
+  ASSERT_TRUE(testParse(input));
 
-    Maybe<ResourceTable::SearchResult> result =
-            mTable.findResource(test::parseNameOrDie("styleable/foo"));
-    AAPT_ASSERT_TRUE(result);
-    EXPECT_EQ(SymbolState::kPublic, result.value().entry->symbolStatus.state);
+  Maybe<ResourceTable::SearchResult> result =
+      mTable.findResource(test::parseNameOrDie("styleable/foo"));
+  AAPT_ASSERT_TRUE(result);
+  EXPECT_EQ(SymbolState::kPublic, result.value().entry->symbolStatus.state);
 
-    Attribute* attr = test::getValue<Attribute>(&mTable, "attr/bar");
-    ASSERT_NE(attr, nullptr);
-    EXPECT_TRUE(attr->isWeak());
+  Attribute* attr = test::getValue<Attribute>(&mTable, "attr/bar");
+  ASSERT_NE(attr, nullptr);
+  EXPECT_TRUE(attr->isWeak());
 
-    attr = test::getValue<Attribute>(&mTable, "attr/bat");
-    ASSERT_NE(attr, nullptr);
-    EXPECT_TRUE(attr->isWeak());
+  attr = test::getValue<Attribute>(&mTable, "attr/bat");
+  ASSERT_NE(attr, nullptr);
+  EXPECT_TRUE(attr->isWeak());
 
-    attr = test::getValue<Attribute>(&mTable, "attr/baz");
-    ASSERT_NE(attr, nullptr);
-    EXPECT_TRUE(attr->isWeak());
-    EXPECT_EQ(1u, attr->symbols.size());
+  attr = test::getValue<Attribute>(&mTable, "attr/baz");
+  ASSERT_NE(attr, nullptr);
+  EXPECT_TRUE(attr->isWeak());
+  EXPECT_EQ(1u, attr->symbols.size());
 
-    EXPECT_NE(nullptr, test::getValue<Id>(&mTable, "id/foo"));
+  EXPECT_NE(nullptr, test::getValue<Id>(&mTable, "id/foo"));
 
-    Styleable* styleable = test::getValue<Styleable>(&mTable, "styleable/foo");
-    ASSERT_NE(styleable, nullptr);
-    ASSERT_EQ(3u, styleable->entries.size());
+  Styleable* styleable = test::getValue<Styleable>(&mTable, "styleable/foo");
+  ASSERT_NE(styleable, nullptr);
+  ASSERT_EQ(3u, styleable->entries.size());
 
-    EXPECT_EQ(test::parseNameOrDie("attr/bar"), styleable->entries[0].name.value());
-    EXPECT_EQ(test::parseNameOrDie("attr/bat"), styleable->entries[1].name.value());
+  EXPECT_EQ(test::parseNameOrDie("attr/bar"),
+            styleable->entries[0].name.value());
+  EXPECT_EQ(test::parseNameOrDie("attr/bat"),
+            styleable->entries[1].name.value());
 }
 
 TEST_F(ResourceParserTest, ParsePrivateAttributesDeclareStyleable) {
-    std::string input = "<declare-styleable name=\"foo\" xmlns:privAndroid=\"http://schemas.android.com/apk/prv/res/android\">\n"
-                        "  <attr name=\"*android:bar\" />\n"
-                        "  <attr name=\"privAndroid:bat\" />\n"
-                        "</declare-styleable>";
-    ASSERT_TRUE(testParse(input));
-    Styleable* styleable = test::getValue<Styleable>(&mTable, "styleable/foo");
-    ASSERT_NE(nullptr, styleable);
-    ASSERT_EQ(2u, styleable->entries.size());
+  std::string input =
+      "<declare-styleable name=\"foo\" "
+      "xmlns:privAndroid=\"http://schemas.android.com/apk/prv/res/android\">\n"
+      "  <attr name=\"*android:bar\" />\n"
+      "  <attr name=\"privAndroid:bat\" />\n"
+      "</declare-styleable>";
+  ASSERT_TRUE(testParse(input));
+  Styleable* styleable = test::getValue<Styleable>(&mTable, "styleable/foo");
+  ASSERT_NE(nullptr, styleable);
+  ASSERT_EQ(2u, styleable->entries.size());
 
-    EXPECT_TRUE(styleable->entries[0].privateReference);
-    AAPT_ASSERT_TRUE(styleable->entries[0].name);
-    EXPECT_EQ(std::string("android"), styleable->entries[0].name.value().package);
+  EXPECT_TRUE(styleable->entries[0].privateReference);
+  AAPT_ASSERT_TRUE(styleable->entries[0].name);
+  EXPECT_EQ(std::string("android"), styleable->entries[0].name.value().package);
 
-    EXPECT_TRUE(styleable->entries[1].privateReference);
-    AAPT_ASSERT_TRUE(styleable->entries[1].name);
-    EXPECT_EQ(std::string("android"), styleable->entries[1].name.value().package);
+  EXPECT_TRUE(styleable->entries[1].privateReference);
+  AAPT_ASSERT_TRUE(styleable->entries[1].name);
+  EXPECT_EQ(std::string("android"), styleable->entries[1].name.value().package);
 }
 
 TEST_F(ResourceParserTest, ParseArray) {
-    std::string input = "<array name=\"foo\">\n"
-                        "  <item>@string/ref</item>\n"
-                        "  <item>hey</item>\n"
-                        "  <item>23</item>\n"
-                        "</array>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<array name=\"foo\">\n"
+      "  <item>@string/ref</item>\n"
+      "  <item>hey</item>\n"
+      "  <item>23</item>\n"
+      "</array>";
+  ASSERT_TRUE(testParse(input));
 
-    Array* array = test::getValue<Array>(&mTable, "array/foo");
-    ASSERT_NE(array, nullptr);
-    ASSERT_EQ(3u, array->items.size());
+  Array* array = test::getValue<Array>(&mTable, "array/foo");
+  ASSERT_NE(array, nullptr);
+  ASSERT_EQ(3u, array->items.size());
 
-    EXPECT_NE(nullptr, valueCast<Reference>(array->items[0].get()));
-    EXPECT_NE(nullptr, valueCast<String>(array->items[1].get()));
-    EXPECT_NE(nullptr, valueCast<BinaryPrimitive>(array->items[2].get()));
+  EXPECT_NE(nullptr, valueCast<Reference>(array->items[0].get()));
+  EXPECT_NE(nullptr, valueCast<String>(array->items[1].get()));
+  EXPECT_NE(nullptr, valueCast<BinaryPrimitive>(array->items[2].get()));
 }
 
 TEST_F(ResourceParserTest, ParseStringArray) {
-    std::string input = "<string-array name=\"foo\">\n"
-                        "  <item>\"Werk\"</item>\n"
-                        "</string-array>\n";
-    ASSERT_TRUE(testParse(input));
-    EXPECT_NE(nullptr, test::getValue<Array>(&mTable, "array/foo"));
+  std::string input =
+      "<string-array name=\"foo\">\n"
+      "  <item>\"Werk\"</item>\n"
+      "</string-array>\n";
+  ASSERT_TRUE(testParse(input));
+  EXPECT_NE(nullptr, test::getValue<Array>(&mTable, "array/foo"));
 }
 
 TEST_F(ResourceParserTest, ParsePlural) {
-    std::string input = "<plurals name=\"foo\">\n"
-                        "  <item quantity=\"other\">apples</item>\n"
-                        "  <item quantity=\"one\">apple</item>\n"
-                        "</plurals>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<plurals name=\"foo\">\n"
+      "  <item quantity=\"other\">apples</item>\n"
+      "  <item quantity=\"one\">apple</item>\n"
+      "</plurals>";
+  ASSERT_TRUE(testParse(input));
 }
 
 TEST_F(ResourceParserTest, ParseCommentsWithResource) {
-    std::string input = "<!--This is a comment-->\n"
-                        "<string name=\"foo\">Hi</string>";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      "<!--This is a comment-->\n"
+      "<string name=\"foo\">Hi</string>";
+  ASSERT_TRUE(testParse(input));
 
-    String* value = test::getValue<String>(&mTable, "string/foo");
-    ASSERT_NE(nullptr, value);
-    EXPECT_EQ(value->getComment(), "This is a comment");
+  String* value = test::getValue<String>(&mTable, "string/foo");
+  ASSERT_NE(nullptr, value);
+  EXPECT_EQ(value->getComment(), "This is a comment");
 }
 
 TEST_F(ResourceParserTest, DoNotCombineMultipleComments) {
-    std::string input = "<!--One-->\n"
-                        "<!--Two-->\n"
-                        "<string name=\"foo\">Hi</string>";
+  std::string input =
+      "<!--One-->\n"
+      "<!--Two-->\n"
+      "<string name=\"foo\">Hi</string>";
 
-    ASSERT_TRUE(testParse(input));
+  ASSERT_TRUE(testParse(input));
 
-    String* value = test::getValue<String>(&mTable, "string/foo");
-    ASSERT_NE(nullptr, value);
-    EXPECT_EQ(value->getComment(), "Two");
+  String* value = test::getValue<String>(&mTable, "string/foo");
+  ASSERT_NE(nullptr, value);
+  EXPECT_EQ(value->getComment(), "Two");
 }
 
 TEST_F(ResourceParserTest, IgnoreCommentBeforeEndTag) {
-    std::string input = "<!--One-->\n"
-                        "<string name=\"foo\">\n"
-                        "  Hi\n"
-                        "<!--Two-->\n"
-                        "</string>";
+  std::string input =
+      "<!--One-->\n"
+      "<string name=\"foo\">\n"
+      "  Hi\n"
+      "<!--Two-->\n"
+      "</string>";
 
-    ASSERT_TRUE(testParse(input));
+  ASSERT_TRUE(testParse(input));
 
-    String* value = test::getValue<String>(&mTable, "string/foo");
-    ASSERT_NE(nullptr, value);
-    EXPECT_EQ(value->getComment(), "One");
+  String* value = test::getValue<String>(&mTable, "string/foo");
+  ASSERT_NE(nullptr, value);
+  EXPECT_EQ(value->getComment(), "One");
 }
 
 TEST_F(ResourceParserTest, ParseNestedComments) {
-    // We only care about declare-styleable and enum/flag attributes because comments
-    // from those end up in R.java
-    std::string input = R"EOF(
+  // We only care about declare-styleable and enum/flag attributes because
+  // comments
+  // from those end up in R.java
+  std::string input = R"EOF(
         <declare-styleable name="foo">
           <!-- The name of the bar -->
           <attr name="barName" format="string|reference" />
@@ -541,19 +588,21 @@
           <!-- The very first -->
           <enum name="one" value="1" />
         </attr>)EOF";
-    ASSERT_TRUE(testParse(input));
+  ASSERT_TRUE(testParse(input));
 
-    Styleable* styleable = test::getValue<Styleable>(&mTable, "styleable/foo");
-    ASSERT_NE(nullptr, styleable);
-    ASSERT_EQ(1u, styleable->entries.size());
+  Styleable* styleable = test::getValue<Styleable>(&mTable, "styleable/foo");
+  ASSERT_NE(nullptr, styleable);
+  ASSERT_EQ(1u, styleable->entries.size());
 
-    EXPECT_EQ(StringPiece("The name of the bar"), styleable->entries.front().getComment());
+  EXPECT_EQ(StringPiece("The name of the bar"),
+            styleable->entries.front().getComment());
 
-    Attribute* attr = test::getValue<Attribute>(&mTable, "attr/foo");
-    ASSERT_NE(nullptr, attr);
-    ASSERT_EQ(1u, attr->symbols.size());
+  Attribute* attr = test::getValue<Attribute>(&mTable, "attr/foo");
+  ASSERT_NE(nullptr, attr);
+  ASSERT_EQ(1u, attr->symbols.size());
 
-    EXPECT_EQ(StringPiece("The very first"), attr->symbols.front().symbol.getComment());
+  EXPECT_EQ(StringPiece("The very first"),
+            attr->symbols.front().symbol.getComment());
 }
 
 /*
@@ -561,15 +610,15 @@
  * (as an ID has no value).
  */
 TEST_F(ResourceParserTest, ParsePublicIdAsDefinition) {
-    std::string input = "<public type=\"id\" name=\"foo\"/>";
-    ASSERT_TRUE(testParse(input));
+  std::string input = "<public type=\"id\" name=\"foo\"/>";
+  ASSERT_TRUE(testParse(input));
 
-    Id* id = test::getValue<Id>(&mTable, "id/foo");
-    ASSERT_NE(nullptr, id);
+  Id* id = test::getValue<Id>(&mTable, "id/foo");
+  ASSERT_NE(nullptr, id);
 }
 
 TEST_F(ResourceParserTest, KeepAllProducts) {
-    std::string input = R"EOF(
+  std::string input = R"EOF(
         <string name="foo" product="phone">hi</string>
         <string name="foo" product="no-sdcard">ho</string>
         <string name="bar" product="">wee</string>
@@ -577,88 +626,92 @@
         <string name="bit" product="phablet">hoot</string>
         <string name="bot" product="default">yes</string>
     )EOF";
-    ASSERT_TRUE(testParse(input));
+  ASSERT_TRUE(testParse(input));
 
-    EXPECT_NE(nullptr, test::getValueForConfigAndProduct<String>(&mTable, "string/foo",
-                                                                 ConfigDescription::defaultConfig(),
-                                                                 "phone"));
-    EXPECT_NE(nullptr, test::getValueForConfigAndProduct<String>(&mTable, "string/foo",
-                                                                 ConfigDescription::defaultConfig(),
-                                                                 "no-sdcard"));
-    EXPECT_NE(nullptr, test::getValueForConfigAndProduct<String>(&mTable, "string/bar",
-                                                                 ConfigDescription::defaultConfig(),
-                                                                 ""));
-    EXPECT_NE(nullptr, test::getValueForConfigAndProduct<String>(&mTable, "string/baz",
-                                                                 ConfigDescription::defaultConfig(),
-                                                                 ""));
-    EXPECT_NE(nullptr, test::getValueForConfigAndProduct<String>(&mTable, "string/bit",
-                                                                 ConfigDescription::defaultConfig(),
-                                                                 "phablet"));
-    EXPECT_NE(nullptr, test::getValueForConfigAndProduct<String>(&mTable, "string/bot",
-                                                                 ConfigDescription::defaultConfig(),
-                                                                 "default"));
+  EXPECT_NE(nullptr, test::getValueForConfigAndProduct<String>(
+                         &mTable, "string/foo",
+                         ConfigDescription::defaultConfig(), "phone"));
+  EXPECT_NE(nullptr, test::getValueForConfigAndProduct<String>(
+                         &mTable, "string/foo",
+                         ConfigDescription::defaultConfig(), "no-sdcard"));
+  EXPECT_NE(nullptr,
+            test::getValueForConfigAndProduct<String>(
+                &mTable, "string/bar", ConfigDescription::defaultConfig(), ""));
+  EXPECT_NE(nullptr,
+            test::getValueForConfigAndProduct<String>(
+                &mTable, "string/baz", ConfigDescription::defaultConfig(), ""));
+  EXPECT_NE(nullptr, test::getValueForConfigAndProduct<String>(
+                         &mTable, "string/bit",
+                         ConfigDescription::defaultConfig(), "phablet"));
+  EXPECT_NE(nullptr, test::getValueForConfigAndProduct<String>(
+                         &mTable, "string/bot",
+                         ConfigDescription::defaultConfig(), "default"));
 }
 
 TEST_F(ResourceParserTest, AutoIncrementIdsInPublicGroup) {
-    std::string input = R"EOF(
+  std::string input = R"EOF(
     <public-group type="attr" first-id="0x01010040">
       <public name="foo" />
       <public name="bar" />
     </public-group>)EOF";
-    ASSERT_TRUE(testParse(input));
+  ASSERT_TRUE(testParse(input));
 
-    Maybe<ResourceTable::SearchResult> result = mTable.findResource(
-            test::parseNameOrDie("attr/foo"));
-    AAPT_ASSERT_TRUE(result);
+  Maybe<ResourceTable::SearchResult> result =
+      mTable.findResource(test::parseNameOrDie("attr/foo"));
+  AAPT_ASSERT_TRUE(result);
 
-    AAPT_ASSERT_TRUE(result.value().package->id);
-    AAPT_ASSERT_TRUE(result.value().type->id);
-    AAPT_ASSERT_TRUE(result.value().entry->id);
-    ResourceId actualId(result.value().package->id.value(),
+  AAPT_ASSERT_TRUE(result.value().package->id);
+  AAPT_ASSERT_TRUE(result.value().type->id);
+  AAPT_ASSERT_TRUE(result.value().entry->id);
+  ResourceId actualId(result.value().package->id.value(),
+                      result.value().type->id.value(),
+                      result.value().entry->id.value());
+  EXPECT_EQ(ResourceId(0x01010040), actualId);
+
+  result = mTable.findResource(test::parseNameOrDie("attr/bar"));
+  AAPT_ASSERT_TRUE(result);
+
+  AAPT_ASSERT_TRUE(result.value().package->id);
+  AAPT_ASSERT_TRUE(result.value().type->id);
+  AAPT_ASSERT_TRUE(result.value().entry->id);
+  actualId = ResourceId(result.value().package->id.value(),
                         result.value().type->id.value(),
                         result.value().entry->id.value());
-    EXPECT_EQ(ResourceId(0x01010040), actualId);
-
-    result = mTable.findResource(test::parseNameOrDie("attr/bar"));
-    AAPT_ASSERT_TRUE(result);
-
-    AAPT_ASSERT_TRUE(result.value().package->id);
-    AAPT_ASSERT_TRUE(result.value().type->id);
-    AAPT_ASSERT_TRUE(result.value().entry->id);
-    actualId = ResourceId(result.value().package->id.value(),
-                          result.value().type->id.value(),
-                          result.value().entry->id.value());
-    EXPECT_EQ(ResourceId(0x01010041), actualId);
+  EXPECT_EQ(ResourceId(0x01010041), actualId);
 }
 
 TEST_F(ResourceParserTest, ExternalTypesShouldOnlyBeReferences) {
-    std::string input = R"EOF(<item type="layout" name="foo">@layout/bar</item>)EOF";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      R"EOF(<item type="layout" name="foo">@layout/bar</item>)EOF";
+  ASSERT_TRUE(testParse(input));
 
-    input = R"EOF(<item type="layout" name="bar">"this is a string"</item>)EOF";
-    ASSERT_FALSE(testParse(input));
+  input = R"EOF(<item type="layout" name="bar">"this is a string"</item>)EOF";
+  ASSERT_FALSE(testParse(input));
 }
 
-TEST_F(ResourceParserTest, AddResourcesElementShouldAddEntryWithUndefinedSymbol) {
-    std::string input = R"EOF(<add-resource name="bar" type="string" />)EOF";
-    ASSERT_TRUE(testParse(input));
+TEST_F(ResourceParserTest,
+       AddResourcesElementShouldAddEntryWithUndefinedSymbol) {
+  std::string input = R"EOF(<add-resource name="bar" type="string" />)EOF";
+  ASSERT_TRUE(testParse(input));
 
-    Maybe<ResourceTable::SearchResult> result = mTable.findResource(
-            test::parseNameOrDie("string/bar"));
-    AAPT_ASSERT_TRUE(result);
-    const ResourceEntry* entry = result.value().entry;
-    ASSERT_NE(nullptr, entry);
-    EXPECT_EQ(SymbolState::kUndefined, entry->symbolStatus.state);
+  Maybe<ResourceTable::SearchResult> result =
+      mTable.findResource(test::parseNameOrDie("string/bar"));
+  AAPT_ASSERT_TRUE(result);
+  const ResourceEntry* entry = result.value().entry;
+  ASSERT_NE(nullptr, entry);
+  EXPECT_EQ(SymbolState::kUndefined, entry->symbolStatus.state);
 }
 
 TEST_F(ResourceParserTest, ParseItemElementWithFormat) {
-    std::string input = R"EOF(<item name="foo" type="integer" format="float">0.3</item>)EOF";
-    ASSERT_TRUE(testParse(input));
+  std::string input =
+      R"EOF(<item name="foo" type="integer" format="float">0.3</item>)EOF";
+  ASSERT_TRUE(testParse(input));
 
-    BinaryPrimitive* val = test::getValue<BinaryPrimitive>(&mTable, "integer/foo");
-    ASSERT_NE(nullptr, val);
+  BinaryPrimitive* val =
+      test::getValue<BinaryPrimitive>(&mTable, "integer/foo");
+  ASSERT_NE(nullptr, val);
 
-    EXPECT_EQ(uint32_t(android::Res_value::TYPE_FLOAT), val->value.dataType);
+  EXPECT_EQ(uint32_t(android::Res_value::TYPE_FLOAT), val->value.dataType);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/ResourceTable.cpp b/tools/aapt2/ResourceTable.cpp
index bdc6a8c..c52c91c 100644
--- a/tools/aapt2/ResourceTable.cpp
+++ b/tools/aapt2/ResourceTable.cpp
@@ -14,266 +14,282 @@
  * limitations under the License.
  */
 
+#include "ResourceTable.h"
 #include "ConfigDescription.h"
 #include "NameMangler.h"
-#include "ResourceTable.h"
 #include "ResourceValues.h"
 #include "ValueVisitor.h"
 #include "util/Util.h"
 
-#include <algorithm>
 #include <androidfw/ResourceTypes.h>
+#include <algorithm>
 #include <memory>
 #include <string>
 #include <tuple>
 
 namespace aapt {
 
-static bool lessThanType(const std::unique_ptr<ResourceTableType>& lhs, ResourceType rhs) {
-    return lhs->type < rhs;
+static bool lessThanType(const std::unique_ptr<ResourceTableType>& lhs,
+                         ResourceType rhs) {
+  return lhs->type < rhs;
 }
 
 template <typename T>
 static bool lessThanStructWithName(const std::unique_ptr<T>& lhs,
                                    const StringPiece& rhs) {
-    return lhs->name.compare(0, lhs->name.size(), rhs.data(), rhs.size()) < 0;
+  return lhs->name.compare(0, lhs->name.size(), rhs.data(), rhs.size()) < 0;
 }
 
 ResourceTablePackage* ResourceTable::findPackage(const StringPiece& name) {
-    const auto last = packages.end();
-    auto iter = std::lower_bound(packages.begin(), last, name,
-                                 lessThanStructWithName<ResourceTablePackage>);
-    if (iter != last && name == (*iter)->name) {
-        return iter->get();
-    }
-    return nullptr;
+  const auto last = packages.end();
+  auto iter = std::lower_bound(packages.begin(), last, name,
+                               lessThanStructWithName<ResourceTablePackage>);
+  if (iter != last && name == (*iter)->name) {
+    return iter->get();
+  }
+  return nullptr;
 }
 
 ResourceTablePackage* ResourceTable::findPackageById(uint8_t id) {
-    for (auto& package : packages) {
-        if (package->id && package->id.value() == id) {
-            return package.get();
-        }
+  for (auto& package : packages) {
+    if (package->id && package->id.value() == id) {
+      return package.get();
     }
-    return nullptr;
+  }
+  return nullptr;
 }
 
-ResourceTablePackage* ResourceTable::createPackage(const StringPiece& name, Maybe<uint8_t> id) {
-    ResourceTablePackage* package = findOrCreatePackage(name);
-    if (id && !package->id) {
-        package->id = id;
-        return package;
-    }
-
-    if (id && package->id && package->id.value() != id.value()) {
-        return nullptr;
-    }
+ResourceTablePackage* ResourceTable::createPackage(const StringPiece& name,
+                                                   Maybe<uint8_t> id) {
+  ResourceTablePackage* package = findOrCreatePackage(name);
+  if (id && !package->id) {
+    package->id = id;
     return package;
+  }
+
+  if (id && package->id && package->id.value() != id.value()) {
+    return nullptr;
+  }
+  return package;
 }
 
-ResourceTablePackage* ResourceTable::findOrCreatePackage(const StringPiece& name) {
-    const auto last = packages.end();
-    auto iter = std::lower_bound(packages.begin(), last, name,
-                                 lessThanStructWithName<ResourceTablePackage>);
-    if (iter != last && name == (*iter)->name) {
-        return iter->get();
-    }
+ResourceTablePackage* ResourceTable::findOrCreatePackage(
+    const StringPiece& name) {
+  const auto last = packages.end();
+  auto iter = std::lower_bound(packages.begin(), last, name,
+                               lessThanStructWithName<ResourceTablePackage>);
+  if (iter != last && name == (*iter)->name) {
+    return iter->get();
+  }
 
-    std::unique_ptr<ResourceTablePackage> newPackage = util::make_unique<ResourceTablePackage>();
-    newPackage->name = name.toString();
-    return packages.emplace(iter, std::move(newPackage))->get();
+  std::unique_ptr<ResourceTablePackage> newPackage =
+      util::make_unique<ResourceTablePackage>();
+  newPackage->name = name.toString();
+  return packages.emplace(iter, std::move(newPackage))->get();
 }
 
 ResourceTableType* ResourceTablePackage::findType(ResourceType type) {
-    const auto last = types.end();
-    auto iter = std::lower_bound(types.begin(), last, type, lessThanType);
-    if (iter != last && (*iter)->type == type) {
-        return iter->get();
-    }
-    return nullptr;
+  const auto last = types.end();
+  auto iter = std::lower_bound(types.begin(), last, type, lessThanType);
+  if (iter != last && (*iter)->type == type) {
+    return iter->get();
+  }
+  return nullptr;
 }
 
 ResourceTableType* ResourceTablePackage::findOrCreateType(ResourceType type) {
-    const auto last = types.end();
-    auto iter = std::lower_bound(types.begin(), last, type, lessThanType);
-    if (iter != last && (*iter)->type == type) {
-        return iter->get();
-    }
-    return types.emplace(iter, new ResourceTableType(type))->get();
+  const auto last = types.end();
+  auto iter = std::lower_bound(types.begin(), last, type, lessThanType);
+  if (iter != last && (*iter)->type == type) {
+    return iter->get();
+  }
+  return types.emplace(iter, new ResourceTableType(type))->get();
 }
 
 ResourceEntry* ResourceTableType::findEntry(const StringPiece& name) {
-    const auto last = entries.end();
-    auto iter = std::lower_bound(entries.begin(), last, name,
-                                 lessThanStructWithName<ResourceEntry>);
-    if (iter != last && name == (*iter)->name) {
-        return iter->get();
-    }
-    return nullptr;
+  const auto last = entries.end();
+  auto iter = std::lower_bound(entries.begin(), last, name,
+                               lessThanStructWithName<ResourceEntry>);
+  if (iter != last && name == (*iter)->name) {
+    return iter->get();
+  }
+  return nullptr;
 }
 
 ResourceEntry* ResourceTableType::findOrCreateEntry(const StringPiece& name) {
-    auto last = entries.end();
-    auto iter = std::lower_bound(entries.begin(), last, name,
-                                 lessThanStructWithName<ResourceEntry>);
-    if (iter != last && name == (*iter)->name) {
-        return iter->get();
-    }
-    return entries.emplace(iter, new ResourceEntry(name))->get();
+  auto last = entries.end();
+  auto iter = std::lower_bound(entries.begin(), last, name,
+                               lessThanStructWithName<ResourceEntry>);
+  if (iter != last && name == (*iter)->name) {
+    return iter->get();
+  }
+  return entries.emplace(iter, new ResourceEntry(name))->get();
 }
 
 ResourceConfigValue* ResourceEntry::findValue(const ConfigDescription& config) {
-    return findValue(config, StringPiece());
+  return findValue(config, StringPiece());
 }
 
 struct ConfigKey {
-    const ConfigDescription* config;
-    const StringPiece& product;
+  const ConfigDescription* config;
+  const StringPiece& product;
 };
 
-bool ltConfigKeyRef(const std::unique_ptr<ResourceConfigValue>& lhs, const ConfigKey& rhs) {
-    int cmp = lhs->config.compare(*rhs.config);
-    if (cmp == 0) {
-        cmp = StringPiece(lhs->product).compare(rhs.product);
-    }
-    return cmp < 0;
+bool ltConfigKeyRef(const std::unique_ptr<ResourceConfigValue>& lhs,
+                    const ConfigKey& rhs) {
+  int cmp = lhs->config.compare(*rhs.config);
+  if (cmp == 0) {
+    cmp = StringPiece(lhs->product).compare(rhs.product);
+  }
+  return cmp < 0;
 }
 
 ResourceConfigValue* ResourceEntry::findValue(const ConfigDescription& config,
                                               const StringPiece& product) {
-    auto iter = std::lower_bound(values.begin(), values.end(),
-                                 ConfigKey{ &config, product }, ltConfigKeyRef);
-    if (iter != values.end()) {
-        ResourceConfigValue* value = iter->get();
-        if (value->config == config && StringPiece(value->product) == product) {
-            return value;
-        }
+  auto iter = std::lower_bound(values.begin(), values.end(),
+                               ConfigKey{&config, product}, ltConfigKeyRef);
+  if (iter != values.end()) {
+    ResourceConfigValue* value = iter->get();
+    if (value->config == config && StringPiece(value->product) == product) {
+      return value;
     }
-    return nullptr;
+  }
+  return nullptr;
 }
 
-ResourceConfigValue* ResourceEntry::findOrCreateValue(const ConfigDescription& config,
-                                                      const StringPiece& product) {
-    auto iter = std::lower_bound(values.begin(), values.end(),
-                                 ConfigKey{ &config, product }, ltConfigKeyRef);
-    if (iter != values.end()) {
-        ResourceConfigValue* value = iter->get();
-        if (value->config == config && StringPiece(value->product) == product) {
-            return value;
-        }
+ResourceConfigValue* ResourceEntry::findOrCreateValue(
+    const ConfigDescription& config, const StringPiece& product) {
+  auto iter = std::lower_bound(values.begin(), values.end(),
+                               ConfigKey{&config, product}, ltConfigKeyRef);
+  if (iter != values.end()) {
+    ResourceConfigValue* value = iter->get();
+    if (value->config == config && StringPiece(value->product) == product) {
+      return value;
     }
-    ResourceConfigValue* newValue = values.insert(
-            iter, util::make_unique<ResourceConfigValue>(config, product))->get();
-    return newValue;
+  }
+  ResourceConfigValue* newValue =
+      values
+          .insert(iter, util::make_unique<ResourceConfigValue>(config, product))
+          ->get();
+  return newValue;
 }
 
-std::vector<ResourceConfigValue*> ResourceEntry::findAllValues(const ConfigDescription& config) {
-    std::vector<ResourceConfigValue*> results;
+std::vector<ResourceConfigValue*> ResourceEntry::findAllValues(
+    const ConfigDescription& config) {
+  std::vector<ResourceConfigValue*> results;
 
-    auto iter = values.begin();
-    for (; iter != values.end(); ++iter) {
-        ResourceConfigValue* value = iter->get();
-        if (value->config == config) {
-            results.push_back(value);
-            ++iter;
-            break;
-        }
+  auto iter = values.begin();
+  for (; iter != values.end(); ++iter) {
+    ResourceConfigValue* value = iter->get();
+    if (value->config == config) {
+      results.push_back(value);
+      ++iter;
+      break;
     }
+  }
 
-    for (; iter != values.end(); ++iter) {
-        ResourceConfigValue* value = iter->get();
-        if (value->config == config) {
-            results.push_back(value);
-        }
+  for (; iter != values.end(); ++iter) {
+    ResourceConfigValue* value = iter->get();
+    if (value->config == config) {
+      results.push_back(value);
     }
-    return results;
+  }
+  return results;
 }
 
 std::vector<ResourceConfigValue*> ResourceEntry::findValuesIf(
-        const std::function<bool(ResourceConfigValue*)>& f) {
-    std::vector<ResourceConfigValue*> results;
-    for (auto& configValue : values) {
-        if (f(configValue.get())) {
-            results.push_back(configValue.get());
-        }
+    const std::function<bool(ResourceConfigValue*)>& f) {
+  std::vector<ResourceConfigValue*> results;
+  for (auto& configValue : values) {
+    if (f(configValue.get())) {
+      results.push_back(configValue.get());
     }
-    return results;
+  }
+  return results;
 }
 
 /**
  * The default handler for collisions.
  *
- * Typically, a weak value will be overridden by a strong value. An existing weak
+ * Typically, a weak value will be overridden by a strong value. An existing
+ * weak
  * value will not be overridden by an incoming weak value.
  *
  * There are some exceptions:
  *
  * Attributes: There are two types of Attribute values: USE and DECL.
  *
- * USE is anywhere an Attribute is declared without a format, and in a place that would
+ * USE is anywhere an Attribute is declared without a format, and in a place
+ * that would
  * be legal to declare if the Attribute already existed. This is typically in a
- * <declare-styleable> tag. Attributes defined in a <declare-styleable> are also weak.
+ * <declare-styleable> tag. Attributes defined in a <declare-styleable> are also
+ * weak.
  *
- * DECL is an absolute declaration of an Attribute and specifies an explicit format.
+ * DECL is an absolute declaration of an Attribute and specifies an explicit
+ * format.
  *
- * A DECL will override a USE without error. Two DECLs must match in their format for there to be
+ * A DECL will override a USE without error. Two DECLs must match in their
+ * format for there to be
  * no error.
  */
 ResourceTable::CollisionResult ResourceTable::resolveValueCollision(
-        Value* existing, Value* incoming) {
-    Attribute* existingAttr = valueCast<Attribute>(existing);
-    Attribute* incomingAttr = valueCast<Attribute>(incoming);
-    if (!incomingAttr) {
-        if (incoming->isWeak()) {
-            // We're trying to add a weak resource but a resource
-            // already exists. Keep the existing.
-            return CollisionResult::kKeepOriginal;
-        } else if (existing->isWeak()) {
-            // Override the weak resource with the new strong resource.
-            return CollisionResult::kTakeNew;
-        }
-        // The existing and incoming values are strong, this is an error
-        // if the values are not both attributes.
-        return CollisionResult::kConflict;
+    Value* existing, Value* incoming) {
+  Attribute* existingAttr = valueCast<Attribute>(existing);
+  Attribute* incomingAttr = valueCast<Attribute>(incoming);
+  if (!incomingAttr) {
+    if (incoming->isWeak()) {
+      // We're trying to add a weak resource but a resource
+      // already exists. Keep the existing.
+      return CollisionResult::kKeepOriginal;
+    } else if (existing->isWeak()) {
+      // Override the weak resource with the new strong resource.
+      return CollisionResult::kTakeNew;
     }
-
-    if (!existingAttr) {
-        if (existing->isWeak()) {
-            // The existing value is not an attribute and it is weak,
-            // so take the incoming attribute value.
-            return CollisionResult::kTakeNew;
-        }
-        // The existing value is not an attribute and it is strong,
-        // so the incoming attribute value is an error.
-        return CollisionResult::kConflict;
-    }
-
-    assert(incomingAttr && existingAttr);
-
-    //
-    // Attribute specific handling. At this point we know both
-    // values are attributes. Since we can declare and define
-    // attributes all-over, we do special handling to see
-    // which definition sticks.
-    //
-    if (existingAttr->typeMask == incomingAttr->typeMask) {
-        // The two attributes are both DECLs, but they are plain attributes
-        // with the same formats.
-        // Keep the strongest one.
-        return existingAttr->isWeak() ? CollisionResult::kTakeNew : CollisionResult::kKeepOriginal;
-    }
-
-    if (existingAttr->isWeak() && existingAttr->typeMask == android::ResTable_map::TYPE_ANY) {
-        // Any incoming attribute is better than this.
-        return CollisionResult::kTakeNew;
-    }
-
-    if (incomingAttr->isWeak() && incomingAttr->typeMask == android::ResTable_map::TYPE_ANY) {
-        // The incoming attribute may be a USE instead of a DECL.
-        // Keep the existing attribute.
-        return CollisionResult::kKeepOriginal;
-    }
+    // The existing and incoming values are strong, this is an error
+    // if the values are not both attributes.
     return CollisionResult::kConflict;
+  }
+
+  if (!existingAttr) {
+    if (existing->isWeak()) {
+      // The existing value is not an attribute and it is weak,
+      // so take the incoming attribute value.
+      return CollisionResult::kTakeNew;
+    }
+    // The existing value is not an attribute and it is strong,
+    // so the incoming attribute value is an error.
+    return CollisionResult::kConflict;
+  }
+
+  assert(incomingAttr && existingAttr);
+
+  //
+  // Attribute specific handling. At this point we know both
+  // values are attributes. Since we can declare and define
+  // attributes all-over, we do special handling to see
+  // which definition sticks.
+  //
+  if (existingAttr->typeMask == incomingAttr->typeMask) {
+    // The two attributes are both DECLs, but they are plain attributes
+    // with the same formats.
+    // Keep the strongest one.
+    return existingAttr->isWeak() ? CollisionResult::kTakeNew
+                                  : CollisionResult::kKeepOriginal;
+  }
+
+  if (existingAttr->isWeak() &&
+      existingAttr->typeMask == android::ResTable_map::TYPE_ANY) {
+    // Any incoming attribute is better than this.
+    return CollisionResult::kTakeNew;
+  }
+
+  if (incomingAttr->isWeak() &&
+      incomingAttr->typeMask == android::ResTable_map::TYPE_ANY) {
+    // The incoming attribute may be a USE instead of a DECL.
+    // Keep the existing attribute.
+    return CollisionResult::kKeepOriginal;
+  }
+  return CollisionResult::kConflict;
 }
 
 static constexpr const char* kValidNameChars = "._-";
@@ -284,8 +300,8 @@
                                 const StringPiece& product,
                                 std::unique_ptr<Value> value,
                                 IDiagnostics* diag) {
-    return addResourceImpl(name, {}, config, product, std::move(value), kValidNameChars,
-                           resolveValueCollision, diag);
+  return addResourceImpl(name, {}, config, product, std::move(value),
+                         kValidNameChars, resolveValueCollision, diag);
 }
 
 bool ResourceTable::addResource(const ResourceNameRef& name,
@@ -294,8 +310,8 @@
                                 const StringPiece& product,
                                 std::unique_ptr<Value> value,
                                 IDiagnostics* diag) {
-    return addResourceImpl(name, resId, config, product, std::move(value), kValidNameChars,
-                           resolveValueCollision, diag);
+  return addResourceImpl(name, resId, config, product, std::move(value),
+                         kValidNameChars, resolveValueCollision, diag);
 }
 
 bool ResourceTable::addFileReference(const ResourceNameRef& name,
@@ -303,31 +319,29 @@
                                      const Source& source,
                                      const StringPiece& path,
                                      IDiagnostics* diag) {
-    return addFileReferenceImpl(name, config, source, path, nullptr, kValidNameChars, diag);
+  return addFileReferenceImpl(name, config, source, path, nullptr,
+                              kValidNameChars, diag);
 }
 
-bool ResourceTable::addFileReferenceAllowMangled(const ResourceNameRef& name,
-                                                 const ConfigDescription& config,
-                                                 const Source& source,
-                                                 const StringPiece& path,
-                                                 io::IFile* file,
-                                                 IDiagnostics* diag) {
-    return addFileReferenceImpl(name, config, source, path, file, kValidNameMangledChars, diag);
+bool ResourceTable::addFileReferenceAllowMangled(
+    const ResourceNameRef& name, const ConfigDescription& config,
+    const Source& source, const StringPiece& path, io::IFile* file,
+    IDiagnostics* diag) {
+  return addFileReferenceImpl(name, config, source, path, file,
+                              kValidNameMangledChars, diag);
 }
 
-bool ResourceTable::addFileReferenceImpl(const ResourceNameRef& name,
-                                         const ConfigDescription& config,
-                                         const Source& source,
-                                         const StringPiece& path,
-                                         io::IFile* file,
-                                         const char* validChars,
-                                         IDiagnostics* diag) {
-    std::unique_ptr<FileReference> fileRef = util::make_unique<FileReference>(
-            stringPool.makeRef(path));
-    fileRef->setSource(source);
-    fileRef->file = file;
-    return addResourceImpl(name, ResourceId{}, config, StringPiece{}, std::move(fileRef),
-                           validChars, resolveValueCollision, diag);
+bool ResourceTable::addFileReferenceImpl(
+    const ResourceNameRef& name, const ConfigDescription& config,
+    const Source& source, const StringPiece& path, io::IFile* file,
+    const char* validChars, IDiagnostics* diag) {
+  std::unique_ptr<FileReference> fileRef =
+      util::make_unique<FileReference>(stringPool.makeRef(path));
+  fileRef->setSource(source);
+  fileRef->file = file;
+  return addResourceImpl(name, ResourceId{}, config, StringPiece{},
+                         std::move(fileRef), validChars, resolveValueCollision,
+                         diag);
 }
 
 bool ResourceTable::addResourceAllowMangled(const ResourceNameRef& name,
@@ -335,8 +349,8 @@
                                             const StringPiece& product,
                                             std::unique_ptr<Value> value,
                                             IDiagnostics* diag) {
-    return addResourceImpl(name, ResourceId{}, config, product, std::move(value),
-                           kValidNameMangledChars, resolveValueCollision, diag);
+  return addResourceImpl(name, ResourceId{}, config, product, std::move(value),
+                         kValidNameMangledChars, resolveValueCollision, diag);
 }
 
 bool ResourceTable::addResourceAllowMangled(const ResourceNameRef& name,
@@ -345,220 +359,193 @@
                                             const StringPiece& product,
                                             std::unique_ptr<Value> value,
                                             IDiagnostics* diag) {
-    return addResourceImpl(name, id, config, product, std::move(value), kValidNameMangledChars,
-                           resolveValueCollision, diag);
+  return addResourceImpl(name, id, config, product, std::move(value),
+                         kValidNameMangledChars, resolveValueCollision, diag);
 }
 
-bool ResourceTable::addResourceImpl(const ResourceNameRef& name,
-                                    const ResourceId& resId,
-                                    const ConfigDescription& config,
-                                    const StringPiece& product,
-                                    std::unique_ptr<Value> value,
-                                    const char* validChars,
-                                    const CollisionResolverFunc& conflictResolver,
-                                    IDiagnostics* diag) {
-    assert(value && "value can't be nullptr");
-    assert(diag && "diagnostics can't be nullptr");
+bool ResourceTable::addResourceImpl(
+    const ResourceNameRef& name, const ResourceId& resId,
+    const ConfigDescription& config, const StringPiece& product,
+    std::unique_ptr<Value> value, const char* validChars,
+    const CollisionResolverFunc& conflictResolver, IDiagnostics* diag) {
+  assert(value && "value can't be nullptr");
+  assert(diag && "diagnostics can't be nullptr");
 
-    auto badCharIter = util::findNonAlphaNumericAndNotInSet(name.entry, validChars);
-    if (badCharIter != name.entry.end()) {
-        diag->error(DiagMessage(value->getSource())
-                    << "resource '"
-                    << name
-                    << "' has invalid entry name '"
-                    << name.entry
-                    << "'. Invalid character '"
-                    << StringPiece(badCharIter, 1)
-                    << "'");
-        return false;
-    }
+  auto badCharIter =
+      util::findNonAlphaNumericAndNotInSet(name.entry, validChars);
+  if (badCharIter != name.entry.end()) {
+    diag->error(DiagMessage(value->getSource())
+                << "resource '" << name << "' has invalid entry name '"
+                << name.entry << "'. Invalid character '"
+                << StringPiece(badCharIter, 1) << "'");
+    return false;
+  }
 
-    ResourceTablePackage* package = findOrCreatePackage(name.package);
-    if (resId.isValid() && package->id && package->id.value() != resId.packageId()) {
-        diag->error(DiagMessage(value->getSource())
-                    << "trying to add resource '"
-                    << name
-                    << "' with ID "
-                    << resId
-                    << " but package '"
-                    << package->name
-                    << "' already has ID "
-                    << std::hex << (int) package->id.value() << std::dec);
-        return false;
-    }
+  ResourceTablePackage* package = findOrCreatePackage(name.package);
+  if (resId.isValid() && package->id &&
+      package->id.value() != resId.packageId()) {
+    diag->error(DiagMessage(value->getSource())
+                << "trying to add resource '" << name << "' with ID " << resId
+                << " but package '" << package->name << "' already has ID "
+                << std::hex << (int)package->id.value() << std::dec);
+    return false;
+  }
 
-    ResourceTableType* type = package->findOrCreateType(name.type);
-    if (resId.isValid() && type->id && type->id.value() != resId.typeId()) {
-        diag->error(DiagMessage(value->getSource())
-                    << "trying to add resource '"
-                    << name
-                    << "' with ID "
-                    << resId
-                    << " but type '"
-                    << type->type
-                    << "' already has ID "
-                    << std::hex << (int) type->id.value() << std::dec);
-        return false;
-    }
+  ResourceTableType* type = package->findOrCreateType(name.type);
+  if (resId.isValid() && type->id && type->id.value() != resId.typeId()) {
+    diag->error(DiagMessage(value->getSource())
+                << "trying to add resource '" << name << "' with ID " << resId
+                << " but type '" << type->type << "' already has ID "
+                << std::hex << (int)type->id.value() << std::dec);
+    return false;
+  }
 
-    ResourceEntry* entry = type->findOrCreateEntry(name.entry);
-    if (resId.isValid() && entry->id && entry->id.value() != resId.entryId()) {
-        diag->error(DiagMessage(value->getSource())
-                    << "trying to add resource '"
-                    << name
-                    << "' with ID "
-                    << resId
-                    << " but resource already has ID "
-                    << ResourceId(package->id.value(), type->id.value(), entry->id.value()));
-        return false;
-    }
+  ResourceEntry* entry = type->findOrCreateEntry(name.entry);
+  if (resId.isValid() && entry->id && entry->id.value() != resId.entryId()) {
+    diag->error(DiagMessage(value->getSource())
+                << "trying to add resource '" << name << "' with ID " << resId
+                << " but resource already has ID "
+                << ResourceId(package->id.value(), type->id.value(),
+                              entry->id.value()));
+    return false;
+  }
 
-    ResourceConfigValue* configValue = entry->findOrCreateValue(config, product);
-    if (!configValue->value) {
-        // Resource does not exist, add it now.
+  ResourceConfigValue* configValue = entry->findOrCreateValue(config, product);
+  if (!configValue->value) {
+    // Resource does not exist, add it now.
+    configValue->value = std::move(value);
+
+  } else {
+    switch (conflictResolver(configValue->value.get(), value.get())) {
+      case CollisionResult::kTakeNew:
+        // Take the incoming value.
         configValue->value = std::move(value);
+        break;
 
-    } else {
-        switch (conflictResolver(configValue->value.get(), value.get())) {
-        case CollisionResult::kTakeNew:
-            // Take the incoming value.
-            configValue->value = std::move(value);
-            break;
+      case CollisionResult::kConflict:
+        diag->error(DiagMessage(value->getSource())
+                    << "duplicate value for resource '" << name << "' "
+                    << "with config '" << config << "'");
+        diag->error(DiagMessage(configValue->value->getSource())
+                    << "resource previously defined here");
+        return false;
 
-        case CollisionResult::kConflict:
-            diag->error(DiagMessage(value->getSource())
-                                    << "duplicate value for resource '" << name << "' "
-                                    << "with config '" << config << "'");
-            diag->error(DiagMessage(configValue->value->getSource())
-                                    << "resource previously defined here");
-            return false;
-
-        case CollisionResult::kKeepOriginal:
-            break;
-        }
+      case CollisionResult::kKeepOriginal:
+        break;
     }
+  }
 
-    if (resId.isValid()) {
-        package->id = resId.packageId();
-        type->id = resId.typeId();
-        entry->id = resId.entryId();
-    }
-    return true;
+  if (resId.isValid()) {
+    package->id = resId.packageId();
+    type->id = resId.typeId();
+    entry->id = resId.entryId();
+  }
+  return true;
 }
 
-bool ResourceTable::setSymbolState(const ResourceNameRef& name, const ResourceId& resId,
+bool ResourceTable::setSymbolState(const ResourceNameRef& name,
+                                   const ResourceId& resId,
                                    const Symbol& symbol, IDiagnostics* diag) {
-    return setSymbolStateImpl(name, resId, symbol, kValidNameChars, diag);
+  return setSymbolStateImpl(name, resId, symbol, kValidNameChars, diag);
 }
 
 bool ResourceTable::setSymbolStateAllowMangled(const ResourceNameRef& name,
                                                const ResourceId& resId,
-                                               const Symbol& symbol, IDiagnostics* diag) {
-    return setSymbolStateImpl(name, resId, symbol, kValidNameMangledChars, diag);
+                                               const Symbol& symbol,
+                                               IDiagnostics* diag) {
+  return setSymbolStateImpl(name, resId, symbol, kValidNameMangledChars, diag);
 }
 
-bool ResourceTable::setSymbolStateImpl(const ResourceNameRef& name, const ResourceId& resId,
-                                       const Symbol& symbol, const char* validChars,
+bool ResourceTable::setSymbolStateImpl(const ResourceNameRef& name,
+                                       const ResourceId& resId,
+                                       const Symbol& symbol,
+                                       const char* validChars,
                                        IDiagnostics* diag) {
-    assert(diag && "diagnostics can't be nullptr");
+  assert(diag && "diagnostics can't be nullptr");
 
-    auto badCharIter = util::findNonAlphaNumericAndNotInSet(name.entry, validChars);
-    if (badCharIter != name.entry.end()) {
-        diag->error(DiagMessage(symbol.source)
-                    << "resource '"
-                    << name
-                    << "' has invalid entry name '"
-                    << name.entry
-                    << "'. Invalid character '"
-                    << StringPiece(badCharIter, 1)
-                    << "'");
-        return false;
-    }
+  auto badCharIter =
+      util::findNonAlphaNumericAndNotInSet(name.entry, validChars);
+  if (badCharIter != name.entry.end()) {
+    diag->error(DiagMessage(symbol.source)
+                << "resource '" << name << "' has invalid entry name '"
+                << name.entry << "'. Invalid character '"
+                << StringPiece(badCharIter, 1) << "'");
+    return false;
+  }
 
-    ResourceTablePackage* package = findOrCreatePackage(name.package);
-    if (resId.isValid() && package->id && package->id.value() != resId.packageId()) {
-        diag->error(DiagMessage(symbol.source)
-                    << "trying to add resource '"
-                    << name
-                    << "' with ID "
-                    << resId
-                    << " but package '"
-                    << package->name
-                    << "' already has ID "
-                    << std::hex << (int) package->id.value() << std::dec);
-        return false;
-    }
+  ResourceTablePackage* package = findOrCreatePackage(name.package);
+  if (resId.isValid() && package->id &&
+      package->id.value() != resId.packageId()) {
+    diag->error(DiagMessage(symbol.source)
+                << "trying to add resource '" << name << "' with ID " << resId
+                << " but package '" << package->name << "' already has ID "
+                << std::hex << (int)package->id.value() << std::dec);
+    return false;
+  }
 
-    ResourceTableType* type = package->findOrCreateType(name.type);
-    if (resId.isValid() && type->id && type->id.value() != resId.typeId()) {
-        diag->error(DiagMessage(symbol.source)
-                    << "trying to add resource '"
-                    << name
-                    << "' with ID "
-                    << resId
-                    << " but type '"
-                    << type->type
-                    << "' already has ID "
-                    << std::hex << (int) type->id.value() << std::dec);
-        return false;
-    }
+  ResourceTableType* type = package->findOrCreateType(name.type);
+  if (resId.isValid() && type->id && type->id.value() != resId.typeId()) {
+    diag->error(DiagMessage(symbol.source)
+                << "trying to add resource '" << name << "' with ID " << resId
+                << " but type '" << type->type << "' already has ID "
+                << std::hex << (int)type->id.value() << std::dec);
+    return false;
+  }
 
-    ResourceEntry* entry = type->findOrCreateEntry(name.entry);
-    if (resId.isValid() && entry->id && entry->id.value() != resId.entryId()) {
-        diag->error(DiagMessage(symbol.source)
-                    << "trying to add resource '"
-                    << name
-                    << "' with ID "
-                    << resId
-                    << " but resource already has ID "
-                    << ResourceId(package->id.value(), type->id.value(), entry->id.value()));
-        return false;
-    }
+  ResourceEntry* entry = type->findOrCreateEntry(name.entry);
+  if (resId.isValid() && entry->id && entry->id.value() != resId.entryId()) {
+    diag->error(DiagMessage(symbol.source)
+                << "trying to add resource '" << name << "' with ID " << resId
+                << " but resource already has ID "
+                << ResourceId(package->id.value(), type->id.value(),
+                              entry->id.value()));
+    return false;
+  }
 
-    if (resId.isValid()) {
-        package->id = resId.packageId();
-        type->id = resId.typeId();
-        entry->id = resId.entryId();
-    }
+  if (resId.isValid()) {
+    package->id = resId.packageId();
+    type->id = resId.typeId();
+    entry->id = resId.entryId();
+  }
 
-    // Only mark the type state as public, it doesn't care about being private.
-    if (symbol.state == SymbolState::kPublic) {
-        type->symbolStatus.state = SymbolState::kPublic;
-    }
+  // Only mark the type state as public, it doesn't care about being private.
+  if (symbol.state == SymbolState::kPublic) {
+    type->symbolStatus.state = SymbolState::kPublic;
+  }
 
-    if (symbol.state == SymbolState::kUndefined &&
-            entry->symbolStatus.state != SymbolState::kUndefined) {
-        // We can't undefine a symbol (remove its visibility). Ignore.
-        return true;
-    }
-
-    if (symbol.state == SymbolState::kPrivate &&
-            entry->symbolStatus.state == SymbolState::kPublic) {
-        // We can't downgrade public to private. Ignore.
-        return true;
-    }
-
-    entry->symbolStatus = std::move(symbol);
+  if (symbol.state == SymbolState::kUndefined &&
+      entry->symbolStatus.state != SymbolState::kUndefined) {
+    // We can't undefine a symbol (remove its visibility). Ignore.
     return true;
+  }
+
+  if (symbol.state == SymbolState::kPrivate &&
+      entry->symbolStatus.state == SymbolState::kPublic) {
+    // We can't downgrade public to private. Ignore.
+    return true;
+  }
+
+  entry->symbolStatus = std::move(symbol);
+  return true;
 }
 
-Maybe<ResourceTable::SearchResult>
-ResourceTable::findResource(const ResourceNameRef& name) {
-    ResourceTablePackage* package = findPackage(name.package);
-    if (!package) {
-        return {};
-    }
+Maybe<ResourceTable::SearchResult> ResourceTable::findResource(
+    const ResourceNameRef& name) {
+  ResourceTablePackage* package = findPackage(name.package);
+  if (!package) {
+    return {};
+  }
 
-    ResourceTableType* type = package->findType(name.type);
-    if (!type) {
-        return {};
-    }
+  ResourceTableType* type = package->findType(name.type);
+  if (!type) {
+    return {};
+  }
 
-    ResourceEntry* entry = type->findEntry(name.entry);
-    if (!entry) {
-        return {};
-    }
-    return SearchResult{ package, type, entry };
+  ResourceEntry* entry = type->findEntry(name.entry);
+  if (!entry) {
+    return {};
+  }
+  return SearchResult{package, type, entry};
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/ResourceTable.h b/tools/aapt2/ResourceTable.h
index 6c246d0..ebaad41 100644
--- a/tools/aapt2/ResourceTable.h
+++ b/tools/aapt2/ResourceTable.h
@@ -37,42 +37,43 @@
 namespace aapt {
 
 enum class SymbolState {
-    kUndefined,
-    kPrivate,
-    kPublic,
+  kUndefined,
+  kPrivate,
+  kPublic,
 };
 
 /**
  * The Public status of a resource.
  */
 struct Symbol {
-    SymbolState state = SymbolState::kUndefined;
-    Source source;
-    std::string comment;
+  SymbolState state = SymbolState::kUndefined;
+  Source source;
+  std::string comment;
 };
 
 class ResourceConfigValue {
-public:
-    /**
-     * The configuration for which this value is defined.
-     */
-    const ConfigDescription config;
+ public:
+  /**
+   * The configuration for which this value is defined.
+   */
+  const ConfigDescription config;
 
-    /**
-     * The product for which this value is defined.
-     */
-    const std::string product;
+  /**
+   * The product for which this value is defined.
+   */
+  const std::string product;
 
-    /**
-     * The actual Value.
-     */
-    std::unique_ptr<Value> value;
+  /**
+   * The actual Value.
+   */
+  std::unique_ptr<Value> value;
 
-    ResourceConfigValue(const ConfigDescription& config, const StringPiece& product) :
-            config(config), product(product.toString()) { }
+  ResourceConfigValue(const ConfigDescription& config,
+                      const StringPiece& product)
+      : config(config), product(product.toString()) {}
 
-private:
-    DISALLOW_COPY_AND_ASSIGN(ResourceConfigValue);
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ResourceConfigValue);
 };
 
 /**
@@ -80,42 +81,44 @@
  * varying values for each defined configuration.
  */
 class ResourceEntry {
-public:
-    /**
-     * The name of the resource. Immutable, as
-     * this determines the order of this resource
-     * when doing lookups.
-     */
-    const std::string name;
+ public:
+  /**
+   * The name of the resource. Immutable, as
+   * this determines the order of this resource
+   * when doing lookups.
+   */
+  const std::string name;
 
-    /**
-     * The entry ID for this resource.
-     */
-    Maybe<uint16_t> id;
+  /**
+   * The entry ID for this resource.
+   */
+  Maybe<uint16_t> id;
 
-    /**
-     * Whether this resource is public (and must maintain the same entry ID across builds).
-     */
-    Symbol symbolStatus;
+  /**
+   * Whether this resource is public (and must maintain the same entry ID across
+   * builds).
+   */
+  Symbol symbolStatus;
 
-    /**
-     * The resource's values for each configuration.
-     */
-    std::vector<std::unique_ptr<ResourceConfigValue>> values;
+  /**
+   * The resource's values for each configuration.
+   */
+  std::vector<std::unique_ptr<ResourceConfigValue>> values;
 
-    explicit ResourceEntry(const StringPiece& name) : name(name.toString()) { }
+  explicit ResourceEntry(const StringPiece& name) : name(name.toString()) {}
 
-    ResourceConfigValue* findValue(const ConfigDescription& config);
-    ResourceConfigValue* findValue(const ConfigDescription& config, const StringPiece& product);
-    ResourceConfigValue* findOrCreateValue(const ConfigDescription& config,
-                                           const StringPiece& product);
-    std::vector<ResourceConfigValue*> findAllValues(const ConfigDescription& config);
-    std::vector<ResourceConfigValue*> findValuesIf(
-            const std::function<bool(ResourceConfigValue*)>& f);
+  ResourceConfigValue* findValue(const ConfigDescription& config);
+  ResourceConfigValue* findValue(const ConfigDescription& config,
+                                 const StringPiece& product);
+  ResourceConfigValue* findOrCreateValue(const ConfigDescription& config,
+                                         const StringPiece& product);
+  std::vector<ResourceConfigValue*> findAllValues(
+      const ConfigDescription& config);
+  std::vector<ResourceConfigValue*> findValuesIf(
+      const std::function<bool(ResourceConfigValue*)>& f);
 
-
-private:
-    DISALLOW_COPY_AND_ASSIGN(ResourceEntry);
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ResourceEntry);
 };
 
 /**
@@ -123,58 +126,53 @@
  * for this type.
  */
 class ResourceTableType {
-public:
-    /**
-     * The logical type of resource (string, drawable, layout, etc.).
-     */
-    const ResourceType type;
+ public:
+  /**
+   * The logical type of resource (string, drawable, layout, etc.).
+   */
+  const ResourceType type;
 
-    /**
-     * The type ID for this resource.
-     */
-    Maybe<uint8_t> id;
+  /**
+   * The type ID for this resource.
+   */
+  Maybe<uint8_t> id;
 
-    /**
-     * Whether this type is public (and must maintain the same
-     * type ID across builds).
-     */
-    Symbol symbolStatus;
+  /**
+   * Whether this type is public (and must maintain the same
+   * type ID across builds).
+   */
+  Symbol symbolStatus;
 
-    /**
-     * List of resources for this type.
-     */
-    std::vector<std::unique_ptr<ResourceEntry>> entries;
+  /**
+   * List of resources for this type.
+   */
+  std::vector<std::unique_ptr<ResourceEntry>> entries;
 
-    explicit ResourceTableType(const ResourceType type) : type(type) { }
+  explicit ResourceTableType(const ResourceType type) : type(type) {}
 
-    ResourceEntry* findEntry(const StringPiece& name);
-    ResourceEntry* findOrCreateEntry(const StringPiece& name);
+  ResourceEntry* findEntry(const StringPiece& name);
+  ResourceEntry* findOrCreateEntry(const StringPiece& name);
 
-private:
-    DISALLOW_COPY_AND_ASSIGN(ResourceTableType);
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ResourceTableType);
 };
 
-enum class PackageType {
-    System,
-    Vendor,
-    App,
-    Dynamic
-};
+enum class PackageType { System, Vendor, App, Dynamic };
 
 class ResourceTablePackage {
-public:
-    PackageType type = PackageType::App;
-    Maybe<uint8_t> id;
-    std::string name;
+ public:
+  PackageType type = PackageType::App;
+  Maybe<uint8_t> id;
+  std::string name;
 
-    std::vector<std::unique_ptr<ResourceTableType>> types;
+  std::vector<std::unique_ptr<ResourceTableType>> types;
 
-    ResourceTablePackage() = default;
-    ResourceTableType* findType(ResourceType type);
-    ResourceTableType* findOrCreateType(const ResourceType type);
+  ResourceTablePackage() = default;
+  ResourceTableType* findType(ResourceType type);
+  ResourceTableType* findOrCreateType(const ResourceType type);
 
-private:
-    DISALLOW_COPY_AND_ASSIGN(ResourceTablePackage);
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ResourceTablePackage);
 };
 
 /**
@@ -182,140 +180,129 @@
  * flattened into a binary resource table (resources.arsc).
  */
 class ResourceTable {
-public:
-    ResourceTable() = default;
+ public:
+  ResourceTable() = default;
 
-    enum class CollisionResult {
-        kKeepOriginal,
-        kConflict,
-        kTakeNew
-    };
+  enum class CollisionResult { kKeepOriginal, kConflict, kTakeNew };
 
-    using CollisionResolverFunc = std::function<CollisionResult(Value*, Value*)>;
+  using CollisionResolverFunc = std::function<CollisionResult(Value*, Value*)>;
 
-    /**
-     * When a collision of resources occurs, this method decides which value to keep.
-     */
-    static CollisionResult resolveValueCollision(Value* existing, Value* incoming);
+  /**
+   * When a collision of resources occurs, this method decides which value to
+   * keep.
+   */
+  static CollisionResult resolveValueCollision(Value* existing,
+                                               Value* incoming);
 
-    bool addResource(const ResourceNameRef& name,
-                     const ConfigDescription& config,
-                     const StringPiece& product,
-                     std::unique_ptr<Value> value,
-                     IDiagnostics* diag);
+  bool addResource(const ResourceNameRef& name, const ConfigDescription& config,
+                   const StringPiece& product, std::unique_ptr<Value> value,
+                   IDiagnostics* diag);
 
-    bool addResource(const ResourceNameRef& name,
-                     const ResourceId& resId,
-                     const ConfigDescription& config,
-                     const StringPiece& product,
-                     std::unique_ptr<Value> value,
-                     IDiagnostics* diag);
+  bool addResource(const ResourceNameRef& name, const ResourceId& resId,
+                   const ConfigDescription& config, const StringPiece& product,
+                   std::unique_ptr<Value> value, IDiagnostics* diag);
 
-    bool addFileReference(const ResourceNameRef& name,
-                              const ConfigDescription& config,
-                              const Source& source,
-                              const StringPiece& path,
-                              IDiagnostics* diag);
+  bool addFileReference(const ResourceNameRef& name,
+                        const ConfigDescription& config, const Source& source,
+                        const StringPiece& path, IDiagnostics* diag);
 
-    bool addFileReferenceAllowMangled(const ResourceNameRef& name,
-                                      const ConfigDescription& config,
-                                      const Source& source,
-                                      const StringPiece& path,
-                                      io::IFile* file,
-                                      IDiagnostics* diag);
-
-    /**
-     * Same as addResource, but doesn't verify the validity of the name. This is used
-     * when loading resources from an existing binary resource table that may have mangled
-     * names.
-     */
-    bool addResourceAllowMangled(const ResourceNameRef& name,
-                                 const ConfigDescription& config,
-                                 const StringPiece& product,
-                                 std::unique_ptr<Value> value,
-                                 IDiagnostics* diag);
-
-    bool addResourceAllowMangled(const ResourceNameRef& name,
-                                 const ResourceId& id,
-                                 const ConfigDescription& config,
-                                 const StringPiece& product,
-                                 std::unique_ptr<Value> value,
-                                 IDiagnostics* diag);
-
-    bool setSymbolState(const ResourceNameRef& name,
-                        const ResourceId& resId,
-                        const Symbol& symbol,
-                        IDiagnostics* diag);
-
-    bool setSymbolStateAllowMangled(const ResourceNameRef& name,
-                                    const ResourceId& resId,
-                                    const Symbol& symbol,
+  bool addFileReferenceAllowMangled(const ResourceNameRef& name,
+                                    const ConfigDescription& config,
+                                    const Source& source,
+                                    const StringPiece& path, io::IFile* file,
                                     IDiagnostics* diag);
 
-    struct SearchResult {
-        ResourceTablePackage* package;
-        ResourceTableType* type;
-        ResourceEntry* entry;
-    };
+  /**
+   * Same as addResource, but doesn't verify the validity of the name. This is
+   * used
+   * when loading resources from an existing binary resource table that may have
+   * mangled
+   * names.
+   */
+  bool addResourceAllowMangled(const ResourceNameRef& name,
+                               const ConfigDescription& config,
+                               const StringPiece& product,
+                               std::unique_ptr<Value> value,
+                               IDiagnostics* diag);
 
-    Maybe<SearchResult> findResource(const ResourceNameRef& name);
+  bool addResourceAllowMangled(const ResourceNameRef& name,
+                               const ResourceId& id,
+                               const ConfigDescription& config,
+                               const StringPiece& product,
+                               std::unique_ptr<Value> value,
+                               IDiagnostics* diag);
 
-    /**
-     * The string pool used by this resource table. Values that reference strings must use
-     * this pool to create their strings.
-     *
-     * NOTE: `stringPool` must come before `packages` so that it is destroyed after.
-     * When `string pool` references are destroyed (as they will be when `packages`
-     * is destroyed), they decrement a refCount, which would cause invalid
-     * memory access if the pool was already destroyed.
-     */
-    StringPool stringPool;
+  bool setSymbolState(const ResourceNameRef& name, const ResourceId& resId,
+                      const Symbol& symbol, IDiagnostics* diag);
 
-    /**
-     * The list of packages in this table, sorted alphabetically by package name.
-     */
-    std::vector<std::unique_ptr<ResourceTablePackage>> packages;
+  bool setSymbolStateAllowMangled(const ResourceNameRef& name,
+                                  const ResourceId& resId, const Symbol& symbol,
+                                  IDiagnostics* diag);
 
-    /**
-     * Returns the package struct with the given name, or nullptr if such a package does not
-     * exist. The empty string is a valid package and typically is used to represent the
-     * 'current' package before it is known to the ResourceTable.
-     */
-    ResourceTablePackage* findPackage(const StringPiece& name);
+  struct SearchResult {
+    ResourceTablePackage* package;
+    ResourceTableType* type;
+    ResourceEntry* entry;
+  };
 
-    ResourceTablePackage* findPackageById(uint8_t id);
+  Maybe<SearchResult> findResource(const ResourceNameRef& name);
 
-    ResourceTablePackage* createPackage(const StringPiece& name, Maybe<uint8_t> id = {});
+  /**
+   * The string pool used by this resource table. Values that reference strings
+   * must use
+   * this pool to create their strings.
+   *
+   * NOTE: `stringPool` must come before `packages` so that it is destroyed
+   * after.
+   * When `string pool` references are destroyed (as they will be when
+   * `packages`
+   * is destroyed), they decrement a refCount, which would cause invalid
+   * memory access if the pool was already destroyed.
+   */
+  StringPool stringPool;
 
-private:
-    ResourceTablePackage* findOrCreatePackage(const StringPiece& name);
+  /**
+   * The list of packages in this table, sorted alphabetically by package name.
+   */
+  std::vector<std::unique_ptr<ResourceTablePackage>> packages;
 
-    bool addResourceImpl(const ResourceNameRef& name,
-                         const ResourceId& resId,
-                         const ConfigDescription& config,
-                         const StringPiece& product,
-                         std::unique_ptr<Value> value,
-                         const char* validChars,
-                         const CollisionResolverFunc& conflictResolver,
-                         IDiagnostics* diag);
+  /**
+   * Returns the package struct with the given name, or nullptr if such a
+   * package does not
+   * exist. The empty string is a valid package and typically is used to
+   * represent the
+   * 'current' package before it is known to the ResourceTable.
+   */
+  ResourceTablePackage* findPackage(const StringPiece& name);
 
-    bool addFileReferenceImpl(const ResourceNameRef& name,
-                              const ConfigDescription& config,
-                              const Source& source,
-                              const StringPiece& path,
-                              io::IFile* file,
-                              const char* validChars,
-                              IDiagnostics* diag);
+  ResourceTablePackage* findPackageById(uint8_t id);
 
-    bool setSymbolStateImpl(const ResourceNameRef& name,
-                            const ResourceId& resId,
-                            const Symbol& symbol,
-                            const char* validChars,
+  ResourceTablePackage* createPackage(const StringPiece& name,
+                                      Maybe<uint8_t> id = {});
+
+ private:
+  ResourceTablePackage* findOrCreatePackage(const StringPiece& name);
+
+  bool addResourceImpl(const ResourceNameRef& name, const ResourceId& resId,
+                       const ConfigDescription& config,
+                       const StringPiece& product, std::unique_ptr<Value> value,
+                       const char* validChars,
+                       const CollisionResolverFunc& conflictResolver,
+                       IDiagnostics* diag);
+
+  bool addFileReferenceImpl(const ResourceNameRef& name,
+                            const ConfigDescription& config,
+                            const Source& source, const StringPiece& path,
+                            io::IFile* file, const char* validChars,
                             IDiagnostics* diag);
 
-    DISALLOW_COPY_AND_ASSIGN(ResourceTable);
+  bool setSymbolStateImpl(const ResourceNameRef& name, const ResourceId& resId,
+                          const Symbol& symbol, const char* validChars,
+                          IDiagnostics* diag);
+
+  DISALLOW_COPY_AND_ASSIGN(ResourceTable);
 };
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_RESOURCE_TABLE_H
+#endif  // AAPT_RESOURCE_TABLE_H
diff --git a/tools/aapt2/ResourceTable_test.cpp b/tools/aapt2/ResourceTable_test.cpp
index 4db40a6..a64ad3e 100644
--- a/tools/aapt2/ResourceTable_test.cpp
+++ b/tools/aapt2/ResourceTable_test.cpp
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-#include "Diagnostics.h"
 #include "ResourceTable.h"
+#include "Diagnostics.h"
 #include "ResourceValues.h"
 #include "test/Test.h"
 #include "util/Util.h"
@@ -27,124 +27,113 @@
 namespace aapt {
 
 TEST(ResourceTableTest, FailToAddResourceWithBadName) {
-    ResourceTable table;
+  ResourceTable table;
 
-    EXPECT_FALSE(table.addResource(
-            test::parseNameOrDie("android:id/hey,there"),
-            ConfigDescription{}, "",
-            test::ValueBuilder<Id>().setSource("test.xml", 21u).build(),
-            test::getDiagnostics()));
+  EXPECT_FALSE(table.addResource(
+      test::parseNameOrDie("android:id/hey,there"), ConfigDescription{}, "",
+      test::ValueBuilder<Id>().setSource("test.xml", 21u).build(),
+      test::getDiagnostics()));
 
-    EXPECT_FALSE(table.addResource(
-            test::parseNameOrDie("android:id/hey:there"),
-            ConfigDescription{}, "",
-            test::ValueBuilder<Id>().setSource("test.xml", 21u).build(),
-            test::getDiagnostics()));
+  EXPECT_FALSE(table.addResource(
+      test::parseNameOrDie("android:id/hey:there"), ConfigDescription{}, "",
+      test::ValueBuilder<Id>().setSource("test.xml", 21u).build(),
+      test::getDiagnostics()));
 }
 
 TEST(ResourceTableTest, AddOneResource) {
-    ResourceTable table;
+  ResourceTable table;
 
-    EXPECT_TRUE(table.addResource(
-            test::parseNameOrDie("android:attr/id"),
-            ConfigDescription{}, "",
-            test::ValueBuilder<Id>().setSource("test/path/file.xml", 23u).build(),
-            test::getDiagnostics()));
+  EXPECT_TRUE(table.addResource(
+      test::parseNameOrDie("android:attr/id"), ConfigDescription{}, "",
+      test::ValueBuilder<Id>().setSource("test/path/file.xml", 23u).build(),
+      test::getDiagnostics()));
 
-    ASSERT_NE(nullptr, test::getValue<Id>(&table, "android:attr/id"));
+  ASSERT_NE(nullptr, test::getValue<Id>(&table, "android:attr/id"));
 }
 
 TEST(ResourceTableTest, AddMultipleResources) {
-    ResourceTable table;
+  ResourceTable table;
 
-    ConfigDescription config;
-    ConfigDescription languageConfig;
-    memcpy(languageConfig.language, "pl", sizeof(languageConfig.language));
+  ConfigDescription config;
+  ConfigDescription languageConfig;
+  memcpy(languageConfig.language, "pl", sizeof(languageConfig.language));
 
-    EXPECT_TRUE(table.addResource(
-            test::parseNameOrDie("android:attr/layout_width"),
-            config, "",
-            test::ValueBuilder<Id>().setSource("test/path/file.xml", 10u).build(),
-            test::getDiagnostics()));
+  EXPECT_TRUE(table.addResource(
+      test::parseNameOrDie("android:attr/layout_width"), config, "",
+      test::ValueBuilder<Id>().setSource("test/path/file.xml", 10u).build(),
+      test::getDiagnostics()));
 
-    EXPECT_TRUE(table.addResource(
-            test::parseNameOrDie("android:attr/id"),
-            config, "",
-            test::ValueBuilder<Id>().setSource("test/path/file.xml", 12u).build(),
-            test::getDiagnostics()));
+  EXPECT_TRUE(table.addResource(
+      test::parseNameOrDie("android:attr/id"), config, "",
+      test::ValueBuilder<Id>().setSource("test/path/file.xml", 12u).build(),
+      test::getDiagnostics()));
 
-    EXPECT_TRUE(table.addResource(
-            test::parseNameOrDie("android:string/ok"),
-            config, "",
-            test::ValueBuilder<Id>().setSource("test/path/file.xml", 14u).build(),
-            test::getDiagnostics()));
+  EXPECT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/ok"), config, "",
+      test::ValueBuilder<Id>().setSource("test/path/file.xml", 14u).build(),
+      test::getDiagnostics()));
 
-    EXPECT_TRUE(table.addResource(
-            test::parseNameOrDie("android:string/ok"),
-            languageConfig, "",
-            test::ValueBuilder<BinaryPrimitive>(android::Res_value{})
-                    .setSource("test/path/file.xml", 20u)
-                    .build(),
-            test::getDiagnostics()));
+  EXPECT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/ok"), languageConfig, "",
+      test::ValueBuilder<BinaryPrimitive>(android::Res_value{})
+          .setSource("test/path/file.xml", 20u)
+          .build(),
+      test::getDiagnostics()));
 
-    ASSERT_NE(nullptr, test::getValue<Id>(&table, "android:attr/layout_width"));
-    ASSERT_NE(nullptr, test::getValue<Id>(&table, "android:attr/id"));
-    ASSERT_NE(nullptr, test::getValue<Id>(&table, "android:string/ok"));
-    ASSERT_NE(nullptr, test::getValueForConfig<BinaryPrimitive>(&table, "android:string/ok",
-                                                                languageConfig));
+  ASSERT_NE(nullptr, test::getValue<Id>(&table, "android:attr/layout_width"));
+  ASSERT_NE(nullptr, test::getValue<Id>(&table, "android:attr/id"));
+  ASSERT_NE(nullptr, test::getValue<Id>(&table, "android:string/ok"));
+  ASSERT_NE(nullptr, test::getValueForConfig<BinaryPrimitive>(
+                         &table, "android:string/ok", languageConfig));
 }
 
 TEST(ResourceTableTest, OverrideWeakResourceValue) {
-    ResourceTable table;
+  ResourceTable table;
 
-    ASSERT_TRUE(table.addResource(
-            test::parseNameOrDie("android:attr/foo"),
-            ConfigDescription{}, "",
-            util::make_unique<Attribute>(true),
-            test::getDiagnostics()));
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:attr/foo"), ConfigDescription{}, "",
+      util::make_unique<Attribute>(true), test::getDiagnostics()));
 
-    Attribute* attr = test::getValue<Attribute>(&table, "android:attr/foo");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_TRUE(attr->isWeak());
+  Attribute* attr = test::getValue<Attribute>(&table, "android:attr/foo");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_TRUE(attr->isWeak());
 
-    ASSERT_TRUE(table.addResource(
-            test::parseNameOrDie("android:attr/foo"),
-            ConfigDescription{}, "",
-            util::make_unique<Attribute>(false),
-            test::getDiagnostics()));
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:attr/foo"), ConfigDescription{}, "",
+      util::make_unique<Attribute>(false), test::getDiagnostics()));
 
-    attr = test::getValue<Attribute>(&table, "android:attr/foo");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_FALSE(attr->isWeak());
+  attr = test::getValue<Attribute>(&table, "android:attr/foo");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_FALSE(attr->isWeak());
 }
 
 TEST(ResourceTableTest, ProductVaryingValues) {
-    ResourceTable table;
+  ResourceTable table;
 
-    EXPECT_TRUE(table.addResource(test::parseNameOrDie("android:string/foo"),
-                                  test::parseConfigOrDie("land"), "tablet",
-                                  util::make_unique<Id>(),
-                                  test::getDiagnostics()));
-    EXPECT_TRUE(table.addResource(test::parseNameOrDie("android:string/foo"),
-                                  test::parseConfigOrDie("land"), "phone",
-                                  util::make_unique<Id>(),
-                                  test::getDiagnostics()));
+  EXPECT_TRUE(table.addResource(test::parseNameOrDie("android:string/foo"),
+                                test::parseConfigOrDie("land"), "tablet",
+                                util::make_unique<Id>(),
+                                test::getDiagnostics()));
+  EXPECT_TRUE(table.addResource(test::parseNameOrDie("android:string/foo"),
+                                test::parseConfigOrDie("land"), "phone",
+                                util::make_unique<Id>(),
+                                test::getDiagnostics()));
 
-    EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(&table, "android:string/foo",
-                                                             test::parseConfigOrDie("land"),
-                                                             "tablet"));
-    EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(&table, "android:string/foo",
-                                                             test::parseConfigOrDie("land"),
-                                                             "phone"));
+  EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(
+                         &table, "android:string/foo",
+                         test::parseConfigOrDie("land"), "tablet"));
+  EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(
+                         &table, "android:string/foo",
+                         test::parseConfigOrDie("land"), "phone"));
 
-    Maybe<ResourceTable::SearchResult> sr = table.findResource(
-            test::parseNameOrDie("android:string/foo"));
-    AAPT_ASSERT_TRUE(sr);
-    std::vector<ResourceConfigValue*> values = sr.value().entry->findAllValues(
-            test::parseConfigOrDie("land"));
-    ASSERT_EQ(2u, values.size());
-    EXPECT_EQ(std::string("phone"), values[0]->product);
-    EXPECT_EQ(std::string("tablet"), values[1]->product);
+  Maybe<ResourceTable::SearchResult> sr =
+      table.findResource(test::parseNameOrDie("android:string/foo"));
+  AAPT_ASSERT_TRUE(sr);
+  std::vector<ResourceConfigValue*> values =
+      sr.value().entry->findAllValues(test::parseConfigOrDie("land"));
+  ASSERT_EQ(2u, values.size());
+  EXPECT_EQ(std::string("phone"), values[0]->product);
+  EXPECT_EQ(std::string("tablet"), values[1]->product);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/ResourceUtils.cpp b/tools/aapt2/ResourceUtils.cpp
index 73a194e..b41be4b 100644
--- a/tools/aapt2/ResourceUtils.cpp
+++ b/tools/aapt2/ResourceUtils.cpp
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-#include "NameMangler.h"
 #include "ResourceUtils.h"
+#include "NameMangler.h"
 #include "SdkConstants.h"
 #include "flatten/ResourceTypeExtensions.h"
 #include "util/Files.h"
@@ -27,188 +27,196 @@
 namespace aapt {
 namespace ResourceUtils {
 
-Maybe<ResourceName> toResourceName(const android::ResTable::resource_name& nameIn) {
-    ResourceName nameOut;
-    if (!nameIn.package) {
-        return {};
-    }
+Maybe<ResourceName> toResourceName(
+    const android::ResTable::resource_name& nameIn) {
+  ResourceName nameOut;
+  if (!nameIn.package) {
+    return {};
+  }
 
-    nameOut.package = util::utf16ToUtf8(StringPiece16(nameIn.package, nameIn.packageLen));
+  nameOut.package =
+      util::utf16ToUtf8(StringPiece16(nameIn.package, nameIn.packageLen));
 
-    const ResourceType* type;
-    if (nameIn.type) {
-        type = parseResourceType(util::utf16ToUtf8(StringPiece16(nameIn.type, nameIn.typeLen)));
-    } else if (nameIn.type8) {
-        type = parseResourceType(StringPiece(nameIn.type8, nameIn.typeLen));
-    } else {
-        return {};
-    }
+  const ResourceType* type;
+  if (nameIn.type) {
+    type = parseResourceType(
+        util::utf16ToUtf8(StringPiece16(nameIn.type, nameIn.typeLen)));
+  } else if (nameIn.type8) {
+    type = parseResourceType(StringPiece(nameIn.type8, nameIn.typeLen));
+  } else {
+    return {};
+  }
 
-    if (!type) {
-        return {};
-    }
+  if (!type) {
+    return {};
+  }
 
-    nameOut.type = *type;
+  nameOut.type = *type;
 
-    if (nameIn.name) {
-        nameOut.entry = util::utf16ToUtf8(StringPiece16(nameIn.name, nameIn.nameLen));
-    } else if (nameIn.name8) {
-        nameOut.entry = StringPiece(nameIn.name8, nameIn.nameLen).toString();
-    } else {
-        return {};
-    }
-    return nameOut;
+  if (nameIn.name) {
+    nameOut.entry =
+        util::utf16ToUtf8(StringPiece16(nameIn.name, nameIn.nameLen));
+  } else if (nameIn.name8) {
+    nameOut.entry = StringPiece(nameIn.name8, nameIn.nameLen).toString();
+  } else {
+    return {};
+  }
+  return nameOut;
 }
 
 bool extractResourceName(const StringPiece& str, StringPiece* outPackage,
                          StringPiece* outType, StringPiece* outEntry) {
-    bool hasPackageSeparator = false;
-    bool hasTypeSeparator = false;
-    const char* start = str.data();
-    const char* end = start + str.size();
-    const char* current = start;
-    while (current != end) {
-        if (outType->size() == 0 && *current == '/') {
-            hasTypeSeparator = true;
-            outType->assign(start, current - start);
-            start = current + 1;
-        } else if (outPackage->size() == 0 && *current == ':') {
-            hasPackageSeparator = true;
-            outPackage->assign(start, current - start);
-            start = current + 1;
-        }
-        current++;
+  bool hasPackageSeparator = false;
+  bool hasTypeSeparator = false;
+  const char* start = str.data();
+  const char* end = start + str.size();
+  const char* current = start;
+  while (current != end) {
+    if (outType->size() == 0 && *current == '/') {
+      hasTypeSeparator = true;
+      outType->assign(start, current - start);
+      start = current + 1;
+    } else if (outPackage->size() == 0 && *current == ':') {
+      hasPackageSeparator = true;
+      outPackage->assign(start, current - start);
+      start = current + 1;
     }
-    outEntry->assign(start, end - start);
+    current++;
+  }
+  outEntry->assign(start, end - start);
 
-    return !(hasPackageSeparator && outPackage->empty()) && !(hasTypeSeparator && outType->empty());
+  return !(hasPackageSeparator && outPackage->empty()) &&
+         !(hasTypeSeparator && outType->empty());
 }
 
-bool parseResourceName(const StringPiece& str, ResourceNameRef* outRef, bool* outPrivate) {
-    if (str.empty()) {
-        return false;
+bool parseResourceName(const StringPiece& str, ResourceNameRef* outRef,
+                       bool* outPrivate) {
+  if (str.empty()) {
+    return false;
+  }
+
+  size_t offset = 0;
+  bool priv = false;
+  if (str.data()[0] == '*') {
+    priv = true;
+    offset = 1;
+  }
+
+  StringPiece package;
+  StringPiece type;
+  StringPiece entry;
+  if (!extractResourceName(str.substr(offset, str.size() - offset), &package,
+                           &type, &entry)) {
+    return false;
+  }
+
+  const ResourceType* parsedType = parseResourceType(type);
+  if (!parsedType) {
+    return false;
+  }
+
+  if (entry.empty()) {
+    return false;
+  }
+
+  if (outRef) {
+    outRef->package = package;
+    outRef->type = *parsedType;
+    outRef->entry = entry;
+  }
+
+  if (outPrivate) {
+    *outPrivate = priv;
+  }
+  return true;
+}
+
+bool parseReference(const StringPiece& str, ResourceNameRef* outRef,
+                    bool* outCreate, bool* outPrivate) {
+  StringPiece trimmedStr(util::trimWhitespace(str));
+  if (trimmedStr.empty()) {
+    return false;
+  }
+
+  bool create = false;
+  bool priv = false;
+  if (trimmedStr.data()[0] == '@') {
+    size_t offset = 1;
+    if (trimmedStr.data()[1] == '+') {
+      create = true;
+      offset += 1;
     }
 
-    size_t offset = 0;
-    bool priv = false;
-    if (str.data()[0] == '*') {
-        priv = true;
-        offset = 1;
+    ResourceNameRef name;
+    if (!parseResourceName(
+            trimmedStr.substr(offset, trimmedStr.size() - offset), &name,
+            &priv)) {
+      return false;
     }
 
-    StringPiece package;
-    StringPiece type;
-    StringPiece entry;
-    if (!extractResourceName(str.substr(offset, str.size() - offset), &package, &type, &entry)) {
-        return false;
+    if (create && priv) {
+      return false;
     }
 
-    const ResourceType* parsedType = parseResourceType(type);
-    if (!parsedType) {
-        return false;
-    }
-
-    if (entry.empty()) {
-        return false;
+    if (create && name.type != ResourceType::kId) {
+      return false;
     }
 
     if (outRef) {
-        outRef->package = package;
-        outRef->type = *parsedType;
-        outRef->entry = entry;
+      *outRef = name;
+    }
+
+    if (outCreate) {
+      *outCreate = create;
     }
 
     if (outPrivate) {
-        *outPrivate = priv;
+      *outPrivate = priv;
     }
     return true;
-}
-
-bool parseReference(const StringPiece& str, ResourceNameRef* outRef, bool* outCreate,
-                       bool* outPrivate) {
-    StringPiece trimmedStr(util::trimWhitespace(str));
-    if (trimmedStr.empty()) {
-        return false;
-    }
-
-    bool create = false;
-    bool priv = false;
-    if (trimmedStr.data()[0] == '@') {
-        size_t offset = 1;
-        if (trimmedStr.data()[1] == '+') {
-            create = true;
-            offset += 1;
-        }
-
-        ResourceNameRef name;
-        if (!parseResourceName(trimmedStr.substr(offset, trimmedStr.size() - offset),
-                               &name, &priv)) {
-            return false;
-        }
-
-        if (create && priv) {
-            return false;
-        }
-
-        if (create && name.type != ResourceType::kId) {
-            return false;
-        }
-
-        if (outRef) {
-            *outRef = name;
-        }
-
-        if (outCreate) {
-            *outCreate = create;
-        }
-
-        if (outPrivate) {
-            *outPrivate = priv;
-        }
-        return true;
-    }
-    return false;
+  }
+  return false;
 }
 
 bool isReference(const StringPiece& str) {
-    return parseReference(str, nullptr, nullptr, nullptr);
+  return parseReference(str, nullptr, nullptr, nullptr);
 }
 
 bool parseAttributeReference(const StringPiece& str, ResourceNameRef* outRef) {
-    StringPiece trimmedStr(util::trimWhitespace(str));
-    if (trimmedStr.empty()) {
-        return false;
-    }
-
-    if (*trimmedStr.data() == '?') {
-        StringPiece package;
-        StringPiece type;
-        StringPiece entry;
-        if (!extractResourceName(trimmedStr.substr(1, trimmedStr.size() - 1),
-                                 &package, &type, &entry)) {
-            return false;
-        }
-
-        if (!type.empty() && type != "attr") {
-            return false;
-        }
-
-        if (entry.empty()) {
-            return false;
-        }
-
-        if (outRef) {
-            outRef->package = package;
-            outRef->type = ResourceType::kAttr;
-            outRef->entry = entry;
-        }
-        return true;
-    }
+  StringPiece trimmedStr(util::trimWhitespace(str));
+  if (trimmedStr.empty()) {
     return false;
+  }
+
+  if (*trimmedStr.data() == '?') {
+    StringPiece package;
+    StringPiece type;
+    StringPiece entry;
+    if (!extractResourceName(trimmedStr.substr(1, trimmedStr.size() - 1),
+                             &package, &type, &entry)) {
+      return false;
+    }
+
+    if (!type.empty() && type != "attr") {
+      return false;
+    }
+
+    if (entry.empty()) {
+      return false;
+    }
+
+    if (outRef) {
+      outRef->package = package;
+      outRef->type = ResourceType::kAttr;
+      outRef->entry = entry;
+    }
+    return true;
+  }
+  return false;
 }
 
 bool isAttributeReference(const StringPiece& str) {
-    return parseAttributeReference(str, nullptr);
+  return parseAttributeReference(str, nullptr);
 }
 
 /*
@@ -219,414 +227,421 @@
  * <[*]package>:[style/]<entry>
  * [[*]package:style/]<entry>
  */
-Maybe<Reference> parseStyleParentReference(const StringPiece& str, std::string* outError) {
-    if (str.empty()) {
-        return {};
+Maybe<Reference> parseStyleParentReference(const StringPiece& str,
+                                           std::string* outError) {
+  if (str.empty()) {
+    return {};
+  }
+
+  StringPiece name = str;
+
+  bool hasLeadingIdentifiers = false;
+  bool privateRef = false;
+
+  // Skip over these identifiers. A style's parent is a normal reference.
+  if (name.data()[0] == '@' || name.data()[0] == '?') {
+    hasLeadingIdentifiers = true;
+    name = name.substr(1, name.size() - 1);
+  }
+
+  if (name.data()[0] == '*') {
+    privateRef = true;
+    name = name.substr(1, name.size() - 1);
+  }
+
+  ResourceNameRef ref;
+  ref.type = ResourceType::kStyle;
+
+  StringPiece typeStr;
+  extractResourceName(name, &ref.package, &typeStr, &ref.entry);
+  if (!typeStr.empty()) {
+    // If we have a type, make sure it is a Style.
+    const ResourceType* parsedType = parseResourceType(typeStr);
+    if (!parsedType || *parsedType != ResourceType::kStyle) {
+      std::stringstream err;
+      err << "invalid resource type '" << typeStr << "' for parent of style";
+      *outError = err.str();
+      return {};
     }
+  }
 
-    StringPiece name = str;
+  if (!hasLeadingIdentifiers && ref.package.empty() && !typeStr.empty()) {
+    std::stringstream err;
+    err << "invalid parent reference '" << str << "'";
+    *outError = err.str();
+    return {};
+  }
 
-    bool hasLeadingIdentifiers = false;
-    bool privateRef = false;
-
-    // Skip over these identifiers. A style's parent is a normal reference.
-    if (name.data()[0] == '@' || name.data()[0] == '?') {
-        hasLeadingIdentifiers = true;
-        name = name.substr(1, name.size() - 1);
-    }
-
-    if (name.data()[0] == '*') {
-        privateRef = true;
-        name = name.substr(1, name.size() - 1);
-    }
-
-    ResourceNameRef ref;
-    ref.type = ResourceType::kStyle;
-
-    StringPiece typeStr;
-    extractResourceName(name, &ref.package, &typeStr, &ref.entry);
-    if (!typeStr.empty()) {
-        // If we have a type, make sure it is a Style.
-        const ResourceType* parsedType = parseResourceType(typeStr);
-        if (!parsedType || *parsedType != ResourceType::kStyle) {
-            std::stringstream err;
-            err << "invalid resource type '" << typeStr << "' for parent of style";
-            *outError = err.str();
-            return {};
-        }
-    }
-
-    if (!hasLeadingIdentifiers && ref.package.empty() && !typeStr.empty()) {
-        std::stringstream err;
-        err << "invalid parent reference '" << str << "'";
-        *outError = err.str();
-        return {};
-    }
-
-    Reference result(ref);
-    result.privateReference = privateRef;
-    return result;
+  Reference result(ref);
+  result.privateReference = privateRef;
+  return result;
 }
 
 Maybe<Reference> parseXmlAttributeName(const StringPiece& str) {
-    StringPiece trimmedStr = util::trimWhitespace(str);
-    const char* start = trimmedStr.data();
-    const char* const end = start + trimmedStr.size();
-    const char* p = start;
+  StringPiece trimmedStr = util::trimWhitespace(str);
+  const char* start = trimmedStr.data();
+  const char* const end = start + trimmedStr.size();
+  const char* p = start;
 
-    Reference ref;
-    if (p != end && *p == '*') {
-        ref.privateReference = true;
-        start++;
-        p++;
+  Reference ref;
+  if (p != end && *p == '*') {
+    ref.privateReference = true;
+    start++;
+    p++;
+  }
+
+  StringPiece package;
+  StringPiece name;
+  while (p != end) {
+    if (*p == ':') {
+      package = StringPiece(start, p - start);
+      name = StringPiece(p + 1, end - (p + 1));
+      break;
     }
+    p++;
+  }
 
-    StringPiece package;
-    StringPiece name;
-    while (p != end) {
-        if (*p == ':') {
-            package = StringPiece(start, p - start);
-            name = StringPiece(p + 1, end - (p + 1));
-            break;
-        }
-        p++;
-    }
-
-    ref.name = ResourceName(package.toString(), ResourceType::kAttr,
-                        name.empty() ? trimmedStr.toString() : name.toString());
-    return Maybe<Reference>(std::move(ref));
+  ref.name =
+      ResourceName(package.toString(), ResourceType::kAttr,
+                   name.empty() ? trimmedStr.toString() : name.toString());
+  return Maybe<Reference>(std::move(ref));
 }
 
-std::unique_ptr<Reference> tryParseReference(const StringPiece& str, bool* outCreate) {
-    ResourceNameRef ref;
-    bool privateRef = false;
-    if (parseReference(str, &ref, outCreate, &privateRef)) {
-        std::unique_ptr<Reference> value = util::make_unique<Reference>(ref);
-        value->privateReference = privateRef;
-        return value;
-    }
+std::unique_ptr<Reference> tryParseReference(const StringPiece& str,
+                                             bool* outCreate) {
+  ResourceNameRef ref;
+  bool privateRef = false;
+  if (parseReference(str, &ref, outCreate, &privateRef)) {
+    std::unique_ptr<Reference> value = util::make_unique<Reference>(ref);
+    value->privateReference = privateRef;
+    return value;
+  }
 
-    if (parseAttributeReference(str, &ref)) {
-        if (outCreate) {
-            *outCreate = false;
-        }
-        return util::make_unique<Reference>(ref, Reference::Type::kAttribute);
+  if (parseAttributeReference(str, &ref)) {
+    if (outCreate) {
+      *outCreate = false;
     }
-    return {};
+    return util::make_unique<Reference>(ref, Reference::Type::kAttribute);
+  }
+  return {};
 }
 
 std::unique_ptr<BinaryPrimitive> tryParseNullOrEmpty(const StringPiece& str) {
-    StringPiece trimmedStr(util::trimWhitespace(str));
-    android::Res_value value = { };
-    if (trimmedStr == "@null") {
-        // TYPE_NULL with data set to 0 is interpreted by the runtime as an error.
-        // Instead we set the data type to TYPE_REFERENCE with a value of 0.
-        value.dataType = android::Res_value::TYPE_REFERENCE;
-    } else if (trimmedStr == "@empty") {
-        // TYPE_NULL with value of DATA_NULL_EMPTY is handled fine by the runtime.
-        value.dataType = android::Res_value::TYPE_NULL;
-        value.data = android::Res_value::DATA_NULL_EMPTY;
-    } else {
-        return {};
-    }
-    return util::make_unique<BinaryPrimitive>(value);
+  StringPiece trimmedStr(util::trimWhitespace(str));
+  android::Res_value value = {};
+  if (trimmedStr == "@null") {
+    // TYPE_NULL with data set to 0 is interpreted by the runtime as an error.
+    // Instead we set the data type to TYPE_REFERENCE with a value of 0.
+    value.dataType = android::Res_value::TYPE_REFERENCE;
+  } else if (trimmedStr == "@empty") {
+    // TYPE_NULL with value of DATA_NULL_EMPTY is handled fine by the runtime.
+    value.dataType = android::Res_value::TYPE_NULL;
+    value.data = android::Res_value::DATA_NULL_EMPTY;
+  } else {
+    return {};
+  }
+  return util::make_unique<BinaryPrimitive>(value);
 }
 
 std::unique_ptr<BinaryPrimitive> tryParseEnumSymbol(const Attribute* enumAttr,
                                                     const StringPiece& str) {
-    StringPiece trimmedStr(util::trimWhitespace(str));
-    for (const Attribute::Symbol& symbol : enumAttr->symbols) {
-        // Enum symbols are stored as @package:id/symbol resources,
-        // so we need to match against the 'entry' part of the identifier.
-        const ResourceName& enumSymbolResourceName = symbol.symbol.name.value();
-        if (trimmedStr == enumSymbolResourceName.entry) {
-            android::Res_value value = { };
-            value.dataType = android::Res_value::TYPE_INT_DEC;
-            value.data = symbol.value;
-            return util::make_unique<BinaryPrimitive>(value);
-        }
+  StringPiece trimmedStr(util::trimWhitespace(str));
+  for (const Attribute::Symbol& symbol : enumAttr->symbols) {
+    // Enum symbols are stored as @package:id/symbol resources,
+    // so we need to match against the 'entry' part of the identifier.
+    const ResourceName& enumSymbolResourceName = symbol.symbol.name.value();
+    if (trimmedStr == enumSymbolResourceName.entry) {
+      android::Res_value value = {};
+      value.dataType = android::Res_value::TYPE_INT_DEC;
+      value.data = symbol.value;
+      return util::make_unique<BinaryPrimitive>(value);
     }
-    return {};
+  }
+  return {};
 }
 
 std::unique_ptr<BinaryPrimitive> tryParseFlagSymbol(const Attribute* flagAttr,
                                                     const StringPiece& str) {
-    android::Res_value flags = { };
-    flags.dataType = android::Res_value::TYPE_INT_HEX;
-    flags.data = 0u;
+  android::Res_value flags = {};
+  flags.dataType = android::Res_value::TYPE_INT_HEX;
+  flags.data = 0u;
 
-    if (util::trimWhitespace(str).empty()) {
-        // Empty string is a valid flag (0).
-        return util::make_unique<BinaryPrimitive>(flags);
-    }
-
-    for (StringPiece part : util::tokenize(str, '|')) {
-        StringPiece trimmedPart = util::trimWhitespace(part);
-
-        bool flagSet = false;
-        for (const Attribute::Symbol& symbol : flagAttr->symbols) {
-            // Flag symbols are stored as @package:id/symbol resources,
-            // so we need to match against the 'entry' part of the identifier.
-            const ResourceName& flagSymbolResourceName = symbol.symbol.name.value();
-            if (trimmedPart == flagSymbolResourceName.entry) {
-                flags.data |= symbol.value;
-                flagSet = true;
-                break;
-            }
-        }
-
-        if (!flagSet) {
-            return {};
-        }
-    }
+  if (util::trimWhitespace(str).empty()) {
+    // Empty string is a valid flag (0).
     return util::make_unique<BinaryPrimitive>(flags);
+  }
+
+  for (StringPiece part : util::tokenize(str, '|')) {
+    StringPiece trimmedPart = util::trimWhitespace(part);
+
+    bool flagSet = false;
+    for (const Attribute::Symbol& symbol : flagAttr->symbols) {
+      // Flag symbols are stored as @package:id/symbol resources,
+      // so we need to match against the 'entry' part of the identifier.
+      const ResourceName& flagSymbolResourceName = symbol.symbol.name.value();
+      if (trimmedPart == flagSymbolResourceName.entry) {
+        flags.data |= symbol.value;
+        flagSet = true;
+        break;
+      }
+    }
+
+    if (!flagSet) {
+      return {};
+    }
+  }
+  return util::make_unique<BinaryPrimitive>(flags);
 }
 
 static uint32_t parseHex(char c, bool* outError) {
-    if (c >= '0' && c <= '9') {
-        return c - '0';
-    } else if (c >= 'a' && c <= 'f') {
-        return c - 'a' + 0xa;
-    } else if (c >= 'A' && c <= 'F') {
-        return c - 'A' + 0xa;
-    } else {
-        *outError = true;
-        return 0xffffffffu;
-    }
+  if (c >= '0' && c <= '9') {
+    return c - '0';
+  } else if (c >= 'a' && c <= 'f') {
+    return c - 'a' + 0xa;
+  } else if (c >= 'A' && c <= 'F') {
+    return c - 'A' + 0xa;
+  } else {
+    *outError = true;
+    return 0xffffffffu;
+  }
 }
 
 std::unique_ptr<BinaryPrimitive> tryParseColor(const StringPiece& str) {
-    StringPiece colorStr(util::trimWhitespace(str));
-    const char* start = colorStr.data();
-    const size_t len = colorStr.size();
-    if (len == 0 || start[0] != '#') {
-        return {};
-    }
+  StringPiece colorStr(util::trimWhitespace(str));
+  const char* start = colorStr.data();
+  const size_t len = colorStr.size();
+  if (len == 0 || start[0] != '#') {
+    return {};
+  }
 
-    android::Res_value value = { };
-    bool error = false;
-    if (len == 4) {
-        value.dataType = android::Res_value::TYPE_INT_COLOR_RGB4;
-        value.data = 0xff000000u;
-        value.data |= parseHex(start[1], &error) << 20;
-        value.data |= parseHex(start[1], &error) << 16;
-        value.data |= parseHex(start[2], &error) << 12;
-        value.data |= parseHex(start[2], &error) << 8;
-        value.data |= parseHex(start[3], &error) << 4;
-        value.data |= parseHex(start[3], &error);
-    } else if (len == 5) {
-        value.dataType = android::Res_value::TYPE_INT_COLOR_ARGB4;
-        value.data |= parseHex(start[1], &error) << 28;
-        value.data |= parseHex(start[1], &error) << 24;
-        value.data |= parseHex(start[2], &error) << 20;
-        value.data |= parseHex(start[2], &error) << 16;
-        value.data |= parseHex(start[3], &error) << 12;
-        value.data |= parseHex(start[3], &error) << 8;
-        value.data |= parseHex(start[4], &error) << 4;
-        value.data |= parseHex(start[4], &error);
-    } else if (len == 7) {
-        value.dataType = android::Res_value::TYPE_INT_COLOR_RGB8;
-        value.data = 0xff000000u;
-        value.data |= parseHex(start[1], &error) << 20;
-        value.data |= parseHex(start[2], &error) << 16;
-        value.data |= parseHex(start[3], &error) << 12;
-        value.data |= parseHex(start[4], &error) << 8;
-        value.data |= parseHex(start[5], &error) << 4;
-        value.data |= parseHex(start[6], &error);
-    } else if (len == 9) {
-        value.dataType = android::Res_value::TYPE_INT_COLOR_ARGB8;
-        value.data |= parseHex(start[1], &error) << 28;
-        value.data |= parseHex(start[2], &error) << 24;
-        value.data |= parseHex(start[3], &error) << 20;
-        value.data |= parseHex(start[4], &error) << 16;
-        value.data |= parseHex(start[5], &error) << 12;
-        value.data |= parseHex(start[6], &error) << 8;
-        value.data |= parseHex(start[7], &error) << 4;
-        value.data |= parseHex(start[8], &error);
-    } else {
-        return {};
-    }
-    return error ? std::unique_ptr<BinaryPrimitive>() : util::make_unique<BinaryPrimitive>(value);
+  android::Res_value value = {};
+  bool error = false;
+  if (len == 4) {
+    value.dataType = android::Res_value::TYPE_INT_COLOR_RGB4;
+    value.data = 0xff000000u;
+    value.data |= parseHex(start[1], &error) << 20;
+    value.data |= parseHex(start[1], &error) << 16;
+    value.data |= parseHex(start[2], &error) << 12;
+    value.data |= parseHex(start[2], &error) << 8;
+    value.data |= parseHex(start[3], &error) << 4;
+    value.data |= parseHex(start[3], &error);
+  } else if (len == 5) {
+    value.dataType = android::Res_value::TYPE_INT_COLOR_ARGB4;
+    value.data |= parseHex(start[1], &error) << 28;
+    value.data |= parseHex(start[1], &error) << 24;
+    value.data |= parseHex(start[2], &error) << 20;
+    value.data |= parseHex(start[2], &error) << 16;
+    value.data |= parseHex(start[3], &error) << 12;
+    value.data |= parseHex(start[3], &error) << 8;
+    value.data |= parseHex(start[4], &error) << 4;
+    value.data |= parseHex(start[4], &error);
+  } else if (len == 7) {
+    value.dataType = android::Res_value::TYPE_INT_COLOR_RGB8;
+    value.data = 0xff000000u;
+    value.data |= parseHex(start[1], &error) << 20;
+    value.data |= parseHex(start[2], &error) << 16;
+    value.data |= parseHex(start[3], &error) << 12;
+    value.data |= parseHex(start[4], &error) << 8;
+    value.data |= parseHex(start[5], &error) << 4;
+    value.data |= parseHex(start[6], &error);
+  } else if (len == 9) {
+    value.dataType = android::Res_value::TYPE_INT_COLOR_ARGB8;
+    value.data |= parseHex(start[1], &error) << 28;
+    value.data |= parseHex(start[2], &error) << 24;
+    value.data |= parseHex(start[3], &error) << 20;
+    value.data |= parseHex(start[4], &error) << 16;
+    value.data |= parseHex(start[5], &error) << 12;
+    value.data |= parseHex(start[6], &error) << 8;
+    value.data |= parseHex(start[7], &error) << 4;
+    value.data |= parseHex(start[8], &error);
+  } else {
+    return {};
+  }
+  return error ? std::unique_ptr<BinaryPrimitive>()
+               : util::make_unique<BinaryPrimitive>(value);
 }
 
 Maybe<bool> parseBool(const StringPiece& str) {
-    StringPiece trimmedStr(util::trimWhitespace(str));
-    if (trimmedStr == "true" || trimmedStr == "TRUE" || trimmedStr == "True") {
-        return Maybe<bool>(true);
-    } else if (trimmedStr == "false" || trimmedStr == "FALSE" || trimmedStr == "False") {
-        return Maybe<bool>(false);
-    }
-    return {};
+  StringPiece trimmedStr(util::trimWhitespace(str));
+  if (trimmedStr == "true" || trimmedStr == "TRUE" || trimmedStr == "True") {
+    return Maybe<bool>(true);
+  } else if (trimmedStr == "false" || trimmedStr == "FALSE" ||
+             trimmedStr == "False") {
+    return Maybe<bool>(false);
+  }
+  return {};
 }
 
 Maybe<uint32_t> parseInt(const StringPiece& str) {
-    std::u16string str16 = util::utf8ToUtf16(str);
-    android::Res_value value;
-    if (android::ResTable::stringToInt(str16.data(), str16.size(), &value)) {
-        return value.data;
-    }
-    return {};
+  std::u16string str16 = util::utf8ToUtf16(str);
+  android::Res_value value;
+  if (android::ResTable::stringToInt(str16.data(), str16.size(), &value)) {
+    return value.data;
+  }
+  return {};
 }
 
 Maybe<ResourceId> parseResourceId(const StringPiece& str) {
-    StringPiece trimmedStr(util::trimWhitespace(str));
+  StringPiece trimmedStr(util::trimWhitespace(str));
 
-    std::u16string str16 = util::utf8ToUtf16(trimmedStr);
-    android::Res_value value;
-    if (android::ResTable::stringToInt(str16.data(), str16.size(), &value)) {
-        if (value.dataType == android::Res_value::TYPE_INT_HEX) {
-            ResourceId id(value.data);
-            if (id.isValid()) {
-                return id;
-            }
-        }
+  std::u16string str16 = util::utf8ToUtf16(trimmedStr);
+  android::Res_value value;
+  if (android::ResTable::stringToInt(str16.data(), str16.size(), &value)) {
+    if (value.dataType == android::Res_value::TYPE_INT_HEX) {
+      ResourceId id(value.data);
+      if (id.isValid()) {
+        return id;
+      }
     }
-    return {};
+  }
+  return {};
 }
 
 Maybe<int> parseSdkVersion(const StringPiece& str) {
-    StringPiece trimmedStr(util::trimWhitespace(str));
+  StringPiece trimmedStr(util::trimWhitespace(str));
 
-    std::u16string str16 = util::utf8ToUtf16(trimmedStr);
-    android::Res_value value;
-    if (android::ResTable::stringToInt(str16.data(), str16.size(), &value)) {
-        return static_cast<int>(value.data);
-    }
+  std::u16string str16 = util::utf8ToUtf16(trimmedStr);
+  android::Res_value value;
+  if (android::ResTable::stringToInt(str16.data(), str16.size(), &value)) {
+    return static_cast<int>(value.data);
+  }
 
-    // Try parsing the code name.
-    std::pair<StringPiece, int> entry = getDevelopmentSdkCodeNameAndVersion();
-    if (entry.first == trimmedStr) {
-        return entry.second;
-    }
-    return {};
+  // Try parsing the code name.
+  std::pair<StringPiece, int> entry = getDevelopmentSdkCodeNameAndVersion();
+  if (entry.first == trimmedStr) {
+    return entry.second;
+  }
+  return {};
 }
 
 std::unique_ptr<BinaryPrimitive> tryParseBool(const StringPiece& str) {
-    if (Maybe<bool> maybeResult = parseBool(str)) {
-        android::Res_value value = {};
-        value.dataType = android::Res_value::TYPE_INT_BOOLEAN;
+  if (Maybe<bool> maybeResult = parseBool(str)) {
+    android::Res_value value = {};
+    value.dataType = android::Res_value::TYPE_INT_BOOLEAN;
 
-        if (maybeResult.value()) {
-            value.data = 0xffffffffu;
-        } else {
-            value.data = 0;
-        }
-        return util::make_unique<BinaryPrimitive>(value);
+    if (maybeResult.value()) {
+      value.data = 0xffffffffu;
+    } else {
+      value.data = 0;
     }
-    return {};
+    return util::make_unique<BinaryPrimitive>(value);
+  }
+  return {};
 }
 
 std::unique_ptr<BinaryPrimitive> tryParseInt(const StringPiece& str) {
-    std::u16string str16 = util::utf8ToUtf16(str);
-    android::Res_value value;
-    if (!android::ResTable::stringToInt(str16.data(), str16.size(), &value)) {
-        return {};
-    }
-    return util::make_unique<BinaryPrimitive>(value);
+  std::u16string str16 = util::utf8ToUtf16(str);
+  android::Res_value value;
+  if (!android::ResTable::stringToInt(str16.data(), str16.size(), &value)) {
+    return {};
+  }
+  return util::make_unique<BinaryPrimitive>(value);
 }
 
 std::unique_ptr<BinaryPrimitive> tryParseFloat(const StringPiece& str) {
-    std::u16string str16 = util::utf8ToUtf16(str);
-    android::Res_value value;
-    if (!android::ResTable::stringToFloat(str16.data(), str16.size(), &value)) {
-        return {};
-    }
-    return util::make_unique<BinaryPrimitive>(value);
+  std::u16string str16 = util::utf8ToUtf16(str);
+  android::Res_value value;
+  if (!android::ResTable::stringToFloat(str16.data(), str16.size(), &value)) {
+    return {};
+  }
+  return util::make_unique<BinaryPrimitive>(value);
 }
 
 uint32_t androidTypeToAttributeTypeMask(uint16_t type) {
-    switch (type) {
+  switch (type) {
     case android::Res_value::TYPE_NULL:
     case android::Res_value::TYPE_REFERENCE:
     case android::Res_value::TYPE_ATTRIBUTE:
     case android::Res_value::TYPE_DYNAMIC_REFERENCE:
-        return android::ResTable_map::TYPE_REFERENCE;
+      return android::ResTable_map::TYPE_REFERENCE;
 
     case android::Res_value::TYPE_STRING:
-        return android::ResTable_map::TYPE_STRING;
+      return android::ResTable_map::TYPE_STRING;
 
     case android::Res_value::TYPE_FLOAT:
-        return android::ResTable_map::TYPE_FLOAT;
+      return android::ResTable_map::TYPE_FLOAT;
 
     case android::Res_value::TYPE_DIMENSION:
-        return android::ResTable_map::TYPE_DIMENSION;
+      return android::ResTable_map::TYPE_DIMENSION;
 
     case android::Res_value::TYPE_FRACTION:
-        return android::ResTable_map::TYPE_FRACTION;
+      return android::ResTable_map::TYPE_FRACTION;
 
     case android::Res_value::TYPE_INT_DEC:
     case android::Res_value::TYPE_INT_HEX:
-        return android::ResTable_map::TYPE_INTEGER | android::ResTable_map::TYPE_ENUM
-                | android::ResTable_map::TYPE_FLAGS;
+      return android::ResTable_map::TYPE_INTEGER |
+             android::ResTable_map::TYPE_ENUM |
+             android::ResTable_map::TYPE_FLAGS;
 
     case android::Res_value::TYPE_INT_BOOLEAN:
-        return android::ResTable_map::TYPE_BOOLEAN;
+      return android::ResTable_map::TYPE_BOOLEAN;
 
     case android::Res_value::TYPE_INT_COLOR_ARGB8:
     case android::Res_value::TYPE_INT_COLOR_RGB8:
     case android::Res_value::TYPE_INT_COLOR_ARGB4:
     case android::Res_value::TYPE_INT_COLOR_RGB4:
-        return android::ResTable_map::TYPE_COLOR;
+      return android::ResTable_map::TYPE_COLOR;
 
     default:
-        return 0;
-    };
+      return 0;
+  };
 }
 
 std::unique_ptr<Item> tryParseItemForAttribute(
-        const StringPiece& value,
-        uint32_t typeMask,
-        const std::function<void(const ResourceName&)>& onCreateReference) {
-    std::unique_ptr<BinaryPrimitive> nullOrEmpty = tryParseNullOrEmpty(value);
-    if (nullOrEmpty) {
-        return std::move(nullOrEmpty);
-    }
+    const StringPiece& value, uint32_t typeMask,
+    const std::function<void(const ResourceName&)>& onCreateReference) {
+  std::unique_ptr<BinaryPrimitive> nullOrEmpty = tryParseNullOrEmpty(value);
+  if (nullOrEmpty) {
+    return std::move(nullOrEmpty);
+  }
 
-    bool create = false;
-    std::unique_ptr<Reference> reference = tryParseReference(value, &create);
-    if (reference) {
-        if (create && onCreateReference) {
-            onCreateReference(reference->name.value());
-        }
-        return std::move(reference);
+  bool create = false;
+  std::unique_ptr<Reference> reference = tryParseReference(value, &create);
+  if (reference) {
+    if (create && onCreateReference) {
+      onCreateReference(reference->name.value());
     }
+    return std::move(reference);
+  }
 
-    if (typeMask & android::ResTable_map::TYPE_COLOR) {
-        // Try parsing this as a color.
-        std::unique_ptr<BinaryPrimitive> color = tryParseColor(value);
-        if (color) {
-            return std::move(color);
-        }
+  if (typeMask & android::ResTable_map::TYPE_COLOR) {
+    // Try parsing this as a color.
+    std::unique_ptr<BinaryPrimitive> color = tryParseColor(value);
+    if (color) {
+      return std::move(color);
     }
+  }
 
-    if (typeMask & android::ResTable_map::TYPE_BOOLEAN) {
-        // Try parsing this as a boolean.
-        std::unique_ptr<BinaryPrimitive> boolean = tryParseBool(value);
-        if (boolean) {
-            return std::move(boolean);
-        }
+  if (typeMask & android::ResTable_map::TYPE_BOOLEAN) {
+    // Try parsing this as a boolean.
+    std::unique_ptr<BinaryPrimitive> boolean = tryParseBool(value);
+    if (boolean) {
+      return std::move(boolean);
     }
+  }
 
-    if (typeMask & android::ResTable_map::TYPE_INTEGER) {
-        // Try parsing this as an integer.
-        std::unique_ptr<BinaryPrimitive> integer = tryParseInt(value);
-        if (integer) {
-            return std::move(integer);
-        }
+  if (typeMask & android::ResTable_map::TYPE_INTEGER) {
+    // Try parsing this as an integer.
+    std::unique_ptr<BinaryPrimitive> integer = tryParseInt(value);
+    if (integer) {
+      return std::move(integer);
     }
+  }
 
-    const uint32_t floatMask = android::ResTable_map::TYPE_FLOAT
-            | android::ResTable_map::TYPE_DIMENSION | android::ResTable_map::TYPE_FRACTION;
-    if (typeMask & floatMask) {
-        // Try parsing this as a float.
-        std::unique_ptr<BinaryPrimitive> floatingPoint = tryParseFloat(value);
-        if (floatingPoint) {
-            if (typeMask & androidTypeToAttributeTypeMask(floatingPoint->value.dataType)) {
-                return std::move(floatingPoint);
-            }
-        }
+  const uint32_t floatMask = android::ResTable_map::TYPE_FLOAT |
+                             android::ResTable_map::TYPE_DIMENSION |
+                             android::ResTable_map::TYPE_FRACTION;
+  if (typeMask & floatMask) {
+    // Try parsing this as a float.
+    std::unique_ptr<BinaryPrimitive> floatingPoint = tryParseFloat(value);
+    if (floatingPoint) {
+      if (typeMask &
+          androidTypeToAttributeTypeMask(floatingPoint->value.dataType)) {
+        return std::move(floatingPoint);
+      }
     }
-    return {};
+  }
+  return {};
 }
 
 /**
@@ -634,48 +649,50 @@
  * allows.
  */
 std::unique_ptr<Item> tryParseItemForAttribute(
-        const StringPiece& str, const Attribute* attr,
-        const std::function<void(const ResourceName&)>& onCreateReference) {
-    const uint32_t typeMask = attr->typeMask;
-    std::unique_ptr<Item> value = tryParseItemForAttribute(str, typeMask, onCreateReference);
-    if (value) {
-        return value;
-    }
+    const StringPiece& str, const Attribute* attr,
+    const std::function<void(const ResourceName&)>& onCreateReference) {
+  const uint32_t typeMask = attr->typeMask;
+  std::unique_ptr<Item> value =
+      tryParseItemForAttribute(str, typeMask, onCreateReference);
+  if (value) {
+    return value;
+  }
 
-    if (typeMask & android::ResTable_map::TYPE_ENUM) {
-        // Try parsing this as an enum.
-        std::unique_ptr<BinaryPrimitive> enumValue = tryParseEnumSymbol(attr, str);
-        if (enumValue) {
-            return std::move(enumValue);
-        }
+  if (typeMask & android::ResTable_map::TYPE_ENUM) {
+    // Try parsing this as an enum.
+    std::unique_ptr<BinaryPrimitive> enumValue = tryParseEnumSymbol(attr, str);
+    if (enumValue) {
+      return std::move(enumValue);
     }
+  }
 
-    if (typeMask & android::ResTable_map::TYPE_FLAGS) {
-        // Try parsing this as a flag.
-        std::unique_ptr<BinaryPrimitive> flagValue = tryParseFlagSymbol(attr, str);
-        if (flagValue) {
-            return std::move(flagValue);
-        }
+  if (typeMask & android::ResTable_map::TYPE_FLAGS) {
+    // Try parsing this as a flag.
+    std::unique_ptr<BinaryPrimitive> flagValue = tryParseFlagSymbol(attr, str);
+    if (flagValue) {
+      return std::move(flagValue);
     }
-    return {};
+  }
+  return {};
 }
 
-std::string buildResourceFileName(const ResourceFile& resFile, const NameMangler* mangler) {
-    std::stringstream out;
-    out << "res/" << resFile.name.type;
-    if (resFile.config != ConfigDescription{}) {
-        out << "-" << resFile.config;
-    }
-    out << "/";
+std::string buildResourceFileName(const ResourceFile& resFile,
+                                  const NameMangler* mangler) {
+  std::stringstream out;
+  out << "res/" << resFile.name.type;
+  if (resFile.config != ConfigDescription{}) {
+    out << "-" << resFile.config;
+  }
+  out << "/";
 
-    if (mangler && mangler->shouldMangle(resFile.name.package)) {
-        out << NameMangler::mangleEntry(resFile.name.package, resFile.name.entry);
-    } else {
-        out << resFile.name.entry;
-    }
-    out << file::getExtension(resFile.source.path);
-    return out.str();
+  if (mangler && mangler->shouldMangle(resFile.name.package)) {
+    out << NameMangler::mangleEntry(resFile.name.package, resFile.name.entry);
+  } else {
+    out << resFile.name.entry;
+  }
+  out << file::getExtension(resFile.source.path);
+  return out.str();
 }
 
-} // namespace ResourceUtils
-} // namespace aapt
+}  // namespace ResourceUtils
+}  // namespace aapt
diff --git a/tools/aapt2/ResourceUtils.h b/tools/aapt2/ResourceUtils.h
index 555203b..cebe47c 100644
--- a/tools/aapt2/ResourceUtils.h
+++ b/tools/aapt2/ResourceUtils.h
@@ -41,15 +41,18 @@
                          StringPiece* outType, StringPiece* outEntry);
 
 /**
- * Returns true if the string was parsed as a resource name ([*][package:]type/name), with
- * `outResource` set to the parsed resource name and `outPrivate` set to true if a '*' prefix
+ * Returns true if the string was parsed as a resource name
+ * ([*][package:]type/name), with
+ * `outResource` set to the parsed resource name and `outPrivate` set to true if
+ * a '*' prefix
  * was present.
  */
 bool parseResourceName(const StringPiece& str, ResourceNameRef* outResource,
                        bool* outPrivate = nullptr);
 
 /*
- * Returns true if the string was parsed as a reference (@[+][package:]type/name), with
+ * Returns true if the string was parsed as a reference
+ * (@[+][package:]type/name), with
  * `outReference` set to the parsed reference.
  *
  * If '+' was present in the reference, `outCreate` is set to true.
@@ -59,28 +62,34 @@
                     bool* outCreate = nullptr, bool* outPrivate = nullptr);
 
 /*
- * Returns true if the string is in the form of a resource reference (@[+][package:]type/name).
+ * Returns true if the string is in the form of a resource reference
+ * (@[+][package:]type/name).
  */
 bool isReference(const StringPiece& str);
 
 /*
- * Returns true if the string was parsed as an attribute reference (?[package:][type/]name),
+ * Returns true if the string was parsed as an attribute reference
+ * (?[package:][type/]name),
  * with `outReference` set to the parsed reference.
  */
-bool parseAttributeReference(const StringPiece& str, ResourceNameRef* outReference);
+bool parseAttributeReference(const StringPiece& str,
+                             ResourceNameRef* outReference);
 
 /**
- * Returns true if the string is in the form of an attribute reference(?[package:][type/]name).
+ * Returns true if the string is in the form of an attribute
+ * reference(?[package:][type/]name).
  */
 bool isAttributeReference(const StringPiece& str);
 
 /**
  * Convert an android::ResTable::resource_name to an aapt::ResourceName struct.
  */
-Maybe<ResourceName> toResourceName(const android::ResTable::resource_name& name);
+Maybe<ResourceName> toResourceName(
+    const android::ResTable::resource_name& name);
 
 /**
- * Returns a boolean value if the string is equal to TRUE, true, True, FALSE, false, or False.
+ * Returns a boolean value if the string is equal to TRUE, true, True, FALSE,
+ * false, or False.
  */
 Maybe<bool> parseBool(const StringPiece& str);
 
@@ -100,18 +109,22 @@
 Maybe<int> parseSdkVersion(const StringPiece& str);
 
 /*
- * Returns a Reference, or None Maybe instance if the string `str` was parsed as a
+ * Returns a Reference, or None Maybe instance if the string `str` was parsed as
+ * a
  * valid reference to a style.
- * The format for a style parent is slightly more flexible than a normal reference:
+ * The format for a style parent is slightly more flexible than a normal
+ * reference:
  *
  * @[package:]style/<entry> or
  * ?[package:]style/<entry> or
  * <package>:[style/]<entry>
  */
-Maybe<Reference> parseStyleParentReference(const StringPiece& str, std::string* outError);
+Maybe<Reference> parseStyleParentReference(const StringPiece& str,
+                                           std::string* outError);
 
 /*
- * Returns a Reference if the string `str` was parsed as a valid XML attribute name.
+ * Returns a Reference if the string `str` was parsed as a valid XML attribute
+ * name.
  * The valid format for an XML attribute name is:
  *
  * package:entry
@@ -119,14 +132,18 @@
 Maybe<Reference> parseXmlAttributeName(const StringPiece& str);
 
 /*
- * Returns a Reference object if the string was parsed as a resource or attribute reference,
- * ( @[+][package:]type/name | ?[package:]type/name ) setting outCreate to true if
+ * Returns a Reference object if the string was parsed as a resource or
+ * attribute reference,
+ * ( @[+][package:]type/name | ?[package:]type/name ) setting outCreate to true
+ * if
  * the '+' was present in the string.
  */
-std::unique_ptr<Reference> tryParseReference(const StringPiece& str, bool* outCreate = nullptr);
+std::unique_ptr<Reference> tryParseReference(const StringPiece& str,
+                                             bool* outCreate = nullptr);
 
 /*
- * Returns a BinaryPrimitve object representing @null or @empty if the string was parsed
+ * Returns a BinaryPrimitve object representing @null or @empty if the string
+ * was parsed
  * as one.
  */
 std::unique_ptr<BinaryPrimitive> tryParseNullOrEmpty(const StringPiece& str);
@@ -138,13 +155,15 @@
 std::unique_ptr<BinaryPrimitive> tryParseColor(const StringPiece& str);
 
 /*
- * Returns a BinaryPrimitve object representing a boolean if the string was parsed
+ * Returns a BinaryPrimitve object representing a boolean if the string was
+ * parsed
  * as one.
  */
 std::unique_ptr<BinaryPrimitive> tryParseBool(const StringPiece& str);
 
 /*
- * Returns a BinaryPrimitve object representing an integer if the string was parsed
+ * Returns a BinaryPrimitve object representing an integer if the string was
+ * parsed
  * as one.
  */
 std::unique_ptr<BinaryPrimitive> tryParseInt(const StringPiece& str);
@@ -156,45 +175,51 @@
 std::unique_ptr<BinaryPrimitive> tryParseFloat(const StringPiece& str);
 
 /*
- * Returns a BinaryPrimitve object representing an enum symbol if the string was parsed
+ * Returns a BinaryPrimitve object representing an enum symbol if the string was
+ * parsed
  * as one.
  */
 std::unique_ptr<BinaryPrimitive> tryParseEnumSymbol(const Attribute* enumAttr,
                                                     const StringPiece& str);
 
 /*
- * Returns a BinaryPrimitve object representing a flag symbol if the string was parsed
+ * Returns a BinaryPrimitve object representing a flag symbol if the string was
+ * parsed
  * as one.
  */
 std::unique_ptr<BinaryPrimitive> tryParseFlagSymbol(const Attribute* enumAttr,
                                                     const StringPiece& str);
 /*
- * Try to convert a string to an Item for the given attribute. The attribute will
+ * Try to convert a string to an Item for the given attribute. The attribute
+ * will
  * restrict what values the string can be converted to.
  * The callback function onCreateReference is called when the parsed item is a
  * reference to an ID that must be created (@+id/foo).
  */
 std::unique_ptr<Item> tryParseItemForAttribute(
-        const StringPiece& value, const Attribute* attr,
-        const std::function<void(const ResourceName&)>& onCreateReference = {});
+    const StringPiece& value, const Attribute* attr,
+    const std::function<void(const ResourceName&)>& onCreateReference = {});
 
 std::unique_ptr<Item> tryParseItemForAttribute(
-        const StringPiece& value, uint32_t typeMask,
-        const std::function<void(const ResourceName&)>& onCreateReference = {});
+    const StringPiece& value, uint32_t typeMask,
+    const std::function<void(const ResourceName&)>& onCreateReference = {});
 
 uint32_t androidTypeToAttributeTypeMask(uint16_t type);
 
 /**
- * Returns a string path suitable for use within an APK. The path will look like:
+ * Returns a string path suitable for use within an APK. The path will look
+ * like:
  *
  * res/type[-config]/<name>.<ext>
  *
- * Then name may be mangled if a NameMangler is supplied (can be nullptr) and the package
+ * Then name may be mangled if a NameMangler is supplied (can be nullptr) and
+ * the package
  * requires mangling.
  */
-std::string buildResourceFileName(const ResourceFile& resFile, const NameMangler* mangler);
+std::string buildResourceFileName(const ResourceFile& resFile,
+                                  const NameMangler* mangler);
 
-} // namespace ResourceUtils
-} // namespace aapt
+}  // namespace ResourceUtils
+}  // namespace aapt
 
 #endif /* AAPT_RESOURCEUTILS_H */
diff --git a/tools/aapt2/ResourceUtils_test.cpp b/tools/aapt2/ResourceUtils_test.cpp
index 894cfcf..eb62b1b 100644
--- a/tools/aapt2/ResourceUtils_test.cpp
+++ b/tools/aapt2/ResourceUtils_test.cpp
@@ -14,179 +14,188 @@
  * limitations under the License.
  */
 
-#include "Resource.h"
 #include "ResourceUtils.h"
+#include "Resource.h"
 #include "test/Test.h"
 
 namespace aapt {
 
 TEST(ResourceUtilsTest, ParseBool) {
-    EXPECT_EQ(Maybe<bool>(true), ResourceUtils::parseBool("true"));
-    EXPECT_EQ(Maybe<bool>(true), ResourceUtils::parseBool("TRUE"));
-    EXPECT_EQ(Maybe<bool>(true), ResourceUtils::parseBool("True"));
-    EXPECT_EQ(Maybe<bool>(false), ResourceUtils::parseBool("false"));
-    EXPECT_EQ(Maybe<bool>(false), ResourceUtils::parseBool("FALSE"));
-    EXPECT_EQ(Maybe<bool>(false), ResourceUtils::parseBool("False"));
+  EXPECT_EQ(Maybe<bool>(true), ResourceUtils::parseBool("true"));
+  EXPECT_EQ(Maybe<bool>(true), ResourceUtils::parseBool("TRUE"));
+  EXPECT_EQ(Maybe<bool>(true), ResourceUtils::parseBool("True"));
+  EXPECT_EQ(Maybe<bool>(false), ResourceUtils::parseBool("false"));
+  EXPECT_EQ(Maybe<bool>(false), ResourceUtils::parseBool("FALSE"));
+  EXPECT_EQ(Maybe<bool>(false), ResourceUtils::parseBool("False"));
 }
 
 TEST(ResourceUtilsTest, ParseResourceName) {
-    ResourceNameRef actual;
-    bool actualPriv = false;
-    EXPECT_TRUE(ResourceUtils::parseResourceName("android:color/foo", &actual, &actualPriv));
-    EXPECT_EQ(ResourceNameRef("android", ResourceType::kColor, "foo"), actual);
-    EXPECT_FALSE(actualPriv);
+  ResourceNameRef actual;
+  bool actualPriv = false;
+  EXPECT_TRUE(ResourceUtils::parseResourceName("android:color/foo", &actual,
+                                               &actualPriv));
+  EXPECT_EQ(ResourceNameRef("android", ResourceType::kColor, "foo"), actual);
+  EXPECT_FALSE(actualPriv);
 
-    EXPECT_TRUE(ResourceUtils::parseResourceName("color/foo", &actual, &actualPriv));
-    EXPECT_EQ(ResourceNameRef({}, ResourceType::kColor, "foo"), actual);
-    EXPECT_FALSE(actualPriv);
+  EXPECT_TRUE(
+      ResourceUtils::parseResourceName("color/foo", &actual, &actualPriv));
+  EXPECT_EQ(ResourceNameRef({}, ResourceType::kColor, "foo"), actual);
+  EXPECT_FALSE(actualPriv);
 
-    EXPECT_TRUE(ResourceUtils::parseResourceName("*android:color/foo", &actual, &actualPriv));
-    EXPECT_EQ(ResourceNameRef("android", ResourceType::kColor, "foo"), actual);
-    EXPECT_TRUE(actualPriv);
+  EXPECT_TRUE(ResourceUtils::parseResourceName("*android:color/foo", &actual,
+                                               &actualPriv));
+  EXPECT_EQ(ResourceNameRef("android", ResourceType::kColor, "foo"), actual);
+  EXPECT_TRUE(actualPriv);
 
-    EXPECT_FALSE(ResourceUtils::parseResourceName(StringPiece(), &actual, &actualPriv));
+  EXPECT_FALSE(
+      ResourceUtils::parseResourceName(StringPiece(), &actual, &actualPriv));
 }
 
 TEST(ResourceUtilsTest, ParseReferenceWithNoPackage) {
-    ResourceNameRef expected({}, ResourceType::kColor, "foo");
-    ResourceNameRef actual;
-    bool create = false;
-    bool privateRef = false;
-    EXPECT_TRUE(ResourceUtils::parseReference("@color/foo", &actual, &create, &privateRef));
-    EXPECT_EQ(expected, actual);
-    EXPECT_FALSE(create);
-    EXPECT_FALSE(privateRef);
+  ResourceNameRef expected({}, ResourceType::kColor, "foo");
+  ResourceNameRef actual;
+  bool create = false;
+  bool privateRef = false;
+  EXPECT_TRUE(ResourceUtils::parseReference("@color/foo", &actual, &create,
+                                            &privateRef));
+  EXPECT_EQ(expected, actual);
+  EXPECT_FALSE(create);
+  EXPECT_FALSE(privateRef);
 }
 
 TEST(ResourceUtilsTest, ParseReferenceWithPackage) {
-    ResourceNameRef expected("android", ResourceType::kColor, "foo");
-    ResourceNameRef actual;
-    bool create = false;
-    bool privateRef = false;
-    EXPECT_TRUE(ResourceUtils::parseReference("@android:color/foo", &actual, &create,
-                                                 &privateRef));
-    EXPECT_EQ(expected, actual);
-    EXPECT_FALSE(create);
-    EXPECT_FALSE(privateRef);
+  ResourceNameRef expected("android", ResourceType::kColor, "foo");
+  ResourceNameRef actual;
+  bool create = false;
+  bool privateRef = false;
+  EXPECT_TRUE(ResourceUtils::parseReference("@android:color/foo", &actual,
+                                            &create, &privateRef));
+  EXPECT_EQ(expected, actual);
+  EXPECT_FALSE(create);
+  EXPECT_FALSE(privateRef);
 }
 
 TEST(ResourceUtilsTest, ParseReferenceWithSurroundingWhitespace) {
-    ResourceNameRef expected("android", ResourceType::kColor, "foo");
-    ResourceNameRef actual;
-    bool create = false;
-    bool privateRef = false;
-    EXPECT_TRUE(ResourceUtils::parseReference("\t @android:color/foo\n \n\t", &actual,
-                                                 &create, &privateRef));
-    EXPECT_EQ(expected, actual);
-    EXPECT_FALSE(create);
-    EXPECT_FALSE(privateRef);
+  ResourceNameRef expected("android", ResourceType::kColor, "foo");
+  ResourceNameRef actual;
+  bool create = false;
+  bool privateRef = false;
+  EXPECT_TRUE(ResourceUtils::parseReference("\t @android:color/foo\n \n\t",
+                                            &actual, &create, &privateRef));
+  EXPECT_EQ(expected, actual);
+  EXPECT_FALSE(create);
+  EXPECT_FALSE(privateRef);
 }
 
 TEST(ResourceUtilsTest, ParseAutoCreateIdReference) {
-    ResourceNameRef expected("android", ResourceType::kId, "foo");
-    ResourceNameRef actual;
-    bool create = false;
-    bool privateRef = false;
-    EXPECT_TRUE(ResourceUtils::parseReference("@+android:id/foo", &actual, &create,
-                                                 &privateRef));
-    EXPECT_EQ(expected, actual);
-    EXPECT_TRUE(create);
-    EXPECT_FALSE(privateRef);
+  ResourceNameRef expected("android", ResourceType::kId, "foo");
+  ResourceNameRef actual;
+  bool create = false;
+  bool privateRef = false;
+  EXPECT_TRUE(ResourceUtils::parseReference("@+android:id/foo", &actual,
+                                            &create, &privateRef));
+  EXPECT_EQ(expected, actual);
+  EXPECT_TRUE(create);
+  EXPECT_FALSE(privateRef);
 }
 
 TEST(ResourceUtilsTest, ParsePrivateReference) {
-    ResourceNameRef expected("android", ResourceType::kId, "foo");
-    ResourceNameRef actual;
-    bool create = false;
-    bool privateRef = false;
-    EXPECT_TRUE(ResourceUtils::parseReference("@*android:id/foo", &actual, &create,
-                                                 &privateRef));
-    EXPECT_EQ(expected, actual);
-    EXPECT_FALSE(create);
-    EXPECT_TRUE(privateRef);
+  ResourceNameRef expected("android", ResourceType::kId, "foo");
+  ResourceNameRef actual;
+  bool create = false;
+  bool privateRef = false;
+  EXPECT_TRUE(ResourceUtils::parseReference("@*android:id/foo", &actual,
+                                            &create, &privateRef));
+  EXPECT_EQ(expected, actual);
+  EXPECT_FALSE(create);
+  EXPECT_TRUE(privateRef);
 }
 
 TEST(ResourceUtilsTest, FailToParseAutoCreateNonIdReference) {
-    bool create = false;
-    bool privateRef = false;
-    ResourceNameRef actual;
-    EXPECT_FALSE(ResourceUtils::parseReference("@+android:color/foo", &actual, &create,
-                                                  &privateRef));
+  bool create = false;
+  bool privateRef = false;
+  ResourceNameRef actual;
+  EXPECT_FALSE(ResourceUtils::parseReference("@+android:color/foo", &actual,
+                                             &create, &privateRef));
 }
 
 TEST(ResourceUtilsTest, ParseAttributeReferences) {
-    EXPECT_TRUE(ResourceUtils::isAttributeReference("?android"));
-    EXPECT_TRUE(ResourceUtils::isAttributeReference("?android:foo"));
-    EXPECT_TRUE(ResourceUtils::isAttributeReference("?attr/foo"));
-    EXPECT_TRUE(ResourceUtils::isAttributeReference("?android:attr/foo"));
+  EXPECT_TRUE(ResourceUtils::isAttributeReference("?android"));
+  EXPECT_TRUE(ResourceUtils::isAttributeReference("?android:foo"));
+  EXPECT_TRUE(ResourceUtils::isAttributeReference("?attr/foo"));
+  EXPECT_TRUE(ResourceUtils::isAttributeReference("?android:attr/foo"));
 }
 
 TEST(ResourceUtilsTest, FailParseIncompleteReference) {
-    EXPECT_FALSE(ResourceUtils::isAttributeReference("?style/foo"));
-    EXPECT_FALSE(ResourceUtils::isAttributeReference("?android:style/foo"));
-    EXPECT_FALSE(ResourceUtils::isAttributeReference("?android:"));
-    EXPECT_FALSE(ResourceUtils::isAttributeReference("?android:attr/"));
-    EXPECT_FALSE(ResourceUtils::isAttributeReference("?:attr/"));
-    EXPECT_FALSE(ResourceUtils::isAttributeReference("?:attr/foo"));
-    EXPECT_FALSE(ResourceUtils::isAttributeReference("?:/"));
-    EXPECT_FALSE(ResourceUtils::isAttributeReference("?:/foo"));
-    EXPECT_FALSE(ResourceUtils::isAttributeReference("?attr/"));
-    EXPECT_FALSE(ResourceUtils::isAttributeReference("?/foo"));
+  EXPECT_FALSE(ResourceUtils::isAttributeReference("?style/foo"));
+  EXPECT_FALSE(ResourceUtils::isAttributeReference("?android:style/foo"));
+  EXPECT_FALSE(ResourceUtils::isAttributeReference("?android:"));
+  EXPECT_FALSE(ResourceUtils::isAttributeReference("?android:attr/"));
+  EXPECT_FALSE(ResourceUtils::isAttributeReference("?:attr/"));
+  EXPECT_FALSE(ResourceUtils::isAttributeReference("?:attr/foo"));
+  EXPECT_FALSE(ResourceUtils::isAttributeReference("?:/"));
+  EXPECT_FALSE(ResourceUtils::isAttributeReference("?:/foo"));
+  EXPECT_FALSE(ResourceUtils::isAttributeReference("?attr/"));
+  EXPECT_FALSE(ResourceUtils::isAttributeReference("?/foo"));
 }
 
 TEST(ResourceUtilsTest, ParseStyleParentReference) {
-    const ResourceName kAndroidStyleFooName("android", ResourceType::kStyle, "foo");
-    const ResourceName kStyleFooName({}, ResourceType::kStyle, "foo");
+  const ResourceName kAndroidStyleFooName("android", ResourceType::kStyle,
+                                          "foo");
+  const ResourceName kStyleFooName({}, ResourceType::kStyle, "foo");
 
-    std::string errStr;
-    Maybe<Reference> ref = ResourceUtils::parseStyleParentReference("@android:style/foo", &errStr);
-    AAPT_ASSERT_TRUE(ref);
-    EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
+  std::string errStr;
+  Maybe<Reference> ref =
+      ResourceUtils::parseStyleParentReference("@android:style/foo", &errStr);
+  AAPT_ASSERT_TRUE(ref);
+  EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
 
-    ref = ResourceUtils::parseStyleParentReference("@style/foo", &errStr);
-    AAPT_ASSERT_TRUE(ref);
-    EXPECT_EQ(ref.value().name.value(), kStyleFooName);
+  ref = ResourceUtils::parseStyleParentReference("@style/foo", &errStr);
+  AAPT_ASSERT_TRUE(ref);
+  EXPECT_EQ(ref.value().name.value(), kStyleFooName);
 
-    ref = ResourceUtils::parseStyleParentReference("?android:style/foo", &errStr);
-    AAPT_ASSERT_TRUE(ref);
-    EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
+  ref = ResourceUtils::parseStyleParentReference("?android:style/foo", &errStr);
+  AAPT_ASSERT_TRUE(ref);
+  EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
 
-    ref = ResourceUtils::parseStyleParentReference("?style/foo", &errStr);
-    AAPT_ASSERT_TRUE(ref);
-    EXPECT_EQ(ref.value().name.value(), kStyleFooName);
+  ref = ResourceUtils::parseStyleParentReference("?style/foo", &errStr);
+  AAPT_ASSERT_TRUE(ref);
+  EXPECT_EQ(ref.value().name.value(), kStyleFooName);
 
-    ref = ResourceUtils::parseStyleParentReference("android:style/foo", &errStr);
-    AAPT_ASSERT_TRUE(ref);
-    EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
+  ref = ResourceUtils::parseStyleParentReference("android:style/foo", &errStr);
+  AAPT_ASSERT_TRUE(ref);
+  EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
 
-    ref = ResourceUtils::parseStyleParentReference("android:foo", &errStr);
-    AAPT_ASSERT_TRUE(ref);
-    EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
+  ref = ResourceUtils::parseStyleParentReference("android:foo", &errStr);
+  AAPT_ASSERT_TRUE(ref);
+  EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
 
-    ref = ResourceUtils::parseStyleParentReference("@android:foo", &errStr);
-    AAPT_ASSERT_TRUE(ref);
-    EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
+  ref = ResourceUtils::parseStyleParentReference("@android:foo", &errStr);
+  AAPT_ASSERT_TRUE(ref);
+  EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
 
-    ref = ResourceUtils::parseStyleParentReference("foo", &errStr);
-    AAPT_ASSERT_TRUE(ref);
-    EXPECT_EQ(ref.value().name.value(), kStyleFooName);
+  ref = ResourceUtils::parseStyleParentReference("foo", &errStr);
+  AAPT_ASSERT_TRUE(ref);
+  EXPECT_EQ(ref.value().name.value(), kStyleFooName);
 
-    ref = ResourceUtils::parseStyleParentReference("*android:style/foo", &errStr);
-    AAPT_ASSERT_TRUE(ref);
-    EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
-    EXPECT_TRUE(ref.value().privateReference);
+  ref = ResourceUtils::parseStyleParentReference("*android:style/foo", &errStr);
+  AAPT_ASSERT_TRUE(ref);
+  EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName);
+  EXPECT_TRUE(ref.value().privateReference);
 }
 
 TEST(ResourceUtilsTest, ParseEmptyFlag) {
-    std::unique_ptr<Attribute> attr = test::AttributeBuilder(false)
-            .setTypeMask(android::ResTable_map::TYPE_FLAGS)
-            .addItem("one", 0x01)
-            .addItem("two", 0x02)
-            .build();
+  std::unique_ptr<Attribute> attr =
+      test::AttributeBuilder(false)
+          .setTypeMask(android::ResTable_map::TYPE_FLAGS)
+          .addItem("one", 0x01)
+          .addItem("two", 0x02)
+          .build();
 
-    std::unique_ptr<BinaryPrimitive> result = ResourceUtils::tryParseFlagSymbol(attr.get(), "");
-    ASSERT_NE(nullptr, result);
-    EXPECT_EQ(0u, result->value.data);
+  std::unique_ptr<BinaryPrimitive> result =
+      ResourceUtils::tryParseFlagSymbol(attr.get(), "");
+  ASSERT_NE(nullptr, result);
+  EXPECT_EQ(0u, result->value.data);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/ResourceValues.cpp b/tools/aapt2/ResourceValues.cpp
index 492155d..60590b6 100644
--- a/tools/aapt2/ResourceValues.cpp
+++ b/tools/aapt2/ResourceValues.cpp
@@ -14,14 +14,14 @@
  * limitations under the License.
  */
 
+#include "ResourceValues.h"
 #include "Resource.h"
 #include "ResourceUtils.h"
-#include "ResourceValues.h"
 #include "ValueVisitor.h"
 #include "util/Util.h"
 
-#include <algorithm>
 #include <androidfw/ResourceTypes.h>
+#include <algorithm>
 #include <limits>
 #include <set>
 
@@ -29,742 +29,745 @@
 
 template <typename Derived>
 void BaseValue<Derived>::accept(RawValueVisitor* visitor) {
-    visitor->visit(static_cast<Derived*>(this));
+  visitor->visit(static_cast<Derived*>(this));
 }
 
 template <typename Derived>
 void BaseItem<Derived>::accept(RawValueVisitor* visitor) {
-    visitor->visit(static_cast<Derived*>(this));
+  visitor->visit(static_cast<Derived*>(this));
 }
 
-RawString::RawString(const StringPool::Ref& ref) : value(ref) {
-}
+RawString::RawString(const StringPool::Ref& ref) : value(ref) {}
 
 bool RawString::equals(const Value* value) const {
-    const RawString* other = valueCast<RawString>(value);
-    if (!other) {
-        return false;
-    }
-    return *this->value == *other->value;
+  const RawString* other = valueCast<RawString>(value);
+  if (!other) {
+    return false;
+  }
+  return *this->value == *other->value;
 }
 
 RawString* RawString::clone(StringPool* newPool) const {
-    RawString* rs = new RawString(newPool->makeRef(*value));
-    rs->mComment = mComment;
-    rs->mSource = mSource;
-    return rs;
+  RawString* rs = new RawString(newPool->makeRef(*value));
+  rs->mComment = mComment;
+  rs->mSource = mSource;
+  return rs;
 }
 
 bool RawString::flatten(android::Res_value* outValue) const {
-    outValue->dataType = android::Res_value::TYPE_STRING;
-    outValue->data = util::hostToDevice32(static_cast<uint32_t>(value.getIndex()));
-    return true;
+  outValue->dataType = android::Res_value::TYPE_STRING;
+  outValue->data =
+      util::hostToDevice32(static_cast<uint32_t>(value.getIndex()));
+  return true;
 }
 
 void RawString::print(std::ostream* out) const {
-    *out << "(raw string) " << *value;
+  *out << "(raw string) " << *value;
 }
 
-Reference::Reference() : referenceType(Type::kResource) {
-}
+Reference::Reference() : referenceType(Type::kResource) {}
 
-Reference::Reference(const ResourceNameRef& n, Type t) :
-        name(n.toResourceName()), referenceType(t) {
-}
+Reference::Reference(const ResourceNameRef& n, Type t)
+    : name(n.toResourceName()), referenceType(t) {}
 
-Reference::Reference(const ResourceId& i, Type type) : id(i), referenceType(type) {
-}
+Reference::Reference(const ResourceId& i, Type type)
+    : id(i), referenceType(type) {}
 
-Reference::Reference(const ResourceNameRef& n, const ResourceId& i) :
-        name(n.toResourceName()), id(i), referenceType(Type::kResource) {
-}
+Reference::Reference(const ResourceNameRef& n, const ResourceId& i)
+    : name(n.toResourceName()), id(i), referenceType(Type::kResource) {}
 
 bool Reference::equals(const Value* value) const {
-    const Reference* other = valueCast<Reference>(value);
-    if (!other) {
-        return false;
-    }
-    return referenceType == other->referenceType && privateReference == other->privateReference &&
-            id == other->id && name == other->name;
+  const Reference* other = valueCast<Reference>(value);
+  if (!other) {
+    return false;
+  }
+  return referenceType == other->referenceType &&
+         privateReference == other->privateReference && id == other->id &&
+         name == other->name;
 }
 
 bool Reference::flatten(android::Res_value* outValue) const {
-    outValue->dataType = (referenceType == Reference::Type::kResource) ?
-            android::Res_value::TYPE_REFERENCE : android::Res_value::TYPE_ATTRIBUTE;
-    outValue->data = util::hostToDevice32(id ? id.value().id : 0);
-    return true;
+  outValue->dataType = (referenceType == Reference::Type::kResource)
+                           ? android::Res_value::TYPE_REFERENCE
+                           : android::Res_value::TYPE_ATTRIBUTE;
+  outValue->data = util::hostToDevice32(id ? id.value().id : 0);
+  return true;
 }
 
 Reference* Reference::clone(StringPool* /*newPool*/) const {
-    return new Reference(*this);
+  return new Reference(*this);
 }
 
 void Reference::print(std::ostream* out) const {
-    *out << "(reference) ";
-    if (referenceType == Reference::Type::kResource) {
-        *out << "@";
-        if (privateReference) {
-            *out << "*";
-        }
-    } else {
-        *out << "?";
+  *out << "(reference) ";
+  if (referenceType == Reference::Type::kResource) {
+    *out << "@";
+    if (privateReference) {
+      *out << "*";
     }
+  } else {
+    *out << "?";
+  }
 
-    if (name) {
-        *out << name.value();
-    }
+  if (name) {
+    *out << name.value();
+  }
 
-    if (id && !Res_INTERNALID(id.value().id)) {
-        *out << " " << id.value();
-    }
+  if (id && !Res_INTERNALID(id.value().id)) {
+    *out << " " << id.value();
+  }
 }
 
 bool Id::equals(const Value* value) const {
-    return valueCast<Id>(value) != nullptr;
+  return valueCast<Id>(value) != nullptr;
 }
 
 bool Id::flatten(android::Res_value* out) const {
-    out->dataType = android::Res_value::TYPE_INT_BOOLEAN;
-    out->data = util::hostToDevice32(0);
-    return true;
+  out->dataType = android::Res_value::TYPE_INT_BOOLEAN;
+  out->data = util::hostToDevice32(0);
+  return true;
 }
 
-Id* Id::clone(StringPool* /*newPool*/) const {
-    return new Id(*this);
-}
+Id* Id::clone(StringPool* /*newPool*/) const { return new Id(*this); }
 
-void Id::print(std::ostream* out) const {
-    *out << "(id)";
-}
+void Id::print(std::ostream* out) const { *out << "(id)"; }
 
-String::String(const StringPool::Ref& ref) : value(ref) {
-}
+String::String(const StringPool::Ref& ref) : value(ref) {}
 
 bool String::equals(const Value* value) const {
-    const String* other = valueCast<String>(value);
-    if (!other) {
-        return false;
-    }
-    return *this->value == *other->value;
+  const String* other = valueCast<String>(value);
+  if (!other) {
+    return false;
+  }
+  return *this->value == *other->value;
 }
 
 bool String::flatten(android::Res_value* outValue) const {
-    // Verify that our StringPool index is within encode-able limits.
-    if (value.getIndex() > std::numeric_limits<uint32_t>::max()) {
-        return false;
-    }
+  // Verify that our StringPool index is within encode-able limits.
+  if (value.getIndex() > std::numeric_limits<uint32_t>::max()) {
+    return false;
+  }
 
-    outValue->dataType = android::Res_value::TYPE_STRING;
-    outValue->data = util::hostToDevice32(static_cast<uint32_t>(value.getIndex()));
-    return true;
+  outValue->dataType = android::Res_value::TYPE_STRING;
+  outValue->data =
+      util::hostToDevice32(static_cast<uint32_t>(value.getIndex()));
+  return true;
 }
 
 String* String::clone(StringPool* newPool) const {
-    String* str = new String(newPool->makeRef(*value));
-    str->mComment = mComment;
-    str->mSource = mSource;
-    return str;
+  String* str = new String(newPool->makeRef(*value));
+  str->mComment = mComment;
+  str->mSource = mSource;
+  return str;
 }
 
 void String::print(std::ostream* out) const {
-    *out << "(string) \"" << *value << "\"";
+  *out << "(string) \"" << *value << "\"";
 }
 
-StyledString::StyledString(const StringPool::StyleRef& ref) : value(ref) {
-}
+StyledString::StyledString(const StringPool::StyleRef& ref) : value(ref) {}
 
 bool StyledString::equals(const Value* value) const {
-    const StyledString* other = valueCast<StyledString>(value);
-    if (!other) {
-        return false;
-    }
-
-    if (*this->value->str == *other->value->str) {
-        const std::vector<StringPool::Span>& spansA = this->value->spans;
-        const std::vector<StringPool::Span>& spansB = other->value->spans;
-        return std::equal(spansA.begin(), spansA.end(), spansB.begin(),
-                          [](const StringPool::Span& a, const StringPool::Span& b) -> bool {
-            return *a.name == *b.name && a.firstChar == b.firstChar && a.lastChar == b.lastChar;
-        });
-    }
+  const StyledString* other = valueCast<StyledString>(value);
+  if (!other) {
     return false;
+  }
+
+  if (*this->value->str == *other->value->str) {
+    const std::vector<StringPool::Span>& spansA = this->value->spans;
+    const std::vector<StringPool::Span>& spansB = other->value->spans;
+    return std::equal(
+        spansA.begin(), spansA.end(), spansB.begin(),
+        [](const StringPool::Span& a, const StringPool::Span& b) -> bool {
+          return *a.name == *b.name && a.firstChar == b.firstChar &&
+                 a.lastChar == b.lastChar;
+        });
+  }
+  return false;
 }
 
 bool StyledString::flatten(android::Res_value* outValue) const {
-    if (value.getIndex() > std::numeric_limits<uint32_t>::max()) {
-        return false;
-    }
+  if (value.getIndex() > std::numeric_limits<uint32_t>::max()) {
+    return false;
+  }
 
-    outValue->dataType = android::Res_value::TYPE_STRING;
-    outValue->data = util::hostToDevice32(static_cast<uint32_t>(value.getIndex()));
-    return true;
+  outValue->dataType = android::Res_value::TYPE_STRING;
+  outValue->data =
+      util::hostToDevice32(static_cast<uint32_t>(value.getIndex()));
+  return true;
 }
 
 StyledString* StyledString::clone(StringPool* newPool) const {
-    StyledString* str = new StyledString(newPool->makeRef(value));
-    str->mComment = mComment;
-    str->mSource = mSource;
-    return str;
+  StyledString* str = new StyledString(newPool->makeRef(value));
+  str->mComment = mComment;
+  str->mSource = mSource;
+  return str;
 }
 
 void StyledString::print(std::ostream* out) const {
-    *out << "(styled string) \"" << *value->str << "\"";
-    for (const StringPool::Span& span : value->spans) {
-        *out << " "<< *span.name << ":" << span.firstChar << "," << span.lastChar;
-    }
+  *out << "(styled string) \"" << *value->str << "\"";
+  for (const StringPool::Span& span : value->spans) {
+    *out << " " << *span.name << ":" << span.firstChar << "," << span.lastChar;
+  }
 }
 
-FileReference::FileReference(const StringPool::Ref& _path) : path(_path) {
-}
+FileReference::FileReference(const StringPool::Ref& _path) : path(_path) {}
 
 bool FileReference::equals(const Value* value) const {
-    const FileReference* other = valueCast<FileReference>(value);
-    if (!other) {
-        return false;
-    }
-    return *path == *other->path;
+  const FileReference* other = valueCast<FileReference>(value);
+  if (!other) {
+    return false;
+  }
+  return *path == *other->path;
 }
 
 bool FileReference::flatten(android::Res_value* outValue) const {
-    if (path.getIndex() > std::numeric_limits<uint32_t>::max()) {
-        return false;
-    }
+  if (path.getIndex() > std::numeric_limits<uint32_t>::max()) {
+    return false;
+  }
 
-    outValue->dataType = android::Res_value::TYPE_STRING;
-    outValue->data = util::hostToDevice32(static_cast<uint32_t>(path.getIndex()));
-    return true;
+  outValue->dataType = android::Res_value::TYPE_STRING;
+  outValue->data = util::hostToDevice32(static_cast<uint32_t>(path.getIndex()));
+  return true;
 }
 
 FileReference* FileReference::clone(StringPool* newPool) const {
-    FileReference* fr = new FileReference(newPool->makeRef(*path));
-    fr->file = file;
-    fr->mComment = mComment;
-    fr->mSource = mSource;
-    return fr;
+  FileReference* fr = new FileReference(newPool->makeRef(*path));
+  fr->file = file;
+  fr->mComment = mComment;
+  fr->mSource = mSource;
+  return fr;
 }
 
 void FileReference::print(std::ostream* out) const {
-    *out << "(file) " << *path;
+  *out << "(file) " << *path;
 }
 
-BinaryPrimitive::BinaryPrimitive(const android::Res_value& val) : value(val) {
-}
+BinaryPrimitive::BinaryPrimitive(const android::Res_value& val) : value(val) {}
 
 BinaryPrimitive::BinaryPrimitive(uint8_t dataType, uint32_t data) {
-    value.dataType = dataType;
-    value.data = data;
+  value.dataType = dataType;
+  value.data = data;
 }
 
 bool BinaryPrimitive::equals(const Value* value) const {
-    const BinaryPrimitive* other = valueCast<BinaryPrimitive>(value);
-    if (!other) {
-        return false;
-    }
-    return this->value.dataType == other->value.dataType && this->value.data == other->value.data;
+  const BinaryPrimitive* other = valueCast<BinaryPrimitive>(value);
+  if (!other) {
+    return false;
+  }
+  return this->value.dataType == other->value.dataType &&
+         this->value.data == other->value.data;
 }
 
 bool BinaryPrimitive::flatten(android::Res_value* outValue) const {
-    outValue->dataType = value.dataType;
-    outValue->data = util::hostToDevice32(value.data);
-    return true;
+  outValue->dataType = value.dataType;
+  outValue->data = util::hostToDevice32(value.data);
+  return true;
 }
 
 BinaryPrimitive* BinaryPrimitive::clone(StringPool* /*newPool*/) const {
-    return new BinaryPrimitive(*this);
+  return new BinaryPrimitive(*this);
 }
 
 void BinaryPrimitive::print(std::ostream* out) const {
-    switch (value.dataType) {
-        case android::Res_value::TYPE_NULL:
-            *out << "(null)";
-            break;
-        case android::Res_value::TYPE_INT_DEC:
-            *out << "(integer) " << static_cast<int32_t>(value.data);
-            break;
-        case android::Res_value::TYPE_INT_HEX:
-            *out << "(integer) 0x" << std::hex << value.data << std::dec;
-            break;
-        case android::Res_value::TYPE_INT_BOOLEAN:
-            *out << "(boolean) " << (value.data != 0 ? "true" : "false");
-            break;
-        case android::Res_value::TYPE_INT_COLOR_ARGB8:
-        case android::Res_value::TYPE_INT_COLOR_RGB8:
-        case android::Res_value::TYPE_INT_COLOR_ARGB4:
-        case android::Res_value::TYPE_INT_COLOR_RGB4:
-            *out << "(color) #" << std::hex << value.data << std::dec;
-            break;
-        default:
-            *out << "(unknown 0x" << std::hex << (int) value.dataType << ") 0x"
-                 << std::hex << value.data << std::dec;
-            break;
-    }
+  switch (value.dataType) {
+    case android::Res_value::TYPE_NULL:
+      *out << "(null)";
+      break;
+    case android::Res_value::TYPE_INT_DEC:
+      *out << "(integer) " << static_cast<int32_t>(value.data);
+      break;
+    case android::Res_value::TYPE_INT_HEX:
+      *out << "(integer) 0x" << std::hex << value.data << std::dec;
+      break;
+    case android::Res_value::TYPE_INT_BOOLEAN:
+      *out << "(boolean) " << (value.data != 0 ? "true" : "false");
+      break;
+    case android::Res_value::TYPE_INT_COLOR_ARGB8:
+    case android::Res_value::TYPE_INT_COLOR_RGB8:
+    case android::Res_value::TYPE_INT_COLOR_ARGB4:
+    case android::Res_value::TYPE_INT_COLOR_RGB4:
+      *out << "(color) #" << std::hex << value.data << std::dec;
+      break;
+    default:
+      *out << "(unknown 0x" << std::hex << (int)value.dataType << ") 0x"
+           << std::hex << value.data << std::dec;
+      break;
+  }
 }
 
-Attribute::Attribute(bool w, uint32_t t) :
-        typeMask(t),
-        minInt(std::numeric_limits<int32_t>::min()),
-        maxInt(std::numeric_limits<int32_t>::max()) {
-    mWeak = w;
+Attribute::Attribute(bool w, uint32_t t)
+    : typeMask(t),
+      minInt(std::numeric_limits<int32_t>::min()),
+      maxInt(std::numeric_limits<int32_t>::max()) {
+  mWeak = w;
 }
 
 template <typename T>
 T* addPointer(T& val) {
-    return &val;
+  return &val;
 }
 
 bool Attribute::equals(const Value* value) const {
-    const Attribute* other = valueCast<Attribute>(value);
-    if (!other) {
-        return false;
-    }
+  const Attribute* other = valueCast<Attribute>(value);
+  if (!other) {
+    return false;
+  }
 
-    if (symbols.size() != other->symbols.size()) {
-        return false;
-    }
+  if (symbols.size() != other->symbols.size()) {
+    return false;
+  }
 
-    if (typeMask != other->typeMask || minInt != other->minInt || maxInt != other->maxInt) {
-        return false;
-    }
+  if (typeMask != other->typeMask || minInt != other->minInt ||
+      maxInt != other->maxInt) {
+    return false;
+  }
 
-    std::vector<const Symbol*> sortedA;
-    std::transform(symbols.begin(), symbols.end(),
-                   std::back_inserter(sortedA), addPointer<const Symbol>);
-    std::sort(sortedA.begin(), sortedA.end(), [](const Symbol* a, const Symbol* b) -> bool {
-        return a->symbol.name < b->symbol.name;
-    });
+  std::vector<const Symbol*> sortedA;
+  std::transform(symbols.begin(), symbols.end(), std::back_inserter(sortedA),
+                 addPointer<const Symbol>);
+  std::sort(sortedA.begin(), sortedA.end(),
+            [](const Symbol* a, const Symbol* b) -> bool {
+              return a->symbol.name < b->symbol.name;
+            });
 
-    std::vector<const Symbol*> sortedB;
-    std::transform(other->symbols.begin(), other->symbols.end(),
-                   std::back_inserter(sortedB), addPointer<const Symbol>);
-    std::sort(sortedB.begin(), sortedB.end(), [](const Symbol* a, const Symbol* b) -> bool {
-        return a->symbol.name < b->symbol.name;
-    });
+  std::vector<const Symbol*> sortedB;
+  std::transform(other->symbols.begin(), other->symbols.end(),
+                 std::back_inserter(sortedB), addPointer<const Symbol>);
+  std::sort(sortedB.begin(), sortedB.end(),
+            [](const Symbol* a, const Symbol* b) -> bool {
+              return a->symbol.name < b->symbol.name;
+            });
 
-    return std::equal(sortedA.begin(), sortedA.end(), sortedB.begin(),
-                      [](const Symbol* a, const Symbol* b) -> bool {
-        return a->symbol.equals(&b->symbol) && a->value == b->value;
-    });
+  return std::equal(sortedA.begin(), sortedA.end(), sortedB.begin(),
+                    [](const Symbol* a, const Symbol* b) -> bool {
+                      return a->symbol.equals(&b->symbol) &&
+                             a->value == b->value;
+                    });
 }
 
 Attribute* Attribute::clone(StringPool* /*newPool*/) const {
-    return new Attribute(*this);
+  return new Attribute(*this);
 }
 
 void Attribute::printMask(std::ostream* out) const {
-    if (typeMask == android::ResTable_map::TYPE_ANY) {
-        *out << "any";
-        return;
-    }
+  if (typeMask == android::ResTable_map::TYPE_ANY) {
+    *out << "any";
+    return;
+  }
 
-    bool set = false;
-    if ((typeMask & android::ResTable_map::TYPE_REFERENCE) != 0) {
-        if (!set) {
-            set = true;
-        } else {
-            *out << "|";
-        }
-        *out << "reference";
+  bool set = false;
+  if ((typeMask & android::ResTable_map::TYPE_REFERENCE) != 0) {
+    if (!set) {
+      set = true;
+    } else {
+      *out << "|";
     }
+    *out << "reference";
+  }
 
-    if ((typeMask & android::ResTable_map::TYPE_STRING) != 0) {
-        if (!set) {
-            set = true;
-        } else {
-            *out << "|";
-        }
-        *out << "string";
+  if ((typeMask & android::ResTable_map::TYPE_STRING) != 0) {
+    if (!set) {
+      set = true;
+    } else {
+      *out << "|";
     }
+    *out << "string";
+  }
 
-    if ((typeMask & android::ResTable_map::TYPE_INTEGER) != 0) {
-        if (!set) {
-            set = true;
-        } else {
-            *out << "|";
-        }
-        *out << "integer";
+  if ((typeMask & android::ResTable_map::TYPE_INTEGER) != 0) {
+    if (!set) {
+      set = true;
+    } else {
+      *out << "|";
     }
+    *out << "integer";
+  }
 
-    if ((typeMask & android::ResTable_map::TYPE_BOOLEAN) != 0) {
-        if (!set) {
-            set = true;
-        } else {
-            *out << "|";
-        }
-        *out << "boolean";
+  if ((typeMask & android::ResTable_map::TYPE_BOOLEAN) != 0) {
+    if (!set) {
+      set = true;
+    } else {
+      *out << "|";
     }
+    *out << "boolean";
+  }
 
-    if ((typeMask & android::ResTable_map::TYPE_COLOR) != 0) {
-        if (!set) {
-            set = true;
-        } else {
-            *out << "|";
-        }
-        *out << "color";
+  if ((typeMask & android::ResTable_map::TYPE_COLOR) != 0) {
+    if (!set) {
+      set = true;
+    } else {
+      *out << "|";
     }
+    *out << "color";
+  }
 
-    if ((typeMask & android::ResTable_map::TYPE_FLOAT) != 0) {
-        if (!set) {
-            set = true;
-        } else {
-            *out << "|";
-        }
-        *out << "float";
+  if ((typeMask & android::ResTable_map::TYPE_FLOAT) != 0) {
+    if (!set) {
+      set = true;
+    } else {
+      *out << "|";
     }
+    *out << "float";
+  }
 
-    if ((typeMask & android::ResTable_map::TYPE_DIMENSION) != 0) {
-        if (!set) {
-            set = true;
-        } else {
-            *out << "|";
-        }
-        *out << "dimension";
+  if ((typeMask & android::ResTable_map::TYPE_DIMENSION) != 0) {
+    if (!set) {
+      set = true;
+    } else {
+      *out << "|";
     }
+    *out << "dimension";
+  }
 
-    if ((typeMask & android::ResTable_map::TYPE_FRACTION) != 0) {
-        if (!set) {
-            set = true;
-        } else {
-            *out << "|";
-        }
-        *out << "fraction";
+  if ((typeMask & android::ResTable_map::TYPE_FRACTION) != 0) {
+    if (!set) {
+      set = true;
+    } else {
+      *out << "|";
     }
+    *out << "fraction";
+  }
 
-    if ((typeMask & android::ResTable_map::TYPE_ENUM) != 0) {
-        if (!set) {
-            set = true;
-        } else {
-            *out << "|";
-        }
-        *out << "enum";
+  if ((typeMask & android::ResTable_map::TYPE_ENUM) != 0) {
+    if (!set) {
+      set = true;
+    } else {
+      *out << "|";
     }
+    *out << "enum";
+  }
 
-    if ((typeMask & android::ResTable_map::TYPE_FLAGS) != 0) {
-        if (!set) {
-            set = true;
-        } else {
-            *out << "|";
-        }
-        *out << "flags";
+  if ((typeMask & android::ResTable_map::TYPE_FLAGS) != 0) {
+    if (!set) {
+      set = true;
+    } else {
+      *out << "|";
     }
+    *out << "flags";
+  }
 }
 
 void Attribute::print(std::ostream* out) const {
-    *out << "(attr) ";
-    printMask(out);
+  *out << "(attr) ";
+  printMask(out);
 
-    if (!symbols.empty()) {
-        *out << " [" << util::joiner(symbols, ", ") << "]";
-    }
+  if (!symbols.empty()) {
+    *out << " [" << util::joiner(symbols, ", ") << "]";
+  }
 
-    if (minInt != std::numeric_limits<int32_t>::min()) {
-        *out << " min=" << minInt;
-    }
+  if (minInt != std::numeric_limits<int32_t>::min()) {
+    *out << " min=" << minInt;
+  }
 
-    if (maxInt != std::numeric_limits<int32_t>::max()) {
-        *out << " max=" << maxInt;
-    }
+  if (maxInt != std::numeric_limits<int32_t>::max()) {
+    *out << " max=" << maxInt;
+  }
 
-    if (isWeak()) {
-        *out << " [weak]";
-    }
+  if (isWeak()) {
+    *out << " [weak]";
+  }
 }
 
-static void buildAttributeMismatchMessage(DiagMessage* msg, const Attribute* attr,
+static void buildAttributeMismatchMessage(DiagMessage* msg,
+                                          const Attribute* attr,
                                           const Item* value) {
-    *msg << "expected";
-    if (attr->typeMask & android::ResTable_map::TYPE_BOOLEAN) {
-        *msg << " boolean";
-    }
+  *msg << "expected";
+  if (attr->typeMask & android::ResTable_map::TYPE_BOOLEAN) {
+    *msg << " boolean";
+  }
 
-    if (attr->typeMask & android::ResTable_map::TYPE_COLOR) {
-        *msg << " color";
-    }
+  if (attr->typeMask & android::ResTable_map::TYPE_COLOR) {
+    *msg << " color";
+  }
 
-    if (attr->typeMask & android::ResTable_map::TYPE_DIMENSION) {
-        *msg << " dimension";
-    }
+  if (attr->typeMask & android::ResTable_map::TYPE_DIMENSION) {
+    *msg << " dimension";
+  }
 
-    if (attr->typeMask & android::ResTable_map::TYPE_ENUM) {
-        *msg << " enum";
-    }
+  if (attr->typeMask & android::ResTable_map::TYPE_ENUM) {
+    *msg << " enum";
+  }
 
-    if (attr->typeMask & android::ResTable_map::TYPE_FLAGS) {
-        *msg << " flags";
-    }
+  if (attr->typeMask & android::ResTable_map::TYPE_FLAGS) {
+    *msg << " flags";
+  }
 
-    if (attr->typeMask & android::ResTable_map::TYPE_FLOAT) {
-        *msg << " float";
-    }
+  if (attr->typeMask & android::ResTable_map::TYPE_FLOAT) {
+    *msg << " float";
+  }
 
-    if (attr->typeMask & android::ResTable_map::TYPE_FRACTION) {
-        *msg << " fraction";
-    }
+  if (attr->typeMask & android::ResTable_map::TYPE_FRACTION) {
+    *msg << " fraction";
+  }
 
-    if (attr->typeMask & android::ResTable_map::TYPE_INTEGER) {
-        *msg << " integer";
-    }
+  if (attr->typeMask & android::ResTable_map::TYPE_INTEGER) {
+    *msg << " integer";
+  }
 
-    if (attr->typeMask & android::ResTable_map::TYPE_REFERENCE) {
-        *msg << " reference";
-    }
+  if (attr->typeMask & android::ResTable_map::TYPE_REFERENCE) {
+    *msg << " reference";
+  }
 
-    if (attr->typeMask & android::ResTable_map::TYPE_STRING) {
-        *msg << " string";
-    }
+  if (attr->typeMask & android::ResTable_map::TYPE_STRING) {
+    *msg << " string";
+  }
 
-    *msg << " but got " << *value;
+  *msg << " but got " << *value;
 }
 
 bool Attribute::matches(const Item* item, DiagMessage* outMsg) const {
-    android::Res_value val = {};
-    item->flatten(&val);
+  android::Res_value val = {};
+  item->flatten(&val);
 
-    // Always allow references.
-    const uint32_t mask = typeMask | android::ResTable_map::TYPE_REFERENCE;
-    if (!(mask & ResourceUtils::androidTypeToAttributeTypeMask(val.dataType))) {
-        if (outMsg) {
-            buildAttributeMismatchMessage(outMsg, this, item);
-        }
-        return false;
-
-    } else if (ResourceUtils::androidTypeToAttributeTypeMask(val.dataType) &
-            android::ResTable_map::TYPE_INTEGER) {
-        if (static_cast<int32_t>(util::deviceToHost32(val.data)) < minInt) {
-            if (outMsg) {
-                *outMsg << *item << " is less than minimum integer " << minInt;
-            }
-            return false;
-        } else if (static_cast<int32_t>(util::deviceToHost32(val.data)) > maxInt) {
-            if (outMsg) {
-                *outMsg << *item << " is greater than maximum integer " << maxInt;
-            }
-            return false;
-        }
+  // Always allow references.
+  const uint32_t mask = typeMask | android::ResTable_map::TYPE_REFERENCE;
+  if (!(mask & ResourceUtils::androidTypeToAttributeTypeMask(val.dataType))) {
+    if (outMsg) {
+      buildAttributeMismatchMessage(outMsg, this, item);
     }
-    return true;
+    return false;
+
+  } else if (ResourceUtils::androidTypeToAttributeTypeMask(val.dataType) &
+             android::ResTable_map::TYPE_INTEGER) {
+    if (static_cast<int32_t>(util::deviceToHost32(val.data)) < minInt) {
+      if (outMsg) {
+        *outMsg << *item << " is less than minimum integer " << minInt;
+      }
+      return false;
+    } else if (static_cast<int32_t>(util::deviceToHost32(val.data)) > maxInt) {
+      if (outMsg) {
+        *outMsg << *item << " is greater than maximum integer " << maxInt;
+      }
+      return false;
+    }
+  }
+  return true;
 }
 
 bool Style::equals(const Value* value) const {
-    const Style* other = valueCast<Style>(value);
-    if (!other) {
-        return false;
-    }
-    if (bool(parent) != bool(other->parent) ||
-            (parent && other->parent && !parent.value().equals(&other->parent.value()))) {
-        return false;
-    }
+  const Style* other = valueCast<Style>(value);
+  if (!other) {
+    return false;
+  }
+  if (bool(parent) != bool(other->parent) ||
+      (parent && other->parent &&
+       !parent.value().equals(&other->parent.value()))) {
+    return false;
+  }
 
-    if (entries.size() != other->entries.size()) {
-        return false;
-    }
+  if (entries.size() != other->entries.size()) {
+    return false;
+  }
 
-    std::vector<const Entry*> sortedA;
-    std::transform(entries.begin(), entries.end(),
-                   std::back_inserter(sortedA), addPointer<const Entry>);
-    std::sort(sortedA.begin(), sortedA.end(), [](const Entry* a, const Entry* b) -> bool {
-        return a->key.name < b->key.name;
-    });
+  std::vector<const Entry*> sortedA;
+  std::transform(entries.begin(), entries.end(), std::back_inserter(sortedA),
+                 addPointer<const Entry>);
+  std::sort(sortedA.begin(), sortedA.end(),
+            [](const Entry* a, const Entry* b) -> bool {
+              return a->key.name < b->key.name;
+            });
 
-    std::vector<const Entry*> sortedB;
-    std::transform(other->entries.begin(), other->entries.end(),
-                   std::back_inserter(sortedB), addPointer<const Entry>);
-    std::sort(sortedB.begin(), sortedB.end(), [](const Entry* a, const Entry* b) -> bool {
-        return a->key.name < b->key.name;
-    });
+  std::vector<const Entry*> sortedB;
+  std::transform(other->entries.begin(), other->entries.end(),
+                 std::back_inserter(sortedB), addPointer<const Entry>);
+  std::sort(sortedB.begin(), sortedB.end(),
+            [](const Entry* a, const Entry* b) -> bool {
+              return a->key.name < b->key.name;
+            });
 
-    return std::equal(sortedA.begin(), sortedA.end(), sortedB.begin(),
-                      [](const Entry* a, const Entry* b) -> bool {
-        return a->key.equals(&b->key) && a->value->equals(b->value.get());
-    });
+  return std::equal(sortedA.begin(), sortedA.end(), sortedB.begin(),
+                    [](const Entry* a, const Entry* b) -> bool {
+                      return a->key.equals(&b->key) &&
+                             a->value->equals(b->value.get());
+                    });
 }
 
 Style* Style::clone(StringPool* newPool) const {
-    Style* style = new Style();
-    style->parent = parent;
-    style->parentInferred = parentInferred;
-    style->mComment = mComment;
-    style->mSource = mSource;
-    for (auto& entry : entries) {
-        style->entries.push_back(Entry{
-                entry.key,
-                std::unique_ptr<Item>(entry.value->clone(newPool))
-        });
-    }
-    return style;
+  Style* style = new Style();
+  style->parent = parent;
+  style->parentInferred = parentInferred;
+  style->mComment = mComment;
+  style->mSource = mSource;
+  for (auto& entry : entries) {
+    style->entries.push_back(
+        Entry{entry.key, std::unique_ptr<Item>(entry.value->clone(newPool))});
+  }
+  return style;
 }
 
 void Style::print(std::ostream* out) const {
-    *out << "(style) ";
-    if (parent && parent.value().name) {
-        if (parent.value().privateReference) {
-            *out << "*";
-        }
-        *out << parent.value().name.value();
+  *out << "(style) ";
+  if (parent && parent.value().name) {
+    if (parent.value().privateReference) {
+      *out << "*";
     }
-    *out << " ["
-        << util::joiner(entries, ", ")
-        << "]";
+    *out << parent.value().name.value();
+  }
+  *out << " [" << util::joiner(entries, ", ") << "]";
 }
 
-static ::std::ostream& operator<<(::std::ostream& out, const Style::Entry& value) {
-    if (value.key.name) {
-        out << value.key.name.value();
-    } else if (value.key.id) {
-        out << value.key.id.value();
-    } else {
-        out << "???";
-    }
-    out << " = ";
-    value.value->print(&out);
-    return out;
+static ::std::ostream& operator<<(::std::ostream& out,
+                                  const Style::Entry& value) {
+  if (value.key.name) {
+    out << value.key.name.value();
+  } else if (value.key.id) {
+    out << value.key.id.value();
+  } else {
+    out << "???";
+  }
+  out << " = ";
+  value.value->print(&out);
+  return out;
 }
 
 bool Array::equals(const Value* value) const {
-    const Array* other = valueCast<Array>(value);
-    if (!other) {
-        return false;
-    }
+  const Array* other = valueCast<Array>(value);
+  if (!other) {
+    return false;
+  }
 
-    if (items.size() != other->items.size()) {
-        return false;
-    }
+  if (items.size() != other->items.size()) {
+    return false;
+  }
 
-    return std::equal(items.begin(), items.end(), other->items.begin(),
-                      [](const std::unique_ptr<Item>& a, const std::unique_ptr<Item>& b) -> bool {
-        return a->equals(b.get());
-    });
+  return std::equal(items.begin(), items.end(), other->items.begin(),
+                    [](const std::unique_ptr<Item>& a,
+                       const std::unique_ptr<Item>& b) -> bool {
+                      return a->equals(b.get());
+                    });
 }
 
 Array* Array::clone(StringPool* newPool) const {
-    Array* array = new Array();
-    array->mComment = mComment;
-    array->mSource = mSource;
-    for (auto& item : items) {
-        array->items.emplace_back(std::unique_ptr<Item>(item->clone(newPool)));
-    }
-    return array;
+  Array* array = new Array();
+  array->mComment = mComment;
+  array->mSource = mSource;
+  for (auto& item : items) {
+    array->items.emplace_back(std::unique_ptr<Item>(item->clone(newPool)));
+  }
+  return array;
 }
 
 void Array::print(std::ostream* out) const {
-    *out << "(array) ["
-        << util::joiner(items, ", ")
-        << "]";
+  *out << "(array) [" << util::joiner(items, ", ") << "]";
 }
 
 bool Plural::equals(const Value* value) const {
-    const Plural* other = valueCast<Plural>(value);
-    if (!other) {
-        return false;
-    }
+  const Plural* other = valueCast<Plural>(value);
+  if (!other) {
+    return false;
+  }
 
-    if (values.size() != other->values.size()) {
-        return false;
-    }
+  if (values.size() != other->values.size()) {
+    return false;
+  }
 
-    return std::equal(values.begin(), values.end(), other->values.begin(),
-                      [](const std::unique_ptr<Item>& a, const std::unique_ptr<Item>& b) -> bool {
-        if (bool(a) != bool(b)) {
-            return false;
-        }
-        return bool(a) == bool(b) || a->equals(b.get());
-    });
+  return std::equal(values.begin(), values.end(), other->values.begin(),
+                    [](const std::unique_ptr<Item>& a,
+                       const std::unique_ptr<Item>& b) -> bool {
+                      if (bool(a) != bool(b)) {
+                        return false;
+                      }
+                      return bool(a) == bool(b) || a->equals(b.get());
+                    });
 }
 
 Plural* Plural::clone(StringPool* newPool) const {
-    Plural* p = new Plural();
-    p->mComment = mComment;
-    p->mSource = mSource;
-    const size_t count = values.size();
-    for (size_t i = 0; i < count; i++) {
-        if (values[i]) {
-            p->values[i] = std::unique_ptr<Item>(values[i]->clone(newPool));
-        }
+  Plural* p = new Plural();
+  p->mComment = mComment;
+  p->mSource = mSource;
+  const size_t count = values.size();
+  for (size_t i = 0; i < count; i++) {
+    if (values[i]) {
+      p->values[i] = std::unique_ptr<Item>(values[i]->clone(newPool));
     }
-    return p;
+  }
+  return p;
 }
 
 void Plural::print(std::ostream* out) const {
-    *out << "(plural)";
-    if (values[Zero]) {
-        *out << " zero=" << *values[Zero];
-    }
+  *out << "(plural)";
+  if (values[Zero]) {
+    *out << " zero=" << *values[Zero];
+  }
 
-    if (values[One]) {
-        *out << " one=" << *values[One];
-    }
+  if (values[One]) {
+    *out << " one=" << *values[One];
+  }
 
-    if (values[Two]) {
-        *out << " two=" << *values[Two];
-    }
+  if (values[Two]) {
+    *out << " two=" << *values[Two];
+  }
 
-    if (values[Few]) {
-        *out << " few=" << *values[Few];
-    }
+  if (values[Few]) {
+    *out << " few=" << *values[Few];
+  }
 
-    if (values[Many]) {
-        *out << " many=" << *values[Many];
-    }
+  if (values[Many]) {
+    *out << " many=" << *values[Many];
+  }
 }
 
-static ::std::ostream& operator<<(::std::ostream& out, const std::unique_ptr<Item>& item) {
-    return out << *item;
+static ::std::ostream& operator<<(::std::ostream& out,
+                                  const std::unique_ptr<Item>& item) {
+  return out << *item;
 }
 
 bool Styleable::equals(const Value* value) const {
-    const Styleable* other = valueCast<Styleable>(value);
-    if (!other) {
-        return false;
-    }
+  const Styleable* other = valueCast<Styleable>(value);
+  if (!other) {
+    return false;
+  }
 
-    if (entries.size() != other->entries.size()) {
-        return false;
-    }
+  if (entries.size() != other->entries.size()) {
+    return false;
+  }
 
-    return std::equal(entries.begin(), entries.end(), other->entries.begin(),
-                      [](const Reference& a, const Reference& b) -> bool {
-        return a.equals(&b);
-    });
+  return std::equal(entries.begin(), entries.end(), other->entries.begin(),
+                    [](const Reference& a, const Reference& b) -> bool {
+                      return a.equals(&b);
+                    });
 }
 
 Styleable* Styleable::clone(StringPool* /*newPool*/) const {
-    return new Styleable(*this);
+  return new Styleable(*this);
 }
 
 void Styleable::print(std::ostream* out) const {
-    *out << "(styleable) " << " ["
-        << util::joiner(entries, ", ")
-        << "]";
+  *out << "(styleable) "
+       << " [" << util::joiner(entries, ", ") << "]";
 }
 
 bool operator<(const Reference& a, const Reference& b) {
-    int cmp = a.name.valueOrDefault({}).compare(b.name.valueOrDefault({}));
-    if (cmp != 0) return cmp < 0;
-    return a.id < b.id;
+  int cmp = a.name.valueOrDefault({}).compare(b.name.valueOrDefault({}));
+  if (cmp != 0) return cmp < 0;
+  return a.id < b.id;
 }
 
 bool operator==(const Reference& a, const Reference& b) {
-    return a.name == b.name && a.id == b.id;
+  return a.name == b.name && a.id == b.id;
 }
 
 bool operator!=(const Reference& a, const Reference& b) {
-    return a.name != b.name || a.id != b.id;
+  return a.name != b.name || a.id != b.id;
 }
 
 struct NameOnlyComparator {
-    bool operator()(const Reference& a, const Reference& b) const {
-        return a.name < b.name;
-    }
+  bool operator()(const Reference& a, const Reference& b) const {
+    return a.name < b.name;
+  }
 };
 
 void Styleable::mergeWith(Styleable* other) {
-    // Compare only names, because some References may already have their IDs assigned
-    // (framework IDs that don't change).
-    std::set<Reference, NameOnlyComparator> references;
-    references.insert(entries.begin(), entries.end());
-    references.insert(other->entries.begin(), other->entries.end());
-    entries.clear();
-    entries.reserve(references.size());
-    entries.insert(entries.end(), references.begin(), references.end());
+  // Compare only names, because some References may already have their IDs
+  // assigned
+  // (framework IDs that don't change).
+  std::set<Reference, NameOnlyComparator> references;
+  references.insert(entries.begin(), entries.end());
+  references.insert(other->entries.begin(), other->entries.end());
+  entries.clear();
+  entries.reserve(references.size());
+  entries.insert(entries.end(), references.begin(), references.end());
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/ResourceValues.h b/tools/aapt2/ResourceValues.h
index 5e5d1f3..a28ffe5 100644
--- a/tools/aapt2/ResourceValues.h
+++ b/tools/aapt2/ResourceValues.h
@@ -23,8 +23,8 @@
 #include "io/File.h"
 #include "util/Maybe.h"
 
-#include <array>
 #include <androidfw/ResourceTypes.h>
+#include <array>
 #include <ostream>
 #include <vector>
 
@@ -40,84 +40,64 @@
  * but it is the simplest strategy.
  */
 struct Value {
-	virtual ~Value() = default;
+  virtual ~Value() = default;
 
-    /**
-     * Whether this value is weak and can be overridden without
-     * warning or error. Default is false.
-     */
-    bool isWeak() const {
-        return mWeak;
-    }
+  /**
+   * Whether this value is weak and can be overridden without
+   * warning or error. Default is false.
+   */
+  bool isWeak() const { return mWeak; }
 
-    void setWeak(bool val) {
-        mWeak = val;
-    }
+  void setWeak(bool val) { mWeak = val; }
 
-    // Whether the value is marked as translateable.
-    // This does not persist when flattened.
-    // It is only used during compilation phase.
-    void setTranslateable(bool val) {
-        mTranslateable = val;
-    }
+  // Whether the value is marked as translateable.
+  // This does not persist when flattened.
+  // It is only used during compilation phase.
+  void setTranslateable(bool val) { mTranslateable = val; }
 
-    // Default true.
-    bool isTranslateable() const {
-        return mTranslateable;
-    }
+  // Default true.
+  bool isTranslateable() const { return mTranslateable; }
 
-    /**
-     * Returns the source where this value was defined.
-     */
-    const Source& getSource() const {
-        return mSource;
-    }
+  /**
+   * Returns the source where this value was defined.
+   */
+  const Source& getSource() const { return mSource; }
 
-    void setSource(const Source& source) {
-        mSource = source;
-    }
+  void setSource(const Source& source) { mSource = source; }
 
-    void setSource(Source&& source) {
-        mSource = std::move(source);
-    }
+  void setSource(Source&& source) { mSource = std::move(source); }
 
-    /**
-     * Returns the comment that was associated with this resource.
-     */
-    const std::string& getComment() const {
-        return mComment;
-    }
+  /**
+   * Returns the comment that was associated with this resource.
+   */
+  const std::string& getComment() const { return mComment; }
 
-    void setComment(const StringPiece& str) {
-        mComment = str.toString();
-    }
+  void setComment(const StringPiece& str) { mComment = str.toString(); }
 
-    void setComment(std::string&& str) {
-        mComment = std::move(str);
-    }
+  void setComment(std::string&& str) { mComment = std::move(str); }
 
-    virtual bool equals(const Value* value) const = 0;
+  virtual bool equals(const Value* value) const = 0;
 
-    /**
-     * Calls the appropriate overload of ValueVisitor.
-     */
-    virtual void accept(RawValueVisitor* visitor) = 0;
+  /**
+   * Calls the appropriate overload of ValueVisitor.
+   */
+  virtual void accept(RawValueVisitor* visitor) = 0;
 
-    /**
-     * Clone the value.
-     */
-    virtual Value* clone(StringPool* newPool) const = 0;
+  /**
+   * Clone the value.
+   */
+  virtual Value* clone(StringPool* newPool) const = 0;
 
-    /**
-     * Human readable printout of this value.
-     */
-    virtual void print(std::ostream* out) const = 0;
+  /**
+   * Human readable printout of this value.
+   */
+  virtual void print(std::ostream* out) const = 0;
 
-protected:
-    Source mSource;
-    std::string mComment;
-    bool mWeak = false;
-    bool mTranslateable = true;
+ protected:
+  Source mSource;
+  std::string mComment;
+  bool mWeak = false;
+  bool mTranslateable = true;
 };
 
 /**
@@ -125,23 +105,24 @@
  */
 template <typename Derived>
 struct BaseValue : public Value {
-    void accept(RawValueVisitor* visitor) override;
+  void accept(RawValueVisitor* visitor) override;
 };
 
 /**
  * A resource item with a single value. This maps to android::ResTable_entry.
  */
 struct Item : public Value {
-    /**
-     * Clone the Item.
-     */
-    virtual Item* clone(StringPool* newPool) const override = 0;
+  /**
+   * Clone the Item.
+   */
+  virtual Item* clone(StringPool* newPool) const override = 0;
 
-    /**
-     * Fills in an android::Res_value structure with this Item's binary representation.
-     * Returns false if an error occurred.
-     */
-    virtual bool flatten(android::Res_value* outValue) const = 0;
+  /**
+   * Fills in an android::Res_value structure with this Item's binary
+   * representation.
+   * Returns false if an error occurred.
+   */
+  virtual bool flatten(android::Res_value* outValue) const = 0;
 };
 
 /**
@@ -149,35 +130,37 @@
  */
 template <typename Derived>
 struct BaseItem : public Item {
-    void accept(RawValueVisitor* visitor) override;
+  void accept(RawValueVisitor* visitor) override;
 };
 
 /**
- * A reference to another resource. This maps to android::Res_value::TYPE_REFERENCE.
+ * A reference to another resource. This maps to
+ * android::Res_value::TYPE_REFERENCE.
  *
- * A reference can be symbolic (with the name set to a valid resource name) or be
+ * A reference can be symbolic (with the name set to a valid resource name) or
+ * be
  * numeric (the id is set to a valid resource ID).
  */
 struct Reference : public BaseItem<Reference> {
-    enum class Type {
-        kResource,
-        kAttribute,
-    };
+  enum class Type {
+    kResource,
+    kAttribute,
+  };
 
-    Maybe<ResourceName> name;
-    Maybe<ResourceId> id;
-    Reference::Type referenceType;
-    bool privateReference = false;
+  Maybe<ResourceName> name;
+  Maybe<ResourceId> id;
+  Reference::Type referenceType;
+  bool privateReference = false;
 
-    Reference();
-    explicit Reference(const ResourceNameRef& n, Type type = Type::kResource);
-    explicit Reference(const ResourceId& i, Type type = Type::kResource);
-    explicit Reference(const ResourceNameRef& n, const ResourceId& i);
+  Reference();
+  explicit Reference(const ResourceNameRef& n, Type type = Type::kResource);
+  explicit Reference(const ResourceId& i, Type type = Type::kResource);
+  explicit Reference(const ResourceNameRef& n, const ResourceId& i);
 
-    bool equals(const Value* value) const override;
-    bool flatten(android::Res_value* outValue) const override;
-    Reference* clone(StringPool* newPool) const override;
-    void print(std::ostream* out) const override;
+  bool equals(const Value* value) const override;
+  bool flatten(android::Res_value* outValue) const override;
+  Reference* clone(StringPool* newPool) const override;
+  void print(std::ostream* out) const override;
 };
 
 bool operator<(const Reference&, const Reference&);
@@ -187,11 +170,11 @@
  * An ID resource. Has no real value, just a place holder.
  */
 struct Id : public BaseItem<Id> {
-    Id() { mWeak = true; }
-    bool equals(const Value* value) const override;
-    bool flatten(android::Res_value* out) const override;
-    Id* clone(StringPool* newPool) const override;
-    void print(std::ostream* out) const override;
+  Id() { mWeak = true; }
+  bool equals(const Value* value) const override;
+  bool flatten(android::Res_value* out) const override;
+  Id* clone(StringPool* newPool) const override;
+  void print(std::ostream* out) const override;
 };
 
 /**
@@ -200,164 +183,157 @@
  * end up in the final resource table.
  */
 struct RawString : public BaseItem<RawString> {
-    StringPool::Ref value;
+  StringPool::Ref value;
 
-    explicit RawString(const StringPool::Ref& ref);
+  explicit RawString(const StringPool::Ref& ref);
 
-    bool equals(const Value* value) const override;
-    bool flatten(android::Res_value* outValue) const override;
-    RawString* clone(StringPool* newPool) const override;
-    void print(std::ostream* out) const override;
+  bool equals(const Value* value) const override;
+  bool flatten(android::Res_value* outValue) const override;
+  RawString* clone(StringPool* newPool) const override;
+  void print(std::ostream* out) const override;
 };
 
 struct String : public BaseItem<String> {
-    StringPool::Ref value;
+  StringPool::Ref value;
 
-    explicit String(const StringPool::Ref& ref);
+  explicit String(const StringPool::Ref& ref);
 
-    bool equals(const Value* value) const override;
-    bool flatten(android::Res_value* outValue) const override;
-    String* clone(StringPool* newPool) const override;
-    void print(std::ostream* out) const override;
+  bool equals(const Value* value) const override;
+  bool flatten(android::Res_value* outValue) const override;
+  String* clone(StringPool* newPool) const override;
+  void print(std::ostream* out) const override;
 };
 
 struct StyledString : public BaseItem<StyledString> {
-    StringPool::StyleRef value;
+  StringPool::StyleRef value;
 
-    explicit StyledString(const StringPool::StyleRef& ref);
+  explicit StyledString(const StringPool::StyleRef& ref);
 
-    bool equals(const Value* value) const override;
-    bool flatten(android::Res_value* outValue) const override;
-    StyledString* clone(StringPool* newPool) const override;
-    void print(std::ostream* out) const override;
+  bool equals(const Value* value) const override;
+  bool flatten(android::Res_value* outValue) const override;
+  StyledString* clone(StringPool* newPool) const override;
+  void print(std::ostream* out) const override;
 };
 
 struct FileReference : public BaseItem<FileReference> {
-    StringPool::Ref path;
+  StringPool::Ref path;
 
-    /**
-     * A handle to the file object from which this file can be read.
-     */
-    io::IFile* file = nullptr;
+  /**
+   * A handle to the file object from which this file can be read.
+   */
+  io::IFile* file = nullptr;
 
-    FileReference() = default;
-    explicit FileReference(const StringPool::Ref& path);
+  FileReference() = default;
+  explicit FileReference(const StringPool::Ref& path);
 
-    bool equals(const Value* value) const override;
-    bool flatten(android::Res_value* outValue) const override;
-    FileReference* clone(StringPool* newPool) const override;
-    void print(std::ostream* out) const override;
+  bool equals(const Value* value) const override;
+  bool flatten(android::Res_value* outValue) const override;
+  FileReference* clone(StringPool* newPool) const override;
+  void print(std::ostream* out) const override;
 };
 
 /**
  * Represents any other android::Res_value.
  */
 struct BinaryPrimitive : public BaseItem<BinaryPrimitive> {
-    android::Res_value value;
+  android::Res_value value;
 
-    BinaryPrimitive() = default;
-    explicit BinaryPrimitive(const android::Res_value& val);
-    BinaryPrimitive(uint8_t dataType, uint32_t data);
+  BinaryPrimitive() = default;
+  explicit BinaryPrimitive(const android::Res_value& val);
+  BinaryPrimitive(uint8_t dataType, uint32_t data);
 
-    bool equals(const Value* value) const override;
-    bool flatten(android::Res_value* outValue) const override;
-    BinaryPrimitive* clone(StringPool* newPool) const override;
-    void print(std::ostream* out) const override;
+  bool equals(const Value* value) const override;
+  bool flatten(android::Res_value* outValue) const override;
+  BinaryPrimitive* clone(StringPool* newPool) const override;
+  void print(std::ostream* out) const override;
 };
 
 struct Attribute : public BaseValue<Attribute> {
-    struct Symbol {
-        Reference symbol;
-        uint32_t value;
-    };
+  struct Symbol {
+    Reference symbol;
+    uint32_t value;
+  };
 
-    uint32_t typeMask;
-    int32_t minInt;
-    int32_t maxInt;
-    std::vector<Symbol> symbols;
+  uint32_t typeMask;
+  int32_t minInt;
+  int32_t maxInt;
+  std::vector<Symbol> symbols;
 
-    explicit Attribute(bool w, uint32_t t = 0u);
+  explicit Attribute(bool w, uint32_t t = 0u);
 
-    bool equals(const Value* value) const override;
-    Attribute* clone(StringPool* newPool) const override;
-    void printMask(std::ostream* out) const;
-    void print(std::ostream* out) const override;
-    bool matches(const Item* item, DiagMessage* outMsg) const;
+  bool equals(const Value* value) const override;
+  Attribute* clone(StringPool* newPool) const override;
+  void printMask(std::ostream* out) const;
+  void print(std::ostream* out) const override;
+  bool matches(const Item* item, DiagMessage* outMsg) const;
 };
 
 struct Style : public BaseValue<Style> {
-    struct Entry {
-        Reference key;
-        std::unique_ptr<Item> value;
-    };
+  struct Entry {
+    Reference key;
+    std::unique_ptr<Item> value;
+  };
 
-    Maybe<Reference> parent;
+  Maybe<Reference> parent;
 
-    /**
-     * If set to true, the parent was auto inferred from the
-     * style's name.
-     */
-    bool parentInferred = false;
+  /**
+   * If set to true, the parent was auto inferred from the
+   * style's name.
+   */
+  bool parentInferred = false;
 
-    std::vector<Entry> entries;
+  std::vector<Entry> entries;
 
-    bool equals(const Value* value) const override;
-    Style* clone(StringPool* newPool) const override;
-    void print(std::ostream* out) const override;
+  bool equals(const Value* value) const override;
+  Style* clone(StringPool* newPool) const override;
+  void print(std::ostream* out) const override;
 };
 
 struct Array : public BaseValue<Array> {
-    std::vector<std::unique_ptr<Item>> items;
+  std::vector<std::unique_ptr<Item>> items;
 
-    bool equals(const Value* value) const override;
-    Array* clone(StringPool* newPool) const override;
-    void print(std::ostream* out) const override;
+  bool equals(const Value* value) const override;
+  Array* clone(StringPool* newPool) const override;
+  void print(std::ostream* out) const override;
 };
 
 struct Plural : public BaseValue<Plural> {
-    enum {
-        Zero = 0,
-        One,
-        Two,
-        Few,
-        Many,
-        Other,
-        Count
-    };
+  enum { Zero = 0, One, Two, Few, Many, Other, Count };
 
-    std::array<std::unique_ptr<Item>, Count> values;
+  std::array<std::unique_ptr<Item>, Count> values;
 
-    bool equals(const Value* value) const override;
-    Plural* clone(StringPool* newPool) const override;
-    void print(std::ostream* out) const override;
+  bool equals(const Value* value) const override;
+  Plural* clone(StringPool* newPool) const override;
+  void print(std::ostream* out) const override;
 };
 
 struct Styleable : public BaseValue<Styleable> {
-    std::vector<Reference> entries;
+  std::vector<Reference> entries;
 
-    bool equals(const Value* value) const override;
-    Styleable* clone(StringPool* newPool) const override;
-    void print(std::ostream* out) const override;
-    void mergeWith(Styleable* styleable);
+  bool equals(const Value* value) const override;
+  Styleable* clone(StringPool* newPool) const override;
+  void print(std::ostream* out) const override;
+  void mergeWith(Styleable* styleable);
 };
 
 /**
  * Stream operator for printing Value objects.
  */
 inline ::std::ostream& operator<<(::std::ostream& out, const Value& value) {
-    value.print(&out);
-    return out;
+  value.print(&out);
+  return out;
 }
 
-inline ::std::ostream& operator<<(::std::ostream& out, const Attribute::Symbol& s) {
-    if (s.symbol.name) {
-        out << s.symbol.name.value().entry;
-    } else {
-        out << "???";
-    }
-    return out << "=" << s.value;
+inline ::std::ostream& operator<<(::std::ostream& out,
+                                  const Attribute::Symbol& s) {
+  if (s.symbol.name) {
+    out << s.symbol.name.value().entry;
+  } else {
+    out << "???";
+  }
+  return out << "=" << s.value;
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_RESOURCE_VALUES_H
+#endif  // AAPT_RESOURCE_VALUES_H
diff --git a/tools/aapt2/Resource_test.cpp b/tools/aapt2/Resource_test.cpp
index 06cddc7..4b6b122 100644
--- a/tools/aapt2/Resource_test.cpp
+++ b/tools/aapt2/Resource_test.cpp
@@ -20,96 +20,96 @@
 namespace aapt {
 
 TEST(ResourceTypeTest, ParseResourceTypes) {
-    const ResourceType* type = parseResourceType("anim");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kAnim);
+  const ResourceType* type = parseResourceType("anim");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kAnim);
 
-    type = parseResourceType("animator");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kAnimator);
+  type = parseResourceType("animator");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kAnimator);
 
-    type = parseResourceType("array");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kArray);
+  type = parseResourceType("array");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kArray);
 
-    type = parseResourceType("attr");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kAttr);
+  type = parseResourceType("attr");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kAttr);
 
-    type = parseResourceType("^attr-private");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kAttrPrivate);
+  type = parseResourceType("^attr-private");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kAttrPrivate);
 
-    type = parseResourceType("bool");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kBool);
+  type = parseResourceType("bool");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kBool);
 
-    type = parseResourceType("color");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kColor);
+  type = parseResourceType("color");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kColor);
 
-    type = parseResourceType("dimen");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kDimen);
+  type = parseResourceType("dimen");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kDimen);
 
-    type = parseResourceType("drawable");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kDrawable);
+  type = parseResourceType("drawable");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kDrawable);
 
-    type = parseResourceType("fraction");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kFraction);
+  type = parseResourceType("fraction");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kFraction);
 
-    type = parseResourceType("id");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kId);
+  type = parseResourceType("id");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kId);
 
-    type = parseResourceType("integer");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kInteger);
+  type = parseResourceType("integer");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kInteger);
 
-    type = parseResourceType("interpolator");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kInterpolator);
+  type = parseResourceType("interpolator");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kInterpolator);
 
-    type = parseResourceType("layout");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kLayout);
+  type = parseResourceType("layout");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kLayout);
 
-    type = parseResourceType("menu");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kMenu);
+  type = parseResourceType("menu");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kMenu);
 
-    type = parseResourceType("mipmap");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kMipmap);
+  type = parseResourceType("mipmap");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kMipmap);
 
-    type = parseResourceType("plurals");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kPlurals);
+  type = parseResourceType("plurals");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kPlurals);
 
-    type = parseResourceType("raw");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kRaw);
+  type = parseResourceType("raw");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kRaw);
 
-    type = parseResourceType("string");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kString);
+  type = parseResourceType("string");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kString);
 
-    type = parseResourceType("style");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kStyle);
+  type = parseResourceType("style");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kStyle);
 
-    type = parseResourceType("transition");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kTransition);
+  type = parseResourceType("transition");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kTransition);
 
-    type = parseResourceType("xml");
-    ASSERT_NE(type, nullptr);
-    EXPECT_EQ(*type, ResourceType::kXml);
+  type = parseResourceType("xml");
+  ASSERT_NE(type, nullptr);
+  EXPECT_EQ(*type, ResourceType::kXml);
 
-    type = parseResourceType("blahaha");
-    EXPECT_EQ(type, nullptr);
+  type = parseResourceType("blahaha");
+  EXPECT_EQ(type, nullptr);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/SdkConstants.cpp b/tools/aapt2/SdkConstants.cpp
index ccf0383..75375da 100644
--- a/tools/aapt2/SdkConstants.cpp
+++ b/tools/aapt2/SdkConstants.cpp
@@ -27,719 +27,721 @@
 static int sDevelopmentSdkLevel = 26;
 
 static const std::vector<std::pair<uint16_t, size_t>> sAttrIdMap = {
-    { 0x021c, 1 },
-    { 0x021d, 2 },
-    { 0x0269, SDK_CUPCAKE },
-    { 0x028d, SDK_DONUT },
-    { 0x02ad, SDK_ECLAIR },
-    { 0x02b3, SDK_ECLAIR_0_1 },
-    { 0x02b5, SDK_ECLAIR_MR1 },
-    { 0x02bd, SDK_FROYO },
-    { 0x02cb, SDK_GINGERBREAD },
-    { 0x0361, SDK_HONEYCOMB },
-    { 0x0363, SDK_HONEYCOMB_MR1 },
-    { 0x0366, SDK_HONEYCOMB_MR2 },
-    { 0x03a6, SDK_ICE_CREAM_SANDWICH },
-    { 0x03ae, SDK_JELLY_BEAN },
-    { 0x03cc, SDK_JELLY_BEAN_MR1 },
-    { 0x03da, SDK_JELLY_BEAN_MR2 },
-    { 0x03f1, SDK_KITKAT },
-    { 0x03f6, SDK_KITKAT_WATCH },
-    { 0x04ce, SDK_LOLLIPOP },
+    {0x021c, 1},
+    {0x021d, 2},
+    {0x0269, SDK_CUPCAKE},
+    {0x028d, SDK_DONUT},
+    {0x02ad, SDK_ECLAIR},
+    {0x02b3, SDK_ECLAIR_0_1},
+    {0x02b5, SDK_ECLAIR_MR1},
+    {0x02bd, SDK_FROYO},
+    {0x02cb, SDK_GINGERBREAD},
+    {0x0361, SDK_HONEYCOMB},
+    {0x0363, SDK_HONEYCOMB_MR1},
+    {0x0366, SDK_HONEYCOMB_MR2},
+    {0x03a6, SDK_ICE_CREAM_SANDWICH},
+    {0x03ae, SDK_JELLY_BEAN},
+    {0x03cc, SDK_JELLY_BEAN_MR1},
+    {0x03da, SDK_JELLY_BEAN_MR2},
+    {0x03f1, SDK_KITKAT},
+    {0x03f6, SDK_KITKAT_WATCH},
+    {0x04ce, SDK_LOLLIPOP},
 };
 
-static bool lessEntryId(const std::pair<uint16_t, size_t>& p, uint16_t entryId) {
-    return p.first < entryId;
+static bool lessEntryId(const std::pair<uint16_t, size_t>& p,
+                        uint16_t entryId) {
+  return p.first < entryId;
 }
 
 size_t findAttributeSdkLevel(const ResourceId& id) {
-    if (id.packageId() != 0x01 && id.typeId() != 0x01) {
-        return 0;
-    }
-    auto iter = std::lower_bound(sAttrIdMap.begin(), sAttrIdMap.end(), id.entryId(), lessEntryId);
-    if (iter == sAttrIdMap.end()) {
-        return SDK_LOLLIPOP_MR1;
-    }
-    return iter->second;
+  if (id.packageId() != 0x01 && id.typeId() != 0x01) {
+    return 0;
+  }
+  auto iter = std::lower_bound(sAttrIdMap.begin(), sAttrIdMap.end(),
+                               id.entryId(), lessEntryId);
+  if (iter == sAttrIdMap.end()) {
+    return SDK_LOLLIPOP_MR1;
+  }
+  return iter->second;
 }
 
 static const std::unordered_map<std::string, size_t> sAttrMap = {
-    { "marqueeRepeatLimit", 2 },
-    { "windowNoDisplay", 3 },
-    { "backgroundDimEnabled", 3 },
-    { "inputType", 3 },
-    { "isDefault", 3 },
-    { "windowDisablePreview", 3 },
-    { "privateImeOptions", 3 },
-    { "editorExtras", 3 },
-    { "settingsActivity", 3 },
-    { "fastScrollEnabled", 3 },
-    { "reqTouchScreen", 3 },
-    { "reqKeyboardType", 3 },
-    { "reqHardKeyboard", 3 },
-    { "reqNavigation", 3 },
-    { "windowSoftInputMode", 3 },
-    { "imeFullscreenBackground", 3 },
-    { "noHistory", 3 },
-    { "headerDividersEnabled", 3 },
-    { "footerDividersEnabled", 3 },
-    { "candidatesTextStyleSpans", 3 },
-    { "smoothScrollbar", 3 },
-    { "reqFiveWayNav", 3 },
-    { "keyBackground", 3 },
-    { "keyTextSize", 3 },
-    { "labelTextSize", 3 },
-    { "keyTextColor", 3 },
-    { "keyPreviewLayout", 3 },
-    { "keyPreviewOffset", 3 },
-    { "keyPreviewHeight", 3 },
-    { "verticalCorrection", 3 },
-    { "popupLayout", 3 },
-    { "state_long_pressable", 3 },
-    { "keyWidth", 3 },
-    { "keyHeight", 3 },
-    { "horizontalGap", 3 },
-    { "verticalGap", 3 },
-    { "rowEdgeFlags", 3 },
-    { "codes", 3 },
-    { "popupKeyboard", 3 },
-    { "popupCharacters", 3 },
-    { "keyEdgeFlags", 3 },
-    { "isModifier", 3 },
-    { "isSticky", 3 },
-    { "isRepeatable", 3 },
-    { "iconPreview", 3 },
-    { "keyOutputText", 3 },
-    { "keyLabel", 3 },
-    { "keyIcon", 3 },
-    { "keyboardMode", 3 },
-    { "isScrollContainer", 3 },
-    { "fillEnabled", 3 },
-    { "updatePeriodMillis", 3 },
-    { "initialLayout", 3 },
-    { "voiceSearchMode", 3 },
-    { "voiceLanguageModel", 3 },
-    { "voicePromptText", 3 },
-    { "voiceLanguage", 3 },
-    { "voiceMaxResults", 3 },
-    { "bottomOffset", 3 },
-    { "topOffset", 3 },
-    { "allowSingleTap", 3 },
-    { "handle", 3 },
-    { "content", 3 },
-    { "animateOnClick", 3 },
-    { "configure", 3 },
-    { "hapticFeedbackEnabled", 3 },
-    { "innerRadius", 3 },
-    { "thickness", 3 },
-    { "sharedUserLabel", 3 },
-    { "dropDownWidth", 3 },
-    { "dropDownAnchor", 3 },
-    { "imeOptions", 3 },
-    { "imeActionLabel", 3 },
-    { "imeActionId", 3 },
-    { "imeExtractEnterAnimation", 3 },
-    { "imeExtractExitAnimation", 3 },
-    { "tension", 4 },
-    { "extraTension", 4 },
-    { "anyDensity", 4 },
-    { "searchSuggestThreshold", 4 },
-    { "includeInGlobalSearch", 4 },
-    { "onClick", 4 },
-    { "targetSdkVersion", 4 },
-    { "maxSdkVersion", 4 },
-    { "testOnly", 4 },
-    { "contentDescription", 4 },
-    { "gestureStrokeWidth", 4 },
-    { "gestureColor", 4 },
-    { "uncertainGestureColor", 4 },
-    { "fadeOffset", 4 },
-    { "fadeDuration", 4 },
-    { "gestureStrokeType", 4 },
-    { "gestureStrokeLengthThreshold", 4 },
-    { "gestureStrokeSquarenessThreshold", 4 },
-    { "gestureStrokeAngleThreshold", 4 },
-    { "eventsInterceptionEnabled", 4 },
-    { "fadeEnabled", 4 },
-    { "backupAgent", 4 },
-    { "allowBackup", 4 },
-    { "glEsVersion", 4 },
-    { "queryAfterZeroResults", 4 },
-    { "dropDownHeight", 4 },
-    { "smallScreens", 4 },
-    { "normalScreens", 4 },
-    { "largeScreens", 4 },
-    { "progressBarStyleInverse", 4 },
-    { "progressBarStyleSmallInverse", 4 },
-    { "progressBarStyleLargeInverse", 4 },
-    { "searchSettingsDescription", 4 },
-    { "textColorPrimaryInverseDisableOnly", 4 },
-    { "autoUrlDetect", 4 },
-    { "resizeable", 4 },
-    { "required", 5 },
-    { "accountType", 5 },
-    { "contentAuthority", 5 },
-    { "userVisible", 5 },
-    { "windowShowWallpaper", 5 },
-    { "wallpaperOpenEnterAnimation", 5 },
-    { "wallpaperOpenExitAnimation", 5 },
-    { "wallpaperCloseEnterAnimation", 5 },
-    { "wallpaperCloseExitAnimation", 5 },
-    { "wallpaperIntraOpenEnterAnimation", 5 },
-    { "wallpaperIntraOpenExitAnimation", 5 },
-    { "wallpaperIntraCloseEnterAnimation", 5 },
-    { "wallpaperIntraCloseExitAnimation", 5 },
-    { "supportsUploading", 5 },
-    { "killAfterRestore", 5 },
-    { "restoreNeedsApplication", 5 },
-    { "smallIcon", 5 },
-    { "accountPreferences", 5 },
-    { "textAppearanceSearchResultSubtitle", 5 },
-    { "textAppearanceSearchResultTitle", 5 },
-    { "summaryColumn", 5 },
-    { "detailColumn", 5 },
-    { "detailSocialSummary", 5 },
-    { "thumbnail", 5 },
-    { "detachWallpaper", 5 },
-    { "finishOnCloseSystemDialogs", 5 },
-    { "scrollbarFadeDuration", 5 },
-    { "scrollbarDefaultDelayBeforeFade", 5 },
-    { "fadeScrollbars", 5 },
-    { "colorBackgroundCacheHint", 5 },
-    { "dropDownHorizontalOffset", 5 },
-    { "dropDownVerticalOffset", 5 },
-    { "quickContactBadgeStyleWindowSmall", 6 },
-    { "quickContactBadgeStyleWindowMedium", 6 },
-    { "quickContactBadgeStyleWindowLarge", 6 },
-    { "quickContactBadgeStyleSmallWindowSmall", 6 },
-    { "quickContactBadgeStyleSmallWindowMedium", 6 },
-    { "quickContactBadgeStyleSmallWindowLarge", 6 },
-    { "author", 7 },
-    { "autoStart", 7 },
-    { "expandableListViewWhiteStyle", 8 },
-    { "installLocation", 8 },
-    { "vmSafeMode", 8 },
-    { "webTextViewStyle", 8 },
-    { "restoreAnyVersion", 8 },
-    { "tabStripLeft", 8 },
-    { "tabStripRight", 8 },
-    { "tabStripEnabled", 8 },
-    { "logo", 9 },
-    { "xlargeScreens", 9 },
-    { "immersive", 9 },
-    { "overScrollMode", 9 },
-    { "overScrollHeader", 9 },
-    { "overScrollFooter", 9 },
-    { "filterTouchesWhenObscured", 9 },
-    { "textSelectHandleLeft", 9 },
-    { "textSelectHandleRight", 9 },
-    { "textSelectHandle", 9 },
-    { "textSelectHandleWindowStyle", 9 },
-    { "popupAnimationStyle", 9 },
-    { "screenSize", 9 },
-    { "screenDensity", 9 },
-    { "allContactsName", 11 },
-    { "windowActionBar", 11 },
-    { "actionBarStyle", 11 },
-    { "navigationMode", 11 },
-    { "displayOptions", 11 },
-    { "subtitle", 11 },
-    { "customNavigationLayout", 11 },
-    { "hardwareAccelerated", 11 },
-    { "measureWithLargestChild", 11 },
-    { "animateFirstView", 11 },
-    { "dropDownSpinnerStyle", 11 },
-    { "actionDropDownStyle", 11 },
-    { "actionButtonStyle", 11 },
-    { "showAsAction", 11 },
-    { "previewImage", 11 },
-    { "actionModeBackground", 11 },
-    { "actionModeCloseDrawable", 11 },
-    { "windowActionModeOverlay", 11 },
-    { "valueFrom", 11 },
-    { "valueTo", 11 },
-    { "valueType", 11 },
-    { "propertyName", 11 },
-    { "ordering", 11 },
-    { "fragment", 11 },
-    { "windowActionBarOverlay", 11 },
-    { "fragmentOpenEnterAnimation", 11 },
-    { "fragmentOpenExitAnimation", 11 },
-    { "fragmentCloseEnterAnimation", 11 },
-    { "fragmentCloseExitAnimation", 11 },
-    { "fragmentFadeEnterAnimation", 11 },
-    { "fragmentFadeExitAnimation", 11 },
-    { "actionBarSize", 11 },
-    { "imeSubtypeLocale", 11 },
-    { "imeSubtypeMode", 11 },
-    { "imeSubtypeExtraValue", 11 },
-    { "splitMotionEvents", 11 },
-    { "listChoiceBackgroundIndicator", 11 },
-    { "spinnerMode", 11 },
-    { "animateLayoutChanges", 11 },
-    { "actionBarTabStyle", 11 },
-    { "actionBarTabBarStyle", 11 },
-    { "actionBarTabTextStyle", 11 },
-    { "actionOverflowButtonStyle", 11 },
-    { "actionModeCloseButtonStyle", 11 },
-    { "titleTextStyle", 11 },
-    { "subtitleTextStyle", 11 },
-    { "iconifiedByDefault", 11 },
-    { "actionLayout", 11 },
-    { "actionViewClass", 11 },
-    { "activatedBackgroundIndicator", 11 },
-    { "state_activated", 11 },
-    { "listPopupWindowStyle", 11 },
-    { "popupMenuStyle", 11 },
-    { "textAppearanceLargePopupMen", 11 },
-    { "textAppearanceSmallPopupMen", 11 },
-    { "breadCrumbTitle", 11 },
-    { "breadCrumbShortTitle", 11 },
-    { "listDividerAlertDialog", 11 },
-    { "textColorAlertDialogListItem", 11 },
-    { "loopViews", 11 },
-    { "dialogTheme", 11 },
-    { "alertDialogTheme", 11 },
-    { "dividerVertical", 11 },
-    { "homeAsUpIndicator", 11 },
-    { "enterFadeDuration", 11 },
-    { "exitFadeDuration", 11 },
-    { "selectableItemBackground", 11 },
-    { "autoAdvanceViewId", 11 },
-    { "useIntrinsicSizeAsMinimum", 11 },
-    { "actionModeCutDrawable", 11 },
-    { "actionModeCopyDrawable", 11 },
-    { "actionModePasteDrawable", 11 },
-    { "textEditPasteWindowLayout", 11 },
-    { "textEditNoPasteWindowLayout", 11 },
-    { "textIsSelectable", 11 },
-    { "windowEnableSplitTouch", 11 },
-    { "indeterminateProgressStyle", 11 },
-    { "progressBarPadding", 11 },
-    { "animationResolution", 11 },
-    { "state_accelerated", 11 },
-    { "baseline", 11 },
-    { "homeLayout", 11 },
-    { "opacity", 11 },
-    { "alpha", 11 },
-    { "transformPivotX", 11 },
-    { "transformPivotY", 11 },
-    { "translationX", 11 },
-    { "translationY", 11 },
-    { "scaleX", 11 },
-    { "scaleY", 11 },
-    { "rotation", 11 },
-    { "rotationX", 11 },
-    { "rotationY", 11 },
-    { "showDividers", 11 },
-    { "dividerPadding", 11 },
-    { "borderlessButtonStyle", 11 },
-    { "dividerHorizontal", 11 },
-    { "itemPadding", 11 },
-    { "buttonBarStyle", 11 },
-    { "buttonBarButtonStyle", 11 },
-    { "segmentedButtonStyle", 11 },
-    { "staticWallpaperPreview", 11 },
-    { "allowParallelSyncs", 11 },
-    { "isAlwaysSyncable", 11 },
-    { "verticalScrollbarPosition", 11 },
-    { "fastScrollAlwaysVisible", 11 },
-    { "fastScrollThumbDrawable", 11 },
-    { "fastScrollPreviewBackgroundLeft", 11 },
-    { "fastScrollPreviewBackgroundRight", 11 },
-    { "fastScrollTrackDrawable", 11 },
-    { "fastScrollOverlayPosition", 11 },
-    { "customTokens", 11 },
-    { "nextFocusForward", 11 },
-    { "firstDayOfWeek", 11 },
-    { "showWeekNumber", 11 },
-    { "minDate", 11 },
-    { "maxDate", 11 },
-    { "shownWeekCount", 11 },
-    { "selectedWeekBackgroundColor", 11 },
-    { "focusedMonthDateColor", 11 },
-    { "unfocusedMonthDateColor", 11 },
-    { "weekNumberColor", 11 },
-    { "weekSeparatorLineColor", 11 },
-    { "selectedDateVerticalBar", 11 },
-    { "weekDayTextAppearance", 11 },
-    { "dateTextAppearance", 11 },
-    { "solidColor", 11 },
-    { "spinnersShown", 11 },
-    { "calendarViewShown", 11 },
-    { "state_multiline", 11 },
-    { "detailsElementBackground", 11 },
-    { "textColorHighlightInverse", 11 },
-    { "textColorLinkInverse", 11 },
-    { "editTextColor", 11 },
-    { "editTextBackground", 11 },
-    { "horizontalScrollViewStyle", 11 },
-    { "layerType", 11 },
-    { "alertDialogIcon", 11 },
-    { "windowMinWidthMajor", 11 },
-    { "windowMinWidthMinor", 11 },
-    { "queryHint", 11 },
-    { "fastScrollTextColor", 11 },
-    { "largeHeap", 11 },
-    { "windowCloseOnTouchOutside", 11 },
-    { "datePickerStyle", 11 },
-    { "calendarViewStyle", 11 },
-    { "textEditSidePasteWindowLayout", 11 },
-    { "textEditSideNoPasteWindowLayout", 11 },
-    { "actionMenuTextAppearance", 11 },
-    { "actionMenuTextColor", 11 },
-    { "textCursorDrawable", 12 },
-    { "resizeMode", 12 },
-    { "requiresSmallestWidthDp", 12 },
-    { "compatibleWidthLimitDp", 12 },
-    { "largestWidthLimitDp", 12 },
-    { "state_hovered", 13 },
-    { "state_drag_can_accept", 13 },
-    { "state_drag_hovered", 13 },
-    { "stopWithTask", 13 },
-    { "switchTextOn", 13 },
-    { "switchTextOff", 13 },
-    { "switchPreferenceStyle", 13 },
-    { "switchTextAppearance", 13 },
-    { "track", 13 },
-    { "switchMinWidth", 13 },
-    { "switchPadding", 13 },
-    { "thumbTextPadding", 13 },
-    { "textSuggestionsWindowStyle", 13 },
-    { "textEditSuggestionItemLayout", 13 },
-    { "rowCount", 13 },
-    { "rowOrderPreserved", 13 },
-    { "columnCount", 13 },
-    { "columnOrderPreserved", 13 },
-    { "useDefaultMargins", 13 },
-    { "alignmentMode", 13 },
-    { "layout_row", 13 },
-    { "layout_rowSpan", 13 },
-    { "layout_columnSpan", 13 },
-    { "actionModeSelectAllDrawable", 13 },
-    { "isAuxiliary", 13 },
-    { "accessibilityEventTypes", 13 },
-    { "packageNames", 13 },
-    { "accessibilityFeedbackType", 13 },
-    { "notificationTimeout", 13 },
-    { "accessibilityFlags", 13 },
-    { "canRetrieveWindowContent", 13 },
-    { "listPreferredItemHeightLarge", 13 },
-    { "listPreferredItemHeightSmall", 13 },
-    { "actionBarSplitStyle", 13 },
-    { "actionProviderClass", 13 },
-    { "backgroundStacked", 13 },
-    { "backgroundSplit", 13 },
-    { "textAllCaps", 13 },
-    { "colorPressedHighlight", 13 },
-    { "colorLongPressedHighlight", 13 },
-    { "colorFocusedHighlight", 13 },
-    { "colorActivatedHighlight", 13 },
-    { "colorMultiSelectHighlight", 13 },
-    { "drawableStart", 13 },
-    { "drawableEnd", 13 },
-    { "actionModeStyle", 13 },
-    { "minResizeWidth", 13 },
-    { "minResizeHeight", 13 },
-    { "actionBarWidgetTheme", 13 },
-    { "uiOptions", 13 },
-    { "subtypeLocale", 13 },
-    { "subtypeExtraValue", 13 },
-    { "actionBarDivider", 13 },
-    { "actionBarItemBackground", 13 },
-    { "actionModeSplitBackground", 13 },
-    { "textAppearanceListItem", 13 },
-    { "textAppearanceListItemSmall", 13 },
-    { "targetDescriptions", 13 },
-    { "directionDescriptions", 13 },
-    { "overridesImplicitlyEnabledSubtype", 13 },
-    { "listPreferredItemPaddingLeft", 13 },
-    { "listPreferredItemPaddingRight", 13 },
-    { "requiresFadingEdge", 13 },
-    { "publicKey", 13 },
-    { "parentActivityName", 16 },
-    { "isolatedProcess", 16 },
-    { "importantForAccessibility", 16 },
-    { "keyboardLayout", 16 },
-    { "fontFamily", 16 },
-    { "mediaRouteButtonStyle", 16 },
-    { "mediaRouteTypes", 16 },
-    { "supportsRtl", 17 },
-    { "textDirection", 17 },
-    { "textAlignment", 17 },
-    { "layoutDirection", 17 },
-    { "paddingStart", 17 },
-    { "paddingEnd", 17 },
-    { "layout_marginStart", 17 },
-    { "layout_marginEnd", 17 },
-    { "layout_toStartOf", 17 },
-    { "layout_toEndOf", 17 },
-    { "layout_alignStart", 17 },
-    { "layout_alignEnd", 17 },
-    { "layout_alignParentStart", 17 },
-    { "layout_alignParentEnd", 17 },
-    { "listPreferredItemPaddingStart", 17 },
-    { "listPreferredItemPaddingEnd", 17 },
-    { "singleUser", 17 },
-    { "presentationTheme", 17 },
-    { "subtypeId", 17 },
-    { "initialKeyguardLayout", 17 },
-    { "widgetCategory", 17 },
-    { "permissionGroupFlags", 17 },
-    { "labelFor", 17 },
-    { "permissionFlags", 17 },
-    { "checkedTextViewStyle", 17 },
-    { "showOnLockScreen", 17 },
-    { "format12Hour", 17 },
-    { "format24Hour", 17 },
-    { "timeZone", 17 },
-    { "mipMap", 18 },
-    { "mirrorForRtl", 18 },
-    { "windowOverscan", 18 },
-    { "requiredForAllUsers", 18 },
-    { "indicatorStart", 18 },
-    { "indicatorEnd", 18 },
-    { "childIndicatorStart", 18 },
-    { "childIndicatorEnd", 18 },
-    { "restrictedAccountType", 18 },
-    { "requiredAccountType", 18 },
-    { "canRequestTouchExplorationMode", 18 },
-    { "canRequestEnhancedWebAccessibility", 18 },
-    { "canRequestFilterKeyEvents", 18 },
-    { "layoutMode", 18 },
-    { "keySet", 19 },
-    { "targetId", 19 },
-    { "fromScene", 19 },
-    { "toScene", 19 },
-    { "transition", 19 },
-    { "transitionOrdering", 19 },
-    { "fadingMode", 19 },
-    { "startDelay", 19 },
-    { "ssp", 19 },
-    { "sspPrefix", 19 },
-    { "sspPattern", 19 },
-    { "addPrintersActivity", 19 },
-    { "vendor", 19 },
-    { "category", 19 },
-    { "isAsciiCapable", 19 },
-    { "autoMirrored", 19 },
-    { "supportsSwitchingToNextInputMethod", 19 },
-    { "requireDeviceUnlock", 19 },
-    { "apduServiceBanner", 19 },
-    { "accessibilityLiveRegion", 19 },
-    { "windowTranslucentStatus", 19 },
-    { "windowTranslucentNavigation", 19 },
-    { "advancedPrintOptionsActivity", 19 },
-    { "banner", 20 },
-    { "windowSwipeToDismiss", 20 },
-    { "isGame", 20 },
-    { "allowEmbedded", 20 },
-    { "setupActivity", 20 },
-    { "fastScrollStyle", 21 },
-    { "windowContentTransitions", 21 },
-    { "windowContentTransitionManager", 21 },
-    { "translationZ", 21 },
-    { "tintMode", 21 },
-    { "controlX1", 21 },
-    { "controlY1", 21 },
-    { "controlX2", 21 },
-    { "controlY2", 21 },
-    { "transitionName", 21 },
-    { "transitionGroup", 21 },
-    { "viewportWidth", 21 },
-    { "viewportHeight", 21 },
-    { "fillColor", 21 },
-    { "pathData", 21 },
-    { "strokeColor", 21 },
-    { "strokeWidth", 21 },
-    { "trimPathStart", 21 },
-    { "trimPathEnd", 21 },
-    { "trimPathOffset", 21 },
-    { "strokeLineCap", 21 },
-    { "strokeLineJoin", 21 },
-    { "strokeMiterLimit", 21 },
-    { "colorControlNormal", 21 },
-    { "colorControlActivated", 21 },
-    { "colorButtonNormal", 21 },
-    { "colorControlHighlight", 21 },
-    { "persistableMode", 21 },
-    { "titleTextAppearance", 21 },
-    { "subtitleTextAppearance", 21 },
-    { "slideEdge", 21 },
-    { "actionBarTheme", 21 },
-    { "textAppearanceListItemSecondary", 21 },
-    { "colorPrimary", 21 },
-    { "colorPrimaryDark", 21 },
-    { "colorAccent", 21 },
-    { "nestedScrollingEnabled", 21 },
-    { "windowEnterTransition", 21 },
-    { "windowExitTransition", 21 },
-    { "windowSharedElementEnterTransition", 21 },
-    { "windowSharedElementExitTransition", 21 },
-    { "windowAllowReturnTransitionOverlap", 21 },
-    { "windowAllowEnterTransitionOverlap", 21 },
-    { "sessionService", 21 },
-    { "stackViewStyle", 21 },
-    { "switchStyle", 21 },
-    { "elevation", 21 },
-    { "excludeId", 21 },
-    { "excludeClass", 21 },
-    { "hideOnContentScroll", 21 },
-    { "actionOverflowMenuStyle", 21 },
-    { "documentLaunchMode", 21 },
-    { "maxRecents", 21 },
-    { "autoRemoveFromRecents", 21 },
-    { "stateListAnimator", 21 },
-    { "toId", 21 },
-    { "fromId", 21 },
-    { "reversible", 21 },
-    { "splitTrack", 21 },
-    { "targetName", 21 },
-    { "excludeName", 21 },
-    { "matchOrder", 21 },
-    { "windowDrawsSystemBarBackgrounds", 21 },
-    { "statusBarColor", 21 },
-    { "navigationBarColor", 21 },
-    { "contentInsetStart", 21 },
-    { "contentInsetEnd", 21 },
-    { "contentInsetLeft", 21 },
-    { "contentInsetRight", 21 },
-    { "paddingMode", 21 },
-    { "layout_rowWeight", 21 },
-    { "layout_columnWeight", 21 },
-    { "translateX", 21 },
-    { "translateY", 21 },
-    { "selectableItemBackgroundBorderless", 21 },
-    { "elegantTextHeight", 21 },
-    { "searchKeyphraseId", 21 },
-    { "searchKeyphrase", 21 },
-    { "searchKeyphraseSupportedLocales", 21 },
-    { "windowTransitionBackgroundFadeDuration", 21 },
-    { "overlapAnchor", 21 },
-    { "progressTint", 21 },
-    { "progressTintMode", 21 },
-    { "progressBackgroundTint", 21 },
-    { "progressBackgroundTintMode", 21 },
-    { "secondaryProgressTint", 21 },
-    { "secondaryProgressTintMode", 21 },
-    { "indeterminateTint", 21 },
-    { "indeterminateTintMode", 21 },
-    { "backgroundTint", 21 },
-    { "backgroundTintMode", 21 },
-    { "foregroundTint", 21 },
-    { "foregroundTintMode", 21 },
-    { "buttonTint", 21 },
-    { "buttonTintMode", 21 },
-    { "thumbTint", 21 },
-    { "thumbTintMode", 21 },
-    { "fullBackupOnly", 21 },
-    { "propertyXName", 21 },
-    { "propertyYName", 21 },
-    { "relinquishTaskIdentity", 21 },
-    { "tileModeX", 21 },
-    { "tileModeY", 21 },
-    { "actionModeShareDrawable", 21 },
-    { "actionModeFindDrawable", 21 },
-    { "actionModeWebSearchDrawable", 21 },
-    { "transitionVisibilityMode", 21 },
-    { "minimumHorizontalAngle", 21 },
-    { "minimumVerticalAngle", 21 },
-    { "maximumAngle", 21 },
-    { "searchViewStyle", 21 },
-    { "closeIcon", 21 },
-    { "goIcon", 21 },
-    { "searchIcon", 21 },
-    { "voiceIcon", 21 },
-    { "commitIcon", 21 },
-    { "suggestionRowLayout", 21 },
-    { "queryBackground", 21 },
-    { "submitBackground", 21 },
-    { "buttonBarPositiveButtonStyle", 21 },
-    { "buttonBarNeutralButtonStyle", 21 },
-    { "buttonBarNegativeButtonStyle", 21 },
-    { "popupElevation", 21 },
-    { "actionBarPopupTheme", 21 },
-    { "multiArch", 21 },
-    { "touchscreenBlocksFocus", 21 },
-    { "windowElevation", 21 },
-    { "launchTaskBehindTargetAnimation", 21 },
-    { "launchTaskBehindSourceAnimation", 21 },
-    { "restrictionType", 21 },
-    { "dayOfWeekBackground", 21 },
-    { "dayOfWeekTextAppearance", 21 },
-    { "headerMonthTextAppearance", 21 },
-    { "headerDayOfMonthTextAppearance", 21 },
-    { "headerYearTextAppearance", 21 },
-    { "yearListItemTextAppearance", 21 },
-    { "yearListSelectorColor", 21 },
-    { "calendarTextColor", 21 },
-    { "recognitionService", 21 },
-    { "timePickerStyle", 21 },
-    { "timePickerDialogTheme", 21 },
-    { "headerTimeTextAppearance", 21 },
-    { "headerAmPmTextAppearance", 21 },
-    { "numbersTextColor", 21 },
-    { "numbersBackgroundColor", 21 },
-    { "numbersSelectorColor", 21 },
-    { "amPmTextColor", 21 },
-    { "amPmBackgroundColor", 21 },
-    { "searchKeyphraseRecognitionFlags", 21 },
-    { "checkMarkTint", 21 },
-    { "checkMarkTintMode", 21 },
-    { "popupTheme", 21 },
-    { "toolbarStyle", 21 },
-    { "windowClipToOutline", 21 },
-    { "datePickerDialogTheme", 21 },
-    { "showText", 21 },
-    { "windowReturnTransition", 21 },
-    { "windowReenterTransition", 21 },
-    { "windowSharedElementReturnTransition", 21 },
-    { "windowSharedElementReenterTransition", 21 },
-    { "resumeWhilePausing", 21 },
-    { "datePickerMode", 21 },
-    { "timePickerMode", 21 },
-    { "inset", 21 },
-    { "letterSpacing", 21 },
-    { "fontFeatureSettings", 21 },
-    { "outlineProvider", 21 },
-    { "contentAgeHint", 21 },
-    { "country", 21 },
-    { "windowSharedElementsUseOverlay", 21 },
-    { "reparent", 21 },
-    { "reparentWithOverlay", 21 },
-    { "ambientShadowAlpha", 21 },
-    { "spotShadowAlpha", 21 },
-    { "navigationIcon", 21 },
-    { "navigationContentDescription", 21 },
-    { "fragmentExitTransition", 21 },
-    { "fragmentEnterTransition", 21 },
-    { "fragmentSharedElementEnterTransition", 21 },
-    { "fragmentReturnTransition", 21 },
-    { "fragmentSharedElementReturnTransition", 21 },
-    { "fragmentReenterTransition", 21 },
-    { "fragmentAllowEnterTransitionOverlap", 21 },
-    { "fragmentAllowReturnTransitionOverlap", 21 },
-    { "patternPathData", 21 },
-    { "strokeAlpha", 21 },
-    { "fillAlpha", 21 },
-    { "windowActivityTransitions", 21 },
-    { "colorEdgeEffect", 21 }
-};
+    {"marqueeRepeatLimit", 2},
+    {"windowNoDisplay", 3},
+    {"backgroundDimEnabled", 3},
+    {"inputType", 3},
+    {"isDefault", 3},
+    {"windowDisablePreview", 3},
+    {"privateImeOptions", 3},
+    {"editorExtras", 3},
+    {"settingsActivity", 3},
+    {"fastScrollEnabled", 3},
+    {"reqTouchScreen", 3},
+    {"reqKeyboardType", 3},
+    {"reqHardKeyboard", 3},
+    {"reqNavigation", 3},
+    {"windowSoftInputMode", 3},
+    {"imeFullscreenBackground", 3},
+    {"noHistory", 3},
+    {"headerDividersEnabled", 3},
+    {"footerDividersEnabled", 3},
+    {"candidatesTextStyleSpans", 3},
+    {"smoothScrollbar", 3},
+    {"reqFiveWayNav", 3},
+    {"keyBackground", 3},
+    {"keyTextSize", 3},
+    {"labelTextSize", 3},
+    {"keyTextColor", 3},
+    {"keyPreviewLayout", 3},
+    {"keyPreviewOffset", 3},
+    {"keyPreviewHeight", 3},
+    {"verticalCorrection", 3},
+    {"popupLayout", 3},
+    {"state_long_pressable", 3},
+    {"keyWidth", 3},
+    {"keyHeight", 3},
+    {"horizontalGap", 3},
+    {"verticalGap", 3},
+    {"rowEdgeFlags", 3},
+    {"codes", 3},
+    {"popupKeyboard", 3},
+    {"popupCharacters", 3},
+    {"keyEdgeFlags", 3},
+    {"isModifier", 3},
+    {"isSticky", 3},
+    {"isRepeatable", 3},
+    {"iconPreview", 3},
+    {"keyOutputText", 3},
+    {"keyLabel", 3},
+    {"keyIcon", 3},
+    {"keyboardMode", 3},
+    {"isScrollContainer", 3},
+    {"fillEnabled", 3},
+    {"updatePeriodMillis", 3},
+    {"initialLayout", 3},
+    {"voiceSearchMode", 3},
+    {"voiceLanguageModel", 3},
+    {"voicePromptText", 3},
+    {"voiceLanguage", 3},
+    {"voiceMaxResults", 3},
+    {"bottomOffset", 3},
+    {"topOffset", 3},
+    {"allowSingleTap", 3},
+    {"handle", 3},
+    {"content", 3},
+    {"animateOnClick", 3},
+    {"configure", 3},
+    {"hapticFeedbackEnabled", 3},
+    {"innerRadius", 3},
+    {"thickness", 3},
+    {"sharedUserLabel", 3},
+    {"dropDownWidth", 3},
+    {"dropDownAnchor", 3},
+    {"imeOptions", 3},
+    {"imeActionLabel", 3},
+    {"imeActionId", 3},
+    {"imeExtractEnterAnimation", 3},
+    {"imeExtractExitAnimation", 3},
+    {"tension", 4},
+    {"extraTension", 4},
+    {"anyDensity", 4},
+    {"searchSuggestThreshold", 4},
+    {"includeInGlobalSearch", 4},
+    {"onClick", 4},
+    {"targetSdkVersion", 4},
+    {"maxSdkVersion", 4},
+    {"testOnly", 4},
+    {"contentDescription", 4},
+    {"gestureStrokeWidth", 4},
+    {"gestureColor", 4},
+    {"uncertainGestureColor", 4},
+    {"fadeOffset", 4},
+    {"fadeDuration", 4},
+    {"gestureStrokeType", 4},
+    {"gestureStrokeLengthThreshold", 4},
+    {"gestureStrokeSquarenessThreshold", 4},
+    {"gestureStrokeAngleThreshold", 4},
+    {"eventsInterceptionEnabled", 4},
+    {"fadeEnabled", 4},
+    {"backupAgent", 4},
+    {"allowBackup", 4},
+    {"glEsVersion", 4},
+    {"queryAfterZeroResults", 4},
+    {"dropDownHeight", 4},
+    {"smallScreens", 4},
+    {"normalScreens", 4},
+    {"largeScreens", 4},
+    {"progressBarStyleInverse", 4},
+    {"progressBarStyleSmallInverse", 4},
+    {"progressBarStyleLargeInverse", 4},
+    {"searchSettingsDescription", 4},
+    {"textColorPrimaryInverseDisableOnly", 4},
+    {"autoUrlDetect", 4},
+    {"resizeable", 4},
+    {"required", 5},
+    {"accountType", 5},
+    {"contentAuthority", 5},
+    {"userVisible", 5},
+    {"windowShowWallpaper", 5},
+    {"wallpaperOpenEnterAnimation", 5},
+    {"wallpaperOpenExitAnimation", 5},
+    {"wallpaperCloseEnterAnimation", 5},
+    {"wallpaperCloseExitAnimation", 5},
+    {"wallpaperIntraOpenEnterAnimation", 5},
+    {"wallpaperIntraOpenExitAnimation", 5},
+    {"wallpaperIntraCloseEnterAnimation", 5},
+    {"wallpaperIntraCloseExitAnimation", 5},
+    {"supportsUploading", 5},
+    {"killAfterRestore", 5},
+    {"restoreNeedsApplication", 5},
+    {"smallIcon", 5},
+    {"accountPreferences", 5},
+    {"textAppearanceSearchResultSubtitle", 5},
+    {"textAppearanceSearchResultTitle", 5},
+    {"summaryColumn", 5},
+    {"detailColumn", 5},
+    {"detailSocialSummary", 5},
+    {"thumbnail", 5},
+    {"detachWallpaper", 5},
+    {"finishOnCloseSystemDialogs", 5},
+    {"scrollbarFadeDuration", 5},
+    {"scrollbarDefaultDelayBeforeFade", 5},
+    {"fadeScrollbars", 5},
+    {"colorBackgroundCacheHint", 5},
+    {"dropDownHorizontalOffset", 5},
+    {"dropDownVerticalOffset", 5},
+    {"quickContactBadgeStyleWindowSmall", 6},
+    {"quickContactBadgeStyleWindowMedium", 6},
+    {"quickContactBadgeStyleWindowLarge", 6},
+    {"quickContactBadgeStyleSmallWindowSmall", 6},
+    {"quickContactBadgeStyleSmallWindowMedium", 6},
+    {"quickContactBadgeStyleSmallWindowLarge", 6},
+    {"author", 7},
+    {"autoStart", 7},
+    {"expandableListViewWhiteStyle", 8},
+    {"installLocation", 8},
+    {"vmSafeMode", 8},
+    {"webTextViewStyle", 8},
+    {"restoreAnyVersion", 8},
+    {"tabStripLeft", 8},
+    {"tabStripRight", 8},
+    {"tabStripEnabled", 8},
+    {"logo", 9},
+    {"xlargeScreens", 9},
+    {"immersive", 9},
+    {"overScrollMode", 9},
+    {"overScrollHeader", 9},
+    {"overScrollFooter", 9},
+    {"filterTouchesWhenObscured", 9},
+    {"textSelectHandleLeft", 9},
+    {"textSelectHandleRight", 9},
+    {"textSelectHandle", 9},
+    {"textSelectHandleWindowStyle", 9},
+    {"popupAnimationStyle", 9},
+    {"screenSize", 9},
+    {"screenDensity", 9},
+    {"allContactsName", 11},
+    {"windowActionBar", 11},
+    {"actionBarStyle", 11},
+    {"navigationMode", 11},
+    {"displayOptions", 11},
+    {"subtitle", 11},
+    {"customNavigationLayout", 11},
+    {"hardwareAccelerated", 11},
+    {"measureWithLargestChild", 11},
+    {"animateFirstView", 11},
+    {"dropDownSpinnerStyle", 11},
+    {"actionDropDownStyle", 11},
+    {"actionButtonStyle", 11},
+    {"showAsAction", 11},
+    {"previewImage", 11},
+    {"actionModeBackground", 11},
+    {"actionModeCloseDrawable", 11},
+    {"windowActionModeOverlay", 11},
+    {"valueFrom", 11},
+    {"valueTo", 11},
+    {"valueType", 11},
+    {"propertyName", 11},
+    {"ordering", 11},
+    {"fragment", 11},
+    {"windowActionBarOverlay", 11},
+    {"fragmentOpenEnterAnimation", 11},
+    {"fragmentOpenExitAnimation", 11},
+    {"fragmentCloseEnterAnimation", 11},
+    {"fragmentCloseExitAnimation", 11},
+    {"fragmentFadeEnterAnimation", 11},
+    {"fragmentFadeExitAnimation", 11},
+    {"actionBarSize", 11},
+    {"imeSubtypeLocale", 11},
+    {"imeSubtypeMode", 11},
+    {"imeSubtypeExtraValue", 11},
+    {"splitMotionEvents", 11},
+    {"listChoiceBackgroundIndicator", 11},
+    {"spinnerMode", 11},
+    {"animateLayoutChanges", 11},
+    {"actionBarTabStyle", 11},
+    {"actionBarTabBarStyle", 11},
+    {"actionBarTabTextStyle", 11},
+    {"actionOverflowButtonStyle", 11},
+    {"actionModeCloseButtonStyle", 11},
+    {"titleTextStyle", 11},
+    {"subtitleTextStyle", 11},
+    {"iconifiedByDefault", 11},
+    {"actionLayout", 11},
+    {"actionViewClass", 11},
+    {"activatedBackgroundIndicator", 11},
+    {"state_activated", 11},
+    {"listPopupWindowStyle", 11},
+    {"popupMenuStyle", 11},
+    {"textAppearanceLargePopupMen", 11},
+    {"textAppearanceSmallPopupMen", 11},
+    {"breadCrumbTitle", 11},
+    {"breadCrumbShortTitle", 11},
+    {"listDividerAlertDialog", 11},
+    {"textColorAlertDialogListItem", 11},
+    {"loopViews", 11},
+    {"dialogTheme", 11},
+    {"alertDialogTheme", 11},
+    {"dividerVertical", 11},
+    {"homeAsUpIndicator", 11},
+    {"enterFadeDuration", 11},
+    {"exitFadeDuration", 11},
+    {"selectableItemBackground", 11},
+    {"autoAdvanceViewId", 11},
+    {"useIntrinsicSizeAsMinimum", 11},
+    {"actionModeCutDrawable", 11},
+    {"actionModeCopyDrawable", 11},
+    {"actionModePasteDrawable", 11},
+    {"textEditPasteWindowLayout", 11},
+    {"textEditNoPasteWindowLayout", 11},
+    {"textIsSelectable", 11},
+    {"windowEnableSplitTouch", 11},
+    {"indeterminateProgressStyle", 11},
+    {"progressBarPadding", 11},
+    {"animationResolution", 11},
+    {"state_accelerated", 11},
+    {"baseline", 11},
+    {"homeLayout", 11},
+    {"opacity", 11},
+    {"alpha", 11},
+    {"transformPivotX", 11},
+    {"transformPivotY", 11},
+    {"translationX", 11},
+    {"translationY", 11},
+    {"scaleX", 11},
+    {"scaleY", 11},
+    {"rotation", 11},
+    {"rotationX", 11},
+    {"rotationY", 11},
+    {"showDividers", 11},
+    {"dividerPadding", 11},
+    {"borderlessButtonStyle", 11},
+    {"dividerHorizontal", 11},
+    {"itemPadding", 11},
+    {"buttonBarStyle", 11},
+    {"buttonBarButtonStyle", 11},
+    {"segmentedButtonStyle", 11},
+    {"staticWallpaperPreview", 11},
+    {"allowParallelSyncs", 11},
+    {"isAlwaysSyncable", 11},
+    {"verticalScrollbarPosition", 11},
+    {"fastScrollAlwaysVisible", 11},
+    {"fastScrollThumbDrawable", 11},
+    {"fastScrollPreviewBackgroundLeft", 11},
+    {"fastScrollPreviewBackgroundRight", 11},
+    {"fastScrollTrackDrawable", 11},
+    {"fastScrollOverlayPosition", 11},
+    {"customTokens", 11},
+    {"nextFocusForward", 11},
+    {"firstDayOfWeek", 11},
+    {"showWeekNumber", 11},
+    {"minDate", 11},
+    {"maxDate", 11},
+    {"shownWeekCount", 11},
+    {"selectedWeekBackgroundColor", 11},
+    {"focusedMonthDateColor", 11},
+    {"unfocusedMonthDateColor", 11},
+    {"weekNumberColor", 11},
+    {"weekSeparatorLineColor", 11},
+    {"selectedDateVerticalBar", 11},
+    {"weekDayTextAppearance", 11},
+    {"dateTextAppearance", 11},
+    {"solidColor", 11},
+    {"spinnersShown", 11},
+    {"calendarViewShown", 11},
+    {"state_multiline", 11},
+    {"detailsElementBackground", 11},
+    {"textColorHighlightInverse", 11},
+    {"textColorLinkInverse", 11},
+    {"editTextColor", 11},
+    {"editTextBackground", 11},
+    {"horizontalScrollViewStyle", 11},
+    {"layerType", 11},
+    {"alertDialogIcon", 11},
+    {"windowMinWidthMajor", 11},
+    {"windowMinWidthMinor", 11},
+    {"queryHint", 11},
+    {"fastScrollTextColor", 11},
+    {"largeHeap", 11},
+    {"windowCloseOnTouchOutside", 11},
+    {"datePickerStyle", 11},
+    {"calendarViewStyle", 11},
+    {"textEditSidePasteWindowLayout", 11},
+    {"textEditSideNoPasteWindowLayout", 11},
+    {"actionMenuTextAppearance", 11},
+    {"actionMenuTextColor", 11},
+    {"textCursorDrawable", 12},
+    {"resizeMode", 12},
+    {"requiresSmallestWidthDp", 12},
+    {"compatibleWidthLimitDp", 12},
+    {"largestWidthLimitDp", 12},
+    {"state_hovered", 13},
+    {"state_drag_can_accept", 13},
+    {"state_drag_hovered", 13},
+    {"stopWithTask", 13},
+    {"switchTextOn", 13},
+    {"switchTextOff", 13},
+    {"switchPreferenceStyle", 13},
+    {"switchTextAppearance", 13},
+    {"track", 13},
+    {"switchMinWidth", 13},
+    {"switchPadding", 13},
+    {"thumbTextPadding", 13},
+    {"textSuggestionsWindowStyle", 13},
+    {"textEditSuggestionItemLayout", 13},
+    {"rowCount", 13},
+    {"rowOrderPreserved", 13},
+    {"columnCount", 13},
+    {"columnOrderPreserved", 13},
+    {"useDefaultMargins", 13},
+    {"alignmentMode", 13},
+    {"layout_row", 13},
+    {"layout_rowSpan", 13},
+    {"layout_columnSpan", 13},
+    {"actionModeSelectAllDrawable", 13},
+    {"isAuxiliary", 13},
+    {"accessibilityEventTypes", 13},
+    {"packageNames", 13},
+    {"accessibilityFeedbackType", 13},
+    {"notificationTimeout", 13},
+    {"accessibilityFlags", 13},
+    {"canRetrieveWindowContent", 13},
+    {"listPreferredItemHeightLarge", 13},
+    {"listPreferredItemHeightSmall", 13},
+    {"actionBarSplitStyle", 13},
+    {"actionProviderClass", 13},
+    {"backgroundStacked", 13},
+    {"backgroundSplit", 13},
+    {"textAllCaps", 13},
+    {"colorPressedHighlight", 13},
+    {"colorLongPressedHighlight", 13},
+    {"colorFocusedHighlight", 13},
+    {"colorActivatedHighlight", 13},
+    {"colorMultiSelectHighlight", 13},
+    {"drawableStart", 13},
+    {"drawableEnd", 13},
+    {"actionModeStyle", 13},
+    {"minResizeWidth", 13},
+    {"minResizeHeight", 13},
+    {"actionBarWidgetTheme", 13},
+    {"uiOptions", 13},
+    {"subtypeLocale", 13},
+    {"subtypeExtraValue", 13},
+    {"actionBarDivider", 13},
+    {"actionBarItemBackground", 13},
+    {"actionModeSplitBackground", 13},
+    {"textAppearanceListItem", 13},
+    {"textAppearanceListItemSmall", 13},
+    {"targetDescriptions", 13},
+    {"directionDescriptions", 13},
+    {"overridesImplicitlyEnabledSubtype", 13},
+    {"listPreferredItemPaddingLeft", 13},
+    {"listPreferredItemPaddingRight", 13},
+    {"requiresFadingEdge", 13},
+    {"publicKey", 13},
+    {"parentActivityName", 16},
+    {"isolatedProcess", 16},
+    {"importantForAccessibility", 16},
+    {"keyboardLayout", 16},
+    {"fontFamily", 16},
+    {"mediaRouteButtonStyle", 16},
+    {"mediaRouteTypes", 16},
+    {"supportsRtl", 17},
+    {"textDirection", 17},
+    {"textAlignment", 17},
+    {"layoutDirection", 17},
+    {"paddingStart", 17},
+    {"paddingEnd", 17},
+    {"layout_marginStart", 17},
+    {"layout_marginEnd", 17},
+    {"layout_toStartOf", 17},
+    {"layout_toEndOf", 17},
+    {"layout_alignStart", 17},
+    {"layout_alignEnd", 17},
+    {"layout_alignParentStart", 17},
+    {"layout_alignParentEnd", 17},
+    {"listPreferredItemPaddingStart", 17},
+    {"listPreferredItemPaddingEnd", 17},
+    {"singleUser", 17},
+    {"presentationTheme", 17},
+    {"subtypeId", 17},
+    {"initialKeyguardLayout", 17},
+    {"widgetCategory", 17},
+    {"permissionGroupFlags", 17},
+    {"labelFor", 17},
+    {"permissionFlags", 17},
+    {"checkedTextViewStyle", 17},
+    {"showOnLockScreen", 17},
+    {"format12Hour", 17},
+    {"format24Hour", 17},
+    {"timeZone", 17},
+    {"mipMap", 18},
+    {"mirrorForRtl", 18},
+    {"windowOverscan", 18},
+    {"requiredForAllUsers", 18},
+    {"indicatorStart", 18},
+    {"indicatorEnd", 18},
+    {"childIndicatorStart", 18},
+    {"childIndicatorEnd", 18},
+    {"restrictedAccountType", 18},
+    {"requiredAccountType", 18},
+    {"canRequestTouchExplorationMode", 18},
+    {"canRequestEnhancedWebAccessibility", 18},
+    {"canRequestFilterKeyEvents", 18},
+    {"layoutMode", 18},
+    {"keySet", 19},
+    {"targetId", 19},
+    {"fromScene", 19},
+    {"toScene", 19},
+    {"transition", 19},
+    {"transitionOrdering", 19},
+    {"fadingMode", 19},
+    {"startDelay", 19},
+    {"ssp", 19},
+    {"sspPrefix", 19},
+    {"sspPattern", 19},
+    {"addPrintersActivity", 19},
+    {"vendor", 19},
+    {"category", 19},
+    {"isAsciiCapable", 19},
+    {"autoMirrored", 19},
+    {"supportsSwitchingToNextInputMethod", 19},
+    {"requireDeviceUnlock", 19},
+    {"apduServiceBanner", 19},
+    {"accessibilityLiveRegion", 19},
+    {"windowTranslucentStatus", 19},
+    {"windowTranslucentNavigation", 19},
+    {"advancedPrintOptionsActivity", 19},
+    {"banner", 20},
+    {"windowSwipeToDismiss", 20},
+    {"isGame", 20},
+    {"allowEmbedded", 20},
+    {"setupActivity", 20},
+    {"fastScrollStyle", 21},
+    {"windowContentTransitions", 21},
+    {"windowContentTransitionManager", 21},
+    {"translationZ", 21},
+    {"tintMode", 21},
+    {"controlX1", 21},
+    {"controlY1", 21},
+    {"controlX2", 21},
+    {"controlY2", 21},
+    {"transitionName", 21},
+    {"transitionGroup", 21},
+    {"viewportWidth", 21},
+    {"viewportHeight", 21},
+    {"fillColor", 21},
+    {"pathData", 21},
+    {"strokeColor", 21},
+    {"strokeWidth", 21},
+    {"trimPathStart", 21},
+    {"trimPathEnd", 21},
+    {"trimPathOffset", 21},
+    {"strokeLineCap", 21},
+    {"strokeLineJoin", 21},
+    {"strokeMiterLimit", 21},
+    {"colorControlNormal", 21},
+    {"colorControlActivated", 21},
+    {"colorButtonNormal", 21},
+    {"colorControlHighlight", 21},
+    {"persistableMode", 21},
+    {"titleTextAppearance", 21},
+    {"subtitleTextAppearance", 21},
+    {"slideEdge", 21},
+    {"actionBarTheme", 21},
+    {"textAppearanceListItemSecondary", 21},
+    {"colorPrimary", 21},
+    {"colorPrimaryDark", 21},
+    {"colorAccent", 21},
+    {"nestedScrollingEnabled", 21},
+    {"windowEnterTransition", 21},
+    {"windowExitTransition", 21},
+    {"windowSharedElementEnterTransition", 21},
+    {"windowSharedElementExitTransition", 21},
+    {"windowAllowReturnTransitionOverlap", 21},
+    {"windowAllowEnterTransitionOverlap", 21},
+    {"sessionService", 21},
+    {"stackViewStyle", 21},
+    {"switchStyle", 21},
+    {"elevation", 21},
+    {"excludeId", 21},
+    {"excludeClass", 21},
+    {"hideOnContentScroll", 21},
+    {"actionOverflowMenuStyle", 21},
+    {"documentLaunchMode", 21},
+    {"maxRecents", 21},
+    {"autoRemoveFromRecents", 21},
+    {"stateListAnimator", 21},
+    {"toId", 21},
+    {"fromId", 21},
+    {"reversible", 21},
+    {"splitTrack", 21},
+    {"targetName", 21},
+    {"excludeName", 21},
+    {"matchOrder", 21},
+    {"windowDrawsSystemBarBackgrounds", 21},
+    {"statusBarColor", 21},
+    {"navigationBarColor", 21},
+    {"contentInsetStart", 21},
+    {"contentInsetEnd", 21},
+    {"contentInsetLeft", 21},
+    {"contentInsetRight", 21},
+    {"paddingMode", 21},
+    {"layout_rowWeight", 21},
+    {"layout_columnWeight", 21},
+    {"translateX", 21},
+    {"translateY", 21},
+    {"selectableItemBackgroundBorderless", 21},
+    {"elegantTextHeight", 21},
+    {"searchKeyphraseId", 21},
+    {"searchKeyphrase", 21},
+    {"searchKeyphraseSupportedLocales", 21},
+    {"windowTransitionBackgroundFadeDuration", 21},
+    {"overlapAnchor", 21},
+    {"progressTint", 21},
+    {"progressTintMode", 21},
+    {"progressBackgroundTint", 21},
+    {"progressBackgroundTintMode", 21},
+    {"secondaryProgressTint", 21},
+    {"secondaryProgressTintMode", 21},
+    {"indeterminateTint", 21},
+    {"indeterminateTintMode", 21},
+    {"backgroundTint", 21},
+    {"backgroundTintMode", 21},
+    {"foregroundTint", 21},
+    {"foregroundTintMode", 21},
+    {"buttonTint", 21},
+    {"buttonTintMode", 21},
+    {"thumbTint", 21},
+    {"thumbTintMode", 21},
+    {"fullBackupOnly", 21},
+    {"propertyXName", 21},
+    {"propertyYName", 21},
+    {"relinquishTaskIdentity", 21},
+    {"tileModeX", 21},
+    {"tileModeY", 21},
+    {"actionModeShareDrawable", 21},
+    {"actionModeFindDrawable", 21},
+    {"actionModeWebSearchDrawable", 21},
+    {"transitionVisibilityMode", 21},
+    {"minimumHorizontalAngle", 21},
+    {"minimumVerticalAngle", 21},
+    {"maximumAngle", 21},
+    {"searchViewStyle", 21},
+    {"closeIcon", 21},
+    {"goIcon", 21},
+    {"searchIcon", 21},
+    {"voiceIcon", 21},
+    {"commitIcon", 21},
+    {"suggestionRowLayout", 21},
+    {"queryBackground", 21},
+    {"submitBackground", 21},
+    {"buttonBarPositiveButtonStyle", 21},
+    {"buttonBarNeutralButtonStyle", 21},
+    {"buttonBarNegativeButtonStyle", 21},
+    {"popupElevation", 21},
+    {"actionBarPopupTheme", 21},
+    {"multiArch", 21},
+    {"touchscreenBlocksFocus", 21},
+    {"windowElevation", 21},
+    {"launchTaskBehindTargetAnimation", 21},
+    {"launchTaskBehindSourceAnimation", 21},
+    {"restrictionType", 21},
+    {"dayOfWeekBackground", 21},
+    {"dayOfWeekTextAppearance", 21},
+    {"headerMonthTextAppearance", 21},
+    {"headerDayOfMonthTextAppearance", 21},
+    {"headerYearTextAppearance", 21},
+    {"yearListItemTextAppearance", 21},
+    {"yearListSelectorColor", 21},
+    {"calendarTextColor", 21},
+    {"recognitionService", 21},
+    {"timePickerStyle", 21},
+    {"timePickerDialogTheme", 21},
+    {"headerTimeTextAppearance", 21},
+    {"headerAmPmTextAppearance", 21},
+    {"numbersTextColor", 21},
+    {"numbersBackgroundColor", 21},
+    {"numbersSelectorColor", 21},
+    {"amPmTextColor", 21},
+    {"amPmBackgroundColor", 21},
+    {"searchKeyphraseRecognitionFlags", 21},
+    {"checkMarkTint", 21},
+    {"checkMarkTintMode", 21},
+    {"popupTheme", 21},
+    {"toolbarStyle", 21},
+    {"windowClipToOutline", 21},
+    {"datePickerDialogTheme", 21},
+    {"showText", 21},
+    {"windowReturnTransition", 21},
+    {"windowReenterTransition", 21},
+    {"windowSharedElementReturnTransition", 21},
+    {"windowSharedElementReenterTransition", 21},
+    {"resumeWhilePausing", 21},
+    {"datePickerMode", 21},
+    {"timePickerMode", 21},
+    {"inset", 21},
+    {"letterSpacing", 21},
+    {"fontFeatureSettings", 21},
+    {"outlineProvider", 21},
+    {"contentAgeHint", 21},
+    {"country", 21},
+    {"windowSharedElementsUseOverlay", 21},
+    {"reparent", 21},
+    {"reparentWithOverlay", 21},
+    {"ambientShadowAlpha", 21},
+    {"spotShadowAlpha", 21},
+    {"navigationIcon", 21},
+    {"navigationContentDescription", 21},
+    {"fragmentExitTransition", 21},
+    {"fragmentEnterTransition", 21},
+    {"fragmentSharedElementEnterTransition", 21},
+    {"fragmentReturnTransition", 21},
+    {"fragmentSharedElementReturnTransition", 21},
+    {"fragmentReenterTransition", 21},
+    {"fragmentAllowEnterTransitionOverlap", 21},
+    {"fragmentAllowReturnTransitionOverlap", 21},
+    {"patternPathData", 21},
+    {"strokeAlpha", 21},
+    {"fillAlpha", 21},
+    {"windowActivityTransitions", 21},
+    {"colorEdgeEffect", 21}};
 
 size_t findAttributeSdkLevel(const ResourceName& name) {
-    if (name.package != "android" && name.type != ResourceType::kAttr) {
-        return 0;
-    }
+  if (name.package != "android" && name.type != ResourceType::kAttr) {
+    return 0;
+  }
 
-    auto iter = sAttrMap.find(name.entry);
-    if (iter != sAttrMap.end()) {
-        return iter->second;
-    }
-    return SDK_LOLLIPOP_MR1;
+  auto iter = sAttrMap.find(name.entry);
+  if (iter != sAttrMap.end()) {
+    return iter->second;
+  }
+  return SDK_LOLLIPOP_MR1;
 }
 
 std::pair<StringPiece, int> getDevelopmentSdkCodeNameAndVersion() {
-    return std::make_pair(StringPiece(sDevelopmentSdkCodeName), sDevelopmentSdkLevel);
+  return std::make_pair(StringPiece(sDevelopmentSdkCodeName),
+                        sDevelopmentSdkLevel);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/SdkConstants.h b/tools/aapt2/SdkConstants.h
index c9dbdca..bd17fe4 100644
--- a/tools/aapt2/SdkConstants.h
+++ b/tools/aapt2/SdkConstants.h
@@ -24,33 +24,33 @@
 namespace aapt {
 
 enum {
-    SDK_CUPCAKE = 3,
-    SDK_DONUT = 4,
-    SDK_ECLAIR = 5,
-    SDK_ECLAIR_0_1 = 6,
-    SDK_ECLAIR_MR1 = 7,
-    SDK_FROYO = 8,
-    SDK_GINGERBREAD = 9,
-    SDK_GINGERBREAD_MR1 = 10,
-    SDK_HONEYCOMB = 11,
-    SDK_HONEYCOMB_MR1 = 12,
-    SDK_HONEYCOMB_MR2 = 13,
-    SDK_ICE_CREAM_SANDWICH = 14,
-    SDK_ICE_CREAM_SANDWICH_MR1 = 15,
-    SDK_JELLY_BEAN = 16,
-    SDK_JELLY_BEAN_MR1 = 17,
-    SDK_JELLY_BEAN_MR2 = 18,
-    SDK_KITKAT = 19,
-    SDK_KITKAT_WATCH = 20,
-    SDK_LOLLIPOP = 21,
-    SDK_LOLLIPOP_MR1 = 22,
-    SDK_MARSHMALLOW = 23,
+  SDK_CUPCAKE = 3,
+  SDK_DONUT = 4,
+  SDK_ECLAIR = 5,
+  SDK_ECLAIR_0_1 = 6,
+  SDK_ECLAIR_MR1 = 7,
+  SDK_FROYO = 8,
+  SDK_GINGERBREAD = 9,
+  SDK_GINGERBREAD_MR1 = 10,
+  SDK_HONEYCOMB = 11,
+  SDK_HONEYCOMB_MR1 = 12,
+  SDK_HONEYCOMB_MR2 = 13,
+  SDK_ICE_CREAM_SANDWICH = 14,
+  SDK_ICE_CREAM_SANDWICH_MR1 = 15,
+  SDK_JELLY_BEAN = 16,
+  SDK_JELLY_BEAN_MR1 = 17,
+  SDK_JELLY_BEAN_MR2 = 18,
+  SDK_KITKAT = 19,
+  SDK_KITKAT_WATCH = 20,
+  SDK_LOLLIPOP = 21,
+  SDK_LOLLIPOP_MR1 = 22,
+  SDK_MARSHMALLOW = 23,
 };
 
 size_t findAttributeSdkLevel(const ResourceId& id);
 size_t findAttributeSdkLevel(const ResourceName& name);
 std::pair<StringPiece, int> getDevelopmentSdkCodeNameAndVersion();
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_SDK_CONSTANTS_H
+#endif  // AAPT_SDK_CONSTANTS_H
diff --git a/tools/aapt2/SdkConstants_test.cpp b/tools/aapt2/SdkConstants_test.cpp
index e81f412..3b70acb 100644
--- a/tools/aapt2/SdkConstants_test.cpp
+++ b/tools/aapt2/SdkConstants_test.cpp
@@ -21,18 +21,18 @@
 namespace aapt {
 
 TEST(SdkConstantsTest, FirstAttributeIsSdk1) {
-    EXPECT_EQ(1u, findAttributeSdkLevel(ResourceId(0x01010000)));
+  EXPECT_EQ(1u, findAttributeSdkLevel(ResourceId(0x01010000)));
 }
 
 TEST(SdkConstantsTest, AllAttributesAfterLollipopAreLollipopMR1) {
-    EXPECT_EQ(SDK_LOLLIPOP, findAttributeSdkLevel(ResourceId(0x010103f7)));
-    EXPECT_EQ(SDK_LOLLIPOP, findAttributeSdkLevel(ResourceId(0x010104ce)));
+  EXPECT_EQ(SDK_LOLLIPOP, findAttributeSdkLevel(ResourceId(0x010103f7)));
+  EXPECT_EQ(SDK_LOLLIPOP, findAttributeSdkLevel(ResourceId(0x010104ce)));
 
-    EXPECT_EQ(SDK_LOLLIPOP_MR1, findAttributeSdkLevel(ResourceId(0x010104cf)));
-    EXPECT_EQ(SDK_LOLLIPOP_MR1, findAttributeSdkLevel(ResourceId(0x010104d8)));
+  EXPECT_EQ(SDK_LOLLIPOP_MR1, findAttributeSdkLevel(ResourceId(0x010104cf)));
+  EXPECT_EQ(SDK_LOLLIPOP_MR1, findAttributeSdkLevel(ResourceId(0x010104d8)));
 
-    EXPECT_EQ(SDK_LOLLIPOP_MR1, findAttributeSdkLevel(ResourceId(0x010104d9)));
-    EXPECT_EQ(SDK_LOLLIPOP_MR1, findAttributeSdkLevel(ResourceId(0x0101ffff)));
+  EXPECT_EQ(SDK_LOLLIPOP_MR1, findAttributeSdkLevel(ResourceId(0x010104d9)));
+  EXPECT_EQ(SDK_LOLLIPOP_MR1, findAttributeSdkLevel(ResourceId(0x0101ffff)));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/Source.h b/tools/aapt2/Source.h
index 8a1021d..422b361 100644
--- a/tools/aapt2/Source.h
+++ b/tools/aapt2/Source.h
@@ -30,20 +30,19 @@
  * showing errors.
  */
 struct Source {
-    std::string path;
-    Maybe<size_t> line;
+  std::string path;
+  Maybe<size_t> line;
 
-    Source() = default;
+  Source() = default;
 
-    inline Source(const StringPiece& path) : path(path.toString()) {  // NOLINT(implicit)
-    }
+  inline Source(const StringPiece& path)
+      : path(path.toString()) {  // NOLINT(implicit)
+  }
 
-    inline Source(const StringPiece& path, size_t line) : path(path.toString()), line(line) {
-    }
+  inline Source(const StringPiece& path, size_t line)
+      : path(path.toString()), line(line) {}
 
-    inline Source withLine(size_t line) const {
-        return Source(path, line);
-    }
+  inline Source withLine(size_t line) const { return Source(path, line); }
 };
 
 //
@@ -51,30 +50,30 @@
 //
 
 inline ::std::ostream& operator<<(::std::ostream& out, const Source& source) {
-    out << source.path;
-    if (source.line) {
-        out << ":" << source.line.value();
-    }
-    return out;
+  out << source.path;
+  if (source.line) {
+    out << ":" << source.line.value();
+  }
+  return out;
 }
 
 inline bool operator==(const Source& lhs, const Source& rhs) {
-    return lhs.path == rhs.path && lhs.line == rhs.line;
+  return lhs.path == rhs.path && lhs.line == rhs.line;
 }
 
 inline bool operator<(const Source& lhs, const Source& rhs) {
-    int cmp = lhs.path.compare(rhs.path);
-    if (cmp < 0) return true;
-    if (cmp > 0) return false;
-    if (lhs.line) {
-        if (rhs.line) {
-            return lhs.line.value() < rhs.line.value();
-        }
-        return false;
+  int cmp = lhs.path.compare(rhs.path);
+  if (cmp < 0) return true;
+  if (cmp > 0) return false;
+  if (lhs.line) {
+    if (rhs.line) {
+      return lhs.line.value() < rhs.line.value();
     }
-    return bool(rhs.line);
+    return false;
+  }
+  return bool(rhs.line);
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_SOURCE_H
+#endif  // AAPT_SOURCE_H
diff --git a/tools/aapt2/StringPool.cpp b/tools/aapt2/StringPool.cpp
index fe4b967..a167a6a 100644
--- a/tools/aapt2/StringPool.cpp
+++ b/tools/aapt2/StringPool.cpp
@@ -19,395 +19,400 @@
 #include "util/StringPiece.h"
 #include "util/Util.h"
 
-#include <algorithm>
 #include <androidfw/ResourceTypes.h>
+#include <algorithm>
 #include <memory>
 #include <string>
 
 namespace aapt {
 
-StringPool::Ref::Ref() : mEntry(nullptr) {
-}
+StringPool::Ref::Ref() : mEntry(nullptr) {}
 
 StringPool::Ref::Ref(const StringPool::Ref& rhs) : mEntry(rhs.mEntry) {
-    if (mEntry != nullptr) {
-        mEntry->ref++;
-    }
+  if (mEntry != nullptr) {
+    mEntry->ref++;
+  }
 }
 
 StringPool::Ref::Ref(StringPool::Entry* entry) : mEntry(entry) {
-    if (mEntry != nullptr) {
-        mEntry->ref++;
-    }
+  if (mEntry != nullptr) {
+    mEntry->ref++;
+  }
 }
 
 StringPool::Ref::~Ref() {
-    if (mEntry != nullptr) {
-        mEntry->ref--;
-    }
+  if (mEntry != nullptr) {
+    mEntry->ref--;
+  }
 }
 
 StringPool::Ref& StringPool::Ref::operator=(const StringPool::Ref& rhs) {
-    if (rhs.mEntry != nullptr) {
-        rhs.mEntry->ref++;
-    }
+  if (rhs.mEntry != nullptr) {
+    rhs.mEntry->ref++;
+  }
 
-    if (mEntry != nullptr) {
-        mEntry->ref--;
-    }
-    mEntry = rhs.mEntry;
-    return *this;
+  if (mEntry != nullptr) {
+    mEntry->ref--;
+  }
+  mEntry = rhs.mEntry;
+  return *this;
 }
 
 const std::string* StringPool::Ref::operator->() const {
-    return &mEntry->value;
+  return &mEntry->value;
 }
 
-const std::string& StringPool::Ref::operator*() const {
-    return mEntry->value;
-}
+const std::string& StringPool::Ref::operator*() const { return mEntry->value; }
 
-size_t StringPool::Ref::getIndex() const {
-    return mEntry->index;
-}
+size_t StringPool::Ref::getIndex() const { return mEntry->index; }
 
 const StringPool::Context& StringPool::Ref::getContext() const {
-    return mEntry->context;
+  return mEntry->context;
 }
 
-StringPool::StyleRef::StyleRef() : mEntry(nullptr) {
-}
+StringPool::StyleRef::StyleRef() : mEntry(nullptr) {}
 
-StringPool::StyleRef::StyleRef(const StringPool::StyleRef& rhs) : mEntry(rhs.mEntry) {
-    if (mEntry != nullptr) {
-        mEntry->ref++;
-    }
+StringPool::StyleRef::StyleRef(const StringPool::StyleRef& rhs)
+    : mEntry(rhs.mEntry) {
+  if (mEntry != nullptr) {
+    mEntry->ref++;
+  }
 }
 
 StringPool::StyleRef::StyleRef(StringPool::StyleEntry* entry) : mEntry(entry) {
-    if (mEntry != nullptr) {
-        mEntry->ref++;
-    }
+  if (mEntry != nullptr) {
+    mEntry->ref++;
+  }
 }
 
 StringPool::StyleRef::~StyleRef() {
-    if (mEntry != nullptr) {
-        mEntry->ref--;
-    }
+  if (mEntry != nullptr) {
+    mEntry->ref--;
+  }
 }
 
-StringPool::StyleRef& StringPool::StyleRef::operator=(const StringPool::StyleRef& rhs) {
-    if (rhs.mEntry != nullptr) {
-        rhs.mEntry->ref++;
-    }
+StringPool::StyleRef& StringPool::StyleRef::operator=(
+    const StringPool::StyleRef& rhs) {
+  if (rhs.mEntry != nullptr) {
+    rhs.mEntry->ref++;
+  }
 
-    if (mEntry != nullptr) {
-        mEntry->ref--;
-    }
-    mEntry = rhs.mEntry;
-    return *this;
+  if (mEntry != nullptr) {
+    mEntry->ref--;
+  }
+  mEntry = rhs.mEntry;
+  return *this;
 }
 
 const StringPool::StyleEntry* StringPool::StyleRef::operator->() const {
-    return mEntry;
+  return mEntry;
 }
 
 const StringPool::StyleEntry& StringPool::StyleRef::operator*() const {
-    return *mEntry;
+  return *mEntry;
 }
 
-size_t StringPool::StyleRef::getIndex() const {
-    return mEntry->str.getIndex();
-}
+size_t StringPool::StyleRef::getIndex() const { return mEntry->str.getIndex(); }
 
 const StringPool::Context& StringPool::StyleRef::getContext() const {
-    return mEntry->str.getContext();
+  return mEntry->str.getContext();
 }
 
 StringPool::Ref StringPool::makeRef(const StringPiece& str) {
-    return makeRefImpl(str, Context{}, true);
+  return makeRefImpl(str, Context{}, true);
 }
 
-StringPool::Ref StringPool::makeRef(const StringPiece& str, const Context& context) {
-    return makeRefImpl(str, context, true);
+StringPool::Ref StringPool::makeRef(const StringPiece& str,
+                                    const Context& context) {
+  return makeRefImpl(str, context, true);
 }
 
-StringPool::Ref StringPool::makeRefImpl(const StringPiece& str, const Context& context,
-        bool unique) {
-    if (unique) {
-        auto iter = mIndexedStrings.find(str);
-        if (iter != std::end(mIndexedStrings)) {
-            return Ref(iter->second);
-        }
+StringPool::Ref StringPool::makeRefImpl(const StringPiece& str,
+                                        const Context& context, bool unique) {
+  if (unique) {
+    auto iter = mIndexedStrings.find(str);
+    if (iter != std::end(mIndexedStrings)) {
+      return Ref(iter->second);
     }
+  }
 
-    Entry* entry = new Entry();
-    entry->value = str.toString();
-    entry->context = context;
-    entry->index = mStrings.size();
-    entry->ref = 0;
-    mStrings.emplace_back(entry);
-    mIndexedStrings.insert(std::make_pair(StringPiece(entry->value), entry));
-    return Ref(entry);
+  Entry* entry = new Entry();
+  entry->value = str.toString();
+  entry->context = context;
+  entry->index = mStrings.size();
+  entry->ref = 0;
+  mStrings.emplace_back(entry);
+  mIndexedStrings.insert(std::make_pair(StringPiece(entry->value), entry));
+  return Ref(entry);
 }
 
 StringPool::StyleRef StringPool::makeRef(const StyleString& str) {
-    return makeRef(str, Context{});
+  return makeRef(str, Context{});
 }
 
-StringPool::StyleRef StringPool::makeRef(const StyleString& str, const Context& context) {
-    Entry* entry = new Entry();
-    entry->value = str.str;
-    entry->context = context;
-    entry->index = mStrings.size();
-    entry->ref = 0;
-    mStrings.emplace_back(entry);
-    mIndexedStrings.insert(std::make_pair(StringPiece(entry->value), entry));
+StringPool::StyleRef StringPool::makeRef(const StyleString& str,
+                                         const Context& context) {
+  Entry* entry = new Entry();
+  entry->value = str.str;
+  entry->context = context;
+  entry->index = mStrings.size();
+  entry->ref = 0;
+  mStrings.emplace_back(entry);
+  mIndexedStrings.insert(std::make_pair(StringPiece(entry->value), entry));
 
-    StyleEntry* styleEntry = new StyleEntry();
-    styleEntry->str = Ref(entry);
-    for (const aapt::Span& span : str.spans) {
-        styleEntry->spans.emplace_back(Span{ makeRef(span.name), span.firstChar, span.lastChar });
-    }
-    styleEntry->ref = 0;
-    mStyles.emplace_back(styleEntry);
-    return StyleRef(styleEntry);
+  StyleEntry* styleEntry = new StyleEntry();
+  styleEntry->str = Ref(entry);
+  for (const aapt::Span& span : str.spans) {
+    styleEntry->spans.emplace_back(
+        Span{makeRef(span.name), span.firstChar, span.lastChar});
+  }
+  styleEntry->ref = 0;
+  mStyles.emplace_back(styleEntry);
+  return StyleRef(styleEntry);
 }
 
 StringPool::StyleRef StringPool::makeRef(const StyleRef& ref) {
-    Entry* entry = new Entry();
-    entry->value = *ref.mEntry->str;
-    entry->context = ref.mEntry->str.mEntry->context;
-    entry->index = mStrings.size();
-    entry->ref = 0;
-    mStrings.emplace_back(entry);
-    mIndexedStrings.insert(std::make_pair(StringPiece(entry->value), entry));
+  Entry* entry = new Entry();
+  entry->value = *ref.mEntry->str;
+  entry->context = ref.mEntry->str.mEntry->context;
+  entry->index = mStrings.size();
+  entry->ref = 0;
+  mStrings.emplace_back(entry);
+  mIndexedStrings.insert(std::make_pair(StringPiece(entry->value), entry));
 
-    StyleEntry* styleEntry = new StyleEntry();
-    styleEntry->str = Ref(entry);
-    for (const Span& span : ref.mEntry->spans) {
-        styleEntry->spans.emplace_back(Span{ makeRef(*span.name), span.firstChar, span.lastChar });
-    }
-    styleEntry->ref = 0;
-    mStyles.emplace_back(styleEntry);
-    return StyleRef(styleEntry);
+  StyleEntry* styleEntry = new StyleEntry();
+  styleEntry->str = Ref(entry);
+  for (const Span& span : ref.mEntry->spans) {
+    styleEntry->spans.emplace_back(
+        Span{makeRef(*span.name), span.firstChar, span.lastChar});
+  }
+  styleEntry->ref = 0;
+  mStyles.emplace_back(styleEntry);
+  return StyleRef(styleEntry);
 }
 
 void StringPool::merge(StringPool&& pool) {
-    mIndexedStrings.insert(pool.mIndexedStrings.begin(), pool.mIndexedStrings.end());
-    pool.mIndexedStrings.clear();
-    std::move(pool.mStrings.begin(), pool.mStrings.end(), std::back_inserter(mStrings));
-    pool.mStrings.clear();
-    std::move(pool.mStyles.begin(), pool.mStyles.end(), std::back_inserter(mStyles));
-    pool.mStyles.clear();
+  mIndexedStrings.insert(pool.mIndexedStrings.begin(),
+                         pool.mIndexedStrings.end());
+  pool.mIndexedStrings.clear();
+  std::move(pool.mStrings.begin(), pool.mStrings.end(),
+            std::back_inserter(mStrings));
+  pool.mStrings.clear();
+  std::move(pool.mStyles.begin(), pool.mStyles.end(),
+            std::back_inserter(mStyles));
+  pool.mStyles.clear();
 
-    // Assign the indices.
-    const size_t len = mStrings.size();
-    for (size_t index = 0; index < len; index++) {
-        mStrings[index]->index = index;
-    }
+  // Assign the indices.
+  const size_t len = mStrings.size();
+  for (size_t index = 0; index < len; index++) {
+    mStrings[index]->index = index;
+  }
 }
 
 void StringPool::hintWillAdd(size_t stringCount, size_t styleCount) {
-    mStrings.reserve(mStrings.size() + stringCount);
-    mStyles.reserve(mStyles.size() + styleCount);
+  mStrings.reserve(mStrings.size() + stringCount);
+  mStyles.reserve(mStyles.size() + styleCount);
 }
 
 void StringPool::prune() {
-    const auto iterEnd = std::end(mIndexedStrings);
-    auto indexIter = std::begin(mIndexedStrings);
-    while (indexIter != iterEnd) {
-        if (indexIter->second->ref <= 0) {
-            indexIter = mIndexedStrings.erase(indexIter);
-        } else {
-            ++indexIter;
-        }
+  const auto iterEnd = std::end(mIndexedStrings);
+  auto indexIter = std::begin(mIndexedStrings);
+  while (indexIter != iterEnd) {
+    if (indexIter->second->ref <= 0) {
+      indexIter = mIndexedStrings.erase(indexIter);
+    } else {
+      ++indexIter;
     }
+  }
 
-    auto endIter2 = std::remove_if(std::begin(mStrings), std::end(mStrings),
-            [](const std::unique_ptr<Entry>& entry) -> bool {
-                return entry->ref <= 0;
-            }
-    );
+  auto endIter2 =
+      std::remove_if(std::begin(mStrings), std::end(mStrings),
+                     [](const std::unique_ptr<Entry>& entry) -> bool {
+                       return entry->ref <= 0;
+                     });
 
-    auto endIter3 = std::remove_if(std::begin(mStyles), std::end(mStyles),
-            [](const std::unique_ptr<StyleEntry>& entry) -> bool {
-                return entry->ref <= 0;
-            }
-    );
+  auto endIter3 =
+      std::remove_if(std::begin(mStyles), std::end(mStyles),
+                     [](const std::unique_ptr<StyleEntry>& entry) -> bool {
+                       return entry->ref <= 0;
+                     });
 
-    // Remove the entries at the end or else we'll be accessing
-    // a deleted string from the StyleEntry.
-    mStrings.erase(endIter2, std::end(mStrings));
-    mStyles.erase(endIter3, std::end(mStyles));
+  // Remove the entries at the end or else we'll be accessing
+  // a deleted string from the StyleEntry.
+  mStrings.erase(endIter2, std::end(mStrings));
+  mStyles.erase(endIter3, std::end(mStyles));
 
-    // Reassign the indices.
-    const size_t len = mStrings.size();
-    for (size_t index = 0; index < len; index++) {
-        mStrings[index]->index = index;
-    }
+  // Reassign the indices.
+  const size_t len = mStrings.size();
+  for (size_t index = 0; index < len; index++) {
+    mStrings[index]->index = index;
+  }
 }
 
-void StringPool::sort(const std::function<bool(const Entry&, const Entry&)>& cmp) {
-    std::sort(std::begin(mStrings), std::end(mStrings),
-            [&cmp](const std::unique_ptr<Entry>& a, const std::unique_ptr<Entry>& b) -> bool {
-                return cmp(*a, *b);
-            }
-    );
+void StringPool::sort(
+    const std::function<bool(const Entry&, const Entry&)>& cmp) {
+  std::sort(
+      std::begin(mStrings), std::end(mStrings),
+      [&cmp](const std::unique_ptr<Entry>& a,
+             const std::unique_ptr<Entry>& b) -> bool { return cmp(*a, *b); });
 
-    // Assign the indices.
-    const size_t len = mStrings.size();
-    for (size_t index = 0; index < len; index++) {
-        mStrings[index]->index = index;
-    }
+  // Assign the indices.
+  const size_t len = mStrings.size();
+  for (size_t index = 0; index < len; index++) {
+    mStrings[index]->index = index;
+  }
 
-    // Reorder the styles.
-    std::sort(std::begin(mStyles), std::end(mStyles),
+  // Reorder the styles.
+  std::sort(std::begin(mStyles), std::end(mStyles),
             [](const std::unique_ptr<StyleEntry>& lhs,
                const std::unique_ptr<StyleEntry>& rhs) -> bool {
-                return lhs->str.getIndex() < rhs->str.getIndex();
-            }
-    );
+              return lhs->str.getIndex() < rhs->str.getIndex();
+            });
 }
 
 template <typename T>
 static T* encodeLength(T* data, size_t length) {
-    static_assert(std::is_integral<T>::value, "wat.");
+  static_assert(std::is_integral<T>::value, "wat.");
 
-    constexpr size_t kMask = 1 << ((sizeof(T) * 8) - 1);
-    constexpr size_t kMaxSize = kMask - 1;
-    if (length > kMaxSize) {
-        *data++ = kMask | (kMaxSize & (length >> (sizeof(T) * 8)));
-    }
-    *data++ = length;
-    return data;
+  constexpr size_t kMask = 1 << ((sizeof(T) * 8) - 1);
+  constexpr size_t kMaxSize = kMask - 1;
+  if (length > kMaxSize) {
+    *data++ = kMask | (kMaxSize & (length >> (sizeof(T) * 8)));
+  }
+  *data++ = length;
+  return data;
 }
 
 template <typename T>
 static size_t encodedLengthUnits(size_t length) {
-    static_assert(std::is_integral<T>::value, "wat.");
+  static_assert(std::is_integral<T>::value, "wat.");
 
-    constexpr size_t kMask = 1 << ((sizeof(T) * 8) - 1);
-    constexpr size_t kMaxSize = kMask - 1;
-    return length > kMaxSize ? 2 : 1;
+  constexpr size_t kMask = 1 << ((sizeof(T) * 8) - 1);
+  constexpr size_t kMaxSize = kMask - 1;
+  return length > kMaxSize ? 2 : 1;
 }
 
-
 bool StringPool::flatten(BigBuffer* out, const StringPool& pool, bool utf8) {
-    const size_t startIndex = out->size();
-    android::ResStringPool_header* header = out->nextBlock<android::ResStringPool_header>();
-    header->header.type = android::RES_STRING_POOL_TYPE;
-    header->header.headerSize = sizeof(*header);
-    header->stringCount = pool.size();
+  const size_t startIndex = out->size();
+  android::ResStringPool_header* header =
+      out->nextBlock<android::ResStringPool_header>();
+  header->header.type = android::RES_STRING_POOL_TYPE;
+  header->header.headerSize = sizeof(*header);
+  header->stringCount = pool.size();
+  if (utf8) {
+    header->flags |= android::ResStringPool_header::UTF8_FLAG;
+  }
+
+  uint32_t* indices =
+      pool.size() != 0 ? out->nextBlock<uint32_t>(pool.size()) : nullptr;
+
+  uint32_t* styleIndices = nullptr;
+  if (!pool.mStyles.empty()) {
+    header->styleCount = pool.mStyles.back()->str.getIndex() + 1;
+    styleIndices = out->nextBlock<uint32_t>(header->styleCount);
+  }
+
+  const size_t beforeStringsIndex = out->size();
+  header->stringsStart = beforeStringsIndex - startIndex;
+
+  for (const auto& entry : pool) {
+    *indices = out->size() - beforeStringsIndex;
+    indices++;
+
     if (utf8) {
-        header->flags |= android::ResStringPool_header::UTF8_FLAG;
+      const std::string& encoded = entry->value;
+      const ssize_t utf16Length = utf8_to_utf16_length(
+          reinterpret_cast<const uint8_t*>(entry->value.data()),
+          entry->value.size());
+      assert(utf16Length >= 0);
+
+      const size_t totalSize = encodedLengthUnits<char>(utf16Length) +
+                               encodedLengthUnits<char>(encoded.length()) +
+                               encoded.size() + 1;
+
+      char* data = out->nextBlock<char>(totalSize);
+
+      // First encode the UTF16 string length.
+      data = encodeLength(data, utf16Length);
+
+      // Now encode the size of the real UTF8 string.
+      data = encodeLength(data, encoded.length());
+      strncpy(data, encoded.data(), encoded.size());
+
+    } else {
+      const std::u16string encoded = util::utf8ToUtf16(entry->value);
+      const ssize_t utf16Length = encoded.size();
+
+      // Total number of 16-bit words to write.
+      const size_t totalSize =
+          encodedLengthUnits<char16_t>(utf16Length) + encoded.size() + 1;
+
+      char16_t* data = out->nextBlock<char16_t>(totalSize);
+
+      // Encode the actual UTF16 string length.
+      data = encodeLength(data, utf16Length);
+      const size_t byteLength = encoded.size() * sizeof(char16_t);
+
+      // NOTE: For some reason, strncpy16(data, entry->value.data(),
+      // entry->value.size())
+      // truncates the string.
+      memcpy(data, encoded.data(), byteLength);
+
+      // The null-terminating character is already here due to the block of data
+      // being set
+      // to 0s on allocation.
+    }
+  }
+
+  out->align4();
+
+  if (!pool.mStyles.empty()) {
+    const size_t beforeStylesIndex = out->size();
+    header->stylesStart = beforeStylesIndex - startIndex;
+
+    size_t currentIndex = 0;
+    for (const auto& entry : pool.mStyles) {
+      while (entry->str.getIndex() > currentIndex) {
+        styleIndices[currentIndex++] = out->size() - beforeStylesIndex;
+
+        uint32_t* spanOffset = out->nextBlock<uint32_t>();
+        *spanOffset = android::ResStringPool_span::END;
+      }
+      styleIndices[currentIndex++] = out->size() - beforeStylesIndex;
+
+      android::ResStringPool_span* span =
+          out->nextBlock<android::ResStringPool_span>(entry->spans.size());
+      for (const auto& s : entry->spans) {
+        span->name.index = s.name.getIndex();
+        span->firstChar = s.firstChar;
+        span->lastChar = s.lastChar;
+        span++;
+      }
+
+      uint32_t* spanEnd = out->nextBlock<uint32_t>();
+      *spanEnd = android::ResStringPool_span::END;
     }
 
-    uint32_t* indices = pool.size() != 0 ? out->nextBlock<uint32_t>(pool.size()) : nullptr;
-
-    uint32_t* styleIndices = nullptr;
-    if (!pool.mStyles.empty()) {
-        header->styleCount = pool.mStyles.back()->str.getIndex() + 1;
-        styleIndices = out->nextBlock<uint32_t>(header->styleCount);
-    }
-
-    const size_t beforeStringsIndex = out->size();
-    header->stringsStart = beforeStringsIndex - startIndex;
-
-    for (const auto& entry : pool) {
-        *indices = out->size() - beforeStringsIndex;
-        indices++;
-
-        if (utf8) {
-            const std::string& encoded = entry->value;
-            const ssize_t utf16Length = utf8_to_utf16_length(
-                    reinterpret_cast<const uint8_t*>(entry->value.data()), entry->value.size());
-            assert(utf16Length >= 0);
-
-            const size_t totalSize = encodedLengthUnits<char>(utf16Length)
-                    + encodedLengthUnits<char>(encoded.length())
-                    + encoded.size() + 1;
-
-            char* data = out->nextBlock<char>(totalSize);
-
-            // First encode the UTF16 string length.
-            data = encodeLength(data, utf16Length);
-
-            // Now encode the size of the real UTF8 string.
-            data = encodeLength(data, encoded.length());
-            strncpy(data, encoded.data(), encoded.size());
-
-        } else {
-            const std::u16string encoded = util::utf8ToUtf16(entry->value);
-            const ssize_t utf16Length = encoded.size();
-
-            // Total number of 16-bit words to write.
-            const size_t totalSize = encodedLengthUnits<char16_t>(utf16Length) + encoded.size() + 1;
-
-            char16_t* data = out->nextBlock<char16_t>(totalSize);
-
-            // Encode the actual UTF16 string length.
-            data = encodeLength(data, utf16Length);
-            const size_t byteLength = encoded.size() * sizeof(char16_t);
-
-            // NOTE: For some reason, strncpy16(data, entry->value.data(), entry->value.size())
-            // truncates the string.
-            memcpy(data, encoded.data(), byteLength);
-
-            // The null-terminating character is already here due to the block of data being set
-            // to 0s on allocation.
-        }
-    }
-
+    // The error checking code in the platform looks for an entire
+    // ResStringPool_span structure worth of 0xFFFFFFFF at the end
+    // of the style block, so fill in the remaining 2 32bit words
+    // with 0xFFFFFFFF.
+    const size_t paddingLength = sizeof(android::ResStringPool_span) -
+                                 sizeof(android::ResStringPool_span::name);
+    uint8_t* padding = out->nextBlock<uint8_t>(paddingLength);
+    memset(padding, 0xff, paddingLength);
     out->align4();
-
-    if (!pool.mStyles.empty()) {
-        const size_t beforeStylesIndex = out->size();
-        header->stylesStart = beforeStylesIndex - startIndex;
-
-        size_t currentIndex = 0;
-        for (const auto& entry : pool.mStyles) {
-            while (entry->str.getIndex() > currentIndex) {
-                styleIndices[currentIndex++] = out->size() - beforeStylesIndex;
-
-                uint32_t* spanOffset = out->nextBlock<uint32_t>();
-                *spanOffset = android::ResStringPool_span::END;
-            }
-            styleIndices[currentIndex++] = out->size() - beforeStylesIndex;
-
-            android::ResStringPool_span* span =
-                    out->nextBlock<android::ResStringPool_span>(entry->spans.size());
-            for (const auto& s : entry->spans) {
-                span->name.index = s.name.getIndex();
-                span->firstChar = s.firstChar;
-                span->lastChar = s.lastChar;
-                span++;
-            }
-
-            uint32_t* spanEnd = out->nextBlock<uint32_t>();
-            *spanEnd = android::ResStringPool_span::END;
-        }
-
-        // The error checking code in the platform looks for an entire
-        // ResStringPool_span structure worth of 0xFFFFFFFF at the end
-        // of the style block, so fill in the remaining 2 32bit words
-        // with 0xFFFFFFFF.
-        const size_t paddingLength = sizeof(android::ResStringPool_span)
-                - sizeof(android::ResStringPool_span::name);
-        uint8_t* padding = out->nextBlock<uint8_t>(paddingLength);
-        memset(padding, 0xff, paddingLength);
-        out->align4();
-    }
-    header->header.size = out->size() - startIndex;
-    return true;
+  }
+  header->header.size = out->size() - startIndex;
+  return true;
 }
 
 bool StringPool::flattenUtf8(BigBuffer* out, const StringPool& pool) {
-    return flatten(out, pool, true);
+  return flatten(out, pool, true);
 }
 
 bool StringPool::flattenUtf16(BigBuffer* out, const StringPool& pool) {
-    return flatten(out, pool, false);
+  return flatten(out, pool, false);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/StringPool.h b/tools/aapt2/StringPool.h
index 13545be..05c26e7 100644
--- a/tools/aapt2/StringPool.h
+++ b/tools/aapt2/StringPool.h
@@ -17,207 +17,205 @@
 #ifndef AAPT_STRING_POOL_H
 #define AAPT_STRING_POOL_H
 
-#include "util/BigBuffer.h"
 #include "ConfigDescription.h"
+#include "util/BigBuffer.h"
 #include "util/StringPiece.h"
 
 #include <functional>
-#include <unordered_map>
 #include <memory>
 #include <string>
+#include <unordered_map>
 #include <vector>
 
 namespace aapt {
 
 struct Span {
-    std::string name;
-    uint32_t firstChar;
-    uint32_t lastChar;
+  std::string name;
+  uint32_t firstChar;
+  uint32_t lastChar;
 };
 
 struct StyleString {
-    std::string str;
-    std::vector<Span> spans;
+  std::string str;
+  std::vector<Span> spans;
 };
 
 class StringPool {
-public:
-    struct Context {
-        uint32_t priority;
-        ConfigDescription config;
-    };
+ public:
+  struct Context {
+    uint32_t priority;
+    ConfigDescription config;
+  };
 
-    class Entry;
+  class Entry;
 
-    class Ref {
-    public:
-        Ref();
-        Ref(const Ref&);
-        ~Ref();
+  class Ref {
+   public:
+    Ref();
+    Ref(const Ref&);
+    ~Ref();
 
-        Ref& operator=(const Ref& rhs);
-        const std::string* operator->() const;
-        const std::string& operator*() const;
+    Ref& operator=(const Ref& rhs);
+    const std::string* operator->() const;
+    const std::string& operator*() const;
 
-        size_t getIndex() const;
-        const Context& getContext() const;
+    size_t getIndex() const;
+    const Context& getContext() const;
 
-    private:
-        friend class StringPool;
+   private:
+    friend class StringPool;
 
-        explicit Ref(Entry* entry);
+    explicit Ref(Entry* entry);
 
-        Entry* mEntry;
-    };
+    Entry* mEntry;
+  };
 
-    class StyleEntry;
+  class StyleEntry;
 
-    class StyleRef {
-    public:
-        StyleRef();
-        StyleRef(const StyleRef&);
-        ~StyleRef();
+  class StyleRef {
+   public:
+    StyleRef();
+    StyleRef(const StyleRef&);
+    ~StyleRef();
 
-        StyleRef& operator=(const StyleRef& rhs);
-        const StyleEntry* operator->() const;
-        const StyleEntry& operator*() const;
+    StyleRef& operator=(const StyleRef& rhs);
+    const StyleEntry* operator->() const;
+    const StyleEntry& operator*() const;
 
-        size_t getIndex() const;
-        const Context& getContext() const;
+    size_t getIndex() const;
+    const Context& getContext() const;
 
-    private:
-        friend class StringPool;
+   private:
+    friend class StringPool;
 
-        explicit StyleRef(StyleEntry* entry);
+    explicit StyleRef(StyleEntry* entry);
 
-        StyleEntry* mEntry;
-    };
+    StyleEntry* mEntry;
+  };
 
-    class Entry {
-    public:
-        std::string value;
-        Context context;
-        size_t index;
+  class Entry {
+   public:
+    std::string value;
+    Context context;
+    size_t index;
 
-    private:
-        friend class StringPool;
-        friend class Ref;
+   private:
+    friend class StringPool;
+    friend class Ref;
 
-        int ref;
-    };
+    int ref;
+  };
 
-    struct Span {
-        Ref name;
-        uint32_t firstChar;
-        uint32_t lastChar;
-    };
+  struct Span {
+    Ref name;
+    uint32_t firstChar;
+    uint32_t lastChar;
+  };
 
-    class StyleEntry {
-    public:
-        Ref str;
-        std::vector<Span> spans;
+  class StyleEntry {
+   public:
+    Ref str;
+    std::vector<Span> spans;
 
-    private:
-        friend class StringPool;
-        friend class StyleRef;
+   private:
+    friend class StringPool;
+    friend class StyleRef;
 
-        int ref;
-    };
+    int ref;
+  };
 
-    using const_iterator = std::vector<std::unique_ptr<Entry>>::const_iterator;
+  using const_iterator = std::vector<std::unique_ptr<Entry>>::const_iterator;
 
-    static bool flattenUtf8(BigBuffer* out, const StringPool& pool);
-    static bool flattenUtf16(BigBuffer* out, const StringPool& pool);
+  static bool flattenUtf8(BigBuffer* out, const StringPool& pool);
+  static bool flattenUtf16(BigBuffer* out, const StringPool& pool);
 
-    StringPool() = default;
-    StringPool(const StringPool&) = delete;
+  StringPool() = default;
+  StringPool(const StringPool&) = delete;
 
-    /**
-     * Adds a string to the pool, unless it already exists. Returns
-     * a reference to the string in the pool.
-     */
-    Ref makeRef(const StringPiece& str);
+  /**
+   * Adds a string to the pool, unless it already exists. Returns
+   * a reference to the string in the pool.
+   */
+  Ref makeRef(const StringPiece& str);
 
-    /**
-     * Adds a string to the pool, unless it already exists, with a context
-     * object that can be used when sorting the string pool. Returns
-     * a reference to the string in the pool.
-     */
-    Ref makeRef(const StringPiece& str, const Context& context);
+  /**
+   * Adds a string to the pool, unless it already exists, with a context
+   * object that can be used when sorting the string pool. Returns
+   * a reference to the string in the pool.
+   */
+  Ref makeRef(const StringPiece& str, const Context& context);
 
-    /**
-     * Adds a style to the string pool and returns a reference to it.
-     */
-    StyleRef makeRef(const StyleString& str);
+  /**
+   * Adds a style to the string pool and returns a reference to it.
+   */
+  StyleRef makeRef(const StyleString& str);
 
-    /**
-     * Adds a style to the string pool with a context object that
-     * can be used when sorting the string pool. Returns a reference
-     * to the style in the string pool.
-     */
-    StyleRef makeRef(const StyleString& str, const Context& context);
+  /**
+   * Adds a style to the string pool with a context object that
+   * can be used when sorting the string pool. Returns a reference
+   * to the style in the string pool.
+   */
+  StyleRef makeRef(const StyleString& str, const Context& context);
 
-    /**
-     * Adds a style from another string pool. Returns a reference to the
-     * style in the string pool.
-     */
-    StyleRef makeRef(const StyleRef& ref);
+  /**
+   * Adds a style from another string pool. Returns a reference to the
+   * style in the string pool.
+   */
+  StyleRef makeRef(const StyleRef& ref);
 
-    /**
-     * Moves pool into this one without coalescing strings. When this
-     * function returns, pool will be empty.
-     */
-    void merge(StringPool&& pool);
+  /**
+   * Moves pool into this one without coalescing strings. When this
+   * function returns, pool will be empty.
+   */
+  void merge(StringPool&& pool);
 
-    /**
-     * Retuns the number of strings in the table.
-     */
-    inline size_t size() const;
+  /**
+   * Retuns the number of strings in the table.
+   */
+  inline size_t size() const;
 
-    /**
-     * Reserves space for strings and styles as an optimization.
-     */
-    void hintWillAdd(size_t stringCount, size_t styleCount);
+  /**
+   * Reserves space for strings and styles as an optimization.
+   */
+  void hintWillAdd(size_t stringCount, size_t styleCount);
 
-    /**
-     * Sorts the strings according to some comparison function.
-     */
-    void sort(const std::function<bool(const Entry&, const Entry&)>& cmp);
+  /**
+   * Sorts the strings according to some comparison function.
+   */
+  void sort(const std::function<bool(const Entry&, const Entry&)>& cmp);
 
-    /**
-     * Removes any strings that have no references.
-     */
-    void prune();
+  /**
+   * Removes any strings that have no references.
+   */
+  void prune();
 
-private:
-    friend const_iterator begin(const StringPool& pool);
-    friend const_iterator end(const StringPool& pool);
+ private:
+  friend const_iterator begin(const StringPool& pool);
+  friend const_iterator end(const StringPool& pool);
 
-    static bool flatten(BigBuffer* out, const StringPool& pool, bool utf8);
+  static bool flatten(BigBuffer* out, const StringPool& pool, bool utf8);
 
-    Ref makeRefImpl(const StringPiece& str, const Context& context, bool unique);
+  Ref makeRefImpl(const StringPiece& str, const Context& context, bool unique);
 
-    std::vector<std::unique_ptr<Entry>> mStrings;
-    std::vector<std::unique_ptr<StyleEntry>> mStyles;
-    std::unordered_multimap<StringPiece, Entry*> mIndexedStrings;
+  std::vector<std::unique_ptr<Entry>> mStrings;
+  std::vector<std::unique_ptr<StyleEntry>> mStyles;
+  std::unordered_multimap<StringPiece, Entry*> mIndexedStrings;
 };
 
 //
 // Inline implementation
 //
 
-inline size_t StringPool::size() const {
-    return mStrings.size();
-}
+inline size_t StringPool::size() const { return mStrings.size(); }
 
 inline StringPool::const_iterator begin(const StringPool& pool) {
-    return pool.mStrings.begin();
+  return pool.mStrings.begin();
 }
 
 inline StringPool::const_iterator end(const StringPool& pool) {
-    return pool.mStrings.end();
+  return pool.mStrings.end();
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_STRING_POOL_H
+#endif  // AAPT_STRING_POOL_H
diff --git a/tools/aapt2/StringPool_test.cpp b/tools/aapt2/StringPool_test.cpp
index 1367af7..2a7e1dd 100644
--- a/tools/aapt2/StringPool_test.cpp
+++ b/tools/aapt2/StringPool_test.cpp
@@ -23,246 +23,245 @@
 namespace aapt {
 
 TEST(StringPoolTest, InsertOneString) {
-    StringPool pool;
+  StringPool pool;
 
-    StringPool::Ref ref = pool.makeRef("wut");
-    EXPECT_EQ(*ref, "wut");
+  StringPool::Ref ref = pool.makeRef("wut");
+  EXPECT_EQ(*ref, "wut");
 }
 
 TEST(StringPoolTest, InsertTwoUniqueStrings) {
-    StringPool pool;
+  StringPool pool;
 
-    StringPool::Ref ref = pool.makeRef("wut");
-    StringPool::Ref ref2 = pool.makeRef("hey");
+  StringPool::Ref ref = pool.makeRef("wut");
+  StringPool::Ref ref2 = pool.makeRef("hey");
 
-    EXPECT_EQ(*ref, "wut");
-    EXPECT_EQ(*ref2, "hey");
+  EXPECT_EQ(*ref, "wut");
+  EXPECT_EQ(*ref2, "hey");
 }
 
 TEST(StringPoolTest, DoNotInsertNewDuplicateString) {
-    StringPool pool;
+  StringPool pool;
 
-    StringPool::Ref ref = pool.makeRef("wut");
-    StringPool::Ref ref2 = pool.makeRef("wut");
+  StringPool::Ref ref = pool.makeRef("wut");
+  StringPool::Ref ref2 = pool.makeRef("wut");
 
-    EXPECT_EQ(*ref, "wut");
-    EXPECT_EQ(*ref2, "wut");
-    EXPECT_EQ(1u, pool.size());
+  EXPECT_EQ(*ref, "wut");
+  EXPECT_EQ(*ref2, "wut");
+  EXPECT_EQ(1u, pool.size());
 }
 
 TEST(StringPoolTest, MaintainInsertionOrderIndex) {
-    StringPool pool;
+  StringPool pool;
 
-    StringPool::Ref ref = pool.makeRef("z");
-    StringPool::Ref ref2 = pool.makeRef("a");
-    StringPool::Ref ref3 = pool.makeRef("m");
+  StringPool::Ref ref = pool.makeRef("z");
+  StringPool::Ref ref2 = pool.makeRef("a");
+  StringPool::Ref ref3 = pool.makeRef("m");
 
-    EXPECT_EQ(0u, ref.getIndex());
-    EXPECT_EQ(1u, ref2.getIndex());
-    EXPECT_EQ(2u, ref3.getIndex());
+  EXPECT_EQ(0u, ref.getIndex());
+  EXPECT_EQ(1u, ref2.getIndex());
+  EXPECT_EQ(2u, ref3.getIndex());
 }
 
 TEST(StringPoolTest, PruneStringsWithNoReferences) {
-    StringPool pool;
+  StringPool pool;
 
-    StringPool::Ref refA = pool.makeRef("foo");
-    {
-        StringPool::Ref ref = pool.makeRef("wut");
-        EXPECT_EQ(*ref, "wut");
-        EXPECT_EQ(2u, pool.size());
-    }
-    StringPool::Ref refB = pool.makeRef("bar");
-
-    EXPECT_EQ(3u, pool.size());
-    pool.prune();
+  StringPool::Ref refA = pool.makeRef("foo");
+  {
+    StringPool::Ref ref = pool.makeRef("wut");
+    EXPECT_EQ(*ref, "wut");
     EXPECT_EQ(2u, pool.size());
-    StringPool::const_iterator iter = begin(pool);
-    EXPECT_EQ((*iter)->value, "foo");
-    EXPECT_LT((*iter)->index, 2u);
-    ++iter;
-    EXPECT_EQ((*iter)->value, "bar");
-    EXPECT_LT((*iter)->index, 2u);
+  }
+  StringPool::Ref refB = pool.makeRef("bar");
+
+  EXPECT_EQ(3u, pool.size());
+  pool.prune();
+  EXPECT_EQ(2u, pool.size());
+  StringPool::const_iterator iter = begin(pool);
+  EXPECT_EQ((*iter)->value, "foo");
+  EXPECT_LT((*iter)->index, 2u);
+  ++iter;
+  EXPECT_EQ((*iter)->value, "bar");
+  EXPECT_LT((*iter)->index, 2u);
 }
 
 TEST(StringPoolTest, SortAndMaintainIndexesInReferences) {
-    StringPool pool;
+  StringPool pool;
 
-    StringPool::Ref ref = pool.makeRef("z");
-    StringPool::StyleRef ref2 = pool.makeRef(StyleString{ {"a"} });
-    StringPool::Ref ref3 = pool.makeRef("m");
+  StringPool::Ref ref = pool.makeRef("z");
+  StringPool::StyleRef ref2 = pool.makeRef(StyleString{{"a"}});
+  StringPool::Ref ref3 = pool.makeRef("m");
 
-    EXPECT_EQ(*ref, "z");
-    EXPECT_EQ(0u, ref.getIndex());
+  EXPECT_EQ(*ref, "z");
+  EXPECT_EQ(0u, ref.getIndex());
 
-    EXPECT_EQ(*(ref2->str), "a");
-    EXPECT_EQ(1u, ref2.getIndex());
+  EXPECT_EQ(*(ref2->str), "a");
+  EXPECT_EQ(1u, ref2.getIndex());
 
-    EXPECT_EQ(*ref3, "m");
-    EXPECT_EQ(2u, ref3.getIndex());
+  EXPECT_EQ(*ref3, "m");
+  EXPECT_EQ(2u, ref3.getIndex());
 
-    pool.sort([](const StringPool::Entry& a, const StringPool::Entry& b) -> bool {
-        return a.value < b.value;
-    });
+  pool.sort([](const StringPool::Entry& a, const StringPool::Entry& b) -> bool {
+    return a.value < b.value;
+  });
 
+  EXPECT_EQ(*ref, "z");
+  EXPECT_EQ(2u, ref.getIndex());
 
-    EXPECT_EQ(*ref, "z");
-    EXPECT_EQ(2u, ref.getIndex());
+  EXPECT_EQ(*(ref2->str), "a");
+  EXPECT_EQ(0u, ref2.getIndex());
 
-    EXPECT_EQ(*(ref2->str), "a");
-    EXPECT_EQ(0u, ref2.getIndex());
-
-    EXPECT_EQ(*ref3, "m");
-    EXPECT_EQ(1u, ref3.getIndex());
+  EXPECT_EQ(*ref3, "m");
+  EXPECT_EQ(1u, ref3.getIndex());
 }
 
 TEST(StringPoolTest, SortAndStillDedupe) {
-    StringPool pool;
+  StringPool pool;
 
-    StringPool::Ref ref = pool.makeRef("z");
-    StringPool::Ref ref2 = pool.makeRef("a");
-    StringPool::Ref ref3 = pool.makeRef("m");
+  StringPool::Ref ref = pool.makeRef("z");
+  StringPool::Ref ref2 = pool.makeRef("a");
+  StringPool::Ref ref3 = pool.makeRef("m");
 
-    pool.sort([](const StringPool::Entry& a, const StringPool::Entry& b) -> bool {
-        return a.value < b.value;
-    });
+  pool.sort([](const StringPool::Entry& a, const StringPool::Entry& b) -> bool {
+    return a.value < b.value;
+  });
 
-    StringPool::Ref ref4 = pool.makeRef("z");
-    StringPool::Ref ref5 = pool.makeRef("a");
-    StringPool::Ref ref6 = pool.makeRef("m");
+  StringPool::Ref ref4 = pool.makeRef("z");
+  StringPool::Ref ref5 = pool.makeRef("a");
+  StringPool::Ref ref6 = pool.makeRef("m");
 
-    EXPECT_EQ(ref4.getIndex(), ref.getIndex());
-    EXPECT_EQ(ref5.getIndex(), ref2.getIndex());
-    EXPECT_EQ(ref6.getIndex(), ref3.getIndex());
+  EXPECT_EQ(ref4.getIndex(), ref.getIndex());
+  EXPECT_EQ(ref5.getIndex(), ref2.getIndex());
+  EXPECT_EQ(ref6.getIndex(), ref3.getIndex());
 }
 
 TEST(StringPoolTest, AddStyles) {
-    StringPool pool;
+  StringPool pool;
 
-    StyleString str {
-        { "android" },
-        {
-            Span{ { "b" }, 2, 6 }
-        }
-    };
+  StyleString str{{"android"}, {Span{{"b"}, 2, 6}}};
 
-    StringPool::StyleRef ref = pool.makeRef(str);
+  StringPool::StyleRef ref = pool.makeRef(str);
 
-    EXPECT_EQ(0u, ref.getIndex());
-    EXPECT_EQ(std::string("android"), *(ref->str));
-    ASSERT_EQ(1u, ref->spans.size());
+  EXPECT_EQ(0u, ref.getIndex());
+  EXPECT_EQ(std::string("android"), *(ref->str));
+  ASSERT_EQ(1u, ref->spans.size());
 
-    const StringPool::Span& span = ref->spans.front();
-    EXPECT_EQ(*(span.name), "b");
-    EXPECT_EQ(2u, span.firstChar);
-    EXPECT_EQ(6u, span.lastChar);
+  const StringPool::Span& span = ref->spans.front();
+  EXPECT_EQ(*(span.name), "b");
+  EXPECT_EQ(2u, span.firstChar);
+  EXPECT_EQ(6u, span.lastChar);
 }
 
 TEST(StringPoolTest, DoNotDedupeStyleWithSameStringAsNonStyle) {
-    StringPool pool;
+  StringPool pool;
 
-    StringPool::Ref ref = pool.makeRef("android");
+  StringPool::Ref ref = pool.makeRef("android");
 
-    StyleString str { { "android" } };
-    StringPool::StyleRef styleRef = pool.makeRef(str);
+  StyleString str{{"android"}};
+  StringPool::StyleRef styleRef = pool.makeRef(str);
 
-    EXPECT_NE(ref.getIndex(), styleRef.getIndex());
+  EXPECT_NE(ref.getIndex(), styleRef.getIndex());
 }
 
 TEST(StringPoolTest, FlattenEmptyStringPoolUtf8) {
-    using namespace android; // For NO_ERROR on Windows.
+  using namespace android;  // For NO_ERROR on Windows.
 
-    StringPool pool;
-    BigBuffer buffer(1024);
-    StringPool::flattenUtf8(&buffer, pool);
+  StringPool pool;
+  BigBuffer buffer(1024);
+  StringPool::flattenUtf8(&buffer, pool);
 
-    std::unique_ptr<uint8_t[]> data = util::copy(buffer);
-    ResStringPool test;
-    ASSERT_EQ(test.setTo(data.get(), buffer.size()), NO_ERROR);
+  std::unique_ptr<uint8_t[]> data = util::copy(buffer);
+  ResStringPool test;
+  ASSERT_EQ(test.setTo(data.get(), buffer.size()), NO_ERROR);
 }
 
 TEST(StringPoolTest, FlattenOddCharactersUtf16) {
-    using namespace android; // For NO_ERROR on Windows.
+  using namespace android;  // For NO_ERROR on Windows.
 
-    StringPool pool;
-    pool.makeRef("\u093f");
-    BigBuffer buffer(1024);
-    StringPool::flattenUtf16(&buffer, pool);
+  StringPool pool;
+  pool.makeRef("\u093f");
+  BigBuffer buffer(1024);
+  StringPool::flattenUtf16(&buffer, pool);
 
-    std::unique_ptr<uint8_t[]> data = util::copy(buffer);
-    ResStringPool test;
-    ASSERT_EQ(test.setTo(data.get(), buffer.size()), NO_ERROR);
-    size_t len = 0;
-    const char16_t* str = test.stringAt(0, &len);
-    EXPECT_EQ(1u, len);
-    EXPECT_EQ(u'\u093f', *str);
-    EXPECT_EQ(0u, str[1]);
+  std::unique_ptr<uint8_t[]> data = util::copy(buffer);
+  ResStringPool test;
+  ASSERT_EQ(test.setTo(data.get(), buffer.size()), NO_ERROR);
+  size_t len = 0;
+  const char16_t* str = test.stringAt(0, &len);
+  EXPECT_EQ(1u, len);
+  EXPECT_EQ(u'\u093f', *str);
+  EXPECT_EQ(0u, str[1]);
 }
 
-constexpr const char* sLongString = "バッテリーを長持ちさせるため、バッテリーセーバーは端末のパフォーマンスを抑え、バイブレーション、位置情報サービス、大半のバックグラウンドデータを制限します。メール、SMSや、同期を使 用するその他のアプリは、起動しても更新されないことがあります。バッテリーセーバーは端末の充電中は自動的にOFFになります。";
+constexpr const char* sLongString =
+    "バッテリーを長持ちさせるため、バッテリーセーバーは端末のパフォーマンスを抑"
+    "え、バイブレーション、位置情報サービス、大半のバックグラウンドデータを制限"
+    "します。メール、SMSや、同期を使 "
+    "用するその他のアプリは、起動しても更新されないことがあります。バッテリーセ"
+    "ーバーは端末の充電中は自動的にOFFになります。";
 
 TEST(StringPoolTest, Flatten) {
-    using namespace android; // For NO_ERROR on Windows.
+  using namespace android;  // For NO_ERROR on Windows.
 
-    StringPool pool;
+  StringPool pool;
 
-    StringPool::Ref ref1 = pool.makeRef("hello");
-    StringPool::Ref ref2 = pool.makeRef("goodbye");
-    StringPool::Ref ref3 = pool.makeRef(sLongString);
-    StringPool::Ref ref4 = pool.makeRef("");
-    StringPool::StyleRef ref5 = pool.makeRef(StyleString{
-            { "style" },
-            { Span{ { "b" }, 0, 1 }, Span{ { "i" }, 2, 3 } }
-    });
+  StringPool::Ref ref1 = pool.makeRef("hello");
+  StringPool::Ref ref2 = pool.makeRef("goodbye");
+  StringPool::Ref ref3 = pool.makeRef(sLongString);
+  StringPool::Ref ref4 = pool.makeRef("");
+  StringPool::StyleRef ref5 = pool.makeRef(
+      StyleString{{"style"}, {Span{{"b"}, 0, 1}, Span{{"i"}, 2, 3}}});
 
-    EXPECT_EQ(0u, ref1.getIndex());
-    EXPECT_EQ(1u, ref2.getIndex());
-    EXPECT_EQ(2u, ref3.getIndex());
-    EXPECT_EQ(3u, ref4.getIndex());
-    EXPECT_EQ(4u, ref5.getIndex());
+  EXPECT_EQ(0u, ref1.getIndex());
+  EXPECT_EQ(1u, ref2.getIndex());
+  EXPECT_EQ(2u, ref3.getIndex());
+  EXPECT_EQ(3u, ref4.getIndex());
+  EXPECT_EQ(4u, ref5.getIndex());
 
-    BigBuffer buffers[2] = { BigBuffer(1024), BigBuffer(1024) };
-    StringPool::flattenUtf8(&buffers[0], pool);
-    StringPool::flattenUtf16(&buffers[1], pool);
+  BigBuffer buffers[2] = {BigBuffer(1024), BigBuffer(1024)};
+  StringPool::flattenUtf8(&buffers[0], pool);
+  StringPool::flattenUtf16(&buffers[1], pool);
 
-    // Test both UTF-8 and UTF-16 buffers.
-    for (const BigBuffer& buffer : buffers) {
-        std::unique_ptr<uint8_t[]> data = util::copy(buffer);
+  // Test both UTF-8 and UTF-16 buffers.
+  for (const BigBuffer& buffer : buffers) {
+    std::unique_ptr<uint8_t[]> data = util::copy(buffer);
 
-        ResStringPool test;
-        ASSERT_EQ(test.setTo(data.get(), buffer.size()), NO_ERROR);
+    ResStringPool test;
+    ASSERT_EQ(test.setTo(data.get(), buffer.size()), NO_ERROR);
 
-        EXPECT_EQ(std::string("hello"), util::getString(test, 0));
-        EXPECT_EQ(StringPiece16(u"hello"), util::getString16(test, 0));
+    EXPECT_EQ(std::string("hello"), util::getString(test, 0));
+    EXPECT_EQ(StringPiece16(u"hello"), util::getString16(test, 0));
 
-        EXPECT_EQ(std::string("goodbye"), util::getString(test, 1));
-        EXPECT_EQ(StringPiece16(u"goodbye"), util::getString16(test, 1));
+    EXPECT_EQ(std::string("goodbye"), util::getString(test, 1));
+    EXPECT_EQ(StringPiece16(u"goodbye"), util::getString16(test, 1));
 
-        EXPECT_EQ(StringPiece(sLongString), util::getString(test, 2));
-        EXPECT_EQ(util::utf8ToUtf16(sLongString), util::getString16(test, 2).toString());
+    EXPECT_EQ(StringPiece(sLongString), util::getString(test, 2));
+    EXPECT_EQ(util::utf8ToUtf16(sLongString),
+              util::getString16(test, 2).toString());
 
-        size_t len;
-        EXPECT_TRUE(test.stringAt(3, &len) != nullptr || test.string8At(3, &len) != nullptr);
+    size_t len;
+    EXPECT_TRUE(test.stringAt(3, &len) != nullptr ||
+                test.string8At(3, &len) != nullptr);
 
-        EXPECT_EQ(std::string("style"), util::getString(test, 4));
-        EXPECT_EQ(StringPiece16(u"style"), util::getString16(test, 4));
+    EXPECT_EQ(std::string("style"), util::getString(test, 4));
+    EXPECT_EQ(StringPiece16(u"style"), util::getString16(test, 4));
 
-        const ResStringPool_span* span = test.styleAt(4);
-        ASSERT_NE(nullptr, span);
-        EXPECT_EQ(std::string("b"), util::getString(test, span->name.index));
-        EXPECT_EQ(StringPiece16(u"b"), util::getString16(test, span->name.index));
-        EXPECT_EQ(0u, span->firstChar);
-        EXPECT_EQ(1u, span->lastChar);
-        span++;
+    const ResStringPool_span* span = test.styleAt(4);
+    ASSERT_NE(nullptr, span);
+    EXPECT_EQ(std::string("b"), util::getString(test, span->name.index));
+    EXPECT_EQ(StringPiece16(u"b"), util::getString16(test, span->name.index));
+    EXPECT_EQ(0u, span->firstChar);
+    EXPECT_EQ(1u, span->lastChar);
+    span++;
 
-        ASSERT_NE(ResStringPool_span::END, span->name.index);
-        EXPECT_EQ(std::string("i"), util::getString(test, span->name.index));
-        EXPECT_EQ(StringPiece16(u"i"), util::getString16(test, span->name.index));
-        EXPECT_EQ(2u, span->firstChar);
-        EXPECT_EQ(3u, span->lastChar);
-        span++;
+    ASSERT_NE(ResStringPool_span::END, span->name.index);
+    EXPECT_EQ(std::string("i"), util::getString(test, span->name.index));
+    EXPECT_EQ(StringPiece16(u"i"), util::getString16(test, span->name.index));
+    EXPECT_EQ(2u, span->firstChar);
+    EXPECT_EQ(3u, span->lastChar);
+    span++;
 
-        EXPECT_EQ(ResStringPool_span::END, span->name.index);
-    }
+    EXPECT_EQ(ResStringPool_span::END, span->name.index);
+  }
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/ValueVisitor.h b/tools/aapt2/ValueVisitor.h
index 9dc6a9c..121c337 100644
--- a/tools/aapt2/ValueVisitor.h
+++ b/tools/aapt2/ValueVisitor.h
@@ -17,91 +17,94 @@
 #ifndef AAPT_VALUE_VISITOR_H
 #define AAPT_VALUE_VISITOR_H
 
-#include "ResourceValues.h"
 #include "ResourceTable.h"
+#include "ResourceValues.h"
 
 namespace aapt {
 
 /**
- * Visits a value and invokes the appropriate method based on its type. Does not traverse
+ * Visits a value and invokes the appropriate method based on its type. Does not
+ * traverse
  * into compound types. Use ValueVisitor for that.
  */
 struct RawValueVisitor {
-    virtual ~RawValueVisitor() = default;
+  virtual ~RawValueVisitor() = default;
 
-    virtual void visitItem(Item* value) {}
-    virtual void visit(Reference* value) { visitItem(value); }
-    virtual void visit(RawString* value) { visitItem(value); }
-    virtual void visit(String* value) { visitItem(value); }
-    virtual void visit(StyledString* value) { visitItem(value); }
-    virtual void visit(FileReference* value) { visitItem(value); }
-    virtual void visit(Id* value) { visitItem(value); }
-    virtual void visit(BinaryPrimitive* value) { visitItem(value); }
+  virtual void visitItem(Item* value) {}
+  virtual void visit(Reference* value) { visitItem(value); }
+  virtual void visit(RawString* value) { visitItem(value); }
+  virtual void visit(String* value) { visitItem(value); }
+  virtual void visit(StyledString* value) { visitItem(value); }
+  virtual void visit(FileReference* value) { visitItem(value); }
+  virtual void visit(Id* value) { visitItem(value); }
+  virtual void visit(BinaryPrimitive* value) { visitItem(value); }
 
-    virtual void visit(Attribute* value) {}
-    virtual void visit(Style* value) {}
-    virtual void visit(Array* value) {}
-    virtual void visit(Plural* value) {}
-    virtual void visit(Styleable* value) {}
+  virtual void visit(Attribute* value) {}
+  virtual void visit(Style* value) {}
+  virtual void visit(Array* value) {}
+  virtual void visit(Plural* value) {}
+  virtual void visit(Styleable* value) {}
 };
 
 // NOLINT, do not add parentheses around T.
-#define DECL_VISIT_COMPOUND_VALUE(T) \
-    virtual void visit(T* value) { /* NOLINT */ \
-        visitSubValues(value); \
-    }
+#define DECL_VISIT_COMPOUND_VALUE(T)          \
+  virtual void visit(T* value) { /* NOLINT */ \
+    visitSubValues(value);                    \
+  }
 
 /**
- * Visits values, and if they are compound values, visits the components as well.
+ * Visits values, and if they are compound values, visits the components as
+ * well.
  */
 struct ValueVisitor : public RawValueVisitor {
-    // The compiler will think we're hiding an overload, when we actually intend
-    // to call into RawValueVisitor. This will expose the visit methods in the super
-    // class so the compiler knows we are trying to call them.
-    using RawValueVisitor::visit;
+  // The compiler will think we're hiding an overload, when we actually intend
+  // to call into RawValueVisitor. This will expose the visit methods in the
+  // super
+  // class so the compiler knows we are trying to call them.
+  using RawValueVisitor::visit;
 
-    void visitSubValues(Attribute* attribute) {
-        for (Attribute::Symbol& symbol : attribute->symbols) {
-            visit(&symbol.symbol);
-        }
+  void visitSubValues(Attribute* attribute) {
+    for (Attribute::Symbol& symbol : attribute->symbols) {
+      visit(&symbol.symbol);
+    }
+  }
+
+  void visitSubValues(Style* style) {
+    if (style->parent) {
+      visit(&style->parent.value());
     }
 
-    void visitSubValues(Style* style) {
-        if (style->parent) {
-            visit(&style->parent.value());
-        }
-
-        for (Style::Entry& entry : style->entries) {
-            visit(&entry.key);
-            entry.value->accept(this);
-        }
+    for (Style::Entry& entry : style->entries) {
+      visit(&entry.key);
+      entry.value->accept(this);
     }
+  }
 
-    void visitSubValues(Array* array) {
-        for (std::unique_ptr<Item>& item : array->items) {
-            item->accept(this);
-        }
+  void visitSubValues(Array* array) {
+    for (std::unique_ptr<Item>& item : array->items) {
+      item->accept(this);
     }
+  }
 
-    void visitSubValues(Plural* plural) {
-        for (std::unique_ptr<Item>& item : plural->values) {
-            if (item) {
-                item->accept(this);
-            }
-        }
+  void visitSubValues(Plural* plural) {
+    for (std::unique_ptr<Item>& item : plural->values) {
+      if (item) {
+        item->accept(this);
+      }
     }
+  }
 
-    void visitSubValues(Styleable* styleable) {
-        for (Reference& reference : styleable->entries) {
-            visit(&reference);
-        }
+  void visitSubValues(Styleable* styleable) {
+    for (Reference& reference : styleable->entries) {
+      visit(&reference);
     }
+  }
 
-    DECL_VISIT_COMPOUND_VALUE(Attribute);
-    DECL_VISIT_COMPOUND_VALUE(Style);
-    DECL_VISIT_COMPOUND_VALUE(Array);
-    DECL_VISIT_COMPOUND_VALUE(Plural);
-    DECL_VISIT_COMPOUND_VALUE(Styleable);
+  DECL_VISIT_COMPOUND_VALUE(Attribute);
+  DECL_VISIT_COMPOUND_VALUE(Style);
+  DECL_VISIT_COMPOUND_VALUE(Array);
+  DECL_VISIT_COMPOUND_VALUE(Plural);
+  DECL_VISIT_COMPOUND_VALUE(Styleable);
 };
 
 /**
@@ -109,11 +112,9 @@
  */
 template <typename T>
 struct DynCastVisitor : public RawValueVisitor {
-    T* value = nullptr;
+  T* value = nullptr;
 
-    void visit(T* v) override {
-        value = v;
-    }
+  void visit(T* v) override { value = v; }
 };
 
 /**
@@ -121,16 +122,14 @@
  */
 template <>
 struct DynCastVisitor<Item> : public RawValueVisitor {
-    Item* value = nullptr;
+  Item* value = nullptr;
 
-    void visitItem(Item* item) override {
-        value = item;
-    }
+  void visitItem(Item* item) override { value = item; }
 };
 
 template <typename T>
 const T* valueCast(const Value* value) {
-    return valueCast<T>(const_cast<Value*>(value));
+  return valueCast<T>(const_cast<Value*>(value));
 }
 
 /**
@@ -139,30 +138,32 @@
  */
 template <typename T>
 T* valueCast(Value* value) {
-    if (!value) {
-        return nullptr;
-    }
-    DynCastVisitor<T> visitor;
-    value->accept(&visitor);
-    return visitor.value;
+  if (!value) {
+    return nullptr;
+  }
+  DynCastVisitor<T> visitor;
+  value->accept(&visitor);
+  return visitor.value;
 }
 
-inline void visitAllValuesInPackage(ResourceTablePackage* pkg, RawValueVisitor* visitor) {
-    for (auto& type : pkg->types) {
-        for (auto& entry : type->entries) {
-            for (auto& configValue : entry->values) {
-                configValue->value->accept(visitor);
-            }
-        }
+inline void visitAllValuesInPackage(ResourceTablePackage* pkg,
+                                    RawValueVisitor* visitor) {
+  for (auto& type : pkg->types) {
+    for (auto& entry : type->entries) {
+      for (auto& configValue : entry->values) {
+        configValue->value->accept(visitor);
+      }
     }
+  }
 }
 
-inline void visitAllValuesInTable(ResourceTable* table, RawValueVisitor* visitor) {
-    for (auto& pkg : table->packages) {
-        visitAllValuesInPackage(pkg.get(), visitor);
-    }
+inline void visitAllValuesInTable(ResourceTable* table,
+                                  RawValueVisitor* visitor) {
+  for (auto& pkg : table->packages) {
+    visitAllValuesInPackage(pkg.get(), visitor);
+  }
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_VALUE_VISITOR_H
+#endif  // AAPT_VALUE_VISITOR_H
diff --git a/tools/aapt2/ValueVisitor_test.cpp b/tools/aapt2/ValueVisitor_test.cpp
index 54e9fcd..ed9c7f6 100644
--- a/tools/aapt2/ValueVisitor_test.cpp
+++ b/tools/aapt2/ValueVisitor_test.cpp
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-#include "ResourceValues.h"
 #include "ValueVisitor.h"
+#include "ResourceValues.h"
 #include "test/Test.h"
 #include "util/Util.h"
 
@@ -24,63 +24,63 @@
 namespace aapt {
 
 struct SingleReferenceVisitor : public ValueVisitor {
-    using ValueVisitor::visit;
+  using ValueVisitor::visit;
 
-    Reference* visited = nullptr;
+  Reference* visited = nullptr;
 
-    void visit(Reference* ref) override {
-        visited = ref;
-    }
+  void visit(Reference* ref) override { visited = ref; }
 };
 
 struct StyleVisitor : public ValueVisitor {
-    using ValueVisitor::visit;
+  using ValueVisitor::visit;
 
-    std::list<Reference*> visitedRefs;
-    Style* visitedStyle = nullptr;
+  std::list<Reference*> visitedRefs;
+  Style* visitedStyle = nullptr;
 
-    void visit(Reference* ref) override {
-        visitedRefs.push_back(ref);
-    }
+  void visit(Reference* ref) override { visitedRefs.push_back(ref); }
 
-    void visit(Style* style) override {
-        visitedStyle = style;
-        ValueVisitor::visit(style);
-    }
+  void visit(Style* style) override {
+    visitedStyle = style;
+    ValueVisitor::visit(style);
+  }
 };
 
 TEST(ValueVisitorTest, VisitsReference) {
-    Reference ref(ResourceName{"android", ResourceType::kAttr, "foo"});
-    SingleReferenceVisitor visitor;
-    ref.accept(&visitor);
+  Reference ref(ResourceName{"android", ResourceType::kAttr, "foo"});
+  SingleReferenceVisitor visitor;
+  ref.accept(&visitor);
 
-    EXPECT_EQ(visitor.visited, &ref);
+  EXPECT_EQ(visitor.visited, &ref);
 }
 
 TEST(ValueVisitorTest, VisitsReferencesInStyle) {
-    std::unique_ptr<Style> style = test::StyleBuilder()
-            .setParent("android:style/foo")
-            .addItem("android:attr/one", test::buildReference("android:id/foo"))
-            .build();
+  std::unique_ptr<Style> style =
+      test::StyleBuilder()
+          .setParent("android:style/foo")
+          .addItem("android:attr/one", test::buildReference("android:id/foo"))
+          .build();
 
-    StyleVisitor visitor;
-    style->accept(&visitor);
+  StyleVisitor visitor;
+  style->accept(&visitor);
 
-    ASSERT_EQ(style.get(), visitor.visitedStyle);
+  ASSERT_EQ(style.get(), visitor.visitedStyle);
 
-    // Entry attribute references, plus the parent reference, plus one value reference.
-    ASSERT_EQ(style->entries.size() + 2, visitor.visitedRefs.size());
+  // Entry attribute references, plus the parent reference, plus one value
+  // reference.
+  ASSERT_EQ(style->entries.size() + 2, visitor.visitedRefs.size());
 }
 
 TEST(ValueVisitorTest, ValueCast) {
-    std::unique_ptr<Reference> ref = test::buildReference("android:color/white");
-    EXPECT_NE(valueCast<Reference>(ref.get()), nullptr);
+  std::unique_ptr<Reference> ref = test::buildReference("android:color/white");
+  EXPECT_NE(valueCast<Reference>(ref.get()), nullptr);
 
-    std::unique_ptr<Style> style = test::StyleBuilder()
-            .addItem("android:attr/foo", test::buildReference("android:color/black"))
-            .build();
-    EXPECT_NE(valueCast<Style>(style.get()), nullptr);
-    EXPECT_EQ(valueCast<Reference>(style.get()), nullptr);
+  std::unique_ptr<Style> style =
+      test::StyleBuilder()
+          .addItem("android:attr/foo",
+                   test::buildReference("android:color/black"))
+          .build();
+  EXPECT_NE(valueCast<Style>(style.get()), nullptr);
+  EXPECT_EQ(valueCast<Reference>(style.get()), nullptr);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/Compile.cpp b/tools/aapt2/compile/Compile.cpp
index dbd8062..d001228 100644
--- a/tools/aapt2/compile/Compile.cpp
+++ b/tools/aapt2/compile/Compile.cpp
@@ -33,8 +33,8 @@
 #include "xml/XmlDom.h"
 #include "xml/XmlPullParser.h"
 
-#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
 #include <google/protobuf/io/coded_stream.h>
+#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
 
 #include <android-base/errors.h>
 #include <android-base/file.h>
@@ -48,16 +48,18 @@
 namespace aapt {
 
 struct ResourcePathData {
-    Source source;
-    std::string resourceDir;
-    std::string name;
-    std::string extension;
+  Source source;
+  std::string resourceDir;
+  std::string name;
+  std::string extension;
 
-    // Original config str. We keep this because when we parse the config, we may add on
-    // version qualifiers. We want to preserve the original input so the output is easily
-    // computed before hand.
-    std::string configStr;
-    ConfigDescription config;
+  // Original config str. We keep this because when we parse the config, we may
+  // add on
+  // version qualifiers. We want to preserve the original input so the output is
+  // easily
+  // computed before hand.
+  std::string configStr;
+  ConfigDescription config;
 };
 
 /**
@@ -66,696 +68,735 @@
  */
 static Maybe<ResourcePathData> extractResourcePathData(const std::string& path,
                                                        std::string* outError) {
-    std::vector<std::string> parts = util::split(path, file::sDirSep);
-    if (parts.size() < 2) {
-        if (outError) *outError = "bad resource path";
-        return {};
+  std::vector<std::string> parts = util::split(path, file::sDirSep);
+  if (parts.size() < 2) {
+    if (outError) *outError = "bad resource path";
+    return {};
+  }
+
+  std::string& dir = parts[parts.size() - 2];
+  StringPiece dirStr = dir;
+
+  StringPiece configStr;
+  ConfigDescription config;
+  size_t dashPos = dir.find('-');
+  if (dashPos != std::string::npos) {
+    configStr = dirStr.substr(dashPos + 1, dir.size() - (dashPos + 1));
+    if (!ConfigDescription::parse(configStr, &config)) {
+      if (outError) {
+        std::stringstream errStr;
+        errStr << "invalid configuration '" << configStr << "'";
+        *outError = errStr.str();
+      }
+      return {};
     }
+    dirStr = dirStr.substr(0, dashPos);
+  }
 
-    std::string& dir = parts[parts.size() - 2];
-    StringPiece dirStr = dir;
+  std::string& filename = parts[parts.size() - 1];
+  StringPiece name = filename;
+  StringPiece extension;
+  size_t dotPos = filename.find('.');
+  if (dotPos != std::string::npos) {
+    extension = name.substr(dotPos + 1, filename.size() - (dotPos + 1));
+    name = name.substr(0, dotPos);
+  }
 
-    StringPiece configStr;
-    ConfigDescription config;
-    size_t dashPos = dir.find('-');
-    if (dashPos != std::string::npos) {
-        configStr = dirStr.substr(dashPos + 1, dir.size() - (dashPos + 1));
-        if (!ConfigDescription::parse(configStr, &config)) {
-            if (outError) {
-                std::stringstream errStr;
-                errStr << "invalid configuration '" << configStr << "'";
-                *outError = errStr.str();
-            }
-            return {};
-        }
-        dirStr = dirStr.substr(0, dashPos);
-    }
-
-    std::string& filename = parts[parts.size() - 1];
-    StringPiece name = filename;
-    StringPiece extension;
-    size_t dotPos = filename.find('.');
-    if (dotPos != std::string::npos) {
-        extension = name.substr(dotPos + 1, filename.size() - (dotPos + 1));
-        name = name.substr(0, dotPos);
-    }
-
-    return ResourcePathData{
-            Source(path),
-            dirStr.toString(),
-            name.toString(),
-            extension.toString(),
-            configStr.toString(),
-            config
-    };
+  return ResourcePathData{Source(path),         dirStr.toString(),
+                          name.toString(),      extension.toString(),
+                          configStr.toString(), config};
 }
 
 struct CompileOptions {
-    std::string outputPath;
-    Maybe<std::string> resDir;
-    bool pseudolocalize = false;
-    bool legacyMode = false;
-    bool verbose = false;
+  std::string outputPath;
+  Maybe<std::string> resDir;
+  bool pseudolocalize = false;
+  bool legacyMode = false;
+  bool verbose = false;
 };
 
 static std::string buildIntermediateFilename(const ResourcePathData& data) {
-    std::stringstream name;
-    name << data.resourceDir;
-    if (!data.configStr.empty()) {
-        name << "-" << data.configStr;
-    }
-    name << "_" << data.name;
-    if (!data.extension.empty()) {
-        name << "." << data.extension;
-    }
-    name << ".flat";
-    return name.str();
+  std::stringstream name;
+  name << data.resourceDir;
+  if (!data.configStr.empty()) {
+    name << "-" << data.configStr;
+  }
+  name << "_" << data.name;
+  if (!data.extension.empty()) {
+    name << "." << data.extension;
+  }
+  name << ".flat";
+  return name.str();
 }
 
 static bool isHidden(const StringPiece& filename) {
-    return util::stringStartsWith(filename, ".");
+  return util::stringStartsWith(filename, ".");
 }
 
 /**
  * Walks the res directory structure, looking for resource files.
  */
-static bool loadInputFilesFromDir(IAaptContext* context, const CompileOptions& options,
+static bool loadInputFilesFromDir(IAaptContext* context,
+                                  const CompileOptions& options,
                                   std::vector<ResourcePathData>* outPathData) {
-    const std::string& rootDir = options.resDir.value();
-    std::unique_ptr<DIR, decltype(closedir)*> d(opendir(rootDir.data()), closedir);
-    if (!d) {
-        context->getDiagnostics()->error(DiagMessage() << strerror(errno));
+  const std::string& rootDir = options.resDir.value();
+  std::unique_ptr<DIR, decltype(closedir)*> d(opendir(rootDir.data()),
+                                              closedir);
+  if (!d) {
+    context->getDiagnostics()->error(DiagMessage() << strerror(errno));
+    return false;
+  }
+
+  while (struct dirent* entry = readdir(d.get())) {
+    if (isHidden(entry->d_name)) {
+      continue;
+    }
+
+    std::string prefixPath = rootDir;
+    file::appendPath(&prefixPath, entry->d_name);
+
+    if (file::getFileType(prefixPath) != file::FileType::kDirectory) {
+      continue;
+    }
+
+    std::unique_ptr<DIR, decltype(closedir)*> subDir(opendir(prefixPath.data()),
+                                                     closedir);
+    if (!subDir) {
+      context->getDiagnostics()->error(DiagMessage() << strerror(errno));
+      return false;
+    }
+
+    while (struct dirent* leafEntry = readdir(subDir.get())) {
+      if (isHidden(leafEntry->d_name)) {
+        continue;
+      }
+
+      std::string fullPath = prefixPath;
+      file::appendPath(&fullPath, leafEntry->d_name);
+
+      std::string errStr;
+      Maybe<ResourcePathData> pathData =
+          extractResourcePathData(fullPath, &errStr);
+      if (!pathData) {
+        context->getDiagnostics()->error(DiagMessage() << errStr);
         return false;
+      }
+
+      outPathData->push_back(std::move(pathData.value()));
     }
-
-    while (struct dirent* entry = readdir(d.get())) {
-        if (isHidden(entry->d_name)) {
-            continue;
-        }
-
-        std::string prefixPath = rootDir;
-        file::appendPath(&prefixPath, entry->d_name);
-
-        if (file::getFileType(prefixPath) != file::FileType::kDirectory) {
-            continue;
-        }
-
-        std::unique_ptr<DIR, decltype(closedir)*> subDir(opendir(prefixPath.data()), closedir);
-        if (!subDir) {
-            context->getDiagnostics()->error(DiagMessage() << strerror(errno));
-            return false;
-        }
-
-        while (struct dirent* leafEntry = readdir(subDir.get())) {
-            if (isHidden(leafEntry->d_name)) {
-                continue;
-            }
-
-            std::string fullPath = prefixPath;
-            file::appendPath(&fullPath, leafEntry->d_name);
-
-            std::string errStr;
-            Maybe<ResourcePathData> pathData = extractResourcePathData(fullPath, &errStr);
-            if (!pathData) {
-                context->getDiagnostics()->error(DiagMessage() << errStr);
-                return false;
-            }
-
-            outPathData->push_back(std::move(pathData.value()));
-        }
-    }
-    return true;
+  }
+  return true;
 }
 
 static bool compileTable(IAaptContext* context, const CompileOptions& options,
-                         const ResourcePathData& pathData, IArchiveWriter* writer,
+                         const ResourcePathData& pathData,
+                         IArchiveWriter* writer,
                          const std::string& outputPath) {
-    ResourceTable table;
-    {
-        std::ifstream fin(pathData.source.path, std::ifstream::binary);
-        if (!fin) {
-            context->getDiagnostics()->error(DiagMessage(pathData.source) << strerror(errno));
-            return false;
-        }
-
-
-        // Parse the values file from XML.
-        xml::XmlPullParser xmlParser(fin);
-
-        ResourceParserOptions parserOptions;
-        parserOptions.errorOnPositionalArguments = !options.legacyMode;
-
-        // If the filename includes donottranslate, then the default translatable is false.
-        parserOptions.translatable = pathData.name.find("donottranslate") == std::string::npos;
-
-        ResourceParser resParser(context->getDiagnostics(), &table, pathData.source,
-                                 pathData.config, parserOptions);
-        if (!resParser.parse(&xmlParser)) {
-            return false;
-        }
-
-        fin.close();
+  ResourceTable table;
+  {
+    std::ifstream fin(pathData.source.path, std::ifstream::binary);
+    if (!fin) {
+      context->getDiagnostics()->error(DiagMessage(pathData.source)
+                                       << strerror(errno));
+      return false;
     }
 
-    if (options.pseudolocalize) {
-        // Generate pseudo-localized strings (en-XA and ar-XB).
-        // These are created as weak symbols, and are only generated from default configuration
-        // strings and plurals.
-        PseudolocaleGenerator pseudolocaleGenerator;
-        if (!pseudolocaleGenerator.consume(context, &table)) {
-            return false;
-        }
+    // Parse the values file from XML.
+    xml::XmlPullParser xmlParser(fin);
+
+    ResourceParserOptions parserOptions;
+    parserOptions.errorOnPositionalArguments = !options.legacyMode;
+
+    // If the filename includes donottranslate, then the default translatable is
+    // false.
+    parserOptions.translatable =
+        pathData.name.find("donottranslate") == std::string::npos;
+
+    ResourceParser resParser(context->getDiagnostics(), &table, pathData.source,
+                             pathData.config, parserOptions);
+    if (!resParser.parse(&xmlParser)) {
+      return false;
     }
 
-    // Ensure we have the compilation package at least.
-    table.createPackage(context->getCompilationPackage());
+    fin.close();
+  }
 
-    // Assign an ID to any package that has resources.
-    for (auto& pkg : table.packages) {
-        if (!pkg->id) {
-            // If no package ID was set while parsing (public identifiers), auto assign an ID.
-            pkg->id = context->getPackageId();
-        }
+  if (options.pseudolocalize) {
+    // Generate pseudo-localized strings (en-XA and ar-XB).
+    // These are created as weak symbols, and are only generated from default
+    // configuration
+    // strings and plurals.
+    PseudolocaleGenerator pseudolocaleGenerator;
+    if (!pseudolocaleGenerator.consume(context, &table)) {
+      return false;
     }
+  }
 
-    // Create the file/zip entry.
-    if (!writer->startEntry(outputPath, 0)) {
-        context->getDiagnostics()->error(DiagMessage(outputPath) << "failed to open");
-        return false;
+  // Ensure we have the compilation package at least.
+  table.createPackage(context->getCompilationPackage());
+
+  // Assign an ID to any package that has resources.
+  for (auto& pkg : table.packages) {
+    if (!pkg->id) {
+      // If no package ID was set while parsing (public identifiers), auto
+      // assign an ID.
+      pkg->id = context->getPackageId();
     }
+  }
 
-    // Make sure CopyingOutputStreamAdaptor is deleted before we call writer->finishEntry().
-    {
-        // Wrap our IArchiveWriter with an adaptor that implements the ZeroCopyOutputStream
-        // interface.
-        CopyingOutputStreamAdaptor copyingAdaptor(writer);
+  // Create the file/zip entry.
+  if (!writer->startEntry(outputPath, 0)) {
+    context->getDiagnostics()->error(DiagMessage(outputPath)
+                                     << "failed to open");
+    return false;
+  }
 
-        std::unique_ptr<pb::ResourceTable> pbTable = serializeTableToPb(&table);
-        if (!pbTable->SerializeToZeroCopyStream(&copyingAdaptor)) {
-            context->getDiagnostics()->error(DiagMessage(outputPath) << "failed to write");
-            return false;
-        }
+  // Make sure CopyingOutputStreamAdaptor is deleted before we call
+  // writer->finishEntry().
+  {
+    // Wrap our IArchiveWriter with an adaptor that implements the
+    // ZeroCopyOutputStream
+    // interface.
+    CopyingOutputStreamAdaptor copyingAdaptor(writer);
+
+    std::unique_ptr<pb::ResourceTable> pbTable = serializeTableToPb(&table);
+    if (!pbTable->SerializeToZeroCopyStream(&copyingAdaptor)) {
+      context->getDiagnostics()->error(DiagMessage(outputPath)
+                                       << "failed to write");
+      return false;
     }
+  }
 
-    if (!writer->finishEntry()) {
-        context->getDiagnostics()->error(DiagMessage(outputPath) << "failed to finish entry");
-        return false;
-    }
-    return true;
+  if (!writer->finishEntry()) {
+    context->getDiagnostics()->error(DiagMessage(outputPath)
+                                     << "failed to finish entry");
+    return false;
+  }
+  return true;
 }
 
-static bool writeHeaderAndBufferToWriter(const StringPiece& outputPath, const ResourceFile& file,
-                                         const BigBuffer& buffer, IArchiveWriter* writer,
+static bool writeHeaderAndBufferToWriter(const StringPiece& outputPath,
+                                         const ResourceFile& file,
+                                         const BigBuffer& buffer,
+                                         IArchiveWriter* writer,
                                          IDiagnostics* diag) {
-    // Start the entry so we can write the header.
-    if (!writer->startEntry(outputPath, 0)) {
-        diag->error(DiagMessage(outputPath) << "failed to open file");
-        return false;
+  // Start the entry so we can write the header.
+  if (!writer->startEntry(outputPath, 0)) {
+    diag->error(DiagMessage(outputPath) << "failed to open file");
+    return false;
+  }
+
+  // Make sure CopyingOutputStreamAdaptor is deleted before we call
+  // writer->finishEntry().
+  {
+    // Wrap our IArchiveWriter with an adaptor that implements the
+    // ZeroCopyOutputStream
+    // interface.
+    CopyingOutputStreamAdaptor copyingAdaptor(writer);
+    CompiledFileOutputStream outputStream(&copyingAdaptor);
+
+    // Number of CompiledFiles.
+    outputStream.WriteLittleEndian32(1);
+
+    std::unique_ptr<pb::CompiledFile> compiledFile =
+        serializeCompiledFileToPb(file);
+    outputStream.WriteCompiledFile(compiledFile.get());
+    outputStream.WriteData(&buffer);
+
+    if (outputStream.HadError()) {
+      diag->error(DiagMessage(outputPath) << "failed to write data");
+      return false;
     }
+  }
 
-    // Make sure CopyingOutputStreamAdaptor is deleted before we call writer->finishEntry().
-    {
-        // Wrap our IArchiveWriter with an adaptor that implements the ZeroCopyOutputStream
-        // interface.
-        CopyingOutputStreamAdaptor copyingAdaptor(writer);
-        CompiledFileOutputStream outputStream(&copyingAdaptor);
-
-        // Number of CompiledFiles.
-        outputStream.WriteLittleEndian32(1);
-
-        std::unique_ptr<pb::CompiledFile> compiledFile = serializeCompiledFileToPb(file);
-        outputStream.WriteCompiledFile(compiledFile.get());
-        outputStream.WriteData(&buffer);
-
-        if (outputStream.HadError()) {
-            diag->error(DiagMessage(outputPath) << "failed to write data");
-            return false;
-        }
-    }
-
-    if (!writer->finishEntry()) {
-        diag->error(DiagMessage(outputPath) << "failed to finish writing data");
-        return false;
-    }
-    return true;
+  if (!writer->finishEntry()) {
+    diag->error(DiagMessage(outputPath) << "failed to finish writing data");
+    return false;
+  }
+  return true;
 }
 
-static bool writeHeaderAndMmapToWriter(const StringPiece& outputPath, const ResourceFile& file,
-                                       const android::FileMap& map, IArchiveWriter* writer,
+static bool writeHeaderAndMmapToWriter(const StringPiece& outputPath,
+                                       const ResourceFile& file,
+                                       const android::FileMap& map,
+                                       IArchiveWriter* writer,
                                        IDiagnostics* diag) {
-    // Start the entry so we can write the header.
-    if (!writer->startEntry(outputPath, 0)) {
-        diag->error(DiagMessage(outputPath) << "failed to open file");
-        return false;
+  // Start the entry so we can write the header.
+  if (!writer->startEntry(outputPath, 0)) {
+    diag->error(DiagMessage(outputPath) << "failed to open file");
+    return false;
+  }
+
+  // Make sure CopyingOutputStreamAdaptor is deleted before we call
+  // writer->finishEntry().
+  {
+    // Wrap our IArchiveWriter with an adaptor that implements the
+    // ZeroCopyOutputStream
+    // interface.
+    CopyingOutputStreamAdaptor copyingAdaptor(writer);
+    CompiledFileOutputStream outputStream(&copyingAdaptor);
+
+    // Number of CompiledFiles.
+    outputStream.WriteLittleEndian32(1);
+
+    std::unique_ptr<pb::CompiledFile> compiledFile =
+        serializeCompiledFileToPb(file);
+    outputStream.WriteCompiledFile(compiledFile.get());
+    outputStream.WriteData(map.getDataPtr(), map.getDataLength());
+
+    if (outputStream.HadError()) {
+      diag->error(DiagMessage(outputPath) << "failed to write data");
+      return false;
     }
+  }
 
-    // Make sure CopyingOutputStreamAdaptor is deleted before we call writer->finishEntry().
-    {
-        // Wrap our IArchiveWriter with an adaptor that implements the ZeroCopyOutputStream
-        // interface.
-        CopyingOutputStreamAdaptor copyingAdaptor(writer);
-        CompiledFileOutputStream outputStream(&copyingAdaptor);
-
-        // Number of CompiledFiles.
-        outputStream.WriteLittleEndian32(1);
-
-        std::unique_ptr<pb::CompiledFile> compiledFile = serializeCompiledFileToPb(file);
-        outputStream.WriteCompiledFile(compiledFile.get());
-        outputStream.WriteData(map.getDataPtr(), map.getDataLength());
-
-        if (outputStream.HadError()) {
-            diag->error(DiagMessage(outputPath) << "failed to write data");
-            return false;
-        }
-    }
-
-    if (!writer->finishEntry()) {
-        diag->error(DiagMessage(outputPath) << "failed to finish writing data");
-        return false;
-    }
-    return true;
+  if (!writer->finishEntry()) {
+    diag->error(DiagMessage(outputPath) << "failed to finish writing data");
+    return false;
+  }
+  return true;
 }
 
-static bool flattenXmlToOutStream(IAaptContext* context, const StringPiece& outputPath,
+static bool flattenXmlToOutStream(IAaptContext* context,
+                                  const StringPiece& outputPath,
                                   xml::XmlResource* xmlRes,
                                   CompiledFileOutputStream* out) {
-    BigBuffer buffer(1024);
-    XmlFlattenerOptions xmlFlattenerOptions;
-    xmlFlattenerOptions.keepRawValues = true;
-    XmlFlattener flattener(&buffer, xmlFlattenerOptions);
-    if (!flattener.consume(context, xmlRes)) {
-        return false;
-    }
+  BigBuffer buffer(1024);
+  XmlFlattenerOptions xmlFlattenerOptions;
+  xmlFlattenerOptions.keepRawValues = true;
+  XmlFlattener flattener(&buffer, xmlFlattenerOptions);
+  if (!flattener.consume(context, xmlRes)) {
+    return false;
+  }
 
-    std::unique_ptr<pb::CompiledFile> pbCompiledFile = serializeCompiledFileToPb(xmlRes->file);
-    out->WriteCompiledFile(pbCompiledFile.get());
-    out->WriteData(&buffer);
+  std::unique_ptr<pb::CompiledFile> pbCompiledFile =
+      serializeCompiledFileToPb(xmlRes->file);
+  out->WriteCompiledFile(pbCompiledFile.get());
+  out->WriteData(&buffer);
 
-    if (out->HadError()) {
-        context->getDiagnostics()->error(DiagMessage(outputPath) << "failed to write data");
-        return false;
-    }
-    return true;
+  if (out->HadError()) {
+    context->getDiagnostics()->error(DiagMessage(outputPath)
+                                     << "failed to write data");
+    return false;
+  }
+  return true;
 }
 
 static bool compileXml(IAaptContext* context, const CompileOptions& options,
                        const ResourcePathData& pathData, IArchiveWriter* writer,
                        const std::string& outputPath) {
-    if (context->verbose()) {
-        context->getDiagnostics()->note(DiagMessage(pathData.source) << "compiling XML");
+  if (context->verbose()) {
+    context->getDiagnostics()->note(DiagMessage(pathData.source)
+                                    << "compiling XML");
+  }
+
+  std::unique_ptr<xml::XmlResource> xmlRes;
+  {
+    std::ifstream fin(pathData.source.path, std::ifstream::binary);
+    if (!fin) {
+      context->getDiagnostics()->error(DiagMessage(pathData.source)
+                                       << strerror(errno));
+      return false;
     }
 
-    std::unique_ptr<xml::XmlResource> xmlRes;
-    {
-        std::ifstream fin(pathData.source.path, std::ifstream::binary);
-        if (!fin) {
-            context->getDiagnostics()->error(DiagMessage(pathData.source) << strerror(errno));
-            return false;
-        }
+    xmlRes = xml::inflate(&fin, context->getDiagnostics(), pathData.source);
 
-        xmlRes = xml::inflate(&fin, context->getDiagnostics(), pathData.source);
+    fin.close();
+  }
 
-        fin.close();
+  if (!xmlRes) {
+    return false;
+  }
+
+  xmlRes->file.name =
+      ResourceName({}, *parseResourceType(pathData.resourceDir), pathData.name);
+  xmlRes->file.config = pathData.config;
+  xmlRes->file.source = pathData.source;
+
+  // Collect IDs that are defined here.
+  XmlIdCollector collector;
+  if (!collector.consume(context, xmlRes.get())) {
+    return false;
+  }
+
+  // Look for and process any <aapt:attr> tags and create sub-documents.
+  InlineXmlFormatParser inlineXmlFormatParser;
+  if (!inlineXmlFormatParser.consume(context, xmlRes.get())) {
+    return false;
+  }
+
+  // Start the entry so we can write the header.
+  if (!writer->startEntry(outputPath, 0)) {
+    context->getDiagnostics()->error(DiagMessage(outputPath)
+                                     << "failed to open file");
+    return false;
+  }
+
+  // Make sure CopyingOutputStreamAdaptor is deleted before we call
+  // writer->finishEntry().
+  {
+    // Wrap our IArchiveWriter with an adaptor that implements the
+    // ZeroCopyOutputStream
+    // interface.
+    CopyingOutputStreamAdaptor copyingAdaptor(writer);
+    CompiledFileOutputStream outputStream(&copyingAdaptor);
+
+    std::vector<std::unique_ptr<xml::XmlResource>>& inlineDocuments =
+        inlineXmlFormatParser.getExtractedInlineXmlDocuments();
+
+    // Number of CompiledFiles.
+    outputStream.WriteLittleEndian32(1 + inlineDocuments.size());
+
+    if (!flattenXmlToOutStream(context, outputPath, xmlRes.get(),
+                               &outputStream)) {
+      return false;
     }
 
-    if (!xmlRes) {
+    for (auto& inlineXmlDoc : inlineDocuments) {
+      if (!flattenXmlToOutStream(context, outputPath, inlineXmlDoc.get(),
+                                 &outputStream)) {
         return false;
+      }
     }
+  }
 
-    xmlRes->file.name = ResourceName({}, *parseResourceType(pathData.resourceDir), pathData.name);
-    xmlRes->file.config = pathData.config;
-    xmlRes->file.source = pathData.source;
-
-    // Collect IDs that are defined here.
-    XmlIdCollector collector;
-    if (!collector.consume(context, xmlRes.get())) {
-        return false;
-    }
-
-    // Look for and process any <aapt:attr> tags and create sub-documents.
-    InlineXmlFormatParser inlineXmlFormatParser;
-    if (!inlineXmlFormatParser.consume(context, xmlRes.get())) {
-        return false;
-    }
-
-    // Start the entry so we can write the header.
-    if (!writer->startEntry(outputPath, 0)) {
-        context->getDiagnostics()->error(DiagMessage(outputPath) << "failed to open file");
-        return false;
-    }
-
-    // Make sure CopyingOutputStreamAdaptor is deleted before we call writer->finishEntry().
-    {
-        // Wrap our IArchiveWriter with an adaptor that implements the ZeroCopyOutputStream
-        // interface.
-        CopyingOutputStreamAdaptor copyingAdaptor(writer);
-        CompiledFileOutputStream outputStream(&copyingAdaptor);
-
-        std::vector<std::unique_ptr<xml::XmlResource>>& inlineDocuments =
-                inlineXmlFormatParser.getExtractedInlineXmlDocuments();
-
-        // Number of CompiledFiles.
-        outputStream.WriteLittleEndian32(1 + inlineDocuments.size());
-
-        if (!flattenXmlToOutStream(context, outputPath, xmlRes.get(), &outputStream)) {
-            return false;
-        }
-
-        for (auto& inlineXmlDoc : inlineDocuments) {
-            if (!flattenXmlToOutStream(context, outputPath, inlineXmlDoc.get(), &outputStream)) {
-                return false;
-            }
-        }
-    }
-
-    if (!writer->finishEntry()) {
-        context->getDiagnostics()->error(DiagMessage(outputPath)
-                                         << "failed to finish writing data");
-        return false;
-    }
-    return true;
+  if (!writer->finishEntry()) {
+    context->getDiagnostics()->error(DiagMessage(outputPath)
+                                     << "failed to finish writing data");
+    return false;
+  }
+  return true;
 }
 
 class BigBufferOutputStream : public io::OutputStream {
-public:
-    explicit BigBufferOutputStream(BigBuffer* buffer) : mBuffer(buffer) {
-    }
+ public:
+  explicit BigBufferOutputStream(BigBuffer* buffer) : mBuffer(buffer) {}
 
-    bool Next(void** data, int* len) override {
-        size_t count;
-        *data = mBuffer->nextBlock(&count);
-        *len = static_cast<int>(count);
-        return true;
-    }
+  bool Next(void** data, int* len) override {
+    size_t count;
+    *data = mBuffer->nextBlock(&count);
+    *len = static_cast<int>(count);
+    return true;
+  }
 
-    void BackUp(int count) override {
-        mBuffer->backUp(count);
-    }
+  void BackUp(int count) override { mBuffer->backUp(count); }
 
-    int64_t ByteCount() const override {
-        return mBuffer->size();
-    }
+  int64_t ByteCount() const override { return mBuffer->size(); }
 
-    bool HadError() const override {
-        return false;
-    }
+  bool HadError() const override { return false; }
 
-private:
-    BigBuffer* mBuffer;
+ private:
+  BigBuffer* mBuffer;
 
-    DISALLOW_COPY_AND_ASSIGN(BigBufferOutputStream);
+  DISALLOW_COPY_AND_ASSIGN(BigBufferOutputStream);
 };
 
 static bool compilePng(IAaptContext* context, const CompileOptions& options,
                        const ResourcePathData& pathData, IArchiveWriter* writer,
                        const std::string& outputPath) {
-    if (context->verbose()) {
-        context->getDiagnostics()->note(DiagMessage(pathData.source) << "compiling PNG");
+  if (context->verbose()) {
+    context->getDiagnostics()->note(DiagMessage(pathData.source)
+                                    << "compiling PNG");
+  }
+
+  BigBuffer buffer(4096);
+  ResourceFile resFile;
+  resFile.name =
+      ResourceName({}, *parseResourceType(pathData.resourceDir), pathData.name);
+  resFile.config = pathData.config;
+  resFile.source = pathData.source;
+
+  {
+    std::string content;
+    if (!android::base::ReadFileToString(pathData.source.path, &content)) {
+      context->getDiagnostics()->error(
+          DiagMessage(pathData.source)
+          << android::base::SystemErrorCodeToString(errno));
+      return false;
     }
 
-    BigBuffer buffer(4096);
-    ResourceFile resFile;
-    resFile.name = ResourceName({}, *parseResourceType(pathData.resourceDir), pathData.name);
-    resFile.config = pathData.config;
-    resFile.source = pathData.source;
+    BigBuffer crunchedPngBuffer(4096);
+    BigBufferOutputStream crunchedPngBufferOut(&crunchedPngBuffer);
 
-    {
-        std::string content;
-        if (!android::base::ReadFileToString(pathData.source.path, &content)) {
-            context->getDiagnostics()->error(DiagMessage(pathData.source)
-                                             << android::base::SystemErrorCodeToString(errno));
-            return false;
-        }
-
-        BigBuffer crunchedPngBuffer(4096);
-        BigBufferOutputStream crunchedPngBufferOut(&crunchedPngBuffer);
-
-        // Ensure that we only keep the chunks we care about if we end up
-        // using the original PNG instead of the crunched one.
-        PngChunkFilter pngChunkFilter(content);
-        std::unique_ptr<Image> image = readPng(context, &pngChunkFilter);
-        if (!image) {
-            return false;
-        }
-
-        std::unique_ptr<NinePatch> ninePatch;
-        if (pathData.extension == "9.png") {
-            std::string err;
-            ninePatch = NinePatch::create(image->rows.get(), image->width, image->height, &err);
-            if (!ninePatch) {
-                context->getDiagnostics()->error(DiagMessage() << err);
-                return false;
-            }
-
-            // Remove the 1px border around the NinePatch.
-            // Basically the row array is shifted up by 1, and the length is treated
-            // as height - 2.
-            // For each row, shift the array to the left by 1, and treat the length as width - 2.
-            image->width -= 2;
-            image->height -= 2;
-            memmove(image->rows.get(), image->rows.get() + 1, image->height * sizeof(uint8_t**));
-            for (int32_t h = 0; h < image->height; h++) {
-                memmove(image->rows[h], image->rows[h] + 4, image->width * 4);
-            }
-
-            if (context->verbose()) {
-                context->getDiagnostics()->note(DiagMessage(pathData.source)
-                                                << "9-patch: " << *ninePatch);
-            }
-        }
-
-        // Write the crunched PNG.
-        if (!writePng(context, image.get(), ninePatch.get(), &crunchedPngBufferOut, {})) {
-            return false;
-        }
-
-        if (ninePatch != nullptr
-                || crunchedPngBufferOut.ByteCount() <= pngChunkFilter.ByteCount()) {
-            // No matter what, we must use the re-encoded PNG, even if it is larger.
-            // 9-patch images must be re-encoded since their borders are stripped.
-            buffer.appendBuffer(std::move(crunchedPngBuffer));
-        } else {
-            // The re-encoded PNG is larger than the original, and there is
-            // no mandatory transformation. Use the original.
-            if (context->verbose()) {
-                context->getDiagnostics()->note(DiagMessage(pathData.source)
-                                                << "original PNG is smaller than crunched PNG"
-                                                << ", using original");
-            }
-
-            PngChunkFilter pngChunkFilterAgain(content);
-            BigBuffer filteredPngBuffer(4096);
-            BigBufferOutputStream filteredPngBufferOut(&filteredPngBuffer);
-            io::copy(&filteredPngBufferOut, &pngChunkFilterAgain);
-            buffer.appendBuffer(std::move(filteredPngBuffer));
-        }
-
-        if (context->verbose()) {
-            // For debugging only, use the legacy PNG cruncher and compare the resulting file sizes.
-            // This will help catch exotic cases where the new code may generate larger PNGs.
-            std::stringstream legacyStream(content);
-            BigBuffer legacyBuffer(4096);
-            Png png(context->getDiagnostics());
-            if (!png.process(pathData.source, &legacyStream, &legacyBuffer, {})) {
-                return false;
-            }
-
-            context->getDiagnostics()->note(DiagMessage(pathData.source)
-                                            << "legacy=" << legacyBuffer.size()
-                                            << " new=" << buffer.size());
-        }
+    // Ensure that we only keep the chunks we care about if we end up
+    // using the original PNG instead of the crunched one.
+    PngChunkFilter pngChunkFilter(content);
+    std::unique_ptr<Image> image = readPng(context, &pngChunkFilter);
+    if (!image) {
+      return false;
     }
 
-    if (!writeHeaderAndBufferToWriter(outputPath, resFile, buffer, writer,
-                                      context->getDiagnostics())) {
+    std::unique_ptr<NinePatch> ninePatch;
+    if (pathData.extension == "9.png") {
+      std::string err;
+      ninePatch = NinePatch::create(image->rows.get(), image->width,
+                                    image->height, &err);
+      if (!ninePatch) {
+        context->getDiagnostics()->error(DiagMessage() << err);
         return false;
+      }
+
+      // Remove the 1px border around the NinePatch.
+      // Basically the row array is shifted up by 1, and the length is treated
+      // as height - 2.
+      // For each row, shift the array to the left by 1, and treat the length as
+      // width - 2.
+      image->width -= 2;
+      image->height -= 2;
+      memmove(image->rows.get(), image->rows.get() + 1,
+              image->height * sizeof(uint8_t**));
+      for (int32_t h = 0; h < image->height; h++) {
+        memmove(image->rows[h], image->rows[h] + 4, image->width * 4);
+      }
+
+      if (context->verbose()) {
+        context->getDiagnostics()->note(DiagMessage(pathData.source)
+                                        << "9-patch: " << *ninePatch);
+      }
     }
-    return true;
+
+    // Write the crunched PNG.
+    if (!writePng(context, image.get(), ninePatch.get(), &crunchedPngBufferOut,
+                  {})) {
+      return false;
+    }
+
+    if (ninePatch != nullptr ||
+        crunchedPngBufferOut.ByteCount() <= pngChunkFilter.ByteCount()) {
+      // No matter what, we must use the re-encoded PNG, even if it is larger.
+      // 9-patch images must be re-encoded since their borders are stripped.
+      buffer.appendBuffer(std::move(crunchedPngBuffer));
+    } else {
+      // The re-encoded PNG is larger than the original, and there is
+      // no mandatory transformation. Use the original.
+      if (context->verbose()) {
+        context->getDiagnostics()->note(
+            DiagMessage(pathData.source)
+            << "original PNG is smaller than crunched PNG"
+            << ", using original");
+      }
+
+      PngChunkFilter pngChunkFilterAgain(content);
+      BigBuffer filteredPngBuffer(4096);
+      BigBufferOutputStream filteredPngBufferOut(&filteredPngBuffer);
+      io::copy(&filteredPngBufferOut, &pngChunkFilterAgain);
+      buffer.appendBuffer(std::move(filteredPngBuffer));
+    }
+
+    if (context->verbose()) {
+      // For debugging only, use the legacy PNG cruncher and compare the
+      // resulting file sizes.
+      // This will help catch exotic cases where the new code may generate
+      // larger PNGs.
+      std::stringstream legacyStream(content);
+      BigBuffer legacyBuffer(4096);
+      Png png(context->getDiagnostics());
+      if (!png.process(pathData.source, &legacyStream, &legacyBuffer, {})) {
+        return false;
+      }
+
+      context->getDiagnostics()->note(DiagMessage(pathData.source)
+                                      << "legacy=" << legacyBuffer.size()
+                                      << " new=" << buffer.size());
+    }
+  }
+
+  if (!writeHeaderAndBufferToWriter(outputPath, resFile, buffer, writer,
+                                    context->getDiagnostics())) {
+    return false;
+  }
+  return true;
 }
 
 static bool compileFile(IAaptContext* context, const CompileOptions& options,
-                        const ResourcePathData& pathData, IArchiveWriter* writer,
-                        const std::string& outputPath) {
-    if (context->verbose()) {
-        context->getDiagnostics()->note(DiagMessage(pathData.source) << "compiling file");
-    }
+                        const ResourcePathData& pathData,
+                        IArchiveWriter* writer, const std::string& outputPath) {
+  if (context->verbose()) {
+    context->getDiagnostics()->note(DiagMessage(pathData.source)
+                                    << "compiling file");
+  }
 
-    BigBuffer buffer(256);
-    ResourceFile resFile;
-    resFile.name = ResourceName({}, *parseResourceType(pathData.resourceDir), pathData.name);
-    resFile.config = pathData.config;
-    resFile.source = pathData.source;
+  BigBuffer buffer(256);
+  ResourceFile resFile;
+  resFile.name =
+      ResourceName({}, *parseResourceType(pathData.resourceDir), pathData.name);
+  resFile.config = pathData.config;
+  resFile.source = pathData.source;
 
-    std::string errorStr;
-    Maybe<android::FileMap> f = file::mmapPath(pathData.source.path, &errorStr);
-    if (!f) {
-        context->getDiagnostics()->error(DiagMessage(pathData.source) << errorStr);
-        return false;
-    }
+  std::string errorStr;
+  Maybe<android::FileMap> f = file::mmapPath(pathData.source.path, &errorStr);
+  if (!f) {
+    context->getDiagnostics()->error(DiagMessage(pathData.source) << errorStr);
+    return false;
+  }
 
-    if (!writeHeaderAndMmapToWriter(outputPath, resFile, f.value(), writer,
-                                    context->getDiagnostics())) {
-        return false;
-    }
-    return true;
+  if (!writeHeaderAndMmapToWriter(outputPath, resFile, f.value(), writer,
+                                  context->getDiagnostics())) {
+    return false;
+  }
+  return true;
 }
 
 class CompileContext : public IAaptContext {
-public:
-    void setVerbose(bool val) {
-        mVerbose = val;
-    }
+ public:
+  void setVerbose(bool val) { mVerbose = val; }
 
-    bool verbose() override {
-        return mVerbose;
-    }
+  bool verbose() override { return mVerbose; }
 
-    IDiagnostics* getDiagnostics() override {
-       return &mDiagnostics;
-    }
+  IDiagnostics* getDiagnostics() override { return &mDiagnostics; }
 
-    NameMangler* getNameMangler() override {
-       abort();
-       return nullptr;
-    }
+  NameMangler* getNameMangler() override {
+    abort();
+    return nullptr;
+  }
 
-    const std::string& getCompilationPackage() override {
-        static std::string empty;
-        return empty;
-    }
+  const std::string& getCompilationPackage() override {
+    static std::string empty;
+    return empty;
+  }
 
-    uint8_t getPackageId() override {
-       return 0x0;
-    }
+  uint8_t getPackageId() override { return 0x0; }
 
-    SymbolTable* getExternalSymbols() override {
-       abort();
-       return nullptr;
-    }
+  SymbolTable* getExternalSymbols() override {
+    abort();
+    return nullptr;
+  }
 
-    int getMinSdkVersion() override {
-        return 0;
-    }
+  int getMinSdkVersion() override { return 0; }
 
-private:
-    StdErrDiagnostics mDiagnostics;
-    bool mVerbose = false;
-
+ private:
+  StdErrDiagnostics mDiagnostics;
+  bool mVerbose = false;
 };
 
 /**
- * Entry point for compilation phase. Parses arguments and dispatches to the correct steps.
+ * Entry point for compilation phase. Parses arguments and dispatches to the
+ * correct steps.
  */
 int compile(const std::vector<StringPiece>& args) {
-    CompileContext context;
-    CompileOptions options;
+  CompileContext context;
+  CompileOptions options;
 
-    bool verbose = false;
-    Flags flags = Flags()
-            .requiredFlag("-o", "Output path", &options.outputPath)
-            .optionalFlag("--dir", "Directory to scan for resources", &options.resDir)
-            .optionalSwitch("--pseudo-localize", "Generate resources for pseudo-locales "
-                            "(en-XA and ar-XB)", &options.pseudolocalize)
-            .optionalSwitch("--legacy", "Treat errors that used to be valid in AAPT as warnings",
-                            &options.legacyMode)
-            .optionalSwitch("-v", "Enables verbose logging", &verbose);
-    if (!flags.parse("aapt2 compile", args, &std::cerr)) {
-        return 1;
+  bool verbose = false;
+  Flags flags =
+      Flags()
+          .requiredFlag("-o", "Output path", &options.outputPath)
+          .optionalFlag("--dir", "Directory to scan for resources",
+                        &options.resDir)
+          .optionalSwitch("--pseudo-localize",
+                          "Generate resources for pseudo-locales "
+                          "(en-XA and ar-XB)",
+                          &options.pseudolocalize)
+          .optionalSwitch(
+              "--legacy",
+              "Treat errors that used to be valid in AAPT as warnings",
+              &options.legacyMode)
+          .optionalSwitch("-v", "Enables verbose logging", &verbose);
+  if (!flags.parse("aapt2 compile", args, &std::cerr)) {
+    return 1;
+  }
+
+  context.setVerbose(verbose);
+
+  std::unique_ptr<IArchiveWriter> archiveWriter;
+
+  std::vector<ResourcePathData> inputData;
+  if (options.resDir) {
+    if (!flags.getArgs().empty()) {
+      // Can't have both files and a resource directory.
+      context.getDiagnostics()->error(DiagMessage()
+                                      << "files given but --dir specified");
+      flags.usage("aapt2 compile", &std::cerr);
+      return 1;
     }
 
-    context.setVerbose(verbose);
+    if (!loadInputFilesFromDir(&context, options, &inputData)) {
+      return 1;
+    }
 
-    std::unique_ptr<IArchiveWriter> archiveWriter;
+    archiveWriter = createZipFileArchiveWriter(context.getDiagnostics(),
+                                               options.outputPath);
 
-    std::vector<ResourcePathData> inputData;
-    if (options.resDir) {
-        if (!flags.getArgs().empty()) {
-            // Can't have both files and a resource directory.
-            context.getDiagnostics()->error(DiagMessage() << "files given but --dir specified");
-            flags.usage("aapt2 compile", &std::cerr);
-            return 1;
-        }
+  } else {
+    inputData.reserve(flags.getArgs().size());
 
-        if (!loadInputFilesFromDir(&context, options, &inputData)) {
-            return 1;
-        }
+    // Collect data from the path for each input file.
+    for (const std::string& arg : flags.getArgs()) {
+      std::string errorStr;
+      if (Maybe<ResourcePathData> pathData =
+              extractResourcePathData(arg, &errorStr)) {
+        inputData.push_back(std::move(pathData.value()));
+      } else {
+        context.getDiagnostics()->error(DiagMessage() << errorStr << " (" << arg
+                                                      << ")");
+        return 1;
+      }
+    }
 
-        archiveWriter = createZipFileArchiveWriter(context.getDiagnostics(), options.outputPath);
+    archiveWriter = createDirectoryArchiveWriter(context.getDiagnostics(),
+                                                 options.outputPath);
+  }
+
+  if (!archiveWriter) {
+    return false;
+  }
+
+  bool error = false;
+  for (ResourcePathData& pathData : inputData) {
+    if (options.verbose) {
+      context.getDiagnostics()->note(DiagMessage(pathData.source)
+                                     << "processing");
+    }
+
+    if (pathData.resourceDir == "values") {
+      // Overwrite the extension.
+      pathData.extension = "arsc";
+
+      const std::string outputFilename = buildIntermediateFilename(pathData);
+      if (!compileTable(&context, options, pathData, archiveWriter.get(),
+                        outputFilename)) {
+        error = true;
+      }
 
     } else {
-        inputData.reserve(flags.getArgs().size());
-
-        // Collect data from the path for each input file.
-        for (const std::string& arg : flags.getArgs()) {
-            std::string errorStr;
-            if (Maybe<ResourcePathData> pathData = extractResourcePathData(arg, &errorStr)) {
-                inputData.push_back(std::move(pathData.value()));
-            } else {
-                context.getDiagnostics()->error(DiagMessage() << errorStr << " (" << arg << ")");
-                return 1;
+      const std::string outputFilename = buildIntermediateFilename(pathData);
+      if (const ResourceType* type = parseResourceType(pathData.resourceDir)) {
+        if (*type != ResourceType::kRaw) {
+          if (pathData.extension == "xml") {
+            if (!compileXml(&context, options, pathData, archiveWriter.get(),
+                            outputFilename)) {
+              error = true;
             }
-        }
-
-        archiveWriter = createDirectoryArchiveWriter(context.getDiagnostics(), options.outputPath);
-    }
-
-    if (!archiveWriter) {
-        return false;
-    }
-
-    bool error = false;
-    for (ResourcePathData& pathData : inputData) {
-        if (options.verbose) {
-            context.getDiagnostics()->note(DiagMessage(pathData.source) << "processing");
-        }
-
-        if (pathData.resourceDir == "values") {
-            // Overwrite the extension.
-            pathData.extension = "arsc";
-
-            const std::string outputFilename = buildIntermediateFilename(pathData);
-            if (!compileTable(&context, options, pathData, archiveWriter.get(), outputFilename)) {
-                error = true;
+          } else if (pathData.extension == "png" ||
+                     pathData.extension == "9.png") {
+            if (!compilePng(&context, options, pathData, archiveWriter.get(),
+                            outputFilename)) {
+              error = true;
             }
-
+          } else {
+            if (!compileFile(&context, options, pathData, archiveWriter.get(),
+                             outputFilename)) {
+              error = true;
+            }
+          }
         } else {
-            const std::string outputFilename = buildIntermediateFilename(pathData);
-            if (const ResourceType* type = parseResourceType(pathData.resourceDir)) {
-                if (*type != ResourceType::kRaw) {
-                    if (pathData.extension == "xml") {
-                        if (!compileXml(&context, options, pathData, archiveWriter.get(),
-                                        outputFilename)) {
-                            error = true;
-                        }
-                    } else if (pathData.extension == "png" || pathData.extension == "9.png") {
-                        if (!compilePng(&context, options, pathData, archiveWriter.get(),
-                                        outputFilename)) {
-                            error = true;
-                        }
-                    } else {
-                        if (!compileFile(&context, options, pathData, archiveWriter.get(),
-                                         outputFilename)) {
-                            error = true;
-                        }
-                    }
-                } else {
-                    if (!compileFile(&context, options, pathData, archiveWriter.get(),
-                                     outputFilename)) {
-                        error = true;
-                    }
-                }
-            } else {
-                context.getDiagnostics()->error(
-                        DiagMessage() << "invalid file path '" << pathData.source << "'");
-                error = true;
-            }
+          if (!compileFile(&context, options, pathData, archiveWriter.get(),
+                           outputFilename)) {
+            error = true;
+          }
         }
+      } else {
+        context.getDiagnostics()->error(
+            DiagMessage() << "invalid file path '" << pathData.source << "'");
+        error = true;
+      }
     }
+  }
 
-    if (error) {
-        return 1;
-    }
-    return 0;
+  if (error) {
+    return 1;
+  }
+  return 0;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/IdAssigner.cpp b/tools/aapt2/compile/IdAssigner.cpp
index 4a3f1e1..73eb066 100644
--- a/tools/aapt2/compile/IdAssigner.cpp
+++ b/tools/aapt2/compile/IdAssigner.cpp
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-#include "ResourceTable.h"
 #include "compile/IdAssigner.h"
+#include "ResourceTable.h"
 #include "process/IResourceTableConsumer.h"
 #include "util/Util.h"
 
@@ -25,178 +25,192 @@
 namespace aapt {
 
 /**
- * Assigns the intended ID to the ResourceTablePackage, ResourceTableType, and ResourceEntry,
+ * Assigns the intended ID to the ResourceTablePackage, ResourceTableType, and
+ * ResourceEntry,
  * as long as there is no existing ID or the ID is the same.
  */
-static bool assignId(IDiagnostics* diag, const ResourceId& id, const ResourceName& name,
-                     ResourceTablePackage* pkg, ResourceTableType* type, ResourceEntry* entry) {
-    if (pkg->id.value() == id.packageId()) {
-        if (!type->id || type->id.value() == id.typeId()) {
-            type->id = id.typeId();
+static bool assignId(IDiagnostics* diag, const ResourceId& id,
+                     const ResourceName& name, ResourceTablePackage* pkg,
+                     ResourceTableType* type, ResourceEntry* entry) {
+  if (pkg->id.value() == id.packageId()) {
+    if (!type->id || type->id.value() == id.typeId()) {
+      type->id = id.typeId();
 
-            if (!entry->id || entry->id.value() == id.entryId()) {
-                entry->id = id.entryId();
-                return true;
-            }
-        }
+      if (!entry->id || entry->id.value() == id.entryId()) {
+        entry->id = id.entryId();
+        return true;
+      }
     }
+  }
 
-    const ResourceId existingId(pkg->id.value(),
-                                type->id ? type->id.value() : 0,
-                                entry->id ? entry->id.value() : 0);
-    diag->error(DiagMessage() << "can't assign ID " << id
-                << " to resource " << name
-                << " with conflicting ID " << existingId);
-    return false;
+  const ResourceId existingId(pkg->id.value(), type->id ? type->id.value() : 0,
+                              entry->id ? entry->id.value() : 0);
+  diag->error(DiagMessage() << "can't assign ID " << id << " to resource "
+                            << name << " with conflicting ID " << existingId);
+  return false;
 }
 
 bool IdAssigner::consume(IAaptContext* context, ResourceTable* table) {
-    std::map<ResourceId, ResourceName> assignedIds;
+  std::map<ResourceId, ResourceName> assignedIds;
 
-    for (auto& package : table->packages) {
-        assert(package->id && "packages must have manually assigned IDs");
+  for (auto& package : table->packages) {
+    assert(package->id && "packages must have manually assigned IDs");
 
-        for (auto& type : package->types) {
-            for (auto& entry : type->entries) {
-                const ResourceName name(package->name, type->type, entry->name);
+    for (auto& type : package->types) {
+      for (auto& entry : type->entries) {
+        const ResourceName name(package->name, type->type, entry->name);
 
-                if (mAssignedIdMap) {
-                    // Assign the pre-assigned stable ID meant for this resource.
-                    const auto iter = mAssignedIdMap->find(name);
-                    if (iter != mAssignedIdMap->end()) {
-                        const ResourceId assignedId = iter->second;
-                        const bool result = assignId(context->getDiagnostics(), assignedId, name,
-                                                     package.get(), type.get(), entry.get());
-                        if (!result) {
-                            return false;
-                        }
-                    }
-                }
-
-                if (package->id && type->id && entry->id) {
-                    // If the ID is set for this resource, then reserve it.
-                    ResourceId resourceId(package->id.value(), type->id.value(), entry->id.value());
-                    auto result = assignedIds.insert({ resourceId, name });
-                    const ResourceName& existingName = result.first->second;
-                    if (!result.second) {
-                        context->getDiagnostics()->error(DiagMessage() << "resource " << name
-                                                         << " has same ID "
-                                                         << resourceId
-                                                         << " as " << existingName);
-                        return false;
-                    }
-                }
+        if (mAssignedIdMap) {
+          // Assign the pre-assigned stable ID meant for this resource.
+          const auto iter = mAssignedIdMap->find(name);
+          if (iter != mAssignedIdMap->end()) {
+            const ResourceId assignedId = iter->second;
+            const bool result =
+                assignId(context->getDiagnostics(), assignedId, name,
+                         package.get(), type.get(), entry.get());
+            if (!result) {
+              return false;
             }
+          }
         }
-    }
 
-    if (mAssignedIdMap) {
-        // Reserve all the IDs mentioned in the stable ID map. That way we won't assign
-        // IDs that were listed in the map if they don't exist in the table.
-        for (const auto& stableIdEntry : *mAssignedIdMap) {
-            const ResourceName& preAssignedName = stableIdEntry.first;
-            const ResourceId& preAssignedId = stableIdEntry.second;
-            auto result = assignedIds.insert({ preAssignedId, preAssignedName });
-            const ResourceName& existingName = result.first->second;
-            if (!result.second && existingName != preAssignedName) {
-                context->getDiagnostics()->error(DiagMessage() << "stable ID " << preAssignedId
-                                                 << " for resource " << preAssignedName
-                                                 << " is already taken by resource "
-                                                 << existingName);
-                return false;
-            }
+        if (package->id && type->id && entry->id) {
+          // If the ID is set for this resource, then reserve it.
+          ResourceId resourceId(package->id.value(), type->id.value(),
+                                entry->id.value());
+          auto result = assignedIds.insert({resourceId, name});
+          const ResourceName& existingName = result.first->second;
+          if (!result.second) {
+            context->getDiagnostics()->error(
+                DiagMessage() << "resource " << name << " has same ID "
+                              << resourceId << " as " << existingName);
+            return false;
+          }
         }
+      }
     }
+  }
 
-    // Assign any resources without IDs the next available ID. Gaps will be filled if possible,
-    // unless those IDs have been reserved.
+  if (mAssignedIdMap) {
+    // Reserve all the IDs mentioned in the stable ID map. That way we won't
+    // assign
+    // IDs that were listed in the map if they don't exist in the table.
+    for (const auto& stableIdEntry : *mAssignedIdMap) {
+      const ResourceName& preAssignedName = stableIdEntry.first;
+      const ResourceId& preAssignedId = stableIdEntry.second;
+      auto result = assignedIds.insert({preAssignedId, preAssignedName});
+      const ResourceName& existingName = result.first->second;
+      if (!result.second && existingName != preAssignedName) {
+        context->getDiagnostics()->error(
+            DiagMessage() << "stable ID " << preAssignedId << " for resource "
+                          << preAssignedName << " is already taken by resource "
+                          << existingName);
+        return false;
+      }
+    }
+  }
 
-    const auto assignedIdsIterEnd = assignedIds.end();
-    for (auto& package : table->packages) {
-        assert(package->id && "packages must have manually assigned IDs");
+  // Assign any resources without IDs the next available ID. Gaps will be filled
+  // if possible,
+  // unless those IDs have been reserved.
 
-        // Build a half filled ResourceId object, which will be used to find the closest matching
-        // reserved ID in the assignedId map. From that point the next available type ID can be
-        // found.
-        ResourceId resourceId(package->id.value(), 0, 0);
-        uint8_t nextExpectedTypeId = 1;
+  const auto assignedIdsIterEnd = assignedIds.end();
+  for (auto& package : table->packages) {
+    assert(package->id && "packages must have manually assigned IDs");
 
-        // Find the closest matching ResourceId that is <= the one with only the package set.
-        auto nextTypeIter = assignedIds.lower_bound(resourceId);
-        for (auto& type : package->types) {
-            if (!type->id) {
-                // We need to assign a type ID. Iterate over the reserved IDs until we find
-                // some type ID that is a distance of 2 greater than the last one we've seen.
-                // That means there is an available type ID between these reserved IDs.
-                while (nextTypeIter != assignedIdsIterEnd) {
-                    if (nextTypeIter->first.packageId() != package->id.value()) {
-                        break;
-                    }
+    // Build a half filled ResourceId object, which will be used to find the
+    // closest matching
+    // reserved ID in the assignedId map. From that point the next available
+    // type ID can be
+    // found.
+    ResourceId resourceId(package->id.value(), 0, 0);
+    uint8_t nextExpectedTypeId = 1;
 
-                    const uint8_t typeId = nextTypeIter->first.typeId();
-                    if (typeId > nextExpectedTypeId) {
-                        // There is a gap in the type IDs, so use the missing one.
-                        type->id = nextExpectedTypeId++;
-                        break;
-                    }
+    // Find the closest matching ResourceId that is <= the one with only the
+    // package set.
+    auto nextTypeIter = assignedIds.lower_bound(resourceId);
+    for (auto& type : package->types) {
+      if (!type->id) {
+        // We need to assign a type ID. Iterate over the reserved IDs until we
+        // find
+        // some type ID that is a distance of 2 greater than the last one we've
+        // seen.
+        // That means there is an available type ID between these reserved IDs.
+        while (nextTypeIter != assignedIdsIterEnd) {
+          if (nextTypeIter->first.packageId() != package->id.value()) {
+            break;
+          }
 
-                    // Set our expectation to be the next type ID after the reserved one we
-                    // just saw.
-                    nextExpectedTypeId = typeId + 1;
+          const uint8_t typeId = nextTypeIter->first.typeId();
+          if (typeId > nextExpectedTypeId) {
+            // There is a gap in the type IDs, so use the missing one.
+            type->id = nextExpectedTypeId++;
+            break;
+          }
 
-                    // Move to the next reserved ID.
-                    ++nextTypeIter;
-                }
+          // Set our expectation to be the next type ID after the reserved one
+          // we
+          // just saw.
+          nextExpectedTypeId = typeId + 1;
 
-                if (!type->id) {
-                    // We must have hit the end of the reserved IDs and not found a gap.
-                    // That means the next ID is available.
-                    type->id = nextExpectedTypeId++;
-                }
-            }
-
-            resourceId = ResourceId(package->id.value(), type->id.value(), 0);
-            uint16_t nextExpectedEntryId = 0;
-
-            // Find the closest matching ResourceId that is <= the one with only the package
-            // and type set.
-            auto nextEntryIter = assignedIds.lower_bound(resourceId);
-            for (auto& entry : type->entries) {
-                if (!entry->id) {
-                    // We need to assign an entry ID. Iterate over the reserved IDs until we find
-                    // some entry ID that is a distance of 2 greater than the last one we've seen.
-                    // That means there is an available entry ID between these reserved IDs.
-                    while (nextEntryIter != assignedIdsIterEnd) {
-                        if (nextEntryIter->first.packageId() != package->id.value() ||
-                                nextEntryIter->first.typeId() != type->id.value()) {
-                            break;
-                        }
-
-                        const uint16_t entryId = nextEntryIter->first.entryId();
-                        if (entryId > nextExpectedEntryId) {
-                            // There is a gap in the entry IDs, so use the missing one.
-                            entry->id = nextExpectedEntryId++;
-                            break;
-                        }
-
-                        // Set our expectation to be the next type ID after the reserved one we
-                        // just saw.
-                        nextExpectedEntryId = entryId + 1;
-
-                        // Move to the next reserved entry ID.
-                        ++nextEntryIter;
-                    }
-
-                    if (!entry->id) {
-                        // We must have hit the end of the reserved IDs and not found a gap.
-                        // That means the next ID is available.
-                        entry->id = nextExpectedEntryId++;
-                    }
-                }
-            }
+          // Move to the next reserved ID.
+          ++nextTypeIter;
         }
+
+        if (!type->id) {
+          // We must have hit the end of the reserved IDs and not found a gap.
+          // That means the next ID is available.
+          type->id = nextExpectedTypeId++;
+        }
+      }
+
+      resourceId = ResourceId(package->id.value(), type->id.value(), 0);
+      uint16_t nextExpectedEntryId = 0;
+
+      // Find the closest matching ResourceId that is <= the one with only the
+      // package
+      // and type set.
+      auto nextEntryIter = assignedIds.lower_bound(resourceId);
+      for (auto& entry : type->entries) {
+        if (!entry->id) {
+          // We need to assign an entry ID. Iterate over the reserved IDs until
+          // we find
+          // some entry ID that is a distance of 2 greater than the last one
+          // we've seen.
+          // That means there is an available entry ID between these reserved
+          // IDs.
+          while (nextEntryIter != assignedIdsIterEnd) {
+            if (nextEntryIter->first.packageId() != package->id.value() ||
+                nextEntryIter->first.typeId() != type->id.value()) {
+              break;
+            }
+
+            const uint16_t entryId = nextEntryIter->first.entryId();
+            if (entryId > nextExpectedEntryId) {
+              // There is a gap in the entry IDs, so use the missing one.
+              entry->id = nextExpectedEntryId++;
+              break;
+            }
+
+            // Set our expectation to be the next type ID after the reserved one
+            // we
+            // just saw.
+            nextExpectedEntryId = entryId + 1;
+
+            // Move to the next reserved entry ID.
+            ++nextEntryIter;
+          }
+
+          if (!entry->id) {
+            // We must have hit the end of the reserved IDs and not found a gap.
+            // That means the next ID is available.
+            entry->id = nextExpectedEntryId++;
+          }
+        }
+      }
     }
-    return true;
+  }
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/IdAssigner.h b/tools/aapt2/compile/IdAssigner.h
index 06cd5e3..d399064 100644
--- a/tools/aapt2/compile/IdAssigner.h
+++ b/tools/aapt2/compile/IdAssigner.h
@@ -26,22 +26,22 @@
 namespace aapt {
 
 /**
- * Assigns IDs to each resource in the table, respecting existing IDs and filling in gaps
+ * Assigns IDs to each resource in the table, respecting existing IDs and
+ * filling in gaps
  * in between fixed ID assignments.
  */
 class IdAssigner : public IResourceTableConsumer {
-public:
-    IdAssigner() = default;
-    explicit IdAssigner(const std::unordered_map<ResourceName, ResourceId>* map) :
-            mAssignedIdMap(map) {
-    }
+ public:
+  IdAssigner() = default;
+  explicit IdAssigner(const std::unordered_map<ResourceName, ResourceId>* map)
+      : mAssignedIdMap(map) {}
 
-    bool consume(IAaptContext* context, ResourceTable* table) override;
+  bool consume(IAaptContext* context, ResourceTable* table) override;
 
-private:
-    const std::unordered_map<ResourceName, ResourceId>* mAssignedIdMap = nullptr;
+ private:
+  const std::unordered_map<ResourceName, ResourceId>* mAssignedIdMap = nullptr;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_COMPILE_IDASSIGNER_H */
diff --git a/tools/aapt2/compile/IdAssigner_test.cpp b/tools/aapt2/compile/IdAssigner_test.cpp
index d21fcba..ff7bf5c 100644
--- a/tools/aapt2/compile/IdAssigner_test.cpp
+++ b/tools/aapt2/compile/IdAssigner_test.cpp
@@ -22,154 +22,163 @@
 ::testing::AssertionResult verifyIds(ResourceTable* table);
 
 TEST(IdAssignerTest, AssignIds) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .addSimple("android:attr/foo")
-            .addSimple("android:attr/bar")
-            .addSimple("android:id/foo")
-            .setPackageId("android", 0x01)
-            .build();
+  std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
+                                             .addSimple("android:attr/foo")
+                                             .addSimple("android:attr/bar")
+                                             .addSimple("android:id/foo")
+                                             .setPackageId("android", 0x01)
+                                             .build();
 
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
-    IdAssigner assigner;
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  IdAssigner assigner;
 
-    ASSERT_TRUE(assigner.consume(context.get(), table.get()));
-    ASSERT_TRUE(verifyIds(table.get()));
+  ASSERT_TRUE(assigner.consume(context.get(), table.get()));
+  ASSERT_TRUE(verifyIds(table.get()));
 }
 
 TEST(IdAssignerTest, AssignIdsWithReservedIds) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .addSimple("android:id/foo", ResourceId(0x01010000))
-            .addSimple("android:dimen/two")
-            .addSimple("android:integer/three")
-            .addSimple("android:string/five")
-            .addSimple("android:attr/fun", ResourceId(0x01040000))
-            .addSimple("android:attr/foo", ResourceId(0x01040006))
-            .addSimple("android:attr/bar")
-            .addSimple("android:attr/baz")
-            .addSimple("app:id/biz")
-            .setPackageId("android", 0x01)
-            .setPackageId("app", 0x7f)
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .addSimple("android:id/foo", ResourceId(0x01010000))
+          .addSimple("android:dimen/two")
+          .addSimple("android:integer/three")
+          .addSimple("android:string/five")
+          .addSimple("android:attr/fun", ResourceId(0x01040000))
+          .addSimple("android:attr/foo", ResourceId(0x01040006))
+          .addSimple("android:attr/bar")
+          .addSimple("android:attr/baz")
+          .addSimple("app:id/biz")
+          .setPackageId("android", 0x01)
+          .setPackageId("app", 0x7f)
+          .build();
 
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
-    IdAssigner assigner;
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  IdAssigner assigner;
 
-    ASSERT_TRUE(assigner.consume(context.get(), table.get()));
-    ASSERT_TRUE(verifyIds(table.get()));
+  ASSERT_TRUE(assigner.consume(context.get(), table.get()));
+  ASSERT_TRUE(verifyIds(table.get()));
 
-    Maybe<ResourceTable::SearchResult> maybeResult;
+  Maybe<ResourceTable::SearchResult> maybeResult;
 
-    // Expect to fill in the gaps between 0x0101XXXX and 0x0104XXXX.
+  // Expect to fill in the gaps between 0x0101XXXX and 0x0104XXXX.
 
-    maybeResult = table->findResource(test::parseNameOrDie("android:dimen/two"));
-    AAPT_ASSERT_TRUE(maybeResult);
-    EXPECT_EQ(make_value<uint8_t>(2), maybeResult.value().type->id);
+  maybeResult = table->findResource(test::parseNameOrDie("android:dimen/two"));
+  AAPT_ASSERT_TRUE(maybeResult);
+  EXPECT_EQ(make_value<uint8_t>(2), maybeResult.value().type->id);
 
-    maybeResult = table->findResource(test::parseNameOrDie("android:integer/three"));
-    AAPT_ASSERT_TRUE(maybeResult);
-    EXPECT_EQ(make_value<uint8_t>(3), maybeResult.value().type->id);
+  maybeResult =
+      table->findResource(test::parseNameOrDie("android:integer/three"));
+  AAPT_ASSERT_TRUE(maybeResult);
+  EXPECT_EQ(make_value<uint8_t>(3), maybeResult.value().type->id);
 
-    // Expect to bypass the reserved 0x0104XXXX IDs and use the next 0x0105XXXX IDs.
+  // Expect to bypass the reserved 0x0104XXXX IDs and use the next 0x0105XXXX
+  // IDs.
 
-    maybeResult = table->findResource(test::parseNameOrDie("android:string/five"));
-    AAPT_ASSERT_TRUE(maybeResult);
-    EXPECT_EQ(make_value<uint8_t>(5), maybeResult.value().type->id);
+  maybeResult =
+      table->findResource(test::parseNameOrDie("android:string/five"));
+  AAPT_ASSERT_TRUE(maybeResult);
+  EXPECT_EQ(make_value<uint8_t>(5), maybeResult.value().type->id);
 
-    // Expect to fill in the gaps between 0x01040000 and 0x01040006.
+  // Expect to fill in the gaps between 0x01040000 and 0x01040006.
 
-    maybeResult = table->findResource(test::parseNameOrDie("android:attr/bar"));
-    AAPT_ASSERT_TRUE(maybeResult);
-    EXPECT_EQ(make_value<uint16_t>(1), maybeResult.value().entry->id);
+  maybeResult = table->findResource(test::parseNameOrDie("android:attr/bar"));
+  AAPT_ASSERT_TRUE(maybeResult);
+  EXPECT_EQ(make_value<uint16_t>(1), maybeResult.value().entry->id);
 
-    maybeResult = table->findResource(test::parseNameOrDie("android:attr/baz"));
-    AAPT_ASSERT_TRUE(maybeResult);
-    EXPECT_EQ(make_value<uint16_t>(2), maybeResult.value().entry->id);
+  maybeResult = table->findResource(test::parseNameOrDie("android:attr/baz"));
+  AAPT_ASSERT_TRUE(maybeResult);
+  EXPECT_EQ(make_value<uint16_t>(2), maybeResult.value().entry->id);
 }
 
 TEST(IdAssignerTest, FailWhenNonUniqueIdsAssigned) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .addSimple("android:attr/foo", ResourceId(0x01040006))
-            .addSimple("android:attr/bar", ResourceId(0x01040006))
-            .setPackageId("android", 0x01)
-            .setPackageId("app", 0x7f)
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .addSimple("android:attr/foo", ResourceId(0x01040006))
+          .addSimple("android:attr/bar", ResourceId(0x01040006))
+          .setPackageId("android", 0x01)
+          .setPackageId("app", 0x7f)
+          .build();
 
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
-    IdAssigner assigner;
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  IdAssigner assigner;
 
-    ASSERT_FALSE(assigner.consume(context.get(), table.get()));
+  ASSERT_FALSE(assigner.consume(context.get(), table.get()));
 }
 
 TEST(IdAssignerTest, AssignIdsWithIdMap) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .addSimple("android:attr/foo")
-            .addSimple("android:attr/bar")
-            .setPackageId("android", 0x01)
-            .build();
+  std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
+                                             .addSimple("android:attr/foo")
+                                             .addSimple("android:attr/bar")
+                                             .setPackageId("android", 0x01)
+                                             .build();
 
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
-    std::unordered_map<ResourceName, ResourceId> idMap = {
-            { test::parseNameOrDie("android:attr/foo"), ResourceId(0x01010002) } };
-    IdAssigner assigner(&idMap);
-    ASSERT_TRUE(assigner.consume(context.get(), table.get()));
-    ASSERT_TRUE(verifyIds(table.get()));
-    Maybe<ResourceTable::SearchResult> result = table->findResource(
-            test::parseNameOrDie("android:attr/foo"));
-    AAPT_ASSERT_TRUE(result);
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::unordered_map<ResourceName, ResourceId> idMap = {
+      {test::parseNameOrDie("android:attr/foo"), ResourceId(0x01010002)}};
+  IdAssigner assigner(&idMap);
+  ASSERT_TRUE(assigner.consume(context.get(), table.get()));
+  ASSERT_TRUE(verifyIds(table.get()));
+  Maybe<ResourceTable::SearchResult> result =
+      table->findResource(test::parseNameOrDie("android:attr/foo"));
+  AAPT_ASSERT_TRUE(result);
 
-    const ResourceTable::SearchResult& searchResult = result.value();
-    EXPECT_EQ(make_value<uint8_t>(0x01), searchResult.package->id);
-    EXPECT_EQ(make_value<uint8_t>(0x01), searchResult.type->id);
-    EXPECT_EQ(make_value<uint16_t>(0x0002), searchResult.entry->id);
+  const ResourceTable::SearchResult& searchResult = result.value();
+  EXPECT_EQ(make_value<uint8_t>(0x01), searchResult.package->id);
+  EXPECT_EQ(make_value<uint8_t>(0x01), searchResult.type->id);
+  EXPECT_EQ(make_value<uint16_t>(0x0002), searchResult.entry->id);
 }
 
 ::testing::AssertionResult verifyIds(ResourceTable* table) {
-    std::set<uint8_t> packageIds;
-    for (auto& package : table->packages) {
-        if (!package->id) {
-            return ::testing::AssertionFailure() << "package " << package->name << " has no ID";
-        }
-
-        if (!packageIds.insert(package->id.value()).second) {
-            return ::testing::AssertionFailure() << "package " << package->name
-                    << " has non-unique ID " << std::hex << (int) package->id.value() << std::dec;
-        }
+  std::set<uint8_t> packageIds;
+  for (auto& package : table->packages) {
+    if (!package->id) {
+      return ::testing::AssertionFailure() << "package " << package->name
+                                           << " has no ID";
     }
 
-    for (auto& package : table->packages) {
-        std::set<uint8_t> typeIds;
-        for (auto& type : package->types) {
-            if (!type->id) {
-                return ::testing::AssertionFailure() << "type " << type->type << " of package "
-                        << package->name << " has no ID";
-            }
-
-            if (!typeIds.insert(type->id.value()).second) {
-                return ::testing::AssertionFailure() << "type " << type->type
-                        << " of package " << package->name << " has non-unique ID "
-                        << std::hex << (int) type->id.value() << std::dec;
-            }
-        }
-
-
-        for (auto& type : package->types) {
-            std::set<uint16_t> entryIds;
-            for (auto& entry : type->entries) {
-                if (!entry->id) {
-                    return ::testing::AssertionFailure() << "entry " << entry->name << " of type "
-                            << type->type << " of package " << package->name << " has no ID";
-                }
-
-                if (!entryIds.insert(entry->id.value()).second) {
-                    return ::testing::AssertionFailure() << "entry " << entry->name
-                            << " of type " << type->type << " of package " << package->name
-                            << " has non-unique ID "
-                            << std::hex << (int) entry->id.value() << std::dec;
-                }
-            }
-        }
+    if (!packageIds.insert(package->id.value()).second) {
+      return ::testing::AssertionFailure()
+             << "package " << package->name << " has non-unique ID " << std::hex
+             << (int)package->id.value() << std::dec;
     }
-    return ::testing::AssertionSuccess() << "all IDs are unique and assigned";
+  }
+
+  for (auto& package : table->packages) {
+    std::set<uint8_t> typeIds;
+    for (auto& type : package->types) {
+      if (!type->id) {
+        return ::testing::AssertionFailure() << "type " << type->type
+                                             << " of package " << package->name
+                                             << " has no ID";
+      }
+
+      if (!typeIds.insert(type->id.value()).second) {
+        return ::testing::AssertionFailure()
+               << "type " << type->type << " of package " << package->name
+               << " has non-unique ID " << std::hex << (int)type->id.value()
+               << std::dec;
+      }
+    }
+
+    for (auto& type : package->types) {
+      std::set<uint16_t> entryIds;
+      for (auto& entry : type->entries) {
+        if (!entry->id) {
+          return ::testing::AssertionFailure()
+                 << "entry " << entry->name << " of type " << type->type
+                 << " of package " << package->name << " has no ID";
+        }
+
+        if (!entryIds.insert(entry->id.value()).second) {
+          return ::testing::AssertionFailure()
+                 << "entry " << entry->name << " of type " << type->type
+                 << " of package " << package->name << " has non-unique ID "
+                 << std::hex << (int)entry->id.value() << std::dec;
+        }
+      }
+    }
+  }
+  return ::testing::AssertionSuccess() << "all IDs are unique and assigned";
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/Image.h b/tools/aapt2/compile/Image.h
index fda6a3a..4cf2ea7 100644
--- a/tools/aapt2/compile/Image.h
+++ b/tools/aapt2/compile/Image.h
@@ -29,173 +29,180 @@
  * An in-memory image, loaded from disk, with pixels in RGBA_8888 format.
  */
 class Image {
-public:
-    explicit Image() = default;
+ public:
+  explicit Image() = default;
 
-    /**
-     * A `height` sized array of pointers, where each element points to a
-     * `width` sized row of RGBA_8888 pixels.
-     */
-    std::unique_ptr<uint8_t*[]> rows;
+  /**
+   * A `height` sized array of pointers, where each element points to a
+   * `width` sized row of RGBA_8888 pixels.
+   */
+  std::unique_ptr<uint8_t* []> rows;
 
-    /**
-     * The width of the image in RGBA_8888 pixels. This is int32_t because of 9-patch data
-     * format limitations.
-     */
-    int32_t width = 0;
+  /**
+   * The width of the image in RGBA_8888 pixels. This is int32_t because of
+   * 9-patch data
+   * format limitations.
+   */
+  int32_t width = 0;
 
-    /**
-     * The height of the image in RGBA_8888 pixels. This is int32_t because of 9-patch data
-     * format limitations.
-     */
-    int32_t height = 0;
+  /**
+   * The height of the image in RGBA_8888 pixels. This is int32_t because of
+   * 9-patch data
+   * format limitations.
+   */
+  int32_t height = 0;
 
-    /**
-     * Buffer to the raw image data stored sequentially.
-     * Use `rows` to access the data on a row-by-row basis.
-     */
-    std::unique_ptr<uint8_t[]> data;
+  /**
+   * Buffer to the raw image data stored sequentially.
+   * Use `rows` to access the data on a row-by-row basis.
+   */
+  std::unique_ptr<uint8_t[]> data;
 
-private:
-    DISALLOW_COPY_AND_ASSIGN(Image);
+ private:
+  DISALLOW_COPY_AND_ASSIGN(Image);
 };
 
 /**
- * A range of pixel values, starting at 'start' and ending before 'end' exclusive. Or rather [a, b).
+ * A range of pixel values, starting at 'start' and ending before 'end'
+ * exclusive. Or rather [a, b).
  */
 struct Range {
-    int32_t start = 0;
-    int32_t end = 0;
+  int32_t start = 0;
+  int32_t end = 0;
 
-    explicit Range() = default;
-    inline explicit Range(int32_t s, int32_t e) : start(s), end(e) {
-    }
+  explicit Range() = default;
+  inline explicit Range(int32_t s, int32_t e) : start(s), end(e) {}
 };
 
 inline bool operator==(const Range& left, const Range& right) {
-    return left.start == right.start && left.end == right.end;
+  return left.start == right.start && left.end == right.end;
 }
 
 /**
- * Inset lengths from all edges of a rectangle. `left` and `top` are measured from the left and top
- * edges, while `right` and `bottom` are measured from the right and bottom edges, respectively.
+ * Inset lengths from all edges of a rectangle. `left` and `top` are measured
+ * from the left and top
+ * edges, while `right` and `bottom` are measured from the right and bottom
+ * edges, respectively.
  */
 struct Bounds {
-    int32_t left = 0;
-    int32_t top = 0;
-    int32_t right = 0;
-    int32_t bottom = 0;
+  int32_t left = 0;
+  int32_t top = 0;
+  int32_t right = 0;
+  int32_t bottom = 0;
 
-    explicit Bounds() = default;
-    inline explicit Bounds(int32_t l, int32_t t, int32_t r, int32_t b) :
-            left(l), top(t), right(r), bottom(b) {
-    }
+  explicit Bounds() = default;
+  inline explicit Bounds(int32_t l, int32_t t, int32_t r, int32_t b)
+      : left(l), top(t), right(r), bottom(b) {}
 
-    bool nonZero() const;
+  bool nonZero() const;
 };
 
 inline bool Bounds::nonZero() const {
-    return left != 0 || top != 0 || right != 0 || bottom != 0;
+  return left != 0 || top != 0 || right != 0 || bottom != 0;
 }
 
 inline bool operator==(const Bounds& left, const Bounds& right) {
-    return left.left == right.left && left.top == right.top &&
-            left.right == right.right && left.bottom == right.bottom;
+  return left.left == right.left && left.top == right.top &&
+         left.right == right.right && left.bottom == right.bottom;
 }
 
 /**
- * Contains 9-patch data from a source image. All measurements exclude the 1px border of the
+ * Contains 9-patch data from a source image. All measurements exclude the 1px
+ * border of the
  * source 9-patch image.
  */
 class NinePatch {
-public:
-    static std::unique_ptr<NinePatch> create(uint8_t** rows,
-                                             const int32_t width, const int32_t height,
-                                             std::string* errOut);
+ public:
+  static std::unique_ptr<NinePatch> create(uint8_t** rows, const int32_t width,
+                                           const int32_t height,
+                                           std::string* errOut);
 
-    /**
-     * Packs the RGBA_8888 data pointed to by pixel into a uint32_t
-     * with format 0xAARRGGBB (the way 9-patch expects it).
-     */
-    static uint32_t packRGBA(const uint8_t* pixel);
+  /**
+   * Packs the RGBA_8888 data pointed to by pixel into a uint32_t
+   * with format 0xAARRGGBB (the way 9-patch expects it).
+   */
+  static uint32_t packRGBA(const uint8_t* pixel);
 
-    /**
-     * 9-patch content padding/insets. All positions are relative to the 9-patch
-     * NOT including the 1px thick source border.
-     */
-    Bounds padding;
+  /**
+   * 9-patch content padding/insets. All positions are relative to the 9-patch
+   * NOT including the 1px thick source border.
+   */
+  Bounds padding;
 
-    /**
-     * Optical layout bounds/insets. This overrides the padding for
-     * layout purposes. All positions are relative to the 9-patch
-     * NOT including the 1px thick source border.
-     * See https://developer.android.com/about/versions/android-4.3.html#OpticalBounds
-     */
-    Bounds layoutBounds;
+  /**
+   * Optical layout bounds/insets. This overrides the padding for
+   * layout purposes. All positions are relative to the 9-patch
+   * NOT including the 1px thick source border.
+   * See
+   * https://developer.android.com/about/versions/android-4.3.html#OpticalBounds
+   */
+  Bounds layoutBounds;
 
-    /**
-     * Outline of the image, calculated based on opacity.
-     */
-    Bounds outline;
+  /**
+   * Outline of the image, calculated based on opacity.
+   */
+  Bounds outline;
 
-    /**
-     * The computed radius of the outline. If non-zero, the outline is a rounded-rect.
-     */
-    float outlineRadius = 0.0f;
+  /**
+   * The computed radius of the outline. If non-zero, the outline is a
+   * rounded-rect.
+   */
+  float outlineRadius = 0.0f;
 
-    /**
-     * The largest alpha value within the outline.
-     */
-    uint32_t outlineAlpha = 0x000000ffu;
+  /**
+   * The largest alpha value within the outline.
+   */
+  uint32_t outlineAlpha = 0x000000ffu;
 
-    /**
-     * Horizontal regions of the image that are stretchable.
-     * All positions are relative to the 9-patch
-     * NOT including the 1px thick source border.
-     */
-    std::vector<Range> horizontalStretchRegions;
+  /**
+   * Horizontal regions of the image that are stretchable.
+   * All positions are relative to the 9-patch
+   * NOT including the 1px thick source border.
+   */
+  std::vector<Range> horizontalStretchRegions;
 
-    /**
-     * Vertical regions of the image that are stretchable.
-     * All positions are relative to the 9-patch
-     * NOT including the 1px thick source border.
-     */
-    std::vector<Range> verticalStretchRegions;
+  /**
+   * Vertical regions of the image that are stretchable.
+   * All positions are relative to the 9-patch
+   * NOT including the 1px thick source border.
+   */
+  std::vector<Range> verticalStretchRegions;
 
-    /**
-     * The colors within each region, fixed or stretchable.
-     * For w*h regions, the color of region (x,y) is addressable
-     * via index y*w + x.
-     */
-    std::vector<uint32_t> regionColors;
+  /**
+   * The colors within each region, fixed or stretchable.
+   * For w*h regions, the color of region (x,y) is addressable
+   * via index y*w + x.
+   */
+  std::vector<uint32_t> regionColors;
 
-    /**
-     * Returns serialized data containing the original basic 9-patch meta data.
-     * Optical layout bounds and round rect outline data must be serialized
-     * separately using serializeOpticalLayoutBounds() and serializeRoundedRectOutline().
-     */
-    std::unique_ptr<uint8_t[]> serializeBase(size_t* outLen) const;
+  /**
+   * Returns serialized data containing the original basic 9-patch meta data.
+   * Optical layout bounds and round rect outline data must be serialized
+   * separately using serializeOpticalLayoutBounds() and
+   * serializeRoundedRectOutline().
+   */
+  std::unique_ptr<uint8_t[]> serializeBase(size_t* outLen) const;
 
-    /**
-     * Serializes the layout bounds.
-     */
-    std::unique_ptr<uint8_t[]> serializeLayoutBounds(size_t* outLen) const;
+  /**
+   * Serializes the layout bounds.
+   */
+  std::unique_ptr<uint8_t[]> serializeLayoutBounds(size_t* outLen) const;
 
-    /**
-     * Serializes the rounded-rect outline.
-     */
-    std::unique_ptr<uint8_t[]> serializeRoundedRectOutline(size_t* outLen) const;
+  /**
+   * Serializes the rounded-rect outline.
+   */
+  std::unique_ptr<uint8_t[]> serializeRoundedRectOutline(size_t* outLen) const;
 
-private:
-    explicit NinePatch() = default;
+ private:
+  explicit NinePatch() = default;
 
-    DISALLOW_COPY_AND_ASSIGN(NinePatch);
+  DISALLOW_COPY_AND_ASSIGN(NinePatch);
 };
 
 ::std::ostream& operator<<(::std::ostream& out, const Range& range);
 ::std::ostream& operator<<(::std::ostream& out, const Bounds& bounds);
 ::std::ostream& operator<<(::std::ostream& out, const NinePatch& ninePatch);
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_COMPILE_IMAGE_H */
diff --git a/tools/aapt2/compile/InlineXmlFormatParser.cpp b/tools/aapt2/compile/InlineXmlFormatParser.cpp
index f965bff..56f72b5 100644
--- a/tools/aapt2/compile/InlineXmlFormatParser.cpp
+++ b/tools/aapt2/compile/InlineXmlFormatParser.cpp
@@ -14,9 +14,9 @@
  * limitations under the License.
  */
 
+#include "compile/InlineXmlFormatParser.h"
 #include "Debug.h"
 #include "ResourceUtils.h"
-#include "compile/InlineXmlFormatParser.h"
 #include "util/Util.h"
 #include "xml/XmlDom.h"
 #include "xml/XmlUtil.h"
@@ -33,158 +33,172 @@
  * XML Visitor that will find all <aapt:attr> elements for extraction.
  */
 class Visitor : public xml::PackageAwareVisitor {
-public:
-    using xml::PackageAwareVisitor::visit;
+ public:
+  using xml::PackageAwareVisitor::visit;
 
-    struct InlineDeclaration {
-        xml::Element* el;
-        std::string attrNamespaceUri;
-        std::string attrName;
-    };
+  struct InlineDeclaration {
+    xml::Element* el;
+    std::string attrNamespaceUri;
+    std::string attrName;
+  };
 
-    explicit Visitor(IAaptContext* context, xml::XmlResource* xmlResource) :
-            mContext(context), mXmlResource(xmlResource) {
+  explicit Visitor(IAaptContext* context, xml::XmlResource* xmlResource)
+      : mContext(context), mXmlResource(xmlResource) {}
+
+  void visit(xml::Element* el) override {
+    if (el->namespaceUri != xml::kSchemaAapt || el->name != "attr") {
+      xml::PackageAwareVisitor::visit(el);
+      return;
     }
 
-    void visit(xml::Element* el) override {
-        if (el->namespaceUri != xml::kSchemaAapt || el->name != "attr") {
-            xml::PackageAwareVisitor::visit(el);
-            return;
-        }
+    const Source& src = mXmlResource->file.source.withLine(el->lineNumber);
 
-        const Source& src = mXmlResource->file.source.withLine(el->lineNumber);
-
-        xml::Attribute* attr = el->findAttribute({}, "name");
-        if (!attr) {
-            mContext->getDiagnostics()->error(DiagMessage(src) << "missing 'name' attribute");
-            mError = true;
-            return;
-        }
-
-        Maybe<Reference> ref = ResourceUtils::parseXmlAttributeName(attr->value);
-        if (!ref) {
-            mContext->getDiagnostics()->error(DiagMessage(src) << "invalid XML attribute '"
-                                              << attr->value << "'");
-            mError = true;
-            return;
-        }
-
-        const ResourceName& name = ref.value().name.value();
-
-        // Use an empty string for the compilation package because we don't want to default to
-        // the local package if the user specified name="style" or something. This should just
-        // be the default namespace.
-        Maybe<xml::ExtractedPackage> maybePkg = transformPackageAlias(name.package, {});
-        if (!maybePkg) {
-            mContext->getDiagnostics()->error(DiagMessage(src) << "invalid namespace prefix '"
-                                              << name.package << "'");
-            mError = true;
-            return;
-        }
-
-        const xml::ExtractedPackage& pkg = maybePkg.value();
-        const bool privateNamespace = pkg.privateNamespace || ref.value().privateReference;
-
-        InlineDeclaration decl;
-        decl.el = el;
-        decl.attrName = name.entry;
-        if (!pkg.package.empty()) {
-            decl.attrNamespaceUri = xml::buildPackageNamespace(pkg.package, privateNamespace);
-        }
-
-        mInlineDeclarations.push_back(std::move(decl));
+    xml::Attribute* attr = el->findAttribute({}, "name");
+    if (!attr) {
+      mContext->getDiagnostics()->error(DiagMessage(src)
+                                        << "missing 'name' attribute");
+      mError = true;
+      return;
     }
 
-    const std::vector<InlineDeclaration>& getInlineDeclarations() const {
-        return mInlineDeclarations;
+    Maybe<Reference> ref = ResourceUtils::parseXmlAttributeName(attr->value);
+    if (!ref) {
+      mContext->getDiagnostics()->error(
+          DiagMessage(src) << "invalid XML attribute '" << attr->value << "'");
+      mError = true;
+      return;
     }
 
-    bool hasError() const {
-        return mError;
+    const ResourceName& name = ref.value().name.value();
+
+    // Use an empty string for the compilation package because we don't want to
+    // default to
+    // the local package if the user specified name="style" or something. This
+    // should just
+    // be the default namespace.
+    Maybe<xml::ExtractedPackage> maybePkg =
+        transformPackageAlias(name.package, {});
+    if (!maybePkg) {
+      mContext->getDiagnostics()->error(DiagMessage(src)
+                                        << "invalid namespace prefix '"
+                                        << name.package << "'");
+      mError = true;
+      return;
     }
 
-private:
-    DISALLOW_COPY_AND_ASSIGN(Visitor);
+    const xml::ExtractedPackage& pkg = maybePkg.value();
+    const bool privateNamespace =
+        pkg.privateNamespace || ref.value().privateReference;
 
-    IAaptContext* mContext;
-    xml::XmlResource* mXmlResource;
-    std::vector<InlineDeclaration> mInlineDeclarations;
-    bool mError = false;
+    InlineDeclaration decl;
+    decl.el = el;
+    decl.attrName = name.entry;
+    if (!pkg.package.empty()) {
+      decl.attrNamespaceUri =
+          xml::buildPackageNamespace(pkg.package, privateNamespace);
+    }
+
+    mInlineDeclarations.push_back(std::move(decl));
+  }
+
+  const std::vector<InlineDeclaration>& getInlineDeclarations() const {
+    return mInlineDeclarations;
+  }
+
+  bool hasError() const { return mError; }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(Visitor);
+
+  IAaptContext* mContext;
+  xml::XmlResource* mXmlResource;
+  std::vector<InlineDeclaration> mInlineDeclarations;
+  bool mError = false;
 };
 
-} // namespace
+}  // namespace
 
-bool InlineXmlFormatParser::consume(IAaptContext* context, xml::XmlResource* doc) {
-    Visitor visitor(context, doc);
-    doc->root->accept(&visitor);
-    if (visitor.hasError()) {
+bool InlineXmlFormatParser::consume(IAaptContext* context,
+                                    xml::XmlResource* doc) {
+  Visitor visitor(context, doc);
+  doc->root->accept(&visitor);
+  if (visitor.hasError()) {
+    return false;
+  }
+
+  size_t nameSuffixCounter = 0;
+  for (const Visitor::InlineDeclaration& decl :
+       visitor.getInlineDeclarations()) {
+    auto newDoc = util::make_unique<xml::XmlResource>();
+    newDoc->file.config = doc->file.config;
+    newDoc->file.source = doc->file.source.withLine(decl.el->lineNumber);
+    newDoc->file.name = doc->file.name;
+
+    // Modify the new entry name. We need to suffix the entry with a number to
+    // avoid
+    // local collisions, then mangle it with the empty package, such that it
+    // won't show up
+    // in R.java.
+
+    newDoc->file.name.entry = NameMangler::mangleEntry(
+        {}, newDoc->file.name.entry + "__" + std::to_string(nameSuffixCounter));
+
+    // Extracted elements must be the only child of <aapt:attr>.
+    // Make sure there is one root node in the children (ignore empty text).
+    for (auto& child : decl.el->children) {
+      const Source childSource = doc->file.source.withLine(child->lineNumber);
+      if (xml::Text* t = xml::nodeCast<xml::Text>(child.get())) {
+        if (!util::trimWhitespace(t->text).empty()) {
+          context->getDiagnostics()->error(
+              DiagMessage(childSource)
+              << "can't extract text into its own resource");
+          return false;
+        }
+      } else if (newDoc->root) {
+        context->getDiagnostics()->error(
+            DiagMessage(childSource)
+            << "inline XML resources must have a single root");
         return false;
+      } else {
+        newDoc->root = std::move(child);
+        newDoc->root->parent = nullptr;
+      }
     }
 
-    size_t nameSuffixCounter = 0;
-    for (const Visitor::InlineDeclaration& decl : visitor.getInlineDeclarations()) {
-        auto newDoc = util::make_unique<xml::XmlResource>();
-        newDoc->file.config = doc->file.config;
-        newDoc->file.source = doc->file.source.withLine(decl.el->lineNumber);
-        newDoc->file.name = doc->file.name;
-
-        // Modify the new entry name. We need to suffix the entry with a number to avoid
-        // local collisions, then mangle it with the empty package, such that it won't show up
-        // in R.java.
-
-        newDoc->file.name.entry = NameMangler::mangleEntry(
-                {}, newDoc->file.name.entry + "__" + std::to_string(nameSuffixCounter));
-
-        // Extracted elements must be the only child of <aapt:attr>.
-        // Make sure there is one root node in the children (ignore empty text).
-        for (auto& child : decl.el->children) {
-            const Source childSource = doc->file.source.withLine(child->lineNumber);
-            if (xml::Text* t = xml::nodeCast<xml::Text>(child.get())) {
-                if (!util::trimWhitespace(t->text).empty()) {
-                    context->getDiagnostics()->error(DiagMessage(childSource)
-                                                     << "can't extract text into its own resource");
-                    return false;
-                }
-            } else if (newDoc->root) {
-                context->getDiagnostics()->error(DiagMessage(childSource)
-                                                 << "inline XML resources must have a single root");
-                return false;
-            } else {
-                newDoc->root = std::move(child);
-                newDoc->root->parent = nullptr;
-            }
-        }
-
-        // Walk up and find the parent element.
-        xml::Node* node = decl.el;
-        xml::Element* parentEl = nullptr;
-        while (node->parent && (parentEl = xml::nodeCast<xml::Element>(node->parent)) == nullptr) {
-            node = node->parent;
-        }
-
-        if (!parentEl) {
-            context->getDiagnostics()->error(DiagMessage(newDoc->file.source)
-                                             << "no suitable parent for inheriting attribute");
-            return false;
-        }
-
-        // Add the inline attribute to the parent.
-        parentEl->attributes.push_back(xml::Attribute{
-                decl.attrNamespaceUri, decl.attrName, "@" + newDoc->file.name.toString() });
-
-        // Delete the subtree.
-        for (auto iter = parentEl->children.begin(); iter != parentEl->children.end(); ++iter) {
-            if (iter->get() == node) {
-                parentEl->children.erase(iter);
-                break;
-            }
-        }
-
-        mQueue.push_back(std::move(newDoc));
-
-        nameSuffixCounter++;
+    // Walk up and find the parent element.
+    xml::Node* node = decl.el;
+    xml::Element* parentEl = nullptr;
+    while (node->parent &&
+           (parentEl = xml::nodeCast<xml::Element>(node->parent)) == nullptr) {
+      node = node->parent;
     }
-    return true;
+
+    if (!parentEl) {
+      context->getDiagnostics()->error(
+          DiagMessage(newDoc->file.source)
+          << "no suitable parent for inheriting attribute");
+      return false;
+    }
+
+    // Add the inline attribute to the parent.
+    parentEl->attributes.push_back(
+        xml::Attribute{decl.attrNamespaceUri, decl.attrName,
+                       "@" + newDoc->file.name.toString()});
+
+    // Delete the subtree.
+    for (auto iter = parentEl->children.begin();
+         iter != parentEl->children.end(); ++iter) {
+      if (iter->get() == node) {
+        parentEl->children.erase(iter);
+        break;
+      }
+    }
+
+    mQueue.push_back(std::move(newDoc));
+
+    nameSuffixCounter++;
+  }
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/InlineXmlFormatParser.h b/tools/aapt2/compile/InlineXmlFormatParser.h
index 69065fd..cd8794b 100644
--- a/tools/aapt2/compile/InlineXmlFormatParser.h
+++ b/tools/aapt2/compile/InlineXmlFormatParser.h
@@ -41,25 +41,28 @@
  *   </aapt:attr>
  * </animated-vector>
  *
- * The <vector> will be extracted into its own XML file and <animated-vector> will
- * gain an attribute 'android:drawable' set to a reference to the extracted <vector> resource.
+ * The <vector> will be extracted into its own XML file and <animated-vector>
+ * will
+ * gain an attribute 'android:drawable' set to a reference to the extracted
+ * <vector> resource.
  */
 class InlineXmlFormatParser : public IXmlResourceConsumer {
-public:
-    explicit InlineXmlFormatParser() = default;
+ public:
+  explicit InlineXmlFormatParser() = default;
 
-    bool consume(IAaptContext* context, xml::XmlResource* doc) override;
+  bool consume(IAaptContext* context, xml::XmlResource* doc) override;
 
-    std::vector<std::unique_ptr<xml::XmlResource>>& getExtractedInlineXmlDocuments() {
-        return mQueue;
-    }
+  std::vector<std::unique_ptr<xml::XmlResource>>&
+  getExtractedInlineXmlDocuments() {
+    return mQueue;
+  }
 
-private:
-    DISALLOW_COPY_AND_ASSIGN(InlineXmlFormatParser);
+ private:
+  DISALLOW_COPY_AND_ASSIGN(InlineXmlFormatParser);
 
-    std::vector<std::unique_ptr<xml::XmlResource>> mQueue;
+  std::vector<std::unique_ptr<xml::XmlResource>> mQueue;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_COMPILE_INLINEXMLFORMATPARSER_H */
diff --git a/tools/aapt2/compile/InlineXmlFormatParser_test.cpp b/tools/aapt2/compile/InlineXmlFormatParser_test.cpp
index 8d62210..4adb21c 100644
--- a/tools/aapt2/compile/InlineXmlFormatParser_test.cpp
+++ b/tools/aapt2/compile/InlineXmlFormatParser_test.cpp
@@ -20,22 +20,22 @@
 namespace aapt {
 
 TEST(InlineXmlFormatParserTest, PassThrough) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
       <View xmlns:android="http://schemas.android.com/apk/res/android">
         <View android:text="hey">
           <View android:id="hi" />
         </View>
       </View>)EOF");
 
-    InlineXmlFormatParser parser;
-    ASSERT_TRUE(parser.consume(context.get(), doc.get()));
-    EXPECT_EQ(0u, parser.getExtractedInlineXmlDocuments().size());
+  InlineXmlFormatParser parser;
+  ASSERT_TRUE(parser.consume(context.get(), doc.get()));
+  EXPECT_EQ(0u, parser.getExtractedInlineXmlDocuments().size());
 }
 
 TEST(InlineXmlFormatParserTest, ExtractOneXmlResource) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
       <View1 xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:aapt="http://schemas.android.com/aapt">
         <aapt:attr name="android:text">
@@ -45,47 +45,48 @@
         </aapt:attr>
       </View1>)EOF");
 
-    doc->file.name = test::parseNameOrDie("layout/main");
+  doc->file.name = test::parseNameOrDie("layout/main");
 
-    InlineXmlFormatParser parser;
-    ASSERT_TRUE(parser.consume(context.get(), doc.get()));
+  InlineXmlFormatParser parser;
+  ASSERT_TRUE(parser.consume(context.get(), doc.get()));
 
-    // One XML resource should have been extracted.
-    EXPECT_EQ(1u, parser.getExtractedInlineXmlDocuments().size());
+  // One XML resource should have been extracted.
+  EXPECT_EQ(1u, parser.getExtractedInlineXmlDocuments().size());
 
-    xml::Element* el = xml::findRootElement(doc.get());
-    ASSERT_NE(nullptr, el);
+  xml::Element* el = xml::findRootElement(doc.get());
+  ASSERT_NE(nullptr, el);
 
-    EXPECT_EQ("View1", el->name);
+  EXPECT_EQ("View1", el->name);
 
-    // The <aapt:attr> tag should be extracted.
-    EXPECT_EQ(nullptr, el->findChild(xml::kSchemaAapt, "attr"));
+  // The <aapt:attr> tag should be extracted.
+  EXPECT_EQ(nullptr, el->findChild(xml::kSchemaAapt, "attr"));
 
-    // The 'android:text' attribute should be set with a reference.
-    xml::Attribute* attr = el->findAttribute(xml::kSchemaAndroid, "text");
-    ASSERT_NE(nullptr, attr);
+  // The 'android:text' attribute should be set with a reference.
+  xml::Attribute* attr = el->findAttribute(xml::kSchemaAndroid, "text");
+  ASSERT_NE(nullptr, attr);
 
-    ResourceNameRef nameRef;
-    ASSERT_TRUE(ResourceUtils::parseReference(attr->value, &nameRef));
+  ResourceNameRef nameRef;
+  ASSERT_TRUE(ResourceUtils::parseReference(attr->value, &nameRef));
 
-    xml::XmlResource* extractedDoc = parser.getExtractedInlineXmlDocuments()[0].get();
-    ASSERT_NE(nullptr, extractedDoc);
+  xml::XmlResource* extractedDoc =
+      parser.getExtractedInlineXmlDocuments()[0].get();
+  ASSERT_NE(nullptr, extractedDoc);
 
-    // Make sure the generated reference is correct.
-    EXPECT_EQ(nameRef.package, extractedDoc->file.name.package);
-    EXPECT_EQ(nameRef.type, extractedDoc->file.name.type);
-    EXPECT_EQ(nameRef.entry, extractedDoc->file.name.entry);
+  // Make sure the generated reference is correct.
+  EXPECT_EQ(nameRef.package, extractedDoc->file.name.package);
+  EXPECT_EQ(nameRef.type, extractedDoc->file.name.type);
+  EXPECT_EQ(nameRef.entry, extractedDoc->file.name.entry);
 
-    // Verify the structure of the extracted XML.
-    el = xml::findRootElement(extractedDoc);
-    ASSERT_NE(nullptr, el);
-    EXPECT_EQ("View2", el->name);
-    EXPECT_NE(nullptr, el->findChild({}, "View3"));
+  // Verify the structure of the extracted XML.
+  el = xml::findRootElement(extractedDoc);
+  ASSERT_NE(nullptr, el);
+  EXPECT_EQ("View2", el->name);
+  EXPECT_NE(nullptr, el->findChild({}, "View3"));
 }
 
 TEST(InlineXmlFormatParserTest, ExtractTwoXmlResources) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
       <View1 xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:aapt="http://schemas.android.com/aapt">
         <aapt:attr name="android:text">
@@ -99,40 +100,43 @@
         </aapt:attr>
       </View1>)EOF");
 
-    doc->file.name = test::parseNameOrDie("layout/main");
+  doc->file.name = test::parseNameOrDie("layout/main");
 
-    InlineXmlFormatParser parser;
-    ASSERT_TRUE(parser.consume(context.get(), doc.get()));
-    ASSERT_EQ(2u, parser.getExtractedInlineXmlDocuments().size());
+  InlineXmlFormatParser parser;
+  ASSERT_TRUE(parser.consume(context.get(), doc.get()));
+  ASSERT_EQ(2u, parser.getExtractedInlineXmlDocuments().size());
 
-    xml::Element* el = xml::findRootElement(doc.get());
-    ASSERT_NE(nullptr, el);
+  xml::Element* el = xml::findRootElement(doc.get());
+  ASSERT_NE(nullptr, el);
 
-    EXPECT_EQ("View1", el->name);
+  EXPECT_EQ("View1", el->name);
 
-    xml::Attribute* attrText = el->findAttribute(xml::kSchemaAndroid, "text");
-    ASSERT_NE(nullptr, attrText);
+  xml::Attribute* attrText = el->findAttribute(xml::kSchemaAndroid, "text");
+  ASSERT_NE(nullptr, attrText);
 
-    xml::Attribute* attrDrawable = el->findAttribute(xml::kSchemaAndroid, "drawable");
-    ASSERT_NE(nullptr, attrDrawable);
+  xml::Attribute* attrDrawable =
+      el->findAttribute(xml::kSchemaAndroid, "drawable");
+  ASSERT_NE(nullptr, attrDrawable);
 
-    // The two extracted resources should have different names.
-    EXPECT_NE(attrText->value, attrDrawable->value);
+  // The two extracted resources should have different names.
+  EXPECT_NE(attrText->value, attrDrawable->value);
 
-    // The child <aapt:attr> elements should be gone.
-    EXPECT_EQ(nullptr, el->findChild(xml::kSchemaAapt, "attr"));
+  // The child <aapt:attr> elements should be gone.
+  EXPECT_EQ(nullptr, el->findChild(xml::kSchemaAapt, "attr"));
 
-    xml::XmlResource* extractedDocText = parser.getExtractedInlineXmlDocuments()[0].get();
-    ASSERT_NE(nullptr, extractedDocText);
-    el = xml::findRootElement(extractedDocText);
-    ASSERT_NE(nullptr, el);
-    EXPECT_EQ("View2", el->name);
+  xml::XmlResource* extractedDocText =
+      parser.getExtractedInlineXmlDocuments()[0].get();
+  ASSERT_NE(nullptr, extractedDocText);
+  el = xml::findRootElement(extractedDocText);
+  ASSERT_NE(nullptr, el);
+  EXPECT_EQ("View2", el->name);
 
-    xml::XmlResource* extractedDocDrawable = parser.getExtractedInlineXmlDocuments()[1].get();
-    ASSERT_NE(nullptr, extractedDocDrawable);
-    el = xml::findRootElement(extractedDocDrawable);
-    ASSERT_NE(nullptr, el);
-    EXPECT_EQ("vector", el->name);
+  xml::XmlResource* extractedDocDrawable =
+      parser.getExtractedInlineXmlDocuments()[1].get();
+  ASSERT_NE(nullptr, extractedDocDrawable);
+  el = xml::findRootElement(extractedDocDrawable);
+  ASSERT_NE(nullptr, el);
+  EXPECT_EQ("vector", el->name);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/NinePatch.cpp b/tools/aapt2/compile/NinePatch.cpp
index 0fc1c5d..8842eb7 100644
--- a/tools/aapt2/compile/NinePatch.cpp
+++ b/tools/aapt2/compile/NinePatch.cpp
@@ -28,7 +28,7 @@
 // Colors in the format 0xAARRGGBB (the way 9-patch expects it).
 constexpr static const uint32_t kColorOpaqueWhite = 0xffffffffu;
 constexpr static const uint32_t kColorOpaqueBlack = 0xff000000u;
-constexpr static const uint32_t kColorOpaqueRed   = 0xffff0000u;
+constexpr static const uint32_t kColorOpaqueRed = 0xffff0000u;
 
 constexpr static const uint32_t kPrimaryColor = kColorOpaqueBlack;
 constexpr static const uint32_t kSecondaryColor = kColorOpaqueRed;
@@ -46,35 +46,37 @@
  * but we need to ensure consistency throughout the image.
  */
 class ColorValidator {
-public:
-    virtual ~ColorValidator() = default;
+ public:
+  virtual ~ColorValidator() = default;
 
-    /**
-     * Returns true if the color specified is a neutral color
-     * (no padding, stretching, or optical bounds).
-     */
-    virtual bool isNeutralColor(uint32_t color) const = 0;
+  /**
+   * Returns true if the color specified is a neutral color
+   * (no padding, stretching, or optical bounds).
+   */
+  virtual bool isNeutralColor(uint32_t color) const = 0;
 
-    /**
-     * Returns true if the color is either a neutral color
-     * or one denoting padding, stretching, or optical bounds.
-     */
-    bool isValidColor(uint32_t color) const {
-        switch (color) {
-        case kPrimaryColor:
-        case kSecondaryColor:
-            return true;
-        }
-        return isNeutralColor(color);
+  /**
+   * Returns true if the color is either a neutral color
+   * or one denoting padding, stretching, or optical bounds.
+   */
+  bool isValidColor(uint32_t color) const {
+    switch (color) {
+      case kPrimaryColor:
+      case kSecondaryColor:
+        return true;
     }
+    return isNeutralColor(color);
+  }
 };
 
 // Walks an ImageLine and records Ranges of primary and secondary colors.
-// The primary color is black and is used to denote a padding or stretching range,
+// The primary color is black and is used to denote a padding or stretching
+// range,
 // depending on which border we're iterating over.
 // The secondary color is red and is used to denote optical bounds.
 //
-// An ImageLine is a templated-interface that would look something like this if it
+// An ImageLine is a templated-interface that would look something like this if
+// it
 // were polymorphic:
 //
 // class ImageLine {
@@ -87,590 +89,604 @@
 static bool fillRanges(const ImageLine* imageLine,
                        const ColorValidator* colorValidator,
                        std::vector<Range>* primaryRanges,
-                       std::vector<Range>* secondaryRanges,
-                       std::string* err) {
-    const int32_t length = imageLine->getLength();
+                       std::vector<Range>* secondaryRanges, std::string* err) {
+  const int32_t length = imageLine->getLength();
 
-    uint32_t lastColor = 0xffffffffu;
-    for (int32_t idx = 1; idx < length - 1; idx++) {
-        const uint32_t color = imageLine->getColor(idx);
-        if (!colorValidator->isValidColor(color)) {
-            *err = "found an invalid color";
-            return false;
-        }
-
-        if (color != lastColor) {
-            // We are ending a range. Which range?
-            // note: encode the x offset without the final 1 pixel border.
-            if (lastColor == kPrimaryColor) {
-                primaryRanges->back().end = idx - 1;
-            } else if (lastColor == kSecondaryColor) {
-                secondaryRanges->back().end = idx - 1;
-            }
-
-            // We are starting a range. Which range?
-            // note: encode the x offset without the final 1 pixel border.
-            if (color == kPrimaryColor) {
-                primaryRanges->push_back(Range(idx - 1, length - 2));
-            } else if (color == kSecondaryColor) {
-                secondaryRanges->push_back(Range(idx - 1, length - 2));
-            }
-            lastColor = color;
-        }
+  uint32_t lastColor = 0xffffffffu;
+  for (int32_t idx = 1; idx < length - 1; idx++) {
+    const uint32_t color = imageLine->getColor(idx);
+    if (!colorValidator->isValidColor(color)) {
+      *err = "found an invalid color";
+      return false;
     }
-    return true;
+
+    if (color != lastColor) {
+      // We are ending a range. Which range?
+      // note: encode the x offset without the final 1 pixel border.
+      if (lastColor == kPrimaryColor) {
+        primaryRanges->back().end = idx - 1;
+      } else if (lastColor == kSecondaryColor) {
+        secondaryRanges->back().end = idx - 1;
+      }
+
+      // We are starting a range. Which range?
+      // note: encode the x offset without the final 1 pixel border.
+      if (color == kPrimaryColor) {
+        primaryRanges->push_back(Range(idx - 1, length - 2));
+      } else if (color == kSecondaryColor) {
+        secondaryRanges->push_back(Range(idx - 1, length - 2));
+      }
+      lastColor = color;
+    }
+  }
+  return true;
 }
 
 /**
- * Iterates over a row in an image. Implements the templated ImageLine interface.
+ * Iterates over a row in an image. Implements the templated ImageLine
+ * interface.
  */
 class HorizontalImageLine {
-public:
-    explicit HorizontalImageLine(uint8_t** rows, int32_t xOffset, int32_t yOffset,
-                                 int32_t length) :
-            mRows(rows), mXOffset(xOffset), mYOffset(yOffset), mLength(length) {
-    }
+ public:
+  explicit HorizontalImageLine(uint8_t** rows, int32_t xOffset, int32_t yOffset,
+                               int32_t length)
+      : mRows(rows), mXOffset(xOffset), mYOffset(yOffset), mLength(length) {}
 
-    inline int32_t getLength() const {
-        return mLength;
-    }
+  inline int32_t getLength() const { return mLength; }
 
-    inline uint32_t getColor(int32_t idx) const {
-        return NinePatch::packRGBA(mRows[mYOffset] + (idx + mXOffset) * 4);
-    }
+  inline uint32_t getColor(int32_t idx) const {
+    return NinePatch::packRGBA(mRows[mYOffset] + (idx + mXOffset) * 4);
+  }
 
-private:
-    uint8_t** mRows;
-    int32_t mXOffset, mYOffset, mLength;
+ private:
+  uint8_t** mRows;
+  int32_t mXOffset, mYOffset, mLength;
 
-    DISALLOW_COPY_AND_ASSIGN(HorizontalImageLine);
+  DISALLOW_COPY_AND_ASSIGN(HorizontalImageLine);
 };
 
 /**
- * Iterates over a column in an image. Implements the templated ImageLine interface.
+ * Iterates over a column in an image. Implements the templated ImageLine
+ * interface.
  */
 class VerticalImageLine {
-public:
-    explicit VerticalImageLine(uint8_t** rows, int32_t xOffset, int32_t yOffset,
-                               int32_t length) :
-            mRows(rows), mXOffset(xOffset), mYOffset(yOffset), mLength(length) {
-    }
+ public:
+  explicit VerticalImageLine(uint8_t** rows, int32_t xOffset, int32_t yOffset,
+                             int32_t length)
+      : mRows(rows), mXOffset(xOffset), mYOffset(yOffset), mLength(length) {}
 
-    inline int32_t getLength() const {
-        return mLength;
-    }
+  inline int32_t getLength() const { return mLength; }
 
-    inline uint32_t getColor(int32_t idx) const {
-        return NinePatch::packRGBA(mRows[mYOffset + idx] + (mXOffset * 4));
-    }
+  inline uint32_t getColor(int32_t idx) const {
+    return NinePatch::packRGBA(mRows[mYOffset + idx] + (mXOffset * 4));
+  }
 
-private:
-    uint8_t** mRows;
-    int32_t mXOffset, mYOffset, mLength;
+ private:
+  uint8_t** mRows;
+  int32_t mXOffset, mYOffset, mLength;
 
-    DISALLOW_COPY_AND_ASSIGN(VerticalImageLine);
+  DISALLOW_COPY_AND_ASSIGN(VerticalImageLine);
 };
 
 class DiagonalImageLine {
-public:
-    explicit DiagonalImageLine(uint8_t** rows, int32_t xOffset, int32_t yOffset,
-                               int32_t xStep, int32_t yStep, int32_t length) :
-            mRows(rows), mXOffset(xOffset), mYOffset(yOffset), mXStep(xStep), mYStep(yStep),
-            mLength(length) {
-    }
+ public:
+  explicit DiagonalImageLine(uint8_t** rows, int32_t xOffset, int32_t yOffset,
+                             int32_t xStep, int32_t yStep, int32_t length)
+      : mRows(rows),
+        mXOffset(xOffset),
+        mYOffset(yOffset),
+        mXStep(xStep),
+        mYStep(yStep),
+        mLength(length) {}
 
-    inline int32_t getLength() const {
-        return mLength;
-    }
+  inline int32_t getLength() const { return mLength; }
 
-    inline uint32_t getColor(int32_t idx) const {
-        return NinePatch::packRGBA(
-                mRows[mYOffset + (idx * mYStep)] + ((idx + mXOffset) * mXStep) * 4);
-    }
+  inline uint32_t getColor(int32_t idx) const {
+    return NinePatch::packRGBA(mRows[mYOffset + (idx * mYStep)] +
+                               ((idx + mXOffset) * mXStep) * 4);
+  }
 
-private:
-    uint8_t** mRows;
-    int32_t mXOffset, mYOffset, mXStep, mYStep, mLength;
+ private:
+  uint8_t** mRows;
+  int32_t mXOffset, mYOffset, mXStep, mYStep, mLength;
 
-    DISALLOW_COPY_AND_ASSIGN(DiagonalImageLine);
+  DISALLOW_COPY_AND_ASSIGN(DiagonalImageLine);
 };
 
 class TransparentNeutralColorValidator : public ColorValidator {
-public:
-    bool isNeutralColor(uint32_t color) const override {
-        return getAlpha(color) == 0;
-    }
+ public:
+  bool isNeutralColor(uint32_t color) const override {
+    return getAlpha(color) == 0;
+  }
 };
 
 class WhiteNeutralColorValidator : public ColorValidator {
-public:
-    bool isNeutralColor(uint32_t color) const override {
-        return color == kColorOpaqueWhite;
-    }
+ public:
+  bool isNeutralColor(uint32_t color) const override {
+    return color == kColorOpaqueWhite;
+  }
 };
 
 inline static uint32_t getAlpha(uint32_t color) {
-    return (color & 0xff000000u) >> 24;
+  return (color & 0xff000000u) >> 24;
 }
 
 static bool populateBounds(const std::vector<Range>& padding,
                            const std::vector<Range>& layoutBounds,
                            const std::vector<Range>& stretchRegions,
-                           const int32_t length,
-                           int32_t* paddingStart, int32_t* paddingEnd,
-                           int32_t* layoutStart, int32_t* layoutEnd,
-                           const StringPiece& edgeName,
+                           const int32_t length, int32_t* paddingStart,
+                           int32_t* paddingEnd, int32_t* layoutStart,
+                           int32_t* layoutEnd, const StringPiece& edgeName,
                            std::string* err) {
-    if (padding.size() > 1) {
+  if (padding.size() > 1) {
+    std::stringstream errStream;
+    errStream << "too many padding sections on " << edgeName << " border";
+    *err = errStream.str();
+    return false;
+  }
+
+  *paddingStart = 0;
+  *paddingEnd = 0;
+  if (!padding.empty()) {
+    const Range& range = padding.front();
+    *paddingStart = range.start;
+    *paddingEnd = length - range.end;
+  } else if (!stretchRegions.empty()) {
+    // No padding was defined. Compute the padding from the first and last
+    // stretch regions.
+    *paddingStart = stretchRegions.front().start;
+    *paddingEnd = length - stretchRegions.back().end;
+  }
+
+  if (layoutBounds.size() > 2) {
+    std::stringstream errStream;
+    errStream << "too many layout bounds sections on " << edgeName << " border";
+    *err = errStream.str();
+    return false;
+  }
+
+  *layoutStart = 0;
+  *layoutEnd = 0;
+  if (layoutBounds.size() >= 1) {
+    const Range& range = layoutBounds.front();
+    // If there is only one layout bound segment, it might not start at 0, but
+    // then it should
+    // end at length.
+    if (range.start != 0 && range.end != length) {
+      std::stringstream errStream;
+      errStream << "layout bounds on " << edgeName
+                << " border must start at edge";
+      *err = errStream.str();
+      return false;
+    }
+    *layoutStart = range.end;
+
+    if (layoutBounds.size() >= 2) {
+      const Range& range = layoutBounds.back();
+      if (range.end != length) {
         std::stringstream errStream;
-        errStream << "too many padding sections on " << edgeName << " border";
+        errStream << "layout bounds on " << edgeName
+                  << " border must start at edge";
         *err = errStream.str();
         return false;
+      }
+      *layoutEnd = length - range.start;
     }
-
-    *paddingStart = 0;
-    *paddingEnd = 0;
-    if (!padding.empty()) {
-        const Range& range = padding.front();
-        *paddingStart = range.start;
-        *paddingEnd = length - range.end;
-    } else if (!stretchRegions.empty()) {
-        // No padding was defined. Compute the padding from the first and last
-        // stretch regions.
-        *paddingStart = stretchRegions.front().start;
-        *paddingEnd = length - stretchRegions.back().end;
-    }
-
-    if (layoutBounds.size() > 2) {
-        std::stringstream errStream;
-        errStream << "too many layout bounds sections on " << edgeName << " border";
-        *err = errStream.str();
-        return false;
-    }
-
-    *layoutStart = 0;
-    *layoutEnd = 0;
-    if (layoutBounds.size() >= 1) {
-        const Range& range = layoutBounds.front();
-        // If there is only one layout bound segment, it might not start at 0, but then it should
-        // end at length.
-        if (range.start != 0 && range.end != length) {
-            std::stringstream errStream;
-            errStream << "layout bounds on " << edgeName << " border must start at edge";
-            *err = errStream.str();
-            return false;
-        }
-        *layoutStart = range.end;
-
-        if (layoutBounds.size() >= 2) {
-            const Range& range = layoutBounds.back();
-            if (range.end != length) {
-                std::stringstream errStream;
-                errStream << "layout bounds on " << edgeName << " border must start at edge";
-                *err = errStream.str();
-                return false;
-            }
-            *layoutEnd = length - range.start;
-        }
-    }
-    return true;
+  }
+  return true;
 }
 
-static int32_t calculateSegmentCount(const std::vector<Range>& stretchRegions, int32_t length) {
-    if (stretchRegions.size() == 0) {
-        return 0;
-    }
+static int32_t calculateSegmentCount(const std::vector<Range>& stretchRegions,
+                                     int32_t length) {
+  if (stretchRegions.size() == 0) {
+    return 0;
+  }
 
-    const bool startIsFixed = stretchRegions.front().start != 0;
-    const bool endIsFixed = stretchRegions.back().end != length;
-    int32_t modifier = 0;
-    if (startIsFixed && endIsFixed) {
-        modifier = 1;
-    } else if (!startIsFixed && !endIsFixed) {
-        modifier = -1;
-    }
-    return static_cast<int32_t>(stretchRegions.size()) * 2 + modifier;
+  const bool startIsFixed = stretchRegions.front().start != 0;
+  const bool endIsFixed = stretchRegions.back().end != length;
+  int32_t modifier = 0;
+  if (startIsFixed && endIsFixed) {
+    modifier = 1;
+  } else if (!startIsFixed && !endIsFixed) {
+    modifier = -1;
+  }
+  return static_cast<int32_t>(stretchRegions.size()) * 2 + modifier;
 }
 
 static uint32_t getRegionColor(uint8_t** rows, const Bounds& region) {
-    // Sample the first pixel to compare against.
-    const uint32_t expectedColor = NinePatch::packRGBA(rows[region.top] + region.left * 4);
-    for (int32_t y = region.top; y < region.bottom; y++) {
-        const uint8_t* row = rows[y];
-        for (int32_t x = region.left; x < region.right; x++) {
-            const uint32_t color = NinePatch::packRGBA(row + x * 4);
-            if (getAlpha(color) == 0) {
-                // The color is transparent.
-                // If the expectedColor is not transparent, NO_COLOR.
-                if (getAlpha(expectedColor) != 0) {
-                    return android::Res_png_9patch::NO_COLOR;
-                }
-            } else if (color != expectedColor) {
-                return android::Res_png_9patch::NO_COLOR;
-            }
+  // Sample the first pixel to compare against.
+  const uint32_t expectedColor =
+      NinePatch::packRGBA(rows[region.top] + region.left * 4);
+  for (int32_t y = region.top; y < region.bottom; y++) {
+    const uint8_t* row = rows[y];
+    for (int32_t x = region.left; x < region.right; x++) {
+      const uint32_t color = NinePatch::packRGBA(row + x * 4);
+      if (getAlpha(color) == 0) {
+        // The color is transparent.
+        // If the expectedColor is not transparent, NO_COLOR.
+        if (getAlpha(expectedColor) != 0) {
+          return android::Res_png_9patch::NO_COLOR;
         }
+      } else if (color != expectedColor) {
+        return android::Res_png_9patch::NO_COLOR;
+      }
     }
+  }
 
-    if (getAlpha(expectedColor) == 0) {
-        return android::Res_png_9patch::TRANSPARENT_COLOR;
-    }
-    return expectedColor;
+  if (getAlpha(expectedColor) == 0) {
+    return android::Res_png_9patch::TRANSPARENT_COLOR;
+  }
+  return expectedColor;
 }
 
-// Fills outColors with each 9-patch section's colour. If the whole section is transparent,
-// it gets the special TRANSPARENT colour. If the whole section is the same colour, it is assigned
+// Fills outColors with each 9-patch section's colour. If the whole section is
+// transparent,
+// it gets the special TRANSPARENT colour. If the whole section is the same
+// colour, it is assigned
 // that colour. Otherwise it gets the special NO_COLOR colour.
 //
-// Note that the rows contain the 9-patch 1px border, and the indices in the stretch regions are
-// already offset to exclude the border. This means that each time the rows are accessed,
+// Note that the rows contain the 9-patch 1px border, and the indices in the
+// stretch regions are
+// already offset to exclude the border. This means that each time the rows are
+// accessed,
 // the indices must be offset by 1.
 //
 // width and height also include the 9-patch 1px border.
-static void calculateRegionColors(uint8_t** rows,
-                                  const std::vector<Range>& horizontalStretchRegions,
-                                  const std::vector<Range>& verticalStretchRegions,
-                                  const int32_t width, const int32_t height,
-                                  std::vector<uint32_t>* outColors) {
-    int32_t nextTop = 0;
-    Bounds bounds;
-    auto rowIter = verticalStretchRegions.begin();
-    while (nextTop != height) {
-        if (rowIter != verticalStretchRegions.end()) {
-            if (nextTop != rowIter->start) {
-                // This is a fixed segment.
-                // Offset the bounds by 1 to accommodate the border.
-                bounds.top = nextTop + 1;
-                bounds.bottom = rowIter->start + 1;
-                nextTop = rowIter->start;
-            } else {
-                // This is a stretchy segment.
-                // Offset the bounds by 1 to accommodate the border.
-                bounds.top = rowIter->start + 1;
-                bounds.bottom = rowIter->end + 1;
-                nextTop = rowIter->end;
-                ++rowIter;
-            }
-        } else {
-            // This is the end, fixed section.
-            // Offset the bounds by 1 to accommodate the border.
-            bounds.top = nextTop + 1;
-            bounds.bottom = height + 1;
-            nextTop = height;
-         }
-
-        int32_t nextLeft = 0;
-        auto colIter = horizontalStretchRegions.begin();
-        while (nextLeft != width) {
-            if (colIter != horizontalStretchRegions.end()) {
-                if (nextLeft != colIter->start) {
-                    // This is a fixed segment.
-                    // Offset the bounds by 1 to accommodate the border.
-                    bounds.left = nextLeft + 1;
-                    bounds.right = colIter->start + 1;
-                    nextLeft = colIter->start;
-                } else {
-                    // This is a stretchy segment.
-                    // Offset the bounds by 1 to accommodate the border.
-                    bounds.left = colIter->start + 1;
-                    bounds.right = colIter->end + 1;
-                    nextLeft = colIter->end;
-                    ++colIter;
-                }
-            } else {
-                // This is the end, fixed section.
-                // Offset the bounds by 1 to accommodate the border.
-                bounds.left = nextLeft + 1;
-                bounds.right = width + 1;
-                nextLeft = width;
-            }
-            outColors->push_back(getRegionColor(rows, bounds));
-        }
+static void calculateRegionColors(
+    uint8_t** rows, const std::vector<Range>& horizontalStretchRegions,
+    const std::vector<Range>& verticalStretchRegions, const int32_t width,
+    const int32_t height, std::vector<uint32_t>* outColors) {
+  int32_t nextTop = 0;
+  Bounds bounds;
+  auto rowIter = verticalStretchRegions.begin();
+  while (nextTop != height) {
+    if (rowIter != verticalStretchRegions.end()) {
+      if (nextTop != rowIter->start) {
+        // This is a fixed segment.
+        // Offset the bounds by 1 to accommodate the border.
+        bounds.top = nextTop + 1;
+        bounds.bottom = rowIter->start + 1;
+        nextTop = rowIter->start;
+      } else {
+        // This is a stretchy segment.
+        // Offset the bounds by 1 to accommodate the border.
+        bounds.top = rowIter->start + 1;
+        bounds.bottom = rowIter->end + 1;
+        nextTop = rowIter->end;
+        ++rowIter;
+      }
+    } else {
+      // This is the end, fixed section.
+      // Offset the bounds by 1 to accommodate the border.
+      bounds.top = nextTop + 1;
+      bounds.bottom = height + 1;
+      nextTop = height;
     }
+
+    int32_t nextLeft = 0;
+    auto colIter = horizontalStretchRegions.begin();
+    while (nextLeft != width) {
+      if (colIter != horizontalStretchRegions.end()) {
+        if (nextLeft != colIter->start) {
+          // This is a fixed segment.
+          // Offset the bounds by 1 to accommodate the border.
+          bounds.left = nextLeft + 1;
+          bounds.right = colIter->start + 1;
+          nextLeft = colIter->start;
+        } else {
+          // This is a stretchy segment.
+          // Offset the bounds by 1 to accommodate the border.
+          bounds.left = colIter->start + 1;
+          bounds.right = colIter->end + 1;
+          nextLeft = colIter->end;
+          ++colIter;
+        }
+      } else {
+        // This is the end, fixed section.
+        // Offset the bounds by 1 to accommodate the border.
+        bounds.left = nextLeft + 1;
+        bounds.right = width + 1;
+        nextLeft = width;
+      }
+      outColors->push_back(getRegionColor(rows, bounds));
+    }
+  }
 }
 
-// Calculates the insets of a row/column of pixels based on where the largest alpha value begins
+// Calculates the insets of a row/column of pixels based on where the largest
+// alpha value begins
 // (on both sides).
 template <typename ImageLine>
-static void findOutlineInsets(const ImageLine* imageLine, int32_t* outStart, int32_t* outEnd) {
-    *outStart = 0;
-    *outEnd = 0;
+static void findOutlineInsets(const ImageLine* imageLine, int32_t* outStart,
+                              int32_t* outEnd) {
+  *outStart = 0;
+  *outEnd = 0;
 
-    const int32_t length = imageLine->getLength();
-    if (length < 3) {
-        return;
-    }
-
-    // If the length is odd, we want both sides to process the center pixel,
-    // so we use two different midpoints (to account for < and <= in the different loops).
-    const int32_t mid2 = length / 2;
-    const int32_t mid1 = mid2 + (length % 2);
-
-    uint32_t maxAlpha = 0;
-    for (int32_t i = 0; i < mid1 && maxAlpha != 0xff; i++) {
-        uint32_t alpha = getAlpha(imageLine->getColor(i));
-        if (alpha > maxAlpha) {
-            maxAlpha = alpha;
-            *outStart = i;
-        }
-    }
-
-    maxAlpha = 0;
-    for (int32_t i = length - 1; i >= mid2 && maxAlpha != 0xff; i--) {
-        uint32_t alpha = getAlpha(imageLine->getColor(i));
-        if (alpha > maxAlpha) {
-            maxAlpha = alpha;
-            *outEnd = length - (i + 1);
-        }
-    }
+  const int32_t length = imageLine->getLength();
+  if (length < 3) {
     return;
+  }
+
+  // If the length is odd, we want both sides to process the center pixel,
+  // so we use two different midpoints (to account for < and <= in the different
+  // loops).
+  const int32_t mid2 = length / 2;
+  const int32_t mid1 = mid2 + (length % 2);
+
+  uint32_t maxAlpha = 0;
+  for (int32_t i = 0; i < mid1 && maxAlpha != 0xff; i++) {
+    uint32_t alpha = getAlpha(imageLine->getColor(i));
+    if (alpha > maxAlpha) {
+      maxAlpha = alpha;
+      *outStart = i;
+    }
+  }
+
+  maxAlpha = 0;
+  for (int32_t i = length - 1; i >= mid2 && maxAlpha != 0xff; i--) {
+    uint32_t alpha = getAlpha(imageLine->getColor(i));
+    if (alpha > maxAlpha) {
+      maxAlpha = alpha;
+      *outEnd = length - (i + 1);
+    }
+  }
+  return;
 }
 
 template <typename ImageLine>
 static uint32_t findMaxAlpha(const ImageLine* imageLine) {
-    const int32_t length = imageLine->getLength();
-    uint32_t maxAlpha = 0;
-    for (int32_t idx = 0; idx < length && maxAlpha != 0xff; idx++) {
-        uint32_t alpha = getAlpha(imageLine->getColor(idx));
-        if (alpha > maxAlpha) {
-            maxAlpha = alpha;
-        }
+  const int32_t length = imageLine->getLength();
+  uint32_t maxAlpha = 0;
+  for (int32_t idx = 0; idx < length && maxAlpha != 0xff; idx++) {
+    uint32_t alpha = getAlpha(imageLine->getColor(idx));
+    if (alpha > maxAlpha) {
+      maxAlpha = alpha;
     }
-    return maxAlpha;
+  }
+  return maxAlpha;
 }
 
 // Pack the pixels in as 0xAARRGGBB (as 9-patch expects it).
 uint32_t NinePatch::packRGBA(const uint8_t* pixel) {
-    return (pixel[3] << 24) | (pixel[0] << 16) | (pixel[1] << 8) | pixel[2];
+  return (pixel[3] << 24) | (pixel[0] << 16) | (pixel[1] << 8) | pixel[2];
 }
 
 std::unique_ptr<NinePatch> NinePatch::create(uint8_t** rows,
-                                             const int32_t width, const int32_t height,
+                                             const int32_t width,
+                                             const int32_t height,
                                              std::string* err) {
-    if (width < 3 || height < 3) {
-        *err = "image must be at least 3x3 (1x1 image with 1 pixel border)";
-        return {};
-    }
+  if (width < 3 || height < 3) {
+    *err = "image must be at least 3x3 (1x1 image with 1 pixel border)";
+    return {};
+  }
 
-    std::vector<Range> horizontalPadding;
-    std::vector<Range> horizontalOpticalBounds;
-    std::vector<Range> verticalPadding;
-    std::vector<Range> verticalOpticalBounds;
-    std::vector<Range> unexpectedRanges;
-    std::unique_ptr<ColorValidator> colorValidator;
+  std::vector<Range> horizontalPadding;
+  std::vector<Range> horizontalOpticalBounds;
+  std::vector<Range> verticalPadding;
+  std::vector<Range> verticalOpticalBounds;
+  std::vector<Range> unexpectedRanges;
+  std::unique_ptr<ColorValidator> colorValidator;
 
-    if (rows[0][3] == 0) {
-        colorValidator = util::make_unique<TransparentNeutralColorValidator>();
-    } else if (packRGBA(rows[0]) == kColorOpaqueWhite) {
-        colorValidator = util::make_unique<WhiteNeutralColorValidator>();
-    } else {
-        *err = "top-left corner pixel must be either opaque white or transparent";
-        return {};
-    }
+  if (rows[0][3] == 0) {
+    colorValidator = util::make_unique<TransparentNeutralColorValidator>();
+  } else if (packRGBA(rows[0]) == kColorOpaqueWhite) {
+    colorValidator = util::make_unique<WhiteNeutralColorValidator>();
+  } else {
+    *err = "top-left corner pixel must be either opaque white or transparent";
+    return {};
+  }
 
-    // Private constructor, can't use make_unique.
-    auto ninePatch = std::unique_ptr<NinePatch>(new NinePatch());
+  // Private constructor, can't use make_unique.
+  auto ninePatch = std::unique_ptr<NinePatch>(new NinePatch());
 
-    HorizontalImageLine topRow(rows, 0, 0, width);
-    if (!fillRanges(&topRow, colorValidator.get(), &ninePatch->horizontalStretchRegions,
-                    &unexpectedRanges, err)) {
-        return {};
-    }
+  HorizontalImageLine topRow(rows, 0, 0, width);
+  if (!fillRanges(&topRow, colorValidator.get(),
+                  &ninePatch->horizontalStretchRegions, &unexpectedRanges,
+                  err)) {
+    return {};
+  }
 
-    if (!unexpectedRanges.empty()) {
-        const Range& range = unexpectedRanges[0];
-        std::stringstream errStream;
-        errStream << "found unexpected optical bounds (red pixel) on top border "
-                << "at x=" << range.start + 1;
-        *err = errStream.str();
-        return {};
-    }
+  if (!unexpectedRanges.empty()) {
+    const Range& range = unexpectedRanges[0];
+    std::stringstream errStream;
+    errStream << "found unexpected optical bounds (red pixel) on top border "
+              << "at x=" << range.start + 1;
+    *err = errStream.str();
+    return {};
+  }
 
-    VerticalImageLine leftCol(rows, 0, 0, height);
-    if (!fillRanges(&leftCol, colorValidator.get(), &ninePatch->verticalStretchRegions,
-                    &unexpectedRanges, err)) {
-        return {};
-    }
+  VerticalImageLine leftCol(rows, 0, 0, height);
+  if (!fillRanges(&leftCol, colorValidator.get(),
+                  &ninePatch->verticalStretchRegions, &unexpectedRanges, err)) {
+    return {};
+  }
 
-    if (!unexpectedRanges.empty()) {
-        const Range& range = unexpectedRanges[0];
-        std::stringstream errStream;
-        errStream << "found unexpected optical bounds (red pixel) on left border "
-                << "at y=" << range.start + 1;
-        return {};
-    }
+  if (!unexpectedRanges.empty()) {
+    const Range& range = unexpectedRanges[0];
+    std::stringstream errStream;
+    errStream << "found unexpected optical bounds (red pixel) on left border "
+              << "at y=" << range.start + 1;
+    return {};
+  }
 
-    HorizontalImageLine bottomRow(rows, 0, height - 1, width);
-    if (!fillRanges(&bottomRow, colorValidator.get(), &horizontalPadding,
-                    &horizontalOpticalBounds, err)) {
-        return {};
-    }
+  HorizontalImageLine bottomRow(rows, 0, height - 1, width);
+  if (!fillRanges(&bottomRow, colorValidator.get(), &horizontalPadding,
+                  &horizontalOpticalBounds, err)) {
+    return {};
+  }
 
-    if (!populateBounds(horizontalPadding, horizontalOpticalBounds,
-                        ninePatch->horizontalStretchRegions, width - 2,
-                        &ninePatch->padding.left, &ninePatch->padding.right,
-                        &ninePatch->layoutBounds.left, &ninePatch->layoutBounds.right,
-                        "bottom", err)) {
-        return {};
-    }
+  if (!populateBounds(horizontalPadding, horizontalOpticalBounds,
+                      ninePatch->horizontalStretchRegions, width - 2,
+                      &ninePatch->padding.left, &ninePatch->padding.right,
+                      &ninePatch->layoutBounds.left,
+                      &ninePatch->layoutBounds.right, "bottom", err)) {
+    return {};
+  }
 
-    VerticalImageLine rightCol(rows, width - 1, 0, height);
-    if (!fillRanges(&rightCol, colorValidator.get(), &verticalPadding,
-                    &verticalOpticalBounds, err)) {
-        return {};
-    }
+  VerticalImageLine rightCol(rows, width - 1, 0, height);
+  if (!fillRanges(&rightCol, colorValidator.get(), &verticalPadding,
+                  &verticalOpticalBounds, err)) {
+    return {};
+  }
 
-    if (!populateBounds(verticalPadding, verticalOpticalBounds,
-                        ninePatch->verticalStretchRegions, height - 2,
-                        &ninePatch->padding.top, &ninePatch->padding.bottom,
-                        &ninePatch->layoutBounds.top, &ninePatch->layoutBounds.bottom,
-                        "right", err)) {
-        return {};
-    }
+  if (!populateBounds(verticalPadding, verticalOpticalBounds,
+                      ninePatch->verticalStretchRegions, height - 2,
+                      &ninePatch->padding.top, &ninePatch->padding.bottom,
+                      &ninePatch->layoutBounds.top,
+                      &ninePatch->layoutBounds.bottom, "right", err)) {
+    return {};
+  }
 
-    // Fill the region colors of the 9-patch.
-    const int32_t numRows = calculateSegmentCount(ninePatch->horizontalStretchRegions, width - 2);
-    const int32_t numCols = calculateSegmentCount(ninePatch->verticalStretchRegions, height - 2);
-    if ((int64_t) numRows * (int64_t) numCols > 0x7f) {
-        *err = "too many regions in 9-patch";
-        return {};
-    }
+  // Fill the region colors of the 9-patch.
+  const int32_t numRows =
+      calculateSegmentCount(ninePatch->horizontalStretchRegions, width - 2);
+  const int32_t numCols =
+      calculateSegmentCount(ninePatch->verticalStretchRegions, height - 2);
+  if ((int64_t)numRows * (int64_t)numCols > 0x7f) {
+    *err = "too many regions in 9-patch";
+    return {};
+  }
 
-    ninePatch->regionColors.reserve(numRows * numCols);
-    calculateRegionColors(rows, ninePatch->horizontalStretchRegions,
-                          ninePatch->verticalStretchRegions,
-                          width - 2, height - 2,
-                          &ninePatch->regionColors);
+  ninePatch->regionColors.reserve(numRows * numCols);
+  calculateRegionColors(rows, ninePatch->horizontalStretchRegions,
+                        ninePatch->verticalStretchRegions, width - 2,
+                        height - 2, &ninePatch->regionColors);
 
-    // Compute the outline based on opacity.
+  // Compute the outline based on opacity.
 
-    // Find left and right extent of 9-patch content on center row.
-    HorizontalImageLine midRow(rows, 1, height / 2, width - 2);
-    findOutlineInsets(&midRow, &ninePatch->outline.left, &ninePatch->outline.right);
+  // Find left and right extent of 9-patch content on center row.
+  HorizontalImageLine midRow(rows, 1, height / 2, width - 2);
+  findOutlineInsets(&midRow, &ninePatch->outline.left,
+                    &ninePatch->outline.right);
 
-    // Find top and bottom extent of 9-patch content on center column.
-    VerticalImageLine midCol(rows, width / 2, 1, height - 2);
-    findOutlineInsets(&midCol, &ninePatch->outline.top, &ninePatch->outline.bottom);
+  // Find top and bottom extent of 9-patch content on center column.
+  VerticalImageLine midCol(rows, width / 2, 1, height - 2);
+  findOutlineInsets(&midCol, &ninePatch->outline.top,
+                    &ninePatch->outline.bottom);
 
-    const int32_t outlineWidth = (width - 2) - ninePatch->outline.left - ninePatch->outline.right;
-    const int32_t outlineHeight = (height - 2) - ninePatch->outline.top - ninePatch->outline.bottom;
+  const int32_t outlineWidth =
+      (width - 2) - ninePatch->outline.left - ninePatch->outline.right;
+  const int32_t outlineHeight =
+      (height - 2) - ninePatch->outline.top - ninePatch->outline.bottom;
 
-    // Find the largest alpha value within the outline area.
-    HorizontalImageLine outlineMidRow(rows,
-                                      1 + ninePatch->outline.left,
-                                      1 + ninePatch->outline.top + (outlineHeight / 2),
-                                      outlineWidth);
-    VerticalImageLine outlineMidCol(rows,
-                                    1 + ninePatch->outline.left + (outlineWidth / 2),
-                                    1 + ninePatch->outline.top,
-                                    outlineHeight);
-    ninePatch->outlineAlpha = std::max(findMaxAlpha(&outlineMidRow), findMaxAlpha(&outlineMidCol));
+  // Find the largest alpha value within the outline area.
+  HorizontalImageLine outlineMidRow(
+      rows, 1 + ninePatch->outline.left,
+      1 + ninePatch->outline.top + (outlineHeight / 2), outlineWidth);
+  VerticalImageLine outlineMidCol(
+      rows, 1 + ninePatch->outline.left + (outlineWidth / 2),
+      1 + ninePatch->outline.top, outlineHeight);
+  ninePatch->outlineAlpha =
+      std::max(findMaxAlpha(&outlineMidRow), findMaxAlpha(&outlineMidCol));
 
-    // Assuming the image is a round rect, compute the radius by marching
-    // diagonally from the top left corner towards the center.
-    DiagonalImageLine diagonal(rows, 1 + ninePatch->outline.left, 1 + ninePatch->outline.top,
-                               1, 1, std::min(outlineWidth, outlineHeight));
-    int32_t topLeft, bottomRight;
-    findOutlineInsets(&diagonal, &topLeft, &bottomRight);
+  // Assuming the image is a round rect, compute the radius by marching
+  // diagonally from the top left corner towards the center.
+  DiagonalImageLine diagonal(rows, 1 + ninePatch->outline.left,
+                             1 + ninePatch->outline.top, 1, 1,
+                             std::min(outlineWidth, outlineHeight));
+  int32_t topLeft, bottomRight;
+  findOutlineInsets(&diagonal, &topLeft, &bottomRight);
 
-    /* Determine source radius based upon inset:
-     *     sqrt(r^2 + r^2) = sqrt(i^2 + i^2) + r
-     *     sqrt(2) * r = sqrt(2) * i + r
-     *     (sqrt(2) - 1) * r = sqrt(2) * i
-     *     r = sqrt(2) / (sqrt(2) - 1) * i
-     */
-    ninePatch->outlineRadius = 3.4142f * topLeft;
-    return ninePatch;
+  /* Determine source radius based upon inset:
+   *     sqrt(r^2 + r^2) = sqrt(i^2 + i^2) + r
+   *     sqrt(2) * r = sqrt(2) * i + r
+   *     (sqrt(2) - 1) * r = sqrt(2) * i
+   *     r = sqrt(2) / (sqrt(2) - 1) * i
+   */
+  ninePatch->outlineRadius = 3.4142f * topLeft;
+  return ninePatch;
 }
 
 std::unique_ptr<uint8_t[]> NinePatch::serializeBase(size_t* outLen) const {
-    android::Res_png_9patch data;
-    data.numXDivs = static_cast<uint8_t>(horizontalStretchRegions.size()) * 2;
-    data.numYDivs = static_cast<uint8_t>(verticalStretchRegions.size()) * 2;
-    data.numColors = static_cast<uint8_t>(regionColors.size());
-    data.paddingLeft = padding.left;
-    data.paddingRight = padding.right;
-    data.paddingTop = padding.top;
-    data.paddingBottom = padding.bottom;
+  android::Res_png_9patch data;
+  data.numXDivs = static_cast<uint8_t>(horizontalStretchRegions.size()) * 2;
+  data.numYDivs = static_cast<uint8_t>(verticalStretchRegions.size()) * 2;
+  data.numColors = static_cast<uint8_t>(regionColors.size());
+  data.paddingLeft = padding.left;
+  data.paddingRight = padding.right;
+  data.paddingTop = padding.top;
+  data.paddingBottom = padding.bottom;
 
-    auto buffer = std::unique_ptr<uint8_t[]>(new uint8_t[data.serializedSize()]);
-    android::Res_png_9patch::serialize(data,
-                                       (const int32_t*) horizontalStretchRegions.data(),
-                                       (const int32_t*) verticalStretchRegions.data(),
-                                       regionColors.data(),
-                                       buffer.get());
-    // Convert to file endianness.
-    reinterpret_cast<android::Res_png_9patch*>(buffer.get())->deviceToFile();
+  auto buffer = std::unique_ptr<uint8_t[]>(new uint8_t[data.serializedSize()]);
+  android::Res_png_9patch::serialize(
+      data, (const int32_t*)horizontalStretchRegions.data(),
+      (const int32_t*)verticalStretchRegions.data(), regionColors.data(),
+      buffer.get());
+  // Convert to file endianness.
+  reinterpret_cast<android::Res_png_9patch*>(buffer.get())->deviceToFile();
 
-    *outLen = data.serializedSize();
-    return buffer;
+  *outLen = data.serializedSize();
+  return buffer;
 }
 
-std::unique_ptr<uint8_t[]> NinePatch::serializeLayoutBounds(size_t* outLen) const {
-    size_t chunkLen = sizeof(uint32_t) * 4;
-    auto buffer = std::unique_ptr<uint8_t[]>(new uint8_t[chunkLen]);
-    uint8_t* cursor = buffer.get();
+std::unique_ptr<uint8_t[]> NinePatch::serializeLayoutBounds(
+    size_t* outLen) const {
+  size_t chunkLen = sizeof(uint32_t) * 4;
+  auto buffer = std::unique_ptr<uint8_t[]>(new uint8_t[chunkLen]);
+  uint8_t* cursor = buffer.get();
 
-    memcpy(cursor, &layoutBounds.left, sizeof(layoutBounds.left));
-    cursor += sizeof(layoutBounds.left);
+  memcpy(cursor, &layoutBounds.left, sizeof(layoutBounds.left));
+  cursor += sizeof(layoutBounds.left);
 
-    memcpy(cursor, &layoutBounds.top, sizeof(layoutBounds.top));
-    cursor += sizeof(layoutBounds.top);
+  memcpy(cursor, &layoutBounds.top, sizeof(layoutBounds.top));
+  cursor += sizeof(layoutBounds.top);
 
-    memcpy(cursor, &layoutBounds.right, sizeof(layoutBounds.right));
-    cursor += sizeof(layoutBounds.right);
+  memcpy(cursor, &layoutBounds.right, sizeof(layoutBounds.right));
+  cursor += sizeof(layoutBounds.right);
 
-    memcpy(cursor, &layoutBounds.bottom, sizeof(layoutBounds.bottom));
-    cursor += sizeof(layoutBounds.bottom);
+  memcpy(cursor, &layoutBounds.bottom, sizeof(layoutBounds.bottom));
+  cursor += sizeof(layoutBounds.bottom);
 
-    *outLen = chunkLen;
-    return buffer;
+  *outLen = chunkLen;
+  return buffer;
 }
 
-std::unique_ptr<uint8_t[]> NinePatch::serializeRoundedRectOutline(size_t* outLen) const {
-    size_t chunkLen = sizeof(uint32_t) * 6;
-    auto buffer = std::unique_ptr<uint8_t[]>(new uint8_t[chunkLen]);
-    uint8_t* cursor = buffer.get();
+std::unique_ptr<uint8_t[]> NinePatch::serializeRoundedRectOutline(
+    size_t* outLen) const {
+  size_t chunkLen = sizeof(uint32_t) * 6;
+  auto buffer = std::unique_ptr<uint8_t[]>(new uint8_t[chunkLen]);
+  uint8_t* cursor = buffer.get();
 
-    memcpy(cursor, &outline.left, sizeof(outline.left));
-    cursor += sizeof(outline.left);
+  memcpy(cursor, &outline.left, sizeof(outline.left));
+  cursor += sizeof(outline.left);
 
-    memcpy(cursor, &outline.top, sizeof(outline.top));
-    cursor += sizeof(outline.top);
+  memcpy(cursor, &outline.top, sizeof(outline.top));
+  cursor += sizeof(outline.top);
 
-    memcpy(cursor, &outline.right, sizeof(outline.right));
-    cursor += sizeof(outline.right);
+  memcpy(cursor, &outline.right, sizeof(outline.right));
+  cursor += sizeof(outline.right);
 
-    memcpy(cursor, &outline.bottom, sizeof(outline.bottom));
-    cursor += sizeof(outline.bottom);
+  memcpy(cursor, &outline.bottom, sizeof(outline.bottom));
+  cursor += sizeof(outline.bottom);
 
-    *((float*) cursor) = outlineRadius;
-    cursor += sizeof(outlineRadius);
+  *((float*)cursor) = outlineRadius;
+  cursor += sizeof(outlineRadius);
 
-    *((uint32_t*) cursor) = outlineAlpha;
+  *((uint32_t*)cursor) = outlineAlpha;
 
-    *outLen = chunkLen;
-    return buffer;
+  *outLen = chunkLen;
+  return buffer;
 }
 
 ::std::ostream& operator<<(::std::ostream& out, const Range& range) {
-    return out << "[" << range.start << ", " << range.end << ")";
+  return out << "[" << range.start << ", " << range.end << ")";
 }
 
 ::std::ostream& operator<<(::std::ostream& out, const Bounds& bounds) {
-    return out << "l=" << bounds.left
-            << " t=" << bounds.top
-            << " r=" << bounds.right
-            << " b=" << bounds.bottom;
+  return out << "l=" << bounds.left << " t=" << bounds.top
+             << " r=" << bounds.right << " b=" << bounds.bottom;
 }
 
 ::std::ostream& operator<<(::std::ostream& out, const NinePatch& ninePatch) {
-    return out << "horizontalStretch:" << util::joiner(ninePatch.horizontalStretchRegions, " ")
-            << " verticalStretch:" << util::joiner(ninePatch.verticalStretchRegions, " ")
-            << " padding: " << ninePatch.padding
-            << ", bounds: " << ninePatch.layoutBounds
-            << ", outline: " << ninePatch.outline
-            << " rad=" << ninePatch.outlineRadius
-            << " alpha=" << ninePatch.outlineAlpha;
+  return out << "horizontalStretch:"
+             << util::joiner(ninePatch.horizontalStretchRegions, " ")
+             << " verticalStretch:"
+             << util::joiner(ninePatch.verticalStretchRegions, " ")
+             << " padding: " << ninePatch.padding
+             << ", bounds: " << ninePatch.layoutBounds
+             << ", outline: " << ninePatch.outline
+             << " rad=" << ninePatch.outlineRadius
+             << " alpha=" << ninePatch.outlineAlpha;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/NinePatch_test.cpp b/tools/aapt2/compile/NinePatch_test.cpp
index 3106ff8..b8eda09 100644
--- a/tools/aapt2/compile/NinePatch_test.cpp
+++ b/tools/aapt2/compile/NinePatch_test.cpp
@@ -21,8 +21,8 @@
 
 // Pixels are in RGBA_8888 packing.
 
-#define RED   "\xff\x00\x00\xff"
-#define BLUE  "\x00\x00\xff\xff"
+#define RED "\xff\x00\x00\xff"
+#define BLUE "\x00\x00\xff\xff"
 #define GREEN "\xff\x00\x00\xff"
 #define GR_70 "\xff\x00\x00\xb3"
 #define GR_50 "\xff\x00\x00\x80"
@@ -32,327 +32,346 @@
 #define TRANS "\x00\x00\x00\x00"
 
 static uint8_t* k2x2[] = {
-        (uint8_t*) WHITE WHITE,
-        (uint8_t*) WHITE WHITE,
+    (uint8_t*)WHITE WHITE, (uint8_t*)WHITE WHITE,
 };
 
 static uint8_t* kMixedNeutralColor3x3[] = {
-        (uint8_t*) WHITE BLACK TRANS,
-        (uint8_t*) TRANS RED   TRANS,
-        (uint8_t*) WHITE WHITE WHITE,
+    (uint8_t*)WHITE BLACK TRANS, (uint8_t*)TRANS RED TRANS,
+    (uint8_t*)WHITE WHITE WHITE,
 };
 
 static uint8_t* kTransparentNeutralColor3x3[] = {
-        (uint8_t*) TRANS BLACK TRANS,
-        (uint8_t*) BLACK RED   BLACK,
-        (uint8_t*) TRANS BLACK TRANS,
+    (uint8_t*)TRANS BLACK TRANS, (uint8_t*)BLACK RED BLACK,
+    (uint8_t*)TRANS BLACK TRANS,
 };
 
 static uint8_t* kSingleStretch7x6[] = {
-        (uint8_t*) WHITE WHITE BLACK BLACK BLACK WHITE WHITE,
-        (uint8_t*) WHITE RED   RED   RED   RED   RED   WHITE,
-        (uint8_t*) BLACK RED   RED   RED   RED   RED   WHITE,
-        (uint8_t*) BLACK RED   RED   RED   RED   RED   WHITE,
-        (uint8_t*) WHITE RED   RED   RED   RED   RED   WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE BLACK BLACK BLACK WHITE WHITE,
+    (uint8_t*)WHITE RED RED RED RED RED WHITE,
+    (uint8_t*)BLACK RED RED RED RED RED WHITE,
+    (uint8_t*)BLACK RED RED RED RED RED WHITE,
+    (uint8_t*)WHITE RED RED RED RED RED WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
 };
 
 static uint8_t* kMultipleStretch10x7[] = {
-        (uint8_t*) WHITE WHITE BLACK WHITE BLACK BLACK WHITE BLACK WHITE WHITE,
-        (uint8_t*) BLACK RED   BLUE  RED   BLUE  BLUE  RED   BLUE  RED   WHITE,
-        (uint8_t*) BLACK RED   BLUE  RED   BLUE  BLUE  RED   BLUE  RED   WHITE,
-        (uint8_t*) WHITE RED   BLUE  RED   BLUE  BLUE  RED   BLUE  RED   WHITE,
-        (uint8_t*) BLACK RED   BLUE  RED   BLUE  BLUE  RED   BLUE  RED   WHITE,
-        (uint8_t*) BLACK RED   BLUE  RED   BLUE  BLUE  RED   BLUE  RED   WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE BLACK WHITE BLACK BLACK WHITE BLACK WHITE WHITE,
+    (uint8_t*)BLACK RED BLUE RED BLUE BLUE RED BLUE RED WHITE,
+    (uint8_t*)BLACK RED BLUE RED BLUE BLUE RED BLUE RED WHITE,
+    (uint8_t*)WHITE RED BLUE RED BLUE BLUE RED BLUE RED WHITE,
+    (uint8_t*)BLACK RED BLUE RED BLUE BLUE RED BLUE RED WHITE,
+    (uint8_t*)BLACK RED BLUE RED BLUE BLUE RED BLUE RED WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
 };
 
 static uint8_t* kPadding6x5[] = {
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE BLACK,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE WHITE BLACK BLACK WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE BLACK,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE BLACK BLACK WHITE WHITE,
 };
 
 static uint8_t* kLayoutBoundsWrongEdge3x3[] = {
-        (uint8_t*) WHITE RED   WHITE,
-        (uint8_t*) RED   WHITE WHITE,
-        (uint8_t*) WHITE WHITE WHITE,
+    (uint8_t*)WHITE RED WHITE, (uint8_t*)RED WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE,
 };
 
 static uint8_t* kLayoutBoundsNotEdgeAligned5x5[] = {
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE RED,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE WHITE RED   WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE RED,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE RED WHITE WHITE,
 };
 
 static uint8_t* kLayoutBounds5x5[] = {
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE RED,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE RED,
-        (uint8_t*) WHITE RED   WHITE RED   WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE RED,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE RED,
+    (uint8_t*)WHITE RED WHITE RED WHITE,
 };
 
 static uint8_t* kAsymmetricLayoutBounds5x5[] = {
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE RED,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE RED   WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE RED,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE RED WHITE WHITE WHITE,
 };
 
 static uint8_t* kPaddingAndLayoutBounds5x5[] = {
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE RED,
-        (uint8_t*) WHITE WHITE WHITE WHITE BLACK,
-        (uint8_t*) WHITE WHITE WHITE WHITE RED,
-        (uint8_t*) WHITE RED   BLACK RED   WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE RED,
+    (uint8_t*)WHITE WHITE WHITE WHITE BLACK,
+    (uint8_t*)WHITE WHITE WHITE WHITE RED,
+    (uint8_t*)WHITE RED BLACK RED WHITE,
 };
 
 static uint8_t* kColorfulImage5x5[] = {
-        (uint8_t*) WHITE BLACK WHITE BLACK WHITE,
-        (uint8_t*) BLACK RED   BLUE  GREEN WHITE,
-        (uint8_t*) BLACK RED   GREEN GREEN WHITE,
-        (uint8_t*) WHITE TRANS BLUE  GREEN WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE BLACK WHITE BLACK WHITE,
+    (uint8_t*)BLACK RED BLUE GREEN WHITE,
+    (uint8_t*)BLACK RED GREEN GREEN WHITE,
+    (uint8_t*)WHITE TRANS BLUE GREEN WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
 };
 
 static uint8_t* kOutlineOpaque10x10[] = {
-        (uint8_t*) WHITE BLACK BLACK BLACK BLACK BLACK BLACK BLACK BLACK WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS GREEN GREEN GREEN GREEN TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS GREEN GREEN GREEN GREEN TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS GREEN GREEN GREEN GREEN TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS GREEN GREEN GREEN GREEN TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE BLACK BLACK BLACK BLACK BLACK BLACK BLACK BLACK WHITE,
+    (uint8_t*)WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS GREEN GREEN GREEN GREEN TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS GREEN GREEN GREEN GREEN TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS GREEN GREEN GREEN GREEN TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS GREEN GREEN GREEN GREEN TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
 };
 
 static uint8_t* kOutlineTranslucent10x10[] = {
-        (uint8_t*) WHITE BLACK BLACK BLACK BLACK BLACK BLACK BLACK BLACK WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
-        (uint8_t*) WHITE TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE BLACK BLACK BLACK BLACK BLACK BLACK BLACK BLACK WHITE,
+    (uint8_t*)WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
+    (uint8_t*)WHITE TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
+    (uint8_t*)WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
 };
 
 static uint8_t* kOutlineOffsetTranslucent12x10[] = {
-        (uint8_t*) WHITE WHITE WHITE BLACK BLACK BLACK BLACK BLACK BLACK BLACK BLACK WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
-        (uint8_t*) WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)
+        WHITE WHITE WHITE BLACK BLACK BLACK BLACK BLACK BLACK BLACK BLACK WHITE,
+    (uint8_t*)
+        WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
+    (uint8_t*)
+        WHITE TRANS TRANS TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
+    (uint8_t*)
+        WHITE TRANS TRANS TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
+    (uint8_t*)
+        WHITE TRANS TRANS TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
+    (uint8_t*)
+        WHITE TRANS TRANS TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
+    (uint8_t*)
+        WHITE TRANS TRANS TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
+    (uint8_t*)
+        WHITE TRANS TRANS TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
+    (uint8_t*)
+        WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
+    (uint8_t*)
+        WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
 };
 
 static uint8_t* kOutlineRadius5x5[] = {
-        (uint8_t*) WHITE BLACK BLACK BLACK WHITE,
-        (uint8_t*) BLACK TRANS GREEN TRANS WHITE,
-        (uint8_t*) BLACK GREEN GREEN GREEN WHITE,
-        (uint8_t*) BLACK TRANS GREEN TRANS WHITE,
-        (uint8_t*) WHITE WHITE WHITE WHITE WHITE,
+    (uint8_t*)WHITE BLACK BLACK BLACK WHITE,
+    (uint8_t*)BLACK TRANS GREEN TRANS WHITE,
+    (uint8_t*)BLACK GREEN GREEN GREEN WHITE,
+    (uint8_t*)BLACK TRANS GREEN TRANS WHITE,
+    (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
 };
 
 static uint8_t* kStretchAndPadding5x5[] = {
-        (uint8_t*) WHITE WHITE BLACK WHITE WHITE,
-        (uint8_t*) WHITE RED   RED   RED   WHITE,
-        (uint8_t*) BLACK RED   RED   RED   BLACK,
-        (uint8_t*) WHITE RED   RED   RED   WHITE,
-        (uint8_t*) WHITE WHITE BLACK WHITE WHITE,
+    (uint8_t*)WHITE WHITE BLACK WHITE WHITE, (uint8_t*)WHITE RED RED RED WHITE,
+    (uint8_t*)BLACK RED RED RED BLACK,       (uint8_t*)WHITE RED RED RED WHITE,
+    (uint8_t*)WHITE WHITE BLACK WHITE WHITE,
 };
 
 TEST(NinePatchTest, Minimum3x3) {
-    std::string err;
-    EXPECT_EQ(nullptr, NinePatch::create(k2x2, 2, 2, &err));
-    EXPECT_FALSE(err.empty());
+  std::string err;
+  EXPECT_EQ(nullptr, NinePatch::create(k2x2, 2, 2, &err));
+  EXPECT_FALSE(err.empty());
 }
 
 TEST(NinePatchTest, MixedNeutralColors) {
-    std::string err;
-    EXPECT_EQ(nullptr, NinePatch::create(kMixedNeutralColor3x3, 3, 3, &err));
-    EXPECT_FALSE(err.empty());
+  std::string err;
+  EXPECT_EQ(nullptr, NinePatch::create(kMixedNeutralColor3x3, 3, 3, &err));
+  EXPECT_FALSE(err.empty());
 }
 
 TEST(NinePatchTest, TransparentNeutralColor) {
-    std::string err;
-    EXPECT_NE(nullptr, NinePatch::create(kTransparentNeutralColor3x3, 3, 3, &err));
+  std::string err;
+  EXPECT_NE(nullptr,
+            NinePatch::create(kTransparentNeutralColor3x3, 3, 3, &err));
 }
 
 TEST(NinePatchTest, SingleStretchRegion) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kSingleStretch7x6, 7, 6, &err);
-    ASSERT_NE(nullptr, ninePatch);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kSingleStretch7x6, 7, 6, &err);
+  ASSERT_NE(nullptr, ninePatch);
 
-    ASSERT_EQ(1u, ninePatch->horizontalStretchRegions.size());
-    ASSERT_EQ(1u, ninePatch->verticalStretchRegions.size());
+  ASSERT_EQ(1u, ninePatch->horizontalStretchRegions.size());
+  ASSERT_EQ(1u, ninePatch->verticalStretchRegions.size());
 
-    EXPECT_EQ(Range(1, 4), ninePatch->horizontalStretchRegions.front());
-    EXPECT_EQ(Range(1, 3), ninePatch->verticalStretchRegions.front());
+  EXPECT_EQ(Range(1, 4), ninePatch->horizontalStretchRegions.front());
+  EXPECT_EQ(Range(1, 3), ninePatch->verticalStretchRegions.front());
 }
 
 TEST(NinePatchTest, MultipleStretchRegions) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kMultipleStretch10x7, 10, 7, &err);
-    ASSERT_NE(nullptr, ninePatch);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kMultipleStretch10x7, 10, 7, &err);
+  ASSERT_NE(nullptr, ninePatch);
 
-    ASSERT_EQ(3u, ninePatch->horizontalStretchRegions.size());
-    ASSERT_EQ(2u, ninePatch->verticalStretchRegions.size());
+  ASSERT_EQ(3u, ninePatch->horizontalStretchRegions.size());
+  ASSERT_EQ(2u, ninePatch->verticalStretchRegions.size());
 
-    EXPECT_EQ(Range(1, 2), ninePatch->horizontalStretchRegions[0]);
-    EXPECT_EQ(Range(3, 5), ninePatch->horizontalStretchRegions[1]);
-    EXPECT_EQ(Range(6, 7), ninePatch->horizontalStretchRegions[2]);
+  EXPECT_EQ(Range(1, 2), ninePatch->horizontalStretchRegions[0]);
+  EXPECT_EQ(Range(3, 5), ninePatch->horizontalStretchRegions[1]);
+  EXPECT_EQ(Range(6, 7), ninePatch->horizontalStretchRegions[2]);
 
-    EXPECT_EQ(Range(0, 2), ninePatch->verticalStretchRegions[0]);
-    EXPECT_EQ(Range(3, 5), ninePatch->verticalStretchRegions[1]);
+  EXPECT_EQ(Range(0, 2), ninePatch->verticalStretchRegions[0]);
+  EXPECT_EQ(Range(3, 5), ninePatch->verticalStretchRegions[1]);
 }
 
 TEST(NinePatchTest, InferPaddingFromStretchRegions) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kMultipleStretch10x7, 10, 7, &err);
-    ASSERT_NE(nullptr, ninePatch);
-    EXPECT_EQ(Bounds(1, 0, 1, 0), ninePatch->padding);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kMultipleStretch10x7, 10, 7, &err);
+  ASSERT_NE(nullptr, ninePatch);
+  EXPECT_EQ(Bounds(1, 0, 1, 0), ninePatch->padding);
 }
 
 TEST(NinePatchTest, Padding) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kPadding6x5, 6, 5, &err);
-    ASSERT_NE(nullptr, ninePatch);
-    EXPECT_EQ(Bounds(1, 1, 1, 1), ninePatch->padding);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kPadding6x5, 6, 5, &err);
+  ASSERT_NE(nullptr, ninePatch);
+  EXPECT_EQ(Bounds(1, 1, 1, 1), ninePatch->padding);
 }
 
 TEST(NinePatchTest, LayoutBoundsAreOnWrongEdge) {
-    std::string err;
-    EXPECT_EQ(nullptr, NinePatch::create(kLayoutBoundsWrongEdge3x3, 3, 3, &err));
-    EXPECT_FALSE(err.empty());
+  std::string err;
+  EXPECT_EQ(nullptr, NinePatch::create(kLayoutBoundsWrongEdge3x3, 3, 3, &err));
+  EXPECT_FALSE(err.empty());
 }
 
 TEST(NinePatchTest, LayoutBoundsMustTouchEdges) {
-    std::string err;
-    EXPECT_EQ(nullptr, NinePatch::create(kLayoutBoundsNotEdgeAligned5x5, 5, 5, &err));
-    EXPECT_FALSE(err.empty());
+  std::string err;
+  EXPECT_EQ(nullptr,
+            NinePatch::create(kLayoutBoundsNotEdgeAligned5x5, 5, 5, &err));
+  EXPECT_FALSE(err.empty());
 }
 
 TEST(NinePatchTest, LayoutBounds) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kLayoutBounds5x5, 5, 5, &err);
-    ASSERT_NE(nullptr, ninePatch);
-    EXPECT_EQ(Bounds(1, 1, 1, 1), ninePatch->layoutBounds);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kLayoutBounds5x5, 5, 5, &err);
+  ASSERT_NE(nullptr, ninePatch);
+  EXPECT_EQ(Bounds(1, 1, 1, 1), ninePatch->layoutBounds);
 
-    ninePatch = NinePatch::create(kAsymmetricLayoutBounds5x5, 5, 5, &err);
-    ASSERT_NE(nullptr, ninePatch);
-    EXPECT_EQ(Bounds(1, 1, 0, 0), ninePatch->layoutBounds);
+  ninePatch = NinePatch::create(kAsymmetricLayoutBounds5x5, 5, 5, &err);
+  ASSERT_NE(nullptr, ninePatch);
+  EXPECT_EQ(Bounds(1, 1, 0, 0), ninePatch->layoutBounds);
 }
 
 TEST(NinePatchTest, PaddingAndLayoutBounds) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kPaddingAndLayoutBounds5x5, 5, 5,
-                                                             &err);
-    ASSERT_NE(nullptr, ninePatch);
-    EXPECT_EQ(Bounds(1, 1, 1, 1), ninePatch->padding);
-    EXPECT_EQ(Bounds(1, 1, 1, 1), ninePatch->layoutBounds);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kPaddingAndLayoutBounds5x5, 5, 5, &err);
+  ASSERT_NE(nullptr, ninePatch);
+  EXPECT_EQ(Bounds(1, 1, 1, 1), ninePatch->padding);
+  EXPECT_EQ(Bounds(1, 1, 1, 1), ninePatch->layoutBounds);
 }
 
 TEST(NinePatchTest, RegionColorsAreCorrect) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kColorfulImage5x5, 5, 5, &err);
-    ASSERT_NE(nullptr, ninePatch);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kColorfulImage5x5, 5, 5, &err);
+  ASSERT_NE(nullptr, ninePatch);
 
-    std::vector<uint32_t> expectedColors = {
-            NinePatch::packRGBA((uint8_t*) RED),
-            (uint32_t) android::Res_png_9patch::NO_COLOR,
-            NinePatch::packRGBA((uint8_t*) GREEN),
-            (uint32_t) android::Res_png_9patch::TRANSPARENT_COLOR,
-            NinePatch::packRGBA((uint8_t*) BLUE),
-            NinePatch::packRGBA((uint8_t*) GREEN),
-    };
-    EXPECT_EQ(expectedColors, ninePatch->regionColors);
+  std::vector<uint32_t> expectedColors = {
+      NinePatch::packRGBA((uint8_t*)RED),
+      (uint32_t)android::Res_png_9patch::NO_COLOR,
+      NinePatch::packRGBA((uint8_t*)GREEN),
+      (uint32_t)android::Res_png_9patch::TRANSPARENT_COLOR,
+      NinePatch::packRGBA((uint8_t*)BLUE),
+      NinePatch::packRGBA((uint8_t*)GREEN),
+  };
+  EXPECT_EQ(expectedColors, ninePatch->regionColors);
 }
 
 TEST(NinePatchTest, OutlineFromOpaqueImage) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kOutlineOpaque10x10, 10, 10, &err);
-    ASSERT_NE(nullptr, ninePatch);
-    EXPECT_EQ(Bounds(2, 2, 2, 2), ninePatch->outline);
-    EXPECT_EQ(0x000000ffu, ninePatch->outlineAlpha);
-    EXPECT_EQ(0.0f, ninePatch->outlineRadius);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kOutlineOpaque10x10, 10, 10, &err);
+  ASSERT_NE(nullptr, ninePatch);
+  EXPECT_EQ(Bounds(2, 2, 2, 2), ninePatch->outline);
+  EXPECT_EQ(0x000000ffu, ninePatch->outlineAlpha);
+  EXPECT_EQ(0.0f, ninePatch->outlineRadius);
 }
 
 TEST(NinePatchTest, OutlineFromTranslucentImage) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kOutlineTranslucent10x10, 10, 10,
-                                                             &err);
-    ASSERT_NE(nullptr, ninePatch);
-    EXPECT_EQ(Bounds(3, 3, 3, 3), ninePatch->outline);
-    EXPECT_EQ(0x000000b3u, ninePatch->outlineAlpha);
-    EXPECT_EQ(0.0f, ninePatch->outlineRadius);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kOutlineTranslucent10x10, 10, 10, &err);
+  ASSERT_NE(nullptr, ninePatch);
+  EXPECT_EQ(Bounds(3, 3, 3, 3), ninePatch->outline);
+  EXPECT_EQ(0x000000b3u, ninePatch->outlineAlpha);
+  EXPECT_EQ(0.0f, ninePatch->outlineRadius);
 }
 
 TEST(NinePatchTest, OutlineFromOffCenterImage) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kOutlineOffsetTranslucent12x10, 12, 10,
-                                                             &err);
-    ASSERT_NE(nullptr, ninePatch);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kOutlineOffsetTranslucent12x10, 12, 10, &err);
+  ASSERT_NE(nullptr, ninePatch);
 
-    // TODO(adamlesinski): The old AAPT algorithm searches from the outside to the middle
-    // for each inset. If the outline is shifted, the search may not find a closer bounds.
-    // This check should be:
-    //   EXPECT_EQ(Bounds(5, 3, 3, 3), ninePatch->outline);
-    // but until I know what behaviour I'm breaking, I will leave it at the incorrect:
-    EXPECT_EQ(Bounds(4, 3, 3, 3), ninePatch->outline);
+  // TODO(adamlesinski): The old AAPT algorithm searches from the outside to the
+  // middle
+  // for each inset. If the outline is shifted, the search may not find a closer
+  // bounds.
+  // This check should be:
+  //   EXPECT_EQ(Bounds(5, 3, 3, 3), ninePatch->outline);
+  // but until I know what behaviour I'm breaking, I will leave it at the
+  // incorrect:
+  EXPECT_EQ(Bounds(4, 3, 3, 3), ninePatch->outline);
 
-    EXPECT_EQ(0x000000b3u, ninePatch->outlineAlpha);
-    EXPECT_EQ(0.0f, ninePatch->outlineRadius);
+  EXPECT_EQ(0x000000b3u, ninePatch->outlineAlpha);
+  EXPECT_EQ(0.0f, ninePatch->outlineRadius);
 }
 
 TEST(NinePatchTest, OutlineRadius) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kOutlineRadius5x5, 5, 5, &err);
-    ASSERT_NE(nullptr, ninePatch);
-    EXPECT_EQ(Bounds(0, 0, 0, 0), ninePatch->outline);
-    EXPECT_EQ(3.4142f, ninePatch->outlineRadius);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kOutlineRadius5x5, 5, 5, &err);
+  ASSERT_NE(nullptr, ninePatch);
+  EXPECT_EQ(Bounds(0, 0, 0, 0), ninePatch->outline);
+  EXPECT_EQ(3.4142f, ninePatch->outlineRadius);
 }
 
 ::testing::AssertionResult bigEndianOne(uint8_t* cursor) {
-    if (cursor[0] == 0 && cursor[1] == 0 && cursor[2] == 0 && cursor[3] == 1) {
-        return ::testing::AssertionSuccess();
-    }
-    return ::testing::AssertionFailure() << "Not BigEndian 1";
+  if (cursor[0] == 0 && cursor[1] == 0 && cursor[2] == 0 && cursor[3] == 1) {
+    return ::testing::AssertionSuccess();
+  }
+  return ::testing::AssertionFailure() << "Not BigEndian 1";
 }
 
 TEST(NinePatchTest, SerializePngEndianness) {
-    std::string err;
-    std::unique_ptr<NinePatch> ninePatch = NinePatch::create(kStretchAndPadding5x5, 5, 5, &err);
-    ASSERT_NE(nullptr, ninePatch);
+  std::string err;
+  std::unique_ptr<NinePatch> ninePatch =
+      NinePatch::create(kStretchAndPadding5x5, 5, 5, &err);
+  ASSERT_NE(nullptr, ninePatch);
 
-    size_t len;
-    std::unique_ptr<uint8_t[]> data = ninePatch->serializeBase(&len);
-    ASSERT_NE(nullptr, data);
-    ASSERT_NE(0u, len);
+  size_t len;
+  std::unique_ptr<uint8_t[]> data = ninePatch->serializeBase(&len);
+  ASSERT_NE(nullptr, data);
+  ASSERT_NE(0u, len);
 
-    // Skip past wasDeserialized + numXDivs + numYDivs + numColors + xDivsOffset + yDivsOffset
-    // (12 bytes)
-    uint8_t* cursor = data.get() + 12;
+  // Skip past wasDeserialized + numXDivs + numYDivs + numColors + xDivsOffset +
+  // yDivsOffset
+  // (12 bytes)
+  uint8_t* cursor = data.get() + 12;
 
-    // Check that padding is big-endian. Expecting value 1.
-    EXPECT_TRUE(bigEndianOne(cursor));
-    EXPECT_TRUE(bigEndianOne(cursor + 4));
-    EXPECT_TRUE(bigEndianOne(cursor + 8));
-    EXPECT_TRUE(bigEndianOne(cursor + 12));
+  // Check that padding is big-endian. Expecting value 1.
+  EXPECT_TRUE(bigEndianOne(cursor));
+  EXPECT_TRUE(bigEndianOne(cursor + 4));
+  EXPECT_TRUE(bigEndianOne(cursor + 8));
+  EXPECT_TRUE(bigEndianOne(cursor + 12));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/Png.cpp b/tools/aapt2/compile/Png.cpp
index 055d8b5..9b5fa7e09 100644
--- a/tools/aapt2/compile/Png.cpp
+++ b/tools/aapt2/compile/Png.cpp
@@ -14,18 +14,18 @@
  * limitations under the License.
  */
 
-#include "util/BigBuffer.h"
 #include "Png.h"
 #include "Source.h"
+#include "util/BigBuffer.h"
 #include "util/Util.h"
 
 #include <androidfw/ResourceTypes.h>
-#include <iostream>
 #include <png.h>
+#include <zlib.h>
+#include <iostream>
 #include <sstream>
 #include <string>
 #include <vector>
-#include <zlib.h>
 
 namespace aapt {
 
@@ -33,158 +33,166 @@
 constexpr size_t kPngSignatureSize = 8u;
 
 struct PngInfo {
-    ~PngInfo() {
-        for (png_bytep row : rows) {
-            if (row != nullptr) {
-                delete[] row;
-            }
-        }
-
-        delete[] xDivs;
-        delete[] yDivs;
+  ~PngInfo() {
+    for (png_bytep row : rows) {
+      if (row != nullptr) {
+        delete[] row;
+      }
     }
 
-    void* serialize9Patch() {
-        void* serialized = android::Res_png_9patch::serialize(info9Patch, xDivs, yDivs,
-                                                              colors.data());
-        reinterpret_cast<android::Res_png_9patch*>(serialized)->deviceToFile();
-        return serialized;
-    }
+    delete[] xDivs;
+    delete[] yDivs;
+  }
 
-    uint32_t width = 0;
-    uint32_t height = 0;
-    std::vector<png_bytep> rows;
+  void* serialize9Patch() {
+    void* serialized = android::Res_png_9patch::serialize(info9Patch, xDivs,
+                                                          yDivs, colors.data());
+    reinterpret_cast<android::Res_png_9patch*>(serialized)->deviceToFile();
+    return serialized;
+  }
 
-    bool is9Patch = false;
-    android::Res_png_9patch info9Patch;
-    int32_t* xDivs = nullptr;
-    int32_t* yDivs = nullptr;
-    std::vector<uint32_t> colors;
+  uint32_t width = 0;
+  uint32_t height = 0;
+  std::vector<png_bytep> rows;
 
-    // Layout padding.
-    bool haveLayoutBounds = false;
-    int32_t layoutBoundsLeft;
-    int32_t layoutBoundsTop;
-    int32_t layoutBoundsRight;
-    int32_t layoutBoundsBottom;
+  bool is9Patch = false;
+  android::Res_png_9patch info9Patch;
+  int32_t* xDivs = nullptr;
+  int32_t* yDivs = nullptr;
+  std::vector<uint32_t> colors;
 
-    // Round rect outline description.
-    int32_t outlineInsetsLeft;
-    int32_t outlineInsetsTop;
-    int32_t outlineInsetsRight;
-    int32_t outlineInsetsBottom;
-    float outlineRadius;
-    uint8_t outlineAlpha;
+  // Layout padding.
+  bool haveLayoutBounds = false;
+  int32_t layoutBoundsLeft;
+  int32_t layoutBoundsTop;
+  int32_t layoutBoundsRight;
+  int32_t layoutBoundsBottom;
+
+  // Round rect outline description.
+  int32_t outlineInsetsLeft;
+  int32_t outlineInsetsTop;
+  int32_t outlineInsetsRight;
+  int32_t outlineInsetsBottom;
+  float outlineRadius;
+  uint8_t outlineAlpha;
 };
 
-static void readDataFromStream(png_structp readPtr, png_bytep data, png_size_t length) {
-    std::istream* input = reinterpret_cast<std::istream*>(png_get_io_ptr(readPtr));
-    if (!input->read(reinterpret_cast<char*>(data), length)) {
-        png_error(readPtr, strerror(errno));
-    }
+static void readDataFromStream(png_structp readPtr, png_bytep data,
+                               png_size_t length) {
+  std::istream* input =
+      reinterpret_cast<std::istream*>(png_get_io_ptr(readPtr));
+  if (!input->read(reinterpret_cast<char*>(data), length)) {
+    png_error(readPtr, strerror(errno));
+  }
 }
 
-static void writeDataToStream(png_structp writePtr, png_bytep data, png_size_t length) {
-    BigBuffer* outBuffer = reinterpret_cast<BigBuffer*>(png_get_io_ptr(writePtr));
-    png_bytep buf = outBuffer->nextBlock<png_byte>(length);
-    memcpy(buf, data, length);
+static void writeDataToStream(png_structp writePtr, png_bytep data,
+                              png_size_t length) {
+  BigBuffer* outBuffer = reinterpret_cast<BigBuffer*>(png_get_io_ptr(writePtr));
+  png_bytep buf = outBuffer->nextBlock<png_byte>(length);
+  memcpy(buf, data, length);
 }
 
-static void flushDataToStream(png_structp /*writePtr*/) {
-}
+static void flushDataToStream(png_structp /*writePtr*/) {}
 
 static void logWarning(png_structp readPtr, png_const_charp warningMessage) {
-    IDiagnostics* diag = reinterpret_cast<IDiagnostics*>(png_get_error_ptr(readPtr));
-    diag->warn(DiagMessage() << warningMessage);
+  IDiagnostics* diag =
+      reinterpret_cast<IDiagnostics*>(png_get_error_ptr(readPtr));
+  diag->warn(DiagMessage() << warningMessage);
 }
 
+static bool readPng(IDiagnostics* diag, png_structp readPtr, png_infop infoPtr,
+                    PngInfo* outInfo) {
+  if (setjmp(png_jmpbuf(readPtr))) {
+    diag->error(DiagMessage() << "failed reading png");
+    return false;
+  }
 
-static bool readPng(IDiagnostics* diag, png_structp readPtr, png_infop infoPtr, PngInfo* outInfo) {
-    if (setjmp(png_jmpbuf(readPtr))) {
-        diag->error(DiagMessage() << "failed reading png");
-        return false;
-    }
+  png_set_sig_bytes(readPtr, kPngSignatureSize);
+  png_read_info(readPtr, infoPtr);
 
-    png_set_sig_bytes(readPtr, kPngSignatureSize);
-    png_read_info(readPtr, infoPtr);
+  int colorType, bitDepth, interlaceType, compressionType;
+  png_get_IHDR(readPtr, infoPtr, &outInfo->width, &outInfo->height, &bitDepth,
+               &colorType, &interlaceType, &compressionType, nullptr);
 
-    int colorType, bitDepth, interlaceType, compressionType;
-    png_get_IHDR(readPtr, infoPtr, &outInfo->width, &outInfo->height, &bitDepth, &colorType,
-                 &interlaceType, &compressionType, nullptr);
+  if (colorType == PNG_COLOR_TYPE_PALETTE) {
+    png_set_palette_to_rgb(readPtr);
+  }
 
-    if (colorType == PNG_COLOR_TYPE_PALETTE) {
-        png_set_palette_to_rgb(readPtr);
-    }
+  if (colorType == PNG_COLOR_TYPE_GRAY && bitDepth < 8) {
+    png_set_expand_gray_1_2_4_to_8(readPtr);
+  }
 
-    if (colorType == PNG_COLOR_TYPE_GRAY && bitDepth < 8) {
-        png_set_expand_gray_1_2_4_to_8(readPtr);
-    }
+  if (png_get_valid(readPtr, infoPtr, PNG_INFO_tRNS)) {
+    png_set_tRNS_to_alpha(readPtr);
+  }
 
-    if (png_get_valid(readPtr, infoPtr, PNG_INFO_tRNS)) {
-        png_set_tRNS_to_alpha(readPtr);
-    }
+  if (bitDepth == 16) {
+    png_set_strip_16(readPtr);
+  }
 
-    if (bitDepth == 16) {
-        png_set_strip_16(readPtr);
-    }
+  if (!(colorType & PNG_COLOR_MASK_ALPHA)) {
+    png_set_add_alpha(readPtr, 0xFF, PNG_FILLER_AFTER);
+  }
 
-    if (!(colorType & PNG_COLOR_MASK_ALPHA)) {
-        png_set_add_alpha(readPtr, 0xFF, PNG_FILLER_AFTER);
-    }
+  if (colorType == PNG_COLOR_TYPE_GRAY ||
+      colorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
+    png_set_gray_to_rgb(readPtr);
+  }
 
-    if (colorType == PNG_COLOR_TYPE_GRAY || colorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
-        png_set_gray_to_rgb(readPtr);
-    }
+  png_set_interlace_handling(readPtr);
+  png_read_update_info(readPtr, infoPtr);
 
-    png_set_interlace_handling(readPtr);
-    png_read_update_info(readPtr, infoPtr);
+  const uint32_t rowBytes = png_get_rowbytes(readPtr, infoPtr);
+  outInfo->rows.resize(outInfo->height);
+  for (size_t i = 0; i < outInfo->height; i++) {
+    outInfo->rows[i] = new png_byte[rowBytes];
+  }
 
-    const uint32_t rowBytes = png_get_rowbytes(readPtr, infoPtr);
-    outInfo->rows.resize(outInfo->height);
-    for (size_t i = 0; i < outInfo->height; i++) {
-        outInfo->rows[i] = new png_byte[rowBytes];
-    }
-
-    png_read_image(readPtr, outInfo->rows.data());
-    png_read_end(readPtr, infoPtr);
-    return true;
+  png_read_image(readPtr, outInfo->rows.data());
+  png_read_end(readPtr, infoPtr);
+  return true;
 }
 
-static void checkNinePatchSerialization(android::Res_png_9patch* inPatch,  void* data) {
-    size_t patchSize = inPatch->serializedSize();
-    void* newData = malloc(patchSize);
-    memcpy(newData, data, patchSize);
-    android::Res_png_9patch* outPatch = inPatch->deserialize(newData);
-    outPatch->fileToDevice();
-    // deserialization is done in place, so outPatch == newData
-    assert(outPatch == newData);
-    assert(outPatch->numXDivs == inPatch->numXDivs);
-    assert(outPatch->numYDivs == inPatch->numYDivs);
-    assert(outPatch->paddingLeft == inPatch->paddingLeft);
-    assert(outPatch->paddingRight == inPatch->paddingRight);
-    assert(outPatch->paddingTop == inPatch->paddingTop);
-    assert(outPatch->paddingBottom == inPatch->paddingBottom);
-/*    for (int i = 0; i < outPatch->numXDivs; i++) {
-        assert(outPatch->getXDivs()[i] == inPatch->getXDivs()[i]);
-    }
-    for (int i = 0; i < outPatch->numYDivs; i++) {
-        assert(outPatch->getYDivs()[i] == inPatch->getYDivs()[i]);
-    }
-    for (int i = 0; i < outPatch->numColors; i++) {
-        assert(outPatch->getColors()[i] == inPatch->getColors()[i]);
-    }*/
-    free(newData);
+static void checkNinePatchSerialization(android::Res_png_9patch* inPatch,
+                                        void* data) {
+  size_t patchSize = inPatch->serializedSize();
+  void* newData = malloc(patchSize);
+  memcpy(newData, data, patchSize);
+  android::Res_png_9patch* outPatch = inPatch->deserialize(newData);
+  outPatch->fileToDevice();
+  // deserialization is done in place, so outPatch == newData
+  assert(outPatch == newData);
+  assert(outPatch->numXDivs == inPatch->numXDivs);
+  assert(outPatch->numYDivs == inPatch->numYDivs);
+  assert(outPatch->paddingLeft == inPatch->paddingLeft);
+  assert(outPatch->paddingRight == inPatch->paddingRight);
+  assert(outPatch->paddingTop == inPatch->paddingTop);
+  assert(outPatch->paddingBottom == inPatch->paddingBottom);
+  /*    for (int i = 0; i < outPatch->numXDivs; i++) {
+          assert(outPatch->getXDivs()[i] == inPatch->getXDivs()[i]);
+      }
+      for (int i = 0; i < outPatch->numYDivs; i++) {
+          assert(outPatch->getYDivs()[i] == inPatch->getYDivs()[i]);
+      }
+      for (int i = 0; i < outPatch->numColors; i++) {
+          assert(outPatch->getColors()[i] == inPatch->getColors()[i]);
+      }*/
+  free(newData);
 }
 
-/*static void dump_image(int w, int h, const png_byte* const* rows, int color_type) {
+/*static void dump_image(int w, int h, const png_byte* const* rows, int
+color_type) {
     int i, j, rr, gg, bb, aa;
 
     int bpp;
-    if (color_type == PNG_COLOR_TYPE_PALETTE || color_type == PNG_COLOR_TYPE_GRAY) {
+    if (color_type == PNG_COLOR_TYPE_PALETTE || color_type ==
+PNG_COLOR_TYPE_GRAY) {
         bpp = 1;
     } else if (color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
         bpp = 2;
-    } else if (color_type == PNG_COLOR_TYPE_RGB || color_type == PNG_COLOR_TYPE_RGB_ALPHA) {
+    } else if (color_type == PNG_COLOR_TYPE_RGB || color_type ==
+PNG_COLOR_TYPE_RGB_ALPHA) {
         // We use a padding byte even when there is no alpha
         bpp = 4;
     } else {
@@ -224,1055 +232,1083 @@
     }
 }*/
 
-#define MAX(a,b) ((a)>(b)?(a):(b))
-#define ABS(a)   ((a)<0?-(a):(a))
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+#define ABS(a) ((a) < 0 ? -(a) : (a))
 
-static void analyze_image(IDiagnostics* diag, const PngInfo& imageInfo, int grayscaleTolerance,
-                          png_colorp rgbPalette, png_bytep alphaPalette,
-                          int *paletteEntries, bool *hasTransparency, int *colorType,
+static void analyze_image(IDiagnostics* diag, const PngInfo& imageInfo,
+                          int grayscaleTolerance, png_colorp rgbPalette,
+                          png_bytep alphaPalette, int* paletteEntries,
+                          bool* hasTransparency, int* colorType,
                           png_bytepp outRows) {
-    int w = imageInfo.width;
-    int h = imageInfo.height;
-    int i, j, rr, gg, bb, aa, idx;
-    uint32_t colors[256], col;
-    int num_colors = 0;
-    int maxGrayDeviation = 0;
+  int w = imageInfo.width;
+  int h = imageInfo.height;
+  int i, j, rr, gg, bb, aa, idx;
+  uint32_t colors[256], col;
+  int num_colors = 0;
+  int maxGrayDeviation = 0;
 
-    bool isOpaque = true;
-    bool isPalette = true;
-    bool isGrayscale = true;
+  bool isOpaque = true;
+  bool isPalette = true;
+  bool isGrayscale = true;
 
-    // Scan the entire image and determine if:
-    // 1. Every pixel has R == G == B (grayscale)
-    // 2. Every pixel has A == 255 (opaque)
-    // 3. There are no more than 256 distinct RGBA colors
+  // Scan the entire image and determine if:
+  // 1. Every pixel has R == G == B (grayscale)
+  // 2. Every pixel has A == 255 (opaque)
+  // 3. There are no more than 256 distinct RGBA colors
 
-    if (kDebug) {
-        printf("Initial image data:\n");
-        //dump_image(w, h, imageInfo.rows.data(), PNG_COLOR_TYPE_RGB_ALPHA);
-    }
+  if (kDebug) {
+    printf("Initial image data:\n");
+    // dump_image(w, h, imageInfo.rows.data(), PNG_COLOR_TYPE_RGB_ALPHA);
+  }
 
-    for (j = 0; j < h; j++) {
-        const png_byte* row = imageInfo.rows[j];
-        png_bytep out = outRows[j];
-        for (i = 0; i < w; i++) {
-            rr = *row++;
-            gg = *row++;
-            bb = *row++;
-            aa = *row++;
+  for (j = 0; j < h; j++) {
+    const png_byte* row = imageInfo.rows[j];
+    png_bytep out = outRows[j];
+    for (i = 0; i < w; i++) {
+      rr = *row++;
+      gg = *row++;
+      bb = *row++;
+      aa = *row++;
 
-            int odev = maxGrayDeviation;
-            maxGrayDeviation = MAX(ABS(rr - gg), maxGrayDeviation);
-            maxGrayDeviation = MAX(ABS(gg - bb), maxGrayDeviation);
-            maxGrayDeviation = MAX(ABS(bb - rr), maxGrayDeviation);
-            if (maxGrayDeviation > odev) {
-                if (kDebug) {
-                    printf("New max dev. = %d at pixel (%d, %d) = (%d %d %d %d)\n",
-                            maxGrayDeviation, i, j, rr, gg, bb, aa);
-                }
-            }
-
-            // Check if image is really grayscale
-            if (isGrayscale) {
-                if (rr != gg || rr != bb) {
-                    if (kDebug) {
-                        printf("Found a non-gray pixel at %d, %d = (%d %d %d %d)\n",
-                                i, j, rr, gg, bb, aa);
-                    }
-                    isGrayscale = false;
-                }
-            }
-
-            // Check if image is really opaque
-            if (isOpaque) {
-                if (aa != 0xff) {
-                    if (kDebug) {
-                        printf("Found a non-opaque pixel at %d, %d = (%d %d %d %d)\n",
-                                i, j, rr, gg, bb, aa);
-                    }
-                    isOpaque = false;
-                }
-            }
-
-            // Check if image is really <= 256 colors
-            if (isPalette) {
-                col = (uint32_t) ((rr << 24) | (gg << 16) | (bb << 8) | aa);
-                bool match = false;
-                for (idx = 0; idx < num_colors; idx++) {
-                    if (colors[idx] == col) {
-                        match = true;
-                        break;
-                    }
-                }
-
-                // Write the palette index for the pixel to outRows optimistically
-                // We might overwrite it later if we decide to encode as gray or
-                // gray + alpha
-                *out++ = idx;
-                if (!match) {
-                    if (num_colors == 256) {
-                        if (kDebug) {
-                            printf("Found 257th color at %d, %d\n", i, j);
-                        }
-                        isPalette = false;
-                    } else {
-                        colors[num_colors++] = col;
-                    }
-                }
-            }
+      int odev = maxGrayDeviation;
+      maxGrayDeviation = MAX(ABS(rr - gg), maxGrayDeviation);
+      maxGrayDeviation = MAX(ABS(gg - bb), maxGrayDeviation);
+      maxGrayDeviation = MAX(ABS(bb - rr), maxGrayDeviation);
+      if (maxGrayDeviation > odev) {
+        if (kDebug) {
+          printf("New max dev. = %d at pixel (%d, %d) = (%d %d %d %d)\n",
+                 maxGrayDeviation, i, j, rr, gg, bb, aa);
         }
-    }
+      }
 
-    *paletteEntries = 0;
-    *hasTransparency = !isOpaque;
-    int bpp = isOpaque ? 3 : 4;
-    int paletteSize = w * h + bpp * num_colors;
-
-    if (kDebug) {
-        printf("isGrayscale = %s\n", isGrayscale ? "true" : "false");
-        printf("isOpaque = %s\n", isOpaque ? "true" : "false");
-        printf("isPalette = %s\n", isPalette ? "true" : "false");
-        printf("Size w/ palette = %d, gray+alpha = %d, rgb(a) = %d\n",
-                paletteSize, 2 * w * h, bpp * w * h);
-        printf("Max gray deviation = %d, tolerance = %d\n", maxGrayDeviation, grayscaleTolerance);
-    }
-
-    // Choose the best color type for the image.
-    // 1. Opaque gray - use COLOR_TYPE_GRAY at 1 byte/pixel
-    // 2. Gray + alpha - use COLOR_TYPE_PALETTE if the number of distinct combinations
-    //     is sufficiently small, otherwise use COLOR_TYPE_GRAY_ALPHA
-    // 3. RGB(A) - use COLOR_TYPE_PALETTE if the number of distinct colors is sufficiently
-    //     small, otherwise use COLOR_TYPE_RGB{_ALPHA}
-    if (isGrayscale) {
-        if (isOpaque) {
-            *colorType = PNG_COLOR_TYPE_GRAY; // 1 byte/pixel
-        } else {
-            // Use a simple heuristic to determine whether using a palette will
-            // save space versus using gray + alpha for each pixel.
-            // This doesn't take into account chunk overhead, filtering, LZ
-            // compression, etc.
-            if (isPalette && (paletteSize < 2 * w * h)) {
-                *colorType = PNG_COLOR_TYPE_PALETTE; // 1 byte/pixel + 4 bytes/color
-            } else {
-                *colorType = PNG_COLOR_TYPE_GRAY_ALPHA; // 2 bytes per pixel
-            }
+      // Check if image is really grayscale
+      if (isGrayscale) {
+        if (rr != gg || rr != bb) {
+          if (kDebug) {
+            printf("Found a non-gray pixel at %d, %d = (%d %d %d %d)\n", i, j,
+                   rr, gg, bb, aa);
+          }
+          isGrayscale = false;
         }
-    } else if (isPalette && (paletteSize < bpp * w * h)) {
-        *colorType = PNG_COLOR_TYPE_PALETTE;
+      }
+
+      // Check if image is really opaque
+      if (isOpaque) {
+        if (aa != 0xff) {
+          if (kDebug) {
+            printf("Found a non-opaque pixel at %d, %d = (%d %d %d %d)\n", i, j,
+                   rr, gg, bb, aa);
+          }
+          isOpaque = false;
+        }
+      }
+
+      // Check if image is really <= 256 colors
+      if (isPalette) {
+        col = (uint32_t)((rr << 24) | (gg << 16) | (bb << 8) | aa);
+        bool match = false;
+        for (idx = 0; idx < num_colors; idx++) {
+          if (colors[idx] == col) {
+            match = true;
+            break;
+          }
+        }
+
+        // Write the palette index for the pixel to outRows optimistically
+        // We might overwrite it later if we decide to encode as gray or
+        // gray + alpha
+        *out++ = idx;
+        if (!match) {
+          if (num_colors == 256) {
+            if (kDebug) {
+              printf("Found 257th color at %d, %d\n", i, j);
+            }
+            isPalette = false;
+          } else {
+            colors[num_colors++] = col;
+          }
+        }
+      }
+    }
+  }
+
+  *paletteEntries = 0;
+  *hasTransparency = !isOpaque;
+  int bpp = isOpaque ? 3 : 4;
+  int paletteSize = w * h + bpp * num_colors;
+
+  if (kDebug) {
+    printf("isGrayscale = %s\n", isGrayscale ? "true" : "false");
+    printf("isOpaque = %s\n", isOpaque ? "true" : "false");
+    printf("isPalette = %s\n", isPalette ? "true" : "false");
+    printf("Size w/ palette = %d, gray+alpha = %d, rgb(a) = %d\n", paletteSize,
+           2 * w * h, bpp * w * h);
+    printf("Max gray deviation = %d, tolerance = %d\n", maxGrayDeviation,
+           grayscaleTolerance);
+  }
+
+  // Choose the best color type for the image.
+  // 1. Opaque gray - use COLOR_TYPE_GRAY at 1 byte/pixel
+  // 2. Gray + alpha - use COLOR_TYPE_PALETTE if the number of distinct
+  // combinations
+  //     is sufficiently small, otherwise use COLOR_TYPE_GRAY_ALPHA
+  // 3. RGB(A) - use COLOR_TYPE_PALETTE if the number of distinct colors is
+  // sufficiently
+  //     small, otherwise use COLOR_TYPE_RGB{_ALPHA}
+  if (isGrayscale) {
+    if (isOpaque) {
+      *colorType = PNG_COLOR_TYPE_GRAY;  // 1 byte/pixel
     } else {
-        if (maxGrayDeviation <= grayscaleTolerance) {
-            diag->note(DiagMessage()
-                       << "forcing image to gray (max deviation = "
-                       << maxGrayDeviation << ")");
-            *colorType = isOpaque ? PNG_COLOR_TYPE_GRAY : PNG_COLOR_TYPE_GRAY_ALPHA;
+      // Use a simple heuristic to determine whether using a palette will
+      // save space versus using gray + alpha for each pixel.
+      // This doesn't take into account chunk overhead, filtering, LZ
+      // compression, etc.
+      if (isPalette && (paletteSize < 2 * w * h)) {
+        *colorType = PNG_COLOR_TYPE_PALETTE;  // 1 byte/pixel + 4 bytes/color
+      } else {
+        *colorType = PNG_COLOR_TYPE_GRAY_ALPHA;  // 2 bytes per pixel
+      }
+    }
+  } else if (isPalette && (paletteSize < bpp * w * h)) {
+    *colorType = PNG_COLOR_TYPE_PALETTE;
+  } else {
+    if (maxGrayDeviation <= grayscaleTolerance) {
+      diag->note(DiagMessage() << "forcing image to gray (max deviation = "
+                               << maxGrayDeviation << ")");
+      *colorType = isOpaque ? PNG_COLOR_TYPE_GRAY : PNG_COLOR_TYPE_GRAY_ALPHA;
+    } else {
+      *colorType = isOpaque ? PNG_COLOR_TYPE_RGB : PNG_COLOR_TYPE_RGB_ALPHA;
+    }
+  }
+
+  // Perform postprocessing of the image or palette data based on the final
+  // color type chosen
+
+  if (*colorType == PNG_COLOR_TYPE_PALETTE) {
+    // Create separate RGB and Alpha palettes and set the number of colors
+    *paletteEntries = num_colors;
+
+    // Create the RGB and alpha palettes
+    for (int idx = 0; idx < num_colors; idx++) {
+      col = colors[idx];
+      rgbPalette[idx].red = (png_byte)((col >> 24) & 0xff);
+      rgbPalette[idx].green = (png_byte)((col >> 16) & 0xff);
+      rgbPalette[idx].blue = (png_byte)((col >> 8) & 0xff);
+      alphaPalette[idx] = (png_byte)(col & 0xff);
+    }
+  } else if (*colorType == PNG_COLOR_TYPE_GRAY ||
+             *colorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
+    // If the image is gray or gray + alpha, compact the pixels into outRows
+    for (j = 0; j < h; j++) {
+      const png_byte* row = imageInfo.rows[j];
+      png_bytep out = outRows[j];
+      for (i = 0; i < w; i++) {
+        rr = *row++;
+        gg = *row++;
+        bb = *row++;
+        aa = *row++;
+
+        if (isGrayscale) {
+          *out++ = rr;
         } else {
-            *colorType = isOpaque ? PNG_COLOR_TYPE_RGB : PNG_COLOR_TYPE_RGB_ALPHA;
+          *out++ = (png_byte)(rr * 0.2126f + gg * 0.7152f + bb * 0.0722f);
         }
+        if (!isOpaque) {
+          *out++ = aa;
+        }
+      }
     }
-
-    // Perform postprocessing of the image or palette data based on the final
-    // color type chosen
-
-    if (*colorType == PNG_COLOR_TYPE_PALETTE) {
-        // Create separate RGB and Alpha palettes and set the number of colors
-        *paletteEntries = num_colors;
-
-        // Create the RGB and alpha palettes
-        for (int idx = 0; idx < num_colors; idx++) {
-            col = colors[idx];
-            rgbPalette[idx].red   = (png_byte) ((col >> 24) & 0xff);
-            rgbPalette[idx].green = (png_byte) ((col >> 16) & 0xff);
-            rgbPalette[idx].blue  = (png_byte) ((col >>  8) & 0xff);
-            alphaPalette[idx]     = (png_byte)  (col        & 0xff);
-        }
-    } else if (*colorType == PNG_COLOR_TYPE_GRAY || *colorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
-        // If the image is gray or gray + alpha, compact the pixels into outRows
-        for (j = 0; j < h; j++) {
-            const png_byte* row = imageInfo.rows[j];
-            png_bytep out = outRows[j];
-            for (i = 0; i < w; i++) {
-                rr = *row++;
-                gg = *row++;
-                bb = *row++;
-                aa = *row++;
-
-                if (isGrayscale) {
-                    *out++ = rr;
-                } else {
-                    *out++ = (png_byte) (rr * 0.2126f + gg * 0.7152f + bb * 0.0722f);
-                }
-                if (!isOpaque) {
-                    *out++ = aa;
-                }
-           }
-        }
-    }
+  }
 }
 
-static bool writePng(IDiagnostics* diag, png_structp writePtr, png_infop infoPtr, PngInfo* info,
-                     int grayScaleTolerance) {
-    if (setjmp(png_jmpbuf(writePtr))) {
-        diag->error(DiagMessage() << "failed to write png");
-        return false;
+static bool writePng(IDiagnostics* diag, png_structp writePtr,
+                     png_infop infoPtr, PngInfo* info, int grayScaleTolerance) {
+  if (setjmp(png_jmpbuf(writePtr))) {
+    diag->error(DiagMessage() << "failed to write png");
+    return false;
+  }
+
+  uint32_t width, height;
+  int colorType, bitDepth, interlaceType, compressionType;
+
+  png_unknown_chunk unknowns[3];
+  unknowns[0].data = nullptr;
+  unknowns[1].data = nullptr;
+  unknowns[2].data = nullptr;
+
+  png_bytepp outRows =
+      (png_bytepp)malloc((int)info->height * sizeof(png_bytep));
+  if (outRows == (png_bytepp)0) {
+    printf("Can't allocate output buffer!\n");
+    exit(1);
+  }
+  for (uint32_t i = 0; i < info->height; i++) {
+    outRows[i] = (png_bytep)malloc(2 * (int)info->width);
+    if (outRows[i] == (png_bytep)0) {
+      printf("Can't allocate output buffer!\n");
+      exit(1);
     }
+  }
 
-    uint32_t width, height;
-    int colorType, bitDepth, interlaceType, compressionType;
+  png_set_compression_level(writePtr, Z_BEST_COMPRESSION);
 
-    png_unknown_chunk unknowns[3];
-    unknowns[0].data = nullptr;
-    unknowns[1].data = nullptr;
-    unknowns[2].data = nullptr;
+  if (kDebug) {
+    diag->note(DiagMessage() << "writing image: w = " << info->width
+                             << ", h = " << info->height);
+  }
 
-    png_bytepp outRows = (png_bytepp) malloc((int) info->height * sizeof(png_bytep));
-    if (outRows == (png_bytepp) 0) {
-        printf("Can't allocate output buffer!\n");
-        exit(1);
-    }
-    for (uint32_t i = 0; i < info->height; i++) {
-        outRows[i] = (png_bytep) malloc(2 * (int) info->width);
-        if (outRows[i] == (png_bytep) 0) {
-            printf("Can't allocate output buffer!\n");
-            exit(1);
-        }
-    }
+  png_color rgbPalette[256];
+  png_byte alphaPalette[256];
+  bool hasTransparency;
+  int paletteEntries;
 
-    png_set_compression_level(writePtr, Z_BEST_COMPRESSION);
+  analyze_image(diag, *info, grayScaleTolerance, rgbPalette, alphaPalette,
+                &paletteEntries, &hasTransparency, &colorType, outRows);
 
-    if (kDebug) {
+  // If the image is a 9-patch, we need to preserve it as a ARGB file to make
+  // sure the pixels will not be pre-dithered/clamped until we decide they are
+  if (info->is9Patch &&
+      (colorType == PNG_COLOR_TYPE_RGB || colorType == PNG_COLOR_TYPE_GRAY ||
+       colorType == PNG_COLOR_TYPE_PALETTE)) {
+    colorType = PNG_COLOR_TYPE_RGB_ALPHA;
+  }
+
+  if (kDebug) {
+    switch (colorType) {
+      case PNG_COLOR_TYPE_PALETTE:
+        diag->note(DiagMessage() << "has " << paletteEntries << " colors"
+                                 << (hasTransparency ? " (with alpha)" : "")
+                                 << ", using PNG_COLOR_TYPE_PALLETTE");
+        break;
+      case PNG_COLOR_TYPE_GRAY:
         diag->note(DiagMessage()
-                   << "writing image: w = " << info->width
-                   << ", h = " << info->height);
+                   << "is opaque gray, using PNG_COLOR_TYPE_GRAY");
+        break;
+      case PNG_COLOR_TYPE_GRAY_ALPHA:
+        diag->note(DiagMessage()
+                   << "is gray + alpha, using PNG_COLOR_TYPE_GRAY_ALPHA");
+        break;
+      case PNG_COLOR_TYPE_RGB:
+        diag->note(DiagMessage() << "is opaque RGB, using PNG_COLOR_TYPE_RGB");
+        break;
+      case PNG_COLOR_TYPE_RGB_ALPHA:
+        diag->note(DiagMessage()
+                   << "is RGB + alpha, using PNG_COLOR_TYPE_RGB_ALPHA");
+        break;
     }
+  }
 
-    png_color rgbPalette[256];
-    png_byte alphaPalette[256];
-    bool hasTransparency;
-    int paletteEntries;
+  png_set_IHDR(writePtr, infoPtr, info->width, info->height, 8, colorType,
+               PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,
+               PNG_FILTER_TYPE_DEFAULT);
 
-    analyze_image(diag, *info, grayScaleTolerance, rgbPalette, alphaPalette,
-                  &paletteEntries, &hasTransparency, &colorType, outRows);
-
-    // If the image is a 9-patch, we need to preserve it as a ARGB file to make
-    // sure the pixels will not be pre-dithered/clamped until we decide they are
-    if (info->is9Patch && (colorType == PNG_COLOR_TYPE_RGB ||
-            colorType == PNG_COLOR_TYPE_GRAY || colorType == PNG_COLOR_TYPE_PALETTE)) {
-        colorType = PNG_COLOR_TYPE_RGB_ALPHA;
+  if (colorType == PNG_COLOR_TYPE_PALETTE) {
+    png_set_PLTE(writePtr, infoPtr, rgbPalette, paletteEntries);
+    if (hasTransparency) {
+      png_set_tRNS(writePtr, infoPtr, alphaPalette, paletteEntries,
+                   (png_color_16p)0);
     }
+    png_set_filter(writePtr, 0, PNG_NO_FILTERS);
+  } else {
+    png_set_filter(writePtr, 0, PNG_ALL_FILTERS);
+  }
 
+  if (info->is9Patch) {
+    int chunkCount = 2 + (info->haveLayoutBounds ? 1 : 0);
+    int pIndex = info->haveLayoutBounds ? 2 : 1;
+    int bIndex = 1;
+    int oIndex = 0;
+
+    // Chunks ordered thusly because older platforms depend on the base 9 patch
+    // data being last
+    png_bytep chunkNames = info->haveLayoutBounds
+                               ? (png_bytep) "npOl\0npLb\0npTc\0"
+                               : (png_bytep) "npOl\0npTc";
+
+    // base 9 patch data
     if (kDebug) {
-        switch (colorType) {
-        case PNG_COLOR_TYPE_PALETTE:
-            diag->note(DiagMessage()
-                       << "has " << paletteEntries
-                       << " colors" << (hasTransparency ? " (with alpha)" : "")
-                       << ", using PNG_COLOR_TYPE_PALLETTE");
-            break;
-        case PNG_COLOR_TYPE_GRAY:
-            diag->note(DiagMessage() << "is opaque gray, using PNG_COLOR_TYPE_GRAY");
-            break;
-        case PNG_COLOR_TYPE_GRAY_ALPHA:
-            diag->note(DiagMessage() << "is gray + alpha, using PNG_COLOR_TYPE_GRAY_ALPHA");
-            break;
-        case PNG_COLOR_TYPE_RGB:
-            diag->note(DiagMessage() << "is opaque RGB, using PNG_COLOR_TYPE_RGB");
-            break;
-        case PNG_COLOR_TYPE_RGB_ALPHA:
-            diag->note(DiagMessage() << "is RGB + alpha, using PNG_COLOR_TYPE_RGB_ALPHA");
-            break;
-        }
+      diag->note(DiagMessage() << "adding 9-patch info..");
+    }
+    strcpy((char*)unknowns[pIndex].name, "npTc");
+    unknowns[pIndex].data = (png_byte*)info->serialize9Patch();
+    unknowns[pIndex].size = info->info9Patch.serializedSize();
+    // TODO: remove the check below when everything works
+    checkNinePatchSerialization(&info->info9Patch, unknowns[pIndex].data);
+
+    // automatically generated 9 patch outline data
+    int chunkSize = sizeof(png_uint_32) * 6;
+    strcpy((char*)unknowns[oIndex].name, "npOl");
+    unknowns[oIndex].data = (png_byte*)calloc(chunkSize, 1);
+    png_byte outputData[chunkSize];
+    memcpy(&outputData, &info->outlineInsetsLeft, 4 * sizeof(png_uint_32));
+    ((float*)outputData)[4] = info->outlineRadius;
+    ((png_uint_32*)outputData)[5] = info->outlineAlpha;
+    memcpy(unknowns[oIndex].data, &outputData, chunkSize);
+    unknowns[oIndex].size = chunkSize;
+
+    // optional optical inset / layout bounds data
+    if (info->haveLayoutBounds) {
+      int chunkSize = sizeof(png_uint_32) * 4;
+      strcpy((char*)unknowns[bIndex].name, "npLb");
+      unknowns[bIndex].data = (png_byte*)calloc(chunkSize, 1);
+      memcpy(unknowns[bIndex].data, &info->layoutBoundsLeft, chunkSize);
+      unknowns[bIndex].size = chunkSize;
     }
 
-    png_set_IHDR(writePtr, infoPtr, info->width, info->height, 8, colorType,
-                 PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
-
-    if (colorType == PNG_COLOR_TYPE_PALETTE) {
-        png_set_PLTE(writePtr, infoPtr, rgbPalette, paletteEntries);
-        if (hasTransparency) {
-            png_set_tRNS(writePtr, infoPtr, alphaPalette, paletteEntries, (png_color_16p) 0);
-        }
-        png_set_filter(writePtr, 0, PNG_NO_FILTERS);
-    } else {
-        png_set_filter(writePtr, 0, PNG_ALL_FILTERS);
+    for (int i = 0; i < chunkCount; i++) {
+      unknowns[i].location = PNG_HAVE_PLTE;
     }
-
-    if (info->is9Patch) {
-        int chunkCount = 2 + (info->haveLayoutBounds ? 1 : 0);
-        int pIndex = info->haveLayoutBounds ? 2 : 1;
-        int bIndex = 1;
-        int oIndex = 0;
-
-        // Chunks ordered thusly because older platforms depend on the base 9 patch data being last
-        png_bytep chunkNames = info->haveLayoutBounds
-                ? (png_bytep)"npOl\0npLb\0npTc\0"
-                : (png_bytep)"npOl\0npTc";
-
-        // base 9 patch data
-        if (kDebug) {
-            diag->note(DiagMessage() << "adding 9-patch info..");
-        }
-        strcpy((char*)unknowns[pIndex].name, "npTc");
-        unknowns[pIndex].data = (png_byte*) info->serialize9Patch();
-        unknowns[pIndex].size = info->info9Patch.serializedSize();
-        // TODO: remove the check below when everything works
-        checkNinePatchSerialization(&info->info9Patch, unknowns[pIndex].data);
-
-        // automatically generated 9 patch outline data
-        int chunkSize = sizeof(png_uint_32) * 6;
-        strcpy((char*)unknowns[oIndex].name, "npOl");
-        unknowns[oIndex].data = (png_byte*) calloc(chunkSize, 1);
-        png_byte outputData[chunkSize];
-        memcpy(&outputData, &info->outlineInsetsLeft, 4 * sizeof(png_uint_32));
-        ((float*) outputData)[4] = info->outlineRadius;
-        ((png_uint_32*) outputData)[5] = info->outlineAlpha;
-        memcpy(unknowns[oIndex].data, &outputData, chunkSize);
-        unknowns[oIndex].size = chunkSize;
-
-        // optional optical inset / layout bounds data
-        if (info->haveLayoutBounds) {
-            int chunkSize = sizeof(png_uint_32) * 4;
-            strcpy((char*)unknowns[bIndex].name, "npLb");
-            unknowns[bIndex].data = (png_byte*) calloc(chunkSize, 1);
-            memcpy(unknowns[bIndex].data, &info->layoutBoundsLeft, chunkSize);
-            unknowns[bIndex].size = chunkSize;
-        }
-
-        for (int i = 0; i < chunkCount; i++) {
-            unknowns[i].location = PNG_HAVE_PLTE;
-        }
-        png_set_keep_unknown_chunks(writePtr, PNG_HANDLE_CHUNK_ALWAYS,
-                                    chunkNames, chunkCount);
-        png_set_unknown_chunks(writePtr, infoPtr, unknowns, chunkCount);
+    png_set_keep_unknown_chunks(writePtr, PNG_HANDLE_CHUNK_ALWAYS, chunkNames,
+                                chunkCount);
+    png_set_unknown_chunks(writePtr, infoPtr, unknowns, chunkCount);
 
 #if PNG_LIBPNG_VER < 10600
-        // Deal with unknown chunk location bug in 1.5.x and earlier.
-        png_set_unknown_chunk_location(writePtr, infoPtr, 0, PNG_HAVE_PLTE);
-        if (info->haveLayoutBounds) {
-            png_set_unknown_chunk_location(writePtr, infoPtr, 1, PNG_HAVE_PLTE);
-        }
+    // Deal with unknown chunk location bug in 1.5.x and earlier.
+    png_set_unknown_chunk_location(writePtr, infoPtr, 0, PNG_HAVE_PLTE);
+    if (info->haveLayoutBounds) {
+      png_set_unknown_chunk_location(writePtr, infoPtr, 1, PNG_HAVE_PLTE);
+    }
 #endif
+  }
+
+  png_write_info(writePtr, infoPtr);
+
+  png_bytepp rows;
+  if (colorType == PNG_COLOR_TYPE_RGB ||
+      colorType == PNG_COLOR_TYPE_RGB_ALPHA) {
+    if (colorType == PNG_COLOR_TYPE_RGB) {
+      png_set_filler(writePtr, 0, PNG_FILLER_AFTER);
     }
+    rows = info->rows.data();
+  } else {
+    rows = outRows;
+  }
+  png_write_image(writePtr, rows);
 
-    png_write_info(writePtr, infoPtr);
+  if (kDebug) {
+    printf("Final image data:\n");
+    // dump_image(info->width, info->height, rows, colorType);
+  }
 
-    png_bytepp rows;
-    if (colorType == PNG_COLOR_TYPE_RGB || colorType == PNG_COLOR_TYPE_RGB_ALPHA) {
-        if (colorType == PNG_COLOR_TYPE_RGB) {
-            png_set_filler(writePtr, 0, PNG_FILLER_AFTER);
-        }
-        rows = info->rows.data();
-    } else {
-        rows = outRows;
-    }
-    png_write_image(writePtr, rows);
+  png_write_end(writePtr, infoPtr);
 
-    if (kDebug) {
-        printf("Final image data:\n");
-        //dump_image(info->width, info->height, rows, colorType);
-    }
+  for (uint32_t i = 0; i < info->height; i++) {
+    free(outRows[i]);
+  }
+  free(outRows);
+  free(unknowns[0].data);
+  free(unknowns[1].data);
+  free(unknowns[2].data);
 
-    png_write_end(writePtr, infoPtr);
+  png_get_IHDR(writePtr, infoPtr, &width, &height, &bitDepth, &colorType,
+               &interlaceType, &compressionType, nullptr);
 
-    for (uint32_t i = 0; i < info->height; i++) {
-        free(outRows[i]);
-    }
-    free(outRows);
-    free(unknowns[0].data);
-    free(unknowns[1].data);
-    free(unknowns[2].data);
-
-    png_get_IHDR(writePtr, infoPtr, &width, &height, &bitDepth, &colorType, &interlaceType,
-                 &compressionType, nullptr);
-
-    if (kDebug) {
-        diag->note(DiagMessage()
-                   << "image written: w = " << width << ", h = " << height
-                   << ", d = " << bitDepth << ", colors = " << colorType
-                   << ", inter = " << interlaceType << ", comp = " << compressionType);
-    }
-    return true;
+  if (kDebug) {
+    diag->note(DiagMessage() << "image written: w = " << width
+                             << ", h = " << height << ", d = " << bitDepth
+                             << ", colors = " << colorType
+                             << ", inter = " << interlaceType
+                             << ", comp = " << compressionType);
+  }
+  return true;
 }
 
 constexpr uint32_t kColorWhite = 0xffffffffu;
 constexpr uint32_t kColorTick = 0xff000000u;
 constexpr uint32_t kColorLayoutBoundsTick = 0xff0000ffu;
 
-enum class TickType {
-    kNone,
-    kTick,
-    kLayoutBounds,
-    kBoth
-};
+enum class TickType { kNone, kTick, kLayoutBounds, kBoth };
 
 static TickType tickType(png_bytep p, bool transparent, const char** outError) {
-    png_uint_32 color = p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);
+  png_uint_32 color = p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);
 
-    if (transparent) {
-        if (p[3] == 0) {
-            return TickType::kNone;
-        }
-        if (color == kColorLayoutBoundsTick) {
-            return TickType::kLayoutBounds;
-        }
-        if (color == kColorTick) {
-            return TickType::kTick;
-        }
-
-        // Error cases
-        if (p[3] != 0xff) {
-            *outError = "Frame pixels must be either solid or transparent "
-                        "(not intermediate alphas)";
-            return TickType::kNone;
-        }
-
-        if (p[0] != 0 || p[1] != 0 || p[2] != 0) {
-            *outError = "Ticks in transparent frame must be black or red";
-        }
-        return TickType::kTick;
-    }
-
-    if (p[3] != 0xFF) {
-        *outError = "White frame must be a solid color (no alpha)";
-    }
-    if (color == kColorWhite) {
-        return TickType::kNone;
-    }
-    if (color == kColorTick) {
-        return TickType::kTick;
+  if (transparent) {
+    if (p[3] == 0) {
+      return TickType::kNone;
     }
     if (color == kColorLayoutBoundsTick) {
-        return TickType::kLayoutBounds;
+      return TickType::kLayoutBounds;
+    }
+    if (color == kColorTick) {
+      return TickType::kTick;
+    }
+
+    // Error cases
+    if (p[3] != 0xff) {
+      *outError =
+          "Frame pixels must be either solid or transparent "
+          "(not intermediate alphas)";
+      return TickType::kNone;
     }
 
     if (p[0] != 0 || p[1] != 0 || p[2] != 0) {
-        *outError = "Ticks in white frame must be black or red";
-        return TickType::kNone;
+      *outError = "Ticks in transparent frame must be black or red";
     }
     return TickType::kTick;
+  }
+
+  if (p[3] != 0xFF) {
+    *outError = "White frame must be a solid color (no alpha)";
+  }
+  if (color == kColorWhite) {
+    return TickType::kNone;
+  }
+  if (color == kColorTick) {
+    return TickType::kTick;
+  }
+  if (color == kColorLayoutBoundsTick) {
+    return TickType::kLayoutBounds;
+  }
+
+  if (p[0] != 0 || p[1] != 0 || p[2] != 0) {
+    *outError = "Ticks in white frame must be black or red";
+    return TickType::kNone;
+  }
+  return TickType::kTick;
 }
 
-enum class TickState {
-    kStart,
-    kInside1,
-    kOutside1
-};
+enum class TickState { kStart, kInside1, kOutside1 };
 
-static bool getHorizontalTicks(png_bytep row, int width, bool transparent, bool required,
-                               int32_t* outLeft, int32_t* outRight, const char** outError,
+static bool getHorizontalTicks(png_bytep row, int width, bool transparent,
+                               bool required, int32_t* outLeft,
+                               int32_t* outRight, const char** outError,
                                uint8_t* outDivs, bool multipleAllowed) {
-    *outLeft = *outRight = -1;
-    TickState state = TickState::kStart;
-    bool found = false;
+  *outLeft = *outRight = -1;
+  TickState state = TickState::kStart;
+  bool found = false;
 
-    for (int i = 1; i < width - 1; i++) {
-        if (tickType(row+i*4, transparent, outError) == TickType::kTick) {
-            if (state == TickState::kStart ||
-                (state == TickState::kOutside1 && multipleAllowed)) {
-                *outLeft = i-1;
-                *outRight = width-2;
-                found = true;
-                if (outDivs != NULL) {
-                    *outDivs += 2;
-                }
-                state = TickState::kInside1;
-            } else if (state == TickState::kOutside1) {
-                *outError = "Can't have more than one marked region along edge";
-                *outLeft = i;
-                return false;
-            }
-        } else if (!*outError) {
-            if (state == TickState::kInside1) {
-                // We're done with this div.  Move on to the next.
-                *outRight = i-1;
-                outRight += 2;
-                outLeft += 2;
-                state = TickState::kOutside1;
-            }
-        } else {
-            *outLeft = i;
-            return false;
+  for (int i = 1; i < width - 1; i++) {
+    if (tickType(row + i * 4, transparent, outError) == TickType::kTick) {
+      if (state == TickState::kStart ||
+          (state == TickState::kOutside1 && multipleAllowed)) {
+        *outLeft = i - 1;
+        *outRight = width - 2;
+        found = true;
+        if (outDivs != NULL) {
+          *outDivs += 2;
         }
-    }
-
-    if (required && !found) {
-        *outError = "No marked region found along edge";
-        *outLeft = -1;
+        state = TickState::kInside1;
+      } else if (state == TickState::kOutside1) {
+        *outError = "Can't have more than one marked region along edge";
+        *outLeft = i;
         return false;
+      }
+    } else if (!*outError) {
+      if (state == TickState::kInside1) {
+        // We're done with this div.  Move on to the next.
+        *outRight = i - 1;
+        outRight += 2;
+        outLeft += 2;
+        state = TickState::kOutside1;
+      }
+    } else {
+      *outLeft = i;
+      return false;
     }
-    return true;
+  }
+
+  if (required && !found) {
+    *outError = "No marked region found along edge";
+    *outLeft = -1;
+    return false;
+  }
+  return true;
 }
 
-static bool getVerticalTicks(png_bytepp rows, int offset, int height, bool transparent,
-                             bool required, int32_t* outTop, int32_t* outBottom,
-                             const char** outError, uint8_t* outDivs, bool multipleAllowed) {
-    *outTop = *outBottom = -1;
-    TickState state = TickState::kStart;
-    bool found = false;
+static bool getVerticalTicks(png_bytepp rows, int offset, int height,
+                             bool transparent, bool required, int32_t* outTop,
+                             int32_t* outBottom, const char** outError,
+                             uint8_t* outDivs, bool multipleAllowed) {
+  *outTop = *outBottom = -1;
+  TickState state = TickState::kStart;
+  bool found = false;
 
-    for (int i = 1; i < height - 1; i++) {
-        if (tickType(rows[i]+offset, transparent, outError) == TickType::kTick) {
-            if (state == TickState::kStart ||
-                (state == TickState::kOutside1 && multipleAllowed)) {
-                *outTop = i-1;
-                *outBottom = height-2;
-                found = true;
-                if (outDivs != NULL) {
-                    *outDivs += 2;
-                }
-                state = TickState::kInside1;
-            } else if (state == TickState::kOutside1) {
-                *outError = "Can't have more than one marked region along edge";
-                *outTop = i;
-                return false;
-            }
-        } else if (!*outError) {
-            if (state == TickState::kInside1) {
-                // We're done with this div.  Move on to the next.
-                *outBottom = i-1;
-                outTop += 2;
-                outBottom += 2;
-                state = TickState::kOutside1;
-            }
-        } else {
-            *outTop = i;
-            return false;
+  for (int i = 1; i < height - 1; i++) {
+    if (tickType(rows[i] + offset, transparent, outError) == TickType::kTick) {
+      if (state == TickState::kStart ||
+          (state == TickState::kOutside1 && multipleAllowed)) {
+        *outTop = i - 1;
+        *outBottom = height - 2;
+        found = true;
+        if (outDivs != NULL) {
+          *outDivs += 2;
         }
-    }
-
-    if (required && !found) {
-        *outError = "No marked region found along edge";
-        *outTop = -1;
+        state = TickState::kInside1;
+      } else if (state == TickState::kOutside1) {
+        *outError = "Can't have more than one marked region along edge";
+        *outTop = i;
         return false;
+      }
+    } else if (!*outError) {
+      if (state == TickState::kInside1) {
+        // We're done with this div.  Move on to the next.
+        *outBottom = i - 1;
+        outTop += 2;
+        outBottom += 2;
+        state = TickState::kOutside1;
+      }
+    } else {
+      *outTop = i;
+      return false;
     }
-    return true;
+  }
+
+  if (required && !found) {
+    *outError = "No marked region found along edge";
+    *outTop = -1;
+    return false;
+  }
+  return true;
 }
 
-static bool getHorizontalLayoutBoundsTicks(png_bytep row, int width, bool transparent,
-                                           bool /* required */, int32_t* outLeft,
-                                           int32_t* outRight, const char** outError) {
-    *outLeft = *outRight = 0;
+static bool getHorizontalLayoutBoundsTicks(png_bytep row, int width,
+                                           bool transparent,
+                                           bool /* required */,
+                                           int32_t* outLeft, int32_t* outRight,
+                                           const char** outError) {
+  *outLeft = *outRight = 0;
 
-    // Look for left tick
-    if (tickType(row + 4, transparent, outError) == TickType::kLayoutBounds) {
-        // Starting with a layout padding tick
-        int i = 1;
-        while (i < width - 1) {
-            (*outLeft)++;
-            i++;
-            if (tickType(row + i * 4, transparent, outError) != TickType::kLayoutBounds) {
-                break;
-            }
-        }
+  // Look for left tick
+  if (tickType(row + 4, transparent, outError) == TickType::kLayoutBounds) {
+    // Starting with a layout padding tick
+    int i = 1;
+    while (i < width - 1) {
+      (*outLeft)++;
+      i++;
+      if (tickType(row + i * 4, transparent, outError) !=
+          TickType::kLayoutBounds) {
+        break;
+      }
     }
+  }
 
-    // Look for right tick
-    if (tickType(row + (width - 2) * 4, transparent, outError) == TickType::kLayoutBounds) {
-        // Ending with a layout padding tick
-        int i = width - 2;
-        while (i > 1) {
-            (*outRight)++;
-            i--;
-            if (tickType(row+i*4, transparent, outError) != TickType::kLayoutBounds) {
-                break;
-            }
-        }
+  // Look for right tick
+  if (tickType(row + (width - 2) * 4, transparent, outError) ==
+      TickType::kLayoutBounds) {
+    // Ending with a layout padding tick
+    int i = width - 2;
+    while (i > 1) {
+      (*outRight)++;
+      i--;
+      if (tickType(row + i * 4, transparent, outError) !=
+          TickType::kLayoutBounds) {
+        break;
+      }
     }
-    return true;
+  }
+  return true;
 }
 
-static bool getVerticalLayoutBoundsTicks(png_bytepp rows, int offset, int height, bool transparent,
-                                         bool /* required */, int32_t* outTop, int32_t* outBottom,
+static bool getVerticalLayoutBoundsTicks(png_bytepp rows, int offset,
+                                         int height, bool transparent,
+                                         bool /* required */, int32_t* outTop,
+                                         int32_t* outBottom,
                                          const char** outError) {
-    *outTop = *outBottom = 0;
+  *outTop = *outBottom = 0;
 
-    // Look for top tick
-    if (tickType(rows[1] + offset, transparent, outError) == TickType::kLayoutBounds) {
-        // Starting with a layout padding tick
-        int i = 1;
-        while (i < height - 1) {
-            (*outTop)++;
-            i++;
-            if (tickType(rows[i] + offset, transparent, outError) != TickType::kLayoutBounds) {
-                break;
-            }
-        }
+  // Look for top tick
+  if (tickType(rows[1] + offset, transparent, outError) ==
+      TickType::kLayoutBounds) {
+    // Starting with a layout padding tick
+    int i = 1;
+    while (i < height - 1) {
+      (*outTop)++;
+      i++;
+      if (tickType(rows[i] + offset, transparent, outError) !=
+          TickType::kLayoutBounds) {
+        break;
+      }
     }
+  }
 
-    // Look for bottom tick
-    if (tickType(rows[height - 2] + offset, transparent, outError) == TickType::kLayoutBounds) {
-        // Ending with a layout padding tick
-        int i = height - 2;
-        while (i > 1) {
-            (*outBottom)++;
-            i--;
-            if (tickType(rows[i] + offset, transparent, outError) != TickType::kLayoutBounds) {
-                break;
-            }
-        }
+  // Look for bottom tick
+  if (tickType(rows[height - 2] + offset, transparent, outError) ==
+      TickType::kLayoutBounds) {
+    // Ending with a layout padding tick
+    int i = height - 2;
+    while (i > 1) {
+      (*outBottom)++;
+      i--;
+      if (tickType(rows[i] + offset, transparent, outError) !=
+          TickType::kLayoutBounds) {
+        break;
+      }
     }
-    return true;
+  }
+  return true;
 }
 
-static void findMaxOpacity(png_bytepp rows, int startX, int startY, int endX, int endY,
-                           int dX, int dY, int* outInset) {
-    uint8_t maxOpacity = 0;
-    int inset = 0;
-    *outInset = 0;
-    for (int x = startX, y = startY; x != endX && y != endY; x += dX, y += dY, inset++) {
-        png_byte* color = rows[y] + x * 4;
-        uint8_t opacity = color[3];
-        if (opacity > maxOpacity) {
-            maxOpacity = opacity;
-            *outInset = inset;
-        }
-        if (opacity == 0xff) return;
+static void findMaxOpacity(png_bytepp rows, int startX, int startY, int endX,
+                           int endY, int dX, int dY, int* outInset) {
+  uint8_t maxOpacity = 0;
+  int inset = 0;
+  *outInset = 0;
+  for (int x = startX, y = startY; x != endX && y != endY;
+       x += dX, y += dY, inset++) {
+    png_byte* color = rows[y] + x * 4;
+    uint8_t opacity = color[3];
+    if (opacity > maxOpacity) {
+      maxOpacity = opacity;
+      *outInset = inset;
     }
+    if (opacity == 0xff) return;
+  }
 }
 
 static uint8_t maxAlphaOverRow(png_bytep row, int startX, int endX) {
-    uint8_t maxAlpha = 0;
-    for (int x = startX; x < endX; x++) {
-        uint8_t alpha = (row + x * 4)[3];
-        if (alpha > maxAlpha) maxAlpha = alpha;
-    }
-    return maxAlpha;
+  uint8_t maxAlpha = 0;
+  for (int x = startX; x < endX; x++) {
+    uint8_t alpha = (row + x * 4)[3];
+    if (alpha > maxAlpha) maxAlpha = alpha;
+  }
+  return maxAlpha;
 }
 
-static uint8_t maxAlphaOverCol(png_bytepp rows, int offsetX, int startY, int endY) {
-    uint8_t maxAlpha = 0;
-    for (int y = startY; y < endY; y++) {
-        uint8_t alpha = (rows[y] + offsetX * 4)[3];
-        if (alpha > maxAlpha) maxAlpha = alpha;
-    }
-    return maxAlpha;
+static uint8_t maxAlphaOverCol(png_bytepp rows, int offsetX, int startY,
+                               int endY) {
+  uint8_t maxAlpha = 0;
+  for (int y = startY; y < endY; y++) {
+    uint8_t alpha = (rows[y] + offsetX * 4)[3];
+    if (alpha > maxAlpha) maxAlpha = alpha;
+  }
+  return maxAlpha;
 }
 
 static void getOutline(PngInfo* image) {
-    int midX = image->width / 2;
-    int midY = image->height / 2;
-    int endX = image->width - 2;
-    int endY = image->height - 2;
+  int midX = image->width / 2;
+  int midY = image->height / 2;
+  int endX = image->width - 2;
+  int endY = image->height - 2;
 
-    // find left and right extent of nine patch content on center row
-    if (image->width > 4) {
-        findMaxOpacity(image->rows.data(), 1, midY, midX, -1, 1, 0, &image->outlineInsetsLeft);
-        findMaxOpacity(image->rows.data(), endX, midY, midX, -1, -1, 0,
-                       &image->outlineInsetsRight);
-    } else {
-        image->outlineInsetsLeft = 0;
-        image->outlineInsetsRight = 0;
-    }
+  // find left and right extent of nine patch content on center row
+  if (image->width > 4) {
+    findMaxOpacity(image->rows.data(), 1, midY, midX, -1, 1, 0,
+                   &image->outlineInsetsLeft);
+    findMaxOpacity(image->rows.data(), endX, midY, midX, -1, -1, 0,
+                   &image->outlineInsetsRight);
+  } else {
+    image->outlineInsetsLeft = 0;
+    image->outlineInsetsRight = 0;
+  }
 
-    // find top and bottom extent of nine patch content on center column
-    if (image->height > 4) {
-        findMaxOpacity(image->rows.data(), midX, 1, -1, midY, 0, 1, &image->outlineInsetsTop);
-        findMaxOpacity(image->rows.data(), midX, endY, -1, midY, 0, -1,
-                       &image->outlineInsetsBottom);
-    } else {
-        image->outlineInsetsTop = 0;
-        image->outlineInsetsBottom = 0;
-    }
+  // find top and bottom extent of nine patch content on center column
+  if (image->height > 4) {
+    findMaxOpacity(image->rows.data(), midX, 1, -1, midY, 0, 1,
+                   &image->outlineInsetsTop);
+    findMaxOpacity(image->rows.data(), midX, endY, -1, midY, 0, -1,
+                   &image->outlineInsetsBottom);
+  } else {
+    image->outlineInsetsTop = 0;
+    image->outlineInsetsBottom = 0;
+  }
 
-    int innerStartX = 1 + image->outlineInsetsLeft;
-    int innerStartY = 1 + image->outlineInsetsTop;
-    int innerEndX = endX - image->outlineInsetsRight;
-    int innerEndY = endY - image->outlineInsetsBottom;
-    int innerMidX = (innerEndX + innerStartX) / 2;
-    int innerMidY = (innerEndY + innerStartY) / 2;
+  int innerStartX = 1 + image->outlineInsetsLeft;
+  int innerStartY = 1 + image->outlineInsetsTop;
+  int innerEndX = endX - image->outlineInsetsRight;
+  int innerEndY = endY - image->outlineInsetsBottom;
+  int innerMidX = (innerEndX + innerStartX) / 2;
+  int innerMidY = (innerEndY + innerStartY) / 2;
 
-    // assuming the image is a round rect, compute the radius by marching
-    // diagonally from the top left corner towards the center
-    image->outlineAlpha = std::max(
-            maxAlphaOverRow(image->rows[innerMidY], innerStartX, innerEndX),
-            maxAlphaOverCol(image->rows.data(), innerMidX, innerStartY, innerStartY));
+  // assuming the image is a round rect, compute the radius by marching
+  // diagonally from the top left corner towards the center
+  image->outlineAlpha = std::max(
+      maxAlphaOverRow(image->rows[innerMidY], innerStartX, innerEndX),
+      maxAlphaOverCol(image->rows.data(), innerMidX, innerStartY, innerStartY));
 
-    int diagonalInset = 0;
-    findMaxOpacity(image->rows.data(), innerStartX, innerStartY, innerMidX, innerMidY, 1, 1,
-                   &diagonalInset);
+  int diagonalInset = 0;
+  findMaxOpacity(image->rows.data(), innerStartX, innerStartY, innerMidX,
+                 innerMidY, 1, 1, &diagonalInset);
 
-    /* Determine source radius based upon inset:
-     *     sqrt(r^2 + r^2) = sqrt(i^2 + i^2) + r
-     *     sqrt(2) * r = sqrt(2) * i + r
-     *     (sqrt(2) - 1) * r = sqrt(2) * i
-     *     r = sqrt(2) / (sqrt(2) - 1) * i
-     */
-    image->outlineRadius = 3.4142f * diagonalInset;
+  /* Determine source radius based upon inset:
+   *     sqrt(r^2 + r^2) = sqrt(i^2 + i^2) + r
+   *     sqrt(2) * r = sqrt(2) * i + r
+   *     (sqrt(2) - 1) * r = sqrt(2) * i
+   *     r = sqrt(2) / (sqrt(2) - 1) * i
+   */
+  image->outlineRadius = 3.4142f * diagonalInset;
 
-    if (kDebug) {
-        printf("outline insets %d %d %d %d, rad %f, alpha %x\n",
-                image->outlineInsetsLeft,
-                image->outlineInsetsTop,
-                image->outlineInsetsRight,
-                image->outlineInsetsBottom,
-                image->outlineRadius,
-                image->outlineAlpha);
-    }
+  if (kDebug) {
+    printf("outline insets %d %d %d %d, rad %f, alpha %x\n",
+           image->outlineInsetsLeft, image->outlineInsetsTop,
+           image->outlineInsetsRight, image->outlineInsetsBottom,
+           image->outlineRadius, image->outlineAlpha);
+  }
 }
 
-static uint32_t getColor(png_bytepp rows, int left, int top, int right, int bottom) {
-    png_bytep color = rows[top] + left*4;
+static uint32_t getColor(png_bytepp rows, int left, int top, int right,
+                         int bottom) {
+  png_bytep color = rows[top] + left * 4;
 
-    if (left > right || top > bottom) {
-        return android::Res_png_9patch::TRANSPARENT_COLOR;
-    }
+  if (left > right || top > bottom) {
+    return android::Res_png_9patch::TRANSPARENT_COLOR;
+  }
 
-    while (top <= bottom) {
-        for (int i = left; i <= right; i++) {
-            png_bytep p = rows[top]+i*4;
-            if (color[3] == 0) {
-                if (p[3] != 0) {
-                    return android::Res_png_9patch::NO_COLOR;
-                }
-            } else if (p[0] != color[0] || p[1] != color[1] ||
-                    p[2] != color[2] || p[3] != color[3]) {
-                return android::Res_png_9patch::NO_COLOR;
-            }
+  while (top <= bottom) {
+    for (int i = left; i <= right; i++) {
+      png_bytep p = rows[top] + i * 4;
+      if (color[3] == 0) {
+        if (p[3] != 0) {
+          return android::Res_png_9patch::NO_COLOR;
         }
-        top++;
+      } else if (p[0] != color[0] || p[1] != color[1] || p[2] != color[2] ||
+                 p[3] != color[3]) {
+        return android::Res_png_9patch::NO_COLOR;
+      }
     }
+    top++;
+  }
 
-    if (color[3] == 0) {
-        return android::Res_png_9patch::TRANSPARENT_COLOR;
-    }
-    return (color[3]<<24) | (color[0]<<16) | (color[1]<<8) | color[2];
+  if (color[3] == 0) {
+    return android::Res_png_9patch::TRANSPARENT_COLOR;
+  }
+  return (color[3] << 24) | (color[0] << 16) | (color[1] << 8) | color[2];
 }
 
 static bool do9Patch(PngInfo* image, std::string* outError) {
-    image->is9Patch = true;
+  image->is9Patch = true;
 
-    int W = image->width;
-    int H = image->height;
-    int i, j;
+  int W = image->width;
+  int H = image->height;
+  int i, j;
 
-    const int maxSizeXDivs = W * sizeof(int32_t);
-    const int maxSizeYDivs = H * sizeof(int32_t);
-    int32_t* xDivs = image->xDivs = new int32_t[W];
-    int32_t* yDivs = image->yDivs = new int32_t[H];
-    uint8_t numXDivs = 0;
-    uint8_t numYDivs = 0;
+  const int maxSizeXDivs = W * sizeof(int32_t);
+  const int maxSizeYDivs = H * sizeof(int32_t);
+  int32_t* xDivs = image->xDivs = new int32_t[W];
+  int32_t* yDivs = image->yDivs = new int32_t[H];
+  uint8_t numXDivs = 0;
+  uint8_t numYDivs = 0;
 
-    int8_t numColors;
-    int numRows;
-    int numCols;
-    int top;
-    int left;
-    int right;
-    int bottom;
-    memset(xDivs, -1, maxSizeXDivs);
-    memset(yDivs, -1, maxSizeYDivs);
-    image->info9Patch.paddingLeft = image->info9Patch.paddingRight = -1;
-    image->info9Patch.paddingTop = image->info9Patch.paddingBottom = -1;
-    image->layoutBoundsLeft = image->layoutBoundsRight = 0;
-    image->layoutBoundsTop = image->layoutBoundsBottom = 0;
+  int8_t numColors;
+  int numRows;
+  int numCols;
+  int top;
+  int left;
+  int right;
+  int bottom;
+  memset(xDivs, -1, maxSizeXDivs);
+  memset(yDivs, -1, maxSizeYDivs);
+  image->info9Patch.paddingLeft = image->info9Patch.paddingRight = -1;
+  image->info9Patch.paddingTop = image->info9Patch.paddingBottom = -1;
+  image->layoutBoundsLeft = image->layoutBoundsRight = 0;
+  image->layoutBoundsTop = image->layoutBoundsBottom = 0;
 
-    png_bytep p = image->rows[0];
-    bool transparent = p[3] == 0;
-    bool hasColor = false;
+  png_bytep p = image->rows[0];
+  bool transparent = p[3] == 0;
+  bool hasColor = false;
 
-    const char* errorMsg = nullptr;
-    int errorPixel = -1;
-    const char* errorEdge = nullptr;
+  const char* errorMsg = nullptr;
+  int errorPixel = -1;
+  const char* errorEdge = nullptr;
 
-    int colorIndex = 0;
-    std::vector<png_bytep> newRows;
+  int colorIndex = 0;
+  std::vector<png_bytep> newRows;
 
-    // Validate size...
-    if (W < 3 || H < 3) {
-        errorMsg = "Image must be at least 3x3 (1x1 without frame) pixels";
-        goto getout;
+  // Validate size...
+  if (W < 3 || H < 3) {
+    errorMsg = "Image must be at least 3x3 (1x1 without frame) pixels";
+    goto getout;
+  }
+
+  // Validate frame...
+  if (!transparent &&
+      (p[0] != 0xFF || p[1] != 0xFF || p[2] != 0xFF || p[3] != 0xFF)) {
+    errorMsg = "Must have one-pixel frame that is either transparent or white";
+    goto getout;
+  }
+
+  // Find left and right of sizing areas...
+  if (!getHorizontalTicks(p, W, transparent, true, &xDivs[0], &xDivs[1],
+                          &errorMsg, &numXDivs, true)) {
+    errorPixel = xDivs[0];
+    errorEdge = "top";
+    goto getout;
+  }
+
+  // Find top and bottom of sizing areas...
+  if (!getVerticalTicks(image->rows.data(), 0, H, transparent, true, &yDivs[0],
+                        &yDivs[1], &errorMsg, &numYDivs, true)) {
+    errorPixel = yDivs[0];
+    errorEdge = "left";
+    goto getout;
+  }
+
+  // Copy patch size data into image...
+  image->info9Patch.numXDivs = numXDivs;
+  image->info9Patch.numYDivs = numYDivs;
+
+  // Find left and right of padding area...
+  if (!getHorizontalTicks(image->rows[H - 1], W, transparent, false,
+                          &image->info9Patch.paddingLeft,
+                          &image->info9Patch.paddingRight, &errorMsg, nullptr,
+                          false)) {
+    errorPixel = image->info9Patch.paddingLeft;
+    errorEdge = "bottom";
+    goto getout;
+  }
+
+  // Find top and bottom of padding area...
+  if (!getVerticalTicks(image->rows.data(), (W - 1) * 4, H, transparent, false,
+                        &image->info9Patch.paddingTop,
+                        &image->info9Patch.paddingBottom, &errorMsg, nullptr,
+                        false)) {
+    errorPixel = image->info9Patch.paddingTop;
+    errorEdge = "right";
+    goto getout;
+  }
+
+  // Find left and right of layout padding...
+  getHorizontalLayoutBoundsTicks(image->rows[H - 1], W, transparent, false,
+                                 &image->layoutBoundsLeft,
+                                 &image->layoutBoundsRight, &errorMsg);
+
+  getVerticalLayoutBoundsTicks(image->rows.data(), (W - 1) * 4, H, transparent,
+                               false, &image->layoutBoundsTop,
+                               &image->layoutBoundsBottom, &errorMsg);
+
+  image->haveLayoutBounds =
+      image->layoutBoundsLeft != 0 || image->layoutBoundsRight != 0 ||
+      image->layoutBoundsTop != 0 || image->layoutBoundsBottom != 0;
+
+  if (image->haveLayoutBounds) {
+    if (kDebug) {
+      printf("layoutBounds=%d %d %d %d\n", image->layoutBoundsLeft,
+             image->layoutBoundsTop, image->layoutBoundsRight,
+             image->layoutBoundsBottom);
     }
+  }
 
-    // Validate frame...
-    if (!transparent &&
-            (p[0] != 0xFF || p[1] != 0xFF || p[2] != 0xFF || p[3] != 0xFF)) {
-        errorMsg = "Must have one-pixel frame that is either transparent or white";
-        goto getout;
-    }
+  // use opacity of pixels to estimate the round rect outline
+  getOutline(image);
 
-    // Find left and right of sizing areas...
-    if (!getHorizontalTicks(p, W, transparent, true, &xDivs[0], &xDivs[1], &errorMsg, &numXDivs,
-                            true)) {
-        errorPixel = xDivs[0];
-        errorEdge = "top";
-        goto getout;
-    }
+  // If padding is not yet specified, take values from size.
+  if (image->info9Patch.paddingLeft < 0) {
+    image->info9Patch.paddingLeft = xDivs[0];
+    image->info9Patch.paddingRight = W - 2 - xDivs[1];
+  } else {
+    // Adjust value to be correct!
+    image->info9Patch.paddingRight = W - 2 - image->info9Patch.paddingRight;
+  }
+  if (image->info9Patch.paddingTop < 0) {
+    image->info9Patch.paddingTop = yDivs[0];
+    image->info9Patch.paddingBottom = H - 2 - yDivs[1];
+  } else {
+    // Adjust value to be correct!
+    image->info9Patch.paddingBottom = H - 2 - image->info9Patch.paddingBottom;
+  }
 
-    // Find top and bottom of sizing areas...
-    if (!getVerticalTicks(image->rows.data(), 0, H, transparent, true, &yDivs[0], &yDivs[1],
-                          &errorMsg, &numYDivs, true)) {
-        errorPixel = yDivs[0];
-        errorEdge = "left";
-        goto getout;
-    }
+  /*    if (kDebug) {
+          printf("Size ticks for %s: x0=%d, x1=%d, y0=%d, y1=%d\n", imageName,
+                  xDivs[0], xDivs[1],
+                  yDivs[0], yDivs[1]);
+          printf("padding ticks for %s: l=%d, r=%d, t=%d, b=%d\n", imageName,
+                  image->info9Patch.paddingLeft, image->info9Patch.paddingRight,
+                  image->info9Patch.paddingTop,
+     image->info9Patch.paddingBottom);
+      }*/
 
-    // Copy patch size data into image...
-    image->info9Patch.numXDivs = numXDivs;
-    image->info9Patch.numYDivs = numYDivs;
+  // Remove frame from image.
+  newRows.resize(H - 2);
+  for (i = 0; i < H - 2; i++) {
+    newRows[i] = image->rows[i + 1];
+    memmove(newRows[i], newRows[i] + 4, (W - 2) * 4);
+  }
+  image->rows.swap(newRows);
 
-    // Find left and right of padding area...
-    if (!getHorizontalTicks(image->rows[H-1], W, transparent, false,
-                            &image->info9Patch.paddingLeft, &image->info9Patch.paddingRight,
-                            &errorMsg, nullptr, false)) {
-        errorPixel = image->info9Patch.paddingLeft;
-        errorEdge = "bottom";
-        goto getout;
-    }
+  image->width -= 2;
+  W = image->width;
+  image->height -= 2;
+  H = image->height;
 
-    // Find top and bottom of padding area...
-    if (!getVerticalTicks(image->rows.data(), (W-1)*4, H, transparent, false,
-                          &image->info9Patch.paddingTop, &image->info9Patch.paddingBottom,
-                          &errorMsg, nullptr, false)) {
-        errorPixel = image->info9Patch.paddingTop;
-        errorEdge = "right";
-        goto getout;
-    }
+  // Figure out the number of rows and columns in the N-patch
+  numCols = numXDivs + 1;
+  if (xDivs[0] == 0) {  // Column 1 is strechable
+    numCols--;
+  }
+  if (xDivs[numXDivs - 1] == W) {
+    numCols--;
+  }
+  numRows = numYDivs + 1;
+  if (yDivs[0] == 0) {  // Row 1 is strechable
+    numRows--;
+  }
+  if (yDivs[numYDivs - 1] == H) {
+    numRows--;
+  }
 
-    // Find left and right of layout padding...
-    getHorizontalLayoutBoundsTicks(image->rows[H-1], W, transparent, false,
-                                   &image->layoutBoundsLeft, &image->layoutBoundsRight, &errorMsg);
+  // Make sure the amount of rows and columns will fit in the number of
+  // colors we can use in the 9-patch format.
+  if (numRows * numCols > 0x7F) {
+    errorMsg = "Too many rows and columns in 9-patch perimeter";
+    goto getout;
+  }
 
-    getVerticalLayoutBoundsTicks(image->rows.data(), (W-1)*4, H, transparent, false,
-                                 &image->layoutBoundsTop, &image->layoutBoundsBottom, &errorMsg);
+  numColors = numRows * numCols;
+  image->info9Patch.numColors = numColors;
+  image->colors.resize(numColors);
 
-    image->haveLayoutBounds = image->layoutBoundsLeft != 0
-                               || image->layoutBoundsRight != 0
-                               || image->layoutBoundsTop != 0
-                               || image->layoutBoundsBottom != 0;
+  // Fill in color information for each patch.
 
-    if (image->haveLayoutBounds) {
-        if (kDebug) {
-            printf("layoutBounds=%d %d %d %d\n", image->layoutBoundsLeft, image->layoutBoundsTop,
-                    image->layoutBoundsRight, image->layoutBoundsBottom);
-        }
-    }
+  uint32_t c;
+  top = 0;
 
-    // use opacity of pixels to estimate the round rect outline
-    getOutline(image);
+  // The first row always starts with the top being at y=0 and the bottom
+  // being either yDivs[1] (if yDivs[0]=0) of yDivs[0].  In the former case
+  // the first row is stretchable along the Y axis, otherwise it is fixed.
+  // The last row always ends with the bottom being bitmap.height and the top
+  // being either yDivs[numYDivs-2] (if yDivs[numYDivs-1]=bitmap.height) or
+  // yDivs[numYDivs-1]. In the former case the last row is stretchable along
+  // the Y axis, otherwise it is fixed.
+  //
+  // The first and last columns are similarly treated with respect to the X
+  // axis.
+  //
+  // The above is to help explain some of the special casing that goes on the
+  // code below.
 
-    // If padding is not yet specified, take values from size.
-    if (image->info9Patch.paddingLeft < 0) {
-        image->info9Patch.paddingLeft = xDivs[0];
-        image->info9Patch.paddingRight = W - 2 - xDivs[1];
+  // The initial yDiv and whether the first row is considered stretchable or
+  // not depends on whether yDiv[0] was zero or not.
+  for (j = (yDivs[0] == 0 ? 1 : 0); j <= numYDivs && top < H; j++) {
+    if (j == numYDivs) {
+      bottom = H;
     } else {
-        // Adjust value to be correct!
-        image->info9Patch.paddingRight = W - 2 - image->info9Patch.paddingRight;
+      bottom = yDivs[j];
     }
-    if (image->info9Patch.paddingTop < 0) {
-        image->info9Patch.paddingTop = yDivs[0];
-        image->info9Patch.paddingBottom = H - 2 - yDivs[1];
-    } else {
-        // Adjust value to be correct!
-        image->info9Patch.paddingBottom = H - 2 - image->info9Patch.paddingBottom;
-    }
-
-/*    if (kDebug) {
-        printf("Size ticks for %s: x0=%d, x1=%d, y0=%d, y1=%d\n", imageName,
-                xDivs[0], xDivs[1],
-                yDivs[0], yDivs[1]);
-        printf("padding ticks for %s: l=%d, r=%d, t=%d, b=%d\n", imageName,
-                image->info9Patch.paddingLeft, image->info9Patch.paddingRight,
-                image->info9Patch.paddingTop, image->info9Patch.paddingBottom);
-    }*/
-
-    // Remove frame from image.
-    newRows.resize(H - 2);
-    for (i = 0; i < H - 2; i++) {
-        newRows[i] = image->rows[i + 1];
-        memmove(newRows[i], newRows[i] + 4, (W - 2) * 4);
-    }
-    image->rows.swap(newRows);
-
-    image->width -= 2;
-    W = image->width;
-    image->height -= 2;
-    H = image->height;
-
-    // Figure out the number of rows and columns in the N-patch
-    numCols = numXDivs + 1;
-    if (xDivs[0] == 0) {  // Column 1 is strechable
-        numCols--;
-    }
-    if (xDivs[numXDivs - 1] == W) {
-        numCols--;
-    }
-    numRows = numYDivs + 1;
-    if (yDivs[0] == 0) {  // Row 1 is strechable
-        numRows--;
-    }
-    if (yDivs[numYDivs - 1] == H) {
-        numRows--;
-    }
-
-    // Make sure the amount of rows and columns will fit in the number of
-    // colors we can use in the 9-patch format.
-    if (numRows * numCols > 0x7F) {
-        errorMsg = "Too many rows and columns in 9-patch perimeter";
-        goto getout;
-    }
-
-    numColors = numRows * numCols;
-    image->info9Patch.numColors = numColors;
-    image->colors.resize(numColors);
-
-    // Fill in color information for each patch.
-
-    uint32_t c;
-    top = 0;
-
-    // The first row always starts with the top being at y=0 and the bottom
-    // being either yDivs[1] (if yDivs[0]=0) of yDivs[0].  In the former case
-    // the first row is stretchable along the Y axis, otherwise it is fixed.
-    // The last row always ends with the bottom being bitmap.height and the top
-    // being either yDivs[numYDivs-2] (if yDivs[numYDivs-1]=bitmap.height) or
-    // yDivs[numYDivs-1]. In the former case the last row is stretchable along
-    // the Y axis, otherwise it is fixed.
-    //
-    // The first and last columns are similarly treated with respect to the X
-    // axis.
-    //
-    // The above is to help explain some of the special casing that goes on the
-    // code below.
-
-    // The initial yDiv and whether the first row is considered stretchable or
-    // not depends on whether yDiv[0] was zero or not.
-    for (j = (yDivs[0] == 0 ? 1 : 0); j <= numYDivs && top < H; j++) {
-        if (j == numYDivs) {
-            bottom = H;
-        } else {
-            bottom = yDivs[j];
+    left = 0;
+    // The initial xDiv and whether the first column is considered
+    // stretchable or not depends on whether xDiv[0] was zero or not.
+    for (i = xDivs[0] == 0 ? 1 : 0; i <= numXDivs && left < W; i++) {
+      if (i == numXDivs) {
+        right = W;
+      } else {
+        right = xDivs[i];
+      }
+      c = getColor(image->rows.data(), left, top, right - 1, bottom - 1);
+      image->colors[colorIndex++] = c;
+      if (kDebug) {
+        if (c != android::Res_png_9patch::NO_COLOR) {
+          hasColor = true;
         }
-        left = 0;
-        // The initial xDiv and whether the first column is considered
-        // stretchable or not depends on whether xDiv[0] was zero or not.
-        for (i = xDivs[0] == 0 ? 1 : 0; i <= numXDivs && left < W; i++) {
-            if (i == numXDivs) {
-                right = W;
-            } else {
-                right = xDivs[i];
-            }
-            c = getColor(image->rows.data(), left, top, right - 1, bottom - 1);
-            image->colors[colorIndex++] = c;
-            if (kDebug) {
-                if (c != android::Res_png_9patch::NO_COLOR) {
-                    hasColor = true;
-                }
-            }
-            left = right;
-        }
-        top = bottom;
+      }
+      left = right;
     }
+    top = bottom;
+  }
 
-    assert(colorIndex == numColors);
+  assert(colorIndex == numColors);
 
-    if (kDebug && hasColor) {
-        for (i = 0; i < numColors; i++) {
-            if (i == 0) printf("Colors:\n");
-            printf(" #%08x", image->colors[i]);
-            if (i == numColors - 1) printf("\n");
-        }
+  if (kDebug && hasColor) {
+    for (i = 0; i < numColors; i++) {
+      if (i == 0) printf("Colors:\n");
+      printf(" #%08x", image->colors[i]);
+      if (i == numColors - 1) printf("\n");
     }
+  }
 getout:
-    if (errorMsg) {
-        std::stringstream err;
-        err << "9-patch malformed: " << errorMsg;
-        if (errorEdge) {
-            err << "." << std::endl;
-            if (errorPixel >= 0) {
-                err << "Found at pixel #" << errorPixel << " along " << errorEdge << " edge";
-            } else {
-                err << "Found along " << errorEdge << " edge";
-            }
-        }
-        *outError = err.str();
-        return false;
+  if (errorMsg) {
+    std::stringstream err;
+    err << "9-patch malformed: " << errorMsg;
+    if (errorEdge) {
+      err << "." << std::endl;
+      if (errorPixel >= 0) {
+        err << "Found at pixel #" << errorPixel << " along " << errorEdge
+            << " edge";
+      } else {
+        err << "Found along " << errorEdge << " edge";
+      }
     }
-    return true;
+    *outError = err.str();
+    return false;
+  }
+  return true;
 }
 
+bool Png::process(const Source& source, std::istream* input,
+                  BigBuffer* outBuffer, const PngOptions& options) {
+  png_byte signature[kPngSignatureSize];
 
-bool Png::process(const Source& source, std::istream* input, BigBuffer* outBuffer,
-                  const PngOptions& options) {
-    png_byte signature[kPngSignatureSize];
+  // Read the PNG signature first.
+  if (!input->read(reinterpret_cast<char*>(signature), kPngSignatureSize)) {
+    mDiag->error(DiagMessage() << strerror(errno));
+    return false;
+  }
 
-    // Read the PNG signature first.
-    if (!input->read(reinterpret_cast<char*>(signature), kPngSignatureSize)) {
-        mDiag->error(DiagMessage() << strerror(errno));
-        return false;
+  // If the PNG signature doesn't match, bail early.
+  if (png_sig_cmp(signature, 0, kPngSignatureSize) != 0) {
+    mDiag->error(DiagMessage() << "not a valid png file");
+    return false;
+  }
+
+  bool result = false;
+  png_structp readPtr = nullptr;
+  png_infop infoPtr = nullptr;
+  png_structp writePtr = nullptr;
+  png_infop writeInfoPtr = nullptr;
+  PngInfo pngInfo = {};
+
+  readPtr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, nullptr, nullptr);
+  if (!readPtr) {
+    mDiag->error(DiagMessage() << "failed to allocate read ptr");
+    goto bail;
+  }
+
+  infoPtr = png_create_info_struct(readPtr);
+  if (!infoPtr) {
+    mDiag->error(DiagMessage() << "failed to allocate info ptr");
+    goto bail;
+  }
+
+  png_set_error_fn(readPtr, reinterpret_cast<png_voidp>(mDiag), nullptr,
+                   logWarning);
+
+  // Set the read function to read from std::istream.
+  png_set_read_fn(readPtr, (png_voidp)input, readDataFromStream);
+
+  if (!readPng(mDiag, readPtr, infoPtr, &pngInfo)) {
+    goto bail;
+  }
+
+  if (util::stringEndsWith(source.path, ".9.png")) {
+    std::string errorMsg;
+    if (!do9Patch(&pngInfo, &errorMsg)) {
+      mDiag->error(DiagMessage() << errorMsg);
+      goto bail;
     }
+  }
 
-    // If the PNG signature doesn't match, bail early.
-    if (png_sig_cmp(signature, 0, kPngSignatureSize) != 0) {
-        mDiag->error(DiagMessage() << "not a valid png file");
-        return false;
-    }
+  writePtr =
+      png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, nullptr, nullptr);
+  if (!writePtr) {
+    mDiag->error(DiagMessage() << "failed to allocate write ptr");
+    goto bail;
+  }
 
-    bool result = false;
-    png_structp readPtr = nullptr;
-    png_infop infoPtr = nullptr;
-    png_structp writePtr = nullptr;
-    png_infop writeInfoPtr = nullptr;
-    PngInfo pngInfo = {};
+  writeInfoPtr = png_create_info_struct(writePtr);
+  if (!writeInfoPtr) {
+    mDiag->error(DiagMessage() << "failed to allocate write info ptr");
+    goto bail;
+  }
 
-    readPtr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, nullptr, nullptr);
-    if (!readPtr) {
-        mDiag->error(DiagMessage() << "failed to allocate read ptr");
-        goto bail;
-    }
+  png_set_error_fn(writePtr, nullptr, nullptr, logWarning);
 
-    infoPtr = png_create_info_struct(readPtr);
-    if (!infoPtr) {
-        mDiag->error(DiagMessage() << "failed to allocate info ptr");
-        goto bail;
-    }
+  // Set the write function to write to std::ostream.
+  png_set_write_fn(writePtr, (png_voidp)outBuffer, writeDataToStream,
+                   flushDataToStream);
 
-    png_set_error_fn(readPtr, reinterpret_cast<png_voidp>(mDiag), nullptr, logWarning);
+  if (!writePng(mDiag, writePtr, writeInfoPtr, &pngInfo,
+                options.grayScaleTolerance)) {
+    goto bail;
+  }
 
-    // Set the read function to read from std::istream.
-    png_set_read_fn(readPtr, (png_voidp) input, readDataFromStream);
-
-    if (!readPng(mDiag, readPtr, infoPtr, &pngInfo)) {
-        goto bail;
-    }
-
-    if (util::stringEndsWith(source.path, ".9.png")) {
-        std::string errorMsg;
-        if (!do9Patch(&pngInfo, &errorMsg)) {
-            mDiag->error(DiagMessage() << errorMsg);
-            goto bail;
-        }
-    }
-
-    writePtr = png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, nullptr, nullptr);
-    if (!writePtr) {
-        mDiag->error(DiagMessage() << "failed to allocate write ptr");
-        goto bail;
-    }
-
-    writeInfoPtr = png_create_info_struct(writePtr);
-    if (!writeInfoPtr) {
-        mDiag->error(DiagMessage() << "failed to allocate write info ptr");
-        goto bail;
-    }
-
-    png_set_error_fn(writePtr, nullptr, nullptr, logWarning);
-
-    // Set the write function to write to std::ostream.
-    png_set_write_fn(writePtr, (png_voidp)outBuffer, writeDataToStream, flushDataToStream);
-
-    if (!writePng(mDiag, writePtr, writeInfoPtr, &pngInfo, options.grayScaleTolerance)) {
-        goto bail;
-    }
-
-    result = true;
+  result = true;
 bail:
-    if (readPtr) {
-        png_destroy_read_struct(&readPtr, &infoPtr, nullptr);
-    }
+  if (readPtr) {
+    png_destroy_read_struct(&readPtr, &infoPtr, nullptr);
+  }
 
-    if (writePtr) {
-        png_destroy_write_struct(&writePtr, &writeInfoPtr);
-    }
-    return result;
+  if (writePtr) {
+    png_destroy_write_struct(&writePtr, &writeInfoPtr);
+  }
+  return result;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/Png.h b/tools/aapt2/compile/Png.h
index 4a15d95..f9038af 100644
--- a/tools/aapt2/compile/Png.h
+++ b/tools/aapt2/compile/Png.h
@@ -31,51 +31,48 @@
 namespace aapt {
 
 struct PngOptions {
-    int grayScaleTolerance = 0;
+  int grayScaleTolerance = 0;
 };
 
 class Png {
-public:
-    explicit Png(IDiagnostics* diag) : mDiag(diag) {
-    }
+ public:
+  explicit Png(IDiagnostics* diag) : mDiag(diag) {}
 
-    bool process(const Source& source, std::istream* input, BigBuffer* outBuffer,
-                 const PngOptions& options);
+  bool process(const Source& source, std::istream* input, BigBuffer* outBuffer,
+               const PngOptions& options);
 
-private:
-    IDiagnostics* mDiag;
+ private:
+  IDiagnostics* mDiag;
 
-    DISALLOW_COPY_AND_ASSIGN(Png);
+  DISALLOW_COPY_AND_ASSIGN(Png);
 };
 
 /**
  * An InputStream that filters out unimportant PNG chunks.
  */
 class PngChunkFilter : public io::InputStream {
-public:
-    explicit PngChunkFilter(const StringPiece& data);
+ public:
+  explicit PngChunkFilter(const StringPiece& data);
 
-    bool Next(const void** buffer, int* len) override;
-    void BackUp(int count) override;
-    bool Skip(int count) override;
+  bool Next(const void** buffer, int* len) override;
+  void BackUp(int count) override;
+  bool Skip(int count) override;
 
-    int64_t ByteCount() const override {
-        return static_cast<int64_t>(mWindowStart);
-    }
+  int64_t ByteCount() const override {
+    return static_cast<int64_t>(mWindowStart);
+  }
 
-    bool HadError() const override {
-        return mError;
-    }
+  bool HadError() const override { return mError; }
 
-private:
-    bool consumeWindow(const void** buffer, int* len);
+ private:
+  bool consumeWindow(const void** buffer, int* len);
 
-    StringPiece mData;
-    size_t mWindowStart = 0;
-    size_t mWindowEnd = 0;
-    bool mError = false;
+  StringPiece mData;
+  size_t mWindowStart = 0;
+  size_t mWindowEnd = 0;
+  bool mError = false;
 
-    DISALLOW_COPY_AND_ASSIGN(PngChunkFilter);
+  DISALLOW_COPY_AND_ASSIGN(PngChunkFilter);
 };
 
 /**
@@ -84,11 +81,13 @@
 std::unique_ptr<Image> readPng(IAaptContext* context, io::InputStream* in);
 
 /**
- * Writes the RGBA Image, with optional 9-patch meta-data, into the OutputStream as a PNG.
+ * Writes the RGBA Image, with optional 9-patch meta-data, into the OutputStream
+ * as a PNG.
  */
-bool writePng(IAaptContext* context, const Image* image, const NinePatch* ninePatch,
-              io::OutputStream* out, const PngOptions& options);
+bool writePng(IAaptContext* context, const Image* image,
+              const NinePatch* ninePatch, io::OutputStream* out,
+              const PngOptions& options);
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_PNG_H
+#endif  // AAPT_PNG_H
diff --git a/tools/aapt2/compile/PngChunkFilter.cpp b/tools/aapt2/compile/PngChunkFilter.cpp
index 70a881f..fb7fe92 100644
--- a/tools/aapt2/compile/PngChunkFilter.cpp
+++ b/tools/aapt2/compile/PngChunkFilter.cpp
@@ -25,149 +25,149 @@
 // Useful helper function that encodes individual bytes into a uint32
 // at compile time.
 constexpr uint32_t u32(uint8_t a, uint8_t b, uint8_t c, uint8_t d) {
-    return (((uint32_t) a) << 24)
-            | (((uint32_t) b) << 16)
-            | (((uint32_t) c) << 8)
-            | ((uint32_t) d);
+  return (((uint32_t)a) << 24) | (((uint32_t)b) << 16) | (((uint32_t)c) << 8) |
+         ((uint32_t)d);
 }
 
 // Whitelist of PNG chunk types that we want to keep in the resulting PNG.
 enum PngChunkTypes {
-    kPngChunkIHDR = u32(73, 72, 68, 82),
-    kPngChunkIDAT = u32(73, 68, 65, 84),
-    kPngChunkIEND = u32(73, 69, 78, 68),
-    kPngChunkPLTE = u32(80, 76, 84, 69),
-    kPngChunktRNS = u32(116, 82, 78, 83),
-    kPngChunksRGB = u32(115, 82, 71, 66),
+  kPngChunkIHDR = u32(73, 72, 68, 82),
+  kPngChunkIDAT = u32(73, 68, 65, 84),
+  kPngChunkIEND = u32(73, 69, 78, 68),
+  kPngChunkPLTE = u32(80, 76, 84, 69),
+  kPngChunktRNS = u32(116, 82, 78, 83),
+  kPngChunksRGB = u32(115, 82, 71, 66),
 };
 
 static uint32_t peek32LE(const char* data) {
-    uint32_t word = ((uint32_t) data[0]) & 0x000000ff;
-    word <<= 8;
-    word |= ((uint32_t) data[1]) & 0x000000ff;
-    word <<= 8;
-    word |= ((uint32_t) data[2]) & 0x000000ff;
-    word <<= 8;
-    word |= ((uint32_t) data[3]) & 0x000000ff;
-    return word;
+  uint32_t word = ((uint32_t)data[0]) & 0x000000ff;
+  word <<= 8;
+  word |= ((uint32_t)data[1]) & 0x000000ff;
+  word <<= 8;
+  word |= ((uint32_t)data[2]) & 0x000000ff;
+  word <<= 8;
+  word |= ((uint32_t)data[3]) & 0x000000ff;
+  return word;
 }
 
 static bool isPngChunkWhitelisted(uint32_t type) {
-    switch (type) {
+  switch (type) {
     case kPngChunkIHDR:
     case kPngChunkIDAT:
     case kPngChunkIEND:
     case kPngChunkPLTE:
     case kPngChunktRNS:
     case kPngChunksRGB:
-        return true;
+      return true;
     default:
-        return false;
-    }
+      return false;
+  }
 }
 
 PngChunkFilter::PngChunkFilter(const StringPiece& data) : mData(data) {
-    if (util::stringStartsWith(mData, kPngSignature)) {
-        mWindowStart = 0;
-        mWindowEnd = strlen(kPngSignature);
-    } else {
-        mError = true;
-    }
+  if (util::stringStartsWith(mData, kPngSignature)) {
+    mWindowStart = 0;
+    mWindowEnd = strlen(kPngSignature);
+  } else {
+    mError = true;
+  }
 }
 
 bool PngChunkFilter::consumeWindow(const void** buffer, int* len) {
-    if (mWindowStart != mWindowEnd) {
-        // We have bytes to give from our window.
-        const int bytesRead = (int) (mWindowEnd - mWindowStart);
-        *buffer = mData.data() + mWindowStart;
-        *len = bytesRead;
-        mWindowStart = mWindowEnd;
-        return true;
-    }
-    return false;
+  if (mWindowStart != mWindowEnd) {
+    // We have bytes to give from our window.
+    const int bytesRead = (int)(mWindowEnd - mWindowStart);
+    *buffer = mData.data() + mWindowStart;
+    *len = bytesRead;
+    mWindowStart = mWindowEnd;
+    return true;
+  }
+  return false;
 }
 
 bool PngChunkFilter::Next(const void** buffer, int* len) {
-    if (mError) {
-        return false;
-    }
-
-    // In case BackUp was called, we must consume the window.
-    if (consumeWindow(buffer, len)) {
-        return true;
-    }
-
-    // Advance the window as far as possible (until we meet a chunk that
-    // we want to strip).
-    while (mWindowEnd < mData.size()) {
-        // Chunk length (4 bytes) + type (4 bytes) + crc32 (4 bytes) = 12 bytes.
-        const size_t kMinChunkHeaderSize = 3 * sizeof(uint32_t);
-
-        // Is there enough room for a chunk header?
-        if (mData.size() - mWindowStart < kMinChunkHeaderSize) {
-            mError = true;
-            return false;
-        }
-
-        // Verify the chunk length.
-        const uint32_t chunkLen = peek32LE(mData.data() + mWindowEnd);
-        if (((uint64_t) chunkLen) + ((uint64_t) mWindowEnd) + sizeof(uint32_t) > mData.size()) {
-            // Overflow.
-            mError = true;
-            return false;
-        }
-
-        // Do we strip this chunk?
-        const uint32_t chunkType = peek32LE(mData.data() + mWindowEnd + sizeof(uint32_t));
-        if (isPngChunkWhitelisted(chunkType)) {
-            // Advance the window to include this chunk.
-            mWindowEnd += kMinChunkHeaderSize + chunkLen;
-        } else {
-            // We want to strip this chunk. If we accumulated a window,
-            // we must return the window now.
-            if (mWindowStart != mWindowEnd) {
-                break;
-            }
-
-            // The window is empty, so we can advance past this chunk
-            // and keep looking for the next good chunk,
-            mWindowEnd += kMinChunkHeaderSize + chunkLen;
-            mWindowStart = mWindowEnd;
-        }
-    }
-
-    if (consumeWindow(buffer, len)) {
-        return true;
-    }
+  if (mError) {
     return false;
+  }
+
+  // In case BackUp was called, we must consume the window.
+  if (consumeWindow(buffer, len)) {
+    return true;
+  }
+
+  // Advance the window as far as possible (until we meet a chunk that
+  // we want to strip).
+  while (mWindowEnd < mData.size()) {
+    // Chunk length (4 bytes) + type (4 bytes) + crc32 (4 bytes) = 12 bytes.
+    const size_t kMinChunkHeaderSize = 3 * sizeof(uint32_t);
+
+    // Is there enough room for a chunk header?
+    if (mData.size() - mWindowStart < kMinChunkHeaderSize) {
+      mError = true;
+      return false;
+    }
+
+    // Verify the chunk length.
+    const uint32_t chunkLen = peek32LE(mData.data() + mWindowEnd);
+    if (((uint64_t)chunkLen) + ((uint64_t)mWindowEnd) + sizeof(uint32_t) >
+        mData.size()) {
+      // Overflow.
+      mError = true;
+      return false;
+    }
+
+    // Do we strip this chunk?
+    const uint32_t chunkType =
+        peek32LE(mData.data() + mWindowEnd + sizeof(uint32_t));
+    if (isPngChunkWhitelisted(chunkType)) {
+      // Advance the window to include this chunk.
+      mWindowEnd += kMinChunkHeaderSize + chunkLen;
+    } else {
+      // We want to strip this chunk. If we accumulated a window,
+      // we must return the window now.
+      if (mWindowStart != mWindowEnd) {
+        break;
+      }
+
+      // The window is empty, so we can advance past this chunk
+      // and keep looking for the next good chunk,
+      mWindowEnd += kMinChunkHeaderSize + chunkLen;
+      mWindowStart = mWindowEnd;
+    }
+  }
+
+  if (consumeWindow(buffer, len)) {
+    return true;
+  }
+  return false;
 }
 
 void PngChunkFilter::BackUp(int count) {
-    if (mError) {
-        return;
-    }
-    mWindowStart -= count;
+  if (mError) {
+    return;
+  }
+  mWindowStart -= count;
 }
 
 bool PngChunkFilter::Skip(int count) {
-    if (mError) {
-        return false;
-    }
+  if (mError) {
+    return false;
+  }
 
-    const void* buffer;
-    int len;
-    while (count > 0) {
-        if (!Next(&buffer, &len)) {
-            return false;
-        }
-        if (len > count) {
-            BackUp(len - count);
-            count = 0;
-        } else {
-            count -= len;
-        }
+  const void* buffer;
+  int len;
+  while (count > 0) {
+    if (!Next(&buffer, &len)) {
+      return false;
     }
-    return true;
+    if (len > count) {
+      BackUp(len - count);
+      count = 0;
+    } else {
+      count -= len;
+    }
+  }
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/PngCrunch.cpp b/tools/aapt2/compile/PngCrunch.cpp
index a2e3f4f..4a74f7af7 100644
--- a/tools/aapt2/compile/PngCrunch.cpp
+++ b/tools/aapt2/compile/PngCrunch.cpp
@@ -16,13 +16,13 @@
 
 #include "compile/Png.h"
 
-#include <algorithm>
 #include <android-base/errors.h>
 #include <android-base/macros.h>
 #include <png.h>
+#include <zlib.h>
+#include <algorithm>
 #include <unordered_map>
 #include <unordered_set>
-#include <zlib.h>
 
 namespace aapt {
 
@@ -33,250 +33,261 @@
  * Custom deleter that destroys libpng read and info structs.
  */
 class PngReadStructDeleter {
-public:
-    explicit PngReadStructDeleter(png_structp readPtr, png_infop infoPtr) :
-            mReadPtr(readPtr), mInfoPtr(infoPtr) {
-    }
+ public:
+  explicit PngReadStructDeleter(png_structp readPtr, png_infop infoPtr)
+      : mReadPtr(readPtr), mInfoPtr(infoPtr) {}
 
-    ~PngReadStructDeleter() {
-        png_destroy_read_struct(&mReadPtr, &mInfoPtr, nullptr);
-    }
+  ~PngReadStructDeleter() {
+    png_destroy_read_struct(&mReadPtr, &mInfoPtr, nullptr);
+  }
 
-private:
-    png_structp mReadPtr;
-    png_infop mInfoPtr;
+ private:
+  png_structp mReadPtr;
+  png_infop mInfoPtr;
 
-    DISALLOW_COPY_AND_ASSIGN(PngReadStructDeleter);
+  DISALLOW_COPY_AND_ASSIGN(PngReadStructDeleter);
 };
 
 /**
  * Custom deleter that destroys libpng write and info structs.
  */
 class PngWriteStructDeleter {
-public:
-    explicit PngWriteStructDeleter(png_structp writePtr, png_infop infoPtr) :
-            mWritePtr(writePtr), mInfoPtr(infoPtr) {
-    }
+ public:
+  explicit PngWriteStructDeleter(png_structp writePtr, png_infop infoPtr)
+      : mWritePtr(writePtr), mInfoPtr(infoPtr) {}
 
-    ~PngWriteStructDeleter() {
-        png_destroy_write_struct(&mWritePtr, &mInfoPtr);
-    }
+  ~PngWriteStructDeleter() { png_destroy_write_struct(&mWritePtr, &mInfoPtr); }
 
-private:
-    png_structp mWritePtr;
-    png_infop mInfoPtr;
+ private:
+  png_structp mWritePtr;
+  png_infop mInfoPtr;
 
-    DISALLOW_COPY_AND_ASSIGN(PngWriteStructDeleter);
+  DISALLOW_COPY_AND_ASSIGN(PngWriteStructDeleter);
 };
 
 // Custom warning logging method that uses IDiagnostics.
 static void logWarning(png_structp pngPtr, png_const_charp warningMsg) {
-    IDiagnostics* diag = (IDiagnostics*) png_get_error_ptr(pngPtr);
-    diag->warn(DiagMessage() << warningMsg);
+  IDiagnostics* diag = (IDiagnostics*)png_get_error_ptr(pngPtr);
+  diag->warn(DiagMessage() << warningMsg);
 }
 
 // Custom error logging method that uses IDiagnostics.
 static void logError(png_structp pngPtr, png_const_charp errorMsg) {
-    IDiagnostics* diag = (IDiagnostics*) png_get_error_ptr(pngPtr);
-    diag->error(DiagMessage() << errorMsg);
+  IDiagnostics* diag = (IDiagnostics*)png_get_error_ptr(pngPtr);
+  diag->error(DiagMessage() << errorMsg);
 }
 
-static void readDataFromStream(png_structp pngPtr, png_bytep buffer, png_size_t len) {
-    io::InputStream* in = (io::InputStream*) png_get_io_ptr(pngPtr);
+static void readDataFromStream(png_structp pngPtr, png_bytep buffer,
+                               png_size_t len) {
+  io::InputStream* in = (io::InputStream*)png_get_io_ptr(pngPtr);
 
-    const void* inBuffer;
-    int inLen;
-    if (!in->Next(&inBuffer, &inLen)) {
-        if (in->HadError()) {
-            std::string err = in->GetError();
-            png_error(pngPtr, err.c_str());
-        }
-        return;
+  const void* inBuffer;
+  int inLen;
+  if (!in->Next(&inBuffer, &inLen)) {
+    if (in->HadError()) {
+      std::string err = in->GetError();
+      png_error(pngPtr, err.c_str());
     }
+    return;
+  }
 
-    const size_t bytesRead = std::min(static_cast<size_t>(inLen), len);
-    memcpy(buffer, inBuffer, bytesRead);
-    if (bytesRead != static_cast<size_t>(inLen)) {
-        in->BackUp(inLen - static_cast<int>(bytesRead));
-    }
+  const size_t bytesRead = std::min(static_cast<size_t>(inLen), len);
+  memcpy(buffer, inBuffer, bytesRead);
+  if (bytesRead != static_cast<size_t>(inLen)) {
+    in->BackUp(inLen - static_cast<int>(bytesRead));
+  }
 }
 
-static void writeDataToStream(png_structp pngPtr, png_bytep buffer, png_size_t len) {
-    io::OutputStream* out = (io::OutputStream*) png_get_io_ptr(pngPtr);
+static void writeDataToStream(png_structp pngPtr, png_bytep buffer,
+                              png_size_t len) {
+  io::OutputStream* out = (io::OutputStream*)png_get_io_ptr(pngPtr);
 
-    void* outBuffer;
-    int outLen;
-    while (len > 0) {
-        if (!out->Next(&outBuffer, &outLen)) {
-            if (out->HadError()) {
-                std::string err = out->GetError();
-                png_error(pngPtr, err.c_str());
-            }
-            return;
-        }
-
-        const size_t bytesWritten = std::min(static_cast<size_t>(outLen), len);
-        memcpy(outBuffer, buffer, bytesWritten);
-
-        // Advance the input buffer.
-        buffer += bytesWritten;
-        len -= bytesWritten;
-
-        // Advance the output buffer.
-        outLen -= static_cast<int>(bytesWritten);
+  void* outBuffer;
+  int outLen;
+  while (len > 0) {
+    if (!out->Next(&outBuffer, &outLen)) {
+      if (out->HadError()) {
+        std::string err = out->GetError();
+        png_error(pngPtr, err.c_str());
+      }
+      return;
     }
 
-    // If the entire output buffer wasn't used, backup.
-    if (outLen > 0) {
-        out->BackUp(outLen);
-    }
+    const size_t bytesWritten = std::min(static_cast<size_t>(outLen), len);
+    memcpy(outBuffer, buffer, bytesWritten);
+
+    // Advance the input buffer.
+    buffer += bytesWritten;
+    len -= bytesWritten;
+
+    // Advance the output buffer.
+    outLen -= static_cast<int>(bytesWritten);
+  }
+
+  // If the entire output buffer wasn't used, backup.
+  if (outLen > 0) {
+    out->BackUp(outLen);
+  }
 }
 
 std::unique_ptr<Image> readPng(IAaptContext* context, io::InputStream* in) {
-    // Read the first 8 bytes of the file looking for the PNG signature.
-    // Bail early if it does not match.
-    const png_byte* signature;
-    int bufferSize;
-    if (!in->Next((const void**) &signature, &bufferSize)) {
-        context->getDiagnostics()->error(DiagMessage()
-                                         << android::base::SystemErrorCodeToString(errno));
-        return {};
-    }
+  // Read the first 8 bytes of the file looking for the PNG signature.
+  // Bail early if it does not match.
+  const png_byte* signature;
+  int bufferSize;
+  if (!in->Next((const void**)&signature, &bufferSize)) {
+    context->getDiagnostics()->error(
+        DiagMessage() << android::base::SystemErrorCodeToString(errno));
+    return {};
+  }
 
-    if (static_cast<size_t>(bufferSize) < kPngSignatureSize
-            || png_sig_cmp(signature, 0, kPngSignatureSize) != 0) {
-        context->getDiagnostics()->error(DiagMessage()
-                                         << "file signature does not match PNG signature");
-        return {};
-    }
+  if (static_cast<size_t>(bufferSize) < kPngSignatureSize ||
+      png_sig_cmp(signature, 0, kPngSignatureSize) != 0) {
+    context->getDiagnostics()->error(
+        DiagMessage() << "file signature does not match PNG signature");
+    return {};
+  }
 
-    // Start at the beginning of the first chunk.
-    in->BackUp(bufferSize - static_cast<int>(kPngSignatureSize));
+  // Start at the beginning of the first chunk.
+  in->BackUp(bufferSize - static_cast<int>(kPngSignatureSize));
 
-    // Create and initialize the png_struct with the default error and warning handlers.
-    // The header version is also passed in to ensure that this was built against the same
-    // version of libpng.
-    png_structp readPtr = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
-    if (readPtr == nullptr) {
-        context->getDiagnostics()->error(DiagMessage()
-                                         << "failed to create libpng read png_struct");
-        return {};
-    }
+  // Create and initialize the png_struct with the default error and warning
+  // handlers.
+  // The header version is also passed in to ensure that this was built against
+  // the same
+  // version of libpng.
+  png_structp readPtr =
+      png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
+  if (readPtr == nullptr) {
+    context->getDiagnostics()->error(
+        DiagMessage() << "failed to create libpng read png_struct");
+    return {};
+  }
 
-    // Create and initialize the memory for image header and data.
-    png_infop infoPtr = png_create_info_struct(readPtr);
-    if (infoPtr == nullptr) {
-        context->getDiagnostics()->error(DiagMessage() << "failed to create libpng read png_info");
-        png_destroy_read_struct(&readPtr, nullptr, nullptr);
-        return {};
-    }
+  // Create and initialize the memory for image header and data.
+  png_infop infoPtr = png_create_info_struct(readPtr);
+  if (infoPtr == nullptr) {
+    context->getDiagnostics()->error(
+        DiagMessage() << "failed to create libpng read png_info");
+    png_destroy_read_struct(&readPtr, nullptr, nullptr);
+    return {};
+  }
 
-    // Automatically release PNG resources at end of scope.
-    PngReadStructDeleter pngReadDeleter(readPtr, infoPtr);
+  // Automatically release PNG resources at end of scope.
+  PngReadStructDeleter pngReadDeleter(readPtr, infoPtr);
 
-    // libpng uses longjmp to jump to an error handling routine.
-    // setjmp will only return true if it was jumped to, aka there was
-    // an error.
-    if (setjmp(png_jmpbuf(readPtr))) {
-        return {};
-    }
+  // libpng uses longjmp to jump to an error handling routine.
+  // setjmp will only return true if it was jumped to, aka there was
+  // an error.
+  if (setjmp(png_jmpbuf(readPtr))) {
+    return {};
+  }
 
-    // Handle warnings ourselves via IDiagnostics.
-    png_set_error_fn(readPtr, (png_voidp) context->getDiagnostics(), logError, logWarning);
+  // Handle warnings ourselves via IDiagnostics.
+  png_set_error_fn(readPtr, (png_voidp)context->getDiagnostics(), logError,
+                   logWarning);
 
-    // Set up the read functions which read from our custom data sources.
-    png_set_read_fn(readPtr, (png_voidp) in, readDataFromStream);
+  // Set up the read functions which read from our custom data sources.
+  png_set_read_fn(readPtr, (png_voidp)in, readDataFromStream);
 
-    // Skip the signature that we already read.
-    png_set_sig_bytes(readPtr, kPngSignatureSize);
+  // Skip the signature that we already read.
+  png_set_sig_bytes(readPtr, kPngSignatureSize);
 
-    // Read the chunk headers.
-    png_read_info(readPtr, infoPtr);
+  // Read the chunk headers.
+  png_read_info(readPtr, infoPtr);
 
-    // Extract image meta-data from the various chunk headers.
-    uint32_t width, height;
-    int bitDepth, colorType, interlaceMethod, compressionMethod, filterMethod;
-    png_get_IHDR(readPtr, infoPtr, &width, &height, &bitDepth, &colorType, &interlaceMethod,
-                 &compressionMethod, &filterMethod);
+  // Extract image meta-data from the various chunk headers.
+  uint32_t width, height;
+  int bitDepth, colorType, interlaceMethod, compressionMethod, filterMethod;
+  png_get_IHDR(readPtr, infoPtr, &width, &height, &bitDepth, &colorType,
+               &interlaceMethod, &compressionMethod, &filterMethod);
 
-    // When the image is read, expand it so that it is in RGBA 8888 format
-    // so that image handling is uniform.
+  // When the image is read, expand it so that it is in RGBA 8888 format
+  // so that image handling is uniform.
 
-    if (colorType == PNG_COLOR_TYPE_PALETTE) {
-        png_set_palette_to_rgb(readPtr);
-    }
+  if (colorType == PNG_COLOR_TYPE_PALETTE) {
+    png_set_palette_to_rgb(readPtr);
+  }
 
-    if (colorType == PNG_COLOR_TYPE_GRAY && bitDepth < 8) {
-        png_set_expand_gray_1_2_4_to_8(readPtr);
-    }
+  if (colorType == PNG_COLOR_TYPE_GRAY && bitDepth < 8) {
+    png_set_expand_gray_1_2_4_to_8(readPtr);
+  }
 
-    if (png_get_valid(readPtr, infoPtr, PNG_INFO_tRNS)) {
-        png_set_tRNS_to_alpha(readPtr);
-    }
+  if (png_get_valid(readPtr, infoPtr, PNG_INFO_tRNS)) {
+    png_set_tRNS_to_alpha(readPtr);
+  }
 
-    if (bitDepth == 16) {
-        png_set_strip_16(readPtr);
-    }
+  if (bitDepth == 16) {
+    png_set_strip_16(readPtr);
+  }
 
-    if (!(colorType & PNG_COLOR_MASK_ALPHA)) {
-        png_set_add_alpha(readPtr, 0xFF, PNG_FILLER_AFTER);
-    }
+  if (!(colorType & PNG_COLOR_MASK_ALPHA)) {
+    png_set_add_alpha(readPtr, 0xFF, PNG_FILLER_AFTER);
+  }
 
-    if (colorType == PNG_COLOR_TYPE_GRAY || colorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
-        png_set_gray_to_rgb(readPtr);
-    }
+  if (colorType == PNG_COLOR_TYPE_GRAY ||
+      colorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
+    png_set_gray_to_rgb(readPtr);
+  }
 
-    if (interlaceMethod != PNG_INTERLACE_NONE) {
-        png_set_interlace_handling(readPtr);
-    }
+  if (interlaceMethod != PNG_INTERLACE_NONE) {
+    png_set_interlace_handling(readPtr);
+  }
 
-    // Once all the options for reading have been set, we need to flush
-    // them to libpng.
-    png_read_update_info(readPtr, infoPtr);
+  // Once all the options for reading have been set, we need to flush
+  // them to libpng.
+  png_read_update_info(readPtr, infoPtr);
 
-    // 9-patch uses int32_t to index images, so we cap the image dimensions to something
-    // that can always be represented by 9-patch.
-    if (width > std::numeric_limits<int32_t>::max() ||
-            height > std::numeric_limits<int32_t>::max()) {
-        context->getDiagnostics()->error(DiagMessage() << "PNG image dimensions are too large: "
-                                         << width << "x" << height);
-        return {};
-    }
+  // 9-patch uses int32_t to index images, so we cap the image dimensions to
+  // something
+  // that can always be represented by 9-patch.
+  if (width > std::numeric_limits<int32_t>::max() ||
+      height > std::numeric_limits<int32_t>::max()) {
+    context->getDiagnostics()->error(DiagMessage()
+                                     << "PNG image dimensions are too large: "
+                                     << width << "x" << height);
+    return {};
+  }
 
-    std::unique_ptr<Image> outputImage = util::make_unique<Image>();
-    outputImage->width = static_cast<int32_t>(width);
-    outputImage->height = static_cast<int32_t>(height);
+  std::unique_ptr<Image> outputImage = util::make_unique<Image>();
+  outputImage->width = static_cast<int32_t>(width);
+  outputImage->height = static_cast<int32_t>(height);
 
-    const size_t rowBytes = png_get_rowbytes(readPtr, infoPtr);
-    assert(rowBytes == 4 * width); // RGBA
+  const size_t rowBytes = png_get_rowbytes(readPtr, infoPtr);
+  assert(rowBytes == 4 * width);  // RGBA
 
-    // Allocate one large block to hold the image.
-    outputImage->data = std::unique_ptr<uint8_t[]>(new uint8_t[height * rowBytes]);
+  // Allocate one large block to hold the image.
+  outputImage->data =
+      std::unique_ptr<uint8_t[]>(new uint8_t[height * rowBytes]);
 
-    // Create an array of rows that index into the data block.
-    outputImage->rows = std::unique_ptr<uint8_t*[]>(new uint8_t*[height]);
-    for (uint32_t h = 0; h < height; h++) {
-        outputImage->rows[h] = outputImage->data.get() + (h * rowBytes);
-    }
+  // Create an array of rows that index into the data block.
+  outputImage->rows = std::unique_ptr<uint8_t* []>(new uint8_t*[height]);
+  for (uint32_t h = 0; h < height; h++) {
+    outputImage->rows[h] = outputImage->data.get() + (h * rowBytes);
+  }
 
-    // Actually read the image pixels.
-    png_read_image(readPtr, outputImage->rows.get());
+  // Actually read the image pixels.
+  png_read_image(readPtr, outputImage->rows.get());
 
-    // Finish reading. This will read any other chunks after the image data.
-    png_read_end(readPtr, infoPtr);
+  // Finish reading. This will read any other chunks after the image data.
+  png_read_end(readPtr, infoPtr);
 
-    return outputImage;
+  return outputImage;
 }
 
 /**
- * Experimentally chosen constant to be added to the overhead of using color type
- * PNG_COLOR_TYPE_PALETTE to account for the uncompressability of the palette chunk.
- * Without this, many small PNGs encoded with palettes are larger after compression than
+ * Experimentally chosen constant to be added to the overhead of using color
+ * type
+ * PNG_COLOR_TYPE_PALETTE to account for the uncompressability of the palette
+ * chunk.
+ * Without this, many small PNGs encoded with palettes are larger after
+ * compression than
  * the same PNGs encoded as RGBA.
  */
 constexpr static const size_t kPaletteOverheadConstant = 1024u * 10u;
 
-// Pick a color type by which to encode the image, based on which color type will take
+// Pick a color type by which to encode the image, based on which color type
+// will take
 // the least amount of disk space.
 //
 // 9-patch images traditionally have not been encoded with palettes.
@@ -298,427 +309,450 @@
 // - Grayscale + cheap alpha
 // - Grayscale + alpha
 //
-static int pickColorType(int32_t width, int32_t height,
-                         bool grayScale, bool convertibleToGrayScale, bool hasNinePatch,
+static int pickColorType(int32_t width, int32_t height, bool grayScale,
+                         bool convertibleToGrayScale, bool hasNinePatch,
                          size_t colorPaletteSize, size_t alphaPaletteSize) {
-    const size_t paletteChunkSize = 16 + colorPaletteSize * 3;
-    const size_t alphaChunkSize = 16 + alphaPaletteSize;
-    const size_t colorAlphaDataChunkSize = 16 + 4 * width * height;
-    const size_t colorDataChunkSize = 16 + 3 * width * height;
-    const size_t grayScaleAlphaDataChunkSize = 16 + 2 * width * height;
-    const size_t paletteDataChunkSize = 16 + width * height;
+  const size_t paletteChunkSize = 16 + colorPaletteSize * 3;
+  const size_t alphaChunkSize = 16 + alphaPaletteSize;
+  const size_t colorAlphaDataChunkSize = 16 + 4 * width * height;
+  const size_t colorDataChunkSize = 16 + 3 * width * height;
+  const size_t grayScaleAlphaDataChunkSize = 16 + 2 * width * height;
+  const size_t paletteDataChunkSize = 16 + width * height;
 
-    if (grayScale) {
-        if (alphaPaletteSize == 0) {
-            // This is the smallest the data can be.
-            return PNG_COLOR_TYPE_GRAY;
-        } else if (colorPaletteSize <= 256 && !hasNinePatch) {
-            // This grayscale has alpha and can fit within a palette.
-            // See if it is worth fitting into a palette.
-            const size_t paletteThreshold = paletteChunkSize + alphaChunkSize +
-                    paletteDataChunkSize + kPaletteOverheadConstant;
-            if (grayScaleAlphaDataChunkSize > paletteThreshold) {
-                return PNG_COLOR_TYPE_PALETTE;
-            }
-        }
-        return PNG_COLOR_TYPE_GRAY_ALPHA;
-    }
-
-
-    if (colorPaletteSize <= 256 && !hasNinePatch) {
-        // This image can fit inside a palette. Let's see if it is worth it.
-        size_t totalSizeWithPalette = paletteDataChunkSize + paletteChunkSize;
-        size_t totalSizeWithoutPalette = colorDataChunkSize;
-        if (alphaPaletteSize > 0) {
-            totalSizeWithPalette += alphaPaletteSize;
-            totalSizeWithoutPalette = colorAlphaDataChunkSize;
-        }
-
-        if (totalSizeWithoutPalette > totalSizeWithPalette + kPaletteOverheadConstant) {
-            return PNG_COLOR_TYPE_PALETTE;
-        }
-    }
-
-    if (convertibleToGrayScale) {
-        if (alphaPaletteSize == 0) {
-            return PNG_COLOR_TYPE_GRAY;
-        } else {
-            return PNG_COLOR_TYPE_GRAY_ALPHA;
-        }
-    }
-
+  if (grayScale) {
     if (alphaPaletteSize == 0) {
-        return PNG_COLOR_TYPE_RGB;
+      // This is the smallest the data can be.
+      return PNG_COLOR_TYPE_GRAY;
+    } else if (colorPaletteSize <= 256 && !hasNinePatch) {
+      // This grayscale has alpha and can fit within a palette.
+      // See if it is worth fitting into a palette.
+      const size_t paletteThreshold = paletteChunkSize + alphaChunkSize +
+                                      paletteDataChunkSize +
+                                      kPaletteOverheadConstant;
+      if (grayScaleAlphaDataChunkSize > paletteThreshold) {
+        return PNG_COLOR_TYPE_PALETTE;
+      }
     }
-    return PNG_COLOR_TYPE_RGBA;
+    return PNG_COLOR_TYPE_GRAY_ALPHA;
+  }
+
+  if (colorPaletteSize <= 256 && !hasNinePatch) {
+    // This image can fit inside a palette. Let's see if it is worth it.
+    size_t totalSizeWithPalette = paletteDataChunkSize + paletteChunkSize;
+    size_t totalSizeWithoutPalette = colorDataChunkSize;
+    if (alphaPaletteSize > 0) {
+      totalSizeWithPalette += alphaPaletteSize;
+      totalSizeWithoutPalette = colorAlphaDataChunkSize;
+    }
+
+    if (totalSizeWithoutPalette >
+        totalSizeWithPalette + kPaletteOverheadConstant) {
+      return PNG_COLOR_TYPE_PALETTE;
+    }
+  }
+
+  if (convertibleToGrayScale) {
+    if (alphaPaletteSize == 0) {
+      return PNG_COLOR_TYPE_GRAY;
+    } else {
+      return PNG_COLOR_TYPE_GRAY_ALPHA;
+    }
+  }
+
+  if (alphaPaletteSize == 0) {
+    return PNG_COLOR_TYPE_RGB;
+  }
+  return PNG_COLOR_TYPE_RGBA;
 }
 
-// Assigns indices to the color and alpha palettes, encodes them, and then invokes
+// Assigns indices to the color and alpha palettes, encodes them, and then
+// invokes
 // png_set_PLTE/png_set_tRNS.
 // This must be done before writing image data.
-// Image data must be transformed to use the indices assigned within the palette.
+// Image data must be transformed to use the indices assigned within the
+// palette.
 static void writePalette(png_structp writePtr, png_infop writeInfoPtr,
-                  std::unordered_map<uint32_t, int>* colorPalette,
-                  std::unordered_set<uint32_t>* alphaPalette) {
-    assert(colorPalette->size() <= 256);
-    assert(alphaPalette->size() <= 256);
+                         std::unordered_map<uint32_t, int>* colorPalette,
+                         std::unordered_set<uint32_t>* alphaPalette) {
+  assert(colorPalette->size() <= 256);
+  assert(alphaPalette->size() <= 256);
 
-    // Populate the PNG palette struct and assign indices to the color
-    // palette.
+  // Populate the PNG palette struct and assign indices to the color
+  // palette.
 
-    // Colors in the alpha palette should have smaller indices.
-    // This will ensure that we can truncate the alpha palette if it is
-    // smaller than the color palette.
-    int index = 0;
-    for (uint32_t color : *alphaPalette) {
-        (*colorPalette)[color] = index++;
+  // Colors in the alpha palette should have smaller indices.
+  // This will ensure that we can truncate the alpha palette if it is
+  // smaller than the color palette.
+  int index = 0;
+  for (uint32_t color : *alphaPalette) {
+    (*colorPalette)[color] = index++;
+  }
+
+  // Assign the rest of the entries.
+  for (auto& entry : *colorPalette) {
+    if (entry.second == -1) {
+      entry.second = index++;
     }
+  }
 
-    // Assign the rest of the entries.
-    for (auto& entry : *colorPalette) {
-        if (entry.second == -1) {
-            entry.second = index++;
-        }
+  // Create the PNG color palette struct.
+  auto colorPaletteBytes =
+      std::unique_ptr<png_color[]>(new png_color[colorPalette->size()]);
+
+  std::unique_ptr<png_byte[]> alphaPaletteBytes;
+  if (!alphaPalette->empty()) {
+    alphaPaletteBytes =
+        std::unique_ptr<png_byte[]>(new png_byte[alphaPalette->size()]);
+  }
+
+  for (const auto& entry : *colorPalette) {
+    const uint32_t color = entry.first;
+    const int index = entry.second;
+    assert(index >= 0);
+    assert(static_cast<size_t>(index) < colorPalette->size());
+
+    png_colorp slot = colorPaletteBytes.get() + index;
+    slot->red = color >> 24;
+    slot->green = color >> 16;
+    slot->blue = color >> 8;
+
+    const png_byte alpha = color & 0x000000ff;
+    if (alpha != 0xff && alphaPaletteBytes) {
+      assert(static_cast<size_t>(index) < alphaPalette->size());
+      alphaPaletteBytes[index] = alpha;
     }
+  }
 
-    // Create the PNG color palette struct.
-    auto colorPaletteBytes = std::unique_ptr<png_color[]>(new png_color[colorPalette->size()]);
+  // The bytes get copied here, so it is safe to release colorPaletteBytes at
+  // the end of function
+  // scope.
+  png_set_PLTE(writePtr, writeInfoPtr, colorPaletteBytes.get(),
+               colorPalette->size());
 
-    std::unique_ptr<png_byte[]> alphaPaletteBytes;
-    if (!alphaPalette->empty()) {
-        alphaPaletteBytes = std::unique_ptr<png_byte[]>(new png_byte[alphaPalette->size()]);
-    }
-
-    for (const auto& entry : *colorPalette) {
-        const uint32_t color = entry.first;
-        const int index = entry.second;
-        assert(index >= 0);
-        assert(static_cast<size_t>(index) < colorPalette->size());
-
-        png_colorp slot = colorPaletteBytes.get() + index;
-        slot->red = color >> 24;
-        slot->green = color >> 16;
-        slot->blue = color >> 8;
-
-        const png_byte alpha = color & 0x000000ff;
-        if (alpha != 0xff && alphaPaletteBytes) {
-            assert(static_cast<size_t>(index) < alphaPalette->size());
-            alphaPaletteBytes[index] = alpha;
-        }
-    }
-
-    // The bytes get copied here, so it is safe to release colorPaletteBytes at the end of function
-    // scope.
-    png_set_PLTE(writePtr, writeInfoPtr, colorPaletteBytes.get(), colorPalette->size());
-
-    if (alphaPaletteBytes) {
-        png_set_tRNS(writePtr, writeInfoPtr, alphaPaletteBytes.get(), alphaPalette->size(),
-                     nullptr);
-    }
+  if (alphaPaletteBytes) {
+    png_set_tRNS(writePtr, writeInfoPtr, alphaPaletteBytes.get(),
+                 alphaPalette->size(), nullptr);
+  }
 }
 
 // Write the 9-patch custom PNG chunks to writeInfoPtr. This must be done before
 // writing image data.
 static void writeNinePatch(png_structp writePtr, png_infop writeInfoPtr,
                            const NinePatch* ninePatch) {
-    // The order of the chunks is important.
-    // 9-patch code in older platforms expects the 9-patch chunk to
-    // be last.
+  // The order of the chunks is important.
+  // 9-patch code in older platforms expects the 9-patch chunk to
+  // be last.
 
-    png_unknown_chunk unknownChunks[3];
-    memset(unknownChunks, 0, sizeof(unknownChunks));
+  png_unknown_chunk unknownChunks[3];
+  memset(unknownChunks, 0, sizeof(unknownChunks));
 
-    size_t index = 0;
-    size_t chunkLen = 0;
+  size_t index = 0;
+  size_t chunkLen = 0;
 
-    std::unique_ptr<uint8_t[]> serializedOutline =
-            ninePatch->serializeRoundedRectOutline(&chunkLen);
-    strcpy((char*) unknownChunks[index].name, "npOl");
+  std::unique_ptr<uint8_t[]> serializedOutline =
+      ninePatch->serializeRoundedRectOutline(&chunkLen);
+  strcpy((char*)unknownChunks[index].name, "npOl");
+  unknownChunks[index].size = chunkLen;
+  unknownChunks[index].data = (png_bytep)serializedOutline.get();
+  unknownChunks[index].location = PNG_HAVE_PLTE;
+  index++;
+
+  std::unique_ptr<uint8_t[]> serializedLayoutBounds;
+  if (ninePatch->layoutBounds.nonZero()) {
+    serializedLayoutBounds = ninePatch->serializeLayoutBounds(&chunkLen);
+    strcpy((char*)unknownChunks[index].name, "npLb");
     unknownChunks[index].size = chunkLen;
-    unknownChunks[index].data = (png_bytep) serializedOutline.get();
+    unknownChunks[index].data = (png_bytep)serializedLayoutBounds.get();
     unknownChunks[index].location = PNG_HAVE_PLTE;
     index++;
+  }
 
-    std::unique_ptr<uint8_t[]> serializedLayoutBounds;
-    if (ninePatch->layoutBounds.nonZero()) {
-        serializedLayoutBounds = ninePatch->serializeLayoutBounds(&chunkLen);
-        strcpy((char*) unknownChunks[index].name, "npLb");
-        unknownChunks[index].size = chunkLen;
-        unknownChunks[index].data = (png_bytep) serializedLayoutBounds.get();
-        unknownChunks[index].location = PNG_HAVE_PLTE;
-        index++;
-    }
+  std::unique_ptr<uint8_t[]> serializedNinePatch =
+      ninePatch->serializeBase(&chunkLen);
+  strcpy((char*)unknownChunks[index].name, "npTc");
+  unknownChunks[index].size = chunkLen;
+  unknownChunks[index].data = (png_bytep)serializedNinePatch.get();
+  unknownChunks[index].location = PNG_HAVE_PLTE;
+  index++;
 
-    std::unique_ptr<uint8_t[]> serializedNinePatch = ninePatch->serializeBase(&chunkLen);
-    strcpy((char*) unknownChunks[index].name, "npTc");
-    unknownChunks[index].size = chunkLen;
-    unknownChunks[index].data = (png_bytep) serializedNinePatch.get();
-    unknownChunks[index].location = PNG_HAVE_PLTE;
-    index++;
+  // Handle all unknown chunks. We are manually setting the chunks here,
+  // so we will only ever handle our custom chunks.
+  png_set_keep_unknown_chunks(writePtr, PNG_HANDLE_CHUNK_ALWAYS, nullptr, 0);
 
-    // Handle all unknown chunks. We are manually setting the chunks here,
-    // so we will only ever handle our custom chunks.
-    png_set_keep_unknown_chunks(writePtr, PNG_HANDLE_CHUNK_ALWAYS, nullptr, 0);
-
-    // Set the actual chunks here. The data gets copied, so our buffers can
-    // safely go out of scope.
-    png_set_unknown_chunks(writePtr, writeInfoPtr, unknownChunks, index);
+  // Set the actual chunks here. The data gets copied, so our buffers can
+  // safely go out of scope.
+  png_set_unknown_chunks(writePtr, writeInfoPtr, unknownChunks, index);
 }
 
-bool writePng(IAaptContext* context, const Image* image, const NinePatch* ninePatch,
-              io::OutputStream* out, const PngOptions& options) {
-    // Create and initialize the write png_struct with the default error and warning handlers.
-    // The header version is also passed in to ensure that this was built against the same
-    // version of libpng.
-    png_structp writePtr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
-                                                   nullptr, nullptr, nullptr);
-    if (writePtr == nullptr) {
-        context->getDiagnostics()->error(DiagMessage()
-                                         << "failed to create libpng write png_struct");
-        return false;
+bool writePng(IAaptContext* context, const Image* image,
+              const NinePatch* ninePatch, io::OutputStream* out,
+              const PngOptions& options) {
+  // Create and initialize the write png_struct with the default error and
+  // warning handlers.
+  // The header version is also passed in to ensure that this was built against
+  // the same
+  // version of libpng.
+  png_structp writePtr =
+      png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
+  if (writePtr == nullptr) {
+    context->getDiagnostics()->error(
+        DiagMessage() << "failed to create libpng write png_struct");
+    return false;
+  }
+
+  // Allocate memory to store image header data.
+  png_infop writeInfoPtr = png_create_info_struct(writePtr);
+  if (writeInfoPtr == nullptr) {
+    context->getDiagnostics()->error(
+        DiagMessage() << "failed to create libpng write png_info");
+    png_destroy_write_struct(&writePtr, nullptr);
+    return false;
+  }
+
+  // Automatically release PNG resources at end of scope.
+  PngWriteStructDeleter pngWriteDeleter(writePtr, writeInfoPtr);
+
+  // libpng uses longjmp to jump to error handling routines.
+  // setjmp will return true only if it was jumped to, aka, there was an error.
+  if (setjmp(png_jmpbuf(writePtr))) {
+    return false;
+  }
+
+  // Handle warnings with our IDiagnostics.
+  png_set_error_fn(writePtr, (png_voidp)context->getDiagnostics(), logError,
+                   logWarning);
+
+  // Set up the write functions which write to our custom data sources.
+  png_set_write_fn(writePtr, (png_voidp)out, writeDataToStream, nullptr);
+
+  // We want small files and can take the performance hit to achieve this goal.
+  png_set_compression_level(writePtr, Z_BEST_COMPRESSION);
+
+  // Begin analysis of the image data.
+  // Scan the entire image and determine if:
+  // 1. Every pixel has R == G == B (grayscale)
+  // 2. Every pixel has A == 255 (opaque)
+  // 3. There are no more than 256 distinct RGBA colors (palette).
+  std::unordered_map<uint32_t, int> colorPalette;
+  std::unordered_set<uint32_t> alphaPalette;
+  bool needsToZeroRGBChannelsOfTransparentPixels = false;
+  bool grayScale = true;
+  int maxGrayDeviation = 0;
+
+  for (int32_t y = 0; y < image->height; y++) {
+    const uint8_t* row = image->rows[y];
+    for (int32_t x = 0; x < image->width; x++) {
+      int red = *row++;
+      int green = *row++;
+      int blue = *row++;
+      int alpha = *row++;
+
+      if (alpha == 0) {
+        // The color is completely transparent.
+        // For purposes of palettes and grayscale optimization,
+        // treat all channels as 0x00.
+        needsToZeroRGBChannelsOfTransparentPixels =
+            needsToZeroRGBChannelsOfTransparentPixels ||
+            (red != 0 || green != 0 || blue != 0);
+        red = green = blue = 0;
+      }
+
+      // Insert the color into the color palette.
+      const uint32_t color = red << 24 | green << 16 | blue << 8 | alpha;
+      colorPalette[color] = -1;
+
+      // If the pixel has non-opaque alpha, insert it into the
+      // alpha palette.
+      if (alpha != 0xff) {
+        alphaPalette.insert(color);
+      }
+
+      // Check if the image is indeed grayscale.
+      if (grayScale) {
+        if (red != green || red != blue) {
+          grayScale = false;
+        }
+      }
+
+      // Calculate the gray scale deviation so that it can be compared
+      // with the threshold.
+      maxGrayDeviation = std::max(std::abs(red - green), maxGrayDeviation);
+      maxGrayDeviation = std::max(std::abs(green - blue), maxGrayDeviation);
+      maxGrayDeviation = std::max(std::abs(blue - red), maxGrayDeviation);
     }
+  }
 
-    // Allocate memory to store image header data.
-    png_infop writeInfoPtr = png_create_info_struct(writePtr);
-    if (writeInfoPtr == nullptr) {
-        context->getDiagnostics()->error(DiagMessage() << "failed to create libpng write png_info");
-        png_destroy_write_struct(&writePtr, nullptr);
-        return false;
+  if (context->verbose()) {
+    DiagMessage msg;
+    msg << " paletteSize=" << colorPalette.size()
+        << " alphaPaletteSize=" << alphaPalette.size()
+        << " maxGrayDeviation=" << maxGrayDeviation
+        << " grayScale=" << (grayScale ? "true" : "false");
+    context->getDiagnostics()->note(msg);
+  }
+
+  const bool convertibleToGrayScale =
+      maxGrayDeviation <= options.grayScaleTolerance;
+
+  const int newColorType = pickColorType(
+      image->width, image->height, grayScale, convertibleToGrayScale,
+      ninePatch != nullptr, colorPalette.size(), alphaPalette.size());
+
+  if (context->verbose()) {
+    DiagMessage msg;
+    msg << "encoding PNG ";
+    if (ninePatch) {
+      msg << "(with 9-patch) as ";
     }
-
-    // Automatically release PNG resources at end of scope.
-    PngWriteStructDeleter pngWriteDeleter(writePtr, writeInfoPtr);
-
-    // libpng uses longjmp to jump to error handling routines.
-    // setjmp will return true only if it was jumped to, aka, there was an error.
-    if (setjmp(png_jmpbuf(writePtr))) {
-        return false;
+    switch (newColorType) {
+      case PNG_COLOR_TYPE_GRAY:
+        msg << "GRAY";
+        break;
+      case PNG_COLOR_TYPE_GRAY_ALPHA:
+        msg << "GRAY + ALPHA";
+        break;
+      case PNG_COLOR_TYPE_RGB:
+        msg << "RGB";
+        break;
+      case PNG_COLOR_TYPE_RGB_ALPHA:
+        msg << "RGBA";
+        break;
+      case PNG_COLOR_TYPE_PALETTE:
+        msg << "PALETTE";
+        break;
+      default:
+        msg << "unknown type " << newColorType;
+        break;
     }
+    context->getDiagnostics()->note(msg);
+  }
 
-    // Handle warnings with our IDiagnostics.
-    png_set_error_fn(writePtr, (png_voidp) context->getDiagnostics(), logError, logWarning);
+  png_set_IHDR(writePtr, writeInfoPtr, image->width, image->height, 8,
+               newColorType, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,
+               PNG_FILTER_TYPE_DEFAULT);
 
-    // Set up the write functions which write to our custom data sources.
-    png_set_write_fn(writePtr, (png_voidp) out, writeDataToStream, nullptr);
+  if (newColorType & PNG_COLOR_MASK_PALETTE) {
+    // Assigns indices to the palette, and writes the encoded palette to the
+    // libpng writePtr.
+    writePalette(writePtr, writeInfoPtr, &colorPalette, &alphaPalette);
+    png_set_filter(writePtr, 0, PNG_NO_FILTERS);
+  } else {
+    png_set_filter(writePtr, 0, PNG_ALL_FILTERS);
+  }
 
-    // We want small files and can take the performance hit to achieve this goal.
-    png_set_compression_level(writePtr, Z_BEST_COMPRESSION);
+  if (ninePatch) {
+    writeNinePatch(writePtr, writeInfoPtr, ninePatch);
+  }
 
-    // Begin analysis of the image data.
-    // Scan the entire image and determine if:
-    // 1. Every pixel has R == G == B (grayscale)
-    // 2. Every pixel has A == 255 (opaque)
-    // 3. There are no more than 256 distinct RGBA colors (palette).
-    std::unordered_map<uint32_t, int> colorPalette;
-    std::unordered_set<uint32_t> alphaPalette;
-    bool needsToZeroRGBChannelsOfTransparentPixels = false;
-    bool grayScale = true;
-    int maxGrayDeviation = 0;
+  // Flush our updates to the header.
+  png_write_info(writePtr, writeInfoPtr);
+
+  // Write out each row of image data according to its encoding.
+  if (newColorType == PNG_COLOR_TYPE_PALETTE) {
+    // 1 byte/pixel.
+    auto outRow = std::unique_ptr<png_byte[]>(new png_byte[image->width]);
 
     for (int32_t y = 0; y < image->height; y++) {
-        const uint8_t* row = image->rows[y];
-        for (int32_t x = 0; x < image->width; x++) {
-            int red = *row++;
-            int green = *row++;
-            int blue = *row++;
-            int alpha = *row++;
-
-            if (alpha == 0) {
-                // The color is completely transparent.
-                // For purposes of palettes and grayscale optimization,
-                // treat all channels as 0x00.
-                needsToZeroRGBChannelsOfTransparentPixels =
-                        needsToZeroRGBChannelsOfTransparentPixels ||
-                        (red != 0 || green != 0 || blue != 0);
-                red = green = blue = 0;
-            }
-
-            // Insert the color into the color palette.
-            const uint32_t color = red << 24 | green << 16 | blue << 8 | alpha;
-            colorPalette[color] = -1;
-
-            // If the pixel has non-opaque alpha, insert it into the
-            // alpha palette.
-            if (alpha != 0xff) {
-                alphaPalette.insert(color);
-            }
-
-            // Check if the image is indeed grayscale.
-            if (grayScale) {
-                if (red != green || red != blue) {
-                    grayScale = false;
-                }
-            }
-
-            // Calculate the gray scale deviation so that it can be compared
-            // with the threshold.
-            maxGrayDeviation = std::max(std::abs(red - green), maxGrayDeviation);
-            maxGrayDeviation = std::max(std::abs(green - blue), maxGrayDeviation);
-            maxGrayDeviation = std::max(std::abs(blue - red), maxGrayDeviation);
+      png_const_bytep inRow = image->rows[y];
+      for (int32_t x = 0; x < image->width; x++) {
+        int rr = *inRow++;
+        int gg = *inRow++;
+        int bb = *inRow++;
+        int aa = *inRow++;
+        if (aa == 0) {
+          // Zero out color channels when transparent.
+          rr = gg = bb = 0;
         }
+
+        const uint32_t color = rr << 24 | gg << 16 | bb << 8 | aa;
+        const int idx = colorPalette[color];
+        assert(idx != -1);
+        outRow[x] = static_cast<png_byte>(idx);
+      }
+      png_write_row(writePtr, outRow.get());
     }
+  } else if (newColorType == PNG_COLOR_TYPE_GRAY ||
+             newColorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
+    const size_t bpp = newColorType == PNG_COLOR_TYPE_GRAY ? 1 : 2;
+    auto outRow = std::unique_ptr<png_byte[]>(new png_byte[image->width * bpp]);
 
-    if (context->verbose()) {
-        DiagMessage msg;
-        msg << " paletteSize=" << colorPalette.size()
-                << " alphaPaletteSize=" << alphaPalette.size()
-                << " maxGrayDeviation=" << maxGrayDeviation
-                << " grayScale=" << (grayScale ? "true" : "false");
-        context->getDiagnostics()->note(msg);
-    }
-
-    const bool convertibleToGrayScale = maxGrayDeviation <= options.grayScaleTolerance;
-
-    const int newColorType = pickColorType(image->width, image->height, grayScale,
-                                           convertibleToGrayScale, ninePatch != nullptr,
-                                           colorPalette.size(), alphaPalette.size());
-
-    if (context->verbose()) {
-        DiagMessage msg;
-        msg << "encoding PNG ";
-        if (ninePatch) {
-            msg << "(with 9-patch) as ";
+    for (int32_t y = 0; y < image->height; y++) {
+      png_const_bytep inRow = image->rows[y];
+      for (int32_t x = 0; x < image->width; x++) {
+        int rr = inRow[x * 4];
+        int gg = inRow[x * 4 + 1];
+        int bb = inRow[x * 4 + 2];
+        int aa = inRow[x * 4 + 3];
+        if (aa == 0) {
+          // Zero out the gray channel when transparent.
+          rr = gg = bb = 0;
         }
-        switch (newColorType) {
-        case PNG_COLOR_TYPE_GRAY:
-            msg << "GRAY";
-            break;
-        case PNG_COLOR_TYPE_GRAY_ALPHA:
-            msg << "GRAY + ALPHA";
-            break;
-        case PNG_COLOR_TYPE_RGB:
-            msg << "RGB";
-            break;
-        case PNG_COLOR_TYPE_RGB_ALPHA:
-            msg << "RGBA";
-            break;
-        case PNG_COLOR_TYPE_PALETTE:
-            msg << "PALETTE";
-            break;
-        default:
-            msg << "unknown type " << newColorType;
-            break;
-        }
-        context->getDiagnostics()->note(msg);
-    }
 
-    png_set_IHDR(writePtr, writeInfoPtr, image->width, image->height, 8, newColorType,
-                 PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
-
-    if (newColorType & PNG_COLOR_MASK_PALETTE) {
-        // Assigns indices to the palette, and writes the encoded palette to the libpng writePtr.
-        writePalette(writePtr, writeInfoPtr, &colorPalette, &alphaPalette);
-        png_set_filter(writePtr, 0, PNG_NO_FILTERS);
-    } else {
-        png_set_filter(writePtr, 0, PNG_ALL_FILTERS);
-    }
-
-    if (ninePatch) {
-        writeNinePatch(writePtr, writeInfoPtr, ninePatch);
-    }
-
-    // Flush our updates to the header.
-    png_write_info(writePtr, writeInfoPtr);
-
-    // Write out each row of image data according to its encoding.
-    if (newColorType == PNG_COLOR_TYPE_PALETTE) {
-        // 1 byte/pixel.
-        auto outRow = std::unique_ptr<png_byte[]>(new png_byte[image->width]);
-
-        for (int32_t y = 0; y < image->height; y++) {
-            png_const_bytep inRow = image->rows[y];
-            for (int32_t x = 0; x < image->width; x++) {
-                int rr = *inRow++;
-                int gg = *inRow++;
-                int bb = *inRow++;
-                int aa = *inRow++;
-                if (aa == 0) {
-                    // Zero out color channels when transparent.
-                    rr = gg = bb = 0;
-                }
-
-                const uint32_t color = rr << 24 | gg << 16 | bb << 8 | aa;
-                const int idx = colorPalette[color];
-                assert(idx != -1);
-                outRow[x] = static_cast<png_byte>(idx);
-            }
-            png_write_row(writePtr, outRow.get());
-        }
-    } else if (newColorType == PNG_COLOR_TYPE_GRAY || newColorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
-        const size_t bpp = newColorType == PNG_COLOR_TYPE_GRAY ? 1 : 2;
-        auto outRow = std::unique_ptr<png_byte[]>(new png_byte[image->width * bpp]);
-
-        for (int32_t y = 0; y < image->height; y++) {
-            png_const_bytep inRow = image->rows[y];
-            for (int32_t x = 0; x < image->width; x++) {
-                int rr = inRow[x * 4];
-                int gg = inRow[x * 4 + 1];
-                int bb = inRow[x * 4 + 2];
-                int aa = inRow[x * 4 + 3];
-                if (aa == 0) {
-                    // Zero out the gray channel when transparent.
-                    rr = gg = bb = 0;
-                }
-
-                if (grayScale) {
-                    // The image was already grayscale, red == green == blue.
-                    outRow[x * bpp] = inRow[x * 4];
-                } else {
-                    // The image is convertible to grayscale, use linear-luminance of
-                    // sRGB colorspace: https://en.wikipedia.org/wiki/Grayscale#Colorimetric_.28luminance-preserving.29_conversion_to_grayscale
-                    outRow[x * bpp] = (png_byte) (rr * 0.2126f + gg * 0.7152f + bb * 0.0722f);
-                }
-
-                if (bpp == 2) {
-                    // Write out alpha if we have it.
-                    outRow[x * bpp + 1] = aa;
-                }
-            }
-            png_write_row(writePtr, outRow.get());
-        }
-    } else if (newColorType == PNG_COLOR_TYPE_RGB || newColorType == PNG_COLOR_TYPE_RGBA) {
-        const size_t bpp = newColorType == PNG_COLOR_TYPE_RGB ? 3 : 4;
-        if (needsToZeroRGBChannelsOfTransparentPixels) {
-            // The source RGBA data can't be used as-is, because we need to zero out the RGB
-            // values of transparent pixels.
-            auto outRow = std::unique_ptr<png_byte[]>(new png_byte[image->width * bpp]);
-
-            for (int32_t y = 0; y < image->height; y++) {
-                png_const_bytep inRow = image->rows[y];
-                for (int32_t x = 0; x < image->width; x++) {
-                    int rr = *inRow++;
-                    int gg = *inRow++;
-                    int bb = *inRow++;
-                    int aa = *inRow++;
-                    if (aa == 0) {
-                        // Zero out the RGB channels when transparent.
-                        rr = gg = bb = 0;
-                    }
-                    outRow[x * bpp] = rr;
-                    outRow[x * bpp + 1] = gg;
-                    outRow[x * bpp + 2] = bb;
-                    if (bpp == 4) {
-                        outRow[x * bpp + 3] = aa;
-                    }
-                }
-                png_write_row(writePtr, outRow.get());
-            }
+        if (grayScale) {
+          // The image was already grayscale, red == green == blue.
+          outRow[x * bpp] = inRow[x * 4];
         } else {
-            // The source image can be used as-is, just tell libpng whether or not to ignore
-            // the alpha channel.
-            if (newColorType == PNG_COLOR_TYPE_RGB) {
-                // Delete the extraneous alpha values that we appended to our buffer
-                // when reading the original values.
-                png_set_filler(writePtr, 0, PNG_FILLER_AFTER);
-            }
-            png_write_image(writePtr, image->rows.get());
+          // The image is convertible to grayscale, use linear-luminance of
+          // sRGB colorspace:
+          // https://en.wikipedia.org/wiki/Grayscale#Colorimetric_.28luminance-preserving.29_conversion_to_grayscale
+          outRow[x * bpp] =
+              (png_byte)(rr * 0.2126f + gg * 0.7152f + bb * 0.0722f);
         }
-    } else {
-        assert(false && "unreachable");
-    }
 
-    png_write_end(writePtr, writeInfoPtr);
-    return true;
+        if (bpp == 2) {
+          // Write out alpha if we have it.
+          outRow[x * bpp + 1] = aa;
+        }
+      }
+      png_write_row(writePtr, outRow.get());
+    }
+  } else if (newColorType == PNG_COLOR_TYPE_RGB ||
+             newColorType == PNG_COLOR_TYPE_RGBA) {
+    const size_t bpp = newColorType == PNG_COLOR_TYPE_RGB ? 3 : 4;
+    if (needsToZeroRGBChannelsOfTransparentPixels) {
+      // The source RGBA data can't be used as-is, because we need to zero out
+      // the RGB
+      // values of transparent pixels.
+      auto outRow =
+          std::unique_ptr<png_byte[]>(new png_byte[image->width * bpp]);
+
+      for (int32_t y = 0; y < image->height; y++) {
+        png_const_bytep inRow = image->rows[y];
+        for (int32_t x = 0; x < image->width; x++) {
+          int rr = *inRow++;
+          int gg = *inRow++;
+          int bb = *inRow++;
+          int aa = *inRow++;
+          if (aa == 0) {
+            // Zero out the RGB channels when transparent.
+            rr = gg = bb = 0;
+          }
+          outRow[x * bpp] = rr;
+          outRow[x * bpp + 1] = gg;
+          outRow[x * bpp + 2] = bb;
+          if (bpp == 4) {
+            outRow[x * bpp + 3] = aa;
+          }
+        }
+        png_write_row(writePtr, outRow.get());
+      }
+    } else {
+      // The source image can be used as-is, just tell libpng whether or not to
+      // ignore
+      // the alpha channel.
+      if (newColorType == PNG_COLOR_TYPE_RGB) {
+        // Delete the extraneous alpha values that we appended to our buffer
+        // when reading the original values.
+        png_set_filler(writePtr, 0, PNG_FILLER_AFTER);
+      }
+      png_write_image(writePtr, image->rows.get());
+    }
+  } else {
+    assert(false && "unreachable");
+  }
+
+  png_write_end(writePtr, writeInfoPtr);
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/PseudolocaleGenerator.cpp b/tools/aapt2/compile/PseudolocaleGenerator.cpp
index 732101f..d8ed0bb 100644
--- a/tools/aapt2/compile/PseudolocaleGenerator.cpp
+++ b/tools/aapt2/compile/PseudolocaleGenerator.cpp
@@ -14,235 +14,242 @@
  * limitations under the License.
  */
 
+#include "compile/PseudolocaleGenerator.h"
 #include "ResourceTable.h"
 #include "ResourceValues.h"
 #include "ValueVisitor.h"
-#include "compile/PseudolocaleGenerator.h"
 #include "compile/Pseudolocalizer.h"
 
 #include <algorithm>
 
 namespace aapt {
 
-std::unique_ptr<StyledString> pseudolocalizeStyledString(StyledString* string,
-                                                         Pseudolocalizer::Method method,
-                                                         StringPool* pool) {
-    Pseudolocalizer localizer(method);
+std::unique_ptr<StyledString> pseudolocalizeStyledString(
+    StyledString* string, Pseudolocalizer::Method method, StringPool* pool) {
+  Pseudolocalizer localizer(method);
 
-    const StringPiece originalText = *string->value->str;
+  const StringPiece originalText = *string->value->str;
 
-    StyleString localized;
+  StyleString localized;
 
-    // Copy the spans. We will update their offsets when we localize.
-    localized.spans.reserve(string->value->spans.size());
-    for (const StringPool::Span& span : string->value->spans) {
-        localized.spans.push_back(Span{ *span.name, span.firstChar, span.lastChar });
+  // Copy the spans. We will update their offsets when we localize.
+  localized.spans.reserve(string->value->spans.size());
+  for (const StringPool::Span& span : string->value->spans) {
+    localized.spans.push_back(Span{*span.name, span.firstChar, span.lastChar});
+  }
+
+  // The ranges are all represented with a single value. This is the start of
+  // one range and
+  // end of another.
+  struct Range {
+    size_t start;
+
+    // Once the new string is localized, these are the pointers to the spans to
+    // adjust.
+    // Since this struct represents the start of one range and end of another,
+    // we have
+    // the two pointers respectively.
+    uint32_t* updateStart;
+    uint32_t* updateEnd;
+  };
+
+  auto cmp = [](const Range& r, size_t index) -> bool {
+    return r.start < index;
+  };
+
+  // Construct the ranges. The ranges are represented like so: [0, 2, 5, 7]
+  // The ranges are the spaces in between. In this example, with a total string
+  // length of 9,
+  // the vector represents: (0,1], (2,4], (5,6], (7,9]
+  //
+  std::vector<Range> ranges;
+  ranges.push_back(Range{0});
+  ranges.push_back(Range{originalText.size() - 1});
+  for (size_t i = 0; i < string->value->spans.size(); i++) {
+    const StringPool::Span& span = string->value->spans[i];
+
+    // Insert or update the Range marker for the start of this span.
+    auto iter =
+        std::lower_bound(ranges.begin(), ranges.end(), span.firstChar, cmp);
+    if (iter != ranges.end() && iter->start == span.firstChar) {
+      iter->updateStart = &localized.spans[i].firstChar;
+    } else {
+      ranges.insert(
+          iter, Range{span.firstChar, &localized.spans[i].firstChar, nullptr});
     }
 
-    // The ranges are all represented with a single value. This is the start of one range and
-    // end of another.
-    struct Range {
-        size_t start;
+    // Insert or update the Range marker for the end of this span.
+    iter = std::lower_bound(ranges.begin(), ranges.end(), span.lastChar, cmp);
+    if (iter != ranges.end() && iter->start == span.lastChar) {
+      iter->updateEnd = &localized.spans[i].lastChar;
+    } else {
+      ranges.insert(
+          iter, Range{span.lastChar, nullptr, &localized.spans[i].lastChar});
+    }
+  }
 
-        // Once the new string is localized, these are the pointers to the spans to adjust.
-        // Since this struct represents the start of one range and end of another, we have
-        // the two pointers respectively.
-        uint32_t* updateStart;
-        uint32_t* updateEnd;
-    };
+  localized.str += localizer.start();
 
-    auto cmp = [](const Range& r, size_t index) -> bool {
-        return r.start < index;
-    };
-
-    // Construct the ranges. The ranges are represented like so: [0, 2, 5, 7]
-    // The ranges are the spaces in between. In this example, with a total string length of 9,
-    // the vector represents: (0,1], (2,4], (5,6], (7,9]
-    //
-    std::vector<Range> ranges;
-    ranges.push_back(Range{ 0 });
-    ranges.push_back(Range{ originalText.size() - 1 });
-    for (size_t i = 0; i < string->value->spans.size(); i++) {
-        const StringPool::Span& span = string->value->spans[i];
-
-        // Insert or update the Range marker for the start of this span.
-        auto iter = std::lower_bound(ranges.begin(), ranges.end(), span.firstChar, cmp);
-        if (iter != ranges.end() && iter->start == span.firstChar) {
-            iter->updateStart = &localized.spans[i].firstChar;
-        } else {
-            ranges.insert(iter,
-                          Range{ span.firstChar, &localized.spans[i].firstChar, nullptr });
-        }
-
-        // Insert or update the Range marker for the end of this span.
-        iter = std::lower_bound(ranges.begin(), ranges.end(), span.lastChar, cmp);
-        if (iter != ranges.end() && iter->start == span.lastChar) {
-            iter->updateEnd = &localized.spans[i].lastChar;
-        } else {
-            ranges.insert(iter,
-                          Range{ span.lastChar, nullptr, &localized.spans[i].lastChar });
-        }
+  // Iterate over the ranges and localize each section.
+  for (size_t i = 0; i < ranges.size(); i++) {
+    const size_t start = ranges[i].start;
+    size_t len = originalText.size() - start;
+    if (i + 1 < ranges.size()) {
+      len = ranges[i + 1].start - start;
     }
 
-    localized.str += localizer.start();
-
-    // Iterate over the ranges and localize each section.
-    for (size_t i = 0; i < ranges.size(); i++) {
-        const size_t start = ranges[i].start;
-        size_t len = originalText.size() - start;
-        if (i + 1 < ranges.size()) {
-            len = ranges[i + 1].start - start;
-        }
-
-        if (ranges[i].updateStart) {
-            *ranges[i].updateStart = localized.str.size();
-        }
-
-        if (ranges[i].updateEnd) {
-            *ranges[i].updateEnd = localized.str.size();
-        }
-
-        localized.str += localizer.text(originalText.substr(start, len));
+    if (ranges[i].updateStart) {
+      *ranges[i].updateStart = localized.str.size();
     }
 
-    localized.str += localizer.end();
+    if (ranges[i].updateEnd) {
+      *ranges[i].updateEnd = localized.str.size();
+    }
 
-    std::unique_ptr<StyledString> localizedString = util::make_unique<StyledString>(
-            pool->makeRef(localized));
-    localizedString->setSource(string->getSource());
-    return localizedString;
+    localized.str += localizer.text(originalText.substr(start, len));
+  }
+
+  localized.str += localizer.end();
+
+  std::unique_ptr<StyledString> localizedString =
+      util::make_unique<StyledString>(pool->makeRef(localized));
+  localizedString->setSource(string->getSource());
+  return localizedString;
 }
 
 namespace {
 
 struct Visitor : public RawValueVisitor {
-    StringPool* mPool;
-    Pseudolocalizer::Method mMethod;
-    Pseudolocalizer mLocalizer;
+  StringPool* mPool;
+  Pseudolocalizer::Method mMethod;
+  Pseudolocalizer mLocalizer;
 
-    // Either value or item will be populated upon visiting the value.
-    std::unique_ptr<Value> mValue;
-    std::unique_ptr<Item> mItem;
+  // Either value or item will be populated upon visiting the value.
+  std::unique_ptr<Value> mValue;
+  std::unique_ptr<Item> mItem;
 
-    Visitor(StringPool* pool, Pseudolocalizer::Method method) :
-            mPool(pool), mMethod(method), mLocalizer(method) {
-    }
+  Visitor(StringPool* pool, Pseudolocalizer::Method method)
+      : mPool(pool), mMethod(method), mLocalizer(method) {}
 
-    void visit(Plural* plural) override {
-        std::unique_ptr<Plural> localized = util::make_unique<Plural>();
-        for (size_t i = 0; i < plural->values.size(); i++) {
-            Visitor subVisitor(mPool, mMethod);
-            if (plural->values[i]) {
-                plural->values[i]->accept(&subVisitor);
-                if (subVisitor.mValue) {
-                    localized->values[i] = std::move(subVisitor.mItem);
-                } else {
-                    localized->values[i] = std::unique_ptr<Item>(plural->values[i]->clone(mPool));
-                }
-            }
+  void visit(Plural* plural) override {
+    std::unique_ptr<Plural> localized = util::make_unique<Plural>();
+    for (size_t i = 0; i < plural->values.size(); i++) {
+      Visitor subVisitor(mPool, mMethod);
+      if (plural->values[i]) {
+        plural->values[i]->accept(&subVisitor);
+        if (subVisitor.mValue) {
+          localized->values[i] = std::move(subVisitor.mItem);
+        } else {
+          localized->values[i] =
+              std::unique_ptr<Item>(plural->values[i]->clone(mPool));
         }
-        localized->setSource(plural->getSource());
-        localized->setWeak(true);
-        mValue = std::move(localized);
+      }
     }
+    localized->setSource(plural->getSource());
+    localized->setWeak(true);
+    mValue = std::move(localized);
+  }
 
-    void visit(String* string) override {
-        std::string result = mLocalizer.start() + mLocalizer.text(*string->value) +
-                mLocalizer.end();
-        std::unique_ptr<String> localized = util::make_unique<String>(mPool->makeRef(result));
-        localized->setSource(string->getSource());
-        localized->setWeak(true);
-        mItem = std::move(localized);
-    }
+  void visit(String* string) override {
+    std::string result =
+        mLocalizer.start() + mLocalizer.text(*string->value) + mLocalizer.end();
+    std::unique_ptr<String> localized =
+        util::make_unique<String>(mPool->makeRef(result));
+    localized->setSource(string->getSource());
+    localized->setWeak(true);
+    mItem = std::move(localized);
+  }
 
-    void visit(StyledString* string) override {
-        mItem = pseudolocalizeStyledString(string, mMethod, mPool);
-        mItem->setWeak(true);
-    }
+  void visit(StyledString* string) override {
+    mItem = pseudolocalizeStyledString(string, mMethod, mPool);
+    mItem->setWeak(true);
+  }
 };
 
 ConfigDescription modifyConfigForPseudoLocale(const ConfigDescription& base,
                                               Pseudolocalizer::Method m) {
-    ConfigDescription modified = base;
-    switch (m) {
+  ConfigDescription modified = base;
+  switch (m) {
     case Pseudolocalizer::Method::kAccent:
-        modified.language[0] = 'e';
-        modified.language[1] = 'n';
-        modified.country[0] = 'X';
-        modified.country[1] = 'A';
-        break;
+      modified.language[0] = 'e';
+      modified.language[1] = 'n';
+      modified.country[0] = 'X';
+      modified.country[1] = 'A';
+      break;
 
     case Pseudolocalizer::Method::kBidi:
-        modified.language[0] = 'a';
-        modified.language[1] = 'r';
-        modified.country[0] = 'X';
-        modified.country[1] = 'B';
-        break;
+      modified.language[0] = 'a';
+      modified.language[1] = 'r';
+      modified.country[0] = 'X';
+      modified.country[1] = 'B';
+      break;
     default:
-        break;
-    }
-    return modified;
+      break;
+  }
+  return modified;
 }
 
 void pseudolocalizeIfNeeded(const Pseudolocalizer::Method method,
                             ResourceConfigValue* originalValue,
-                            StringPool* pool,
-                            ResourceEntry* entry) {
-    Visitor visitor(pool, method);
-    originalValue->value->accept(&visitor);
+                            StringPool* pool, ResourceEntry* entry) {
+  Visitor visitor(pool, method);
+  originalValue->value->accept(&visitor);
 
-    std::unique_ptr<Value> localizedValue;
-    if (visitor.mValue) {
-        localizedValue = std::move(visitor.mValue);
-    } else if (visitor.mItem) {
-        localizedValue = std::move(visitor.mItem);
-    }
+  std::unique_ptr<Value> localizedValue;
+  if (visitor.mValue) {
+    localizedValue = std::move(visitor.mValue);
+  } else if (visitor.mItem) {
+    localizedValue = std::move(visitor.mItem);
+  }
 
-    if (!localizedValue) {
-        return;
-    }
+  if (!localizedValue) {
+    return;
+  }
 
-    ConfigDescription configWithAccent = modifyConfigForPseudoLocale(
-            originalValue->config, method);
+  ConfigDescription configWithAccent =
+      modifyConfigForPseudoLocale(originalValue->config, method);
 
-    ResourceConfigValue* newConfigValue = entry->findOrCreateValue(
-            configWithAccent, originalValue->product);
-    if (!newConfigValue->value) {
-        // Only use auto-generated pseudo-localization if none is defined.
-        newConfigValue->value = std::move(localizedValue);
-    }
+  ResourceConfigValue* newConfigValue =
+      entry->findOrCreateValue(configWithAccent, originalValue->product);
+  if (!newConfigValue->value) {
+    // Only use auto-generated pseudo-localization if none is defined.
+    newConfigValue->value = std::move(localizedValue);
+  }
 }
 
 /**
- * A value is pseudolocalizable if it does not define a locale (or is the default locale)
+ * A value is pseudolocalizable if it does not define a locale (or is the
+ * default locale)
  * and is translateable.
  */
 static bool isPseudolocalizable(ResourceConfigValue* configValue) {
-    const int diff = configValue->config.diff(ConfigDescription::defaultConfig());
-    if (diff & ConfigDescription::CONFIG_LOCALE) {
-        return false;
-    }
-    return configValue->value->isTranslateable();
+  const int diff = configValue->config.diff(ConfigDescription::defaultConfig());
+  if (diff & ConfigDescription::CONFIG_LOCALE) {
+    return false;
+  }
+  return configValue->value->isTranslateable();
 }
 
-} // namespace
+}  // namespace
 
-bool PseudolocaleGenerator::consume(IAaptContext* context, ResourceTable* table) {
-    for (auto& package : table->packages) {
-        for (auto& type : package->types) {
-            for (auto& entry : type->entries) {
-                std::vector<ResourceConfigValue*> values = entry->findValuesIf(isPseudolocalizable);
+bool PseudolocaleGenerator::consume(IAaptContext* context,
+                                    ResourceTable* table) {
+  for (auto& package : table->packages) {
+    for (auto& type : package->types) {
+      for (auto& entry : type->entries) {
+        std::vector<ResourceConfigValue*> values =
+            entry->findValuesIf(isPseudolocalizable);
 
-                for (ResourceConfigValue* value : values) {
-                    pseudolocalizeIfNeeded(Pseudolocalizer::Method::kAccent, value,
-                                           &table->stringPool, entry.get());
-                    pseudolocalizeIfNeeded(Pseudolocalizer::Method::kBidi, value,
-                                           &table->stringPool, entry.get());
-                }
-            }
+        for (ResourceConfigValue* value : values) {
+          pseudolocalizeIfNeeded(Pseudolocalizer::Method::kAccent, value,
+                                 &table->stringPool, entry.get());
+          pseudolocalizeIfNeeded(Pseudolocalizer::Method::kBidi, value,
+                                 &table->stringPool, entry.get());
         }
+      }
     }
-    return true;
+  }
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/PseudolocaleGenerator.h b/tools/aapt2/compile/PseudolocaleGenerator.h
index 4fbc516..4e97cb9 100644
--- a/tools/aapt2/compile/PseudolocaleGenerator.h
+++ b/tools/aapt2/compile/PseudolocaleGenerator.h
@@ -23,14 +23,13 @@
 
 namespace aapt {
 
-std::unique_ptr<StyledString> pseudolocalizeStyledString(StyledString* string,
-                                                         Pseudolocalizer::Method method,
-                                                         StringPool* pool);
+std::unique_ptr<StyledString> pseudolocalizeStyledString(
+    StyledString* string, Pseudolocalizer::Method method, StringPool* pool);
 
 struct PseudolocaleGenerator : public IResourceTableConsumer {
-    bool consume(IAaptContext* context, ResourceTable* table) override;
+  bool consume(IAaptContext* context, ResourceTable* table) override;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_COMPILE_PSEUDOLOCALEGENERATOR_H */
diff --git a/tools/aapt2/compile/PseudolocaleGenerator_test.cpp b/tools/aapt2/compile/PseudolocaleGenerator_test.cpp
index 1f62f90..64a3e97 100644
--- a/tools/aapt2/compile/PseudolocaleGenerator_test.cpp
+++ b/tools/aapt2/compile/PseudolocaleGenerator_test.cpp
@@ -23,99 +23,110 @@
 namespace aapt {
 
 TEST(PseudolocaleGeneratorTest, PseudolocalizeStyledString) {
-    StringPool pool;
-    StyleString originalStyle;
-    originalStyle.str = "Hello world!";
-    originalStyle.spans = { Span{ "b", 2, 3 }, Span{ "b", 6, 7 }, Span{ "i", 1, 10 } };
+  StringPool pool;
+  StyleString originalStyle;
+  originalStyle.str = "Hello world!";
+  originalStyle.spans = {Span{"b", 2, 3}, Span{"b", 6, 7}, Span{"i", 1, 10}};
 
-    std::unique_ptr<StyledString> newString = pseudolocalizeStyledString(
-            util::make_unique<StyledString>(pool.makeRef(originalStyle)).get(),
-            Pseudolocalizer::Method::kNone, &pool);
+  std::unique_ptr<StyledString> newString = pseudolocalizeStyledString(
+      util::make_unique<StyledString>(pool.makeRef(originalStyle)).get(),
+      Pseudolocalizer::Method::kNone, &pool);
 
-    EXPECT_EQ(originalStyle.str, *newString->value->str);
-    ASSERT_EQ(originalStyle.spans.size(), newString->value->spans.size());
+  EXPECT_EQ(originalStyle.str, *newString->value->str);
+  ASSERT_EQ(originalStyle.spans.size(), newString->value->spans.size());
 
-    EXPECT_EQ(std::string("He").size(), newString->value->spans[0].firstChar);
-    EXPECT_EQ(std::string("Hel").size(), newString->value->spans[0].lastChar);
-    EXPECT_EQ(std::string("b"), *newString->value->spans[0].name);
+  EXPECT_EQ(std::string("He").size(), newString->value->spans[0].firstChar);
+  EXPECT_EQ(std::string("Hel").size(), newString->value->spans[0].lastChar);
+  EXPECT_EQ(std::string("b"), *newString->value->spans[0].name);
 
-    EXPECT_EQ(std::string("Hello ").size(), newString->value->spans[1].firstChar);
-    EXPECT_EQ(std::string("Hello w").size(), newString->value->spans[1].lastChar);
-    EXPECT_EQ(std::string("b"), *newString->value->spans[1].name);
+  EXPECT_EQ(std::string("Hello ").size(), newString->value->spans[1].firstChar);
+  EXPECT_EQ(std::string("Hello w").size(), newString->value->spans[1].lastChar);
+  EXPECT_EQ(std::string("b"), *newString->value->spans[1].name);
 
-    EXPECT_EQ(std::string("H").size(), newString->value->spans[2].firstChar);
-    EXPECT_EQ(std::string("Hello worl").size(), newString->value->spans[2].lastChar);
-    EXPECT_EQ(std::string("i"), *newString->value->spans[2].name);
+  EXPECT_EQ(std::string("H").size(), newString->value->spans[2].firstChar);
+  EXPECT_EQ(std::string("Hello worl").size(),
+            newString->value->spans[2].lastChar);
+  EXPECT_EQ(std::string("i"), *newString->value->spans[2].name);
 
-    originalStyle.spans.push_back(Span{ "em", 0, 11u });
+  originalStyle.spans.push_back(Span{"em", 0, 11u});
 
-    newString = pseudolocalizeStyledString(
-            util::make_unique<StyledString>(pool.makeRef(originalStyle)).get(),
-            Pseudolocalizer::Method::kAccent, &pool);
+  newString = pseudolocalizeStyledString(
+      util::make_unique<StyledString>(pool.makeRef(originalStyle)).get(),
+      Pseudolocalizer::Method::kAccent, &pool);
 
-    EXPECT_EQ(std::string("[Ĥéļļö ŵöŕļð¡ one two]"), *newString->value->str);
-    ASSERT_EQ(originalStyle.spans.size(), newString->value->spans.size());
+  EXPECT_EQ(std::string("[Ĥéļļö ŵöŕļð¡ one two]"), *newString->value->str);
+  ASSERT_EQ(originalStyle.spans.size(), newString->value->spans.size());
 
-    EXPECT_EQ(std::string("[Ĥé").size(), newString->value->spans[0].firstChar);
-    EXPECT_EQ(std::string("[Ĥéļ").size(), newString->value->spans[0].lastChar);
+  EXPECT_EQ(std::string("[Ĥé").size(), newString->value->spans[0].firstChar);
+  EXPECT_EQ(std::string("[Ĥéļ").size(), newString->value->spans[0].lastChar);
 
-    EXPECT_EQ(std::string("[Ĥéļļö ").size(), newString->value->spans[1].firstChar);
-    EXPECT_EQ(std::string("[Ĥéļļö ŵ").size(), newString->value->spans[1].lastChar);
+  EXPECT_EQ(std::string("[Ĥéļļö ").size(),
+            newString->value->spans[1].firstChar);
+  EXPECT_EQ(std::string("[Ĥéļļö ŵ").size(),
+            newString->value->spans[1].lastChar);
 
-    EXPECT_EQ(std::string("[Ĥ").size(), newString->value->spans[2].firstChar);
-    EXPECT_EQ(std::string("[Ĥéļļö ŵöŕļ").size(), newString->value->spans[2].lastChar);
+  EXPECT_EQ(std::string("[Ĥ").size(), newString->value->spans[2].firstChar);
+  EXPECT_EQ(std::string("[Ĥéļļö ŵöŕļ").size(),
+            newString->value->spans[2].lastChar);
 
-    EXPECT_EQ(std::string("[").size(), newString->value->spans[3].firstChar);
-    EXPECT_EQ(std::string("[Ĥéļļö ŵöŕļð").size(), newString->value->spans[3].lastChar);
+  EXPECT_EQ(std::string("[").size(), newString->value->spans[3].firstChar);
+  EXPECT_EQ(std::string("[Ĥéļļö ŵöŕļð").size(),
+            newString->value->spans[3].lastChar);
 }
 
 TEST(PseudolocaleGeneratorTest, PseudolocalizeOnlyDefaultConfigs) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .addString("android:string/one", "one")
-            .addString("android:string/two", ResourceId{}, test::parseConfigOrDie("en"), "two")
-            .addString("android:string/three", "three")
-            .addString("android:string/three", ResourceId{}, test::parseConfigOrDie("en-rXA"),
-                       "three")
-            .addString("android:string/four", "four")
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .addString("android:string/one", "one")
+          .addString("android:string/two", ResourceId{},
+                     test::parseConfigOrDie("en"), "two")
+          .addString("android:string/three", "three")
+          .addString("android:string/three", ResourceId{},
+                     test::parseConfigOrDie("en-rXA"), "three")
+          .addString("android:string/four", "four")
+          .build();
 
-    String* val = test::getValue<String>(table.get(), "android:string/four");
-    ASSERT_NE(nullptr, val);
-    val->setTranslateable(false);
+  String* val = test::getValue<String>(table.get(), "android:string/four");
+  ASSERT_NE(nullptr, val);
+  val->setTranslateable(false);
 
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
-    PseudolocaleGenerator generator;
-    ASSERT_TRUE(generator.consume(context.get(), table.get()));
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  PseudolocaleGenerator generator;
+  ASSERT_TRUE(generator.consume(context.get(), table.get()));
 
-    // Normal pseudolocalization should take place.
-    ASSERT_NE(nullptr, test::getValueForConfig<String>(table.get(), "android:string/one",
-                                                       test::parseConfigOrDie("en-rXA")));
-    ASSERT_NE(nullptr, test::getValueForConfig<String>(table.get(), "android:string/one",
-                                                       test::parseConfigOrDie("ar-rXB")));
+  // Normal pseudolocalization should take place.
+  ASSERT_NE(nullptr,
+            test::getValueForConfig<String>(table.get(), "android:string/one",
+                                            test::parseConfigOrDie("en-rXA")));
+  ASSERT_NE(nullptr,
+            test::getValueForConfig<String>(table.get(), "android:string/one",
+                                            test::parseConfigOrDie("ar-rXB")));
 
-    // No default config for android:string/two, so no pseudlocales should exist.
-    ASSERT_EQ(nullptr, test::getValueForConfig<String>(table.get(), "android:string/two",
-                                                       test::parseConfigOrDie("en-rXA")));
-    ASSERT_EQ(nullptr, test::getValueForConfig<String>(table.get(), "android:string/two",
-                                                       test::parseConfigOrDie("ar-rXB")));
+  // No default config for android:string/two, so no pseudlocales should exist.
+  ASSERT_EQ(nullptr,
+            test::getValueForConfig<String>(table.get(), "android:string/two",
+                                            test::parseConfigOrDie("en-rXA")));
+  ASSERT_EQ(nullptr,
+            test::getValueForConfig<String>(table.get(), "android:string/two",
+                                            test::parseConfigOrDie("ar-rXB")));
 
+  // Check that we didn't override manual pseudolocalization.
+  val = test::getValueForConfig<String>(table.get(), "android:string/three",
+                                        test::parseConfigOrDie("en-rXA"));
+  ASSERT_NE(nullptr, val);
+  EXPECT_EQ(std::string("three"), *val->value);
 
-    // Check that we didn't override manual pseudolocalization.
-    val = test::getValueForConfig<String>(table.get(), "android:string/three",
-                                          test::parseConfigOrDie("en-rXA"));
-    ASSERT_NE(nullptr, val);
-    EXPECT_EQ(std::string("three"), *val->value);
+  ASSERT_NE(nullptr,
+            test::getValueForConfig<String>(table.get(), "android:string/three",
+                                            test::parseConfigOrDie("ar-rXB")));
 
-    ASSERT_NE(nullptr, test::getValueForConfig<String>(table.get(), "android:string/three",
-                                                       test::parseConfigOrDie("ar-rXB")));
-
-    // Check that four's translateable marker was honored.
-    ASSERT_EQ(nullptr, test::getValueForConfig<String>(table.get(), "android:string/four",
-                                                       test::parseConfigOrDie("en-rXA")));
-    ASSERT_EQ(nullptr, test::getValueForConfig<String>(table.get(), "android:string/four",
-                                                       test::parseConfigOrDie("ar-rXB")));
-
+  // Check that four's translateable marker was honored.
+  ASSERT_EQ(nullptr,
+            test::getValueForConfig<String>(table.get(), "android:string/four",
+                                            test::parseConfigOrDie("en-rXA")));
+  ASSERT_EQ(nullptr,
+            test::getValueForConfig<String>(table.get(), "android:string/four",
+                                            test::parseConfigOrDie("ar-rXB")));
 }
 
-} // namespace aapt
-
+}  // namespace aapt
diff --git a/tools/aapt2/compile/Pseudolocalizer.cpp b/tools/aapt2/compile/Pseudolocalizer.cpp
index 90d0d85..c3aec98 100644
--- a/tools/aapt2/compile/Pseudolocalizer.cpp
+++ b/tools/aapt2/compile/Pseudolocalizer.cpp
@@ -20,9 +20,10 @@
 namespace aapt {
 
 // String basis to generate expansion
-static const std::string k_expansion_string = "one two three "
-        "four five six seven eight nine ten eleven twelve thirteen "
-        "fourteen fiveteen sixteen seventeen nineteen twenty";
+static const std::string k_expansion_string =
+    "one two three "
+    "four five six seven eight nine ten eleven twelve thirteen "
+    "fourteen fiveteen sixteen seventeen nineteen twenty";
 
 // Special unicode characters to override directionality of the words
 static const std::string k_rlm = "\u200f";
@@ -37,229 +38,310 @@
 static const char k_arg_end = '}';
 
 class PseudoMethodNone : public PseudoMethodImpl {
-public:
-    std::string text(const StringPiece& text) override { return text.toString(); }
-    std::string placeholder(const StringPiece& text) override { return text.toString(); }
+ public:
+  std::string text(const StringPiece& text) override { return text.toString(); }
+  std::string placeholder(const StringPiece& text) override {
+    return text.toString();
+  }
 };
 
 class PseudoMethodBidi : public PseudoMethodImpl {
-public:
-    std::string text(const StringPiece& text) override;
-    std::string placeholder(const StringPiece& text) override;
+ public:
+  std::string text(const StringPiece& text) override;
+  std::string placeholder(const StringPiece& text) override;
 };
 
 class PseudoMethodAccent : public PseudoMethodImpl {
-public:
-    PseudoMethodAccent() : mDepth(0), mWordCount(0), mLength(0) {}
-    std::string start() override;
-    std::string end() override;
-    std::string text(const StringPiece& text) override;
-    std::string placeholder(const StringPiece& text) override;
-private:
-    size_t mDepth;
-    size_t mWordCount;
-    size_t mLength;
+ public:
+  PseudoMethodAccent() : mDepth(0), mWordCount(0), mLength(0) {}
+  std::string start() override;
+  std::string end() override;
+  std::string text(const StringPiece& text) override;
+  std::string placeholder(const StringPiece& text) override;
+
+ private:
+  size_t mDepth;
+  size_t mWordCount;
+  size_t mLength;
 };
 
 Pseudolocalizer::Pseudolocalizer(Method method) : mLastDepth(0) {
-    setMethod(method);
+  setMethod(method);
 }
 
 void Pseudolocalizer::setMethod(Method method) {
-    switch (method) {
+  switch (method) {
     case Method::kNone:
-        mImpl = util::make_unique<PseudoMethodNone>();
-        break;
+      mImpl = util::make_unique<PseudoMethodNone>();
+      break;
     case Method::kAccent:
-        mImpl = util::make_unique<PseudoMethodAccent>();
-        break;
+      mImpl = util::make_unique<PseudoMethodAccent>();
+      break;
     case Method::kBidi:
-        mImpl = util::make_unique<PseudoMethodBidi>();
-        break;
-    }
+      mImpl = util::make_unique<PseudoMethodBidi>();
+      break;
+  }
 }
 
 std::string Pseudolocalizer::text(const StringPiece& text) {
-    std::string out;
-    size_t depth = mLastDepth;
-    size_t lastpos, pos;
-    const size_t length = text.size();
-    const char* str = text.data();
-    bool escaped = false;
-    for (lastpos = pos = 0; pos < length; pos++) {
-        char16_t c = str[pos];
-        if (escaped) {
-            escaped = false;
-            continue;
-        }
-        if (c == '\'') {
-            escaped = true;
-            continue;
-        }
-
-        if (c == k_arg_start) {
-            depth++;
-        } else if (c == k_arg_end && depth) {
-            depth--;
-        }
-
-        if (mLastDepth != depth || pos == length - 1) {
-            bool pseudo = ((mLastDepth % 2) == 0);
-            size_t nextpos = pos;
-            if (!pseudo || depth == mLastDepth) {
-                nextpos++;
-            }
-            size_t size = nextpos - lastpos;
-            if (size) {
-                std::string chunk = text.substr(lastpos, size).toString();
-                if (pseudo) {
-                    chunk = mImpl->text(chunk);
-                } else if (str[lastpos] == k_arg_start && str[nextpos - 1] == k_arg_end) {
-                    chunk = mImpl->placeholder(chunk);
-                }
-                out.append(chunk);
-            }
-            if (pseudo && depth < mLastDepth) { // End of message
-                out.append(mImpl->end());
-            } else if (!pseudo && depth > mLastDepth) { // Start of message
-                out.append(mImpl->start());
-            }
-            lastpos = nextpos;
-            mLastDepth = depth;
-        }
+  std::string out;
+  size_t depth = mLastDepth;
+  size_t lastpos, pos;
+  const size_t length = text.size();
+  const char* str = text.data();
+  bool escaped = false;
+  for (lastpos = pos = 0; pos < length; pos++) {
+    char16_t c = str[pos];
+    if (escaped) {
+      escaped = false;
+      continue;
     }
-    return out;
+    if (c == '\'') {
+      escaped = true;
+      continue;
+    }
+
+    if (c == k_arg_start) {
+      depth++;
+    } else if (c == k_arg_end && depth) {
+      depth--;
+    }
+
+    if (mLastDepth != depth || pos == length - 1) {
+      bool pseudo = ((mLastDepth % 2) == 0);
+      size_t nextpos = pos;
+      if (!pseudo || depth == mLastDepth) {
+        nextpos++;
+      }
+      size_t size = nextpos - lastpos;
+      if (size) {
+        std::string chunk = text.substr(lastpos, size).toString();
+        if (pseudo) {
+          chunk = mImpl->text(chunk);
+        } else if (str[lastpos] == k_arg_start &&
+                   str[nextpos - 1] == k_arg_end) {
+          chunk = mImpl->placeholder(chunk);
+        }
+        out.append(chunk);
+      }
+      if (pseudo && depth < mLastDepth) {  // End of message
+        out.append(mImpl->end());
+      } else if (!pseudo && depth > mLastDepth) {  // Start of message
+        out.append(mImpl->start());
+      }
+      lastpos = nextpos;
+      mLastDepth = depth;
+    }
+  }
+  return out;
 }
 
 static const char* pseudolocalizeChar(const char c) {
-    switch (c) {
-        case 'a':   return "\u00e5";
-        case 'b':   return "\u0253";
-        case 'c':   return "\u00e7";
-        case 'd':   return "\u00f0";
-        case 'e':   return "\u00e9";
-        case 'f':   return "\u0192";
-        case 'g':   return "\u011d";
-        case 'h':   return "\u0125";
-        case 'i':   return "\u00ee";
-        case 'j':   return "\u0135";
-        case 'k':   return "\u0137";
-        case 'l':   return "\u013c";
-        case 'm':   return "\u1e3f";
-        case 'n':   return "\u00f1";
-        case 'o':   return "\u00f6";
-        case 'p':   return "\u00fe";
-        case 'q':   return "\u0051";
-        case 'r':   return "\u0155";
-        case 's':   return "\u0161";
-        case 't':   return "\u0163";
-        case 'u':   return "\u00fb";
-        case 'v':   return "\u0056";
-        case 'w':   return "\u0175";
-        case 'x':   return "\u0445";
-        case 'y':   return "\u00fd";
-        case 'z':   return "\u017e";
-        case 'A':   return "\u00c5";
-        case 'B':   return "\u03b2";
-        case 'C':   return "\u00c7";
-        case 'D':   return "\u00d0";
-        case 'E':   return "\u00c9";
-        case 'G':   return "\u011c";
-        case 'H':   return "\u0124";
-        case 'I':   return "\u00ce";
-        case 'J':   return "\u0134";
-        case 'K':   return "\u0136";
-        case 'L':   return "\u013b";
-        case 'M':   return "\u1e3e";
-        case 'N':   return "\u00d1";
-        case 'O':   return "\u00d6";
-        case 'P':   return "\u00de";
-        case 'Q':   return "\u0071";
-        case 'R':   return "\u0154";
-        case 'S':   return "\u0160";
-        case 'T':   return "\u0162";
-        case 'U':   return "\u00db";
-        case 'V':   return "\u03bd";
-        case 'W':   return "\u0174";
-        case 'X':   return "\u00d7";
-        case 'Y':   return "\u00dd";
-        case 'Z':   return "\u017d";
-        case '!':   return "\u00a1";
-        case '?':   return "\u00bf";
-        case '$':   return "\u20ac";
-        default:    return nullptr;
-    }
+  switch (c) {
+    case 'a':
+      return "\u00e5";
+    case 'b':
+      return "\u0253";
+    case 'c':
+      return "\u00e7";
+    case 'd':
+      return "\u00f0";
+    case 'e':
+      return "\u00e9";
+    case 'f':
+      return "\u0192";
+    case 'g':
+      return "\u011d";
+    case 'h':
+      return "\u0125";
+    case 'i':
+      return "\u00ee";
+    case 'j':
+      return "\u0135";
+    case 'k':
+      return "\u0137";
+    case 'l':
+      return "\u013c";
+    case 'm':
+      return "\u1e3f";
+    case 'n':
+      return "\u00f1";
+    case 'o':
+      return "\u00f6";
+    case 'p':
+      return "\u00fe";
+    case 'q':
+      return "\u0051";
+    case 'r':
+      return "\u0155";
+    case 's':
+      return "\u0161";
+    case 't':
+      return "\u0163";
+    case 'u':
+      return "\u00fb";
+    case 'v':
+      return "\u0056";
+    case 'w':
+      return "\u0175";
+    case 'x':
+      return "\u0445";
+    case 'y':
+      return "\u00fd";
+    case 'z':
+      return "\u017e";
+    case 'A':
+      return "\u00c5";
+    case 'B':
+      return "\u03b2";
+    case 'C':
+      return "\u00c7";
+    case 'D':
+      return "\u00d0";
+    case 'E':
+      return "\u00c9";
+    case 'G':
+      return "\u011c";
+    case 'H':
+      return "\u0124";
+    case 'I':
+      return "\u00ce";
+    case 'J':
+      return "\u0134";
+    case 'K':
+      return "\u0136";
+    case 'L':
+      return "\u013b";
+    case 'M':
+      return "\u1e3e";
+    case 'N':
+      return "\u00d1";
+    case 'O':
+      return "\u00d6";
+    case 'P':
+      return "\u00de";
+    case 'Q':
+      return "\u0071";
+    case 'R':
+      return "\u0154";
+    case 'S':
+      return "\u0160";
+    case 'T':
+      return "\u0162";
+    case 'U':
+      return "\u00db";
+    case 'V':
+      return "\u03bd";
+    case 'W':
+      return "\u0174";
+    case 'X':
+      return "\u00d7";
+    case 'Y':
+      return "\u00dd";
+    case 'Z':
+      return "\u017d";
+    case '!':
+      return "\u00a1";
+    case '?':
+      return "\u00bf";
+    case '$':
+      return "\u20ac";
+    default:
+      return nullptr;
+  }
 }
 
 static bool isPossibleNormalPlaceholderEnd(const char c) {
-    switch (c) {
-        case 's': return true;
-        case 'S': return true;
-        case 'c': return true;
-        case 'C': return true;
-        case 'd': return true;
-        case 'o': return true;
-        case 'x': return true;
-        case 'X': return true;
-        case 'f': return true;
-        case 'e': return true;
-        case 'E': return true;
-        case 'g': return true;
-        case 'G': return true;
-        case 'a': return true;
-        case 'A': return true;
-        case 'b': return true;
-        case 'B': return true;
-        case 'h': return true;
-        case 'H': return true;
-        case '%': return true;
-        case 'n': return true;
-        default:  return false;
-    }
+  switch (c) {
+    case 's':
+      return true;
+    case 'S':
+      return true;
+    case 'c':
+      return true;
+    case 'C':
+      return true;
+    case 'd':
+      return true;
+    case 'o':
+      return true;
+    case 'x':
+      return true;
+    case 'X':
+      return true;
+    case 'f':
+      return true;
+    case 'e':
+      return true;
+    case 'E':
+      return true;
+    case 'g':
+      return true;
+    case 'G':
+      return true;
+    case 'a':
+      return true;
+    case 'A':
+      return true;
+    case 'b':
+      return true;
+    case 'B':
+      return true;
+    case 'h':
+      return true;
+    case 'H':
+      return true;
+    case '%':
+      return true;
+    case 'n':
+      return true;
+    default:
+      return false;
+  }
 }
 
 static std::string pseudoGenerateExpansion(const unsigned int length) {
-    std::string result = k_expansion_string;
-    const char* s = result.data();
-    if (result.size() < length) {
-        result += " ";
-        result += pseudoGenerateExpansion(length - result.size());
-    } else {
-        int ext = 0;
-        // Should contain only whole words, so looking for a space
-        for (unsigned int i = length + 1; i < result.size(); ++i) {
-            ++ext;
-            if (s[i] == ' ') {
-                break;
-            }
-        }
-        result = result.substr(0, length + ext);
+  std::string result = k_expansion_string;
+  const char* s = result.data();
+  if (result.size() < length) {
+    result += " ";
+    result += pseudoGenerateExpansion(length - result.size());
+  } else {
+    int ext = 0;
+    // Should contain only whole words, so looking for a space
+    for (unsigned int i = length + 1; i < result.size(); ++i) {
+      ++ext;
+      if (s[i] == ' ') {
+        break;
+      }
     }
-    return result;
+    result = result.substr(0, length + ext);
+  }
+  return result;
 }
 
 std::string PseudoMethodAccent::start() {
-    std::string result;
-    if (mDepth == 0) {
-        result = "[";
-    }
-    mWordCount = mLength = 0;
-    mDepth++;
-    return result;
+  std::string result;
+  if (mDepth == 0) {
+    result = "[";
+  }
+  mWordCount = mLength = 0;
+  mDepth++;
+  return result;
 }
 
 std::string PseudoMethodAccent::end() {
-    std::string result;
-    if (mLength) {
-        result += " ";
-        result += pseudoGenerateExpansion(mWordCount > 3 ? mLength : mLength / 2);
-    }
-    mWordCount = mLength = 0;
-    mDepth--;
-    if (mDepth == 0) {
-        result += "]";
-    }
-    return result;
+  std::string result;
+  if (mLength) {
+    result += " ";
+    result += pseudoGenerateExpansion(mWordCount > 3 ? mLength : mLength / 2);
+  }
+  mWordCount = mLength = 0;
+  mDepth--;
+  if (mDepth == 0) {
+    result += "]";
+  }
+  return result;
 }
 
 /**
@@ -267,128 +349,125 @@
  *
  * Note: This leaves placeholder syntax untouched.
  */
-std::string PseudoMethodAccent::text(const StringPiece& source)
-{
-    const char* s = source.data();
-    std::string result;
-    const size_t I = source.size();
-    bool lastspace = true;
-    for (size_t i = 0; i < I; i++) {
-        char c = s[i];
-        if (c == '%') {
-            // Placeholder syntax, no need to pseudolocalize
-            std::string chunk;
-            bool end = false;
-            chunk.append(&c, 1);
-            while (!end && i + 1 < I) {
-                ++i;
-                c = s[i];
-                chunk.append(&c, 1);
-                if (isPossibleNormalPlaceholderEnd(c)) {
-                    end = true;
-                } else if (i + 1 < I && c == 't') {
-                    ++i;
-                    c = s[i];
-                    chunk.append(&c, 1);
-                    end = true;
-                }
-            }
-            // Treat chunk as a placeholder unless it ends with %.
-            result += ((c == '%') ? chunk : placeholder(chunk));
-        } else if (c == '<' || c == '&') {
-            // html syntax, no need to pseudolocalize
-            bool tag_closed = false;
-            while (!tag_closed && i < I) {
-                if (c == '&') {
-                    std::string escapeText;
-                    escapeText.append(&c, 1);
-                    bool end = false;
-                    size_t htmlCodePos = i;
-                    while (!end && htmlCodePos < I) {
-                        ++htmlCodePos;
-                        c = s[htmlCodePos];
-                        escapeText.append(&c, 1);
-                        // Valid html code
-                        if (c == ';') {
-                            end = true;
-                            i = htmlCodePos;
-                        }
-                        // Wrong html code
-                        else if (!((c == '#' ||
-                                 (c >= 'a' && c <= 'z') ||
-                                 (c >= 'A' && c <= 'Z') ||
-                                 (c >= '0' && c <= '9')))) {
-                            end = true;
-                        }
-                    }
-                    result += escapeText;
-                    if (escapeText != "&lt;") {
-                        tag_closed = true;
-                    }
-                    continue;
-                }
-                if (c == '>') {
-                    tag_closed = true;
-                    result.append(&c, 1);
-                    continue;
-                }
-                result.append(&c, 1);
-                i++;
-                c = s[i];
-            }
-        } else {
-            // This is a pure text that should be pseudolocalized
-            const char* p = pseudolocalizeChar(c);
-            if (p != nullptr) {
-                result += p;
-            } else {
-                bool space = isspace(c);
-                if (lastspace && !space) {
-                    mWordCount++;
-                }
-                lastspace = space;
-                result.append(&c, 1);
-            }
-            // Count only pseudolocalizable chars and delimiters
-            mLength++;
+std::string PseudoMethodAccent::text(const StringPiece& source) {
+  const char* s = source.data();
+  std::string result;
+  const size_t I = source.size();
+  bool lastspace = true;
+  for (size_t i = 0; i < I; i++) {
+    char c = s[i];
+    if (c == '%') {
+      // Placeholder syntax, no need to pseudolocalize
+      std::string chunk;
+      bool end = false;
+      chunk.append(&c, 1);
+      while (!end && i + 1 < I) {
+        ++i;
+        c = s[i];
+        chunk.append(&c, 1);
+        if (isPossibleNormalPlaceholderEnd(c)) {
+          end = true;
+        } else if (i + 1 < I && c == 't') {
+          ++i;
+          c = s[i];
+          chunk.append(&c, 1);
+          end = true;
         }
-    }
-    return result;
-}
-
-std::string PseudoMethodAccent::placeholder(const StringPiece& source) {
-    // Surround a placeholder with brackets
-    return k_placeholder_open + source.toString() + k_placeholder_close;
-}
-
-std::string PseudoMethodBidi::text(const StringPiece& source) {
-    const char* s = source.data();
-    std::string result;
-    bool lastspace = true;
-    bool space = true;
-    for (size_t i = 0; i < source.size(); i++) {
-        char c = s[i];
-        space = isspace(c);
+      }
+      // Treat chunk as a placeholder unless it ends with %.
+      result += ((c == '%') ? chunk : placeholder(chunk));
+    } else if (c == '<' || c == '&') {
+      // html syntax, no need to pseudolocalize
+      bool tag_closed = false;
+      while (!tag_closed && i < I) {
+        if (c == '&') {
+          std::string escapeText;
+          escapeText.append(&c, 1);
+          bool end = false;
+          size_t htmlCodePos = i;
+          while (!end && htmlCodePos < I) {
+            ++htmlCodePos;
+            c = s[htmlCodePos];
+            escapeText.append(&c, 1);
+            // Valid html code
+            if (c == ';') {
+              end = true;
+              i = htmlCodePos;
+            }
+            // Wrong html code
+            else if (!((c == '#' || (c >= 'a' && c <= 'z') ||
+                        (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')))) {
+              end = true;
+            }
+          }
+          result += escapeText;
+          if (escapeText != "&lt;") {
+            tag_closed = true;
+          }
+          continue;
+        }
+        if (c == '>') {
+          tag_closed = true;
+          result.append(&c, 1);
+          continue;
+        }
+        result.append(&c, 1);
+        i++;
+        c = s[i];
+      }
+    } else {
+      // This is a pure text that should be pseudolocalized
+      const char* p = pseudolocalizeChar(c);
+      if (p != nullptr) {
+        result += p;
+      } else {
+        bool space = isspace(c);
         if (lastspace && !space) {
-            // Word start
-            result += k_rlm + k_rlo;
-        } else if (!lastspace && space) {
-            // Word end
-            result += k_pdf + k_rlm;
+          mWordCount++;
         }
         lastspace = space;
         result.append(&c, 1);
+      }
+      // Count only pseudolocalizable chars and delimiters
+      mLength++;
     }
-    if (!lastspace) {
-        // End of last word
-        result += k_pdf + k_rlm;
+  }
+  return result;
+}
+
+std::string PseudoMethodAccent::placeholder(const StringPiece& source) {
+  // Surround a placeholder with brackets
+  return k_placeholder_open + source.toString() + k_placeholder_close;
+}
+
+std::string PseudoMethodBidi::text(const StringPiece& source) {
+  const char* s = source.data();
+  std::string result;
+  bool lastspace = true;
+  bool space = true;
+  for (size_t i = 0; i < source.size(); i++) {
+    char c = s[i];
+    space = isspace(c);
+    if (lastspace && !space) {
+      // Word start
+      result += k_rlm + k_rlo;
+    } else if (!lastspace && space) {
+      // Word end
+      result += k_pdf + k_rlm;
     }
-    return result;
+    lastspace = space;
+    result.append(&c, 1);
+  }
+  if (!lastspace) {
+    // End of last word
+    result += k_pdf + k_rlm;
+  }
+  return result;
 }
 
 std::string PseudoMethodBidi::placeholder(const StringPiece& source) {
-    // Surround a placeholder with directionality change sequence
-    return k_rlm + k_rlo + source.toString() + k_pdf + k_rlm;
+  // Surround a placeholder with directionality change sequence
+  return k_rlm + k_rlo + source.toString() + k_pdf + k_rlm;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/Pseudolocalizer.h b/tools/aapt2/compile/Pseudolocalizer.h
index 91d17d1..a526877 100644
--- a/tools/aapt2/compile/Pseudolocalizer.h
+++ b/tools/aapt2/compile/Pseudolocalizer.h
@@ -27,32 +27,33 @@
 namespace aapt {
 
 class PseudoMethodImpl {
-public:
-    virtual ~PseudoMethodImpl() {}
-    virtual std::string start() { return {}; }
-    virtual std::string end() { return {}; }
-    virtual std::string text(const StringPiece& text) = 0;
-    virtual std::string placeholder(const StringPiece& text) = 0;
+ public:
+  virtual ~PseudoMethodImpl() {}
+  virtual std::string start() { return {}; }
+  virtual std::string end() { return {}; }
+  virtual std::string text(const StringPiece& text) = 0;
+  virtual std::string placeholder(const StringPiece& text) = 0;
 };
 
 class Pseudolocalizer {
-public:
-    enum class Method {
-        kNone,
-        kAccent,
-        kBidi,
-    };
+ public:
+  enum class Method {
+    kNone,
+    kAccent,
+    kBidi,
+  };
 
-    explicit Pseudolocalizer(Method method);
-    void setMethod(Method method);
-    std::string start() { return mImpl->start(); }
-    std::string end() { return mImpl->end(); }
-    std::string text(const StringPiece& text);
-private:
-    std::unique_ptr<PseudoMethodImpl> mImpl;
-    size_t mLastDepth;
+  explicit Pseudolocalizer(Method method);
+  void setMethod(Method method);
+  std::string start() { return mImpl->start(); }
+  std::string end() { return mImpl->end(); }
+  std::string text(const StringPiece& text);
+
+ private:
+  std::unique_ptr<PseudoMethodImpl> mImpl;
+  size_t mLastDepth;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_COMPILE_PSEUDOLOCALIZE_H */
diff --git a/tools/aapt2/compile/Pseudolocalizer_test.cpp b/tools/aapt2/compile/Pseudolocalizer_test.cpp
index c33e152..a152ed6 100644
--- a/tools/aapt2/compile/Pseudolocalizer_test.cpp
+++ b/tools/aapt2/compile/Pseudolocalizer_test.cpp
@@ -25,199 +25,207 @@
 // In this context, 'Axis' represents a particular field in the configuration,
 // such as language or density.
 
-static ::testing::AssertionResult simpleHelper(const char* input, const char* expected,
+static ::testing::AssertionResult simpleHelper(const char* input,
+                                               const char* expected,
                                                Pseudolocalizer::Method method) {
-    Pseudolocalizer pseudo(method);
-    std::string result = pseudo.start() + pseudo.text(input) + pseudo.end();
-    if (result != expected) {
-        return ::testing::AssertionFailure() << expected << " != " << result;
-    }
-    return ::testing::AssertionSuccess();
+  Pseudolocalizer pseudo(method);
+  std::string result = pseudo.start() + pseudo.text(input) + pseudo.end();
+  if (result != expected) {
+    return ::testing::AssertionFailure() << expected << " != " << result;
+  }
+  return ::testing::AssertionSuccess();
 }
 
-static ::testing::AssertionResult compoundHelper(const char* in1, const char* in2, const char *in3,
-                                                 const char* expected,
-                                                 Pseudolocalizer::Method method) {
-    Pseudolocalizer pseudo(method);
-    std::string result = pseudo.start() + pseudo.text(in1) + pseudo.text(in2) + pseudo.text(in3) +
-            pseudo.end();
-    if (result != expected) {
-        return ::testing::AssertionFailure() << expected << " != " << result;
-    }
-    return ::testing::AssertionSuccess();
+static ::testing::AssertionResult compoundHelper(
+    const char* in1, const char* in2, const char* in3, const char* expected,
+    Pseudolocalizer::Method method) {
+  Pseudolocalizer pseudo(method);
+  std::string result = pseudo.start() + pseudo.text(in1) + pseudo.text(in2) +
+                       pseudo.text(in3) + pseudo.end();
+  if (result != expected) {
+    return ::testing::AssertionFailure() << expected << " != " << result;
+  }
+  return ::testing::AssertionSuccess();
 }
 
 TEST(PseudolocalizerTest, NoPseudolocalization) {
-    EXPECT_TRUE(simpleHelper("", "", Pseudolocalizer::Method::kNone));
-    EXPECT_TRUE(simpleHelper("Hello, world", "Hello, world", Pseudolocalizer::Method::kNone));
+  EXPECT_TRUE(simpleHelper("", "", Pseudolocalizer::Method::kNone));
+  EXPECT_TRUE(simpleHelper("Hello, world", "Hello, world",
+                           Pseudolocalizer::Method::kNone));
 
-    EXPECT_TRUE(compoundHelper("Hello,", " world", "",
-                               "Hello, world", Pseudolocalizer::Method::kNone));
+  EXPECT_TRUE(compoundHelper("Hello,", " world", "", "Hello, world",
+                             Pseudolocalizer::Method::kNone));
 }
 
 TEST(PseudolocalizerTest, PlaintextAccent) {
-    EXPECT_TRUE(simpleHelper("", "[]", Pseudolocalizer::Method::kAccent));
-    EXPECT_TRUE(simpleHelper("Hello, world",
-                             "[Ĥéļļö, ŵöŕļð one two]", Pseudolocalizer::Method::kAccent));
+  EXPECT_TRUE(simpleHelper("", "[]", Pseudolocalizer::Method::kAccent));
+  EXPECT_TRUE(simpleHelper("Hello, world", "[Ĥéļļö, ŵöŕļð one two]",
+                           Pseudolocalizer::Method::kAccent));
 
-    EXPECT_TRUE(simpleHelper("Hello, %1d",
-                             "[Ĥéļļö, »%1d« one two]", Pseudolocalizer::Method::kAccent));
+  EXPECT_TRUE(simpleHelper("Hello, %1d", "[Ĥéļļö, »%1d« one two]",
+                           Pseudolocalizer::Method::kAccent));
 
-    EXPECT_TRUE(simpleHelper("Battery %1d%%",
-                             "[βåţţéŕý »%1d«%% one two]", Pseudolocalizer::Method::kAccent));
-    EXPECT_TRUE(simpleHelper("^1 %", "[^1 % one]", Pseudolocalizer::Method::kAccent));
-    EXPECT_TRUE(compoundHelper("", "", "", "[]", Pseudolocalizer::Method::kAccent));
-    EXPECT_TRUE(compoundHelper("Hello,", " world", "",
-                               "[Ĥéļļö, ŵöŕļð one two]", Pseudolocalizer::Method::kAccent));
+  EXPECT_TRUE(simpleHelper("Battery %1d%%", "[βåţţéŕý »%1d«%% one two]",
+                           Pseudolocalizer::Method::kAccent));
+  EXPECT_TRUE(
+      simpleHelper("^1 %", "[^1 % one]", Pseudolocalizer::Method::kAccent));
+  EXPECT_TRUE(
+      compoundHelper("", "", "", "[]", Pseudolocalizer::Method::kAccent));
+  EXPECT_TRUE(compoundHelper("Hello,", " world", "", "[Ĥéļļö, ŵöŕļð one two]",
+                             Pseudolocalizer::Method::kAccent));
 }
 
 TEST(PseudolocalizerTest, PlaintextBidi) {
-    EXPECT_TRUE(simpleHelper("", "", Pseudolocalizer::Method::kBidi));
-    EXPECT_TRUE(simpleHelper("word",
-                             "\xe2\x80\x8f\xE2\x80\xaeword\xE2\x80\xac\xe2\x80\x8f",
-                             Pseudolocalizer::Method::kBidi));
-    EXPECT_TRUE(simpleHelper("  word  ",
-                             "  \xe2\x80\x8f\xE2\x80\xaeword\xE2\x80\xac\xe2\x80\x8f  ",
-                             Pseudolocalizer::Method::kBidi));
-    EXPECT_TRUE(simpleHelper("  word  ",
-                             "  \xe2\x80\x8f\xE2\x80\xaeword\xE2\x80\xac\xe2\x80\x8f  ",
-                             Pseudolocalizer::Method::kBidi));
-    EXPECT_TRUE(simpleHelper("hello\n  world\n",
-                             "\xe2\x80\x8f\xE2\x80\xaehello\xE2\x80\xac\xe2\x80\x8f\n" \
-                                     "  \xe2\x80\x8f\xE2\x80\xaeworld\xE2\x80\xac\xe2\x80\x8f\n",
-                             Pseudolocalizer::Method::kBidi));
-    EXPECT_TRUE(compoundHelper("hello", "\n ", " world\n",
-                               "\xe2\x80\x8f\xE2\x80\xaehello\xE2\x80\xac\xe2\x80\x8f\n" \
-                                       "  \xe2\x80\x8f\xE2\x80\xaeworld\xE2\x80\xac\xe2\x80\x8f\n",
-                               Pseudolocalizer::Method::kBidi));
+  EXPECT_TRUE(simpleHelper("", "", Pseudolocalizer::Method::kBidi));
+  EXPECT_TRUE(simpleHelper(
+      "word", "\xe2\x80\x8f\xE2\x80\xaeword\xE2\x80\xac\xe2\x80\x8f",
+      Pseudolocalizer::Method::kBidi));
+  EXPECT_TRUE(simpleHelper(
+      "  word  ", "  \xe2\x80\x8f\xE2\x80\xaeword\xE2\x80\xac\xe2\x80\x8f  ",
+      Pseudolocalizer::Method::kBidi));
+  EXPECT_TRUE(simpleHelper(
+      "  word  ", "  \xe2\x80\x8f\xE2\x80\xaeword\xE2\x80\xac\xe2\x80\x8f  ",
+      Pseudolocalizer::Method::kBidi));
+  EXPECT_TRUE(
+      simpleHelper("hello\n  world\n",
+                   "\xe2\x80\x8f\xE2\x80\xaehello\xE2\x80\xac\xe2\x80\x8f\n"
+                   "  \xe2\x80\x8f\xE2\x80\xaeworld\xE2\x80\xac\xe2\x80\x8f\n",
+                   Pseudolocalizer::Method::kBidi));
+  EXPECT_TRUE(compoundHelper(
+      "hello", "\n ", " world\n",
+      "\xe2\x80\x8f\xE2\x80\xaehello\xE2\x80\xac\xe2\x80\x8f\n"
+      "  \xe2\x80\x8f\xE2\x80\xaeworld\xE2\x80\xac\xe2\x80\x8f\n",
+      Pseudolocalizer::Method::kBidi));
 }
 
 TEST(PseudolocalizerTest, SimpleICU) {
-    // Single-fragment messages
-    EXPECT_TRUE(simpleHelper("{placeholder}", "[»{placeholder}«]",
+  // Single-fragment messages
+  EXPECT_TRUE(simpleHelper("{placeholder}", "[»{placeholder}«]",
+                           Pseudolocalizer::Method::kAccent));
+  EXPECT_TRUE(simpleHelper("{USER} is offline", "[»{USER}« îš öƒƒļîñé one two]",
+                           Pseudolocalizer::Method::kAccent));
+  EXPECT_TRUE(simpleHelper("Copy from {path1} to {path2}",
+                           "[Çöþý ƒŕöḿ »{path1}« ţö »{path2}« one two three]",
+                           Pseudolocalizer::Method::kAccent));
+  EXPECT_TRUE(simpleHelper("Today is {1,date} {1,time}",
+                           "[Ţöðåý îš »{1,date}« »{1,time}« one two]",
+                           Pseudolocalizer::Method::kAccent));
+
+  // Multi-fragment messages
+  EXPECT_TRUE(compoundHelper("{USER}", " ", "is offline",
+                             "[»{USER}« îš öƒƒļîñé one two]",
                              Pseudolocalizer::Method::kAccent));
-    EXPECT_TRUE(simpleHelper("{USER} is offline",
-                             "[»{USER}« îš öƒƒļîñé one two]", Pseudolocalizer::Method::kAccent));
-    EXPECT_TRUE(simpleHelper("Copy from {path1} to {path2}",
+  EXPECT_TRUE(compoundHelper("Copy from ", "{path1}", " to {path2}",
                              "[Çöþý ƒŕöḿ »{path1}« ţö »{path2}« one two three]",
                              Pseudolocalizer::Method::kAccent));
-    EXPECT_TRUE(simpleHelper("Today is {1,date} {1,time}",
-                             "[Ţöðåý îš »{1,date}« »{1,time}« one two]",
-                             Pseudolocalizer::Method::kAccent));
-
-    // Multi-fragment messages
-    EXPECT_TRUE(compoundHelper("{USER}", " ", "is offline",
-                               "[»{USER}« îš öƒƒļîñé one two]",
-                               Pseudolocalizer::Method::kAccent));
-    EXPECT_TRUE(compoundHelper("Copy from ", "{path1}", " to {path2}",
-                               "[Çöþý ƒŕöḿ »{path1}« ţö »{path2}« one two three]",
-                               Pseudolocalizer::Method::kAccent));
 }
 
 TEST(PseudolocalizerTest, ICUBidi) {
-    // Single-fragment messages
-    EXPECT_TRUE(simpleHelper("{placeholder}",
-                             "\xe2\x80\x8f\xE2\x80\xae{placeholder}\xE2\x80\xac\xe2\x80\x8f",
-                             Pseudolocalizer::Method::kBidi));
-    EXPECT_TRUE(simpleHelper(
-            "{COUNT, plural, one {one} other {other}}",
-            "{COUNT, plural, " \
-                    "one {\xe2\x80\x8f\xE2\x80\xaeone\xE2\x80\xac\xe2\x80\x8f} " \
-                    "other {\xe2\x80\x8f\xE2\x80\xaeother\xE2\x80\xac\xe2\x80\x8f}}",
-            Pseudolocalizer::Method::kBidi));
+  // Single-fragment messages
+  EXPECT_TRUE(simpleHelper(
+      "{placeholder}",
+      "\xe2\x80\x8f\xE2\x80\xae{placeholder}\xE2\x80\xac\xe2\x80\x8f",
+      Pseudolocalizer::Method::kBidi));
+  EXPECT_TRUE(simpleHelper(
+      "{COUNT, plural, one {one} other {other}}",
+      "{COUNT, plural, "
+      "one {\xe2\x80\x8f\xE2\x80\xaeone\xE2\x80\xac\xe2\x80\x8f} "
+      "other {\xe2\x80\x8f\xE2\x80\xaeother\xE2\x80\xac\xe2\x80\x8f}}",
+      Pseudolocalizer::Method::kBidi));
 }
 
 TEST(PseudolocalizerTest, Escaping) {
-    // Single-fragment messages
-    EXPECT_TRUE(simpleHelper("'{USER'} is offline",
-                             "['{ÛŠÉŔ'} îš öƒƒļîñé one two three]",
-                             Pseudolocalizer::Method::kAccent));
+  // Single-fragment messages
+  EXPECT_TRUE(simpleHelper("'{USER'} is offline",
+                           "['{ÛŠÉŔ'} îš öƒƒļîñé one two three]",
+                           Pseudolocalizer::Method::kAccent));
 
-    // Multi-fragment messages
-    EXPECT_TRUE(compoundHelper("'{USER}", " ", "''is offline",
-                               "['{ÛŠÉŔ} ''îš öƒƒļîñé one two three]",
-                               Pseudolocalizer::Method::kAccent));
+  // Multi-fragment messages
+  EXPECT_TRUE(compoundHelper("'{USER}", " ", "''is offline",
+                             "['{ÛŠÉŔ} ''îš öƒƒļîñé one two three]",
+                             Pseudolocalizer::Method::kAccent));
 }
 
 TEST(PseudolocalizerTest, PluralsAndSelects) {
-    EXPECT_TRUE(simpleHelper(
-            "{COUNT, plural, one {Delete a file} other {Delete {COUNT} files}}",
-            "[{COUNT, plural, one {Ðéļéţé å ƒîļé one two} " \
+  EXPECT_TRUE(simpleHelper(
+      "{COUNT, plural, one {Delete a file} other {Delete {COUNT} files}}",
+      "[{COUNT, plural, one {Ðéļéţé å ƒîļé one two} "
+      "other {Ðéļéţé »{COUNT}« ƒîļéš one two}}]",
+      Pseudolocalizer::Method::kAccent));
+
+  EXPECT_TRUE(
+      simpleHelper("Distance is {COUNT, plural, one {# mile} other {# miles}}",
+                   "[Ðîšţåñçé îš {COUNT, plural, one {# ḿîļé one two} "
+                   "other {# ḿîļéš one two}}]",
+                   Pseudolocalizer::Method::kAccent));
+
+  EXPECT_TRUE(simpleHelper(
+      "{1, select, female {{1} added you} "
+      "male {{1} added you} other {{1} added you}}",
+      "[{1, select, female {»{1}« åððéð ýöû one two} "
+      "male {»{1}« åððéð ýöû one two} other {»{1}« åððéð ýöû one two}}]",
+      Pseudolocalizer::Method::kAccent));
+
+  EXPECT_TRUE(
+      compoundHelper("{COUNT, plural, one {Delete a file} "
+                     "other {Delete ",
+                     "{COUNT}", " files}}",
+                     "[{COUNT, plural, one {Ðéļéţé å ƒîļé one two} "
                      "other {Ðéļéţé »{COUNT}« ƒîļéš one two}}]",
-            Pseudolocalizer::Method::kAccent));
-
-    EXPECT_TRUE(simpleHelper(
-            "Distance is {COUNT, plural, one {# mile} other {# miles}}",
-            "[Ðîšţåñçé îš {COUNT, plural, one {# ḿîļé one two} " \
-                                 "other {# ḿîļéš one two}}]",
-            Pseudolocalizer::Method::kAccent));
-
-    EXPECT_TRUE(simpleHelper(
-            "{1, select, female {{1} added you} " \
-                    "male {{1} added you} other {{1} added you}}",
-            "[{1, select, female {»{1}« åððéð ýöû one two} " \
-                    "male {»{1}« åððéð ýöû one two} other {»{1}« åððéð ýöû one two}}]",
-            Pseudolocalizer::Method::kAccent));
-
-    EXPECT_TRUE(compoundHelper(
-            "{COUNT, plural, one {Delete a file} " \
-                    "other {Delete ", "{COUNT}", " files}}",
-            "[{COUNT, plural, one {Ðéļéţé å ƒîļé one two} " \
-                    "other {Ðéļéţé »{COUNT}« ƒîļéš one two}}]",
-            Pseudolocalizer::Method::kAccent));
+                     Pseudolocalizer::Method::kAccent));
 }
 
 TEST(PseudolocalizerTest, NestedICU) {
-    EXPECT_TRUE(simpleHelper(
-            "{person, select, " \
-                "female {" \
-                    "{num_circles, plural," \
-                        "=0{{person} didn't add you to any of her circles.}" \
-                        "=1{{person} added you to one of her circles.}" \
-                        "other{{person} added you to her # circles.}}}" \
-                "male {" \
-                    "{num_circles, plural," \
-                        "=0{{person} didn't add you to any of his circles.}" \
-                        "=1{{person} added you to one of his circles.}" \
-                        "other{{person} added you to his # circles.}}}" \
-                "other {" \
-                    "{num_circles, plural," \
-                        "=0{{person} didn't add you to any of their circles.}" \
-                        "=1{{person} added you to one of their circles.}" \
-                        "other{{person} added you to their # circles.}}}}",
-            "[{person, select, " \
-                "female {" \
-                    "{num_circles, plural," \
-                        "=0{»{person}« ðîðñ'ţ åðð ýöû ţö åñý öƒ ĥéŕ çîŕçļéš." \
-                            " one two three four five}" \
-                        "=1{»{person}« åððéð ýöû ţö öñé öƒ ĥéŕ çîŕçļéš." \
-                            " one two three four}" \
-                        "other{»{person}« åððéð ýöû ţö ĥéŕ # çîŕçļéš." \
-                            " one two three four}}}" \
-                "male {" \
-                    "{num_circles, plural," \
-                        "=0{»{person}« ðîðñ'ţ åðð ýöû ţö åñý öƒ ĥîš çîŕçļéš." \
-                            " one two three four five}" \
-                        "=1{»{person}« åððéð ýöû ţö öñé öƒ ĥîš çîŕçļéš." \
-                            " one two three four}" \
-                        "other{»{person}« åððéð ýöû ţö ĥîš # çîŕçļéš." \
-                            " one two three four}}}" \
-                "other {{num_circles, plural," \
-                    "=0{»{person}« ðîðñ'ţ åðð ýöû ţö åñý öƒ ţĥéîŕ çîŕçļéš." \
-                        " one two three four five}" \
-                    "=1{»{person}« åððéð ýöû ţö öñé öƒ ţĥéîŕ çîŕçļéš." \
-                        " one two three four}" \
-                    "other{»{person}« åððéð ýöû ţö ţĥéîŕ # çîŕçļéš." \
-                        " one two three four}}}}]",
-            Pseudolocalizer::Method::kAccent));
+  EXPECT_TRUE(
+      simpleHelper("{person, select, "
+                   "female {"
+                   "{num_circles, plural,"
+                   "=0{{person} didn't add you to any of her circles.}"
+                   "=1{{person} added you to one of her circles.}"
+                   "other{{person} added you to her # circles.}}}"
+                   "male {"
+                   "{num_circles, plural,"
+                   "=0{{person} didn't add you to any of his circles.}"
+                   "=1{{person} added you to one of his circles.}"
+                   "other{{person} added you to his # circles.}}}"
+                   "other {"
+                   "{num_circles, plural,"
+                   "=0{{person} didn't add you to any of their circles.}"
+                   "=1{{person} added you to one of their circles.}"
+                   "other{{person} added you to their # circles.}}}}",
+                   "[{person, select, "
+                   "female {"
+                   "{num_circles, plural,"
+                   "=0{»{person}« ðîðñ'ţ åðð ýöû ţö åñý öƒ ĥéŕ çîŕçļéš."
+                   " one two three four five}"
+                   "=1{»{person}« åððéð ýöû ţö öñé öƒ ĥéŕ çîŕçļéš."
+                   " one two three four}"
+                   "other{»{person}« åððéð ýöû ţö ĥéŕ # çîŕçļéš."
+                   " one two three four}}}"
+                   "male {"
+                   "{num_circles, plural,"
+                   "=0{»{person}« ðîðñ'ţ åðð ýöû ţö åñý öƒ ĥîš çîŕçļéš."
+                   " one two three four five}"
+                   "=1{»{person}« åððéð ýöû ţö öñé öƒ ĥîš çîŕçļéš."
+                   " one two three four}"
+                   "other{»{person}« åððéð ýöû ţö ĥîš # çîŕçļéš."
+                   " one two three four}}}"
+                   "other {{num_circles, plural,"
+                   "=0{»{person}« ðîðñ'ţ åðð ýöû ţö åñý öƒ ţĥéîŕ çîŕçļéš."
+                   " one two three four five}"
+                   "=1{»{person}« åððéð ýöû ţö öñé öƒ ţĥéîŕ çîŕçļéš."
+                   " one two three four}"
+                   "other{»{person}« åððéð ýöû ţö ţĥéîŕ # çîŕçļéš."
+                   " one two three four}}}}]",
+                   Pseudolocalizer::Method::kAccent));
 }
 
 TEST(PseudolocalizerTest, RedefineMethod) {
-    Pseudolocalizer pseudo(Pseudolocalizer::Method::kAccent);
-    std::string result = pseudo.text("Hello, ");
-    pseudo.setMethod(Pseudolocalizer::Method::kNone);
-    result += pseudo.text("world!");
-    ASSERT_EQ(StringPiece("Ĥéļļö, world!"), result);
+  Pseudolocalizer pseudo(Pseudolocalizer::Method::kAccent);
+  std::string result = pseudo.text("Hello, ");
+  pseudo.setMethod(Pseudolocalizer::Method::kNone);
+  result += pseudo.text("world!");
+  ASSERT_EQ(StringPiece("Ĥéļļö, world!"), result);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/XmlIdCollector.cpp b/tools/aapt2/compile/XmlIdCollector.cpp
index 3901419..aa8b1df 100644
--- a/tools/aapt2/compile/XmlIdCollector.cpp
+++ b/tools/aapt2/compile/XmlIdCollector.cpp
@@ -14,9 +14,9 @@
  * limitations under the License.
  */
 
+#include "compile/XmlIdCollector.h"
 #include "ResourceUtils.h"
 #include "ResourceValues.h"
-#include "compile/XmlIdCollector.h"
 #include "xml/XmlDom.h"
 
 #include <algorithm>
@@ -27,44 +27,44 @@
 namespace {
 
 static bool cmpName(const SourcedResourceName& a, const ResourceNameRef& b) {
-    return a.name < b;
+  return a.name < b;
 }
 
 struct IdCollector : public xml::Visitor {
-    using xml::Visitor::visit;
+  using xml::Visitor::visit;
 
-    std::vector<SourcedResourceName>* mOutSymbols;
+  std::vector<SourcedResourceName>* mOutSymbols;
 
-    explicit IdCollector(std::vector<SourcedResourceName>* outSymbols) : mOutSymbols(outSymbols) {
-    }
+  explicit IdCollector(std::vector<SourcedResourceName>* outSymbols)
+      : mOutSymbols(outSymbols) {}
 
-    void visit(xml::Element* element) override {
-        for (xml::Attribute& attr : element->attributes) {
-            ResourceNameRef name;
-            bool create = false;
-            if (ResourceUtils::parseReference(attr.value, &name, &create, nullptr)) {
-                if (create && name.type == ResourceType::kId) {
-                    auto iter = std::lower_bound(mOutSymbols->begin(), mOutSymbols->end(),
-                                                 name, cmpName);
-                    if (iter == mOutSymbols->end() || iter->name != name) {
-                        mOutSymbols->insert(iter, SourcedResourceName{ name.toResourceName(),
-                                                                       element->lineNumber });
-                    }
-                }
-            }
+  void visit(xml::Element* element) override {
+    for (xml::Attribute& attr : element->attributes) {
+      ResourceNameRef name;
+      bool create = false;
+      if (ResourceUtils::parseReference(attr.value, &name, &create, nullptr)) {
+        if (create && name.type == ResourceType::kId) {
+          auto iter = std::lower_bound(mOutSymbols->begin(), mOutSymbols->end(),
+                                       name, cmpName);
+          if (iter == mOutSymbols->end() || iter->name != name) {
+            mOutSymbols->insert(iter, SourcedResourceName{name.toResourceName(),
+                                                          element->lineNumber});
+          }
         }
-
-        xml::Visitor::visit(element);
+      }
     }
+
+    xml::Visitor::visit(element);
+  }
 };
 
-} // namespace
+}  // namespace
 
 bool XmlIdCollector::consume(IAaptContext* context, xml::XmlResource* xmlRes) {
-    xmlRes->file.exportedSymbols.clear();
-    IdCollector collector(&xmlRes->file.exportedSymbols);
-    xmlRes->root->accept(&collector);
-    return true;
+  xmlRes->file.exportedSymbols.clear();
+  IdCollector collector(&xmlRes->file.exportedSymbols);
+  xmlRes->root->accept(&collector);
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/compile/XmlIdCollector.h b/tools/aapt2/compile/XmlIdCollector.h
index 1b14944..8423f48 100644
--- a/tools/aapt2/compile/XmlIdCollector.h
+++ b/tools/aapt2/compile/XmlIdCollector.h
@@ -23,9 +23,9 @@
 namespace aapt {
 
 struct XmlIdCollector : public IXmlResourceConsumer {
-    bool consume(IAaptContext* context, xml::XmlResource* xmlRes) override;
+  bool consume(IAaptContext* context, xml::XmlResource* xmlRes) override;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_XMLIDCOLLECTOR_H */
diff --git a/tools/aapt2/compile/XmlIdCollector_test.cpp b/tools/aapt2/compile/XmlIdCollector_test.cpp
index 2c9eab8..08ca7b1 100644
--- a/tools/aapt2/compile/XmlIdCollector_test.cpp
+++ b/tools/aapt2/compile/XmlIdCollector_test.cpp
@@ -18,15 +18,15 @@
 #include "test/Builders.h"
 #include "test/Context.h"
 
-#include <algorithm>
 #include <gtest/gtest.h>
+#include <algorithm>
 
 namespace aapt {
 
 TEST(XmlIdCollectorTest, CollectsIds) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
 
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
+  std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
             <View xmlns:android="http://schemas.android.com/apk/res/android"
                   android:id="@+id/foo"
                   text="@+id/bar">
@@ -34,28 +34,35 @@
                        class="@+id/bar"/>
             </View>)EOF");
 
-    XmlIdCollector collector;
-    ASSERT_TRUE(collector.consume(context.get(), doc.get()));
+  XmlIdCollector collector;
+  ASSERT_TRUE(collector.consume(context.get(), doc.get()));
 
-    EXPECT_EQ(1, std::count(doc->file.exportedSymbols.begin(), doc->file.exportedSymbols.end(),
-                             SourcedResourceName{ test::parseNameOrDie("id/foo"), 3u }));
+  EXPECT_EQ(
+      1, std::count(doc->file.exportedSymbols.begin(),
+                    doc->file.exportedSymbols.end(),
+                    SourcedResourceName{test::parseNameOrDie("id/foo"), 3u}));
 
-    EXPECT_EQ(1, std::count(doc->file.exportedSymbols.begin(), doc->file.exportedSymbols.end(),
-                             SourcedResourceName{ test::parseNameOrDie("id/bar"), 3u }));
+  EXPECT_EQ(
+      1, std::count(doc->file.exportedSymbols.begin(),
+                    doc->file.exportedSymbols.end(),
+                    SourcedResourceName{test::parseNameOrDie("id/bar"), 3u}));
 
-    EXPECT_EQ(1, std::count(doc->file.exportedSymbols.begin(), doc->file.exportedSymbols.end(),
-                             SourcedResourceName{ test::parseNameOrDie("id/car"), 6u }));
+  EXPECT_EQ(
+      1, std::count(doc->file.exportedSymbols.begin(),
+                    doc->file.exportedSymbols.end(),
+                    SourcedResourceName{test::parseNameOrDie("id/car"), 6u}));
 }
 
 TEST(XmlIdCollectorTest, DontCollectNonIds) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
 
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom("<View foo=\"@+string/foo\"/>");
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDom("<View foo=\"@+string/foo\"/>");
 
-    XmlIdCollector collector;
-    ASSERT_TRUE(collector.consume(context.get(), doc.get()));
+  XmlIdCollector collector;
+  ASSERT_TRUE(collector.consume(context.get(), doc.get()));
 
-    EXPECT_TRUE(doc->file.exportedSymbols.empty());
+  EXPECT_TRUE(doc->file.exportedSymbols.empty());
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/diff/Diff.cpp b/tools/aapt2/diff/Diff.cpp
index 9b1f057..01f4539 100644
--- a/tools/aapt2/diff/Diff.cpp
+++ b/tools/aapt2/diff/Diff.cpp
@@ -27,412 +27,401 @@
 namespace aapt {
 
 class DiffContext : public IAaptContext {
-public:
-    const std::string& getCompilationPackage() override {
-        return mEmpty;
-    }
+ public:
+  const std::string& getCompilationPackage() override { return mEmpty; }
 
-    uint8_t getPackageId() override {
-        return 0x0;
-    }
+  uint8_t getPackageId() override { return 0x0; }
 
-    IDiagnostics* getDiagnostics() override {
-        return &mDiagnostics;
-    }
+  IDiagnostics* getDiagnostics() override { return &mDiagnostics; }
 
-    NameMangler* getNameMangler() override {
-        return &mNameMangler;
-    }
+  NameMangler* getNameMangler() override { return &mNameMangler; }
 
-    SymbolTable* getExternalSymbols() override {
-        return &mSymbolTable;
-    }
+  SymbolTable* getExternalSymbols() override { return &mSymbolTable; }
 
-    bool verbose() override {
-        return false;
-    }
+  bool verbose() override { return false; }
 
-    int getMinSdkVersion() override {
-        return 0;
-    }
+  int getMinSdkVersion() override { return 0; }
 
-private:
-    std::string mEmpty;
-    StdErrDiagnostics mDiagnostics;
-    NameMangler mNameMangler = NameMangler(NameManglerPolicy{});
-    SymbolTable mSymbolTable;
+ private:
+  std::string mEmpty;
+  StdErrDiagnostics mDiagnostics;
+  NameMangler mNameMangler = NameMangler(NameManglerPolicy{});
+  SymbolTable mSymbolTable;
 };
 
 class LoadedApk {
-public:
-    LoadedApk(const Source& source, std::unique_ptr<io::IFileCollection> apk,
-              std::unique_ptr<ResourceTable> table) :
-            mSource(source), mApk(std::move(apk)), mTable(std::move(table)) {
-    }
+ public:
+  LoadedApk(const Source& source, std::unique_ptr<io::IFileCollection> apk,
+            std::unique_ptr<ResourceTable> table)
+      : mSource(source), mApk(std::move(apk)), mTable(std::move(table)) {}
 
-    io::IFileCollection* getFileCollection() {
-        return mApk.get();
-    }
+  io::IFileCollection* getFileCollection() { return mApk.get(); }
 
-    ResourceTable* getResourceTable() {
-        return mTable.get();
-    }
+  ResourceTable* getResourceTable() { return mTable.get(); }
 
-    const Source& getSource() {
-        return mSource;
-    }
+  const Source& getSource() { return mSource; }
 
-private:
-    Source mSource;
-    std::unique_ptr<io::IFileCollection> mApk;
-    std::unique_ptr<ResourceTable> mTable;
+ private:
+  Source mSource;
+  std::unique_ptr<io::IFileCollection> mApk;
+  std::unique_ptr<ResourceTable> mTable;
 
-    DISALLOW_COPY_AND_ASSIGN(LoadedApk);
+  DISALLOW_COPY_AND_ASSIGN(LoadedApk);
 };
 
-static std::unique_ptr<LoadedApk> loadApkFromPath(IAaptContext* context, const StringPiece& path) {
-    Source source(path);
-    std::string error;
-    std::unique_ptr<io::ZipFileCollection> apk = io::ZipFileCollection::create(path, &error);
-    if (!apk) {
-        context->getDiagnostics()->error(DiagMessage(source) << error);
-        return {};
-    }
+static std::unique_ptr<LoadedApk> loadApkFromPath(IAaptContext* context,
+                                                  const StringPiece& path) {
+  Source source(path);
+  std::string error;
+  std::unique_ptr<io::ZipFileCollection> apk =
+      io::ZipFileCollection::create(path, &error);
+  if (!apk) {
+    context->getDiagnostics()->error(DiagMessage(source) << error);
+    return {};
+  }
 
-    io::IFile* file = apk->findFile("resources.arsc");
-    if (!file) {
-        context->getDiagnostics()->error(DiagMessage(source) << "no resources.arsc found");
-        return {};
-    }
+  io::IFile* file = apk->findFile("resources.arsc");
+  if (!file) {
+    context->getDiagnostics()->error(DiagMessage(source)
+                                     << "no resources.arsc found");
+    return {};
+  }
 
-    std::unique_ptr<io::IData> data = file->openAsData();
-    if (!data) {
-        context->getDiagnostics()->error(DiagMessage(source) << "could not open resources.arsc");
-        return {};
-    }
+  std::unique_ptr<io::IData> data = file->openAsData();
+  if (!data) {
+    context->getDiagnostics()->error(DiagMessage(source)
+                                     << "could not open resources.arsc");
+    return {};
+  }
 
-    std::unique_ptr<ResourceTable> table = util::make_unique<ResourceTable>();
-    BinaryResourceParser parser(context, table.get(), source, data->data(), data->size());
-    if (!parser.parse()) {
-        return {};
-    }
+  std::unique_ptr<ResourceTable> table = util::make_unique<ResourceTable>();
+  BinaryResourceParser parser(context, table.get(), source, data->data(),
+                              data->size());
+  if (!parser.parse()) {
+    return {};
+  }
 
-    return util::make_unique<LoadedApk>(source, std::move(apk), std::move(table));
+  return util::make_unique<LoadedApk>(source, std::move(apk), std::move(table));
 }
 
 static void emitDiffLine(const Source& source, const StringPiece& message) {
-    std::cerr << source << ": " << message << "\n";
+  std::cerr << source << ": " << message << "\n";
 }
 
-static bool isSymbolVisibilityDifferent(const Symbol& symbolA, const Symbol& symbolB) {
-    return symbolA.state != symbolB.state;
+static bool isSymbolVisibilityDifferent(const Symbol& symbolA,
+                                        const Symbol& symbolB) {
+  return symbolA.state != symbolB.state;
 }
 
 template <typename Id>
 static bool isIdDiff(const Symbol& symbolA, const Maybe<Id>& idA,
                      const Symbol& symbolB, const Maybe<Id>& idB) {
-    if (symbolA.state == SymbolState::kPublic || symbolB.state == SymbolState::kPublic) {
-        return idA != idB;
-    }
-    return false;
+  if (symbolA.state == SymbolState::kPublic ||
+      symbolB.state == SymbolState::kPublic) {
+    return idA != idB;
+  }
+  return false;
 }
 
-static bool emitResourceConfigValueDiff(IAaptContext* context,
-                                        LoadedApk* apkA,
-                                        ResourceTablePackage* pkgA,
-                                        ResourceTableType* typeA,
-                                        ResourceEntry* entryA,
-                                        ResourceConfigValue* configValueA,
-                                        LoadedApk* apkB,
-                                        ResourceTablePackage* pkgB,
-                                        ResourceTableType* typeB,
-                                        ResourceEntry* entryB,
-                                        ResourceConfigValue* configValueB) {
-    Value* valueA = configValueA->value.get();
-    Value* valueB = configValueB->value.get();
-    if (!valueA->equals(valueB)) {
-        std::stringstream strStream;
-        strStream << "value " << pkgA->name << ":" << typeA->type << "/" << entryA->name
-                << " config=" << configValueA->config << " does not match:\n";
-        valueA->print(&strStream);
-        strStream << "\n vs \n";
-        valueB->print(&strStream);
-        emitDiffLine(apkB->getSource(), strStream.str());
-        return true;
-    }
-    return false;
+static bool emitResourceConfigValueDiff(
+    IAaptContext* context, LoadedApk* apkA, ResourceTablePackage* pkgA,
+    ResourceTableType* typeA, ResourceEntry* entryA,
+    ResourceConfigValue* configValueA, LoadedApk* apkB,
+    ResourceTablePackage* pkgB, ResourceTableType* typeB, ResourceEntry* entryB,
+    ResourceConfigValue* configValueB) {
+  Value* valueA = configValueA->value.get();
+  Value* valueB = configValueB->value.get();
+  if (!valueA->equals(valueB)) {
+    std::stringstream strStream;
+    strStream << "value " << pkgA->name << ":" << typeA->type << "/"
+              << entryA->name << " config=" << configValueA->config
+              << " does not match:\n";
+    valueA->print(&strStream);
+    strStream << "\n vs \n";
+    valueB->print(&strStream);
+    emitDiffLine(apkB->getSource(), strStream.str());
+    return true;
+  }
+  return false;
 }
 
-static bool emitResourceEntryDiff(IAaptContext* context,
-                                  LoadedApk* apkA,
+static bool emitResourceEntryDiff(IAaptContext* context, LoadedApk* apkA,
                                   ResourceTablePackage* pkgA,
                                   ResourceTableType* typeA,
-                                  ResourceEntry* entryA,
-                                  LoadedApk* apkB,
+                                  ResourceEntry* entryA, LoadedApk* apkB,
                                   ResourceTablePackage* pkgB,
                                   ResourceTableType* typeB,
                                   ResourceEntry* entryB) {
-    bool diff = false;
-    for (std::unique_ptr<ResourceConfigValue>& configValueA : entryA->values) {
-        ResourceConfigValue* configValueB = entryB->findValue(configValueA->config);
-        if (!configValueB) {
-            std::stringstream strStream;
-            strStream << "missing " << pkgA->name << ":" << typeA->type << "/" << entryA->name
-                    << " config=" << configValueA->config;
-            emitDiffLine(apkB->getSource(), strStream.str());
-            diff = true;
-        } else {
-            diff |= emitResourceConfigValueDiff(context, apkA, pkgA, typeA, entryA,
-                                                configValueA.get(), apkB, pkgB, typeB, entryB,
-                                                configValueB);
-        }
+  bool diff = false;
+  for (std::unique_ptr<ResourceConfigValue>& configValueA : entryA->values) {
+    ResourceConfigValue* configValueB = entryB->findValue(configValueA->config);
+    if (!configValueB) {
+      std::stringstream strStream;
+      strStream << "missing " << pkgA->name << ":" << typeA->type << "/"
+                << entryA->name << " config=" << configValueA->config;
+      emitDiffLine(apkB->getSource(), strStream.str());
+      diff = true;
+    } else {
+      diff |= emitResourceConfigValueDiff(context, apkA, pkgA, typeA, entryA,
+                                          configValueA.get(), apkB, pkgB, typeB,
+                                          entryB, configValueB);
     }
+  }
 
-    // Check for any newly added config values.
-    for (std::unique_ptr<ResourceConfigValue>& configValueB : entryB->values) {
-        ResourceConfigValue* configValueA = entryA->findValue(configValueB->config);
-        if (!configValueA) {
-            std::stringstream strStream;
-            strStream << "new config " << pkgB->name << ":" << typeB->type << "/" << entryB->name
-                    << " config=" << configValueB->config;
-            emitDiffLine(apkB->getSource(), strStream.str());
-            diff = true;
-        }
+  // Check for any newly added config values.
+  for (std::unique_ptr<ResourceConfigValue>& configValueB : entryB->values) {
+    ResourceConfigValue* configValueA = entryA->findValue(configValueB->config);
+    if (!configValueA) {
+      std::stringstream strStream;
+      strStream << "new config " << pkgB->name << ":" << typeB->type << "/"
+                << entryB->name << " config=" << configValueB->config;
+      emitDiffLine(apkB->getSource(), strStream.str());
+      diff = true;
     }
-    return false;
+  }
+  return false;
 }
 
-static bool emitResourceTypeDiff(IAaptContext* context,
-                                 LoadedApk* apkA,
+static bool emitResourceTypeDiff(IAaptContext* context, LoadedApk* apkA,
                                  ResourceTablePackage* pkgA,
-                                 ResourceTableType* typeA,
-                                 LoadedApk* apkB,
+                                 ResourceTableType* typeA, LoadedApk* apkB,
                                  ResourceTablePackage* pkgB,
                                  ResourceTableType* typeB) {
-    bool diff = false;
-    for (std::unique_ptr<ResourceEntry>& entryA : typeA->entries) {
-        ResourceEntry* entryB = typeB->findEntry(entryA->name);
-        if (!entryB) {
-            std::stringstream strStream;
-            strStream << "missing " << pkgA->name << ":" << typeA->type << "/" << entryA->name;
-            emitDiffLine(apkB->getSource(), strStream.str());
-            diff = true;
+  bool diff = false;
+  for (std::unique_ptr<ResourceEntry>& entryA : typeA->entries) {
+    ResourceEntry* entryB = typeB->findEntry(entryA->name);
+    if (!entryB) {
+      std::stringstream strStream;
+      strStream << "missing " << pkgA->name << ":" << typeA->type << "/"
+                << entryA->name;
+      emitDiffLine(apkB->getSource(), strStream.str());
+      diff = true;
+    } else {
+      if (isSymbolVisibilityDifferent(entryA->symbolStatus,
+                                      entryB->symbolStatus)) {
+        std::stringstream strStream;
+        strStream << pkgA->name << ":" << typeA->type << "/" << entryA->name
+                  << " has different visibility (";
+        if (entryB->symbolStatus.state == SymbolState::kPublic) {
+          strStream << "PUBLIC";
         } else {
-            if (isSymbolVisibilityDifferent(entryA->symbolStatus, entryB->symbolStatus)) {
-                std::stringstream strStream;
-                strStream << pkgA->name << ":" << typeA->type << "/" << entryA->name
-                        << " has different visibility (";
-                if (entryB->symbolStatus.state == SymbolState::kPublic) {
-                    strStream << "PUBLIC";
-                } else {
-                    strStream << "PRIVATE";
-                }
-                strStream << " vs ";
-                if (entryA->symbolStatus.state == SymbolState::kPublic) {
-                    strStream << "PUBLIC";
-                } else {
-                    strStream << "PRIVATE";
-                }
-                strStream << ")";
-                emitDiffLine(apkB->getSource(), strStream.str());
-                diff = true;
-            } else if (isIdDiff(entryA->symbolStatus, entryA->id,
-                                entryB->symbolStatus, entryB->id)) {
-                std::stringstream strStream;
-                strStream << pkgA->name << ":" << typeA->type << "/" << entryA->name
-                        << " has different public ID (";
-                if (entryB->id) {
-                    strStream << "0x" << std::hex << entryB->id.value();
-                } else {
-                    strStream << "none";
-                }
-                strStream << " vs ";
-                if (entryA->id) {
-                    strStream << "0x " << std::hex << entryA->id.value();
-                } else {
-                    strStream << "none";
-                }
-                strStream << ")";
-                emitDiffLine(apkB->getSource(), strStream.str());
-                diff = true;
-            }
-            diff |= emitResourceEntryDiff(context, apkA, pkgA, typeA, entryA.get(),
-                                          apkB, pkgB, typeB, entryB);
+          strStream << "PRIVATE";
         }
+        strStream << " vs ";
+        if (entryA->symbolStatus.state == SymbolState::kPublic) {
+          strStream << "PUBLIC";
+        } else {
+          strStream << "PRIVATE";
+        }
+        strStream << ")";
+        emitDiffLine(apkB->getSource(), strStream.str());
+        diff = true;
+      } else if (isIdDiff(entryA->symbolStatus, entryA->id,
+                          entryB->symbolStatus, entryB->id)) {
+        std::stringstream strStream;
+        strStream << pkgA->name << ":" << typeA->type << "/" << entryA->name
+                  << " has different public ID (";
+        if (entryB->id) {
+          strStream << "0x" << std::hex << entryB->id.value();
+        } else {
+          strStream << "none";
+        }
+        strStream << " vs ";
+        if (entryA->id) {
+          strStream << "0x " << std::hex << entryA->id.value();
+        } else {
+          strStream << "none";
+        }
+        strStream << ")";
+        emitDiffLine(apkB->getSource(), strStream.str());
+        diff = true;
+      }
+      diff |= emitResourceEntryDiff(context, apkA, pkgA, typeA, entryA.get(),
+                                    apkB, pkgB, typeB, entryB);
     }
+  }
 
-    // Check for any newly added entries.
-    for (std::unique_ptr<ResourceEntry>& entryB : typeB->entries) {
-        ResourceEntry* entryA = typeA->findEntry(entryB->name);
-        if (!entryA) {
-            std::stringstream strStream;
-            strStream << "new entry " << pkgB->name << ":" << typeB->type << "/" << entryB->name;
-            emitDiffLine(apkB->getSource(), strStream.str());
-            diff = true;
-        }
+  // Check for any newly added entries.
+  for (std::unique_ptr<ResourceEntry>& entryB : typeB->entries) {
+    ResourceEntry* entryA = typeA->findEntry(entryB->name);
+    if (!entryA) {
+      std::stringstream strStream;
+      strStream << "new entry " << pkgB->name << ":" << typeB->type << "/"
+                << entryB->name;
+      emitDiffLine(apkB->getSource(), strStream.str());
+      diff = true;
     }
-    return diff;
+  }
+  return diff;
 }
 
 static bool emitResourcePackageDiff(IAaptContext* context, LoadedApk* apkA,
-                                    ResourceTablePackage* pkgA,
-                                    LoadedApk* apkB, ResourceTablePackage* pkgB) {
-    bool diff = false;
-    for (std::unique_ptr<ResourceTableType>& typeA : pkgA->types) {
-        ResourceTableType* typeB = pkgB->findType(typeA->type);
-        if (!typeB) {
-            std::stringstream strStream;
-            strStream << "missing " << pkgA->name << ":" << typeA->type;
-            emitDiffLine(apkA->getSource(), strStream.str());
-            diff = true;
+                                    ResourceTablePackage* pkgA, LoadedApk* apkB,
+                                    ResourceTablePackage* pkgB) {
+  bool diff = false;
+  for (std::unique_ptr<ResourceTableType>& typeA : pkgA->types) {
+    ResourceTableType* typeB = pkgB->findType(typeA->type);
+    if (!typeB) {
+      std::stringstream strStream;
+      strStream << "missing " << pkgA->name << ":" << typeA->type;
+      emitDiffLine(apkA->getSource(), strStream.str());
+      diff = true;
+    } else {
+      if (isSymbolVisibilityDifferent(typeA->symbolStatus,
+                                      typeB->symbolStatus)) {
+        std::stringstream strStream;
+        strStream << pkgA->name << ":" << typeA->type
+                  << " has different visibility (";
+        if (typeB->symbolStatus.state == SymbolState::kPublic) {
+          strStream << "PUBLIC";
         } else {
-            if (isSymbolVisibilityDifferent(typeA->symbolStatus, typeB->symbolStatus)) {
-                std::stringstream strStream;
-                strStream << pkgA->name << ":" << typeA->type << " has different visibility (";
-                if (typeB->symbolStatus.state == SymbolState::kPublic) {
-                    strStream << "PUBLIC";
-                } else {
-                    strStream << "PRIVATE";
-                }
-                strStream << " vs ";
-                if (typeA->symbolStatus.state == SymbolState::kPublic) {
-                    strStream << "PUBLIC";
-                } else {
-                    strStream << "PRIVATE";
-                }
-                strStream << ")";
-                emitDiffLine(apkB->getSource(), strStream.str());
-                diff = true;
-            } else if (isIdDiff(typeA->symbolStatus, typeA->id, typeB->symbolStatus, typeB->id)) {
-                std::stringstream strStream;
-                strStream << pkgA->name << ":" << typeA->type << " has different public ID (";
-                if (typeB->id) {
-                    strStream << "0x" << std::hex << typeB->id.value();
-                } else {
-                    strStream << "none";
-                }
-                strStream << " vs ";
-                if (typeA->id) {
-                    strStream << "0x " << std::hex << typeA->id.value();
-                } else {
-                    strStream << "none";
-                }
-                strStream << ")";
-                emitDiffLine(apkB->getSource(), strStream.str());
-                diff = true;
-            }
-            diff |= emitResourceTypeDiff(context, apkA, pkgA, typeA.get(), apkB, pkgB, typeB);
+          strStream << "PRIVATE";
         }
+        strStream << " vs ";
+        if (typeA->symbolStatus.state == SymbolState::kPublic) {
+          strStream << "PUBLIC";
+        } else {
+          strStream << "PRIVATE";
+        }
+        strStream << ")";
+        emitDiffLine(apkB->getSource(), strStream.str());
+        diff = true;
+      } else if (isIdDiff(typeA->symbolStatus, typeA->id, typeB->symbolStatus,
+                          typeB->id)) {
+        std::stringstream strStream;
+        strStream << pkgA->name << ":" << typeA->type
+                  << " has different public ID (";
+        if (typeB->id) {
+          strStream << "0x" << std::hex << typeB->id.value();
+        } else {
+          strStream << "none";
+        }
+        strStream << " vs ";
+        if (typeA->id) {
+          strStream << "0x " << std::hex << typeA->id.value();
+        } else {
+          strStream << "none";
+        }
+        strStream << ")";
+        emitDiffLine(apkB->getSource(), strStream.str());
+        diff = true;
+      }
+      diff |= emitResourceTypeDiff(context, apkA, pkgA, typeA.get(), apkB, pkgB,
+                                   typeB);
     }
+  }
 
-    // Check for any newly added types.
-    for (std::unique_ptr<ResourceTableType>& typeB : pkgB->types) {
-        ResourceTableType* typeA = pkgA->findType(typeB->type);
-        if (!typeA) {
-            std::stringstream strStream;
-            strStream << "new type " << pkgB->name << ":" << typeB->type;
-            emitDiffLine(apkB->getSource(), strStream.str());
-            diff = true;
-        }
+  // Check for any newly added types.
+  for (std::unique_ptr<ResourceTableType>& typeB : pkgB->types) {
+    ResourceTableType* typeA = pkgA->findType(typeB->type);
+    if (!typeA) {
+      std::stringstream strStream;
+      strStream << "new type " << pkgB->name << ":" << typeB->type;
+      emitDiffLine(apkB->getSource(), strStream.str());
+      diff = true;
     }
-    return diff;
+  }
+  return diff;
 }
 
-static bool emitResourceTableDiff(IAaptContext* context, LoadedApk* apkA, LoadedApk* apkB) {
-    ResourceTable* tableA = apkA->getResourceTable();
-    ResourceTable* tableB = apkB->getResourceTable();
+static bool emitResourceTableDiff(IAaptContext* context, LoadedApk* apkA,
+                                  LoadedApk* apkB) {
+  ResourceTable* tableA = apkA->getResourceTable();
+  ResourceTable* tableB = apkB->getResourceTable();
 
-    bool diff = false;
-    for (std::unique_ptr<ResourceTablePackage>& pkgA : tableA->packages) {
-        ResourceTablePackage* pkgB = tableB->findPackage(pkgA->name);
-        if (!pkgB) {
-            std::stringstream strStream;
-            strStream << "missing package " << pkgA->name;
-            emitDiffLine(apkB->getSource(), strStream.str());
-            diff = true;
+  bool diff = false;
+  for (std::unique_ptr<ResourceTablePackage>& pkgA : tableA->packages) {
+    ResourceTablePackage* pkgB = tableB->findPackage(pkgA->name);
+    if (!pkgB) {
+      std::stringstream strStream;
+      strStream << "missing package " << pkgA->name;
+      emitDiffLine(apkB->getSource(), strStream.str());
+      diff = true;
+    } else {
+      if (pkgA->id != pkgB->id) {
+        std::stringstream strStream;
+        strStream << "package '" << pkgA->name << "' has different id (";
+        if (pkgB->id) {
+          strStream << "0x" << std::hex << pkgB->id.value();
         } else {
-            if (pkgA->id != pkgB->id) {
-                std::stringstream strStream;
-                strStream << "package '" << pkgA->name << "' has different id (";
-                if (pkgB->id) {
-                    strStream << "0x" << std::hex << pkgB->id.value();
-                } else {
-                    strStream << "none";
-                }
-                strStream << " vs ";
-                if (pkgA->id) {
-                    strStream << "0x" << std::hex << pkgA->id.value();
-                } else {
-                    strStream << "none";
-                }
-                strStream << ")";
-                emitDiffLine(apkB->getSource(), strStream.str());
-                diff = true;
-            }
-            diff |= emitResourcePackageDiff(context, apkA, pkgA.get(), apkB, pkgB);
+          strStream << "none";
         }
+        strStream << " vs ";
+        if (pkgA->id) {
+          strStream << "0x" << std::hex << pkgA->id.value();
+        } else {
+          strStream << "none";
+        }
+        strStream << ")";
+        emitDiffLine(apkB->getSource(), strStream.str());
+        diff = true;
+      }
+      diff |= emitResourcePackageDiff(context, apkA, pkgA.get(), apkB, pkgB);
     }
+  }
 
-    // Check for any newly added packages.
-    for (std::unique_ptr<ResourceTablePackage>& pkgB : tableB->packages) {
-        ResourceTablePackage* pkgA = tableA->findPackage(pkgB->name);
-        if (!pkgA) {
-            std::stringstream strStream;
-            strStream << "new package " << pkgB->name;
-            emitDiffLine(apkB->getSource(), strStream.str());
-            diff = true;
-        }
+  // Check for any newly added packages.
+  for (std::unique_ptr<ResourceTablePackage>& pkgB : tableB->packages) {
+    ResourceTablePackage* pkgA = tableA->findPackage(pkgB->name);
+    if (!pkgA) {
+      std::stringstream strStream;
+      strStream << "new package " << pkgB->name;
+      emitDiffLine(apkB->getSource(), strStream.str());
+      diff = true;
     }
-    return diff;
+  }
+  return diff;
 }
 
 class ZeroingReferenceVisitor : public ValueVisitor {
-public:
-    using ValueVisitor::visit;
+ public:
+  using ValueVisitor::visit;
 
-    void visit(Reference* ref) override {
-        if (ref->name && ref->id) {
-            if (ref->id.value().packageId() == 0x7f) {
-                ref->id = {};
-            }
-        }
+  void visit(Reference* ref) override {
+    if (ref->name && ref->id) {
+      if (ref->id.value().packageId() == 0x7f) {
+        ref->id = {};
+      }
     }
+  }
 };
 
 static void zeroOutAppReferences(ResourceTable* table) {
-    ZeroingReferenceVisitor visitor;
-    visitAllValuesInTable(table, &visitor);
+  ZeroingReferenceVisitor visitor;
+  visitAllValuesInTable(table, &visitor);
 }
 
 int diff(const std::vector<StringPiece>& args) {
-    DiffContext context;
+  DiffContext context;
 
-    Flags flags;
-    if (!flags.parse("aapt2 diff", args, &std::cerr)) {
-        return 1;
-    }
+  Flags flags;
+  if (!flags.parse("aapt2 diff", args, &std::cerr)) {
+    return 1;
+  }
 
-    if (flags.getArgs().size() != 2u) {
-        std::cerr << "must have two apks as arguments.\n\n";
-        flags.usage("aapt2 diff", &std::cerr);
-        return 1;
-    }
+  if (flags.getArgs().size() != 2u) {
+    std::cerr << "must have two apks as arguments.\n\n";
+    flags.usage("aapt2 diff", &std::cerr);
+    return 1;
+  }
 
-    std::unique_ptr<LoadedApk> apkA = loadApkFromPath(&context, flags.getArgs()[0]);
-    std::unique_ptr<LoadedApk> apkB = loadApkFromPath(&context, flags.getArgs()[1]);
-    if (!apkA || !apkB) {
-        return 1;
-    }
+  std::unique_ptr<LoadedApk> apkA =
+      loadApkFromPath(&context, flags.getArgs()[0]);
+  std::unique_ptr<LoadedApk> apkB =
+      loadApkFromPath(&context, flags.getArgs()[1]);
+  if (!apkA || !apkB) {
+    return 1;
+  }
 
-    // Zero out Application IDs in references.
-    zeroOutAppReferences(apkA->getResourceTable());
-    zeroOutAppReferences(apkB->getResourceTable());
+  // Zero out Application IDs in references.
+  zeroOutAppReferences(apkA->getResourceTable());
+  zeroOutAppReferences(apkB->getResourceTable());
 
-    if (emitResourceTableDiff(&context, apkA.get(), apkB.get())) {
-        // We emitted a diff, so return 1 (failure).
-        return 1;
-    }
-    return 0;
+  if (emitResourceTableDiff(&context, apkA.get(), apkB.get())) {
+    // We emitted a diff, so return 1 (failure).
+    return 1;
+  }
+  return 0;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/dump/Dump.cpp b/tools/aapt2/dump/Dump.cpp
index f61ec94..3556cd88 100644
--- a/tools/aapt2/dump/Dump.cpp
+++ b/tools/aapt2/dump/Dump.cpp
@@ -28,183 +28,181 @@
 
 namespace aapt {
 
-//struct DumpOptions {
+// struct DumpOptions {
 //
 //};
 
-void dumpCompiledFile(const pb::CompiledFile& pbFile, const void* data, size_t len,
-                      const Source& source, IAaptContext* context) {
-    std::unique_ptr<ResourceFile> file = deserializeCompiledFileFromPb(pbFile, source,
-                                                                       context->getDiagnostics());
-    if (!file) {
-        context->getDiagnostics()->warn(DiagMessage() << "failed to read compiled file");
-        return;
-    }
+void dumpCompiledFile(const pb::CompiledFile& pbFile, const void* data,
+                      size_t len, const Source& source, IAaptContext* context) {
+  std::unique_ptr<ResourceFile> file =
+      deserializeCompiledFileFromPb(pbFile, source, context->getDiagnostics());
+  if (!file) {
+    context->getDiagnostics()->warn(DiagMessage()
+                                    << "failed to read compiled file");
+    return;
+  }
 
-    std::cout << "Resource: " << file->name << "\n"
-              << "Config:   " << file->config << "\n"
-              << "Source:   " << file->source << "\n";
+  std::cout << "Resource: " << file->name << "\n"
+            << "Config:   " << file->config << "\n"
+            << "Source:   " << file->source << "\n";
 }
 
 void tryDumpFile(IAaptContext* context, const std::string& filePath) {
-    std::unique_ptr<ResourceTable> table;
+  std::unique_ptr<ResourceTable> table;
 
-    std::string err;
-    std::unique_ptr<io::ZipFileCollection> zip = io::ZipFileCollection::create(filePath, &err);
-    if (zip) {
-        io::IFile* file = zip->findFile("resources.arsc.flat");
-        if (file) {
-            std::unique_ptr<io::IData> data = file->openAsData();
-            if (!data) {
-                context->getDiagnostics()->error(DiagMessage(filePath)
-                                                 << "failed to open resources.arsc.flat");
-                return;
-            }
+  std::string err;
+  std::unique_ptr<io::ZipFileCollection> zip =
+      io::ZipFileCollection::create(filePath, &err);
+  if (zip) {
+    io::IFile* file = zip->findFile("resources.arsc.flat");
+    if (file) {
+      std::unique_ptr<io::IData> data = file->openAsData();
+      if (!data) {
+        context->getDiagnostics()->error(
+            DiagMessage(filePath) << "failed to open resources.arsc.flat");
+        return;
+      }
 
-            pb::ResourceTable pbTable;
-            if (!pbTable.ParseFromArray(data->data(), data->size())) {
-                context->getDiagnostics()->error(DiagMessage(filePath)
-                                                 << "invalid resources.arsc.flat");
-                return;
-            }
+      pb::ResourceTable pbTable;
+      if (!pbTable.ParseFromArray(data->data(), data->size())) {
+        context->getDiagnostics()->error(DiagMessage(filePath)
+                                         << "invalid resources.arsc.flat");
+        return;
+      }
 
-            table = deserializeTableFromPb(
-                    pbTable, Source(filePath), context->getDiagnostics());
-            if (!table) {
-                return;
-            }
-        }
-
-        if (!table) {
-            file = zip->findFile("resources.arsc");
-            if (file) {
-                std::unique_ptr<io::IData> data = file->openAsData();
-                if (!data) {
-                    context->getDiagnostics()->error(DiagMessage(filePath)
-                                                     << "failed to open resources.arsc");
-                    return;
-                }
-
-                table = util::make_unique<ResourceTable>();
-                BinaryResourceParser parser(context, table.get(), Source(filePath),
-                                            data->data(), data->size());
-                if (!parser.parse()) {
-                    return;
-                }
-            }
-        }
+      table = deserializeTableFromPb(pbTable, Source(filePath),
+                                     context->getDiagnostics());
+      if (!table) {
+        return;
+      }
     }
 
     if (!table) {
-        Maybe<android::FileMap> file = file::mmapPath(filePath, &err);
-        if (!file) {
-            context->getDiagnostics()->error(DiagMessage(filePath) << err);
-            return;
+      file = zip->findFile("resources.arsc");
+      if (file) {
+        std::unique_ptr<io::IData> data = file->openAsData();
+        if (!data) {
+          context->getDiagnostics()->error(DiagMessage(filePath)
+                                           << "failed to open resources.arsc");
+          return;
         }
 
-        android::FileMap* fileMap = &file.value();
-
-        // Try as a compiled table.
-        pb::ResourceTable pbTable;
-        if (pbTable.ParseFromArray(fileMap->getDataPtr(), fileMap->getDataLength())) {
-            table = deserializeTableFromPb(pbTable, Source(filePath), context->getDiagnostics());
+        table = util::make_unique<ResourceTable>();
+        BinaryResourceParser parser(context, table.get(), Source(filePath),
+                                    data->data(), data->size());
+        if (!parser.parse()) {
+          return;
         }
+      }
+    }
+  }
 
-        if (!table) {
-            // Try as a compiled file.
-            CompiledFileInputStream input(fileMap->getDataPtr(), fileMap->getDataLength());
-
-            uint32_t numFiles = 0;
-            if (!input.ReadLittleEndian32(&numFiles)) {
-                return;
-            }
-
-            for (uint32_t i = 0; i < numFiles; i++) {
-                pb::CompiledFile compiledFile;
-                if (!input.ReadCompiledFile(&compiledFile)) {
-                    context->getDiagnostics()->warn(DiagMessage() << "failed to read compiled file");
-                    return;
-                }
-
-                uint64_t offset, len;
-                if (!input.ReadDataMetaData(&offset, &len)) {
-                    context->getDiagnostics()->warn(DiagMessage() << "failed to read meta data");
-                    return;
-                }
-
-                const void* data = static_cast<const uint8_t*>(fileMap->getDataPtr()) + offset;
-                dumpCompiledFile(compiledFile, data, len, Source(filePath), context);
-            }
-        }
+  if (!table) {
+    Maybe<android::FileMap> file = file::mmapPath(filePath, &err);
+    if (!file) {
+      context->getDiagnostics()->error(DiagMessage(filePath) << err);
+      return;
     }
 
-    if (table) {
-        DebugPrintTableOptions debugPrintTableOptions;
-        debugPrintTableOptions.showSources = true;
-        Debug::printTable(table.get(), debugPrintTableOptions);
+    android::FileMap* fileMap = &file.value();
+
+    // Try as a compiled table.
+    pb::ResourceTable pbTable;
+    if (pbTable.ParseFromArray(fileMap->getDataPtr(),
+                               fileMap->getDataLength())) {
+      table = deserializeTableFromPb(pbTable, Source(filePath),
+                                     context->getDiagnostics());
     }
+
+    if (!table) {
+      // Try as a compiled file.
+      CompiledFileInputStream input(fileMap->getDataPtr(),
+                                    fileMap->getDataLength());
+
+      uint32_t numFiles = 0;
+      if (!input.ReadLittleEndian32(&numFiles)) {
+        return;
+      }
+
+      for (uint32_t i = 0; i < numFiles; i++) {
+        pb::CompiledFile compiledFile;
+        if (!input.ReadCompiledFile(&compiledFile)) {
+          context->getDiagnostics()->warn(DiagMessage()
+                                          << "failed to read compiled file");
+          return;
+        }
+
+        uint64_t offset, len;
+        if (!input.ReadDataMetaData(&offset, &len)) {
+          context->getDiagnostics()->warn(DiagMessage()
+                                          << "failed to read meta data");
+          return;
+        }
+
+        const void* data =
+            static_cast<const uint8_t*>(fileMap->getDataPtr()) + offset;
+        dumpCompiledFile(compiledFile, data, len, Source(filePath), context);
+      }
+    }
+  }
+
+  if (table) {
+    DebugPrintTableOptions debugPrintTableOptions;
+    debugPrintTableOptions.showSources = true;
+    Debug::printTable(table.get(), debugPrintTableOptions);
+  }
 }
 
 class DumpContext : public IAaptContext {
-public:
-    IDiagnostics* getDiagnostics() override {
-        return &mDiagnostics;
-    }
+ public:
+  IDiagnostics* getDiagnostics() override { return &mDiagnostics; }
 
-    NameMangler* getNameMangler() override {
-        abort();
-        return nullptr;
-    }
+  NameMangler* getNameMangler() override {
+    abort();
+    return nullptr;
+  }
 
-    const std::string& getCompilationPackage() override {
-        static std::string empty;
-        return empty;
-    }
+  const std::string& getCompilationPackage() override {
+    static std::string empty;
+    return empty;
+  }
 
-    uint8_t getPackageId() override {
-        return 0;
-    }
+  uint8_t getPackageId() override { return 0; }
 
-    SymbolTable* getExternalSymbols() override {
-        abort();
-        return nullptr;
-    }
+  SymbolTable* getExternalSymbols() override {
+    abort();
+    return nullptr;
+  }
 
-    bool verbose() override {
-        return mVerbose;
-    }
+  bool verbose() override { return mVerbose; }
 
-    void setVerbose(bool val) {
-        mVerbose = val;
-    }
+  void setVerbose(bool val) { mVerbose = val; }
 
-    int getMinSdkVersion() override {
-        return 0;
-    }
+  int getMinSdkVersion() override { return 0; }
 
-private:
-    StdErrDiagnostics mDiagnostics;
-    bool mVerbose = false;
+ private:
+  StdErrDiagnostics mDiagnostics;
+  bool mVerbose = false;
 };
 
 /**
  * Entry point for dump command.
  */
 int dump(const std::vector<StringPiece>& args) {
-    bool verbose = false;
-    Flags flags = Flags()
-            .optionalSwitch("-v", "increase verbosity of output", &verbose);
-    if (!flags.parse("aapt2 dump", args, &std::cerr)) {
-        return 1;
-    }
+  bool verbose = false;
+  Flags flags =
+      Flags().optionalSwitch("-v", "increase verbosity of output", &verbose);
+  if (!flags.parse("aapt2 dump", args, &std::cerr)) {
+    return 1;
+  }
 
-    DumpContext context;
-    context.setVerbose(verbose);
+  DumpContext context;
+  context.setVerbose(verbose);
 
-    for (const std::string& arg : flags.getArgs()) {
-        tryDumpFile(&context, arg);
-    }
-    return 0;
+  for (const std::string& arg : flags.getArgs()) {
+    tryDumpFile(&context, arg);
+  }
+  return 0;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/filter/ConfigFilter.cpp b/tools/aapt2/filter/ConfigFilter.cpp
index 68a017d..5af996c 100644
--- a/tools/aapt2/filter/ConfigFilter.cpp
+++ b/tools/aapt2/filter/ConfigFilter.cpp
@@ -14,64 +14,68 @@
  * limitations under the License.
  */
 
-#include "ConfigDescription.h"
 #include "filter/ConfigFilter.h"
+#include "ConfigDescription.h"
 
 #include <androidfw/ResourceTypes.h>
 
 namespace aapt {
 
 void AxisConfigFilter::addConfig(ConfigDescription config) {
-    uint32_t diffMask = ConfigDescription::defaultConfig().diff(config);
+  uint32_t diffMask = ConfigDescription::defaultConfig().diff(config);
 
-    // Ignore the version
-    diffMask &= ~android::ResTable_config::CONFIG_VERSION;
+  // Ignore the version
+  diffMask &= ~android::ResTable_config::CONFIG_VERSION;
 
-    // Ignore any densities. Those are best handled in --preferred-density
-    if ((diffMask & android::ResTable_config::CONFIG_DENSITY) != 0) {
-        config.density = 0;
-        diffMask &= ~android::ResTable_config::CONFIG_DENSITY;
-    }
+  // Ignore any densities. Those are best handled in --preferred-density
+  if ((diffMask & android::ResTable_config::CONFIG_DENSITY) != 0) {
+    config.density = 0;
+    diffMask &= ~android::ResTable_config::CONFIG_DENSITY;
+  }
 
-    mConfigs.insert(std::make_pair(config, diffMask));
-    mConfigMask |= diffMask;
+  mConfigs.insert(std::make_pair(config, diffMask));
+  mConfigMask |= diffMask;
 }
 
 bool AxisConfigFilter::match(const ConfigDescription& config) const {
-    const uint32_t mask = ConfigDescription::defaultConfig().diff(config);
-    if ((mConfigMask & mask) == 0) {
-        // The two configurations don't have any common axis.
-        return true;
-    }
+  const uint32_t mask = ConfigDescription::defaultConfig().diff(config);
+  if ((mConfigMask & mask) == 0) {
+    // The two configurations don't have any common axis.
+    return true;
+  }
 
-    uint32_t matchedAxis = 0;
-    for (const auto& entry : mConfigs) {
-        const ConfigDescription& target = entry.first;
-        const uint32_t diffMask = entry.second;
-        uint32_t diff = target.diff(config);
-        if ((diff & diffMask) == 0) {
-            // Mark the axis that was matched.
-            matchedAxis |= diffMask;
-        } else if ((diff & diffMask) == android::ResTable_config::CONFIG_LOCALE) {
-            // If the locales differ, but the languages are the same and
-            // the locale we are matching only has a language specified,
-            // we match.
-            if (config.language[0] &&
-                    memcmp(config.language, target.language, sizeof(config.language)) == 0) {
-                if (config.country[0] == 0) {
-                    matchedAxis |= android::ResTable_config::CONFIG_LOCALE;
-                }
-            }
-        } else if ((diff & diffMask) == android::ResTable_config::CONFIG_SMALLEST_SCREEN_SIZE) {
-            // Special case if the smallest screen width doesn't match. We check that the
-            // config being matched has a smaller screen width than the filter specified.
-            if (config.smallestScreenWidthDp != 0 &&
-                    config.smallestScreenWidthDp < target.smallestScreenWidthDp) {
-                matchedAxis |= android::ResTable_config::CONFIG_SMALLEST_SCREEN_SIZE;
-            }
+  uint32_t matchedAxis = 0;
+  for (const auto& entry : mConfigs) {
+    const ConfigDescription& target = entry.first;
+    const uint32_t diffMask = entry.second;
+    uint32_t diff = target.diff(config);
+    if ((diff & diffMask) == 0) {
+      // Mark the axis that was matched.
+      matchedAxis |= diffMask;
+    } else if ((diff & diffMask) == android::ResTable_config::CONFIG_LOCALE) {
+      // If the locales differ, but the languages are the same and
+      // the locale we are matching only has a language specified,
+      // we match.
+      if (config.language[0] &&
+          memcmp(config.language, target.language, sizeof(config.language)) ==
+              0) {
+        if (config.country[0] == 0) {
+          matchedAxis |= android::ResTable_config::CONFIG_LOCALE;
         }
+      }
+    } else if ((diff & diffMask) ==
+               android::ResTable_config::CONFIG_SMALLEST_SCREEN_SIZE) {
+      // Special case if the smallest screen width doesn't match. We check that
+      // the
+      // config being matched has a smaller screen width than the filter
+      // specified.
+      if (config.smallestScreenWidthDp != 0 &&
+          config.smallestScreenWidthDp < target.smallestScreenWidthDp) {
+        matchedAxis |= android::ResTable_config::CONFIG_SMALLEST_SCREEN_SIZE;
+      }
     }
-    return matchedAxis == (mConfigMask & mask);
+  }
+  return matchedAxis == (mConfigMask & mask);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/filter/ConfigFilter.h b/tools/aapt2/filter/ConfigFilter.h
index 36e9c44..c50160b 100644
--- a/tools/aapt2/filter/ConfigFilter.h
+++ b/tools/aapt2/filter/ConfigFilter.h
@@ -28,34 +28,37 @@
  * Matches ConfigDescriptions based on some pattern.
  */
 class IConfigFilter {
-public:
-    virtual ~IConfigFilter() = default;
+ public:
+  virtual ~IConfigFilter() = default;
 
-    /**
-     * Returns true if the filter matches the configuration, false otherwise.
-     */
-    virtual bool match(const ConfigDescription& config) const = 0;
+  /**
+   * Returns true if the filter matches the configuration, false otherwise.
+   */
+  virtual bool match(const ConfigDescription& config) const = 0;
 };
 
 /**
- * Implements config axis matching. An axis is one component of a configuration, like screen
- * density or locale. If an axis is specified in the filter, and the axis is specified in
- * the configuration to match, they must be compatible. Otherwise the configuration to match is
+ * Implements config axis matching. An axis is one component of a configuration,
+ * like screen
+ * density or locale. If an axis is specified in the filter, and the axis is
+ * specified in
+ * the configuration to match, they must be compatible. Otherwise the
+ * configuration to match is
  * accepted.
  *
  * Used when handling "-c" options.
  */
 class AxisConfigFilter : public IConfigFilter {
-public:
-    void addConfig(ConfigDescription config);
+ public:
+  void addConfig(ConfigDescription config);
 
-    bool match(const ConfigDescription& config) const override;
+  bool match(const ConfigDescription& config) const override;
 
-private:
-    std::set<std::pair<ConfigDescription, uint32_t>> mConfigs;
-    uint32_t mConfigMask = 0;
+ private:
+  std::set<std::pair<ConfigDescription, uint32_t>> mConfigs;
+  uint32_t mConfigMask = 0;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_FILTER_CONFIGFILTER_H */
diff --git a/tools/aapt2/filter/ConfigFilter_test.cpp b/tools/aapt2/filter/ConfigFilter_test.cpp
index f6b4955..edb40a8 100644
--- a/tools/aapt2/filter/ConfigFilter_test.cpp
+++ b/tools/aapt2/filter/ConfigFilter_test.cpp
@@ -22,91 +22,92 @@
 namespace aapt {
 
 TEST(ConfigFilterTest, EmptyFilterMatchesAnything) {
-    AxisConfigFilter filter;
+  AxisConfigFilter filter;
 
-    EXPECT_TRUE(filter.match(test::parseConfigOrDie("320dpi")));
-    EXPECT_TRUE(filter.match(test::parseConfigOrDie("fr")));
+  EXPECT_TRUE(filter.match(test::parseConfigOrDie("320dpi")));
+  EXPECT_TRUE(filter.match(test::parseConfigOrDie("fr")));
 }
 
 TEST(ConfigFilterTest, MatchesConfigWithUnrelatedAxis) {
-    AxisConfigFilter filter;
-    filter.addConfig(test::parseConfigOrDie("fr"));
+  AxisConfigFilter filter;
+  filter.addConfig(test::parseConfigOrDie("fr"));
 
-    EXPECT_TRUE(filter.match(test::parseConfigOrDie("320dpi")));
+  EXPECT_TRUE(filter.match(test::parseConfigOrDie("320dpi")));
 }
 
 TEST(ConfigFilterTest, MatchesConfigWithSameValueAxis) {
-    AxisConfigFilter filter;
-    filter.addConfig(test::parseConfigOrDie("fr"));
+  AxisConfigFilter filter;
+  filter.addConfig(test::parseConfigOrDie("fr"));
 
-    EXPECT_TRUE(filter.match(test::parseConfigOrDie("fr")));
+  EXPECT_TRUE(filter.match(test::parseConfigOrDie("fr")));
 }
 
 TEST(ConfigFilterTest, MatchesConfigWithSameValueAxisAndOtherUnrelatedAxis) {
-    AxisConfigFilter filter;
-    filter.addConfig(test::parseConfigOrDie("fr"));
+  AxisConfigFilter filter;
+  filter.addConfig(test::parseConfigOrDie("fr"));
 
-    EXPECT_TRUE(filter.match(test::parseConfigOrDie("fr-320dpi")));
+  EXPECT_TRUE(filter.match(test::parseConfigOrDie("fr-320dpi")));
 }
 
 TEST(ConfigFilterTest, MatchesConfigWithOneMatchingAxis) {
-    AxisConfigFilter filter;
-    filter.addConfig(test::parseConfigOrDie("fr-rFR"));
-    filter.addConfig(test::parseConfigOrDie("sw360dp"));
-    filter.addConfig(test::parseConfigOrDie("normal"));
-    filter.addConfig(test::parseConfigOrDie("en-rUS"));
+  AxisConfigFilter filter;
+  filter.addConfig(test::parseConfigOrDie("fr-rFR"));
+  filter.addConfig(test::parseConfigOrDie("sw360dp"));
+  filter.addConfig(test::parseConfigOrDie("normal"));
+  filter.addConfig(test::parseConfigOrDie("en-rUS"));
 
-    EXPECT_TRUE(filter.match(test::parseConfigOrDie("en")));
+  EXPECT_TRUE(filter.match(test::parseConfigOrDie("en")));
 }
 
 TEST(ConfigFilterTest, DoesNotMatchConfigWithDifferentValueAxis) {
-    AxisConfigFilter filter;
-    filter.addConfig(test::parseConfigOrDie("fr"));
+  AxisConfigFilter filter;
+  filter.addConfig(test::parseConfigOrDie("fr"));
 
-    EXPECT_FALSE(filter.match(test::parseConfigOrDie("de")));
+  EXPECT_FALSE(filter.match(test::parseConfigOrDie("de")));
 }
 
 TEST(ConfigFilterTest, DoesNotMatchWhenOneQualifierIsExplicitlyNotMatched) {
-    AxisConfigFilter filter;
-    filter.addConfig(test::parseConfigOrDie("fr-rFR"));
-    filter.addConfig(test::parseConfigOrDie("en-rUS"));
-    filter.addConfig(test::parseConfigOrDie("normal"));
-    filter.addConfig(test::parseConfigOrDie("large"));
-    filter.addConfig(test::parseConfigOrDie("xxhdpi"));
-    filter.addConfig(test::parseConfigOrDie("sw320dp"));
+  AxisConfigFilter filter;
+  filter.addConfig(test::parseConfigOrDie("fr-rFR"));
+  filter.addConfig(test::parseConfigOrDie("en-rUS"));
+  filter.addConfig(test::parseConfigOrDie("normal"));
+  filter.addConfig(test::parseConfigOrDie("large"));
+  filter.addConfig(test::parseConfigOrDie("xxhdpi"));
+  filter.addConfig(test::parseConfigOrDie("sw320dp"));
 
-    EXPECT_FALSE(filter.match(test::parseConfigOrDie("fr-sw600dp-v13")));
+  EXPECT_FALSE(filter.match(test::parseConfigOrDie("fr-sw600dp-v13")));
 }
 
 TEST(ConfigFilterTest, MatchesSmallestWidthWhenSmaller) {
-    AxisConfigFilter filter;
-    filter.addConfig(test::parseConfigOrDie("sw600dp"));
+  AxisConfigFilter filter;
+  filter.addConfig(test::parseConfigOrDie("sw600dp"));
 
-    EXPECT_TRUE(filter.match(test::parseConfigOrDie("fr-sw320dp-v13")));
+  EXPECT_TRUE(filter.match(test::parseConfigOrDie("fr-sw320dp-v13")));
 }
 
 TEST(ConfigFilterTest, MatchesConfigWithSameLanguageButNoRegionSpecified) {
-    AxisConfigFilter filter;
-    filter.addConfig(test::parseConfigOrDie("de-rDE"));
+  AxisConfigFilter filter;
+  filter.addConfig(test::parseConfigOrDie("de-rDE"));
 
-    EXPECT_TRUE(filter.match(test::parseConfigOrDie("de")));
+  EXPECT_TRUE(filter.match(test::parseConfigOrDie("de")));
 }
 
 TEST(ConfigFilterTest, IgnoresVersion) {
-    AxisConfigFilter filter;
-    filter.addConfig(test::parseConfigOrDie("normal-v4"));
+  AxisConfigFilter filter;
+  filter.addConfig(test::parseConfigOrDie("normal-v4"));
 
-    // The configs don't match on any axis besides version, which should be ignored.
-    EXPECT_TRUE(filter.match(test::parseConfigOrDie("sw600dp-v13")));
+  // The configs don't match on any axis besides version, which should be
+  // ignored.
+  EXPECT_TRUE(filter.match(test::parseConfigOrDie("sw600dp-v13")));
 }
 
 TEST(ConfigFilterTest, MatchesConfigWithRegion) {
-    AxisConfigFilter filter;
-    filter.addConfig(test::parseConfigOrDie("kok"));
-    filter.addConfig(test::parseConfigOrDie("kok-rIN"));
-    filter.addConfig(test::parseConfigOrDie("kok-v419"));
+  AxisConfigFilter filter;
+  filter.addConfig(test::parseConfigOrDie("kok"));
+  filter.addConfig(test::parseConfigOrDie("kok-rIN"));
+  filter.addConfig(test::parseConfigOrDie("kok-v419"));
 
-    EXPECT_TRUE(filter.match(test::parseConfigOrDie("kok-rIN")));
+  EXPECT_TRUE(filter.match(test::parseConfigOrDie("kok-rIN")));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/flatten/Archive.cpp b/tools/aapt2/flatten/Archive.cpp
index 3a244c0..ae08f65 100644
--- a/tools/aapt2/flatten/Archive.cpp
+++ b/tools/aapt2/flatten/Archive.cpp
@@ -18,167 +18,169 @@
 #include "util/Files.h"
 #include "util/StringPiece.h"
 
+#include <ziparchive/zip_writer.h>
 #include <cstdio>
 #include <memory>
 #include <string>
 #include <vector>
-#include <ziparchive/zip_writer.h>
 
 namespace aapt {
 
 namespace {
 
 struct DirectoryWriter : public IArchiveWriter {
-    std::string mOutDir;
-    std::unique_ptr<FILE, decltype(fclose)*> mFile = { nullptr, fclose };
+  std::string mOutDir;
+  std::unique_ptr<FILE, decltype(fclose)*> mFile = {nullptr, fclose};
 
-    bool open(IDiagnostics* diag, const StringPiece& outDir) {
-        mOutDir = outDir.toString();
-        file::FileType type = file::getFileType(mOutDir);
-        if (type == file::FileType::kNonexistant) {
-            diag->error(DiagMessage() << "directory " << mOutDir << " does not exist");
-            return false;
-        } else if (type != file::FileType::kDirectory) {
-            diag->error(DiagMessage() << mOutDir << " is not a directory");
-            return false;
-        }
-        return true;
+  bool open(IDiagnostics* diag, const StringPiece& outDir) {
+    mOutDir = outDir.toString();
+    file::FileType type = file::getFileType(mOutDir);
+    if (type == file::FileType::kNonexistant) {
+      diag->error(DiagMessage() << "directory " << mOutDir
+                                << " does not exist");
+      return false;
+    } else if (type != file::FileType::kDirectory) {
+      diag->error(DiagMessage() << mOutDir << " is not a directory");
+      return false;
+    }
+    return true;
+  }
+
+  bool startEntry(const StringPiece& path, uint32_t flags) override {
+    if (mFile) {
+      return false;
     }
 
-    bool startEntry(const StringPiece& path, uint32_t flags) override {
-        if (mFile) {
-            return false;
-        }
+    std::string fullPath = mOutDir;
+    file::appendPath(&fullPath, path);
+    file::mkdirs(file::getStem(fullPath));
 
-        std::string fullPath = mOutDir;
-        file::appendPath(&fullPath, path);
-        file::mkdirs(file::getStem(fullPath));
+    mFile = {fopen(fullPath.data(), "wb"), fclose};
+    if (!mFile) {
+      return false;
+    }
+    return true;
+  }
 
-        mFile = { fopen(fullPath.data(), "wb"), fclose };
-        if (!mFile) {
-            return false;
-        }
-        return true;
+  bool writeEntry(const BigBuffer& buffer) override {
+    if (!mFile) {
+      return false;
     }
 
-    bool writeEntry(const BigBuffer& buffer) override {
-        if (!mFile) {
-            return false;
-        }
-
-        for (const BigBuffer::Block& b : buffer) {
-            if (fwrite(b.buffer.get(), 1, b.size, mFile.get()) != b.size) {
-                mFile.reset(nullptr);
-                return false;
-            }
-        }
-        return true;
-    }
-
-    bool writeEntry(const void* data, size_t len) override {
-        if (fwrite(data, 1, len, mFile.get()) != len) {
-            mFile.reset(nullptr);
-            return false;
-        }
-        return true;
-    }
-
-    bool finishEntry() override {
-        if (!mFile) {
-            return false;
-        }
+    for (const BigBuffer::Block& b : buffer) {
+      if (fwrite(b.buffer.get(), 1, b.size, mFile.get()) != b.size) {
         mFile.reset(nullptr);
-        return true;
+        return false;
+      }
     }
+    return true;
+  }
+
+  bool writeEntry(const void* data, size_t len) override {
+    if (fwrite(data, 1, len, mFile.get()) != len) {
+      mFile.reset(nullptr);
+      return false;
+    }
+    return true;
+  }
+
+  bool finishEntry() override {
+    if (!mFile) {
+      return false;
+    }
+    mFile.reset(nullptr);
+    return true;
+  }
 };
 
 struct ZipFileWriter : public IArchiveWriter {
-    std::unique_ptr<FILE, decltype(fclose)*> mFile = { nullptr, fclose };
-    std::unique_ptr<ZipWriter> mWriter;
+  std::unique_ptr<FILE, decltype(fclose)*> mFile = {nullptr, fclose};
+  std::unique_ptr<ZipWriter> mWriter;
 
-    bool open(IDiagnostics* diag, const StringPiece& path) {
-        mFile = { fopen(path.data(), "w+b"), fclose };
-        if (!mFile) {
-            diag->error(DiagMessage() << "failed to open " << path << ": " << strerror(errno));
-            return false;
-        }
-        mWriter = util::make_unique<ZipWriter>(mFile.get());
-        return true;
+  bool open(IDiagnostics* diag, const StringPiece& path) {
+    mFile = {fopen(path.data(), "w+b"), fclose};
+    if (!mFile) {
+      diag->error(DiagMessage() << "failed to open " << path << ": "
+                                << strerror(errno));
+      return false;
+    }
+    mWriter = util::make_unique<ZipWriter>(mFile.get());
+    return true;
+  }
+
+  bool startEntry(const StringPiece& path, uint32_t flags) override {
+    if (!mWriter) {
+      return false;
     }
 
-    bool startEntry(const StringPiece& path, uint32_t flags) override {
-        if (!mWriter) {
-            return false;
-        }
-
-        size_t zipFlags = 0;
-        if (flags & ArchiveEntry::kCompress) {
-            zipFlags |= ZipWriter::kCompress;
-        }
-
-        if (flags & ArchiveEntry::kAlign) {
-            zipFlags |= ZipWriter::kAlign32;
-        }
-
-        int32_t result = mWriter->StartEntry(path.data(), zipFlags);
-        if (result != 0) {
-            return false;
-        }
-        return true;
+    size_t zipFlags = 0;
+    if (flags & ArchiveEntry::kCompress) {
+      zipFlags |= ZipWriter::kCompress;
     }
 
-    bool writeEntry(const void* data, size_t len) override {
-        int32_t result = mWriter->WriteBytes(data, len);
-        if (result != 0) {
-            return false;
-        }
-        return true;
+    if (flags & ArchiveEntry::kAlign) {
+      zipFlags |= ZipWriter::kAlign32;
     }
 
-    bool writeEntry(const BigBuffer& buffer) override {
-        for (const BigBuffer::Block& b : buffer) {
-            int32_t result = mWriter->WriteBytes(b.buffer.get(), b.size);
-            if (result != 0) {
-                return false;
-            }
-        }
-        return true;
+    int32_t result = mWriter->StartEntry(path.data(), zipFlags);
+    if (result != 0) {
+      return false;
     }
+    return true;
+  }
 
-    bool finishEntry() override {
-        int32_t result = mWriter->FinishEntry();
-        if (result != 0) {
-            return false;
-        }
-        return true;
+  bool writeEntry(const void* data, size_t len) override {
+    int32_t result = mWriter->WriteBytes(data, len);
+    if (result != 0) {
+      return false;
     }
+    return true;
+  }
 
-    virtual ~ZipFileWriter() {
-        if (mWriter) {
-            mWriter->Finish();
-        }
+  bool writeEntry(const BigBuffer& buffer) override {
+    for (const BigBuffer::Block& b : buffer) {
+      int32_t result = mWriter->WriteBytes(b.buffer.get(), b.size);
+      if (result != 0) {
+        return false;
+      }
     }
+    return true;
+  }
+
+  bool finishEntry() override {
+    int32_t result = mWriter->FinishEntry();
+    if (result != 0) {
+      return false;
+    }
+    return true;
+  }
+
+  virtual ~ZipFileWriter() {
+    if (mWriter) {
+      mWriter->Finish();
+    }
+  }
 };
 
-} // namespace
+}  // namespace
 
-std::unique_ptr<IArchiveWriter> createDirectoryArchiveWriter(IDiagnostics* diag,
-                                                             const StringPiece& path) {
-
-    std::unique_ptr<DirectoryWriter> writer = util::make_unique<DirectoryWriter>();
-    if (!writer->open(diag, path)) {
-        return {};
-    }
-    return std::move(writer);
+std::unique_ptr<IArchiveWriter> createDirectoryArchiveWriter(
+    IDiagnostics* diag, const StringPiece& path) {
+  std::unique_ptr<DirectoryWriter> writer =
+      util::make_unique<DirectoryWriter>();
+  if (!writer->open(diag, path)) {
+    return {};
+  }
+  return std::move(writer);
 }
 
-std::unique_ptr<IArchiveWriter> createZipFileArchiveWriter(IDiagnostics* diag,
-                                                           const StringPiece& path) {
-    std::unique_ptr<ZipFileWriter> writer = util::make_unique<ZipFileWriter>();
-    if (!writer->open(diag, path)) {
-        return {};
-    }
-    return std::move(writer);
+std::unique_ptr<IArchiveWriter> createZipFileArchiveWriter(
+    IDiagnostics* diag, const StringPiece& path) {
+  std::unique_ptr<ZipFileWriter> writer = util::make_unique<ZipFileWriter>();
+  if (!writer->open(diag, path)) {
+    return {};
+  }
+  return std::move(writer);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/flatten/Archive.h b/tools/aapt2/flatten/Archive.h
index 96d8512..46cd0ac 100644
--- a/tools/aapt2/flatten/Archive.h
+++ b/tools/aapt2/flatten/Archive.h
@@ -31,37 +31,37 @@
 namespace aapt {
 
 struct ArchiveEntry {
-    enum : uint32_t {
-        kCompress = 0x01,
-        kAlign    = 0x02,
-    };
+  enum : uint32_t {
+    kCompress = 0x01,
+    kAlign = 0x02,
+  };
 
-    std::string path;
-    uint32_t flags;
-    size_t uncompressedSize;
+  std::string path;
+  uint32_t flags;
+  size_t uncompressedSize;
 };
 
 class IArchiveWriter : public google::protobuf::io::CopyingOutputStream {
-public:
-    virtual ~IArchiveWriter() = default;
+ public:
+  virtual ~IArchiveWriter() = default;
 
-    virtual bool startEntry(const StringPiece& path, uint32_t flags) = 0;
-    virtual bool writeEntry(const BigBuffer& buffer) = 0;
-    virtual bool writeEntry(const void* data, size_t len) = 0;
-    virtual bool finishEntry() = 0;
+  virtual bool startEntry(const StringPiece& path, uint32_t flags) = 0;
+  virtual bool writeEntry(const BigBuffer& buffer) = 0;
+  virtual bool writeEntry(const void* data, size_t len) = 0;
+  virtual bool finishEntry() = 0;
 
-    // CopyingOutputStream implementations.
-    bool Write(const void* buffer, int size) override {
-        return writeEntry(buffer, size);
-    }
+  // CopyingOutputStream implementations.
+  bool Write(const void* buffer, int size) override {
+    return writeEntry(buffer, size);
+  }
 };
 
-std::unique_ptr<IArchiveWriter> createDirectoryArchiveWriter(IDiagnostics* diag,
-                                                             const StringPiece& path);
+std::unique_ptr<IArchiveWriter> createDirectoryArchiveWriter(
+    IDiagnostics* diag, const StringPiece& path);
 
-std::unique_ptr<IArchiveWriter> createZipFileArchiveWriter(IDiagnostics* diag,
-                                                           const StringPiece& path);
+std::unique_ptr<IArchiveWriter> createZipFileArchiveWriter(
+    IDiagnostics* diag, const StringPiece& path);
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_FLATTEN_ARCHIVE_H */
diff --git a/tools/aapt2/flatten/ChunkWriter.h b/tools/aapt2/flatten/ChunkWriter.h
index de1d87a..852afd4 100644
--- a/tools/aapt2/flatten/ChunkWriter.h
+++ b/tools/aapt2/flatten/ChunkWriter.h
@@ -25,63 +25,56 @@
 namespace aapt {
 
 class ChunkWriter {
-private:
-    BigBuffer* mBuffer;
-    size_t mStartSize = 0;
-    android::ResChunk_header* mHeader = nullptr;
+ private:
+  BigBuffer* mBuffer;
+  size_t mStartSize = 0;
+  android::ResChunk_header* mHeader = nullptr;
 
-public:
-    explicit inline ChunkWriter(BigBuffer* buffer) : mBuffer(buffer) {
-    }
+ public:
+  explicit inline ChunkWriter(BigBuffer* buffer) : mBuffer(buffer) {}
 
-    ChunkWriter(const ChunkWriter&) = delete;
-    ChunkWriter& operator=(const ChunkWriter&) = delete;
-    ChunkWriter(ChunkWriter&&) = default;
-    ChunkWriter& operator=(ChunkWriter&&) = default;
+  ChunkWriter(const ChunkWriter&) = delete;
+  ChunkWriter& operator=(const ChunkWriter&) = delete;
+  ChunkWriter(ChunkWriter&&) = default;
+  ChunkWriter& operator=(ChunkWriter&&) = default;
 
-    template <typename T>
-    inline T* startChunk(uint16_t type) {
-        mStartSize = mBuffer->size();
-        T* chunk = mBuffer->nextBlock<T>();
-        mHeader = &chunk->header;
-        mHeader->type = util::hostToDevice16(type);
-        mHeader->headerSize = util::hostToDevice16(sizeof(T));
-        return chunk;
-    }
+  template <typename T>
+  inline T* startChunk(uint16_t type) {
+    mStartSize = mBuffer->size();
+    T* chunk = mBuffer->nextBlock<T>();
+    mHeader = &chunk->header;
+    mHeader->type = util::hostToDevice16(type);
+    mHeader->headerSize = util::hostToDevice16(sizeof(T));
+    return chunk;
+  }
 
-    template <typename T>
-    inline T* nextBlock(size_t count = 1) {
-        return mBuffer->nextBlock<T>(count);
-    }
+  template <typename T>
+  inline T* nextBlock(size_t count = 1) {
+    return mBuffer->nextBlock<T>(count);
+  }
 
-    inline BigBuffer* getBuffer() {
-        return mBuffer;
-    }
+  inline BigBuffer* getBuffer() { return mBuffer; }
 
-    inline android::ResChunk_header* getChunkHeader() {
-        return mHeader;
-    }
+  inline android::ResChunk_header* getChunkHeader() { return mHeader; }
 
-    inline size_t size() {
-        return mBuffer->size() - mStartSize;
-    }
+  inline size_t size() { return mBuffer->size() - mStartSize; }
 
-    inline android::ResChunk_header* finish() {
-        mBuffer->align4();
-        mHeader->size = util::hostToDevice32(mBuffer->size() - mStartSize);
-        return mHeader;
-    }
+  inline android::ResChunk_header* finish() {
+    mBuffer->align4();
+    mHeader->size = util::hostToDevice32(mBuffer->size() - mStartSize);
+    return mHeader;
+  }
 };
 
 template <>
 inline android::ResChunk_header* ChunkWriter::startChunk(uint16_t type) {
-    mStartSize = mBuffer->size();
-    mHeader = mBuffer->nextBlock<android::ResChunk_header>();
-    mHeader->type = util::hostToDevice16(type);
-    mHeader->headerSize = util::hostToDevice16(sizeof(android::ResChunk_header));
-    return mHeader;
+  mStartSize = mBuffer->size();
+  mHeader = mBuffer->nextBlock<android::ResChunk_header>();
+  mHeader->type = util::hostToDevice16(type);
+  mHeader->headerSize = util::hostToDevice16(sizeof(android::ResChunk_header));
+  return mHeader;
 }
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_FLATTEN_CHUNKWRITER_H */
diff --git a/tools/aapt2/flatten/ResourceTypeExtensions.h b/tools/aapt2/flatten/ResourceTypeExtensions.h
index 3e20ad6..0b19240 100644
--- a/tools/aapt2/flatten/ResourceTypeExtensions.h
+++ b/tools/aapt2/flatten/ResourceTypeExtensions.h
@@ -22,15 +22,16 @@
 namespace aapt {
 
 /**
- * An alternative struct to use instead of ResTable_map_entry. This one is a standard_layout
+ * An alternative struct to use instead of ResTable_map_entry. This one is a
+ * standard_layout
  * struct.
  */
 struct ResTable_entry_ext {
-    android::ResTable_entry entry;
-    android::ResTable_ref parent;
-    uint32_t count;
+  android::ResTable_entry entry;
+  android::ResTable_ref parent;
+  uint32_t count;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_RESOURCE_TYPE_EXTENSIONS_H
+#endif  // AAPT_RESOURCE_TYPE_EXTENSIONS_H
diff --git a/tools/aapt2/flatten/TableFlattener.cpp b/tools/aapt2/flatten/TableFlattener.cpp
index d5067b1..d4ea6c0 100644
--- a/tools/aapt2/flatten/TableFlattener.cpp
+++ b/tools/aapt2/flatten/TableFlattener.cpp
@@ -25,9 +25,9 @@
 
 #include <android-base/macros.h>
 #include <algorithm>
+#include <numeric>
 #include <sstream>
 #include <type_traits>
-#include <numeric>
 
 using namespace android;
 
@@ -37,438 +37,454 @@
 
 template <typename T>
 static bool cmpIds(const T* a, const T* b) {
-    return a->id.value() < b->id.value();
+  return a->id.value() < b->id.value();
 }
 
 static void strcpy16_htod(uint16_t* dst, size_t len, const StringPiece16& src) {
-    if (len == 0) {
-        return;
-    }
+  if (len == 0) {
+    return;
+  }
 
-    size_t i;
-    const char16_t* srcData = src.data();
-    for (i = 0; i < len - 1 && i < src.size(); i++) {
-        dst[i] = util::hostToDevice16((uint16_t) srcData[i]);
-    }
-    dst[i] = 0;
+  size_t i;
+  const char16_t* srcData = src.data();
+  for (i = 0; i < len - 1 && i < src.size(); i++) {
+    dst[i] = util::hostToDevice16((uint16_t)srcData[i]);
+  }
+  dst[i] = 0;
 }
 
 static bool cmpStyleEntries(const Style::Entry& a, const Style::Entry& b) {
-   if (a.key.id) {
-       if (b.key.id) {
-           return a.key.id.value() < b.key.id.value();
-       }
-       return true;
-   } else if (!b.key.id) {
-       return a.key.name.value() < b.key.name.value();
-   }
-   return false;
+  if (a.key.id) {
+    if (b.key.id) {
+      return a.key.id.value() < b.key.id.value();
+    }
+    return true;
+  } else if (!b.key.id) {
+    return a.key.name.value() < b.key.name.value();
+  }
+  return false;
 }
 
 struct FlatEntry {
-    ResourceEntry* entry;
-    Value* value;
+  ResourceEntry* entry;
+  Value* value;
 
-    // The entry string pool index to the entry's name.
-    uint32_t entryKey;
+  // The entry string pool index to the entry's name.
+  uint32_t entryKey;
 };
 
 class MapFlattenVisitor : public RawValueVisitor {
-public:
-    using RawValueVisitor::visit;
+ public:
+  using RawValueVisitor::visit;
 
-    MapFlattenVisitor(ResTable_entry_ext* outEntry, BigBuffer* buffer) :
-            mOutEntry(outEntry), mBuffer(buffer) {
+  MapFlattenVisitor(ResTable_entry_ext* outEntry, BigBuffer* buffer)
+      : mOutEntry(outEntry), mBuffer(buffer) {}
+
+  void visit(Attribute* attr) override {
+    {
+      Reference key = Reference(ResourceId(ResTable_map::ATTR_TYPE));
+      BinaryPrimitive val(Res_value::TYPE_INT_DEC, attr->typeMask);
+      flattenEntry(&key, &val);
     }
 
-    void visit(Attribute* attr) override {
-        {
-            Reference key = Reference(ResourceId(ResTable_map::ATTR_TYPE));
-            BinaryPrimitive val(Res_value::TYPE_INT_DEC, attr->typeMask);
-            flattenEntry(&key, &val);
-        }
-
-        if (attr->minInt != std::numeric_limits<int32_t>::min()) {
-            Reference key = Reference(ResourceId(ResTable_map::ATTR_MIN));
-            BinaryPrimitive val(Res_value::TYPE_INT_DEC, static_cast<uint32_t>(attr->minInt));
-            flattenEntry(&key, &val);
-        }
-
-        if (attr->maxInt != std::numeric_limits<int32_t>::max()) {
-            Reference key = Reference(ResourceId(ResTable_map::ATTR_MAX));
-            BinaryPrimitive val(Res_value::TYPE_INT_DEC, static_cast<uint32_t>(attr->maxInt));
-            flattenEntry(&key, &val);
-        }
-
-        for (Attribute::Symbol& s : attr->symbols) {
-            BinaryPrimitive val(Res_value::TYPE_INT_DEC, s.value);
-            flattenEntry(&s.symbol, &val);
-        }
+    if (attr->minInt != std::numeric_limits<int32_t>::min()) {
+      Reference key = Reference(ResourceId(ResTable_map::ATTR_MIN));
+      BinaryPrimitive val(Res_value::TYPE_INT_DEC,
+                          static_cast<uint32_t>(attr->minInt));
+      flattenEntry(&key, &val);
     }
 
-    void visit(Style* style) override {
-        if (style->parent) {
-            const Reference& parentRef = style->parent.value();
-            assert(parentRef.id && "parent has no ID");
-            mOutEntry->parent.ident = util::hostToDevice32(parentRef.id.value().id);
-        }
-
-        // Sort the style.
-        std::sort(style->entries.begin(), style->entries.end(), cmpStyleEntries);
-
-        for (Style::Entry& entry : style->entries) {
-            flattenEntry(&entry.key, entry.value.get());
-        }
+    if (attr->maxInt != std::numeric_limits<int32_t>::max()) {
+      Reference key = Reference(ResourceId(ResTable_map::ATTR_MAX));
+      BinaryPrimitive val(Res_value::TYPE_INT_DEC,
+                          static_cast<uint32_t>(attr->maxInt));
+      flattenEntry(&key, &val);
     }
 
-    void visit(Styleable* styleable) override {
-        for (auto& attrRef : styleable->entries) {
-            BinaryPrimitive val(Res_value{});
-            flattenEntry(&attrRef, &val);
-        }
+    for (Attribute::Symbol& s : attr->symbols) {
+      BinaryPrimitive val(Res_value::TYPE_INT_DEC, s.value);
+      flattenEntry(&s.symbol, &val);
+    }
+  }
 
+  void visit(Style* style) override {
+    if (style->parent) {
+      const Reference& parentRef = style->parent.value();
+      assert(parentRef.id && "parent has no ID");
+      mOutEntry->parent.ident = util::hostToDevice32(parentRef.id.value().id);
     }
 
-    void visit(Array* array) override {
-        for (auto& item : array->items) {
-            ResTable_map* outEntry = mBuffer->nextBlock<ResTable_map>();
-            flattenValue(item.get(), outEntry);
-            outEntry->value.size = util::hostToDevice16(sizeof(outEntry->value));
-            mEntryCount++;
-        }
+    // Sort the style.
+    std::sort(style->entries.begin(), style->entries.end(), cmpStyleEntries);
+
+    for (Style::Entry& entry : style->entries) {
+      flattenEntry(&entry.key, entry.value.get());
     }
+  }
 
-    void visit(Plural* plural) override {
-        const size_t count = plural->values.size();
-        for (size_t i = 0; i < count; i++) {
-            if (!plural->values[i]) {
-                continue;
-            }
-
-            ResourceId q;
-            switch (i) {
-            case Plural::Zero:
-                q.id = android::ResTable_map::ATTR_ZERO;
-                break;
-
-            case Plural::One:
-                q.id = android::ResTable_map::ATTR_ONE;
-                break;
-
-            case Plural::Two:
-                q.id = android::ResTable_map::ATTR_TWO;
-                break;
-
-            case Plural::Few:
-                q.id = android::ResTable_map::ATTR_FEW;
-                break;
-
-            case Plural::Many:
-                q.id = android::ResTable_map::ATTR_MANY;
-                break;
-
-            case Plural::Other:
-                q.id = android::ResTable_map::ATTR_OTHER;
-                break;
-
-            default:
-                assert(false);
-                break;
-            }
-
-            Reference key(q);
-            flattenEntry(&key, plural->values[i].get());
-        }
+  void visit(Styleable* styleable) override {
+    for (auto& attrRef : styleable->entries) {
+      BinaryPrimitive val(Res_value{});
+      flattenEntry(&attrRef, &val);
     }
+  }
 
-    /**
-     * Call this after visiting a Value. This will finish any work that
-     * needs to be done to prepare the entry.
-     */
-    void finish() {
-        mOutEntry->count = util::hostToDevice32(mEntryCount);
+  void visit(Array* array) override {
+    for (auto& item : array->items) {
+      ResTable_map* outEntry = mBuffer->nextBlock<ResTable_map>();
+      flattenValue(item.get(), outEntry);
+      outEntry->value.size = util::hostToDevice16(sizeof(outEntry->value));
+      mEntryCount++;
     }
+  }
 
-private:
-    void flattenKey(Reference* key, ResTable_map* outEntry) {
-        assert(key->id && "key has no ID");
-        outEntry->name.ident = util::hostToDevice32(key->id.value().id);
+  void visit(Plural* plural) override {
+    const size_t count = plural->values.size();
+    for (size_t i = 0; i < count; i++) {
+      if (!plural->values[i]) {
+        continue;
+      }
+
+      ResourceId q;
+      switch (i) {
+        case Plural::Zero:
+          q.id = android::ResTable_map::ATTR_ZERO;
+          break;
+
+        case Plural::One:
+          q.id = android::ResTable_map::ATTR_ONE;
+          break;
+
+        case Plural::Two:
+          q.id = android::ResTable_map::ATTR_TWO;
+          break;
+
+        case Plural::Few:
+          q.id = android::ResTable_map::ATTR_FEW;
+          break;
+
+        case Plural::Many:
+          q.id = android::ResTable_map::ATTR_MANY;
+          break;
+
+        case Plural::Other:
+          q.id = android::ResTable_map::ATTR_OTHER;
+          break;
+
+        default:
+          assert(false);
+          break;
+      }
+
+      Reference key(q);
+      flattenEntry(&key, plural->values[i].get());
     }
+  }
 
-    void flattenValue(Item* value, ResTable_map* outEntry) {
-        bool result = value->flatten(&outEntry->value);
-        assert(result && "flatten failed");
-    }
+  /**
+   * Call this after visiting a Value. This will finish any work that
+   * needs to be done to prepare the entry.
+   */
+  void finish() { mOutEntry->count = util::hostToDevice32(mEntryCount); }
 
-    void flattenEntry(Reference* key, Item* value) {
-        ResTable_map* outEntry = mBuffer->nextBlock<ResTable_map>();
-        flattenKey(key, outEntry);
-        flattenValue(value, outEntry);
-        outEntry->value.size = util::hostToDevice16(sizeof(outEntry->value));
-        mEntryCount++;
-    }
+ private:
+  void flattenKey(Reference* key, ResTable_map* outEntry) {
+    assert(key->id && "key has no ID");
+    outEntry->name.ident = util::hostToDevice32(key->id.value().id);
+  }
 
-    ResTable_entry_ext* mOutEntry;
-    BigBuffer* mBuffer;
-    size_t mEntryCount = 0;
+  void flattenValue(Item* value, ResTable_map* outEntry) {
+    bool result = value->flatten(&outEntry->value);
+    assert(result && "flatten failed");
+  }
+
+  void flattenEntry(Reference* key, Item* value) {
+    ResTable_map* outEntry = mBuffer->nextBlock<ResTable_map>();
+    flattenKey(key, outEntry);
+    flattenValue(value, outEntry);
+    outEntry->value.size = util::hostToDevice16(sizeof(outEntry->value));
+    mEntryCount++;
+  }
+
+  ResTable_entry_ext* mOutEntry;
+  BigBuffer* mBuffer;
+  size_t mEntryCount = 0;
 };
 
 class PackageFlattener {
-public:
-    PackageFlattener(IDiagnostics* diag, ResourceTablePackage* package) :
-            mDiag(diag), mPackage(package) {
+ public:
+  PackageFlattener(IDiagnostics* diag, ResourceTablePackage* package)
+      : mDiag(diag), mPackage(package) {}
+
+  bool flattenPackage(BigBuffer* buffer) {
+    ChunkWriter pkgWriter(buffer);
+    ResTable_package* pkgHeader =
+        pkgWriter.startChunk<ResTable_package>(RES_TABLE_PACKAGE_TYPE);
+    pkgHeader->id = util::hostToDevice32(mPackage->id.value());
+
+    if (mPackage->name.size() >= arraysize(pkgHeader->name)) {
+      mDiag->error(DiagMessage() << "package name '" << mPackage->name
+                                 << "' is too long");
+      return false;
     }
 
-    bool flattenPackage(BigBuffer* buffer) {
-        ChunkWriter pkgWriter(buffer);
-        ResTable_package* pkgHeader = pkgWriter.startChunk<ResTable_package>(
-                RES_TABLE_PACKAGE_TYPE);
-        pkgHeader->id = util::hostToDevice32(mPackage->id.value());
+    // Copy the package name in device endianness.
+    strcpy16_htod(pkgHeader->name, arraysize(pkgHeader->name),
+                  util::utf8ToUtf16(mPackage->name));
 
-        if (mPackage->name.size() >= arraysize(pkgHeader->name)) {
-            mDiag->error(DiagMessage() <<
-                         "package name '" << mPackage->name << "' is too long");
-            return false;
-        }
+    // Serialize the types. We do this now so that our type and key strings
+    // are populated. We write those first.
+    BigBuffer typeBuffer(1024);
+    flattenTypes(&typeBuffer);
 
-        // Copy the package name in device endianness.
-        strcpy16_htod(pkgHeader->name, arraysize(pkgHeader->name),
-                      util::utf8ToUtf16(mPackage->name));
+    pkgHeader->typeStrings = util::hostToDevice32(pkgWriter.size());
+    StringPool::flattenUtf16(pkgWriter.getBuffer(), mTypePool);
 
-        // Serialize the types. We do this now so that our type and key strings
-        // are populated. We write those first.
-        BigBuffer typeBuffer(1024);
-        flattenTypes(&typeBuffer);
+    pkgHeader->keyStrings = util::hostToDevice32(pkgWriter.size());
+    StringPool::flattenUtf8(pkgWriter.getBuffer(), mKeyPool);
 
-        pkgHeader->typeStrings = util::hostToDevice32(pkgWriter.size());
-        StringPool::flattenUtf16(pkgWriter.getBuffer(), mTypePool);
+    // Append the types.
+    buffer->appendBuffer(std::move(typeBuffer));
 
-        pkgHeader->keyStrings = util::hostToDevice32(pkgWriter.size());
-        StringPool::flattenUtf8(pkgWriter.getBuffer(), mKeyPool);
+    pkgWriter.finish();
+    return true;
+  }
 
-        // Append the types.
-        buffer->appendBuffer(std::move(typeBuffer));
+ private:
+  IDiagnostics* mDiag;
+  ResourceTablePackage* mPackage;
+  StringPool mTypePool;
+  StringPool mKeyPool;
 
-        pkgWriter.finish();
-        return true;
-    }
-
-private:
-    IDiagnostics* mDiag;
-    ResourceTablePackage* mPackage;
-    StringPool mTypePool;
-    StringPool mKeyPool;
-
-    template <typename T, bool IsItem>
-    T* writeEntry(FlatEntry* entry, BigBuffer* buffer) {
-        static_assert(std::is_same<ResTable_entry, T>::value ||
+  template <typename T, bool IsItem>
+  T* writeEntry(FlatEntry* entry, BigBuffer* buffer) {
+    static_assert(std::is_same<ResTable_entry, T>::value ||
                       std::is_same<ResTable_entry_ext, T>::value,
-                      "T must be ResTable_entry or ResTable_entry_ext");
+                  "T must be ResTable_entry or ResTable_entry_ext");
 
-        T* result = buffer->nextBlock<T>();
-        ResTable_entry* outEntry = (ResTable_entry*)(result);
-        if (entry->entry->symbolStatus.state == SymbolState::kPublic) {
-            outEntry->flags |= ResTable_entry::FLAG_PUBLIC;
-        }
-
-        if (entry->value->isWeak()) {
-            outEntry->flags |= ResTable_entry::FLAG_WEAK;
-        }
-
-        if (!IsItem) {
-            outEntry->flags |= ResTable_entry::FLAG_COMPLEX;
-        }
-
-        outEntry->flags = util::hostToDevice16(outEntry->flags);
-        outEntry->key.index = util::hostToDevice32(entry->entryKey);
-        outEntry->size = util::hostToDevice16(sizeof(T));
-        return result;
+    T* result = buffer->nextBlock<T>();
+    ResTable_entry* outEntry = (ResTable_entry*)(result);
+    if (entry->entry->symbolStatus.state == SymbolState::kPublic) {
+      outEntry->flags |= ResTable_entry::FLAG_PUBLIC;
     }
 
-    bool flattenValue(FlatEntry* entry, BigBuffer* buffer) {
-        if (Item* item = valueCast<Item>(entry->value)) {
-            writeEntry<ResTable_entry, true>(entry, buffer);
-            Res_value* outValue = buffer->nextBlock<Res_value>();
-            bool result = item->flatten(outValue);
-            assert(result && "flatten failed");
-            outValue->size = util::hostToDevice16(sizeof(*outValue));
-        } else {
-            ResTable_entry_ext* outEntry = writeEntry<ResTable_entry_ext, false>(entry, buffer);
-            MapFlattenVisitor visitor(outEntry, buffer);
-            entry->value->accept(&visitor);
-            visitor.finish();
-        }
-        return true;
+    if (entry->value->isWeak()) {
+      outEntry->flags |= ResTable_entry::FLAG_WEAK;
     }
 
-    bool flattenConfig(const ResourceTableType* type, const ConfigDescription& config,
-                       std::vector<FlatEntry>* entries, BigBuffer* buffer) {
-        ChunkWriter typeWriter(buffer);
-        ResTable_type* typeHeader = typeWriter.startChunk<ResTable_type>(RES_TABLE_TYPE_TYPE);
-        typeHeader->id = type->id.value();
-        typeHeader->config = config;
-        typeHeader->config.swapHtoD();
-
-        auto maxAccum = [](uint32_t max, const std::unique_ptr<ResourceEntry>& a) -> uint32_t {
-            return std::max(max, (uint32_t) a->id.value());
-        };
-
-        // Find the largest entry ID. That is how many entries we will have.
-        const uint32_t entryCount =
-                std::accumulate(type->entries.begin(), type->entries.end(), 0, maxAccum) + 1;
-
-        typeHeader->entryCount = util::hostToDevice32(entryCount);
-        uint32_t* indices = typeWriter.nextBlock<uint32_t>(entryCount);
-
-        assert((size_t) entryCount <= std::numeric_limits<uint16_t>::max() + 1);
-        memset(indices, 0xff, entryCount * sizeof(uint32_t));
-
-        typeHeader->entriesStart = util::hostToDevice32(typeWriter.size());
-
-        const size_t entryStart = typeWriter.getBuffer()->size();
-        for (FlatEntry& flatEntry : *entries) {
-            assert(flatEntry.entry->id.value() < entryCount);
-            indices[flatEntry.entry->id.value()] = util::hostToDevice32(
-                    typeWriter.getBuffer()->size() - entryStart);
-            if (!flattenValue(&flatEntry, typeWriter.getBuffer())) {
-                mDiag->error(DiagMessage()
-                             << "failed to flatten resource '"
-                             << ResourceNameRef(mPackage->name, type->type, flatEntry.entry->name)
-                             << "' for configuration '" << config << "'");
-                return false;
-            }
-        }
-        typeWriter.finish();
-        return true;
+    if (!IsItem) {
+      outEntry->flags |= ResTable_entry::FLAG_COMPLEX;
     }
 
-    std::vector<ResourceTableType*> collectAndSortTypes() {
-        std::vector<ResourceTableType*> sortedTypes;
-        for (auto& type : mPackage->types) {
-            if (type->type == ResourceType::kStyleable) {
-                // Styleables aren't real Resource Types, they are represented in the R.java
-                // file.
-                continue;
-            }
+    outEntry->flags = util::hostToDevice16(outEntry->flags);
+    outEntry->key.index = util::hostToDevice32(entry->entryKey);
+    outEntry->size = util::hostToDevice16(sizeof(T));
+    return result;
+  }
 
-            assert(type->id && "type must have an ID set");
+  bool flattenValue(FlatEntry* entry, BigBuffer* buffer) {
+    if (Item* item = valueCast<Item>(entry->value)) {
+      writeEntry<ResTable_entry, true>(entry, buffer);
+      Res_value* outValue = buffer->nextBlock<Res_value>();
+      bool result = item->flatten(outValue);
+      assert(result && "flatten failed");
+      outValue->size = util::hostToDevice16(sizeof(*outValue));
+    } else {
+      ResTable_entry_ext* outEntry =
+          writeEntry<ResTable_entry_ext, false>(entry, buffer);
+      MapFlattenVisitor visitor(outEntry, buffer);
+      entry->value->accept(&visitor);
+      visitor.finish();
+    }
+    return true;
+  }
 
-            sortedTypes.push_back(type.get());
-        }
-        std::sort(sortedTypes.begin(), sortedTypes.end(), cmpIds<ResourceTableType>);
-        return sortedTypes;
+  bool flattenConfig(const ResourceTableType* type,
+                     const ConfigDescription& config,
+                     std::vector<FlatEntry>* entries, BigBuffer* buffer) {
+    ChunkWriter typeWriter(buffer);
+    ResTable_type* typeHeader =
+        typeWriter.startChunk<ResTable_type>(RES_TABLE_TYPE_TYPE);
+    typeHeader->id = type->id.value();
+    typeHeader->config = config;
+    typeHeader->config.swapHtoD();
+
+    auto maxAccum = [](uint32_t max,
+                       const std::unique_ptr<ResourceEntry>& a) -> uint32_t {
+      return std::max(max, (uint32_t)a->id.value());
+    };
+
+    // Find the largest entry ID. That is how many entries we will have.
+    const uint32_t entryCount =
+        std::accumulate(type->entries.begin(), type->entries.end(), 0,
+                        maxAccum) +
+        1;
+
+    typeHeader->entryCount = util::hostToDevice32(entryCount);
+    uint32_t* indices = typeWriter.nextBlock<uint32_t>(entryCount);
+
+    assert((size_t)entryCount <= std::numeric_limits<uint16_t>::max() + 1);
+    memset(indices, 0xff, entryCount * sizeof(uint32_t));
+
+    typeHeader->entriesStart = util::hostToDevice32(typeWriter.size());
+
+    const size_t entryStart = typeWriter.getBuffer()->size();
+    for (FlatEntry& flatEntry : *entries) {
+      assert(flatEntry.entry->id.value() < entryCount);
+      indices[flatEntry.entry->id.value()] =
+          util::hostToDevice32(typeWriter.getBuffer()->size() - entryStart);
+      if (!flattenValue(&flatEntry, typeWriter.getBuffer())) {
+        mDiag->error(DiagMessage()
+                     << "failed to flatten resource '"
+                     << ResourceNameRef(mPackage->name, type->type,
+                                        flatEntry.entry->name)
+                     << "' for configuration '" << config << "'");
+        return false;
+      }
+    }
+    typeWriter.finish();
+    return true;
+  }
+
+  std::vector<ResourceTableType*> collectAndSortTypes() {
+    std::vector<ResourceTableType*> sortedTypes;
+    for (auto& type : mPackage->types) {
+      if (type->type == ResourceType::kStyleable) {
+        // Styleables aren't real Resource Types, they are represented in the
+        // R.java
+        // file.
+        continue;
+      }
+
+      assert(type->id && "type must have an ID set");
+
+      sortedTypes.push_back(type.get());
+    }
+    std::sort(sortedTypes.begin(), sortedTypes.end(),
+              cmpIds<ResourceTableType>);
+    return sortedTypes;
+  }
+
+  std::vector<ResourceEntry*> collectAndSortEntries(ResourceTableType* type) {
+    // Sort the entries by entry ID.
+    std::vector<ResourceEntry*> sortedEntries;
+    for (auto& entry : type->entries) {
+      assert(entry->id && "entry must have an ID set");
+      sortedEntries.push_back(entry.get());
+    }
+    std::sort(sortedEntries.begin(), sortedEntries.end(),
+              cmpIds<ResourceEntry>);
+    return sortedEntries;
+  }
+
+  bool flattenTypeSpec(ResourceTableType* type,
+                       std::vector<ResourceEntry*>* sortedEntries,
+                       BigBuffer* buffer) {
+    ChunkWriter typeSpecWriter(buffer);
+    ResTable_typeSpec* specHeader =
+        typeSpecWriter.startChunk<ResTable_typeSpec>(RES_TABLE_TYPE_SPEC_TYPE);
+    specHeader->id = type->id.value();
+
+    if (sortedEntries->empty()) {
+      typeSpecWriter.finish();
+      return true;
     }
 
-    std::vector<ResourceEntry*> collectAndSortEntries(ResourceTableType* type) {
-        // Sort the entries by entry ID.
-        std::vector<ResourceEntry*> sortedEntries;
-        for (auto& entry : type->entries) {
-            assert(entry->id && "entry must have an ID set");
-            sortedEntries.push_back(entry.get());
+    // We can't just take the size of the vector. There may be holes in the
+    // entry ID space.
+    // Since the entries are sorted by ID, the last one will be the biggest.
+    const size_t numEntries = sortedEntries->back()->id.value() + 1;
+
+    specHeader->entryCount = util::hostToDevice32(numEntries);
+
+    // Reserve space for the masks of each resource in this type. These
+    // show for which configuration axis the resource changes.
+    uint32_t* configMasks = typeSpecWriter.nextBlock<uint32_t>(numEntries);
+
+    const size_t actualNumEntries = sortedEntries->size();
+    for (size_t entryIndex = 0; entryIndex < actualNumEntries; entryIndex++) {
+      ResourceEntry* entry = sortedEntries->at(entryIndex);
+
+      // Populate the config masks for this entry.
+
+      if (entry->symbolStatus.state == SymbolState::kPublic) {
+        configMasks[entry->id.value()] |=
+            util::hostToDevice32(ResTable_typeSpec::SPEC_PUBLIC);
+      }
+
+      const size_t configCount = entry->values.size();
+      for (size_t i = 0; i < configCount; i++) {
+        const ConfigDescription& config = entry->values[i]->config;
+        for (size_t j = i + 1; j < configCount; j++) {
+          configMasks[entry->id.value()] |=
+              util::hostToDevice32(config.diff(entry->values[j]->config));
         }
-        std::sort(sortedEntries.begin(), sortedEntries.end(), cmpIds<ResourceEntry>);
-        return sortedEntries;
+      }
     }
+    typeSpecWriter.finish();
+    return true;
+  }
 
-    bool flattenTypeSpec(ResourceTableType* type, std::vector<ResourceEntry*>* sortedEntries,
-                         BigBuffer* buffer) {
-        ChunkWriter typeSpecWriter(buffer);
-        ResTable_typeSpec* specHeader = typeSpecWriter.startChunk<ResTable_typeSpec>(
-                RES_TABLE_TYPE_SPEC_TYPE);
-        specHeader->id = type->id.value();
+  bool flattenTypes(BigBuffer* buffer) {
+    // Sort the types by their IDs. They will be inserted into the StringPool in
+    // this order.
+    std::vector<ResourceTableType*> sortedTypes = collectAndSortTypes();
 
-        if (sortedEntries->empty()) {
-            typeSpecWriter.finish();
-            return true;
+    size_t expectedTypeId = 1;
+    for (ResourceTableType* type : sortedTypes) {
+      // If there is a gap in the type IDs, fill in the StringPool
+      // with empty values until we reach the ID we expect.
+      while (type->id.value() > expectedTypeId) {
+        std::stringstream typeName;
+        typeName << "?" << expectedTypeId;
+        mTypePool.makeRef(typeName.str());
+        expectedTypeId++;
+      }
+      expectedTypeId++;
+      mTypePool.makeRef(toString(type->type));
+
+      std::vector<ResourceEntry*> sortedEntries = collectAndSortEntries(type);
+
+      if (!flattenTypeSpec(type, &sortedEntries, buffer)) {
+        return false;
+      }
+
+      // The binary resource table lists resource entries for each
+      // configuration.
+      // We store them inverted, where a resource entry lists the values for
+      // each
+      // configuration available. Here we reverse this to match the binary
+      // table.
+      std::map<ConfigDescription, std::vector<FlatEntry>> configToEntryListMap;
+      for (ResourceEntry* entry : sortedEntries) {
+        const uint32_t keyIndex =
+            (uint32_t)mKeyPool.makeRef(entry->name).getIndex();
+
+        // Group values by configuration.
+        for (auto& configValue : entry->values) {
+          configToEntryListMap[configValue->config].push_back(
+              FlatEntry{entry, configValue->value.get(), keyIndex});
         }
+      }
 
-        // We can't just take the size of the vector. There may be holes in the entry ID space.
-        // Since the entries are sorted by ID, the last one will be the biggest.
-        const size_t numEntries = sortedEntries->back()->id.value() + 1;
-
-        specHeader->entryCount = util::hostToDevice32(numEntries);
-
-        // Reserve space for the masks of each resource in this type. These
-        // show for which configuration axis the resource changes.
-        uint32_t* configMasks = typeSpecWriter.nextBlock<uint32_t>(numEntries);
-
-        const size_t actualNumEntries = sortedEntries->size();
-        for (size_t entryIndex = 0; entryIndex < actualNumEntries; entryIndex++) {
-            ResourceEntry* entry = sortedEntries->at(entryIndex);
-
-            // Populate the config masks for this entry.
-
-            if (entry->symbolStatus.state == SymbolState::kPublic) {
-                configMasks[entry->id.value()] |=
-                        util::hostToDevice32(ResTable_typeSpec::SPEC_PUBLIC);
-            }
-
-            const size_t configCount = entry->values.size();
-            for (size_t i = 0; i < configCount; i++) {
-                const ConfigDescription& config = entry->values[i]->config;
-                for (size_t j = i + 1; j < configCount; j++) {
-                    configMasks[entry->id.value()] |= util::hostToDevice32(
-                            config.diff(entry->values[j]->config));
-                }
-            }
+      // Flatten a configuration value.
+      for (auto& entry : configToEntryListMap) {
+        if (!flattenConfig(type, entry.first, &entry.second, buffer)) {
+          return false;
         }
-        typeSpecWriter.finish();
-        return true;
+      }
     }
-
-    bool flattenTypes(BigBuffer* buffer) {
-        // Sort the types by their IDs. They will be inserted into the StringPool in this order.
-        std::vector<ResourceTableType*> sortedTypes = collectAndSortTypes();
-
-        size_t expectedTypeId = 1;
-        for (ResourceTableType* type : sortedTypes) {
-            // If there is a gap in the type IDs, fill in the StringPool
-            // with empty values until we reach the ID we expect.
-            while (type->id.value() > expectedTypeId) {
-                std::stringstream typeName;
-                typeName << "?" << expectedTypeId;
-                mTypePool.makeRef(typeName.str());
-                expectedTypeId++;
-            }
-            expectedTypeId++;
-            mTypePool.makeRef(toString(type->type));
-
-            std::vector<ResourceEntry*> sortedEntries = collectAndSortEntries(type);
-
-            if (!flattenTypeSpec(type, &sortedEntries, buffer)) {
-                return false;
-            }
-
-            // The binary resource table lists resource entries for each configuration.
-            // We store them inverted, where a resource entry lists the values for each
-            // configuration available. Here we reverse this to match the binary table.
-            std::map<ConfigDescription, std::vector<FlatEntry>> configToEntryListMap;
-            for (ResourceEntry* entry : sortedEntries) {
-                const uint32_t keyIndex = (uint32_t) mKeyPool.makeRef(entry->name).getIndex();
-
-                // Group values by configuration.
-                for (auto& configValue : entry->values) {
-                    configToEntryListMap[configValue->config].push_back(FlatEntry{
-                            entry, configValue->value.get(), keyIndex });
-                }
-            }
-
-            // Flatten a configuration value.
-            for (auto& entry : configToEntryListMap) {
-                if (!flattenConfig(type, entry.first, &entry.second, buffer)) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
+    return true;
+  }
 };
 
-} // namespace
+}  // namespace
 
 bool TableFlattener::consume(IAaptContext* context, ResourceTable* table) {
-    // We must do this before writing the resources, since the string pool IDs may change.
-    table->stringPool.sort([](const StringPool::Entry& a, const StringPool::Entry& b) -> bool {
+  // We must do this before writing the resources, since the string pool IDs may
+  // change.
+  table->stringPool.sort(
+      [](const StringPool::Entry& a, const StringPool::Entry& b) -> bool {
         int diff = a.context.priority - b.context.priority;
         if (diff < 0) return true;
         if (diff > 0) return false;
@@ -476,31 +492,32 @@
         if (diff < 0) return true;
         if (diff > 0) return false;
         return a.value < b.value;
-    });
-    table->stringPool.prune();
+      });
+  table->stringPool.prune();
 
-    // Write the ResTable header.
-    ChunkWriter tableWriter(mBuffer);
-    ResTable_header* tableHeader = tableWriter.startChunk<ResTable_header>(RES_TABLE_TYPE);
-    tableHeader->packageCount = util::hostToDevice32(table->packages.size());
+  // Write the ResTable header.
+  ChunkWriter tableWriter(mBuffer);
+  ResTable_header* tableHeader =
+      tableWriter.startChunk<ResTable_header>(RES_TABLE_TYPE);
+  tableHeader->packageCount = util::hostToDevice32(table->packages.size());
 
-    // Flatten the values string pool.
-    StringPool::flattenUtf8(tableWriter.getBuffer(), table->stringPool);
+  // Flatten the values string pool.
+  StringPool::flattenUtf8(tableWriter.getBuffer(), table->stringPool);
 
-    BigBuffer packageBuffer(1024);
+  BigBuffer packageBuffer(1024);
 
-    // Flatten each package.
-    for (auto& package : table->packages) {
-        PackageFlattener flattener(context->getDiagnostics(), package.get());
-        if (!flattener.flattenPackage(&packageBuffer)) {
-            return false;
-        }
+  // Flatten each package.
+  for (auto& package : table->packages) {
+    PackageFlattener flattener(context->getDiagnostics(), package.get());
+    if (!flattener.flattenPackage(&packageBuffer)) {
+      return false;
     }
+  }
 
-    // Finally merge all the packages into the main buffer.
-    tableWriter.getBuffer()->appendBuffer(std::move(packageBuffer));
-    tableWriter.finish();
-    return true;
+  // Finally merge all the packages into the main buffer.
+  tableWriter.getBuffer()->appendBuffer(std::move(packageBuffer));
+  tableWriter.finish();
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/flatten/TableFlattener.h b/tools/aapt2/flatten/TableFlattener.h
index b416f20..91f9654 100644
--- a/tools/aapt2/flatten/TableFlattener.h
+++ b/tools/aapt2/flatten/TableFlattener.h
@@ -25,16 +25,15 @@
 class ResourceTable;
 
 class TableFlattener : public IResourceTableConsumer {
-public:
-    explicit TableFlattener(BigBuffer* buffer) : mBuffer(buffer) {
-    }
+ public:
+  explicit TableFlattener(BigBuffer* buffer) : mBuffer(buffer) {}
 
-    bool consume(IAaptContext* context, ResourceTable* table) override;
+  bool consume(IAaptContext* context, ResourceTable* table) override;
 
-private:
-    BigBuffer* mBuffer;
+ private:
+  BigBuffer* mBuffer;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_FLATTEN_TABLEFLATTENER_H */
diff --git a/tools/aapt2/flatten/TableFlattener_test.cpp b/tools/aapt2/flatten/TableFlattener_test.cpp
index b25bfa7..a7706bd 100644
--- a/tools/aapt2/flatten/TableFlattener_test.cpp
+++ b/tools/aapt2/flatten/TableFlattener_test.cpp
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-#include "ResourceUtils.h"
 #include "flatten/TableFlattener.h"
+#include "ResourceUtils.h"
 #include "test/Test.h"
 #include "unflatten/BinaryResourceParser.h"
 #include "util/Util.h"
@@ -25,195 +25,207 @@
 namespace aapt {
 
 class TableFlattenerTest : public ::testing::Test {
-public:
-    void SetUp() override {
-        mContext = test::ContextBuilder()
-                .setCompilationPackage("com.app.test")
-                .setPackageId(0x7f)
-                .build();
+ public:
+  void SetUp() override {
+    mContext = test::ContextBuilder()
+                   .setCompilationPackage("com.app.test")
+                   .setPackageId(0x7f)
+                   .build();
+  }
+
+  ::testing::AssertionResult flatten(ResourceTable* table, ResTable* outTable) {
+    BigBuffer buffer(1024);
+    TableFlattener flattener(&buffer);
+    if (!flattener.consume(mContext.get(), table)) {
+      return ::testing::AssertionFailure() << "failed to flatten ResourceTable";
     }
 
-    ::testing::AssertionResult flatten(ResourceTable* table, ResTable* outTable) {
-        BigBuffer buffer(1024);
-        TableFlattener flattener(&buffer);
-        if (!flattener.consume(mContext.get(), table)) {
-            return ::testing::AssertionFailure() << "failed to flatten ResourceTable";
-        }
+    std::unique_ptr<uint8_t[]> data = util::copy(buffer);
+    if (outTable->add(data.get(), buffer.size(), -1, true) != NO_ERROR) {
+      return ::testing::AssertionFailure() << "flattened ResTable is corrupt";
+    }
+    return ::testing::AssertionSuccess();
+  }
 
-        std::unique_ptr<uint8_t[]> data = util::copy(buffer);
-        if (outTable->add(data.get(), buffer.size(), -1, true) != NO_ERROR) {
-            return ::testing::AssertionFailure() << "flattened ResTable is corrupt";
-        }
-        return ::testing::AssertionSuccess();
+  ::testing::AssertionResult flatten(ResourceTable* table,
+                                     ResourceTable* outTable) {
+    BigBuffer buffer(1024);
+    TableFlattener flattener(&buffer);
+    if (!flattener.consume(mContext.get(), table)) {
+      return ::testing::AssertionFailure() << "failed to flatten ResourceTable";
     }
 
-    ::testing::AssertionResult flatten(ResourceTable* table, ResourceTable* outTable) {
-        BigBuffer buffer(1024);
-        TableFlattener flattener(&buffer);
-        if (!flattener.consume(mContext.get(), table)) {
-            return ::testing::AssertionFailure() << "failed to flatten ResourceTable";
-        }
+    std::unique_ptr<uint8_t[]> data = util::copy(buffer);
+    BinaryResourceParser parser(mContext.get(), outTable, {}, data.get(),
+                                buffer.size());
+    if (!parser.parse()) {
+      return ::testing::AssertionFailure() << "flattened ResTable is corrupt";
+    }
+    return ::testing::AssertionSuccess();
+  }
 
-        std::unique_ptr<uint8_t[]> data = util::copy(buffer);
-        BinaryResourceParser parser(mContext.get(), outTable, {}, data.get(), buffer.size());
-        if (!parser.parse()) {
-            return ::testing::AssertionFailure() << "flattened ResTable is corrupt";
-        }
-        return ::testing::AssertionSuccess();
+  ::testing::AssertionResult exists(ResTable* table,
+                                    const StringPiece& expectedName,
+                                    const ResourceId& expectedId,
+                                    const ConfigDescription& expectedConfig,
+                                    const uint8_t expectedDataType,
+                                    const uint32_t expectedData,
+                                    const uint32_t expectedSpecFlags) {
+    const ResourceName expectedResName = test::parseNameOrDie(expectedName);
+
+    table->setParameters(&expectedConfig);
+
+    ResTable_config config;
+    Res_value val;
+    uint32_t specFlags;
+    if (table->getResource(expectedId.id, &val, false, 0, &specFlags, &config) <
+        0) {
+      return ::testing::AssertionFailure() << "could not find resource with";
     }
 
-    ::testing::AssertionResult exists(ResTable* table,
-                                      const StringPiece& expectedName,
-                                      const ResourceId& expectedId,
-                                      const ConfigDescription& expectedConfig,
-                                      const uint8_t expectedDataType, const uint32_t expectedData,
-                                      const uint32_t expectedSpecFlags) {
-        const ResourceName expectedResName = test::parseNameOrDie(expectedName);
-
-        table->setParameters(&expectedConfig);
-
-        ResTable_config config;
-        Res_value val;
-        uint32_t specFlags;
-        if (table->getResource(expectedId.id, &val, false, 0, &specFlags, &config) < 0) {
-            return ::testing::AssertionFailure() << "could not find resource with";
-        }
-
-        if (expectedDataType != val.dataType) {
-            return ::testing::AssertionFailure()
-                    << "expected data type "
-                    << std::hex << (int) expectedDataType << " but got data type "
-                    << (int) val.dataType << std::dec << " instead";
-        }
-
-        if (expectedData != val.data) {
-            return ::testing::AssertionFailure()
-                    << "expected data "
-                    << std::hex << expectedData << " but got data "
-                    << val.data << std::dec << " instead";
-        }
-
-        if (expectedSpecFlags != specFlags) {
-            return ::testing::AssertionFailure()
-                    << "expected specFlags "
-                    << std::hex << expectedSpecFlags << " but got specFlags "
-                    << specFlags << std::dec << " instead";
-        }
-
-        ResTable::resource_name actualName;
-        if (!table->getResourceName(expectedId.id, false, &actualName)) {
-            return ::testing::AssertionFailure() << "failed to find resource name";
-        }
-
-        Maybe<ResourceName> resName = ResourceUtils::toResourceName(actualName);
-        if (!resName) {
-            return ::testing::AssertionFailure()
-                    << "expected name '" << expectedResName << "' but got '"
-                    << StringPiece16(actualName.package, actualName.packageLen)
-                    << ":"
-                    << StringPiece16(actualName.type, actualName.typeLen)
-                    << "/"
-                    << StringPiece16(actualName.name, actualName.nameLen)
-                    << "'";
-        }
-
-        if (expectedConfig != config) {
-            return ::testing::AssertionFailure()
-                    << "expected config '" << expectedConfig << "' but got '"
-                    << ConfigDescription(config) << "'";
-        }
-        return ::testing::AssertionSuccess();
+    if (expectedDataType != val.dataType) {
+      return ::testing::AssertionFailure()
+             << "expected data type " << std::hex << (int)expectedDataType
+             << " but got data type " << (int)val.dataType << std::dec
+             << " instead";
     }
 
-private:
-    std::unique_ptr<IAaptContext> mContext;
+    if (expectedData != val.data) {
+      return ::testing::AssertionFailure()
+             << "expected data " << std::hex << expectedData << " but got data "
+             << val.data << std::dec << " instead";
+    }
+
+    if (expectedSpecFlags != specFlags) {
+      return ::testing::AssertionFailure()
+             << "expected specFlags " << std::hex << expectedSpecFlags
+             << " but got specFlags " << specFlags << std::dec << " instead";
+    }
+
+    ResTable::resource_name actualName;
+    if (!table->getResourceName(expectedId.id, false, &actualName)) {
+      return ::testing::AssertionFailure() << "failed to find resource name";
+    }
+
+    Maybe<ResourceName> resName = ResourceUtils::toResourceName(actualName);
+    if (!resName) {
+      return ::testing::AssertionFailure()
+             << "expected name '" << expectedResName << "' but got '"
+             << StringPiece16(actualName.package, actualName.packageLen) << ":"
+             << StringPiece16(actualName.type, actualName.typeLen) << "/"
+             << StringPiece16(actualName.name, actualName.nameLen) << "'";
+    }
+
+    if (expectedConfig != config) {
+      return ::testing::AssertionFailure() << "expected config '"
+                                           << expectedConfig << "' but got '"
+                                           << ConfigDescription(config) << "'";
+    }
+    return ::testing::AssertionSuccess();
+  }
+
+ private:
+  std::unique_ptr<IAaptContext> mContext;
 };
 
 TEST_F(TableFlattenerTest, FlattenFullyLinkedTable) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId("com.app.test", 0x7f)
-            .addSimple("com.app.test:id/one", ResourceId(0x7f020000))
-            .addSimple("com.app.test:id/two", ResourceId(0x7f020001))
-            .addValue("com.app.test:id/three", ResourceId(0x7f020002),
-                      test::buildReference("com.app.test:id/one", ResourceId(0x7f020000)))
-            .addValue("com.app.test:integer/one", ResourceId(0x7f030000),
-                      util::make_unique<BinaryPrimitive>(uint8_t(Res_value::TYPE_INT_DEC), 1u))
-            .addValue("com.app.test:integer/one", test::parseConfigOrDie("v1"),
-                      ResourceId(0x7f030000),
-                      util::make_unique<BinaryPrimitive>(uint8_t(Res_value::TYPE_INT_DEC), 2u))
-            .addString("com.app.test:string/test", ResourceId(0x7f040000), "foo")
-            .addString("com.app.test:layout/bar", ResourceId(0x7f050000), "res/layout/bar.xml")
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.test", 0x7f)
+          .addSimple("com.app.test:id/one", ResourceId(0x7f020000))
+          .addSimple("com.app.test:id/two", ResourceId(0x7f020001))
+          .addValue("com.app.test:id/three", ResourceId(0x7f020002),
+                    test::buildReference("com.app.test:id/one",
+                                         ResourceId(0x7f020000)))
+          .addValue("com.app.test:integer/one", ResourceId(0x7f030000),
+                    util::make_unique<BinaryPrimitive>(
+                        uint8_t(Res_value::TYPE_INT_DEC), 1u))
+          .addValue("com.app.test:integer/one", test::parseConfigOrDie("v1"),
+                    ResourceId(0x7f030000),
+                    util::make_unique<BinaryPrimitive>(
+                        uint8_t(Res_value::TYPE_INT_DEC), 2u))
+          .addString("com.app.test:string/test", ResourceId(0x7f040000), "foo")
+          .addString("com.app.test:layout/bar", ResourceId(0x7f050000),
+                     "res/layout/bar.xml")
+          .build();
 
-    ResTable resTable;
-    ASSERT_TRUE(flatten(table.get(), &resTable));
+  ResTable resTable;
+  ASSERT_TRUE(flatten(table.get(), &resTable));
 
-    EXPECT_TRUE(exists(&resTable, "com.app.test:id/one", ResourceId(0x7f020000), {},
-                       Res_value::TYPE_INT_BOOLEAN, 0u, 0u));
+  EXPECT_TRUE(exists(&resTable, "com.app.test:id/one", ResourceId(0x7f020000),
+                     {}, Res_value::TYPE_INT_BOOLEAN, 0u, 0u));
 
-    EXPECT_TRUE(exists(&resTable, "com.app.test:id/two", ResourceId(0x7f020001), {},
-                       Res_value::TYPE_INT_BOOLEAN, 0u, 0u));
+  EXPECT_TRUE(exists(&resTable, "com.app.test:id/two", ResourceId(0x7f020001),
+                     {}, Res_value::TYPE_INT_BOOLEAN, 0u, 0u));
 
-    EXPECT_TRUE(exists(&resTable, "com.app.test:id/three", ResourceId(0x7f020002), {},
-                       Res_value::TYPE_REFERENCE, 0x7f020000u, 0u));
+  EXPECT_TRUE(exists(&resTable, "com.app.test:id/three", ResourceId(0x7f020002),
+                     {}, Res_value::TYPE_REFERENCE, 0x7f020000u, 0u));
 
-    EXPECT_TRUE(exists(&resTable, "com.app.test:integer/one", ResourceId(0x7f030000),
-                       {}, Res_value::TYPE_INT_DEC, 1u,
-                       ResTable_config::CONFIG_VERSION));
+  EXPECT_TRUE(exists(&resTable, "com.app.test:integer/one",
+                     ResourceId(0x7f030000), {}, Res_value::TYPE_INT_DEC, 1u,
+                     ResTable_config::CONFIG_VERSION));
 
-    EXPECT_TRUE(exists(&resTable, "com.app.test:integer/one", ResourceId(0x7f030000),
-                       test::parseConfigOrDie("v1"), Res_value::TYPE_INT_DEC, 2u,
-                       ResTable_config::CONFIG_VERSION));
+  EXPECT_TRUE(exists(&resTable, "com.app.test:integer/one",
+                     ResourceId(0x7f030000), test::parseConfigOrDie("v1"),
+                     Res_value::TYPE_INT_DEC, 2u,
+                     ResTable_config::CONFIG_VERSION));
 
-    std::u16string fooStr = u"foo";
-    ssize_t idx = resTable.getTableStringBlock(0)->indexOfString(fooStr.data(), fooStr.size());
-    ASSERT_GE(idx, 0);
-    EXPECT_TRUE(exists(&resTable, "com.app.test:string/test", ResourceId(0x7f040000),
-                       {}, Res_value::TYPE_STRING, (uint32_t) idx, 0u));
+  std::u16string fooStr = u"foo";
+  ssize_t idx = resTable.getTableStringBlock(0)->indexOfString(fooStr.data(),
+                                                               fooStr.size());
+  ASSERT_GE(idx, 0);
+  EXPECT_TRUE(exists(&resTable, "com.app.test:string/test",
+                     ResourceId(0x7f040000), {}, Res_value::TYPE_STRING,
+                     (uint32_t)idx, 0u));
 
-    std::u16string barPath = u"res/layout/bar.xml";
-    idx = resTable.getTableStringBlock(0)->indexOfString(barPath.data(), barPath.size());
-    ASSERT_GE(idx, 0);
-    EXPECT_TRUE(exists(&resTable, "com.app.test:layout/bar", ResourceId(0x7f050000), {},
-                       Res_value::TYPE_STRING, (uint32_t) idx, 0u));
+  std::u16string barPath = u"res/layout/bar.xml";
+  idx = resTable.getTableStringBlock(0)->indexOfString(barPath.data(),
+                                                       barPath.size());
+  ASSERT_GE(idx, 0);
+  EXPECT_TRUE(exists(&resTable, "com.app.test:layout/bar",
+                     ResourceId(0x7f050000), {}, Res_value::TYPE_STRING,
+                     (uint32_t)idx, 0u));
 }
 
 TEST_F(TableFlattenerTest, FlattenEntriesWithGapsInIds) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId("com.app.test", 0x7f)
-            .addSimple("com.app.test:id/one", ResourceId(0x7f020001))
-            .addSimple("com.app.test:id/three", ResourceId(0x7f020003))
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.test", 0x7f)
+          .addSimple("com.app.test:id/one", ResourceId(0x7f020001))
+          .addSimple("com.app.test:id/three", ResourceId(0x7f020003))
+          .build();
 
-    ResTable resTable;
-    ASSERT_TRUE(flatten(table.get(), &resTable));
+  ResTable resTable;
+  ASSERT_TRUE(flatten(table.get(), &resTable));
 
-    EXPECT_TRUE(exists(&resTable, "com.app.test:id/one", ResourceId(0x7f020001), {},
-                       Res_value::TYPE_INT_BOOLEAN, 0u, 0u));
-    EXPECT_TRUE(exists(&resTable, "com.app.test:id/three", ResourceId(0x7f020003), {},
-                       Res_value::TYPE_INT_BOOLEAN, 0u, 0u));
+  EXPECT_TRUE(exists(&resTable, "com.app.test:id/one", ResourceId(0x7f020001),
+                     {}, Res_value::TYPE_INT_BOOLEAN, 0u, 0u));
+  EXPECT_TRUE(exists(&resTable, "com.app.test:id/three", ResourceId(0x7f020003),
+                     {}, Res_value::TYPE_INT_BOOLEAN, 0u, 0u));
 }
 
 TEST_F(TableFlattenerTest, FlattenMinMaxAttributes) {
-    Attribute attr(false);
-    attr.typeMask = android::ResTable_map::TYPE_INTEGER;
-    attr.minInt = 10;
-    attr.maxInt = 23;
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId("android", 0x01)
-            .addValue("android:attr/foo", ResourceId(0x01010000),
-                      util::make_unique<Attribute>(attr))
-            .build();
+  Attribute attr(false);
+  attr.typeMask = android::ResTable_map::TYPE_INTEGER;
+  attr.minInt = 10;
+  attr.maxInt = 23;
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .setPackageId("android", 0x01)
+          .addValue("android:attr/foo", ResourceId(0x01010000),
+                    util::make_unique<Attribute>(attr))
+          .build();
 
-    ResourceTable result;
-    ASSERT_TRUE(flatten(table.get(), &result));
+  ResourceTable result;
+  ASSERT_TRUE(flatten(table.get(), &result));
 
-    Attribute* actualAttr = test::getValue<Attribute>(&result, "android:attr/foo");
-    ASSERT_NE(nullptr, actualAttr);
-    EXPECT_EQ(attr.isWeak(), actualAttr->isWeak());
-    EXPECT_EQ(attr.typeMask, actualAttr->typeMask);
-    EXPECT_EQ(attr.minInt, actualAttr->minInt);
-    EXPECT_EQ(attr.maxInt, actualAttr->maxInt);
+  Attribute* actualAttr =
+      test::getValue<Attribute>(&result, "android:attr/foo");
+  ASSERT_NE(nullptr, actualAttr);
+  EXPECT_EQ(attr.isWeak(), actualAttr->isWeak());
+  EXPECT_EQ(attr.typeMask, actualAttr->typeMask);
+  EXPECT_EQ(attr.minInt, actualAttr->minInt);
+  EXPECT_EQ(attr.maxInt, actualAttr->maxInt);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/flatten/XmlFlattener.cpp b/tools/aapt2/flatten/XmlFlattener.cpp
index ed5b60f..c296dde 100644
--- a/tools/aapt2/flatten/XmlFlattener.cpp
+++ b/tools/aapt2/flatten/XmlFlattener.cpp
@@ -14,16 +14,16 @@
  * limitations under the License.
  */
 
+#include "flatten/XmlFlattener.h"
 #include "SdkConstants.h"
 #include "flatten/ChunkWriter.h"
 #include "flatten/ResourceTypeExtensions.h"
-#include "flatten/XmlFlattener.h"
 #include "xml/XmlDom.h"
 
 #include <androidfw/ResourceTypes.h>
+#include <utils/misc.h>
 #include <algorithm>
 #include <map>
-#include <utils/misc.h>
 #include <vector>
 
 using namespace android;
@@ -35,300 +35,316 @@
 constexpr uint32_t kLowPriority = 0xffffffffu;
 
 struct XmlFlattenerVisitor : public xml::Visitor {
-    using xml::Visitor::visit;
+  using xml::Visitor::visit;
 
-    BigBuffer* mBuffer;
-    XmlFlattenerOptions mOptions;
-    StringPool mPool;
-    std::map<uint8_t, StringPool> mPackagePools;
+  BigBuffer* mBuffer;
+  XmlFlattenerOptions mOptions;
+  StringPool mPool;
+  std::map<uint8_t, StringPool> mPackagePools;
 
-    struct StringFlattenDest {
-        StringPool::Ref ref;
-        ResStringPool_ref* dest;
-    };
-    std::vector<StringFlattenDest> mStringRefs;
+  struct StringFlattenDest {
+    StringPool::Ref ref;
+    ResStringPool_ref* dest;
+  };
+  std::vector<StringFlattenDest> mStringRefs;
 
-    // Scratch vector to filter attributes. We avoid allocations
-    // making this a member.
-    std::vector<xml::Attribute*> mFilteredAttrs;
+  // Scratch vector to filter attributes. We avoid allocations
+  // making this a member.
+  std::vector<xml::Attribute*> mFilteredAttrs;
 
+  XmlFlattenerVisitor(BigBuffer* buffer, XmlFlattenerOptions options)
+      : mBuffer(buffer), mOptions(options) {}
 
-    XmlFlattenerVisitor(BigBuffer* buffer, XmlFlattenerOptions options) :
-            mBuffer(buffer), mOptions(options) {
+  void addString(const StringPiece& str, uint32_t priority,
+                 android::ResStringPool_ref* dest,
+                 bool treatEmptyStringAsNull = false) {
+    if (str.empty() && treatEmptyStringAsNull) {
+      // Some parts of the runtime treat null differently than empty string.
+      dest->index = util::deviceToHost32(-1);
+    } else {
+      mStringRefs.push_back(StringFlattenDest{
+          mPool.makeRef(str, StringPool::Context{priority}), dest});
+    }
+  }
+
+  void addString(const StringPool::Ref& ref, android::ResStringPool_ref* dest) {
+    mStringRefs.push_back(StringFlattenDest{ref, dest});
+  }
+
+  void writeNamespace(xml::Namespace* node, uint16_t type) {
+    ChunkWriter writer(mBuffer);
+
+    ResXMLTree_node* flatNode = writer.startChunk<ResXMLTree_node>(type);
+    flatNode->lineNumber = util::hostToDevice32(node->lineNumber);
+    flatNode->comment.index = util::hostToDevice32(-1);
+
+    ResXMLTree_namespaceExt* flatNs =
+        writer.nextBlock<ResXMLTree_namespaceExt>();
+    addString(node->namespacePrefix, kLowPriority, &flatNs->prefix);
+    addString(node->namespaceUri, kLowPriority, &flatNs->uri);
+
+    writer.finish();
+  }
+
+  void visit(xml::Namespace* node) override {
+    if (node->namespaceUri == xml::kSchemaTools) {
+      // Skip dedicated tools namespace.
+      xml::Visitor::visit(node);
+    } else {
+      writeNamespace(node, android::RES_XML_START_NAMESPACE_TYPE);
+      xml::Visitor::visit(node);
+      writeNamespace(node, android::RES_XML_END_NAMESPACE_TYPE);
+    }
+  }
+
+  void visit(xml::Text* node) override {
+    if (util::trimWhitespace(node->text).empty()) {
+      // Skip whitespace only text nodes.
+      return;
     }
 
-    void addString(const StringPiece& str, uint32_t priority, android::ResStringPool_ref* dest,
-                   bool treatEmptyStringAsNull = false) {
-        if (str.empty() && treatEmptyStringAsNull) {
-            // Some parts of the runtime treat null differently than empty string.
-            dest->index = util::deviceToHost32(-1);
-        } else {
-            mStringRefs.push_back(StringFlattenDest{
-                    mPool.makeRef(str, StringPool::Context{ priority }),
-                    dest });
-        }
+    ChunkWriter writer(mBuffer);
+    ResXMLTree_node* flatNode =
+        writer.startChunk<ResXMLTree_node>(RES_XML_CDATA_TYPE);
+    flatNode->lineNumber = util::hostToDevice32(node->lineNumber);
+    flatNode->comment.index = util::hostToDevice32(-1);
+
+    ResXMLTree_cdataExt* flatText = writer.nextBlock<ResXMLTree_cdataExt>();
+    addString(node->text, kLowPriority, &flatText->data);
+
+    writer.finish();
+  }
+
+  void visit(xml::Element* node) override {
+    {
+      ChunkWriter startWriter(mBuffer);
+      ResXMLTree_node* flatNode =
+          startWriter.startChunk<ResXMLTree_node>(RES_XML_START_ELEMENT_TYPE);
+      flatNode->lineNumber = util::hostToDevice32(node->lineNumber);
+      flatNode->comment.index = util::hostToDevice32(-1);
+
+      ResXMLTree_attrExt* flatElem =
+          startWriter.nextBlock<ResXMLTree_attrExt>();
+
+      // A missing namespace must be null, not an empty string. Otherwise the
+      // runtime
+      // complains.
+      addString(node->namespaceUri, kLowPriority, &flatElem->ns,
+                true /* treatEmptyStringAsNull */);
+      addString(node->name, kLowPriority, &flatElem->name,
+                true /* treatEmptyStringAsNull */);
+
+      flatElem->attributeStart = util::hostToDevice16(sizeof(*flatElem));
+      flatElem->attributeSize =
+          util::hostToDevice16(sizeof(ResXMLTree_attribute));
+
+      writeAttributes(node, flatElem, &startWriter);
+
+      startWriter.finish();
     }
 
-    void addString(const StringPool::Ref& ref, android::ResStringPool_ref* dest) {
-        mStringRefs.push_back(StringFlattenDest{ ref, dest });
-    }
-
-    void writeNamespace(xml::Namespace* node, uint16_t type) {
-        ChunkWriter writer(mBuffer);
-
-        ResXMLTree_node* flatNode = writer.startChunk<ResXMLTree_node>(type);
-        flatNode->lineNumber = util::hostToDevice32(node->lineNumber);
-        flatNode->comment.index = util::hostToDevice32(-1);
-
-        ResXMLTree_namespaceExt* flatNs = writer.nextBlock<ResXMLTree_namespaceExt>();
-        addString(node->namespacePrefix, kLowPriority, &flatNs->prefix);
-        addString(node->namespaceUri, kLowPriority, &flatNs->uri);
-
-        writer.finish();
-    }
-
-    void visit(xml::Namespace* node) override {
-        if (node->namespaceUri == xml::kSchemaTools) {
-            // Skip dedicated tools namespace.
-            xml::Visitor::visit(node);
-        } else {
-            writeNamespace(node, android::RES_XML_START_NAMESPACE_TYPE);
-            xml::Visitor::visit(node);
-            writeNamespace(node, android::RES_XML_END_NAMESPACE_TYPE);
-        }
-    }
-
-    void visit(xml::Text* node) override {
-        if (util::trimWhitespace(node->text).empty()) {
-            // Skip whitespace only text nodes.
-            return;
-        }
-
-        ChunkWriter writer(mBuffer);
-        ResXMLTree_node* flatNode = writer.startChunk<ResXMLTree_node>(RES_XML_CDATA_TYPE);
-        flatNode->lineNumber = util::hostToDevice32(node->lineNumber);
-        flatNode->comment.index = util::hostToDevice32(-1);
-
-        ResXMLTree_cdataExt* flatText = writer.nextBlock<ResXMLTree_cdataExt>();
-        addString(node->text, kLowPriority, &flatText->data);
-
-        writer.finish();
-    }
-
-    void visit(xml::Element* node) override {
-        {
-            ChunkWriter startWriter(mBuffer);
-            ResXMLTree_node* flatNode = startWriter.startChunk<ResXMLTree_node>(
-                    RES_XML_START_ELEMENT_TYPE);
-            flatNode->lineNumber = util::hostToDevice32(node->lineNumber);
-            flatNode->comment.index = util::hostToDevice32(-1);
-
-            ResXMLTree_attrExt* flatElem = startWriter.nextBlock<ResXMLTree_attrExt>();
-
-            // A missing namespace must be null, not an empty string. Otherwise the runtime
-            // complains.
-            addString(node->namespaceUri, kLowPriority, &flatElem->ns,
-                      true /* treatEmptyStringAsNull */);
-            addString(node->name, kLowPriority, &flatElem->name,
-                      true /* treatEmptyStringAsNull */);
-
-            flatElem->attributeStart = util::hostToDevice16(sizeof(*flatElem));
-            flatElem->attributeSize = util::hostToDevice16(sizeof(ResXMLTree_attribute));
-
-            writeAttributes(node, flatElem, &startWriter);
-
-            startWriter.finish();
-        }
-
-        xml::Visitor::visit(node);
-
-        {
-            ChunkWriter endWriter(mBuffer);
-            ResXMLTree_node* flatEndNode = endWriter.startChunk<ResXMLTree_node>(
-                    RES_XML_END_ELEMENT_TYPE);
-            flatEndNode->lineNumber = util::hostToDevice32(node->lineNumber);
-            flatEndNode->comment.index = util::hostToDevice32(-1);
-
-            ResXMLTree_endElementExt* flatEndElem = endWriter.nextBlock<ResXMLTree_endElementExt>();
-            addString(node->namespaceUri, kLowPriority, &flatEndElem->ns,
-                      true /* treatEmptyStringAsNull */);
-            addString(node->name, kLowPriority, &flatEndElem->name);
-
-            endWriter.finish();
-        }
-    }
-
-    static bool cmpXmlAttributeById(const xml::Attribute* a, const xml::Attribute* b) {
-        if (a->compiledAttribute && a->compiledAttribute.value().id) {
-            if (b->compiledAttribute && b->compiledAttribute.value().id) {
-                return a->compiledAttribute.value().id.value() < b->compiledAttribute.value().id.value();
-            }
-            return true;
-        } else if (!b->compiledAttribute) {
-            int diff = a->namespaceUri.compare(b->namespaceUri);
-            if (diff < 0) {
-                return true;
-            } else if (diff > 0) {
-                return false;
-            }
-            return a->name < b->name;
-        }
-        return false;
-    }
-
-    void writeAttributes(xml::Element* node, ResXMLTree_attrExt* flatElem, ChunkWriter* writer) {
-        mFilteredAttrs.clear();
-        mFilteredAttrs.reserve(node->attributes.size());
-
-        // Filter the attributes.
-        for (xml::Attribute& attr : node->attributes) {
-            if (mOptions.maxSdkLevel && attr.compiledAttribute && attr.compiledAttribute.value().id) {
-                size_t sdkLevel = findAttributeSdkLevel(attr.compiledAttribute.value().id.value());
-                if (sdkLevel > mOptions.maxSdkLevel.value()) {
-                    continue;
-                }
-            }
-            if (attr.namespaceUri == xml::kSchemaTools) {
-                continue;
-            }
-            mFilteredAttrs.push_back(&attr);
-        }
-
-        if (mFilteredAttrs.empty()) {
-            return;
-        }
-
-        const ResourceId kIdAttr(0x010100d0);
-
-        std::sort(mFilteredAttrs.begin(), mFilteredAttrs.end(), cmpXmlAttributeById);
-
-        flatElem->attributeCount = util::hostToDevice16(mFilteredAttrs.size());
-
-        ResXMLTree_attribute* flatAttr = writer->nextBlock<ResXMLTree_attribute>(
-                mFilteredAttrs.size());
-        uint16_t attributeIndex = 1;
-        for (const xml::Attribute* xmlAttr : mFilteredAttrs) {
-            // Assign the indices for specific attributes.
-            if (xmlAttr->compiledAttribute && xmlAttr->compiledAttribute.value().id &&
-                    xmlAttr->compiledAttribute.value().id.value() == kIdAttr) {
-                flatElem->idIndex = util::hostToDevice16(attributeIndex);
-            } else if (xmlAttr->namespaceUri.empty()) {
-                if (xmlAttr->name == "class") {
-                    flatElem->classIndex = util::hostToDevice16(attributeIndex);
-                } else if (xmlAttr->name == "style") {
-                    flatElem->styleIndex = util::hostToDevice16(attributeIndex);
-                }
-            }
-            attributeIndex++;
-
-            // Add the namespaceUri to the list of StringRefs to encode. Use null if the namespace
-            // is empty (doesn't exist).
-            addString(xmlAttr->namespaceUri, kLowPriority, &flatAttr->ns,
-                      true /* treatEmptyStringAsNull */);
-
-            flatAttr->rawValue.index = util::hostToDevice32(-1);
-
-            if (!xmlAttr->compiledAttribute || !xmlAttr->compiledAttribute.value().id) {
-                // The attribute has no associated ResourceID, so the string order doesn't matter.
-                addString(xmlAttr->name, kLowPriority, &flatAttr->name);
-            } else {
-                // Attribute names are stored without packages, but we use
-                // their StringPool index to lookup their resource IDs.
-                // This will cause collisions, so we can't dedupe
-                // attribute names from different packages. We use separate
-                // pools that we later combine.
-                //
-                // Lookup the StringPool for this package and make the reference there.
-                const xml::AaptAttribute& aaptAttr = xmlAttr->compiledAttribute.value();
-
-                StringPool::Ref nameRef = mPackagePools[aaptAttr.id.value().packageId()].makeRef(
-                        xmlAttr->name, StringPool::Context{ aaptAttr.id.value().id });
-
-                // Add it to the list of strings to flatten.
-                addString(nameRef, &flatAttr->name);
-            }
-
-            if (mOptions.keepRawValues || !xmlAttr->compiledValue) {
-                // Keep raw values if the value is not compiled or
-                // if we're building a static library (need symbols).
-                addString(xmlAttr->value, kLowPriority, &flatAttr->rawValue);
-            }
-
-            if (xmlAttr->compiledValue) {
-                bool result = xmlAttr->compiledValue->flatten(&flatAttr->typedValue);
-                assert(result);
-            } else {
-                // Flatten as a regular string type.
-                flatAttr->typedValue.dataType = android::Res_value::TYPE_STRING;
-                addString(xmlAttr->value, kLowPriority,
-                          (ResStringPool_ref*) &flatAttr->typedValue.data);
-            }
-
-            flatAttr->typedValue.size = util::hostToDevice16(sizeof(flatAttr->typedValue));
-            flatAttr++;
-        }
-    }
-};
-
-} // namespace
-
-bool XmlFlattener::flatten(IAaptContext* context, xml::Node* node) {
-    BigBuffer nodeBuffer(1024);
-    XmlFlattenerVisitor visitor(&nodeBuffer, mOptions);
-    node->accept(&visitor);
-
-    // Merge the package pools into the main pool.
-    for (auto& packagePoolEntry : visitor.mPackagePools) {
-        visitor.mPool.merge(std::move(packagePoolEntry.second));
-    }
-
-    // Sort the string pool so that attribute resource IDs show up first.
-    visitor.mPool.sort([](const StringPool::Entry& a, const StringPool::Entry& b) -> bool {
-        return a.context.priority < b.context.priority;
-    });
-
-    // Now we flatten the string pool references into the correct places.
-    for (const auto& refEntry : visitor.mStringRefs) {
-        refEntry.dest->index = util::hostToDevice32(refEntry.ref.getIndex());
-    }
-
-    // Write the XML header.
-    ChunkWriter xmlHeaderWriter(mBuffer);
-    xmlHeaderWriter.startChunk<ResXMLTree_header>(RES_XML_TYPE);
-
-    // Flatten the StringPool.
-    StringPool::flattenUtf8(mBuffer, visitor.mPool);
+    xml::Visitor::visit(node);
 
     {
-        // Write the array of resource IDs, indexed by StringPool order.
-        ChunkWriter resIdMapWriter(mBuffer);
-        resIdMapWriter.startChunk<ResChunk_header>(RES_XML_RESOURCE_MAP_TYPE);
-        for (const auto& str : visitor.mPool) {
-            ResourceId id = { str->context.priority };
-            if (id.id == kLowPriority || !id.isValid()) {
-                // When we see the first non-resource ID,
-                // we're done.
-                break;
-            }
+      ChunkWriter endWriter(mBuffer);
+      ResXMLTree_node* flatEndNode =
+          endWriter.startChunk<ResXMLTree_node>(RES_XML_END_ELEMENT_TYPE);
+      flatEndNode->lineNumber = util::hostToDevice32(node->lineNumber);
+      flatEndNode->comment.index = util::hostToDevice32(-1);
 
-            *resIdMapWriter.nextBlock<uint32_t>() = id.id;
+      ResXMLTree_endElementExt* flatEndElem =
+          endWriter.nextBlock<ResXMLTree_endElementExt>();
+      addString(node->namespaceUri, kLowPriority, &flatEndElem->ns,
+                true /* treatEmptyStringAsNull */);
+      addString(node->name, kLowPriority, &flatEndElem->name);
+
+      endWriter.finish();
+    }
+  }
+
+  static bool cmpXmlAttributeById(const xml::Attribute* a,
+                                  const xml::Attribute* b) {
+    if (a->compiledAttribute && a->compiledAttribute.value().id) {
+      if (b->compiledAttribute && b->compiledAttribute.value().id) {
+        return a->compiledAttribute.value().id.value() <
+               b->compiledAttribute.value().id.value();
+      }
+      return true;
+    } else if (!b->compiledAttribute) {
+      int diff = a->namespaceUri.compare(b->namespaceUri);
+      if (diff < 0) {
+        return true;
+      } else if (diff > 0) {
+        return false;
+      }
+      return a->name < b->name;
+    }
+    return false;
+  }
+
+  void writeAttributes(xml::Element* node, ResXMLTree_attrExt* flatElem,
+                       ChunkWriter* writer) {
+    mFilteredAttrs.clear();
+    mFilteredAttrs.reserve(node->attributes.size());
+
+    // Filter the attributes.
+    for (xml::Attribute& attr : node->attributes) {
+      if (mOptions.maxSdkLevel && attr.compiledAttribute &&
+          attr.compiledAttribute.value().id) {
+        size_t sdkLevel =
+            findAttributeSdkLevel(attr.compiledAttribute.value().id.value());
+        if (sdkLevel > mOptions.maxSdkLevel.value()) {
+          continue;
         }
-        resIdMapWriter.finish();
+      }
+      if (attr.namespaceUri == xml::kSchemaTools) {
+        continue;
+      }
+      mFilteredAttrs.push_back(&attr);
     }
 
-    // Move the nodeBuffer and append it to the out buffer.
-    mBuffer->appendBuffer(std::move(nodeBuffer));
+    if (mFilteredAttrs.empty()) {
+      return;
+    }
 
-    // Finish the xml header.
-    xmlHeaderWriter.finish();
-    return true;
+    const ResourceId kIdAttr(0x010100d0);
+
+    std::sort(mFilteredAttrs.begin(), mFilteredAttrs.end(),
+              cmpXmlAttributeById);
+
+    flatElem->attributeCount = util::hostToDevice16(mFilteredAttrs.size());
+
+    ResXMLTree_attribute* flatAttr =
+        writer->nextBlock<ResXMLTree_attribute>(mFilteredAttrs.size());
+    uint16_t attributeIndex = 1;
+    for (const xml::Attribute* xmlAttr : mFilteredAttrs) {
+      // Assign the indices for specific attributes.
+      if (xmlAttr->compiledAttribute && xmlAttr->compiledAttribute.value().id &&
+          xmlAttr->compiledAttribute.value().id.value() == kIdAttr) {
+        flatElem->idIndex = util::hostToDevice16(attributeIndex);
+      } else if (xmlAttr->namespaceUri.empty()) {
+        if (xmlAttr->name == "class") {
+          flatElem->classIndex = util::hostToDevice16(attributeIndex);
+        } else if (xmlAttr->name == "style") {
+          flatElem->styleIndex = util::hostToDevice16(attributeIndex);
+        }
+      }
+      attributeIndex++;
+
+      // Add the namespaceUri to the list of StringRefs to encode. Use null if
+      // the namespace
+      // is empty (doesn't exist).
+      addString(xmlAttr->namespaceUri, kLowPriority, &flatAttr->ns,
+                true /* treatEmptyStringAsNull */);
+
+      flatAttr->rawValue.index = util::hostToDevice32(-1);
+
+      if (!xmlAttr->compiledAttribute ||
+          !xmlAttr->compiledAttribute.value().id) {
+        // The attribute has no associated ResourceID, so the string order
+        // doesn't matter.
+        addString(xmlAttr->name, kLowPriority, &flatAttr->name);
+      } else {
+        // Attribute names are stored without packages, but we use
+        // their StringPool index to lookup their resource IDs.
+        // This will cause collisions, so we can't dedupe
+        // attribute names from different packages. We use separate
+        // pools that we later combine.
+        //
+        // Lookup the StringPool for this package and make the reference there.
+        const xml::AaptAttribute& aaptAttr = xmlAttr->compiledAttribute.value();
+
+        StringPool::Ref nameRef =
+            mPackagePools[aaptAttr.id.value().packageId()].makeRef(
+                xmlAttr->name, StringPool::Context{aaptAttr.id.value().id});
+
+        // Add it to the list of strings to flatten.
+        addString(nameRef, &flatAttr->name);
+      }
+
+      if (mOptions.keepRawValues || !xmlAttr->compiledValue) {
+        // Keep raw values if the value is not compiled or
+        // if we're building a static library (need symbols).
+        addString(xmlAttr->value, kLowPriority, &flatAttr->rawValue);
+      }
+
+      if (xmlAttr->compiledValue) {
+        bool result = xmlAttr->compiledValue->flatten(&flatAttr->typedValue);
+        assert(result);
+      } else {
+        // Flatten as a regular string type.
+        flatAttr->typedValue.dataType = android::Res_value::TYPE_STRING;
+        addString(xmlAttr->value, kLowPriority,
+                  (ResStringPool_ref*)&flatAttr->typedValue.data);
+      }
+
+      flatAttr->typedValue.size =
+          util::hostToDevice16(sizeof(flatAttr->typedValue));
+      flatAttr++;
+    }
+  }
+};
+
+}  // namespace
+
+bool XmlFlattener::flatten(IAaptContext* context, xml::Node* node) {
+  BigBuffer nodeBuffer(1024);
+  XmlFlattenerVisitor visitor(&nodeBuffer, mOptions);
+  node->accept(&visitor);
+
+  // Merge the package pools into the main pool.
+  for (auto& packagePoolEntry : visitor.mPackagePools) {
+    visitor.mPool.merge(std::move(packagePoolEntry.second));
+  }
+
+  // Sort the string pool so that attribute resource IDs show up first.
+  visitor.mPool.sort(
+      [](const StringPool::Entry& a, const StringPool::Entry& b) -> bool {
+        return a.context.priority < b.context.priority;
+      });
+
+  // Now we flatten the string pool references into the correct places.
+  for (const auto& refEntry : visitor.mStringRefs) {
+    refEntry.dest->index = util::hostToDevice32(refEntry.ref.getIndex());
+  }
+
+  // Write the XML header.
+  ChunkWriter xmlHeaderWriter(mBuffer);
+  xmlHeaderWriter.startChunk<ResXMLTree_header>(RES_XML_TYPE);
+
+  // Flatten the StringPool.
+  StringPool::flattenUtf8(mBuffer, visitor.mPool);
+
+  {
+    // Write the array of resource IDs, indexed by StringPool order.
+    ChunkWriter resIdMapWriter(mBuffer);
+    resIdMapWriter.startChunk<ResChunk_header>(RES_XML_RESOURCE_MAP_TYPE);
+    for (const auto& str : visitor.mPool) {
+      ResourceId id = {str->context.priority};
+      if (id.id == kLowPriority || !id.isValid()) {
+        // When we see the first non-resource ID,
+        // we're done.
+        break;
+      }
+
+      *resIdMapWriter.nextBlock<uint32_t>() = id.id;
+    }
+    resIdMapWriter.finish();
+  }
+
+  // Move the nodeBuffer and append it to the out buffer.
+  mBuffer->appendBuffer(std::move(nodeBuffer));
+
+  // Finish the xml header.
+  xmlHeaderWriter.finish();
+  return true;
 }
 
 bool XmlFlattener::consume(IAaptContext* context, xml::XmlResource* resource) {
-    if (!resource->root) {
-        return false;
-    }
-    return flatten(context, resource->root.get());
+  if (!resource->root) {
+    return false;
+  }
+  return flatten(context, resource->root.get());
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/flatten/XmlFlattener.h b/tools/aapt2/flatten/XmlFlattener.h
index a688ac9..d8d592b 100644
--- a/tools/aapt2/flatten/XmlFlattener.h
+++ b/tools/aapt2/flatten/XmlFlattener.h
@@ -24,32 +24,31 @@
 namespace aapt {
 
 struct XmlFlattenerOptions {
-    /**
-     * Keep attribute raw string values along with typed values.
-     */
-    bool keepRawValues = false;
+  /**
+   * Keep attribute raw string values along with typed values.
+   */
+  bool keepRawValues = false;
 
-    /**
-     * If set, the max SDK level of attribute to flatten. All others are ignored.
-     */
-    Maybe<size_t> maxSdkLevel;
+  /**
+   * If set, the max SDK level of attribute to flatten. All others are ignored.
+   */
+  Maybe<size_t> maxSdkLevel;
 };
 
 class XmlFlattener : public IXmlResourceConsumer {
-public:
-    XmlFlattener(BigBuffer* buffer, XmlFlattenerOptions options) :
-            mBuffer(buffer), mOptions(options) {
-    }
+ public:
+  XmlFlattener(BigBuffer* buffer, XmlFlattenerOptions options)
+      : mBuffer(buffer), mOptions(options) {}
 
-    bool consume(IAaptContext* context, xml::XmlResource* resource) override;
+  bool consume(IAaptContext* context, xml::XmlResource* resource) override;
 
-private:
-    BigBuffer* mBuffer;
-    XmlFlattenerOptions mOptions;
+ private:
+  BigBuffer* mBuffer;
+  XmlFlattenerOptions mOptions;
 
-    bool flatten(IAaptContext* context, xml::Node* node);
+  bool flatten(IAaptContext* context, xml::Node* node);
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_FLATTEN_XMLFLATTENER_H */
diff --git a/tools/aapt2/flatten/XmlFlattener_test.cpp b/tools/aapt2/flatten/XmlFlattener_test.cpp
index 4d1e178..e0159cb 100644
--- a/tools/aapt2/flatten/XmlFlattener_test.cpp
+++ b/tools/aapt2/flatten/XmlFlattener_test.cpp
@@ -25,230 +25,240 @@
 namespace aapt {
 
 class XmlFlattenerTest : public ::testing::Test {
-public:
-    void SetUp() override {
-        mContext = test::ContextBuilder()
-                .setCompilationPackage("com.app.test")
-                .setNameManglerPolicy(NameManglerPolicy{ "com.app.test" })
-                .addSymbolSource(test::StaticSymbolSourceBuilder()
-                        .addSymbol("android:attr/id", ResourceId(0x010100d0),
-                                   test::AttributeBuilder().build())
-                        .addSymbol("com.app.test:id/id", ResourceId(0x7f020000))
-                        .addSymbol("android:attr/paddingStart", ResourceId(0x010103b3),
-                                   test::AttributeBuilder().build())
-                        .addSymbol("android:attr/colorAccent", ResourceId(0x01010435),
-                                   test::AttributeBuilder().build())
-                        .build())
-                .build();
+ public:
+  void SetUp() override {
+    mContext =
+        test::ContextBuilder()
+            .setCompilationPackage("com.app.test")
+            .setNameManglerPolicy(NameManglerPolicy{"com.app.test"})
+            .addSymbolSource(
+                test::StaticSymbolSourceBuilder()
+                    .addSymbol("android:attr/id", ResourceId(0x010100d0),
+                               test::AttributeBuilder().build())
+                    .addSymbol("com.app.test:id/id", ResourceId(0x7f020000))
+                    .addSymbol("android:attr/paddingStart",
+                               ResourceId(0x010103b3),
+                               test::AttributeBuilder().build())
+                    .addSymbol("android:attr/colorAccent",
+                               ResourceId(0x01010435),
+                               test::AttributeBuilder().build())
+                    .build())
+            .build();
+  }
+
+  ::testing::AssertionResult flatten(xml::XmlResource* doc,
+                                     android::ResXMLTree* outTree,
+                                     const XmlFlattenerOptions& options = {}) {
+    using namespace android;  // For NO_ERROR on windows because it is a macro.
+
+    BigBuffer buffer(1024);
+    XmlFlattener flattener(&buffer, options);
+    if (!flattener.consume(mContext.get(), doc)) {
+      return ::testing::AssertionFailure() << "failed to flatten XML Tree";
     }
 
-    ::testing::AssertionResult flatten(xml::XmlResource* doc, android::ResXMLTree* outTree,
-                                       const XmlFlattenerOptions& options = {}) {
-        using namespace android; // For NO_ERROR on windows because it is a macro.
-
-        BigBuffer buffer(1024);
-        XmlFlattener flattener(&buffer, options);
-        if (!flattener.consume(mContext.get(), doc)) {
-            return ::testing::AssertionFailure() << "failed to flatten XML Tree";
-        }
-
-        std::unique_ptr<uint8_t[]> data = util::copy(buffer);
-        if (outTree->setTo(data.get(), buffer.size(), true) != NO_ERROR) {
-            return ::testing::AssertionFailure() << "flattened XML is corrupt";
-        }
-        return ::testing::AssertionSuccess();
+    std::unique_ptr<uint8_t[]> data = util::copy(buffer);
+    if (outTree->setTo(data.get(), buffer.size(), true) != NO_ERROR) {
+      return ::testing::AssertionFailure() << "flattened XML is corrupt";
     }
+    return ::testing::AssertionSuccess();
+  }
 
-protected:
-    std::unique_ptr<IAaptContext> mContext;
+ protected:
+  std::unique_ptr<IAaptContext> mContext;
 };
 
 TEST_F(XmlFlattenerTest, FlattenXmlWithNoCompiledAttributes) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
+  std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
             <View xmlns:test="http://com.test"
                   attr="hey">
               <Layout test:hello="hi" />
               <Layout>Some text</Layout>
             </View>)EOF");
 
+  android::ResXMLTree tree;
+  ASSERT_TRUE(flatten(doc.get(), &tree));
 
-    android::ResXMLTree tree;
-    ASSERT_TRUE(flatten(doc.get(), &tree));
+  ASSERT_EQ(tree.next(), android::ResXMLTree::START_NAMESPACE);
 
-    ASSERT_EQ(tree.next(), android::ResXMLTree::START_NAMESPACE);
+  size_t len;
+  const char16_t* namespacePrefix = tree.getNamespacePrefix(&len);
+  EXPECT_EQ(StringPiece16(namespacePrefix, len), u"test");
 
-    size_t len;
-    const char16_t* namespacePrefix = tree.getNamespacePrefix(&len);
-    EXPECT_EQ(StringPiece16(namespacePrefix, len), u"test");
+  const char16_t* namespaceUri = tree.getNamespaceUri(&len);
+  ASSERT_EQ(StringPiece16(namespaceUri, len), u"http://com.test");
 
-    const char16_t* namespaceUri = tree.getNamespaceUri(&len);
-    ASSERT_EQ(StringPiece16(namespaceUri, len), u"http://com.test");
+  ASSERT_EQ(tree.next(), android::ResXMLTree::START_TAG);
 
-    ASSERT_EQ(tree.next(), android::ResXMLTree::START_TAG);
+  ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
+  const char16_t* tagName = tree.getElementName(&len);
+  EXPECT_EQ(StringPiece16(tagName, len), u"View");
 
-    ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
-    const char16_t* tagName = tree.getElementName(&len);
-    EXPECT_EQ(StringPiece16(tagName, len), u"View");
+  ASSERT_EQ(1u, tree.getAttributeCount());
+  ASSERT_EQ(tree.getAttributeNamespace(0, &len), nullptr);
+  const char16_t* attrName = tree.getAttributeName(0, &len);
+  EXPECT_EQ(StringPiece16(attrName, len), u"attr");
 
-    ASSERT_EQ(1u, tree.getAttributeCount());
-    ASSERT_EQ(tree.getAttributeNamespace(0, &len), nullptr);
-    const char16_t* attrName = tree.getAttributeName(0, &len);
-    EXPECT_EQ(StringPiece16(attrName, len), u"attr");
+  EXPECT_EQ(0, tree.indexOfAttribute(nullptr, 0, u"attr",
+                                     StringPiece16(u"attr").size()));
 
-    EXPECT_EQ(0, tree.indexOfAttribute(nullptr, 0, u"attr", StringPiece16(u"attr").size()));
+  ASSERT_EQ(tree.next(), android::ResXMLTree::START_TAG);
 
-    ASSERT_EQ(tree.next(), android::ResXMLTree::START_TAG);
+  ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
+  tagName = tree.getElementName(&len);
+  EXPECT_EQ(StringPiece16(tagName, len), u"Layout");
 
-    ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
-    tagName = tree.getElementName(&len);
-    EXPECT_EQ(StringPiece16(tagName, len), u"Layout");
+  ASSERT_EQ(1u, tree.getAttributeCount());
+  const char16_t* attrNamespace = tree.getAttributeNamespace(0, &len);
+  EXPECT_EQ(StringPiece16(attrNamespace, len), u"http://com.test");
 
-    ASSERT_EQ(1u, tree.getAttributeCount());
-    const char16_t* attrNamespace = tree.getAttributeNamespace(0, &len);
-    EXPECT_EQ(StringPiece16(attrNamespace, len), u"http://com.test");
+  attrName = tree.getAttributeName(0, &len);
+  EXPECT_EQ(StringPiece16(attrName, len), u"hello");
 
-    attrName = tree.getAttributeName(0, &len);
-    EXPECT_EQ(StringPiece16(attrName, len), u"hello");
+  ASSERT_EQ(tree.next(), android::ResXMLTree::END_TAG);
+  ASSERT_EQ(tree.next(), android::ResXMLTree::START_TAG);
 
-    ASSERT_EQ(tree.next(), android::ResXMLTree::END_TAG);
-    ASSERT_EQ(tree.next(), android::ResXMLTree::START_TAG);
+  ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
+  tagName = tree.getElementName(&len);
+  EXPECT_EQ(StringPiece16(tagName, len), u"Layout");
+  ASSERT_EQ(0u, tree.getAttributeCount());
 
-    ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
-    tagName = tree.getElementName(&len);
-    EXPECT_EQ(StringPiece16(tagName, len), u"Layout");
-    ASSERT_EQ(0u, tree.getAttributeCount());
+  ASSERT_EQ(tree.next(), android::ResXMLTree::TEXT);
+  const char16_t* text = tree.getText(&len);
+  EXPECT_EQ(StringPiece16(text, len), u"Some text");
 
-    ASSERT_EQ(tree.next(), android::ResXMLTree::TEXT);
-    const char16_t* text = tree.getText(&len);
-    EXPECT_EQ(StringPiece16(text, len), u"Some text");
+  ASSERT_EQ(tree.next(), android::ResXMLTree::END_TAG);
+  ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
+  tagName = tree.getElementName(&len);
+  EXPECT_EQ(StringPiece16(tagName, len), u"Layout");
 
-    ASSERT_EQ(tree.next(), android::ResXMLTree::END_TAG);
-    ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
-    tagName = tree.getElementName(&len);
-    EXPECT_EQ(StringPiece16(tagName, len), u"Layout");
+  ASSERT_EQ(tree.next(), android::ResXMLTree::END_TAG);
+  ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
+  tagName = tree.getElementName(&len);
+  EXPECT_EQ(StringPiece16(tagName, len), u"View");
 
-    ASSERT_EQ(tree.next(), android::ResXMLTree::END_TAG);
-    ASSERT_EQ(tree.getElementNamespace(&len), nullptr);
-    tagName = tree.getElementName(&len);
-    EXPECT_EQ(StringPiece16(tagName, len), u"View");
+  ASSERT_EQ(tree.next(), android::ResXMLTree::END_NAMESPACE);
+  namespacePrefix = tree.getNamespacePrefix(&len);
+  EXPECT_EQ(StringPiece16(namespacePrefix, len), u"test");
 
-    ASSERT_EQ(tree.next(), android::ResXMLTree::END_NAMESPACE);
-    namespacePrefix = tree.getNamespacePrefix(&len);
-    EXPECT_EQ(StringPiece16(namespacePrefix, len), u"test");
+  namespaceUri = tree.getNamespaceUri(&len);
+  ASSERT_EQ(StringPiece16(namespaceUri, len), u"http://com.test");
 
-    namespaceUri = tree.getNamespaceUri(&len);
-    ASSERT_EQ(StringPiece16(namespaceUri, len), u"http://com.test");
-
-    ASSERT_EQ(tree.next(), android::ResXMLTree::END_DOCUMENT);
+  ASSERT_EQ(tree.next(), android::ResXMLTree::END_DOCUMENT);
 }
 
 TEST_F(XmlFlattenerTest, FlattenCompiledXmlAndStripSdk21) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
+  std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
             <View xmlns:android="http://schemas.android.com/apk/res/android"
                 android:paddingStart="1dp"
                 android:colorAccent="#ffffff"/>)EOF");
 
-    XmlReferenceLinker linker;
-    ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
-    ASSERT_TRUE(linker.getSdkLevels().count(17) == 1);
-    ASSERT_TRUE(linker.getSdkLevels().count(21) == 1);
+  XmlReferenceLinker linker;
+  ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
+  ASSERT_TRUE(linker.getSdkLevels().count(17) == 1);
+  ASSERT_TRUE(linker.getSdkLevels().count(21) == 1);
 
-    android::ResXMLTree tree;
-    XmlFlattenerOptions options;
-    options.maxSdkLevel = 17;
-    ASSERT_TRUE(flatten(doc.get(), &tree, options));
+  android::ResXMLTree tree;
+  XmlFlattenerOptions options;
+  options.maxSdkLevel = 17;
+  ASSERT_TRUE(flatten(doc.get(), &tree, options));
 
-    while (tree.next() != android::ResXMLTree::START_TAG) {
-        ASSERT_NE(tree.getEventType(), android::ResXMLTree::BAD_DOCUMENT);
-        ASSERT_NE(tree.getEventType(), android::ResXMLTree::END_DOCUMENT);
-    }
+  while (tree.next() != android::ResXMLTree::START_TAG) {
+    ASSERT_NE(tree.getEventType(), android::ResXMLTree::BAD_DOCUMENT);
+    ASSERT_NE(tree.getEventType(), android::ResXMLTree::END_DOCUMENT);
+  }
 
-    ASSERT_EQ(1u, tree.getAttributeCount());
-    EXPECT_EQ(uint32_t(0x010103b3), tree.getAttributeNameResID(0));
+  ASSERT_EQ(1u, tree.getAttributeCount());
+  EXPECT_EQ(uint32_t(0x010103b3), tree.getAttributeNameResID(0));
 }
 
 TEST_F(XmlFlattenerTest, FlattenCompiledXmlAndStripOnlyTools) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
+  std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
             <View xmlns:tools="http://schemas.android.com/tools"
                 xmlns:foo="http://schemas.android.com/foo"
                 foo:bar="Foo"
                 tools:ignore="MissingTranslation"/>)EOF");
 
-    android::ResXMLTree tree;
-    ASSERT_TRUE(flatten(doc.get(), &tree));
+  android::ResXMLTree tree;
+  ASSERT_TRUE(flatten(doc.get(), &tree));
 
-    ASSERT_EQ(tree.next(), android::ResXMLTree::START_NAMESPACE);
+  ASSERT_EQ(tree.next(), android::ResXMLTree::START_NAMESPACE);
 
-    size_t len;
-    const char16_t* namespacePrefix = tree.getNamespacePrefix(&len);
-    EXPECT_EQ(StringPiece16(namespacePrefix, len), u"foo");
+  size_t len;
+  const char16_t* namespacePrefix = tree.getNamespacePrefix(&len);
+  EXPECT_EQ(StringPiece16(namespacePrefix, len), u"foo");
 
-    const char16_t* namespaceUri = tree.getNamespaceUri(&len);
-    ASSERT_EQ(StringPiece16(namespaceUri, len), u"http://schemas.android.com/foo");
+  const char16_t* namespaceUri = tree.getNamespaceUri(&len);
+  ASSERT_EQ(StringPiece16(namespaceUri, len),
+            u"http://schemas.android.com/foo");
 
-    ASSERT_EQ(tree.next(), android::ResXMLTree::START_TAG);
+  ASSERT_EQ(tree.next(), android::ResXMLTree::START_TAG);
 
-    EXPECT_EQ(
-            tree.indexOfAttribute("http://schemas.android.com/tools", "ignore"),
+  EXPECT_EQ(tree.indexOfAttribute("http://schemas.android.com/tools", "ignore"),
             android::NAME_NOT_FOUND);
-    EXPECT_GE(tree.indexOfAttribute("http://schemas.android.com/foo", "bar"), 0);
+  EXPECT_GE(tree.indexOfAttribute("http://schemas.android.com/foo", "bar"), 0);
 }
 
 TEST_F(XmlFlattenerTest, AssignSpecialAttributeIndices) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
+  std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(R"EOF(
             <View xmlns:android="http://schemas.android.com/apk/res/android"
                   android:id="@id/id"
                   class="str"
                   style="@id/id"/>)EOF");
 
-    android::ResXMLTree tree;
-    ASSERT_TRUE(flatten(doc.get(), &tree));
+  android::ResXMLTree tree;
+  ASSERT_TRUE(flatten(doc.get(), &tree));
 
-    while (tree.next() != android::ResXMLTree::START_TAG) {
-        ASSERT_NE(tree.getEventType(), android::ResXMLTree::BAD_DOCUMENT);
-        ASSERT_NE(tree.getEventType(), android::ResXMLTree::END_DOCUMENT);
-    }
+  while (tree.next() != android::ResXMLTree::START_TAG) {
+    ASSERT_NE(tree.getEventType(), android::ResXMLTree::BAD_DOCUMENT);
+    ASSERT_NE(tree.getEventType(), android::ResXMLTree::END_DOCUMENT);
+  }
 
-    EXPECT_EQ(tree.indexOfClass(), 0);
-    EXPECT_EQ(tree.indexOfStyle(), 1);
+  EXPECT_EQ(tree.indexOfClass(), 0);
+  EXPECT_EQ(tree.indexOfStyle(), 1);
 }
 
 /*
- * The device ResXMLParser in libandroidfw differentiates between empty namespace and null
+ * The device ResXMLParser in libandroidfw differentiates between empty
+ * namespace and null
  * namespace.
  */
 TEST_F(XmlFlattenerTest, NoNamespaceIsNotTheSameAsEmptyNamespace) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom("<View package=\"android\"/>");
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDom("<View package=\"android\"/>");
 
-    android::ResXMLTree tree;
-    ASSERT_TRUE(flatten(doc.get(), &tree));
+  android::ResXMLTree tree;
+  ASSERT_TRUE(flatten(doc.get(), &tree));
 
-    while (tree.next() != android::ResXMLTree::START_TAG) {
-        ASSERT_NE(tree.getEventType(), android::ResXMLTree::BAD_DOCUMENT);
-        ASSERT_NE(tree.getEventType(), android::ResXMLTree::END_DOCUMENT);
-    }
+  while (tree.next() != android::ResXMLTree::START_TAG) {
+    ASSERT_NE(tree.getEventType(), android::ResXMLTree::BAD_DOCUMENT);
+    ASSERT_NE(tree.getEventType(), android::ResXMLTree::END_DOCUMENT);
+  }
 
-    const StringPiece16 kPackage = u"package";
-    EXPECT_GE(tree.indexOfAttribute(nullptr, 0, kPackage.data(), kPackage.size()), 0);
+  const StringPiece16 kPackage = u"package";
+  EXPECT_GE(tree.indexOfAttribute(nullptr, 0, kPackage.data(), kPackage.size()),
+            0);
 }
 
 TEST_F(XmlFlattenerTest, EmptyStringValueInAttributeIsNotNull) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom("<View package=\"\"/>");
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDom("<View package=\"\"/>");
 
-    android::ResXMLTree tree;
-    ASSERT_TRUE(flatten(doc.get(), &tree));
+  android::ResXMLTree tree;
+  ASSERT_TRUE(flatten(doc.get(), &tree));
 
-    while (tree.next() != android::ResXMLTree::START_TAG) {
-        ASSERT_NE(tree.getEventType(), android::ResXMLTree::BAD_DOCUMENT);
-        ASSERT_NE(tree.getEventType(), android::ResXMLTree::END_DOCUMENT);
-    }
+  while (tree.next() != android::ResXMLTree::START_TAG) {
+    ASSERT_NE(tree.getEventType(), android::ResXMLTree::BAD_DOCUMENT);
+    ASSERT_NE(tree.getEventType(), android::ResXMLTree::END_DOCUMENT);
+  }
 
-    const StringPiece16 kPackage = u"package";
-    ssize_t idx = tree.indexOfAttribute(nullptr, 0, kPackage.data(), kPackage.size());
-    ASSERT_GE(idx, 0);
+  const StringPiece16 kPackage = u"package";
+  ssize_t idx =
+      tree.indexOfAttribute(nullptr, 0, kPackage.data(), kPackage.size());
+  ASSERT_GE(idx, 0);
 
-    size_t len;
-    EXPECT_NE(nullptr, tree.getAttributeStringValue(idx, &len));
+  size_t len;
+  EXPECT_NE(nullptr, tree.getAttributeStringValue(idx, &len));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/io/Data.h b/tools/aapt2/io/Data.h
index 34eed63..0479228b 100644
--- a/tools/aapt2/io/Data.h
+++ b/tools/aapt2/io/Data.h
@@ -18,105 +18,95 @@
 #define AAPT_IO_DATA_H
 
 #include <android-base/macros.h>
-#include <memory>
 #include <utils/FileMap.h>
+#include <memory>
 
 namespace aapt {
 namespace io {
 
 /**
- * Interface for a block of contiguous memory. An instance of this interface owns the data.
+ * Interface for a block of contiguous memory. An instance of this interface
+ * owns the data.
  */
 class IData {
-public:
-    virtual ~IData() = default;
+ public:
+  virtual ~IData() = default;
 
-    virtual const void* data() const = 0;
-    virtual size_t size() const = 0;
+  virtual const void* data() const = 0;
+  virtual size_t size() const = 0;
 };
 
 class DataSegment : public IData {
-public:
-    explicit DataSegment(std::unique_ptr<IData> data, size_t offset, size_t len) :
-            mData(std::move(data)), mOffset(offset), mLen(len) {
-    }
+ public:
+  explicit DataSegment(std::unique_ptr<IData> data, size_t offset, size_t len)
+      : mData(std::move(data)), mOffset(offset), mLen(len) {}
 
-    const void* data() const override {
-        return static_cast<const uint8_t*>(mData->data()) + mOffset;
-    }
+  const void* data() const override {
+    return static_cast<const uint8_t*>(mData->data()) + mOffset;
+  }
 
-    size_t size() const override {
-        return mLen;
-    }
+  size_t size() const override { return mLen; }
 
-private:
-    DISALLOW_COPY_AND_ASSIGN(DataSegment);
+ private:
+  DISALLOW_COPY_AND_ASSIGN(DataSegment);
 
-    std::unique_ptr<IData> mData;
-    size_t mOffset;
-    size_t mLen;
+  std::unique_ptr<IData> mData;
+  size_t mOffset;
+  size_t mLen;
 };
 
 /**
- * Implementation of IData that exposes a memory mapped file. The mmapped file is owned by this
+ * Implementation of IData that exposes a memory mapped file. The mmapped file
+ * is owned by this
  * object.
  */
 class MmappedData : public IData {
-public:
-    explicit MmappedData(android::FileMap&& map) : mMap(std::forward<android::FileMap>(map)) {
-    }
+ public:
+  explicit MmappedData(android::FileMap&& map)
+      : mMap(std::forward<android::FileMap>(map)) {}
 
-    const void* data() const override {
-        return mMap.getDataPtr();
-    }
+  const void* data() const override { return mMap.getDataPtr(); }
 
-    size_t size() const override {
-        return mMap.getDataLength();
-    }
+  size_t size() const override { return mMap.getDataLength(); }
 
-private:
-    android::FileMap mMap;
+ private:
+  android::FileMap mMap;
 };
 
 /**
- * Implementation of IData that exposes a block of memory that was malloc'ed (new'ed). The
+ * Implementation of IData that exposes a block of memory that was malloc'ed
+ * (new'ed). The
  * memory is owned by this object.
  */
 class MallocData : public IData {
-public:
-    MallocData(std::unique_ptr<const uint8_t[]> data, size_t size) :
-            mData(std::move(data)), mSize(size) {
-    }
+ public:
+  MallocData(std::unique_ptr<const uint8_t[]> data, size_t size)
+      : mData(std::move(data)), mSize(size) {}
 
-    const void* data() const override {
-        return mData.get();
-    }
+  const void* data() const override { return mData.get(); }
 
-    size_t size() const override {
-        return mSize;
-    }
+  size_t size() const override { return mSize; }
 
-private:
-    std::unique_ptr<const uint8_t[]> mData;
-    size_t mSize;
+ private:
+  std::unique_ptr<const uint8_t[]> mData;
+  size_t mSize;
 };
 
 /**
- * When mmap fails because the file has length 0, we use the EmptyData to simulate data of length 0.
+ * When mmap fails because the file has length 0, we use the EmptyData to
+ * simulate data of length 0.
  */
 class EmptyData : public IData {
-public:
-    const void* data() const override {
-        static const uint8_t d = 0;
-        return &d;
-    }
+ public:
+  const void* data() const override {
+    static const uint8_t d = 0;
+    return &d;
+  }
 
-    size_t size() const override {
-        return 0u;
-    }
+  size_t size() const override { return 0u; }
 };
 
-} // namespace io
-} // namespace aapt
+}  // namespace io
+}  // namespace aapt
 
 #endif /* AAPT_IO_DATA_H */
diff --git a/tools/aapt2/io/File.h b/tools/aapt2/io/File.h
index 807981e..012f446 100644
--- a/tools/aapt2/io/File.h
+++ b/tools/aapt2/io/File.h
@@ -30,83 +30,90 @@
 namespace io {
 
 /**
- * Interface for a file, which could be a real file on the file system, or a file inside
+ * Interface for a file, which could be a real file on the file system, or a
+ * file inside
  * a ZIP archive.
  */
 class IFile {
-public:
-    virtual ~IFile() = default;
+ public:
+  virtual ~IFile() = default;
 
-    /**
-     * Open the file and return it as a block of contiguous memory. How this occurs is
-     * implementation dependent. For example, if this is a file on the file system, it may
-     * simply mmap the contents. If this file represents a compressed file in a ZIP archive,
-     * it may need to inflate it to memory, incurring a copy.
-     *
-     * Returns nullptr on failure.
-     */
-    virtual std::unique_ptr<IData> openAsData() = 0;
+  /**
+   * Open the file and return it as a block of contiguous memory. How this
+   * occurs is
+   * implementation dependent. For example, if this is a file on the file
+   * system, it may
+   * simply mmap the contents. If this file represents a compressed file in a
+   * ZIP archive,
+   * it may need to inflate it to memory, incurring a copy.
+   *
+   * Returns nullptr on failure.
+   */
+  virtual std::unique_ptr<IData> openAsData() = 0;
 
-    /**
-     * Returns the source of this file. This is for presentation to the user and may not be a
-     * valid file system path (for example, it may contain a '@' sign to separate the files within
-     * a ZIP archive from the path to the containing ZIP archive.
-     */
-    virtual const Source& getSource() const = 0;
+  /**
+   * Returns the source of this file. This is for presentation to the user and
+   * may not be a
+   * valid file system path (for example, it may contain a '@' sign to separate
+   * the files within
+   * a ZIP archive from the path to the containing ZIP archive.
+   */
+  virtual const Source& getSource() const = 0;
 
-    IFile* createFileSegment(size_t offset, size_t len);
+  IFile* createFileSegment(size_t offset, size_t len);
 
-private:
-    // Any segments created from this IFile need to be owned by this IFile, so keep them
-    // in a list. This will never be read, so we prefer better insertion performance
-    // than cache locality, hence the list.
-    std::list<std::unique_ptr<IFile>> mSegments;
+ private:
+  // Any segments created from this IFile need to be owned by this IFile, so
+  // keep them
+  // in a list. This will never be read, so we prefer better insertion
+  // performance
+  // than cache locality, hence the list.
+  std::list<std::unique_ptr<IFile>> mSegments;
 };
 
 /**
- * An IFile that wraps an underlying IFile but limits it to a subsection of that file.
+ * An IFile that wraps an underlying IFile but limits it to a subsection of that
+ * file.
  */
 class FileSegment : public IFile {
-public:
-    explicit FileSegment(IFile* file, size_t offset, size_t len) :
-            mFile(file), mOffset(offset), mLen(len) {
-    }
+ public:
+  explicit FileSegment(IFile* file, size_t offset, size_t len)
+      : mFile(file), mOffset(offset), mLen(len) {}
 
-    std::unique_ptr<IData> openAsData() override;
+  std::unique_ptr<IData> openAsData() override;
 
-    const Source& getSource() const override {
-        return mFile->getSource();
-    }
+  const Source& getSource() const override { return mFile->getSource(); }
 
-private:
-    DISALLOW_COPY_AND_ASSIGN(FileSegment);
+ private:
+  DISALLOW_COPY_AND_ASSIGN(FileSegment);
 
-    IFile* mFile;
-    size_t mOffset;
-    size_t mLen;
+  IFile* mFile;
+  size_t mOffset;
+  size_t mLen;
 };
 
 class IFileCollectionIterator {
-public:
-    virtual ~IFileCollectionIterator() = default;
+ public:
+  virtual ~IFileCollectionIterator() = default;
 
-    virtual bool hasNext() = 0;
-    virtual IFile* next() = 0;
+  virtual bool hasNext() = 0;
+  virtual IFile* next() = 0;
 };
 
 /**
- * Interface for a collection of files, all of which share a common source. That source may
+ * Interface for a collection of files, all of which share a common source. That
+ * source may
  * simply be the filesystem, or a ZIP archive.
  */
 class IFileCollection {
-public:
-    virtual ~IFileCollection() = default;
+ public:
+  virtual ~IFileCollection() = default;
 
-    virtual IFile* findFile(const StringPiece& path) = 0;
-    virtual std::unique_ptr<IFileCollectionIterator> iterator() = 0;
+  virtual IFile* findFile(const StringPiece& path) = 0;
+  virtual std::unique_ptr<IFileCollectionIterator> iterator() = 0;
 };
 
-} // namespace io
-} // namespace aapt
+}  // namespace io
+}  // namespace aapt
 
 #endif /* AAPT_IO_FILE_H */
diff --git a/tools/aapt2/io/FileSystem.h b/tools/aapt2/io/FileSystem.h
index 72a932a..8584d48 100644
--- a/tools/aapt2/io/FileSystem.h
+++ b/tools/aapt2/io/FileSystem.h
@@ -28,47 +28,47 @@
  * A regular file from the file system. Uses mmap to open the data.
  */
 class RegularFile : public IFile {
-public:
-    explicit RegularFile(const Source& source);
+ public:
+  explicit RegularFile(const Source& source);
 
-    std::unique_ptr<IData> openAsData() override;
-    const Source& getSource() const override;
+  std::unique_ptr<IData> openAsData() override;
+  const Source& getSource() const override;
 
-private:
-    Source mSource;
+ private:
+  Source mSource;
 };
 
 class FileCollection;
 
 class FileCollectionIterator : public IFileCollectionIterator {
-public:
-    explicit FileCollectionIterator(FileCollection* collection);
+ public:
+  explicit FileCollectionIterator(FileCollection* collection);
 
-    bool hasNext() override;
-    io::IFile* next() override;
+  bool hasNext() override;
+  io::IFile* next() override;
 
-private:
-    std::map<std::string, std::unique_ptr<IFile>>::const_iterator mCurrent, mEnd;
+ private:
+  std::map<std::string, std::unique_ptr<IFile>>::const_iterator mCurrent, mEnd;
 };
 
 /**
  * An IFileCollection representing the file system.
  */
 class FileCollection : public IFileCollection {
-public:
-    /**
-     * Adds a file located at path. Returns the IFile representation of that file.
-     */
-    IFile* insertFile(const StringPiece& path);
-    IFile* findFile(const StringPiece& path) override;
-    std::unique_ptr<IFileCollectionIterator> iterator() override;
+ public:
+  /**
+   * Adds a file located at path. Returns the IFile representation of that file.
+   */
+  IFile* insertFile(const StringPiece& path);
+  IFile* findFile(const StringPiece& path) override;
+  std::unique_ptr<IFileCollectionIterator> iterator() override;
 
-private:
-    friend class FileCollectionIterator;
-    std::map<std::string, std::unique_ptr<IFile>> mFiles;
+ private:
+  friend class FileCollectionIterator;
+  std::map<std::string, std::unique_ptr<IFile>> mFiles;
 };
 
-} // namespace io
-} // namespace aapt
+}  // namespace io
+}  // namespace aapt
 
-#endif // AAPT_IO_FILESYSTEM_H
+#endif  // AAPT_IO_FILESYSTEM_H
diff --git a/tools/aapt2/io/Io.h b/tools/aapt2/io/Io.h
index e1e9107..49b9fc3 100644
--- a/tools/aapt2/io/Io.h
+++ b/tools/aapt2/io/Io.h
@@ -30,12 +30,10 @@
  * The code style here matches the protobuf style.
  */
 class InputStream : public google::protobuf::io::ZeroCopyInputStream {
-public:
-    virtual std::string GetError() const {
-        return {};
-    }
+ public:
+  virtual std::string GetError() const { return {}; }
 
-    virtual bool HadError() const = 0;
+  virtual bool HadError() const = 0;
 };
 
 /**
@@ -45,12 +43,10 @@
  * The code style here matches the protobuf style.
  */
 class OutputStream : public google::protobuf::io::ZeroCopyOutputStream {
-public:
-    virtual std::string GetError() const {
-        return {};
-    }
+ public:
+  virtual std::string GetError() const { return {}; }
 
-    virtual bool HadError() const = 0;
+  virtual bool HadError() const = 0;
 };
 
 /**
@@ -60,7 +56,7 @@
  */
 bool copy(OutputStream* out, InputStream* in);
 
-} // namespace io
-} // namespace aapt
+}  // namespace io
+}  // namespace aapt
 
 #endif /* AAPT_IO_IO_H */
diff --git a/tools/aapt2/io/ZipArchive.h b/tools/aapt2/io/ZipArchive.h
index 565588e..e04525f 100644
--- a/tools/aapt2/io/ZipArchive.h
+++ b/tools/aapt2/io/ZipArchive.h
@@ -20,64 +20,66 @@
 #include "io/File.h"
 #include "util/StringPiece.h"
 
-#include <map>
 #include <ziparchive/zip_archive.h>
+#include <map>
 
 namespace aapt {
 namespace io {
 
 /**
- * An IFile representing a file within a ZIP archive. If the file is compressed, it is uncompressed
- * and copied into memory when opened. Otherwise it is mmapped from the ZIP archive.
+ * An IFile representing a file within a ZIP archive. If the file is compressed,
+ * it is uncompressed
+ * and copied into memory when opened. Otherwise it is mmapped from the ZIP
+ * archive.
  */
 class ZipFile : public IFile {
-public:
-    ZipFile(ZipArchiveHandle handle, const ZipEntry& entry, const Source& source);
+ public:
+  ZipFile(ZipArchiveHandle handle, const ZipEntry& entry, const Source& source);
 
-    std::unique_ptr<IData> openAsData() override;
-    const Source& getSource() const override;
+  std::unique_ptr<IData> openAsData() override;
+  const Source& getSource() const override;
 
-private:
-    ZipArchiveHandle mZipHandle;
-    ZipEntry mZipEntry;
-    Source mSource;
+ private:
+  ZipArchiveHandle mZipHandle;
+  ZipEntry mZipEntry;
+  Source mSource;
 };
 
 class ZipFileCollection;
 
 class ZipFileCollectionIterator : public IFileCollectionIterator {
-public:
-    explicit ZipFileCollectionIterator(ZipFileCollection* collection);
+ public:
+  explicit ZipFileCollectionIterator(ZipFileCollection* collection);
 
-    bool hasNext() override;
-    io::IFile* next() override;
+  bool hasNext() override;
+  io::IFile* next() override;
 
-private:
-    std::map<std::string, std::unique_ptr<IFile>>::const_iterator mCurrent, mEnd;
+ private:
+  std::map<std::string, std::unique_ptr<IFile>>::const_iterator mCurrent, mEnd;
 };
 
 /**
  * An IFileCollection that represents a ZIP archive and the entries within it.
  */
 class ZipFileCollection : public IFileCollection {
-public:
-    static std::unique_ptr<ZipFileCollection> create(const StringPiece& path,
-                                                     std::string* outError);
+ public:
+  static std::unique_ptr<ZipFileCollection> create(const StringPiece& path,
+                                                   std::string* outError);
 
-    io::IFile* findFile(const StringPiece& path) override;
-    std::unique_ptr<IFileCollectionIterator> iterator() override;
+  io::IFile* findFile(const StringPiece& path) override;
+  std::unique_ptr<IFileCollectionIterator> iterator() override;
 
-    ~ZipFileCollection() override;
+  ~ZipFileCollection() override;
 
-private:
-    friend class ZipFileCollectionIterator;
-    ZipFileCollection();
+ private:
+  friend class ZipFileCollectionIterator;
+  ZipFileCollection();
 
-    ZipArchiveHandle mHandle;
-    std::map<std::string, std::unique_ptr<IFile>> mFiles;
+  ZipArchiveHandle mHandle;
+  std::map<std::string, std::unique_ptr<IFile>> mFiles;
 };
 
-} // namespace io
-} // namespace aapt
+}  // namespace io
+}  // namespace aapt
 
 #endif /* AAPT_IO_ZIPARCHIVE_H */
diff --git a/tools/aapt2/java/AnnotationProcessor.h b/tools/aapt2/java/AnnotationProcessor.h
index cfc32f3..5419608 100644
--- a/tools/aapt2/java/AnnotationProcessor.h
+++ b/tools/aapt2/java/AnnotationProcessor.h
@@ -52,34 +52,36 @@
  *
  */
 class AnnotationProcessor {
-public:
-    /**
-     * Adds more comments. Since resources can have various values with different configurations,
-     * we need to collect all the comments.
-     */
-    void appendComment(const StringPiece& comment);
+ public:
+  /**
+   * Adds more comments. Since resources can have various values with different
+   * configurations,
+   * we need to collect all the comments.
+   */
+  void appendComment(const StringPiece& comment);
 
-    void appendNewLine();
+  void appendNewLine();
 
-    /**
-     * Writes the comments and annotations to the stream, with the given prefix before each line.
-     */
-    void writeToStream(std::ostream* out, const StringPiece& prefix) const;
+  /**
+   * Writes the comments and annotations to the stream, with the given prefix
+   * before each line.
+   */
+  void writeToStream(std::ostream* out, const StringPiece& prefix) const;
 
-private:
-    enum : uint32_t {
-        kDeprecated = 0x01,
-        kSystemApi = 0x02,
-    };
+ private:
+  enum : uint32_t {
+    kDeprecated = 0x01,
+    kSystemApi = 0x02,
+  };
 
-    std::stringstream mComment;
-    std::stringstream mAnnotations;
-    bool mHasComments = false;
-    uint32_t mAnnotationBitMask = 0;
+  std::stringstream mComment;
+  std::stringstream mAnnotations;
+  bool mHasComments = false;
+  uint32_t mAnnotationBitMask = 0;
 
-    void appendCommentLine(std::string& line);
+  void appendCommentLine(std::string& line);
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_JAVA_ANNOTATIONPROCESSOR_H */
diff --git a/tools/aapt2/java/ClassDefinition.h b/tools/aapt2/java/ClassDefinition.h
index e84c274..bd7e7b2 100644
--- a/tools/aapt2/java/ClassDefinition.h
+++ b/tools/aapt2/java/ClassDefinition.h
@@ -33,46 +33,43 @@
 constexpr static const char* kIndent = "  ";
 
 class ClassMember {
-public:
-    virtual ~ClassMember() = default;
+ public:
+  virtual ~ClassMember() = default;
 
-    AnnotationProcessor* getCommentBuilder() {
-        return &mProcessor;
-    }
+  AnnotationProcessor* getCommentBuilder() { return &mProcessor; }
 
-    virtual bool empty() const = 0;
+  virtual bool empty() const = 0;
 
-    virtual void writeToStream(const StringPiece& prefix, bool final, std::ostream* out) const {
-        mProcessor.writeToStream(out, prefix);
-    }
+  virtual void writeToStream(const StringPiece& prefix, bool final,
+                             std::ostream* out) const {
+    mProcessor.writeToStream(out, prefix);
+  }
 
-private:
-    AnnotationProcessor mProcessor;
+ private:
+  AnnotationProcessor mProcessor;
 };
 
 template <typename T>
 class PrimitiveMember : public ClassMember {
-public:
-    PrimitiveMember(const StringPiece& name, const T& val) :
-            mName(name.toString()), mVal(val) {
-    }
+ public:
+  PrimitiveMember(const StringPiece& name, const T& val)
+      : mName(name.toString()), mVal(val) {}
 
-    bool empty() const override {
-        return false;
-    }
+  bool empty() const override { return false; }
 
-    void writeToStream(const StringPiece& prefix, bool final, std::ostream* out) const override {
-        ClassMember::writeToStream(prefix, final, out);
+  void writeToStream(const StringPiece& prefix, bool final,
+                     std::ostream* out) const override {
+    ClassMember::writeToStream(prefix, final, out);
 
-        *out << prefix << "public static " << (final ? "final " : "")
-             << "int " << mName << "=" << mVal << ";";
-    }
+    *out << prefix << "public static " << (final ? "final " : "") << "int "
+         << mName << "=" << mVal << ";";
+  }
 
-private:
-    std::string mName;
-    T mVal;
+ private:
+  std::string mName;
+  T mVal;
 
-    DISALLOW_COPY_AND_ASSIGN(PrimitiveMember);
+  DISALLOW_COPY_AND_ASSIGN(PrimitiveMember);
 };
 
 /**
@@ -80,27 +77,25 @@
  */
 template <>
 class PrimitiveMember<std::string> : public ClassMember {
-public:
-    PrimitiveMember(const StringPiece& name, const std::string& val) :
-            mName(name.toString()), mVal(val) {
-    }
+ public:
+  PrimitiveMember(const StringPiece& name, const std::string& val)
+      : mName(name.toString()), mVal(val) {}
 
-    bool empty() const override {
-        return false;
-    }
+  bool empty() const override { return false; }
 
-    void writeToStream(const StringPiece& prefix, bool final, std::ostream* out) const override {
-        ClassMember::writeToStream(prefix, final, out);
+  void writeToStream(const StringPiece& prefix, bool final,
+                     std::ostream* out) const override {
+    ClassMember::writeToStream(prefix, final, out);
 
-        *out << prefix << "public static " << (final ? "final " : "")
-             << "String " << mName << "=\"" << mVal << "\";";
-    }
+    *out << prefix << "public static " << (final ? "final " : "") << "String "
+         << mName << "=\"" << mVal << "\";";
+  }
 
-private:
-    std::string mName;
-    std::string mVal;
+ private:
+  std::string mName;
+  std::string mVal;
 
-    DISALLOW_COPY_AND_ASSIGN(PrimitiveMember);
+  DISALLOW_COPY_AND_ASSIGN(PrimitiveMember);
 };
 
 using IntMember = PrimitiveMember<uint32_t>;
@@ -109,80 +104,75 @@
 
 template <typename T>
 class PrimitiveArrayMember : public ClassMember {
-public:
-    explicit PrimitiveArrayMember(const StringPiece& name) :
-            mName(name.toString()) {
+ public:
+  explicit PrimitiveArrayMember(const StringPiece& name)
+      : mName(name.toString()) {}
+
+  void addElement(const T& val) { mElements.push_back(val); }
+
+  bool empty() const override { return false; }
+
+  void writeToStream(const StringPiece& prefix, bool final,
+                     std::ostream* out) const override {
+    ClassMember::writeToStream(prefix, final, out);
+
+    *out << prefix << "public static final int[] " << mName << "={";
+
+    const auto begin = mElements.begin();
+    const auto end = mElements.end();
+    for (auto current = begin; current != end; ++current) {
+      if (std::distance(begin, current) % kAttribsPerLine == 0) {
+        *out << "\n" << prefix << kIndent << kIndent;
+      }
+
+      *out << *current;
+      if (std::distance(current, end) > 1) {
+        *out << ", ";
+      }
     }
+    *out << "\n" << prefix << kIndent << "};";
+  }
 
-    void addElement(const T& val) {
-        mElements.push_back(val);
-    }
+ private:
+  std::string mName;
+  std::vector<T> mElements;
 
-    bool empty() const override {
-        return false;
-    }
-
-    void writeToStream(const StringPiece& prefix, bool final, std::ostream* out) const override {
-        ClassMember::writeToStream(prefix, final, out);
-
-        *out << prefix << "public static final int[] " << mName << "={";
-
-        const auto begin = mElements.begin();
-        const auto end = mElements.end();
-        for (auto current = begin; current != end; ++current) {
-            if (std::distance(begin, current) % kAttribsPerLine == 0) {
-                *out << "\n" << prefix << kIndent << kIndent;
-            }
-
-            *out << *current;
-            if (std::distance(current, end) > 1) {
-                *out << ", ";
-            }
-        }
-        *out << "\n" << prefix << kIndent <<"};";
-    }
-
-private:
-    std::string mName;
-    std::vector<T> mElements;
-
-    DISALLOW_COPY_AND_ASSIGN(PrimitiveArrayMember);
+  DISALLOW_COPY_AND_ASSIGN(PrimitiveArrayMember);
 };
 
 using ResourceArrayMember = PrimitiveArrayMember<ResourceId>;
 
-enum class ClassQualifier {
-    None,
-    Static
-};
+enum class ClassQualifier { None, Static };
 
 class ClassDefinition : public ClassMember {
-public:
-    static bool writeJavaFile(const ClassDefinition* def,
-                              const StringPiece& package,
-                              bool final,
-                              std::ostream* out);
+ public:
+  static bool writeJavaFile(const ClassDefinition* def,
+                            const StringPiece& package, bool final,
+                            std::ostream* out);
 
-    ClassDefinition(const StringPiece& name, ClassQualifier qualifier, bool createIfEmpty) :
-            mName(name.toString()), mQualifier(qualifier), mCreateIfEmpty(createIfEmpty) {
-    }
+  ClassDefinition(const StringPiece& name, ClassQualifier qualifier,
+                  bool createIfEmpty)
+      : mName(name.toString()),
+        mQualifier(qualifier),
+        mCreateIfEmpty(createIfEmpty) {}
 
-    void addMember(std::unique_ptr<ClassMember> member) {
-        mMembers.push_back(std::move(member));
-    }
+  void addMember(std::unique_ptr<ClassMember> member) {
+    mMembers.push_back(std::move(member));
+  }
 
-    bool empty() const override;
-    void writeToStream(const StringPiece& prefix, bool final, std::ostream* out) const override;
+  bool empty() const override;
+  void writeToStream(const StringPiece& prefix, bool final,
+                     std::ostream* out) const override;
 
-private:
-    std::string mName;
-    ClassQualifier mQualifier;
-    bool mCreateIfEmpty;
-    std::vector<std::unique_ptr<ClassMember>> mMembers;
+ private:
+  std::string mName;
+  ClassQualifier mQualifier;
+  bool mCreateIfEmpty;
+  std::vector<std::unique_ptr<ClassMember>> mMembers;
 
-    DISALLOW_COPY_AND_ASSIGN(ClassDefinition);
+  DISALLOW_COPY_AND_ASSIGN(ClassDefinition);
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_JAVA_CLASSDEFINITION_H */
diff --git a/tools/aapt2/java/JavaClassGenerator.h b/tools/aapt2/java/JavaClassGenerator.h
index 901a86e..2fdf268 100644
--- a/tools/aapt2/java/JavaClassGenerator.h
+++ b/tools/aapt2/java/JavaClassGenerator.h
@@ -31,72 +31,74 @@
 class ClassDefinition;
 
 struct JavaClassGeneratorOptions {
-    /*
-     * Specifies whether to use the 'final' modifier
-     * on resource entries. Default is true.
-     */
-    bool useFinal = true;
+  /*
+   * Specifies whether to use the 'final' modifier
+   * on resource entries. Default is true.
+   */
+  bool useFinal = true;
 
-    enum class SymbolTypes {
-        kAll,
-        kPublicPrivate,
-        kPublic,
-    };
+  enum class SymbolTypes {
+    kAll,
+    kPublicPrivate,
+    kPublic,
+  };
 
-    SymbolTypes types = SymbolTypes::kAll;
+  SymbolTypes types = SymbolTypes::kAll;
 
-    /**
-     * A list of JavaDoc annotations to add to the comments of all generated classes.
-     */
-    std::vector<std::string> javadocAnnotations;
+  /**
+   * A list of JavaDoc annotations to add to the comments of all generated
+   * classes.
+   */
+  std::vector<std::string> javadocAnnotations;
 };
 
 /*
  * Generates the R.java file for a resource table.
  */
 class JavaClassGenerator {
-public:
-    JavaClassGenerator(IAaptContext* context, ResourceTable* table,
-                       const JavaClassGeneratorOptions& options);
+ public:
+  JavaClassGenerator(IAaptContext* context, ResourceTable* table,
+                     const JavaClassGeneratorOptions& options);
 
-    /*
-     * Writes the R.java file to `out`. Only symbols belonging to `package` are written.
-     * All symbols technically belong to a single package, but linked libraries will
-     * have their names mangled, denoting that they came from a different package.
-     * We need to generate these symbols in a separate file.
-     * Returns true on success.
-     */
-    bool generate(const StringPiece& packageNameToGenerate, std::ostream* out);
+  /*
+   * Writes the R.java file to `out`. Only symbols belonging to `package` are
+   * written.
+   * All symbols technically belong to a single package, but linked libraries
+   * will
+   * have their names mangled, denoting that they came from a different package.
+   * We need to generate these symbols in a separate file.
+   * Returns true on success.
+   */
+  bool generate(const StringPiece& packageNameToGenerate, std::ostream* out);
 
-    bool generate(const StringPiece& packageNameToGenerate,
-                  const StringPiece& outputPackageName,
-                  std::ostream* out);
+  bool generate(const StringPiece& packageNameToGenerate,
+                const StringPiece& outputPackageName, std::ostream* out);
 
-    const std::string& getError() const;
+  const std::string& getError() const;
 
-private:
-    bool addMembersToTypeClass(const StringPiece& packageNameToGenerate,
-                               const ResourceTablePackage* package,
-                               const ResourceTableType* type,
-                               ClassDefinition* outTypeClassDef);
+ private:
+  bool addMembersToTypeClass(const StringPiece& packageNameToGenerate,
+                             const ResourceTablePackage* package,
+                             const ResourceTableType* type,
+                             ClassDefinition* outTypeClassDef);
 
-    void addMembersToStyleableClass(const StringPiece& packageNameToGenerate,
-                                    const std::string& entryName,
-                                    const Styleable* styleable,
-                                    ClassDefinition* outStyleableClassDef);
+  void addMembersToStyleableClass(const StringPiece& packageNameToGenerate,
+                                  const std::string& entryName,
+                                  const Styleable* styleable,
+                                  ClassDefinition* outStyleableClassDef);
 
-    bool skipSymbol(SymbolState state);
+  bool skipSymbol(SymbolState state);
 
-    IAaptContext* mContext;
-    ResourceTable* mTable;
-    JavaClassGeneratorOptions mOptions;
-    std::string mError;
+  IAaptContext* mContext;
+  ResourceTable* mTable;
+  JavaClassGeneratorOptions mOptions;
+  std::string mError;
 };
 
 inline const std::string& JavaClassGenerator::getError() const {
-    return mError;
+  return mError;
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_JAVA_CLASS_GENERATOR_H
+#endif  // AAPT_JAVA_CLASS_GENERATOR_H
diff --git a/tools/aapt2/java/ManifestClassGenerator.h b/tools/aapt2/java/ManifestClassGenerator.h
index f565289..1817648 100644
--- a/tools/aapt2/java/ManifestClassGenerator.h
+++ b/tools/aapt2/java/ManifestClassGenerator.h
@@ -26,8 +26,9 @@
 
 namespace aapt {
 
-std::unique_ptr<ClassDefinition> generateManifestClass(IDiagnostics* diag, xml::XmlResource* res);
+std::unique_ptr<ClassDefinition> generateManifestClass(IDiagnostics* diag,
+                                                       xml::XmlResource* res);
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_JAVA_MANIFESTCLASSGENERATOR_H */
diff --git a/tools/aapt2/java/ProguardRules.h b/tools/aapt2/java/ProguardRules.h
index c2d2bd9..7578ec2 100644
--- a/tools/aapt2/java/ProguardRules.h
+++ b/tools/aapt2/java/ProguardRules.h
@@ -30,29 +30,31 @@
 namespace proguard {
 
 class KeepSet {
-public:
-    inline void addClass(const Source& source, const std::string& className) {
-        mKeepSet[className].insert(source);
-    }
+ public:
+  inline void addClass(const Source& source, const std::string& className) {
+    mKeepSet[className].insert(source);
+  }
 
-    inline void addMethod(const Source& source, const std::string& methodName) {
-        mKeepMethodSet[methodName].insert(source);
-    }
+  inline void addMethod(const Source& source, const std::string& methodName) {
+    mKeepMethodSet[methodName].insert(source);
+  }
 
-private:
-    friend bool writeKeepSet(std::ostream* out, const KeepSet& keepSet);
+ private:
+  friend bool writeKeepSet(std::ostream* out, const KeepSet& keepSet);
 
-    std::map<std::string, std::set<Source>> mKeepSet;
-    std::map<std::string, std::set<Source>> mKeepMethodSet;
+  std::map<std::string, std::set<Source>> mKeepSet;
+  std::map<std::string, std::set<Source>> mKeepMethodSet;
 };
 
-bool collectProguardRulesForManifest(const Source& source, xml::XmlResource* res, KeepSet* keepSet,
+bool collectProguardRulesForManifest(const Source& source,
+                                     xml::XmlResource* res, KeepSet* keepSet,
                                      bool mainDexOnly = false);
-bool collectProguardRules(const Source& source, xml::XmlResource* res, KeepSet* keepSet);
+bool collectProguardRules(const Source& source, xml::XmlResource* res,
+                          KeepSet* keepSet);
 
 bool writeKeepSet(std::ostream* out, const KeepSet& keepSet);
 
-} // namespace proguard
-} // namespace aapt
+}  // namespace proguard
+}  // namespace aapt
 
-#endif // AAPT_PROGUARD_RULES_H
+#endif  // AAPT_PROGUARD_RULES_H
diff --git a/tools/aapt2/link/AutoVersioner.cpp b/tools/aapt2/link/AutoVersioner.cpp
index 8ed27c3..5ba9819 100644
--- a/tools/aapt2/link/AutoVersioner.cpp
+++ b/tools/aapt2/link/AutoVersioner.cpp
@@ -25,117 +25,128 @@
 
 namespace aapt {
 
-bool shouldGenerateVersionedResource(const ResourceEntry* entry, const ConfigDescription& config,
+bool shouldGenerateVersionedResource(const ResourceEntry* entry,
+                                     const ConfigDescription& config,
                                      const int sdkVersionToGenerate) {
-    // We assume the caller is trying to generate a version greater than the current configuration.
-    assert(sdkVersionToGenerate > config.sdkVersion);
+  // We assume the caller is trying to generate a version greater than the
+  // current configuration.
+  assert(sdkVersionToGenerate > config.sdkVersion);
 
-    const auto endIter = entry->values.end();
-    auto iter = entry->values.begin();
-    for (; iter != endIter; ++iter) {
-        if ((*iter)->config == config) {
-            break;
-        }
+  const auto endIter = entry->values.end();
+  auto iter = entry->values.begin();
+  for (; iter != endIter; ++iter) {
+    if ((*iter)->config == config) {
+      break;
     }
+  }
 
-    // The source config came from this list, so it should be here.
-    assert(iter != entry->values.end());
-    ++iter;
+  // The source config came from this list, so it should be here.
+  assert(iter != entry->values.end());
+  ++iter;
 
-    // The next configuration either only varies in sdkVersion, or it is completely different
-    // and therefore incompatible. If it is incompatible, we must generate the versioned resource.
+  // The next configuration either only varies in sdkVersion, or it is
+  // completely different
+  // and therefore incompatible. If it is incompatible, we must generate the
+  // versioned resource.
 
-    // NOTE: The ordering of configurations takes sdkVersion as higher precedence than other
-    // qualifiers, so we need to iterate through the entire list to be sure there
-    // are no higher sdk level versions of this resource.
-    ConfigDescription tempConfig(config);
-    for (; iter != endIter; ++iter) {
-        tempConfig.sdkVersion = (*iter)->config.sdkVersion;
-        if (tempConfig == (*iter)->config) {
-            // The two configs are the same, check the sdk version.
-            return sdkVersionToGenerate < (*iter)->config.sdkVersion;
-        }
+  // NOTE: The ordering of configurations takes sdkVersion as higher precedence
+  // than other
+  // qualifiers, so we need to iterate through the entire list to be sure there
+  // are no higher sdk level versions of this resource.
+  ConfigDescription tempConfig(config);
+  for (; iter != endIter; ++iter) {
+    tempConfig.sdkVersion = (*iter)->config.sdkVersion;
+    if (tempConfig == (*iter)->config) {
+      // The two configs are the same, check the sdk version.
+      return sdkVersionToGenerate < (*iter)->config.sdkVersion;
     }
+  }
 
-    // No match was found, so we should generate the versioned resource.
-    return true;
+  // No match was found, so we should generate the versioned resource.
+  return true;
 }
 
 bool AutoVersioner::consume(IAaptContext* context, ResourceTable* table) {
-    for (auto& package : table->packages) {
-        for (auto& type : package->types) {
-            if (type->type != ResourceType::kStyle) {
-                continue;
-            }
+  for (auto& package : table->packages) {
+    for (auto& type : package->types) {
+      if (type->type != ResourceType::kStyle) {
+        continue;
+      }
 
-            for (auto& entry : type->entries) {
-                for (size_t i = 0; i < entry->values.size(); i++) {
-                    ResourceConfigValue* configValue = entry->values[i].get();
-                    if (configValue->config.sdkVersion >= SDK_LOLLIPOP_MR1) {
-                        // If this configuration is only used on L-MR1 then we don't need
-                        // to do anything since we use private attributes since that version.
-                        continue;
-                    }
+      for (auto& entry : type->entries) {
+        for (size_t i = 0; i < entry->values.size(); i++) {
+          ResourceConfigValue* configValue = entry->values[i].get();
+          if (configValue->config.sdkVersion >= SDK_LOLLIPOP_MR1) {
+            // If this configuration is only used on L-MR1 then we don't need
+            // to do anything since we use private attributes since that
+            // version.
+            continue;
+          }
 
-                    if (Style* style = valueCast<Style>(configValue->value.get())) {
-                        Maybe<size_t> minSdkStripped;
-                        std::vector<Style::Entry> stripped;
+          if (Style* style = valueCast<Style>(configValue->value.get())) {
+            Maybe<size_t> minSdkStripped;
+            std::vector<Style::Entry> stripped;
 
-                        auto iter = style->entries.begin();
-                        while (iter != style->entries.end()) {
-                            assert(iter->key.id && "IDs must be assigned and linked");
+            auto iter = style->entries.begin();
+            while (iter != style->entries.end()) {
+              assert(iter->key.id && "IDs must be assigned and linked");
 
-                            // Find the SDK level that is higher than the configuration allows.
-                            const size_t sdkLevel = findAttributeSdkLevel(iter->key.id.value());
-                            if (sdkLevel > std::max<size_t>(configValue->config.sdkVersion, 1)) {
-                                // Record that we are about to strip this.
-                                stripped.emplace_back(std::move(*iter));
+              // Find the SDK level that is higher than the configuration
+              // allows.
+              const size_t sdkLevel =
+                  findAttributeSdkLevel(iter->key.id.value());
+              if (sdkLevel >
+                  std::max<size_t>(configValue->config.sdkVersion, 1)) {
+                // Record that we are about to strip this.
+                stripped.emplace_back(std::move(*iter));
 
-                                // We use the smallest SDK level to generate the new style.
-                                if (minSdkStripped) {
-                                    minSdkStripped = std::min(minSdkStripped.value(), sdkLevel);
-                                } else {
-                                    minSdkStripped = sdkLevel;
-                                }
-
-                                // Erase this from this style.
-                                iter = style->entries.erase(iter);
-                                continue;
-                            }
-                            ++iter;
-                        }
-
-                        if (minSdkStripped && !stripped.empty()) {
-                            // We found attributes from a higher SDK level. Check that
-                            // there is no other defined resource for the version we want to
-                            // generate.
-                            if (shouldGenerateVersionedResource(entry.get(),
-                                                                configValue->config,
-                                                                minSdkStripped.value())) {
-                                // Let's create a new Style for this versioned resource.
-                                ConfigDescription newConfig(configValue->config);
-                                newConfig.sdkVersion = minSdkStripped.value();
-
-                                std::unique_ptr<Style> newStyle(style->clone(&table->stringPool));
-                                newStyle->setComment(style->getComment());
-                                newStyle->setSource(style->getSource());
-
-                                // Move the previously stripped attributes into this style.
-                                newStyle->entries.insert(newStyle->entries.end(),
-                                                         std::make_move_iterator(stripped.begin()),
-                                                         std::make_move_iterator(stripped.end()));
-
-                                // Insert the new Resource into the correct place.
-                                entry->findOrCreateValue(newConfig, {})->value =
-                                        std::move(newStyle);
-                            }
-                        }
-                    }
+                // We use the smallest SDK level to generate the new style.
+                if (minSdkStripped) {
+                  minSdkStripped = std::min(minSdkStripped.value(), sdkLevel);
+                } else {
+                  minSdkStripped = sdkLevel;
                 }
+
+                // Erase this from this style.
+                iter = style->entries.erase(iter);
+                continue;
+              }
+              ++iter;
             }
+
+            if (minSdkStripped && !stripped.empty()) {
+              // We found attributes from a higher SDK level. Check that
+              // there is no other defined resource for the version we want to
+              // generate.
+              if (shouldGenerateVersionedResource(entry.get(),
+                                                  configValue->config,
+                                                  minSdkStripped.value())) {
+                // Let's create a new Style for this versioned resource.
+                ConfigDescription newConfig(configValue->config);
+                newConfig.sdkVersion = minSdkStripped.value();
+
+                std::unique_ptr<Style> newStyle(
+                    style->clone(&table->stringPool));
+                newStyle->setComment(style->getComment());
+                newStyle->setSource(style->getSource());
+
+                // Move the previously stripped attributes into this style.
+                newStyle->entries.insert(
+                    newStyle->entries.end(),
+                    std::make_move_iterator(stripped.begin()),
+                    std::make_move_iterator(stripped.end()));
+
+                // Insert the new Resource into the correct place.
+                entry->findOrCreateValue(newConfig, {})->value =
+                    std::move(newStyle);
+              }
+            }
+          }
         }
+      }
     }
-    return true;
+  }
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/AutoVersioner_test.cpp b/tools/aapt2/link/AutoVersioner_test.cpp
index 3a61da5..04bf9cd 100644
--- a/tools/aapt2/link/AutoVersioner_test.cpp
+++ b/tools/aapt2/link/AutoVersioner_test.cpp
@@ -21,102 +21,114 @@
 namespace aapt {
 
 TEST(AutoVersionerTest, GenerateVersionedResources) {
-    const ConfigDescription defaultConfig = {};
-    const ConfigDescription landConfig = test::parseConfigOrDie("land");
-    const ConfigDescription sw600dpLandConfig = test::parseConfigOrDie("sw600dp-land");
+  const ConfigDescription defaultConfig = {};
+  const ConfigDescription landConfig = test::parseConfigOrDie("land");
+  const ConfigDescription sw600dpLandConfig =
+      test::parseConfigOrDie("sw600dp-land");
 
-    ResourceEntry entry("foo");
-    entry.values.push_back(util::make_unique<ResourceConfigValue>(defaultConfig, ""));
-    entry.values.push_back(util::make_unique<ResourceConfigValue>(landConfig, ""));
-    entry.values.push_back(util::make_unique<ResourceConfigValue>(sw600dpLandConfig, ""));
+  ResourceEntry entry("foo");
+  entry.values.push_back(
+      util::make_unique<ResourceConfigValue>(defaultConfig, ""));
+  entry.values.push_back(
+      util::make_unique<ResourceConfigValue>(landConfig, ""));
+  entry.values.push_back(
+      util::make_unique<ResourceConfigValue>(sw600dpLandConfig, ""));
 
-    EXPECT_TRUE(shouldGenerateVersionedResource(&entry, defaultConfig, 17));
-    EXPECT_TRUE(shouldGenerateVersionedResource(&entry, landConfig, 17));
+  EXPECT_TRUE(shouldGenerateVersionedResource(&entry, defaultConfig, 17));
+  EXPECT_TRUE(shouldGenerateVersionedResource(&entry, landConfig, 17));
 }
 
 TEST(AutoVersionerTest, GenerateVersionedResourceWhenHigherVersionExists) {
-    const ConfigDescription defaultConfig = {};
-    const ConfigDescription sw600dpV13Config = test::parseConfigOrDie("sw600dp-v13");
-    const ConfigDescription v21Config = test::parseConfigOrDie("v21");
+  const ConfigDescription defaultConfig = {};
+  const ConfigDescription sw600dpV13Config =
+      test::parseConfigOrDie("sw600dp-v13");
+  const ConfigDescription v21Config = test::parseConfigOrDie("v21");
 
-    ResourceEntry entry("foo");
-    entry.values.push_back(util::make_unique<ResourceConfigValue>(defaultConfig, ""));
-    entry.values.push_back(util::make_unique<ResourceConfigValue>(sw600dpV13Config, ""));
-    entry.values.push_back(util::make_unique<ResourceConfigValue>(v21Config, ""));
+  ResourceEntry entry("foo");
+  entry.values.push_back(
+      util::make_unique<ResourceConfigValue>(defaultConfig, ""));
+  entry.values.push_back(
+      util::make_unique<ResourceConfigValue>(sw600dpV13Config, ""));
+  entry.values.push_back(util::make_unique<ResourceConfigValue>(v21Config, ""));
 
-    EXPECT_TRUE(shouldGenerateVersionedResource(&entry, defaultConfig, 17));
-    EXPECT_FALSE(shouldGenerateVersionedResource(&entry, defaultConfig, 22));
+  EXPECT_TRUE(shouldGenerateVersionedResource(&entry, defaultConfig, 17));
+  EXPECT_FALSE(shouldGenerateVersionedResource(&entry, defaultConfig, 22));
 }
 
 TEST(AutoVersionerTest, VersionStylesForTable) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId("app", 0x7f)
-            .addValue("app:style/Foo", test::parseConfigOrDie("v4"), ResourceId(0x7f020000),
-                      test::StyleBuilder()
-                            .addItem("android:attr/onClick", ResourceId(0x0101026f),
-                                     util::make_unique<Id>())
-                            .addItem("android:attr/paddingStart", ResourceId(0x010103b3),
-                                     util::make_unique<Id>())
-                            .addItem("android:attr/requiresSmallestWidthDp",
-                                     ResourceId(0x01010364), util::make_unique<Id>())
-                            .addItem("android:attr/colorAccent", ResourceId(0x01010435),
-                                     util::make_unique<Id>())
-                            .build())
-            .addValue("app:style/Foo", test::parseConfigOrDie("v21"), ResourceId(0x7f020000),
-                      test::StyleBuilder()
-                            .addItem("android:attr/paddingEnd", ResourceId(0x010103b4),
-                                     util::make_unique<Id>())
-                            .build())
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .setPackageId("app", 0x7f)
+          .addValue(
+              "app:style/Foo", test::parseConfigOrDie("v4"),
+              ResourceId(0x7f020000),
+              test::StyleBuilder()
+                  .addItem("android:attr/onClick", ResourceId(0x0101026f),
+                           util::make_unique<Id>())
+                  .addItem("android:attr/paddingStart", ResourceId(0x010103b3),
+                           util::make_unique<Id>())
+                  .addItem("android:attr/requiresSmallestWidthDp",
+                           ResourceId(0x01010364), util::make_unique<Id>())
+                  .addItem("android:attr/colorAccent", ResourceId(0x01010435),
+                           util::make_unique<Id>())
+                  .build())
+          .addValue(
+              "app:style/Foo", test::parseConfigOrDie("v21"),
+              ResourceId(0x7f020000),
+              test::StyleBuilder()
+                  .addItem("android:attr/paddingEnd", ResourceId(0x010103b4),
+                           util::make_unique<Id>())
+                  .build())
+          .build();
 
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
-            .setCompilationPackage("app")
-            .setPackageId(0x7f)
-            .build();
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder()
+                                              .setCompilationPackage("app")
+                                              .setPackageId(0x7f)
+                                              .build();
 
-    AutoVersioner versioner;
-    ASSERT_TRUE(versioner.consume(context.get(), table.get()));
+  AutoVersioner versioner;
+  ASSERT_TRUE(versioner.consume(context.get(), table.get()));
 
-    Style* style = test::getValueForConfig<Style>(table.get(), "app:style/Foo",
-                                                  test::parseConfigOrDie("v4"));
-    ASSERT_NE(style, nullptr);
-    ASSERT_EQ(style->entries.size(), 1u);
-    AAPT_ASSERT_TRUE(style->entries.front().key.name);
-    EXPECT_EQ(style->entries.front().key.name.value(),
-              test::parseNameOrDie("android:attr/onClick"));
+  Style* style = test::getValueForConfig<Style>(table.get(), "app:style/Foo",
+                                                test::parseConfigOrDie("v4"));
+  ASSERT_NE(style, nullptr);
+  ASSERT_EQ(style->entries.size(), 1u);
+  AAPT_ASSERT_TRUE(style->entries.front().key.name);
+  EXPECT_EQ(style->entries.front().key.name.value(),
+            test::parseNameOrDie("android:attr/onClick"));
 
-    style = test::getValueForConfig<Style>(table.get(), "app:style/Foo",
-                                           test::parseConfigOrDie("v13"));
-    ASSERT_NE(style, nullptr);
-    ASSERT_EQ(style->entries.size(), 2u);
-    AAPT_ASSERT_TRUE(style->entries[0].key.name);
-    EXPECT_EQ(style->entries[0].key.name.value(),
-              test::parseNameOrDie("android:attr/onClick"));
-    AAPT_ASSERT_TRUE(style->entries[1].key.name);
-    EXPECT_EQ(style->entries[1].key.name.value(),
-                  test::parseNameOrDie("android:attr/requiresSmallestWidthDp"));
+  style = test::getValueForConfig<Style>(table.get(), "app:style/Foo",
+                                         test::parseConfigOrDie("v13"));
+  ASSERT_NE(style, nullptr);
+  ASSERT_EQ(style->entries.size(), 2u);
+  AAPT_ASSERT_TRUE(style->entries[0].key.name);
+  EXPECT_EQ(style->entries[0].key.name.value(),
+            test::parseNameOrDie("android:attr/onClick"));
+  AAPT_ASSERT_TRUE(style->entries[1].key.name);
+  EXPECT_EQ(style->entries[1].key.name.value(),
+            test::parseNameOrDie("android:attr/requiresSmallestWidthDp"));
 
-    style = test::getValueForConfig<Style>(table.get(), "app:style/Foo",
-                                           test::parseConfigOrDie("v17"));
-    ASSERT_NE(style, nullptr);
-    ASSERT_EQ(style->entries.size(), 3u);
-    AAPT_ASSERT_TRUE(style->entries[0].key.name);
-    EXPECT_EQ(style->entries[0].key.name.value(),
-                  test::parseNameOrDie("android:attr/onClick"));
-    AAPT_ASSERT_TRUE(style->entries[1].key.name);
-    EXPECT_EQ(style->entries[1].key.name.value(),
-                  test::parseNameOrDie("android:attr/requiresSmallestWidthDp"));
-    AAPT_ASSERT_TRUE(style->entries[2].key.name);
-    EXPECT_EQ(style->entries[2].key.name.value(),
-                  test::parseNameOrDie("android:attr/paddingStart"));
+  style = test::getValueForConfig<Style>(table.get(), "app:style/Foo",
+                                         test::parseConfigOrDie("v17"));
+  ASSERT_NE(style, nullptr);
+  ASSERT_EQ(style->entries.size(), 3u);
+  AAPT_ASSERT_TRUE(style->entries[0].key.name);
+  EXPECT_EQ(style->entries[0].key.name.value(),
+            test::parseNameOrDie("android:attr/onClick"));
+  AAPT_ASSERT_TRUE(style->entries[1].key.name);
+  EXPECT_EQ(style->entries[1].key.name.value(),
+            test::parseNameOrDie("android:attr/requiresSmallestWidthDp"));
+  AAPT_ASSERT_TRUE(style->entries[2].key.name);
+  EXPECT_EQ(style->entries[2].key.name.value(),
+            test::parseNameOrDie("android:attr/paddingStart"));
 
-    style = test::getValueForConfig<Style>(table.get(), "app:style/Foo",
-                                           test::parseConfigOrDie("v21"));
-    ASSERT_NE(style, nullptr);
-    ASSERT_EQ(style->entries.size(), 1u);
-    AAPT_ASSERT_TRUE(style->entries.front().key.name);
-    EXPECT_EQ(style->entries.front().key.name.value(),
-              test::parseNameOrDie("android:attr/paddingEnd"));
+  style = test::getValueForConfig<Style>(table.get(), "app:style/Foo",
+                                         test::parseConfigOrDie("v21"));
+  ASSERT_NE(style, nullptr);
+  ASSERT_EQ(style->entries.size(), 1u);
+  AAPT_ASSERT_TRUE(style->entries.front().key.name);
+  EXPECT_EQ(style->entries.front().key.name.value(),
+            test::parseNameOrDie("android:attr/paddingEnd"));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/Link.cpp b/tools/aapt2/link/Link.cpp
index b6b4b473..a42d868 100644
--- a/tools/aapt2/link/Link.cpp
+++ b/tools/aapt2/link/Link.cpp
@@ -31,9 +31,9 @@
 #include "java/ManifestClassGenerator.h"
 #include "java/ProguardRules.h"
 #include "link/Linkers.h"
+#include "link/ManifestFixer.h"
 #include "link/ProductFilter.h"
 #include "link/ReferenceLinker.h"
-#include "link/ManifestFixer.h"
 #include "link/TableMerger.h"
 #include "process/IResourceTableConsumer.h"
 #include "process/SymbolTable.h"
@@ -47,9 +47,9 @@
 #include <android-base/file.h>
 #include <google/protobuf/io/coded_stream.h>
 
+#include <sys/stat.h>
 #include <fstream>
 #include <queue>
-#include <sys/stat.h>
 #include <unordered_map>
 #include <vector>
 
@@ -58,1908 +58,2043 @@
 namespace aapt {
 
 struct LinkOptions {
-    std::string outputPath;
-    std::string manifestPath;
-    std::vector<std::string> includePaths;
-    std::vector<std::string> overlayFiles;
+  std::string outputPath;
+  std::string manifestPath;
+  std::vector<std::string> includePaths;
+  std::vector<std::string> overlayFiles;
 
-    // Java/Proguard options.
-    Maybe<std::string> generateJavaClassPath;
-    Maybe<std::string> customJavaPackage;
-    std::set<std::string> extraJavaPackages;
-    Maybe<std::string> generateProguardRulesPath;
-    Maybe<std::string> generateMainDexProguardRulesPath;
+  // Java/Proguard options.
+  Maybe<std::string> generateJavaClassPath;
+  Maybe<std::string> customJavaPackage;
+  std::set<std::string> extraJavaPackages;
+  Maybe<std::string> generateProguardRulesPath;
+  Maybe<std::string> generateMainDexProguardRulesPath;
 
-    bool noAutoVersion = false;
-    bool noVersionVectors = false;
-    bool noResourceDeduping = false;
-    bool staticLib = false;
-    bool noStaticLibPackages = false;
-    bool generateNonFinalIds = false;
-    std::vector<std::string> javadocAnnotations;
-    bool outputToDirectory = false;
-    bool noXmlNamespaces = false;
-    bool autoAddOverlay = false;
-    bool doNotCompressAnything = false;
-    std::unordered_set<std::string> extensionsToNotCompress;
-    Maybe<std::string> privateSymbols;
-    ManifestFixerOptions manifestFixerOptions;
-    std::unordered_set<std::string> products;
+  bool noAutoVersion = false;
+  bool noVersionVectors = false;
+  bool noResourceDeduping = false;
+  bool staticLib = false;
+  bool noStaticLibPackages = false;
+  bool generateNonFinalIds = false;
+  std::vector<std::string> javadocAnnotations;
+  bool outputToDirectory = false;
+  bool noXmlNamespaces = false;
+  bool autoAddOverlay = false;
+  bool doNotCompressAnything = false;
+  std::unordered_set<std::string> extensionsToNotCompress;
+  Maybe<std::string> privateSymbols;
+  ManifestFixerOptions manifestFixerOptions;
+  std::unordered_set<std::string> products;
 
-    // Split APK options.
-    TableSplitterOptions tableSplitterOptions;
-    std::vector<SplitConstraints> splitConstraints;
-    std::vector<std::string> splitPaths;
+  // Split APK options.
+  TableSplitterOptions tableSplitterOptions;
+  std::vector<SplitConstraints> splitConstraints;
+  std::vector<std::string> splitPaths;
 
-    // Stable ID options.
-    std::unordered_map<ResourceName, ResourceId> stableIdMap;
-    Maybe<std::string> resourceIdMapPath;
+  // Stable ID options.
+  std::unordered_map<ResourceName, ResourceId> stableIdMap;
+  Maybe<std::string> resourceIdMapPath;
 };
 
 class LinkContext : public IAaptContext {
-public:
-    LinkContext() : mNameMangler({}) {
-    }
+ public:
+  LinkContext() : mNameMangler({}) {}
 
-    IDiagnostics* getDiagnostics() override {
-        return &mDiagnostics;
-    }
+  IDiagnostics* getDiagnostics() override { return &mDiagnostics; }
 
-    NameMangler* getNameMangler() override {
-        return &mNameMangler;
-    }
+  NameMangler* getNameMangler() override { return &mNameMangler; }
 
-    void setNameManglerPolicy(const NameManglerPolicy& policy) {
-        mNameMangler = NameMangler(policy);
-    }
+  void setNameManglerPolicy(const NameManglerPolicy& policy) {
+    mNameMangler = NameMangler(policy);
+  }
 
-    const std::string& getCompilationPackage() override {
-        return mCompilationPackage;
-    }
+  const std::string& getCompilationPackage() override {
+    return mCompilationPackage;
+  }
 
-    void setCompilationPackage(const StringPiece& packageName) {
-        mCompilationPackage = packageName.toString();
-    }
+  void setCompilationPackage(const StringPiece& packageName) {
+    mCompilationPackage = packageName.toString();
+  }
 
-    uint8_t getPackageId() override {
-        return mPackageId;
-    }
+  uint8_t getPackageId() override { return mPackageId; }
 
-    void setPackageId(uint8_t id) {
-        mPackageId = id;
-    }
+  void setPackageId(uint8_t id) { mPackageId = id; }
 
-    SymbolTable* getExternalSymbols() override {
-        return &mSymbols;
-    }
+  SymbolTable* getExternalSymbols() override { return &mSymbols; }
 
-    bool verbose() override {
-        return mVerbose;
-    }
+  bool verbose() override { return mVerbose; }
 
-    void setVerbose(bool val) {
-        mVerbose = val;
-    }
+  void setVerbose(bool val) { mVerbose = val; }
 
-    int getMinSdkVersion() override {
-        return mMinSdkVersion;
-    }
+  int getMinSdkVersion() override { return mMinSdkVersion; }
 
-    void setMinSdkVersion(int minSdk) {
-        mMinSdkVersion = minSdk;
-    }
+  void setMinSdkVersion(int minSdk) { mMinSdkVersion = minSdk; }
 
-private:
-    StdErrDiagnostics mDiagnostics;
-    NameMangler mNameMangler;
-    std::string mCompilationPackage;
-    uint8_t mPackageId = 0x0;
-    SymbolTable mSymbols;
-    bool mVerbose = false;
-    int mMinSdkVersion = 0;
+ private:
+  StdErrDiagnostics mDiagnostics;
+  NameMangler mNameMangler;
+  std::string mCompilationPackage;
+  uint8_t mPackageId = 0x0;
+  SymbolTable mSymbols;
+  bool mVerbose = false;
+  int mMinSdkVersion = 0;
 };
 
 static bool copyFileToArchive(io::IFile* file, const std::string& outPath,
-                              uint32_t compressionFlags,
-                              IArchiveWriter* writer, IAaptContext* context) {
-    std::unique_ptr<io::IData> data = file->openAsData();
-    if (!data) {
-        context->getDiagnostics()->error(DiagMessage(file->getSource())
-                                         << "failed to open file");
-        return false;
-    }
-
-    const uint8_t* buffer = reinterpret_cast<const uint8_t*>(data->data());
-    const size_t bufferSize = data->size();
-
-    if (context->verbose()) {
-        context->getDiagnostics()->note(DiagMessage() << "writing " << outPath << " to archive");
-    }
-
-    if (writer->startEntry(outPath, compressionFlags)) {
-        if (writer->writeEntry(buffer, bufferSize)) {
-            if (writer->finishEntry()) {
-                return true;
-            }
-        }
-    }
-
-    context->getDiagnostics()->error(DiagMessage() << "failed to write file " << outPath);
+                              uint32_t compressionFlags, IArchiveWriter* writer,
+                              IAaptContext* context) {
+  std::unique_ptr<io::IData> data = file->openAsData();
+  if (!data) {
+    context->getDiagnostics()->error(DiagMessage(file->getSource())
+                                     << "failed to open file");
     return false;
+  }
+
+  const uint8_t* buffer = reinterpret_cast<const uint8_t*>(data->data());
+  const size_t bufferSize = data->size();
+
+  if (context->verbose()) {
+    context->getDiagnostics()->note(DiagMessage() << "writing " << outPath
+                                                  << " to archive");
+  }
+
+  if (writer->startEntry(outPath, compressionFlags)) {
+    if (writer->writeEntry(buffer, bufferSize)) {
+      if (writer->finishEntry()) {
+        return true;
+      }
+    }
+  }
+
+  context->getDiagnostics()->error(DiagMessage() << "failed to write file "
+                                                 << outPath);
+  return false;
 }
 
-static bool flattenXml(xml::XmlResource* xmlRes, const StringPiece& path, Maybe<size_t> maxSdkLevel,
-                       bool keepRawValues, IArchiveWriter* writer, IAaptContext* context) {
-    BigBuffer buffer(1024);
-    XmlFlattenerOptions options = {};
-    options.keepRawValues = keepRawValues;
-    options.maxSdkLevel = maxSdkLevel;
-    XmlFlattener flattener(&buffer, options);
-    if (!flattener.consume(context, xmlRes)) {
-        return false;
-    }
-
-    if (context->verbose()) {
-        DiagMessage msg;
-        msg << "writing " << path << " to archive";
-        if (maxSdkLevel) {
-            msg << " maxSdkLevel=" << maxSdkLevel.value() << " keepRawValues=" << keepRawValues;
-        }
-        context->getDiagnostics()->note(msg);
-    }
-
-    if (writer->startEntry(path, ArchiveEntry::kCompress)) {
-        if (writer->writeEntry(buffer)) {
-            if (writer->finishEntry()) {
-                return true;
-            }
-        }
-    }
-    context->getDiagnostics()->error(DiagMessage() << "failed to write " << path << " to archive");
+static bool flattenXml(xml::XmlResource* xmlRes, const StringPiece& path,
+                       Maybe<size_t> maxSdkLevel, bool keepRawValues,
+                       IArchiveWriter* writer, IAaptContext* context) {
+  BigBuffer buffer(1024);
+  XmlFlattenerOptions options = {};
+  options.keepRawValues = keepRawValues;
+  options.maxSdkLevel = maxSdkLevel;
+  XmlFlattener flattener(&buffer, options);
+  if (!flattener.consume(context, xmlRes)) {
     return false;
+  }
+
+  if (context->verbose()) {
+    DiagMessage msg;
+    msg << "writing " << path << " to archive";
+    if (maxSdkLevel) {
+      msg << " maxSdkLevel=" << maxSdkLevel.value()
+          << " keepRawValues=" << keepRawValues;
+    }
+    context->getDiagnostics()->note(msg);
+  }
+
+  if (writer->startEntry(path, ArchiveEntry::kCompress)) {
+    if (writer->writeEntry(buffer)) {
+      if (writer->finishEntry()) {
+        return true;
+      }
+    }
+  }
+  context->getDiagnostics()->error(DiagMessage() << "failed to write " << path
+                                                 << " to archive");
+  return false;
 }
 
 static std::unique_ptr<ResourceTable> loadTableFromPb(const Source& source,
-                                                      const void* data, size_t len,
+                                                      const void* data,
+                                                      size_t len,
                                                       IDiagnostics* diag) {
-    pb::ResourceTable pbTable;
-    if (!pbTable.ParseFromArray(data, len)) {
-        diag->error(DiagMessage(source) << "invalid compiled table");
-        return {};
-    }
+  pb::ResourceTable pbTable;
+  if (!pbTable.ParseFromArray(data, len)) {
+    diag->error(DiagMessage(source) << "invalid compiled table");
+    return {};
+  }
 
-    std::unique_ptr<ResourceTable> table = deserializeTableFromPb(pbTable, source, diag);
-    if (!table) {
-        return {};
-    }
-    return table;
+  std::unique_ptr<ResourceTable> table =
+      deserializeTableFromPb(pbTable, source, diag);
+  if (!table) {
+    return {};
+  }
+  return table;
 }
 
 /**
  * Inflates an XML file from the source path.
  */
-static std::unique_ptr<xml::XmlResource> loadXml(const std::string& path, IDiagnostics* diag) {
-    std::ifstream fin(path, std::ifstream::binary);
-    if (!fin) {
-        diag->error(DiagMessage(path) << strerror(errno));
-        return {};
-    }
-    return xml::inflate(&fin, diag, Source(path));
+static std::unique_ptr<xml::XmlResource> loadXml(const std::string& path,
+                                                 IDiagnostics* diag) {
+  std::ifstream fin(path, std::ifstream::binary);
+  if (!fin) {
+    diag->error(DiagMessage(path) << strerror(errno));
+    return {};
+  }
+  return xml::inflate(&fin, diag, Source(path));
 }
 
 struct ResourceFileFlattenerOptions {
-    bool noAutoVersion = false;
-    bool noVersionVectors = false;
-    bool noXmlNamespaces = false;
-    bool keepRawValues = false;
-    bool doNotCompressAnything = false;
-    bool updateProguardSpec = false;
-    std::unordered_set<std::string> extensionsToNotCompress;
+  bool noAutoVersion = false;
+  bool noVersionVectors = false;
+  bool noXmlNamespaces = false;
+  bool keepRawValues = false;
+  bool doNotCompressAnything = false;
+  bool updateProguardSpec = false;
+  std::unordered_set<std::string> extensionsToNotCompress;
 };
 
 class ResourceFileFlattener {
-public:
-    ResourceFileFlattener(const ResourceFileFlattenerOptions& options,
-                          IAaptContext* context, proguard::KeepSet* keepSet) :
-            mOptions(options), mContext(context), mKeepSet(keepSet) {
-    }
+ public:
+  ResourceFileFlattener(const ResourceFileFlattenerOptions& options,
+                        IAaptContext* context, proguard::KeepSet* keepSet)
+      : mOptions(options), mContext(context), mKeepSet(keepSet) {}
 
-    bool flatten(ResourceTable* table, IArchiveWriter* archiveWriter);
+  bool flatten(ResourceTable* table, IArchiveWriter* archiveWriter);
 
-private:
-    struct FileOperation {
-        ConfigDescription config;
+ private:
+  struct FileOperation {
+    ConfigDescription config;
 
-        // The entry this file came from.
-        const ResourceEntry* entry;
+    // The entry this file came from.
+    const ResourceEntry* entry;
 
-        // The file to copy as-is.
-        io::IFile* fileToCopy;
+    // The file to copy as-is.
+    io::IFile* fileToCopy;
 
-        // The XML to process and flatten.
-        std::unique_ptr<xml::XmlResource> xmlToFlatten;
+    // The XML to process and flatten.
+    std::unique_ptr<xml::XmlResource> xmlToFlatten;
 
-        // The destination to write this file to.
-        std::string dstPath;
-        bool skipVersion = false;
-    };
+    // The destination to write this file to.
+    std::string dstPath;
+    bool skipVersion = false;
+  };
 
-    uint32_t getCompressionFlags(const StringPiece& str);
+  uint32_t getCompressionFlags(const StringPiece& str);
 
-    bool linkAndVersionXmlFile(ResourceTable* table, FileOperation* fileOp,
-                               std::queue<FileOperation>* outFileOpQueue);
+  bool linkAndVersionXmlFile(ResourceTable* table, FileOperation* fileOp,
+                             std::queue<FileOperation>* outFileOpQueue);
 
-    ResourceFileFlattenerOptions mOptions;
-    IAaptContext* mContext;
-    proguard::KeepSet* mKeepSet;
+  ResourceFileFlattenerOptions mOptions;
+  IAaptContext* mContext;
+  proguard::KeepSet* mKeepSet;
 };
 
 uint32_t ResourceFileFlattener::getCompressionFlags(const StringPiece& str) {
-    if (mOptions.doNotCompressAnything) {
-        return 0;
-    }
+  if (mOptions.doNotCompressAnything) {
+    return 0;
+  }
 
-    for (const std::string& extension : mOptions.extensionsToNotCompress) {
-        if (util::stringEndsWith(str, extension)) {
-            return 0;
-        }
+  for (const std::string& extension : mOptions.extensionsToNotCompress) {
+    if (util::stringEndsWith(str, extension)) {
+      return 0;
     }
-    return ArchiveEntry::kCompress;
+  }
+  return ArchiveEntry::kCompress;
 }
 
-bool ResourceFileFlattener::linkAndVersionXmlFile(ResourceTable* table,
-                                                  FileOperation* fileOp,
-                                                  std::queue<FileOperation>* outFileOpQueue) {
-    xml::XmlResource* doc = fileOp->xmlToFlatten.get();
-    const Source& src = doc->file.source;
+bool ResourceFileFlattener::linkAndVersionXmlFile(
+    ResourceTable* table, FileOperation* fileOp,
+    std::queue<FileOperation>* outFileOpQueue) {
+  xml::XmlResource* doc = fileOp->xmlToFlatten.get();
+  const Source& src = doc->file.source;
 
-    if (mContext->verbose()) {
-        mContext->getDiagnostics()->note(DiagMessage() << "linking " << src.path);
+  if (mContext->verbose()) {
+    mContext->getDiagnostics()->note(DiagMessage() << "linking " << src.path);
+  }
+
+  XmlReferenceLinker xmlLinker;
+  if (!xmlLinker.consume(mContext, doc)) {
+    return false;
+  }
+
+  if (mOptions.updateProguardSpec &&
+      !proguard::collectProguardRules(src, doc, mKeepSet)) {
+    return false;
+  }
+
+  if (mOptions.noXmlNamespaces) {
+    XmlNamespaceRemover namespaceRemover;
+    if (!namespaceRemover.consume(mContext, doc)) {
+      return false;
     }
+  }
 
-    XmlReferenceLinker xmlLinker;
-    if (!xmlLinker.consume(mContext, doc)) {
-        return false;
-    }
-
-    if (mOptions.updateProguardSpec && !proguard::collectProguardRules(src, doc, mKeepSet)) {
-        return false;
-    }
-
-    if (mOptions.noXmlNamespaces) {
-        XmlNamespaceRemover namespaceRemover;
-        if (!namespaceRemover.consume(mContext, doc)) {
-            return false;
+  if (!mOptions.noAutoVersion) {
+    if (mOptions.noVersionVectors) {
+      // Skip this if it is a vector or animated-vector.
+      xml::Element* el = xml::findRootElement(doc);
+      if (el && el->namespaceUri.empty()) {
+        if (el->name == "vector" || el->name == "animated-vector") {
+          // We are NOT going to version this file.
+          fileOp->skipVersion = true;
+          return true;
         }
+      }
     }
 
-    if (!mOptions.noAutoVersion) {
-        if (mOptions.noVersionVectors) {
-            // Skip this if it is a vector or animated-vector.
-            xml::Element* el = xml::findRootElement(doc);
-            if (el && el->namespaceUri.empty()) {
-                if (el->name == "vector" || el->name == "animated-vector") {
-                    // We are NOT going to version this file.
-                    fileOp->skipVersion = true;
-                    return true;
-                }
-            }
+    const ConfigDescription& config = fileOp->config;
+
+    // Find the first SDK level used that is higher than this defined config and
+    // not superseded by a lower or equal SDK level resource.
+    const int minSdkVersion = mContext->getMinSdkVersion();
+    for (int sdkLevel : xmlLinker.getSdkLevels()) {
+      if (sdkLevel > minSdkVersion && sdkLevel > config.sdkVersion) {
+        if (!shouldGenerateVersionedResource(fileOp->entry, config, sdkLevel)) {
+          // If we shouldn't generate a versioned resource, stop checking.
+          break;
         }
 
-        const ConfigDescription& config = fileOp->config;
+        ResourceFile versionedFileDesc = doc->file;
+        versionedFileDesc.config.sdkVersion = (uint16_t)sdkLevel;
 
-        // Find the first SDK level used that is higher than this defined config and
-        // not superseded by a lower or equal SDK level resource.
-        const int minSdkVersion = mContext->getMinSdkVersion();
-        for (int sdkLevel : xmlLinker.getSdkLevels()) {
-            if (sdkLevel > minSdkVersion && sdkLevel > config.sdkVersion) {
-                if (!shouldGenerateVersionedResource(fileOp->entry, config, sdkLevel)) {
-                    // If we shouldn't generate a versioned resource, stop checking.
-                    break;
-                }
+        FileOperation newFileOp;
+        newFileOp.xmlToFlatten = util::make_unique<xml::XmlResource>(
+            versionedFileDesc, doc->root->clone());
+        newFileOp.config = versionedFileDesc.config;
+        newFileOp.entry = fileOp->entry;
+        newFileOp.dstPath = ResourceUtils::buildResourceFileName(
+            versionedFileDesc, mContext->getNameMangler());
 
-                ResourceFile versionedFileDesc = doc->file;
-                versionedFileDesc.config.sdkVersion = (uint16_t) sdkLevel;
-
-                FileOperation newFileOp;
-                newFileOp.xmlToFlatten = util::make_unique<xml::XmlResource>(
-                        versionedFileDesc, doc->root->clone());
-                newFileOp.config = versionedFileDesc.config;
-                newFileOp.entry = fileOp->entry;
-                newFileOp.dstPath = ResourceUtils::buildResourceFileName(
-                        versionedFileDesc, mContext->getNameMangler());
-
-                if (mContext->verbose()) {
-                    mContext->getDiagnostics()->note(DiagMessage(versionedFileDesc.source)
-                                                     << "auto-versioning resource from config '"
-                                                     << config
-                                                     << "' -> '"
-                                                     << versionedFileDesc.config << "'");
-                }
-
-                bool added = table->addFileReferenceAllowMangled(versionedFileDesc.name,
-                                                                 versionedFileDesc.config,
-                                                                 versionedFileDesc.source,
-                                                                 newFileOp.dstPath,
-                                                                 nullptr,
-                                                                 mContext->getDiagnostics());
-                if (!added) {
-                    return false;
-                }
-
-                outFileOpQueue->push(std::move(newFileOp));
-                break;
-            }
+        if (mContext->verbose()) {
+          mContext->getDiagnostics()->note(
+              DiagMessage(versionedFileDesc.source)
+              << "auto-versioning resource from config '" << config << "' -> '"
+              << versionedFileDesc.config << "'");
         }
+
+        bool added = table->addFileReferenceAllowMangled(
+            versionedFileDesc.name, versionedFileDesc.config,
+            versionedFileDesc.source, newFileOp.dstPath, nullptr,
+            mContext->getDiagnostics());
+        if (!added) {
+          return false;
+        }
+
+        outFileOpQueue->push(std::move(newFileOp));
+        break;
+      }
     }
-    return true;
+  }
+  return true;
 }
 
 /**
- * Do not insert or remove any resources while executing in this function. It will
+ * Do not insert or remove any resources while executing in this function. It
+ * will
  * corrupt the iteration order.
  */
-bool ResourceFileFlattener::flatten(ResourceTable* table, IArchiveWriter* archiveWriter) {
-    bool error = false;
-    std::map<std::pair<ConfigDescription, StringPiece>, FileOperation> configSortedFiles;
+bool ResourceFileFlattener::flatten(ResourceTable* table,
+                                    IArchiveWriter* archiveWriter) {
+  bool error = false;
+  std::map<std::pair<ConfigDescription, StringPiece>, FileOperation>
+      configSortedFiles;
 
-    for (auto& pkg : table->packages) {
-        for (auto& type : pkg->types) {
-            // Sort by config and name, so that we get better locality in the zip file.
-            configSortedFiles.clear();
-            std::queue<FileOperation> fileOperations;
+  for (auto& pkg : table->packages) {
+    for (auto& type : pkg->types) {
+      // Sort by config and name, so that we get better locality in the zip
+      // file.
+      configSortedFiles.clear();
+      std::queue<FileOperation> fileOperations;
 
-            // Populate the queue with all files in the ResourceTable.
-            for (auto& entry : type->entries) {
-                for (auto& configValue : entry->values) {
-                    FileReference* fileRef = valueCast<FileReference>(configValue->value.get());
-                    if (!fileRef) {
-                        continue;
-                    }
-
-                    io::IFile* file = fileRef->file;
-                    if (!file) {
-                        mContext->getDiagnostics()->error(DiagMessage(fileRef->getSource())
-                                                          << "file not found");
-                        return false;
-                    }
-
-                    FileOperation fileOp;
-                    fileOp.entry = entry.get();
-                    fileOp.dstPath = *fileRef->path;
-                    fileOp.config = configValue->config;
-
-                    const StringPiece srcPath = file->getSource().path;
-                    if (type->type != ResourceType::kRaw &&
-                            (util::stringEndsWith(srcPath, ".xml.flat") ||
-                            util::stringEndsWith(srcPath, ".xml"))) {
-                        std::unique_ptr<io::IData> data = file->openAsData();
-                        if (!data) {
-                            mContext->getDiagnostics()->error(DiagMessage(file->getSource())
-                                                              << "failed to open file");
-                            return false;
-                        }
-
-                        fileOp.xmlToFlatten = xml::inflate(data->data(), data->size(),
-                                                           mContext->getDiagnostics(),
-                                                           file->getSource());
-
-                        if (!fileOp.xmlToFlatten) {
-                            return false;
-                        }
-
-                        fileOp.xmlToFlatten->file.config = configValue->config;
-                        fileOp.xmlToFlatten->file.source = fileRef->getSource();
-                        fileOp.xmlToFlatten->file.name =
-                                ResourceName(pkg->name, type->type, entry->name);
-
-                        // Enqueue the XML files to be processed.
-                        fileOperations.push(std::move(fileOp));
-                    } else {
-                        fileOp.fileToCopy = file;
-
-                        // NOTE(adamlesinski): Explicitly construct a StringPiece here, or else
-                        // we end up copying the string in the std::make_pair() method, then
-                        // creating a StringPiece from the copy, which would cause us to end up
-                        // referencing garbage in the map.
-                        const StringPiece entryName(entry->name);
-                        configSortedFiles[std::make_pair(configValue->config, entryName)] =
-                                std::move(fileOp);
-                    }
-                }
-            }
-
-            // Now process the XML queue
-            for (; !fileOperations.empty(); fileOperations.pop()) {
-                FileOperation& fileOp = fileOperations.front();
-
-                if (!linkAndVersionXmlFile(table, &fileOp, &fileOperations)) {
-                    error = true;
-                    continue;
-                }
-
-                // NOTE(adamlesinski): Explicitly construct a StringPiece here, or else
-                // we end up copying the string in the std::make_pair() method, then creating
-                // a StringPiece from the copy, which would cause us to end up referencing
-                // garbage in the map.
-                const StringPiece entryName(fileOp.entry->name);
-                configSortedFiles[std::make_pair(fileOp.config, entryName)] = std::move(fileOp);
-            }
-
-            if (error) {
-                return false;
-            }
-
-            // Now flatten the sorted values.
-            for (auto& mapEntry : configSortedFiles) {
-                const ConfigDescription& config = mapEntry.first.first;
-                const FileOperation& fileOp = mapEntry.second;
-
-                if (fileOp.xmlToFlatten) {
-                    Maybe<size_t> maxSdkLevel;
-                    if (!mOptions.noAutoVersion && !fileOp.skipVersion) {
-                        maxSdkLevel = std::max<size_t>(std::max<size_t>(config.sdkVersion, 1u),
-                                                       mContext->getMinSdkVersion());
-                    }
-
-                    bool result = flattenXml(fileOp.xmlToFlatten.get(), fileOp.dstPath, maxSdkLevel,
-                                             mOptions.keepRawValues,
-                                             archiveWriter, mContext);
-                    if (!result) {
-                        error = true;
-                    }
-                } else {
-                    bool result = copyFileToArchive(fileOp.fileToCopy, fileOp.dstPath,
-                                                    getCompressionFlags(fileOp.dstPath),
-                                                    archiveWriter, mContext);
-                    if (!result) {
-                        error = true;
-                    }
-                }
-            }
-        }
-    }
-    return !error;
-}
-
-static bool writeStableIdMapToPath(IDiagnostics* diag,
-                                   const std::unordered_map<ResourceName, ResourceId>& idMap,
-                                   const std::string& idMapPath) {
-    std::ofstream fout(idMapPath, std::ofstream::binary);
-    if (!fout) {
-        diag->error(DiagMessage(idMapPath) << strerror(errno));
-        return false;
-    }
-
-    for (const auto& entry : idMap) {
-        const ResourceName& name = entry.first;
-        const ResourceId& id = entry.second;
-        fout << name << " = " << id << "\n";
-    }
-
-    if (!fout) {
-        diag->error(DiagMessage(idMapPath) << "failed writing to file: " << strerror(errno));
-        return false;
-    }
-
-    return true;
-}
-
-static bool loadStableIdMap(IDiagnostics* diag, const std::string& path,
-                            std::unordered_map<ResourceName, ResourceId>* outIdMap) {
-    std::string content;
-    if (!android::base::ReadFileToString(path, &content)) {
-        diag->error(DiagMessage(path) << "failed reading stable ID file");
-        return false;
-    }
-
-    outIdMap->clear();
-    size_t lineNo = 0;
-    for (StringPiece line : util::tokenize(content, '\n')) {
-        lineNo++;
-        line = util::trimWhitespace(line);
-        if (line.empty()) {
+      // Populate the queue with all files in the ResourceTable.
+      for (auto& entry : type->entries) {
+        for (auto& configValue : entry->values) {
+          FileReference* fileRef =
+              valueCast<FileReference>(configValue->value.get());
+          if (!fileRef) {
             continue;
-        }
+          }
 
-        auto iter = std::find(line.begin(), line.end(), '=');
-        if (iter == line.end()) {
-            diag->error(DiagMessage(Source(path, lineNo)) << "missing '='");
+          io::IFile* file = fileRef->file;
+          if (!file) {
+            mContext->getDiagnostics()->error(DiagMessage(fileRef->getSource())
+                                              << "file not found");
             return false;
+          }
+
+          FileOperation fileOp;
+          fileOp.entry = entry.get();
+          fileOp.dstPath = *fileRef->path;
+          fileOp.config = configValue->config;
+
+          const StringPiece srcPath = file->getSource().path;
+          if (type->type != ResourceType::kRaw &&
+              (util::stringEndsWith(srcPath, ".xml.flat") ||
+               util::stringEndsWith(srcPath, ".xml"))) {
+            std::unique_ptr<io::IData> data = file->openAsData();
+            if (!data) {
+              mContext->getDiagnostics()->error(DiagMessage(file->getSource())
+                                                << "failed to open file");
+              return false;
+            }
+
+            fileOp.xmlToFlatten =
+                xml::inflate(data->data(), data->size(),
+                             mContext->getDiagnostics(), file->getSource());
+
+            if (!fileOp.xmlToFlatten) {
+              return false;
+            }
+
+            fileOp.xmlToFlatten->file.config = configValue->config;
+            fileOp.xmlToFlatten->file.source = fileRef->getSource();
+            fileOp.xmlToFlatten->file.name =
+                ResourceName(pkg->name, type->type, entry->name);
+
+            // Enqueue the XML files to be processed.
+            fileOperations.push(std::move(fileOp));
+          } else {
+            fileOp.fileToCopy = file;
+
+            // NOTE(adamlesinski): Explicitly construct a StringPiece here, or
+            // else
+            // we end up copying the string in the std::make_pair() method, then
+            // creating a StringPiece from the copy, which would cause us to end
+            // up
+            // referencing garbage in the map.
+            const StringPiece entryName(entry->name);
+            configSortedFiles[std::make_pair(configValue->config, entryName)] =
+                std::move(fileOp);
+          }
+        }
+      }
+
+      // Now process the XML queue
+      for (; !fileOperations.empty(); fileOperations.pop()) {
+        FileOperation& fileOp = fileOperations.front();
+
+        if (!linkAndVersionXmlFile(table, &fileOp, &fileOperations)) {
+          error = true;
+          continue;
         }
 
-        ResourceNameRef name;
-        StringPiece resNameStr = util::trimWhitespace(
-                line.substr(0, std::distance(line.begin(), iter)));
-        if (!ResourceUtils::parseResourceName(resNameStr, &name)) {
-            diag->error(DiagMessage(Source(path, lineNo))
-                        << "invalid resource name '" << resNameStr << "'");
-            return false;
+        // NOTE(adamlesinski): Explicitly construct a StringPiece here, or else
+        // we end up copying the string in the std::make_pair() method, then
+        // creating
+        // a StringPiece from the copy, which would cause us to end up
+        // referencing
+        // garbage in the map.
+        const StringPiece entryName(fileOp.entry->name);
+        configSortedFiles[std::make_pair(fileOp.config, entryName)] =
+            std::move(fileOp);
+      }
+
+      if (error) {
+        return false;
+      }
+
+      // Now flatten the sorted values.
+      for (auto& mapEntry : configSortedFiles) {
+        const ConfigDescription& config = mapEntry.first.first;
+        const FileOperation& fileOp = mapEntry.second;
+
+        if (fileOp.xmlToFlatten) {
+          Maybe<size_t> maxSdkLevel;
+          if (!mOptions.noAutoVersion && !fileOp.skipVersion) {
+            maxSdkLevel =
+                std::max<size_t>(std::max<size_t>(config.sdkVersion, 1u),
+                                 mContext->getMinSdkVersion());
+          }
+
+          bool result =
+              flattenXml(fileOp.xmlToFlatten.get(), fileOp.dstPath, maxSdkLevel,
+                         mOptions.keepRawValues, archiveWriter, mContext);
+          if (!result) {
+            error = true;
+          }
+        } else {
+          bool result = copyFileToArchive(fileOp.fileToCopy, fileOp.dstPath,
+                                          getCompressionFlags(fileOp.dstPath),
+                                          archiveWriter, mContext);
+          if (!result) {
+            error = true;
+          }
         }
-
-        const size_t resIdStartIdx = std::distance(line.begin(), iter) + 1;
-        const size_t resIdStrLen = line.size() - resIdStartIdx;
-        StringPiece resIdStr = util::trimWhitespace(line.substr(resIdStartIdx, resIdStrLen));
-
-        Maybe<ResourceId> maybeId = ResourceUtils::parseResourceId(resIdStr);
-        if (!maybeId) {
-            diag->error(DiagMessage(Source(path, lineNo)) << "invalid resource ID '"
-                        << resIdStr << "'");
-            return false;
-        }
-
-        (*outIdMap)[name.toResourceName()] = maybeId.value();
+      }
     }
-    return true;
+  }
+  return !error;
+}
+
+static bool writeStableIdMapToPath(
+    IDiagnostics* diag,
+    const std::unordered_map<ResourceName, ResourceId>& idMap,
+    const std::string& idMapPath) {
+  std::ofstream fout(idMapPath, std::ofstream::binary);
+  if (!fout) {
+    diag->error(DiagMessage(idMapPath) << strerror(errno));
+    return false;
+  }
+
+  for (const auto& entry : idMap) {
+    const ResourceName& name = entry.first;
+    const ResourceId& id = entry.second;
+    fout << name << " = " << id << "\n";
+  }
+
+  if (!fout) {
+    diag->error(DiagMessage(idMapPath) << "failed writing to file: "
+                                       << strerror(errno));
+    return false;
+  }
+
+  return true;
+}
+
+static bool loadStableIdMap(
+    IDiagnostics* diag, const std::string& path,
+    std::unordered_map<ResourceName, ResourceId>* outIdMap) {
+  std::string content;
+  if (!android::base::ReadFileToString(path, &content)) {
+    diag->error(DiagMessage(path) << "failed reading stable ID file");
+    return false;
+  }
+
+  outIdMap->clear();
+  size_t lineNo = 0;
+  for (StringPiece line : util::tokenize(content, '\n')) {
+    lineNo++;
+    line = util::trimWhitespace(line);
+    if (line.empty()) {
+      continue;
+    }
+
+    auto iter = std::find(line.begin(), line.end(), '=');
+    if (iter == line.end()) {
+      diag->error(DiagMessage(Source(path, lineNo)) << "missing '='");
+      return false;
+    }
+
+    ResourceNameRef name;
+    StringPiece resNameStr =
+        util::trimWhitespace(line.substr(0, std::distance(line.begin(), iter)));
+    if (!ResourceUtils::parseResourceName(resNameStr, &name)) {
+      diag->error(DiagMessage(Source(path, lineNo)) << "invalid resource name '"
+                                                    << resNameStr << "'");
+      return false;
+    }
+
+    const size_t resIdStartIdx = std::distance(line.begin(), iter) + 1;
+    const size_t resIdStrLen = line.size() - resIdStartIdx;
+    StringPiece resIdStr =
+        util::trimWhitespace(line.substr(resIdStartIdx, resIdStrLen));
+
+    Maybe<ResourceId> maybeId = ResourceUtils::parseResourceId(resIdStr);
+    if (!maybeId) {
+      diag->error(DiagMessage(Source(path, lineNo)) << "invalid resource ID '"
+                                                    << resIdStr << "'");
+      return false;
+    }
+
+    (*outIdMap)[name.toResourceName()] = maybeId.value();
+  }
+  return true;
 }
 
 static bool parseSplitParameter(const StringPiece& arg, IDiagnostics* diag,
-                                std::string* outPath, SplitConstraints* outSplit) {
-    std::vector<std::string> parts = util::split(arg, ':');
-    if (parts.size() != 2) {
-        diag->error(DiagMessage() << "invalid split parameter '" << arg << "'");
-        diag->note(DiagMessage() << "should be --split path/to/output.apk:<config>[,<config>...]");
-        return false;
+                                std::string* outPath,
+                                SplitConstraints* outSplit) {
+  std::vector<std::string> parts = util::split(arg, ':');
+  if (parts.size() != 2) {
+    diag->error(DiagMessage() << "invalid split parameter '" << arg << "'");
+    diag->note(
+        DiagMessage()
+        << "should be --split path/to/output.apk:<config>[,<config>...]");
+    return false;
+  }
+  *outPath = parts[0];
+  std::vector<ConfigDescription> configs;
+  for (const StringPiece& configStr : util::tokenize(parts[1], ',')) {
+    configs.push_back({});
+    if (!ConfigDescription::parse(configStr, &configs.back())) {
+      diag->error(DiagMessage() << "invalid config '" << configStr
+                                << "' in split parameter '" << arg << "'");
+      return false;
     }
-    *outPath = parts[0];
-    std::vector<ConfigDescription> configs;
-    for (const StringPiece& configStr : util::tokenize(parts[1], ',')) {
-        configs.push_back({});
-        if (!ConfigDescription::parse(configStr, &configs.back())) {
-            diag->error(DiagMessage() << "invalid config '" << configStr
-                        << "' in split parameter '" << arg << "'");
-            return false;
-        }
-    }
-    outSplit->configs.insert(configs.begin(), configs.end());
-    return true;
+  }
+  outSplit->configs.insert(configs.begin(), configs.end());
+  return true;
 }
 
 class LinkCommand {
-public:
-    LinkCommand(LinkContext* context, const LinkOptions& options) :
-            mOptions(options), mContext(context), mFinalTable(),
-            mFileCollection(util::make_unique<io::FileCollection>()) {
-    }
+ public:
+  LinkCommand(LinkContext* context, const LinkOptions& options)
+      : mOptions(options),
+        mContext(context),
+        mFinalTable(),
+        mFileCollection(util::make_unique<io::FileCollection>()) {}
 
-    /**
-     * Creates a SymbolTable that loads symbols from the various APKs and caches the
-     * results for faster lookup.
-     */
-    bool loadSymbolsFromIncludePaths() {
-        std::unique_ptr<AssetManagerSymbolSource> assetSource =
-                util::make_unique<AssetManagerSymbolSource>();
-        for (const std::string& path : mOptions.includePaths) {
-            if (mContext->verbose()) {
-                mContext->getDiagnostics()->note(DiagMessage(path) << "loading include path");
-            }
+  /**
+   * Creates a SymbolTable that loads symbols from the various APKs and caches
+   * the
+   * results for faster lookup.
+   */
+  bool loadSymbolsFromIncludePaths() {
+    std::unique_ptr<AssetManagerSymbolSource> assetSource =
+        util::make_unique<AssetManagerSymbolSource>();
+    for (const std::string& path : mOptions.includePaths) {
+      if (mContext->verbose()) {
+        mContext->getDiagnostics()->note(DiagMessage(path)
+                                         << "loading include path");
+      }
 
-            // First try to load the file as a static lib.
-            std::string errorStr;
-            std::unique_ptr<ResourceTable> staticInclude = loadStaticLibrary(path, &errorStr);
-            if (staticInclude) {
-                if (!mOptions.staticLib) {
-                    // Can't include static libraries when not building a static library.
-                    mContext->getDiagnostics()->error(
-                            DiagMessage(path) << "can't include static library when building app");
-                    return false;
-                }
-
-                // If we are using --no-static-lib-packages, we need to rename the package of this
-                // table to our compilation package.
-                if (mOptions.noStaticLibPackages) {
-                    if (ResourceTablePackage* pkg = staticInclude->findPackageById(0x7f)) {
-                        pkg->name = mContext->getCompilationPackage();
-                    }
-                }
-
-                mContext->getExternalSymbols()->appendSource(
-                        util::make_unique<ResourceTableSymbolSource>(staticInclude.get()));
-
-                mStaticTableIncludes.push_back(std::move(staticInclude));
-
-            } else if (!errorStr.empty()) {
-                // We had an error with reading, so fail.
-                mContext->getDiagnostics()->error(DiagMessage(path) << errorStr);
-                return false;
-            }
-
-            if (!assetSource->addAssetPath(path)) {
-                mContext->getDiagnostics()->error(
-                        DiagMessage(path) << "failed to load include path");
-                return false;
-            }
-        }
-
-        mContext->getExternalSymbols()->appendSource(std::move(assetSource));
-        return true;
-    }
-
-    Maybe<AppInfo> extractAppInfoFromManifest(xml::XmlResource* xmlRes, IDiagnostics* diag) {
-        // Make sure the first element is <manifest> with package attribute.
-        if (xml::Element* manifestEl = xml::findRootElement(xmlRes->root.get())) {
-            AppInfo appInfo;
-
-            if (!manifestEl->namespaceUri.empty() || manifestEl->name != "manifest") {
-                diag->error(DiagMessage(xmlRes->file.source) << "root tag must be <manifest>");
-                return {};
-            }
-
-            xml::Attribute* packageAttr = manifestEl->findAttribute({}, "package");
-            if (!packageAttr) {
-                diag->error(DiagMessage(xmlRes->file.source)
-                            << "<manifest> must have a 'package' attribute");
-                return {};
-            }
-
-            appInfo.package = packageAttr->value;
-
-            if (xml::Attribute* versionCodeAttr =
-                    manifestEl->findAttribute(xml::kSchemaAndroid, "versionCode")) {
-                Maybe<uint32_t> maybeCode = ResourceUtils::parseInt(versionCodeAttr->value);
-                if (!maybeCode) {
-                    diag->error(DiagMessage(xmlRes->file.source.withLine(manifestEl->lineNumber))
-                                << "invalid android:versionCode '"
-                                << versionCodeAttr->value << "'");
-                    return {};
-                }
-                appInfo.versionCode = maybeCode.value();
-            }
-
-            if (xml::Attribute* revisionCodeAttr =
-                    manifestEl->findAttribute(xml::kSchemaAndroid, "revisionCode")) {
-                Maybe<uint32_t> maybeCode = ResourceUtils::parseInt(revisionCodeAttr->value);
-                if (!maybeCode) {
-                    diag->error(DiagMessage(xmlRes->file.source.withLine(manifestEl->lineNumber))
-                                << "invalid android:revisionCode '"
-                                << revisionCodeAttr->value << "'");
-                    return {};
-                }
-                appInfo.revisionCode = maybeCode.value();
-            }
-
-            if (xml::Element* usesSdkEl = manifestEl->findChild({}, "uses-sdk")) {
-                if (xml::Attribute* minSdk =
-                        usesSdkEl->findAttribute(xml::kSchemaAndroid, "minSdkVersion")) {
-                    appInfo.minSdkVersion = minSdk->value;
-                }
-            }
-
-            return appInfo;
-        }
-        return {};
-    }
-
-    /**
-     * Precondition: ResourceTable doesn't have any IDs assigned yet, nor is it linked.
-     * Postcondition: ResourceTable has only one package left. All others are stripped, or there
-     *                is an error and false is returned.
-     */
-    bool verifyNoExternalPackages() {
-        auto isExtPackageFunc = [&](const std::unique_ptr<ResourceTablePackage>& pkg) -> bool {
-            return mContext->getCompilationPackage() != pkg->name ||
-                    !pkg->id ||
-                    pkg->id.value() != mContext->getPackageId();
-        };
-
-        bool error = false;
-        for (const auto& package : mFinalTable.packages) {
-            if (isExtPackageFunc(package)) {
-                // We have a package that is not related to the one we're building!
-                for (const auto& type : package->types) {
-                    for (const auto& entry : type->entries) {
-                        ResourceNameRef resName(package->name, type->type, entry->name);
-
-                        for (const auto& configValue : entry->values) {
-                            // Special case the occurrence of an ID that is being generated for the
-                            // 'android' package. This is due to legacy reasons.
-                            if (valueCast<Id>(configValue->value.get()) &&
-                                    package->name == "android") {
-                                mContext->getDiagnostics()->warn(
-                                        DiagMessage(configValue->value->getSource())
-                                        << "generated id '" << resName
-                                        << "' for external package '" << package->name
-                                        << "'");
-                            } else {
-                                mContext->getDiagnostics()->error(
-                                        DiagMessage(configValue->value->getSource())
-                                        << "defined resource '" << resName
-                                        << "' for external package '" << package->name
-                                        << "'");
-                                error = true;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        auto newEndIter = std::remove_if(mFinalTable.packages.begin(), mFinalTable.packages.end(),
-                                         isExtPackageFunc);
-        mFinalTable.packages.erase(newEndIter, mFinalTable.packages.end());
-        return !error;
-    }
-
-    /**
-     * Returns true if no IDs have been set, false otherwise.
-     */
-    bool verifyNoIdsSet() {
-        for (const auto& package : mFinalTable.packages) {
-            for (const auto& type : package->types) {
-                if (type->id) {
-                    mContext->getDiagnostics()->error(DiagMessage() << "type " << type->type
-                                                      << " has ID " << std::hex
-                                                      << (int) type->id.value()
-                                                      << std::dec << " assigned");
-                    return false;
-                }
-
-                for (const auto& entry : type->entries) {
-                    if (entry->id) {
-                        ResourceNameRef resName(package->name, type->type, entry->name);
-                        mContext->getDiagnostics()->error(DiagMessage() << "entry " << resName
-                                                          << " has ID " << std::hex
-                                                          << (int) entry->id.value()
-                                                          << std::dec << " assigned");
-                        return false;
-                    }
-                }
-            }
-        }
-        return true;
-    }
-
-    std::unique_ptr<IArchiveWriter> makeArchiveWriter(const StringPiece& out) {
-        if (mOptions.outputToDirectory) {
-            return createDirectoryArchiveWriter(mContext->getDiagnostics(), out);
-        } else {
-            return createZipFileArchiveWriter(mContext->getDiagnostics(), out);
-        }
-    }
-
-    bool flattenTable(ResourceTable* table, IArchiveWriter* writer) {
-        BigBuffer buffer(1024);
-        TableFlattener flattener(&buffer);
-        if (!flattener.consume(mContext, table)) {
-            return false;
-        }
-
-        if (writer->startEntry("resources.arsc", ArchiveEntry::kAlign)) {
-            if (writer->writeEntry(buffer)) {
-                if (writer->finishEntry()) {
-                    return true;
-                }
-            }
-        }
-
-        mContext->getDiagnostics()->error(
-                DiagMessage() << "failed to write resources.arsc to archive");
-        return false;
-    }
-
-    bool flattenTableToPb(ResourceTable* table, IArchiveWriter* writer) {
-        // Create the file/zip entry.
-        if (!writer->startEntry("resources.arsc.flat", 0)) {
-            mContext->getDiagnostics()->error(DiagMessage() << "failed to open");
-            return false;
-        }
-
-        // Make sure CopyingOutputStreamAdaptor is deleted before we call writer->finishEntry().
-        {
-            // Wrap our IArchiveWriter with an adaptor that implements the ZeroCopyOutputStream
-            // interface.
-            CopyingOutputStreamAdaptor adaptor(writer);
-
-            std::unique_ptr<pb::ResourceTable> pbTable = serializeTableToPb(table);
-            if (!pbTable->SerializeToZeroCopyStream(&adaptor)) {
-                mContext->getDiagnostics()->error(DiagMessage() << "failed to write");
-                return false;
-            }
-        }
-
-        if (!writer->finishEntry()) {
-            mContext->getDiagnostics()->error(DiagMessage() << "failed to finish entry");
-            return false;
-        }
-        return true;
-    }
-
-    bool writeJavaFile(ResourceTable* table, const StringPiece& packageNameToGenerate,
-                       const StringPiece& outPackage, const JavaClassGeneratorOptions& javaOptions) {
-        if (!mOptions.generateJavaClassPath) {
-            return true;
-        }
-
-        std::string outPath = mOptions.generateJavaClassPath.value();
-        file::appendPath(&outPath, file::packageToPath(outPackage));
-        if (!file::mkdirs(outPath)) {
-            mContext->getDiagnostics()->error(
-                    DiagMessage() << "failed to create directory '" << outPath << "'");
-            return false;
-        }
-
-        file::appendPath(&outPath, "R.java");
-
-        std::ofstream fout(outPath, std::ofstream::binary);
-        if (!fout) {
-            mContext->getDiagnostics()->error(
-                    DiagMessage() << "failed writing to '" << outPath << "': " << strerror(errno));
-            return false;
-        }
-
-        JavaClassGenerator generator(mContext, table, javaOptions);
-        if (!generator.generate(packageNameToGenerate, outPackage, &fout)) {
-            mContext->getDiagnostics()->error(DiagMessage(outPath) << generator.getError());
-            return false;
-        }
-
-        if (!fout) {
-            mContext->getDiagnostics()->error(
-                    DiagMessage() << "failed writing to '" << outPath << "': " << strerror(errno));
-        }
-        return true;
-    }
-
-    bool writeManifestJavaFile(xml::XmlResource* manifestXml) {
-        if (!mOptions.generateJavaClassPath) {
-            return true;
-        }
-
-        std::unique_ptr<ClassDefinition> manifestClass = generateManifestClass(
-                mContext->getDiagnostics(), manifestXml);
-
-        if (!manifestClass) {
-            // Something bad happened, but we already logged it, so exit.
-            return false;
-        }
-
-        if (manifestClass->empty()) {
-            // Empty Manifest class, no need to generate it.
-            return true;
-        }
-
-        // Add any JavaDoc annotations to the generated class.
-        for (const std::string& annotation : mOptions.javadocAnnotations) {
-            std::string properAnnotation = "@";
-            properAnnotation += annotation;
-            manifestClass->getCommentBuilder()->appendComment(properAnnotation);
-        }
-
-        const std::string& packageUtf8 = mContext->getCompilationPackage();
-
-        std::string outPath = mOptions.generateJavaClassPath.value();
-        file::appendPath(&outPath, file::packageToPath(packageUtf8));
-
-        if (!file::mkdirs(outPath)) {
-            mContext->getDiagnostics()->error(
-                    DiagMessage() << "failed to create directory '" << outPath << "'");
-            return false;
-        }
-
-        file::appendPath(&outPath, "Manifest.java");
-
-        std::ofstream fout(outPath, std::ofstream::binary);
-        if (!fout) {
-            mContext->getDiagnostics()->error(
-                    DiagMessage() << "failed writing to '" << outPath << "': " << strerror(errno));
-            return false;
-        }
-
-        if (!ClassDefinition::writeJavaFile(manifestClass.get(), packageUtf8, true, &fout)) {
-            mContext->getDiagnostics()->error(
-                    DiagMessage() << "failed writing to '" << outPath << "': " << strerror(errno));
-            return false;
-        }
-        return true;
-    }
-
-    bool writeProguardFile(const Maybe<std::string>& out, const proguard::KeepSet& keepSet) {
-        if (!out) {
-            return true;
-        }
-
-        const std::string& outPath = out.value();
-        std::ofstream fout(outPath, std::ofstream::binary);
-        if (!fout) {
-            mContext->getDiagnostics()->error(
-                    DiagMessage() << "failed to open '" << outPath << "': " << strerror(errno));
-            return false;
-        }
-
-        proguard::writeKeepSet(&fout, keepSet);
-        if (!fout) {
-            mContext->getDiagnostics()->error(
-                    DiagMessage() << "failed writing to '" << outPath << "': " << strerror(errno));
-            return false;
-        }
-        return true;
-    }
-
-    std::unique_ptr<ResourceTable> loadStaticLibrary(const std::string& input,
-                                                     std::string* outError) {
-        std::unique_ptr<io::ZipFileCollection> collection = io::ZipFileCollection::create(
-                input, outError);
-        if (!collection) {
-            return {};
-        }
-        return loadTablePbFromCollection(collection.get());
-    }
-
-    std::unique_ptr<ResourceTable> loadTablePbFromCollection(io::IFileCollection* collection) {
-        io::IFile* file = collection->findFile("resources.arsc.flat");
-        if (!file) {
-            return {};
-        }
-
-        std::unique_ptr<io::IData> data = file->openAsData();
-        return loadTableFromPb(file->getSource(), data->data(), data->size(),
-                               mContext->getDiagnostics());
-    }
-
-    bool mergeStaticLibrary(const std::string& input, bool override) {
-        if (mContext->verbose()) {
-            mContext->getDiagnostics()->note(DiagMessage() << "merging static library " << input);
-        }
-
-        std::string errorStr;
-        std::unique_ptr<io::ZipFileCollection> collection =
-                io::ZipFileCollection::create(input, &errorStr);
-        if (!collection) {
-            mContext->getDiagnostics()->error(DiagMessage(input) << errorStr);
-            return false;
-        }
-
-        std::unique_ptr<ResourceTable> table = loadTablePbFromCollection(collection.get());
-        if (!table) {
-            mContext->getDiagnostics()->error(DiagMessage(input) << "invalid static library");
-            return false;
-        }
-
-        ResourceTablePackage* pkg = table->findPackageById(0x7f);
-        if (!pkg) {
-            mContext->getDiagnostics()->error(DiagMessage(input)
-                                              << "static library has no package");
-            return false;
-        }
-
-        bool result;
-        if (mOptions.noStaticLibPackages) {
-            // Merge all resources as if they were in the compilation package. This is the old
-            // behaviour of aapt.
-
-            // Add the package to the set of --extra-packages so we emit an R.java for each
-            // library package.
-            if (!pkg->name.empty()) {
-                mOptions.extraJavaPackages.insert(pkg->name);
-            }
-
-            pkg->name = "";
-            if (override) {
-                result = mTableMerger->mergeOverlay(Source(input), table.get(), collection.get());
-            } else {
-                result = mTableMerger->merge(Source(input), table.get(), collection.get());
-            }
-
-        } else {
-            // This is the proper way to merge libraries, where the package name is preserved
-            // and resource names are mangled.
-            result = mTableMerger->mergeAndMangle(Source(input), pkg->name, table.get(),
-                                                  collection.get());
-        }
-
-        if (!result) {
-            return false;
-        }
-
-        // Make sure to move the collection into the set of IFileCollections.
-        mCollections.push_back(std::move(collection));
-        return true;
-    }
-
-    bool mergeResourceTable(io::IFile* file, bool override) {
-        if (mContext->verbose()) {
-            mContext->getDiagnostics()->note(DiagMessage() << "merging resource table "
-                                             << file->getSource());
-        }
-
-        std::unique_ptr<io::IData> data = file->openAsData();
-        if (!data) {
-            mContext->getDiagnostics()->error(DiagMessage(file->getSource())
-                                             << "failed to open file");
-            return false;
-        }
-
-        std::unique_ptr<ResourceTable> table = loadTableFromPb(file->getSource(),
-                                                               data->data(), data->size(),
-                                                               mContext->getDiagnostics());
-        if (!table) {
-            return false;
-        }
-
-        bool result = false;
-        if (override) {
-            result = mTableMerger->mergeOverlay(file->getSource(), table.get());
-        } else {
-            result = mTableMerger->merge(file->getSource(), table.get());
-        }
-        return result;
-    }
-
-    bool mergeCompiledFile(io::IFile* file, ResourceFile* fileDesc, bool override) {
-        if (mContext->verbose()) {
-            mContext->getDiagnostics()->note(DiagMessage()
-                                             << "merging '" << fileDesc->name
-                                             << "' from compiled file "
-                                             << file->getSource());
-        }
-
-        bool result = false;
-        if (override) {
-            result = mTableMerger->mergeFileOverlay(*fileDesc, file);
-        } else {
-            result = mTableMerger->mergeFile(*fileDesc, file);
-        }
-
-        if (!result) {
-            return false;
-        }
-
-        // Add the exports of this file to the table.
-        for (SourcedResourceName& exportedSymbol : fileDesc->exportedSymbols) {
-            if (exportedSymbol.name.package.empty()) {
-                exportedSymbol.name.package = mContext->getCompilationPackage();
-            }
-
-            ResourceNameRef resName = exportedSymbol.name;
-
-            Maybe<ResourceName> mangledName = mContext->getNameMangler()->mangleName(
-                    exportedSymbol.name);
-            if (mangledName) {
-                resName = mangledName.value();
-            }
-
-            std::unique_ptr<Id> id = util::make_unique<Id>();
-            id->setSource(fileDesc->source.withLine(exportedSymbol.line));
-            bool result = mFinalTable.addResourceAllowMangled(
-                    resName, ConfigDescription::defaultConfig(), std::string(), std::move(id),
-                    mContext->getDiagnostics());
-            if (!result) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Takes a path to load as a ZIP file and merges the files within into the master ResourceTable.
-     * If override is true, conflicting resources are allowed to override each other, in order of
-     * last seen.
-     *
-     * An io::IFileCollection is created from the ZIP file and added to the set of
-     * io::IFileCollections that are open.
-     */
-    bool mergeArchive(const std::string& input, bool override) {
-        if (mContext->verbose()) {
-            mContext->getDiagnostics()->note(DiagMessage() << "merging archive " << input);
-        }
-
-        std::string errorStr;
-        std::unique_ptr<io::ZipFileCollection> collection =
-                io::ZipFileCollection::create(input, &errorStr);
-        if (!collection) {
-            mContext->getDiagnostics()->error(DiagMessage(input) << errorStr);
-            return false;
-        }
-
-        bool error = false;
-        for (auto iter = collection->iterator(); iter->hasNext(); ) {
-            if (!mergeFile(iter->next(), override)) {
-                error = true;
-            }
-        }
-
-        // Make sure to move the collection into the set of IFileCollections.
-        mCollections.push_back(std::move(collection));
-        return !error;
-    }
-
-    /**
-     * Takes a path to load and merge into the master ResourceTable. If override is true,
-     * conflicting resources are allowed to override each other, in order of last seen.
-     *
-     * If the file path ends with .flata, .jar, .jack, or .zip the file is treated as ZIP archive
-     * and the files within are merged individually.
-     *
-     * Otherwise the files is processed on its own.
-     */
-    bool mergePath(const std::string& path, bool override) {
-        if (util::stringEndsWith(path, ".flata") ||
-                util::stringEndsWith(path, ".jar") ||
-                util::stringEndsWith(path, ".jack") ||
-                util::stringEndsWith(path, ".zip")) {
-            return mergeArchive(path, override);
-        } else if (util::stringEndsWith(path, ".apk")) {
-            return mergeStaticLibrary(path, override);
-        }
-
-        io::IFile* file = mFileCollection->insertFile(path);
-        return mergeFile(file, override);
-    }
-
-    /**
-     * Takes a file to load and merge into the master ResourceTable. If override is true,
-     * conflicting resources are allowed to override each other, in order of last seen.
-     *
-     * If the file ends with .arsc.flat, then it is loaded as a ResourceTable and merged into the
-     * master ResourceTable. If the file ends with .flat, then it is treated like a compiled file
-     * and the header data is read and merged into the final ResourceTable.
-     *
-     * All other file types are ignored. This is because these files could be coming from a zip,
-     * where we could have other files like classes.dex.
-     */
-    bool mergeFile(io::IFile* file, bool override) {
-        const Source& src = file->getSource();
-        if (util::stringEndsWith(src.path, ".arsc.flat")) {
-            return mergeResourceTable(file, override);
-
-        } else if (util::stringEndsWith(src.path, ".flat")){
-            // Try opening the file and looking for an Export header.
-            std::unique_ptr<io::IData> data = file->openAsData();
-            if (!data) {
-                mContext->getDiagnostics()->error(DiagMessage(src) << "failed to open");
-                return false;
-            }
-
-            CompiledFileInputStream inputStream(data->data(), data->size());
-            uint32_t numFiles = 0;
-            if (!inputStream.ReadLittleEndian32(&numFiles)) {
-                mContext->getDiagnostics()->error(DiagMessage(src) << "failed read num files");
-                return false;
-            }
-
-            for (uint32_t i = 0; i < numFiles; i++) {
-                pb::CompiledFile compiledFile;
-                if (!inputStream.ReadCompiledFile(&compiledFile)) {
-                    mContext->getDiagnostics()->error(DiagMessage(src)
-                                                      << "failed to read compiled file header");
-                    return false;
-                }
-
-                uint64_t offset, len;
-                if (!inputStream.ReadDataMetaData(&offset, &len)) {
-                    mContext->getDiagnostics()->error(DiagMessage(src)
-                                                      << "failed to read data meta data");
-                    return false;
-                }
-
-                std::unique_ptr<ResourceFile> resourceFile = deserializeCompiledFileFromPb(
-                        compiledFile, file->getSource(), mContext->getDiagnostics());
-                if (!resourceFile) {
-                    return false;
-                }
-
-                if (!mergeCompiledFile(file->createFileSegment(offset, len), resourceFile.get(),
-                                       override)) {
-                    return false;
-                }
-            }
-            return true;
-        }
-
-        // Ignore non .flat files. This could be classes.dex or something else that happens
-        // to be in an archive.
-        return true;
-    }
-
-    std::unique_ptr<xml::XmlResource> generateSplitManifest(const AppInfo& appInfo,
-                                                            const SplitConstraints& constraints) {
-        std::unique_ptr<xml::XmlResource> doc = util::make_unique<xml::XmlResource>();
-
-        std::unique_ptr<xml::Namespace> namespaceAndroid = util::make_unique<xml::Namespace>();
-        namespaceAndroid->namespaceUri = xml::kSchemaAndroid;
-        namespaceAndroid->namespacePrefix = "android";
-
-        std::unique_ptr<xml::Element> manifestEl = util::make_unique<xml::Element>();
-        manifestEl->name = "manifest";
-        manifestEl->attributes.push_back(
-                xml::Attribute{ "", "package", appInfo.package });
-
-        if (appInfo.versionCode) {
-            manifestEl->attributes.push_back(xml::Attribute{
-                    xml::kSchemaAndroid,
-                    "versionCode",
-                    std::to_string(appInfo.versionCode.value()) });
-        }
-
-        if (appInfo.revisionCode) {
-            manifestEl->attributes.push_back(xml::Attribute{
-                    xml::kSchemaAndroid,
-                    "revisionCode", std::to_string(appInfo.revisionCode.value()) });
-        }
-
-        std::stringstream splitName;
-        splitName << "config." << util::joiner(constraints.configs, "_");
-
-        manifestEl->attributes.push_back(
-                xml::Attribute{ "", "split", splitName.str() });
-
-        std::unique_ptr<xml::Element> applicationEl = util::make_unique<xml::Element>();
-        applicationEl->name = "application";
-        applicationEl->attributes.push_back(
-                xml::Attribute{ xml::kSchemaAndroid, "hasCode", "false" });
-
-        manifestEl->addChild(std::move(applicationEl));
-        namespaceAndroid->addChild(std::move(manifestEl));
-        doc->root = std::move(namespaceAndroid);
-        return doc;
-    }
-
-    /**
-     * Writes the AndroidManifest, ResourceTable, and all XML files referenced by the ResourceTable
-     * to the IArchiveWriter.
-     */
-    bool writeApk(IArchiveWriter* writer, proguard::KeepSet* keepSet, xml::XmlResource* manifest,
-                  ResourceTable* table) {
-        const bool keepRawValues = mOptions.staticLib;
-        bool result = flattenXml(manifest, "AndroidManifest.xml", {}, keepRawValues, writer,
-                                 mContext);
-        if (!result) {
-            return false;
-        }
-
-        ResourceFileFlattenerOptions fileFlattenerOptions;
-        fileFlattenerOptions.keepRawValues = keepRawValues;
-        fileFlattenerOptions.doNotCompressAnything = mOptions.doNotCompressAnything;
-        fileFlattenerOptions.extensionsToNotCompress = mOptions.extensionsToNotCompress;
-        fileFlattenerOptions.noAutoVersion = mOptions.noAutoVersion;
-        fileFlattenerOptions.noVersionVectors = mOptions.noVersionVectors;
-        fileFlattenerOptions.noXmlNamespaces = mOptions.noXmlNamespaces;
-        fileFlattenerOptions.updateProguardSpec =
-                static_cast<bool>(mOptions.generateProguardRulesPath);
-
-        ResourceFileFlattener fileFlattener(fileFlattenerOptions, mContext, keepSet);
-
-        if (!fileFlattener.flatten(table, writer)) {
-            mContext->getDiagnostics()->error(DiagMessage() << "failed linking file resources");
-            return false;
-        }
-
-        if (mOptions.staticLib) {
-            if (!flattenTableToPb(table, writer)) {
-                mContext->getDiagnostics()->error(DiagMessage()
-                                                  << "failed to write resources.arsc.flat");
-                return false;
-            }
-        } else {
-            if (!flattenTable(table, writer)) {
-                mContext->getDiagnostics()->error(DiagMessage()
-                                                  << "failed to write resources.arsc");
-                return false;
-            }
-        }
-        return true;
-    }
-
-    int run(const std::vector<std::string>& inputFiles) {
-        // Load the AndroidManifest.xml
-        std::unique_ptr<xml::XmlResource> manifestXml = loadXml(mOptions.manifestPath,
-                                                                mContext->getDiagnostics());
-        if (!manifestXml) {
-            return 1;
-        }
-
-        // First extract the Package name without modifying it (via --rename-manifest-package).
-        if (Maybe<AppInfo> maybeAppInfo = extractAppInfoFromManifest(manifestXml.get(),
-                                                                     mContext->getDiagnostics())) {
-            const AppInfo& appInfo = maybeAppInfo.value();
-            mContext->setCompilationPackage(appInfo.package);
-        }
-
-        ManifestFixer manifestFixer(mOptions.manifestFixerOptions);
-        if (!manifestFixer.consume(mContext, manifestXml.get())) {
-            return 1;
-        }
-
-        Maybe<AppInfo> maybeAppInfo = extractAppInfoFromManifest(manifestXml.get(),
-                                                                 mContext->getDiagnostics());
-        if (!maybeAppInfo) {
-            return 1;
-        }
-
-        const AppInfo& appInfo = maybeAppInfo.value();
-        if (appInfo.minSdkVersion) {
-            if (Maybe<int> maybeMinSdkVersion =
-                    ResourceUtils::parseSdkVersion(appInfo.minSdkVersion.value())) {
-                mContext->setMinSdkVersion(maybeMinSdkVersion.value());
-            }
-        }
-
-        mContext->setNameManglerPolicy(NameManglerPolicy{ mContext->getCompilationPackage() });
-        if (mContext->getCompilationPackage() == "android") {
-            mContext->setPackageId(0x01);
-        } else {
-            mContext->setPackageId(0x7f);
-        }
-
-        if (!loadSymbolsFromIncludePaths()) {
-            return 1;
-        }
-
-        TableMergerOptions tableMergerOptions;
-        tableMergerOptions.autoAddOverlay = mOptions.autoAddOverlay;
-        mTableMerger = util::make_unique<TableMerger>(mContext, &mFinalTable, tableMergerOptions);
-
-        if (mContext->verbose()) {
-            mContext->getDiagnostics()->note(
-                    DiagMessage() << "linking package '" << mContext->getCompilationPackage()
-                                  << "' with package ID " << std::hex
-                                  << (int) mContext->getPackageId());
-        }
-
-
-        for (const std::string& input : inputFiles) {
-            if (!mergePath(input, false)) {
-                mContext->getDiagnostics()->error(DiagMessage() << "failed parsing input");
-                return 1;
-            }
-        }
-
-        for (const std::string& input : mOptions.overlayFiles) {
-            if (!mergePath(input, true)) {
-                mContext->getDiagnostics()->error(DiagMessage() << "failed parsing overlays");
-                return 1;
-            }
-        }
-
-        if (!verifyNoExternalPackages()) {
-            return 1;
-        }
-
+      // First try to load the file as a static lib.
+      std::string errorStr;
+      std::unique_ptr<ResourceTable> staticInclude =
+          loadStaticLibrary(path, &errorStr);
+      if (staticInclude) {
         if (!mOptions.staticLib) {
-            PrivateAttributeMover mover;
-            if (!mover.consume(mContext, &mFinalTable)) {
+          // Can't include static libraries when not building a static library.
+          mContext->getDiagnostics()->error(
+              DiagMessage(path)
+              << "can't include static library when building app");
+          return false;
+        }
+
+        // If we are using --no-static-lib-packages, we need to rename the
+        // package of this
+        // table to our compilation package.
+        if (mOptions.noStaticLibPackages) {
+          if (ResourceTablePackage* pkg =
+                  staticInclude->findPackageById(0x7f)) {
+            pkg->name = mContext->getCompilationPackage();
+          }
+        }
+
+        mContext->getExternalSymbols()->appendSource(
+            util::make_unique<ResourceTableSymbolSource>(staticInclude.get()));
+
+        mStaticTableIncludes.push_back(std::move(staticInclude));
+
+      } else if (!errorStr.empty()) {
+        // We had an error with reading, so fail.
+        mContext->getDiagnostics()->error(DiagMessage(path) << errorStr);
+        return false;
+      }
+
+      if (!assetSource->addAssetPath(path)) {
+        mContext->getDiagnostics()->error(DiagMessage(path)
+                                          << "failed to load include path");
+        return false;
+      }
+    }
+
+    mContext->getExternalSymbols()->appendSource(std::move(assetSource));
+    return true;
+  }
+
+  Maybe<AppInfo> extractAppInfoFromManifest(xml::XmlResource* xmlRes,
+                                            IDiagnostics* diag) {
+    // Make sure the first element is <manifest> with package attribute.
+    if (xml::Element* manifestEl = xml::findRootElement(xmlRes->root.get())) {
+      AppInfo appInfo;
+
+      if (!manifestEl->namespaceUri.empty() || manifestEl->name != "manifest") {
+        diag->error(DiagMessage(xmlRes->file.source)
+                    << "root tag must be <manifest>");
+        return {};
+      }
+
+      xml::Attribute* packageAttr = manifestEl->findAttribute({}, "package");
+      if (!packageAttr) {
+        diag->error(DiagMessage(xmlRes->file.source)
+                    << "<manifest> must have a 'package' attribute");
+        return {};
+      }
+
+      appInfo.package = packageAttr->value;
+
+      if (xml::Attribute* versionCodeAttr =
+              manifestEl->findAttribute(xml::kSchemaAndroid, "versionCode")) {
+        Maybe<uint32_t> maybeCode =
+            ResourceUtils::parseInt(versionCodeAttr->value);
+        if (!maybeCode) {
+          diag->error(
+              DiagMessage(xmlRes->file.source.withLine(manifestEl->lineNumber))
+              << "invalid android:versionCode '" << versionCodeAttr->value
+              << "'");
+          return {};
+        }
+        appInfo.versionCode = maybeCode.value();
+      }
+
+      if (xml::Attribute* revisionCodeAttr =
+              manifestEl->findAttribute(xml::kSchemaAndroid, "revisionCode")) {
+        Maybe<uint32_t> maybeCode =
+            ResourceUtils::parseInt(revisionCodeAttr->value);
+        if (!maybeCode) {
+          diag->error(
+              DiagMessage(xmlRes->file.source.withLine(manifestEl->lineNumber))
+              << "invalid android:revisionCode '" << revisionCodeAttr->value
+              << "'");
+          return {};
+        }
+        appInfo.revisionCode = maybeCode.value();
+      }
+
+      if (xml::Element* usesSdkEl = manifestEl->findChild({}, "uses-sdk")) {
+        if (xml::Attribute* minSdk = usesSdkEl->findAttribute(
+                xml::kSchemaAndroid, "minSdkVersion")) {
+          appInfo.minSdkVersion = minSdk->value;
+        }
+      }
+
+      return appInfo;
+    }
+    return {};
+  }
+
+  /**
+   * Precondition: ResourceTable doesn't have any IDs assigned yet, nor is it
+   * linked.
+   * Postcondition: ResourceTable has only one package left. All others are
+   * stripped, or there
+   *                is an error and false is returned.
+   */
+  bool verifyNoExternalPackages() {
+    auto isExtPackageFunc =
+        [&](const std::unique_ptr<ResourceTablePackage>& pkg) -> bool {
+      return mContext->getCompilationPackage() != pkg->name || !pkg->id ||
+             pkg->id.value() != mContext->getPackageId();
+    };
+
+    bool error = false;
+    for (const auto& package : mFinalTable.packages) {
+      if (isExtPackageFunc(package)) {
+        // We have a package that is not related to the one we're building!
+        for (const auto& type : package->types) {
+          for (const auto& entry : type->entries) {
+            ResourceNameRef resName(package->name, type->type, entry->name);
+
+            for (const auto& configValue : entry->values) {
+              // Special case the occurrence of an ID that is being generated
+              // for the
+              // 'android' package. This is due to legacy reasons.
+              if (valueCast<Id>(configValue->value.get()) &&
+                  package->name == "android") {
+                mContext->getDiagnostics()->warn(
+                    DiagMessage(configValue->value->getSource())
+                    << "generated id '" << resName << "' for external package '"
+                    << package->name << "'");
+              } else {
                 mContext->getDiagnostics()->error(
-                        DiagMessage() << "failed moving private attributes");
-                return 1;
-            }
-
-            // Assign IDs if we are building a regular app.
-            IdAssigner idAssigner(&mOptions.stableIdMap);
-            if (!idAssigner.consume(mContext, &mFinalTable)) {
-                mContext->getDiagnostics()->error(DiagMessage() << "failed assigning IDs");
-                return 1;
-            }
-
-            // Now grab each ID and emit it as a file.
-            if (mOptions.resourceIdMapPath) {
-                for (auto& package : mFinalTable.packages) {
-                    for (auto& type : package->types) {
-                        for (auto& entry : type->entries) {
-                            ResourceName name(package->name, type->type, entry->name);
-                            // The IDs are guaranteed to exist.
-                            mOptions.stableIdMap[std::move(name)] = ResourceId(package->id.value(),
-                                                                               type->id.value(),
-                                                                               entry->id.value());
-                        }
-                    }
-                }
-
-                if (!writeStableIdMapToPath(mContext->getDiagnostics(),
-                                            mOptions.stableIdMap,
-                                            mOptions.resourceIdMapPath.value())) {
-                    return 1;
-                }
-            }
-        } else {
-            // Static libs are merged with other apps, and ID collisions are bad, so verify that
-            // no IDs have been set.
-            if (!verifyNoIdsSet()) {
-                return 1;
-            }
-        }
-
-        // Add the names to mangle based on our source merge earlier.
-        mContext->setNameManglerPolicy(NameManglerPolicy{
-                mContext->getCompilationPackage(), mTableMerger->getMergedPackages() });
-
-        // Add our table to the symbol table.
-        mContext->getExternalSymbols()->prependSource(
-                        util::make_unique<ResourceTableSymbolSource>(&mFinalTable));
-
-        ReferenceLinker linker;
-        if (!linker.consume(mContext, &mFinalTable)) {
-            mContext->getDiagnostics()->error(DiagMessage() << "failed linking references");
-            return 1;
-        }
-
-        if (mOptions.staticLib) {
-            if (!mOptions.products.empty()) {
-                mContext->getDiagnostics()->warn(
-                        DiagMessage() << "can't select products when building static library");
-            }
-        } else {
-            ProductFilter productFilter(mOptions.products);
-            if (!productFilter.consume(mContext, &mFinalTable)) {
-                mContext->getDiagnostics()->error(DiagMessage() << "failed stripping products");
-                return 1;
-            }
-        }
-
-        if (!mOptions.noAutoVersion) {
-            AutoVersioner versioner;
-            if (!versioner.consume(mContext, &mFinalTable)) {
-                mContext->getDiagnostics()->error(DiagMessage() << "failed versioning styles");
-                return 1;
-            }
-        }
-
-        if (!mOptions.staticLib && mContext->getMinSdkVersion() > 0) {
-            if (mContext->verbose()) {
-                mContext->getDiagnostics()->note(
-                        DiagMessage() << "collapsing resource versions for minimum SDK "
-                        << mContext->getMinSdkVersion());
-            }
-
-            VersionCollapser collapser;
-            if (!collapser.consume(mContext, &mFinalTable)) {
-                return 1;
-            }
-        }
-
-        if (!mOptions.noResourceDeduping) {
-            ResourceDeduper deduper;
-            if (!deduper.consume(mContext, &mFinalTable)) {
-                mContext->getDiagnostics()->error(DiagMessage() << "failed deduping resources");
-                return 1;
-            }
-        }
-
-        proguard::KeepSet proguardKeepSet;
-        proguard::KeepSet proguardMainDexKeepSet;
-
-        if (mOptions.staticLib) {
-            if (mOptions.tableSplitterOptions.configFilter != nullptr ||
-                    mOptions.tableSplitterOptions.preferredDensity) {
-                mContext->getDiagnostics()->warn(
-                        DiagMessage() << "can't strip resources when building static library");
-            }
-        } else {
-            // Adjust the SplitConstraints so that their SDK version is stripped if it is less
-            // than or equal to the minSdk. Otherwise the resources that have had their SDK version
-            // stripped due to minSdk won't ever match.
-            std::vector<SplitConstraints> adjustedConstraintsList;
-            adjustedConstraintsList.reserve(mOptions.splitConstraints.size());
-            for (const SplitConstraints& constraints : mOptions.splitConstraints) {
-                SplitConstraints adjustedConstraints;
-                for (const ConfigDescription& config : constraints.configs) {
-                    if (config.sdkVersion <= mContext->getMinSdkVersion()) {
-                        adjustedConstraints.configs.insert(config.copyWithoutSdkVersion());
-                    } else {
-                        adjustedConstraints.configs.insert(config);
-                    }
-                }
-                adjustedConstraintsList.push_back(std::move(adjustedConstraints));
-            }
-
-            TableSplitter tableSplitter(adjustedConstraintsList, mOptions.tableSplitterOptions);
-            if (!tableSplitter.verifySplitConstraints(mContext)) {
-                return 1;
-            }
-            tableSplitter.splitTable(&mFinalTable);
-
-            // Now we need to write out the Split APKs.
-            auto pathIter = mOptions.splitPaths.begin();
-            auto splitConstraintsIter = adjustedConstraintsList.begin();
-            for (std::unique_ptr<ResourceTable>& splitTable : tableSplitter.getSplits()) {
-                if (mContext->verbose()) {
-                    mContext->getDiagnostics()->note(
-                            DiagMessage(*pathIter) << "generating split with configurations '"
-                            << util::joiner(splitConstraintsIter->configs, ", ") << "'");
-                }
-
-                std::unique_ptr<IArchiveWriter> archiveWriter = makeArchiveWriter(*pathIter);
-                if (!archiveWriter) {
-                    mContext->getDiagnostics()->error(DiagMessage() << "failed to create archive");
-                    return 1;
-                }
-
-                // Generate an AndroidManifest.xml for each split.
-                std::unique_ptr<xml::XmlResource> splitManifest =
-                        generateSplitManifest(appInfo, *splitConstraintsIter);
-
-                XmlReferenceLinker linker;
-                if (!linker.consume(mContext, splitManifest.get())) {
-                    mContext->getDiagnostics()->error(
-                            DiagMessage() << "failed to create Split AndroidManifest.xml");
-                    return 1;
-                }
-
-                if (!writeApk(archiveWriter.get(), &proguardKeepSet, splitManifest.get(),
-                              splitTable.get())) {
-                    return 1;
-                }
-
-                ++pathIter;
-                ++splitConstraintsIter;
-            }
-        }
-
-        // Start writing the base APK.
-        std::unique_ptr<IArchiveWriter> archiveWriter = makeArchiveWriter(mOptions.outputPath);
-        if (!archiveWriter) {
-            mContext->getDiagnostics()->error(DiagMessage() << "failed to create archive");
-            return 1;
-        }
-
-        bool error = false;
-        {
-            // AndroidManifest.xml has no resource name, but the CallSite is built from the name
-            // (aka, which package the AndroidManifest.xml is coming from).
-            // So we give it a package name so it can see local resources.
-            manifestXml->file.name.package = mContext->getCompilationPackage();
-
-            XmlReferenceLinker manifestLinker;
-            if (manifestLinker.consume(mContext, manifestXml.get())) {
-                if (mOptions.generateProguardRulesPath &&
-                        !proguard::collectProguardRulesForManifest(Source(mOptions.manifestPath),
-                                                                   manifestXml.get(),
-                                                                   &proguardKeepSet)) {
-                    error = true;
-                }
-
-                if (mOptions.generateMainDexProguardRulesPath &&
-                        !proguard::collectProguardRulesForManifest(Source(mOptions.manifestPath),
-                                                                   manifestXml.get(),
-                                                                   &proguardMainDexKeepSet,
-                                                                   true)) {
-                    error = true;
-                }
-
-                if (mOptions.generateJavaClassPath) {
-                    if (!writeManifestJavaFile(manifestXml.get())) {
-                        error = true;
-                    }
-                }
-
-                if (mOptions.noXmlNamespaces) {
-                    // PackageParser will fail if URIs are removed from AndroidManifest.xml.
-                    XmlNamespaceRemover namespaceRemover(true /* keepUris */);
-                    if (!namespaceRemover.consume(mContext, manifestXml.get())) {
-                        error = true;
-                    }
-                }
-            } else {
+                    DiagMessage(configValue->value->getSource())
+                    << "defined resource '" << resName
+                    << "' for external package '" << package->name << "'");
                 error = true;
+              }
             }
+          }
+        }
+      }
+    }
+
+    auto newEndIter =
+        std::remove_if(mFinalTable.packages.begin(), mFinalTable.packages.end(),
+                       isExtPackageFunc);
+    mFinalTable.packages.erase(newEndIter, mFinalTable.packages.end());
+    return !error;
+  }
+
+  /**
+   * Returns true if no IDs have been set, false otherwise.
+   */
+  bool verifyNoIdsSet() {
+    for (const auto& package : mFinalTable.packages) {
+      for (const auto& type : package->types) {
+        if (type->id) {
+          mContext->getDiagnostics()->error(
+              DiagMessage() << "type " << type->type << " has ID " << std::hex
+                            << (int)type->id.value() << std::dec
+                            << " assigned");
+          return false;
         }
 
-        if (error) {
-            mContext->getDiagnostics()->error(DiagMessage() << "failed processing manifest");
-            return 1;
+        for (const auto& entry : type->entries) {
+          if (entry->id) {
+            ResourceNameRef resName(package->name, type->type, entry->name);
+            mContext->getDiagnostics()->error(
+                DiagMessage() << "entry " << resName << " has ID " << std::hex
+                              << (int)entry->id.value() << std::dec
+                              << " assigned");
+            return false;
+          }
+        }
+      }
+    }
+    return true;
+  }
+
+  std::unique_ptr<IArchiveWriter> makeArchiveWriter(const StringPiece& out) {
+    if (mOptions.outputToDirectory) {
+      return createDirectoryArchiveWriter(mContext->getDiagnostics(), out);
+    } else {
+      return createZipFileArchiveWriter(mContext->getDiagnostics(), out);
+    }
+  }
+
+  bool flattenTable(ResourceTable* table, IArchiveWriter* writer) {
+    BigBuffer buffer(1024);
+    TableFlattener flattener(&buffer);
+    if (!flattener.consume(mContext, table)) {
+      return false;
+    }
+
+    if (writer->startEntry("resources.arsc", ArchiveEntry::kAlign)) {
+      if (writer->writeEntry(buffer)) {
+        if (writer->finishEntry()) {
+          return true;
+        }
+      }
+    }
+
+    mContext->getDiagnostics()->error(
+        DiagMessage() << "failed to write resources.arsc to archive");
+    return false;
+  }
+
+  bool flattenTableToPb(ResourceTable* table, IArchiveWriter* writer) {
+    // Create the file/zip entry.
+    if (!writer->startEntry("resources.arsc.flat", 0)) {
+      mContext->getDiagnostics()->error(DiagMessage() << "failed to open");
+      return false;
+    }
+
+    // Make sure CopyingOutputStreamAdaptor is deleted before we call
+    // writer->finishEntry().
+    {
+      // Wrap our IArchiveWriter with an adaptor that implements the
+      // ZeroCopyOutputStream
+      // interface.
+      CopyingOutputStreamAdaptor adaptor(writer);
+
+      std::unique_ptr<pb::ResourceTable> pbTable = serializeTableToPb(table);
+      if (!pbTable->SerializeToZeroCopyStream(&adaptor)) {
+        mContext->getDiagnostics()->error(DiagMessage() << "failed to write");
+        return false;
+      }
+    }
+
+    if (!writer->finishEntry()) {
+      mContext->getDiagnostics()->error(DiagMessage()
+                                        << "failed to finish entry");
+      return false;
+    }
+    return true;
+  }
+
+  bool writeJavaFile(ResourceTable* table,
+                     const StringPiece& packageNameToGenerate,
+                     const StringPiece& outPackage,
+                     const JavaClassGeneratorOptions& javaOptions) {
+    if (!mOptions.generateJavaClassPath) {
+      return true;
+    }
+
+    std::string outPath = mOptions.generateJavaClassPath.value();
+    file::appendPath(&outPath, file::packageToPath(outPackage));
+    if (!file::mkdirs(outPath)) {
+      mContext->getDiagnostics()->error(
+          DiagMessage() << "failed to create directory '" << outPath << "'");
+      return false;
+    }
+
+    file::appendPath(&outPath, "R.java");
+
+    std::ofstream fout(outPath, std::ofstream::binary);
+    if (!fout) {
+      mContext->getDiagnostics()->error(DiagMessage()
+                                        << "failed writing to '" << outPath
+                                        << "': " << strerror(errno));
+      return false;
+    }
+
+    JavaClassGenerator generator(mContext, table, javaOptions);
+    if (!generator.generate(packageNameToGenerate, outPackage, &fout)) {
+      mContext->getDiagnostics()->error(DiagMessage(outPath)
+                                        << generator.getError());
+      return false;
+    }
+
+    if (!fout) {
+      mContext->getDiagnostics()->error(DiagMessage()
+                                        << "failed writing to '" << outPath
+                                        << "': " << strerror(errno));
+    }
+    return true;
+  }
+
+  bool writeManifestJavaFile(xml::XmlResource* manifestXml) {
+    if (!mOptions.generateJavaClassPath) {
+      return true;
+    }
+
+    std::unique_ptr<ClassDefinition> manifestClass =
+        generateManifestClass(mContext->getDiagnostics(), manifestXml);
+
+    if (!manifestClass) {
+      // Something bad happened, but we already logged it, so exit.
+      return false;
+    }
+
+    if (manifestClass->empty()) {
+      // Empty Manifest class, no need to generate it.
+      return true;
+    }
+
+    // Add any JavaDoc annotations to the generated class.
+    for (const std::string& annotation : mOptions.javadocAnnotations) {
+      std::string properAnnotation = "@";
+      properAnnotation += annotation;
+      manifestClass->getCommentBuilder()->appendComment(properAnnotation);
+    }
+
+    const std::string& packageUtf8 = mContext->getCompilationPackage();
+
+    std::string outPath = mOptions.generateJavaClassPath.value();
+    file::appendPath(&outPath, file::packageToPath(packageUtf8));
+
+    if (!file::mkdirs(outPath)) {
+      mContext->getDiagnostics()->error(
+          DiagMessage() << "failed to create directory '" << outPath << "'");
+      return false;
+    }
+
+    file::appendPath(&outPath, "Manifest.java");
+
+    std::ofstream fout(outPath, std::ofstream::binary);
+    if (!fout) {
+      mContext->getDiagnostics()->error(DiagMessage()
+                                        << "failed writing to '" << outPath
+                                        << "': " << strerror(errno));
+      return false;
+    }
+
+    if (!ClassDefinition::writeJavaFile(manifestClass.get(), packageUtf8, true,
+                                        &fout)) {
+      mContext->getDiagnostics()->error(DiagMessage()
+                                        << "failed writing to '" << outPath
+                                        << "': " << strerror(errno));
+      return false;
+    }
+    return true;
+  }
+
+  bool writeProguardFile(const Maybe<std::string>& out,
+                         const proguard::KeepSet& keepSet) {
+    if (!out) {
+      return true;
+    }
+
+    const std::string& outPath = out.value();
+    std::ofstream fout(outPath, std::ofstream::binary);
+    if (!fout) {
+      mContext->getDiagnostics()->error(DiagMessage()
+                                        << "failed to open '" << outPath
+                                        << "': " << strerror(errno));
+      return false;
+    }
+
+    proguard::writeKeepSet(&fout, keepSet);
+    if (!fout) {
+      mContext->getDiagnostics()->error(DiagMessage()
+                                        << "failed writing to '" << outPath
+                                        << "': " << strerror(errno));
+      return false;
+    }
+    return true;
+  }
+
+  std::unique_ptr<ResourceTable> loadStaticLibrary(const std::string& input,
+                                                   std::string* outError) {
+    std::unique_ptr<io::ZipFileCollection> collection =
+        io::ZipFileCollection::create(input, outError);
+    if (!collection) {
+      return {};
+    }
+    return loadTablePbFromCollection(collection.get());
+  }
+
+  std::unique_ptr<ResourceTable> loadTablePbFromCollection(
+      io::IFileCollection* collection) {
+    io::IFile* file = collection->findFile("resources.arsc.flat");
+    if (!file) {
+      return {};
+    }
+
+    std::unique_ptr<io::IData> data = file->openAsData();
+    return loadTableFromPb(file->getSource(), data->data(), data->size(),
+                           mContext->getDiagnostics());
+  }
+
+  bool mergeStaticLibrary(const std::string& input, bool override) {
+    if (mContext->verbose()) {
+      mContext->getDiagnostics()->note(DiagMessage()
+                                       << "merging static library " << input);
+    }
+
+    std::string errorStr;
+    std::unique_ptr<io::ZipFileCollection> collection =
+        io::ZipFileCollection::create(input, &errorStr);
+    if (!collection) {
+      mContext->getDiagnostics()->error(DiagMessage(input) << errorStr);
+      return false;
+    }
+
+    std::unique_ptr<ResourceTable> table =
+        loadTablePbFromCollection(collection.get());
+    if (!table) {
+      mContext->getDiagnostics()->error(DiagMessage(input)
+                                        << "invalid static library");
+      return false;
+    }
+
+    ResourceTablePackage* pkg = table->findPackageById(0x7f);
+    if (!pkg) {
+      mContext->getDiagnostics()->error(DiagMessage(input)
+                                        << "static library has no package");
+      return false;
+    }
+
+    bool result;
+    if (mOptions.noStaticLibPackages) {
+      // Merge all resources as if they were in the compilation package. This is
+      // the old
+      // behaviour of aapt.
+
+      // Add the package to the set of --extra-packages so we emit an R.java for
+      // each
+      // library package.
+      if (!pkg->name.empty()) {
+        mOptions.extraJavaPackages.insert(pkg->name);
+      }
+
+      pkg->name = "";
+      if (override) {
+        result = mTableMerger->mergeOverlay(Source(input), table.get(),
+                                            collection.get());
+      } else {
+        result =
+            mTableMerger->merge(Source(input), table.get(), collection.get());
+      }
+
+    } else {
+      // This is the proper way to merge libraries, where the package name is
+      // preserved
+      // and resource names are mangled.
+      result = mTableMerger->mergeAndMangle(Source(input), pkg->name,
+                                            table.get(), collection.get());
+    }
+
+    if (!result) {
+      return false;
+    }
+
+    // Make sure to move the collection into the set of IFileCollections.
+    mCollections.push_back(std::move(collection));
+    return true;
+  }
+
+  bool mergeResourceTable(io::IFile* file, bool override) {
+    if (mContext->verbose()) {
+      mContext->getDiagnostics()->note(
+          DiagMessage() << "merging resource table " << file->getSource());
+    }
+
+    std::unique_ptr<io::IData> data = file->openAsData();
+    if (!data) {
+      mContext->getDiagnostics()->error(DiagMessage(file->getSource())
+                                        << "failed to open file");
+      return false;
+    }
+
+    std::unique_ptr<ResourceTable> table =
+        loadTableFromPb(file->getSource(), data->data(), data->size(),
+                        mContext->getDiagnostics());
+    if (!table) {
+      return false;
+    }
+
+    bool result = false;
+    if (override) {
+      result = mTableMerger->mergeOverlay(file->getSource(), table.get());
+    } else {
+      result = mTableMerger->merge(file->getSource(), table.get());
+    }
+    return result;
+  }
+
+  bool mergeCompiledFile(io::IFile* file, ResourceFile* fileDesc,
+                         bool override) {
+    if (mContext->verbose()) {
+      mContext->getDiagnostics()->note(
+          DiagMessage() << "merging '" << fileDesc->name
+                        << "' from compiled file " << file->getSource());
+    }
+
+    bool result = false;
+    if (override) {
+      result = mTableMerger->mergeFileOverlay(*fileDesc, file);
+    } else {
+      result = mTableMerger->mergeFile(*fileDesc, file);
+    }
+
+    if (!result) {
+      return false;
+    }
+
+    // Add the exports of this file to the table.
+    for (SourcedResourceName& exportedSymbol : fileDesc->exportedSymbols) {
+      if (exportedSymbol.name.package.empty()) {
+        exportedSymbol.name.package = mContext->getCompilationPackage();
+      }
+
+      ResourceNameRef resName = exportedSymbol.name;
+
+      Maybe<ResourceName> mangledName =
+          mContext->getNameMangler()->mangleName(exportedSymbol.name);
+      if (mangledName) {
+        resName = mangledName.value();
+      }
+
+      std::unique_ptr<Id> id = util::make_unique<Id>();
+      id->setSource(fileDesc->source.withLine(exportedSymbol.line));
+      bool result = mFinalTable.addResourceAllowMangled(
+          resName, ConfigDescription::defaultConfig(), std::string(),
+          std::move(id), mContext->getDiagnostics());
+      if (!result) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Takes a path to load as a ZIP file and merges the files within into the
+   * master ResourceTable.
+   * If override is true, conflicting resources are allowed to override each
+   * other, in order of
+   * last seen.
+   *
+   * An io::IFileCollection is created from the ZIP file and added to the set of
+   * io::IFileCollections that are open.
+   */
+  bool mergeArchive(const std::string& input, bool override) {
+    if (mContext->verbose()) {
+      mContext->getDiagnostics()->note(DiagMessage() << "merging archive "
+                                                     << input);
+    }
+
+    std::string errorStr;
+    std::unique_ptr<io::ZipFileCollection> collection =
+        io::ZipFileCollection::create(input, &errorStr);
+    if (!collection) {
+      mContext->getDiagnostics()->error(DiagMessage(input) << errorStr);
+      return false;
+    }
+
+    bool error = false;
+    for (auto iter = collection->iterator(); iter->hasNext();) {
+      if (!mergeFile(iter->next(), override)) {
+        error = true;
+      }
+    }
+
+    // Make sure to move the collection into the set of IFileCollections.
+    mCollections.push_back(std::move(collection));
+    return !error;
+  }
+
+  /**
+   * Takes a path to load and merge into the master ResourceTable. If override
+   * is true,
+   * conflicting resources are allowed to override each other, in order of last
+   * seen.
+   *
+   * If the file path ends with .flata, .jar, .jack, or .zip the file is treated
+   * as ZIP archive
+   * and the files within are merged individually.
+   *
+   * Otherwise the files is processed on its own.
+   */
+  bool mergePath(const std::string& path, bool override) {
+    if (util::stringEndsWith(path, ".flata") ||
+        util::stringEndsWith(path, ".jar") ||
+        util::stringEndsWith(path, ".jack") ||
+        util::stringEndsWith(path, ".zip")) {
+      return mergeArchive(path, override);
+    } else if (util::stringEndsWith(path, ".apk")) {
+      return mergeStaticLibrary(path, override);
+    }
+
+    io::IFile* file = mFileCollection->insertFile(path);
+    return mergeFile(file, override);
+  }
+
+  /**
+   * Takes a file to load and merge into the master ResourceTable. If override
+   * is true,
+   * conflicting resources are allowed to override each other, in order of last
+   * seen.
+   *
+   * If the file ends with .arsc.flat, then it is loaded as a ResourceTable and
+   * merged into the
+   * master ResourceTable. If the file ends with .flat, then it is treated like
+   * a compiled file
+   * and the header data is read and merged into the final ResourceTable.
+   *
+   * All other file types are ignored. This is because these files could be
+   * coming from a zip,
+   * where we could have other files like classes.dex.
+   */
+  bool mergeFile(io::IFile* file, bool override) {
+    const Source& src = file->getSource();
+    if (util::stringEndsWith(src.path, ".arsc.flat")) {
+      return mergeResourceTable(file, override);
+
+    } else if (util::stringEndsWith(src.path, ".flat")) {
+      // Try opening the file and looking for an Export header.
+      std::unique_ptr<io::IData> data = file->openAsData();
+      if (!data) {
+        mContext->getDiagnostics()->error(DiagMessage(src) << "failed to open");
+        return false;
+      }
+
+      CompiledFileInputStream inputStream(data->data(), data->size());
+      uint32_t numFiles = 0;
+      if (!inputStream.ReadLittleEndian32(&numFiles)) {
+        mContext->getDiagnostics()->error(DiagMessage(src)
+                                          << "failed read num files");
+        return false;
+      }
+
+      for (uint32_t i = 0; i < numFiles; i++) {
+        pb::CompiledFile compiledFile;
+        if (!inputStream.ReadCompiledFile(&compiledFile)) {
+          mContext->getDiagnostics()->error(
+              DiagMessage(src) << "failed to read compiled file header");
+          return false;
         }
 
-        if (!writeApk(archiveWriter.get(), &proguardKeepSet, manifestXml.get(), &mFinalTable)) {
-            return 1;
+        uint64_t offset, len;
+        if (!inputStream.ReadDataMetaData(&offset, &len)) {
+          mContext->getDiagnostics()->error(DiagMessage(src)
+                                            << "failed to read data meta data");
+          return false;
+        }
+
+        std::unique_ptr<ResourceFile> resourceFile =
+            deserializeCompiledFileFromPb(compiledFile, file->getSource(),
+                                          mContext->getDiagnostics());
+        if (!resourceFile) {
+          return false;
+        }
+
+        if (!mergeCompiledFile(file->createFileSegment(offset, len),
+                               resourceFile.get(), override)) {
+          return false;
+        }
+      }
+      return true;
+    }
+
+    // Ignore non .flat files. This could be classes.dex or something else that
+    // happens
+    // to be in an archive.
+    return true;
+  }
+
+  std::unique_ptr<xml::XmlResource> generateSplitManifest(
+      const AppInfo& appInfo, const SplitConstraints& constraints) {
+    std::unique_ptr<xml::XmlResource> doc =
+        util::make_unique<xml::XmlResource>();
+
+    std::unique_ptr<xml::Namespace> namespaceAndroid =
+        util::make_unique<xml::Namespace>();
+    namespaceAndroid->namespaceUri = xml::kSchemaAndroid;
+    namespaceAndroid->namespacePrefix = "android";
+
+    std::unique_ptr<xml::Element> manifestEl =
+        util::make_unique<xml::Element>();
+    manifestEl->name = "manifest";
+    manifestEl->attributes.push_back(
+        xml::Attribute{"", "package", appInfo.package});
+
+    if (appInfo.versionCode) {
+      manifestEl->attributes.push_back(
+          xml::Attribute{xml::kSchemaAndroid, "versionCode",
+                         std::to_string(appInfo.versionCode.value())});
+    }
+
+    if (appInfo.revisionCode) {
+      manifestEl->attributes.push_back(
+          xml::Attribute{xml::kSchemaAndroid, "revisionCode",
+                         std::to_string(appInfo.revisionCode.value())});
+    }
+
+    std::stringstream splitName;
+    splitName << "config." << util::joiner(constraints.configs, "_");
+
+    manifestEl->attributes.push_back(
+        xml::Attribute{"", "split", splitName.str()});
+
+    std::unique_ptr<xml::Element> applicationEl =
+        util::make_unique<xml::Element>();
+    applicationEl->name = "application";
+    applicationEl->attributes.push_back(
+        xml::Attribute{xml::kSchemaAndroid, "hasCode", "false"});
+
+    manifestEl->addChild(std::move(applicationEl));
+    namespaceAndroid->addChild(std::move(manifestEl));
+    doc->root = std::move(namespaceAndroid);
+    return doc;
+  }
+
+  /**
+   * Writes the AndroidManifest, ResourceTable, and all XML files referenced by
+   * the ResourceTable
+   * to the IArchiveWriter.
+   */
+  bool writeApk(IArchiveWriter* writer, proguard::KeepSet* keepSet,
+                xml::XmlResource* manifest, ResourceTable* table) {
+    const bool keepRawValues = mOptions.staticLib;
+    bool result = flattenXml(manifest, "AndroidManifest.xml", {}, keepRawValues,
+                             writer, mContext);
+    if (!result) {
+      return false;
+    }
+
+    ResourceFileFlattenerOptions fileFlattenerOptions;
+    fileFlattenerOptions.keepRawValues = keepRawValues;
+    fileFlattenerOptions.doNotCompressAnything = mOptions.doNotCompressAnything;
+    fileFlattenerOptions.extensionsToNotCompress =
+        mOptions.extensionsToNotCompress;
+    fileFlattenerOptions.noAutoVersion = mOptions.noAutoVersion;
+    fileFlattenerOptions.noVersionVectors = mOptions.noVersionVectors;
+    fileFlattenerOptions.noXmlNamespaces = mOptions.noXmlNamespaces;
+    fileFlattenerOptions.updateProguardSpec =
+        static_cast<bool>(mOptions.generateProguardRulesPath);
+
+    ResourceFileFlattener fileFlattener(fileFlattenerOptions, mContext,
+                                        keepSet);
+
+    if (!fileFlattener.flatten(table, writer)) {
+      mContext->getDiagnostics()->error(DiagMessage()
+                                        << "failed linking file resources");
+      return false;
+    }
+
+    if (mOptions.staticLib) {
+      if (!flattenTableToPb(table, writer)) {
+        mContext->getDiagnostics()->error(
+            DiagMessage() << "failed to write resources.arsc.flat");
+        return false;
+      }
+    } else {
+      if (!flattenTable(table, writer)) {
+        mContext->getDiagnostics()->error(DiagMessage()
+                                          << "failed to write resources.arsc");
+        return false;
+      }
+    }
+    return true;
+  }
+
+  int run(const std::vector<std::string>& inputFiles) {
+    // Load the AndroidManifest.xml
+    std::unique_ptr<xml::XmlResource> manifestXml =
+        loadXml(mOptions.manifestPath, mContext->getDiagnostics());
+    if (!manifestXml) {
+      return 1;
+    }
+
+    // First extract the Package name without modifying it (via
+    // --rename-manifest-package).
+    if (Maybe<AppInfo> maybeAppInfo = extractAppInfoFromManifest(
+            manifestXml.get(), mContext->getDiagnostics())) {
+      const AppInfo& appInfo = maybeAppInfo.value();
+      mContext->setCompilationPackage(appInfo.package);
+    }
+
+    ManifestFixer manifestFixer(mOptions.manifestFixerOptions);
+    if (!manifestFixer.consume(mContext, manifestXml.get())) {
+      return 1;
+    }
+
+    Maybe<AppInfo> maybeAppInfo = extractAppInfoFromManifest(
+        manifestXml.get(), mContext->getDiagnostics());
+    if (!maybeAppInfo) {
+      return 1;
+    }
+
+    const AppInfo& appInfo = maybeAppInfo.value();
+    if (appInfo.minSdkVersion) {
+      if (Maybe<int> maybeMinSdkVersion =
+              ResourceUtils::parseSdkVersion(appInfo.minSdkVersion.value())) {
+        mContext->setMinSdkVersion(maybeMinSdkVersion.value());
+      }
+    }
+
+    mContext->setNameManglerPolicy(
+        NameManglerPolicy{mContext->getCompilationPackage()});
+    if (mContext->getCompilationPackage() == "android") {
+      mContext->setPackageId(0x01);
+    } else {
+      mContext->setPackageId(0x7f);
+    }
+
+    if (!loadSymbolsFromIncludePaths()) {
+      return 1;
+    }
+
+    TableMergerOptions tableMergerOptions;
+    tableMergerOptions.autoAddOverlay = mOptions.autoAddOverlay;
+    mTableMerger = util::make_unique<TableMerger>(mContext, &mFinalTable,
+                                                  tableMergerOptions);
+
+    if (mContext->verbose()) {
+      mContext->getDiagnostics()->note(DiagMessage()
+                                       << "linking package '"
+                                       << mContext->getCompilationPackage()
+                                       << "' with package ID " << std::hex
+                                       << (int)mContext->getPackageId());
+    }
+
+    for (const std::string& input : inputFiles) {
+      if (!mergePath(input, false)) {
+        mContext->getDiagnostics()->error(DiagMessage()
+                                          << "failed parsing input");
+        return 1;
+      }
+    }
+
+    for (const std::string& input : mOptions.overlayFiles) {
+      if (!mergePath(input, true)) {
+        mContext->getDiagnostics()->error(DiagMessage()
+                                          << "failed parsing overlays");
+        return 1;
+      }
+    }
+
+    if (!verifyNoExternalPackages()) {
+      return 1;
+    }
+
+    if (!mOptions.staticLib) {
+      PrivateAttributeMover mover;
+      if (!mover.consume(mContext, &mFinalTable)) {
+        mContext->getDiagnostics()->error(
+            DiagMessage() << "failed moving private attributes");
+        return 1;
+      }
+
+      // Assign IDs if we are building a regular app.
+      IdAssigner idAssigner(&mOptions.stableIdMap);
+      if (!idAssigner.consume(mContext, &mFinalTable)) {
+        mContext->getDiagnostics()->error(DiagMessage()
+                                          << "failed assigning IDs");
+        return 1;
+      }
+
+      // Now grab each ID and emit it as a file.
+      if (mOptions.resourceIdMapPath) {
+        for (auto& package : mFinalTable.packages) {
+          for (auto& type : package->types) {
+            for (auto& entry : type->entries) {
+              ResourceName name(package->name, type->type, entry->name);
+              // The IDs are guaranteed to exist.
+              mOptions.stableIdMap[std::move(name)] = ResourceId(
+                  package->id.value(), type->id.value(), entry->id.value());
+            }
+          }
+        }
+
+        if (!writeStableIdMapToPath(mContext->getDiagnostics(),
+                                    mOptions.stableIdMap,
+                                    mOptions.resourceIdMapPath.value())) {
+          return 1;
+        }
+      }
+    } else {
+      // Static libs are merged with other apps, and ID collisions are bad, so
+      // verify that
+      // no IDs have been set.
+      if (!verifyNoIdsSet()) {
+        return 1;
+      }
+    }
+
+    // Add the names to mangle based on our source merge earlier.
+    mContext->setNameManglerPolicy(NameManglerPolicy{
+        mContext->getCompilationPackage(), mTableMerger->getMergedPackages()});
+
+    // Add our table to the symbol table.
+    mContext->getExternalSymbols()->prependSource(
+        util::make_unique<ResourceTableSymbolSource>(&mFinalTable));
+
+    ReferenceLinker linker;
+    if (!linker.consume(mContext, &mFinalTable)) {
+      mContext->getDiagnostics()->error(DiagMessage()
+                                        << "failed linking references");
+      return 1;
+    }
+
+    if (mOptions.staticLib) {
+      if (!mOptions.products.empty()) {
+        mContext->getDiagnostics()
+            ->warn(DiagMessage()
+                   << "can't select products when building static library");
+      }
+    } else {
+      ProductFilter productFilter(mOptions.products);
+      if (!productFilter.consume(mContext, &mFinalTable)) {
+        mContext->getDiagnostics()->error(DiagMessage()
+                                          << "failed stripping products");
+        return 1;
+      }
+    }
+
+    if (!mOptions.noAutoVersion) {
+      AutoVersioner versioner;
+      if (!versioner.consume(mContext, &mFinalTable)) {
+        mContext->getDiagnostics()->error(DiagMessage()
+                                          << "failed versioning styles");
+        return 1;
+      }
+    }
+
+    if (!mOptions.staticLib && mContext->getMinSdkVersion() > 0) {
+      if (mContext->verbose()) {
+        mContext->getDiagnostics()->note(
+            DiagMessage() << "collapsing resource versions for minimum SDK "
+                          << mContext->getMinSdkVersion());
+      }
+
+      VersionCollapser collapser;
+      if (!collapser.consume(mContext, &mFinalTable)) {
+        return 1;
+      }
+    }
+
+    if (!mOptions.noResourceDeduping) {
+      ResourceDeduper deduper;
+      if (!deduper.consume(mContext, &mFinalTable)) {
+        mContext->getDiagnostics()->error(DiagMessage()
+                                          << "failed deduping resources");
+        return 1;
+      }
+    }
+
+    proguard::KeepSet proguardKeepSet;
+    proguard::KeepSet proguardMainDexKeepSet;
+
+    if (mOptions.staticLib) {
+      if (mOptions.tableSplitterOptions.configFilter != nullptr ||
+          mOptions.tableSplitterOptions.preferredDensity) {
+        mContext->getDiagnostics()
+            ->warn(DiagMessage()
+                   << "can't strip resources when building static library");
+      }
+    } else {
+      // Adjust the SplitConstraints so that their SDK version is stripped if it
+      // is less
+      // than or equal to the minSdk. Otherwise the resources that have had
+      // their SDK version
+      // stripped due to minSdk won't ever match.
+      std::vector<SplitConstraints> adjustedConstraintsList;
+      adjustedConstraintsList.reserve(mOptions.splitConstraints.size());
+      for (const SplitConstraints& constraints : mOptions.splitConstraints) {
+        SplitConstraints adjustedConstraints;
+        for (const ConfigDescription& config : constraints.configs) {
+          if (config.sdkVersion <= mContext->getMinSdkVersion()) {
+            adjustedConstraints.configs.insert(config.copyWithoutSdkVersion());
+          } else {
+            adjustedConstraints.configs.insert(config);
+          }
+        }
+        adjustedConstraintsList.push_back(std::move(adjustedConstraints));
+      }
+
+      TableSplitter tableSplitter(adjustedConstraintsList,
+                                  mOptions.tableSplitterOptions);
+      if (!tableSplitter.verifySplitConstraints(mContext)) {
+        return 1;
+      }
+      tableSplitter.splitTable(&mFinalTable);
+
+      // Now we need to write out the Split APKs.
+      auto pathIter = mOptions.splitPaths.begin();
+      auto splitConstraintsIter = adjustedConstraintsList.begin();
+      for (std::unique_ptr<ResourceTable>& splitTable :
+           tableSplitter.getSplits()) {
+        if (mContext->verbose()) {
+          mContext->getDiagnostics()->note(
+              DiagMessage(*pathIter)
+              << "generating split with configurations '"
+              << util::joiner(splitConstraintsIter->configs, ", ") << "'");
+        }
+
+        std::unique_ptr<IArchiveWriter> archiveWriter =
+            makeArchiveWriter(*pathIter);
+        if (!archiveWriter) {
+          mContext->getDiagnostics()->error(DiagMessage()
+                                            << "failed to create archive");
+          return 1;
+        }
+
+        // Generate an AndroidManifest.xml for each split.
+        std::unique_ptr<xml::XmlResource> splitManifest =
+            generateSplitManifest(appInfo, *splitConstraintsIter);
+
+        XmlReferenceLinker linker;
+        if (!linker.consume(mContext, splitManifest.get())) {
+          mContext->getDiagnostics()->error(
+              DiagMessage() << "failed to create Split AndroidManifest.xml");
+          return 1;
+        }
+
+        if (!writeApk(archiveWriter.get(), &proguardKeepSet,
+                      splitManifest.get(), splitTable.get())) {
+          return 1;
+        }
+
+        ++pathIter;
+        ++splitConstraintsIter;
+      }
+    }
+
+    // Start writing the base APK.
+    std::unique_ptr<IArchiveWriter> archiveWriter =
+        makeArchiveWriter(mOptions.outputPath);
+    if (!archiveWriter) {
+      mContext->getDiagnostics()->error(DiagMessage()
+                                        << "failed to create archive");
+      return 1;
+    }
+
+    bool error = false;
+    {
+      // AndroidManifest.xml has no resource name, but the CallSite is built
+      // from the name
+      // (aka, which package the AndroidManifest.xml is coming from).
+      // So we give it a package name so it can see local resources.
+      manifestXml->file.name.package = mContext->getCompilationPackage();
+
+      XmlReferenceLinker manifestLinker;
+      if (manifestLinker.consume(mContext, manifestXml.get())) {
+        if (mOptions.generateProguardRulesPath &&
+            !proguard::collectProguardRulesForManifest(
+                Source(mOptions.manifestPath), manifestXml.get(),
+                &proguardKeepSet)) {
+          error = true;
+        }
+
+        if (mOptions.generateMainDexProguardRulesPath &&
+            !proguard::collectProguardRulesForManifest(
+                Source(mOptions.manifestPath), manifestXml.get(),
+                &proguardMainDexKeepSet, true)) {
+          error = true;
         }
 
         if (mOptions.generateJavaClassPath) {
-            JavaClassGeneratorOptions options;
-            options.types = JavaClassGeneratorOptions::SymbolTypes::kAll;
-            options.javadocAnnotations = mOptions.javadocAnnotations;
-
-            if (mOptions.staticLib || mOptions.generateNonFinalIds) {
-                options.useFinal = false;
-            }
-
-            const StringPiece actualPackage = mContext->getCompilationPackage();
-            StringPiece outputPackage = mContext->getCompilationPackage();
-            if (mOptions.customJavaPackage) {
-                // Override the output java package to the custom one.
-                outputPackage = mOptions.customJavaPackage.value();
-            }
-
-            if (mOptions.privateSymbols) {
-                // If we defined a private symbols package, we only emit Public symbols
-                // to the original package, and private and public symbols to the private package.
-
-                options.types = JavaClassGeneratorOptions::SymbolTypes::kPublic;
-                if (!writeJavaFile(&mFinalTable, mContext->getCompilationPackage(),
-                                   outputPackage, options)) {
-                    return 1;
-                }
-
-                options.types = JavaClassGeneratorOptions::SymbolTypes::kPublicPrivate;
-                outputPackage = mOptions.privateSymbols.value();
-            }
-
-            if (!writeJavaFile(&mFinalTable, actualPackage, outputPackage, options)) {
-                return 1;
-            }
-
-            for (const std::string& extraPackage : mOptions.extraJavaPackages) {
-                if (!writeJavaFile(&mFinalTable, actualPackage, extraPackage, options)) {
-                    return 1;
-                }
-            }
+          if (!writeManifestJavaFile(manifestXml.get())) {
+            error = true;
+          }
         }
 
-        if (!writeProguardFile(mOptions.generateProguardRulesPath, proguardKeepSet)) {
-            return 1;
+        if (mOptions.noXmlNamespaces) {
+          // PackageParser will fail if URIs are removed from
+          // AndroidManifest.xml.
+          XmlNamespaceRemover namespaceRemover(true /* keepUris */);
+          if (!namespaceRemover.consume(mContext, manifestXml.get())) {
+            error = true;
+          }
         }
-
-        if (!writeProguardFile(mOptions.generateMainDexProguardRulesPath, proguardMainDexKeepSet)) {
-            return 1;
-        }
-
-        if (mContext->verbose()) {
-            DebugPrintTableOptions debugPrintTableOptions;
-            debugPrintTableOptions.showSources = true;
-            Debug::printTable(&mFinalTable, debugPrintTableOptions);
-        }
-        return 0;
+      } else {
+        error = true;
+      }
     }
 
-private:
-    LinkOptions mOptions;
-    LinkContext* mContext;
-    ResourceTable mFinalTable;
+    if (error) {
+      mContext->getDiagnostics()->error(DiagMessage()
+                                        << "failed processing manifest");
+      return 1;
+    }
 
-    std::unique_ptr<TableMerger> mTableMerger;
+    if (!writeApk(archiveWriter.get(), &proguardKeepSet, manifestXml.get(),
+                  &mFinalTable)) {
+      return 1;
+    }
 
-    // A pointer to the FileCollection representing the filesystem (not archives).
-    std::unique_ptr<io::FileCollection> mFileCollection;
+    if (mOptions.generateJavaClassPath) {
+      JavaClassGeneratorOptions options;
+      options.types = JavaClassGeneratorOptions::SymbolTypes::kAll;
+      options.javadocAnnotations = mOptions.javadocAnnotations;
 
-    // A vector of IFileCollections. This is mainly here to keep ownership of the collections.
-    std::vector<std::unique_ptr<io::IFileCollection>> mCollections;
+      if (mOptions.staticLib || mOptions.generateNonFinalIds) {
+        options.useFinal = false;
+      }
 
-    // A vector of ResourceTables. This is here to retain ownership, so that the SymbolTable
-    // can use these.
-    std::vector<std::unique_ptr<ResourceTable>> mStaticTableIncludes;
+      const StringPiece actualPackage = mContext->getCompilationPackage();
+      StringPiece outputPackage = mContext->getCompilationPackage();
+      if (mOptions.customJavaPackage) {
+        // Override the output java package to the custom one.
+        outputPackage = mOptions.customJavaPackage.value();
+      }
+
+      if (mOptions.privateSymbols) {
+        // If we defined a private symbols package, we only emit Public symbols
+        // to the original package, and private and public symbols to the
+        // private package.
+
+        options.types = JavaClassGeneratorOptions::SymbolTypes::kPublic;
+        if (!writeJavaFile(&mFinalTable, mContext->getCompilationPackage(),
+                           outputPackage, options)) {
+          return 1;
+        }
+
+        options.types = JavaClassGeneratorOptions::SymbolTypes::kPublicPrivate;
+        outputPackage = mOptions.privateSymbols.value();
+      }
+
+      if (!writeJavaFile(&mFinalTable, actualPackage, outputPackage, options)) {
+        return 1;
+      }
+
+      for (const std::string& extraPackage : mOptions.extraJavaPackages) {
+        if (!writeJavaFile(&mFinalTable, actualPackage, extraPackage,
+                           options)) {
+          return 1;
+        }
+      }
+    }
+
+    if (!writeProguardFile(mOptions.generateProguardRulesPath,
+                           proguardKeepSet)) {
+      return 1;
+    }
+
+    if (!writeProguardFile(mOptions.generateMainDexProguardRulesPath,
+                           proguardMainDexKeepSet)) {
+      return 1;
+    }
+
+    if (mContext->verbose()) {
+      DebugPrintTableOptions debugPrintTableOptions;
+      debugPrintTableOptions.showSources = true;
+      Debug::printTable(&mFinalTable, debugPrintTableOptions);
+    }
+    return 0;
+  }
+
+ private:
+  LinkOptions mOptions;
+  LinkContext* mContext;
+  ResourceTable mFinalTable;
+
+  std::unique_ptr<TableMerger> mTableMerger;
+
+  // A pointer to the FileCollection representing the filesystem (not archives).
+  std::unique_ptr<io::FileCollection> mFileCollection;
+
+  // A vector of IFileCollections. This is mainly here to keep ownership of the
+  // collections.
+  std::vector<std::unique_ptr<io::IFileCollection>> mCollections;
+
+  // A vector of ResourceTables. This is here to retain ownership, so that the
+  // SymbolTable
+  // can use these.
+  std::vector<std::unique_ptr<ResourceTable>> mStaticTableIncludes;
 };
 
 int link(const std::vector<StringPiece>& args) {
-    LinkContext context;
-    LinkOptions options;
-    std::vector<std::string> overlayArgList;
-    std::vector<std::string> extraJavaPackages;
-    Maybe<std::string> configs;
-    Maybe<std::string> preferredDensity;
-    Maybe<std::string> productList;
-    bool legacyXFlag = false;
-    bool requireLocalization = false;
-    bool verbose = false;
-    Maybe<std::string> stableIdFilePath;
-    std::vector<std::string> splitArgs;
-    Flags flags = Flags()
-            .requiredFlag("-o", "Output path", &options.outputPath)
-            .requiredFlag("--manifest", "Path to the Android manifest to build",
-                          &options.manifestPath)
-            .optionalFlagList("-I", "Adds an Android APK to link against", &options.includePaths)
-            .optionalFlagList("-R", "Compilation unit to link, using `overlay` semantics.\n"
-                              "The last conflicting resource given takes precedence.",
-                              &overlayArgList)
-            .optionalFlag("--java", "Directory in which to generate R.java",
-                          &options.generateJavaClassPath)
-            .optionalFlag("--proguard", "Output file for generated Proguard rules",
-                          &options.generateProguardRulesPath)
-            .optionalFlag("--proguard-main-dex",
-                          "Output file for generated Proguard rules for the main dex",
-                          &options.generateMainDexProguardRulesPath)
-            .optionalSwitch("--no-auto-version",
-                            "Disables automatic style and layout SDK versioning",
-                            &options.noAutoVersion)
-            .optionalSwitch("--no-version-vectors",
-                            "Disables automatic versioning of vector drawables. Use this only\n"
-                            "when building with vector drawable support library",
-                            &options.noVersionVectors)
-            .optionalSwitch("--no-resource-deduping", "Disables automatic deduping of resources with\n"
-                            "identical values across compatible configurations.",
-                            &options.noResourceDeduping)
-            .optionalSwitch("-x", "Legacy flag that specifies to use the package identifier 0x01",
-                            &legacyXFlag)
-            .optionalSwitch("-z", "Require localization of strings marked 'suggested'",
-                            &requireLocalization)
-            .optionalFlag("-c", "Comma separated list of configurations to include. The default\n"
-                                "is all configurations", &configs)
-            .optionalFlag("--preferred-density",
-                          "Selects the closest matching density and strips out all others.",
-                          &preferredDensity)
-            .optionalFlag("--product", "Comma separated list of product names to keep",
-                          &productList)
-            .optionalSwitch("--output-to-dir", "Outputs the APK contents to a directory specified "
-                            "by -o",
-                            &options.outputToDirectory)
-            .optionalSwitch("--no-xml-namespaces", "Removes XML namespace prefix and URI "
-                            "information from AndroidManifest.xml\nand XML binaries in res/*.",
-                            &options.noXmlNamespaces)
-            .optionalFlag("--min-sdk-version", "Default minimum SDK version to use for "
-                          "AndroidManifest.xml",
-                          &options.manifestFixerOptions.minSdkVersionDefault)
-            .optionalFlag("--target-sdk-version", "Default target SDK version to use for "
-                          "AndroidManifest.xml",
-                          &options.manifestFixerOptions.targetSdkVersionDefault)
-            .optionalFlag("--version-code", "Version code (integer) to inject into the "
-                          "AndroidManifest.xml if none is present",
-                          &options.manifestFixerOptions.versionCodeDefault)
-            .optionalFlag("--version-name", "Version name to inject into the AndroidManifest.xml "
-                          "if none is present",
-                          &options.manifestFixerOptions.versionNameDefault)
-            .optionalSwitch("--static-lib", "Generate a static Android library",
-                            &options.staticLib)
-            .optionalSwitch("--no-static-lib-packages",
-                            "Merge all library resources under the app's package",
-                            &options.noStaticLibPackages)
-            .optionalSwitch("--non-final-ids", "Generates R.java without the final modifier.\n"
-                            "This is implied when --static-lib is specified.",
-                            &options.generateNonFinalIds)
-            .optionalFlag("--stable-ids", "File containing a list of name to ID mapping.",
-                          &stableIdFilePath)
-            .optionalFlag("--emit-ids", "Emit a file at the given path with a list of name to ID\n"
-                          "mappings, suitable for use with --stable-ids.",
-                          &options.resourceIdMapPath)
-            .optionalFlag("--private-symbols", "Package name to use when generating R.java for "
-                          "private symbols.\n"
-                          "If not specified, public and private symbols will use the application's "
-                          "package name",
-                          &options.privateSymbols)
-            .optionalFlag("--custom-package", "Custom Java package under which to generate R.java",
-                          &options.customJavaPackage)
-            .optionalFlagList("--extra-packages", "Generate the same R.java but with different "
-                              "package names",
-                              &extraJavaPackages)
-            .optionalFlagList("--add-javadoc-annotation", "Adds a JavaDoc annotation to all "
+  LinkContext context;
+  LinkOptions options;
+  std::vector<std::string> overlayArgList;
+  std::vector<std::string> extraJavaPackages;
+  Maybe<std::string> configs;
+  Maybe<std::string> preferredDensity;
+  Maybe<std::string> productList;
+  bool legacyXFlag = false;
+  bool requireLocalization = false;
+  bool verbose = false;
+  Maybe<std::string> stableIdFilePath;
+  std::vector<std::string> splitArgs;
+  Flags flags =
+      Flags()
+          .requiredFlag("-o", "Output path", &options.outputPath)
+          .requiredFlag("--manifest", "Path to the Android manifest to build",
+                        &options.manifestPath)
+          .optionalFlagList("-I", "Adds an Android APK to link against",
+                            &options.includePaths)
+          .optionalFlagList(
+              "-R",
+              "Compilation unit to link, using `overlay` semantics.\n"
+              "The last conflicting resource given takes precedence.",
+              &overlayArgList)
+          .optionalFlag("--java", "Directory in which to generate R.java",
+                        &options.generateJavaClassPath)
+          .optionalFlag("--proguard",
+                        "Output file for generated Proguard rules",
+                        &options.generateProguardRulesPath)
+          .optionalFlag(
+              "--proguard-main-dex",
+              "Output file for generated Proguard rules for the main dex",
+              &options.generateMainDexProguardRulesPath)
+          .optionalSwitch("--no-auto-version",
+                          "Disables automatic style and layout SDK versioning",
+                          &options.noAutoVersion)
+          .optionalSwitch("--no-version-vectors",
+                          "Disables automatic versioning of vector drawables. "
+                          "Use this only\n"
+                          "when building with vector drawable support library",
+                          &options.noVersionVectors)
+          .optionalSwitch("--no-resource-deduping",
+                          "Disables automatic deduping of resources with\n"
+                          "identical values across compatible configurations.",
+                          &options.noResourceDeduping)
+          .optionalSwitch(
+              "-x",
+              "Legacy flag that specifies to use the package identifier 0x01",
+              &legacyXFlag)
+          .optionalSwitch("-z",
+                          "Require localization of strings marked 'suggested'",
+                          &requireLocalization)
+          .optionalFlag(
+              "-c",
+              "Comma separated list of configurations to include. The default\n"
+              "is all configurations",
+              &configs)
+          .optionalFlag(
+              "--preferred-density",
+              "Selects the closest matching density and strips out all others.",
+              &preferredDensity)
+          .optionalFlag("--product",
+                        "Comma separated list of product names to keep",
+                        &productList)
+          .optionalSwitch("--output-to-dir",
+                          "Outputs the APK contents to a directory specified "
+                          "by -o",
+                          &options.outputToDirectory)
+          .optionalSwitch("--no-xml-namespaces",
+                          "Removes XML namespace prefix and URI "
+                          "information from AndroidManifest.xml\nand XML "
+                          "binaries in res/*.",
+                          &options.noXmlNamespaces)
+          .optionalFlag("--min-sdk-version",
+                        "Default minimum SDK version to use for "
+                        "AndroidManifest.xml",
+                        &options.manifestFixerOptions.minSdkVersionDefault)
+          .optionalFlag("--target-sdk-version",
+                        "Default target SDK version to use for "
+                        "AndroidManifest.xml",
+                        &options.manifestFixerOptions.targetSdkVersionDefault)
+          .optionalFlag("--version-code",
+                        "Version code (integer) to inject into the "
+                        "AndroidManifest.xml if none is present",
+                        &options.manifestFixerOptions.versionCodeDefault)
+          .optionalFlag("--version-name",
+                        "Version name to inject into the AndroidManifest.xml "
+                        "if none is present",
+                        &options.manifestFixerOptions.versionNameDefault)
+          .optionalSwitch("--static-lib", "Generate a static Android library",
+                          &options.staticLib)
+          .optionalSwitch("--no-static-lib-packages",
+                          "Merge all library resources under the app's package",
+                          &options.noStaticLibPackages)
+          .optionalSwitch("--non-final-ids",
+                          "Generates R.java without the final modifier.\n"
+                          "This is implied when --static-lib is specified.",
+                          &options.generateNonFinalIds)
+          .optionalFlag("--stable-ids",
+                        "File containing a list of name to ID mapping.",
+                        &stableIdFilePath)
+          .optionalFlag(
+              "--emit-ids",
+              "Emit a file at the given path with a list of name to ID\n"
+              "mappings, suitable for use with --stable-ids.",
+              &options.resourceIdMapPath)
+          .optionalFlag("--private-symbols",
+                        "Package name to use when generating R.java for "
+                        "private symbols.\n"
+                        "If not specified, public and private symbols will use "
+                        "the application's "
+                        "package name",
+                        &options.privateSymbols)
+          .optionalFlag("--custom-package",
+                        "Custom Java package under which to generate R.java",
+                        &options.customJavaPackage)
+          .optionalFlagList("--extra-packages",
+                            "Generate the same R.java but with different "
+                            "package names",
+                            &extraJavaPackages)
+          .optionalFlagList("--add-javadoc-annotation",
+                            "Adds a JavaDoc annotation to all "
                             "generated Java classes",
                             &options.javadocAnnotations)
-            .optionalSwitch("--auto-add-overlay", "Allows the addition of new resources in "
-                            "overlays without <add-resource> tags",
-                            &options.autoAddOverlay)
-            .optionalFlag("--rename-manifest-package", "Renames the package in AndroidManifest.xml",
-                          &options.manifestFixerOptions.renameManifestPackage)
-            .optionalFlag("--rename-instrumentation-target-package",
-                          "Changes the name of the target package for instrumentation. Most useful "
-                          "when used\nin conjunction with --rename-manifest-package",
-                          &options.manifestFixerOptions.renameInstrumentationTargetPackage)
-            .optionalFlagList("-0", "File extensions not to compress",
-                              &options.extensionsToNotCompress)
-            .optionalFlagList("--split", "Split resources matching a set of configs out to a "
-                              "Split APK.\nSyntax: path/to/output.apk:<config>[,<config>[...]]",
-                              &splitArgs)
-            .optionalSwitch("-v", "Enables verbose logging",
-                            &verbose);
+          .optionalSwitch("--auto-add-overlay",
+                          "Allows the addition of new resources in "
+                          "overlays without <add-resource> tags",
+                          &options.autoAddOverlay)
+          .optionalFlag("--rename-manifest-package",
+                        "Renames the package in AndroidManifest.xml",
+                        &options.manifestFixerOptions.renameManifestPackage)
+          .optionalFlag(
+              "--rename-instrumentation-target-package",
+              "Changes the name of the target package for instrumentation. "
+              "Most useful "
+              "when used\nin conjunction with --rename-manifest-package",
+              &options.manifestFixerOptions.renameInstrumentationTargetPackage)
+          .optionalFlagList("-0", "File extensions not to compress",
+                            &options.extensionsToNotCompress)
+          .optionalFlagList(
+              "--split",
+              "Split resources matching a set of configs out to a "
+              "Split APK.\nSyntax: path/to/output.apk:<config>[,<config>[...]]",
+              &splitArgs)
+          .optionalSwitch("-v", "Enables verbose logging", &verbose);
 
-    if (!flags.parse("aapt2 link", args, &std::cerr)) {
+  if (!flags.parse("aapt2 link", args, &std::cerr)) {
+    return 1;
+  }
+
+  // Expand all argument-files passed into the command line. These start with
+  // '@'.
+  std::vector<std::string> argList;
+  for (const std::string& arg : flags.getArgs()) {
+    if (util::stringStartsWith(arg, "@")) {
+      const std::string path = arg.substr(1, arg.size() - 1);
+      std::string error;
+      if (!file::appendArgsFromFile(path, &argList, &error)) {
+        context.getDiagnostics()->error(DiagMessage(path) << error);
         return 1;
+      }
+    } else {
+      argList.push_back(arg);
+    }
+  }
+
+  // Expand all argument-files passed to -R.
+  for (const std::string& arg : overlayArgList) {
+    if (util::stringStartsWith(arg, "@")) {
+      const std::string path = arg.substr(1, arg.size() - 1);
+      std::string error;
+      if (!file::appendArgsFromFile(path, &options.overlayFiles, &error)) {
+        context.getDiagnostics()->error(DiagMessage(path) << error);
+        return 1;
+      }
+    } else {
+      options.overlayFiles.push_back(arg);
+    }
+  }
+
+  if (verbose) {
+    context.setVerbose(verbose);
+  }
+
+  // Populate the set of extra packages for which to generate R.java.
+  for (std::string& extraPackage : extraJavaPackages) {
+    // A given package can actually be a colon separated list of packages.
+    for (StringPiece package : util::split(extraPackage, ':')) {
+      options.extraJavaPackages.insert(package.toString());
+    }
+  }
+
+  if (productList) {
+    for (StringPiece product : util::tokenize(productList.value(), ',')) {
+      if (product != "" && product != "default") {
+        options.products.insert(product.toString());
+      }
+    }
+  }
+
+  AxisConfigFilter filter;
+  if (configs) {
+    for (const StringPiece& configStr : util::tokenize(configs.value(), ',')) {
+      ConfigDescription config;
+      LocaleValue lv;
+      if (lv.initFromFilterString(configStr)) {
+        lv.writeTo(&config);
+      } else if (!ConfigDescription::parse(configStr, &config)) {
+        context.getDiagnostics()->error(DiagMessage() << "invalid config '"
+                                                      << configStr
+                                                      << "' for -c option");
+        return 1;
+      }
+
+      if (config.density != 0) {
+        context.getDiagnostics()->warn(DiagMessage() << "ignoring density '"
+                                                     << config
+                                                     << "' for -c option");
+      } else {
+        filter.addConfig(config);
+      }
     }
 
-    // Expand all argument-files passed into the command line. These start with '@'.
-    std::vector<std::string> argList;
-    for (const std::string& arg : flags.getArgs()) {
-        if (util::stringStartsWith(arg, "@")) {
-            const std::string path = arg.substr(1, arg.size() - 1);
-            std::string error;
-            if (!file::appendArgsFromFile(path, &argList, &error)) {
-                context.getDiagnostics()->error(DiagMessage(path) << error);
-                return 1;
-            }
-        } else {
-            argList.push_back(arg);
-        }
+    options.tableSplitterOptions.configFilter = &filter;
+  }
+
+  if (preferredDensity) {
+    ConfigDescription preferredDensityConfig;
+    if (!ConfigDescription::parse(preferredDensity.value(),
+                                  &preferredDensityConfig)) {
+      context.getDiagnostics()->error(
+          DiagMessage() << "invalid density '" << preferredDensity.value()
+                        << "' for --preferred-density option");
+      return 1;
     }
 
-    // Expand all argument-files passed to -R.
-    for (const std::string& arg : overlayArgList) {
-        if (util::stringStartsWith(arg, "@")) {
-            const std::string path = arg.substr(1, arg.size() - 1);
-            std::string error;
-            if (!file::appendArgsFromFile(path, &options.overlayFiles, &error)) {
-                context.getDiagnostics()->error(DiagMessage(path) << error);
-                return 1;
-            }
-        } else {
-            options.overlayFiles.push_back(arg);
-        }
+    // Clear the version that can be automatically added.
+    preferredDensityConfig.sdkVersion = 0;
+
+    if (preferredDensityConfig.diff(ConfigDescription::defaultConfig()) !=
+        ConfigDescription::CONFIG_DENSITY) {
+      context.getDiagnostics()->error(
+          DiagMessage() << "invalid preferred density '"
+                        << preferredDensity.value() << "'. "
+                        << "Preferred density must only be a density value");
+      return 1;
     }
+    options.tableSplitterOptions.preferredDensity =
+        preferredDensityConfig.density;
+  }
 
-    if (verbose) {
-        context.setVerbose(verbose);
+  if (!options.staticLib && stableIdFilePath) {
+    if (!loadStableIdMap(context.getDiagnostics(), stableIdFilePath.value(),
+                         &options.stableIdMap)) {
+      return 1;
     }
+  }
 
-    // Populate the set of extra packages for which to generate R.java.
-    for (std::string& extraPackage : extraJavaPackages) {
-        // A given package can actually be a colon separated list of packages.
-        for (StringPiece package : util::split(extraPackage, ':')) {
-            options.extraJavaPackages.insert(package.toString());
-        }
+  // Populate some default no-compress extensions that are already compressed.
+  options.extensionsToNotCompress.insert(
+      {".jpg",   ".jpeg", ".png",  ".gif", ".wav",  ".mp2",  ".mp3",  ".ogg",
+       ".aac",   ".mpg",  ".mpeg", ".mid", ".midi", ".smf",  ".jet",  ".rtttl",
+       ".imy",   ".xmf",  ".mp4",  ".m4a", ".m4v",  ".3gp",  ".3gpp", ".3g2",
+       ".3gpp2", ".amr",  ".awb",  ".wma", ".wmv",  ".webm", ".mkv"});
+
+  // Parse the split parameters.
+  for (const std::string& splitArg : splitArgs) {
+    options.splitPaths.push_back({});
+    options.splitConstraints.push_back({});
+    if (!parseSplitParameter(splitArg, context.getDiagnostics(),
+                             &options.splitPaths.back(),
+                             &options.splitConstraints.back())) {
+      return 1;
     }
+  }
 
-    if (productList) {
-        for (StringPiece product : util::tokenize(productList.value(), ',')) {
-            if (product != "" && product != "default") {
-                options.products.insert(product.toString());
-            }
-        }
-    }
+  // Turn off auto versioning for static-libs.
+  if (options.staticLib) {
+    options.noAutoVersion = true;
+    options.noVersionVectors = true;
+  }
 
-    AxisConfigFilter filter;
-    if (configs) {
-        for (const StringPiece& configStr : util::tokenize(configs.value(), ',')) {
-            ConfigDescription config;
-            LocaleValue lv;
-            if (lv.initFromFilterString(configStr)) {
-                lv.writeTo(&config);
-            } else if (!ConfigDescription::parse(configStr, &config)) {
-                context.getDiagnostics()->error(
-                        DiagMessage() << "invalid config '" << configStr << "' for -c option");
-                return 1;
-            }
-
-            if (config.density != 0) {
-                context.getDiagnostics()->warn(
-                        DiagMessage() << "ignoring density '" << config << "' for -c option");
-            } else {
-                filter.addConfig(config);
-            }
-        }
-
-        options.tableSplitterOptions.configFilter = &filter;
-    }
-
-    if (preferredDensity) {
-        ConfigDescription preferredDensityConfig;
-        if (!ConfigDescription::parse(preferredDensity.value(), &preferredDensityConfig)) {
-            context.getDiagnostics()->error(DiagMessage() << "invalid density '"
-                                            << preferredDensity.value()
-                                            << "' for --preferred-density option");
-            return 1;
-        }
-
-        // Clear the version that can be automatically added.
-        preferredDensityConfig.sdkVersion = 0;
-
-        if (preferredDensityConfig.diff(ConfigDescription::defaultConfig())
-                != ConfigDescription::CONFIG_DENSITY) {
-            context.getDiagnostics()->error(DiagMessage() << "invalid preferred density '"
-                                            << preferredDensity.value() << "'. "
-                                            << "Preferred density must only be a density value");
-            return 1;
-        }
-        options.tableSplitterOptions.preferredDensity = preferredDensityConfig.density;
-    }
-
-    if (!options.staticLib && stableIdFilePath) {
-        if (!loadStableIdMap(context.getDiagnostics(), stableIdFilePath.value(),
-                             &options.stableIdMap)) {
-            return 1;
-        }
-    }
-
-    // Populate some default no-compress extensions that are already compressed.
-    options.extensionsToNotCompress.insert({
-            ".jpg", ".jpeg", ".png", ".gif",
-            ".wav", ".mp2", ".mp3", ".ogg", ".aac",
-            ".mpg", ".mpeg", ".mid", ".midi", ".smf", ".jet",
-            ".rtttl", ".imy", ".xmf", ".mp4", ".m4a",
-            ".m4v", ".3gp", ".3gpp", ".3g2", ".3gpp2",
-            ".amr", ".awb", ".wma", ".wmv", ".webm", ".mkv"});
-
-    // Parse the split parameters.
-    for (const std::string& splitArg : splitArgs) {
-        options.splitPaths.push_back({});
-        options.splitConstraints.push_back({});
-        if (!parseSplitParameter(splitArg, context.getDiagnostics(), &options.splitPaths.back(),
-                                 &options.splitConstraints.back())) {
-            return 1;
-        }
-    }
-
-    // Turn off auto versioning for static-libs.
-    if (options.staticLib) {
-        options.noAutoVersion = true;
-        options.noVersionVectors = true;
-    }
-
-    LinkCommand cmd(&context, options);
-    return cmd.run(argList);
+  LinkCommand cmd(&context, options);
+  return cmd.run(argList);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/Linkers.h b/tools/aapt2/link/Linkers.h
index ce455da..f40c0e8 100644
--- a/tools/aapt2/link/Linkers.h
+++ b/tools/aapt2/link/Linkers.h
@@ -30,106 +30,121 @@
 struct ConfigDescription;
 
 /**
- * Defines the location in which a value exists. This determines visibility of other
+ * Defines the location in which a value exists. This determines visibility of
+ * other
  * package's private symbols.
  */
 struct CallSite {
-    ResourceNameRef resource;
+  ResourceNameRef resource;
 };
 
 /**
- * Determines whether a versioned resource should be created. If a versioned resource already
+ * Determines whether a versioned resource should be created. If a versioned
+ * resource already
  * exists, it takes precedence.
  */
-bool shouldGenerateVersionedResource(const ResourceEntry* entry, const ConfigDescription& config,
+bool shouldGenerateVersionedResource(const ResourceEntry* entry,
+                                     const ConfigDescription& config,
                                      const int sdkVersionToGenerate);
 
 class AutoVersioner : public IResourceTableConsumer {
-public:
-    bool consume(IAaptContext* context, ResourceTable* table) override;
+ public:
+  bool consume(IAaptContext* context, ResourceTable* table) override;
 };
 
 class XmlAutoVersioner : public IXmlResourceConsumer {
-public:
-    bool consume(IAaptContext* context, xml::XmlResource* resource) override;
+ public:
+  bool consume(IAaptContext* context, xml::XmlResource* resource) override;
 };
 
 class VersionCollapser : public IResourceTableConsumer {
-public:
-    bool consume(IAaptContext* context, ResourceTable* table) override;
+ public:
+  bool consume(IAaptContext* context, ResourceTable* table) override;
 };
 
 /**
  * Removes duplicated key-value entries from dominated resources.
  */
 class ResourceDeduper : public IResourceTableConsumer {
-public:
-    bool consume(IAaptContext* context, ResourceTable* table) override;
+ public:
+  bool consume(IAaptContext* context, ResourceTable* table) override;
 };
 
 /**
- * If any attribute resource values are defined as public, this consumer will move all private
- * attribute resource values to a private ^private-attr type, avoiding backwards compatibility
+ * If any attribute resource values are defined as public, this consumer will
+ * move all private
+ * attribute resource values to a private ^private-attr type, avoiding backwards
+ * compatibility
  * issues with new apps running on old platforms.
  *
- * The Android platform ignores resource attributes it doesn't recognize, so an app developer can
- * use new attributes in their layout XML files without worrying about versioning. This assumption
- * actually breaks on older platforms. OEMs may add private attributes that are used internally.
- * AAPT originally assigned all private attributes IDs immediately proceeding the public attributes'
+ * The Android platform ignores resource attributes it doesn't recognize, so an
+ * app developer can
+ * use new attributes in their layout XML files without worrying about
+ * versioning. This assumption
+ * actually breaks on older platforms. OEMs may add private attributes that are
+ * used internally.
+ * AAPT originally assigned all private attributes IDs immediately proceeding
+ * the public attributes'
  * IDs.
  *
- * This means that on a newer Android platform, an ID previously assigned to a private attribute
+ * This means that on a newer Android platform, an ID previously assigned to a
+ * private attribute
  * may end up assigned to a public attribute.
  *
- * App developers assume using the newer attribute is safe on older platforms because it will
- * be ignored. Instead, the platform thinks the new attribute is an older, private attribute and
- * will interpret it as such. This leads to unintended styling and exceptions thrown due to
+ * App developers assume using the newer attribute is safe on older platforms
+ * because it will
+ * be ignored. Instead, the platform thinks the new attribute is an older,
+ * private attribute and
+ * will interpret it as such. This leads to unintended styling and exceptions
+ * thrown due to
  * unexpected types.
  *
- * By moving the private attributes to a completely different type, this ID conflict will never
+ * By moving the private attributes to a completely different type, this ID
+ * conflict will never
  * occur.
  */
 struct PrivateAttributeMover : public IResourceTableConsumer {
-    bool consume(IAaptContext* context, ResourceTable* table) override;
+  bool consume(IAaptContext* context, ResourceTable* table) override;
 };
 
 /**
  * Removes namespace nodes and URI information from the XmlResource.
  *
- * Once an XmlResource is processed by this consumer, it is no longer able to have its attributes
- * parsed. As such, this XmlResource must have already been processed by XmlReferenceLinker.
+ * Once an XmlResource is processed by this consumer, it is no longer able to
+ * have its attributes
+ * parsed. As such, this XmlResource must have already been processed by
+ * XmlReferenceLinker.
  */
 class XmlNamespaceRemover : public IXmlResourceConsumer {
-private:
-    bool mKeepUris;
+ private:
+  bool mKeepUris;
 
-public:
-    XmlNamespaceRemover(bool keepUris = false) : mKeepUris(keepUris) {
-    };
+ public:
+  XmlNamespaceRemover(bool keepUris = false) : mKeepUris(keepUris){};
 
-    bool consume(IAaptContext* context, xml::XmlResource* resource) override;
+  bool consume(IAaptContext* context, xml::XmlResource* resource) override;
 };
 
 /**
- * Resolves attributes in the XmlResource and compiles string values to resource values.
+ * Resolves attributes in the XmlResource and compiles string values to resource
+ * values.
  * Once an XmlResource is processed by this linker, it is ready to be flattened.
  */
 class XmlReferenceLinker : public IXmlResourceConsumer {
-private:
-    std::set<int> mSdkLevelsFound;
+ private:
+  std::set<int> mSdkLevelsFound;
 
-public:
-    bool consume(IAaptContext* context, xml::XmlResource* resource) override;
+ public:
+  bool consume(IAaptContext* context, xml::XmlResource* resource) override;
 
-    /**
-     * Once the XmlResource has been consumed, this returns the various SDK levels in which
-     * framework attributes used within the XML document were defined.
-     */
-    inline const std::set<int>& getSdkLevels() const {
-        return mSdkLevelsFound;
-    }
+  /**
+   * Once the XmlResource has been consumed, this returns the various SDK levels
+   * in which
+   * framework attributes used within the XML document were defined.
+   */
+  inline const std::set<int>& getSdkLevels() const { return mSdkLevelsFound; }
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_LINKER_LINKERS_H */
diff --git a/tools/aapt2/link/ManifestFixer.cpp b/tools/aapt2/link/ManifestFixer.cpp
index 45f5acd..3c9298b 100644
--- a/tools/aapt2/link/ManifestFixer.cpp
+++ b/tools/aapt2/link/ManifestFixer.cpp
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-#include "ResourceUtils.h"
 #include "link/ManifestFixer.h"
+#include "ResourceUtils.h"
 #include "util/Util.h"
 #include "xml/XmlActionExecutor.h"
 #include "xml/XmlDom.h"
@@ -25,295 +25,310 @@
 namespace aapt {
 
 /**
- * This is how PackageManager builds class names from AndroidManifest.xml entries.
+ * This is how PackageManager builds class names from AndroidManifest.xml
+ * entries.
  */
 static bool nameIsJavaClassName(xml::Element* el, xml::Attribute* attr,
                                 SourcePathDiagnostics* diag) {
-    // We allow unqualified class names (ie: .HelloActivity)
-    // Since we don't know the package name, we can just make a fake one here and
-    // the test will be identical as long as the real package name is valid too.
-    Maybe<std::string> fullyQualifiedClassName =
-            util::getFullyQualifiedClassName("a", attr->value);
+  // We allow unqualified class names (ie: .HelloActivity)
+  // Since we don't know the package name, we can just make a fake one here and
+  // the test will be identical as long as the real package name is valid too.
+  Maybe<std::string> fullyQualifiedClassName =
+      util::getFullyQualifiedClassName("a", attr->value);
 
-    StringPiece qualifiedClassName = fullyQualifiedClassName
-            ? fullyQualifiedClassName.value() : attr->value;
+  StringPiece qualifiedClassName =
+      fullyQualifiedClassName ? fullyQualifiedClassName.value() : attr->value;
 
-    if (!util::isJavaClassName(qualifiedClassName)) {
-        diag->error(DiagMessage(el->lineNumber)
-                    << "attribute 'android:name' in <"
-                    << el->name << "> tag must be a valid Java class name");
-        return false;
-    }
-    return true;
-}
-
-static bool optionalNameIsJavaClassName(xml::Element* el, SourcePathDiagnostics* diag) {
-    if (xml::Attribute* attr = el->findAttribute(xml::kSchemaAndroid, "name")) {
-        return nameIsJavaClassName(el, attr, diag);
-    }
-    return true;
-}
-
-static bool requiredNameIsJavaClassName(xml::Element* el, SourcePathDiagnostics* diag) {
-    if (xml::Attribute* attr = el->findAttribute(xml::kSchemaAndroid, "name")) {
-        return nameIsJavaClassName(el, attr, diag);
-    }
+  if (!util::isJavaClassName(qualifiedClassName)) {
     diag->error(DiagMessage(el->lineNumber)
-                << "<" << el->name << "> is missing attribute 'android:name'");
+                << "attribute 'android:name' in <" << el->name
+                << "> tag must be a valid Java class name");
     return false;
+  }
+  return true;
+}
+
+static bool optionalNameIsJavaClassName(xml::Element* el,
+                                        SourcePathDiagnostics* diag) {
+  if (xml::Attribute* attr = el->findAttribute(xml::kSchemaAndroid, "name")) {
+    return nameIsJavaClassName(el, attr, diag);
+  }
+  return true;
+}
+
+static bool requiredNameIsJavaClassName(xml::Element* el,
+                                        SourcePathDiagnostics* diag) {
+  if (xml::Attribute* attr = el->findAttribute(xml::kSchemaAndroid, "name")) {
+    return nameIsJavaClassName(el, attr, diag);
+  }
+  diag->error(DiagMessage(el->lineNumber)
+              << "<" << el->name << "> is missing attribute 'android:name'");
+  return false;
 }
 
 static bool verifyManifest(xml::Element* el, SourcePathDiagnostics* diag) {
-    xml::Attribute* attr = el->findAttribute({}, "package");
-    if (!attr) {
-        diag->error(DiagMessage(el->lineNumber) << "<manifest> tag is missing 'package' attribute");
-        return false;
-    } else if (ResourceUtils::isReference(attr->value)) {
-        diag->error(DiagMessage(el->lineNumber)
-                    << "attribute 'package' in <manifest> tag must not be a reference");
-        return false;
-    } else if (!util::isJavaPackageName(attr->value)) {
-        diag->error(DiagMessage(el->lineNumber)
-                    << "attribute 'package' in <manifest> tag is not a valid Java package name: '"
-                    << attr->value << "'");
-        return false;
-    }
-    return true;
+  xml::Attribute* attr = el->findAttribute({}, "package");
+  if (!attr) {
+    diag->error(DiagMessage(el->lineNumber)
+                << "<manifest> tag is missing 'package' attribute");
+    return false;
+  } else if (ResourceUtils::isReference(attr->value)) {
+    diag->error(
+        DiagMessage(el->lineNumber)
+        << "attribute 'package' in <manifest> tag must not be a reference");
+    return false;
+  } else if (!util::isJavaPackageName(attr->value)) {
+    diag->error(DiagMessage(el->lineNumber)
+                << "attribute 'package' in <manifest> tag is not a valid Java "
+                   "package name: '"
+                << attr->value << "'");
+    return false;
+  }
+  return true;
 }
 
 /**
- * The coreApp attribute in <manifest> is not a regular AAPT attribute, so type checking on it
+ * The coreApp attribute in <manifest> is not a regular AAPT attribute, so type
+ * checking on it
  * is manual.
  */
 static bool fixCoreAppAttribute(xml::Element* el, SourcePathDiagnostics* diag) {
-    if (xml::Attribute* attr = el->findAttribute("", "coreApp")) {
-        std::unique_ptr<BinaryPrimitive> result = ResourceUtils::tryParseBool(attr->value);
-        if (!result) {
-            diag->error(DiagMessage(el->lineNumber) << "attribute coreApp must be a boolean");
-            return false;
-        }
-        attr->compiledValue = std::move(result);
+  if (xml::Attribute* attr = el->findAttribute("", "coreApp")) {
+    std::unique_ptr<BinaryPrimitive> result =
+        ResourceUtils::tryParseBool(attr->value);
+    if (!result) {
+      diag->error(DiagMessage(el->lineNumber)
+                  << "attribute coreApp must be a boolean");
+      return false;
     }
-    return true;
+    attr->compiledValue = std::move(result);
+  }
+  return true;
 }
 
-bool ManifestFixer::buildRules(xml::XmlActionExecutor* executor, IDiagnostics* diag) {
-    // First verify some options.
-    if (mOptions.renameManifestPackage) {
-        if (!util::isJavaPackageName(mOptions.renameManifestPackage.value())) {
-            diag->error(DiagMessage() << "invalid manifest package override '"
-                        << mOptions.renameManifestPackage.value() << "'");
-            return false;
-        }
+bool ManifestFixer::buildRules(xml::XmlActionExecutor* executor,
+                               IDiagnostics* diag) {
+  // First verify some options.
+  if (mOptions.renameManifestPackage) {
+    if (!util::isJavaPackageName(mOptions.renameManifestPackage.value())) {
+      diag->error(DiagMessage() << "invalid manifest package override '"
+                                << mOptions.renameManifestPackage.value()
+                                << "'");
+      return false;
+    }
+  }
+
+  if (mOptions.renameInstrumentationTargetPackage) {
+    if (!util::isJavaPackageName(
+            mOptions.renameInstrumentationTargetPackage.value())) {
+      diag->error(DiagMessage()
+                  << "invalid instrumentation target package override '"
+                  << mOptions.renameInstrumentationTargetPackage.value()
+                  << "'");
+      return false;
+    }
+  }
+
+  // Common intent-filter actions.
+  xml::XmlNodeAction intentFilterAction;
+  intentFilterAction["action"];
+  intentFilterAction["category"];
+  intentFilterAction["data"];
+
+  // Common meta-data actions.
+  xml::XmlNodeAction metaDataAction;
+
+  // Manifest actions.
+  xml::XmlNodeAction& manifestAction = (*executor)["manifest"];
+  manifestAction.action(verifyManifest);
+  manifestAction.action(fixCoreAppAttribute);
+  manifestAction.action([&](xml::Element* el) -> bool {
+    if (mOptions.versionNameDefault) {
+      if (el->findAttribute(xml::kSchemaAndroid, "versionName") == nullptr) {
+        el->attributes.push_back(
+            xml::Attribute{xml::kSchemaAndroid, "versionName",
+                           mOptions.versionNameDefault.value()});
+      }
     }
 
-    if (mOptions.renameInstrumentationTargetPackage) {
-        if (!util::isJavaPackageName(mOptions.renameInstrumentationTargetPackage.value())) {
-            diag->error(DiagMessage() << "invalid instrumentation target package override '"
-                        << mOptions.renameInstrumentationTargetPackage.value() << "'");
-            return false;
-        }
+    if (mOptions.versionCodeDefault) {
+      if (el->findAttribute(xml::kSchemaAndroid, "versionCode") == nullptr) {
+        el->attributes.push_back(
+            xml::Attribute{xml::kSchemaAndroid, "versionCode",
+                           mOptions.versionCodeDefault.value()});
+      }
     }
-
-    // Common intent-filter actions.
-    xml::XmlNodeAction intentFilterAction;
-    intentFilterAction["action"];
-    intentFilterAction["category"];
-    intentFilterAction["data"];
-
-    // Common meta-data actions.
-    xml::XmlNodeAction metaDataAction;
-
-    // Manifest actions.
-    xml::XmlNodeAction& manifestAction = (*executor)["manifest"];
-    manifestAction.action(verifyManifest);
-    manifestAction.action(fixCoreAppAttribute);
-    manifestAction.action([&](xml::Element* el) -> bool {
-        if (mOptions.versionNameDefault) {
-            if (el->findAttribute(xml::kSchemaAndroid, "versionName") == nullptr) {
-                el->attributes.push_back(xml::Attribute{
-                        xml::kSchemaAndroid,
-                        "versionName",
-                        mOptions.versionNameDefault.value() });
-            }
-        }
-
-        if (mOptions.versionCodeDefault) {
-            if (el->findAttribute(xml::kSchemaAndroid, "versionCode") == nullptr) {
-                el->attributes.push_back(xml::Attribute{
-                        xml::kSchemaAndroid,
-                        "versionCode",
-                        mOptions.versionCodeDefault.value() });
-            }
-        }
-        return true;
-    });
-
-    // Meta tags.
-    manifestAction["eat-comment"];
-
-    // Uses-sdk actions.
-    manifestAction["uses-sdk"].action([&](xml::Element* el) -> bool {
-        if (mOptions.minSdkVersionDefault &&
-                el->findAttribute(xml::kSchemaAndroid, "minSdkVersion") == nullptr) {
-            // There was no minSdkVersion defined and we have a default to assign.
-            el->attributes.push_back(xml::Attribute{
-                    xml::kSchemaAndroid, "minSdkVersion",
-                    mOptions.minSdkVersionDefault.value() });
-        }
-
-        if (mOptions.targetSdkVersionDefault &&
-                el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion") == nullptr) {
-            // There was no targetSdkVersion defined and we have a default to assign.
-            el->attributes.push_back(xml::Attribute{
-                    xml::kSchemaAndroid, "targetSdkVersion",
-                    mOptions.targetSdkVersionDefault.value() });
-        }
-        return true;
-    });
-
-    // Instrumentation actions.
-    manifestAction["instrumentation"].action([&](xml::Element* el) -> bool {
-        if (!mOptions.renameInstrumentationTargetPackage) {
-            return true;
-        }
-
-        if (xml::Attribute* attr = el->findAttribute(xml::kSchemaAndroid, "targetPackage")) {
-            attr->value = mOptions.renameInstrumentationTargetPackage.value();
-        }
-        return true;
-    });
-
-    manifestAction["original-package"];
-    manifestAction["protected-broadcast"];
-    manifestAction["uses-permission"];
-    manifestAction["permission"];
-    manifestAction["permission-tree"];
-    manifestAction["permission-group"];
-
-    manifestAction["uses-configuration"];
-    manifestAction["uses-feature"];
-    manifestAction["supports-screens"];
-
-    manifestAction["compatible-screens"];
-    manifestAction["compatible-screens"]["screen"];
-
-    manifestAction["supports-gl-texture"];
-
-    // Application actions.
-    xml::XmlNodeAction& applicationAction = manifestAction["application"];
-    applicationAction.action(optionalNameIsJavaClassName);
-
-    // Uses library actions.
-    applicationAction["uses-library"];
-
-    // Meta-data.
-    applicationAction["meta-data"] = metaDataAction;
-
-    // Activity actions.
-    applicationAction["activity"].action(requiredNameIsJavaClassName);
-    applicationAction["activity"]["intent-filter"] = intentFilterAction;
-    applicationAction["activity"]["meta-data"] = metaDataAction;
-
-    // Activity alias actions.
-    applicationAction["activity-alias"]["intent-filter"] = intentFilterAction;
-    applicationAction["activity-alias"]["meta-data"] = metaDataAction;
-
-    // Service actions.
-    applicationAction["service"].action(requiredNameIsJavaClassName);
-    applicationAction["service"]["intent-filter"] = intentFilterAction;
-    applicationAction["service"]["meta-data"] = metaDataAction;
-
-    // Receiver actions.
-    applicationAction["receiver"].action(requiredNameIsJavaClassName);
-    applicationAction["receiver"]["intent-filter"] = intentFilterAction;
-    applicationAction["receiver"]["meta-data"] = metaDataAction;
-
-    // Provider actions.
-    applicationAction["provider"].action(requiredNameIsJavaClassName);
-    applicationAction["provider"]["intent-filter"] = intentFilterAction;
-    applicationAction["provider"]["meta-data"] = metaDataAction;
-    applicationAction["provider"]["grant-uri-permissions"];
-    applicationAction["provider"]["path-permissions"];
-
     return true;
+  });
+
+  // Meta tags.
+  manifestAction["eat-comment"];
+
+  // Uses-sdk actions.
+  manifestAction["uses-sdk"].action([&](xml::Element* el) -> bool {
+    if (mOptions.minSdkVersionDefault &&
+        el->findAttribute(xml::kSchemaAndroid, "minSdkVersion") == nullptr) {
+      // There was no minSdkVersion defined and we have a default to assign.
+      el->attributes.push_back(
+          xml::Attribute{xml::kSchemaAndroid, "minSdkVersion",
+                         mOptions.minSdkVersionDefault.value()});
+    }
+
+    if (mOptions.targetSdkVersionDefault &&
+        el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion") == nullptr) {
+      // There was no targetSdkVersion defined and we have a default to assign.
+      el->attributes.push_back(
+          xml::Attribute{xml::kSchemaAndroid, "targetSdkVersion",
+                         mOptions.targetSdkVersionDefault.value()});
+    }
+    return true;
+  });
+
+  // Instrumentation actions.
+  manifestAction["instrumentation"].action([&](xml::Element* el) -> bool {
+    if (!mOptions.renameInstrumentationTargetPackage) {
+      return true;
+    }
+
+    if (xml::Attribute* attr =
+            el->findAttribute(xml::kSchemaAndroid, "targetPackage")) {
+      attr->value = mOptions.renameInstrumentationTargetPackage.value();
+    }
+    return true;
+  });
+
+  manifestAction["original-package"];
+  manifestAction["protected-broadcast"];
+  manifestAction["uses-permission"];
+  manifestAction["permission"];
+  manifestAction["permission-tree"];
+  manifestAction["permission-group"];
+
+  manifestAction["uses-configuration"];
+  manifestAction["uses-feature"];
+  manifestAction["supports-screens"];
+
+  manifestAction["compatible-screens"];
+  manifestAction["compatible-screens"]["screen"];
+
+  manifestAction["supports-gl-texture"];
+
+  // Application actions.
+  xml::XmlNodeAction& applicationAction = manifestAction["application"];
+  applicationAction.action(optionalNameIsJavaClassName);
+
+  // Uses library actions.
+  applicationAction["uses-library"];
+
+  // Meta-data.
+  applicationAction["meta-data"] = metaDataAction;
+
+  // Activity actions.
+  applicationAction["activity"].action(requiredNameIsJavaClassName);
+  applicationAction["activity"]["intent-filter"] = intentFilterAction;
+  applicationAction["activity"]["meta-data"] = metaDataAction;
+
+  // Activity alias actions.
+  applicationAction["activity-alias"]["intent-filter"] = intentFilterAction;
+  applicationAction["activity-alias"]["meta-data"] = metaDataAction;
+
+  // Service actions.
+  applicationAction["service"].action(requiredNameIsJavaClassName);
+  applicationAction["service"]["intent-filter"] = intentFilterAction;
+  applicationAction["service"]["meta-data"] = metaDataAction;
+
+  // Receiver actions.
+  applicationAction["receiver"].action(requiredNameIsJavaClassName);
+  applicationAction["receiver"]["intent-filter"] = intentFilterAction;
+  applicationAction["receiver"]["meta-data"] = metaDataAction;
+
+  // Provider actions.
+  applicationAction["provider"].action(requiredNameIsJavaClassName);
+  applicationAction["provider"]["intent-filter"] = intentFilterAction;
+  applicationAction["provider"]["meta-data"] = metaDataAction;
+  applicationAction["provider"]["grant-uri-permissions"];
+  applicationAction["provider"]["path-permissions"];
+
+  return true;
 }
 
 class FullyQualifiedClassNameVisitor : public xml::Visitor {
-public:
-    using xml::Visitor::visit;
+ public:
+  using xml::Visitor::visit;
 
-    explicit FullyQualifiedClassNameVisitor(const StringPiece& package) : mPackage(package) {
-    }
+  explicit FullyQualifiedClassNameVisitor(const StringPiece& package)
+      : mPackage(package) {}
 
-    void visit(xml::Element* el) override {
-        for (xml::Attribute& attr : el->attributes) {
-            if (attr.namespaceUri == xml::kSchemaAndroid
-                    && mClassAttributes.find(attr.name) != mClassAttributes.end()) {
-                if (Maybe<std::string> newValue =
-                        util::getFullyQualifiedClassName(mPackage, attr.value)) {
-                    attr.value = std::move(newValue.value());
-                }
-            }
+  void visit(xml::Element* el) override {
+    for (xml::Attribute& attr : el->attributes) {
+      if (attr.namespaceUri == xml::kSchemaAndroid &&
+          mClassAttributes.find(attr.name) != mClassAttributes.end()) {
+        if (Maybe<std::string> newValue =
+                util::getFullyQualifiedClassName(mPackage, attr.value)) {
+          attr.value = std::move(newValue.value());
         }
-
-        // Super implementation to iterate over the children.
-        xml::Visitor::visit(el);
+      }
     }
 
-private:
-    StringPiece mPackage;
-    std::unordered_set<StringPiece> mClassAttributes = { "name" };
+    // Super implementation to iterate over the children.
+    xml::Visitor::visit(el);
+  }
+
+ private:
+  StringPiece mPackage;
+  std::unordered_set<StringPiece> mClassAttributes = {"name"};
 };
 
-static bool renameManifestPackage(const StringPiece& packageOverride, xml::Element* manifestEl) {
-    xml::Attribute* attr = manifestEl->findAttribute({}, "package");
+static bool renameManifestPackage(const StringPiece& packageOverride,
+                                  xml::Element* manifestEl) {
+  xml::Attribute* attr = manifestEl->findAttribute({}, "package");
 
-    // We've already verified that the manifest element is present, with a package name specified.
-    assert(attr);
+  // We've already verified that the manifest element is present, with a package
+  // name specified.
+  assert(attr);
 
-    std::string originalPackage = std::move(attr->value);
-    attr->value = packageOverride.toString();
+  std::string originalPackage = std::move(attr->value);
+  attr->value = packageOverride.toString();
 
-    FullyQualifiedClassNameVisitor visitor(originalPackage);
-    manifestEl->accept(&visitor);
-    return true;
+  FullyQualifiedClassNameVisitor visitor(originalPackage);
+  manifestEl->accept(&visitor);
+  return true;
 }
 
 bool ManifestFixer::consume(IAaptContext* context, xml::XmlResource* doc) {
-    xml::Element* root = xml::findRootElement(doc->root.get());
-    if (!root || !root->namespaceUri.empty() || root->name != "manifest") {
-        context->getDiagnostics()->error(DiagMessage(doc->file.source)
-                                         << "root tag must be <manifest>");
-        return false;
-    }
+  xml::Element* root = xml::findRootElement(doc->root.get());
+  if (!root || !root->namespaceUri.empty() || root->name != "manifest") {
+    context->getDiagnostics()->error(DiagMessage(doc->file.source)
+                                     << "root tag must be <manifest>");
+    return false;
+  }
 
-    if ((mOptions.minSdkVersionDefault || mOptions.targetSdkVersionDefault)
-            && root->findChild({}, "uses-sdk") == nullptr) {
-        // Auto insert a <uses-sdk> element.
-        std::unique_ptr<xml::Element> usesSdk = util::make_unique<xml::Element>();
-        usesSdk->name = "uses-sdk";
-        root->addChild(std::move(usesSdk));
-    }
+  if ((mOptions.minSdkVersionDefault || mOptions.targetSdkVersionDefault) &&
+      root->findChild({}, "uses-sdk") == nullptr) {
+    // Auto insert a <uses-sdk> element.
+    std::unique_ptr<xml::Element> usesSdk = util::make_unique<xml::Element>();
+    usesSdk->name = "uses-sdk";
+    root->addChild(std::move(usesSdk));
+  }
 
-    xml::XmlActionExecutor executor;
-    if (!buildRules(&executor, context->getDiagnostics())) {
-        return false;
-    }
+  xml::XmlActionExecutor executor;
+  if (!buildRules(&executor, context->getDiagnostics())) {
+    return false;
+  }
 
-    if (!executor.execute(xml::XmlActionExecutorPolicy::Whitelist, context->getDiagnostics(),
-                          doc)) {
-        return false;
-    }
+  if (!executor.execute(xml::XmlActionExecutorPolicy::Whitelist,
+                        context->getDiagnostics(), doc)) {
+    return false;
+  }
 
-    if (mOptions.renameManifestPackage) {
-        // Rename manifest package outside of the XmlActionExecutor.
-        // We need to extract the old package name and FullyQualify all class names.
-        if (!renameManifestPackage(mOptions.renameManifestPackage.value(), root)) {
-            return false;
-        }
+  if (mOptions.renameManifestPackage) {
+    // Rename manifest package outside of the XmlActionExecutor.
+    // We need to extract the old package name and FullyQualify all class names.
+    if (!renameManifestPackage(mOptions.renameManifestPackage.value(), root)) {
+      return false;
     }
-    return true;
+  }
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/ManifestFixer.h b/tools/aapt2/link/ManifestFixer.h
index 2e81266..c3a114b 100644
--- a/tools/aapt2/link/ManifestFixer.h
+++ b/tools/aapt2/link/ManifestFixer.h
@@ -27,12 +27,12 @@
 namespace aapt {
 
 struct ManifestFixerOptions {
-    Maybe<std::string> minSdkVersionDefault;
-    Maybe<std::string> targetSdkVersionDefault;
-    Maybe<std::string> renameManifestPackage;
-    Maybe<std::string> renameInstrumentationTargetPackage;
-    Maybe<std::string> versionNameDefault;
-    Maybe<std::string> versionCodeDefault;
+  Maybe<std::string> minSdkVersionDefault;
+  Maybe<std::string> targetSdkVersionDefault;
+  Maybe<std::string> renameManifestPackage;
+  Maybe<std::string> renameInstrumentationTargetPackage;
+  Maybe<std::string> versionNameDefault;
+  Maybe<std::string> versionCodeDefault;
 };
 
 /**
@@ -40,18 +40,18 @@
  * where specified with ManifestFixerOptions.
  */
 class ManifestFixer : public IXmlResourceConsumer {
-public:
-    explicit ManifestFixer(const ManifestFixerOptions& options) : mOptions(options) {
-    }
+ public:
+  explicit ManifestFixer(const ManifestFixerOptions& options)
+      : mOptions(options) {}
 
-    bool consume(IAaptContext* context, xml::XmlResource* doc) override;
+  bool consume(IAaptContext* context, xml::XmlResource* doc) override;
 
-private:
-    bool buildRules(xml::XmlActionExecutor* executor, IDiagnostics* diag);
+ private:
+  bool buildRules(xml::XmlActionExecutor* executor, IDiagnostics* diag);
 
-    ManifestFixerOptions mOptions;
+  ManifestFixerOptions mOptions;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_LINK_MANIFESTFIXER_H */
diff --git a/tools/aapt2/link/ManifestFixer_test.cpp b/tools/aapt2/link/ManifestFixer_test.cpp
index 16ab9ab..dc78d98 100644
--- a/tools/aapt2/link/ManifestFixer_test.cpp
+++ b/tools/aapt2/link/ManifestFixer_test.cpp
@@ -23,254 +23,274 @@
 namespace aapt {
 
 struct ManifestFixerTest : public ::testing::Test {
-    std::unique_ptr<IAaptContext> mContext;
+  std::unique_ptr<IAaptContext> mContext;
 
-    void SetUp() override {
-        mContext = test::ContextBuilder()
-                .setCompilationPackage("android")
-                .setPackageId(0x01)
-                .setNameManglerPolicy(NameManglerPolicy{ "android" })
-                .addSymbolSource(test::StaticSymbolSourceBuilder()
-                        .addSymbol("android:attr/package", ResourceId(0x01010000),
-                                   test::AttributeBuilder()
-                                        .setTypeMask(android::ResTable_map::TYPE_STRING)
-                                        .build())
-                        .addSymbol("android:attr/minSdkVersion", ResourceId(0x01010001),
-                                   test::AttributeBuilder()
-                                        .setTypeMask(android::ResTable_map::TYPE_STRING |
-                                                     android::ResTable_map::TYPE_INTEGER)
-                                        .build())
-                        .addSymbol("android:attr/targetSdkVersion", ResourceId(0x01010002),
-                                   test::AttributeBuilder()
-                                        .setTypeMask(android::ResTable_map::TYPE_STRING |
-                                                     android::ResTable_map::TYPE_INTEGER)
-                                        .build())
-                        .addSymbol("android:string/str", ResourceId(0x01060000))
-                        .build())
-                .build();
-    }
+  void SetUp() override {
+    mContext =
+        test::ContextBuilder()
+            .setCompilationPackage("android")
+            .setPackageId(0x01)
+            .setNameManglerPolicy(NameManglerPolicy{"android"})
+            .addSymbolSource(
+                test::StaticSymbolSourceBuilder()
+                    .addSymbol(
+                        "android:attr/package", ResourceId(0x01010000),
+                        test::AttributeBuilder()
+                            .setTypeMask(android::ResTable_map::TYPE_STRING)
+                            .build())
+                    .addSymbol(
+                        "android:attr/minSdkVersion", ResourceId(0x01010001),
+                        test::AttributeBuilder()
+                            .setTypeMask(android::ResTable_map::TYPE_STRING |
+                                         android::ResTable_map::TYPE_INTEGER)
+                            .build())
+                    .addSymbol(
+                        "android:attr/targetSdkVersion", ResourceId(0x01010002),
+                        test::AttributeBuilder()
+                            .setTypeMask(android::ResTable_map::TYPE_STRING |
+                                         android::ResTable_map::TYPE_INTEGER)
+                            .build())
+                    .addSymbol("android:string/str", ResourceId(0x01060000))
+                    .build())
+            .build();
+  }
 
-    std::unique_ptr<xml::XmlResource> verify(const StringPiece& str) {
-        return verifyWithOptions(str, {});
-    }
+  std::unique_ptr<xml::XmlResource> verify(const StringPiece& str) {
+    return verifyWithOptions(str, {});
+  }
 
-    std::unique_ptr<xml::XmlResource> verifyWithOptions(const StringPiece& str,
-                                                        const ManifestFixerOptions& options) {
-        std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(str);
-        ManifestFixer fixer(options);
-        if (fixer.consume(mContext.get(), doc.get())) {
-            return doc;
-        }
-        return {};
+  std::unique_ptr<xml::XmlResource> verifyWithOptions(
+      const StringPiece& str, const ManifestFixerOptions& options) {
+    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(str);
+    ManifestFixer fixer(options);
+    if (fixer.consume(mContext.get(), doc.get())) {
+      return doc;
     }
+    return {};
+  }
 };
 
 TEST_F(ManifestFixerTest, EnsureManifestIsRootTag) {
-    EXPECT_EQ(nullptr, verify("<other-tag />"));
-    EXPECT_EQ(nullptr, verify("<ns:manifest xmlns:ns=\"com\" />"));
-    EXPECT_NE(nullptr, verify("<manifest package=\"android\"></manifest>"));
+  EXPECT_EQ(nullptr, verify("<other-tag />"));
+  EXPECT_EQ(nullptr, verify("<ns:manifest xmlns:ns=\"com\" />"));
+  EXPECT_NE(nullptr, verify("<manifest package=\"android\"></manifest>"));
 }
 
 TEST_F(ManifestFixerTest, EnsureManifestHasPackage) {
-    EXPECT_NE(nullptr, verify("<manifest package=\"android\" />"));
-    EXPECT_NE(nullptr, verify("<manifest package=\"com.android\" />"));
-    EXPECT_NE(nullptr, verify("<manifest package=\"com.android.google\" />"));
-    EXPECT_EQ(nullptr, verify("<manifest package=\"com.android.google.Class$1\" />"));
-    EXPECT_EQ(nullptr,
-              verify("<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" "
-                     "android:package=\"com.android\" />"));
-    EXPECT_EQ(nullptr, verify("<manifest package=\"@string/str\" />"));
+  EXPECT_NE(nullptr, verify("<manifest package=\"android\" />"));
+  EXPECT_NE(nullptr, verify("<manifest package=\"com.android\" />"));
+  EXPECT_NE(nullptr, verify("<manifest package=\"com.android.google\" />"));
+  EXPECT_EQ(nullptr,
+            verify("<manifest package=\"com.android.google.Class$1\" />"));
+  EXPECT_EQ(nullptr, verify("<manifest "
+                            "xmlns:android=\"http://schemas.android.com/apk/"
+                            "res/android\" "
+                            "android:package=\"com.android\" />"));
+  EXPECT_EQ(nullptr, verify("<manifest package=\"@string/str\" />"));
 }
 
 TEST_F(ManifestFixerTest, UseDefaultSdkVersionsIfNonePresent) {
-    ManifestFixerOptions options = { std::string("8"), std::string("22") };
+  ManifestFixerOptions options = {std::string("8"), std::string("22")};
 
-    std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
+  std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
       <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                 package="android">
         <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="21" />
-      </manifest>)EOF", options);
-    ASSERT_NE(nullptr, doc);
+      </manifest>)EOF",
+                                                            options);
+  ASSERT_NE(nullptr, doc);
 
-    xml::Element* el;
-    xml::Attribute* attr;
+  xml::Element* el;
+  xml::Attribute* attr;
 
-    el = xml::findRootElement(doc.get());
-    ASSERT_NE(nullptr, el);
-    el = el->findChild({}, "uses-sdk");
-    ASSERT_NE(nullptr, el);
-    attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ("7", attr->value);
-    attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ("21", attr->value);
+  el = xml::findRootElement(doc.get());
+  ASSERT_NE(nullptr, el);
+  el = el->findChild({}, "uses-sdk");
+  ASSERT_NE(nullptr, el);
+  attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ("7", attr->value);
+  attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ("21", attr->value);
 
-    doc = verifyWithOptions(R"EOF(
+  doc = verifyWithOptions(R"EOF(
       <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                 package="android">
         <uses-sdk android:targetSdkVersion="21" />
-      </manifest>)EOF", options);
-    ASSERT_NE(nullptr, doc);
+      </manifest>)EOF",
+                          options);
+  ASSERT_NE(nullptr, doc);
 
-    el = xml::findRootElement(doc.get());
-    ASSERT_NE(nullptr, el);
-    el = el->findChild({}, "uses-sdk");
-    ASSERT_NE(nullptr, el);
-    attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ("8", attr->value);
-    attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ("21", attr->value);
+  el = xml::findRootElement(doc.get());
+  ASSERT_NE(nullptr, el);
+  el = el->findChild({}, "uses-sdk");
+  ASSERT_NE(nullptr, el);
+  attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ("8", attr->value);
+  attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ("21", attr->value);
 
-    doc = verifyWithOptions(R"EOF(
+  doc = verifyWithOptions(R"EOF(
       <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                 package="android">
         <uses-sdk />
-      </manifest>)EOF", options);
-    ASSERT_NE(nullptr, doc);
+      </manifest>)EOF",
+                          options);
+  ASSERT_NE(nullptr, doc);
 
-    el = xml::findRootElement(doc.get());
-    ASSERT_NE(nullptr, el);
-    el = el->findChild({}, "uses-sdk");
-    ASSERT_NE(nullptr, el);
-    attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ("8", attr->value);
-    attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ("22", attr->value);
+  el = xml::findRootElement(doc.get());
+  ASSERT_NE(nullptr, el);
+  el = el->findChild({}, "uses-sdk");
+  ASSERT_NE(nullptr, el);
+  attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ("8", attr->value);
+  attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ("22", attr->value);
 
-    doc = verifyWithOptions(R"EOF(
+  doc = verifyWithOptions(R"EOF(
       <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-                package="android" />)EOF", options);
-    ASSERT_NE(nullptr, doc);
+                package="android" />)EOF",
+                          options);
+  ASSERT_NE(nullptr, doc);
 
-    el = xml::findRootElement(doc.get());
-    ASSERT_NE(nullptr, el);
-    el = el->findChild({}, "uses-sdk");
-    ASSERT_NE(nullptr, el);
-    attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ("8", attr->value);
-    attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ("22", attr->value);
+  el = xml::findRootElement(doc.get());
+  ASSERT_NE(nullptr, el);
+  el = el->findChild({}, "uses-sdk");
+  ASSERT_NE(nullptr, el);
+  attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ("8", attr->value);
+  attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ("22", attr->value);
 }
 
 TEST_F(ManifestFixerTest, RenameManifestPackageAndFullyQualifyClasses) {
-    ManifestFixerOptions options;
-    options.renameManifestPackage = std::string("com.android");
+  ManifestFixerOptions options;
+  options.renameManifestPackage = std::string("com.android");
 
-    std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
+  std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
       <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                 package="android">
         <application android:name=".MainApplication" text="hello">
           <activity android:name=".activity.Start" />
           <receiver android:name="com.google.android.Receiver" />
         </application>
-      </manifest>)EOF", options);
-    ASSERT_NE(nullptr, doc);
+      </manifest>)EOF",
+                                                            options);
+  ASSERT_NE(nullptr, doc);
 
-    xml::Element* manifestEl = xml::findRootElement(doc.get());
-    ASSERT_NE(nullptr, manifestEl);
+  xml::Element* manifestEl = xml::findRootElement(doc.get());
+  ASSERT_NE(nullptr, manifestEl);
 
-    xml::Attribute* attr = nullptr;
+  xml::Attribute* attr = nullptr;
 
-    attr = manifestEl->findAttribute({},"package");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ(std::string("com.android"), attr->value);
+  attr = manifestEl->findAttribute({}, "package");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ(std::string("com.android"), attr->value);
 
-    xml::Element* applicationEl = manifestEl->findChild({}, "application");
-    ASSERT_NE(nullptr, applicationEl);
+  xml::Element* applicationEl = manifestEl->findChild({}, "application");
+  ASSERT_NE(nullptr, applicationEl);
 
-    attr = applicationEl->findAttribute(xml::kSchemaAndroid, "name");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ(std::string("android.MainApplication"), attr->value);
+  attr = applicationEl->findAttribute(xml::kSchemaAndroid, "name");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ(std::string("android.MainApplication"), attr->value);
 
-    attr = applicationEl->findAttribute({}, "text");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ(std::string("hello"), attr->value);
+  attr = applicationEl->findAttribute({}, "text");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ(std::string("hello"), attr->value);
 
-    xml::Element* el;
-    el = applicationEl->findChild({}, "activity");
-    ASSERT_NE(nullptr, el);
+  xml::Element* el;
+  el = applicationEl->findChild({}, "activity");
+  ASSERT_NE(nullptr, el);
 
-    attr = el->findAttribute(xml::kSchemaAndroid, "name");
-    ASSERT_NE(nullptr, el);
-    EXPECT_EQ(std::string("android.activity.Start"), attr->value);
+  attr = el->findAttribute(xml::kSchemaAndroid, "name");
+  ASSERT_NE(nullptr, el);
+  EXPECT_EQ(std::string("android.activity.Start"), attr->value);
 
-    el = applicationEl->findChild({}, "receiver");
-    ASSERT_NE(nullptr, el);
+  el = applicationEl->findChild({}, "receiver");
+  ASSERT_NE(nullptr, el);
 
-    attr = el->findAttribute(xml::kSchemaAndroid, "name");
-    ASSERT_NE(nullptr, el);
-    EXPECT_EQ(std::string("com.google.android.Receiver"), attr->value);
+  attr = el->findAttribute(xml::kSchemaAndroid, "name");
+  ASSERT_NE(nullptr, el);
+  EXPECT_EQ(std::string("com.google.android.Receiver"), attr->value);
 }
 
-TEST_F(ManifestFixerTest, RenameManifestInstrumentationPackageAndFullyQualifyTarget) {
-    ManifestFixerOptions options;
-    options.renameInstrumentationTargetPackage = std::string("com.android");
+TEST_F(ManifestFixerTest,
+       RenameManifestInstrumentationPackageAndFullyQualifyTarget) {
+  ManifestFixerOptions options;
+  options.renameInstrumentationTargetPackage = std::string("com.android");
 
-    std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
+  std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
       <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                 package="android">
         <instrumentation android:targetPackage="android" />
-      </manifest>)EOF", options);
-    ASSERT_NE(nullptr, doc);
+      </manifest>)EOF",
+                                                            options);
+  ASSERT_NE(nullptr, doc);
 
-    xml::Element* manifestEl = xml::findRootElement(doc.get());
-    ASSERT_NE(nullptr, manifestEl);
+  xml::Element* manifestEl = xml::findRootElement(doc.get());
+  ASSERT_NE(nullptr, manifestEl);
 
-    xml::Element* instrumentationEl = manifestEl->findChild({}, "instrumentation");
-    ASSERT_NE(nullptr, instrumentationEl);
+  xml::Element* instrumentationEl =
+      manifestEl->findChild({}, "instrumentation");
+  ASSERT_NE(nullptr, instrumentationEl);
 
-    xml::Attribute* attr = instrumentationEl->findAttribute(xml::kSchemaAndroid, "targetPackage");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ(std::string("com.android"), attr->value);
+  xml::Attribute* attr =
+      instrumentationEl->findAttribute(xml::kSchemaAndroid, "targetPackage");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ(std::string("com.android"), attr->value);
 }
 
 TEST_F(ManifestFixerTest, UseDefaultVersionNameAndCode) {
-    ManifestFixerOptions options;
-    options.versionNameDefault = std::string("Beta");
-    options.versionCodeDefault = std::string("0x10000000");
+  ManifestFixerOptions options;
+  options.versionNameDefault = std::string("Beta");
+  options.versionCodeDefault = std::string("0x10000000");
 
-    std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
+  std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
       <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-                package="android" />)EOF", options);
-    ASSERT_NE(nullptr, doc);
+                package="android" />)EOF",
+                                                            options);
+  ASSERT_NE(nullptr, doc);
 
-    xml::Element* manifestEl = xml::findRootElement(doc.get());
-    ASSERT_NE(nullptr, manifestEl);
+  xml::Element* manifestEl = xml::findRootElement(doc.get());
+  ASSERT_NE(nullptr, manifestEl);
 
-    xml::Attribute* attr = manifestEl->findAttribute(xml::kSchemaAndroid, "versionName");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ(std::string("Beta"), attr->value);
+  xml::Attribute* attr =
+      manifestEl->findAttribute(xml::kSchemaAndroid, "versionName");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ(std::string("Beta"), attr->value);
 
-    attr = manifestEl->findAttribute(xml::kSchemaAndroid, "versionCode");
-    ASSERT_NE(nullptr, attr);
-    EXPECT_EQ(std::string("0x10000000"), attr->value);
+  attr = manifestEl->findAttribute(xml::kSchemaAndroid, "versionCode");
+  ASSERT_NE(nullptr, attr);
+  EXPECT_EQ(std::string("0x10000000"), attr->value);
 }
 
 TEST_F(ManifestFixerTest, EnsureManifestAttributesAreTyped) {
-    EXPECT_EQ(nullptr, verify("<manifest package=\"android\" coreApp=\"hello\" />"));
-    EXPECT_EQ(nullptr, verify("<manifest package=\"android\" coreApp=\"1dp\" />"));
+  EXPECT_EQ(nullptr,
+            verify("<manifest package=\"android\" coreApp=\"hello\" />"));
+  EXPECT_EQ(nullptr,
+            verify("<manifest package=\"android\" coreApp=\"1dp\" />"));
 
-    std::unique_ptr<xml::XmlResource> doc =
-            verify("<manifest package=\"android\" coreApp=\"true\" />");
-    ASSERT_NE(nullptr, doc);
+  std::unique_ptr<xml::XmlResource> doc =
+      verify("<manifest package=\"android\" coreApp=\"true\" />");
+  ASSERT_NE(nullptr, doc);
 
-    xml::Element* el = xml::findRootElement(doc.get());
-    ASSERT_NE(nullptr, el);
+  xml::Element* el = xml::findRootElement(doc.get());
+  ASSERT_NE(nullptr, el);
 
-    EXPECT_EQ("manifest", el->name);
+  EXPECT_EQ("manifest", el->name);
 
-    xml::Attribute* attr = el->findAttribute("", "coreApp");
-    ASSERT_NE(nullptr, attr);
+  xml::Attribute* attr = el->findAttribute("", "coreApp");
+  ASSERT_NE(nullptr, attr);
 
-    EXPECT_NE(nullptr, attr->compiledValue);
-    EXPECT_NE(nullptr, valueCast<BinaryPrimitive>(attr->compiledValue.get()));
+  EXPECT_NE(nullptr, attr->compiledValue);
+  EXPECT_NE(nullptr, valueCast<BinaryPrimitive>(attr->compiledValue.get()));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/PrivateAttributeMover.cpp b/tools/aapt2/link/PrivateAttributeMover.cpp
index 3c8af4f..174b41f 100644
--- a/tools/aapt2/link/PrivateAttributeMover.cpp
+++ b/tools/aapt2/link/PrivateAttributeMover.cpp
@@ -25,56 +25,61 @@
 template <typename InputContainer, typename OutputIterator, typename Predicate>
 OutputIterator moveIf(InputContainer& inputContainer, OutputIterator result,
                       Predicate pred) {
-    const auto last = inputContainer.end();
-    auto newEnd = std::find_if(inputContainer.begin(), inputContainer.end(), pred);
-    if (newEnd == last) {
-        return result;
-    }
-
-    *result = std::move(*newEnd);
-
-    auto first = newEnd;
-    ++first;
-
-    for (; first != last; ++first) {
-        if (bool(pred(*first))) {
-            // We want to move this guy
-            *result = std::move(*first);
-            ++result;
-        } else {
-            // We want to keep this guy, but we will need to move it up the list to replace
-            // missing items.
-            *newEnd = std::move(*first);
-            ++newEnd;
-        }
-    }
-
-    inputContainer.erase(newEnd, last);
+  const auto last = inputContainer.end();
+  auto newEnd =
+      std::find_if(inputContainer.begin(), inputContainer.end(), pred);
+  if (newEnd == last) {
     return result;
-}
+  }
 
-bool PrivateAttributeMover::consume(IAaptContext* context, ResourceTable* table) {
-    for (auto& package : table->packages) {
-        ResourceTableType* type = package->findType(ResourceType::kAttr);
-        if (!type) {
-            continue;
-        }
+  *result = std::move(*newEnd);
 
-        if (type->symbolStatus.state != SymbolState::kPublic) {
-            // No public attributes, so we can safely leave these private attributes where they are.
-            return true;
-        }
+  auto first = newEnd;
+  ++first;
 
-        ResourceTableType* privAttrType = package->findOrCreateType(ResourceType::kAttrPrivate);
-        assert(privAttrType->entries.empty());
-
-        moveIf(type->entries, std::back_inserter(privAttrType->entries),
-               [](const std::unique_ptr<ResourceEntry>& entry) -> bool {
-                   return entry->symbolStatus.state != SymbolState::kPublic;
-               });
-        break;
+  for (; first != last; ++first) {
+    if (bool(pred(*first))) {
+      // We want to move this guy
+      *result = std::move(*first);
+      ++result;
+    } else {
+      // We want to keep this guy, but we will need to move it up the list to
+      // replace
+      // missing items.
+      *newEnd = std::move(*first);
+      ++newEnd;
     }
-    return true;
+  }
+
+  inputContainer.erase(newEnd, last);
+  return result;
 }
 
-} // namespace aapt
+bool PrivateAttributeMover::consume(IAaptContext* context,
+                                    ResourceTable* table) {
+  for (auto& package : table->packages) {
+    ResourceTableType* type = package->findType(ResourceType::kAttr);
+    if (!type) {
+      continue;
+    }
+
+    if (type->symbolStatus.state != SymbolState::kPublic) {
+      // No public attributes, so we can safely leave these private attributes
+      // where they are.
+      return true;
+    }
+
+    ResourceTableType* privAttrType =
+        package->findOrCreateType(ResourceType::kAttrPrivate);
+    assert(privAttrType->entries.empty());
+
+    moveIf(type->entries, std::back_inserter(privAttrType->entries),
+           [](const std::unique_ptr<ResourceEntry>& entry) -> bool {
+             return entry->symbolStatus.state != SymbolState::kPublic;
+           });
+    break;
+  }
+  return true;
+}
+
+}  // namespace aapt
diff --git a/tools/aapt2/link/PrivateAttributeMover_test.cpp b/tools/aapt2/link/PrivateAttributeMover_test.cpp
index c9d1a08..a7a1013 100644
--- a/tools/aapt2/link/PrivateAttributeMover_test.cpp
+++ b/tools/aapt2/link/PrivateAttributeMover_test.cpp
@@ -20,56 +20,60 @@
 namespace aapt {
 
 TEST(PrivateAttributeMoverTest, MovePrivateAttributes) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
 
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .addSimple("android:attr/publicA")
-            .addSimple("android:attr/privateA")
-            .addSimple("android:attr/publicB")
-            .addSimple("android:attr/privateB")
-            .setSymbolState("android:attr/publicA", ResourceId(0x01010000), SymbolState::kPublic)
-            .setSymbolState("android:attr/publicB", ResourceId(0x01010000), SymbolState::kPublic)
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .addSimple("android:attr/publicA")
+          .addSimple("android:attr/privateA")
+          .addSimple("android:attr/publicB")
+          .addSimple("android:attr/privateB")
+          .setSymbolState("android:attr/publicA", ResourceId(0x01010000),
+                          SymbolState::kPublic)
+          .setSymbolState("android:attr/publicB", ResourceId(0x01010000),
+                          SymbolState::kPublic)
+          .build();
 
-    PrivateAttributeMover mover;
-    ASSERT_TRUE(mover.consume(context.get(), table.get()));
+  PrivateAttributeMover mover;
+  ASSERT_TRUE(mover.consume(context.get(), table.get()));
 
-    ResourceTablePackage* package = table->findPackage("android");
-    ASSERT_NE(package, nullptr);
+  ResourceTablePackage* package = table->findPackage("android");
+  ASSERT_NE(package, nullptr);
 
-    ResourceTableType* type = package->findType(ResourceType::kAttr);
-    ASSERT_NE(type, nullptr);
-    ASSERT_EQ(type->entries.size(), 2u);
-    EXPECT_NE(type->findEntry("publicA"), nullptr);
-    EXPECT_NE(type->findEntry("publicB"), nullptr);
+  ResourceTableType* type = package->findType(ResourceType::kAttr);
+  ASSERT_NE(type, nullptr);
+  ASSERT_EQ(type->entries.size(), 2u);
+  EXPECT_NE(type->findEntry("publicA"), nullptr);
+  EXPECT_NE(type->findEntry("publicB"), nullptr);
 
-    type = package->findType(ResourceType::kAttrPrivate);
-    ASSERT_NE(type, nullptr);
-    ASSERT_EQ(type->entries.size(), 2u);
-    EXPECT_NE(type->findEntry("privateA"), nullptr);
-    EXPECT_NE(type->findEntry("privateB"), nullptr);
+  type = package->findType(ResourceType::kAttrPrivate);
+  ASSERT_NE(type, nullptr);
+  ASSERT_EQ(type->entries.size(), 2u);
+  EXPECT_NE(type->findEntry("privateA"), nullptr);
+  EXPECT_NE(type->findEntry("privateB"), nullptr);
 }
 
-TEST(PrivateAttributeMoverTest, LeavePrivateAttributesWhenNoPublicAttributesDefined) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+TEST(PrivateAttributeMoverTest,
+     LeavePrivateAttributesWhenNoPublicAttributesDefined) {
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
 
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .addSimple("android:attr/privateA")
-            .addSimple("android:attr/privateB")
-            .build();
+  std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
+                                             .addSimple("android:attr/privateA")
+                                             .addSimple("android:attr/privateB")
+                                             .build();
 
-    PrivateAttributeMover mover;
-    ASSERT_TRUE(mover.consume(context.get(), table.get()));
+  PrivateAttributeMover mover;
+  ASSERT_TRUE(mover.consume(context.get(), table.get()));
 
-    ResourceTablePackage* package = table->findPackage("android");
-    ASSERT_NE(package, nullptr);
+  ResourceTablePackage* package = table->findPackage("android");
+  ASSERT_NE(package, nullptr);
 
-    ResourceTableType* type = package->findType(ResourceType::kAttr);
-    ASSERT_NE(type, nullptr);
-    ASSERT_EQ(type->entries.size(), 2u);
+  ResourceTableType* type = package->findType(ResourceType::kAttr);
+  ASSERT_NE(type, nullptr);
+  ASSERT_EQ(type->entries.size(), 2u);
 
-    type = package->findType(ResourceType::kAttrPrivate);
-    ASSERT_EQ(type, nullptr);
+  type = package->findType(ResourceType::kAttrPrivate);
+  ASSERT_EQ(type, nullptr);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/ProductFilter.cpp b/tools/aapt2/link/ProductFilter.cpp
index 8784e89..d59b682 100644
--- a/tools/aapt2/link/ProductFilter.cpp
+++ b/tools/aapt2/link/ProductFilter.cpp
@@ -18,101 +18,103 @@
 
 namespace aapt {
 
-ProductFilter::ResourceConfigValueIter
-ProductFilter::selectProductToKeep(const ResourceNameRef& name,
-                                   const ResourceConfigValueIter begin,
-                                   const ResourceConfigValueIter end,
-                                   IDiagnostics* diag) {
-    ResourceConfigValueIter defaultProductIter = end;
-    ResourceConfigValueIter selectedProductIter = end;
+ProductFilter::ResourceConfigValueIter ProductFilter::selectProductToKeep(
+    const ResourceNameRef& name, const ResourceConfigValueIter begin,
+    const ResourceConfigValueIter end, IDiagnostics* diag) {
+  ResourceConfigValueIter defaultProductIter = end;
+  ResourceConfigValueIter selectedProductIter = end;
 
-    for (ResourceConfigValueIter iter = begin; iter != end; ++iter) {
-        ResourceConfigValue* configValue = iter->get();
-        if (mProducts.find(configValue->product) != mProducts.end()) {
-            if (selectedProductIter != end) {
-                // We have two possible values for this product!
-                diag->error(DiagMessage(configValue->value->getSource())
-                            << "selection of product '" << configValue->product
-                            << "' for resource " << name << " is ambiguous");
+  for (ResourceConfigValueIter iter = begin; iter != end; ++iter) {
+    ResourceConfigValue* configValue = iter->get();
+    if (mProducts.find(configValue->product) != mProducts.end()) {
+      if (selectedProductIter != end) {
+        // We have two possible values for this product!
+        diag->error(DiagMessage(configValue->value->getSource())
+                    << "selection of product '" << configValue->product
+                    << "' for resource " << name << " is ambiguous");
 
-                ResourceConfigValue* previouslySelectedConfigValue = selectedProductIter->get();
-                diag->note(DiagMessage(previouslySelectedConfigValue->value->getSource())
-                           << "product '" << previouslySelectedConfigValue->product
-                           << "' is also a candidate");
-                return end;
-            }
-
-            // Select this product.
-            selectedProductIter = iter;
-        }
-
-        if (configValue->product.empty() || configValue->product == "default") {
-            if (defaultProductIter != end) {
-                // We have two possible default values.
-                diag->error(DiagMessage(configValue->value->getSource())
-                            << "multiple default products defined for resource " << name);
-
-                ResourceConfigValue* previouslyDefaultConfigValue = defaultProductIter->get();
-                diag->note(DiagMessage(previouslyDefaultConfigValue->value->getSource())
-                           << "default product also defined here");
-                return end;
-            }
-
-            // Mark the default.
-            defaultProductIter = iter;
-        }
-    }
-
-    if (defaultProductIter == end) {
-        diag->error(DiagMessage() << "no default product defined for resource " << name);
+        ResourceConfigValue* previouslySelectedConfigValue =
+            selectedProductIter->get();
+        diag->note(
+            DiagMessage(previouslySelectedConfigValue->value->getSource())
+            << "product '" << previouslySelectedConfigValue->product
+            << "' is also a candidate");
         return end;
+      }
+
+      // Select this product.
+      selectedProductIter = iter;
     }
 
-    if (selectedProductIter == end) {
-        selectedProductIter = defaultProductIter;
+    if (configValue->product.empty() || configValue->product == "default") {
+      if (defaultProductIter != end) {
+        // We have two possible default values.
+        diag->error(DiagMessage(configValue->value->getSource())
+                    << "multiple default products defined for resource "
+                    << name);
+
+        ResourceConfigValue* previouslyDefaultConfigValue =
+            defaultProductIter->get();
+        diag->note(DiagMessage(previouslyDefaultConfigValue->value->getSource())
+                   << "default product also defined here");
+        return end;
+      }
+
+      // Mark the default.
+      defaultProductIter = iter;
     }
-    return selectedProductIter;
+  }
+
+  if (defaultProductIter == end) {
+    diag->error(DiagMessage() << "no default product defined for resource "
+                              << name);
+    return end;
+  }
+
+  if (selectedProductIter == end) {
+    selectedProductIter = defaultProductIter;
+  }
+  return selectedProductIter;
 }
 
 bool ProductFilter::consume(IAaptContext* context, ResourceTable* table) {
-    bool error = false;
-    for (auto& pkg : table->packages) {
-        for (auto& type : pkg->types) {
-            for (auto& entry : type->entries) {
-                std::vector<std::unique_ptr<ResourceConfigValue>> newValues;
+  bool error = false;
+  for (auto& pkg : table->packages) {
+    for (auto& type : pkg->types) {
+      for (auto& entry : type->entries) {
+        std::vector<std::unique_ptr<ResourceConfigValue>> newValues;
 
-                ResourceConfigValueIter iter = entry->values.begin();
-                ResourceConfigValueIter startRangeIter = iter;
-                while (iter != entry->values.end()) {
-                    ++iter;
-                    if (iter == entry->values.end() ||
-                            (*iter)->config != (*startRangeIter)->config) {
-
-                        // End of the array, or we saw a different config,
-                        // so this must be the end of a range of products.
-                        // Select the product to keep from the set of products defined.
-                        ResourceNameRef name(pkg->name, type->type, entry->name);
-                        auto valueToKeep = selectProductToKeep(name, startRangeIter, iter,
-                                                               context->getDiagnostics());
-                        if (valueToKeep == iter) {
-                            // An error occurred, we could not pick a product.
-                            error = true;
-                        } else {
-                            // We selected a product to keep. Move it to the new array.
-                            newValues.push_back(std::move(*valueToKeep));
-                        }
-
-                        // Start the next range of products.
-                        startRangeIter = iter;
-                    }
-                }
-
-                // Now move the new values in to place.
-                entry->values = std::move(newValues);
+        ResourceConfigValueIter iter = entry->values.begin();
+        ResourceConfigValueIter startRangeIter = iter;
+        while (iter != entry->values.end()) {
+          ++iter;
+          if (iter == entry->values.end() ||
+              (*iter)->config != (*startRangeIter)->config) {
+            // End of the array, or we saw a different config,
+            // so this must be the end of a range of products.
+            // Select the product to keep from the set of products defined.
+            ResourceNameRef name(pkg->name, type->type, entry->name);
+            auto valueToKeep = selectProductToKeep(name, startRangeIter, iter,
+                                                   context->getDiagnostics());
+            if (valueToKeep == iter) {
+              // An error occurred, we could not pick a product.
+              error = true;
+            } else {
+              // We selected a product to keep. Move it to the new array.
+              newValues.push_back(std::move(*valueToKeep));
             }
+
+            // Start the next range of products.
+            startRangeIter = iter;
+          }
         }
+
+        // Now move the new values in to place.
+        entry->values = std::move(newValues);
+      }
     }
-    return !error;
+  }
+  return !error;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/ProductFilter.h b/tools/aapt2/link/ProductFilter.h
index 7724e14..cc8b8c2 100644
--- a/tools/aapt2/link/ProductFilter.h
+++ b/tools/aapt2/link/ProductFilter.h
@@ -26,24 +26,25 @@
 namespace aapt {
 
 class ProductFilter {
-public:
-    using ResourceConfigValueIter = std::vector<std::unique_ptr<ResourceConfigValue>>::iterator;
+ public:
+  using ResourceConfigValueIter =
+      std::vector<std::unique_ptr<ResourceConfigValue>>::iterator;
 
-    explicit ProductFilter(std::unordered_set<std::string> products) : mProducts(products) { }
+  explicit ProductFilter(std::unordered_set<std::string> products)
+      : mProducts(products) {}
 
-    ResourceConfigValueIter selectProductToKeep(const ResourceNameRef& name,
-                                                const ResourceConfigValueIter begin,
-                                                const ResourceConfigValueIter end,
-                                                IDiagnostics* diag);
+  ResourceConfigValueIter selectProductToKeep(
+      const ResourceNameRef& name, const ResourceConfigValueIter begin,
+      const ResourceConfigValueIter end, IDiagnostics* diag);
 
-    bool consume(IAaptContext* context, ResourceTable* table);
+  bool consume(IAaptContext* context, ResourceTable* table);
 
-private:
-    std::unordered_set<std::string> mProducts;
+ private:
+  std::unordered_set<std::string> mProducts;
 
-    DISALLOW_COPY_AND_ASSIGN(ProductFilter);
+  DISALLOW_COPY_AND_ASSIGN(ProductFilter);
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_LINK_PRODUCTFILTER_H */
diff --git a/tools/aapt2/link/ProductFilter_test.cpp b/tools/aapt2/link/ProductFilter_test.cpp
index a3376ac..7f78f8b 100644
--- a/tools/aapt2/link/ProductFilter_test.cpp
+++ b/tools/aapt2/link/ProductFilter_test.cpp
@@ -20,114 +20,110 @@
 namespace aapt {
 
 TEST(ProductFilterTest, SelectTwoProducts) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
 
-    const ConfigDescription land = test::parseConfigOrDie("land");
-    const ConfigDescription port = test::parseConfigOrDie("port");
+  const ConfigDescription land = test::parseConfigOrDie("land");
+  const ConfigDescription port = test::parseConfigOrDie("port");
 
-    ResourceTable table;
-    ASSERT_TRUE(table.addResource(test::parseNameOrDie("android:string/one"),
-                                  land, "",
-                                  test::ValueBuilder<Id>()
-                                          .setSource(Source("land/default.xml")).build(),
-                                  context->getDiagnostics()));
-    ASSERT_TRUE(table.addResource(test::parseNameOrDie("android:string/one"),
-                                  land, "tablet",
-                                  test::ValueBuilder<Id>()
-                                          .setSource(Source("land/tablet.xml")).build(),
-                                  context->getDiagnostics()));
+  ResourceTable table;
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/one"), land, "",
+      test::ValueBuilder<Id>().setSource(Source("land/default.xml")).build(),
+      context->getDiagnostics()));
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/one"), land, "tablet",
+      test::ValueBuilder<Id>().setSource(Source("land/tablet.xml")).build(),
+      context->getDiagnostics()));
 
-    ASSERT_TRUE(table.addResource(test::parseNameOrDie("android:string/one"),
-                                  port, "",
-                                  test::ValueBuilder<Id>()
-                                          .setSource(Source("port/default.xml")).build(),
-                                  context->getDiagnostics()));
-    ASSERT_TRUE(table.addResource(test::parseNameOrDie("android:string/one"),
-                                  port, "tablet",
-                                  test::ValueBuilder<Id>()
-                                          .setSource(Source("port/tablet.xml")).build(),
-                                  context->getDiagnostics()));
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/one"), port, "",
+      test::ValueBuilder<Id>().setSource(Source("port/default.xml")).build(),
+      context->getDiagnostics()));
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/one"), port, "tablet",
+      test::ValueBuilder<Id>().setSource(Source("port/tablet.xml")).build(),
+      context->getDiagnostics()));
 
-    ProductFilter filter({ "tablet" });
-    ASSERT_TRUE(filter.consume(context.get(), &table));
+  ProductFilter filter({"tablet"});
+  ASSERT_TRUE(filter.consume(context.get(), &table));
 
-    EXPECT_EQ(nullptr, test::getValueForConfigAndProduct<Id>(&table, "android:string/one",
-                                                             land, ""));
-    EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(&table, "android:string/one",
-                                                             land, "tablet"));
-    EXPECT_EQ(nullptr, test::getValueForConfigAndProduct<Id>(&table, "android:string/one",
-                                                             port, ""));
-    EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(&table, "android:string/one",
-                                                             port, "tablet"));
+  EXPECT_EQ(nullptr, test::getValueForConfigAndProduct<Id>(
+                         &table, "android:string/one", land, ""));
+  EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(
+                         &table, "android:string/one", land, "tablet"));
+  EXPECT_EQ(nullptr, test::getValueForConfigAndProduct<Id>(
+                         &table, "android:string/one", port, ""));
+  EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(
+                         &table, "android:string/one", port, "tablet"));
 }
 
 TEST(ProductFilterTest, SelectDefaultProduct) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
 
-    ResourceTable table;
-    ASSERT_TRUE(table.addResource(test::parseNameOrDie("android:string/one"),
-                                  ConfigDescription::defaultConfig(), "",
-                                  test::ValueBuilder<Id>()
-                                          .setSource(Source("default.xml")).build(),
-                                  context->getDiagnostics()));
-    ASSERT_TRUE(table.addResource(test::parseNameOrDie("android:string/one"),
-                                  ConfigDescription::defaultConfig(), "tablet",
-                                  test::ValueBuilder<Id>()
-                                          .setSource(Source("tablet.xml")).build(),
-                                  context->getDiagnostics()));
+  ResourceTable table;
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/one"),
+      ConfigDescription::defaultConfig(), "",
+      test::ValueBuilder<Id>().setSource(Source("default.xml")).build(),
+      context->getDiagnostics()));
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/one"),
+      ConfigDescription::defaultConfig(), "tablet",
+      test::ValueBuilder<Id>().setSource(Source("tablet.xml")).build(),
+      context->getDiagnostics()));
 
-    ProductFilter filter({});
-    ASSERT_TRUE(filter.consume(context.get(), &table));
+  ProductFilter filter({});
+  ASSERT_TRUE(filter.consume(context.get(), &table));
 
-    EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(&table, "android:string/one",
-                                                             ConfigDescription::defaultConfig(),
-                                                             ""));
-    EXPECT_EQ(nullptr, test::getValueForConfigAndProduct<Id>(&table, "android:string/one",
-                                                             ConfigDescription::defaultConfig(),
-                                                             "tablet"));
+  EXPECT_NE(nullptr, test::getValueForConfigAndProduct<Id>(
+                         &table, "android:string/one",
+                         ConfigDescription::defaultConfig(), ""));
+  EXPECT_EQ(nullptr, test::getValueForConfigAndProduct<Id>(
+                         &table, "android:string/one",
+                         ConfigDescription::defaultConfig(), "tablet"));
 }
 
 TEST(ProductFilterTest, FailOnAmbiguousProduct) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
 
-    ResourceTable table;
-    ASSERT_TRUE(table.addResource(test::parseNameOrDie("android:string/one"),
-                                  ConfigDescription::defaultConfig(), "",
-                                  test::ValueBuilder<Id>()
-                                          .setSource(Source("default.xml")).build(),
-                                  context->getDiagnostics()));
-    ASSERT_TRUE(table.addResource(test::parseNameOrDie("android:string/one"),
-                                  ConfigDescription::defaultConfig(), "tablet",
-                                  test::ValueBuilder<Id>()
-                                          .setSource(Source("tablet.xml")).build(),
-                                  context->getDiagnostics()));
-    ASSERT_TRUE(table.addResource(test::parseNameOrDie("android:string/one"),
-                                  ConfigDescription::defaultConfig(), "no-sdcard",
-                                  test::ValueBuilder<Id>()
-                                          .setSource(Source("no-sdcard.xml")).build(),
-                                  context->getDiagnostics()));
+  ResourceTable table;
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/one"),
+      ConfigDescription::defaultConfig(), "",
+      test::ValueBuilder<Id>().setSource(Source("default.xml")).build(),
+      context->getDiagnostics()));
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/one"),
+      ConfigDescription::defaultConfig(), "tablet",
+      test::ValueBuilder<Id>().setSource(Source("tablet.xml")).build(),
+      context->getDiagnostics()));
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/one"),
+      ConfigDescription::defaultConfig(), "no-sdcard",
+      test::ValueBuilder<Id>().setSource(Source("no-sdcard.xml")).build(),
+      context->getDiagnostics()));
 
-    ProductFilter filter({ "tablet", "no-sdcard" });
-    ASSERT_FALSE(filter.consume(context.get(), &table));
+  ProductFilter filter({"tablet", "no-sdcard"});
+  ASSERT_FALSE(filter.consume(context.get(), &table));
 }
 
 TEST(ProductFilterTest, FailOnMultipleDefaults) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
 
-    ResourceTable table;
-    ASSERT_TRUE(table.addResource(test::parseNameOrDie("android:string/one"),
-                                  ConfigDescription::defaultConfig(), "",
-                                  test::ValueBuilder<Id>()
-                                          .setSource(Source(".xml")).build(),
-                                  context->getDiagnostics()));
-    ASSERT_TRUE(table.addResource(test::parseNameOrDie("android:string/one"),
-                                  ConfigDescription::defaultConfig(), "default",
-                                  test::ValueBuilder<Id>()
-                                          .setSource(Source("default.xml")).build(),
-                                  context->getDiagnostics()));
+  ResourceTable table;
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/one"),
+      ConfigDescription::defaultConfig(), "",
+      test::ValueBuilder<Id>().setSource(Source(".xml")).build(),
+      context->getDiagnostics()));
+  ASSERT_TRUE(table.addResource(
+      test::parseNameOrDie("android:string/one"),
+      ConfigDescription::defaultConfig(), "default",
+      test::ValueBuilder<Id>().setSource(Source("default.xml")).build(),
+      context->getDiagnostics()));
 
-    ProductFilter filter({});
-    ASSERT_FALSE(filter.consume(context.get(), &table));
+  ProductFilter filter({});
+  ASSERT_FALSE(filter.consume(context.get(), &table));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/ReferenceLinker.cpp b/tools/aapt2/link/ReferenceLinker.cpp
index be7aca3..7fe0956 100644
--- a/tools/aapt2/link/ReferenceLinker.cpp
+++ b/tools/aapt2/link/ReferenceLinker.cpp
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-#include "Diagnostics.h"
 #include "ReferenceLinker.h"
+#include "Diagnostics.h"
 #include "ResourceTable.h"
 #include "ResourceUtils.h"
 #include "ResourceValues.h"
@@ -34,302 +34,335 @@
 namespace {
 
 /**
- * The ReferenceLinkerVisitor will follow all references and make sure they point
- * to resources that actually exist, either in the local resource table, or as external
- * symbols. Once the target resource has been found, the ID of the resource will be assigned
+ * The ReferenceLinkerVisitor will follow all references and make sure they
+ * point
+ * to resources that actually exist, either in the local resource table, or as
+ * external
+ * symbols. Once the target resource has been found, the ID of the resource will
+ * be assigned
  * to the reference object.
  *
  * NOTE: All of the entries in the ResourceTable must be assigned IDs.
  */
 class ReferenceLinkerVisitor : public ValueVisitor {
-public:
-    using ValueVisitor::visit;
+ public:
+  using ValueVisitor::visit;
 
-    ReferenceLinkerVisitor(IAaptContext* context, SymbolTable* symbols, StringPool* stringPool,
-                           xml::IPackageDeclStack* decl,CallSite* callSite) :
-            mContext(context), mSymbols(symbols), mPackageDecls(decl), mStringPool(stringPool),
-            mCallSite(callSite) {
+  ReferenceLinkerVisitor(IAaptContext* context, SymbolTable* symbols,
+                         StringPool* stringPool, xml::IPackageDeclStack* decl,
+                         CallSite* callSite)
+      : mContext(context),
+        mSymbols(symbols),
+        mPackageDecls(decl),
+        mStringPool(stringPool),
+        mCallSite(callSite) {}
+
+  void visit(Reference* ref) override {
+    if (!ReferenceLinker::linkReference(ref, mContext, mSymbols, mPackageDecls,
+                                        mCallSite)) {
+      mError = true;
+    }
+  }
+
+  /**
+   * We visit the Style specially because during this phase, values of
+   * attributes are
+   * all RawString values. Now that we are expected to resolve all symbols, we
+   * can
+   * lookup the attributes to find out which types are allowed for the
+   * attributes' values.
+   */
+  void visit(Style* style) override {
+    if (style->parent) {
+      visit(&style->parent.value());
     }
 
-    void visit(Reference* ref) override {
-        if (!ReferenceLinker::linkReference(ref, mContext, mSymbols, mPackageDecls, mCallSite)) {
-            mError = true;
-        }
-    }
+    for (Style::Entry& entry : style->entries) {
+      std::string errStr;
 
-    /**
-     * We visit the Style specially because during this phase, values of attributes are
-     * all RawString values. Now that we are expected to resolve all symbols, we can
-     * lookup the attributes to find out which types are allowed for the attributes' values.
-     */
-    void visit(Style* style) override {
-        if (style->parent) {
-            visit(&style->parent.value());
+      // Transform the attribute reference so that it is using the fully
+      // qualified package
+      // name. This will also mark the reference as being able to see private
+      // resources if
+      // there was a '*' in the reference or if the package came from the
+      // private namespace.
+      Reference transformedReference = entry.key;
+      transformReferenceFromNamespace(mPackageDecls,
+                                      mContext->getCompilationPackage(),
+                                      &transformedReference);
+
+      // Find the attribute in the symbol table and check if it is visible from
+      // this callsite.
+      const SymbolTable::Symbol* symbol =
+          ReferenceLinker::resolveAttributeCheckVisibility(
+              transformedReference, mContext->getNameMangler(), mSymbols,
+              mCallSite, &errStr);
+      if (symbol) {
+        // Assign our style key the correct ID.
+        // The ID may not exist.
+        entry.key.id = symbol->id;
+
+        // Try to convert the value to a more specific, typed value based on the
+        // attribute it is set to.
+        entry.value = parseValueWithAttribute(std::move(entry.value),
+                                              symbol->attribute.get());
+
+        // Link/resolve the final value (mostly if it's a reference).
+        entry.value->accept(this);
+
+        // Now verify that the type of this item is compatible with the
+        // attribute it
+        // is defined for. We pass `nullptr` as the DiagMessage so that this
+        // check is
+        // fast and we avoid creating a DiagMessage when the match is
+        // successful.
+        if (!symbol->attribute->matches(entry.value.get(), nullptr)) {
+          // The actual type of this item is incompatible with the attribute.
+          DiagMessage msg(entry.key.getSource());
+
+          // Call the matches method again, this time with a DiagMessage so we
+          // fill
+          // in the actual error message.
+          symbol->attribute->matches(entry.value.get(), &msg);
+          mContext->getDiagnostics()->error(msg);
+          mError = true;
         }
 
-        for (Style::Entry& entry : style->entries) {
-            std::string errStr;
+      } else {
+        DiagMessage msg(entry.key.getSource());
+        msg << "style attribute '";
+        ReferenceLinker::writeResourceName(&msg, entry.key,
+                                           transformedReference);
+        msg << "' " << errStr;
+        mContext->getDiagnostics()->error(msg);
+        mError = true;
+      }
+    }
+  }
 
-            // Transform the attribute reference so that it is using the fully qualified package
-            // name. This will also mark the reference as being able to see private resources if
-            // there was a '*' in the reference or if the package came from the private namespace.
-            Reference transformedReference = entry.key;
-            transformReferenceFromNamespace(mPackageDecls, mContext->getCompilationPackage(),
-                                            &transformedReference);
+  bool hasError() { return mError; }
 
-            // Find the attribute in the symbol table and check if it is visible from this callsite.
-            const SymbolTable::Symbol* symbol = ReferenceLinker::resolveAttributeCheckVisibility(
-                    transformedReference, mContext->getNameMangler(), mSymbols, mCallSite, &errStr);
-            if (symbol) {
-                // Assign our style key the correct ID.
-                // The ID may not exist.
-                entry.key.id = symbol->id;
+ private:
+  IAaptContext* mContext;
+  SymbolTable* mSymbols;
+  xml::IPackageDeclStack* mPackageDecls;
+  StringPool* mStringPool;
+  CallSite* mCallSite;
+  bool mError = false;
 
-                // Try to convert the value to a more specific, typed value based on the
-                // attribute it is set to.
-                entry.value = parseValueWithAttribute(std::move(entry.value),
-                                                      symbol->attribute.get());
+  /**
+   * Transform a RawString value into a more specific, appropriate value, based
+   * on the
+   * Attribute. If a non RawString value is passed in, this is an identity
+   * transform.
+   */
+  std::unique_ptr<Item> parseValueWithAttribute(std::unique_ptr<Item> value,
+                                                const Attribute* attr) {
+    if (RawString* rawString = valueCast<RawString>(value.get())) {
+      std::unique_ptr<Item> transformed =
+          ResourceUtils::tryParseItemForAttribute(*rawString->value, attr);
 
-                // Link/resolve the final value (mostly if it's a reference).
-                entry.value->accept(this);
-
-                // Now verify that the type of this item is compatible with the attribute it
-                // is defined for. We pass `nullptr` as the DiagMessage so that this check is
-                // fast and we avoid creating a DiagMessage when the match is successful.
-                if (!symbol->attribute->matches(entry.value.get(), nullptr)) {
-                    // The actual type of this item is incompatible with the attribute.
-                    DiagMessage msg(entry.key.getSource());
-
-                    // Call the matches method again, this time with a DiagMessage so we fill
-                    // in the actual error message.
-                    symbol->attribute->matches(entry.value.get(), &msg);
-                    mContext->getDiagnostics()->error(msg);
-                    mError = true;
-                }
-
-            } else {
-                DiagMessage msg(entry.key.getSource());
-                msg << "style attribute '";
-                ReferenceLinker::writeResourceName(&msg, entry.key, transformedReference);
-                msg << "' " << errStr;
-                mContext->getDiagnostics()->error(msg);
-                mError = true;
-            }
+      // If we could not parse as any specific type, try a basic STRING.
+      if (!transformed &&
+          (attr->typeMask & android::ResTable_map::TYPE_STRING)) {
+        util::StringBuilder stringBuilder;
+        stringBuilder.append(*rawString->value);
+        if (stringBuilder) {
+          transformed = util::make_unique<String>(
+              mStringPool->makeRef(stringBuilder.str()));
         }
-    }
+      }
 
-    bool hasError() {
-        return mError;
-    }
-
-private:
-    IAaptContext* mContext;
-    SymbolTable* mSymbols;
-    xml::IPackageDeclStack* mPackageDecls;
-    StringPool* mStringPool;
-    CallSite* mCallSite;
-    bool mError = false;
-
-    /**
-     * Transform a RawString value into a more specific, appropriate value, based on the
-     * Attribute. If a non RawString value is passed in, this is an identity transform.
-     */
-    std::unique_ptr<Item> parseValueWithAttribute(std::unique_ptr<Item> value,
-                                                  const Attribute* attr) {
-        if (RawString* rawString = valueCast<RawString>(value.get())) {
-            std::unique_ptr<Item> transformed =
-                    ResourceUtils::tryParseItemForAttribute(*rawString->value, attr);
-
-            // If we could not parse as any specific type, try a basic STRING.
-            if (!transformed && (attr->typeMask & android::ResTable_map::TYPE_STRING)) {
-                util::StringBuilder stringBuilder;
-                stringBuilder.append(*rawString->value);
-                if (stringBuilder) {
-                    transformed = util::make_unique<String>(
-                            mStringPool->makeRef(stringBuilder.str()));
-                }
-            }
-
-            if (transformed) {
-                return transformed;
-            }
-        };
-        return value;
-    }
+      if (transformed) {
+        return transformed;
+      }
+    };
+    return value;
+  }
 };
 
-} // namespace
+}  // namespace
 
 /**
- * The symbol is visible if it is public, or if the reference to it is requesting private access
+ * The symbol is visible if it is public, or if the reference to it is
+ * requesting private access
  * or if the callsite comes from the same package.
  */
-bool ReferenceLinker::isSymbolVisible(const SymbolTable::Symbol& symbol, const Reference& ref,
+bool ReferenceLinker::isSymbolVisible(const SymbolTable::Symbol& symbol,
+                                      const Reference& ref,
                                       const CallSite& callSite) {
-    if (!symbol.isPublic && !ref.privateReference) {
-        if (ref.name) {
-            return callSite.resource.package == ref.name.value().package;
-        } else if (ref.id && symbol.id) {
-            return ref.id.value().packageId() == symbol.id.value().packageId();
-        } else {
-            return false;
-        }
+  if (!symbol.isPublic && !ref.privateReference) {
+    if (ref.name) {
+      return callSite.resource.package == ref.name.value().package;
+    } else if (ref.id && symbol.id) {
+      return ref.id.value().packageId() == symbol.id.value().packageId();
+    } else {
+      return false;
     }
-    return true;
+  }
+  return true;
 }
 
-const SymbolTable::Symbol* ReferenceLinker::resolveSymbol(const Reference& reference,
-                                                          NameMangler* mangler,
-                                                          SymbolTable* symbols) {
-    if (reference.name) {
-        Maybe<ResourceName> mangled = mangler->mangleName(reference.name.value());
-        return symbols->findByName(mangled ? mangled.value() : reference.name.value());
-    } else if (reference.id) {
-        return symbols->findById(reference.id.value());
-    } else {
-        return nullptr;
-    }
+const SymbolTable::Symbol* ReferenceLinker::resolveSymbol(
+    const Reference& reference, NameMangler* mangler, SymbolTable* symbols) {
+  if (reference.name) {
+    Maybe<ResourceName> mangled = mangler->mangleName(reference.name.value());
+    return symbols->findByName(mangled ? mangled.value()
+                                       : reference.name.value());
+  } else if (reference.id) {
+    return symbols->findById(reference.id.value());
+  } else {
+    return nullptr;
+  }
 }
 
 const SymbolTable::Symbol* ReferenceLinker::resolveSymbolCheckVisibility(
-        const Reference& reference, NameMangler* nameMangler, SymbolTable* symbols,
-        CallSite* callSite, std::string* outError) {
-    const SymbolTable::Symbol* symbol = resolveSymbol(reference, nameMangler, symbols);
-    if (!symbol) {
-        if (outError) *outError = "not found";
-        return nullptr;
-    }
+    const Reference& reference, NameMangler* nameMangler, SymbolTable* symbols,
+    CallSite* callSite, std::string* outError) {
+  const SymbolTable::Symbol* symbol =
+      resolveSymbol(reference, nameMangler, symbols);
+  if (!symbol) {
+    if (outError) *outError = "not found";
+    return nullptr;
+  }
 
-    if (!isSymbolVisible(*symbol, reference, *callSite)) {
-        if (outError) *outError = "is private";
-        return nullptr;
-    }
-    return symbol;
+  if (!isSymbolVisible(*symbol, reference, *callSite)) {
+    if (outError) *outError = "is private";
+    return nullptr;
+  }
+  return symbol;
 }
 
 const SymbolTable::Symbol* ReferenceLinker::resolveAttributeCheckVisibility(
-        const Reference& reference, NameMangler* nameMangler, SymbolTable* symbols,
-        CallSite* callSite, std::string* outError) {
-    const SymbolTable::Symbol* symbol = resolveSymbolCheckVisibility(reference, nameMangler,
-                                                                     symbols, callSite,
-                                                                     outError);
-    if (!symbol) {
-        return nullptr;
-    }
+    const Reference& reference, NameMangler* nameMangler, SymbolTable* symbols,
+    CallSite* callSite, std::string* outError) {
+  const SymbolTable::Symbol* symbol = resolveSymbolCheckVisibility(
+      reference, nameMangler, symbols, callSite, outError);
+  if (!symbol) {
+    return nullptr;
+  }
 
-    if (!symbol->attribute) {
-        if (outError) *outError = "is not an attribute";
-        return nullptr;
-    }
-    return symbol;
+  if (!symbol->attribute) {
+    if (outError) *outError = "is not an attribute";
+    return nullptr;
+  }
+  return symbol;
 }
 
-Maybe<xml::AaptAttribute> ReferenceLinker::compileXmlAttribute(const Reference& reference,
-                                                               NameMangler* nameMangler,
-                                                               SymbolTable* symbols,
-                                                               CallSite* callSite,
-                                                               std::string* outError) {
-    const SymbolTable::Symbol* symbol = resolveSymbol(reference, nameMangler, symbols);
-    if (!symbol) {
-        if (outError) *outError = "not found";
-        return {};
-    }
+Maybe<xml::AaptAttribute> ReferenceLinker::compileXmlAttribute(
+    const Reference& reference, NameMangler* nameMangler, SymbolTable* symbols,
+    CallSite* callSite, std::string* outError) {
+  const SymbolTable::Symbol* symbol =
+      resolveSymbol(reference, nameMangler, symbols);
+  if (!symbol) {
+    if (outError) *outError = "not found";
+    return {};
+  }
 
-    if (!symbol->attribute) {
-        if (outError) *outError = "is not an attribute";
-        return {};
-    }
-    return xml::AaptAttribute{ symbol->id, *symbol->attribute };
+  if (!symbol->attribute) {
+    if (outError) *outError = "is not an attribute";
+    return {};
+  }
+  return xml::AaptAttribute{symbol->id, *symbol->attribute};
 }
 
-void ReferenceLinker::writeResourceName(DiagMessage* outMsg, const Reference& orig,
+void ReferenceLinker::writeResourceName(DiagMessage* outMsg,
+                                        const Reference& orig,
                                         const Reference& transformed) {
-    assert(outMsg);
+  assert(outMsg);
 
-    if (orig.name) {
-        *outMsg << orig.name.value();
-        if (transformed.name.value() != orig.name.value()) {
-            *outMsg << " (aka " << transformed.name.value() << ")";
-        }
-    } else {
-        *outMsg << orig.id.value();
+  if (orig.name) {
+    *outMsg << orig.name.value();
+    if (transformed.name.value() != orig.name.value()) {
+      *outMsg << " (aka " << transformed.name.value() << ")";
     }
+  } else {
+    *outMsg << orig.id.value();
+  }
 }
 
 bool ReferenceLinker::linkReference(Reference* reference, IAaptContext* context,
-                                    SymbolTable* symbols, xml::IPackageDeclStack* decls,
+                                    SymbolTable* symbols,
+                                    xml::IPackageDeclStack* decls,
                                     CallSite* callSite) {
-    assert(reference);
-    assert(reference->name || reference->id);
+  assert(reference);
+  assert(reference->name || reference->id);
 
-    Reference transformedReference = *reference;
-    transformReferenceFromNamespace(decls, context->getCompilationPackage(),
-                                    &transformedReference);
+  Reference transformedReference = *reference;
+  transformReferenceFromNamespace(decls, context->getCompilationPackage(),
+                                  &transformedReference);
 
-    std::string errStr;
-    const SymbolTable::Symbol* s = resolveSymbolCheckVisibility(
-            transformedReference, context->getNameMangler(), symbols, callSite, &errStr);
-    if (s) {
-        // The ID may not exist. This is fine because of the possibility of building against
-        // libraries without assigned IDs.
-        // Ex: Linking against own resources when building a static library.
-        reference->id = s->id;
-        return true;
-    }
+  std::string errStr;
+  const SymbolTable::Symbol* s = resolveSymbolCheckVisibility(
+      transformedReference, context->getNameMangler(), symbols, callSite,
+      &errStr);
+  if (s) {
+    // The ID may not exist. This is fine because of the possibility of building
+    // against
+    // libraries without assigned IDs.
+    // Ex: Linking against own resources when building a static library.
+    reference->id = s->id;
+    return true;
+  }
 
-    DiagMessage errorMsg(reference->getSource());
-    errorMsg << "resource ";
-    writeResourceName(&errorMsg, *reference, transformedReference);
-    errorMsg << " " << errStr;
-    context->getDiagnostics()->error(errorMsg);
-    return false;
+  DiagMessage errorMsg(reference->getSource());
+  errorMsg << "resource ";
+  writeResourceName(&errorMsg, *reference, transformedReference);
+  errorMsg << " " << errStr;
+  context->getDiagnostics()->error(errorMsg);
+  return false;
 }
 
 namespace {
 
 struct EmptyDeclStack : public xml::IPackageDeclStack {
-    Maybe<xml::ExtractedPackage> transformPackageAlias(
-            const StringPiece& alias, const StringPiece& localPackage) const override {
-        if (alias.empty()) {
-            return xml::ExtractedPackage{ localPackage.toString(), true /* private */ };
-        }
-        return {};
+  Maybe<xml::ExtractedPackage> transformPackageAlias(
+      const StringPiece& alias,
+      const StringPiece& localPackage) const override {
+    if (alias.empty()) {
+      return xml::ExtractedPackage{localPackage.toString(), true /* private */};
     }
+    return {};
+  }
 };
 
-} // namespace
+}  // namespace
 
 bool ReferenceLinker::consume(IAaptContext* context, ResourceTable* table) {
-    EmptyDeclStack declStack;
-    bool error = false;
-    for (auto& package : table->packages) {
-        for (auto& type : package->types) {
-            for (auto& entry : type->entries) {
-                // Symbol state information may be lost if there is no value for the resource.
-                if (entry->symbolStatus.state != SymbolState::kUndefined && entry->values.empty()) {
-                    context->getDiagnostics()->error(
-                            DiagMessage(entry->symbolStatus.source)
-                            << "no definition for declared symbol '"
-                            << ResourceNameRef(package->name, type->type, entry->name)
-                            << "'");
-                    error = true;
-                }
-
-                CallSite callSite = { ResourceNameRef(package->name, type->type, entry->name) };
-                ReferenceLinkerVisitor visitor(context, context->getExternalSymbols(),
-                                               &table->stringPool, &declStack, &callSite);
-
-                for (auto& configValue : entry->values) {
-                    configValue->value->accept(&visitor);
-                }
-
-                if (visitor.hasError()) {
-                    error = true;
-                }
-            }
+  EmptyDeclStack declStack;
+  bool error = false;
+  for (auto& package : table->packages) {
+    for (auto& type : package->types) {
+      for (auto& entry : type->entries) {
+        // Symbol state information may be lost if there is no value for the
+        // resource.
+        if (entry->symbolStatus.state != SymbolState::kUndefined &&
+            entry->values.empty()) {
+          context->getDiagnostics()->error(
+              DiagMessage(entry->symbolStatus.source)
+              << "no definition for declared symbol '"
+              << ResourceNameRef(package->name, type->type, entry->name)
+              << "'");
+          error = true;
         }
+
+        CallSite callSite = {
+            ResourceNameRef(package->name, type->type, entry->name)};
+        ReferenceLinkerVisitor visitor(context, context->getExternalSymbols(),
+                                       &table->stringPool, &declStack,
+                                       &callSite);
+
+        for (auto& configValue : entry->values) {
+          configValue->value->accept(&visitor);
+        }
+
+        if (visitor.hasError()) {
+          error = true;
+        }
+      }
     }
-    return !error;
+  }
+  return !error;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/ReferenceLinker.h b/tools/aapt2/link/ReferenceLinker.h
index 7993aaf..8f6604f 100644
--- a/tools/aapt2/link/ReferenceLinker.h
+++ b/tools/aapt2/link/ReferenceLinker.h
@@ -30,77 +30,86 @@
 namespace aapt {
 
 /**
- * Resolves all references to resources in the ResourceTable and assigns them IDs.
+ * Resolves all references to resources in the ResourceTable and assigns them
+ * IDs.
  * The ResourceTable must already have IDs assigned to each resource.
- * Once the ResourceTable is processed by this linker, it is ready to be flattened.
+ * Once the ResourceTable is processed by this linker, it is ready to be
+ * flattened.
  */
 struct ReferenceLinker : public IResourceTableConsumer {
-    /**
-     * Returns true if the symbol is visible by the reference and from the callsite.
-     */
-    static bool isSymbolVisible(const SymbolTable::Symbol& symbol, const Reference& ref,
-                                const CallSite& callSite);
+  /**
+   * Returns true if the symbol is visible by the reference and from the
+   * callsite.
+   */
+  static bool isSymbolVisible(const SymbolTable::Symbol& symbol,
+                              const Reference& ref, const CallSite& callSite);
 
-    /**
-     * Performs name mangling and looks up the resource in the symbol table. Returns nullptr
-     * if the symbol was not found.
-     */
-    static const SymbolTable::Symbol* resolveSymbol(const Reference& reference,
-                                                    NameMangler* mangler, SymbolTable* symbols);
+  /**
+   * Performs name mangling and looks up the resource in the symbol table.
+   * Returns nullptr
+   * if the symbol was not found.
+   */
+  static const SymbolTable::Symbol* resolveSymbol(const Reference& reference,
+                                                  NameMangler* mangler,
+                                                  SymbolTable* symbols);
 
-    /**
-     * Performs name mangling and looks up the resource in the symbol table. If the symbol is
-     * not visible by the reference at the callsite, nullptr is returned. outError holds
-     * the error message.
-     */
-    static const SymbolTable::Symbol* resolveSymbolCheckVisibility(const Reference& reference,
-                                                                   NameMangler* nameMangler,
-                                                                   SymbolTable* symbols,
-                                                                   CallSite* callSite,
-                                                                   std::string* outError);
+  /**
+   * Performs name mangling and looks up the resource in the symbol table. If
+   * the symbol is
+   * not visible by the reference at the callsite, nullptr is returned. outError
+   * holds
+   * the error message.
+   */
+  static const SymbolTable::Symbol* resolveSymbolCheckVisibility(
+      const Reference& reference, NameMangler* nameMangler,
+      SymbolTable* symbols, CallSite* callSite, std::string* outError);
 
-    /**
-     * Same as resolveSymbolCheckVisibility(), but also makes sure the symbol is an attribute.
-     * That is, the return value will have a non-null value for ISymbolTable::Symbol::attribute.
-     */
-    static const SymbolTable::Symbol* resolveAttributeCheckVisibility(const Reference& reference,
-                                                                      NameMangler* nameMangler,
-                                                                      SymbolTable* symbols,
-                                                                      CallSite* callSite,
-                                                                      std::string* outError);
+  /**
+   * Same as resolveSymbolCheckVisibility(), but also makes sure the symbol is
+   * an attribute.
+   * That is, the return value will have a non-null value for
+   * ISymbolTable::Symbol::attribute.
+   */
+  static const SymbolTable::Symbol* resolveAttributeCheckVisibility(
+      const Reference& reference, NameMangler* nameMangler,
+      SymbolTable* symbols, CallSite* callSite, std::string* outError);
 
-    /**
-     * Resolves the attribute reference and returns an xml::AaptAttribute if successful.
-     * If resolution fails, outError holds the error message.
-     */
-    static Maybe<xml::AaptAttribute> compileXmlAttribute(const Reference& reference,
-                                                         NameMangler* nameMangler,
-                                                         SymbolTable* symbols,
-                                                         CallSite* callSite,
-                                                         std::string* outError);
+  /**
+   * Resolves the attribute reference and returns an xml::AaptAttribute if
+   * successful.
+   * If resolution fails, outError holds the error message.
+   */
+  static Maybe<xml::AaptAttribute> compileXmlAttribute(
+      const Reference& reference, NameMangler* nameMangler,
+      SymbolTable* symbols, CallSite* callSite, std::string* outError);
 
-    /**
-     * Writes the resource name to the DiagMessage, using the "orig_name (aka <transformed_name>)"
-     * syntax.
-     */
-    static void writeResourceName(DiagMessage* outMsg, const Reference& orig,
-                                  const Reference& transformed);
+  /**
+   * Writes the resource name to the DiagMessage, using the "orig_name (aka
+   * <transformed_name>)"
+   * syntax.
+   */
+  static void writeResourceName(DiagMessage* outMsg, const Reference& orig,
+                                const Reference& transformed);
 
-    /**
-     * Transforms the package name of the reference to the fully qualified package name using
-     * the xml::IPackageDeclStack, then mangles and looks up the symbol. If the symbol is visible
-     * to the reference at the callsite, the reference is updated with an ID.
-     * Returns false on failure, and an error message is logged to the IDiagnostics in the context.
-     */
-    static bool linkReference(Reference* reference, IAaptContext* context, SymbolTable* symbols,
-                              xml::IPackageDeclStack* decls, CallSite* callSite);
+  /**
+   * Transforms the package name of the reference to the fully qualified package
+   * name using
+   * the xml::IPackageDeclStack, then mangles and looks up the symbol. If the
+   * symbol is visible
+   * to the reference at the callsite, the reference is updated with an ID.
+   * Returns false on failure, and an error message is logged to the
+   * IDiagnostics in the context.
+   */
+  static bool linkReference(Reference* reference, IAaptContext* context,
+                            SymbolTable* symbols, xml::IPackageDeclStack* decls,
+                            CallSite* callSite);
 
-    /**
-     * Links all references in the ResourceTable.
-     */
-    bool consume(IAaptContext* context, ResourceTable* table) override;
+  /**
+   * Links all references in the ResourceTable.
+   */
+  bool consume(IAaptContext* context, ResourceTable* table) override;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_LINKER_REFERENCELINKER_H */
diff --git a/tools/aapt2/link/ReferenceLinker_test.cpp b/tools/aapt2/link/ReferenceLinker_test.cpp
index 5c1511f..8aa3616 100644
--- a/tools/aapt2/link/ReferenceLinker_test.cpp
+++ b/tools/aapt2/link/ReferenceLinker_test.cpp
@@ -22,206 +22,238 @@
 namespace aapt {
 
 TEST(ReferenceLinkerTest, LinkSimpleReferences) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId("com.app.test", 0x7f)
-            .addReference("com.app.test:string/foo", ResourceId(0x7f020000),
-                          "com.app.test:string/bar")
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.test", 0x7f)
+          .addReference("com.app.test:string/foo", ResourceId(0x7f020000),
+                        "com.app.test:string/bar")
 
-            // Test use of local reference (w/o package name).
-            .addReference("com.app.test:string/bar", ResourceId(0x7f020001), "string/baz")
+          // Test use of local reference (w/o package name).
+          .addReference("com.app.test:string/bar", ResourceId(0x7f020001),
+                        "string/baz")
 
-            .addReference("com.app.test:string/baz", ResourceId(0x7f020002),
-                          "android:string/ok")
-            .build();
+          .addReference("com.app.test:string/baz", ResourceId(0x7f020002),
+                        "android:string/ok")
+          .build();
 
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
-            .setCompilationPackage("com.app.test")
-            .setPackageId(0x7f)
-            .setNameManglerPolicy(NameManglerPolicy{ "com.app.test" })
-            .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
-            .addSymbolSource(test::StaticSymbolSourceBuilder()
-                                     .addPublicSymbol("android:string/ok", ResourceId(0x01040034))
-                                     .build())
-            .build();
+  std::unique_ptr<IAaptContext> context =
+      test::ContextBuilder()
+          .setCompilationPackage("com.app.test")
+          .setPackageId(0x7f)
+          .setNameManglerPolicy(NameManglerPolicy{"com.app.test"})
+          .addSymbolSource(
+              util::make_unique<ResourceTableSymbolSource>(table.get()))
+          .addSymbolSource(
+              test::StaticSymbolSourceBuilder()
+                  .addPublicSymbol("android:string/ok", ResourceId(0x01040034))
+                  .build())
+          .build();
 
-    ReferenceLinker linker;
-    ASSERT_TRUE(linker.consume(context.get(), table.get()));
+  ReferenceLinker linker;
+  ASSERT_TRUE(linker.consume(context.get(), table.get()));
 
-    Reference* ref = test::getValue<Reference>(table.get(), "com.app.test:string/foo");
-    ASSERT_NE(ref, nullptr);
-    AAPT_ASSERT_TRUE(ref->id);
-    EXPECT_EQ(ref->id.value(), ResourceId(0x7f020001));
+  Reference* ref =
+      test::getValue<Reference>(table.get(), "com.app.test:string/foo");
+  ASSERT_NE(ref, nullptr);
+  AAPT_ASSERT_TRUE(ref->id);
+  EXPECT_EQ(ref->id.value(), ResourceId(0x7f020001));
 
-    ref = test::getValue<Reference>(table.get(), "com.app.test:string/bar");
-    ASSERT_NE(ref, nullptr);
-    AAPT_ASSERT_TRUE(ref->id);
-    EXPECT_EQ(ref->id.value(), ResourceId(0x7f020002));
+  ref = test::getValue<Reference>(table.get(), "com.app.test:string/bar");
+  ASSERT_NE(ref, nullptr);
+  AAPT_ASSERT_TRUE(ref->id);
+  EXPECT_EQ(ref->id.value(), ResourceId(0x7f020002));
 
-    ref = test::getValue<Reference>(table.get(), "com.app.test:string/baz");
-    ASSERT_NE(ref, nullptr);
-    AAPT_ASSERT_TRUE(ref->id);
-    EXPECT_EQ(ref->id.value(), ResourceId(0x01040034));
+  ref = test::getValue<Reference>(table.get(), "com.app.test:string/baz");
+  ASSERT_NE(ref, nullptr);
+  AAPT_ASSERT_TRUE(ref->id);
+  EXPECT_EQ(ref->id.value(), ResourceId(0x01040034));
 }
 
 TEST(ReferenceLinkerTest, LinkStyleAttributes) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId("com.app.test", 0x7f)
-            .addValue("com.app.test:style/Theme", test::StyleBuilder()
-                    .setParent("android:style/Theme.Material")
-                    .addItem("android:attr/foo", ResourceUtils::tryParseColor("#ff00ff"))
-                    .addItem("android:attr/bar", {} /* placeholder */)
-                    .build())
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.test", 0x7f)
+          .addValue("com.app.test:style/Theme",
+                    test::StyleBuilder()
+                        .setParent("android:style/Theme.Material")
+                        .addItem("android:attr/foo",
+                                 ResourceUtils::tryParseColor("#ff00ff"))
+                        .addItem("android:attr/bar", {} /* placeholder */)
+                        .build())
+          .build();
 
-    {
-        // We need to fill in the value for the attribute android:attr/bar after we build the
-        // table, because we need access to the string pool.
-        Style* style = test::getValue<Style>(table.get(), "com.app.test:style/Theme");
-        ASSERT_NE(style, nullptr);
-        style->entries.back().value = util::make_unique<RawString>(
-                table->stringPool.makeRef("one|two"));
-    }
-
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
-            .setCompilationPackage("com.app.test")
-            .setPackageId(0x7f)
-            .setNameManglerPolicy(NameManglerPolicy{ "com.app.test" })
-            .addSymbolSource(test::StaticSymbolSourceBuilder()
-                                     .addPublicSymbol("android:style/Theme.Material",
-                                                      ResourceId(0x01060000))
-                                     .addPublicSymbol("android:attr/foo", ResourceId(0x01010001),
-                                                      test::AttributeBuilder()
-                                                              .setTypeMask(ResTable_map::TYPE_COLOR)
-                                                              .build())
-                                     .addPublicSymbol("android:attr/bar", ResourceId(0x01010002),
-                                                      test::AttributeBuilder()
-                                                              .setTypeMask(ResTable_map::TYPE_FLAGS)
-                                                              .addItem("one", 0x01)
-                                                              .addItem("two", 0x02)
-                                                              .build())
-                                     .build())
-            .build();
-
-    ReferenceLinker linker;
-    ASSERT_TRUE(linker.consume(context.get(), table.get()));
-
-    Style* style = test::getValue<Style>(table.get(), "com.app.test:style/Theme");
+  {
+    // We need to fill in the value for the attribute android:attr/bar after we
+    // build the
+    // table, because we need access to the string pool.
+    Style* style =
+        test::getValue<Style>(table.get(), "com.app.test:style/Theme");
     ASSERT_NE(style, nullptr);
-    AAPT_ASSERT_TRUE(style->parent);
-    AAPT_ASSERT_TRUE(style->parent.value().id);
-    EXPECT_EQ(style->parent.value().id.value(), ResourceId(0x01060000));
+    style->entries.back().value =
+        util::make_unique<RawString>(table->stringPool.makeRef("one|two"));
+  }
 
-    ASSERT_EQ(2u, style->entries.size());
+  std::unique_ptr<IAaptContext> context =
+      test::ContextBuilder()
+          .setCompilationPackage("com.app.test")
+          .setPackageId(0x7f)
+          .setNameManglerPolicy(NameManglerPolicy{"com.app.test"})
+          .addSymbolSource(
+              test::StaticSymbolSourceBuilder()
+                  .addPublicSymbol("android:style/Theme.Material",
+                                   ResourceId(0x01060000))
+                  .addPublicSymbol("android:attr/foo", ResourceId(0x01010001),
+                                   test::AttributeBuilder()
+                                       .setTypeMask(ResTable_map::TYPE_COLOR)
+                                       .build())
+                  .addPublicSymbol("android:attr/bar", ResourceId(0x01010002),
+                                   test::AttributeBuilder()
+                                       .setTypeMask(ResTable_map::TYPE_FLAGS)
+                                       .addItem("one", 0x01)
+                                       .addItem("two", 0x02)
+                                       .build())
+                  .build())
+          .build();
 
-    AAPT_ASSERT_TRUE(style->entries[0].key.id);
-    EXPECT_EQ(style->entries[0].key.id.value(), ResourceId(0x01010001));
-    ASSERT_NE(valueCast<BinaryPrimitive>(style->entries[0].value.get()), nullptr);
+  ReferenceLinker linker;
+  ASSERT_TRUE(linker.consume(context.get(), table.get()));
 
-    AAPT_ASSERT_TRUE(style->entries[1].key.id);
-    EXPECT_EQ(style->entries[1].key.id.value(), ResourceId(0x01010002));
-    ASSERT_NE(valueCast<BinaryPrimitive>(style->entries[1].value.get()), nullptr);
+  Style* style = test::getValue<Style>(table.get(), "com.app.test:style/Theme");
+  ASSERT_NE(style, nullptr);
+  AAPT_ASSERT_TRUE(style->parent);
+  AAPT_ASSERT_TRUE(style->parent.value().id);
+  EXPECT_EQ(style->parent.value().id.value(), ResourceId(0x01060000));
+
+  ASSERT_EQ(2u, style->entries.size());
+
+  AAPT_ASSERT_TRUE(style->entries[0].key.id);
+  EXPECT_EQ(style->entries[0].key.id.value(), ResourceId(0x01010001));
+  ASSERT_NE(valueCast<BinaryPrimitive>(style->entries[0].value.get()), nullptr);
+
+  AAPT_ASSERT_TRUE(style->entries[1].key.id);
+  EXPECT_EQ(style->entries[1].key.id.value(), ResourceId(0x01010002));
+  ASSERT_NE(valueCast<BinaryPrimitive>(style->entries[1].value.get()), nullptr);
 }
 
 TEST(ReferenceLinkerTest, LinkMangledReferencesAndAttributes) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
-            .setCompilationPackage("com.app.test")
-            .setPackageId(0x7f)
-            .setNameManglerPolicy(NameManglerPolicy{ "com.app.test", { "com.android.support" } })
-            .addSymbolSource(test::StaticSymbolSourceBuilder()
-                                     .addPublicSymbol("com.app.test:attr/com.android.support$foo",
-                                                      ResourceId(0x7f010000),
-                                                      test::AttributeBuilder()
-                                                              .setTypeMask(ResTable_map::TYPE_COLOR)
-                                                              .build())
-                                     .build())
-            .build();
+  std::unique_ptr<IAaptContext> context =
+      test::ContextBuilder()
+          .setCompilationPackage("com.app.test")
+          .setPackageId(0x7f)
+          .setNameManglerPolicy(
+              NameManglerPolicy{"com.app.test", {"com.android.support"}})
+          .addSymbolSource(
+              test::StaticSymbolSourceBuilder()
+                  .addPublicSymbol("com.app.test:attr/com.android.support$foo",
+                                   ResourceId(0x7f010000),
+                                   test::AttributeBuilder()
+                                       .setTypeMask(ResTable_map::TYPE_COLOR)
+                                       .build())
+                  .build())
+          .build();
 
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId("com.app.test", 0x7f)
-            .addValue("com.app.test:style/Theme", ResourceId(0x7f020000),
-                      test::StyleBuilder().addItem("com.android.support:attr/foo",
-                                                   ResourceUtils::tryParseColor("#ff0000"))
-                                          .build())
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.test", 0x7f)
+          .addValue("com.app.test:style/Theme", ResourceId(0x7f020000),
+                    test::StyleBuilder()
+                        .addItem("com.android.support:attr/foo",
+                                 ResourceUtils::tryParseColor("#ff0000"))
+                        .build())
+          .build();
 
-    ReferenceLinker linker;
-    ASSERT_TRUE(linker.consume(context.get(), table.get()));
+  ReferenceLinker linker;
+  ASSERT_TRUE(linker.consume(context.get(), table.get()));
 
-    Style* style = test::getValue<Style>(table.get(), "com.app.test:style/Theme");
-    ASSERT_NE(style, nullptr);
-    ASSERT_EQ(1u, style->entries.size());
-    AAPT_ASSERT_TRUE(style->entries.front().key.id);
-    EXPECT_EQ(style->entries.front().key.id.value(), ResourceId(0x7f010000));
+  Style* style = test::getValue<Style>(table.get(), "com.app.test:style/Theme");
+  ASSERT_NE(style, nullptr);
+  ASSERT_EQ(1u, style->entries.size());
+  AAPT_ASSERT_TRUE(style->entries.front().key.id);
+  EXPECT_EQ(style->entries.front().key.id.value(), ResourceId(0x7f010000));
 }
 
 TEST(ReferenceLinkerTest, FailToLinkPrivateSymbols) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId("com.app.test", 0x7f)
-            .addReference("com.app.test:string/foo", ResourceId(0x7f020000),
-                          "android:string/hidden")
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.test", 0x7f)
+          .addReference("com.app.test:string/foo", ResourceId(0x7f020000),
+                        "android:string/hidden")
+          .build();
 
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
-            .setCompilationPackage("com.app.test")
-            .setPackageId(0x7f)
-            .setNameManglerPolicy(NameManglerPolicy{ "com.app.test" })
-            .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
-            .addSymbolSource(test::StaticSymbolSourceBuilder()
-                                     .addSymbol("android:string/hidden", ResourceId(0x01040034))
-                                     .build())
-            .build();
+  std::unique_ptr<IAaptContext> context =
+      test::ContextBuilder()
+          .setCompilationPackage("com.app.test")
+          .setPackageId(0x7f)
+          .setNameManglerPolicy(NameManglerPolicy{"com.app.test"})
+          .addSymbolSource(
+              util::make_unique<ResourceTableSymbolSource>(table.get()))
+          .addSymbolSource(
+              test::StaticSymbolSourceBuilder()
+                  .addSymbol("android:string/hidden", ResourceId(0x01040034))
+                  .build())
+          .build();
 
-    ReferenceLinker linker;
-    ASSERT_FALSE(linker.consume(context.get(), table.get()));
+  ReferenceLinker linker;
+  ASSERT_FALSE(linker.consume(context.get(), table.get()));
 }
 
 TEST(ReferenceLinkerTest, FailToLinkPrivateMangledSymbols) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId("com.app.test", 0x7f)
-            .addReference("com.app.test:string/foo", ResourceId(0x7f020000),
-                          "com.app.lib:string/hidden")
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.test", 0x7f)
+          .addReference("com.app.test:string/foo", ResourceId(0x7f020000),
+                        "com.app.lib:string/hidden")
+          .build();
 
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
-            .setCompilationPackage("com.app.test")
-            .setPackageId(0x7f)
-            .setNameManglerPolicy(NameManglerPolicy{ "com.app.test", { "com.app.lib" } })
-            .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
-            .addSymbolSource(test::StaticSymbolSourceBuilder()
-                                     .addSymbol("com.app.test:string/com.app.lib$hidden",
-                                                ResourceId(0x7f040034))
-                                     .build())
+  std::unique_ptr<IAaptContext> context =
+      test::ContextBuilder()
+          .setCompilationPackage("com.app.test")
+          .setPackageId(0x7f)
+          .setNameManglerPolicy(
+              NameManglerPolicy{"com.app.test", {"com.app.lib"}})
+          .addSymbolSource(
+              util::make_unique<ResourceTableSymbolSource>(table.get()))
+          .addSymbolSource(
+              test::StaticSymbolSourceBuilder()
+                  .addSymbol("com.app.test:string/com.app.lib$hidden",
+                             ResourceId(0x7f040034))
+                  .build())
 
-            .build();
+          .build();
 
-    ReferenceLinker linker;
-    ASSERT_FALSE(linker.consume(context.get(), table.get()));
+  ReferenceLinker linker;
+  ASSERT_FALSE(linker.consume(context.get(), table.get()));
 }
 
 TEST(ReferenceLinkerTest, FailToLinkPrivateStyleAttributes) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId("com.app.test", 0x7f)
-            .addValue("com.app.test:style/Theme", test::StyleBuilder()
-                    .addItem("android:attr/hidden", ResourceUtils::tryParseColor("#ff00ff"))
-                    .build())
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.test", 0x7f)
+          .addValue("com.app.test:style/Theme",
+                    test::StyleBuilder()
+                        .addItem("android:attr/hidden",
+                                 ResourceUtils::tryParseColor("#ff00ff"))
+                        .build())
+          .build();
 
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
-            .setCompilationPackage("com.app.test")
-            .setPackageId(0x7f)
-            .setNameManglerPolicy(NameManglerPolicy{ "com.app.test" })
-            .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
-            .addSymbolSource(test::StaticSymbolSourceBuilder()
-                                     .addSymbol("android:attr/hidden", ResourceId(0x01010001),
-                                                test::AttributeBuilder()
-                                                        .setTypeMask(
-                                                                android::ResTable_map::TYPE_COLOR)
-                                                        .build())
-                                     .build())
-            .build();
+  std::unique_ptr<IAaptContext> context =
+      test::ContextBuilder()
+          .setCompilationPackage("com.app.test")
+          .setPackageId(0x7f)
+          .setNameManglerPolicy(NameManglerPolicy{"com.app.test"})
+          .addSymbolSource(
+              util::make_unique<ResourceTableSymbolSource>(table.get()))
+          .addSymbolSource(
+              test::StaticSymbolSourceBuilder()
+                  .addSymbol("android:attr/hidden", ResourceId(0x01010001),
+                             test::AttributeBuilder()
+                                 .setTypeMask(android::ResTable_map::TYPE_COLOR)
+                                 .build())
+                  .build())
+          .build();
 
-    ReferenceLinker linker;
-    ASSERT_FALSE(linker.consume(context.get(), table.get()));
+  ReferenceLinker linker;
+  ASSERT_FALSE(linker.consume(context.get(), table.get()));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/ResourceDeduper.cpp b/tools/aapt2/link/ResourceDeduper.cpp
index 0276261..f565359 100644
--- a/tools/aapt2/link/ResourceDeduper.cpp
+++ b/tools/aapt2/link/ResourceDeduper.cpp
@@ -36,79 +36,81 @@
  *    an equivalent entry value.
  */
 class DominatedKeyValueRemover : public DominatorTree::BottomUpVisitor {
-public:
-    using Node = DominatorTree::Node;
+ public:
+  using Node = DominatorTree::Node;
 
-    explicit DominatedKeyValueRemover(IAaptContext* context, ResourceEntry* entry) :
-            mContext(context), mEntry(entry) {
+  explicit DominatedKeyValueRemover(IAaptContext* context, ResourceEntry* entry)
+      : mContext(context), mEntry(entry) {}
+
+  void visitConfig(Node* node) {
+    Node* parent = node->parent();
+    if (!parent) {
+      return;
+    }
+    ResourceConfigValue* nodeValue = node->value();
+    ResourceConfigValue* parentValue = parent->value();
+    if (!nodeValue || !parentValue) {
+      return;
+    }
+    if (!nodeValue->value->equals(parentValue->value.get())) {
+      return;
     }
 
-    void visitConfig(Node* node) {
-        Node* parent = node->parent();
-        if (!parent) {
-            return;
-        }
-        ResourceConfigValue* nodeValue = node->value();
-        ResourceConfigValue* parentValue = parent->value();
-        if (!nodeValue || !parentValue) {
-            return;
-        }
-        if (!nodeValue->value->equals(parentValue->value.get())) {
-            return;
-        }
-
-        // Compare compatible configs for this entry and ensure the values are
-        // equivalent.
-        const ConfigDescription& nodeConfiguration = nodeValue->config;
-        for (const auto& sibling : mEntry->values) {
-            if (!sibling->value) {
-                // Sibling was already removed.
-                continue;
-            }
-            if (nodeConfiguration.isCompatibleWith(sibling->config)
-                    && !nodeValue->value->equals(sibling->value.get())) {
-                // The configurations are compatible, but the value is
-                // different, so we can't remove this value.
-                return;
-            }
-        }
-        if (mContext->verbose()) {
-            mContext->getDiagnostics()->note(
-                    DiagMessage(nodeValue->value->getSource())
-                            << "removing dominated duplicate resource with name \""
-                            << mEntry->name << "\"");
-        }
-        nodeValue->value = {};
+    // Compare compatible configs for this entry and ensure the values are
+    // equivalent.
+    const ConfigDescription& nodeConfiguration = nodeValue->config;
+    for (const auto& sibling : mEntry->values) {
+      if (!sibling->value) {
+        // Sibling was already removed.
+        continue;
+      }
+      if (nodeConfiguration.isCompatibleWith(sibling->config) &&
+          !nodeValue->value->equals(sibling->value.get())) {
+        // The configurations are compatible, but the value is
+        // different, so we can't remove this value.
+        return;
+      }
     }
+    if (mContext->verbose()) {
+      mContext->getDiagnostics()->note(
+          DiagMessage(nodeValue->value->getSource())
+          << "removing dominated duplicate resource with name \""
+          << mEntry->name << "\"");
+    }
+    nodeValue->value = {};
+  }
 
-private:
-    IAaptContext* mContext;
-    ResourceEntry* mEntry;
+ private:
+  IAaptContext* mContext;
+  ResourceEntry* mEntry;
 };
 
 static void dedupeEntry(IAaptContext* context, ResourceEntry* entry) {
-    DominatorTree tree(entry->values);
-    DominatedKeyValueRemover remover(context, entry);
-    tree.accept(&remover);
+  DominatorTree tree(entry->values);
+  DominatedKeyValueRemover remover(context, entry);
+  tree.accept(&remover);
 
-    // Erase the values that were removed.
-    entry->values.erase(std::remove_if(entry->values.begin(), entry->values.end(),
-            [](const std::unique_ptr<ResourceConfigValue>& val) -> bool {
-        return val == nullptr || val->value == nullptr;
-    }), entry->values.end());
+  // Erase the values that were removed.
+  entry->values.erase(
+      std::remove_if(
+          entry->values.begin(), entry->values.end(),
+          [](const std::unique_ptr<ResourceConfigValue>& val) -> bool {
+            return val == nullptr || val->value == nullptr;
+          }),
+      entry->values.end());
 }
 
-} // namespace
+}  // namespace
 
 bool ResourceDeduper::consume(IAaptContext* context, ResourceTable* table) {
-    for (auto& package : table->packages) {
-        for (auto& type : package->types) {
-            for (auto& entry : type->entries) {
-                dedupeEntry(context, entry.get());
-            }
-        }
+  for (auto& package : table->packages) {
+    for (auto& type : package->types) {
+      for (auto& entry : type->entries) {
+        dedupeEntry(context, entry.get());
+      }
     }
-    return true;
+  }
+  return true;
 }
 
-} // aapt
+}  // aapt
diff --git a/tools/aapt2/link/ResourceDeduper_test.cpp b/tools/aapt2/link/ResourceDeduper_test.cpp
index 47071a51..7e2d476 100644
--- a/tools/aapt2/link/ResourceDeduper_test.cpp
+++ b/tools/aapt2/link/ResourceDeduper_test.cpp
@@ -21,63 +21,63 @@
 namespace aapt {
 
 TEST(ResourceDeduperTest, SameValuesAreDeduped) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
-    const ConfigDescription defaultConfig = {};
-    const ConfigDescription enConfig = test::parseConfigOrDie("en");
-    const ConfigDescription enV21Config = test::parseConfigOrDie("en-v21");
-    // Chosen because this configuration is compatible with en.
-    const ConfigDescription landConfig = test::parseConfigOrDie("land");
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  const ConfigDescription defaultConfig = {};
+  const ConfigDescription enConfig = test::parseConfigOrDie("en");
+  const ConfigDescription enV21Config = test::parseConfigOrDie("en-v21");
+  // Chosen because this configuration is compatible with en.
+  const ConfigDescription landConfig = test::parseConfigOrDie("land");
 
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .addString("android:string/dedupe", ResourceId{}, defaultConfig, "dedupe")
-            .addString("android:string/dedupe", ResourceId{}, enConfig, "dedupe")
-            .addString("android:string/dedupe", ResourceId{}, landConfig, "dedupe")
-            .addString("android:string/dedupe2", ResourceId{}, defaultConfig, "dedupe")
-            .addString("android:string/dedupe2", ResourceId{}, enConfig, "dedupe")
-            .addString("android:string/dedupe2", ResourceId{}, enV21Config, "keep")
-            .addString("android:string/dedupe2", ResourceId{}, landConfig, "dedupe")
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .addString("android:string/dedupe", ResourceId{}, defaultConfig,
+                     "dedupe")
+          .addString("android:string/dedupe", ResourceId{}, enConfig, "dedupe")
+          .addString("android:string/dedupe", ResourceId{}, landConfig,
+                     "dedupe")
+          .addString("android:string/dedupe2", ResourceId{}, defaultConfig,
+                     "dedupe")
+          .addString("android:string/dedupe2", ResourceId{}, enConfig, "dedupe")
+          .addString("android:string/dedupe2", ResourceId{}, enV21Config,
+                     "keep")
+          .addString("android:string/dedupe2", ResourceId{}, landConfig,
+                     "dedupe")
+          .build();
 
-    ASSERT_TRUE(ResourceDeduper().consume(context.get(), table.get()));
-    EXPECT_EQ(
-            nullptr,
-            test::getValueForConfig<String>(table.get(), "android:string/dedupe", enConfig));
-    EXPECT_EQ(
-            nullptr,
-            test::getValueForConfig<String>(table.get(), "android:string/dedupe", landConfig));
-    EXPECT_EQ(
-            nullptr,
-            test::getValueForConfig<String>(table.get(), "android:string/dedupe2", enConfig));
-    EXPECT_NE(
-            nullptr,
-            test::getValueForConfig<String>(table.get(), "android:string/dedupe2", enV21Config));
+  ASSERT_TRUE(ResourceDeduper().consume(context.get(), table.get()));
+  EXPECT_EQ(nullptr, test::getValueForConfig<String>(
+                         table.get(), "android:string/dedupe", enConfig));
+  EXPECT_EQ(nullptr, test::getValueForConfig<String>(
+                         table.get(), "android:string/dedupe", landConfig));
+  EXPECT_EQ(nullptr, test::getValueForConfig<String>(
+                         table.get(), "android:string/dedupe2", enConfig));
+  EXPECT_NE(nullptr, test::getValueForConfig<String>(
+                         table.get(), "android:string/dedupe2", enV21Config));
 }
 
 TEST(ResourceDeduperTest, DifferentValuesAreKept) {
-    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
-    const ConfigDescription defaultConfig = {};
-    const ConfigDescription enConfig = test::parseConfigOrDie("en");
-    const ConfigDescription enV21Config = test::parseConfigOrDie("en-v21");
-    // Chosen because this configuration is compatible with en.
-    const ConfigDescription landConfig = test::parseConfigOrDie("land");
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
+  const ConfigDescription defaultConfig = {};
+  const ConfigDescription enConfig = test::parseConfigOrDie("en");
+  const ConfigDescription enV21Config = test::parseConfigOrDie("en-v21");
+  // Chosen because this configuration is compatible with en.
+  const ConfigDescription landConfig = test::parseConfigOrDie("land");
 
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .addString("android:string/keep", ResourceId{}, defaultConfig, "keep")
-            .addString("android:string/keep", ResourceId{}, enConfig, "keep")
-            .addString("android:string/keep", ResourceId{}, enV21Config, "keep2")
-            .addString("android:string/keep", ResourceId{}, landConfig, "keep2")
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .addString("android:string/keep", ResourceId{}, defaultConfig, "keep")
+          .addString("android:string/keep", ResourceId{}, enConfig, "keep")
+          .addString("android:string/keep", ResourceId{}, enV21Config, "keep2")
+          .addString("android:string/keep", ResourceId{}, landConfig, "keep2")
+          .build();
 
-    ASSERT_TRUE(ResourceDeduper().consume(context.get(), table.get()));
-    EXPECT_NE(
-            nullptr,
-            test::getValueForConfig<String>(table.get(), "android:string/keep", enConfig));
-    EXPECT_NE(
-            nullptr,
-            test::getValueForConfig<String>(table.get(), "android:string/keep", enV21Config));
-    EXPECT_NE(
-            nullptr,
-            test::getValueForConfig<String>(table.get(), "android:string/keep", landConfig));
+  ASSERT_TRUE(ResourceDeduper().consume(context.get(), table.get()));
+  EXPECT_NE(nullptr, test::getValueForConfig<String>(
+                         table.get(), "android:string/keep", enConfig));
+  EXPECT_NE(nullptr, test::getValueForConfig<String>(
+                         table.get(), "android:string/keep", enV21Config));
+  EXPECT_NE(nullptr, test::getValueForConfig<String>(
+                         table.get(), "android:string/keep", landConfig));
 }
 
 }  // namespace aapt
diff --git a/tools/aapt2/link/TableMerger.cpp b/tools/aapt2/link/TableMerger.cpp
index eea4306..adf83a4 100644
--- a/tools/aapt2/link/TableMerger.cpp
+++ b/tools/aapt2/link/TableMerger.cpp
@@ -14,11 +14,11 @@
  * limitations under the License.
  */
 
+#include "link/TableMerger.h"
 #include "ResourceTable.h"
 #include "ResourceUtils.h"
 #include "ResourceValues.h"
 #include "ValueVisitor.h"
-#include "link/TableMerger.h"
 #include "util/Util.h"
 
 #include <cassert>
@@ -26,348 +26,365 @@
 namespace aapt {
 
 TableMerger::TableMerger(IAaptContext* context, ResourceTable* outTable,
-                         const TableMergerOptions& options) :
-        mContext(context), mMasterTable(outTable), mOptions(options) {
-    // Create the desired package that all tables will be merged into.
-    mMasterPackage = mMasterTable->createPackage(
-            mContext->getCompilationPackage(), mContext->getPackageId());
-    assert(mMasterPackage && "package name or ID already taken");
+                         const TableMergerOptions& options)
+    : mContext(context), mMasterTable(outTable), mOptions(options) {
+  // Create the desired package that all tables will be merged into.
+  mMasterPackage = mMasterTable->createPackage(
+      mContext->getCompilationPackage(), mContext->getPackageId());
+  assert(mMasterPackage && "package name or ID already taken");
 }
 
 bool TableMerger::merge(const Source& src, ResourceTable* table,
                         io::IFileCollection* collection) {
-    return mergeImpl(src, table, collection, false /* overlay */, true /* allow new */);
+  return mergeImpl(src, table, collection, false /* overlay */,
+                   true /* allow new */);
 }
 
 bool TableMerger::mergeOverlay(const Source& src, ResourceTable* table,
                                io::IFileCollection* collection) {
-    return mergeImpl(src, table, collection, true /* overlay */, mOptions.autoAddOverlay);
+  return mergeImpl(src, table, collection, true /* overlay */,
+                   mOptions.autoAddOverlay);
 }
 
 /**
  * This will merge packages with the same package name (or no package name).
  */
 bool TableMerger::mergeImpl(const Source& src, ResourceTable* table,
-                            io::IFileCollection* collection,
-                            bool overlay, bool allowNew) {
-    const uint8_t desiredPackageId = mContext->getPackageId();
+                            io::IFileCollection* collection, bool overlay,
+                            bool allowNew) {
+  const uint8_t desiredPackageId = mContext->getPackageId();
 
-    bool error = false;
-    for (auto& package : table->packages) {
-        // Warn of packages with an unrelated ID.
-        const Maybe<ResourceId>& id = package->id;
-        if (id && id.value() != 0x0 && id.value() != desiredPackageId) {
-            mContext->getDiagnostics()->warn(DiagMessage(src)
-                                             << "ignoring package " << package->name);
-            continue;
-        }
-
-        // Only merge an empty package or the package we're building.
-        // Other packages may exist, which likely contain attribute definitions.
-        // This is because at compile time it is unknown if the attributes are simply
-        // uses of the attribute or definitions.
-        if (package->name.empty() || mContext->getCompilationPackage() == package->name) {
-            FileMergeCallback callback;
-            if (collection) {
-                callback = [&](const ResourceNameRef& name, const ConfigDescription& config,
-                               FileReference* newFile, FileReference* oldFile) -> bool {
-                    // The old file's path points inside the APK, so we can use it as is.
-                    io::IFile* f = collection->findFile(*oldFile->path);
-                    if (!f) {
-                        mContext->getDiagnostics()->error(DiagMessage(src) << "file '"
-                                                          << *oldFile->path
-                                                          << "' not found");
-                        return false;
-                    }
-
-                    newFile->file = f;
-                    return true;
-                };
-            }
-
-            // Merge here. Once the entries are merged and mangled, any references to
-            // them are still valid. This is because un-mangled references are
-            // mangled, then looked up at resolution time.
-            // Also, when linking, we convert references with no package name to use
-            // the compilation package name.
-            error |= !doMerge(src, table, package.get(), false /* mangle */, overlay, allowNew,
-                              callback);
-        }
+  bool error = false;
+  for (auto& package : table->packages) {
+    // Warn of packages with an unrelated ID.
+    const Maybe<ResourceId>& id = package->id;
+    if (id && id.value() != 0x0 && id.value() != desiredPackageId) {
+      mContext->getDiagnostics()->warn(DiagMessage(src) << "ignoring package "
+                                                        << package->name);
+      continue;
     }
-    return !error;
+
+    // Only merge an empty package or the package we're building.
+    // Other packages may exist, which likely contain attribute definitions.
+    // This is because at compile time it is unknown if the attributes are
+    // simply
+    // uses of the attribute or definitions.
+    if (package->name.empty() ||
+        mContext->getCompilationPackage() == package->name) {
+      FileMergeCallback callback;
+      if (collection) {
+        callback = [&](const ResourceNameRef& name,
+                       const ConfigDescription& config, FileReference* newFile,
+                       FileReference* oldFile) -> bool {
+          // The old file's path points inside the APK, so we can use it as is.
+          io::IFile* f = collection->findFile(*oldFile->path);
+          if (!f) {
+            mContext->getDiagnostics()->error(DiagMessage(src)
+                                              << "file '" << *oldFile->path
+                                              << "' not found");
+            return false;
+          }
+
+          newFile->file = f;
+          return true;
+        };
+      }
+
+      // Merge here. Once the entries are merged and mangled, any references to
+      // them are still valid. This is because un-mangled references are
+      // mangled, then looked up at resolution time.
+      // Also, when linking, we convert references with no package name to use
+      // the compilation package name.
+      error |= !doMerge(src, table, package.get(), false /* mangle */, overlay,
+                        allowNew, callback);
+    }
+  }
+  return !error;
 }
 
 /**
  * This will merge and mangle resources from a static library.
  */
-bool TableMerger::mergeAndMangle(const Source& src, const StringPiece& packageName,
-                                 ResourceTable* table, io::IFileCollection* collection) {
-    bool error = false;
-    for (auto& package : table->packages) {
-        // Warn of packages with an unrelated ID.
-        if (packageName != package->name) {
-            mContext->getDiagnostics()->warn(DiagMessage(src)
-                                             << "ignoring package " << package->name);
-            continue;
-        }
-
-        bool mangle = packageName != mContext->getCompilationPackage();
-        mMergedPackages.insert(package->name);
-
-        auto callback = [&](const ResourceNameRef& name, const ConfigDescription& config,
-                            FileReference* newFile, FileReference* oldFile) -> bool {
-            // The old file's path points inside the APK, so we can use it as is.
-            io::IFile* f = collection->findFile(*oldFile->path);
-            if (!f) {
-                mContext->getDiagnostics()->error(DiagMessage(src) << "file '" << *oldFile->path
-                                                  << "' not found");
-                return false;
-            }
-
-            newFile->file = f;
-            return true;
-        };
-
-        error |= !doMerge(src, table, package.get(),
-                          mangle, false /* overlay */, true /* allow new */, callback);
+bool TableMerger::mergeAndMangle(const Source& src,
+                                 const StringPiece& packageName,
+                                 ResourceTable* table,
+                                 io::IFileCollection* collection) {
+  bool error = false;
+  for (auto& package : table->packages) {
+    // Warn of packages with an unrelated ID.
+    if (packageName != package->name) {
+      mContext->getDiagnostics()->warn(DiagMessage(src) << "ignoring package "
+                                                        << package->name);
+      continue;
     }
-    return !error;
+
+    bool mangle = packageName != mContext->getCompilationPackage();
+    mMergedPackages.insert(package->name);
+
+    auto callback = [&](const ResourceNameRef& name,
+                        const ConfigDescription& config, FileReference* newFile,
+                        FileReference* oldFile) -> bool {
+      // The old file's path points inside the APK, so we can use it as is.
+      io::IFile* f = collection->findFile(*oldFile->path);
+      if (!f) {
+        mContext->getDiagnostics()->error(
+            DiagMessage(src) << "file '" << *oldFile->path << "' not found");
+        return false;
+      }
+
+      newFile->file = f;
+      return true;
+    };
+
+    error |= !doMerge(src, table, package.get(), mangle, false /* overlay */,
+                      true /* allow new */, callback);
+  }
+  return !error;
 }
 
-static bool mergeType(IAaptContext* context, const Source& src, ResourceTableType* dstType,
-                      ResourceTableType* srcType) {
-    if (dstType->symbolStatus.state < srcType->symbolStatus.state) {
-        // The incoming type's visibility is stronger, so we should override
-        // the visibility.
-        if (srcType->symbolStatus.state == SymbolState::kPublic) {
-            // Only copy the ID if the source is public, or else the ID is meaningless.
-            dstType->id = srcType->id;
-        }
-        dstType->symbolStatus = std::move(srcType->symbolStatus);
-    } else if (dstType->symbolStatus.state == SymbolState::kPublic
-            && srcType->symbolStatus.state == SymbolState::kPublic
-            && dstType->id && srcType->id
-            && dstType->id.value() != srcType->id.value()) {
-        // Both types are public and have different IDs.
-        context->getDiagnostics()->error(DiagMessage(src)
-                                         << "cannot merge type '" << srcType->type
-                                         << "': conflicting public IDs");
-        return false;
+static bool mergeType(IAaptContext* context, const Source& src,
+                      ResourceTableType* dstType, ResourceTableType* srcType) {
+  if (dstType->symbolStatus.state < srcType->symbolStatus.state) {
+    // The incoming type's visibility is stronger, so we should override
+    // the visibility.
+    if (srcType->symbolStatus.state == SymbolState::kPublic) {
+      // Only copy the ID if the source is public, or else the ID is
+      // meaningless.
+      dstType->id = srcType->id;
     }
-    return true;
+    dstType->symbolStatus = std::move(srcType->symbolStatus);
+  } else if (dstType->symbolStatus.state == SymbolState::kPublic &&
+             srcType->symbolStatus.state == SymbolState::kPublic &&
+             dstType->id && srcType->id &&
+             dstType->id.value() != srcType->id.value()) {
+    // Both types are public and have different IDs.
+    context->getDiagnostics()->error(DiagMessage(src)
+                                     << "cannot merge type '" << srcType->type
+                                     << "': conflicting public IDs");
+    return false;
+  }
+  return true;
 }
 
-static bool mergeEntry(IAaptContext* context, const Source& src, ResourceEntry* dstEntry,
-                       ResourceEntry* srcEntry) {
-    if (dstEntry->symbolStatus.state < srcEntry->symbolStatus.state) {
-        // The incoming type's visibility is stronger, so we should override
-        // the visibility.
-        if (srcEntry->symbolStatus.state == SymbolState::kPublic) {
-            // Only copy the ID if the source is public, or else the ID is meaningless.
-            dstEntry->id = srcEntry->id;
-        }
-        dstEntry->symbolStatus = std::move(srcEntry->symbolStatus);
-    } else if (srcEntry->symbolStatus.state == SymbolState::kPublic
-            && dstEntry->symbolStatus.state == SymbolState::kPublic
-            && dstEntry->id && srcEntry->id
-            && dstEntry->id.value() != srcEntry->id.value()) {
-        // Both entries are public and have different IDs.
-        context->getDiagnostics()->error(DiagMessage(src)
-                                         << "cannot merge entry '" << srcEntry->name
-                                         << "': conflicting public IDs");
-        return false;
+static bool mergeEntry(IAaptContext* context, const Source& src,
+                       ResourceEntry* dstEntry, ResourceEntry* srcEntry) {
+  if (dstEntry->symbolStatus.state < srcEntry->symbolStatus.state) {
+    // The incoming type's visibility is stronger, so we should override
+    // the visibility.
+    if (srcEntry->symbolStatus.state == SymbolState::kPublic) {
+      // Only copy the ID if the source is public, or else the ID is
+      // meaningless.
+      dstEntry->id = srcEntry->id;
     }
-    return true;
+    dstEntry->symbolStatus = std::move(srcEntry->symbolStatus);
+  } else if (srcEntry->symbolStatus.state == SymbolState::kPublic &&
+             dstEntry->symbolStatus.state == SymbolState::kPublic &&
+             dstEntry->id && srcEntry->id &&
+             dstEntry->id.value() != srcEntry->id.value()) {
+    // Both entries are public and have different IDs.
+    context->getDiagnostics()->error(DiagMessage(src)
+                                     << "cannot merge entry '" << srcEntry->name
+                                     << "': conflicting public IDs");
+    return false;
+  }
+  return true;
 }
 
 /**
  * Modified CollisionResolver which will merge Styleables. Used with overlays.
  *
  * Styleables are not actual resources, but they are treated as such during the
- * compilation phase. Styleables don't simply overlay each other, their definitions merge
- * and accumulate. If both values are Styleables, we just merge them into the existing value.
+ * compilation phase. Styleables don't simply overlay each other, their
+ * definitions merge
+ * and accumulate. If both values are Styleables, we just merge them into the
+ * existing value.
  */
-static ResourceTable::CollisionResult resolveMergeCollision(Value* existing, Value* incoming) {
-    if (Styleable* existingStyleable = valueCast<Styleable>(existing)) {
-        if (Styleable* incomingStyleable = valueCast<Styleable>(incoming)) {
-            // Styleables get merged.
-            existingStyleable->mergeWith(incomingStyleable);
-            return ResourceTable::CollisionResult::kKeepOriginal;
-        }
+static ResourceTable::CollisionResult resolveMergeCollision(Value* existing,
+                                                            Value* incoming) {
+  if (Styleable* existingStyleable = valueCast<Styleable>(existing)) {
+    if (Styleable* incomingStyleable = valueCast<Styleable>(incoming)) {
+      // Styleables get merged.
+      existingStyleable->mergeWith(incomingStyleable);
+      return ResourceTable::CollisionResult::kKeepOriginal;
     }
-    // Delegate to the default handler.
-    return ResourceTable::resolveValueCollision(existing, incoming);
+  }
+  // Delegate to the default handler.
+  return ResourceTable::resolveValueCollision(existing, incoming);
 }
 
-static ResourceTable::CollisionResult mergeConfigValue(IAaptContext* context,
-                                                       const ResourceNameRef& resName,
-                                                       const bool overlay,
-                                                       ResourceConfigValue* dstConfigValue,
-                                                       ResourceConfigValue* srcConfigValue) {
-    using CollisionResult = ResourceTable::CollisionResult;
+static ResourceTable::CollisionResult mergeConfigValue(
+    IAaptContext* context, const ResourceNameRef& resName, const bool overlay,
+    ResourceConfigValue* dstConfigValue, ResourceConfigValue* srcConfigValue) {
+  using CollisionResult = ResourceTable::CollisionResult;
 
-    Value* dstValue = dstConfigValue->value.get();
-    Value* srcValue = srcConfigValue->value.get();
+  Value* dstValue = dstConfigValue->value.get();
+  Value* srcValue = srcConfigValue->value.get();
 
-    CollisionResult collisionResult;
+  CollisionResult collisionResult;
+  if (overlay) {
+    collisionResult = resolveMergeCollision(dstValue, srcValue);
+  } else {
+    collisionResult = ResourceTable::resolveValueCollision(dstValue, srcValue);
+  }
+
+  if (collisionResult == CollisionResult::kConflict) {
     if (overlay) {
-        collisionResult = resolveMergeCollision(dstValue, srcValue);
-    } else {
-        collisionResult = ResourceTable::resolveValueCollision(dstValue, srcValue);
+      return CollisionResult::kTakeNew;
     }
 
-    if (collisionResult == CollisionResult::kConflict) {
-        if (overlay) {
-            return CollisionResult::kTakeNew;
-        }
-
-        // Error!
-        context->getDiagnostics()->error(DiagMessage(srcValue->getSource())
-                                         << "resource '" << resName
-                                         << "' has a conflicting value for "
-                                         << "configuration ("
-                                         << srcConfigValue->config << ")");
-        context->getDiagnostics()->note(DiagMessage(dstValue->getSource())
-                                        << "originally defined here");
-        return CollisionResult::kConflict;
-    }
-    return collisionResult;
+    // Error!
+    context->getDiagnostics()->error(
+        DiagMessage(srcValue->getSource())
+        << "resource '" << resName << "' has a conflicting value for "
+        << "configuration (" << srcConfigValue->config << ")");
+    context->getDiagnostics()->note(DiagMessage(dstValue->getSource())
+                                    << "originally defined here");
+    return CollisionResult::kConflict;
+  }
+  return collisionResult;
 }
 
-bool TableMerger::doMerge(const Source& src,
-                          ResourceTable* srcTable,
+bool TableMerger::doMerge(const Source& src, ResourceTable* srcTable,
                           ResourceTablePackage* srcPackage,
-                          const bool manglePackage,
-                          const bool overlay,
+                          const bool manglePackage, const bool overlay,
                           const bool allowNewResources,
                           const FileMergeCallback& callback) {
-    bool error = false;
+  bool error = false;
 
-    for (auto& srcType : srcPackage->types) {
-        ResourceTableType* dstType = mMasterPackage->findOrCreateType(srcType->type);
-        if (!mergeType(mContext, src, dstType, srcType.get())) {
+  for (auto& srcType : srcPackage->types) {
+    ResourceTableType* dstType =
+        mMasterPackage->findOrCreateType(srcType->type);
+    if (!mergeType(mContext, src, dstType, srcType.get())) {
+      error = true;
+      continue;
+    }
+
+    for (auto& srcEntry : srcType->entries) {
+      std::string entryName = srcEntry->name;
+      if (manglePackage) {
+        entryName = NameMangler::mangleEntry(srcPackage->name, srcEntry->name);
+      }
+
+      ResourceEntry* dstEntry;
+      if (allowNewResources) {
+        dstEntry = dstType->findOrCreateEntry(entryName);
+      } else {
+        dstEntry = dstType->findEntry(entryName);
+      }
+
+      const ResourceNameRef resName(srcPackage->name, srcType->type,
+                                    srcEntry->name);
+
+      if (!dstEntry) {
+        mContext->getDiagnostics()->error(
+            DiagMessage(src) << "resource " << resName
+                             << " does not override an existing resource");
+        mContext->getDiagnostics()->note(
+            DiagMessage(src) << "define an <add-resource> tag or use "
+                             << "--auto-add-overlay");
+        error = true;
+        continue;
+      }
+
+      if (!mergeEntry(mContext, src, dstEntry, srcEntry.get())) {
+        error = true;
+        continue;
+      }
+
+      for (auto& srcConfigValue : srcEntry->values) {
+        using CollisionResult = ResourceTable::CollisionResult;
+
+        ResourceConfigValue* dstConfigValue = dstEntry->findValue(
+            srcConfigValue->config, srcConfigValue->product);
+        if (dstConfigValue) {
+          CollisionResult collisionResult = mergeConfigValue(
+              mContext, resName, overlay, dstConfigValue, srcConfigValue.get());
+          if (collisionResult == CollisionResult::kConflict) {
             error = true;
             continue;
+          } else if (collisionResult == CollisionResult::kKeepOriginal) {
+            continue;
+          }
+        } else {
+          dstConfigValue = dstEntry->findOrCreateValue(srcConfigValue->config,
+                                                       srcConfigValue->product);
         }
 
-        for (auto& srcEntry : srcType->entries) {
-            std::string entryName = srcEntry->name;
-            if (manglePackage) {
-                entryName = NameMangler::mangleEntry(srcPackage->name, srcEntry->name);
+        // Continue if we're taking the new resource.
+
+        if (FileReference* f =
+                valueCast<FileReference>(srcConfigValue->value.get())) {
+          std::unique_ptr<FileReference> newFileRef;
+          if (manglePackage) {
+            newFileRef = cloneAndMangleFile(srcPackage->name, *f);
+          } else {
+            newFileRef = std::unique_ptr<FileReference>(
+                f->clone(&mMasterTable->stringPool));
+          }
+
+          if (callback) {
+            if (!callback(resName, srcConfigValue->config, newFileRef.get(),
+                          f)) {
+              error = true;
+              continue;
             }
+          }
+          dstConfigValue->value = std::move(newFileRef);
 
-            ResourceEntry* dstEntry;
-            if (allowNewResources) {
-                dstEntry = dstType->findOrCreateEntry(entryName);
-            } else {
-                dstEntry = dstType->findEntry(entryName);
-            }
-
-            const ResourceNameRef resName(srcPackage->name, srcType->type, srcEntry->name);
-
-            if (!dstEntry) {
-                mContext->getDiagnostics()->error(DiagMessage(src)
-                                                  << "resource " << resName
-                                                  << " does not override an existing resource");
-                mContext->getDiagnostics()->note(DiagMessage(src)
-                                                 << "define an <add-resource> tag or use "
-                                                 << "--auto-add-overlay");
-                error = true;
-                continue;
-            }
-
-            if (!mergeEntry(mContext, src, dstEntry, srcEntry.get())) {
-                error = true;
-                continue;
-            }
-
-            for (auto& srcConfigValue : srcEntry->values) {
-                using CollisionResult = ResourceTable::CollisionResult;
-
-                ResourceConfigValue* dstConfigValue = dstEntry->findValue(srcConfigValue->config,
-                                                                          srcConfigValue->product);
-                if (dstConfigValue) {
-                    CollisionResult collisionResult = mergeConfigValue(
-                            mContext, resName, overlay, dstConfigValue, srcConfigValue.get());
-                    if (collisionResult == CollisionResult::kConflict) {
-                        error = true;
-                        continue;
-                    } else if (collisionResult == CollisionResult::kKeepOriginal) {
-                        continue;
-                    }
-                } else {
-                    dstConfigValue = dstEntry->findOrCreateValue(srcConfigValue->config,
-                                                                 srcConfigValue->product);
-                }
-
-                // Continue if we're taking the new resource.
-
-                if (FileReference* f = valueCast<FileReference>(srcConfigValue->value.get())) {
-                    std::unique_ptr<FileReference> newFileRef;
-                    if (manglePackage) {
-                        newFileRef = cloneAndMangleFile(srcPackage->name, *f);
-                    } else {
-                        newFileRef = std::unique_ptr<FileReference>(f->clone(
-                                &mMasterTable->stringPool));
-                    }
-
-                    if (callback) {
-                        if (!callback(resName, srcConfigValue->config, newFileRef.get(), f)) {
-                            error = true;
-                            continue;
-                        }
-                    }
-                    dstConfigValue->value = std::move(newFileRef);
-
-                } else {
-                    dstConfigValue->value = std::unique_ptr<Value>(srcConfigValue->value->clone(
-                            &mMasterTable->stringPool));
-                }
-            }
+        } else {
+          dstConfigValue->value = std::unique_ptr<Value>(
+              srcConfigValue->value->clone(&mMasterTable->stringPool));
         }
+      }
     }
-    return !error;
+  }
+  return !error;
 }
 
-std::unique_ptr<FileReference> TableMerger::cloneAndMangleFile(const std::string& package,
-                                                               const FileReference& fileRef) {
-    StringPiece prefix, entry, suffix;
-    if (util::extractResFilePathParts(*fileRef.path, &prefix, &entry, &suffix)) {
-        std::string mangledEntry = NameMangler::mangleEntry(package, entry.toString());
-        std::string newPath = prefix.toString() + mangledEntry + suffix.toString();
-        std::unique_ptr<FileReference> newFileRef = util::make_unique<FileReference>(
-                mMasterTable->stringPool.makeRef(newPath));
-        newFileRef->setComment(fileRef.getComment());
-        newFileRef->setSource(fileRef.getSource());
-        return newFileRef;
-    }
-    return std::unique_ptr<FileReference>(fileRef.clone(&mMasterTable->stringPool));
+std::unique_ptr<FileReference> TableMerger::cloneAndMangleFile(
+    const std::string& package, const FileReference& fileRef) {
+  StringPiece prefix, entry, suffix;
+  if (util::extractResFilePathParts(*fileRef.path, &prefix, &entry, &suffix)) {
+    std::string mangledEntry =
+        NameMangler::mangleEntry(package, entry.toString());
+    std::string newPath = prefix.toString() + mangledEntry + suffix.toString();
+    std::unique_ptr<FileReference> newFileRef =
+        util::make_unique<FileReference>(
+            mMasterTable->stringPool.makeRef(newPath));
+    newFileRef->setComment(fileRef.getComment());
+    newFileRef->setSource(fileRef.getSource());
+    return newFileRef;
+  }
+  return std::unique_ptr<FileReference>(
+      fileRef.clone(&mMasterTable->stringPool));
 }
 
-bool TableMerger::mergeFileImpl(const ResourceFile& fileDesc, io::IFile* file, bool overlay) {
-    ResourceTable table;
-    std::string path = ResourceUtils::buildResourceFileName(fileDesc, nullptr);
-    std::unique_ptr<FileReference> fileRef = util::make_unique<FileReference>(
-            table.stringPool.makeRef(path));
-    fileRef->setSource(fileDesc.source);
-    fileRef->file = file;
+bool TableMerger::mergeFileImpl(const ResourceFile& fileDesc, io::IFile* file,
+                                bool overlay) {
+  ResourceTable table;
+  std::string path = ResourceUtils::buildResourceFileName(fileDesc, nullptr);
+  std::unique_ptr<FileReference> fileRef =
+      util::make_unique<FileReference>(table.stringPool.makeRef(path));
+  fileRef->setSource(fileDesc.source);
+  fileRef->file = file;
 
-    ResourceTablePackage* pkg = table.createPackage(fileDesc.name.package, 0x0);
-    pkg->findOrCreateType(fileDesc.name.type)
-            ->findOrCreateEntry(fileDesc.name.entry)
-            ->findOrCreateValue(fileDesc.config, {})
-            ->value = std::move(fileRef);
+  ResourceTablePackage* pkg = table.createPackage(fileDesc.name.package, 0x0);
+  pkg->findOrCreateType(fileDesc.name.type)
+      ->findOrCreateEntry(fileDesc.name.entry)
+      ->findOrCreateValue(fileDesc.config, {})
+      ->value = std::move(fileRef);
 
-    return doMerge(file->getSource(), &table, pkg,
-                   false /* mangle */, overlay /* overlay */, true /* allow new */, {});
+  return doMerge(file->getSource(), &table, pkg, false /* mangle */,
+                 overlay /* overlay */, true /* allow new */, {});
 }
 
 bool TableMerger::mergeFile(const ResourceFile& fileDesc, io::IFile* file) {
-    return mergeFileImpl(fileDesc, file, false /* overlay */);
+  return mergeFileImpl(fileDesc, file, false /* overlay */);
 }
 
-bool TableMerger::mergeFileOverlay(const ResourceFile& fileDesc, io::IFile* file) {
-    return mergeFileImpl(fileDesc, file, true /* overlay */);
+bool TableMerger::mergeFileOverlay(const ResourceFile& fileDesc,
+                                   io::IFile* file) {
+  return mergeFileImpl(fileDesc, file, true /* overlay */);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/TableMerger.h b/tools/aapt2/link/TableMerger.h
index 3473a27..c2e7181 100644
--- a/tools/aapt2/link/TableMerger.h
+++ b/tools/aapt2/link/TableMerger.h
@@ -31,96 +31,111 @@
 namespace aapt {
 
 struct TableMergerOptions {
-    /**
-     * If true, resources in overlays can be added without previously having existed.
-     */
-    bool autoAddOverlay = false;
+  /**
+   * If true, resources in overlays can be added without previously having
+   * existed.
+   */
+  bool autoAddOverlay = false;
 };
 
 /**
- * TableMerger takes resource tables and merges all packages within the tables that have the same
+ * TableMerger takes resource tables and merges all packages within the tables
+ * that have the same
  * package ID.
  *
- * If a package has a different name, all the entries in that table have their names mangled
- * to include the package name. This way there are no collisions. In order to do this correctly,
- * the TableMerger needs to also mangle any FileReference paths. Once these are mangled,
- * the original source path of the file, along with the new destination path is recorded in the
+ * If a package has a different name, all the entries in that table have their
+ * names mangled
+ * to include the package name. This way there are no collisions. In order to do
+ * this correctly,
+ * the TableMerger needs to also mangle any FileReference paths. Once these are
+ * mangled,
+ * the original source path of the file, along with the new destination path is
+ * recorded in the
  * queue returned from getFileMergeQueue().
  *
- * Once the merging is complete, a separate process can go collect the files from the various
- * source APKs and either copy or process their XML and put them in the correct location in
+ * Once the merging is complete, a separate process can go collect the files
+ * from the various
+ * source APKs and either copy or process their XML and put them in the correct
+ * location in
  * the final APK.
  */
 class TableMerger {
-public:
-    /**
-     * Note: The outTable ResourceTable must live longer than this TableMerger. References
-     * are made to this ResourceTable for efficiency reasons.
-     */
-    TableMerger(IAaptContext* context, ResourceTable* outTable, const TableMergerOptions& options);
+ public:
+  /**
+   * Note: The outTable ResourceTable must live longer than this TableMerger.
+   * References
+   * are made to this ResourceTable for efficiency reasons.
+   */
+  TableMerger(IAaptContext* context, ResourceTable* outTable,
+              const TableMergerOptions& options);
 
-    const std::set<std::string>& getMergedPackages() const {
-        return mMergedPackages;
-    }
+  const std::set<std::string>& getMergedPackages() const {
+    return mMergedPackages;
+  }
 
-    /**
-     * Merges resources from the same or empty package. This is for local sources.
-     * An io::IFileCollection is optional and used to find the referenced Files and process them.
-     */
-    bool merge(const Source& src, ResourceTable* table,
-               io::IFileCollection* collection = nullptr);
+  /**
+   * Merges resources from the same or empty package. This is for local sources.
+   * An io::IFileCollection is optional and used to find the referenced Files
+   * and process them.
+   */
+  bool merge(const Source& src, ResourceTable* table,
+             io::IFileCollection* collection = nullptr);
 
-    /**
-     * Merges resources from an overlay ResourceTable.
-     * An io::IFileCollection is optional and used to find the referenced Files and process them.
-     */
-    bool mergeOverlay(const Source& src, ResourceTable* table,
-                      io::IFileCollection* collection = nullptr);
+  /**
+   * Merges resources from an overlay ResourceTable.
+   * An io::IFileCollection is optional and used to find the referenced Files
+   * and process them.
+   */
+  bool mergeOverlay(const Source& src, ResourceTable* table,
+                    io::IFileCollection* collection = nullptr);
 
-    /**
-     * Merges resources from the given package, mangling the name. This is for static libraries.
-     * An io::IFileCollection is needed in order to find the referenced Files and process them.
-     */
-    bool mergeAndMangle(const Source& src, const StringPiece& package, ResourceTable* table,
-                        io::IFileCollection* collection);
+  /**
+   * Merges resources from the given package, mangling the name. This is for
+   * static libraries.
+   * An io::IFileCollection is needed in order to find the referenced Files and
+   * process them.
+   */
+  bool mergeAndMangle(const Source& src, const StringPiece& package,
+                      ResourceTable* table, io::IFileCollection* collection);
 
-    /**
-     * Merges a compiled file that belongs to this same or empty package. This is for local sources.
-     */
-    bool mergeFile(const ResourceFile& fileDesc, io::IFile* file);
+  /**
+   * Merges a compiled file that belongs to this same or empty package. This is
+   * for local sources.
+   */
+  bool mergeFile(const ResourceFile& fileDesc, io::IFile* file);
 
-    /**
-     * Merges a compiled file from an overlay, overriding an existing definition.
-     */
-    bool mergeFileOverlay(const ResourceFile& fileDesc, io::IFile* file);
+  /**
+   * Merges a compiled file from an overlay, overriding an existing definition.
+   */
+  bool mergeFileOverlay(const ResourceFile& fileDesc, io::IFile* file);
 
-private:
-    using FileMergeCallback = std::function<bool(const ResourceNameRef&,
-                                                 const ConfigDescription& config,
-                                                 FileReference*, FileReference*)>;
+ private:
+  using FileMergeCallback = std::function<bool(const ResourceNameRef&,
+                                               const ConfigDescription& config,
+                                               FileReference*, FileReference*)>;
 
-    IAaptContext* mContext;
-    ResourceTable* mMasterTable;
-    TableMergerOptions mOptions;
-    ResourceTablePackage* mMasterPackage;
+  IAaptContext* mContext;
+  ResourceTable* mMasterTable;
+  TableMergerOptions mOptions;
+  ResourceTablePackage* mMasterPackage;
 
-    std::set<std::string> mMergedPackages;
+  std::set<std::string> mMergedPackages;
 
-    bool mergeFileImpl(const ResourceFile& fileDesc, io::IFile* file, bool overlay);
+  bool mergeFileImpl(const ResourceFile& fileDesc, io::IFile* file,
+                     bool overlay);
 
-    bool mergeImpl(const Source& src, ResourceTable* srcTable, io::IFileCollection* collection,
-                   bool overlay, bool allowNew);
+  bool mergeImpl(const Source& src, ResourceTable* srcTable,
+                 io::IFileCollection* collection, bool overlay, bool allowNew);
 
-    bool doMerge(const Source& src, ResourceTable* srcTable, ResourceTablePackage* srcPackage,
-                 const bool manglePackage,
-                 const bool overlay,
-                 const bool allowNewResources,
-                 const FileMergeCallback& callback);
+  bool doMerge(const Source& src, ResourceTable* srcTable,
+               ResourceTablePackage* srcPackage, const bool manglePackage,
+               const bool overlay, const bool allowNewResources,
+               const FileMergeCallback& callback);
 
-    std::unique_ptr<FileReference> cloneAndMangleFile(const std::string& package,
-                                                      const FileReference& value);
+  std::unique_ptr<FileReference> cloneAndMangleFile(const std::string& package,
+                                                    const FileReference& value);
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_TABLEMERGER_H */
diff --git a/tools/aapt2/link/TableMerger_test.cpp b/tools/aapt2/link/TableMerger_test.cpp
index fb1cb21..e0b2b66 100644
--- a/tools/aapt2/link/TableMerger_test.cpp
+++ b/tools/aapt2/link/TableMerger_test.cpp
@@ -14,9 +14,9 @@
  * limitations under the License.
  */
 
+#include "link/TableMerger.h"
 #include "filter/ConfigFilter.h"
 #include "io/FileSystem.h"
-#include "link/TableMerger.h"
 #include "test/Builders.h"
 #include "test/Context.h"
 
@@ -25,292 +25,327 @@
 namespace aapt {
 
 struct TableMergerTest : public ::testing::Test {
-    std::unique_ptr<IAaptContext> mContext;
+  std::unique_ptr<IAaptContext> mContext;
 
-    void SetUp() override {
-        mContext = test::ContextBuilder()
-                // We are compiling this package.
-                .setCompilationPackage("com.app.a")
+  void SetUp() override {
+    mContext =
+        test::ContextBuilder()
+            // We are compiling this package.
+            .setCompilationPackage("com.app.a")
 
-                // Merge all packages that have this package ID.
-                .setPackageId(0x7f)
+            // Merge all packages that have this package ID.
+            .setPackageId(0x7f)
 
-                // Mangle all packages that do not have this package name.
-                .setNameManglerPolicy(NameManglerPolicy{ "com.app.a", { "com.app.b" } })
+            // Mangle all packages that do not have this package name.
+            .setNameManglerPolicy(NameManglerPolicy{"com.app.a", {"com.app.b"}})
 
-                .build();
-    }
+            .build();
+  }
 };
 
 TEST_F(TableMergerTest, SimpleMerge) {
-    std::unique_ptr<ResourceTable> tableA = test::ResourceTableBuilder()
-            .setPackageId("com.app.a", 0x7f)
-            .addReference("com.app.a:id/foo", "com.app.a:id/bar")
-            .addReference("com.app.a:id/bar", "com.app.b:id/foo")
-            .addValue("com.app.a:styleable/view", test::StyleableBuilder()
-                    .addItem("com.app.b:id/foo")
-                    .build())
-            .build();
+  std::unique_ptr<ResourceTable> tableA =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.a", 0x7f)
+          .addReference("com.app.a:id/foo", "com.app.a:id/bar")
+          .addReference("com.app.a:id/bar", "com.app.b:id/foo")
+          .addValue(
+              "com.app.a:styleable/view",
+              test::StyleableBuilder().addItem("com.app.b:id/foo").build())
+          .build();
 
-    std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder()
-            .setPackageId("com.app.b", 0x7f)
-            .addSimple("com.app.b:id/foo")
-            .build();
+  std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder()
+                                              .setPackageId("com.app.b", 0x7f)
+                                              .addSimple("com.app.b:id/foo")
+                                              .build();
 
-    ResourceTable finalTable;
-    TableMerger merger(mContext.get(), &finalTable, TableMergerOptions{});
-    io::FileCollection collection;
+  ResourceTable finalTable;
+  TableMerger merger(mContext.get(), &finalTable, TableMergerOptions{});
+  io::FileCollection collection;
 
-    ASSERT_TRUE(merger.merge({}, tableA.get()));
-    ASSERT_TRUE(merger.mergeAndMangle({}, "com.app.b", tableB.get(), &collection));
+  ASSERT_TRUE(merger.merge({}, tableA.get()));
+  ASSERT_TRUE(
+      merger.mergeAndMangle({}, "com.app.b", tableB.get(), &collection));
 
-    EXPECT_TRUE(merger.getMergedPackages().count("com.app.b") != 0);
+  EXPECT_TRUE(merger.getMergedPackages().count("com.app.b") != 0);
 
-    // Entries from com.app.a should not be mangled.
-    AAPT_EXPECT_TRUE(finalTable.findResource(test::parseNameOrDie("com.app.a:id/foo")));
-    AAPT_EXPECT_TRUE(finalTable.findResource(test::parseNameOrDie("com.app.a:id/bar")));
-    AAPT_EXPECT_TRUE(finalTable.findResource(test::parseNameOrDie("com.app.a:styleable/view")));
+  // Entries from com.app.a should not be mangled.
+  AAPT_EXPECT_TRUE(
+      finalTable.findResource(test::parseNameOrDie("com.app.a:id/foo")));
+  AAPT_EXPECT_TRUE(
+      finalTable.findResource(test::parseNameOrDie("com.app.a:id/bar")));
+  AAPT_EXPECT_TRUE(finalTable.findResource(
+      test::parseNameOrDie("com.app.a:styleable/view")));
 
-    // The unmangled name should not be present.
-    AAPT_EXPECT_FALSE(finalTable.findResource(test::parseNameOrDie("com.app.b:id/foo")));
+  // The unmangled name should not be present.
+  AAPT_EXPECT_FALSE(
+      finalTable.findResource(test::parseNameOrDie("com.app.b:id/foo")));
 
-    // Look for the mangled name.
-    AAPT_EXPECT_TRUE(finalTable.findResource(test::parseNameOrDie("com.app.a:id/com.app.b$foo")));
+  // Look for the mangled name.
+  AAPT_EXPECT_TRUE(finalTable.findResource(
+      test::parseNameOrDie("com.app.a:id/com.app.b$foo")));
 }
 
 TEST_F(TableMergerTest, MergeFile) {
-    ResourceTable finalTable;
-    TableMergerOptions options;
-    options.autoAddOverlay = false;
-    TableMerger merger(mContext.get(), &finalTable, options);
+  ResourceTable finalTable;
+  TableMergerOptions options;
+  options.autoAddOverlay = false;
+  TableMerger merger(mContext.get(), &finalTable, options);
 
-    ResourceFile fileDesc;
-    fileDesc.config = test::parseConfigOrDie("hdpi-v4");
-    fileDesc.name = test::parseNameOrDie("layout/main");
-    fileDesc.source = Source("res/layout-hdpi/main.xml");
-    test::TestFile testFile("path/to/res/layout-hdpi/main.xml.flat");
+  ResourceFile fileDesc;
+  fileDesc.config = test::parseConfigOrDie("hdpi-v4");
+  fileDesc.name = test::parseNameOrDie("layout/main");
+  fileDesc.source = Source("res/layout-hdpi/main.xml");
+  test::TestFile testFile("path/to/res/layout-hdpi/main.xml.flat");
 
-    ASSERT_TRUE(merger.mergeFile(fileDesc, &testFile));
+  ASSERT_TRUE(merger.mergeFile(fileDesc, &testFile));
 
-    FileReference* file = test::getValueForConfig<FileReference>(&finalTable,
-                                                                 "com.app.a:layout/main",
-                                                                 test::parseConfigOrDie("hdpi-v4"));
-    ASSERT_NE(nullptr, file);
-    EXPECT_EQ(std::string("res/layout-hdpi-v4/main.xml"), *file->path);
+  FileReference* file = test::getValueForConfig<FileReference>(
+      &finalTable, "com.app.a:layout/main", test::parseConfigOrDie("hdpi-v4"));
+  ASSERT_NE(nullptr, file);
+  EXPECT_EQ(std::string("res/layout-hdpi-v4/main.xml"), *file->path);
 }
 
 TEST_F(TableMergerTest, MergeFileOverlay) {
-    ResourceTable finalTable;
-    TableMergerOptions tableMergerOptions;
-    tableMergerOptions.autoAddOverlay = false;
-    TableMerger merger(mContext.get(), &finalTable, tableMergerOptions);
+  ResourceTable finalTable;
+  TableMergerOptions tableMergerOptions;
+  tableMergerOptions.autoAddOverlay = false;
+  TableMerger merger(mContext.get(), &finalTable, tableMergerOptions);
 
-    ResourceFile fileDesc;
-    fileDesc.name = test::parseNameOrDie("xml/foo");
-    test::TestFile fileA("path/to/fileA.xml.flat");
-    test::TestFile fileB("path/to/fileB.xml.flat");
+  ResourceFile fileDesc;
+  fileDesc.name = test::parseNameOrDie("xml/foo");
+  test::TestFile fileA("path/to/fileA.xml.flat");
+  test::TestFile fileB("path/to/fileB.xml.flat");
 
-    ASSERT_TRUE(merger.mergeFile(fileDesc, &fileA));
-    ASSERT_TRUE(merger.mergeFileOverlay(fileDesc, &fileB));
+  ASSERT_TRUE(merger.mergeFile(fileDesc, &fileA));
+  ASSERT_TRUE(merger.mergeFileOverlay(fileDesc, &fileB));
 }
 
 TEST_F(TableMergerTest, MergeFileReferences) {
-    std::unique_ptr<ResourceTable> tableA = test::ResourceTableBuilder()
-            .setPackageId("com.app.a", 0x7f)
-            .addFileReference("com.app.a:xml/file", "res/xml/file.xml")
-            .build();
-    std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder()
-            .setPackageId("com.app.b", 0x7f)
-            .addFileReference("com.app.b:xml/file", "res/xml/file.xml")
-            .build();
+  std::unique_ptr<ResourceTable> tableA =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.a", 0x7f)
+          .addFileReference("com.app.a:xml/file", "res/xml/file.xml")
+          .build();
+  std::unique_ptr<ResourceTable> tableB =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.b", 0x7f)
+          .addFileReference("com.app.b:xml/file", "res/xml/file.xml")
+          .build();
 
-    ResourceTable finalTable;
-    TableMerger merger(mContext.get(), &finalTable, TableMergerOptions{});
-    io::FileCollection collection;
-    collection.insertFile("res/xml/file.xml");
+  ResourceTable finalTable;
+  TableMerger merger(mContext.get(), &finalTable, TableMergerOptions{});
+  io::FileCollection collection;
+  collection.insertFile("res/xml/file.xml");
 
-    ASSERT_TRUE(merger.merge({}, tableA.get()));
-    ASSERT_TRUE(merger.mergeAndMangle({}, "com.app.b", tableB.get(), &collection));
+  ASSERT_TRUE(merger.merge({}, tableA.get()));
+  ASSERT_TRUE(
+      merger.mergeAndMangle({}, "com.app.b", tableB.get(), &collection));
 
-    FileReference* f = test::getValue<FileReference>(&finalTable, "com.app.a:xml/file");
-    ASSERT_NE(f, nullptr);
-    EXPECT_EQ(std::string("res/xml/file.xml"), *f->path);
+  FileReference* f =
+      test::getValue<FileReference>(&finalTable, "com.app.a:xml/file");
+  ASSERT_NE(f, nullptr);
+  EXPECT_EQ(std::string("res/xml/file.xml"), *f->path);
 
-    f = test::getValue<FileReference>(&finalTable, "com.app.a:xml/com.app.b$file");
-    ASSERT_NE(f, nullptr);
-    EXPECT_EQ(std::string("res/xml/com.app.b$file.xml"), *f->path);
+  f = test::getValue<FileReference>(&finalTable,
+                                    "com.app.a:xml/com.app.b$file");
+  ASSERT_NE(f, nullptr);
+  EXPECT_EQ(std::string("res/xml/com.app.b$file.xml"), *f->path);
 }
 
 TEST_F(TableMergerTest, OverrideResourceWithOverlay) {
-    std::unique_ptr<ResourceTable> base = test::ResourceTableBuilder()
-            .setPackageId("", 0x00)
-            .addValue("bool/foo", ResourceUtils::tryParseBool("true"))
-            .build();
-    std::unique_ptr<ResourceTable> overlay = test::ResourceTableBuilder()
-            .setPackageId("", 0x00)
-            .addValue("bool/foo", ResourceUtils::tryParseBool("false"))
-            .build();
+  std::unique_ptr<ResourceTable> base =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x00)
+          .addValue("bool/foo", ResourceUtils::tryParseBool("true"))
+          .build();
+  std::unique_ptr<ResourceTable> overlay =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x00)
+          .addValue("bool/foo", ResourceUtils::tryParseBool("false"))
+          .build();
 
-    ResourceTable finalTable;
-    TableMergerOptions tableMergerOptions;
-    tableMergerOptions.autoAddOverlay = false;
-    TableMerger merger(mContext.get(), &finalTable, tableMergerOptions);
+  ResourceTable finalTable;
+  TableMergerOptions tableMergerOptions;
+  tableMergerOptions.autoAddOverlay = false;
+  TableMerger merger(mContext.get(), &finalTable, tableMergerOptions);
 
-    ASSERT_TRUE(merger.merge({}, base.get()));
-    ASSERT_TRUE(merger.mergeOverlay({}, overlay.get()));
+  ASSERT_TRUE(merger.merge({}, base.get()));
+  ASSERT_TRUE(merger.mergeOverlay({}, overlay.get()));
 
-    BinaryPrimitive* foo = test::getValue<BinaryPrimitive>(&finalTable, "com.app.a:bool/foo");
-    ASSERT_NE(nullptr, foo);
-    EXPECT_EQ(0x0u, foo->value.data);
+  BinaryPrimitive* foo =
+      test::getValue<BinaryPrimitive>(&finalTable, "com.app.a:bool/foo");
+  ASSERT_NE(nullptr, foo);
+  EXPECT_EQ(0x0u, foo->value.data);
 }
 
 TEST_F(TableMergerTest, OverrideSameResourceIdsWithOverlay) {
-    std::unique_ptr<ResourceTable> base = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0001), SymbolState::kPublic)
-            .build();
-    std::unique_ptr<ResourceTable> overlay = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0001), SymbolState::kPublic)
-            .build();
+  std::unique_ptr<ResourceTable> base =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x7f)
+          .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0001),
+                          SymbolState::kPublic)
+          .build();
+  std::unique_ptr<ResourceTable> overlay =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x7f)
+          .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0001),
+                          SymbolState::kPublic)
+          .build();
 
-    ResourceTable finalTable;
-    TableMergerOptions tableMergerOptions;
-    tableMergerOptions.autoAddOverlay = false;
-    TableMerger merger(mContext.get(), &finalTable, tableMergerOptions);
+  ResourceTable finalTable;
+  TableMergerOptions tableMergerOptions;
+  tableMergerOptions.autoAddOverlay = false;
+  TableMerger merger(mContext.get(), &finalTable, tableMergerOptions);
 
-    ASSERT_TRUE(merger.merge({}, base.get()));
-    ASSERT_TRUE(merger.mergeOverlay({}, overlay.get()));
+  ASSERT_TRUE(merger.merge({}, base.get()));
+  ASSERT_TRUE(merger.mergeOverlay({}, overlay.get()));
 }
 
 TEST_F(TableMergerTest, FailToOverrideConflictingTypeIdsWithOverlay) {
-    std::unique_ptr<ResourceTable> base = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0001), SymbolState::kPublic)
-            .build();
-    std::unique_ptr<ResourceTable> overlay = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .setSymbolState("bool/foo", ResourceId(0x7f, 0x02, 0x0001), SymbolState::kPublic)
-            .build();
+  std::unique_ptr<ResourceTable> base =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x7f)
+          .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0001),
+                          SymbolState::kPublic)
+          .build();
+  std::unique_ptr<ResourceTable> overlay =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x7f)
+          .setSymbolState("bool/foo", ResourceId(0x7f, 0x02, 0x0001),
+                          SymbolState::kPublic)
+          .build();
 
-    ResourceTable finalTable;
-    TableMergerOptions tableMergerOptions;
-    tableMergerOptions.autoAddOverlay = false;
-    TableMerger merger(mContext.get(), &finalTable, tableMergerOptions);
+  ResourceTable finalTable;
+  TableMergerOptions tableMergerOptions;
+  tableMergerOptions.autoAddOverlay = false;
+  TableMerger merger(mContext.get(), &finalTable, tableMergerOptions);
 
-    ASSERT_TRUE(merger.merge({}, base.get()));
-    ASSERT_FALSE(merger.mergeOverlay({}, overlay.get()));
+  ASSERT_TRUE(merger.merge({}, base.get()));
+  ASSERT_FALSE(merger.mergeOverlay({}, overlay.get()));
 }
 
 TEST_F(TableMergerTest, FailToOverrideConflictingEntryIdsWithOverlay) {
-    std::unique_ptr<ResourceTable> base = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0001), SymbolState::kPublic)
-            .build();
-    std::unique_ptr<ResourceTable> overlay = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0002), SymbolState::kPublic)
-            .build();
+  std::unique_ptr<ResourceTable> base =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x7f)
+          .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0001),
+                          SymbolState::kPublic)
+          .build();
+  std::unique_ptr<ResourceTable> overlay =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x7f)
+          .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0002),
+                          SymbolState::kPublic)
+          .build();
 
-    ResourceTable finalTable;
-    TableMergerOptions tableMergerOptions;
-    tableMergerOptions.autoAddOverlay = false;
-    TableMerger merger(mContext.get(), &finalTable, tableMergerOptions);
+  ResourceTable finalTable;
+  TableMergerOptions tableMergerOptions;
+  tableMergerOptions.autoAddOverlay = false;
+  TableMerger merger(mContext.get(), &finalTable, tableMergerOptions);
 
-    ASSERT_TRUE(merger.merge({}, base.get()));
-    ASSERT_FALSE(merger.mergeOverlay({}, overlay.get()));
+  ASSERT_TRUE(merger.merge({}, base.get()));
+  ASSERT_FALSE(merger.mergeOverlay({}, overlay.get()));
 }
 
 TEST_F(TableMergerTest, MergeAddResourceFromOverlay) {
-    std::unique_ptr<ResourceTable> tableA = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .setSymbolState("bool/foo", {}, SymbolState::kUndefined)
-            .build();
-    std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .addValue("bool/foo", ResourceUtils::tryParseBool("true"))
-            .build();
+  std::unique_ptr<ResourceTable> tableA =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x7f)
+          .setSymbolState("bool/foo", {}, SymbolState::kUndefined)
+          .build();
+  std::unique_ptr<ResourceTable> tableB =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x7f)
+          .addValue("bool/foo", ResourceUtils::tryParseBool("true"))
+          .build();
 
-    ResourceTable finalTable;
-    TableMerger merger(mContext.get(), &finalTable, TableMergerOptions{});
+  ResourceTable finalTable;
+  TableMerger merger(mContext.get(), &finalTable, TableMergerOptions{});
 
-    ASSERT_TRUE(merger.merge({}, tableA.get()));
-    ASSERT_TRUE(merger.mergeOverlay({}, tableB.get()));
+  ASSERT_TRUE(merger.merge({}, tableA.get()));
+  ASSERT_TRUE(merger.mergeOverlay({}, tableB.get()));
 }
 
 TEST_F(TableMergerTest, MergeAddResourceFromOverlayWithAutoAddOverlay) {
-    std::unique_ptr<ResourceTable> tableA = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .build();
-    std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .addValue("bool/foo", ResourceUtils::tryParseBool("true"))
-            .build();
+  std::unique_ptr<ResourceTable> tableA =
+      test::ResourceTableBuilder().setPackageId("", 0x7f).build();
+  std::unique_ptr<ResourceTable> tableB =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x7f)
+          .addValue("bool/foo", ResourceUtils::tryParseBool("true"))
+          .build();
 
-    ResourceTable finalTable;
-    TableMergerOptions options;
-    options.autoAddOverlay = true;
-    TableMerger merger(mContext.get(), &finalTable, options);
+  ResourceTable finalTable;
+  TableMergerOptions options;
+  options.autoAddOverlay = true;
+  TableMerger merger(mContext.get(), &finalTable, options);
 
-    ASSERT_TRUE(merger.merge({}, tableA.get()));
-    ASSERT_TRUE(merger.mergeOverlay({}, tableB.get()));
+  ASSERT_TRUE(merger.merge({}, tableA.get()));
+  ASSERT_TRUE(merger.mergeOverlay({}, tableB.get()));
 }
 
 TEST_F(TableMergerTest, FailToMergeNewResourceWithoutAutoAddOverlay) {
-    std::unique_ptr<ResourceTable> tableA = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .build();
-    std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder()
-            .setPackageId("", 0x7f)
-            .addValue("bool/foo", ResourceUtils::tryParseBool("true"))
-            .build();
+  std::unique_ptr<ResourceTable> tableA =
+      test::ResourceTableBuilder().setPackageId("", 0x7f).build();
+  std::unique_ptr<ResourceTable> tableB =
+      test::ResourceTableBuilder()
+          .setPackageId("", 0x7f)
+          .addValue("bool/foo", ResourceUtils::tryParseBool("true"))
+          .build();
 
-    ResourceTable finalTable;
-    TableMergerOptions options;
-    options.autoAddOverlay = false;
-    TableMerger merger(mContext.get(), &finalTable, options);
+  ResourceTable finalTable;
+  TableMergerOptions options;
+  options.autoAddOverlay = false;
+  TableMerger merger(mContext.get(), &finalTable, options);
 
-    ASSERT_TRUE(merger.merge({}, tableA.get()));
-    ASSERT_FALSE(merger.mergeOverlay({}, tableB.get()));
+  ASSERT_TRUE(merger.merge({}, tableA.get()));
+  ASSERT_FALSE(merger.mergeOverlay({}, tableB.get()));
 }
 
 TEST_F(TableMergerTest, OverlaidStyleablesShouldBeMerged) {
-    std::unique_ptr<ResourceTable> tableA = test::ResourceTableBuilder()
-            .setPackageId("com.app.a", 0x7f)
-            .addValue("com.app.a:styleable/Foo", test::StyleableBuilder()
-                    .addItem("com.app.a:attr/bar")
-                    .addItem("com.app.a:attr/foo", ResourceId(0x01010000))
-                    .build())
-            .build();
+  std::unique_ptr<ResourceTable> tableA =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.a", 0x7f)
+          .addValue("com.app.a:styleable/Foo",
+                    test::StyleableBuilder()
+                        .addItem("com.app.a:attr/bar")
+                        .addItem("com.app.a:attr/foo", ResourceId(0x01010000))
+                        .build())
+          .build();
 
-    std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder()
-            .setPackageId("com.app.a", 0x7f)
-            .addValue("com.app.a:styleable/Foo", test::StyleableBuilder()
-                    .addItem("com.app.a:attr/bat")
-                    .addItem("com.app.a:attr/foo")
-                    .build())
-            .build();
+  std::unique_ptr<ResourceTable> tableB =
+      test::ResourceTableBuilder()
+          .setPackageId("com.app.a", 0x7f)
+          .addValue("com.app.a:styleable/Foo",
+                    test::StyleableBuilder()
+                        .addItem("com.app.a:attr/bat")
+                        .addItem("com.app.a:attr/foo")
+                        .build())
+          .build();
 
-    ResourceTable finalTable;
-    TableMergerOptions options;
-    options.autoAddOverlay = true;
-    TableMerger merger(mContext.get(), &finalTable, options);
+  ResourceTable finalTable;
+  TableMergerOptions options;
+  options.autoAddOverlay = true;
+  TableMerger merger(mContext.get(), &finalTable, options);
 
-    ASSERT_TRUE(merger.merge({}, tableA.get()));
-    ASSERT_TRUE(merger.mergeOverlay({}, tableB.get()));
+  ASSERT_TRUE(merger.merge({}, tableA.get()));
+  ASSERT_TRUE(merger.mergeOverlay({}, tableB.get()));
 
-    Debug::printTable(&finalTable, {});
+  Debug::printTable(&finalTable, {});
 
-    Styleable* styleable = test::getValue<Styleable>(&finalTable, "com.app.a:styleable/Foo");
-    ASSERT_NE(nullptr, styleable);
+  Styleable* styleable =
+      test::getValue<Styleable>(&finalTable, "com.app.a:styleable/Foo");
+  ASSERT_NE(nullptr, styleable);
 
-    std::vector<Reference> expectedRefs = {
-            Reference(test::parseNameOrDie("com.app.a:attr/bar")),
-            Reference(test::parseNameOrDie("com.app.a:attr/bat")),
-            Reference(test::parseNameOrDie("com.app.a:attr/foo"), ResourceId(0x01010000)),
-    };
+  std::vector<Reference> expectedRefs = {
+      Reference(test::parseNameOrDie("com.app.a:attr/bar")),
+      Reference(test::parseNameOrDie("com.app.a:attr/bat")),
+      Reference(test::parseNameOrDie("com.app.a:attr/foo"),
+                ResourceId(0x01010000)),
+  };
 
-    EXPECT_EQ(expectedRefs, styleable->entries);
+  EXPECT_EQ(expectedRefs, styleable->entries);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/VersionCollapser.cpp b/tools/aapt2/link/VersionCollapser.cpp
index 949d656..61a1f86 100644
--- a/tools/aapt2/link/VersionCollapser.cpp
+++ b/tools/aapt2/link/VersionCollapser.cpp
@@ -24,129 +24,140 @@
 
 template <typename Iterator, typename Pred>
 class FilterIterator {
-public:
-    FilterIterator(Iterator begin, Iterator end, Pred pred=Pred()) :
-            mCurrent(begin), mEnd(end), mPred(pred) {
-        advance();
-    }
+ public:
+  FilterIterator(Iterator begin, Iterator end, Pred pred = Pred())
+      : mCurrent(begin), mEnd(end), mPred(pred) {
+    advance();
+  }
 
-    bool hasNext() {
-        return mCurrent != mEnd;
-    }
+  bool hasNext() { return mCurrent != mEnd; }
 
-    Iterator nextIter() {
-        Iterator iter = mCurrent;
-        ++mCurrent;
-        advance();
-        return iter;
-    }
+  Iterator nextIter() {
+    Iterator iter = mCurrent;
+    ++mCurrent;
+    advance();
+    return iter;
+  }
 
-    typename Iterator::reference next() {
-        return *nextIter();
-    }
+  typename Iterator::reference next() { return *nextIter(); }
 
-private:
-    void advance() {
-        for (; mCurrent != mEnd; ++mCurrent) {
-            if (mPred(*mCurrent)) {
-                return;
-            }
-        }
+ private:
+  void advance() {
+    for (; mCurrent != mEnd; ++mCurrent) {
+      if (mPred(*mCurrent)) {
+        return;
+      }
     }
+  }
 
-    Iterator mCurrent, mEnd;
-    Pred mPred;
+  Iterator mCurrent, mEnd;
+  Pred mPred;
 };
 
 template <typename Iterator, typename Pred>
-FilterIterator<Iterator, Pred> makeFilterIterator(Iterator begin, Iterator end=Iterator(),
-                                                  Pred pred=Pred()) {
-    return FilterIterator<Iterator, Pred>(begin, end, pred);
+FilterIterator<Iterator, Pred> makeFilterIterator(Iterator begin,
+                                                  Iterator end = Iterator(),
+                                                  Pred pred = Pred()) {
+  return FilterIterator<Iterator, Pred>(begin, end, pred);
 }
 
 /**
- * Every Configuration with an SDK version specified that is less than minSdk will be removed.
- * The exception is when there is no exact matching resource for the minSdk. The next smallest
+ * Every Configuration with an SDK version specified that is less than minSdk
+ * will be removed.
+ * The exception is when there is no exact matching resource for the minSdk. The
+ * next smallest
  * one will be kept.
  */
 static void collapseVersions(int minSdk, ResourceEntry* entry) {
-    // First look for all sdks less than minSdk.
-    for (auto iter = entry->values.rbegin(); iter != entry->values.rend(); ++iter) {
-        // Check if the item was already marked for removal.
-        if (!(*iter)) {
-            continue;
-        }
-
-        const ConfigDescription& config = (*iter)->config;
-        if (config.sdkVersion <= minSdk) {
-            // This is the first configuration we've found with a smaller or equal SDK level
-            // to the minimum. We MUST keep this one, but remove all others we find, which get
-            // overridden by this one.
-
-            ConfigDescription configWithoutSdk = config;
-            configWithoutSdk.sdkVersion = 0;
-            auto pred = [&](const std::unique_ptr<ResourceConfigValue>& val) -> bool {
-                // Check that the value hasn't already been marked for removal.
-                if (!val) {
-                    return false;
-                }
-
-                // Only return Configs that differ in SDK version.
-                configWithoutSdk.sdkVersion = val->config.sdkVersion;
-                return configWithoutSdk == val->config && val->config.sdkVersion <= minSdk;
-            };
-
-            // Remove the rest that match.
-            auto filterIter = makeFilterIterator(iter + 1, entry->values.rend(), pred);
-            while (filterIter.hasNext()) {
-                filterIter.next() = {};
-            }
-        }
+  // First look for all sdks less than minSdk.
+  for (auto iter = entry->values.rbegin(); iter != entry->values.rend();
+       ++iter) {
+    // Check if the item was already marked for removal.
+    if (!(*iter)) {
+      continue;
     }
 
-    // Now erase the nullptr values.
-    entry->values.erase(std::remove_if(entry->values.begin(), entry->values.end(),
-                   [](const std::unique_ptr<ResourceConfigValue>& val) -> bool {
-        return val == nullptr;
-    }), entry->values.end());
+    const ConfigDescription& config = (*iter)->config;
+    if (config.sdkVersion <= minSdk) {
+      // This is the first configuration we've found with a smaller or equal SDK
+      // level
+      // to the minimum. We MUST keep this one, but remove all others we find,
+      // which get
+      // overridden by this one.
 
-    // Strip the version qualifiers for every resource with version <= minSdk. This will ensure
-    // that the resource entries are all packed together in the same ResTable_type struct
-    // and take up less space in the resources.arsc table.
-    bool modified = false;
-    for (std::unique_ptr<ResourceConfigValue>& configValue : entry->values) {
-        if (configValue->config.sdkVersion != 0 && configValue->config.sdkVersion <= minSdk) {
-            // Override the resource with a Configuration without an SDK.
-            std::unique_ptr<ResourceConfigValue> newValue = util::make_unique<ResourceConfigValue>(
-                    configValue->config.copyWithoutSdkVersion(), configValue->product);
-            newValue->value = std::move(configValue->value);
-            configValue = std::move(newValue);
-
-            modified = true;
+      ConfigDescription configWithoutSdk = config;
+      configWithoutSdk.sdkVersion = 0;
+      auto pred = [&](const std::unique_ptr<ResourceConfigValue>& val) -> bool {
+        // Check that the value hasn't already been marked for removal.
+        if (!val) {
+          return false;
         }
-    }
 
-    if (modified) {
-        // We've modified the keys (ConfigDescription) by changing the sdkVersion to 0.
-        // We MUST re-sort to ensure ordering guarantees hold.
-        std::sort(entry->values.begin(), entry->values.end(),
-                  [](const std::unique_ptr<ResourceConfigValue>& a,
-                     const std::unique_ptr<ResourceConfigValue>& b) -> bool {
-            return a->config.compare(b->config) < 0;
-        });
+        // Only return Configs that differ in SDK version.
+        configWithoutSdk.sdkVersion = val->config.sdkVersion;
+        return configWithoutSdk == val->config &&
+               val->config.sdkVersion <= minSdk;
+      };
+
+      // Remove the rest that match.
+      auto filterIter =
+          makeFilterIterator(iter + 1, entry->values.rend(), pred);
+      while (filterIter.hasNext()) {
+        filterIter.next() = {};
+      }
     }
+  }
+
+  // Now erase the nullptr values.
+  entry->values.erase(
+      std::remove_if(entry->values.begin(), entry->values.end(),
+                     [](const std::unique_ptr<ResourceConfigValue>& val)
+                         -> bool { return val == nullptr; }),
+      entry->values.end());
+
+  // Strip the version qualifiers for every resource with version <= minSdk.
+  // This will ensure
+  // that the resource entries are all packed together in the same ResTable_type
+  // struct
+  // and take up less space in the resources.arsc table.
+  bool modified = false;
+  for (std::unique_ptr<ResourceConfigValue>& configValue : entry->values) {
+    if (configValue->config.sdkVersion != 0 &&
+        configValue->config.sdkVersion <= minSdk) {
+      // Override the resource with a Configuration without an SDK.
+      std::unique_ptr<ResourceConfigValue> newValue =
+          util::make_unique<ResourceConfigValue>(
+              configValue->config.copyWithoutSdkVersion(),
+              configValue->product);
+      newValue->value = std::move(configValue->value);
+      configValue = std::move(newValue);
+
+      modified = true;
+    }
+  }
+
+  if (modified) {
+    // We've modified the keys (ConfigDescription) by changing the sdkVersion to
+    // 0.
+    // We MUST re-sort to ensure ordering guarantees hold.
+    std::sort(entry->values.begin(), entry->values.end(),
+              [](const std::unique_ptr<ResourceConfigValue>& a,
+                 const std::unique_ptr<ResourceConfigValue>& b) -> bool {
+                return a->config.compare(b->config) < 0;
+              });
+  }
 }
 
 bool VersionCollapser::consume(IAaptContext* context, ResourceTable* table) {
-    const int minSdk = context->getMinSdkVersion();
-    for (auto& package : table->packages) {
-        for (auto& type : package->types) {
-            for (auto& entry : type->entries) {
-                collapseVersions(minSdk, entry.get());
-            }
-        }
+  const int minSdk = context->getMinSdkVersion();
+  for (auto& package : table->packages) {
+    for (auto& type : package->types) {
+      for (auto& entry : type->entries) {
+        collapseVersions(minSdk, entry.get());
+      }
     }
-    return true;
+  }
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/VersionCollapser_test.cpp b/tools/aapt2/link/VersionCollapser_test.cpp
index dd5f1d1..c0e0ddb 100644
--- a/tools/aapt2/link/VersionCollapser_test.cpp
+++ b/tools/aapt2/link/VersionCollapser_test.cpp
@@ -22,82 +22,96 @@
 template <typename T>
 using uptr = std::unique_ptr<T>;
 
-static uptr<ResourceTable> buildTableWithConfigs(const StringPiece& name,
-                                                 std::initializer_list<std::string> list) {
-    test::ResourceTableBuilder builder;
-    for (const std::string& item : list) {
-        builder.addSimple(name, test::parseConfigOrDie(item));
-    }
-    return builder.build();
+static uptr<ResourceTable> buildTableWithConfigs(
+    const StringPiece& name, std::initializer_list<std::string> list) {
+  test::ResourceTableBuilder builder;
+  for (const std::string& item : list) {
+    builder.addSimple(name, test::parseConfigOrDie(item));
+  }
+  return builder.build();
 }
 
 TEST(VersionCollapserTest, CollapseVersions) {
-    uptr<IAaptContext> context = test::ContextBuilder().setMinSdkVersion(7).build();
+  uptr<IAaptContext> context =
+      test::ContextBuilder().setMinSdkVersion(7).build();
 
-    const StringPiece resName = "@android:string/foo";
+  const StringPiece resName = "@android:string/foo";
 
-    uptr<ResourceTable> table =
-            buildTableWithConfigs(resName,
-                                  { "land-v4", "land-v5", "sw600dp", "land-v6",
-                                          "land-v14", "land-v21" });
+  uptr<ResourceTable> table = buildTableWithConfigs(
+      resName,
+      {"land-v4", "land-v5", "sw600dp", "land-v6", "land-v14", "land-v21"});
 
-    VersionCollapser collapser;
-    ASSERT_TRUE(collapser.consume(context.get(), table.get()));
+  VersionCollapser collapser;
+  ASSERT_TRUE(collapser.consume(context.get(), table.get()));
 
-    // These should be removed.
-    EXPECT_EQ(nullptr,
-              test::getValueForConfig<Id>(table.get(), resName, test::parseConfigOrDie("land-v4")));
-    EXPECT_EQ(nullptr,
-              test::getValueForConfig<Id>(table.get(), resName, test::parseConfigOrDie("land-v5")));
-    // This one should be removed because it was renamed to 'land', with the version dropped.
-    EXPECT_EQ(nullptr,
-              test::getValueForConfig<Id>(table.get(), resName, test::parseConfigOrDie("land-v6")));
+  // These should be removed.
+  EXPECT_EQ(nullptr,
+            test::getValueForConfig<Id>(table.get(), resName,
+                                        test::parseConfigOrDie("land-v4")));
+  EXPECT_EQ(nullptr,
+            test::getValueForConfig<Id>(table.get(), resName,
+                                        test::parseConfigOrDie("land-v5")));
+  // This one should be removed because it was renamed to 'land', with the
+  // version dropped.
+  EXPECT_EQ(nullptr,
+            test::getValueForConfig<Id>(table.get(), resName,
+                                        test::parseConfigOrDie("land-v6")));
 
-    // These should remain.
-    EXPECT_NE(nullptr,
-              test::getValueForConfig<Id>(table.get(), resName, test::parseConfigOrDie("sw600dp")));
+  // These should remain.
+  EXPECT_NE(nullptr,
+            test::getValueForConfig<Id>(table.get(), resName,
+                                        test::parseConfigOrDie("sw600dp")));
 
-    // 'land' should be present because it was renamed from 'land-v6'.
-    EXPECT_NE(nullptr,
-              test::getValueForConfig<Id>(table.get(), resName, test::parseConfigOrDie("land")));
-    EXPECT_NE(nullptr,
-              test::getValueForConfig<Id>(table.get(), resName, test::parseConfigOrDie("land-v14")));
-    EXPECT_NE(nullptr,
-              test::getValueForConfig<Id>(table.get(), resName, test::parseConfigOrDie("land-v21")));
+  // 'land' should be present because it was renamed from 'land-v6'.
+  EXPECT_NE(nullptr, test::getValueForConfig<Id>(
+                         table.get(), resName, test::parseConfigOrDie("land")));
+  EXPECT_NE(nullptr,
+            test::getValueForConfig<Id>(table.get(), resName,
+                                        test::parseConfigOrDie("land-v14")));
+  EXPECT_NE(nullptr,
+            test::getValueForConfig<Id>(table.get(), resName,
+                                        test::parseConfigOrDie("land-v21")));
 }
 
 TEST(VersionCollapserTest, CollapseVersionsWhenMinSdkIsHighest) {
-    uptr<IAaptContext> context = test::ContextBuilder().setMinSdkVersion(21).build();
+  uptr<IAaptContext> context =
+      test::ContextBuilder().setMinSdkVersion(21).build();
 
-    const StringPiece resName = "@android:string/foo";
+  const StringPiece resName = "@android:string/foo";
 
-    uptr<ResourceTable> table =
-                buildTableWithConfigs(resName,
-                                      { "land-v4", "land-v5", "sw600dp", "land-v6",
-                                              "land-v14", "land-v21", "land-v22" });
-    VersionCollapser collapser;
-    ASSERT_TRUE(collapser.consume(context.get(), table.get()));
+  uptr<ResourceTable> table = buildTableWithConfigs(
+      resName, {"land-v4", "land-v5", "sw600dp", "land-v6", "land-v14",
+                "land-v21", "land-v22"});
+  VersionCollapser collapser;
+  ASSERT_TRUE(collapser.consume(context.get(), table.get()));
 
-    // These should all be removed.
-    EXPECT_EQ(nullptr, test::getValueForConfig<Id>(table.get(), resName,
-                                                   test::parseConfigOrDie("land-v4")));
-    EXPECT_EQ(nullptr, test::getValueForConfig<Id>(table.get(), resName,
-                                                   test::parseConfigOrDie("land-v5")));
-    EXPECT_EQ(nullptr, test::getValueForConfig<Id>(table.get(), resName,
-                                                   test::parseConfigOrDie("land-v6")));
-    EXPECT_EQ(nullptr, test::getValueForConfig<Id>(table.get(), resName,
-                                                   test::parseConfigOrDie("land-v14")));
+  // These should all be removed.
+  EXPECT_EQ(nullptr,
+            test::getValueForConfig<Id>(table.get(), resName,
+                                        test::parseConfigOrDie("land-v4")));
+  EXPECT_EQ(nullptr,
+            test::getValueForConfig<Id>(table.get(), resName,
+                                        test::parseConfigOrDie("land-v5")));
+  EXPECT_EQ(nullptr,
+            test::getValueForConfig<Id>(table.get(), resName,
+                                        test::parseConfigOrDie("land-v6")));
+  EXPECT_EQ(nullptr,
+            test::getValueForConfig<Id>(table.get(), resName,
+                                        test::parseConfigOrDie("land-v14")));
 
-    // These should remain.
-    EXPECT_NE(nullptr, test::getValueForConfig<Id>(
-            table.get(), resName, test::parseConfigOrDie("sw600dp").copyWithoutSdkVersion()));
+  // These should remain.
+  EXPECT_NE(nullptr,
+            test::getValueForConfig<Id>(
+                table.get(), resName,
+                test::parseConfigOrDie("sw600dp").copyWithoutSdkVersion()));
 
-    // land-v21 should have been converted to land.
-    EXPECT_NE(nullptr, test::getValueForConfig<Id>(table.get(), resName,
-                                                   test::parseConfigOrDie("land")));
-    // land-v22 should remain as-is.
-    EXPECT_NE(nullptr, test::getValueForConfig<Id>(table.get(), resName,
-                                                   test::parseConfigOrDie("land-v22")));
+  // land-v21 should have been converted to land.
+  EXPECT_NE(nullptr, test::getValueForConfig<Id>(
+                         table.get(), resName, test::parseConfigOrDie("land")));
+  // land-v22 should remain as-is.
+  EXPECT_NE(nullptr,
+            test::getValueForConfig<Id>(table.get(), resName,
+                                        test::parseConfigOrDie("land-v22")));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/XmlNamespaceRemover.cpp b/tools/aapt2/link/XmlNamespaceRemover.cpp
index 9f95177..6e8d80d 100644
--- a/tools/aapt2/link/XmlNamespaceRemover.cpp
+++ b/tools/aapt2/link/XmlNamespaceRemover.cpp
@@ -27,57 +27,59 @@
  * Visits each xml Node, removing URI references and nested namespaces.
  */
 class XmlVisitor : public xml::Visitor {
-public:
-    XmlVisitor(bool keepUris) : mKeepUris(keepUris) {
-    }
+ public:
+  XmlVisitor(bool keepUris) : mKeepUris(keepUris) {}
 
-    void visit(xml::Element* el) override {
-        // Strip namespaces
-        for (auto& child : el->children) {
-            while (child && xml::nodeCast<xml::Namespace>(child.get())) {
-                if (child->children.empty()) {
-                    child = {};
-                } else {
-                    child = std::move(child->children.front());
-                    child->parent = el;
-                }
-            }
+  void visit(xml::Element* el) override {
+    // Strip namespaces
+    for (auto& child : el->children) {
+      while (child && xml::nodeCast<xml::Namespace>(child.get())) {
+        if (child->children.empty()) {
+          child = {};
+        } else {
+          child = std::move(child->children.front());
+          child->parent = el;
         }
-        el->children.erase(std::remove_if(el->children.begin(), el->children.end(),
-                [](const std::unique_ptr<xml::Node>& child) -> bool {
-            return child == nullptr;
-        }), el->children.end());
-
-        if (!mKeepUris) {
-            for (xml::Attribute& attr : el->attributes) {
-                attr.namespaceUri = std::string();
-            }
-            el->namespaceUri = std::string();
-        }
-        xml::Visitor::visit(el);
+      }
     }
+    el->children.erase(
+        std::remove_if(el->children.begin(), el->children.end(),
+                       [](const std::unique_ptr<xml::Node>& child) -> bool {
+                         return child == nullptr;
+                       }),
+        el->children.end());
 
-private:
-    bool mKeepUris;
+    if (!mKeepUris) {
+      for (xml::Attribute& attr : el->attributes) {
+        attr.namespaceUri = std::string();
+      }
+      el->namespaceUri = std::string();
+    }
+    xml::Visitor::visit(el);
+  }
+
+ private:
+  bool mKeepUris;
 };
 
-} // namespace
+}  // namespace
 
-bool XmlNamespaceRemover::consume(IAaptContext* context, xml::XmlResource* resource) {
-    if (!resource->root) {
-        return false;
+bool XmlNamespaceRemover::consume(IAaptContext* context,
+                                  xml::XmlResource* resource) {
+  if (!resource->root) {
+    return false;
+  }
+  // Replace any root namespaces until the root is a non-namespace node
+  while (xml::nodeCast<xml::Namespace>(resource->root.get())) {
+    if (resource->root->children.empty()) {
+      break;
     }
-    // Replace any root namespaces until the root is a non-namespace node
-    while (xml::nodeCast<xml::Namespace>(resource->root.get())) {
-        if (resource->root->children.empty()) {
-            break;
-        }
-        resource->root = std::move(resource->root->children.front());
-        resource->root->parent = nullptr;
-    }
-    XmlVisitor visitor(mKeepUris);
-    resource->root->accept(&visitor);
-    return true;
+    resource->root = std::move(resource->root->children.front());
+    resource->root->parent = nullptr;
+  }
+  XmlVisitor visitor(mKeepUris);
+  resource->root->accept(&visitor);
+  return true;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/XmlNamespaceRemover_test.cpp b/tools/aapt2/link/XmlNamespaceRemover_test.cpp
index e72ea439..d2daaee 100644
--- a/tools/aapt2/link/XmlNamespaceRemover_test.cpp
+++ b/tools/aapt2/link/XmlNamespaceRemover_test.cpp
@@ -20,90 +20,92 @@
 namespace aapt {
 
 class XmlUriTestVisitor : public xml::Visitor {
-public:
-    void visit(xml::Element* el) override {
-        for (const auto& attr : el->attributes) {
-            EXPECT_EQ(std::string(), attr.namespaceUri);
-        }
-        EXPECT_EQ(std::string(), el->namespaceUri);
-        xml::Visitor::visit(el);
+ public:
+  void visit(xml::Element* el) override {
+    for (const auto& attr : el->attributes) {
+      EXPECT_EQ(std::string(), attr.namespaceUri);
     }
+    EXPECT_EQ(std::string(), el->namespaceUri);
+    xml::Visitor::visit(el);
+  }
 
-    void visit(xml::Namespace* ns) override {
-        EXPECT_EQ(std::string(), ns->namespaceUri);
-        xml::Visitor::visit(ns);
-    }
+  void visit(xml::Namespace* ns) override {
+    EXPECT_EQ(std::string(), ns->namespaceUri);
+    xml::Visitor::visit(ns);
+  }
 };
 
 class XmlNamespaceTestVisitor : public xml::Visitor {
-public:
-    void visit(xml::Namespace* ns) override {
-        ADD_FAILURE() << "Detected namespace: "
-                << ns->namespacePrefix << "=\"" << ns->namespaceUri << "\"";
-        xml::Visitor::visit(ns);
-    }
+ public:
+  void visit(xml::Namespace* ns) override {
+    ADD_FAILURE() << "Detected namespace: " << ns->namespacePrefix << "=\""
+                  << ns->namespaceUri << "\"";
+    xml::Visitor::visit(ns);
+  }
 };
 
 class XmlNamespaceRemoverTest : public ::testing::Test {
-public:
-    void SetUp() override {
-        mContext = test::ContextBuilder()
-                .setCompilationPackage("com.app.test")
-                .build();
-    }
+ public:
+  void SetUp() override {
+    mContext =
+        test::ContextBuilder().setCompilationPackage("com.app.test").build();
+  }
 
-protected:
-    std::unique_ptr<IAaptContext> mContext;
+ protected:
+  std::unique_ptr<IAaptContext> mContext;
 };
 
 TEST_F(XmlNamespaceRemoverTest, RemoveUris) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDomForPackageName(mContext.get(), R"EOF(
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDomForPackageName(mContext.get(), R"EOF(
             <View xmlns:android="http://schemas.android.com/apk/res/android"
                   android:text="hello" />)EOF");
 
-    XmlNamespaceRemover remover;
-    ASSERT_TRUE(remover.consume(mContext.get(), doc.get()));
+  XmlNamespaceRemover remover;
+  ASSERT_TRUE(remover.consume(mContext.get(), doc.get()));
 
-    xml::Node* root = doc.get()->root.get();
-    ASSERT_NE(root, nullptr);
+  xml::Node* root = doc.get()->root.get();
+  ASSERT_NE(root, nullptr);
 
-    XmlUriTestVisitor visitor;
-    root->accept(&visitor);
+  XmlUriTestVisitor visitor;
+  root->accept(&visitor);
 }
 
 TEST_F(XmlNamespaceRemoverTest, RemoveNamespaces) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDomForPackageName(mContext.get(), R"EOF(
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDomForPackageName(mContext.get(), R"EOF(
             <View xmlns:android="http://schemas.android.com/apk/res/android"
                   xmlns:foo="http://schemas.android.com/apk/res/foo"
                   foo:bar="foobar"
                   android:text="hello" />)EOF");
 
-    XmlNamespaceRemover remover;
-    ASSERT_TRUE(remover.consume(mContext.get(), doc.get()));
+  XmlNamespaceRemover remover;
+  ASSERT_TRUE(remover.consume(mContext.get(), doc.get()));
 
-    xml::Node* root = doc.get()->root.get();
-    ASSERT_NE(root, nullptr);
+  xml::Node* root = doc.get()->root.get();
+  ASSERT_NE(root, nullptr);
 
-    XmlNamespaceTestVisitor visitor;
-    root->accept(&visitor);
+  XmlNamespaceTestVisitor visitor;
+  root->accept(&visitor);
 }
 
 TEST_F(XmlNamespaceRemoverTest, RemoveNestedNamespaces) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDomForPackageName(mContext.get(), R"EOF(
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDomForPackageName(mContext.get(), R"EOF(
             <View xmlns:android="http://schemas.android.com/apk/res/android"
                   android:text="hello">
               <View xmlns:foo="http://schemas.example.com/foo"
                     android:text="foo"/>
             </View>)EOF");
 
-    XmlNamespaceRemover remover;
-    ASSERT_TRUE(remover.consume(mContext.get(), doc.get()));
+  XmlNamespaceRemover remover;
+  ASSERT_TRUE(remover.consume(mContext.get(), doc.get()));
 
-    xml::Node* root = doc.get()->root.get();
-    ASSERT_NE(root, nullptr);
+  xml::Node* root = doc.get()->root.get();
+  ASSERT_NE(root, nullptr);
 
-    XmlNamespaceTestVisitor visitor;
-    root->accept(&visitor);
+  XmlNamespaceTestVisitor visitor;
+  root->accept(&visitor);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/XmlReferenceLinker.cpp b/tools/aapt2/link/XmlReferenceLinker.cpp
index 59ffe15..945f98a 100644
--- a/tools/aapt2/link/XmlReferenceLinker.cpp
+++ b/tools/aapt2/link/XmlReferenceLinker.cpp
@@ -29,146 +29,156 @@
 namespace {
 
 /**
- * Visits all references (including parents of styles, references in styles, arrays, etc) and
- * links their symbolic name to their Resource ID, performing mangling and package aliasing
+ * Visits all references (including parents of styles, references in styles,
+ * arrays, etc) and
+ * links their symbolic name to their Resource ID, performing mangling and
+ * package aliasing
  * as needed.
  */
 class ReferenceVisitor : public ValueVisitor {
-public:
-    using ValueVisitor::visit;
+ public:
+  using ValueVisitor::visit;
 
-    ReferenceVisitor(IAaptContext* context, SymbolTable* symbols, xml::IPackageDeclStack* decls,
-                     CallSite* callSite) :
-             mContext(context), mSymbols(symbols), mDecls(decls), mCallSite(callSite),
-             mError(false) {
+  ReferenceVisitor(IAaptContext* context, SymbolTable* symbols,
+                   xml::IPackageDeclStack* decls, CallSite* callSite)
+      : mContext(context),
+        mSymbols(symbols),
+        mDecls(decls),
+        mCallSite(callSite),
+        mError(false) {}
+
+  void visit(Reference* ref) override {
+    if (!ReferenceLinker::linkReference(ref, mContext, mSymbols, mDecls,
+                                        mCallSite)) {
+      mError = true;
     }
+  }
 
-    void visit(Reference* ref) override {
-        if (!ReferenceLinker::linkReference(ref, mContext, mSymbols, mDecls, mCallSite)) {
-            mError = true;
-        }
-    }
+  bool hasError() const { return mError; }
 
-    bool hasError() const {
-        return mError;
-    }
-
-private:
-    IAaptContext* mContext;
-    SymbolTable* mSymbols;
-    xml::IPackageDeclStack* mDecls;
-    CallSite* mCallSite;
-    bool mError;
+ private:
+  IAaptContext* mContext;
+  SymbolTable* mSymbols;
+  xml::IPackageDeclStack* mDecls;
+  CallSite* mCallSite;
+  bool mError;
 };
 
 /**
  * Visits each xml Element and compiles the attributes within.
  */
 class XmlVisitor : public xml::PackageAwareVisitor {
-public:
-    using xml::PackageAwareVisitor::visit;
+ public:
+  using xml::PackageAwareVisitor::visit;
 
-    XmlVisitor(IAaptContext* context, SymbolTable* symbols, const Source& source,
-               std::set<int>* sdkLevelsFound, CallSite* callSite) :
-            mContext(context), mSymbols(symbols), mSource(source), mSdkLevelsFound(sdkLevelsFound),
-            mCallSite(callSite), mReferenceVisitor(context, symbols, this, callSite) {
-    }
+  XmlVisitor(IAaptContext* context, SymbolTable* symbols, const Source& source,
+             std::set<int>* sdkLevelsFound, CallSite* callSite)
+      : mContext(context),
+        mSymbols(symbols),
+        mSource(source),
+        mSdkLevelsFound(sdkLevelsFound),
+        mCallSite(callSite),
+        mReferenceVisitor(context, symbols, this, callSite) {}
 
-    void visit(xml::Element* el) override {
-        const Source source = mSource.withLine(el->lineNumber);
-        for (xml::Attribute& attr : el->attributes) {
-            Maybe<xml::ExtractedPackage> maybePackage =
-                    xml::extractPackageFromNamespace(attr.namespaceUri);
-            if (maybePackage) {
-                // There is a valid package name for this attribute. We will look this up.
-                StringPiece package = maybePackage.value().package;
-                if (package.empty()) {
-                    // Empty package means the 'current' or 'local' package.
-                    package = mContext->getCompilationPackage();
-                }
-
-                Reference attrRef(ResourceNameRef(package, ResourceType::kAttr, attr.name));
-                attrRef.privateReference = maybePackage.value().privateNamespace;
-
-                std::string errStr;
-                attr.compiledAttribute = ReferenceLinker::compileXmlAttribute(
-                        attrRef, mContext->getNameMangler(), mSymbols, mCallSite, &errStr);
-
-                // Convert the string value into a compiled Value if this is a valid attribute.
-                if (attr.compiledAttribute) {
-                    if (attr.compiledAttribute.value().id) {
-                        // Record all SDK levels from which the attributes were defined.
-                        const size_t sdkLevel = findAttributeSdkLevel(
-                                attr.compiledAttribute.value().id.value());
-                        if (sdkLevel > 1) {
-                            mSdkLevelsFound->insert(sdkLevel);
-                        }
-                    }
-
-                    const Attribute* attribute = &attr.compiledAttribute.value().attribute;
-                    attr.compiledValue = ResourceUtils::tryParseItemForAttribute(attr.value,
-                                                                              attribute);
-                    if (!attr.compiledValue &&
-                            !(attribute->typeMask & android::ResTable_map::TYPE_STRING)) {
-                        // We won't be able to encode this as a string.
-                        mContext->getDiagnostics()->error(
-                                DiagMessage(source) << "'" << attr.value << "' "
-                                                    << "is incompatible with attribute "
-                                                    << package << ":" << attr.name << " "
-                                                    << *attribute);
-                        mError = true;
-                    }
-
-                } else {
-                    mContext->getDiagnostics()->error(DiagMessage(source)
-                                                      << "attribute '" << package << ":"
-                                                      << attr.name << "' " << errStr);
-                    mError = true;
-
-                }
-            } else if (!attr.compiledValue) {
-                // We still encode references, but only if we haven't manually set this to
-                // another compiled value.
-                attr.compiledValue = ResourceUtils::tryParseReference(attr.value);
-            }
-
-            if (attr.compiledValue) {
-                // With a compiledValue, we must resolve the reference and assign it an ID.
-                attr.compiledValue->setSource(source);
-                attr.compiledValue->accept(&mReferenceVisitor);
-            }
+  void visit(xml::Element* el) override {
+    const Source source = mSource.withLine(el->lineNumber);
+    for (xml::Attribute& attr : el->attributes) {
+      Maybe<xml::ExtractedPackage> maybePackage =
+          xml::extractPackageFromNamespace(attr.namespaceUri);
+      if (maybePackage) {
+        // There is a valid package name for this attribute. We will look this
+        // up.
+        StringPiece package = maybePackage.value().package;
+        if (package.empty()) {
+          // Empty package means the 'current' or 'local' package.
+          package = mContext->getCompilationPackage();
         }
 
-        // Call the super implementation.
-        xml::PackageAwareVisitor::visit(el);
+        Reference attrRef(
+            ResourceNameRef(package, ResourceType::kAttr, attr.name));
+        attrRef.privateReference = maybePackage.value().privateNamespace;
+
+        std::string errStr;
+        attr.compiledAttribute = ReferenceLinker::compileXmlAttribute(
+            attrRef, mContext->getNameMangler(), mSymbols, mCallSite, &errStr);
+
+        // Convert the string value into a compiled Value if this is a valid
+        // attribute.
+        if (attr.compiledAttribute) {
+          if (attr.compiledAttribute.value().id) {
+            // Record all SDK levels from which the attributes were defined.
+            const size_t sdkLevel = findAttributeSdkLevel(
+                attr.compiledAttribute.value().id.value());
+            if (sdkLevel > 1) {
+              mSdkLevelsFound->insert(sdkLevel);
+            }
+          }
+
+          const Attribute* attribute =
+              &attr.compiledAttribute.value().attribute;
+          attr.compiledValue =
+              ResourceUtils::tryParseItemForAttribute(attr.value, attribute);
+          if (!attr.compiledValue &&
+              !(attribute->typeMask & android::ResTable_map::TYPE_STRING)) {
+            // We won't be able to encode this as a string.
+            mContext->getDiagnostics()->error(
+                DiagMessage(source) << "'" << attr.value << "' "
+                                    << "is incompatible with attribute "
+                                    << package << ":" << attr.name << " "
+                                    << *attribute);
+            mError = true;
+          }
+
+        } else {
+          mContext->getDiagnostics()->error(DiagMessage(source)
+                                            << "attribute '" << package << ":"
+                                            << attr.name << "' " << errStr);
+          mError = true;
+        }
+      } else if (!attr.compiledValue) {
+        // We still encode references, but only if we haven't manually set this
+        // to
+        // another compiled value.
+        attr.compiledValue = ResourceUtils::tryParseReference(attr.value);
+      }
+
+      if (attr.compiledValue) {
+        // With a compiledValue, we must resolve the reference and assign it an
+        // ID.
+        attr.compiledValue->setSource(source);
+        attr.compiledValue->accept(&mReferenceVisitor);
+      }
     }
 
-    bool hasError() {
-        return mError || mReferenceVisitor.hasError();
-    }
+    // Call the super implementation.
+    xml::PackageAwareVisitor::visit(el);
+  }
 
-private:
-    IAaptContext* mContext;
-    SymbolTable* mSymbols;
-    Source mSource;
-    std::set<int>* mSdkLevelsFound;
-    CallSite* mCallSite;
-    ReferenceVisitor mReferenceVisitor;
-    bool mError = false;
+  bool hasError() { return mError || mReferenceVisitor.hasError(); }
+
+ private:
+  IAaptContext* mContext;
+  SymbolTable* mSymbols;
+  Source mSource;
+  std::set<int>* mSdkLevelsFound;
+  CallSite* mCallSite;
+  ReferenceVisitor mReferenceVisitor;
+  bool mError = false;
 };
 
-} // namespace
+}  // namespace
 
-bool XmlReferenceLinker::consume(IAaptContext* context, xml::XmlResource* resource) {
-    mSdkLevelsFound.clear();
-    CallSite callSite = { resource->file.name };
-    XmlVisitor visitor(context, context->getExternalSymbols(), resource->file.source,
-                       &mSdkLevelsFound, &callSite);
-    if (resource->root) {
-        resource->root->accept(&visitor);
-        return !visitor.hasError();
-    }
-    return false;
+bool XmlReferenceLinker::consume(IAaptContext* context,
+                                 xml::XmlResource* resource) {
+  mSdkLevelsFound.clear();
+  CallSite callSite = {resource->file.name};
+  XmlVisitor visitor(context, context->getExternalSymbols(),
+                     resource->file.source, &mSdkLevelsFound, &callSite);
+  if (resource->root) {
+    resource->root->accept(&visitor);
+    return !visitor.hasError();
+  }
+  return false;
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/link/XmlReferenceLinker_test.cpp b/tools/aapt2/link/XmlReferenceLinker_test.cpp
index 51eb62c..35d479f 100644
--- a/tools/aapt2/link/XmlReferenceLinker_test.cpp
+++ b/tools/aapt2/link/XmlReferenceLinker_test.cpp
@@ -20,237 +20,276 @@
 namespace aapt {
 
 class XmlReferenceLinkerTest : public ::testing::Test {
-public:
-    void SetUp() override {
-        mContext = test::ContextBuilder()
-                .setCompilationPackage("com.app.test")
-                .setNameManglerPolicy(
-                        NameManglerPolicy{ "com.app.test", { "com.android.support" } })
-                .addSymbolSource(test::StaticSymbolSourceBuilder()
-                        .addPublicSymbol("android:attr/layout_width", ResourceId(0x01010000),
-                                   test::AttributeBuilder()
-                                        .setTypeMask(android::ResTable_map::TYPE_ENUM |
-                                                     android::ResTable_map::TYPE_DIMENSION)
-                                        .addItem("match_parent", 0xffffffff)
-                                        .build())
-                        .addPublicSymbol("android:attr/background", ResourceId(0x01010001),
-                                   test::AttributeBuilder()
-                                        .setTypeMask(android::ResTable_map::TYPE_COLOR).build())
-                        .addPublicSymbol("android:attr/attr", ResourceId(0x01010002),
-                                   test::AttributeBuilder().build())
-                        .addPublicSymbol("android:attr/text", ResourceId(0x01010003),
-                                   test::AttributeBuilder()
-                                        .setTypeMask(android::ResTable_map::TYPE_STRING)
-                                        .build())
+ public:
+  void SetUp() override {
+    mContext =
+        test::ContextBuilder()
+            .setCompilationPackage("com.app.test")
+            .setNameManglerPolicy(
+                NameManglerPolicy{"com.app.test", {"com.android.support"}})
+            .addSymbolSource(
+                test::StaticSymbolSourceBuilder()
+                    .addPublicSymbol(
+                        "android:attr/layout_width", ResourceId(0x01010000),
+                        test::AttributeBuilder()
+                            .setTypeMask(android::ResTable_map::TYPE_ENUM |
+                                         android::ResTable_map::TYPE_DIMENSION)
+                            .addItem("match_parent", 0xffffffff)
+                            .build())
+                    .addPublicSymbol(
+                        "android:attr/background", ResourceId(0x01010001),
+                        test::AttributeBuilder()
+                            .setTypeMask(android::ResTable_map::TYPE_COLOR)
+                            .build())
+                    .addPublicSymbol("android:attr/attr",
+                                     ResourceId(0x01010002),
+                                     test::AttributeBuilder().build())
+                    .addPublicSymbol(
+                        "android:attr/text", ResourceId(0x01010003),
+                        test::AttributeBuilder()
+                            .setTypeMask(android::ResTable_map::TYPE_STRING)
+                            .build())
 
-                         // Add one real symbol that was introduces in v21
-                        .addPublicSymbol("android:attr/colorAccent", ResourceId(0x01010435),
-                                   test::AttributeBuilder().build())
+                    // Add one real symbol that was introduces in v21
+                    .addPublicSymbol("android:attr/colorAccent",
+                                     ResourceId(0x01010435),
+                                     test::AttributeBuilder().build())
 
-                        // Private symbol.
-                        .addSymbol("android:color/hidden", ResourceId(0x01020001))
+                    // Private symbol.
+                    .addSymbol("android:color/hidden", ResourceId(0x01020001))
 
-                        .addPublicSymbol("android:id/id", ResourceId(0x01030000))
-                        .addSymbol("com.app.test:id/id", ResourceId(0x7f030000))
-                        .addSymbol("com.app.test:color/green", ResourceId(0x7f020000))
-                        .addSymbol("com.app.test:color/red", ResourceId(0x7f020001))
-                        .addSymbol("com.app.test:attr/colorAccent", ResourceId(0x7f010000),
-                                   test::AttributeBuilder()
-                                       .setTypeMask(android::ResTable_map::TYPE_COLOR).build())
-                        .addPublicSymbol("com.app.test:attr/com.android.support$colorAccent",
-                                   ResourceId(0x7f010001), test::AttributeBuilder()
-                                       .setTypeMask(android::ResTable_map::TYPE_COLOR).build())
-                        .addPublicSymbol("com.app.test:attr/attr", ResourceId(0x7f010002),
-                                   test::AttributeBuilder().build())
-                        .build())
-                .build();
-    }
+                    .addPublicSymbol("android:id/id", ResourceId(0x01030000))
+                    .addSymbol("com.app.test:id/id", ResourceId(0x7f030000))
+                    .addSymbol("com.app.test:color/green",
+                               ResourceId(0x7f020000))
+                    .addSymbol("com.app.test:color/red", ResourceId(0x7f020001))
+                    .addSymbol(
+                        "com.app.test:attr/colorAccent", ResourceId(0x7f010000),
+                        test::AttributeBuilder()
+                            .setTypeMask(android::ResTable_map::TYPE_COLOR)
+                            .build())
+                    .addPublicSymbol(
+                        "com.app.test:attr/com.android.support$colorAccent",
+                        ResourceId(0x7f010001),
+                        test::AttributeBuilder()
+                            .setTypeMask(android::ResTable_map::TYPE_COLOR)
+                            .build())
+                    .addPublicSymbol("com.app.test:attr/attr",
+                                     ResourceId(0x7f010002),
+                                     test::AttributeBuilder().build())
+                    .build())
+            .build();
+  }
 
-protected:
-    std::unique_ptr<IAaptContext> mContext;
+ protected:
+  std::unique_ptr<IAaptContext> mContext;
 };
 
 TEST_F(XmlReferenceLinkerTest, LinkBasicAttributes) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDomForPackageName(mContext.get(), R"EOF(
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDomForPackageName(mContext.get(), R"EOF(
         <View xmlns:android="http://schemas.android.com/apk/res/android"
               android:layout_width="match_parent"
               android:background="@color/green"
               android:text="hello"
               class="hello" />)EOF");
 
-    XmlReferenceLinker linker;
-    ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
+  XmlReferenceLinker linker;
+  ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
 
-    xml::Element* viewEl = xml::findRootElement(doc.get());
-    ASSERT_NE(viewEl, nullptr);
+  xml::Element* viewEl = xml::findRootElement(doc.get());
+  ASSERT_NE(viewEl, nullptr);
 
-    xml::Attribute* xmlAttr = viewEl->findAttribute(xml::kSchemaAndroid, "layout_width");
-    ASSERT_NE(xmlAttr, nullptr);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
-    EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(), ResourceId(0x01010000));
-    ASSERT_NE(xmlAttr->compiledValue, nullptr);
-    ASSERT_NE(valueCast<BinaryPrimitive>(xmlAttr->compiledValue.get()), nullptr);
+  xml::Attribute* xmlAttr =
+      viewEl->findAttribute(xml::kSchemaAndroid, "layout_width");
+  ASSERT_NE(xmlAttr, nullptr);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
+  EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(),
+            ResourceId(0x01010000));
+  ASSERT_NE(xmlAttr->compiledValue, nullptr);
+  ASSERT_NE(valueCast<BinaryPrimitive>(xmlAttr->compiledValue.get()), nullptr);
 
-    xmlAttr = viewEl->findAttribute(xml::kSchemaAndroid, "background");
-    ASSERT_NE(xmlAttr, nullptr);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
-    EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(), ResourceId(0x01010001));
-    ASSERT_NE(xmlAttr->compiledValue, nullptr);
-    Reference* ref = valueCast<Reference>(xmlAttr->compiledValue.get());
-    ASSERT_NE(ref, nullptr);
-    AAPT_ASSERT_TRUE(ref->name);
-    EXPECT_EQ(ref->name.value(), test::parseNameOrDie("color/green")); // Make sure the name
-                                                                        // didn't change.
-    AAPT_ASSERT_TRUE(ref->id);
-    EXPECT_EQ(ref->id.value(), ResourceId(0x7f020000));
+  xmlAttr = viewEl->findAttribute(xml::kSchemaAndroid, "background");
+  ASSERT_NE(xmlAttr, nullptr);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
+  EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(),
+            ResourceId(0x01010001));
+  ASSERT_NE(xmlAttr->compiledValue, nullptr);
+  Reference* ref = valueCast<Reference>(xmlAttr->compiledValue.get());
+  ASSERT_NE(ref, nullptr);
+  AAPT_ASSERT_TRUE(ref->name);
+  EXPECT_EQ(ref->name.value(),
+            test::parseNameOrDie("color/green"));  // Make sure the name
+                                                   // didn't change.
+  AAPT_ASSERT_TRUE(ref->id);
+  EXPECT_EQ(ref->id.value(), ResourceId(0x7f020000));
 
-    xmlAttr = viewEl->findAttribute(xml::kSchemaAndroid, "text");
-    ASSERT_NE(xmlAttr, nullptr);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
-    ASSERT_FALSE(xmlAttr->compiledValue);   // Strings don't get compiled for memory sake.
+  xmlAttr = viewEl->findAttribute(xml::kSchemaAndroid, "text");
+  ASSERT_NE(xmlAttr, nullptr);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
+  ASSERT_FALSE(
+      xmlAttr->compiledValue);  // Strings don't get compiled for memory sake.
 
-    xmlAttr = viewEl->findAttribute("", "class");
-    ASSERT_NE(xmlAttr, nullptr);
-    AAPT_ASSERT_FALSE(xmlAttr->compiledAttribute);
-    ASSERT_EQ(xmlAttr->compiledValue, nullptr);
+  xmlAttr = viewEl->findAttribute("", "class");
+  ASSERT_NE(xmlAttr, nullptr);
+  AAPT_ASSERT_FALSE(xmlAttr->compiledAttribute);
+  ASSERT_EQ(xmlAttr->compiledValue, nullptr);
 }
 
 TEST_F(XmlReferenceLinkerTest, PrivateSymbolsAreNotLinked) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDomForPackageName(mContext.get(), R"EOF(
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDomForPackageName(mContext.get(), R"EOF(
         <View xmlns:android="http://schemas.android.com/apk/res/android"
               android:colorAccent="@android:color/hidden" />)EOF");
 
-    XmlReferenceLinker linker;
-    ASSERT_FALSE(linker.consume(mContext.get(), doc.get()));
+  XmlReferenceLinker linker;
+  ASSERT_FALSE(linker.consume(mContext.get(), doc.get()));
 }
 
-TEST_F(XmlReferenceLinkerTest, PrivateSymbolsAreLinkedWhenReferenceHasStarPrefix) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDomForPackageName(mContext.get(), R"EOF(
+TEST_F(XmlReferenceLinkerTest,
+       PrivateSymbolsAreLinkedWhenReferenceHasStarPrefix) {
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDomForPackageName(mContext.get(), R"EOF(
     <View xmlns:android="http://schemas.android.com/apk/res/android"
           android:colorAccent="@*android:color/hidden" />)EOF");
 
-    XmlReferenceLinker linker;
-    ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
+  XmlReferenceLinker linker;
+  ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
 }
 
 TEST_F(XmlReferenceLinkerTest, SdkLevelsAreRecorded) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDomForPackageName(mContext.get(), R"EOF(
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDomForPackageName(mContext.get(), R"EOF(
         <View xmlns:android="http://schemas.android.com/apk/res/android"
               android:colorAccent="#ffffff" />)EOF");
 
-    XmlReferenceLinker linker;
-    ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
-    EXPECT_TRUE(linker.getSdkLevels().count(21) == 1);
+  XmlReferenceLinker linker;
+  ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
+  EXPECT_TRUE(linker.getSdkLevels().count(21) == 1);
 }
 
 TEST_F(XmlReferenceLinkerTest, LinkMangledAttributes) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDomForPackageName(mContext.get(), R"EOF(
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDomForPackageName(mContext.get(), R"EOF(
             <View xmlns:support="http://schemas.android.com/apk/res/com.android.support"
                   support:colorAccent="#ff0000" />)EOF");
 
-    XmlReferenceLinker linker;
-    ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
+  XmlReferenceLinker linker;
+  ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
 
-    xml::Element* viewEl = xml::findRootElement(doc.get());
-    ASSERT_NE(viewEl, nullptr);
+  xml::Element* viewEl = xml::findRootElement(doc.get());
+  ASSERT_NE(viewEl, nullptr);
 
-    xml::Attribute* xmlAttr = viewEl->findAttribute(
-            xml::buildPackageNamespace("com.android.support"), "colorAccent");
-    ASSERT_NE(xmlAttr, nullptr);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
-    EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(), ResourceId(0x7f010001));
-    ASSERT_NE(valueCast<BinaryPrimitive>(xmlAttr->compiledValue.get()), nullptr);
+  xml::Attribute* xmlAttr = viewEl->findAttribute(
+      xml::buildPackageNamespace("com.android.support"), "colorAccent");
+  ASSERT_NE(xmlAttr, nullptr);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
+  EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(),
+            ResourceId(0x7f010001));
+  ASSERT_NE(valueCast<BinaryPrimitive>(xmlAttr->compiledValue.get()), nullptr);
 }
 
 TEST_F(XmlReferenceLinkerTest, LinkAutoResReference) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDomForPackageName(mContext.get(), R"EOF(
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDomForPackageName(mContext.get(), R"EOF(
             <View xmlns:app="http://schemas.android.com/apk/res-auto"
                   app:colorAccent="@app:color/red" />)EOF");
 
-    XmlReferenceLinker linker;
-    ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
+  XmlReferenceLinker linker;
+  ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
 
-    xml::Element* viewEl = xml::findRootElement(doc.get());
-    ASSERT_NE(viewEl, nullptr);
+  xml::Element* viewEl = xml::findRootElement(doc.get());
+  ASSERT_NE(viewEl, nullptr);
 
-    xml::Attribute* xmlAttr = viewEl->findAttribute(xml::kSchemaAuto, "colorAccent");
-    ASSERT_NE(xmlAttr, nullptr);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
-    EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(), ResourceId(0x7f010000));
-    Reference* ref = valueCast<Reference>(xmlAttr->compiledValue.get());
-    ASSERT_NE(ref, nullptr);
-    AAPT_ASSERT_TRUE(ref->name);
-    AAPT_ASSERT_TRUE(ref->id);
-    EXPECT_EQ(ref->id.value(), ResourceId(0x7f020001));
+  xml::Attribute* xmlAttr =
+      viewEl->findAttribute(xml::kSchemaAuto, "colorAccent");
+  ASSERT_NE(xmlAttr, nullptr);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
+  EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(),
+            ResourceId(0x7f010000));
+  Reference* ref = valueCast<Reference>(xmlAttr->compiledValue.get());
+  ASSERT_NE(ref, nullptr);
+  AAPT_ASSERT_TRUE(ref->name);
+  AAPT_ASSERT_TRUE(ref->id);
+  EXPECT_EQ(ref->id.value(), ResourceId(0x7f020001));
 }
 
 TEST_F(XmlReferenceLinkerTest, LinkViewWithShadowedPackageAlias) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDomForPackageName(mContext.get(), R"EOF(
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDomForPackageName(mContext.get(), R"EOF(
             <View xmlns:app="http://schemas.android.com/apk/res/android"
                   app:attr="@app:id/id">
               <View xmlns:app="http://schemas.android.com/apk/res/com.app.test"
                     app:attr="@app:id/id"/>
             </View>)EOF");
 
-    XmlReferenceLinker linker;
-    ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
+  XmlReferenceLinker linker;
+  ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
 
-    xml::Element* viewEl = xml::findRootElement(doc.get());
-    ASSERT_NE(viewEl, nullptr);
+  xml::Element* viewEl = xml::findRootElement(doc.get());
+  ASSERT_NE(viewEl, nullptr);
 
-    // All attributes and references in this element should be referring to "android" (0x01).
-    xml::Attribute* xmlAttr = viewEl->findAttribute(xml::kSchemaAndroid, "attr");
-    ASSERT_NE(xmlAttr, nullptr);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
-    EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(), ResourceId(0x01010002));
-    Reference* ref = valueCast<Reference>(xmlAttr->compiledValue.get());
-    ASSERT_NE(ref, nullptr);
-    AAPT_ASSERT_TRUE(ref->id);
-    EXPECT_EQ(ref->id.value(), ResourceId(0x01030000));
+  // All attributes and references in this element should be referring to
+  // "android" (0x01).
+  xml::Attribute* xmlAttr = viewEl->findAttribute(xml::kSchemaAndroid, "attr");
+  ASSERT_NE(xmlAttr, nullptr);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
+  EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(),
+            ResourceId(0x01010002));
+  Reference* ref = valueCast<Reference>(xmlAttr->compiledValue.get());
+  ASSERT_NE(ref, nullptr);
+  AAPT_ASSERT_TRUE(ref->id);
+  EXPECT_EQ(ref->id.value(), ResourceId(0x01030000));
 
-    ASSERT_FALSE(viewEl->getChildElements().empty());
-    viewEl = viewEl->getChildElements().front();
-    ASSERT_NE(viewEl, nullptr);
+  ASSERT_FALSE(viewEl->getChildElements().empty());
+  viewEl = viewEl->getChildElements().front();
+  ASSERT_NE(viewEl, nullptr);
 
-    // All attributes and references in this element should be referring to "com.app.test" (0x7f).
-    xmlAttr = viewEl->findAttribute(xml::buildPackageNamespace("com.app.test"), "attr");
-    ASSERT_NE(xmlAttr, nullptr);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
-    EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(), ResourceId(0x7f010002));
-    ref = valueCast<Reference>(xmlAttr->compiledValue.get());
-    ASSERT_NE(ref, nullptr);
-    AAPT_ASSERT_TRUE(ref->id);
-    EXPECT_EQ(ref->id.value(), ResourceId(0x7f030000));
+  // All attributes and references in this element should be referring to
+  // "com.app.test" (0x7f).
+  xmlAttr =
+      viewEl->findAttribute(xml::buildPackageNamespace("com.app.test"), "attr");
+  ASSERT_NE(xmlAttr, nullptr);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
+  EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(),
+            ResourceId(0x7f010002));
+  ref = valueCast<Reference>(xmlAttr->compiledValue.get());
+  ASSERT_NE(ref, nullptr);
+  AAPT_ASSERT_TRUE(ref->id);
+  EXPECT_EQ(ref->id.value(), ResourceId(0x7f030000));
 }
 
 TEST_F(XmlReferenceLinkerTest, LinkViewWithLocalPackageAndAliasOfTheSameName) {
-    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDomForPackageName(mContext.get(), R"EOF(
+  std::unique_ptr<xml::XmlResource> doc =
+      test::buildXmlDomForPackageName(mContext.get(), R"EOF(
             <View xmlns:android="http://schemas.android.com/apk/res/com.app.test"
                   android:attr="@id/id"/>)EOF");
 
-    XmlReferenceLinker linker;
-    ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
+  XmlReferenceLinker linker;
+  ASSERT_TRUE(linker.consume(mContext.get(), doc.get()));
 
-    xml::Element* viewEl = xml::findRootElement(doc.get());
-    ASSERT_NE(viewEl, nullptr);
+  xml::Element* viewEl = xml::findRootElement(doc.get());
+  ASSERT_NE(viewEl, nullptr);
 
-    // All attributes and references in this element should be referring to "com.app.test" (0x7f).
-    xml::Attribute* xmlAttr = viewEl->findAttribute(xml::buildPackageNamespace("com.app.test"),
-                                                    "attr");
-    ASSERT_NE(xmlAttr, nullptr);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
-    AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
-    EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(), ResourceId(0x7f010002));
-    Reference* ref = valueCast<Reference>(xmlAttr->compiledValue.get());
-    ASSERT_NE(ref, nullptr);
-    AAPT_ASSERT_TRUE(ref->id);
-    EXPECT_EQ(ref->id.value(), ResourceId(0x7f030000));
+  // All attributes and references in this element should be referring to
+  // "com.app.test" (0x7f).
+  xml::Attribute* xmlAttr =
+      viewEl->findAttribute(xml::buildPackageNamespace("com.app.test"), "attr");
+  ASSERT_NE(xmlAttr, nullptr);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute);
+  AAPT_ASSERT_TRUE(xmlAttr->compiledAttribute.value().id);
+  EXPECT_EQ(xmlAttr->compiledAttribute.value().id.value(),
+            ResourceId(0x7f010002));
+  Reference* ref = valueCast<Reference>(xmlAttr->compiledValue.get());
+  ASSERT_NE(ref, nullptr);
+  AAPT_ASSERT_TRUE(ref->id);
+  EXPECT_EQ(ref->id.value(), ResourceId(0x7f030000));
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/process/IResourceTableConsumer.h b/tools/aapt2/process/IResourceTableConsumer.h
index a7e752a..a9bde39 100644
--- a/tools/aapt2/process/IResourceTableConsumer.h
+++ b/tools/aapt2/process/IResourceTableConsumer.h
@@ -33,21 +33,21 @@
 class SymbolTable;
 
 struct IAaptContext {
-    virtual ~IAaptContext() = default;
+  virtual ~IAaptContext() = default;
 
-    virtual SymbolTable* getExternalSymbols() = 0;
-    virtual IDiagnostics* getDiagnostics() = 0;
-    virtual const std::string& getCompilationPackage() = 0;
-    virtual uint8_t getPackageId() = 0;
-    virtual NameMangler* getNameMangler() = 0;
-    virtual bool verbose() = 0;
-    virtual int getMinSdkVersion() = 0;
+  virtual SymbolTable* getExternalSymbols() = 0;
+  virtual IDiagnostics* getDiagnostics() = 0;
+  virtual const std::string& getCompilationPackage() = 0;
+  virtual uint8_t getPackageId() = 0;
+  virtual NameMangler* getNameMangler() = 0;
+  virtual bool verbose() = 0;
+  virtual int getMinSdkVersion() = 0;
 };
 
 struct IResourceTableConsumer {
-    virtual ~IResourceTableConsumer() = default;
+  virtual ~IResourceTableConsumer() = default;
 
-    virtual bool consume(IAaptContext* context, ResourceTable* table) = 0;
+  virtual bool consume(IAaptContext* context, ResourceTable* table) = 0;
 };
 
 namespace xml {
@@ -55,11 +55,11 @@
 }
 
 struct IXmlResourceConsumer {
-    virtual ~IXmlResourceConsumer() = default;
+  virtual ~IXmlResourceConsumer() = default;
 
-    virtual bool consume(IAaptContext* context, xml::XmlResource* resource) = 0;
+  virtual bool consume(IAaptContext* context, xml::XmlResource* resource) = 0;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_PROCESS_IRESOURCETABLECONSUMER_H */
diff --git a/tools/aapt2/process/SymbolTable.cpp b/tools/aapt2/process/SymbolTable.cpp
index 0c92718..00ffeb2 100644
--- a/tools/aapt2/process/SymbolTable.cpp
+++ b/tools/aapt2/process/SymbolTable.cpp
@@ -14,11 +14,11 @@
  * limitations under the License.
  */
 
+#include "process/SymbolTable.h"
 #include "ConfigDescription.h"
 #include "Resource.h"
 #include "ResourceUtils.h"
 #include "ValueVisitor.h"
-#include "process/SymbolTable.h"
 #include "util/Util.h"
 
 #include <androidfw/AssetManager.h>
@@ -27,254 +27,273 @@
 namespace aapt {
 
 void SymbolTable::appendSource(std::unique_ptr<ISymbolSource> source) {
-    mSources.push_back(std::move(source));
+  mSources.push_back(std::move(source));
 
-    // We do not clear the cache, because sources earlier in the list take precedent.
+  // We do not clear the cache, because sources earlier in the list take
+  // precedent.
 }
 
 void SymbolTable::prependSource(std::unique_ptr<ISymbolSource> source) {
-    mSources.insert(mSources.begin(), std::move(source));
+  mSources.insert(mSources.begin(), std::move(source));
 
-    // We must clear the cache in case we did a lookup before adding this resource.
-    mCache.clear();
+  // We must clear the cache in case we did a lookup before adding this
+  // resource.
+  mCache.clear();
 }
 
 const SymbolTable::Symbol* SymbolTable::findByName(const ResourceName& name) {
-    if (const std::shared_ptr<Symbol>& s = mCache.get(name)) {
-        return s.get();
-    }
+  if (const std::shared_ptr<Symbol>& s = mCache.get(name)) {
+    return s.get();
+  }
 
-    // We did not find it in the cache, so look through the sources.
-    for (auto& symbolSource : mSources) {
-        std::unique_ptr<Symbol> symbol = symbolSource->findByName(name);
-        if (symbol) {
-            // Take ownership of the symbol into a shared_ptr. We do this because LruCache
-            // doesn't support unique_ptr.
-            std::shared_ptr<Symbol> sharedSymbol = std::shared_ptr<Symbol>(symbol.release());
-            mCache.put(name, sharedSymbol);
+  // We did not find it in the cache, so look through the sources.
+  for (auto& symbolSource : mSources) {
+    std::unique_ptr<Symbol> symbol = symbolSource->findByName(name);
+    if (symbol) {
+      // Take ownership of the symbol into a shared_ptr. We do this because
+      // LruCache
+      // doesn't support unique_ptr.
+      std::shared_ptr<Symbol> sharedSymbol =
+          std::shared_ptr<Symbol>(symbol.release());
+      mCache.put(name, sharedSymbol);
 
-            if (sharedSymbol->id) {
-                // The symbol has an ID, so we can also cache this!
-                mIdCache.put(sharedSymbol->id.value(), sharedSymbol);
-            }
-            return sharedSymbol.get();
-        }
+      if (sharedSymbol->id) {
+        // The symbol has an ID, so we can also cache this!
+        mIdCache.put(sharedSymbol->id.value(), sharedSymbol);
+      }
+      return sharedSymbol.get();
     }
-    return nullptr;
+  }
+  return nullptr;
 }
 
 const SymbolTable::Symbol* SymbolTable::findById(const ResourceId& id) {
-    if (const std::shared_ptr<Symbol>& s = mIdCache.get(id)) {
-        return s.get();
-    }
+  if (const std::shared_ptr<Symbol>& s = mIdCache.get(id)) {
+    return s.get();
+  }
 
-    // We did not find it in the cache, so look through the sources.
-    for (auto& symbolSource : mSources) {
-        std::unique_ptr<Symbol> symbol = symbolSource->findById(id);
-        if (symbol) {
-            // Take ownership of the symbol into a shared_ptr. We do this because LruCache
-            // doesn't support unique_ptr.
-            std::shared_ptr<Symbol> sharedSymbol = std::shared_ptr<Symbol>(symbol.release());
-            mIdCache.put(id, sharedSymbol);
-            return sharedSymbol.get();
-        }
+  // We did not find it in the cache, so look through the sources.
+  for (auto& symbolSource : mSources) {
+    std::unique_ptr<Symbol> symbol = symbolSource->findById(id);
+    if (symbol) {
+      // Take ownership of the symbol into a shared_ptr. We do this because
+      // LruCache
+      // doesn't support unique_ptr.
+      std::shared_ptr<Symbol> sharedSymbol =
+          std::shared_ptr<Symbol>(symbol.release());
+      mIdCache.put(id, sharedSymbol);
+      return sharedSymbol.get();
     }
-    return nullptr;
+  }
+  return nullptr;
 }
 
 const SymbolTable::Symbol* SymbolTable::findByReference(const Reference& ref) {
-    // First try the ID. This is because when we lookup by ID, we only fill in the ID cache.
-    // Looking up by name fills in the name and ID cache. So a cache miss will cause a failed
-    // ID lookup, then a successful name lookup. Subsequent look ups will hit immediately
-    // because the ID is cached too.
-    //
-    // If we looked up by name first, a cache miss would mean we failed to lookup by name, then
-    // succeeded to lookup by ID. Subsequent lookups will miss then hit.
-    const SymbolTable::Symbol* symbol = nullptr;
-    if (ref.id) {
-        symbol = findById(ref.id.value());
-    }
+  // First try the ID. This is because when we lookup by ID, we only fill in the
+  // ID cache.
+  // Looking up by name fills in the name and ID cache. So a cache miss will
+  // cause a failed
+  // ID lookup, then a successful name lookup. Subsequent look ups will hit
+  // immediately
+  // because the ID is cached too.
+  //
+  // If we looked up by name first, a cache miss would mean we failed to lookup
+  // by name, then
+  // succeeded to lookup by ID. Subsequent lookups will miss then hit.
+  const SymbolTable::Symbol* symbol = nullptr;
+  if (ref.id) {
+    symbol = findById(ref.id.value());
+  }
 
-    if (ref.name && !symbol) {
-        symbol = findByName(ref.name.value());
-    }
-    return symbol;
+  if (ref.name && !symbol) {
+    symbol = findByName(ref.name.value());
+  }
+  return symbol;
 }
 
 std::unique_ptr<SymbolTable::Symbol> ResourceTableSymbolSource::findByName(
-        const ResourceName& name) {
-    Maybe<ResourceTable::SearchResult> result = mTable->findResource(name);
-    if (!result) {
-        if (name.type == ResourceType::kAttr) {
-            // Recurse and try looking up a private attribute.
-            return findByName(ResourceName(name.package, ResourceType::kAttrPrivate, name.entry));
-        }
+    const ResourceName& name) {
+  Maybe<ResourceTable::SearchResult> result = mTable->findResource(name);
+  if (!result) {
+    if (name.type == ResourceType::kAttr) {
+      // Recurse and try looking up a private attribute.
+      return findByName(
+          ResourceName(name.package, ResourceType::kAttrPrivate, name.entry));
+    }
+    return {};
+  }
+
+  ResourceTable::SearchResult sr = result.value();
+
+  std::unique_ptr<SymbolTable::Symbol> symbol =
+      util::make_unique<SymbolTable::Symbol>();
+  symbol->isPublic = (sr.entry->symbolStatus.state == SymbolState::kPublic);
+
+  if (sr.package->id && sr.type->id && sr.entry->id) {
+    symbol->id = ResourceId(sr.package->id.value(), sr.type->id.value(),
+                            sr.entry->id.value());
+  }
+
+  if (name.type == ResourceType::kAttr ||
+      name.type == ResourceType::kAttrPrivate) {
+    const ConfigDescription kDefaultConfig;
+    ResourceConfigValue* configValue = sr.entry->findValue(kDefaultConfig);
+    if (configValue) {
+      // This resource has an Attribute.
+      if (Attribute* attr = valueCast<Attribute>(configValue->value.get())) {
+        symbol->attribute = std::make_shared<Attribute>(*attr);
+      } else {
         return {};
+      }
     }
-
-    ResourceTable::SearchResult sr = result.value();
-
-    std::unique_ptr<SymbolTable::Symbol> symbol = util::make_unique<SymbolTable::Symbol>();
-    symbol->isPublic = (sr.entry->symbolStatus.state == SymbolState::kPublic);
-
-    if (sr.package->id && sr.type->id && sr.entry->id) {
-        symbol->id = ResourceId(sr.package->id.value(), sr.type->id.value(), sr.entry->id.value());
-    }
-
-    if (name.type == ResourceType::kAttr || name.type == ResourceType::kAttrPrivate) {
-        const ConfigDescription kDefaultConfig;
-        ResourceConfigValue* configValue = sr.entry->findValue(kDefaultConfig);
-        if (configValue) {
-            // This resource has an Attribute.
-            if (Attribute* attr = valueCast<Attribute>(configValue->value.get())) {
-                symbol->attribute = std::make_shared<Attribute>(*attr);
-            } else {
-                return {};
-            }
-        }
-    }
-    return symbol;
+  }
+  return symbol;
 }
 
 bool AssetManagerSymbolSource::addAssetPath(const StringPiece& path) {
-    int32_t cookie = 0;
-    return mAssets.addAssetPath(android::String8(path.data(), path.size()), &cookie);
+  int32_t cookie = 0;
+  return mAssets.addAssetPath(android::String8(path.data(), path.size()),
+                              &cookie);
 }
 
-static std::unique_ptr<SymbolTable::Symbol> lookupAttributeInTable(const android::ResTable& table,
-                                                                   ResourceId id) {
-    // Try as a bag.
-    const android::ResTable::bag_entry* entry;
-    ssize_t count = table.lockBag(id.id, &entry);
-    if (count < 0) {
-        table.unlockBag(entry);
-        return nullptr;
+static std::unique_ptr<SymbolTable::Symbol> lookupAttributeInTable(
+    const android::ResTable& table, ResourceId id) {
+  // Try as a bag.
+  const android::ResTable::bag_entry* entry;
+  ssize_t count = table.lockBag(id.id, &entry);
+  if (count < 0) {
+    table.unlockBag(entry);
+    return nullptr;
+  }
+
+  // We found a resource.
+  std::unique_ptr<SymbolTable::Symbol> s =
+      util::make_unique<SymbolTable::Symbol>();
+  s->id = id;
+
+  // Check to see if it is an attribute.
+  for (size_t i = 0; i < (size_t)count; i++) {
+    if (entry[i].map.name.ident == android::ResTable_map::ATTR_TYPE) {
+      s->attribute = std::make_shared<Attribute>(false);
+      s->attribute->typeMask = entry[i].map.value.data;
+      break;
     }
+  }
 
-    // We found a resource.
-    std::unique_ptr<SymbolTable::Symbol> s = util::make_unique<SymbolTable::Symbol>();
-    s->id = id;
-
-    // Check to see if it is an attribute.
-    for (size_t i = 0; i < (size_t) count; i++) {
-        if (entry[i].map.name.ident == android::ResTable_map::ATTR_TYPE) {
-            s->attribute = std::make_shared<Attribute>(false);
-            s->attribute->typeMask = entry[i].map.value.data;
+  if (s->attribute) {
+    for (size_t i = 0; i < (size_t)count; i++) {
+      const android::ResTable_map& mapEntry = entry[i].map;
+      if (Res_INTERNALID(mapEntry.name.ident)) {
+        switch (mapEntry.name.ident) {
+          case android::ResTable_map::ATTR_MIN:
+            s->attribute->minInt = static_cast<int32_t>(mapEntry.value.data);
+            break;
+          case android::ResTable_map::ATTR_MAX:
+            s->attribute->maxInt = static_cast<int32_t>(mapEntry.value.data);
             break;
         }
+        continue;
+      }
+
+      android::ResTable::resource_name entryName;
+      if (!table.getResourceName(mapEntry.name.ident, false, &entryName)) {
+        table.unlockBag(entry);
+        return nullptr;
+      }
+
+      Maybe<ResourceName> parsedName = ResourceUtils::toResourceName(entryName);
+      if (!parsedName) {
+        return nullptr;
+      }
+
+      Attribute::Symbol symbol;
+      symbol.symbol.name = parsedName.value();
+      symbol.symbol.id = ResourceId(mapEntry.name.ident);
+      symbol.value = mapEntry.value.data;
+      s->attribute->symbols.push_back(std::move(symbol));
     }
-
-    if (s->attribute) {
-        for (size_t i = 0; i < (size_t) count; i++) {
-            const android::ResTable_map& mapEntry = entry[i].map;
-            if (Res_INTERNALID(mapEntry.name.ident)) {
-                switch (mapEntry.name.ident) {
-                case android::ResTable_map::ATTR_MIN:
-                    s->attribute->minInt = static_cast<int32_t>(mapEntry.value.data);
-                    break;
-                case android::ResTable_map::ATTR_MAX:
-                    s->attribute->maxInt = static_cast<int32_t>(mapEntry.value.data);
-                    break;
-                }
-                continue;
-            }
-
-            android::ResTable::resource_name entryName;
-            if (!table.getResourceName(mapEntry.name.ident, false, &entryName)) {
-                table.unlockBag(entry);
-                return nullptr;
-            }
-
-            Maybe<ResourceName> parsedName = ResourceUtils::toResourceName(entryName);
-            if (!parsedName) {
-                return nullptr;
-            }
-
-            Attribute::Symbol symbol;
-            symbol.symbol.name = parsedName.value();
-            symbol.symbol.id = ResourceId(mapEntry.name.ident);
-            symbol.value = mapEntry.value.data;
-            s->attribute->symbols.push_back(std::move(symbol));
-        }
-    }
-    table.unlockBag(entry);
-    return s;
+  }
+  table.unlockBag(entry);
+  return s;
 }
 
 std::unique_ptr<SymbolTable::Symbol> AssetManagerSymbolSource::findByName(
-        const ResourceName& name) {
-    const android::ResTable& table = mAssets.getResources(false);
+    const ResourceName& name) {
+  const android::ResTable& table = mAssets.getResources(false);
 
-    const std::u16string package16 = util::utf8ToUtf16(name.package);
-    const std::u16string type16 = util::utf8ToUtf16(toString(name.type));
-    const std::u16string entry16 = util::utf8ToUtf16(name.entry);
+  const std::u16string package16 = util::utf8ToUtf16(name.package);
+  const std::u16string type16 = util::utf8ToUtf16(toString(name.type));
+  const std::u16string entry16 = util::utf8ToUtf16(name.entry);
 
-    uint32_t typeSpecFlags = 0;
-    ResourceId resId = table.identifierForName(entry16.data(), entry16.size(),
-                                               type16.data(), type16.size(),
-                                               package16.data(), package16.size(),
-                                               &typeSpecFlags);
-    if (!resId.isValid()) {
-        return {};
-    }
-
-    std::unique_ptr<SymbolTable::Symbol> s;
-    if (name.type == ResourceType::kAttr) {
-        s = lookupAttributeInTable(table, resId);
-    } else {
-        s = util::make_unique<SymbolTable::Symbol>();
-        s->id = resId;
-    }
-
-    if (s) {
-        s->isPublic = (typeSpecFlags & android::ResTable_typeSpec::SPEC_PUBLIC) != 0;
-        return s;
-    }
+  uint32_t typeSpecFlags = 0;
+  ResourceId resId = table.identifierForName(
+      entry16.data(), entry16.size(), type16.data(), type16.size(),
+      package16.data(), package16.size(), &typeSpecFlags);
+  if (!resId.isValid()) {
     return {};
+  }
+
+  std::unique_ptr<SymbolTable::Symbol> s;
+  if (name.type == ResourceType::kAttr) {
+    s = lookupAttributeInTable(table, resId);
+  } else {
+    s = util::make_unique<SymbolTable::Symbol>();
+    s->id = resId;
+  }
+
+  if (s) {
+    s->isPublic =
+        (typeSpecFlags & android::ResTable_typeSpec::SPEC_PUBLIC) != 0;
+    return s;
+  }
+  return {};
 }
 
-static Maybe<ResourceName> getResourceName(const android::ResTable& table, ResourceId id) {
-    android::ResTable::resource_name resName = {};
-    if (!table.getResourceName(id.id, true, &resName)) {
-        return {};
-    }
-    return ResourceUtils::toResourceName(resName);
+static Maybe<ResourceName> getResourceName(const android::ResTable& table,
+                                           ResourceId id) {
+  android::ResTable::resource_name resName = {};
+  if (!table.getResourceName(id.id, true, &resName)) {
+    return {};
+  }
+  return ResourceUtils::toResourceName(resName);
 }
 
-std::unique_ptr<SymbolTable::Symbol> AssetManagerSymbolSource::findById(ResourceId id) {
-    const android::ResTable& table = mAssets.getResources(false);
-    Maybe<ResourceName> maybeName = getResourceName(table, id);
-    if (!maybeName) {
-        return {};
-    }
-
-    uint32_t typeSpecFlags = 0;
-    table.getResourceFlags(id.id, &typeSpecFlags);
-
-    std::unique_ptr<SymbolTable::Symbol> s;
-    if (maybeName.value().type == ResourceType::kAttr) {
-        s = lookupAttributeInTable(table, id);
-    } else {
-        s = util::make_unique<SymbolTable::Symbol>();
-        s->id = id;
-    }
-
-    if (s) {
-        s->isPublic = (typeSpecFlags & android::ResTable_typeSpec::SPEC_PUBLIC) != 0;
-        return s;
-    }
+std::unique_ptr<SymbolTable::Symbol> AssetManagerSymbolSource::findById(
+    ResourceId id) {
+  const android::ResTable& table = mAssets.getResources(false);
+  Maybe<ResourceName> maybeName = getResourceName(table, id);
+  if (!maybeName) {
     return {};
+  }
+
+  uint32_t typeSpecFlags = 0;
+  table.getResourceFlags(id.id, &typeSpecFlags);
+
+  std::unique_ptr<SymbolTable::Symbol> s;
+  if (maybeName.value().type == ResourceType::kAttr) {
+    s = lookupAttributeInTable(table, id);
+  } else {
+    s = util::make_unique<SymbolTable::Symbol>();
+    s->id = id;
+  }
+
+  if (s) {
+    s->isPublic =
+        (typeSpecFlags & android::ResTable_typeSpec::SPEC_PUBLIC) != 0;
+    return s;
+  }
+  return {};
 }
 
 std::unique_ptr<SymbolTable::Symbol> AssetManagerSymbolSource::findByReference(
-        const Reference& ref) {
-    // AssetManager always prefers IDs.
-    if (ref.id) {
-        return findById(ref.id.value());
-    } else if (ref.name) {
-        return findByName(ref.name.value());
-    }
-    return {};
+    const Reference& ref) {
+  // AssetManager always prefers IDs.
+  if (ref.id) {
+    return findById(ref.id.value());
+  } else if (ref.name) {
+    return findByName(ref.name.value());
+  }
+  return {};
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/process/SymbolTable.h b/tools/aapt2/process/SymbolTable.h
index bd31416..89d87de 100644
--- a/tools/aapt2/process/SymbolTable.h
+++ b/tools/aapt2/process/SymbolTable.h
@@ -34,99 +34,100 @@
 namespace aapt {
 
 inline android::hash_t hash_type(const ResourceName& name) {
-    std::hash<std::string> strHash;
-    android::hash_t hash = 0;
-    hash = android::JenkinsHashMix(hash, (uint32_t) strHash(name.package));
-    hash = android::JenkinsHashMix(hash, (uint32_t) name.type);
-    hash = android::JenkinsHashMix(hash, (uint32_t) strHash(name.entry));
-    return hash;
+  std::hash<std::string> strHash;
+  android::hash_t hash = 0;
+  hash = android::JenkinsHashMix(hash, (uint32_t)strHash(name.package));
+  hash = android::JenkinsHashMix(hash, (uint32_t)name.type);
+  hash = android::JenkinsHashMix(hash, (uint32_t)strHash(name.entry));
+  return hash;
 }
 
 inline android::hash_t hash_type(const ResourceId& id) {
-    return android::hash_type(id.id);
+  return android::hash_type(id.id);
 }
 
 class ISymbolSource;
 
 class SymbolTable {
-public:
-    struct Symbol {
-        Symbol() : Symbol(Maybe<ResourceId>{}) {
-        }
+ public:
+  struct Symbol {
+    Symbol() : Symbol(Maybe<ResourceId>{}) {}
 
-        explicit Symbol(const Maybe<ResourceId>& i) : Symbol(i, nullptr) {
-        }
+    explicit Symbol(const Maybe<ResourceId>& i) : Symbol(i, nullptr) {}
 
-        Symbol(const Maybe<ResourceId>& i, const std::shared_ptr<Attribute>& attr) :
-                Symbol(i, attr, false) {
-        }
+    Symbol(const Maybe<ResourceId>& i, const std::shared_ptr<Attribute>& attr)
+        : Symbol(i, attr, false) {}
 
-        Symbol(const Maybe<ResourceId>& i, const std::shared_ptr<Attribute>& attr, bool pub) :
-                id(i), attribute(attr), isPublic(pub) {
-        }
+    Symbol(const Maybe<ResourceId>& i, const std::shared_ptr<Attribute>& attr,
+           bool pub)
+        : id(i), attribute(attr), isPublic(pub) {}
 
-        Symbol(const Symbol&) = default;
-        Symbol(Symbol&&) = default;
-        Symbol& operator=(const Symbol&) = default;
-        Symbol& operator=(Symbol&&) = default;
+    Symbol(const Symbol&) = default;
+    Symbol(Symbol&&) = default;
+    Symbol& operator=(const Symbol&) = default;
+    Symbol& operator=(Symbol&&) = default;
 
-        Maybe<ResourceId> id;
-        std::shared_ptr<Attribute> attribute;
-        bool isPublic = false;
-    };
+    Maybe<ResourceId> id;
+    std::shared_ptr<Attribute> attribute;
+    bool isPublic = false;
+  };
 
-    SymbolTable() : mCache(200), mIdCache(200) {
-    }
+  SymbolTable() : mCache(200), mIdCache(200) {}
 
-    void appendSource(std::unique_ptr<ISymbolSource> source);
-    void prependSource(std::unique_ptr<ISymbolSource> source);
+  void appendSource(std::unique_ptr<ISymbolSource> source);
+  void prependSource(std::unique_ptr<ISymbolSource> source);
 
-    /**
-     * Never hold on to the result between calls to findByName or findById. The results
-     * are typically stored in a cache which may evict entries.
-     */
-    const Symbol* findByName(const ResourceName& name);
-    const Symbol* findById(const ResourceId& id);
+  /**
+   * Never hold on to the result between calls to findByName or findById. The
+   * results
+   * are typically stored in a cache which may evict entries.
+   */
+  const Symbol* findByName(const ResourceName& name);
+  const Symbol* findById(const ResourceId& id);
 
-    /**
-     * Let's the ISymbolSource decide whether looking up by name or ID is faster, if both
-     * are available.
-     */
-    const Symbol* findByReference(const Reference& ref);
+  /**
+   * Let's the ISymbolSource decide whether looking up by name or ID is faster,
+   * if both
+   * are available.
+   */
+  const Symbol* findByReference(const Reference& ref);
 
-private:
-    std::vector<std::unique_ptr<ISymbolSource>> mSources;
+ private:
+  std::vector<std::unique_ptr<ISymbolSource>> mSources;
 
-    // We use shared_ptr because unique_ptr is not supported and
-    // we need automatic deletion.
-    android::LruCache<ResourceName, std::shared_ptr<Symbol>> mCache;
-    android::LruCache<ResourceId, std::shared_ptr<Symbol>> mIdCache;
+  // We use shared_ptr because unique_ptr is not supported and
+  // we need automatic deletion.
+  android::LruCache<ResourceName, std::shared_ptr<Symbol>> mCache;
+  android::LruCache<ResourceId, std::shared_ptr<Symbol>> mIdCache;
 
-    DISALLOW_COPY_AND_ASSIGN(SymbolTable);
+  DISALLOW_COPY_AND_ASSIGN(SymbolTable);
 };
 
 /**
- * An interface that a symbol source implements in order to surface symbol information
+ * An interface that a symbol source implements in order to surface symbol
+ * information
  * to the symbol table.
  */
 class ISymbolSource {
-public:
-    virtual ~ISymbolSource() = default;
+ public:
+  virtual ~ISymbolSource() = default;
 
-    virtual std::unique_ptr<SymbolTable::Symbol> findByName(const ResourceName& name) = 0;
-    virtual std::unique_ptr<SymbolTable::Symbol> findById(ResourceId id) = 0;
+  virtual std::unique_ptr<SymbolTable::Symbol> findByName(
+      const ResourceName& name) = 0;
+  virtual std::unique_ptr<SymbolTable::Symbol> findById(ResourceId id) = 0;
 
-    /**
-     * Default implementation tries the name if it exists, else the ID.
-     */
-    virtual std::unique_ptr<SymbolTable::Symbol> findByReference(const Reference& ref) {
-        if (ref.name) {
-            return findByName(ref.name.value());
-        } else if (ref.id) {
-            return findById(ref.id.value());
-        }
-        return {};
+  /**
+   * Default implementation tries the name if it exists, else the ID.
+   */
+  virtual std::unique_ptr<SymbolTable::Symbol> findByReference(
+      const Reference& ref) {
+    if (ref.name) {
+      return findByName(ref.name.value());
+    } else if (ref.id) {
+      return findById(ref.id.value());
     }
+    return {};
+  }
 };
 
 /**
@@ -135,38 +136,40 @@
  * Lookups by ID are ignored.
  */
 class ResourceTableSymbolSource : public ISymbolSource {
-public:
-    explicit ResourceTableSymbolSource(ResourceTable* table) : mTable(table) {
-    }
+ public:
+  explicit ResourceTableSymbolSource(ResourceTable* table) : mTable(table) {}
 
-    std::unique_ptr<SymbolTable::Symbol> findByName(const ResourceName& name) override;
+  std::unique_ptr<SymbolTable::Symbol> findByName(
+      const ResourceName& name) override;
 
-    std::unique_ptr<SymbolTable::Symbol> findById(ResourceId id) override {
-        return {};
-    }
+  std::unique_ptr<SymbolTable::Symbol> findById(ResourceId id) override {
+    return {};
+  }
 
-private:
-    ResourceTable* mTable;
+ private:
+  ResourceTable* mTable;
 
-    DISALLOW_COPY_AND_ASSIGN(ResourceTableSymbolSource);
+  DISALLOW_COPY_AND_ASSIGN(ResourceTableSymbolSource);
 };
 
 class AssetManagerSymbolSource : public ISymbolSource {
-public:
-    AssetManagerSymbolSource() = default;
+ public:
+  AssetManagerSymbolSource() = default;
 
-    bool addAssetPath(const StringPiece& path);
+  bool addAssetPath(const StringPiece& path);
 
-    std::unique_ptr<SymbolTable::Symbol> findByName(const ResourceName& name) override;
-    std::unique_ptr<SymbolTable::Symbol> findById(ResourceId id) override;
-    std::unique_ptr<SymbolTable::Symbol> findByReference(const Reference& ref) override;
+  std::unique_ptr<SymbolTable::Symbol> findByName(
+      const ResourceName& name) override;
+  std::unique_ptr<SymbolTable::Symbol> findById(ResourceId id) override;
+  std::unique_ptr<SymbolTable::Symbol> findByReference(
+      const Reference& ref) override;
 
-private:
-    android::AssetManager mAssets;
+ private:
+  android::AssetManager mAssets;
 
-    DISALLOW_COPY_AND_ASSIGN(AssetManagerSymbolSource);
+  DISALLOW_COPY_AND_ASSIGN(AssetManagerSymbolSource);
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_PROCESS_SYMBOLTABLE_H */
diff --git a/tools/aapt2/process/SymbolTable_test.cpp b/tools/aapt2/process/SymbolTable_test.cpp
index 1626352..00474f7 100644
--- a/tools/aapt2/process/SymbolTable_test.cpp
+++ b/tools/aapt2/process/SymbolTable_test.cpp
@@ -20,34 +20,38 @@
 namespace aapt {
 
 TEST(ResourceTableSymbolSourceTest, FindSymbols) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .addSimple("android:id/foo", ResourceId(0x01020000))
-            .addSimple("android:id/bar")
-            .addValue("android:attr/foo", ResourceId(0x01010000),
-                      test::AttributeBuilder().build())
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .addSimple("android:id/foo", ResourceId(0x01020000))
+          .addSimple("android:id/bar")
+          .addValue("android:attr/foo", ResourceId(0x01010000),
+                    test::AttributeBuilder().build())
+          .build();
 
-    ResourceTableSymbolSource symbolSource(table.get());
-    EXPECT_NE(nullptr, symbolSource.findByName(test::parseNameOrDie("android:id/foo")));
-    EXPECT_NE(nullptr, symbolSource.findByName(test::parseNameOrDie("android:id/bar")));
+  ResourceTableSymbolSource symbolSource(table.get());
+  EXPECT_NE(nullptr,
+            symbolSource.findByName(test::parseNameOrDie("android:id/foo")));
+  EXPECT_NE(nullptr,
+            symbolSource.findByName(test::parseNameOrDie("android:id/bar")));
 
-    std::unique_ptr<SymbolTable::Symbol> s = symbolSource.findByName(
-            test::parseNameOrDie("android:attr/foo"));
-    ASSERT_NE(nullptr, s);
-    EXPECT_NE(nullptr, s->attribute);
+  std::unique_ptr<SymbolTable::Symbol> s =
+      symbolSource.findByName(test::parseNameOrDie("android:attr/foo"));
+  ASSERT_NE(nullptr, s);
+  EXPECT_NE(nullptr, s->attribute);
 }
 
 TEST(ResourceTableSymbolSourceTest, FindPrivateAttrSymbol) {
-    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .addValue("android:^attr-private/foo", ResourceId(0x01010000),
-                      test::AttributeBuilder().build())
-            .build();
+  std::unique_ptr<ResourceTable> table =
+      test::ResourceTableBuilder()
+          .addValue("android:^attr-private/foo", ResourceId(0x01010000),
+                    test::AttributeBuilder().build())
+          .build();
 
-    ResourceTableSymbolSource symbolSource(table.get());
-    std::unique_ptr<SymbolTable::Symbol> s = symbolSource.findByName(
-                test::parseNameOrDie("android:attr/foo"));
-    ASSERT_NE(nullptr, s);
-    EXPECT_NE(nullptr, s->attribute);
+  ResourceTableSymbolSource symbolSource(table.get());
+  std::unique_ptr<SymbolTable::Symbol> s =
+      symbolSource.findByName(test::parseNameOrDie("android:attr/foo"));
+  ASSERT_NE(nullptr, s);
+  EXPECT_NE(nullptr, s->attribute);
 }
 
-} // namespace aapt
+}  // namespace aapt
diff --git a/tools/aapt2/proto/ProtoHelpers.h b/tools/aapt2/proto/ProtoHelpers.h
index 02e67f1..7271e8b 100644
--- a/tools/aapt2/proto/ProtoHelpers.h
+++ b/tools/aapt2/proto/ProtoHelpers.h
@@ -30,14 +30,18 @@
 
 void serializeStringPoolToPb(const StringPool& pool, pb::StringPool* outPbPool);
 
-void serializeSourceToPb(const Source& source, StringPool* srcPool, pb::Source* outPbSource);
-void deserializeSourceFromPb(const pb::Source& pbSource, const android::ResStringPool& srcPool,
+void serializeSourceToPb(const Source& source, StringPool* srcPool,
+                         pb::Source* outPbSource);
+void deserializeSourceFromPb(const pb::Source& pbSource,
+                             const android::ResStringPool& srcPool,
                              Source* outSource);
 
 pb::SymbolStatus_Visibility serializeVisibilityToPb(SymbolState state);
-SymbolState deserializeVisibilityFromPb(pb::SymbolStatus_Visibility pbVisibility);
+SymbolState deserializeVisibilityFromPb(
+    pb::SymbolStatus_Visibility pbVisibility);
 
-void serializeConfig(const ConfigDescription& config, pb::ConfigDescription* outPbConfig);
+void serializeConfig(const ConfigDescription& config,
+                     pb::ConfigDescription* outPbConfig);
 bool deserializeConfigDescriptionFromPb(const pb::ConfigDescription& pbConfig,
                                         ConfigDescription* outConfig);
 
@@ -47,6 +51,6 @@
 pb::Plural_Arity serializePluralEnumToPb(size_t pluralIdx);
 size_t deserializePluralEnumFromPb(pb::Plural_Arity arity);
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_PROTO_PROTOHELPERS_H */
diff --git a/tools/aapt2/proto/ProtoSerialize.h b/tools/aapt2/proto/ProtoSerialize.h
index cc7c251..378dafd 100644
--- a/tools/aapt2/proto/ProtoSerialize.h
+++ b/tools/aapt2/proto/ProtoSerialize.h
@@ -29,49 +29,49 @@
 namespace aapt {
 
 class CompiledFileOutputStream {
-public:
-    explicit CompiledFileOutputStream(google::protobuf::io::ZeroCopyOutputStream* out);
+ public:
+  explicit CompiledFileOutputStream(
+      google::protobuf::io::ZeroCopyOutputStream* out);
 
-    void WriteLittleEndian32(uint32_t value);
-    void WriteCompiledFile(const pb::CompiledFile* compiledFile);
-    void WriteData(const BigBuffer* buffer);
-    void WriteData(const void* data, size_t len);
-    bool HadError();
+  void WriteLittleEndian32(uint32_t value);
+  void WriteCompiledFile(const pb::CompiledFile* compiledFile);
+  void WriteData(const BigBuffer* buffer);
+  void WriteData(const void* data, size_t len);
+  bool HadError();
 
-private:
-    DISALLOW_COPY_AND_ASSIGN(CompiledFileOutputStream);
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CompiledFileOutputStream);
 
-    void ensureAlignedWrite();
+  void ensureAlignedWrite();
 
-    google::protobuf::io::CodedOutputStream mOut;
+  google::protobuf::io::CodedOutputStream mOut;
 };
 
 class CompiledFileInputStream {
-public:
-    explicit CompiledFileInputStream(const void* data, size_t size);
+ public:
+  explicit CompiledFileInputStream(const void* data, size_t size);
 
-    bool ReadLittleEndian32(uint32_t* outVal);
-    bool ReadCompiledFile(pb::CompiledFile* outVal);
-    bool ReadDataMetaData(uint64_t* outOffset, uint64_t* outLen);
+  bool ReadLittleEndian32(uint32_t* outVal);
+  bool ReadCompiledFile(pb::CompiledFile* outVal);
+  bool ReadDataMetaData(uint64_t* outOffset, uint64_t* outLen);
 
-private:
-    DISALLOW_COPY_AND_ASSIGN(CompiledFileInputStream);
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CompiledFileInputStream);
 
-    void ensureAlignedRead();
+  void ensureAlignedRead();
 
-    google::protobuf::io::CodedInputStream mIn;
+  google::protobuf::io::CodedInputStream mIn;
 };
 
 std::unique_ptr<pb::ResourceTable> serializeTableToPb(ResourceTable* table);
-std::unique_ptr<ResourceTable> deserializeTableFromPb(const pb::ResourceTable& pbTable,
-                                                      const Source& source,
-                                                      IDiagnostics* diag);
+std::unique_ptr<ResourceTable> deserializeTableFromPb(
+    const pb::ResourceTable& pbTable, const Source& source, IDiagnostics* diag);
 
-std::unique_ptr<pb::CompiledFile> serializeCompiledFileToPb(const ResourceFile& file);
-std::unique_ptr<ResourceFile> deserializeCompiledFileFromPb(const pb::CompiledFile& pbFile,
-                                                            const Source& source,
-                                                            IDiagnostics* diag);
+std::unique_ptr<pb::CompiledFile> serializeCompiledFileToPb(
+    const ResourceFile& file);
+std::unique_ptr<ResourceFile> deserializeCompiledFileFromPb(
+    const pb::CompiledFile& pbFile, const Source& source, IDiagnostics* diag);
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_FLATTEN_TABLEPROTOSERIALIZER_H */
diff --git a/tools/aapt2/split/TableSplitter.h b/tools/aapt2/split/TableSplitter.h
index 2fa5c47..d7ecc82 100644
--- a/tools/aapt2/split/TableSplitter.h
+++ b/tools/aapt2/split/TableSplitter.h
@@ -29,50 +29,49 @@
 namespace aapt {
 
 struct SplitConstraints {
-    std::set<ConfigDescription> configs;
+  std::set<ConfigDescription> configs;
 };
 
 struct TableSplitterOptions {
-    /**
-     * The preferred density to keep in the table, stripping out all others.
-     */
-    Maybe<uint16_t> preferredDensity;
+  /**
+   * The preferred density to keep in the table, stripping out all others.
+   */
+  Maybe<uint16_t> preferredDensity;
 
-    /**
-     * Configuration filter that determines which resource configuration values end up in
-     * the final table.
-     */
-    IConfigFilter* configFilter = nullptr;
+  /**
+   * Configuration filter that determines which resource configuration values
+   * end up in
+   * the final table.
+   */
+  IConfigFilter* configFilter = nullptr;
 };
 
 class TableSplitter {
-public:
-    TableSplitter(const std::vector<SplitConstraints>& splits,
-                  const TableSplitterOptions& options) :
-            mSplitConstraints(splits), mPreferredDensity(options.preferredDensity),
-            mConfigFilter(options.configFilter) {
-        for (size_t i = 0; i < mSplitConstraints.size(); i++) {
-            mSplits.push_back(util::make_unique<ResourceTable>());
-        }
+ public:
+  TableSplitter(const std::vector<SplitConstraints>& splits,
+                const TableSplitterOptions& options)
+      : mSplitConstraints(splits),
+        mPreferredDensity(options.preferredDensity),
+        mConfigFilter(options.configFilter) {
+    for (size_t i = 0; i < mSplitConstraints.size(); i++) {
+      mSplits.push_back(util::make_unique<ResourceTable>());
     }
+  }
 
-    bool verifySplitConstraints(IAaptContext* context);
+  bool verifySplitConstraints(IAaptContext* context);
 
-    void splitTable(ResourceTable* originalTable);
+  void splitTable(ResourceTable* originalTable);
 
-    std::vector<std::unique_ptr<ResourceTable>>& getSplits() {
-        return mSplits;
-    }
+  std::vector<std::unique_ptr<ResourceTable>>& getSplits() { return mSplits; }
 
-private:
-    std::vector<SplitConstraints> mSplitConstraints;
-    std::vector<std::unique_ptr<ResourceTable>> mSplits;
-    Maybe<uint16_t> mPreferredDensity;
-    IConfigFilter* mConfigFilter;
+ private:
+  std::vector<SplitConstraints> mSplitConstraints;
+  std::vector<std::unique_ptr<ResourceTable>> mSplits;
+  Maybe<uint16_t> mPreferredDensity;
+  IConfigFilter* mConfigFilter;
 
-    DISALLOW_COPY_AND_ASSIGN(TableSplitter);
+  DISALLOW_COPY_AND_ASSIGN(TableSplitter);
 };
-
 }
 
 #endif /* AAPT_SPLIT_TABLESPLITTER_H */
diff --git a/tools/aapt2/test/Builders.h b/tools/aapt2/test/Builders.h
index 637e991..c647159 100644
--- a/tools/aapt2/test/Builders.h
+++ b/tools/aapt2/test/Builders.h
@@ -29,232 +29,242 @@
 namespace test {
 
 class ResourceTableBuilder {
-private:
-    DummyDiagnosticsImpl mDiagnostics;
-    std::unique_ptr<ResourceTable> mTable = util::make_unique<ResourceTable>();
+ private:
+  DummyDiagnosticsImpl mDiagnostics;
+  std::unique_ptr<ResourceTable> mTable = util::make_unique<ResourceTable>();
 
-public:
-    ResourceTableBuilder() = default;
+ public:
+  ResourceTableBuilder() = default;
 
-    StringPool* getStringPool() {
-        return &mTable->stringPool;
-    }
+  StringPool* getStringPool() { return &mTable->stringPool; }
 
-    ResourceTableBuilder& setPackageId(const StringPiece& packageName, uint8_t id) {
-        ResourceTablePackage* package = mTable->createPackage(packageName, id);
-        assert(package);
-        return *this;
-    }
+  ResourceTableBuilder& setPackageId(const StringPiece& packageName,
+                                     uint8_t id) {
+    ResourceTablePackage* package = mTable->createPackage(packageName, id);
+    assert(package);
+    return *this;
+  }
 
-    ResourceTableBuilder& addSimple(const StringPiece& name, const ResourceId& id = {}) {
-        return addValue(name, id, util::make_unique<Id>());
-    }
+  ResourceTableBuilder& addSimple(const StringPiece& name,
+                                  const ResourceId& id = {}) {
+    return addValue(name, id, util::make_unique<Id>());
+  }
 
-    ResourceTableBuilder& addSimple(const StringPiece& name, const ConfigDescription& config,
-                                    const ResourceId& id = {}) {
-        return addValue(name, config, id, util::make_unique<Id>());
-    }
+  ResourceTableBuilder& addSimple(const StringPiece& name,
+                                  const ConfigDescription& config,
+                                  const ResourceId& id = {}) {
+    return addValue(name, config, id, util::make_unique<Id>());
+  }
 
-    ResourceTableBuilder& addReference(const StringPiece& name, const StringPiece& ref) {
-        return addReference(name, {}, ref);
-    }
+  ResourceTableBuilder& addReference(const StringPiece& name,
+                                     const StringPiece& ref) {
+    return addReference(name, {}, ref);
+  }
 
-    ResourceTableBuilder& addReference(const StringPiece& name, const ResourceId& id,
-                                       const StringPiece& ref) {
-        return addValue(name, id, util::make_unique<Reference>(parseNameOrDie(ref)));
-    }
+  ResourceTableBuilder& addReference(const StringPiece& name,
+                                     const ResourceId& id,
+                                     const StringPiece& ref) {
+    return addValue(name, id,
+                    util::make_unique<Reference>(parseNameOrDie(ref)));
+  }
 
-    ResourceTableBuilder& addString(const StringPiece& name, const StringPiece& str) {
-        return addString(name, {}, str);
-    }
+  ResourceTableBuilder& addString(const StringPiece& name,
+                                  const StringPiece& str) {
+    return addString(name, {}, str);
+  }
 
-    ResourceTableBuilder& addString(const StringPiece& name, const ResourceId& id,
-                                    const StringPiece& str) {
-        return addValue(name, id, util::make_unique<String>(mTable->stringPool.makeRef(str)));
-    }
+  ResourceTableBuilder& addString(const StringPiece& name, const ResourceId& id,
+                                  const StringPiece& str) {
+    return addValue(name, id,
+                    util::make_unique<String>(mTable->stringPool.makeRef(str)));
+  }
 
-    ResourceTableBuilder& addString(const StringPiece& name, const ResourceId& id,
-                                    const ConfigDescription& config, const StringPiece& str) {
-        return addValue(name, config, id,
-                        util::make_unique<String>(mTable->stringPool.makeRef(str)));
-    }
+  ResourceTableBuilder& addString(const StringPiece& name, const ResourceId& id,
+                                  const ConfigDescription& config,
+                                  const StringPiece& str) {
+    return addValue(name, config, id,
+                    util::make_unique<String>(mTable->stringPool.makeRef(str)));
+  }
 
-    ResourceTableBuilder& addFileReference(const StringPiece& name, const StringPiece& path) {
-        return addFileReference(name, {}, path);
-    }
+  ResourceTableBuilder& addFileReference(const StringPiece& name,
+                                         const StringPiece& path) {
+    return addFileReference(name, {}, path);
+  }
 
-    ResourceTableBuilder& addFileReference(const StringPiece& name, const ResourceId& id,
-                                           const StringPiece& path) {
-        return addValue(name, id,
-                        util::make_unique<FileReference>(mTable->stringPool.makeRef(path)));
-    }
+  ResourceTableBuilder& addFileReference(const StringPiece& name,
+                                         const ResourceId& id,
+                                         const StringPiece& path) {
+    return addValue(name, id, util::make_unique<FileReference>(
+                                  mTable->stringPool.makeRef(path)));
+  }
 
-    ResourceTableBuilder& addFileReference(const StringPiece& name, const StringPiece& path,
-                                           const ConfigDescription& config) {
-        return addValue(name, config, {},
-                        util::make_unique<FileReference>(mTable->stringPool.makeRef(path)));
-    }
+  ResourceTableBuilder& addFileReference(const StringPiece& name,
+                                         const StringPiece& path,
+                                         const ConfigDescription& config) {
+    return addValue(name, config, {}, util::make_unique<FileReference>(
+                                          mTable->stringPool.makeRef(path)));
+  }
 
-    ResourceTableBuilder& addValue(const StringPiece& name,
-                                   std::unique_ptr<Value> value) {
-        return addValue(name, {}, std::move(value));
-    }
+  ResourceTableBuilder& addValue(const StringPiece& name,
+                                 std::unique_ptr<Value> value) {
+    return addValue(name, {}, std::move(value));
+  }
 
-    ResourceTableBuilder& addValue(const StringPiece& name, const ResourceId& id,
-                                   std::unique_ptr<Value> value) {
-        return addValue(name, {}, id, std::move(value));
-    }
+  ResourceTableBuilder& addValue(const StringPiece& name, const ResourceId& id,
+                                 std::unique_ptr<Value> value) {
+    return addValue(name, {}, id, std::move(value));
+  }
 
-    ResourceTableBuilder& addValue(const StringPiece& name, const ConfigDescription& config,
-                                   const ResourceId& id, std::unique_ptr<Value> value) {
-        ResourceName resName = parseNameOrDie(name);
-        bool result = mTable->addResourceAllowMangled(resName, id, config, {},
-                                                      std::move(value), &mDiagnostics);
-        assert(result);
-        return *this;
-    }
+  ResourceTableBuilder& addValue(const StringPiece& name,
+                                 const ConfigDescription& config,
+                                 const ResourceId& id,
+                                 std::unique_ptr<Value> value) {
+    ResourceName resName = parseNameOrDie(name);
+    bool result = mTable->addResourceAllowMangled(
+        resName, id, config, {}, std::move(value), &mDiagnostics);
+    assert(result);
+    return *this;
+  }
 
-    ResourceTableBuilder& setSymbolState(const StringPiece& name, const ResourceId& id,
-                                         SymbolState state) {
-        ResourceName resName = parseNameOrDie(name);
-        Symbol symbol;
-        symbol.state = state;
-        bool result = mTable->setSymbolStateAllowMangled(resName, id, symbol, &mDiagnostics);
-        assert(result);
-        return *this;
-    }
+  ResourceTableBuilder& setSymbolState(const StringPiece& name,
+                                       const ResourceId& id,
+                                       SymbolState state) {
+    ResourceName resName = parseNameOrDie(name);
+    Symbol symbol;
+    symbol.state = state;
+    bool result =
+        mTable->setSymbolStateAllowMangled(resName, id, symbol, &mDiagnostics);
+    assert(result);
+    return *this;
+  }
 
-    std::unique_ptr<ResourceTable> build() {
-        return std::move(mTable);
-    }
+  std::unique_ptr<ResourceTable> build() { return std::move(mTable); }
 };
 
-inline std::unique_ptr<Reference> buildReference(const StringPiece& ref,
-                                                 const Maybe<ResourceId>& id = {}) {
-    std::unique_ptr<Reference> reference = util::make_unique<Reference>(parseNameOrDie(ref));
-    reference->id = id;
-    return reference;
+inline std::unique_ptr<Reference> buildReference(
+    const StringPiece& ref, const Maybe<ResourceId>& id = {}) {
+  std::unique_ptr<Reference> reference =
+      util::make_unique<Reference>(parseNameOrDie(ref));
+  reference->id = id;
+  return reference;
 }
 
-inline std::unique_ptr<BinaryPrimitive> buildPrimitive(uint8_t type, uint32_t data) {
-    android::Res_value value = {};
-    value.size = sizeof(value);
-    value.dataType = type;
-    value.data = data;
-    return util::make_unique<BinaryPrimitive>(value);
+inline std::unique_ptr<BinaryPrimitive> buildPrimitive(uint8_t type,
+                                                       uint32_t data) {
+  android::Res_value value = {};
+  value.size = sizeof(value);
+  value.dataType = type;
+  value.data = data;
+  return util::make_unique<BinaryPrimitive>(value);
 }
 
 template <typename T>
 class ValueBuilder {
-private:
-    std::unique_ptr<Value> mValue;
+ private:
+  std::unique_ptr<Value> mValue;
 
-public:
-    template <typename... Args>
-    explicit ValueBuilder(Args&&... args) : mValue(new T{ std::forward<Args>(args)... }) {
-    }
+ public:
+  template <typename... Args>
+  explicit ValueBuilder(Args&&... args)
+      : mValue(new T{std::forward<Args>(args)...}) {}
 
-    template <typename... Args>
-    ValueBuilder& setSource(Args&&... args) {
-        mValue->setSource(Source{ std::forward<Args>(args)... });
-        return *this;
-    }
+  template <typename... Args>
+  ValueBuilder& setSource(Args&&... args) {
+    mValue->setSource(Source{std::forward<Args>(args)...});
+    return *this;
+  }
 
-    ValueBuilder& setComment(const StringPiece& str) {
-        mValue->setComment(str);
-        return *this;
-    }
+  ValueBuilder& setComment(const StringPiece& str) {
+    mValue->setComment(str);
+    return *this;
+  }
 
-    std::unique_ptr<Value> build() {
-        return std::move(mValue);
-    }
+  std::unique_ptr<Value> build() { return std::move(mValue); }
 };
 
 class AttributeBuilder {
-private:
-    std::unique_ptr<Attribute> mAttr;
+ private:
+  std::unique_ptr<Attribute> mAttr;
 
-public:
-    explicit AttributeBuilder(bool weak = false) : mAttr(util::make_unique<Attribute>(weak)) {
-        mAttr->typeMask = android::ResTable_map::TYPE_ANY;
-    }
+ public:
+  explicit AttributeBuilder(bool weak = false)
+      : mAttr(util::make_unique<Attribute>(weak)) {
+    mAttr->typeMask = android::ResTable_map::TYPE_ANY;
+  }
 
-    AttributeBuilder& setTypeMask(uint32_t typeMask) {
-        mAttr->typeMask = typeMask;
-        return *this;
-    }
+  AttributeBuilder& setTypeMask(uint32_t typeMask) {
+    mAttr->typeMask = typeMask;
+    return *this;
+  }
 
-    AttributeBuilder& addItem(const StringPiece& name, uint32_t value) {
-        mAttr->symbols.push_back(Attribute::Symbol{
-                Reference(ResourceName({}, ResourceType::kId, name)),
-                value});
-        return *this;
-    }
+  AttributeBuilder& addItem(const StringPiece& name, uint32_t value) {
+    mAttr->symbols.push_back(Attribute::Symbol{
+        Reference(ResourceName({}, ResourceType::kId, name)), value});
+    return *this;
+  }
 
-    std::unique_ptr<Attribute> build() {
-        return std::move(mAttr);
-    }
+  std::unique_ptr<Attribute> build() { return std::move(mAttr); }
 };
 
 class StyleBuilder {
-private:
-    std::unique_ptr<Style> mStyle = util::make_unique<Style>();
+ private:
+  std::unique_ptr<Style> mStyle = util::make_unique<Style>();
 
-public:
-    StyleBuilder& setParent(const StringPiece& str) {
-        mStyle->parent = Reference(parseNameOrDie(str));
-        return *this;
-    }
+ public:
+  StyleBuilder& setParent(const StringPiece& str) {
+    mStyle->parent = Reference(parseNameOrDie(str));
+    return *this;
+  }
 
-    StyleBuilder& addItem(const StringPiece& str, std::unique_ptr<Item> value) {
-        mStyle->entries.push_back(Style::Entry{ Reference(parseNameOrDie(str)), std::move(value) });
-        return *this;
-    }
+  StyleBuilder& addItem(const StringPiece& str, std::unique_ptr<Item> value) {
+    mStyle->entries.push_back(
+        Style::Entry{Reference(parseNameOrDie(str)), std::move(value)});
+    return *this;
+  }
 
-    StyleBuilder& addItem(const StringPiece& str, const ResourceId& id, std::unique_ptr<Item> value) {
-        addItem(str, std::move(value));
-        mStyle->entries.back().key.id = id;
-        return *this;
-    }
+  StyleBuilder& addItem(const StringPiece& str, const ResourceId& id,
+                        std::unique_ptr<Item> value) {
+    addItem(str, std::move(value));
+    mStyle->entries.back().key.id = id;
+    return *this;
+  }
 
-    std::unique_ptr<Style> build() {
-        return std::move(mStyle);
-    }
+  std::unique_ptr<Style> build() { return std::move(mStyle); }
 };
 
 class StyleableBuilder {
-private:
-    std::unique_ptr<Styleable> mStyleable = util::make_unique<Styleable>();
+ private:
+  std::unique_ptr<Styleable> mStyleable = util::make_unique<Styleable>();
 
-public:
-    StyleableBuilder& addItem(const StringPiece& str, const Maybe<ResourceId>& id = {}) {
-        mStyleable->entries.push_back(Reference(parseNameOrDie(str)));
-        mStyleable->entries.back().id = id;
-        return *this;
-    }
+ public:
+  StyleableBuilder& addItem(const StringPiece& str,
+                            const Maybe<ResourceId>& id = {}) {
+    mStyleable->entries.push_back(Reference(parseNameOrDie(str)));
+    mStyleable->entries.back().id = id;
+    return *this;
+  }
 
-    std::unique_ptr<Styleable> build() {
-        return std::move(mStyleable);
-    }
+  std::unique_ptr<Styleable> build() { return std::move(mStyleable); }
 };
 
 inline std::unique_ptr<xml::XmlResource> buildXmlDom(const StringPiece& str) {
-    std::stringstream in;
-    in << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" << str;
-    StdErrDiagnostics diag;
-    std::unique_ptr<xml::XmlResource> doc = xml::inflate(&in, &diag, Source("test.xml"));
-    assert(doc);
-    return doc;
+  std::stringstream in;
+  in << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" << str;
+  StdErrDiagnostics diag;
+  std::unique_ptr<xml::XmlResource> doc =
+      xml::inflate(&in, &diag, Source("test.xml"));
+  assert(doc);
+  return doc;
 }
 
-inline std::unique_ptr<xml::XmlResource> buildXmlDomForPackageName(IAaptContext* context,
-                                                                   const StringPiece& str) {
-    std::unique_ptr<xml::XmlResource> doc = buildXmlDom(str);
-    doc->file.name.package = context->getCompilationPackage();
-    return doc;
+inline std::unique_ptr<xml::XmlResource> buildXmlDomForPackageName(
+    IAaptContext* context, const StringPiece& str) {
+  std::unique_ptr<xml::XmlResource> doc = buildXmlDom(str);
+  doc->file.name.package = context->getCompilationPackage();
+  return doc;
 }
 
-} // namespace test
-} // namespace aapt
+}  // namespace test
+}  // namespace aapt
 
 #endif /* AAPT_TEST_BUILDERS_H */
diff --git a/tools/aapt2/test/Common.h b/tools/aapt2/test/Common.h
index 7fafcbe..2d571e7 100644
--- a/tools/aapt2/test/Common.h
+++ b/tools/aapt2/test/Common.h
@@ -30,7 +30,8 @@
 #include <iostream>
 
 //
-// GTEST 1.7 doesn't explicitly cast to bool, which causes explicit operators to fail to compile.
+// GTEST 1.7 doesn't explicitly cast to bool, which causes explicit operators to
+// fail to compile.
 //
 #define AAPT_ASSERT_TRUE(v) ASSERT_TRUE(bool(v))
 #define AAPT_ASSERT_FALSE(v) ASSERT_FALSE(bool(v))
@@ -41,81 +42,83 @@
 namespace test {
 
 struct DummyDiagnosticsImpl : public IDiagnostics {
-    void log(Level level, DiagMessageActual& actualMsg) override {
-        switch (level) {
-        case Level::Note:
-            return;
+  void log(Level level, DiagMessageActual& actualMsg) override {
+    switch (level) {
+      case Level::Note:
+        return;
 
-        case Level::Warn:
-            std::cerr << actualMsg.source << ": warn: " << actualMsg.message << "." << std::endl;
-            break;
+      case Level::Warn:
+        std::cerr << actualMsg.source << ": warn: " << actualMsg.message << "."
+                  << std::endl;
+        break;
 
-        case Level::Error:
-            std::cerr << actualMsg.source << ": error: " << actualMsg.message << "." << std::endl;
-            break;
-        }
+      case Level::Error:
+        std::cerr << actualMsg.source << ": error: " << actualMsg.message << "."
+                  << std::endl;
+        break;
     }
+  }
 };
 
 inline IDiagnostics* getDiagnostics() {
-    static DummyDiagnosticsImpl diag;
-    return &diag;
+  static DummyDiagnosticsImpl diag;
+  return &diag;
 }
 
 inline ResourceName parseNameOrDie(const StringPiece& str) {
-    ResourceNameRef ref;
-    bool result = ResourceUtils::parseResourceName(str, &ref);
-    assert(result && "invalid resource name");
-    return ref.toResourceName();
+  ResourceNameRef ref;
+  bool result = ResourceUtils::parseResourceName(str, &ref);
+  assert(result && "invalid resource name");
+  return ref.toResourceName();
 }
 
 inline ConfigDescription parseConfigOrDie(const StringPiece& str) {
-    ConfigDescription config;
-    bool result = ConfigDescription::parse(str, &config);
-    assert(result && "invalid configuration");
-    return config;
+  ConfigDescription config;
+  bool result = ConfigDescription::parse(str, &config);
+  assert(result && "invalid configuration");
+  return config;
 }
 
-template <typename T> T* getValueForConfigAndProduct(ResourceTable* table,
-                                                     const StringPiece& resName,
-                                                     const ConfigDescription& config,
-                                                     const StringPiece& product) {
-    Maybe<ResourceTable::SearchResult> result = table->findResource(parseNameOrDie(resName));
-    if (result) {
-        ResourceConfigValue* configValue = result.value().entry->findValue(config, product);
-        if (configValue) {
-            return valueCast<T>(configValue->value.get());
-        }
+template <typename T>
+T* getValueForConfigAndProduct(ResourceTable* table, const StringPiece& resName,
+                               const ConfigDescription& config,
+                               const StringPiece& product) {
+  Maybe<ResourceTable::SearchResult> result =
+      table->findResource(parseNameOrDie(resName));
+  if (result) {
+    ResourceConfigValue* configValue =
+        result.value().entry->findValue(config, product);
+    if (configValue) {
+      return valueCast<T>(configValue->value.get());
     }
-    return nullptr;
+  }
+  return nullptr;
 }
 
-template <typename T> T* getValueForConfig(ResourceTable* table, const StringPiece& resName,
-                                           const ConfigDescription& config) {
-    return getValueForConfigAndProduct<T>(table, resName, config, {});
+template <typename T>
+T* getValueForConfig(ResourceTable* table, const StringPiece& resName,
+                     const ConfigDescription& config) {
+  return getValueForConfigAndProduct<T>(table, resName, config, {});
 }
 
-template <typename T> T* getValue(ResourceTable* table, const StringPiece& resName) {
-    return getValueForConfig<T>(table, resName, {});
+template <typename T>
+T* getValue(ResourceTable* table, const StringPiece& resName) {
+  return getValueForConfig<T>(table, resName, {});
 }
 
 class TestFile : public io::IFile {
-private:
-    Source mSource;
+ private:
+  Source mSource;
 
-public:
-    explicit TestFile(const StringPiece& path) : mSource(path) {}
+ public:
+  explicit TestFile(const StringPiece& path) : mSource(path) {}
 
-    std::unique_ptr<io::IData> openAsData() override {
-        return {};
-    }
+  std::unique_ptr<io::IData> openAsData() override { return {}; }
 
-    const Source& getSource() const override {
-        return mSource;
-    }
+  const Source& getSource() const override { return mSource; }
 };
 
-} // namespace test
-} // namespace aapt
+}  // namespace test
+}  // namespace aapt
 
 #endif /* AAPT_TEST_COMMON_H */
diff --git a/tools/aapt2/test/Context.h b/tools/aapt2/test/Context.h
index 54f16db..6c7f6f7 100644
--- a/tools/aapt2/test/Context.h
+++ b/tools/aapt2/test/Context.h
@@ -18,10 +18,10 @@
 #define AAPT_TEST_CONTEXT_H
 
 #include "NameMangler.h"
-#include "util/Util.h"
 #include "process/IResourceTableConsumer.h"
 #include "process/SymbolTable.h"
 #include "test/Common.h"
+#include "util/Util.h"
 
 #include <cassert>
 #include <list>
@@ -30,152 +30,143 @@
 namespace test {
 
 class Context : public IAaptContext {
-public:
-    SymbolTable* getExternalSymbols() override {
-        return &mSymbols;
-    }
+ public:
+  SymbolTable* getExternalSymbols() override { return &mSymbols; }
 
-    IDiagnostics* getDiagnostics() override {
-        return &mDiagnostics;
-    }
+  IDiagnostics* getDiagnostics() override { return &mDiagnostics; }
 
-    const std::string& getCompilationPackage() override {
-        assert(mCompilationPackage && "package name not set");
-        return mCompilationPackage.value();
-    }
+  const std::string& getCompilationPackage() override {
+    assert(mCompilationPackage && "package name not set");
+    return mCompilationPackage.value();
+  }
 
-    uint8_t getPackageId() override {
-        assert(mPackageId && "package ID not set");
-        return mPackageId.value();
-    }
+  uint8_t getPackageId() override {
+    assert(mPackageId && "package ID not set");
+    return mPackageId.value();
+  }
 
-    NameMangler* getNameMangler() override {
-        return &mNameMangler;
-    }
+  NameMangler* getNameMangler() override { return &mNameMangler; }
 
-    bool verbose() override {
-        return false;
-    }
+  bool verbose() override { return false; }
 
-    int getMinSdkVersion() override {
-        return mMinSdkVersion;
-    }
+  int getMinSdkVersion() override { return mMinSdkVersion; }
 
-private:
-    friend class ContextBuilder;
+ private:
+  friend class ContextBuilder;
 
-    Maybe<std::string> mCompilationPackage;
-    Maybe<uint8_t> mPackageId;
-    StdErrDiagnostics mDiagnostics;
-    SymbolTable mSymbols;
-    NameMangler mNameMangler = NameMangler({});
-    int mMinSdkVersion = 0;
+  Maybe<std::string> mCompilationPackage;
+  Maybe<uint8_t> mPackageId;
+  StdErrDiagnostics mDiagnostics;
+  SymbolTable mSymbols;
+  NameMangler mNameMangler = NameMangler({});
+  int mMinSdkVersion = 0;
 };
 
 class ContextBuilder {
-private:
-    std::unique_ptr<Context> mContext = std::unique_ptr<Context>(new Context());
+ private:
+  std::unique_ptr<Context> mContext = std::unique_ptr<Context>(new Context());
 
-public:
-    ContextBuilder& setCompilationPackage(const StringPiece& package) {
-        mContext->mCompilationPackage = package.toString();
-        return *this;
-    }
+ public:
+  ContextBuilder& setCompilationPackage(const StringPiece& package) {
+    mContext->mCompilationPackage = package.toString();
+    return *this;
+  }
 
-    ContextBuilder& setPackageId(uint8_t id) {
-        mContext->mPackageId = id;
-        return *this;
-    }
+  ContextBuilder& setPackageId(uint8_t id) {
+    mContext->mPackageId = id;
+    return *this;
+  }
 
-    ContextBuilder& setNameManglerPolicy(const NameManglerPolicy& policy) {
-        mContext->mNameMangler = NameMangler(policy);
-        return *this;
-    }
+  ContextBuilder& setNameManglerPolicy(const NameManglerPolicy& policy) {
+    mContext->mNameMangler = NameMangler(policy);
+    return *this;
+  }
 
-    ContextBuilder& addSymbolSource(std::unique_ptr<ISymbolSource> src) {
-        mContext->getExternalSymbols()->appendSource(std::move(src));
-        return *this;
-    }
+  ContextBuilder& addSymbolSource(std::unique_ptr<ISymbolSource> src) {
+    mContext->getExternalSymbols()->appendSource(std::move(src));
+    return *this;
+  }
 
-    ContextBuilder& setMinSdkVersion(int minSdk) {
-        mContext->mMinSdkVersion = minSdk;
-        return *this;
-    }
+  ContextBuilder& setMinSdkVersion(int minSdk) {
+    mContext->mMinSdkVersion = minSdk;
+    return *this;
+  }
 
-    std::unique_ptr<Context> build() {
-        return std::move(mContext);
-    }
+  std::unique_ptr<Context> build() { return std::move(mContext); }
 };
 
 class StaticSymbolSourceBuilder {
-public:
-    StaticSymbolSourceBuilder& addPublicSymbol(const StringPiece& name, ResourceId id,
-                                               std::unique_ptr<Attribute> attr = {}) {
-        std::unique_ptr<SymbolTable::Symbol> symbol = util::make_unique<SymbolTable::Symbol>(
-                id, std::move(attr), true);
-        mSymbolSource->mNameMap[parseNameOrDie(name)] = symbol.get();
-        mSymbolSource->mIdMap[id] = symbol.get();
-        mSymbolSource->mSymbols.push_back(std::move(symbol));
-        return *this;
+ public:
+  StaticSymbolSourceBuilder& addPublicSymbol(
+      const StringPiece& name, ResourceId id,
+      std::unique_ptr<Attribute> attr = {}) {
+    std::unique_ptr<SymbolTable::Symbol> symbol =
+        util::make_unique<SymbolTable::Symbol>(id, std::move(attr), true);
+    mSymbolSource->mNameMap[parseNameOrDie(name)] = symbol.get();
+    mSymbolSource->mIdMap[id] = symbol.get();
+    mSymbolSource->mSymbols.push_back(std::move(symbol));
+    return *this;
+  }
+
+  StaticSymbolSourceBuilder& addSymbol(const StringPiece& name, ResourceId id,
+                                       std::unique_ptr<Attribute> attr = {}) {
+    std::unique_ptr<SymbolTable::Symbol> symbol =
+        util::make_unique<SymbolTable::Symbol>(id, std::move(attr), false);
+    mSymbolSource->mNameMap[parseNameOrDie(name)] = symbol.get();
+    mSymbolSource->mIdMap[id] = symbol.get();
+    mSymbolSource->mSymbols.push_back(std::move(symbol));
+    return *this;
+  }
+
+  std::unique_ptr<ISymbolSource> build() { return std::move(mSymbolSource); }
+
+ private:
+  class StaticSymbolSource : public ISymbolSource {
+   public:
+    StaticSymbolSource() = default;
+
+    std::unique_ptr<SymbolTable::Symbol> findByName(
+        const ResourceName& name) override {
+      auto iter = mNameMap.find(name);
+      if (iter != mNameMap.end()) {
+        return cloneSymbol(iter->second);
+      }
+      return nullptr;
     }
 
-    StaticSymbolSourceBuilder& addSymbol(const StringPiece& name, ResourceId id,
-                                         std::unique_ptr<Attribute> attr = {}) {
-        std::unique_ptr<SymbolTable::Symbol> symbol = util::make_unique<SymbolTable::Symbol>(
-                id, std::move(attr), false);
-        mSymbolSource->mNameMap[parseNameOrDie(name)] = symbol.get();
-        mSymbolSource->mIdMap[id] = symbol.get();
-        mSymbolSource->mSymbols.push_back(std::move(symbol));
-        return *this;
+    std::unique_ptr<SymbolTable::Symbol> findById(ResourceId id) override {
+      auto iter = mIdMap.find(id);
+      if (iter != mIdMap.end()) {
+        return cloneSymbol(iter->second);
+      }
+      return nullptr;
     }
 
-    std::unique_ptr<ISymbolSource> build() {
-        return std::move(mSymbolSource);
+    std::list<std::unique_ptr<SymbolTable::Symbol>> mSymbols;
+    std::map<ResourceName, SymbolTable::Symbol*> mNameMap;
+    std::map<ResourceId, SymbolTable::Symbol*> mIdMap;
+
+   private:
+    std::unique_ptr<SymbolTable::Symbol> cloneSymbol(SymbolTable::Symbol* sym) {
+      std::unique_ptr<SymbolTable::Symbol> clone =
+          util::make_unique<SymbolTable::Symbol>();
+      clone->id = sym->id;
+      if (sym->attribute) {
+        clone->attribute =
+            std::unique_ptr<Attribute>(sym->attribute->clone(nullptr));
+      }
+      clone->isPublic = sym->isPublic;
+      return clone;
     }
 
-private:
-    class StaticSymbolSource : public ISymbolSource {
-    public:
-        StaticSymbolSource() = default;
+    DISALLOW_COPY_AND_ASSIGN(StaticSymbolSource);
+  };
 
-        std::unique_ptr<SymbolTable::Symbol> findByName(const ResourceName& name) override {
-            auto iter = mNameMap.find(name);
-            if (iter != mNameMap.end()) {
-                return cloneSymbol(iter->second);
-            }
-            return nullptr;
-        }
-
-        std::unique_ptr<SymbolTable::Symbol> findById(ResourceId id) override {
-            auto iter = mIdMap.find(id);
-            if (iter != mIdMap.end()) {
-                return cloneSymbol(iter->second);
-            }
-            return nullptr;
-        }
-
-        std::list<std::unique_ptr<SymbolTable::Symbol>> mSymbols;
-        std::map<ResourceName, SymbolTable::Symbol*> mNameMap;
-        std::map<ResourceId, SymbolTable::Symbol*> mIdMap;
-
-    private:
-        std::unique_ptr<SymbolTable::Symbol> cloneSymbol(SymbolTable::Symbol* sym) {
-            std::unique_ptr<SymbolTable::Symbol> clone = util::make_unique<SymbolTable::Symbol>();
-            clone->id = sym->id;
-            if (sym->attribute) {
-                clone->attribute = std::unique_ptr<Attribute>(sym->attribute->clone(nullptr));
-            }
-            clone->isPublic = sym->isPublic;
-            return clone;
-        }
-
-        DISALLOW_COPY_AND_ASSIGN(StaticSymbolSource);
-    };
-
-    std::unique_ptr<StaticSymbolSource> mSymbolSource = util::make_unique<StaticSymbolSource>();
+  std::unique_ptr<StaticSymbolSource> mSymbolSource =
+      util::make_unique<StaticSymbolSource>();
 };
 
-} // namespace test
-} // namespace aapt
+}  // namespace test
+}  // namespace aapt
 
 #endif /* AAPT_TEST_CONTEXT_H */
diff --git a/tools/aapt2/test/Test.h b/tools/aapt2/test/Test.h
index d4845cf..c9188bf 100644
--- a/tools/aapt2/test/Test.h
+++ b/tools/aapt2/test/Test.h
@@ -24,9 +24,7 @@
 #include <gtest/gtest.h>
 
 namespace aapt {
-namespace test {
+namespace test {}  // namespace test
+}  // namespace aapt
 
-} // namespace test
-} // namespace aapt
-
-#endif // AAPT_TEST_TEST_H
+#endif  // AAPT_TEST_TEST_H
diff --git a/tools/aapt2/unflatten/BinaryResourceParser.h b/tools/aapt2/unflatten/BinaryResourceParser.h
index 12bc13d..99f2bd4 100644
--- a/tools/aapt2/unflatten/BinaryResourceParser.h
+++ b/tools/aapt2/unflatten/BinaryResourceParser.h
@@ -39,80 +39,86 @@
  * chunks and types.
  */
 class BinaryResourceParser {
-public:
-    /*
-     * Creates a parser, which will read `len` bytes from `data`, and
-     * add any resources parsed to `table`. `source` is for logging purposes.
-     */
-    BinaryResourceParser(IAaptContext* context, ResourceTable* table, const Source& source,
-                         const void* data, size_t dataLen);
+ public:
+  /*
+   * Creates a parser, which will read `len` bytes from `data`, and
+   * add any resources parsed to `table`. `source` is for logging purposes.
+   */
+  BinaryResourceParser(IAaptContext* context, ResourceTable* table,
+                       const Source& source, const void* data, size_t dataLen);
 
-    BinaryResourceParser(const BinaryResourceParser&) = delete; // No copy.
+  BinaryResourceParser(const BinaryResourceParser&) = delete;  // No copy.
 
-    /*
-     * Parses the binary resource table and returns true if successful.
-     */
-    bool parse();
+  /*
+   * Parses the binary resource table and returns true if successful.
+   */
+  bool parse();
 
-private:
-    bool parseTable(const android::ResChunk_header* chunk);
-    bool parsePackage(const android::ResChunk_header* chunk);
-    bool parseTypeSpec(const android::ResChunk_header* chunk);
-    bool parseType(const ResourceTablePackage* package, const android::ResChunk_header* chunk);
+ private:
+  bool parseTable(const android::ResChunk_header* chunk);
+  bool parsePackage(const android::ResChunk_header* chunk);
+  bool parseTypeSpec(const android::ResChunk_header* chunk);
+  bool parseType(const ResourceTablePackage* package,
+                 const android::ResChunk_header* chunk);
 
-    std::unique_ptr<Item> parseValue(const ResourceNameRef& name, const ConfigDescription& config,
-                                     const android::Res_value* value, uint16_t flags);
+  std::unique_ptr<Item> parseValue(const ResourceNameRef& name,
+                                   const ConfigDescription& config,
+                                   const android::Res_value* value,
+                                   uint16_t flags);
 
-    std::unique_ptr<Value> parseMapEntry(const ResourceNameRef& name,
-                                         const ConfigDescription& config,
-                                         const android::ResTable_map_entry* map);
+  std::unique_ptr<Value> parseMapEntry(const ResourceNameRef& name,
+                                       const ConfigDescription& config,
+                                       const android::ResTable_map_entry* map);
 
-    std::unique_ptr<Style> parseStyle(const ResourceNameRef& name, const ConfigDescription& config,
+  std::unique_ptr<Style> parseStyle(const ResourceNameRef& name,
+                                    const ConfigDescription& config,
+                                    const android::ResTable_map_entry* map);
+
+  std::unique_ptr<Attribute> parseAttr(const ResourceNameRef& name,
+                                       const ConfigDescription& config,
+                                       const android::ResTable_map_entry* map);
+
+  std::unique_ptr<Array> parseArray(const ResourceNameRef& name,
+                                    const ConfigDescription& config,
+                                    const android::ResTable_map_entry* map);
+
+  std::unique_ptr<Plural> parsePlural(const ResourceNameRef& name,
+                                      const ConfigDescription& config,
                                       const android::ResTable_map_entry* map);
 
-    std::unique_ptr<Attribute> parseAttr(const ResourceNameRef& name,
-                                         const ConfigDescription& config,
-                                         const android::ResTable_map_entry* map);
+  /**
+   * If the mapEntry is a special type that denotes meta data (source, comment),
+   * then it is
+   * read and added to the Value.
+   * Returns true if the mapEntry was meta data.
+   */
+  bool collectMetaData(const android::ResTable_map& mapEntry, Value* value);
 
-    std::unique_ptr<Array> parseArray(const ResourceNameRef& name, const ConfigDescription& config,
-                                      const android::ResTable_map_entry* map);
+  IAaptContext* mContext;
+  ResourceTable* mTable;
 
-    std::unique_ptr<Plural> parsePlural(const ResourceNameRef& name,
-                                        const ConfigDescription& config,
-                                        const android::ResTable_map_entry* map);
+  const Source mSource;
 
-    /**
-     * If the mapEntry is a special type that denotes meta data (source, comment), then it is
-     * read and added to the Value.
-     * Returns true if the mapEntry was meta data.
-     */
-    bool collectMetaData(const android::ResTable_map& mapEntry, Value* value);
+  const void* mData;
+  const size_t mDataLen;
 
-    IAaptContext* mContext;
-    ResourceTable* mTable;
+  // The standard value string pool for resource values.
+  android::ResStringPool mValuePool;
 
-    const Source mSource;
+  // The string pool that holds the names of the types defined
+  // in this table.
+  android::ResStringPool mTypePool;
 
-    const void* mData;
-    const size_t mDataLen;
+  // The string pool that holds the names of the entries defined
+  // in this table.
+  android::ResStringPool mKeyPool;
 
-    // The standard value string pool for resource values.
-    android::ResStringPool mValuePool;
-
-    // The string pool that holds the names of the types defined
-    // in this table.
-    android::ResStringPool mTypePool;
-
-    // The string pool that holds the names of the entries defined
-    // in this table.
-    android::ResStringPool mKeyPool;
-
-    // A mapping of resource ID to resource name. When we finish parsing
-    // we use this to convert all resource IDs to symbolic references.
-    std::map<ResourceId, ResourceName> mIdIndex;
+  // A mapping of resource ID to resource name. When we finish parsing
+  // we use this to convert all resource IDs to symbolic references.
+  std::map<ResourceId, ResourceName> mIdIndex;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 namespace android {
 
@@ -121,13 +127,14 @@
  */
 
 inline const ResTable_map* begin(const ResTable_map_entry* map) {
-    return (const ResTable_map*)((const uint8_t*) map + aapt::util::deviceToHost32(map->size));
+  return (const ResTable_map*)((const uint8_t*)map +
+                               aapt::util::deviceToHost32(map->size));
 }
 
 inline const ResTable_map* end(const ResTable_map_entry* map) {
-    return begin(map) + aapt::util::deviceToHost32(map->count);
+  return begin(map) + aapt::util::deviceToHost32(map->count);
 }
 
-} // namespace android
+}  // namespace android
 
-#endif // AAPT_BINARY_RESOURCE_PARSER_H
+#endif  // AAPT_BINARY_RESOURCE_PARSER_H
diff --git a/tools/aapt2/unflatten/ResChunkPullParser.h b/tools/aapt2/unflatten/ResChunkPullParser.h
index a51d5bf..24fa63d 100644
--- a/tools/aapt2/unflatten/ResChunkPullParser.h
+++ b/tools/aapt2/unflatten/ResChunkPullParser.h
@@ -37,59 +37,62 @@
  * pointing to the data portion of a chunk.
  */
 class ResChunkPullParser {
-public:
-    enum class Event {
-        StartDocument,
-        EndDocument,
-        BadDocument,
+ public:
+  enum class Event {
+    StartDocument,
+    EndDocument,
+    BadDocument,
 
-        Chunk,
-    };
+    Chunk,
+  };
 
-    /**
-     * Returns false if the event is EndDocument or BadDocument.
-     */
-    static bool isGoodEvent(Event event);
+  /**
+   * Returns false if the event is EndDocument or BadDocument.
+   */
+  static bool isGoodEvent(Event event);
 
-    /**
-     * Create a ResChunkPullParser to read android::ResChunk_headers
-     * from the memory pointed to by data, of len bytes.
-     */
-    ResChunkPullParser(const void* data, size_t len);
+  /**
+   * Create a ResChunkPullParser to read android::ResChunk_headers
+   * from the memory pointed to by data, of len bytes.
+   */
+  ResChunkPullParser(const void* data, size_t len);
 
-    ResChunkPullParser(const ResChunkPullParser&) = delete;
+  ResChunkPullParser(const ResChunkPullParser&) = delete;
 
-    Event getEvent() const;
-    const std::string& getLastError() const;
-    const android::ResChunk_header* getChunk() const;
+  Event getEvent() const;
+  const std::string& getLastError() const;
+  const android::ResChunk_header* getChunk() const;
 
-    /**
-     * Move to the next android::ResChunk_header.
-     */
-    Event next();
+  /**
+   * Move to the next android::ResChunk_header.
+   */
+  Event next();
 
-private:
-    Event mEvent;
-    const android::ResChunk_header* mData;
-    size_t mLen;
-    const android::ResChunk_header* mCurrentChunk;
-    std::string mLastError;
+ private:
+  Event mEvent;
+  const android::ResChunk_header* mData;
+  size_t mLen;
+  const android::ResChunk_header* mCurrentChunk;
+  std::string mLastError;
 };
 
 template <typename T>
 inline static const T* convertTo(const android::ResChunk_header* chunk) {
-    if (util::deviceToHost16(chunk->headerSize) < sizeof(T)) {
-        return nullptr;
-    }
-    return reinterpret_cast<const T*>(chunk);
+  if (util::deviceToHost16(chunk->headerSize) < sizeof(T)) {
+    return nullptr;
+  }
+  return reinterpret_cast<const T*>(chunk);
 }
 
-inline static const uint8_t* getChunkData(const android::ResChunk_header* chunk) {
-    return reinterpret_cast<const uint8_t*>(chunk) + util::deviceToHost16(chunk->headerSize);
+inline static const uint8_t* getChunkData(
+    const android::ResChunk_header* chunk) {
+  return reinterpret_cast<const uint8_t*>(chunk) +
+         util::deviceToHost16(chunk->headerSize);
 }
 
 inline static uint32_t getChunkDataLen(const android::ResChunk_header* chunk) {
-    return util::deviceToHost32(chunk->size) - util::deviceToHost16(chunk->headerSize);
+  return util::deviceToHost32(chunk->size) -
+         util::deviceToHost16(chunk->headerSize);
 }
 
 //
@@ -97,28 +100,27 @@
 //
 
 inline bool ResChunkPullParser::isGoodEvent(ResChunkPullParser::Event event) {
-    return event != Event::EndDocument && event != Event::BadDocument;
+  return event != Event::EndDocument && event != Event::BadDocument;
 }
 
-inline ResChunkPullParser::ResChunkPullParser(const void* data, size_t len) :
-        mEvent(Event::StartDocument),
-        mData(reinterpret_cast<const android::ResChunk_header*>(data)),
-        mLen(len),
-        mCurrentChunk(nullptr) {
-}
+inline ResChunkPullParser::ResChunkPullParser(const void* data, size_t len)
+    : mEvent(Event::StartDocument),
+      mData(reinterpret_cast<const android::ResChunk_header*>(data)),
+      mLen(len),
+      mCurrentChunk(nullptr) {}
 
 inline ResChunkPullParser::Event ResChunkPullParser::getEvent() const {
-    return mEvent;
+  return mEvent;
 }
 
 inline const std::string& ResChunkPullParser::getLastError() const {
-    return mLastError;
+  return mLastError;
 }
 
 inline const android::ResChunk_header* ResChunkPullParser::getChunk() const {
-    return mCurrentChunk;
+  return mCurrentChunk;
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_RES_CHUNK_PULL_PARSER_H
+#endif  // AAPT_RES_CHUNK_PULL_PARSER_H
diff --git a/tools/aapt2/util/BigBuffer.h b/tools/aapt2/util/BigBuffer.h
index 685614f..b273733 100644
--- a/tools/aapt2/util/BigBuffer.h
+++ b/tools/aapt2/util/BigBuffer.h
@@ -32,156 +32,153 @@
  * block is allocated and appended to the end of the list.
  */
 class BigBuffer {
-public:
+ public:
+  /**
+   * A contiguous block of allocated memory.
+   */
+  struct Block {
     /**
-     * A contiguous block of allocated memory.
+     * Pointer to the memory.
      */
-    struct Block {
-        /**
-         * Pointer to the memory.
-         */
-        std::unique_ptr<uint8_t[]> buffer;
-
-        /**
-         * Size of memory that is currently occupied. The actual
-         * allocation may be larger.
-         */
-        size_t size;
-
-    private:
-        friend class BigBuffer;
-
-        /**
-         * The size of the memory block allocation.
-         */
-        size_t mBlockSize;
-    };
-
-    typedef std::vector<Block>::const_iterator const_iterator;
+    std::unique_ptr<uint8_t[]> buffer;
 
     /**
-     * Create a BigBuffer with block allocation sizes
-     * of blockSize.
+     * Size of memory that is currently occupied. The actual
+     * allocation may be larger.
      */
-    explicit BigBuffer(size_t blockSize);
+    size_t size;
 
-    BigBuffer(const BigBuffer&) = delete; // No copying.
-
-    BigBuffer(BigBuffer&& rhs);
+   private:
+    friend class BigBuffer;
 
     /**
-     * Number of occupied bytes in all the allocated blocks.
+     * The size of the memory block allocation.
      */
-    size_t size() const;
-
-    /**
-     * Returns a pointer to an array of T, where T is
-     * a POD type. The elements are zero-initialized.
-     */
-    template <typename T>
-    T* nextBlock(size_t count = 1);
-
-    /**
-     * Returns the next block available and puts the size in outCount.
-     * This is useful for grabbing blocks where the size doesn't matter.
-     * Use backUp() to give back any bytes that were not used.
-     */
-    void* nextBlock(size_t* outCount);
-
-    /**
-     * Backs up count bytes. This must only be called after nextBlock()
-     * and can not be larger than sizeof(T) * count of the last nextBlock()
-     * call.
-     */
-    void backUp(size_t count);
-
-    /**
-     * Moves the specified BigBuffer into this one. When this method
-     * returns, buffer is empty.
-     */
-    void appendBuffer(BigBuffer&& buffer);
-
-    /**
-     * Pads the block with 'bytes' bytes of zero values.
-     */
-    void pad(size_t bytes);
-
-    /**
-     * Pads the block so that it aligns on a 4 byte boundary.
-     */
-    void align4();
-
-    size_t getBlockSize() const;
-
-    const_iterator begin() const;
-    const_iterator end() const;
-
-private:
-    /**
-     * Returns a pointer to a buffer of the requested size.
-     * The buffer is zero-initialized.
-     */
-    void* nextBlockImpl(size_t size);
-
     size_t mBlockSize;
-    size_t mSize;
-    std::vector<Block> mBlocks;
+  };
+
+  typedef std::vector<Block>::const_iterator const_iterator;
+
+  /**
+   * Create a BigBuffer with block allocation sizes
+   * of blockSize.
+   */
+  explicit BigBuffer(size_t blockSize);
+
+  BigBuffer(const BigBuffer&) = delete;  // No copying.
+
+  BigBuffer(BigBuffer&& rhs);
+
+  /**
+   * Number of occupied bytes in all the allocated blocks.
+   */
+  size_t size() const;
+
+  /**
+   * Returns a pointer to an array of T, where T is
+   * a POD type. The elements are zero-initialized.
+   */
+  template <typename T>
+  T* nextBlock(size_t count = 1);
+
+  /**
+   * Returns the next block available and puts the size in outCount.
+   * This is useful for grabbing blocks where the size doesn't matter.
+   * Use backUp() to give back any bytes that were not used.
+   */
+  void* nextBlock(size_t* outCount);
+
+  /**
+   * Backs up count bytes. This must only be called after nextBlock()
+   * and can not be larger than sizeof(T) * count of the last nextBlock()
+   * call.
+   */
+  void backUp(size_t count);
+
+  /**
+   * Moves the specified BigBuffer into this one. When this method
+   * returns, buffer is empty.
+   */
+  void appendBuffer(BigBuffer&& buffer);
+
+  /**
+   * Pads the block with 'bytes' bytes of zero values.
+   */
+  void pad(size_t bytes);
+
+  /**
+   * Pads the block so that it aligns on a 4 byte boundary.
+   */
+  void align4();
+
+  size_t getBlockSize() const;
+
+  const_iterator begin() const;
+  const_iterator end() const;
+
+ private:
+  /**
+   * Returns a pointer to a buffer of the requested size.
+   * The buffer is zero-initialized.
+   */
+  void* nextBlockImpl(size_t size);
+
+  size_t mBlockSize;
+  size_t mSize;
+  std::vector<Block> mBlocks;
 };
 
-inline BigBuffer::BigBuffer(size_t blockSize) : mBlockSize(blockSize), mSize(0) {
-}
+inline BigBuffer::BigBuffer(size_t blockSize)
+    : mBlockSize(blockSize), mSize(0) {}
 
-inline BigBuffer::BigBuffer(BigBuffer&& rhs) :
-        mBlockSize(rhs.mBlockSize), mSize(rhs.mSize), mBlocks(std::move(rhs.mBlocks)) {
-}
+inline BigBuffer::BigBuffer(BigBuffer&& rhs)
+    : mBlockSize(rhs.mBlockSize),
+      mSize(rhs.mSize),
+      mBlocks(std::move(rhs.mBlocks)) {}
 
-inline size_t BigBuffer::size() const {
-    return mSize;
-}
+inline size_t BigBuffer::size() const { return mSize; }
 
-inline size_t BigBuffer::getBlockSize() const {
-    return mBlockSize;
-}
+inline size_t BigBuffer::getBlockSize() const { return mBlockSize; }
 
 template <typename T>
 inline T* BigBuffer::nextBlock(size_t count) {
-    static_assert(std::is_standard_layout<T>::value, "T must be standard_layout type");
-    assert(count != 0);
-    return reinterpret_cast<T*>(nextBlockImpl(sizeof(T) * count));
+  static_assert(std::is_standard_layout<T>::value,
+                "T must be standard_layout type");
+  assert(count != 0);
+  return reinterpret_cast<T*>(nextBlockImpl(sizeof(T) * count));
 }
 
 inline void BigBuffer::backUp(size_t count) {
-    Block& block = mBlocks.back();
-    block.size -= count;
-    mSize -= count;
+  Block& block = mBlocks.back();
+  block.size -= count;
+  mSize -= count;
 }
 
 inline void BigBuffer::appendBuffer(BigBuffer&& buffer) {
-    std::move(buffer.mBlocks.begin(), buffer.mBlocks.end(), std::back_inserter(mBlocks));
-    mSize += buffer.mSize;
-    buffer.mBlocks.clear();
-    buffer.mSize = 0;
+  std::move(buffer.mBlocks.begin(), buffer.mBlocks.end(),
+            std::back_inserter(mBlocks));
+  mSize += buffer.mSize;
+  buffer.mBlocks.clear();
+  buffer.mSize = 0;
 }
 
-inline void BigBuffer::pad(size_t bytes) {
-    nextBlock<char>(bytes);
-}
+inline void BigBuffer::pad(size_t bytes) { nextBlock<char>(bytes); }
 
 inline void BigBuffer::align4() {
-    const size_t unaligned = mSize % 4;
-    if (unaligned != 0) {
-        pad(4 - unaligned);
-    }
+  const size_t unaligned = mSize % 4;
+  if (unaligned != 0) {
+    pad(4 - unaligned);
+  }
 }
 
 inline BigBuffer::const_iterator BigBuffer::begin() const {
-    return mBlocks.begin();
+  return mBlocks.begin();
 }
 
 inline BigBuffer::const_iterator BigBuffer::end() const {
-    return mBlocks.end();
+  return mBlocks.end();
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_BIG_BUFFER_H
+#endif  // AAPT_BIG_BUFFER_H
diff --git a/tools/aapt2/util/Files.h b/tools/aapt2/util/Files.h
index 52c2052..d90c6b6 100644
--- a/tools/aapt2/util/Files.h
+++ b/tools/aapt2/util/Files.h
@@ -39,15 +39,15 @@
 #endif
 
 enum class FileType {
-    kUnknown = 0,
-    kNonexistant,
-    kRegular,
-    kDirectory,
-    kCharDev,
-    kBlockDev,
-    kFifo,
-    kSymlink,
-    kSocket,
+  kUnknown = 0,
+  kNonexistant,
+  kRegular,
+  kDirectory,
+  kCharDev,
+  kBlockDev,
+  kFifo,
+  kSymlink,
+  kSocket,
 };
 
 FileType getFileType(const StringPiece& path);
@@ -93,12 +93,14 @@
 /**
  * Creates a FileMap for the file at path.
  */
-Maybe<android::FileMap> mmapPath(const StringPiece& path, std::string* outError);
+Maybe<android::FileMap> mmapPath(const StringPiece& path,
+                                 std::string* outError);
 
 /**
  * Reads the file at path and appends each line to the outArgList vector.
  */
-bool appendArgsFromFile(const StringPiece& path, std::vector<std::string>* outArgList,
+bool appendArgsFromFile(const StringPiece& path,
+                        std::vector<std::string>* outArgList,
                         std::string* outError);
 
 /*
@@ -108,37 +110,36 @@
  * FileFilter::setPattern(const std::string&) method.
  */
 class FileFilter {
-public:
-    explicit FileFilter(IDiagnostics* diag) : mDiag(diag) {
-    }
+ public:
+  explicit FileFilter(IDiagnostics* diag) : mDiag(diag) {}
 
-    /*
-     * Patterns syntax:
-     * - Delimiter is :
-     * - Entry can start with the flag ! to avoid printing a warning
-     *   about the file being ignored.
-     * - Entry can have the flag "<dir>" to match only directories
-     *   or <file> to match only files. Default is to match both.
-     * - Entry can be a simplified glob "<prefix>*" or "*<suffix>"
-     *   where prefix/suffix must have at least 1 character (so that
-     *   we don't match a '*' catch-all pattern.)
-     * - The special filenames "." and ".." are always ignored.
-     * - Otherwise the full string is matched.
-     * - match is not case-sensitive.
-     */
-    bool setPattern(const StringPiece& pattern);
+  /*
+   * Patterns syntax:
+   * - Delimiter is :
+   * - Entry can start with the flag ! to avoid printing a warning
+   *   about the file being ignored.
+   * - Entry can have the flag "<dir>" to match only directories
+   *   or <file> to match only files. Default is to match both.
+   * - Entry can be a simplified glob "<prefix>*" or "*<suffix>"
+   *   where prefix/suffix must have at least 1 character (so that
+   *   we don't match a '*' catch-all pattern.)
+   * - The special filenames "." and ".." are always ignored.
+   * - Otherwise the full string is matched.
+   * - match is not case-sensitive.
+   */
+  bool setPattern(const StringPiece& pattern);
 
-    /**
-     * Applies the filter, returning true for pass, false for fail.
-     */
-    bool operator()(const std::string& filename, FileType type) const;
+  /**
+   * Applies the filter, returning true for pass, false for fail.
+   */
+  bool operator()(const std::string& filename, FileType type) const;
 
-private:
-    IDiagnostics* mDiag;
-    std::vector<std::string> mPatternTokens;
+ private:
+  IDiagnostics* mDiag;
+  std::vector<std::string> mPatternTokens;
 };
 
-} // namespace file
-} // namespace aapt
+}  // namespace file
+}  // namespace aapt
 
-#endif // AAPT_FILES_H
+#endif  // AAPT_FILES_H
diff --git a/tools/aapt2/util/ImmutableMap.h b/tools/aapt2/util/ImmutableMap.h
index b1f9e9d..6f48764 100644
--- a/tools/aapt2/util/ImmutableMap.h
+++ b/tools/aapt2/util/ImmutableMap.h
@@ -26,59 +26,57 @@
 
 template <typename TKey, typename TValue>
 class ImmutableMap {
-    static_assert(is_comparable<TKey, TKey>::value, "key is not comparable");
+  static_assert(is_comparable<TKey, TKey>::value, "key is not comparable");
 
-private:
-    std::vector<std::pair<TKey, TValue>> mData;
+ private:
+  std::vector<std::pair<TKey, TValue>> mData;
 
-    explicit ImmutableMap(std::vector<std::pair<TKey, TValue>> data) : mData(std::move(data)) {
+  explicit ImmutableMap(std::vector<std::pair<TKey, TValue>> data)
+      : mData(std::move(data)) {}
+
+ public:
+  using const_iterator = typename decltype(mData)::const_iterator;
+
+  ImmutableMap(ImmutableMap&&) = default;
+  ImmutableMap& operator=(ImmutableMap&&) = default;
+
+  ImmutableMap(const ImmutableMap&) = delete;
+  ImmutableMap& operator=(const ImmutableMap&) = delete;
+
+  static ImmutableMap<TKey, TValue> createPreSorted(
+      std::initializer_list<std::pair<TKey, TValue>> list) {
+    return ImmutableMap(
+        std::vector<std::pair<TKey, TValue>>(list.begin(), list.end()));
+  }
+
+  static ImmutableMap<TKey, TValue> createAndSort(
+      std::initializer_list<std::pair<TKey, TValue>> list) {
+    std::vector<std::pair<TKey, TValue>> data(list.begin(), list.end());
+    std::sort(data.begin(), data.end());
+    return ImmutableMap(std::move(data));
+  }
+
+  template <typename TKey2, typename = typename std::enable_if<
+                                is_comparable<TKey, TKey2>::value>::type>
+  const_iterator find(const TKey2& key) const {
+    auto cmp = [](const std::pair<TKey, TValue>& candidate,
+                  const TKey2& target) -> bool {
+      return candidate.first < target;
+    };
+
+    const_iterator endIter = end();
+    auto iter = std::lower_bound(mData.begin(), endIter, key, cmp);
+    if (iter == endIter || iter->first == key) {
+      return iter;
     }
+    return endIter;
+  }
 
-public:
-    using const_iterator = typename decltype(mData)::const_iterator;
+  const_iterator begin() const { return mData.begin(); }
 
-    ImmutableMap(ImmutableMap&&) = default;
-    ImmutableMap& operator=(ImmutableMap&&) = default;
-
-    ImmutableMap(const ImmutableMap&) = delete;
-    ImmutableMap& operator=(const ImmutableMap&) = delete;
-
-    static ImmutableMap<TKey, TValue> createPreSorted(
-            std::initializer_list<std::pair<TKey, TValue>> list) {
-        return ImmutableMap(std::vector<std::pair<TKey, TValue>>(list.begin(), list.end()));
-    }
-
-    static ImmutableMap<TKey, TValue> createAndSort(
-            std::initializer_list<std::pair<TKey, TValue>> list) {
-        std::vector<std::pair<TKey, TValue>> data(list.begin(), list.end());
-        std::sort(data.begin(), data.end());
-        return ImmutableMap(std::move(data));
-    }
-
-    template <typename TKey2,
-              typename = typename std::enable_if<is_comparable<TKey, TKey2>::value>::type>
-    const_iterator find(const TKey2& key) const {
-        auto cmp = [](const std::pair<TKey, TValue>& candidate, const TKey2& target) -> bool {
-            return candidate.first < target;
-        };
-
-        const_iterator endIter = end();
-        auto iter = std::lower_bound(mData.begin(), endIter, key, cmp);
-        if (iter == endIter || iter->first == key) {
-            return iter;
-        }
-        return endIter;
-    }
-
-    const_iterator begin() const {
-        return mData.begin();
-    }
-
-    const_iterator end() const {
-        return mData.end();
-    }
+  const_iterator end() const { return mData.end(); }
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_UTIL_IMMUTABLEMAP_H */
diff --git a/tools/aapt2/util/Maybe.h b/tools/aapt2/util/Maybe.h
index 129f6d9..90a0198 100644
--- a/tools/aapt2/util/Maybe.h
+++ b/tools/aapt2/util/Maybe.h
@@ -32,303 +32,292 @@
  */
 template <typename T>
 class Maybe {
-public:
-    /**
-     * Construct Nothing.
-     */
-    Maybe();
+ public:
+  /**
+   * Construct Nothing.
+   */
+  Maybe();
 
-    ~Maybe();
+  ~Maybe();
 
-    Maybe(const Maybe& rhs);
+  Maybe(const Maybe& rhs);
 
-    template <typename U>
-    Maybe(const Maybe<U>& rhs);  // NOLINT(implicit)
+  template <typename U>
+  Maybe(const Maybe<U>& rhs);  // NOLINT(implicit)
 
-    Maybe(Maybe&& rhs);
+  Maybe(Maybe&& rhs);
 
-    template <typename U>
-    Maybe(Maybe<U>&& rhs);  // NOLINT(implicit)
+  template <typename U>
+  Maybe(Maybe<U>&& rhs);  // NOLINT(implicit)
 
-    Maybe& operator=(const Maybe& rhs);
+  Maybe& operator=(const Maybe& rhs);
 
-    template <typename U>
-    Maybe& operator=(const Maybe<U>& rhs);
+  template <typename U>
+  Maybe& operator=(const Maybe<U>& rhs);
 
-    Maybe& operator=(Maybe&& rhs);
+  Maybe& operator=(Maybe&& rhs);
 
-    template <typename U>
-    Maybe& operator=(Maybe<U>&& rhs);
+  template <typename U>
+  Maybe& operator=(Maybe<U>&& rhs);
 
-    /**
-     * Construct a Maybe holding a value.
-     */
-    Maybe(const T& value);  // NOLINT(implicit)
+  /**
+   * Construct a Maybe holding a value.
+   */
+  Maybe(const T& value);  // NOLINT(implicit)
 
-    /**
-     * Construct a Maybe holding a value.
-     */
-    Maybe(T&& value);  // NOLINT(implicit)
+  /**
+   * Construct a Maybe holding a value.
+   */
+  Maybe(T&& value);  // NOLINT(implicit)
 
-    /**
-     * True if this holds a value, false if
-     * it holds Nothing.
-     */
-    explicit operator bool() const;
+  /**
+   * True if this holds a value, false if
+   * it holds Nothing.
+   */
+  explicit operator bool() const;
 
-    /**
-     * Gets the value if one exists, or else
-     * panics.
-     */
-    T& value();
+  /**
+   * Gets the value if one exists, or else
+   * panics.
+   */
+  T& value();
 
-    /**
-     * Gets the value if one exists, or else
-     * panics.
-     */
-    const T& value() const;
+  /**
+   * Gets the value if one exists, or else
+   * panics.
+   */
+  const T& value() const;
 
-    T valueOrDefault(const T& def) const;
+  T valueOrDefault(const T& def) const;
 
-private:
-    template <typename U>
-    friend class Maybe;
+ private:
+  template <typename U>
+  friend class Maybe;
 
-    template <typename U>
-    Maybe& copy(const Maybe<U>& rhs);
+  template <typename U>
+  Maybe& copy(const Maybe<U>& rhs);
 
-    template <typename U>
-    Maybe& move(Maybe<U>&& rhs);
+  template <typename U>
+  Maybe& move(Maybe<U>&& rhs);
 
-    void destroy();
+  void destroy();
 
-    bool mNothing;
+  bool mNothing;
 
-    typename std::aligned_storage<sizeof(T), alignof(T)>::type mStorage;
+  typename std::aligned_storage<sizeof(T), alignof(T)>::type mStorage;
 };
 
 template <typename T>
-Maybe<T>::Maybe()
-: mNothing(true) {
-}
+Maybe<T>::Maybe() : mNothing(true) {}
 
 template <typename T>
 Maybe<T>::~Maybe() {
-    if (!mNothing) {
-        destroy();
-    }
+  if (!mNothing) {
+    destroy();
+  }
 }
 
 template <typename T>
-Maybe<T>::Maybe(const Maybe& rhs)
-: mNothing(rhs.mNothing) {
-    if (!rhs.mNothing) {
-        new (&mStorage) T(reinterpret_cast<const T&>(rhs.mStorage));
-    }
+Maybe<T>::Maybe(const Maybe& rhs) : mNothing(rhs.mNothing) {
+  if (!rhs.mNothing) {
+    new (&mStorage) T(reinterpret_cast<const T&>(rhs.mStorage));
+  }
 }
 
 template <typename T>
 template <typename U>
-Maybe<T>::Maybe(const Maybe<U>& rhs)
-: mNothing(rhs.mNothing) {
-    if (!rhs.mNothing) {
-        new (&mStorage) T(reinterpret_cast<const U&>(rhs.mStorage));
-    }
+Maybe<T>::Maybe(const Maybe<U>& rhs) : mNothing(rhs.mNothing) {
+  if (!rhs.mNothing) {
+    new (&mStorage) T(reinterpret_cast<const U&>(rhs.mStorage));
+  }
 }
 
 template <typename T>
-Maybe<T>::Maybe(Maybe&& rhs)
-: mNothing(rhs.mNothing) {
-    if (!rhs.mNothing) {
-        rhs.mNothing = true;
+Maybe<T>::Maybe(Maybe&& rhs) : mNothing(rhs.mNothing) {
+  if (!rhs.mNothing) {
+    rhs.mNothing = true;
 
-        // Move the value from rhs.
-        new (&mStorage) T(std::move(reinterpret_cast<T&>(rhs.mStorage)));
-        rhs.destroy();
-    }
+    // Move the value from rhs.
+    new (&mStorage) T(std::move(reinterpret_cast<T&>(rhs.mStorage)));
+    rhs.destroy();
+  }
 }
 
 template <typename T>
 template <typename U>
-Maybe<T>::Maybe(Maybe<U>&& rhs)
-: mNothing(rhs.mNothing) {
-    if (!rhs.mNothing) {
-        rhs.mNothing = true;
+Maybe<T>::Maybe(Maybe<U>&& rhs) : mNothing(rhs.mNothing) {
+  if (!rhs.mNothing) {
+    rhs.mNothing = true;
 
-        // Move the value from rhs.
-        new (&mStorage) T(std::move(reinterpret_cast<U&>(rhs.mStorage)));
-        rhs.destroy();
-    }
+    // Move the value from rhs.
+    new (&mStorage) T(std::move(reinterpret_cast<U&>(rhs.mStorage)));
+    rhs.destroy();
+  }
 }
 
 template <typename T>
 inline Maybe<T>& Maybe<T>::operator=(const Maybe& rhs) {
-    // Delegate to the actual assignment.
-    return copy(rhs);
+  // Delegate to the actual assignment.
+  return copy(rhs);
 }
 
 template <typename T>
 template <typename U>
 inline Maybe<T>& Maybe<T>::operator=(const Maybe<U>& rhs) {
-    return copy(rhs);
+  return copy(rhs);
 }
 
 template <typename T>
 template <typename U>
 Maybe<T>& Maybe<T>::copy(const Maybe<U>& rhs) {
-    if (mNothing && rhs.mNothing) {
-        // Both are nothing, nothing to do.
-        return *this;
-    } else if  (!mNothing && !rhs.mNothing) {
-        // We both are something, so assign rhs to us.
-        reinterpret_cast<T&>(mStorage) = reinterpret_cast<const U&>(rhs.mStorage);
-    } else if (mNothing) {
-        // We are nothing but rhs is something.
-        mNothing = rhs.mNothing;
-
-        // Copy the value from rhs.
-        new (&mStorage) T(reinterpret_cast<const U&>(rhs.mStorage));
-    } else {
-        // We are something but rhs is nothing, so destroy our value.
-        mNothing = rhs.mNothing;
-        destroy();
-    }
+  if (mNothing && rhs.mNothing) {
+    // Both are nothing, nothing to do.
     return *this;
+  } else if (!mNothing && !rhs.mNothing) {
+    // We both are something, so assign rhs to us.
+    reinterpret_cast<T&>(mStorage) = reinterpret_cast<const U&>(rhs.mStorage);
+  } else if (mNothing) {
+    // We are nothing but rhs is something.
+    mNothing = rhs.mNothing;
+
+    // Copy the value from rhs.
+    new (&mStorage) T(reinterpret_cast<const U&>(rhs.mStorage));
+  } else {
+    // We are something but rhs is nothing, so destroy our value.
+    mNothing = rhs.mNothing;
+    destroy();
+  }
+  return *this;
 }
 
 template <typename T>
 inline Maybe<T>& Maybe<T>::operator=(Maybe&& rhs) {
-    // Delegate to the actual assignment.
-    return move(std::forward<Maybe<T>>(rhs));
+  // Delegate to the actual assignment.
+  return move(std::forward<Maybe<T>>(rhs));
 }
 
 template <typename T>
 template <typename U>
 inline Maybe<T>& Maybe<T>::operator=(Maybe<U>&& rhs) {
-    return move(std::forward<Maybe<U>>(rhs));
+  return move(std::forward<Maybe<U>>(rhs));
 }
 
 template <typename T>
 template <typename U>
 Maybe<T>& Maybe<T>::move(Maybe<U>&& rhs) {
-    if (mNothing && rhs.mNothing) {
-        // Both are nothing, nothing to do.
-        return *this;
-    } else if  (!mNothing && !rhs.mNothing) {
-        // We both are something, so move assign rhs to us.
-        rhs.mNothing = true;
-        reinterpret_cast<T&>(mStorage) = std::move(reinterpret_cast<U&>(rhs.mStorage));
-        rhs.destroy();
-    } else if (mNothing) {
-        // We are nothing but rhs is something.
-        mNothing = false;
-        rhs.mNothing = true;
-
-        // Move the value from rhs.
-        new (&mStorage) T(std::move(reinterpret_cast<U&>(rhs.mStorage)));
-        rhs.destroy();
-    } else {
-        // We are something but rhs is nothing, so destroy our value.
-        mNothing = true;
-        destroy();
-    }
+  if (mNothing && rhs.mNothing) {
+    // Both are nothing, nothing to do.
     return *this;
+  } else if (!mNothing && !rhs.mNothing) {
+    // We both are something, so move assign rhs to us.
+    rhs.mNothing = true;
+    reinterpret_cast<T&>(mStorage) =
+        std::move(reinterpret_cast<U&>(rhs.mStorage));
+    rhs.destroy();
+  } else if (mNothing) {
+    // We are nothing but rhs is something.
+    mNothing = false;
+    rhs.mNothing = true;
+
+    // Move the value from rhs.
+    new (&mStorage) T(std::move(reinterpret_cast<U&>(rhs.mStorage)));
+    rhs.destroy();
+  } else {
+    // We are something but rhs is nothing, so destroy our value.
+    mNothing = true;
+    destroy();
+  }
+  return *this;
 }
 
 template <typename T>
-Maybe<T>::Maybe(const T& value)
-: mNothing(false) {
-    new (&mStorage) T(value);
+Maybe<T>::Maybe(const T& value) : mNothing(false) {
+  new (&mStorage) T(value);
 }
 
 template <typename T>
-Maybe<T>::Maybe(T&& value)
-: mNothing(false) {
-    new (&mStorage) T(std::forward<T>(value));
+Maybe<T>::Maybe(T&& value) : mNothing(false) {
+  new (&mStorage) T(std::forward<T>(value));
 }
 
 template <typename T>
 Maybe<T>::operator bool() const {
-    return !mNothing;
+  return !mNothing;
 }
 
 template <typename T>
 T& Maybe<T>::value() {
-    assert(!mNothing && "Maybe<T>::value() called on Nothing");
-    return reinterpret_cast<T&>(mStorage);
+  assert(!mNothing && "Maybe<T>::value() called on Nothing");
+  return reinterpret_cast<T&>(mStorage);
 }
 
 template <typename T>
 const T& Maybe<T>::value() const {
-    assert(!mNothing && "Maybe<T>::value() called on Nothing");
-    return reinterpret_cast<const T&>(mStorage);
+  assert(!mNothing && "Maybe<T>::value() called on Nothing");
+  return reinterpret_cast<const T&>(mStorage);
 }
 
 template <typename T>
 T Maybe<T>::valueOrDefault(const T& def) const {
-    if (mNothing) {
-        return def;
-    }
-    return reinterpret_cast<const T&>(mStorage);
+  if (mNothing) {
+    return def;
+  }
+  return reinterpret_cast<const T&>(mStorage);
 }
 
 template <typename T>
 void Maybe<T>::destroy() {
-    reinterpret_cast<T&>(mStorage).~T();
+  reinterpret_cast<T&>(mStorage).~T();
 }
 
 template <typename T>
 inline Maybe<typename std::remove_reference<T>::type> make_value(T&& value) {
-    return Maybe<typename std::remove_reference<T>::type>(std::forward<T>(value));
+  return Maybe<typename std::remove_reference<T>::type>(std::forward<T>(value));
 }
 
 template <typename T>
 inline Maybe<T> make_nothing() {
-    return Maybe<T>();
+  return Maybe<T>();
 }
 
 /**
- * Define the == operator between Maybe<T> and Maybe<U> only if the operator T == U is defined.
- * That way the compiler will show an error at the callsite when comparing two Maybe<> objects
+ * Define the == operator between Maybe<T> and Maybe<U> only if the operator T
+ * == U is defined.
+ * That way the compiler will show an error at the callsite when comparing two
+ * Maybe<> objects
  * whose inner types can't be compared.
  */
 template <typename T, typename U>
-typename std::enable_if<
-        has_eq_op<T, U>::value,
-        bool
->::type operator==(const Maybe<T>& a, const Maybe<U>& b) {
-    if (a && b) {
-        return a.value() == b.value();
-    } else if (!a && !b) {
-        return true;
-    }
-    return false;
+typename std::enable_if<has_eq_op<T, U>::value, bool>::type operator==(
+    const Maybe<T>& a, const Maybe<U>& b) {
+  if (a && b) {
+    return a.value() == b.value();
+  } else if (!a && !b) {
+    return true;
+  }
+  return false;
 }
 
 /**
  * Same as operator== but negated.
  */
 template <typename T, typename U>
-typename std::enable_if<
-        has_eq_op<T, U>::value,
-        bool
->::type operator!=(const Maybe<T>& a, const Maybe<U>& b) {
-    return !(a == b);
+typename std::enable_if<has_eq_op<T, U>::value, bool>::type operator!=(
+    const Maybe<T>& a, const Maybe<U>& b) {
+  return !(a == b);
 }
 
 template <typename T, typename U>
-typename std::enable_if<
-        has_lt_op<T, U>::value,
-        bool
->::type operator<(const Maybe<T>& a, const Maybe<U>& b) {
-    if (a && b) {
-        return a.value() < b.value();
-    } else if (!a && !b) {
-        return false;
-    }
-    return !a;
+typename std::enable_if<has_lt_op<T, U>::value, bool>::type operator<(
+    const Maybe<T>& a, const Maybe<U>& b) {
+  if (a && b) {
+    return a.value() < b.value();
+  } else if (!a && !b) {
+    return false;
+  }
+  return !a;
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_MAYBE_H
+#endif  // AAPT_MAYBE_H
diff --git a/tools/aapt2/util/StringPiece.h b/tools/aapt2/util/StringPiece.h
index 266c003..de93822 100644
--- a/tools/aapt2/util/StringPiece.h
+++ b/tools/aapt2/util/StringPiece.h
@@ -17,11 +17,11 @@
 #ifndef AAPT_STRING_PIECE_H
 #define AAPT_STRING_PIECE_H
 
-#include <ostream>
-#include <string>
 #include <utils/JenkinsHash.h>
 #include <utils/String8.h>
 #include <utils/Unicode.h>
+#include <ostream>
+#include <string>
 
 namespace aapt {
 
@@ -35,45 +35,46 @@
  */
 template <typename TChar>
 class BasicStringPiece {
-public:
-    using const_iterator = const TChar*;
-    using difference_type = size_t;
+ public:
+  using const_iterator = const TChar*;
+  using difference_type = size_t;
 
-    // End of string marker.
-    constexpr static const size_t npos = static_cast<size_t>(-1);
+  // End of string marker.
+  constexpr static const size_t npos = static_cast<size_t>(-1);
 
-    BasicStringPiece();
-    BasicStringPiece(const BasicStringPiece<TChar>& str);
-    BasicStringPiece(const std::basic_string<TChar>& str);  // NOLINT(implicit)
-    BasicStringPiece(const TChar* str);  // NOLINT(implicit)
-    BasicStringPiece(const TChar* str, size_t len);
+  BasicStringPiece();
+  BasicStringPiece(const BasicStringPiece<TChar>& str);
+  BasicStringPiece(const std::basic_string<TChar>& str);  // NOLINT(implicit)
+  BasicStringPiece(const TChar* str);                     // NOLINT(implicit)
+  BasicStringPiece(const TChar* str, size_t len);
 
-    BasicStringPiece<TChar>& operator=(const BasicStringPiece<TChar>& rhs);
-    BasicStringPiece<TChar>& assign(const TChar* str, size_t len);
+  BasicStringPiece<TChar>& operator=(const BasicStringPiece<TChar>& rhs);
+  BasicStringPiece<TChar>& assign(const TChar* str, size_t len);
 
-    BasicStringPiece<TChar> substr(size_t start, size_t len = npos) const;
-    BasicStringPiece<TChar> substr(BasicStringPiece<TChar>::const_iterator begin,
-                                   BasicStringPiece<TChar>::const_iterator end) const;
+  BasicStringPiece<TChar> substr(size_t start, size_t len = npos) const;
+  BasicStringPiece<TChar> substr(
+      BasicStringPiece<TChar>::const_iterator begin,
+      BasicStringPiece<TChar>::const_iterator end) const;
 
-    const TChar* data() const;
-    size_t length() const;
-    size_t size() const;
-    bool empty() const;
-    std::basic_string<TChar> toString() const;
+  const TChar* data() const;
+  size_t length() const;
+  size_t size() const;
+  bool empty() const;
+  std::basic_string<TChar> toString() const;
 
-    bool contains(const BasicStringPiece<TChar>& rhs) const;
-    int compare(const BasicStringPiece<TChar>& rhs) const;
-    bool operator<(const BasicStringPiece<TChar>& rhs) const;
-    bool operator>(const BasicStringPiece<TChar>& rhs) const;
-    bool operator==(const BasicStringPiece<TChar>& rhs) const;
-    bool operator!=(const BasicStringPiece<TChar>& rhs) const;
+  bool contains(const BasicStringPiece<TChar>& rhs) const;
+  int compare(const BasicStringPiece<TChar>& rhs) const;
+  bool operator<(const BasicStringPiece<TChar>& rhs) const;
+  bool operator>(const BasicStringPiece<TChar>& rhs) const;
+  bool operator==(const BasicStringPiece<TChar>& rhs) const;
+  bool operator!=(const BasicStringPiece<TChar>& rhs) const;
 
-    const_iterator begin() const;
-    const_iterator end() const;
+  const_iterator begin() const;
+  const_iterator end() const;
 
-private:
-    const TChar* mData;
-    size_t mLength;
+ private:
+  const TChar* mData;
+  size_t mLength;
 };
 
 using StringPiece = BasicStringPiece<char>;
@@ -87,198 +88,210 @@
 constexpr const size_t BasicStringPiece<TChar>::npos;
 
 template <typename TChar>
-inline BasicStringPiece<TChar>::BasicStringPiece() : mData(nullptr) , mLength(0) {
-}
+inline BasicStringPiece<TChar>::BasicStringPiece()
+    : mData(nullptr), mLength(0) {}
 
 template <typename TChar>
-inline BasicStringPiece<TChar>::BasicStringPiece(const BasicStringPiece<TChar>& str) :
-        mData(str.mData), mLength(str.mLength) {
-}
+inline BasicStringPiece<TChar>::BasicStringPiece(
+    const BasicStringPiece<TChar>& str)
+    : mData(str.mData), mLength(str.mLength) {}
 
 template <typename TChar>
-inline BasicStringPiece<TChar>::BasicStringPiece(const std::basic_string<TChar>& str) :
-        mData(str.data()), mLength(str.length()) {
-}
+inline BasicStringPiece<TChar>::BasicStringPiece(
+    const std::basic_string<TChar>& str)
+    : mData(str.data()), mLength(str.length()) {}
 
 template <>
-inline BasicStringPiece<char>::BasicStringPiece(const char* str) :
-        mData(str), mLength(str != nullptr ? strlen(str) : 0) {
-}
+inline BasicStringPiece<char>::BasicStringPiece(const char* str)
+    : mData(str), mLength(str != nullptr ? strlen(str) : 0) {}
 
 template <>
-inline BasicStringPiece<char16_t>::BasicStringPiece(const char16_t* str) :
-        mData(str), mLength(str != nullptr ? strlen16(str) : 0) {
-}
+inline BasicStringPiece<char16_t>::BasicStringPiece(const char16_t* str)
+    : mData(str), mLength(str != nullptr ? strlen16(str) : 0) {}
 
 template <typename TChar>
-inline BasicStringPiece<TChar>::BasicStringPiece(const TChar* str, size_t len) :
-        mData(str), mLength(len) {
-}
+inline BasicStringPiece<TChar>::BasicStringPiece(const TChar* str, size_t len)
+    : mData(str), mLength(len) {}
 
 template <typename TChar>
 inline BasicStringPiece<TChar>& BasicStringPiece<TChar>::operator=(
-        const BasicStringPiece<TChar>& rhs) {
-    mData = rhs.mData;
-    mLength = rhs.mLength;
-    return *this;
+    const BasicStringPiece<TChar>& rhs) {
+  mData = rhs.mData;
+  mLength = rhs.mLength;
+  return *this;
 }
 
 template <typename TChar>
-inline BasicStringPiece<TChar>& BasicStringPiece<TChar>::assign(const TChar* str, size_t len) {
-    mData = str;
-    mLength = len;
-    return *this;
-}
-
-
-template <typename TChar>
-inline BasicStringPiece<TChar> BasicStringPiece<TChar>::substr(size_t start, size_t len) const {
-    if (len == npos) {
-        len = mLength - start;
-    }
-
-    if (start > mLength || start + len > mLength) {
-        return BasicStringPiece<TChar>();
-    }
-    return BasicStringPiece<TChar>(mData + start, len);
+inline BasicStringPiece<TChar>& BasicStringPiece<TChar>::assign(
+    const TChar* str, size_t len) {
+  mData = str;
+  mLength = len;
+  return *this;
 }
 
 template <typename TChar>
 inline BasicStringPiece<TChar> BasicStringPiece<TChar>::substr(
-        BasicStringPiece<TChar>::const_iterator begin,
-        BasicStringPiece<TChar>::const_iterator end) const {
-    return BasicStringPiece<TChar>(begin, end - begin);
+    size_t start, size_t len) const {
+  if (len == npos) {
+    len = mLength - start;
+  }
+
+  if (start > mLength || start + len > mLength) {
+    return BasicStringPiece<TChar>();
+  }
+  return BasicStringPiece<TChar>(mData + start, len);
+}
+
+template <typename TChar>
+inline BasicStringPiece<TChar> BasicStringPiece<TChar>::substr(
+    BasicStringPiece<TChar>::const_iterator begin,
+    BasicStringPiece<TChar>::const_iterator end) const {
+  return BasicStringPiece<TChar>(begin, end - begin);
 }
 
 template <typename TChar>
 inline const TChar* BasicStringPiece<TChar>::data() const {
-    return mData;
+  return mData;
 }
 
 template <typename TChar>
 inline size_t BasicStringPiece<TChar>::length() const {
-    return mLength;
+  return mLength;
 }
 
 template <typename TChar>
 inline size_t BasicStringPiece<TChar>::size() const {
-    return mLength;
+  return mLength;
 }
 
 template <typename TChar>
 inline bool BasicStringPiece<TChar>::empty() const {
-    return mLength == 0;
+  return mLength == 0;
 }
 
 template <typename TChar>
 inline std::basic_string<TChar> BasicStringPiece<TChar>::toString() const {
-    return std::basic_string<TChar>(mData, mLength);
+  return std::basic_string<TChar>(mData, mLength);
 }
 
 template <>
-inline bool BasicStringPiece<char>::contains(const BasicStringPiece<char>& rhs) const {
-    if (!mData || !rhs.mData) {
-        return false;
-    }
-    if (rhs.mLength > mLength) {
-        return false;
-    }
-    return strstr(mData, rhs.mData) != nullptr;
+inline bool BasicStringPiece<char>::contains(
+    const BasicStringPiece<char>& rhs) const {
+  if (!mData || !rhs.mData) {
+    return false;
+  }
+  if (rhs.mLength > mLength) {
+    return false;
+  }
+  return strstr(mData, rhs.mData) != nullptr;
 }
 
 template <>
-inline int BasicStringPiece<char>::compare(const BasicStringPiece<char>& rhs) const {
-    const char nullStr = '\0';
-    const char* b1 = mData != nullptr ? mData : &nullStr;
-    const char* e1 = b1 + mLength;
-    const char* b2 = rhs.mData != nullptr ? rhs.mData : &nullStr;
-    const char* e2 = b2 + rhs.mLength;
+inline int BasicStringPiece<char>::compare(
+    const BasicStringPiece<char>& rhs) const {
+  const char nullStr = '\0';
+  const char* b1 = mData != nullptr ? mData : &nullStr;
+  const char* e1 = b1 + mLength;
+  const char* b2 = rhs.mData != nullptr ? rhs.mData : &nullStr;
+  const char* e2 = b2 + rhs.mLength;
 
-    while (b1 < e1 && b2 < e2) {
-        const int d = static_cast<int>(*b1++) - static_cast<int>(*b2++);
-        if (d) {
-            return d;
-        }
+  while (b1 < e1 && b2 < e2) {
+    const int d = static_cast<int>(*b1++) - static_cast<int>(*b2++);
+    if (d) {
+      return d;
     }
-    return static_cast<int>(mLength - rhs.mLength);
+  }
+  return static_cast<int>(mLength - rhs.mLength);
 }
 
-inline ::std::ostream& operator<<(::std::ostream& out, const BasicStringPiece<char16_t>& str) {
-    android::String8 utf8(str.data(), str.size());
-    return out.write(utf8.string(), utf8.size());
+inline ::std::ostream& operator<<(::std::ostream& out,
+                                  const BasicStringPiece<char16_t>& str) {
+  android::String8 utf8(str.data(), str.size());
+  return out.write(utf8.string(), utf8.size());
 }
 
 template <>
-inline bool BasicStringPiece<char16_t>::contains(const BasicStringPiece<char16_t>& rhs) const {
-    if (!mData || !rhs.mData) {
-        return false;
-    }
-    if (rhs.mLength > mLength) {
-        return false;
-    }
-    return strstr16(mData, rhs.mData) != nullptr;
+inline bool BasicStringPiece<char16_t>::contains(
+    const BasicStringPiece<char16_t>& rhs) const {
+  if (!mData || !rhs.mData) {
+    return false;
+  }
+  if (rhs.mLength > mLength) {
+    return false;
+  }
+  return strstr16(mData, rhs.mData) != nullptr;
 }
 
 template <>
-inline int BasicStringPiece<char16_t>::compare(const BasicStringPiece<char16_t>& rhs) const {
-    const char16_t nullStr = u'\0';
-    const char16_t* b1 = mData != nullptr ? mData : &nullStr;
-    const char16_t* b2 = rhs.mData != nullptr ? rhs.mData : &nullStr;
-    return strzcmp16(b1, mLength, b2, rhs.mLength);
+inline int BasicStringPiece<char16_t>::compare(
+    const BasicStringPiece<char16_t>& rhs) const {
+  const char16_t nullStr = u'\0';
+  const char16_t* b1 = mData != nullptr ? mData : &nullStr;
+  const char16_t* b2 = rhs.mData != nullptr ? rhs.mData : &nullStr;
+  return strzcmp16(b1, mLength, b2, rhs.mLength);
 }
 
 template <typename TChar>
-inline bool BasicStringPiece<TChar>::operator<(const BasicStringPiece<TChar>& rhs) const {
-    return compare(rhs) < 0;
+inline bool BasicStringPiece<TChar>::operator<(
+    const BasicStringPiece<TChar>& rhs) const {
+  return compare(rhs) < 0;
 }
 
 template <typename TChar>
-inline bool BasicStringPiece<TChar>::operator>(const BasicStringPiece<TChar>& rhs) const {
-    return compare(rhs) > 0;
+inline bool BasicStringPiece<TChar>::operator>(
+    const BasicStringPiece<TChar>& rhs) const {
+  return compare(rhs) > 0;
 }
 
 template <typename TChar>
-inline bool BasicStringPiece<TChar>::operator==(const BasicStringPiece<TChar>& rhs) const {
-    return compare(rhs) == 0;
+inline bool BasicStringPiece<TChar>::operator==(
+    const BasicStringPiece<TChar>& rhs) const {
+  return compare(rhs) == 0;
 }
 
 template <typename TChar>
-inline bool BasicStringPiece<TChar>::operator!=(const BasicStringPiece<TChar>& rhs) const {
-    return compare(rhs) != 0;
+inline bool BasicStringPiece<TChar>::operator!=(
+    const BasicStringPiece<TChar>& rhs) const {
+  return compare(rhs) != 0;
 }
 
 template <typename TChar>
-inline typename BasicStringPiece<TChar>::const_iterator BasicStringPiece<TChar>::begin() const {
-    return mData;
+inline typename BasicStringPiece<TChar>::const_iterator
+BasicStringPiece<TChar>::begin() const {
+  return mData;
 }
 
 template <typename TChar>
-inline typename BasicStringPiece<TChar>::const_iterator BasicStringPiece<TChar>::end() const {
-    return mData + mLength;
+inline typename BasicStringPiece<TChar>::const_iterator
+BasicStringPiece<TChar>::end() const {
+  return mData + mLength;
 }
 
-inline ::std::ostream& operator<<(::std::ostream& out, const BasicStringPiece<char>& str) {
-    return out.write(str.data(), str.size());
+inline ::std::ostream& operator<<(::std::ostream& out,
+                                  const BasicStringPiece<char>& str) {
+  return out.write(str.data(), str.size());
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-inline ::std::ostream& operator<<(::std::ostream& out, const std::u16string& str) {
-    android::String8 utf8(str.data(), str.size());
-    return out.write(utf8.string(), utf8.size());
+inline ::std::ostream& operator<<(::std::ostream& out,
+                                  const std::u16string& str) {
+  android::String8 utf8(str.data(), str.size());
+  return out.write(utf8.string(), utf8.size());
 }
 
 namespace std {
 
 template <typename TChar>
 struct hash<aapt::BasicStringPiece<TChar>> {
-    size_t operator()(const aapt::BasicStringPiece<TChar>& str) const {
-        uint32_t hashCode = android::JenkinsHashMixBytes(
-                0, reinterpret_cast<const uint8_t*>(str.data()), sizeof(TChar) * str.size());
-        return static_cast<size_t>(hashCode);
-    }
+  size_t operator()(const aapt::BasicStringPiece<TChar>& str) const {
+    uint32_t hashCode = android::JenkinsHashMixBytes(
+        0, reinterpret_cast<const uint8_t*>(str.data()),
+        sizeof(TChar) * str.size());
+    return static_cast<size_t>(hashCode);
+  }
 };
 
-} // namespace std
+}  // namespace std
 
-#endif // AAPT_STRING_PIECE_H
+#endif  // AAPT_STRING_PIECE_H
diff --git a/tools/aapt2/util/TypeTraits.h b/tools/aapt2/util/TypeTraits.h
index 76c13d6..b6539ed 100644
--- a/tools/aapt2/util/TypeTraits.h
+++ b/tools/aapt2/util/TypeTraits.h
@@ -21,19 +21,20 @@
 
 namespace aapt {
 
-#define DEFINE_HAS_BINARY_OP_TRAIT(name, op) \
-    template <typename T, typename U> \
-    struct name { \
-        template <typename V, typename W> \
-        static constexpr decltype(std::declval<V>() op std::declval<W>(), bool()) test(int) { \
-        return true; \
-    } \
-    template <typename V, typename W> \
-    static constexpr bool test(...) { \
-        return false; \
-    } \
-    static constexpr bool value = test<T, U>(int()); \
-}
+#define DEFINE_HAS_BINARY_OP_TRAIT(name, op)                                  \
+  template <typename T, typename U>                                           \
+  struct name {                                                               \
+    template <typename V, typename W>                                         \
+    static constexpr decltype(std::declval<V>() op std::declval<W>(), bool()) \
+    test(int) {                                                               \
+      return true;                                                            \
+    }                                                                         \
+    template <typename V, typename W>                                         \
+    static constexpr bool test(...) {                                         \
+      return false;                                                           \
+    }                                                                         \
+    static constexpr bool value = test<T, U>(int());                          \
+  }
 
 DEFINE_HAS_BINARY_OP_TRAIT(has_eq_op, ==);
 DEFINE_HAS_BINARY_OP_TRAIT(has_lt_op, <);
@@ -43,9 +44,10 @@
  */
 template <typename T, typename U>
 struct is_comparable {
-    static constexpr bool value = has_eq_op<T, U>::value && has_lt_op<T, U>::value;
+  static constexpr bool value =
+      has_eq_op<T, U>::value && has_lt_op<T, U>::value;
 };
 
-} // namespace aapt
+}  // namespace aapt
 
 #endif /* AAPT_UTIL_TYPETRAITS_H */
diff --git a/tools/aapt2/util/Util.h b/tools/aapt2/util/Util.h
index 9c88354..077e193 100644
--- a/tools/aapt2/util/Util.h
+++ b/tools/aapt2/util/Util.h
@@ -56,16 +56,14 @@
  * UTF-16 isspace(). It basically checks for lower range characters that are
  * whitespace.
  */
-inline bool isspace16(char16_t c) {
-    return c < 0x0080 && isspace(c);
-}
+inline bool isspace16(char16_t c) { return c < 0x0080 && isspace(c); }
 
 /**
  * Returns an iterator to the first character that is not alpha-numeric and that
  * is not in the allowedChars set.
  */
-StringPiece::const_iterator findNonAlphaNumericAndNotInSet(const StringPiece& str,
-                                                           const StringPiece& allowedChars);
+StringPiece::const_iterator findNonAlphaNumericAndNotInSet(
+    const StringPiece& str, const StringPiece& allowedChars);
 
 /**
  * Tests that the string is a valid Java class name.
@@ -78,7 +76,8 @@
 bool isJavaPackageName(const StringPiece& str);
 
 /**
- * Converts the class name to a fully qualified class name from the given `package`. Ex:
+ * Converts the class name to a fully qualified class name from the given
+ * `package`. Ex:
  *
  * asdf         --> package.asdf
  * .asdf        --> package.asdf
@@ -89,111 +88,114 @@
                                               const StringPiece& className);
 
 /**
- * Makes a std::unique_ptr<> with the template parameter inferred by the compiler.
+ * Makes a std::unique_ptr<> with the template parameter inferred by the
+ * compiler.
  * This will be present in C++14 and can be removed then.
  */
 template <typename T, class... Args>
 std::unique_ptr<T> make_unique(Args&&... args) {
-    return std::unique_ptr<T>(new T{std::forward<Args>(args)...});
+  return std::unique_ptr<T>(new T{std::forward<Args>(args)...});
 }
 
 /**
- * Writes a set of items to the std::ostream, joining the times with the provided
+ * Writes a set of items to the std::ostream, joining the times with the
+ * provided
  * separator.
  */
 template <typename Container>
-::std::function<::std::ostream&(::std::ostream&)> joiner(const Container& container,
-                                                         const char* sep) {
-    using std::begin;
-    using std::end;
-    const auto beginIter = begin(container);
-    const auto endIter = end(container);
-    return [beginIter, endIter, sep](::std::ostream& out) -> ::std::ostream& {
-        for (auto iter = beginIter; iter != endIter; ++iter) {
-            if (iter != beginIter) {
-                out << sep;
-            }
-            out << *iter;
-        }
-        return out;
-    };
+::std::function<::std::ostream&(::std::ostream&)> joiner(
+    const Container& container, const char* sep) {
+  using std::begin;
+  using std::end;
+  const auto beginIter = begin(container);
+  const auto endIter = end(container);
+  return [beginIter, endIter, sep](::std::ostream& out) -> ::std::ostream& {
+    for (auto iter = beginIter; iter != endIter; ++iter) {
+      if (iter != beginIter) {
+        out << sep;
+      }
+      out << *iter;
+    }
+    return out;
+  };
 }
 
-inline ::std::function<::std::ostream&(::std::ostream&)> formatSize(size_t size) {
-    return [size](::std::ostream& out) -> ::std::ostream& {
-        constexpr size_t K = 1024u;
-        constexpr size_t M = K * K;
-        constexpr size_t G = M * K;
-        if (size < K) {
-            out << size << "B";
-        } else if (size < M) {
-            out << (double(size) / K) << " KiB";
-        } else if (size < G) {
-            out << (double(size) / M) << " MiB";
-        } else {
-            out << (double(size) / G) << " GiB";
-        }
-        return out;
-    };
+inline ::std::function<::std::ostream&(::std::ostream&)> formatSize(
+    size_t size) {
+  return [size](::std::ostream& out) -> ::std::ostream& {
+    constexpr size_t K = 1024u;
+    constexpr size_t M = K * K;
+    constexpr size_t G = M * K;
+    if (size < K) {
+      out << size << "B";
+    } else if (size < M) {
+      out << (double(size) / K) << " KiB";
+    } else if (size < G) {
+      out << (double(size) / M) << " MiB";
+    } else {
+      out << (double(size) / G) << " GiB";
+    }
+    return out;
+  };
 }
 
 /**
- * Helper method to extract a UTF-16 string from a StringPool. If the string is stored as UTF-8,
+ * Helper method to extract a UTF-16 string from a StringPool. If the string is
+ * stored as UTF-8,
  * the conversion to UTF-16 happens within ResStringPool.
  */
 StringPiece16 getString16(const android::ResStringPool& pool, size_t idx);
 
 /**
- * Helper method to extract a UTF-8 string from a StringPool. If the string is stored as UTF-16,
- * the conversion from UTF-16 to UTF-8 does not happen in ResStringPool and is done by this method,
- * which maintains no state or cache. This means we must return an std::string copy.
+ * Helper method to extract a UTF-8 string from a StringPool. If the string is
+ * stored as UTF-16,
+ * the conversion from UTF-16 to UTF-8 does not happen in ResStringPool and is
+ * done by this method,
+ * which maintains no state or cache. This means we must return an std::string
+ * copy.
  */
 std::string getString(const android::ResStringPool& pool, size_t idx);
 
 /**
- * Checks that the Java string format contains no non-positional arguments (arguments without
- * explicitly specifying an index) when there are more than one argument. This is an error
- * because translations may rearrange the order of the arguments in the string, which will
+ * Checks that the Java string format contains no non-positional arguments
+ * (arguments without
+ * explicitly specifying an index) when there are more than one argument. This
+ * is an error
+ * because translations may rearrange the order of the arguments in the string,
+ * which will
  * break the string interpolation.
  */
 bool verifyJavaStringFormat(const StringPiece& str);
 
 class StringBuilder {
-public:
-    StringBuilder& append(const StringPiece& str);
-    const std::string& str() const;
-    const std::string& error() const;
+ public:
+  StringBuilder& append(const StringPiece& str);
+  const std::string& str() const;
+  const std::string& error() const;
 
-    // When building StyledStrings, we need UTF-16 indices into the string,
-    // which is what the Java layer expects when dealing with java String.charAt().
-    size_t utf16Len() const;
+  // When building StyledStrings, we need UTF-16 indices into the string,
+  // which is what the Java layer expects when dealing with java
+  // String.charAt().
+  size_t utf16Len() const;
 
-    operator bool() const;
+  operator bool() const;
 
-private:
-    std::string mStr;
-    size_t mUtf16Len = 0;
-    bool mQuote = false;
-    bool mTrailingSpace = false;
-    bool mLastCharWasEscape = false;
-    std::string mError;
+ private:
+  std::string mStr;
+  size_t mUtf16Len = 0;
+  bool mQuote = false;
+  bool mTrailingSpace = false;
+  bool mLastCharWasEscape = false;
+  std::string mError;
 };
 
-inline const std::string& StringBuilder::str() const {
-    return mStr;
-}
+inline const std::string& StringBuilder::str() const { return mStr; }
 
-inline const std::string& StringBuilder::error() const {
-    return mError;
-}
+inline const std::string& StringBuilder::error() const { return mError; }
 
-inline size_t StringBuilder::utf16Len() const {
-    return mUtf16Len;
-}
+inline size_t StringBuilder::utf16Len() const { return mUtf16Len; }
 
-inline StringBuilder::operator bool() const {
-    return mError.empty();
-}
+inline StringBuilder::operator bool() const { return mError.empty(); }
 
 /**
  * Converts a UTF8 string to a UTF16 string.
@@ -216,65 +218,51 @@
  * any memory on the heap nor use standard containers.
  */
 class Tokenizer {
-public:
-    class iterator {
-    public:
-        iterator(const iterator&) = default;
-        iterator& operator=(const iterator&) = default;
+ public:
+  class iterator {
+   public:
+    iterator(const iterator&) = default;
+    iterator& operator=(const iterator&) = default;
 
-        iterator& operator++();
+    iterator& operator++();
 
-        StringPiece operator*() {
-            return mToken;
-        }
-        bool operator==(const iterator& rhs) const;
-        bool operator!=(const iterator& rhs) const;
+    StringPiece operator*() { return mToken; }
+    bool operator==(const iterator& rhs) const;
+    bool operator!=(const iterator& rhs) const;
 
-    private:
-        friend class Tokenizer;
+   private:
+    friend class Tokenizer;
 
-        iterator(StringPiece s, char sep, StringPiece tok, bool end);
+    iterator(StringPiece s, char sep, StringPiece tok, bool end);
 
-        StringPiece mStr;
-        char mSeparator;
-        StringPiece mToken;
-        bool mEnd;
-    };
+    StringPiece mStr;
+    char mSeparator;
+    StringPiece mToken;
+    bool mEnd;
+  };
 
-    Tokenizer(StringPiece str, char sep);
+  Tokenizer(StringPiece str, char sep);
 
-    iterator begin() {
-        return mBegin;
-    }
+  iterator begin() { return mBegin; }
 
-    iterator end() {
-        return mEnd;
-    }
+  iterator end() { return mEnd; }
 
-private:
-    const iterator mBegin;
-    const iterator mEnd;
+ private:
+  const iterator mBegin;
+  const iterator mEnd;
 };
 
 inline Tokenizer tokenize(const StringPiece& str, char sep) {
-    return Tokenizer(str, sep);
+  return Tokenizer(str, sep);
 }
 
-inline uint16_t hostToDevice16(uint16_t value) {
-    return htods(value);
-}
+inline uint16_t hostToDevice16(uint16_t value) { return htods(value); }
 
-inline uint32_t hostToDevice32(uint32_t value) {
-    return htodl(value);
-}
+inline uint32_t hostToDevice32(uint32_t value) { return htodl(value); }
 
-inline uint16_t deviceToHost16(uint16_t value) {
-    return dtohs(value);
-}
+inline uint16_t deviceToHost16(uint16_t value) { return dtohs(value); }
 
-inline uint32_t deviceToHost32(uint32_t value) {
-    return dtohl(value);
-}
+inline uint32_t deviceToHost32(uint32_t value) { return dtohl(value); }
 
 /**
  * Given a path like: res/xml-sw600dp/foo.xml
@@ -288,17 +276,19 @@
 bool extractResFilePathParts(const StringPiece& path, StringPiece* outPrefix,
                              StringPiece* outEntry, StringPiece* outSuffix);
 
-} // namespace util
+}  // namespace util
 
 /**
- * Stream operator for functions. Calls the function with the stream as an argument.
+ * Stream operator for functions. Calls the function with the stream as an
+ * argument.
  * In the aapt namespace for lookup.
  */
-inline ::std::ostream& operator<<(::std::ostream& out,
-                                  const ::std::function<::std::ostream&(::std::ostream&)>& f) {
-    return f(out);
+inline ::std::ostream& operator<<(
+    ::std::ostream& out,
+    const ::std::function<::std::ostream&(::std::ostream&)>& f) {
+  return f(out);
 }
 
-} // namespace aapt
+}  // namespace aapt
 
-#endif // AAPT_UTIL_H
+#endif  // AAPT_UTIL_H
diff --git a/tools/aapt2/xml/XmlActionExecutor.h b/tools/aapt2/xml/XmlActionExecutor.h
index cad508c..ca21b08 100644
--- a/tools/aapt2/xml/XmlActionExecutor.h
+++ b/tools/aapt2/xml/XmlActionExecutor.h
@@ -30,79 +30,84 @@
 namespace xml {
 
 enum class XmlActionExecutorPolicy {
-    /**
-     * Actions on run if elements are matched, errors occur only when actions return false.
-     */
-    None,
+  /**
+   * Actions on run if elements are matched, errors occur only when actions
+   * return false.
+   */
+  None,
 
-    /**
-     * The actions defined must match and run. If an element is found that does not match
-     * an action, an error occurs.
-     */
-    Whitelist,
+  /**
+   * The actions defined must match and run. If an element is found that does
+   * not match
+   * an action, an error occurs.
+   */
+  Whitelist,
 };
 
 /**
- * Contains the actions to perform at this XML node. This is a recursive data structure that
+ * Contains the actions to perform at this XML node. This is a recursive data
+ * structure that
  * holds XmlNodeActions for child XML nodes.
  */
 class XmlNodeAction {
-public:
-    using ActionFuncWithDiag = std::function<bool(Element*, SourcePathDiagnostics*)>;
-    using ActionFunc = std::function<bool(Element*)>;
+ public:
+  using ActionFuncWithDiag =
+      std::function<bool(Element*, SourcePathDiagnostics*)>;
+  using ActionFunc = std::function<bool(Element*)>;
 
-    /**
-     * Find or create a child XmlNodeAction that will be performed for the child element
-     * with the name `name`.
-     */
-    XmlNodeAction& operator[](const std::string& name) {
-        return mMap[name];
-    }
+  /**
+   * Find or create a child XmlNodeAction that will be performed for the child
+   * element
+   * with the name `name`.
+   */
+  XmlNodeAction& operator[](const std::string& name) { return mMap[name]; }
 
-    /**
-     * Add an action to be performed at this XmlNodeAction.
-     */
-    void action(ActionFunc f);
-    void action(ActionFuncWithDiag);
+  /**
+   * Add an action to be performed at this XmlNodeAction.
+   */
+  void action(ActionFunc f);
+  void action(ActionFuncWithDiag);
 
-private:
-    friend class XmlActionExecutor;
+ private:
+  friend class XmlActionExecutor;
 
-    bool execute(XmlActionExecutorPolicy policy, SourcePathDiagnostics* diag, Element* el) const;
+  bool execute(XmlActionExecutorPolicy policy, SourcePathDiagnostics* diag,
+               Element* el) const;
 
-    std::map<std::string, XmlNodeAction> mMap;
-    std::vector<ActionFuncWithDiag> mActions;
+  std::map<std::string, XmlNodeAction> mMap;
+  std::vector<ActionFuncWithDiag> mActions;
 };
 
 /**
- * Allows the definition of actions to execute at specific XML elements defined by their
+ * Allows the definition of actions to execute at specific XML elements defined
+ * by their
  * hierarchy.
  */
 class XmlActionExecutor {
-public:
-    XmlActionExecutor() = default;
+ public:
+  XmlActionExecutor() = default;
 
-    /**
-     * Find or create a root XmlNodeAction that will be performed for the root XML element
-     * with the name `name`.
-     */
-    XmlNodeAction& operator[](const std::string& name) {
-        return mMap[name];
-    }
+  /**
+   * Find or create a root XmlNodeAction that will be performed for the root XML
+   * element
+   * with the name `name`.
+   */
+  XmlNodeAction& operator[](const std::string& name) { return mMap[name]; }
 
-    /**
-     * Execute the defined actions for this XmlResource.
-     * Returns true if all actions return true, otherwise returns false.
-     */
-    bool execute(XmlActionExecutorPolicy policy, IDiagnostics* diag, XmlResource* doc) const;
+  /**
+   * Execute the defined actions for this XmlResource.
+   * Returns true if all actions return true, otherwise returns false.
+   */
+  bool execute(XmlActionExecutorPolicy policy, IDiagnostics* diag,
+               XmlResource* doc) const;
 
-private:
-    std::map<std::string, XmlNodeAction> mMap;
+ private:
+  std::map<std::string, XmlNodeAction> mMap;
 
-    DISALLOW_COPY_AND_ASSIGN(XmlActionExecutor);
+  DISALLOW_COPY_AND_ASSIGN(XmlActionExecutor);
 };
 
-} // namespace xml
-} // namespace aapt
+}  // namespace xml
+}  // namespace aapt
 
 #endif /* AAPT_XML_XMLPATTERN_H */
diff --git a/tools/aapt2/xml/XmlDom.h b/tools/aapt2/xml/XmlDom.h
index e4f41b0..932303e 100644
--- a/tools/aapt2/xml/XmlDom.h
+++ b/tools/aapt2/xml/XmlDom.h
@@ -38,18 +38,18 @@
  * Base class for all XML nodes.
  */
 class Node {
-public:
-    Node* parent = nullptr;
-    size_t lineNumber = 0;
-    size_t columnNumber = 0;
-    std::string comment;
-    std::vector<std::unique_ptr<Node>> children;
+ public:
+  Node* parent = nullptr;
+  size_t lineNumber = 0;
+  size_t columnNumber = 0;
+  std::string comment;
+  std::vector<std::unique_ptr<Node>> children;
 
-    virtual ~Node() = default;
+  virtual ~Node() = default;
 
-    void addChild(std::unique_ptr<Node> child);
-    virtual void accept(RawVisitor* visitor) = 0;
-    virtual std::unique_ptr<Node> clone() = 0;
+  void addChild(std::unique_ptr<Node> child);
+  virtual void accept(RawVisitor* visitor) = 0;
+  virtual std::unique_ptr<Node> clone() = 0;
 };
 
 /**
@@ -58,178 +58,173 @@
  */
 template <typename Derived>
 class BaseNode : public Node {
-public:
-    virtual void accept(RawVisitor* visitor) override;
+ public:
+  virtual void accept(RawVisitor* visitor) override;
 };
 
 /**
  * A Namespace XML node. Can only have one child.
  */
 class Namespace : public BaseNode<Namespace> {
-public:
-    std::string namespacePrefix;
-    std::string namespaceUri;
+ public:
+  std::string namespacePrefix;
+  std::string namespaceUri;
 
-    std::unique_ptr<Node> clone() override;
+  std::unique_ptr<Node> clone() override;
 };
 
 struct AaptAttribute {
-    Maybe<ResourceId> id;
-    aapt::Attribute attribute;
+  Maybe<ResourceId> id;
+  aapt::Attribute attribute;
 };
 
 /**
  * An XML attribute.
  */
 struct Attribute {
-    std::string namespaceUri;
-    std::string name;
-    std::string value;
+  std::string namespaceUri;
+  std::string name;
+  std::string value;
 
-    Maybe<AaptAttribute> compiledAttribute;
-    std::unique_ptr<Item> compiledValue;
+  Maybe<AaptAttribute> compiledAttribute;
+  std::unique_ptr<Item> compiledValue;
 };
 
 /**
  * An Element XML node.
  */
 class Element : public BaseNode<Element> {
-public:
-    std::string namespaceUri;
-    std::string name;
-    std::vector<Attribute> attributes;
+ public:
+  std::string namespaceUri;
+  std::string name;
+  std::vector<Attribute> attributes;
 
-    Attribute* findAttribute(const StringPiece& ns, const StringPiece& name);
-    xml::Element* findChild(const StringPiece& ns, const StringPiece& name);
-    xml::Element* findChildWithAttribute(const StringPiece& ns, const StringPiece& name,
-                                         const StringPiece& attrNs,
-                                         const StringPiece& attrName,
-                                         const StringPiece& attrValue);
-    std::vector<xml::Element*> getChildElements();
-    std::unique_ptr<Node> clone() override;
+  Attribute* findAttribute(const StringPiece& ns, const StringPiece& name);
+  xml::Element* findChild(const StringPiece& ns, const StringPiece& name);
+  xml::Element* findChildWithAttribute(const StringPiece& ns,
+                                       const StringPiece& name,
+                                       const StringPiece& attrNs,
+                                       const StringPiece& attrName,
+                                       const StringPiece& attrValue);
+  std::vector<xml::Element*> getChildElements();
+  std::unique_ptr<Node> clone() override;
 };
 
 /**
  * A Text (CDATA) XML node. Can not have any children.
  */
 class Text : public BaseNode<Text> {
-public:
-    std::string text;
+ public:
+  std::string text;
 
-    std::unique_ptr<Node> clone() override;
+  std::unique_ptr<Node> clone() override;
 };
 
 /**
  * An XML resource with a source, name, and XML tree.
  */
 class XmlResource {
-public:
-    ResourceFile file;
-    std::unique_ptr<xml::Node> root;
+ public:
+  ResourceFile file;
+  std::unique_ptr<xml::Node> root;
 };
 
 /**
  * Inflates an XML DOM from a text stream, logging errors to the logger.
  * Returns the root node on success, or nullptr on failure.
  */
-std::unique_ptr<XmlResource> inflate(std::istream* in, IDiagnostics* diag, const Source& source);
+std::unique_ptr<XmlResource> inflate(std::istream* in, IDiagnostics* diag,
+                                     const Source& source);
 
 /**
  * Inflates an XML DOM from a binary ResXMLTree, logging errors to the logger.
  * Returns the root node on success, or nullptr on failure.
  */
-std::unique_ptr<XmlResource> inflate(const void* data, size_t dataLen, IDiagnostics* diag,
-                                     const Source& source);
+std::unique_ptr<XmlResource> inflate(const void* data, size_t dataLen,
+                                     IDiagnostics* diag, const Source& source);
 
 Element* findRootElement(XmlResource* doc);
 Element* findRootElement(Node* node);
 
 /**
- * A visitor interface for the different XML Node subtypes. This will not traverse into
+ * A visitor interface for the different XML Node subtypes. This will not
+ * traverse into
  * children. Use Visitor for that.
  */
 class RawVisitor {
-public:
-    virtual ~RawVisitor() = default;
+ public:
+  virtual ~RawVisitor() = default;
 
-    virtual void visit(Namespace* node) {}
-    virtual void visit(Element* node) {}
-    virtual void visit(Text* text) {}
+  virtual void visit(Namespace* node) {}
+  virtual void visit(Element* node) {}
+  virtual void visit(Text* text) {}
 };
 
 /**
  * Visitor whose default implementation visits the children nodes of any node.
  */
 class Visitor : public RawVisitor {
-public:
-    using RawVisitor::visit;
+ public:
+  using RawVisitor::visit;
 
-    void visit(Namespace* node) override {
-        visitChildren(node);
-    }
+  void visit(Namespace* node) override { visitChildren(node); }
 
-    void visit(Element* node) override {
-        visitChildren(node);
-    }
+  void visit(Element* node) override { visitChildren(node); }
 
-    void visit(Text* text) override {
-        visitChildren(text);
-    }
+  void visit(Text* text) override { visitChildren(text); }
 
-    void visitChildren(Node* node) {
-        for (auto& child : node->children) {
-            child->accept(this);
-        }
+  void visitChildren(Node* node) {
+    for (auto& child : node->children) {
+      child->accept(this);
     }
+  }
 };
 
 /**
  * An XML DOM visitor that will record the package name for a namespace prefix.
  */
 class PackageAwareVisitor : public Visitor, public IPackageDeclStack {
-public:
-    using Visitor::visit;
+ public:
+  using Visitor::visit;
 
-    void visit(Namespace* ns) override;
-    Maybe<ExtractedPackage> transformPackageAlias(
-            const StringPiece& alias, const StringPiece& localPackage) const override;
+  void visit(Namespace* ns) override;
+  Maybe<ExtractedPackage> transformPackageAlias(
+      const StringPiece& alias, const StringPiece& localPackage) const override;
 
-private:
-    struct PackageDecl {
-        std::string prefix;
-        ExtractedPackage package;
-    };
+ private:
+  struct PackageDecl {
+    std::string prefix;
+    ExtractedPackage package;
+  };
 
-    std::vector<PackageDecl> mPackageDecls;
+  std::vector<PackageDecl> mPackageDecls;
 };
 
 // Implementations
 
 template <typename Derived>
 void BaseNode<Derived>::accept(RawVisitor* visitor) {
-    visitor->visit(static_cast<Derived*>(this));
+  visitor->visit(static_cast<Derived*>(this));
 }
 
 template <typename T>
 class NodeCastImpl : public RawVisitor {
-public:
-    using RawVisitor::visit;
+ public:
+  using RawVisitor::visit;
 
-    T* value = nullptr;
+  T* value = nullptr;
 
-    void visit(T* v) override {
-        value = v;
-    }
+  void visit(T* v) override { value = v; }
 };
 
 template <typename T>
 T* nodeCast(Node* node) {
-    NodeCastImpl<T> visitor;
-    node->accept(&visitor);
-    return visitor.value;
+  NodeCastImpl<T> visitor;
+  node->accept(&visitor);
+  return visitor.value;
 }
 
-} // namespace xml
-} // namespace aapt
+}  // namespace xml
+}  // namespace aapt
 
-#endif // AAPT_XML_DOM_H
+#endif  // AAPT_XML_DOM_H
diff --git a/tools/aapt2/xml/XmlPullParser.h b/tools/aapt2/xml/XmlPullParser.h
index a24d109..ce69df6 100644
--- a/tools/aapt2/xml/XmlPullParser.h
+++ b/tools/aapt2/xml/XmlPullParser.h
@@ -23,8 +23,8 @@
 #include "util/StringPiece.h"
 #include "xml/XmlUtil.h"
 
-#include <algorithm>
 #include <expat.h>
+#include <algorithm>
 #include <istream>
 #include <ostream>
 #include <queue>
@@ -36,263 +36,288 @@
 namespace xml {
 
 class XmlPullParser : public IPackageDeclStack {
-public:
-    enum class Event {
-        kBadDocument,
-        kStartDocument,
-        kEndDocument,
+ public:
+  enum class Event {
+    kBadDocument,
+    kStartDocument,
+    kEndDocument,
 
-        kStartNamespace,
-        kEndNamespace,
-        kStartElement,
-        kEndElement,
-        kText,
-        kComment,
-    };
+    kStartNamespace,
+    kEndNamespace,
+    kStartElement,
+    kEndElement,
+    kText,
+    kComment,
+  };
 
-    /**
-     * Skips to the next direct descendant node of the given startDepth,
-     * skipping namespace nodes.
-     *
-     * When nextChildNode returns true, you can expect Comments, Text, and StartElement events.
-     */
-    static bool nextChildNode(XmlPullParser* parser, size_t startDepth);
-    static bool skipCurrentElement(XmlPullParser* parser);
-    static bool isGoodEvent(Event event);
+  /**
+   * Skips to the next direct descendant node of the given startDepth,
+   * skipping namespace nodes.
+   *
+   * When nextChildNode returns true, you can expect Comments, Text, and
+   * StartElement events.
+   */
+  static bool nextChildNode(XmlPullParser* parser, size_t startDepth);
+  static bool skipCurrentElement(XmlPullParser* parser);
+  static bool isGoodEvent(Event event);
 
-    explicit XmlPullParser(std::istream& in);
-    ~XmlPullParser();
+  explicit XmlPullParser(std::istream& in);
+  ~XmlPullParser();
 
-    /**
-     * Returns the current event that is being processed.
-     */
-    Event getEvent() const;
+  /**
+   * Returns the current event that is being processed.
+   */
+  Event getEvent() const;
 
-    const std::string& getLastError() const;
+  const std::string& getLastError() const;
 
-    /**
-     * Note, unlike XmlPullParser, the first call to next() will return
-     * StartElement of the first element.
-     */
-    Event next();
+  /**
+   * Note, unlike XmlPullParser, the first call to next() will return
+   * StartElement of the first element.
+   */
+  Event next();
 
-    //
-    // These are available for all nodes.
-    //
+  //
+  // These are available for all nodes.
+  //
 
-    const std::string& getComment() const;
-    size_t getLineNumber() const;
-    size_t getDepth() const;
+  const std::string& getComment() const;
+  size_t getLineNumber() const;
+  size_t getDepth() const;
 
-    /**
-     * Returns the character data for a Text event.
-     */
-    const std::string& getText() const;
+  /**
+   * Returns the character data for a Text event.
+   */
+  const std::string& getText() const;
 
-    //
-    // Namespace prefix and URI are available for StartNamespace and EndNamespace.
-    //
+  //
+  // Namespace prefix and URI are available for StartNamespace and EndNamespace.
+  //
 
-    const std::string& getNamespacePrefix() const;
-    const std::string& getNamespaceUri() const;
+  const std::string& getNamespacePrefix() const;
+  const std::string& getNamespaceUri() const;
 
-    //
-    // These are available for StartElement and EndElement.
-    //
+  //
+  // These are available for StartElement and EndElement.
+  //
 
-    const std::string& getElementNamespace() const;
-    const std::string& getElementName() const;
+  const std::string& getElementNamespace() const;
+  const std::string& getElementName() const;
 
-    /*
-     * Uses the current stack of namespaces to resolve the package. Eg:
-     * xmlns:app = "http://schemas.android.com/apk/res/com.android.app"
-     * ...
-     * android:text="@app:string/message"
-     *
-     * In this case, 'app' will be converted to 'com.android.app'.
-     *
-     * If xmlns:app="http://schemas.android.com/apk/res-auto", then
-     * 'package' will be set to 'defaultPackage'.
-     */
-    Maybe<ExtractedPackage> transformPackageAlias(
-            const StringPiece& alias, const StringPiece& localPackage) const override;
+  /*
+   * Uses the current stack of namespaces to resolve the package. Eg:
+   * xmlns:app = "http://schemas.android.com/apk/res/com.android.app"
+   * ...
+   * android:text="@app:string/message"
+   *
+   * In this case, 'app' will be converted to 'com.android.app'.
+   *
+   * If xmlns:app="http://schemas.android.com/apk/res-auto", then
+   * 'package' will be set to 'defaultPackage'.
+   */
+  Maybe<ExtractedPackage> transformPackageAlias(
+      const StringPiece& alias, const StringPiece& localPackage) const override;
 
-    //
-    // Remaining methods are for retrieving information about attributes
-    // associated with a StartElement.
-    //
-    // Attributes must be in sorted order (according to the less than operator
-    // of struct Attribute).
-    //
+  //
+  // Remaining methods are for retrieving information about attributes
+  // associated with a StartElement.
+  //
+  // Attributes must be in sorted order (according to the less than operator
+  // of struct Attribute).
+  //
 
-    struct Attribute {
-        std::string namespaceUri;
-        std::string name;
-        std::string value;
+  struct Attribute {
+    std::string namespaceUri;
+    std::string name;
+    std::string value;
 
-        int compare(const Attribute& rhs) const;
-        bool operator<(const Attribute& rhs) const;
-        bool operator==(const Attribute& rhs) const;
-        bool operator!=(const Attribute& rhs) const;
-    };
+    int compare(const Attribute& rhs) const;
+    bool operator<(const Attribute& rhs) const;
+    bool operator==(const Attribute& rhs) const;
+    bool operator!=(const Attribute& rhs) const;
+  };
 
-    using const_iterator = std::vector<Attribute>::const_iterator;
+  using const_iterator = std::vector<Attribute>::const_iterator;
 
-    const_iterator beginAttributes() const;
-    const_iterator endAttributes() const;
-    size_t getAttributeCount() const;
-    const_iterator findAttribute(StringPiece namespaceUri, StringPiece name) const;
+  const_iterator beginAttributes() const;
+  const_iterator endAttributes() const;
+  size_t getAttributeCount() const;
+  const_iterator findAttribute(StringPiece namespaceUri,
+                               StringPiece name) const;
 
-private:
-    static void XMLCALL startNamespaceHandler(void* userData, const char* prefix, const char* uri);
-    static void XMLCALL startElementHandler(void* userData, const char* name, const char** attrs);
-    static void XMLCALL characterDataHandler(void* userData, const char* s, int len);
-    static void XMLCALL endElementHandler(void* userData, const char* name);
-    static void XMLCALL endNamespaceHandler(void* userData, const char* prefix);
-    static void XMLCALL commentDataHandler(void* userData, const char* comment);
+ private:
+  static void XMLCALL startNamespaceHandler(void* userData, const char* prefix,
+                                            const char* uri);
+  static void XMLCALL startElementHandler(void* userData, const char* name,
+                                          const char** attrs);
+  static void XMLCALL characterDataHandler(void* userData, const char* s,
+                                           int len);
+  static void XMLCALL endElementHandler(void* userData, const char* name);
+  static void XMLCALL endNamespaceHandler(void* userData, const char* prefix);
+  static void XMLCALL commentDataHandler(void* userData, const char* comment);
 
-    struct EventData {
-        Event event;
-        size_t lineNumber;
-        size_t depth;
-        std::string data1;
-        std::string data2;
-        std::vector<Attribute> attributes;
-    };
+  struct EventData {
+    Event event;
+    size_t lineNumber;
+    size_t depth;
+    std::string data1;
+    std::string data2;
+    std::vector<Attribute> attributes;
+  };
 
-    std::istream& mIn;
-    XML_Parser mParser;
-    char mBuffer[16384];
-    std::queue<EventData> mEventQueue;
-    std::string mLastError;
-    const std::string mEmpty;
-    size_t mDepth;
-    std::stack<std::string> mNamespaceUris;
+  std::istream& mIn;
+  XML_Parser mParser;
+  char mBuffer[16384];
+  std::queue<EventData> mEventQueue;
+  std::string mLastError;
+  const std::string mEmpty;
+  size_t mDepth;
+  std::stack<std::string> mNamespaceUris;
 
-    struct PackageDecl {
-        std::string prefix;
-        ExtractedPackage package;
-    };
-    std::vector<PackageDecl> mPackageAliases;
+  struct PackageDecl {
+    std::string prefix;
+    ExtractedPackage package;
+  };
+  std::vector<PackageDecl> mPackageAliases;
 };
 
 /**
  * Finds the attribute in the current element within the global namespace.
  */
-Maybe<StringPiece> findAttribute(const XmlPullParser* parser, const StringPiece& name);
+Maybe<StringPiece> findAttribute(const XmlPullParser* parser,
+                                 const StringPiece& name);
 
 /**
- * Finds the attribute in the current element within the global namespace. The attribute's value
+ * Finds the attribute in the current element within the global namespace. The
+ * attribute's value
  * must not be the empty string.
  */
-Maybe<StringPiece> findNonEmptyAttribute(const XmlPullParser* parser, const StringPiece& name);
+Maybe<StringPiece> findNonEmptyAttribute(const XmlPullParser* parser,
+                                         const StringPiece& name);
 
 //
 // Implementation
 //
 
-inline ::std::ostream& operator<<(::std::ostream& out, XmlPullParser::Event event) {
-    switch (event) {
-        case XmlPullParser::Event::kBadDocument: return out << "BadDocument";
-        case XmlPullParser::Event::kStartDocument: return out << "StartDocument";
-        case XmlPullParser::Event::kEndDocument: return out << "EndDocument";
-        case XmlPullParser::Event::kStartNamespace: return out << "StartNamespace";
-        case XmlPullParser::Event::kEndNamespace: return out << "EndNamespace";
-        case XmlPullParser::Event::kStartElement: return out << "StartElement";
-        case XmlPullParser::Event::kEndElement: return out << "EndElement";
-        case XmlPullParser::Event::kText: return out << "Text";
-        case XmlPullParser::Event::kComment: return out << "Comment";
-    }
-    return out;
+inline ::std::ostream& operator<<(::std::ostream& out,
+                                  XmlPullParser::Event event) {
+  switch (event) {
+    case XmlPullParser::Event::kBadDocument:
+      return out << "BadDocument";
+    case XmlPullParser::Event::kStartDocument:
+      return out << "StartDocument";
+    case XmlPullParser::Event::kEndDocument:
+      return out << "EndDocument";
+    case XmlPullParser::Event::kStartNamespace:
+      return out << "StartNamespace";
+    case XmlPullParser::Event::kEndNamespace:
+      return out << "EndNamespace";
+    case XmlPullParser::Event::kStartElement:
+      return out << "StartElement";
+    case XmlPullParser::Event::kEndElement:
+      return out << "EndElement";
+    case XmlPullParser::Event::kText:
+      return out << "Text";
+    case XmlPullParser::Event::kComment:
+      return out << "Comment";
+  }
+  return out;
 }
 
-inline bool XmlPullParser::nextChildNode(XmlPullParser* parser, size_t startDepth) {
-    Event event;
+inline bool XmlPullParser::nextChildNode(XmlPullParser* parser,
+                                         size_t startDepth) {
+  Event event;
 
-    // First get back to the start depth.
-    while (isGoodEvent(event = parser->next()) && parser->getDepth() > startDepth + 1) {}
+  // First get back to the start depth.
+  while (isGoodEvent(event = parser->next()) &&
+         parser->getDepth() > startDepth + 1) {
+  }
 
-    // Now look for the first good node.
-    while ((event != Event::kEndElement || parser->getDepth() > startDepth) && isGoodEvent(event)) {
-        switch (event) {
-        case Event::kText:
-        case Event::kComment:
-        case Event::kStartElement:
-            return true;
-        default:
-            break;
-        }
-        event = parser->next();
+  // Now look for the first good node.
+  while ((event != Event::kEndElement || parser->getDepth() > startDepth) &&
+         isGoodEvent(event)) {
+    switch (event) {
+      case Event::kText:
+      case Event::kComment:
+      case Event::kStartElement:
+        return true;
+      default:
+        break;
     }
-    return false;
+    event = parser->next();
+  }
+  return false;
 }
 
 inline bool XmlPullParser::skipCurrentElement(XmlPullParser* parser) {
-    int depth = 1;
-    while (depth > 0) {
-        switch (parser->next()) {
-            case Event::kEndDocument:
-                return true;
-            case Event::kBadDocument:
-                return false;
-            case Event::kStartElement:
-                depth++;
-                break;
-            case Event::kEndElement:
-                depth--;
-                break;
-            default:
-                break;
-        }
+  int depth = 1;
+  while (depth > 0) {
+    switch (parser->next()) {
+      case Event::kEndDocument:
+        return true;
+      case Event::kBadDocument:
+        return false;
+      case Event::kStartElement:
+        depth++;
+        break;
+      case Event::kEndElement:
+        depth--;
+        break;
+      default:
+        break;
     }
-    return true;
+  }
+  return true;
 }
 
 inline bool XmlPullParser::isGoodEvent(XmlPullParser::Event event) {
-    return event != Event::kBadDocument && event != Event::kEndDocument;
+  return event != Event::kBadDocument && event != Event::kEndDocument;
 }
 
 inline int XmlPullParser::Attribute::compare(const Attribute& rhs) const {
-    int cmp = namespaceUri.compare(rhs.namespaceUri);
-    if (cmp != 0) return cmp;
-    return name.compare(rhs.name);
+  int cmp = namespaceUri.compare(rhs.namespaceUri);
+  if (cmp != 0) return cmp;
+  return name.compare(rhs.name);
 }
 
 inline bool XmlPullParser::Attribute::operator<(const Attribute& rhs) const {
-    return compare(rhs) < 0;
+  return compare(rhs) < 0;
 }
 
 inline bool XmlPullParser::Attribute::operator==(const Attribute& rhs) const {
-    return compare(rhs) == 0;
+  return compare(rhs) == 0;
 }
 
 inline bool XmlPullParser::Attribute::operator!=(const Attribute& rhs) const {
-    return compare(rhs) != 0;
+  return compare(rhs) != 0;
 }
 
-inline XmlPullParser::const_iterator XmlPullParser::findAttribute(StringPiece namespaceUri,
-                                                                  StringPiece name) const {
-    const auto endIter = endAttributes();
-    const auto iter = std::lower_bound(beginAttributes(), endIter,
-            std::pair<StringPiece, StringPiece>(namespaceUri, name),
-            [](const Attribute& attr, const std::pair<StringPiece, StringPiece>& rhs) -> bool {
-                int cmp = attr.namespaceUri.compare(0, attr.namespaceUri.size(),
-                        rhs.first.data(), rhs.first.size());
-                if (cmp < 0) return true;
-                if (cmp > 0) return false;
-                cmp = attr.name.compare(0, attr.name.size(), rhs.second.data(), rhs.second.size());
-                if (cmp < 0) return true;
-                return false;
-            }
-    );
+inline XmlPullParser::const_iterator XmlPullParser::findAttribute(
+    StringPiece namespaceUri, StringPiece name) const {
+  const auto endIter = endAttributes();
+  const auto iter = std::lower_bound(
+      beginAttributes(), endIter,
+      std::pair<StringPiece, StringPiece>(namespaceUri, name),
+      [](const Attribute& attr,
+         const std::pair<StringPiece, StringPiece>& rhs) -> bool {
+        int cmp = attr.namespaceUri.compare(0, attr.namespaceUri.size(),
+                                            rhs.first.data(), rhs.first.size());
+        if (cmp < 0) return true;
+        if (cmp > 0) return false;
+        cmp = attr.name.compare(0, attr.name.size(), rhs.second.data(),
+                                rhs.second.size());
+        if (cmp < 0) return true;
+        return false;
+      });
 
-    if (iter != endIter && namespaceUri == iter->namespaceUri && name == iter->name) {
-        return iter;
-    }
-    return endIter;
+  if (iter != endIter && namespaceUri == iter->namespaceUri &&
+      name == iter->name) {
+    return iter;
+  }
+  return endIter;
 }
 
-} // namespace xml
-} // namespace aapt
+}  // namespace xml
+}  // namespace aapt
 
-#endif // AAPT_XML_PULL_PARSER_H
+#endif  // AAPT_XML_PULL_PARSER_H
diff --git a/tools/aapt2/xml/XmlUtil.h b/tools/aapt2/xml/XmlUtil.h
index a6ad79d..96de654 100644
--- a/tools/aapt2/xml/XmlUtil.h
+++ b/tools/aapt2/xml/XmlUtil.h
@@ -26,9 +26,12 @@
 namespace xml {
 
 constexpr const char* kSchemaAuto = "http://schemas.android.com/apk/res-auto";
-constexpr const char* kSchemaPublicPrefix = "http://schemas.android.com/apk/res/";
-constexpr const char* kSchemaPrivatePrefix = "http://schemas.android.com/apk/prv/res/";
-constexpr const char* kSchemaAndroid = "http://schemas.android.com/apk/res/android";
+constexpr const char* kSchemaPublicPrefix =
+    "http://schemas.android.com/apk/res/";
+constexpr const char* kSchemaPrivatePrefix =
+    "http://schemas.android.com/apk/prv/res/";
+constexpr const char* kSchemaAndroid =
+    "http://schemas.android.com/apk/res/android";
 constexpr const char* kSchemaTools = "http://schemas.android.com/tools";
 constexpr const char* kSchemaAapt = "http://schemas.android.com/aapt";
 
@@ -36,17 +39,19 @@
  * Result of extracting a package name from a namespace URI declaration.
  */
 struct ExtractedPackage {
-    /**
-     * The name of the package. This can be the empty string, which means that the package
-     * should be assumed to be the package being compiled.
-     */
-    std::string package;
+  /**
+   * The name of the package. This can be the empty string, which means that the
+   * package
+   * should be assumed to be the package being compiled.
+   */
+  std::string package;
 
-    /**
-     * True if the package's private namespace was declared. This means that private resources
-     * are made visible.
-     */
-    bool privateNamespace;
+  /**
+   * True if the package's private namespace was declared. This means that
+   * private resources
+   * are made visible.
+   */
+  bool privateNamespace;
 };
 
 /**
@@ -57,7 +62,8 @@
  * Special case: if namespaceUri is http://schemas.android.com/apk/res-auto,
  * returns an empty package name.
  */
-Maybe<ExtractedPackage> extractPackageFromNamespace(const std::string& namespaceUri);
+Maybe<ExtractedPackage> extractPackageFromNamespace(
+    const std::string& namespaceUri);
 
 /**
  * Returns an XML Android namespace for the given package of the form:
@@ -68,31 +74,37 @@
  *
  * http://schemas.android.com/apk/prv/res/<package>
  */
-std::string buildPackageNamespace(const StringPiece& package, bool privateReference=false);
+std::string buildPackageNamespace(const StringPiece& package,
+                                  bool privateReference = false);
 
 /**
- * Interface representing a stack of XML namespace declarations. When looking up the package
+ * Interface representing a stack of XML namespace declarations. When looking up
+ * the package
  * for a namespace prefix, the stack is checked from top to bottom.
  */
 struct IPackageDeclStack {
-    virtual ~IPackageDeclStack() = default;
+  virtual ~IPackageDeclStack() = default;
 
-    /**
-     * Returns an ExtractedPackage struct if the alias given corresponds with a package declaration.
-     */
-    virtual Maybe<ExtractedPackage> transformPackageAlias(
-            const StringPiece& alias, const StringPiece& localPackage) const = 0;
+  /**
+   * Returns an ExtractedPackage struct if the alias given corresponds with a
+   * package declaration.
+   */
+  virtual Maybe<ExtractedPackage> transformPackageAlias(
+      const StringPiece& alias, const StringPiece& localPackage) const = 0;
 };
 
 /**
- * Helper function for transforming the original Reference inRef to a fully qualified reference
- * via the IPackageDeclStack. This will also mark the Reference as private if the namespace of
+ * Helper function for transforming the original Reference inRef to a fully
+ * qualified reference
+ * via the IPackageDeclStack. This will also mark the Reference as private if
+ * the namespace of
  * the package declaration was private.
  */
 void transformReferenceFromNamespace(IPackageDeclStack* declStack,
-                                     const StringPiece& localPackage, Reference* inRef);
+                                     const StringPiece& localPackage,
+                                     Reference* inRef);
 
-} // namespace xml
-} // namespace aapt
+}  // namespace xml
+}  // namespace aapt
 
 #endif /* AAPT_XML_XMLUTIL_H */