diff --git a/.gn b/.gn
index a3d99b5..a0487cc 100644
--- a/.gn
+++ b/.gn
@@ -494,7 +494,6 @@
   "//third_party/logilab/*",
   "//third_party/lss/*",
   "//third_party/lzma_sdk/*",
-  "//third_party/mach_override/*",
   "//third_party/markdown/*",
   "//third_party/markupsafe/*",
   "//third_party/material_design_icons/*",
diff --git a/AUTHORS b/AUTHORS
index 06d3552..15477cbc 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -362,6 +362,7 @@
 Ilia Demianenko <ilia.demianenko@gmail.com>
 Ilia K <ki.stfu@gmail.com>
 Ilya Konstantinov <ilya.konstantinov@gmail.com>
+Imranur Rahman <ir.shimul@gmail.com>
 Ion Rosca <rosca@adobe.com>
 Irmak Kavasoglu <irmakkavasoglu@gmail.com>
 Isaac Murchie <murchieisaac@gmail.com>
diff --git a/DEPS b/DEPS
index 35d5e37..4b5d2bd 100644
--- a/DEPS
+++ b/DEPS
@@ -138,11 +138,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': 'cc84ea1d6c32b61b192a4891cb1e8fc608909c64',
+  'skia_revision': '234e27e5e242019f8c5cd6410f4d369678f21177',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '0f67ee5f40b18b9cf8d53c8d12479f4da8abbf1d',
+  'v8_revision': 'ee5d757d905ada088030f38002022d47c391a62b',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -150,11 +150,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '74e98f6cb07daf8b9c1d373013cc3b881f2be6c9',
+  'angle_revision': 'b937093eed5c626a0d65c2a0500379bef6d8a8ba',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': 'e899321b0bf7f8ebcab4a5b4e562474701829b75',
+  'swiftshader_revision': 'a25f5438fa270ecb0ca1c39bfee417ec621ff392',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
@@ -269,7 +269,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'shaderc_revision': '16f6e6ab932f4fe99dd96131af8c9cc6af226cdc',
+  'shaderc_revision': 'c4ba097f066d3a626824b93b4c7ba50f3d315b37',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -277,7 +277,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'quiche_revision': '4080a859725c90354baefc8ad3743e2bf5cb7280',
+  'quiche_revision': '8da8f7162b76a63aa5d3c2062d12f872f9dc1dac',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ios_webkit
   # and whatever else without interference from each other.
@@ -807,7 +807,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '3df9c76a49990d758076452ea8aef60da7916085',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'eb77ffa955c6f18822382c7b91cc95ef3e52c21f',
       'condition': 'checkout_linux',
   },
 
@@ -1187,7 +1187,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' +  'dcd49b01615f532d50bdc2aabd619cc2e8204a0a',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' +  'e39534277469c536e7f7b4e6efa06a1d86e0c242',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1355,7 +1355,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '6f0b34abee8dba611c253738d955c59f703c147a',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '2308bb223ef2bd139be6375139832c0cfc4b2849',
+    Var('webrtc_git') + '/src.git' + '@' + '9a5c2e82ebbb4329b0994bb251b0457f8a8f69a1',
 
   'src/third_party/xdg-utils': {
       'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
@@ -1396,7 +1396,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@45f99e2caaf7bc7ea5f18959cfa5dc3b23316758',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@a74ad478c04cc2ff1495859832cba3b11281f195',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index eac143b..2f43503 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -3194,6 +3194,18 @@
       return cmd, '\n'.join(difflib.context_diff(old_contents, new_contents))
 
 
+def _ParseGclientArgs():
+  args = {}
+  with open('build/config/gclient_args.gni', 'r') as f:
+    for line in f:
+      line = line.strip()
+      if not line or line.startswith('#'):
+        continue
+      attribute, value = line.split('=')
+      args[attribute.strip()] = value.strip()
+  return args
+
+
 def _CheckPydepsNeedsUpdating(input_api, output_api, checker_for_tests=None):
   """Checks if a .pydeps file needs to be regenerated."""
   # This check is for Python dependency lists (.pydeps files), and involves
@@ -3201,9 +3213,7 @@
   # doesn't work on Windows and Mac, so skip it on other platforms.
   if input_api.platform != 'linux2':
     return []
-  # TODO(agrieve): Update when there's a better way to detect
-  # this: crbug.com/570091
-  is_android = input_api.os_path.exists('third_party/android_tools')
+  is_android = _ParseGclientArgs().get('checkout_android', 'false') == 'true'
   pydeps_files = _ALL_PYDEPS_FILES if is_android else _GENERIC_PYDEPS_FILES
   results = []
   # First, check for new / deleted .pydeps.
diff --git a/android_webview/browser/aw_content_browser_client.cc b/android_webview/browser/aw_content_browser_client.cc
index 5869691..0b4382c1 100644
--- a/android_webview/browser/aw_content_browser_client.cc
+++ b/android_webview/browser/aw_content_browser_client.cc
@@ -859,7 +859,7 @@
 }
 
 std::vector<std::unique_ptr<content::URLLoaderThrottle>>
-AwContentBrowserClient::CreateURLLoaderThrottles(
+AwContentBrowserClient::CreateURLLoaderThrottlesOnIO(
     const network::ResourceRequest& request,
     content::ResourceContext* resource_context,
     const base::RepeatingCallback<content::WebContents*()>& wc_getter,
diff --git a/android_webview/browser/aw_content_browser_client.h b/android_webview/browser/aw_content_browser_client.h
index 600cb9d5..f7cd6a6 100644
--- a/android_webview/browser/aw_content_browser_client.h
+++ b/android_webview/browser/aw_content_browser_client.h
@@ -183,7 +183,7 @@
       service_manager::BinderRegistry* registry,
       content::RenderFrameHost* render_frame_host) override;
   std::vector<std::unique_ptr<content::URLLoaderThrottle>>
-  CreateURLLoaderThrottles(
+  CreateURLLoaderThrottlesOnIO(
       const network::ResourceRequest& request,
       content::ResourceContext* resource_context,
       const base::RepeatingCallback<content::WebContents*()>& wc_getter,
diff --git a/android_webview/common/aw_content_client.cc b/android_webview/common/aw_content_client.cc
index 33d54be..6691237 100644
--- a/android_webview/common/aw_content_client.cc
+++ b/android_webview/common/aw_content_client.cc
@@ -31,7 +31,7 @@
   schemes->allow_non_standard_schemes_in_origins = true;
 }
 
-base::string16 AwContentClient::GetLocalizedString(int message_id) const {
+base::string16 AwContentClient::GetLocalizedString(int message_id) {
   // TODO(boliu): Used only by WebKit, so only bundle those resources for
   // Android WebView.
   return l10n_util::GetStringUTF16(message_id);
@@ -39,20 +39,19 @@
 
 base::StringPiece AwContentClient::GetDataResource(
     int resource_id,
-    ui::ScaleFactor scale_factor) const {
+    ui::ScaleFactor scale_factor) {
   // TODO(boliu): Used only by WebKit, so only bundle those resources for
   // Android WebView.
   return ui::ResourceBundle::GetSharedInstance().GetRawDataResourceForScale(
       resource_id, scale_factor);
 }
 
-base::RefCountedMemory* AwContentClient::GetDataResourceBytes(
-    int resource_id) const {
+base::RefCountedMemory* AwContentClient::GetDataResourceBytes(int resource_id) {
   return ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytes(
       resource_id);
 }
 
-bool AwContentClient::IsDataResourceGzipped(int resource_id) const {
+bool AwContentClient::IsDataResourceGzipped(int resource_id) {
   return ui::ResourceBundle::GetSharedInstance().IsGzipped(resource_id);
 }
 
diff --git a/android_webview/common/aw_content_client.h b/android_webview/common/aw_content_client.h
index abaf747..88ccc80 100644
--- a/android_webview/common/aw_content_client.h
+++ b/android_webview/common/aw_content_client.h
@@ -19,12 +19,11 @@
  public:
   // ContentClient implementation.
   void AddAdditionalSchemes(Schemes* schemes) override;
-  base::string16 GetLocalizedString(int message_id) const override;
-  base::StringPiece GetDataResource(
-      int resource_id,
-      ui::ScaleFactor scale_factor) const override;
-  base::RefCountedMemory* GetDataResourceBytes(int resource_id) const override;
-  bool IsDataResourceGzipped(int resource_id) const override;
+  base::string16 GetLocalizedString(int message_id) override;
+  base::StringPiece GetDataResource(int resource_id,
+                                    ui::ScaleFactor scale_factor) override;
+  base::RefCountedMemory* GetDataResourceBytes(int resource_id) override;
+  bool IsDataResourceGzipped(int resource_id) override;
   bool CanSendWhileSwappedOut(const IPC::Message* message) override;
   void SetGpuInfo(const gpu::GPUInfo& gpu_info) override;
   bool UsingSynchronousCompositing() override;
diff --git a/android_webview/docs/navbar.md b/android_webview/docs/navbar.md
index f35b101..f46127f 100644
--- a/android_webview/docs/navbar.md
+++ b/android_webview/docs/navbar.md
@@ -1,6 +1,6 @@
 # WebView docs (go/webview-docs)
 
-* [Home][home]
+* [Home](/android_webview/docs/README.md)
 * [Quick start](/android_webview/docs/quick-start.md)
 * [Device setup](/android_webview/docs/device-setup.md)
 * [Build instructions](/android_webview/docs/build-instructions.md)
diff --git a/android_webview/docs/quick-start.md b/android_webview/docs/quick-start.md
index 2667e5b6..c1c6ef9c 100644
--- a/android_webview/docs/quick-start.md
+++ b/android_webview/docs/quick-start.md
@@ -176,6 +176,15 @@
 Check the "Current WebView package" in the dumpsys output. You're probably
 hitting one of the cases above.
 
+### INSTALL\_FAILED\_UPDATE\_INCOMPATIBLE: Package ... signatures do not match previously installed version
+
+This is probably because you've already installed Chrome Debug (ex. with the
+Google-only `monochrome_apk` target, or through a Google-only official build).
+This guide borrows that app's package name, but the locally compiled APK may not
+have the same signing key, causing the `adb install` error. You should remove
+the conflicting package with `out/Default/bin/system_webview_apk uninstall`, and
+then try installing WebView again.
+
 ### I couldn't install the APK/... is NOT installed.
 
 This could fail for an even wider variety of reasons than already listed. Please
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java
index 299347be..6060e5c 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContents.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -1393,7 +1393,7 @@
         if (isDestroyed(NO_WARN)) return;
 
         if (mContentCaptureConsumer != null) {
-            mContentCaptureConsumer.destroy();
+            mContentCaptureConsumer.onWebContentsChanged(null);
             mContentCaptureConsumer = null;
         }
 
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentCaptureTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentCaptureTest.java
index 4dfca95..83d30eb6 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentCaptureTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentCaptureTest.java
@@ -4,6 +4,7 @@
 
 package org.chromium.android_webview.test;
 
+import android.graphics.Rect;
 import android.support.test.filters.SmallTest;
 
 import org.junit.After;
@@ -101,6 +102,7 @@
 
         @Override
         public void onSessionRemoved(FrameSession session) {
+            mRemovedSession = session;
             mCallbacks.add(SESSION_REMOVED);
             mCallbackHelper.notifyCalled();
         }
@@ -131,6 +133,10 @@
             return mCurrentFrameSession;
         }
 
+        public FrameSession getRemovedSession() {
+            return mRemovedSession;
+        }
+
         public long[] getRemovedIds() {
             return mRemovedIds;
         }
@@ -177,6 +183,7 @@
         private volatile ContentCaptureData mCapturedContent;
         private volatile ContentCaptureData mUpdatedContent;
         private volatile FrameSession mCurrentFrameSession;
+        private volatile FrameSession mRemovedSession;
         private volatile long[] mRemovedIds;
         private volatile ArrayList<Integer> mCallbacks = new ArrayList<Integer>();
 
@@ -184,6 +191,7 @@
     }
 
     private final static String MAIN_FRAME_FILE = "/main_frame.html";
+    private final static String SECOND_PAGE = "/second_page.html";
 
     @Rule
     public AwActivityTestRule mRule = new AwActivityTestRule();
@@ -251,6 +259,10 @@
         }
     }
 
+    private void destroyAwContents() {
+        TestThreadUtils.runOnUiThreadBlocking(() -> { mAwContents.destroy(); });
+    }
+
     private void scrollToBottom() {
         TestThreadUtils.runOnUiThreadBlocking(
                 () -> { mContainerView.scrollTo(0, mContainerView.getHeight()); });
@@ -268,7 +280,7 @@
 
     private static void verifyFrame(Long expectedId, String expectedUrl, ContentCaptureData result)
             throws Exception {
-        if (expectedId == null) {
+        if (expectedId == null || expectedId.longValue() == 0) {
             Assert.assertNotEquals(0, result.getId());
         } else {
             Assert.assertEquals(expectedId.longValue(), result.getId());
@@ -277,8 +289,13 @@
         Assert.assertFalse(result.getBounds().isEmpty());
     }
 
-    private static void verifyFrameSesion(FrameSession expectedParentSession, FrameSession result)
-            throws Exception {}
+    private static void verifyFrameSession(FrameSession expected, FrameSession result)
+            throws Exception {
+        if (expected == null && (result == null || result.isEmpty())) return;
+        Assert.assertEquals(expected.size(), result.size());
+        for (int i = 0; i < expected.size(); i++)
+            verifyFrame(expected.get(i).getId(), expected.get(i).getValue(), result.get(i));
+    }
 
     private static void verifyContent(Set<String> expectedContent, Set<Long> unexpectedIds,
             Set<Long> expectedIds, ContentCaptureData result) throws Exception {
@@ -304,7 +321,7 @@
             Long expectedFrameId, String expectedUrl, Set<String> expectedContent,
             Set<Long> unexpectedContentIds, FrameSession parentResult, ContentCaptureData result)
             throws Exception {
-        verifyFrameSesion(expectedParentSession, parentResult);
+        verifyFrameSession(expectedParentSession, parentResult);
         verifyFrame(expectedFrameId, expectedUrl, result);
         verifyContent(expectedContent, unexpectedContentIds, null, result);
     }
@@ -313,7 +330,7 @@
             Long expectedFrameId, String expectedUrl, Set<String> expectedContent,
             Set<Long> expectedContentIds, FrameSession parentResult, ContentCaptureData result)
             throws Exception {
-        verifyFrameSesion(expectedParentSession, parentResult);
+        verifyFrameSession(expectedParentSession, parentResult);
         verifyFrame(expectedFrameId, expectedUrl, result);
         verifyContent(expectedContent, null, expectedContentIds, result);
     }
@@ -348,6 +365,27 @@
         mConsumer.waitForCallback(callCount, numberOfCallsToWaitFor);
     }
 
+    private FrameSession createFrameSession(ContentCaptureData data) {
+        FrameSession session = new FrameSession(1);
+        ContentCaptureData c = data;
+        Rect r = c.getBounds();
+        session.add(ContentCaptureData.createContentCaptureData(
+                null, c.getId(), c.getValue(), r.left, r.top, r.width(), r.height()));
+        return session;
+    }
+
+    private FrameSession createFrameSession(String url) {
+        FrameSession session = new FrameSession(1);
+        session.add(ContentCaptureData.createContentCaptureData(null, 0, url, 0, 0, 0, 0));
+        return session;
+    }
+
+    private FrameSession createFrameSession(ContentCaptureData... frames) {
+        FrameSession result = new FrameSession(frames.length);
+        for (ContentCaptureData f : frames) result.addAll(createFrameSession(f));
+        return result;
+    }
+
     @After
     public void tearDown() {
         mWebServer.shutdown();
@@ -459,4 +497,75 @@
         verifyUpdatedContent(null, frameId, url, toStringSet(changeContent), capturedContentIds,
                 mConsumer.getParentFrame(), mConsumer.getUpdatedContent());
     }
+
+    @Test
+    @SmallTest
+    @Feature({"AndroidWebView"})
+    public void testRemoveSession() throws Throwable {
+        final String response = "<html><head></head><body>"
+                + "<div id='editable_id'>Hello</div>"
+                + "</div></body></html>";
+        final String response2 = "<html><head></head><body>"
+                + "<div id='editable_id'>World</div>"
+                + "</div></body></html>";
+        final String url = mWebServer.setResponse(MAIN_FRAME_FILE, response, null);
+        final String url2 = mWebServer.setResponse(SECOND_PAGE, response2, null);
+
+        runAndWaitForCallback(() -> { loadUrlSync(url); });
+        verifyCallbacks(toIntArray(TestAwContentCaptureConsumer.CONTENT_CAPTURED),
+                mConsumer.getCallbacks());
+        Long frameId = null;
+        Set<Long> capturedContentIds = null;
+        verifyCapturedContent(null, frameId, url, toStringSet("Hello"), capturedContentIds,
+                mConsumer.getParentFrame(), mConsumer.getCapturedContent());
+
+        // Keep a copy of current session to verify it removed later.
+        FrameSession removedSession = createFrameSession(mConsumer.getCapturedContent());
+        capturedContentIds = mConsumer.cloneCaptureContentIds();
+        int[] expectedCallbacks = toIntArray(TestAwContentCaptureConsumer.SESSION_REMOVED,
+                TestAwContentCaptureConsumer.CONTENT_CAPTURED);
+        runAndWaitForCallback(() -> { loadUrlSync(url2); }, expectedCallbacks.length);
+        verifyCallbacks(expectedCallbacks, mConsumer.getCallbacks());
+        verifyCapturedContent(null, frameId, url2, toStringSet("World"), capturedContentIds,
+                mConsumer.getParentFrame(), mConsumer.getCapturedContent());
+        // Verify previous session has been removed.
+        verifyFrameSession(removedSession, mConsumer.getRemovedSession());
+
+        // Keep a copy of current session to verify it removed later.
+        removedSession = createFrameSession(mConsumer.getCapturedContent());
+        runAndWaitForCallback(() -> { destroyAwContents(); });
+        verifyCallbacks(
+                toIntArray(TestAwContentCaptureConsumer.SESSION_REMOVED), mConsumer.getCallbacks());
+        verifyFrameSession(removedSession, mConsumer.getRemovedSession());
+    }
+
+    @Test
+    @SmallTest
+    @Feature({"AndroidWebView"})
+    public void testRemoveIframe() throws Throwable {
+        final String subFrame = "<html><head></head><body>"
+                + "<div id='editable_id'>Hello</div>"
+                + "</div></body></html>";
+        final String subFrameUrl = mWebServer.setResponse(SECOND_PAGE, subFrame, null);
+        final String mainFrame = "<html><head></head><body>"
+                + "<iframe id='sub_frame_id' src='" + subFrameUrl + "'></iframe></body></html>";
+        final String mainFrameUrl = mWebServer.setResponse(MAIN_FRAME_FILE, mainFrame, null);
+        runAndWaitForCallback(() -> { loadUrlSync(mainFrameUrl); });
+        verifyCallbacks(toIntArray(TestAwContentCaptureConsumer.CONTENT_CAPTURED),
+                mConsumer.getCallbacks());
+
+        FrameSession expectedParentFrameSession = createFrameSession(mainFrameUrl);
+        Long frameId = null;
+        verifyCapturedContent(expectedParentFrameSession, frameId, subFrameUrl,
+                toStringSet("Hello"), null, mConsumer.getParentFrame(),
+                mConsumer.getCapturedContent());
+
+        FrameSession removedSession = createFrameSession(
+                mConsumer.getCapturedContent(), mConsumer.getParentFrame().get(0));
+        runAndWaitForCallback(() -> {
+            runScript("var frame = document.getElementById('sub_frame_id');"
+                    + "frame.parentNode.removeChild(frame);");
+        });
+        verifyFrameSession(removedSession, mConsumer.getRemovedSession());
+    }
 }
diff --git a/ash/app_list/app_list_presenter_delegate_unittest.cc b/ash/app_list/app_list_presenter_delegate_unittest.cc
index 0848740..9e53666 100644
--- a/ash/app_list/app_list_presenter_delegate_unittest.cc
+++ b/ash/app_list/app_list_presenter_delegate_unittest.cc
@@ -1418,7 +1418,7 @@
                                                ->contents_view()
                                                ->GetAppsContainerView()
                                                ->apps_grid_view();
-  EXPECT_FALSE(apps_grid_view->view_model()->view_at(0)->layer()->visible());
+  EXPECT_FALSE(apps_grid_view->view_model()->view_at(0)->GetVisible());
 
   // Verifies that the AppListView state after mouse drag should be
   // FullscreenAllApps.
diff --git a/ash/app_list/views/app_list_item_view.cc b/ash/app_list/views/app_list_item_view.cc
index 9580d73..5b00895 100644
--- a/ash/app_list/views/app_list_item_view.cc
+++ b/ash/app_list/views/app_list_item_view.cc
@@ -264,9 +264,6 @@
   SetAnimationDuration(0);
 
   preview_circle_radius_ = 0;
-
-  SetPaintToLayer();
-  layer()->SetFillsBoundsOpaquely(false);
 }
 
 AppListItemView::~AppListItemView() {
@@ -327,6 +324,8 @@
 }
 
 void AppListItemView::ScaleAppIcon(bool scale_up) {
+  if (!layer())
+    return;
   const gfx::Rect bounds(layer()->bounds().size());
   gfx::Transform transform =
       gfx::GetScaleTransform(bounds.CenterPoint(), kDragDropAppIconScale);
@@ -776,6 +775,13 @@
       enabled ? AppListConfig::instance().blur_radius() : 0);
 }
 
+void AppListItemView::EnsureLayer() {
+  if (layer())
+    return;
+  SetPaintToLayer();
+  layer()->SetFillsBoundsOpaquely(false);
+}
+
 void AppListItemView::AnimationProgressed(const gfx::Animation* animation) {
   if (is_folder_) {
     // Animate the folder icon via changing mask layer's corner radius and
diff --git a/ash/app_list/views/app_list_item_view.h b/ash/app_list/views/app_list_item_view.h
index 94134877..8b0c6bf2 100644
--- a/ash/app_list/views/app_list_item_view.h
+++ b/ash/app_list/views/app_list_item_view.h
@@ -126,6 +126,9 @@
   // Enables background blur for folder icon if |enabled| is true.
   void SetBackgroundBlurEnabled(bool enabled);
 
+  // Ensures this item view has its own layer.
+  void EnsureLayer();
+
   bool is_folder() const { return is_folder_; }
 
  private:
diff --git a/ash/app_list/views/apps_grid_view.cc b/ash/app_list/views/apps_grid_view.cc
index 712b973..3c5d24e 100644
--- a/ash/app_list/views/apps_grid_view.cc
+++ b/ash/app_list/views/apps_grid_view.cc
@@ -333,7 +333,8 @@
       pagination_animation_start_frame_number_(0),
       view_structure_(this) {
   DCHECK(contents_view_);
-  SetPaintToLayer(ui::LAYER_NOT_DRAWN);
+  SetPaintToLayer();
+  layer()->SetFillsBoundsOpaquely(false);
   // Clip any icons that are outside the grid view's bounds. These icons would
   // otherwise be visible to the user when the grid view is off screen.
   layer()->SetMasksToBounds(true);
@@ -352,9 +353,11 @@
                        : ash::PaginationController::SCROLL_AXIS_VERTICAL,
       base::BindRepeating(&RecordPageSwitcherSourceByEventType),
       IsTabletMode());
+  bounds_animator_.AddObserver(this);
 }
 
 AppsGridView::~AppsGridView() {
+  bounds_animator_.RemoveObserver(this);
   // Coming here |drag_view_| should already be canceled since otherwise the
   // drag would disappear after the app list got animated away and closed,
   // which would look odd.
@@ -537,6 +540,8 @@
   if (drag_view_ || pulsing_blocks_model_.view_size())
     return;
 
+  for (int i = 0; i < view_model_.view_size(); ++i)
+    view_model_.view_at(i)->EnsureLayer();
   drag_view_ = view;
 
   // Dragged view should have focus. This also fixed the issue
@@ -831,6 +836,9 @@
                           contents_view_->GetAppListMainView()->view_delegate(),
                           false /* is_in_folder */);
   AddChildView(view);
+  for (int i = 0; i < view_model_.view_size(); ++i)
+    view_model_.view_at(i)->EnsureLayer();
+  view->EnsureLayer();
   drag_view_ = view;
 
   // Dragged view should have focus. This also fixed the issue
@@ -1742,9 +1750,9 @@
   if (!CanMoveSelectedToTargetForKeyboardFoldering(target_index))
     return;
 
-  const base::string16 moving_view_title = selected_view_->title()->text();
+  const base::string16 moving_view_title = selected_view_->title()->GetText();
   AppListItemView* folder_item = MoveItemToFolder(selected_view_, target_index);
-  AnnounceFolderDrop(moving_view_title, folder_item->title()->text(),
+  AnnounceFolderDrop(moving_view_title, folder_item->title()->GetText(),
                      folder_item->is_folder());
   DCHECK(folder_item->is_folder());
   folder_item->RequestFocus();
@@ -1954,6 +1962,10 @@
 void AppsGridView::UpdateOpacity() {
   if (view_structure_.pages().empty())
     return;
+  const int selected_page = pagination_model_.selected_page();
+  auto current_page = view_structure_.pages()[selected_page];
+  if (current_page.empty())
+    return;
 
   // Updates the opacity of the apps in current page. The opacity of the app
   // starting at 0.f when the ceterline of the app is |kAllAppsOpacityStartPx|
@@ -1963,15 +1975,11 @@
   const bool should_restore_opacity =
       !app_list_view->is_in_drag() &&
       (app_list_view->app_list_state() != ash::AppListViewState::kClosed);
-  const int selected_page = pagination_model_.selected_page();
-  auto current_page = view_structure_.pages()[selected_page];
-  float centerline_above_work_area = 0.f;
-  float opacity = 0.f;
-  for (size_t i = 0; i < current_page.size(); i += cols_) {
-    AppListItemView* item_view = current_page[i];
-    gfx::Rect view_bounds = item_view->bounds();
+  float opacity = 1.f;
+  if (!should_restore_opacity) {
+    gfx::Rect view_bounds = current_page[0]->bounds();
     views::View::ConvertRectToScreen(this, &view_bounds);
-    centerline_above_work_area = std::max<float>(
+    float centerline_above_work_area = std::max<float>(
         app_list_view->GetScreenBottom() - view_bounds.CenterPoint().y(), 0.f);
     const float start_px =
         AppListConfig::instance().all_apps_opacity_start_px();
@@ -1981,17 +1989,9 @@
                       start_px),
                  0.f),
         1.0f);
-    opacity = should_restore_opacity ? 1.0f : opacity;
-
-    if (opacity == item_view->layer()->opacity())
-      continue;
-
-    const size_t end_index = std::min(current_page.size() - 1, i + cols_ - 1);
-    for (size_t j = i; j <= end_index; ++j) {
-      if (current_page[j] != drag_view_)
-        current_page[j]->layer()->SetOpacity(opacity);
-    }
   }
+  if (opacity != layer()->opacity())
+    layer()->SetOpacity(opacity);
 }
 
 bool AppsGridView::HandleScrollFromAppListView(const gfx::Vector2d& offset,
@@ -2720,6 +2720,16 @@
     SetVisible(false);
 }
 
+void AppsGridView::OnBoundsAnimatorProgressed(views::BoundsAnimator* animator) {
+}
+
+void AppsGridView::OnBoundsAnimatorDone(views::BoundsAnimator* animator) {
+  if (drag_view_)
+    return;
+  for (int i = 0; i < view_model_.view_size(); ++i)
+    view_model_.view_at(i)->DestroyLayer();
+}
+
 GridIndex AppsGridView::GetNearestTileIndexForPoint(
     const gfx::Point& point) const {
   gfx::Rect bounds = GetContentsBounds();
@@ -3236,8 +3246,8 @@
       GetViewDisplayedAtSlotOnCurrentPage(drop_target_.slot);
   DCHECK(drop_view);
 
-  AnnounceFolderDrop(drag_view_->title()->text(), drop_view->title()->text(),
-                     drop_view->is_folder());
+  AnnounceFolderDrop(drag_view_->title()->GetText(),
+                     drop_view->title()->GetText(), drop_view->is_folder());
 }
 
 void AppsGridView::AnnounceFolderDrop(const base::string16& moving_view_title,
diff --git a/ash/app_list/views/apps_grid_view.h b/ash/app_list/views/apps_grid_view.h
index aa54bd0f..5d94a6cc 100644
--- a/ash/app_list/views/apps_grid_view.h
+++ b/ash/app_list/views/apps_grid_view.h
@@ -30,6 +30,7 @@
 #include "ui/events/keycodes/keyboard_codes_posix.h"
 #include "ui/gfx/image/image_skia_operations.h"
 #include "ui/views/animation/bounds_animator.h"
+#include "ui/views/animation/bounds_animator_observer.h"
 #include "ui/views/controls/button/button.h"
 #include "ui/views/controls/image_view.h"
 #include "ui/views/view.h"
@@ -82,7 +83,8 @@
                                      public AppListItemListObserver,
                                      public ash::PaginationModelObserver,
                                      public AppListModelObserver,
-                                     public ui::ImplicitAnimationObserver {
+                                     public ui::ImplicitAnimationObserver,
+                                     public views::BoundsAnimatorObserver {
  public:
   enum Pointer {
     NONE,
@@ -483,6 +485,10 @@
   // ui::ImplicitAnimationObserver overrides:
   void OnImplicitAnimationsCompleted() override;
 
+  // views::BoundsAnimatorObserver:
+  void OnBoundsAnimatorProgressed(views::BoundsAnimator* animator) override;
+  void OnBoundsAnimatorDone(views::BoundsAnimator* animator) override;
+
   // Hide a given view temporarily without losing (mouse) events and / or
   // changing the size of it. If |immediate| is set the change will be
   // immediately applied - otherwise it will change gradually.
diff --git a/ash/app_list/views/apps_grid_view_unittest.cc b/ash/app_list/views/apps_grid_view_unittest.cc
index 12937606..0f0361c 100644
--- a/ash/app_list/views/apps_grid_view_unittest.cc
+++ b/ash/app_list/views/apps_grid_view_unittest.cc
@@ -449,7 +449,7 @@
   const views::Label* title_label = item_view->title();
   EXPECT_EQ(base::ASCIIToUTF16(expected_tooltip),
             item_view->GetTooltipText(title_label->bounds().CenterPoint()));
-  EXPECT_EQ(base::ASCIIToUTF16(expected_text), title_label->text());
+  EXPECT_EQ(base::ASCIIToUTF16(expected_text), title_label->GetText());
 }
 
 TEST_F(AppsGridViewTest, ItemLabelNoShortName) {
@@ -464,7 +464,7 @@
   const views::Label* title_label = item_view->title();
   EXPECT_TRUE(
       title_label->GetTooltipText(title_label->bounds().CenterPoint()).empty());
-  EXPECT_EQ(base::ASCIIToUTF16(title), title_label->text());
+  EXPECT_EQ(base::ASCIIToUTF16(title), title_label->GetText());
 }
 
 TEST_P(AppsGridViewTest, ScrollSequenceHandledByAppListView) {
diff --git a/ash/app_list/views/search_result_suggestion_chip_view.cc b/ash/app_list/views/search_result_suggestion_chip_view.cc
index b66039f..7d39d8c 100644
--- a/ash/app_list/views/search_result_suggestion_chip_view.cc
+++ b/ash/app_list/views/search_result_suggestion_chip_view.cc
@@ -211,7 +211,7 @@
 }
 
 const base::string16& SearchResultSuggestionChipView::GetText() const {
-  return text_view_->text();
+  return text_view_->GetText();
 }
 
 void SearchResultSuggestionChipView::UpdateSuggestionChipView() {
diff --git a/ash/app_list/views/search_result_tile_item_view.cc b/ash/app_list/views/search_result_tile_item_view.cc
index 662f9f0..6e239f8 100644
--- a/ash/app_list/views/search_result_tile_item_view.cc
+++ b/ash/app_list/views/search_result_tile_item_view.cc
@@ -221,16 +221,16 @@
   if (!result()->accessible_name().empty())
     accessible_name = result()->accessible_name();
   else
-    accessible_name = title_->text();
+    accessible_name = title_->GetText();
 
   if (rating_ && rating_->GetVisible()) {
     accessible_name +=
         base::UTF8ToUTF16(", ") +
         l10n_util::GetStringFUTF16(IDS_APP_ACCESSIBILITY_STAR_RATING_ARC,
-                                   rating_->text());
+                                   rating_->GetText());
   }
   if (price_ && price_->GetVisible())
-    accessible_name += base::UTF8ToUTF16(", ") + price_->text();
+    accessible_name += base::UTF8ToUTF16(", ") + price_->GetText();
 
   if (result()->result_type() ==
       ash::SearchResultType::kPlayStoreReinstallApp) {
@@ -556,7 +556,7 @@
 
     // If there is no price set, we center the rating.
     const bool center_rating =
-        rating_ && rating_star_ && price_ && price_->text().empty();
+        rating_ && rating_star_ && price_ && price_->GetText().empty();
     const int rating_horizontal_offset =
         center_rating ? kSearchRatingCenteringOffset : 0;
 
diff --git a/ash/app_menu/notification_menu_view_test_api.cc b/ash/app_menu/notification_menu_view_test_api.cc
index a413770..733e505a 100644
--- a/ash/app_menu/notification_menu_view_test_api.cc
+++ b/ash/app_menu/notification_menu_view_test_api.cc
@@ -20,7 +20,7 @@
 NotificationMenuViewTestAPI::~NotificationMenuViewTestAPI() = default;
 
 base::string16 NotificationMenuViewTestAPI::GetCounterViewContents() const {
-  return notification_menu_view_->header_view_->counter_->text();
+  return notification_menu_view_->header_view_->counter_->GetText();
 }
 
 int NotificationMenuViewTestAPI::GetItemViewCount() const {
diff --git a/ash/assistant/ui/main_stage/suggestion_chip_view.cc b/ash/assistant/ui/main_stage/suggestion_chip_view.cc
index 9a74472..b010e80 100644
--- a/ash/assistant/ui/main_stage/suggestion_chip_view.cc
+++ b/ash/assistant/ui/main_stage/suggestion_chip_view.cc
@@ -156,7 +156,7 @@
 }
 
 const base::string16& SuggestionChipView::GetText() const {
-  return text_view_->text();
+  return text_view_->GetText();
 }
 
 }  // namespace ash
diff --git a/ash/components/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc b/ash/components/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc
index 6411c6b..e5997d1 100644
--- a/ash/components/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc
+++ b/ash/components/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc
@@ -146,6 +146,30 @@
   return base::string16();
 }
 
+base::string16 GetAccessibleNameForKeyboardCode(ui::KeyboardCode key_code) {
+  int msg_id = 0;
+  switch (key_code) {
+    case ui::VKEY_OEM_PERIOD:
+      msg_id = IDS_KSV_KEY_PERIOD_ACCESSIBILITY_NAME;
+      break;
+    case ui::VKEY_OEM_COMMA:
+      msg_id = IDS_KSV_KEY_COMMA_ACCESSIBILITY_NAME;
+      break;
+    case ui::VKEY_OEM_MINUS:
+      msg_id = IDS_KSV_KEY_HYPHEN_ACCESSIBILITY_NAME;
+      break;
+    case ui::VKEY_OEM_4:
+      msg_id = IDS_KSV_KEY_BRACKET_LEFT_ACCESSIBILITY_NAME;
+      break;
+    case ui::VKEY_OEM_6:
+      msg_id = IDS_KSV_KEY_BRACKET_RIGHT_ACCESSIBILITY_NAME;
+      break;
+    default:
+      break;
+  }
+  return msg_id ? l10n_util::GetStringUTF16(msg_id) : base::string16();
+}
+
 const gfx::VectorIcon* GetVectorIconForKeyboardCode(ui::KeyboardCode key_code) {
   switch (key_code) {
     case ui::VKEY_BROWSER_BACK:
diff --git a/ash/components/shortcut_viewer/keyboard_shortcut_viewer_metadata.h b/ash/components/shortcut_viewer/keyboard_shortcut_viewer_metadata.h
index 492bae0..865e268 100644
--- a/ash/components/shortcut_viewer/keyboard_shortcut_viewer_metadata.h
+++ b/ash/components/shortcut_viewer/keyboard_shortcut_viewer_metadata.h
@@ -35,6 +35,13 @@
 // character.
 base::string16 GetStringForKeyboardCode(ui::KeyboardCode key_code);
 
+// Certain punctuation is not verbalized by ChromeVox, i.e. ".". So, whenever
+// one of these is used in a keyboard shortcut, need to set the accessible name
+// to explicitly specified text, such as "period".
+// Returns empty string if there is no special accessible name for the
+// |key_code|.
+base::string16 GetAccessibleNameForKeyboardCode(ui::KeyboardCode key_code);
+
 // Returns the VectorIcon if |key_code| need to be represented as an icon.
 // Returns nullptr if |key_code| should not be represented as an icon.
 const gfx::VectorIcon* GetVectorIconForKeyboardCode(ui::KeyboardCode key_code);
diff --git a/ash/components/shortcut_viewer/views/keyboard_shortcut_item_view.cc b/ash/components/shortcut_viewer/views/keyboard_shortcut_item_view.cc
index 0157255..40bfb3d1 100644
--- a/ash/components/shortcut_viewer/views/keyboard_shortcut_item_view.cc
+++ b/ash/components/shortcut_viewer/views/keyboard_shortcut_item_view.cc
@@ -71,9 +71,11 @@
 
   std::vector<size_t> offsets;
   std::vector<base::string16> replacement_strings;
+  std::vector<base::string16> accessible_names;
   const size_t shortcut_key_codes_size = item.shortcut_key_codes.size();
   offsets.reserve(shortcut_key_codes_size);
   replacement_strings.reserve(shortcut_key_codes_size);
+  accessible_names.reserve(shortcut_key_codes_size);
   bool has_invalid_dom_key = false;
   for (ui::KeyboardCode key_code : item.shortcut_key_codes) {
     auto iter = GetKeycodeToString16Cache()->find(key_code);
@@ -88,20 +90,29 @@
     // layout.
     if (dom_key_string.empty()) {
       replacement_strings.clear();
+      accessible_names.clear();
       has_invalid_dom_key = true;
       break;
     }
     replacement_strings.emplace_back(dom_key_string);
+
+    base::string16 accessible_name = GetAccessibleNameForKeyboardCode(key_code);
+    accessible_names.emplace_back(accessible_name.empty() ? dom_key_string
+                                                          : accessible_name);
   }
 
   base::string16 shortcut_string;
+  base::string16 accessible_string;
   if (replacement_strings.empty()) {
     shortcut_string = l10n_util::GetStringUTF16(has_invalid_dom_key
                                                     ? IDS_KSV_KEY_NO_MAPPING
                                                     : item.shortcut_message_id);
+    accessible_string = shortcut_string;
   } else {
     shortcut_string = l10n_util::GetStringFUTF16(item.shortcut_message_id,
                                                  replacement_strings, &offsets);
+    accessible_string = l10n_util::GetStringFUTF16(
+        item.shortcut_message_id, accessible_names, /*offsets=*/nullptr);
   }
   shortcut_label_view_ = new views::StyledLabel(shortcut_string, nullptr);
   // StyledLabel will flip the alignment if UI layout is right-to-left.
@@ -138,7 +149,7 @@
   GetViewAccessibility().OverrideRole(ax::mojom::Role::kListItem);
   GetViewAccessibility().OverrideIsLeaf(true);
   accessible_name_ = description_label_view_->text() +
-                     base::ASCIIToUTF16(", ") + shortcut_label_view_->text();
+                     base::ASCIIToUTF16(", ") + accessible_string;
 }
 
 void KeyboardShortcutItemView::GetAccessibleNodeData(
diff --git a/ash/components/shortcut_viewer_strings.grdp b/ash/components/shortcut_viewer_strings.grdp
index a524a49..1ca004e 100644
--- a/ash/components/shortcut_viewer_strings.grdp
+++ b/ash/components/shortcut_viewer_strings.grdp
@@ -21,6 +21,21 @@
   <message name="IDS_KSV_SEARCH_BOX_ACCESSIBILITY_VALUE_WITHOUT_RESULTS" desc="Accessibility value for the search box without searched results.">
     No search result for <ph name="query">$1<ex>a</ex></ph>
   </message>
+  <message name="IDS_KSV_KEY_PERIOD_ACCESSIBILITY_NAME" desc="Accessibility Name of [.] key">
+    period
+  </message>
+  <message name="IDS_KSV_KEY_COMMA_ACCESSIBILITY_NAME" desc="Accessibility Name of [,] key">
+    comma
+  </message>
+  <message name="IDS_KSV_KEY_HYPHEN_ACCESSIBILITY_NAME" desc="Accessibility Name of [-] key">
+    hyphen
+  </message>
+  <message name="IDS_KSV_KEY_BRACKET_LEFT_ACCESSIBILITY_NAME" desc="Accessibility Name of [ key">
+    bracket left
+  </message>
+  <message name="IDS_KSV_KEY_BRACKET_RIGHT_ACCESSIBILITY_NAME" desc="Accessibility Name of ] key">
+    bracket right
+  </message>
 
   <!-- Search illustration -->
   <message name="IDS_KSV_SEARCH_NO_RESULT" desc="No search results.">
diff --git a/ash/login/ui/login_user_menu_view.cc b/ash/login/ui/login_user_menu_view.cc
index 302b91b..1adaba4c 100644
--- a/ash/login/ui/login_user_menu_view.cc
+++ b/ash/login/ui/login_user_menu_view.cc
@@ -247,7 +247,7 @@
     remove_user_button_ = new RemoveUserButton(this, remove_user_label_, this);
     remove_user_button_->SetFocusBehavior(views::View::FocusBehavior::ALWAYS);
     remove_user_button_->SetID(kUserMenuRemoveUserButtonIdForTest);
-    remove_user_button_->SetAccessibleName(remove_user_label_->text());
+    remove_user_button_->SetAccessibleName(remove_user_label_->GetText());
     container->AddChildView(remove_user_button_);
   }
 }
diff --git a/ash/login/ui/login_user_view.cc b/ash/login/ui/login_user_view.cc
index 2a8a5e50..b5ae0107 100644
--- a/ash/login/ui/login_user_view.cc
+++ b/ash/login/ui/login_user_view.cc
@@ -215,7 +215,7 @@
                                        gfx::ElideBehavior::ELIDE_TAIL));
   }
 
-  const base::string16& displayed_name() const { return user_name_->text(); }
+  const base::string16& displayed_name() const { return user_name_->GetText(); }
 
  private:
   views::Label* user_name_ = nullptr;
diff --git a/ash/login/ui/parent_access_view_unittest.cc b/ash/login/ui/parent_access_view_unittest.cc
index c1b496f..6d65630 100644
--- a/ash/login/ui/parent_access_view_unittest.cc
+++ b/ash/login/ui/parent_access_view_unittest.cc
@@ -97,9 +97,9 @@
   StartView(ParentAccessRequestReason::kUnlockTimeLimits);
   ParentAccessView::TestApi test_api(view_);
   EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_LOGIN_PARENT_ACCESS_TITLE),
-            test_api.title_label()->text());
+            test_api.title_label()->GetText());
   EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_LOGIN_PARENT_ACCESS_DESCRIPTION),
-            test_api.description_label()->text());
+            test_api.description_label()->GetText());
 }
 
 // Tests that title and description are correctly set when reason is change
@@ -109,10 +109,10 @@
   ParentAccessView::TestApi test_api(view_);
   EXPECT_EQ(
       l10n_util::GetStringUTF16(IDS_ASH_LOGIN_PARENT_ACCESS_TITLE_CHANGE_TIME),
-      test_api.title_label()->text());
+      test_api.title_label()->GetText());
   EXPECT_EQ(l10n_util::GetStringUTF16(
                 IDS_ASH_LOGIN_PARENT_ACCESS_GENERIC_DESCRIPTION),
-            test_api.description_label()->text());
+            test_api.description_label()->GetText());
 }
 
 // Tests that back button works.
diff --git a/ash/login/ui/public_account_warning_dialog.cc b/ash/login/ui/public_account_warning_dialog.cc
index ed8c1f0c..991a0600 100644
--- a/ash/login/ui/public_account_warning_dialog.cc
+++ b/ash/login/ui/public_account_warning_dialog.cc
@@ -80,7 +80,8 @@
         1, gfx::Font::FontStyle::NORMAL, gfx::Font::Weight::NORMAL));
     label->SetEnabledColor(SK_ColorGRAY);
 
-    auto* bullet_view = new BulletView(label->enabled_color(), kBulletRadiusDp);
+    auto* bullet_view =
+        new BulletView(label->GetEnabledColor(), kBulletRadiusDp);
     bullet_view->SetPreferredSize(
         gfx::Size(kBulletContainerSizeDp, kBulletContainerSizeDp));
 
diff --git a/ash/sticky_keys/sticky_keys_overlay.cc b/ash/sticky_keys/sticky_keys_overlay.cc
index afc95aa..cc96f1f 100644
--- a/ash/sticky_keys/sticky_keys_overlay.cc
+++ b/ash/sticky_keys/sticky_keys_overlay.cc
@@ -79,15 +79,15 @@
   switch (state) {
     case STICKY_KEY_STATE_ENABLED:
       style = gfx::Font::NORMAL;
-      label_color = SkColorSetA(enabled_color(), 0xFF);
+      label_color = SkColorSetA(GetEnabledColor(), 0xFF);
       break;
     case STICKY_KEY_STATE_LOCKED:
       style = gfx::Font::UNDERLINE;
-      label_color = SkColorSetA(enabled_color(), 0xFF);
+      label_color = SkColorSetA(GetEnabledColor(), 0xFF);
       break;
     default:
       style = gfx::Font::NORMAL;
-      label_color = SkColorSetA(enabled_color(), 0x80);
+      label_color = SkColorSetA(GetEnabledColor(), 0x80);
   }
 
   SetEnabledColor(label_color);
diff --git a/ash/system/ime_menu/ime_list_view.cc b/ash/system/ime_menu/ime_list_view.cc
index 9974b4c..07fcfe8 100644
--- a/ash/system/ime_menu/ime_list_view.cc
+++ b/ash/system/ime_menu/ime_list_view.cc
@@ -102,7 +102,7 @@
           gfx::CreateVectorIcon(kCheckCircleIcon, kMenuIconSize, button_color));
       tri_view->AddView(TriView::Container::END, checked_image);
     }
-    SetAccessibleName(label_view->text());
+    SetAccessibleName(label_view->GetText());
   }
 
   ~ImeListItemView() override = default;
diff --git a/ash/system/ime_menu/ime_menu_tray_unittest.cc b/ash/system/ime_menu/ime_menu_tray_unittest.cc
index f09fa0e..b737ffa 100644
--- a/ash/system/ime_menu/ime_menu_tray_unittest.cc
+++ b/ash/system/ime_menu/ime_menu_tray_unittest.cc
@@ -61,7 +61,7 @@
   bool IsVisible() { return GetTray()->GetVisible(); }
 
   // Returns the label text of the tray.
-  const base::string16& GetTrayText() { return GetTray()->label_->text(); }
+  const base::string16& GetTrayText() { return GetTray()->label_->GetText(); }
 
   // Returns true if the background color of the tray is active.
   bool IsTrayBackgroundActive() { return GetTray()->is_active(); }
diff --git a/ash/system/locale/locale_detailed_view.cc b/ash/system/locale/locale_detailed_view.cc
index a375ca5..91a73c2a 100644
--- a/ash/system/locale/locale_detailed_view.cc
+++ b/ash/system/locale/locale_detailed_view.cc
@@ -75,7 +75,7 @@
           kCheckCircleIcon, kMenuIconSize, gfx::kGoogleGreen700));
       tri_view->AddView(TriView::Container::END, checked_image);
     }
-    SetAccessibleName(display_name_view->text());
+    SetAccessibleName(display_name_view->GetText());
   }
 
   ~LocaleItem() override = default;
diff --git a/ash/system/palette/palette_welcome_bubble.cc b/ash/system/palette/palette_welcome_bubble.cc
index b21770d37..83cf026 100644
--- a/ash/system/palette/palette_welcome_bubble.cc
+++ b/ash/system/palette/palette_welcome_bubble.cc
@@ -6,7 +6,6 @@
 
 #include <memory>
 
-#include "ash/kiosk_next/kiosk_next_shell_controller_impl.h"
 #include "ash/public/cpp/ash_pref_names.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/session/session_controller_impl.h"
@@ -122,9 +121,6 @@
     return;
   }
 
-  if (Shell::Get()->kiosk_next_shell_controller()->IsEnabled())
-    return;
-
   if (!HasBeenShown())
     Show();
 }
diff --git a/ash/system/palette/tools/metalayer_unittest.cc b/ash/system/palette/tools/metalayer_unittest.cc
index ef71839..633ad035 100644
--- a/ash/system/palette/tools/metalayer_unittest.cc
+++ b/ash/system/palette/tools/metalayer_unittest.cc
@@ -103,7 +103,7 @@
           const base::string16 label_text =
               static_cast<HoverHighlightView*>(view.get())
                   ->text_label()
-                  ->text();
+                  ->GetText();
 
           const bool label_contains_loading =
               label_text.find(kLoading) != base::string16::npos;
diff --git a/ash/system/power/power_button_menu_item_view.cc b/ash/system/power/power_button_menu_item_view.cc
index 3c944267c..576efbe 100644
--- a/ash/system/power/power_button_menu_item_view.cc
+++ b/ash/system/power/power_button_menu_item_view.cc
@@ -63,7 +63,7 @@
   title_->SetText(title_text);
   AddChildView(title_);
   GetViewAccessibility().OverrideRole(ax::mojom::Role::kMenuItem);
-  GetViewAccessibility().OverrideName(title_->text());
+  GetViewAccessibility().OverrideName(title_->GetText());
 
   SetBorder(views::CreateEmptyBorder(kItemBorderThickness, kItemBorderThickness,
                                      kItemBorderThickness,
diff --git a/ash/system/power/power_status_view_unittest.cc b/ash/system/power/power_status_view_unittest.cc
index 6834784..c17889f9 100644
--- a/ash/system/power/power_status_view_unittest.cc
+++ b/ash/system/power/power_status_view_unittest.cc
@@ -47,7 +47,7 @@
   }
 
   base::string16 RemainingTimeInView() const {
-    return view_->time_status_label_->text();
+    return view_->time_status_label_->GetText();
   }
 
  private:
diff --git a/ash/wm/overview/overview_session_unittest.cc b/ash/wm/overview/overview_session_unittest.cc
index 517ff7e0..2c3731f 100644
--- a/ash/wm/overview/overview_session_unittest.cc
+++ b/ash/wm/overview/overview_session_unittest.cc
@@ -1548,12 +1548,12 @@
   ASSERT_TRUE(label);
 
   // Verify the label matches the window title.
-  EXPECT_EQ(window_title, label->text());
+  EXPECT_EQ(window_title, label->GetText());
 
   // Update the window title and check that the label is updated, too.
   const base::string16 updated_title = base::UTF8ToUTF16("Updated title");
   window->SetTitle(updated_title);
-  EXPECT_EQ(updated_title, label->text());
+  EXPECT_EQ(updated_title, label->GetText());
 
   // Labels are located based on target_bounds, not the actual window item
   // bounds.
diff --git a/ash/wm/window_cycle_list.cc b/ash/wm/window_cycle_list.cc
index de991946d..fc6cccf 100644
--- a/ash/wm/window_cycle_list.cc
+++ b/ash/wm/window_cycle_list.cc
@@ -166,7 +166,7 @@
 
   void GetAccessibleNodeData(ui::AXNodeData* node_data) override {
     node_data->role = ax::mojom::Role::kWindow;
-    node_data->SetName(window_title_->text());
+    node_data->SetName(window_title_->GetText());
   }
 
   // aura::WindowObserver:
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 93e22747..0e8f1433 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -68,7 +68,8 @@
        "Do not enable PI mutexes without consulting the security team")
 
 # Determines whether libevent should be dep.
-dep_libevent = !is_fuchsia && !is_win && !(is_nacl && !is_nacl_nonsfi)
+dep_libevent =
+    !is_fuchsia && !is_win && !is_mac && !(is_nacl && !is_nacl_nonsfi)
 
 # Determines whether message_pump_libevent should be used.
 use_libevent = dep_libevent && !is_ios
diff --git a/base/time/time_fuchsia.cc b/base/time/time_fuchsia.cc
index 7bdd329..29c5f72 100644
--- a/base/time/time_fuchsia.cc
+++ b/base/time/time_fuchsia.cc
@@ -16,7 +16,7 @@
 namespace subtle {
 Time TimeNowIgnoringOverride() {
   zx_time_t nanos_since_unix_epoch;
-  zx_status_t status = zx_clock_get_new(ZX_CLOCK_UTC, &nanos_since_unix_epoch);
+  zx_status_t status = zx_clock_get(ZX_CLOCK_UTC, &nanos_since_unix_epoch);
   ZX_CHECK(status == ZX_OK, status);
   // The following expression will overflow in the year 289938 A.D.:
   return Time::FromZxTime(nanos_since_unix_epoch);
@@ -86,7 +86,7 @@
 ThreadTicks ThreadTicksNowIgnoringOverride() {
   zx_time_t nanos_since_thread_started;
   zx_status_t status =
-      zx_clock_get_new(ZX_CLOCK_THREAD, &nanos_since_thread_started);
+      zx_clock_get(ZX_CLOCK_THREAD, &nanos_since_thread_started);
   ZX_CHECK(status == ZX_OK, status);
   DCHECK(nanos_since_thread_started != 0);
   return ThreadTicks() + TimeDelta::FromNanoseconds(nanos_since_thread_started);
diff --git a/build/android/BUILD.gn b/build/android/BUILD.gn
index 80d017eb..82f41bd 100644
--- a/build/android/BUILD.gn
+++ b/build/android/BUILD.gn
@@ -87,6 +87,7 @@
   ]
   data_deps = [
     ":devil_chromium_py",
+    "//third_party/android_platform:stack_wrapper",
   ]
   if (is_asan) {
     data_deps += [ "//tools/android/asan/third_party:asan_device_setup" ]
diff --git a/build/android/buildhooks/java/org/chromium/build/BuildHooksAndroid.java b/build/android/buildhooks/java/org/chromium/build/BuildHooksAndroid.java
index f6fef20..a42eb5a0 100644
--- a/build/android/buildhooks/java/org/chromium/build/BuildHooksAndroid.java
+++ b/build/android/buildhooks/java/org/chromium/build/BuildHooksAndroid.java
@@ -36,9 +36,11 @@
     // doesn't need to be in the main dex file.
     private static BuildHooksAndroid constructBuildHooksAndroidImpl() {
         try {
-            // Not final to avoid inlining. Without this proguard is able to figure out that
+            // Not final to avoid inlining. Without this R8 is able to figure out that
             // BuildHooksAndroidImpl is actually used.
-            String implClazzName = "org.chromium.build.BuildHooksAndroidImpl";
+            String implClazzName = System.currentTimeMillis() > 0
+                    ? "org.chromium.build.BuildHooksAndroidImpl"
+                    : "";
             Class<?> implClazz = Class.forName(implClazzName);
             return (BuildHooksAndroid) implClazz.newInstance();
         } catch (Exception e) {
@@ -104,4 +106,4 @@
     }
 
     protected abstract void maybeRecordResourceMetricsImpl();
-}
\ No newline at end of file
+}
diff --git a/build/android/gyp/main_dex_list.py b/build/android/gyp/main_dex_list.py
index 2435859..520be39 100755
--- a/build/android/gyp/main_dex_list.py
+++ b/build/android/gyp/main_dex_list.py
@@ -32,8 +32,8 @@
   parser.add_argument('--inputs',
                       help='JARs for which a main dex list should be '
                            'generated.')
-  parser.add_argument('--proguard-path', required=True,
-                      help='Path to the proguard executable.')
+  parser.add_argument(
+      '--r8-path', required=True, help='Path to the r8 executable.')
   parser.add_argument('--negative-main-dex-globs',
       help='GN-list of globs of .class names (e.g. org/chromium/foo/Bar.class) '
            'that will fail the build if they match files in the main dex.')
@@ -55,13 +55,24 @@
         args.negative_main_dex_globs)
 
   proguard_cmd = [
-    'java', '-jar', args.proguard_path,
-    '-forceprocessing',
-    '-dontwarn', '-dontoptimize', '-dontobfuscate', '-dontpreverify',
-    '-libraryjars', args.shrinked_android_path,
+      'java',
+      '-jar',
+      args.r8_path,
+      '--classfile',
+      '--lib',
+      args.shrinked_android_path,
   ]
+
   for m in args.main_dex_rules_paths:
-    proguard_cmd.extend(['-include', m])
+    proguard_cmd.extend(['--pg-conf', m])
+
+  proguard_flags = [
+      '-forceprocessing',
+      '-dontwarn',
+      '-dontoptimize',
+      '-dontobfuscate',
+      '-dontpreverify',
+  ]
 
   main_dex_list_cmd = [
     'java', '-cp', args.dx_path,
@@ -83,17 +94,24 @@
     proguard_cmd,
     main_dex_list_cmd,
   ]
+
   if args.negative_main_dex_globs:
     input_strings += args.negative_main_dex_globs
+    for glob in args.negative_main_dex_globs:
+      # Globs come with 1 asterix, but we want 2 to match subpackages.
+      proguard_flags.append('-checkdiscard class ' +
+                            glob.replace('*', '**').replace('/', '.'))
 
   output_paths = [
     args.main_dex_list_path,
   ]
 
+  def _LineLengthHelperForOnStaleMd5():
+    _OnStaleMd5(proguard_cmd, proguard_flags, main_dex_list_cmd, args.paths,
+                args.main_dex_list_path)
+
   build_utils.CallAndWriteDepfileIfStale(
-      lambda: _OnStaleMd5(proguard_cmd, main_dex_list_cmd, args.paths,
-                          args.main_dex_list_path,
-                          args.negative_main_dex_globs),
+      _LineLengthHelperForOnStaleMd5,
       args,
       input_paths=input_paths,
       input_strings=input_strings,
@@ -104,38 +122,22 @@
   return 0
 
 
-def _CheckForUnwanted(kept_classes, proguard_cmd, negative_main_dex_globs):
-  # Check if ProGuard kept any unwanted classes.
-  found_unwanted_classes = sorted(
-      p for p in kept_classes
-      if build_utils.MatchesGlob(p, negative_main_dex_globs))
-
-  if found_unwanted_classes:
-    first_class = found_unwanted_classes[0].replace(
-        '.class', '').replace('/', '.')
-    proguard_cmd += ['-whyareyoukeeping', 'class', first_class, '{}']
-    output = build_utils.CheckOutput(
-        proguard_cmd, print_stderr=False,
-        stdout_filter=proguard_util.ProguardOutputFilter())
-    raise Exception(
-        ('Found classes that should not be in the main dex:\n    {}\n\n'
-         'Here is the -whyareyoukeeping output for {}: \n{}').format(
-             '\n    '.join(found_unwanted_classes), first_class, output))
-
-
-def _OnStaleMd5(proguard_cmd, main_dex_list_cmd, paths, main_dex_list_path,
-                negative_main_dex_globs):
-  paths_arg = ':'.join(paths)
+def _OnStaleMd5(proguard_cmd, proguard_flags, main_dex_list_cmd, paths,
+                main_dex_list_path):
   main_dex_list = ''
   try:
     with tempfile.NamedTemporaryFile(suffix='.jar') as temp_jar:
       # Step 1: Use ProGuard to find all @MainDex code, and all code reachable
       # from @MainDex code (recursive).
-      proguard_cmd += [
-        '-injars', paths_arg,
-        '-outjars', temp_jar.name
-      ]
-      build_utils.CheckOutput(proguard_cmd, print_stderr=False)
+      proguard_cmd += ['--output', temp_jar.name]
+      with tempfile.NamedTemporaryFile() as proguard_flags_file:
+        for flag in proguard_flags:
+          proguard_flags_file.write(flag + '\n')
+        proguard_flags_file.flush()
+        proguard_cmd += ['--pg-conf', proguard_flags_file.name]
+        for injar in paths:
+          proguard_cmd.append(injar)
+        build_utils.CheckOutput(proguard_cmd, print_stderr=False)
 
       # Record the classes kept by ProGuard. Not used by the build, but useful
       # for debugging what classes are kept by ProGuard vs. MainDexListBuilder.
@@ -144,18 +146,9 @@
       with open(main_dex_list_path + '.partial', 'w') as f:
         f.write('\n'.join(kept_classes) + '\n')
 
-      if negative_main_dex_globs:
-        # Perform assertions before MainDexListBuilder because:
-        # a) MainDexListBuilder is not recursive, so being included by it isn't
-        #    a huge deal.
-        # b) Errors are much more actionable.
-        _CheckForUnwanted(kept_classes, proguard_cmd, negative_main_dex_globs)
-
       # Step 2: Expand inclusion list to all classes referenced by the .class
       # files of kept classes (non-recursive).
-      main_dex_list_cmd += [
-        temp_jar.name, paths_arg
-      ]
+      main_dex_list_cmd += [temp_jar.name, ':'.join(paths)]
       main_dex_list = build_utils.CheckOutput(main_dex_list_cmd)
 
   except build_utils.CalledProcessError as e:
diff --git a/build/android/gyp/proguard.py b/build/android/gyp/proguard.py
index 89135ae..74e0eec 100755
--- a/build/android/gyp/proguard.py
+++ b/build/android/gyp/proguard.py
@@ -278,19 +278,20 @@
         #     method 'int close()' is not being kept as 'a', but remapped to 'c'
         _RemoveMethodMappings(options.apply_mapping, f)
         proguard.mapping(f.name)
+      with build_utils.TempDir() as d:
+        proguard.tmp_dir(d)
+        input_strings = proguard.build()
+        if f.name in input_strings:
+          input_strings[input_strings.index(f.name)] = '$M'
 
-      input_strings = proguard.build()
-      if f.name in input_strings:
-        input_strings[input_strings.index(f.name)] = '$M'
-
-      build_utils.CallAndWriteDepfileIfStale(
-          proguard.CheckOutput,
-          options,
-          input_paths=input_paths,
-          input_strings=input_strings,
-          output_paths=proguard.GetOutputs(),
-          depfile_deps=proguard.GetDepfileDeps(),
-          add_pydeps=False)
+        build_utils.CallAndWriteDepfileIfStale(
+            proguard.CheckOutput,
+            options,
+            input_paths=input_paths,
+            input_strings=input_strings,
+            output_paths=proguard.GetOutputs(),
+            depfile_deps=proguard.GetDepfileDeps(),
+            add_pydeps=False)
 
 
 if __name__ == '__main__':
diff --git a/build/android/gyp/util/manifest_utils.py b/build/android/gyp/util/manifest_utils.py
index 93a367c..e036014 100644
--- a/build/android/gyp/util/manifest_utils.py
+++ b/build/android/gyp/util/manifest_utils.py
@@ -74,11 +74,6 @@
   Will only assert if both the passed value is not None and the value of
   attribute exist.
   """
-  # TODO(crbug.com/891996): Activate once all dependency repos have been
-  # updated.
-  # pylint: disable=unreachable
-  return
-
   uses_sdk_node = manifest_node.find('./uses-sdk')
   if uses_sdk_node is None:
     return
diff --git a/build/android/gyp/util/proguard_util.py b/build/android/gyp/util/proguard_util.py
index c0fba206..2945fdf 100644
--- a/build/android/gyp/util/proguard_util.py
+++ b/build/android/gyp/util/proguard_util.py
@@ -54,6 +54,7 @@
     self._mapping_output = None
     self._verbose = False
     self._min_api = None
+    self._tmp_dir = None
     self._disabled_optimizations = []
 
   def outjar(self, path):
@@ -69,6 +70,10 @@
     assert os.path.exists(path), path
     self._mapping = path
 
+  def tmp_dir(self, path):
+    assert self._tmp_dir is None
+    self._tmp_dir = path
+
   def libraryjars(self, paths):
     assert self._libraries is None
     for p in paths:
@@ -105,16 +110,29 @@
     assert self._injars is not None
     assert self._outjar is not None
     assert self._configs is not None
-    cmd = [
-      'java', '-jar', self._proguard_jar_path,
-      '-forceprocessing',
-    ]
+
+    _combined_injars_path = os.path.join(self._tmp_dir, 'injars.jar')
+    _combined_libjars_path = os.path.join(self._tmp_dir, 'libjars.jar')
+    _combined_proguard_configs_path = os.path.join(self._tmp_dir,
+                                                   'includes.txt')
+
+    build_utils.MergeZips(_combined_injars_path, self._injars)
+    build_utils.MergeZips(_combined_libjars_path, self._libraries)
+    _CombineConfigs(_combined_proguard_configs_path, self.GetConfigs())
+
+    if self._proguard_jar_path.endswith('.jar'):
+      cmd = [
+          'java', '-jar', self._proguard_jar_path, '-include',
+          _combined_proguard_configs_path
+      ]
+    else:
+      cmd = [self._proguard_jar_path, '@' + _combined_proguard_configs_path]
 
     if self._mapping:
       cmd += ['-applymapping', self._mapping]
 
     if self._libraries:
-      cmd += ['-libraryjars', ':'.join(self._libraries)]
+      cmd += ['-libraryjars', _combined_libjars_path]
 
     if self._min_api:
       cmd += [
@@ -126,22 +144,19 @@
     for optimization in self._disabled_optimizations:
       cmd += [ '-optimizations', '!' + optimization ]
 
-    # Filter to just .class files to avoid warnings about multiple inputs having
-    # the same files in META_INF/.
-    cmd += [
-        '-injars',
-        ':'.join('{}(**.class)'.format(x) for x in self._injars)
-    ]
-
-    for config_file in self.GetConfigs():
-      cmd += ['-include', config_file]
-
     # The output jar must be specified after inputs.
     cmd += [
-      '-outjars', self._outjar,
-      '-printseeds', self._outjar + '.seeds',
-      '-printusage', self._outjar + '.usage',
-      '-printmapping', self._mapping_output,
+        '-forceprocessing',
+        '-injars',
+        _combined_injars_path,
+        '-outjars',
+        self._outjar,
+        '-printseeds',
+        self._outjar + '.seeds',
+        '-printusage',
+        self._outjar + '.usage',
+        '-printmapping',
+        self._mapping_output,
     ]
 
     if self._verbose:
@@ -219,6 +234,17 @@
     open(self._outjar + '.mapping', 'a').close()
 
 
+def _CombineConfigs(output_config_path, input_configs):
+  # Combine all input_configs into one config file at output_config_path.
+  output_string = ''
+  for input_config in input_configs:
+    with open(input_config) as f_input_config:
+      output_string += f_input_config.read()
+
+  with open(output_config_path, "w+") as f_output_config:
+    f_output_config.write(output_string)
+
+
 def WriteFlagsFile(configs, out, exclude_generated=False):
   for config in sorted(configs):
     if exclude_generated and config.endswith('.resources.proguard.txt'):
diff --git a/build/android/pylib/dex/OWNERS b/build/android/pylib/dex/OWNERS
new file mode 100644
index 0000000..8333bcf4
--- /dev/null
+++ b/build/android/pylib/dex/OWNERS
@@ -0,0 +1,2 @@
+estevenson@chromium.org
+huangs@chromium.org
\ No newline at end of file
diff --git a/build/android/pylib/dex/dex_parser.py b/build/android/pylib/dex/dex_parser.py
new file mode 100644
index 0000000..bce6a06
--- /dev/null
+++ b/build/android/pylib/dex/dex_parser.py
@@ -0,0 +1,368 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Utilities for optimistically parsing dex files.
+
+This file is not meant to provide a generic tool for analyzing dex files.
+A DexFile class that exposes access to several memory items in the dex format
+is provided, but it does not include error handling or validation.
+"""
+
+from __future__ import print_function
+
+import argparse
+import collections
+import struct
+
+# https://source.android.com/devices/tech/dalvik/dex-format#header-item
+_DEX_HEADER_FMT = (
+    ('magic', '8s'),
+    ('checksum', 'I'),
+    ('signature', '20s'),
+    ('file_size', 'I'),
+    ('header_size', 'I'),
+    ('endian_tag', 'I'),
+    ('link_size', 'I'),
+    ('link_off', 'I'),
+    ('map_off', 'I'),
+    ('string_ids_size', 'I'),
+    ('string_ids_off', 'I'),
+    ('type_ids_size', 'I'),
+    ('type_ids_off', 'I'),
+    ('proto_ids_size', 'I'),
+    ('proto_ids_off', 'I'),
+    ('field_ids_size', 'I'),
+    ('field_ids_off', 'I'),
+    ('method_ids_size', 'I'),
+    ('method_ids_off', 'I'),
+    ('class_defs_size', 'I'),
+    ('class_defs_off', 'I'),
+    ('data_size', 'I'),
+    ('data_off', 'I'),
+)
+
+_DexHeader = collections.namedtuple('DexHeader',
+                                    ','.join(t[0] for t in _DEX_HEADER_FMT))
+
+# Simple memory items.
+_TypeIdItem = collections.namedtuple('TypeIdItem', 'descriptor_idx')
+_ProtoIdItem = collections.namedtuple(
+    'ProtoIdItem', 'shorty_idx,return_type_idx,parameters_off')
+_MethodIdItem = collections.namedtuple('MethodIdItem',
+                                       'type_idx,proto_idx,name_idx')
+_TypeItem = collections.namedtuple('TypeItem', 'type_idx')
+_StringDataItem = collections.namedtuple('StringItem', 'utf16_size,data')
+
+
+class _MemoryItemList(object):
+  """Base class for sections that are composed of repeated memory items."""
+
+  def __init__(self, reader, offset, size, factory, alignment=None):
+    """Creates the item list using the specific item factory.
+
+    Args:
+      reader: _DexReader used for decoding the memory item.
+      offset: Offset from start of the file to the item list.
+      size: Number of memory items in the list.
+      factory: Function to extract each memory item from a _DexReader.
+      alignment: Optional integer specifying the alignment for the memory
+        section represented by this list.
+    """
+    self._offset = offset
+    self._size = size
+    reader.Seek(self._offset)
+    self._items = [factory(reader) for _ in xrange(size)]
+
+    if alignment:
+      reader.AlignUpTo(alignment)
+
+  def __iter__(self):
+    return iter(self._items)
+
+  def __getitem__(self, key):
+    return self._items[key]
+
+  def __len__(self):
+    return len(self._items)
+
+  def __repr__(self):
+    item_type_part = ''
+    if self._size != 0:
+      item_type = type(self._items[0])
+      item_type_part = ', item type={}'.format(item_type.__name__)
+
+    return '{}(offset={:#x}, size={}{})'.format(
+        type(self).__name__, self._offset, self._size, item_type_part)
+
+
+class _TypeIdItemList(_MemoryItemList):
+
+  def __init__(self, reader):
+    offset = reader.header.type_ids_off
+    size = reader.header.type_ids_size
+    factory = lambda x: _TypeIdItem(x.ReadUInt())
+    super(_TypeIdItemList, self).__init__(reader, offset, size, factory)
+
+
+class _ProtoIdItemList(_MemoryItemList):
+
+  def __init__(self, reader):
+    offset = reader.header.proto_ids_off
+    size = reader.header.proto_ids_size
+    factory = lambda x: _ProtoIdItem(x.ReadUInt(), x.ReadUInt(), x.ReadUInt())
+    super(_ProtoIdItemList, self).__init__(reader, offset, size, factory)
+
+
+class _MethodIdItemList(_MemoryItemList):
+
+  def __init__(self, reader):
+    offset = reader.header.method_ids_off
+    size = reader.header.method_ids_size
+    factory = (
+        lambda x: _MethodIdItem(x.ReadUShort(), x.ReadUShort(), x.ReadUInt()))
+    super(_MethodIdItemList, self).__init__(reader, offset, size, factory)
+
+
+class _StringItemList(_MemoryItemList):
+
+  def __init__(self, reader):
+    offset = reader.header.string_ids_off
+    size = reader.header.string_ids_size
+    reader.Seek(offset)
+    string_item_offsets = iter([reader.ReadUInt() for _ in xrange(size)])
+
+    def factory(x):
+      data_offset = next(string_item_offsets)
+      string = x.ReadString(data_offset)
+      return _StringDataItem(len(string), string)
+
+    super(_StringItemList, self).__init__(reader, offset, size, factory)
+
+
+class _TypeListItem(_MemoryItemList):
+
+  def __init__(self, reader):
+    size = reader.ReadUInt()
+    offset = reader.Tell()
+    factory = lambda x: _TypeItem(x.ReadUShort())
+    super(_TypeListItem, self).__init__(
+        reader, offset, size, factory, alignment=4)
+
+
+class _TypeListItemList(_MemoryItemList):
+
+  def __init__(self, reader, offset, size):
+    super(_TypeListItemList, self).__init__(reader, offset, size, _TypeListItem)
+
+
+class _DexMapItem(object):
+
+  def __init__(self, reader):
+    self.type = reader.ReadUShort()
+    reader.ReadUShort()
+    self.size = reader.ReadUInt()
+    self.offset = reader.ReadUInt()
+
+  def __repr__(self):
+    return '_DexMapItem(type={}, size={}, offset={:#x})'.format(
+        self.type, self.size, self.offset)
+
+
+class _DexMapList(object):
+  # Full list of type codes:
+  # https://source.android.com/devices/tech/dalvik/dex-format#type-codes
+  TYPE_TYPE_LIST = 0x1001
+
+  def __init__(self, reader):
+    self._map = {}
+    reader.Seek(reader.header.map_off)
+    self._size = reader.ReadUInt()
+    for _ in xrange(self._size):
+      item = _DexMapItem(reader)
+      self._map[item.type] = item
+
+  def __getitem__(self, key):
+    return self._map[key]
+
+  def __contains__(self, key):
+    return key in self._map
+
+  def __repr__(self):
+    return '_DexMapList(size={}, items={})'.format(self._size, self._map)
+
+
+class _DexReader(object):
+
+  def __init__(self, data):
+    self._data = data
+    self._pos = 0
+    self.header = self._ReadHeader()
+
+  def Seek(self, offset):
+    self._pos = offset
+
+  def Tell(self):
+    return self._pos
+
+  def ReadUByte(self):
+    return self._ReadData('<B')
+
+  def ReadUShort(self):
+    return self._ReadData('<H')
+
+  def ReadUInt(self):
+    return self._ReadData('<I')
+
+  def ReadString(self, data_offset):
+    string_length, string_offset = self._ReadULeb128(data_offset)
+    string_data_offset = string_offset + data_offset
+    return self._DecodeMUtf8(string_length, string_data_offset)
+
+  def AlignUpTo(self, align_unit):
+    off_by = self._pos % align_unit
+    if off_by:
+      self.Seek(self._pos + align_unit - off_by)
+
+  def _ReadHeader(self):
+    header_fmt = '<' + ''.join(t[1] for t in _DEX_HEADER_FMT)
+    return _DexHeader._make(struct.unpack_from(header_fmt, self._data))
+
+  def _ReadData(self, fmt):
+    ret = struct.unpack_from(fmt, self._data, self._pos)[0]
+    self._pos += struct.calcsize(fmt)
+    return ret
+
+  def _ReadULeb128(self, data_offset):
+    """Returns a tuple of (uleb128 value, number of bytes occupied).
+
+    From DWARF3 spec: http://dwarfstd.org/doc/Dwarf3.pdf
+
+    Args:
+      data_offset: Location of the unsigned LEB128.
+    """
+    value = 0
+    shift = 0
+    cur_offset = data_offset
+    while True:
+      byte = self._data[cur_offset]
+      cur_offset += 1
+      value |= (byte & 0b01111111) << shift
+      if (byte & 0b10000000) == 0:
+        break
+      shift += 7
+
+    return value, cur_offset - data_offset
+
+  def _DecodeMUtf8(self, string_length, offset):
+    """Returns the string located at the specified offset.
+
+    See https://source.android.com/devices/tech/dalvik/dex-format#mutf-8
+
+    Ported from the Android Java implementation:
+    https://android.googlesource.com/platform/dalvik/+/fe107fb6e3f308ac5174ebdc5a794ee880c741d9/dx/src/com/android/dex/Mutf8.java#34
+
+    Args:
+      string_length: The length of the decoded string.
+      offset: Offset to the beginning of the string.
+    """
+    self.Seek(offset)
+    ret = ''
+
+    for _ in xrange(string_length):
+      a = self.ReadUByte()
+      if a == 0:
+        raise _MUTf8DecodeError('Early string termination encountered',
+                                string_length, offset)
+      if (a & 0x80) == 0x00:
+        code = a
+      elif (a & 0xe0) == 0xc0:
+        b = self.ReadUByte()
+        if (b & 0xc0) != 0x80:
+          raise _MUTf8DecodeError('Error in byte 2', string_length, offset)
+        code = ((a & 0x1f) << 6) | (b & 0x3f)
+      elif (a & 0xf0) == 0xe0:
+        b = self.ReadUByte()
+        c = self.ReadUByte()
+        if (b & 0xc0) != 0x80 or (c & 0xc0) != 0x80:
+          raise _MUTf8DecodeError('Error in byte 3 or 4', string_length, offset)
+        code = ((a & 0x0f) << 12) | ((b & 0x3f) << 6) | (c & 0x3f)
+      else:
+        raise _MUTf8DecodeError('Bad byte', string_length, offset)
+
+      ret += unichr(code)
+
+    if self.ReadUByte() != 0x00:
+      raise _MUTf8DecodeError('Expected string termination', string_length,
+                              offset)
+
+    return ret
+
+
+class _MUTf8DecodeError(Exception):
+
+  def __init__(self, message, length, offset):
+    message += ' (decoded string length: {}, string data offset: {:#x})'.format(
+        length, offset)
+    super(_MUTf8DecodeError, self).__init__(message)
+
+
+class DexFile(object):
+  """Represents a single dex file.
+
+  Parses and exposes access to dex file structure and contents, as described
+  at https://source.android.com/devices/tech/dalvik/dex-format
+
+  Fields:
+    reader: _DexReader object used to decode dex file contents.
+    map_list: _DexMapList object containing list of dex file contents.
+    type_item_list: _TypeIdItemList containing type_id_items.
+    proto_item_list: _ProtoIdItemList containing proto_id_items.
+    method_item_list: _MethodIdItemList containing method_id_items.
+    string_item_list: _StringItemList containing string_data_items that are
+      referenced by index in other sections.
+    type_list_item_list: _TypeListItemList containing lists of _TypeListItems.
+      _TypeListItems are referenced by their offset.
+  """
+
+  def __init__(self, data):
+    """Decodes dex file memory sections.
+
+    Args:
+      data: bytearray containing the contents of a dex file.
+    """
+    self.reader = _DexReader(data)
+    self.map_list = _DexMapList(self.reader)
+    self.type_item_list = _TypeIdItemList(self.reader)
+    self.proto_item_list = _ProtoIdItemList(self.reader)
+    self.method_item_list = _MethodIdItemList(self.reader)
+    self.string_item_list = _StringItemList(self.reader)
+
+    type_list_key = _DexMapList.TYPE_TYPE_LIST
+    if type_list_key in self.map_list:
+      self.type_list_item_list = _TypeListItemList(
+          self.reader, self.map_list[type_list_key].offset,
+          self.map_list[type_list_key].size)
+    else:
+      self.type_list_item_list = _TypeListItemList(self.reader, 0, 0)
+
+  def __repr__(self):
+    items = [
+        self.reader.header,
+        self.map_list,
+        self.type_item_list,
+        self.proto_item_list,
+        self.method_item_list,
+        self.string_item_list,
+    ]
+    return '\n'.join(str(item) for item in items)
+
+
+if __name__ == '__main__':
+  parser = argparse.ArgumentParser(description='Dump dex contents to stdout.')
+  parser.add_argument('dexfile', help='Input dex file path.')
+  args = parser.parse_args()
+
+  with open(args.dexfile) as f:
+    dexfile = DexFile(bytearray(f.read()))
+    print('{} contents:\n\n{}'.format(args.dexfile, dexfile))
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index d20d4e3..1acd1c43 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -1234,18 +1234,13 @@
           # http://crbug.com/725224. Fix for bots running out of memory.
           pool = "//build/toolchain:link_pool($default_toolchain)"
 
-          if (defined(invoker.proguard_jar_path)) {
-            _proguard_jar_path = invoker.proguard_jar_path
-          } else {
-            _proguard_jar_path = _default_proguard_jar_path
-          }
-
           _shrinked_android = "$android_sdk_build_tools/lib/shrinkedAndroid.jar"
           _dx = "$android_sdk_build_tools/lib/dx.jar"
+          _r8 = "//third_party/r8/lib/r8.jar"
           inputs = [
             _main_dex_rules,
             _dx,
-            _proguard_jar_path,
+            _r8,
             _shrinked_android,
           ]
 
@@ -1264,8 +1259,8 @@
             rebase_path(_main_dex_list_path, root_build_dir),
             "--main-dex-rules-path",
             rebase_path(_main_dex_rules, root_build_dir),
-            "--proguard-path",
-            rebase_path(_proguard_jar_path, root_build_dir),
+            "--r8-path",
+            rebase_path(_r8, root_build_dir),
           ]
 
           if (defined(invoker.extra_main_dex_proguard_config)) {
@@ -1290,11 +1285,11 @@
           if (defined(invoker.input_jar_classpath)) {
             inputs += [ invoker.build_config ]
             args += [ "--inputs=@FileArg(${invoker.input_jar_classpath})" ]
-          }
-
-          inputs += _dexing_jars
-          if (_dexing_jars != []) {
-            args += rebase_path(_dexing_jars, root_build_dir)
+          } else {
+            inputs += _dexing_jars
+            if (_dexing_jars != []) {
+              args += rebase_path(_dexing_jars, root_build_dir)
+            }
           }
         }
       }
diff --git a/build/fuchsia/common_args.py b/build/fuchsia/common_args.py
index 8fda07e..eba0c109 100644
--- a/build/fuchsia/common_args.py
+++ b/build/fuchsia/common_args.py
@@ -55,10 +55,6 @@
   common_args.add_argument('--system-log-file',
                            help='File to write system logs to. Specify - to '
                                 'log to stdout.')
-  common_args.add_argument('--exclude-system-logs',
-                           action='store_false',
-                           dest='include_system_logs',
-                           help='Do not show system log data.')
   common_args.add_argument('--verbose', '-v', default=False,
                            action='store_true',
                            help='Enable debug-level logging.')
@@ -104,7 +100,8 @@
 
   if not args.device:
     # KVM is required on x64 test bots.
-    require_kvm = args.test_launcher_bot_mode and args.target_cpu == "x64"
+    require_kvm = hasattr(args, "test_launcher_bot_mode") and \
+        args.test_launcher_bot_mode and args.target_cpu == "x64"
 
     return QemuTarget(output_dir=args.output_directory,
                       target_cpu=args.target_cpu,
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 1590e7b..fedb761 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-8909692773832732224
\ No newline at end of file
+8909664689247554400
\ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index 10cfb7b..83cc321 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-8909691472659940368
\ No newline at end of file
+8909664693852952128
\ No newline at end of file
diff --git a/build/fuchsia/run_package.py b/build/fuchsia/run_package.py
index 6e3a5d2..51efa6a 100644
--- a/build/fuchsia/run_package.py
+++ b/build/fuchsia/run_package.py
@@ -28,87 +28,6 @@
 _JOIN_TIMEOUT_SECS = 5
 
 
-def _AttachKernelLogReader(target):
-  """Attaches a kernel log reader as a long-running SSH task."""
-
-  logging.info('Attaching kernel logger.')
-  return target.RunCommandPiped(['dlog', '-f'], stdin=open(os.devnull, 'r'),
-                                stdout=subprocess.PIPE)
-
-
-class MergedInputStream(object):
-  """Merges a number of input streams into a UNIX pipe on a dedicated thread.
-  Terminates when the file descriptor of the primary stream (the first in
-  the sequence) is closed."""
-
-  def __init__(self, streams):
-    assert len(streams) > 0
-    self._streams = streams
-    self._output_stream = None
-    self._thread = None
-
-  def Start(self):
-    """Returns a pipe to the merged output stream."""
-
-    read_pipe, write_pipe = os.pipe()
-
-    # Disable buffering for the stream to make sure there is no delay in logs.
-    self._output_stream = os.fdopen(write_pipe, 'w', 0)
-    self._thread = threading.Thread(target=self._Run)
-    self._thread.start();
-
-    return os.fdopen(read_pipe, 'r')
-
-  def _Run(self):
-    streams_by_fd = {}
-    primary_fd = self._streams[0].fileno()
-    for s in self._streams:
-      streams_by_fd[s.fileno()] = s
-
-    # Set when the primary FD is closed. Input from other FDs will continue to
-    # be processed until select() runs dry.
-    flush = False
-
-    # The lifetime of the MergedInputStream is bound to the lifetime of
-    # |primary_fd|.
-    while primary_fd:
-      # When not flushing: block until data is read or an exception occurs.
-      rlist, _, xlist = select.select(streams_by_fd, [], streams_by_fd)
-
-      if len(rlist) == 0 and flush:
-        break
-
-      for fileno in xlist:
-        del streams_by_fd[fileno]
-        if fileno == primary_fd:
-          primary_fd = None
-
-      for fileno in rlist:
-        line = streams_by_fd[fileno].readline()
-        if line:
-          self._output_stream.write(line + '\n')
-        else:
-          del streams_by_fd[fileno]
-          if fileno == primary_fd:
-            primary_fd = None
-
-    # Flush the streams by executing nonblocking reads from the input file
-    # descriptors until no more data is available,  or all the streams are
-    # closed.
-    while streams_by_fd:
-      rlist, _, _ = select.select(streams_by_fd, [], [], 0)
-
-      if not rlist:
-        break
-
-      for fileno in rlist:
-        line = streams_by_fd[fileno].readline()
-        if line:
-          self._output_stream.write(line + '\n')
-        else:
-          del streams_by_fd[fileno]
-
-
 def _GetComponentUri(package_name):
   return 'fuchsia-pkg://fuchsia.com/%s#meta/%s.cmx' % (package_name,
                                                        package_name)
@@ -134,23 +53,10 @@
   def FromCommonArgs(args):
     run_package_args = RunPackageArgs()
     run_package_args.install_only = args.install_only
-    run_package_args.system_logging = args.include_system_logs
     run_package_args.target_staging_path = args.target_staging_path
     return run_package_args
 
 
-def _DrainStreamToStdout(stream, quit_event):
-  """Outputs the contents of |stream| until |quit_event| is set."""
-
-  while not quit_event.is_set():
-    rlist, _, _ = select.select([ stream ], [], [], 0.1)
-    if rlist:
-      line = rlist[0].readline()
-      if not line:
-        return
-      print(line.rstrip())
-
-
 def RunPackage(output_dir, target, package_path, package_name,
                package_deps, package_args, args):
   """Installs the Fuchsia package at |package_path| on the target,
@@ -164,67 +70,36 @@
   args: Structure of arguments to configure how the package will be run.
 
   Returns the exit code of the remote package process."""
+  target.InstallPackage(package_path, package_name, package_deps)
 
-  system_logger = (
-      _AttachKernelLogReader(target) if args.system_logging else None)
-  try:
-    if system_logger:
-      # Spin up a thread to asynchronously dump the system log to stdout
-      # for easier diagnoses of early, pre-execution failures.
-      log_output_quit_event = multiprocessing.Event()
-      log_output_thread = threading.Thread(
-          target=lambda: _DrainStreamToStdout(system_logger.stdout,
-                                              log_output_quit_event))
-      log_output_thread.daemon = True
-      log_output_thread.start()
+  if args.install_only:
+    logging.info('Installation complete.')
+    return
 
-    target.InstallPackage(package_path, package_name, package_deps)
+  logging.info('Running application.')
+  command = ['run', _GetComponentUri(package_name)] + package_args
+  process = target.RunCommandPiped(command,
+                                   stdin=open(os.devnull, 'r'),
+                                   stdout=subprocess.PIPE,
+                                   stderr=subprocess.STDOUT)
 
-    if system_logger:
-      log_output_quit_event.set()
-      log_output_thread.join(timeout=_JOIN_TIMEOUT_SECS)
+  # Run the log data through the symbolizer process.
+  build_ids_paths = map(
+      lambda package_path: os.path.join(
+          os.path.dirname(package_path), 'ids.txt'),
+      [package_path] + package_deps)
+  output_stream = SymbolizerFilter(process.stdout, build_ids_paths)
 
-    if args.install_only:
-      logging.info('Installation complete.')
-      return
+  for next_line in output_stream:
+    print(next_line.rstrip())
 
-    logging.info('Running application.')
-    command = ['run', _GetComponentUri(package_name)] + package_args
-    process = target.RunCommandPiped(command,
-                                     stdin=open(os.devnull, 'r'),
-                                     stdout=subprocess.PIPE,
-                                     stderr=subprocess.STDOUT)
-
-    if system_logger:
-      output_stream = MergedInputStream([process.stdout,
-                                         system_logger.stdout]).Start()
-    else:
-      output_stream = process.stdout
-
-    # Run the log data through the symbolizer process.
-    build_ids_paths = map(
-        lambda package_path: os.path.join(
-            os.path.dirname(package_path), 'ids.txt'),
-        [package_path] + package_deps)
-    output_stream = SymbolizerFilter(output_stream, build_ids_paths)
-
-    for next_line in output_stream:
-      print(next_line.rstrip())
-
-    process.wait()
-    if process.returncode == 0:
-      logging.info('Process exited normally with status code 0.')
-    else:
-      # The test runner returns an error status code if *any* tests fail,
-      # so we should proceed anyway.
-      logging.warning('Process exited with status code %d.' %
-                      process.returncode)
-
-  finally:
-    if system_logger:
-      logging.info('Terminating kernel log reader.')
-      log_output_quit_event.set()
-      log_output_thread.join()
-      system_logger.kill()
+  process.wait()
+  if process.returncode == 0:
+    logging.info('Process exited normally with status code 0.')
+  else:
+    # The test runner returns an error status code if *any* tests fail,
+    # so we should proceed anyway.
+    logging.warning('Process exited with status code %d.' %
+                    process.returncode)
 
   return process.returncode
diff --git a/build/toolchain/win/midl.gni b/build/toolchain/win/midl.gni
index 1fccf15f..41c97c81 100644
--- a/build/toolchain/win/midl.gni
+++ b/build/toolchain/win/midl.gni
@@ -21,6 +21,10 @@
 #   out_dir (optional)
 #       Directory to write the generated files to. Defaults to target_gen_dir.
 #
+#   generated_dir (optional)
+#       Directory where generated files were previously persisted.
+#       Defaults to third_party\win_build_output\midl\|out_dir|.
+#
 #   dynamic_guid (optional)
 #       If the GUID is not constant across builds, the current GUID.
 #
@@ -42,6 +46,14 @@
     out_dir = target_gen_dir
   }
 
+  if (defined(invoker.generated_dir)) {
+    generated_dir = rebase_path(invoker.generated_dir)
+  } else {
+    # midl.py expects 'gen' to be replaced with 'midl'.
+    generated_dir = rebase_path("//third_party/win_build_output") + "/midl/" +
+                    rebase_path(rebase_path(out_dir, root_build_dir), "gen")
+  }
+
   if (defined(invoker.dynamic_guid)) {
     dynamic_guid = invoker.dynamic_guid
   } else {
@@ -99,6 +111,7 @@
 
     args = [
       win_tool_arch,
+      generated_dir,
       rebase_path(out_dir, root_build_dir),
       dynamic_guid,
       type_library_file,
diff --git a/build/toolchain/win/midl.py b/build/toolchain/win/midl.py
index badd287..ab04546 100644
--- a/build/toolchain/win/midl.py
+++ b/build/toolchain/win/midl.py
@@ -153,12 +153,10 @@
   overwrite_cls_guid_tlb(tlb_file, dynamic_guid)
 
 
-def main(arch, outdir, dynamic_guid, tlb, h, dlldata, iid, proxy, idl, *flags):
+def main(arch, gendir, outdir, dynamic_guid, tlb, h, dlldata, iid, proxy, idl,
+         *flags):
   # Copy checked-in outputs to final location.
-  THIS_DIR = os.path.abspath(os.path.dirname(__file__))
-  source = os.path.join(THIS_DIR, '..', '..', '..',
-      'third_party', 'win_build_output',
-      re.sub(r'(^[^/]+/)?gen/', 'midl/', outdir))
+  source = gendir
   if os.path.isdir(os.path.join(source, os.path.basename(idl))):
     source = os.path.join(source, os.path.basename(idl))
   source = os.path.join(source, arch.split('.')[1])  # Append 'x86' or 'x64'.
diff --git a/build/vs_toolchain.py b/build/vs_toolchain.py
index 4225b57..5f221bd 100755
--- a/build/vs_toolchain.py
+++ b/build/vs_toolchain.py
@@ -419,9 +419,10 @@
   to build with."""
   env_version = GetVisualStudioVersion()
   if env_version == '2017':
-    # VS 2017 Update 9 (15.9.12) with 10.0.18362.0 SDK, 10.0.17134 version of
-    # d3dcompiler_47.dll, with ARM64 libraries.
-    toolchain_hash = 'b83892920cc15ef223a1b81cc64d98e1197d3678'
+    # VS 2017 Update 9 (15.9.12) with 10.0.18362 SDK, 10.0.17763 version of
+    # Debuggers, and 10.0.17134 version of d3dcompiler_47.dll, with ARM64
+    # libraries.
+    toolchain_hash = '418b3076791776573a815eb298c8aa590307af63'
     # Third parties that do not have access to the canonical toolchain can map
     # canonical toolchain version to their own toolchain versions.
     toolchain_hash_mapping_key = 'GYP_MSVS_HASH_%s' % toolchain_hash
diff --git a/cc/test/layer_tree_test.h b/cc/test/layer_tree_test.h
index 964c15f..0285b24 100644
--- a/cc/test/layer_tree_test.h
+++ b/cc/test/layer_tree_test.h
@@ -67,8 +67,6 @@
 // thread, but be aware that ending the test is an asynchronous process.
 class LayerTreeTest : public testing::Test, public TestHooks {
  public:
-  // TODO(sgilhuly): Once the pixel tests are working on skia gl, add the option
-  // for skia vulkan.
   enum RendererType {
     RENDERER_GL,
     RENDERER_SKIA_GL,
diff --git a/cc/trees/effect_node.cc b/cc/trees/effect_node.cc
index 8c7a016..ae71f71 100644
--- a/cc/trees/effect_node.cc
+++ b/cc/trees/effect_node.cc
@@ -146,6 +146,9 @@
   value->SetInteger("parent_id", parent_id);
   value->SetInteger("stable_id", stable_id);
   value->SetDouble("opacity", opacity);
+  if (!backdrop_filters.IsEmpty()) {
+    value->SetString("backdrop_filters", backdrop_filters.ToString());
+  }
   value->SetDouble("backdrop_filter_quality", backdrop_filter_quality);
   value->SetBoolean("is_fast_rounded_corner", is_fast_rounded_corner);
   if (!rounded_corner_bounds.IsEmpty()) {
diff --git a/cc/trees/layer_tree_host_pixeltest_blending.cc b/cc/trees/layer_tree_host_pixeltest_blending.cc
index 96fa7cb..14b5db5 100644
--- a/cc/trees/layer_tree_host_pixeltest_blending.cc
+++ b/cc/trees/layer_tree_host_pixeltest_blending.cc
@@ -266,6 +266,15 @@
     {LayerTreeTest::RENDERER_SOFTWARE, SOFTWARE},
     {LayerTreeTest::RENDERER_GL, ZERO_COPY},
     {LayerTreeTest::RENDERER_SKIA_GL, GPU},
+#if defined(ENABLE_CC_VULKAN_TESTS)
+    {LayerTreeTest::RENDERER_SKIA_VK, GPU},
+#endif
+};
+
+std::vector<PixelResourceTestCase> const kTestCasesNonVulkan = {
+    {LayerTreeTest::RENDERER_SOFTWARE, SOFTWARE},
+    {LayerTreeTest::RENDERER_GL, ZERO_COPY},
+    {LayerTreeTest::RENDERER_SKIA_GL, GPU},
 };
 
 INSTANTIATE_TEST_SUITE_P(B,
@@ -273,6 +282,15 @@
                          ::testing::Combine(::testing::ValuesIn(kTestCases),
                                             ::testing::ValuesIn(kBlendModes)));
 
+using LayerTreeHostBlendingPixelTestNonVulkan = LayerTreeHostBlendingPixelTest;
+
+// TODO(crbug.com/963446): Enable these tests for Vulkan.
+INSTANTIATE_TEST_SUITE_P(
+    B,
+    LayerTreeHostBlendingPixelTestNonVulkan,
+    ::testing::Combine(::testing::ValuesIn(kTestCasesNonVulkan),
+                       ::testing::ValuesIn(kBlendModes)));
+
 TEST_P(LayerTreeHostBlendingPixelTest, BlendingWithRoot) {
   const int kRootWidth = 2;
   const int kRootHeight = 2;
@@ -340,7 +358,7 @@
   RunPixelResourceTest(background, expected);
 }
 
-TEST_P(LayerTreeHostBlendingPixelTest, BlendingWithTransparent) {
+TEST_P(LayerTreeHostBlendingPixelTestNonVulkan, BlendingWithTransparent) {
   const int kRootWidth = 2;
   const int kRootHeight = 2;
   InitializeFromTestCase(resource_type());
@@ -375,36 +393,40 @@
   RunPixelResourceTest(root, expected);
 }
 
-TEST_P(LayerTreeHostBlendingPixelTest, BlendingWithRenderPass) {
+TEST_P(LayerTreeHostBlendingPixelTestNonVulkan, BlendingWithRenderPass) {
   RunBlendingWithRenderPass(0);
 }
 
-TEST_P(LayerTreeHostBlendingPixelTest, BlendingWithRenderPassAA) {
+TEST_P(LayerTreeHostBlendingPixelTestNonVulkan, BlendingWithRenderPassAA) {
   RunBlendingWithRenderPass(kUseAntialiasing);
 }
 
-TEST_P(LayerTreeHostBlendingPixelTest, BlendingWithRenderPassColorMatrix) {
+TEST_P(LayerTreeHostBlendingPixelTestNonVulkan,
+       BlendingWithRenderPassColorMatrix) {
   RunBlendingWithRenderPass(kUseColorMatrix);
 }
 
-TEST_P(LayerTreeHostBlendingPixelTest, BlendingWithRenderPassWithMask) {
+TEST_P(LayerTreeHostBlendingPixelTestNonVulkan,
+       BlendingWithRenderPassWithMask) {
   RunBlendingWithRenderPass(kUseMasks);
 }
 
-TEST_P(LayerTreeHostBlendingPixelTest, BlendingWithRenderPassColorMatrixAA) {
+TEST_P(LayerTreeHostBlendingPixelTestNonVulkan,
+       BlendingWithRenderPassColorMatrixAA) {
   RunBlendingWithRenderPass(kUseAntialiasing | kUseColorMatrix);
 }
 
-TEST_P(LayerTreeHostBlendingPixelTest, BlendingWithRenderPassWithMaskAA) {
+TEST_P(LayerTreeHostBlendingPixelTestNonVulkan,
+       BlendingWithRenderPassWithMaskAA) {
   RunBlendingWithRenderPass(kUseMasks | kUseAntialiasing);
 }
 
-TEST_P(LayerTreeHostBlendingPixelTest,
+TEST_P(LayerTreeHostBlendingPixelTestNonVulkan,
        BlendingWithRenderPassWithMaskColorMatrix) {
   RunBlendingWithRenderPass(kUseMasks | kUseColorMatrix);
 }
 
-TEST_P(LayerTreeHostBlendingPixelTest,
+TEST_P(LayerTreeHostBlendingPixelTestNonVulkan,
        BlendingWithRenderPassWithMaskColorMatrixAA) {
   RunBlendingWithRenderPass(kUseMasks | kUseAntialiasing | kUseColorMatrix);
 }
diff --git a/cc/trees/layer_tree_host_pixeltest_filters.cc b/cc/trees/layer_tree_host_pixeltest_filters.cc
index f6b83202..7d673ec 100644
--- a/cc/trees/layer_tree_host_pixeltest_filters.cc
+++ b/cc/trees/layer_tree_host_pixeltest_filters.cc
@@ -76,25 +76,31 @@
   bool layer_transforms_should_scale_layer_contents_ = true;
 };
 
+LayerTreeTest::RendererType const kRendererTypes[] = {
+    LayerTreeTest::RENDERER_GL,
+    LayerTreeTest::RENDERER_SKIA_GL,
+    LayerTreeTest::RENDERER_SOFTWARE,
+#if defined(ENABLE_CC_VULKAN_TESTS)
+    LayerTreeTest::RENDERER_SKIA_VK,
+#endif
+};
+
 INSTANTIATE_TEST_SUITE_P(,
                          LayerTreeHostFiltersPixelTest,
-                         ::testing::Values(LayerTreeTest::RENDERER_GL,
-                                           LayerTreeTest::RENDERER_SKIA_GL,
-                                           LayerTreeTest::RENDERER_SOFTWARE
-#if defined(ENABLE_CC_VULKAN_TESTS)
-                                           ,
-                                           LayerTreeTest::RENDERER_SKIA_VK
-#endif
-                                           ));
+                         ::testing::ValuesIn(kRendererTypes));
 
 using LayerTreeHostFiltersPixelTestNonVulkan = LayerTreeHostFiltersPixelTest;
 
+LayerTreeTest::RendererType const kRendererTypesNonVulkan[] = {
+    LayerTreeTest::RENDERER_GL,
+    LayerTreeTest::RENDERER_SKIA_GL,
+    LayerTreeTest::RENDERER_SOFTWARE,
+};
+
 // TODO(crbug.com/963446): Enable these tests for Vulkan.
 INSTANTIATE_TEST_SUITE_P(,
                          LayerTreeHostFiltersPixelTestNonVulkan,
-                         ::testing::Values(LayerTreeTest::RENDERER_GL,
-                                           LayerTreeTest::RENDERER_SKIA_GL,
-                                           LayerTreeTest::RENDERER_SOFTWARE));
+                         ::testing::ValuesIn(kRendererTypesNonVulkan));
 
 using LayerTreeHostFiltersPixelTestGL = LayerTreeHostFiltersPixelTest;
 
@@ -105,15 +111,17 @@
 
 using LayerTreeHostFiltersPixelTestGPU = LayerTreeHostFiltersPixelTest;
 
+LayerTreeTest::RendererType const kRendererTypesGpu[] = {
+    LayerTreeTest::RENDERER_GL,
+    LayerTreeTest::RENDERER_SKIA_GL,
+#if defined(ENABLE_CC_VULKAN_TESTS)
+    LayerTreeTest::RENDERER_SKIA_VK,
+#endif
+};
+
 INSTANTIATE_TEST_SUITE_P(,
                          LayerTreeHostFiltersPixelTestGPU,
-                         ::testing::Values(LayerTreeTest::RENDERER_GL,
-                                           LayerTreeTest::RENDERER_SKIA_GL
-#if defined(ENABLE_CC_VULKAN_TESTS)
-                                           ,
-                                           LayerTreeTest::RENDERER_SKIA_VK
-#endif
-                                           ));
+                         ::testing::ValuesIn(kRendererTypesGpu));
 
 TEST_P(LayerTreeHostFiltersPixelTestGPU, BackdropFilterBlurRect) {
   scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
@@ -395,14 +403,7 @@
 
 INSTANTIATE_TEST_SUITE_P(,
                          LayerTreeHostFiltersScaledPixelTest,
-                         ::testing::Values(LayerTreeTest::RENDERER_GL,
-                                           LayerTreeTest::RENDERER_SKIA_GL,
-                                           LayerTreeTest::RENDERER_SOFTWARE
-#if defined(ENABLE_CC_VULKAN_TESTS)
-                                           ,
-                                           LayerTreeTest::RENDERER_SKIA_VK
-#endif
-                                           ));
+                         ::testing::ValuesIn(kRendererTypes));
 
 TEST_P(LayerTreeHostFiltersScaledPixelTest, StandardDpi) {
   RunPixelTestType(100, 1.f);
@@ -1113,13 +1114,7 @@
 // when fixed.
 INSTANTIATE_TEST_SUITE_P(,
                          BackdropFilterWithDeviceScaleFactorTest,
-                         ::testing::Values(LayerTreeTest::RENDERER_GL,
-                                           LayerTreeTest::RENDERER_SKIA_GL
-#if defined(ENABLE_CC_VULKAN_TESTS)
-                                           ,
-                                           LayerTreeTest::RENDERER_SKIA_VK
-#endif
-                                           ));
+                         ::testing::ValuesIn(kRendererTypesGpu));
 
 TEST_P(BackdropFilterWithDeviceScaleFactorTest, StandardDpi) {
   RunPixelTestType(
diff --git a/cc/trees/layer_tree_host_pixeltest_masks.cc b/cc/trees/layer_tree_host_pixeltest_masks.cc
index 1fe0b37..1e9f267 100644
--- a/cc/trees/layer_tree_host_pixeltest_masks.cc
+++ b/cc/trees/layer_tree_host_pixeltest_masks.cc
@@ -34,6 +34,7 @@
                         Layer::LayerMaskType::MULTI_TEXTURE_MASK));
 }
 
+// TODO(crbug.com/963446): Enable these tests for Vulkan.
 std::vector<PixelResourceTestCase> const kTestCases = {
     {LayerTreeTest::RENDERER_SOFTWARE, SOFTWARE},
     {LayerTreeTest::RENDERER_GL, GPU},
diff --git a/cc/trees/layer_tree_host_pixeltest_synchronous.cc b/cc/trees/layer_tree_host_pixeltest_synchronous.cc
index fd1c4cd..708eefa 100644
--- a/cc/trees/layer_tree_host_pixeltest_synchronous.cc
+++ b/cc/trees/layer_tree_host_pixeltest_synchronous.cc
@@ -54,15 +54,17 @@
   bool use_zero_copy_ = false;
 };
 
+LayerTreeTest::RendererType const kRendererTypesGpu[] = {
+    LayerTreeTest::RENDERER_GL,
+    LayerTreeTest::RENDERER_SKIA_GL,
+#if defined(ENABLE_CC_VULKAN_TESTS)
+    LayerTreeTest::RENDERER_SKIA_VK,
+#endif
+};
+
 INSTANTIATE_TEST_SUITE_P(,
                          LayerTreeHostSynchronousPixelTest,
-                         ::testing::Values(LayerTreeTest::RENDERER_GL,
-                                           LayerTreeTest::RENDERER_SKIA_GL
-#if defined(ENABLE_CC_VULKAN_TESTS)
-                                           ,
-                                           LayerTreeTest::RENDERER_SKIA_VK
-#endif
-                                           ));
+                         ::testing::ValuesIn(kRendererTypesGpu));
 
 TEST_P(LayerTreeHostSynchronousPixelTest, OneContentLayerZeroCopy) {
   use_zero_copy_ = true;
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn
index 55537c0..3f492a6 100644
--- a/chrome/BUILD.gn
+++ b/chrome/BUILD.gn
@@ -1487,7 +1487,7 @@
     }
   }
 
-  if (enable_gwp_asan_malloc || enable_gwp_asan_partitionalloc) {
+  if (enable_gwp_asan) {
     public_deps += [ "//components/gwp_asan/client" ]
   }
 
@@ -1532,7 +1532,7 @@
     public_deps += [ "//components/nacl/renderer/plugin:nacl_trusted_plugin" ]
   }
 
-  if (enable_gwp_asan_malloc || enable_gwp_asan_partitionalloc) {
+  if (enable_gwp_asan) {
     public_deps += [ "//components/gwp_asan/client" ]
   }
 
@@ -1886,7 +1886,7 @@
       deps += [ "//third_party/gvr-android-sdk:gvr_shim" ]
     }
 
-    if (enable_gwp_asan_malloc || enable_gwp_asan_partitionalloc) {
+    if (enable_gwp_asan) {
       deps += [ "//components/gwp_asan/client" ]
     }
   }
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index 9553d64..1049e9e 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -37,8 +37,10 @@
   "java/src/org/chromium/chrome/browser/DefaultBrowserInfo.java",
   "java/src/org/chromium/chrome/browser/DeferredStartupHandler.java",
   "java/src/org/chromium/chrome/browser/DelayedScreenLockIntentHandler.java",
-  "java/src/org/chromium/chrome/browser/DeviceConditions.java",
   "java/src/org/chromium/chrome/browser/DevToolsServer.java",
+  "java/src/org/chromium/chrome/browser/DeviceConditions.java",
+  "java/src/org/chromium/chrome/browser/DeviceItemAdapter.java",
+  "java/src/org/chromium/chrome/browser/DeviceItemRow.java",
   "java/src/org/chromium/chrome/browser/FileProviderHelper.java",
   "java/src/org/chromium/chrome/browser/GlobalDiscardableReferencePool.java",
   "java/src/org/chromium/chrome/browser/InsetObserverView.java",
diff --git a/chrome/android/features/tab_ui/java/res/layout/tab_grid_dialog_layout.xml b/chrome/android/features/tab_ui/java/res/layout/tab_grid_dialog_layout.xml
index 7e27743..a4fe14f27 100644
--- a/chrome/android/features/tab_ui/java/res/layout/tab_grid_dialog_layout.xml
+++ b/chrome/android/features/tab_ui/java/res/layout/tab_grid_dialog_layout.xml
@@ -8,7 +8,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:id="@+id/dialog_container_view"
-    android:background="@color/modern_primary_color">
+    android:background="@drawable/tab_grid_card_background">
     <TextView
         android:layout_width="match_parent"
         android:layout_height="@dimen/bottom_sheet_peek_height"
diff --git a/chrome/android/features/tab_ui/java/res/values/dimens.xml b/chrome/android/features/tab_ui/java/res/values/dimens.xml
index 57d14d416..d56bbcb 100644
--- a/chrome/android/features/tab_ui/java/res/values/dimens.xml
+++ b/chrome/android/features/tab_ui/java/res/values/dimens.xml
@@ -20,6 +20,8 @@
     <dimen name="tab_grid_thumbnail_favicon_background_radius">3dp</dimen>
     <dimen name="tab_grid_thumbnail_favicon_background_padding">2dp</dimen>
     <dimen name="tab_grid_thumbnail_favicon_background_down_shift">2dp</dimen>
+    <dimen name="tab_group_toolbar_height">48dp</dimen>
+    <dimen name="tab_group_toolbar_topic_margin">8dp</dimen>
     <dimen name="swipe_to_dismiss_threshold">72dp</dimen>
     <dimen name="selection_tab_grid_toggle_button_inset">12dp</dimen>
 </resources>
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogParent.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogParent.java
index 5efa703..8e9e67ad 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogParent.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogParent.java
@@ -82,7 +82,7 @@
         mStatusBarHeight = context.getResources().getDimensionPixelSize(statusBarHeightResourceId);
         mTabGridCardPadding = context.getResources().getDimension(R.dimen.tab_list_card_padding);
         mToolbarHeight =
-                (int) context.getResources().getDimension(R.dimen.bottom_sheet_peek_height);
+                (int) context.getResources().getDimension(R.dimen.tab_group_toolbar_height);
         mContainerParams = new FrameLayout.LayoutParams(
                 ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
         mComponentCallbacks = new ComponentCallbacks() {
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridSheetToolbarCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridSheetToolbarCoordinator.java
index f94ebb32..968fe25 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridSheetToolbarCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridSheetToolbarCoordinator.java
@@ -40,6 +40,9 @@
             PropertyModel toolbarPropertyModel, TabGridDialogParent dialog) {
         mToolbarView = (TabGroupUiToolbarView) LayoutInflater.from(context).inflate(
                 R.layout.bottom_tab_grid_toolbar, contentView, false);
+        if (dialog != null) {
+            mToolbarView.setupDialogToolbarLayout();
+        }
         mModelChangeProcessor = PropertyModelChangeProcessor.create(toolbarPropertyModel,
                 new TabGridSheetViewBinder.ViewHolder(mToolbarView, contentView, dialog),
                 TabGridSheetViewBinder::bind);
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiToolbarView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiToolbarView.java
index 78f9939..d626a23e 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiToolbarView.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiToolbarView.java
@@ -6,7 +6,10 @@
 
 import android.content.Context;
 import android.content.res.ColorStateList;
+import android.support.v4.widget.TextViewCompat;
+import android.support.v7.content.res.AppCompatResources;
 import android.util.AttributeSet;
+import android.view.Gravity;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.FrameLayout;
@@ -50,10 +53,6 @@
         mRightButton.setOnClickListener(listener);
     }
 
-    void setTitleOnClickListener(OnClickListener listener) {
-        mTitleTextView.setOnClickListener(listener);
-    }
-
     ViewGroup getViewContainer() {
         return mContainerView;
     }
@@ -84,4 +83,20 @@
         ApiCompatibilityUtils.setImageTintList(mRightButton, tint);
         if (mTitleTextView != null) mTitleTextView.setTextColor(tint);
     }
+
+    /**
+     * Setup a TabGridDialog-specific toolbar. It is different from the toolbar for TabGridSheet.
+     */
+    void setupDialogToolbarLayout() {
+        Context context = getContext();
+        setBackground(AppCompatResources.getDrawable(context, R.drawable.tab_grid_card_background));
+        mLeftButton.setImageResource(org.chromium.chrome.R.drawable.ic_arrow_back_24dp);
+        int topicMargin =
+                (int) context.getResources().getDimension(R.dimen.tab_group_toolbar_topic_margin);
+        MarginLayoutParams params = (MarginLayoutParams) mTitleTextView.getLayoutParams();
+        params.setMarginStart(topicMargin);
+        mTitleTextView.setGravity(Gravity.START);
+        TextViewCompat.setTextAppearance(
+                mTitleTextView, org.chromium.chrome.R.style.TextAppearance_BlackHeadline);
+    }
 }
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallbackUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallbackUnitTest.java
new file mode 100644
index 0000000..1ef7f033
--- /dev/null
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallbackUnitTest.java
@@ -0,0 +1,668 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.tasks.tab_management;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.graphics.Canvas;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.helper.ItemTouchHelper;
+import android.view.View;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.base.metrics.RecordUserAction;
+import org.chromium.chrome.browser.ChromeFeatureList;
+import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.tabmodel.EmptyTabModelFilter;
+import org.chromium.chrome.browser.tabmodel.TabModel;
+import org.chromium.chrome.browser.tabmodel.TabModelFilterProvider;
+import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl;
+import org.chromium.chrome.browser.tasks.tabgroup.TabGroupModelFilter;
+import org.chromium.chrome.browser.util.FeatureUtilities;
+import org.chromium.chrome.test.util.browser.Features;
+import org.chromium.testing.local.LocalRobolectricTestRunner;
+import org.chromium.ui.modelutil.PropertyKey;
+import org.chromium.ui.modelutil.PropertyModel;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Tests for {@link TabGridItemTouchHelperCallback}.
+ */
+@RunWith(LocalRobolectricTestRunner.class)
+@Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID,
+        ChromeFeatureList.TAB_GROUPS_UI_IMPROVEMENTS_ANDROID})
+@Config(manifest = Config.NONE)
+public class TabGridItemTouchHelperCallbackUnitTest {
+    @Rule
+    public TestRule mProcessor = new Features.JUnitProcessor();
+
+    private static final String TAB1_TITLE = "Tab1";
+    private static final String TAB2_TITLE = "Tab2";
+    private static final String TAB3_TITLE = "Tab3";
+    private static final String TAB4_TITLE = "Tab4";
+    private static final int TAB1_ID = 456;
+    private static final int TAB2_ID = 789;
+    private static final int TAB3_ID = 123;
+    private static final int TAB4_ID = 357;
+    private static final int POSITION1 = 0;
+    private static final int POSITION2 = 1;
+    private static final int POSITION3 = 2;
+    private static final int POSITION4 = 3;
+    private static final float THRESHOLD = 2f;
+
+    @Mock
+    Canvas mCanvas;
+    @Mock
+    RecyclerView mRecyclerView;
+    @Mock
+    RecyclerView.Adapter mAdapter;
+    @Mock
+    TabModel mTabModel;
+    @Mock
+    TabModelSelectorImpl mTabModelSelector;
+    @Mock
+    TabModelFilterProvider mTabModelFilterProvider;
+    @Mock
+    TabListMediator.TabActionListener mTabClosedListener;
+    @Mock
+    TabGroupModelFilter mTabGroupModelFilter;
+    @Mock
+    EmptyTabModelFilter mEmptyTabModelFilter;
+    @Mock
+    TabListMediator.TabGridDialogHandler mTabGridDialogHandler;
+
+    private Tab mTab1;
+    private Tab mTab2;
+    private Tab mTab3;
+    private Tab mTab4;
+    private TabGridViewHolder mMockViewHolder1;
+    private TabGridViewHolder mMockViewHolder2;
+    private RecyclerView.ViewHolder mDummyViewHolder1;
+    private RecyclerView.ViewHolder mDummyViewHolder2;
+    private RecyclerView.ViewHolder mDummyViewHolder3;
+    private RecyclerView.ViewHolder mDummyViewHolder4;
+    private View mItemView1;
+    private View mItemView2;
+    private View mItemView3;
+    private View mItemView4;
+    private TabGridItemTouchHelperCallback mItemTouchHelperCallback;
+    private TabListModel mModel;
+
+    @Before
+    public void setUp() {
+        RecordUserAction.setDisabledForTests(true);
+        RecordHistogram.setDisabledForTests(true);
+
+        MockitoAnnotations.initMocks(this);
+
+        mTab1 = prepareTab(TAB1_ID, TAB1_TITLE);
+        mTab2 = prepareTab(TAB2_ID, TAB2_TITLE);
+        mTab3 = prepareTab(TAB3_ID, TAB3_TITLE);
+        mTab4 = prepareTab(TAB4_ID, TAB4_TITLE);
+        mMockViewHolder1 = prepareMockViewHolder(TAB1_ID, POSITION1);
+        mMockViewHolder2 = prepareMockViewHolder(TAB2_ID, POSITION2);
+        // Mock four cards in a grid layout. Each card is of width 4 and height 4. Both the side
+        // gaps and top gaps between adjacent cards are 1.
+        mItemView1 = prepareItemView(0, 0, 4, 4);
+        mItemView2 = prepareItemView(5, 0, 9, 4);
+        mItemView3 = prepareItemView(0, 5, 4, 9);
+        mItemView4 = prepareItemView(5, 5, 9, 9);
+        mDummyViewHolder1 = prepareDummyViewHolder(mItemView1);
+        mDummyViewHolder2 = prepareDummyViewHolder(mItemView2);
+        mDummyViewHolder3 = prepareDummyViewHolder(mItemView3);
+        mDummyViewHolder4 = prepareDummyViewHolder(mItemView4);
+
+        List<TabModel> tabModelList = new ArrayList<>();
+        tabModelList.add(mTabModel);
+        doReturn(mTabModel).when(mTabModelSelector).getCurrentModel();
+        doReturn(tabModelList).when(mTabModelSelector).getModels();
+        doReturn(mTabModelFilterProvider).when(mTabModelSelector).getTabModelFilterProvider();
+        doReturn(mTabGroupModelFilter).when(mTabModelFilterProvider).getCurrentTabModelFilter();
+        doReturn(mTab1).when(mTabModel).getTabAt(POSITION1);
+        doReturn(mTab2).when(mTabModel).getTabAt(POSITION2);
+        doReturn(mTab3).when(mTabModel).getTabAt(POSITION3);
+        doReturn(mTab4).when(mTabModel).getTabAt(POSITION4);
+        doReturn(4).when(mTabModel).getCount();
+        doReturn(mTab1).when(mTabGroupModelFilter).getTabAt(POSITION1);
+        doReturn(mTab2).when(mTabGroupModelFilter).getTabAt(POSITION2);
+        doReturn(mTab3).when(mTabGroupModelFilter).getTabAt(POSITION3);
+        doReturn(mTab4).when(mTabGroupModelFilter).getTabAt(POSITION4);
+        FeatureUtilities.setTabGroupsAndroidEnabledForTesting(true);
+        setupRecyclerView();
+
+        mModel = new TabListModel();
+        setupItemTouchHelperCallback(false);
+    }
+
+    private void setupRecyclerView() {
+        doReturn(mAdapter).when(mRecyclerView).getAdapter();
+        doReturn(12).when(mRecyclerView).getBottom();
+        doReturn(4).when(mRecyclerView).getChildCount();
+        doReturn(4).when(mAdapter).getItemCount();
+        when(mRecyclerView.getChildAt(POSITION1)).thenReturn(mItemView1);
+        when(mRecyclerView.getChildAt(POSITION2)).thenReturn(mItemView2);
+        when(mRecyclerView.getChildAt(POSITION3)).thenReturn(mItemView3);
+        when(mRecyclerView.getChildAt(POSITION4)).thenReturn(mItemView4);
+    }
+
+    private void setupItemTouchHelperCallback(boolean isDialog) {
+        mItemTouchHelperCallback = new TabGridItemTouchHelperCallback(mModel, mTabModelSelector,
+                mTabClosedListener, isDialog ? mTabGridDialogHandler : null, "", !isDialog);
+        mItemTouchHelperCallback.setupCallback(THRESHOLD, THRESHOLD, THRESHOLD);
+        mItemTouchHelperCallback.getMovementFlags(mRecyclerView, mMockViewHolder1);
+    }
+
+    @After
+    public void tearDown() {
+        RecordUserAction.setDisabledForTests(false);
+        RecordHistogram.setDisabledForTests(false);
+    }
+
+    @Test
+    public void initializesWithCurrentTabs() {
+        initAndAssertAllProperties();
+    }
+
+    @Test
+    public void onStartDraggingTab() {
+        initAndAssertAllProperties();
+
+        assertThat(mModel.get(0).get(TabProperties.CARD_ANIMATION_STATUS),
+                equalTo(TabListRecyclerView.AnimationStatus.CARD_RESTORE));
+        assertThat(mModel.get(0).get(TabProperties.ALPHA), equalTo(1f));
+
+        mItemTouchHelperCallback.onSelectedChanged(
+                mMockViewHolder1, ItemTouchHelper.ACTION_STATE_DRAG);
+
+        assertThat(mModel.get(0).get(TabProperties.CARD_ANIMATION_STATUS),
+                equalTo(TabListRecyclerView.AnimationStatus.SELECTED_CARD_ZOOM_IN));
+        assertThat(mModel.get(0).get(TabProperties.ALPHA), equalTo(0.8f));
+    }
+
+    @Test
+    public void onSwipeTab_DELETE() {
+        initAndAssertAllProperties();
+
+        mItemTouchHelperCallback.onSwiped(mMockViewHolder1, POSITION1);
+
+        verify(mTabClosedListener).run(TAB1_ID);
+    }
+
+    @Test
+    public void onReleaseTab_NO_MERGE() {
+        initAndAssertAllProperties();
+
+        // Simulate the selection of card#1 in TabListModel.
+        mModel.get(0).set(TabProperties.CARD_ANIMATION_STATUS,
+                TabListRecyclerView.AnimationStatus.SELECTED_CARD_ZOOM_IN);
+        mModel.get(0).set(TabProperties.ALPHA, 0.8f);
+        mItemTouchHelperCallback.setSelectedTabIndexForTest(POSITION1);
+
+        mItemTouchHelperCallback.onSelectedChanged(
+                mMockViewHolder1, ItemTouchHelper.ACTION_STATE_IDLE);
+
+        assertThat(mModel.get(0).get(TabProperties.CARD_ANIMATION_STATUS),
+                equalTo(TabListRecyclerView.AnimationStatus.SELECTED_CARD_ZOOM_OUT));
+        assertThat(mModel.get(0).get(TabProperties.ALPHA), equalTo(1f));
+        assertThat(mModel.get(1).get(TabProperties.CARD_ANIMATION_STATUS),
+                equalTo(TabListRecyclerView.AnimationStatus.CARD_RESTORE));
+        assertThat(mModel.get(1).get(TabProperties.ALPHA), equalTo(1f));
+    }
+
+    @Test
+    public void onReleaseTab_MERGE_BACKWARD() {
+        initAndAssertAllProperties();
+
+        // Simulate the selection of card#1 in TabListModel.
+        mModel.get(0).set(TabProperties.CARD_ANIMATION_STATUS,
+                TabListRecyclerView.AnimationStatus.SELECTED_CARD_ZOOM_IN);
+        mModel.get(0).set(TabProperties.ALPHA, 0.8f);
+        mItemTouchHelperCallback.setSelectedTabIndexForTest(POSITION1);
+
+        // Simulate hovering on card#2.
+        mItemTouchHelperCallback.setHoveredTabIndexForTest(POSITION2);
+
+        mItemTouchHelperCallback.onSelectedChanged(
+                mMockViewHolder1, ItemTouchHelper.ACTION_STATE_IDLE);
+
+        verify(mTabGroupModelFilter).mergeTabsToGroup(TAB1_ID, TAB2_ID);
+        assertThat(mModel.get(0).get(TabProperties.CARD_ANIMATION_STATUS),
+                equalTo(TabListRecyclerView.AnimationStatus.HOVERED_CARD_ZOOM_OUT));
+        assertThat(mModel.get(0).get(TabProperties.ALPHA), equalTo(1f));
+    }
+
+    @Test
+    public void onReleaseTab_MERGE_FORWARD() {
+        initAndAssertAllProperties();
+
+        // Simulate the selection of card#2 in TabListModel.
+        mModel.get(1).set(TabProperties.CARD_ANIMATION_STATUS,
+                TabListRecyclerView.AnimationStatus.SELECTED_CARD_ZOOM_IN);
+        mModel.get(1).set(TabProperties.ALPHA, 0.8f);
+        mItemTouchHelperCallback.setSelectedTabIndexForTest(POSITION2);
+
+        // Simulate hovering on card#1.
+        mItemTouchHelperCallback.setHoveredTabIndexForTest(POSITION1);
+
+        mItemTouchHelperCallback.onSelectedChanged(
+                mMockViewHolder2, ItemTouchHelper.ACTION_STATE_IDLE);
+
+        verify(mTabGroupModelFilter).mergeTabsToGroup(TAB2_ID, TAB1_ID);
+        assertThat(mModel.get(1).get(TabProperties.CARD_ANIMATION_STATUS),
+                equalTo(TabListRecyclerView.AnimationStatus.SELECTED_CARD_ZOOM_OUT));
+        assertThat(mModel.get(1).get(TabProperties.ALPHA), equalTo(1f));
+    }
+
+    @Test
+    @Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID,
+            ChromeFeatureList.TAB_GROUPS_UI_IMPROVEMENTS_ANDROID})
+    public void onReleaseTab_MERGE_BACKWARD_WITHOUT_GROUP() {
+        initAndAssertAllProperties();
+        doReturn(mEmptyTabModelFilter).when(mTabModelFilterProvider).getCurrentTabModelFilter();
+
+        // Simulate the selection of card#1 in TabListModel.
+        mModel.get(0).set(TabProperties.CARD_ANIMATION_STATUS,
+                TabListRecyclerView.AnimationStatus.SELECTED_CARD_ZOOM_IN);
+        mModel.get(0).set(TabProperties.ALPHA, 0.8f);
+        mItemTouchHelperCallback.setSelectedTabIndexForTest(POSITION1);
+
+        // Simulate hovering on card#2.
+        mItemTouchHelperCallback.setHoveredTabIndexForTest(POSITION2);
+
+        mItemTouchHelperCallback.onSelectedChanged(
+                mMockViewHolder1, ItemTouchHelper.ACTION_STATE_IDLE);
+
+        assertThat(mModel.get(0).get(TabProperties.CARD_ANIMATION_STATUS),
+                equalTo(TabListRecyclerView.AnimationStatus.SELECTED_CARD_ZOOM_OUT));
+        assertThat(mModel.get(0).get(TabProperties.ALPHA), equalTo(1f));
+        // Merge signal should never be sent.
+        verify(mTabGroupModelFilter, never()).mergeTabsToGroup(anyInt(), anyInt());
+    }
+
+    @Test
+    @Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID,
+            ChromeFeatureList.TAB_GROUPS_UI_IMPROVEMENTS_ANDROID})
+    public void onReleaseTab_MERGE_FORWARD_WITHOUT_GROUP() {
+        initAndAssertAllProperties();
+        doReturn(mEmptyTabModelFilter).when(mTabModelFilterProvider).getCurrentTabModelFilter();
+
+        // Simulate the selection of card#2 in TabListModel.
+        mModel.get(1).set(TabProperties.CARD_ANIMATION_STATUS,
+                TabListRecyclerView.AnimationStatus.SELECTED_CARD_ZOOM_IN);
+        mModel.get(1).set(TabProperties.ALPHA, 0.8f);
+        mItemTouchHelperCallback.setSelectedTabIndexForTest(POSITION2);
+
+        // Simulate hovering on card#1.
+        mItemTouchHelperCallback.setHoveredTabIndexForTest(POSITION1);
+
+        mItemTouchHelperCallback.onSelectedChanged(
+                mMockViewHolder2, ItemTouchHelper.ACTION_STATE_IDLE);
+
+        assertThat(mModel.get(1).get(TabProperties.CARD_ANIMATION_STATUS),
+                equalTo(TabListRecyclerView.AnimationStatus.SELECTED_CARD_ZOOM_OUT));
+        assertThat(mModel.get(1).get(TabProperties.ALPHA), equalTo(1f));
+        // Merge signal should never be sent.
+        verify(mTabGroupModelFilter, never()).mergeTabsToGroup(anyInt(), anyInt());
+    }
+
+    @Test
+    public void onReleaseTab_UNGROUP_BAR_HIDE() {
+        initAndAssertAllProperties();
+        setupItemTouchHelperCallback(true);
+
+        mItemTouchHelperCallback.onSelectedChanged(
+                mMockViewHolder1, ItemTouchHelper.ACTION_STATE_IDLE);
+
+        verify(mTabGridDialogHandler)
+                .updateUngroupBarStatus(TabGridDialogParent.UngroupBarStatus.HIDE);
+    }
+
+    @Test
+    public void onReleaseTab_UNGROUP() {
+        initAndAssertAllProperties();
+
+        setupItemTouchHelperCallback(true);
+        mItemTouchHelperCallback.setUnGroupTabIndexForTest(POSITION1);
+
+        mItemTouchHelperCallback.onSelectedChanged(
+                mMockViewHolder1, ItemTouchHelper.ACTION_STATE_IDLE);
+
+        verify(mTabGroupModelFilter).moveTabOutOfGroup(TAB1_ID);
+        verify(mTabGridDialogHandler)
+                .updateUngroupBarStatus(TabGridDialogParent.UngroupBarStatus.HIDE);
+    }
+
+    @Test
+    public void onDragTab_HOVERED_GTS_HORIZONTAL() {
+        initAndAssertAllProperties();
+
+        // Drag card#1 rightwards to hover on card#2.
+        verifyDrag(mDummyViewHolder1, 5, 0, POSITION2,
+                TabListRecyclerView.AnimationStatus.HOVERED_CARD_ZOOM_IN);
+        // Drag card#2 leftwards to hover on card#1.
+        verifyDrag(mDummyViewHolder2, -5, 0, POSITION1,
+                TabListRecyclerView.AnimationStatus.HOVERED_CARD_ZOOM_IN);
+    }
+
+    @Test
+    public void onDragTab_HOVERED_GTS_VERTICAL() {
+        initAndAssertAllProperties();
+
+        // Drag card#1 downwards to hover on card#3.
+        verifyDrag(mDummyViewHolder1, 0, 5, POSITION3,
+                TabListRecyclerView.AnimationStatus.HOVERED_CARD_ZOOM_IN);
+        // Drag card#3 upwards to hover on card#1.
+        verifyDrag(mDummyViewHolder3, 0, -5, POSITION1,
+                TabListRecyclerView.AnimationStatus.HOVERED_CARD_ZOOM_IN);
+    }
+
+    @Test
+    public void onDragTab_HOVERED_GTS_DIAGONAL() {
+        initAndAssertAllProperties();
+
+        // Drag card#1 diagonally to hover on card#4.
+        verifyDrag(mDummyViewHolder1, 5, 5, POSITION4,
+                TabListRecyclerView.AnimationStatus.HOVERED_CARD_ZOOM_IN);
+        // Drag card#4 diagonally to hover on card#1.
+        verifyDrag(mDummyViewHolder4, -5, -5, POSITION1,
+                TabListRecyclerView.AnimationStatus.HOVERED_CARD_ZOOM_IN);
+        // Drag card#2 diagonally to hover on card#3.
+        verifyDrag(mDummyViewHolder2, -5, 5, POSITION3,
+                TabListRecyclerView.AnimationStatus.HOVERED_CARD_ZOOM_IN);
+        // Drag card#3 diagonally to hover on card#2.
+        verifyDrag(mDummyViewHolder3, 5, -5, POSITION2,
+                TabListRecyclerView.AnimationStatus.HOVERED_CARD_ZOOM_IN);
+    }
+
+    @Test
+    public void onDragTab_NOT_HOVERED_GTS_HORIZONTAL() {
+        initAndAssertAllProperties();
+
+        // With merge threshold equal to 2, any horizontal drag with |dX| <= (5 - threshold) should
+        // never trigger hovering.
+        verifyDrag(mDummyViewHolder1, 3, 0, POSITION2,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+        verifyDrag(mDummyViewHolder2, -3, 0, POSITION1,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+        // With merge threshold equal to 2, any horizontal drag with |dX| >= (5 + threshold) should
+        // never trigger hovering.
+        verifyDrag(mDummyViewHolder1, 7, 0, POSITION2,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+        verifyDrag(mDummyViewHolder2, -7, 0, POSITION1,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+    }
+
+    @Test
+    public void onDragTab_NOT_HOVERED_GTS_VERTICAL() {
+        initAndAssertAllProperties();
+
+        // With merge threshold equal to 2, any vertical drag with |dY| <= (5 - threshold) should
+        // never trigger hovering.
+        verifyDrag(mDummyViewHolder1, 0, 3, POSITION3,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+        verifyDrag(mDummyViewHolder3, 0, -3, POSITION1,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+        // With merge threshold equal to 2, any vertical drag with |dY| >= (5 + threshold) should
+        // never trigger hovering.
+        verifyDrag(mDummyViewHolder1, 0, 7, POSITION3,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+        verifyDrag(mDummyViewHolder3, 0, -7, POSITION1,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+    }
+
+    @Test
+    public void onDragTab_NOT_HOVERED_GTS_DIAGONAL() {
+        initAndAssertAllProperties();
+
+        // With merge threshold equal to 2, any diagonal drag with |dX| <= (5 - threshold) or |dY|
+        // <= (5 - threshold) should never trigger hovering.
+        verifyDrag(mDummyViewHolder1, 3, 4, POSITION4,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+        verifyDrag(mDummyViewHolder1, 4, 3, POSITION4,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+        verifyDrag(mDummyViewHolder4, -4, -3, POSITION1,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+        verifyDrag(mDummyViewHolder4, -3, -4, POSITION1,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+        // With merge threshold equal to 2, any vertical drag with |dX| >= (5 + threshold) or |dY|
+        // >= (5 + threshold) should never trigger hovering.
+        verifyDrag(mDummyViewHolder1, 7, 6, POSITION4,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+        verifyDrag(mDummyViewHolder1, 6, 7, POSITION4,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+        verifyDrag(mDummyViewHolder4, -6, -7, POSITION1,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+        verifyDrag(mDummyViewHolder4, -7, -6, POSITION1,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+    }
+
+    @Test
+    public void onDragTab_Restore_Hovered_GTS() {
+        initAndAssertAllProperties();
+
+        // Simulate the process of hovering card#1 on card#2.
+        verifyDrag(mDummyViewHolder1, 5, 0, POSITION2,
+                TabListRecyclerView.AnimationStatus.HOVERED_CARD_ZOOM_IN);
+        // Continue to drag card#1 horizontally so that it is no longer hovering on card#2.
+        verifyDrag(mDummyViewHolder1, 10, 0, POSITION2,
+                TabListRecyclerView.AnimationStatus.HOVERED_CARD_ZOOM_OUT);
+
+        // Simulate the process of hovering card#1 on card#3.
+        verifyDrag(mDummyViewHolder1, 0, 5, POSITION3,
+                TabListRecyclerView.AnimationStatus.HOVERED_CARD_ZOOM_IN);
+        // Continue to drag card#1 vertically so that it is no longer hovering on card#3.
+        verifyDrag(mDummyViewHolder1, 0, 10, POSITION3,
+                TabListRecyclerView.AnimationStatus.HOVERED_CARD_ZOOM_OUT);
+
+        // Simulate the process of hovering card#1 on card#4.
+        verifyDrag(mDummyViewHolder1, 5, 5, POSITION4,
+                TabListRecyclerView.AnimationStatus.HOVERED_CARD_ZOOM_IN);
+        // Continue to drag card#1 diagonally so that it is no longer hovering on card#4.
+        verifyDrag(mDummyViewHolder1, 10, 10, POSITION4,
+                TabListRecyclerView.AnimationStatus.HOVERED_CARD_ZOOM_OUT);
+    }
+
+    @Test
+    @Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID,
+            ChromeFeatureList.TAB_GROUPS_UI_IMPROVEMENTS_ANDROID})
+    public void onDragTab_Hovered_GTS_WITHOUT_GROUP() {
+        initAndAssertAllProperties();
+        doReturn(mEmptyTabModelFilter).when(mTabModelFilterProvider).getCurrentTabModelFilter();
+
+        // Hovering shouldn't make any difference.
+        verifyDrag(mDummyViewHolder1, 5, 0, POSITION2,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+        verifyDrag(mDummyViewHolder2, -5, 0, POSITION1,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+
+        verifyDrag(mDummyViewHolder1, 0, 5, POSITION3,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+        verifyDrag(mDummyViewHolder3, 0, -5, POSITION1,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+
+        verifyDrag(mDummyViewHolder1, 5, 5, POSITION4,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+        verifyDrag(mDummyViewHolder4, -5, -5, POSITION1,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+    }
+
+    @Test
+    public void onDragTab_Hovered_NON_GTS() {
+        initAndAssertAllProperties();
+        // Suppose drag happens in components other than GTS.
+        mItemTouchHelperCallback.setActionsOnAllRelatedTabsForTest(false);
+
+        // Hovering shouldn't make any difference.
+        verifyDrag(mDummyViewHolder1, 5, 0, POSITION2,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+        verifyDrag(mDummyViewHolder2, -5, 0, POSITION1,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+
+        verifyDrag(mDummyViewHolder1, 0, 5, POSITION3,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+        verifyDrag(mDummyViewHolder3, 0, -5, POSITION1,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+
+        verifyDrag(mDummyViewHolder1, 5, 5, POSITION4,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+        verifyDrag(mDummyViewHolder4, -5, -5, POSITION1,
+                TabListRecyclerView.AnimationStatus.CARD_RESTORE);
+    }
+
+    @Test
+    public void onDragTab_UNGROUP() {
+        initAndAssertAllProperties();
+        setupItemTouchHelperCallback(true);
+
+        // Simulate dragging card#1 down to the ungroup bar.
+        mItemTouchHelperCallback.onChildDraw(mCanvas, mRecyclerView, mDummyViewHolder1, 0, 7,
+                ItemTouchHelper.ACTION_STATE_DRAG, true);
+
+        verify(mTabGridDialogHandler)
+                .updateUngroupBarStatus(TabGridDialogParent.UngroupBarStatus.HOVERED);
+
+        // Simulate dragging card#3 down to the ungroup bar.
+        mItemTouchHelperCallback.onChildDraw(mCanvas, mRecyclerView, mDummyViewHolder1, 0, 2,
+                ItemTouchHelper.ACTION_STATE_DRAG, true);
+
+        verify(mTabGridDialogHandler)
+                .updateUngroupBarStatus(TabGridDialogParent.UngroupBarStatus.HOVERED);
+    }
+
+    @Test
+    public void onDragTab_NOT_UNGROUP() {
+        initAndAssertAllProperties();
+        setupItemTouchHelperCallback(true);
+
+        // With recyclerview bottom equal to 12 and ungroup threshold equal to 2, any drag with
+        // itemview.bottom + dY <= 10 should never trigger ungroup.
+        mItemTouchHelperCallback.onChildDraw(mCanvas, mRecyclerView, mDummyViewHolder1, 0, 6,
+                ItemTouchHelper.ACTION_STATE_DRAG, true);
+
+        // Simulate dragging card#3 down to the ungroup bar.
+        mItemTouchHelperCallback.onChildDraw(mCanvas, mRecyclerView, mDummyViewHolder3, 0, 1,
+                ItemTouchHelper.ACTION_STATE_DRAG, true);
+
+        verify(mTabGridDialogHandler, times(2))
+                .updateUngroupBarStatus(TabGridDialogParent.UngroupBarStatus.HIDE);
+
+        verify(mTabGridDialogHandler, never())
+                .updateUngroupBarStatus(TabGridDialogParent.UngroupBarStatus.HOVERED);
+    }
+
+    @Test
+    public void onDragTab_UNGROUP_LAST_TAB() {
+        initAndAssertAllProperties();
+        setupItemTouchHelperCallback(true);
+
+        // Assume that there is only one tab in the group.
+        doReturn(1).when(mAdapter).getItemCount();
+
+        // Simulate dragging the only tab down to the ungroup bar.
+        mItemTouchHelperCallback.onChildDraw(mCanvas, mRecyclerView, mDummyViewHolder1, 0, 8,
+                ItemTouchHelper.ACTION_STATE_DRAG, true);
+
+        verify(mTabGridDialogHandler, never())
+                .updateUngroupBarStatus(TabGridDialogParent.UngroupBarStatus.HOVERED);
+    }
+
+    private void verifyDrag(
+            RecyclerView.ViewHolder viewHolder, float dX, float dY, int targetIndex, int status) {
+        // Simulate the process of dragging one card to a position.
+        mItemTouchHelperCallback.onChildDraw(mCanvas, mRecyclerView, viewHolder, dX, dY,
+                ItemTouchHelper.ACTION_STATE_DRAG, true);
+
+        // Verify the card in target index is in correct status.
+        assertThat(
+                mModel.get(targetIndex).get(TabProperties.CARD_ANIMATION_STATUS), equalTo(status));
+    }
+
+    private void initAndAssertAllProperties() {
+        for (int i = 0; i < mTabModel.getCount(); i++) {
+            Tab tab = mTabModel.getTabAt(i);
+            addTabInfoModel(tab);
+        }
+
+        assertThat(mModel.size(), equalTo(4));
+
+        assertThat(mModel.get(0).get(TabProperties.TAB_ID), equalTo(TAB1_ID));
+        assertThat(mModel.get(1).get(TabProperties.TAB_ID), equalTo(TAB2_ID));
+        assertThat(mModel.get(2).get(TabProperties.TAB_ID), equalTo(TAB3_ID));
+        assertThat(mModel.get(3).get(TabProperties.TAB_ID), equalTo(TAB4_ID));
+
+        assertThat(mModel.get(0).get(TabProperties.CARD_ANIMATION_STATUS),
+                equalTo(TabListRecyclerView.AnimationStatus.CARD_RESTORE));
+        assertThat(mModel.get(1).get(TabProperties.CARD_ANIMATION_STATUS),
+                equalTo(TabListRecyclerView.AnimationStatus.CARD_RESTORE));
+        assertThat(mModel.get(2).get(TabProperties.CARD_ANIMATION_STATUS),
+                equalTo(TabListRecyclerView.AnimationStatus.CARD_RESTORE));
+        assertThat(mModel.get(3).get(TabProperties.CARD_ANIMATION_STATUS),
+                equalTo(TabListRecyclerView.AnimationStatus.CARD_RESTORE));
+
+        assertThat(mModel.get(0).get(TabProperties.ALPHA), equalTo(1f));
+        assertThat(mModel.get(1).get(TabProperties.ALPHA), equalTo(1f));
+        assertThat(mModel.get(2).get(TabProperties.ALPHA), equalTo(1f));
+        assertThat(mModel.get(3).get(TabProperties.ALPHA), equalTo(1f));
+    }
+
+    private void addTabInfoModel(Tab tab) {
+        PropertyKey[] testKeysTabGrid = new PropertyKey[] {
+                TabProperties.TAB_ID, TabProperties.CARD_ANIMATION_STATUS, TabProperties.ALPHA};
+        PropertyModel tabInfo = new PropertyModel.Builder(testKeysTabGrid)
+                                        .with(TabProperties.TAB_ID, tab.getId())
+                                        .with(TabProperties.CARD_ANIMATION_STATUS,
+                                                TabListRecyclerView.AnimationStatus.CARD_RESTORE)
+                                        .with(TabProperties.ALPHA, 1f)
+                                        .build();
+        mModel.add(tabInfo);
+    }
+
+    private Tab prepareTab(int id, String title) {
+        Tab tab = mock(Tab.class);
+        doReturn(id).when(tab).getId();
+        doReturn(title).when(tab).getTitle();
+        return tab;
+    }
+
+    private TabGridViewHolder prepareMockViewHolder(int id, int position) {
+        TabGridViewHolder viewHolder = mock(TabGridViewHolder.class);
+        doReturn(id).when(viewHolder).getTabId();
+        doReturn(position).when(viewHolder).getAdapterPosition();
+        return viewHolder;
+    }
+
+    private View prepareItemView(int left, int top, int right, int bottom) {
+        View view = mock(View.class);
+        doReturn(left).when(view).getLeft();
+        doReturn(top).when(view).getTop();
+        doReturn(right).when(view).getRight();
+        doReturn(bottom).when(view).getBottom();
+        return view;
+    }
+
+    private RecyclerView.ViewHolder prepareDummyViewHolder(View itemView) {
+        return new RecyclerView.ViewHolder(itemView) {};
+    }
+}
diff --git a/chrome/android/features/tab_ui/tab_management_java_sources.gni b/chrome/android/features/tab_ui/tab_management_java_sources.gni
index e9afb2ab..17ce47df 100644
--- a/chrome/android/features/tab_ui/tab_management_java_sources.gni
+++ b/chrome/android/features/tab_ui/tab_management_java_sources.gni
@@ -20,5 +20,6 @@
 
 tab_management_junit_java_sources = [
   "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/GridTabSwitcherMediatorUnitTest.java",
+  "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallbackUnitTest.java",
   "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java",
 ]
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml
index 187352e..168ffa0 100644
--- a/chrome/android/java/AndroidManifest.xml
+++ b/chrome/android/java/AndroidManifest.xml
@@ -723,6 +723,16 @@
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </activity>
+        <!-- Non-exported alias that only Chrome can launch to verify shortcut intent comes from
+             Chrome (ShortcutManager on O+ launches under the shortcut creator's uid). -->
+        <activity-alias android:name="org.chromium.chrome.browser.webapps.SecureWebAppLauncher"
+            android:targetActivity="org.chromium.chrome.browser.webapps.WebappLauncherActivity"
+            android:exported="false">
+            <intent-filter>
+                <action android:name="org.chromium.chrome.browser.webapps.WebappManager.ACTION_START_SECURE_WEBAPP" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity-alias>
         <activity-alias android:name="com.google.android.apps.chrome.webapps.WebappManager"
             android:targetActivity="org.chromium.chrome.browser.webapps.WebappLauncherActivity">
         </activity-alias>
diff --git a/chrome/android/java/monochrome_public_bundle.proguard_flags.expected b/chrome/android/java/monochrome_public_bundle.proguard_flags.expected
index 01cda890..3dd9c32f 100644
--- a/chrome/android/java/monochrome_public_bundle.proguard_flags.expected
+++ b/chrome/android/java/monochrome_public_bundle.proguard_flags.expected
@@ -343,7 +343,7 @@
 -assumenosideeffects class com.google.android.gms.cast.framework.media.CastMediaOptions$Builder {
   public <init>();
   public <clinit>();
-  *** build() return null;
+  *** build();
 }
 
 ################################################################################
diff --git a/chrome/android/java/monochrome_public_bundle__base_bundle_module.AndroidManifest.expected b/chrome/android/java/monochrome_public_bundle__base_bundle_module.AndroidManifest.expected
index 0f4ca443..95a6545 100644
--- a/chrome/android/java/monochrome_public_bundle__base_bundle_module.AndroidManifest.expected
+++ b/chrome/android/java/monochrome_public_bundle__base_bundle_module.AndroidManifest.expected
@@ -956,6 +956,16 @@
       </intent-filter>
     </activity>
     <activity-alias
+        android:exported="false"
+        android:name="org.chromium.chrome.browser.webapps.SecureWebAppLauncher"
+        android:targetActivity="org.chromium.chrome.browser.webapps.WebappLauncherActivity">
+      <intent-filter>
+        <action
+            android:name="org.chromium.chrome.browser.webapps.WebappManager.ACTION_START_SECURE_WEBAPP"/>
+        <category android:name="android.intent.category.DEFAULT"/>
+      </intent-filter>
+    </activity-alias>
+    <activity-alias
         android:exported="true"
         android:name="com.google.android.apps.chrome.IntentDispatcher"
         android:targetActivity="org.chromium.chrome.browser.document.ChromeLauncherActivity">
diff --git a/chrome/android/java/proguard.flags b/chrome/android/java/proguard.flags
index 9cb3724d..8704907 100644
--- a/chrome/android/java/proguard.flags
+++ b/chrome/android/java/proguard.flags
@@ -60,5 +60,5 @@
 -assumenosideeffects class com.google.android.gms.cast.framework.media.CastMediaOptions$Builder {
   public <init>();
   public <clinit>();
-  *** build() return null;
+  *** build();
 }
diff --git a/chrome/android/java/res/layout/revamped_context_menu_header.xml b/chrome/android/java/res/layout/revamped_context_menu_header.xml
index 8633ca8..47916bd 100644
--- a/chrome/android/java/res/layout/revamped_context_menu_header.xml
+++ b/chrome/android/java/res/layout/revamped_context_menu_header.xml
@@ -50,8 +50,6 @@
         android:orientation="vertical"
         android:layout_gravity="center_vertical">
 
-        <!-- TODO(sinansahin): Sync with UX to decide on what to do with cases like RTL text on LTR
-             device and LTR text on RTL device -->
         <org.chromium.ui.widget.TextViewWithLeading
             android:id="@+id/menu_header_title"
             android:layout_width="match_parent"
@@ -67,6 +65,7 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:textAlignment="viewStart"
+            android:textDirection="ltr"
             android:ellipsize="end"
             android:maxLines="1"
             android:textAppearance="@style/TextAppearance.BlackCaption"
diff --git a/chrome/android/java/res/layout/touchless_add_to_apps.xml b/chrome/android/java/res/layout/touchless_add_to_apps.xml
index 88bf8a1..952e7f2c 100644
--- a/chrome/android/java/res/layout/touchless_add_to_apps.xml
+++ b/chrome/android/java/res/layout/touchless_add_to_apps.xml
@@ -8,7 +8,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:gravity="start"
+    android:gravity="center_vertical"
     android:padding="8dp" >
 
     <ProgressBar
@@ -25,30 +25,16 @@
         android:importantForAccessibility="no"
         android:visibility="gone" />
 
-    <!-- The layout used for apps. -->
-    <LinearLayout
-        android:id="@+id/app_info"
-        android:orientation="vertical"
+    <org.chromium.chrome.browser.widget.AlertDialogEditText
+        android:id="@+id/app_title"
+        android:inputType="text"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
+        android:layout_height="36dp"
+        android:singleLine="true"
+        android:paddingTop="0dp"
         android:layout_marginStart="48dp"
-        android:visibility="gone" >
+        style="@style/Theme.AppCompat.Light"
+        android:visibility="gone"/>
 
-        <!-- The name of the web app that will be used on the home screen. Not
-             editable as we preserve the developer's name choice for apps. -->
-        <TextView
-            android:id="@+id/name"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:textAppearance="@style/TextAppearance.BlackTitle1" />
-
-        <!-- The origin of the web app, displayed for security purposes. -->
-        <TextView
-            android:id="@+id/origin"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:paddingBottom="2dp"
-            android:textAppearance="@style/TextAppearance.BlackBody" />
-    </LinearLayout>
 </FrameLayout>
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java b/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java
index e92d6ee..e3c43a5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java
@@ -443,6 +443,11 @@
     public void performPrivateImeCommand(WebContents webContents, String action, Bundle data) {}
 
     /**
+     * Called when the Search Context Menu Item is clicked.
+     */
+    public void onSearchContextMenuClick() {}
+
+    /**
      * @param registry The Chrome interface registry for the RenderFrameHost.
      * @param renderFrameHost The RenderFrameHost the Interface Registry is for.
      */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/DeviceItemAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/DeviceItemAdapter.java
new file mode 100644
index 0000000..d2518ba
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/DeviceItemAdapter.java
@@ -0,0 +1,324 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.LayoutRes;
+import android.support.annotation.Nullable;
+import android.support.v4.util.ObjectsCompat;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import org.chromium.chrome.R;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * An adapter for keeping track of which items to show in the dialog.
+ */
+public class DeviceItemAdapter
+        extends ArrayAdapter<DeviceItemRow> implements AdapterView.OnItemClickListener {
+    /**
+     * Item holder for performance boost.
+     */
+    private static class ViewHolder {
+        private TextView mTextView;
+        private ImageView mImageView;
+
+        public ViewHolder(View view) {
+            mImageView = (ImageView) view.findViewById(R.id.icon);
+            mTextView = (TextView) view.findViewById(R.id.description);
+        }
+    }
+
+    /**
+     * An observer interface for item selection change in the adapter.
+     */
+    public interface Observer {
+        /**
+         * Called when item selection changed in the adapter.
+         *
+         * @param itemSelected Whether there is item selected in the adapter.
+         */
+        default void onItemSelectionChanged(boolean itemSelected) {}
+    }
+
+    private final LayoutInflater mInflater;
+
+    private final Resources mResources;
+
+    // The zero-based index of the item currently selected in the dialog,
+    // or -1 (INVALID_POSITION) if nothing is selected.
+    private int mSelectedItem = ListView.INVALID_POSITION;
+
+    // A set of keys that are marked as disabled in the dialog.
+    private Set<String> mDisabledEntries = new HashSet<String>();
+
+    // Item descriptions are counted in a map.
+    private Map<String, Integer> mItemDescriptionMap = new HashMap<>();
+
+    // Map of keys to items so that we can access the items in O(1).
+    private Map<String, DeviceItemRow> mKeyToItemMap = new HashMap<>();
+
+    // True when there is at least one row with an icon.
+    private boolean mHasIcon;
+
+    private @Nullable Observer mObserver;
+
+    /**
+     * Creates a device item adapter which can show a list of items.
+     *
+     * @param context The context of the application.
+     * @param resource The resource identifier for the item row.
+     */
+    public DeviceItemAdapter(Context context, @LayoutRes int resource) {
+        super(context, resource);
+
+        mInflater = LayoutInflater.from(context);
+        mResources = context.getResources();
+    }
+
+    @Override
+    public boolean isEmpty() {
+        boolean isEmpty = super.isEmpty();
+        if (isEmpty) {
+            assert mKeyToItemMap.isEmpty();
+            assert mDisabledEntries.isEmpty();
+            assert mItemDescriptionMap.isEmpty();
+        } else {
+            assert !mKeyToItemMap.isEmpty();
+            assert !mItemDescriptionMap.isEmpty();
+        }
+        return isEmpty;
+    }
+
+    /**
+     * Adds an item to the list to show in the dialog if the item
+     * was not in the chooser. Otherwise updates the items description, icon
+     * and icon description.
+     * @param key Unique identifier for that item.
+     * @param description Text in the row.
+     * @param icon Drawable to show next to the item.
+     * @param iconDescription Description of the icon.
+     */
+    public void addOrUpdate(String key, String description, @Nullable Drawable icon,
+            @Nullable String iconDescription) {
+        DeviceItemRow oldItem = mKeyToItemMap.get(key);
+        if (oldItem != null) {
+            if (oldItem.hasSameContents(key, description, icon, iconDescription)) {
+                // No need to update anything.
+                return;
+            }
+
+            if (!TextUtils.equals(oldItem.mDescription, description)) {
+                removeFromDescriptionsMap(oldItem.mDescription);
+                oldItem.mDescription = description;
+                addToDescriptionsMap(oldItem.mDescription);
+            }
+
+            if (!ObjectsCompat.equals(icon, oldItem.mIcon)) {
+                oldItem.mIcon = icon;
+                oldItem.mIconDescription = iconDescription;
+            }
+
+            notifyDataSetChanged();
+            return;
+        }
+
+        assert !mKeyToItemMap.containsKey(key);
+        DeviceItemRow newItem = new DeviceItemRow(key, description, icon, iconDescription);
+        mKeyToItemMap.put(key, newItem);
+
+        addToDescriptionsMap(newItem.mDescription);
+        add(newItem);
+    }
+
+    public void removeItemWithKey(String key) {
+        DeviceItemRow oldItem = mKeyToItemMap.remove(key);
+        if (oldItem == null) return;
+        int oldItemPosition = getPosition(oldItem);
+        // If the removed item is the item that is currently selected, deselect it
+        // and disable the confirm button. Otherwise if the removed item is before
+        // the currently selected item, the currently selected item's index needs
+        // to be adjusted by one.
+        if (oldItemPosition == mSelectedItem) {
+            updateSelectedItemPosition(ListView.INVALID_POSITION);
+        } else if (oldItemPosition < mSelectedItem) {
+            --mSelectedItem;
+        }
+        removeFromDescriptionsMap(oldItem.mDescription);
+        super.remove(oldItem);
+    }
+
+    @Override
+    public void clear() {
+        mKeyToItemMap.clear();
+        mDisabledEntries.clear();
+        mItemDescriptionMap.clear();
+        updateSelectedItemPosition(ListView.INVALID_POSITION);
+        super.clear();
+    }
+
+    /**
+     * Returns the key of the currently selected item or blank if nothing is
+     * selected.
+     */
+    public String getSelectedItemKey() {
+        if (mSelectedItem == ListView.INVALID_POSITION) return "";
+        DeviceItemRow row = getItem(mSelectedItem);
+        if (row == null) return "";
+        return row.mKey;
+    }
+
+    /**
+     * Returns the text to be displayed on the chooser for an item. For items with the same
+     * description, their unique keys are appended to distinguish them.
+     * @param position The index of the item.
+     */
+    public String getDisplayText(int position) {
+        DeviceItemRow item = getItem(position);
+        String description = item.mDescription;
+        int counter = mItemDescriptionMap.get(description);
+        return counter == 1 ? description
+                            : mResources.getString(R.string.item_chooser_item_name_with_id,
+                                    description, item.mKey);
+    }
+
+    /**
+     * Sets whether the item is enabled. Disabled items are grayed out.
+     * @param id The id of the item to affect.
+     * @param enabled Whether the item should be enabled or not.
+     */
+    public void setEnabled(String id, boolean enabled) {
+        if (enabled) {
+            mDisabledEntries.remove(id);
+        } else {
+            mDisabledEntries.add(id);
+        }
+
+        if (mSelectedItem != ListView.INVALID_POSITION) {
+            DeviceItemRow selectedRow = getItem(mSelectedItem);
+            if (id.equals(selectedRow.mKey) && !enabled) {
+                updateSelectedItemPosition(ListView.INVALID_POSITION);
+            }
+        }
+
+        notifyDataSetChanged();
+    }
+
+    /**
+     * Sets the observer to be notified of the item selection change in the adapter.
+     * @param observer The observer to be notified.
+     */
+    public void setObserver(Observer observer) {
+        mObserver = observer;
+    }
+
+    @Override
+    public boolean isEnabled(int position) {
+        DeviceItemRow item = getItem(position);
+        return !mDisabledEntries.contains(item.mKey);
+    }
+
+    @Override
+    public int getViewTypeCount() {
+        return 1;
+    }
+
+    @Override
+    public long getItemId(int position) {
+        return position;
+    }
+
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+        ViewHolder row;
+        if (convertView == null) {
+            convertView = mInflater.inflate(R.layout.item_chooser_dialog_row, parent, false);
+            row = new ViewHolder(convertView);
+            convertView.setTag(row);
+        } else {
+            row = (ViewHolder) convertView.getTag();
+        }
+
+        row.mTextView.setSelected(position == mSelectedItem);
+        row.mTextView.setEnabled(isEnabled(position));
+        row.mTextView.setText(getDisplayText(position));
+
+        // If there is at least one item with an icon then we set mImageView's
+        // visibility to INVISIBLE for all items with no icons. We do this
+        // so that all items' descriptions are aligned.
+        if (!mHasIcon) {
+            row.mImageView.setVisibility(View.GONE);
+        } else {
+            DeviceItemRow item = getItem(position);
+            if (item.mIcon != null) {
+                row.mImageView.setContentDescription(item.mIconDescription);
+                row.mImageView.setImageDrawable(item.mIcon);
+                row.mImageView.setVisibility(View.VISIBLE);
+            } else {
+                row.mImageView.setVisibility(View.INVISIBLE);
+                row.mImageView.setImageDrawable(null);
+                row.mImageView.setContentDescription(null);
+            }
+            row.mImageView.setSelected(position == mSelectedItem);
+        }
+        return convertView;
+    }
+
+    @Override
+    public void notifyDataSetChanged() {
+        mHasIcon = false;
+        for (DeviceItemRow row : mKeyToItemMap.values()) {
+            if (row.mIcon != null) mHasIcon = true;
+        }
+        super.notifyDataSetChanged();
+    }
+
+    @Override
+    public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
+        updateSelectedItemPosition(position);
+        notifyDataSetChanged();
+    }
+
+    private void addToDescriptionsMap(String description) {
+        int count = mItemDescriptionMap.containsKey(description)
+                ? mItemDescriptionMap.get(description)
+                : 0;
+        mItemDescriptionMap.put(description, count + 1);
+    }
+
+    private void removeFromDescriptionsMap(String description) {
+        if (!mItemDescriptionMap.containsKey(description)) {
+            return;
+        }
+        int count = mItemDescriptionMap.get(description);
+        if (count == 1) {
+            mItemDescriptionMap.remove(description);
+        } else {
+            mItemDescriptionMap.put(description, count - 1);
+        }
+    }
+
+    private void updateSelectedItemPosition(int position) {
+        mSelectedItem = position;
+        if (mObserver != null) {
+            boolean itemSelected = (mSelectedItem != ListView.INVALID_POSITION);
+            mObserver.onItemSelectionChanged(itemSelected);
+        }
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/DeviceItemRow.java b/chrome/android/java/src/org/chromium/chrome/browser/DeviceItemRow.java
new file mode 100644
index 0000000..2e907e2
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/DeviceItemRow.java
@@ -0,0 +1,62 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser;
+
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+
+/**
+ * A class representing one data row in the dialog.
+ */
+public class DeviceItemRow {
+    public final String mKey;
+    public String mDescription;
+    public Drawable mIcon;
+    public String mIconDescription;
+
+    /**
+     * Creates a device item row which can be shown in the dialog.
+     *
+     * @param key Item unique identifier.
+     * @param description Item description.
+     * @param icon Item icon.
+     * @param iconDescription Item icon description.
+     */
+    public DeviceItemRow(String key, String description, @Nullable Drawable icon,
+            @Nullable String iconDescription) {
+        mKey = key;
+        mDescription = description;
+        mIcon = icon;
+        mIconDescription = iconDescription;
+    }
+
+    /**
+     * Returns true if all parameters match the corresponding member.
+     *
+     * @param key Expected item unique identifier.
+     * @param description Expected item description.
+     * @param icon Expected item icon.
+     */
+    public boolean hasSameContents(String key, String description, @Nullable Drawable icon,
+            @Nullable String iconDescription) {
+        if (!TextUtils.equals(mKey, key)) return false;
+        if (!TextUtils.equals(mDescription, description)) return false;
+        if (!TextUtils.equals(mIconDescription, iconDescription)) return false;
+
+        if (icon == null ^ mIcon == null) return false;
+
+        // On Android NMR1 and above, Drawable#getConstantState() always returns a different
+        // value, so it does not make sense to compare it.
+        // TODO(crbug.com/773043): Find a way to compare the icons.
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1 && mIcon != null
+                && !mIcon.getConstantState().equals(icon.getConstantState())) {
+            return false;
+        }
+
+        return true;
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java
index bcab2d7..bc9b3f8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java
@@ -6,15 +6,11 @@
 
 import android.app.Activity;
 import android.app.Dialog;
-import android.content.Context;
 import android.graphics.Color;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
-import android.os.Build;
 import android.support.annotation.IntDef;
 import android.support.annotation.Nullable;
-import android.support.v4.util.ObjectsCompat;
-import android.text.TextUtils;
 import android.text.method.LinkMovementMethod;
 import android.view.Gravity;
 import android.view.LayoutInflater;
@@ -22,10 +18,7 @@
 import android.view.ViewGroup;
 import android.view.ViewGroup.LayoutParams;
 import android.view.Window;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
 import android.widget.Button;
-import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.ListView;
 import android.widget.ProgressBar;
@@ -39,10 +32,6 @@
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
 
 /**
  * A general-purpose dialog for presenting a list of things to pick from.
@@ -50,7 +39,7 @@
  * The dialog is shown by the ItemChooserDialog constructor, and always calls
  * ItemSelectedCallback.onItemSelected() as it's closing.
  */
-public class ItemChooserDialog {
+public class ItemChooserDialog implements DeviceItemAdapter.Observer {
     /**
      * An interface to implement to get a callback when something has been
      * selected.
@@ -66,50 +55,6 @@
     }
 
     /**
-     * A class representing one data row in the picker.
-     */
-    public static class ItemChooserRow {
-        private final String mKey;
-        private String mDescription;
-        private Drawable mIcon;
-        private String mIconDescription;
-
-        public ItemChooserRow(String key, String description, @Nullable Drawable icon,
-                @Nullable String iconDescription) {
-            mKey = key;
-            mDescription = description;
-            mIcon = icon;
-            mIconDescription = iconDescription;
-        }
-
-        /**
-         * Returns true if all parameters match the corresponding member.
-         *
-         * @param key Expected item unique identifier.
-         * @param description Expected item description.
-         * @param icon Expected item icon.
-         */
-        public boolean hasSameContents(String key, String description, @Nullable Drawable icon,
-                @Nullable String iconDescription) {
-            if (!TextUtils.equals(mKey, key)) return false;
-            if (!TextUtils.equals(mDescription, description)) return false;
-            if (!TextUtils.equals(mIconDescription, iconDescription)) return false;
-
-            if (icon == null ^ mIcon == null) return false;
-
-            // On Android NMR1 and above, Drawable#getConstantState() always returns a different
-            // value, so it does not make sense to compare it.
-            // TODO(crbug.com/773043): Find a way to compare the icons.
-            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1 && mIcon != null
-                    && !mIcon.getConstantState().equals(icon.getConstantState())) {
-                return false;
-            }
-
-            return true;
-        }
-    }
-
-    /**
      * The labels to show in the dialog.
      */
     public static class ItemChooserLabels {
@@ -145,19 +90,6 @@
     }
 
     /**
-     * Item holder for performance boost.
-     */
-    private static class ViewHolder {
-        private TextView mTextView;
-        private ImageView mImageView;
-
-        public ViewHolder(View view) {
-            mImageView = (ImageView) view.findViewById(R.id.icon);
-            mTextView = (TextView) view.findViewById(R.id.description);
-        }
-    }
-
-    /**
      * The various states the dialog can represent.
      */
     @IntDef({State.INITIALIZING_ADAPTER, State.STARTING, State.PROGRESS_UPDATE_AVAILABLE,
@@ -170,254 +102,6 @@
         int DISCOVERY_IDLE = 3;
     }
 
-    /**
-     * An adapter for keeping track of which items to show in the dialog.
-     */
-    public class ItemAdapter extends ArrayAdapter<ItemChooserRow>
-            implements AdapterView.OnItemClickListener {
-        private final LayoutInflater mInflater;
-
-        // The zero-based index of the item currently selected in the dialog,
-        // or -1 (INVALID_POSITION) if nothing is selected.
-        private int mSelectedItem = ListView.INVALID_POSITION;
-
-        // A set of keys that are marked as disabled in the dialog.
-        private Set<String> mDisabledEntries = new HashSet<String>();
-
-        // Item descriptions are counted in a map.
-        private Map<String, Integer> mItemDescriptionMap = new HashMap<>();
-
-        // Map of keys to items so that we can access the items in O(1).
-        private Map<String, ItemChooserRow> mKeyToItemMap = new HashMap<>();
-
-        // True when there is at least one row with an icon.
-        private boolean mHasIcon;
-
-        public ItemAdapter(Context context, int resource) {
-            super(context, resource);
-
-            mInflater = LayoutInflater.from(context);
-        }
-
-        @Override
-        public boolean isEmpty() {
-            boolean isEmpty = super.isEmpty();
-            if (isEmpty) {
-                assert mKeyToItemMap.isEmpty();
-                assert mDisabledEntries.isEmpty();
-                assert mItemDescriptionMap.isEmpty();
-            } else {
-                assert !mKeyToItemMap.isEmpty();
-                assert !mItemDescriptionMap.isEmpty();
-            }
-            return isEmpty;
-        }
-
-        /**
-         * Adds an item to the list to show in the dialog if the item
-         * was not in the chooser. Otherwise updates the items description, icon
-         * and icon description.
-         * @param key Unique identifier for that item.
-         * @param description Text in the row.
-         * @param icon Drawable to show next to the item.
-         * @param iconDescription Description of the icon.
-         */
-        public void addOrUpdate(String key, String description, @Nullable Drawable icon,
-                @Nullable String iconDescription) {
-            ItemChooserRow oldItem = mKeyToItemMap.get(key);
-            if (oldItem != null) {
-                if (oldItem.hasSameContents(key, description, icon, iconDescription)) {
-                    // No need to update anything.
-                    return;
-                }
-
-                if (!TextUtils.equals(oldItem.mDescription, description)) {
-                    removeFromDescriptionsMap(oldItem.mDescription);
-                    oldItem.mDescription = description;
-                    addToDescriptionsMap(oldItem.mDescription);
-                }
-
-                if (!ObjectsCompat.equals(icon, oldItem.mIcon)) {
-                    oldItem.mIcon = icon;
-                    oldItem.mIconDescription = iconDescription;
-                }
-
-                notifyDataSetChanged();
-                return;
-            }
-
-            assert !mKeyToItemMap.containsKey(key);
-            ItemChooserRow newItem = new ItemChooserRow(key, description, icon, iconDescription);
-            mKeyToItemMap.put(key, newItem);
-
-            addToDescriptionsMap(newItem.mDescription);
-            add(newItem);
-        }
-
-        public void removeItemWithKey(String key) {
-            ItemChooserRow oldItem = mKeyToItemMap.remove(key);
-            if (oldItem == null) return;
-            int oldItemPosition = getPosition(oldItem);
-            // If the removed item is the item that is currently selected, deselect it
-            // and disable the confirm button. Otherwise if the removed item is before
-            // the currently selected item, the currently selected item's index needs
-            // to be adjusted by one.
-            if (oldItemPosition == mSelectedItem) {
-                mSelectedItem = ListView.INVALID_POSITION;
-                mConfirmButton.setEnabled(false);
-            } else if (oldItemPosition < mSelectedItem) {
-                --mSelectedItem;
-            }
-            removeFromDescriptionsMap(oldItem.mDescription);
-            super.remove(oldItem);
-        }
-
-        @Override
-        public void clear() {
-            mSelectedItem = ListView.INVALID_POSITION;
-            mKeyToItemMap.clear();
-            mDisabledEntries.clear();
-            mItemDescriptionMap.clear();
-            mConfirmButton.setEnabled(false);
-            super.clear();
-        }
-
-        /**
-         * Returns the key of the currently selected item or blank if nothing is
-         * selected.
-         */
-        public String getSelectedItemKey() {
-            if (mSelectedItem == ListView.INVALID_POSITION) return "";
-            ItemChooserRow row = getItem(mSelectedItem);
-            if (row == null) return "";
-            return row.mKey;
-        }
-
-        /**
-         * Returns the text to be displayed on the chooser for an item. For items with the same
-         * description, their unique keys are appended to distinguish them.
-         * @param position The index of the item.
-         */
-        public String getDisplayText(int position) {
-            ItemChooserRow item = getItem(position);
-            String description = item.mDescription;
-            int counter = mItemDescriptionMap.get(description);
-            return counter == 1 ? description
-                    : mActivity.getString(R.string.item_chooser_item_name_with_id, description,
-                            item.mKey);
-        }
-
-        /**
-         * Sets whether the item is enabled. Disabled items are grayed out.
-         * @param id The id of the item to affect.
-         * @param enabled Whether the item should be enabled or not.
-         */
-        public void setEnabled(String id, boolean enabled) {
-            if (enabled) {
-                mDisabledEntries.remove(id);
-            } else {
-                mDisabledEntries.add(id);
-            }
-
-            if (mSelectedItem != ListView.INVALID_POSITION) {
-                ItemChooserRow selectedRow = getItem(mSelectedItem);
-                if (id.equals(selectedRow.mKey) && !enabled) {
-                    mSelectedItem = ListView.INVALID_POSITION;
-                    mConfirmButton.setEnabled(enabled);
-                }
-            }
-
-            notifyDataSetChanged();
-        }
-
-        @Override
-        public boolean isEnabled(int position) {
-            ItemChooserRow item = getItem(position);
-            return !mDisabledEntries.contains(item.mKey);
-        }
-
-        @Override
-        public int getViewTypeCount() {
-            return 1;
-        }
-
-        @Override
-        public long getItemId(int position) {
-            return position;
-        }
-
-        @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
-            ViewHolder row;
-            if (convertView == null) {
-                convertView = mInflater.inflate(R.layout.item_chooser_dialog_row, parent, false);
-                row = new ViewHolder(convertView);
-                convertView.setTag(row);
-            } else {
-                row = (ViewHolder) convertView.getTag();
-            }
-
-            row.mTextView.setSelected(position == mSelectedItem);
-            row.mTextView.setEnabled(isEnabled(position));
-            row.mTextView.setText(getDisplayText(position));
-
-            // If there is at least one item with an icon then we set mImageView's
-            // visibility to INVISIBLE for all items with no icons. We do this
-            // so that all items' desriptions are aligned.
-            if (!mHasIcon) {
-                row.mImageView.setVisibility(View.GONE);
-            } else {
-                ItemChooserRow item = getItem(position);
-                if (item.mIcon != null) {
-                    row.mImageView.setContentDescription(item.mIconDescription);
-                    row.mImageView.setImageDrawable(item.mIcon);
-                    row.mImageView.setVisibility(View.VISIBLE);
-                } else {
-                    row.mImageView.setVisibility(View.INVISIBLE);
-                    row.mImageView.setImageDrawable(null);
-                    row.mImageView.setContentDescription(null);
-                }
-                row.mImageView.setSelected(position == mSelectedItem);
-            }
-            return convertView;
-        }
-
-        @Override
-        public void notifyDataSetChanged() {
-            mHasIcon = false;
-            for (ItemChooserRow row : mKeyToItemMap.values()) {
-                if (row.mIcon != null) mHasIcon = true;
-            }
-            super.notifyDataSetChanged();
-        }
-
-        @Override
-        public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
-            mSelectedItem = position;
-            mConfirmButton.setEnabled(true);
-            notifyDataSetChanged();
-        }
-
-        private void addToDescriptionsMap(String description) {
-            int count = mItemDescriptionMap.containsKey(description)
-                    ? mItemDescriptionMap.get(description)
-                    : 0;
-            mItemDescriptionMap.put(description, count + 1);
-        }
-
-        private void removeFromDescriptionsMap(String description) {
-            if (!mItemDescriptionMap.containsKey(description)) {
-                return;
-            }
-            int count = mItemDescriptionMap.get(description);
-            if (count == 1) {
-                mItemDescriptionMap.remove(description);
-            } else {
-                mItemDescriptionMap.put(description, count - 1);
-            }
-        }
-    }
-
     private Activity mActivity;
 
     // The dialog this class encapsulates.
@@ -438,7 +122,7 @@
     private ItemChooserLabels mLabels;
 
     // The adapter containing the items to show in the dialog.
-    private ItemAdapter mItemAdapter;
+    private DeviceItemAdapter mItemAdapter;
 
     // How much of the height of the screen should be taken up by the listview.
     private static final float LISTVIEW_HEIGHT_PERCENT = 0.30f;
@@ -492,8 +176,9 @@
             mDialog.dismiss();
         });
 
-        mItemAdapter = new ItemAdapter(mActivity, R.layout.item_chooser_dialog_row);
+        mItemAdapter = new DeviceItemAdapter(mActivity, R.layout.item_chooser_dialog_row);
         mItemAdapter.setNotifyOnChange(true);
+        mItemAdapter.setObserver(this);
         mListView.setAdapter(mItemAdapter);
         mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
         mListView.setEmptyView(mEmptyMessage);
@@ -519,6 +204,12 @@
                 });
     }
 
+    // DeviceItemAdapter.Observer:
+    @Override
+    public void onItemSelectionChanged(boolean itemSelected) {
+        mConfirmButton.setEnabled(itemSelected);
+    }
+
     /**
      * Sets whether the window should be closed when it loses focus.
      *
@@ -694,7 +385,7 @@
      * Returns the ItemAdapter associated with this class. For use with tests only.
      */
     @VisibleForTesting
-    public ItemAdapter getItemAdapterForTesting() {
+    public DeviceItemAdapter getItemAdapterForTesting() {
         return mItemAdapter;
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java
index b833abe..36bd18c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java
@@ -25,6 +25,7 @@
 import android.graphics.drawable.Icon;
 import android.net.Uri;
 import android.os.Build;
+import android.support.annotation.Nullable;
 import android.text.TextUtils;
 import android.util.Base64;
 
@@ -39,6 +40,8 @@
 import org.chromium.base.task.AsyncTask;
 import org.chromium.blink_public.platform.WebDisplayMode;
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.tab.TabThemeColorHelper;
 import org.chromium.chrome.browser.util.FeatureUtilities;
 import org.chromium.chrome.browser.webapps.WebApkInfo;
 import org.chromium.chrome.browser.webapps.WebappActivity;
@@ -48,6 +51,7 @@
 import org.chromium.chrome.browser.webapps.WebappRegistry;
 import org.chromium.chrome.browser.widget.RoundedIconGenerator;
 import org.chromium.content_public.common.ScreenOrientationConstants;
+import org.chromium.content_public.common.ScreenOrientationValues;
 import org.chromium.ui.widget.Toast;
 import org.chromium.webapk.lib.client.WebApkValidator;
 
@@ -189,20 +193,30 @@
             final String userTitle, final String name, final String shortName, final String iconUrl,
             final Bitmap icon, boolean isIconAdaptive, @WebDisplayMode final int displayMode,
             final int orientation, final int source, final long themeColor,
-            final long backgroundColor, final long callbackPointer) {
+            final long backgroundColor, final long callbackPointer,
+            final boolean isShortcutAsWebapp) {
         new AsyncTask<Intent>() {
             @Override
             protected Intent doInBackground() {
                 // Encoding {@link icon} as a string and computing the mac are expensive.
 
+                // Shortcuts as Webapps on O+ launch into a non-exported component for verification.
+                boolean usesMacForVerification =
+                        !isShortcutAsWebapp || Build.VERSION.SDK_INT < Build.VERSION_CODES.O;
+
                 // Encode the icon as a base64 string (Launcher drops Bitmaps in the Intent).
                 String encodedIcon = encodeBitmapAsString(icon);
 
-                Intent shortcutIntent = createWebappShortcutIntent(id,
-                        sDelegate.getFullscreenAction(), url, scopeUrl, name, shortName,
-                        encodedIcon, WEBAPP_SHORTCUT_VERSION, displayMode, orientation, themeColor,
-                        backgroundColor, iconUrl.isEmpty(), isIconAdaptive);
-                shortcutIntent.putExtra(EXTRA_MAC, getEncodedMac(url));
+                String action = usesMacForVerification
+                        ? sDelegate.getFullscreenAction()
+                        : WebappLauncherActivity.ACTION_START_SECURE_WEBAPP;
+                Intent shortcutIntent = createWebappShortcutIntent(id, action, url, scopeUrl, name,
+                        shortName, encodedIcon, WEBAPP_SHORTCUT_VERSION, displayMode, orientation,
+                        themeColor, backgroundColor, iconUrl.isEmpty(), isIconAdaptive);
+
+                if (usesMacForVerification) {
+                    shortcutIntent.putExtra(EXTRA_MAC, getEncodedMac(url));
+                }
                 shortcutIntent.putExtra(EXTRA_SOURCE, source);
                 return shortcutIntent;
             }
@@ -213,11 +227,10 @@
                 // Store the webapp data so that it is accessible without the intent. Once this
                 // process is complete, call back to native code to start the splash image
                 // download.
-                WebappRegistry.getInstance().register(
-                        id, storage -> {
-                            storage.updateFromShortcutIntent(resultIntent);
-                            nativeOnWebappDataStored(callbackPointer);
-                        });
+                WebappRegistry.getInstance().register(id, storage -> {
+                    storage.updateFromShortcutIntent(resultIntent);
+                    if (callbackPointer != 0) nativeOnWebappDataStored(callbackPointer);
+                });
                 if (shouldShowToastWhenAddingShortcut()) {
                     showAddedToHomescreenToast(userTitle);
                 }
@@ -231,13 +244,23 @@
      */
     @SuppressWarnings("unused")
     @CalledByNative
-    public static void addShortcut(String id, String url, String userTitle, Bitmap icon,
-            boolean isIconAdaptive, int source) {
-        Context context = ContextUtils.getApplicationContext();
-        final Intent shortcutIntent = createShortcutIntent(url);
+    public static void addShortcut(@Nullable Tab tab, String id, String url, String userTitle,
+            Bitmap icon, boolean isIconAdaptive, int source, String iconUrl) {
+        if (FeatureUtilities.isNoTouchModeEnabled()) {
+            // There are no tabs in NoTouchMode, so we want to give shortcuts a more app-like
+            // experience.
+            long themeColor = (tab == null) ? MANIFEST_COLOR_INVALID_OR_MISSING
+                                            : TabThemeColorHelper.getColor(tab);
+            addWebapp(id, url, getScopeFromUrl(url), userTitle, userTitle, userTitle, iconUrl, icon,
+                    isIconAdaptive, WebDisplayMode.STANDALONE, ScreenOrientationValues.DEFAULT,
+                    source, themeColor, MANIFEST_COLOR_INVALID_OR_MISSING, 0 /* callbackPointer */,
+                    true /* isShortcutAsWebapp */);
+            return;
+        }
+        Intent shortcutIntent = createShortcutIntent(url);
         shortcutIntent.putExtra(EXTRA_ID, id);
         shortcutIntent.putExtra(EXTRA_SOURCE, source);
-        shortcutIntent.setPackage(context.getPackageName());
+        shortcutIntent.setPackage(ContextUtils.getApplicationContext().getPackageName());
         sDelegate.addShortcutToHomescreen(userTitle, icon, isIconAdaptive, shortcutIntent);
         if (shouldShowToastWhenAddingShortcut()) {
             showAddedToHomescreenToast(userTitle);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java
index 2db50e66..9c1dc5c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java
@@ -17,6 +17,7 @@
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ResourceId;
+import org.chromium.chrome.browser.util.FeatureUtilities;
 import org.chromium.components.autofill.AutofillDelegate;
 import org.chromium.components.autofill.AutofillPopup;
 import org.chromium.components.autofill.AutofillSuggestion;
@@ -40,7 +41,8 @@
             WindowAndroid windowAndroid) {
         mNativeAutofillPopup = nativeAutofillPopupViewAndroid;
         Activity activity = windowAndroid.getActivity().get();
-        if (activity == null || notEnoughScreenSpace(activity)) {
+        if (activity == null || notEnoughScreenSpace(activity)
+                || FeatureUtilities.isNoTouchModeEnabled()) {
             mAutofillPopup = null;
             mContext = null;
         } else {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
index e8c20047..78e3f058 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
@@ -493,7 +493,7 @@
             mInsetObserverView = null;
         }
         if (mContentCaptureConsumer != null) {
-            mContentCaptureConsumer.destroy();
+            mContentCaptureConsumer.onWebContentsChanged(null);
             mContentCaptureConsumer = null;
         }
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderCoordinator.java
index b9ed6bb..2692cda9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderCoordinator.java
@@ -31,8 +31,7 @@
     RevampedContextMenuHeaderCoordinator(Activity activity, ContextMenuParams params) {
         mContext = activity;
         mModel = buildModel(getTitle(params), getUrl(activity, params));
-        mMediator = new RevampedContextMenuHeaderMediator(
-                activity, mModel, params.getUrl(), params.isImage());
+        mMediator = new RevampedContextMenuHeaderMediator(activity, mModel, params);
     }
 
     private PropertyModel buildModel(String title, CharSequence url) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderMediator.java
index 684d77e7..04f2bb1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderMediator.java
@@ -33,13 +33,13 @@
     private String mPlainUrl;
 
     RevampedContextMenuHeaderMediator(
-            Context context, PropertyModel model, String plainUrl, boolean isImage) {
+            Context context, PropertyModel model, ContextMenuParams params) {
         mContext = context;
-        mPlainUrl = plainUrl;
+        mPlainUrl = params.getUrl();
         mModel = model;
         mModel.set(RevampedContextMenuHeaderProperties.URL_CLICK_LISTENER, this);
 
-        if (!isImage) {
+        if (!params.isImage() && !params.isVideo()) {
             LargeIconBridge iconBridge = new LargeIconBridge(Profile.getLastUsedProfile());
             iconBridge.getLargeIconForUrl(mPlainUrl,
                     context.getResources().getDimensionPixelSize(R.dimen.default_favicon_min_size),
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/glue/DownloadGlue.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/glue/DownloadGlue.java
index 28a0c6f..b178b9e74 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/glue/DownloadGlue.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/glue/DownloadGlue.java
@@ -4,11 +4,11 @@
 
 package org.chromium.chrome.browser.download.home.glue;
 
+import android.os.Handler;
 import android.text.TextUtils;
 
 import org.chromium.base.Callback;
 import org.chromium.base.CollectionUtil;
-import org.chromium.base.task.PostTask;
 import org.chromium.chrome.browser.download.DownloadInfo;
 import org.chromium.chrome.browser.download.DownloadItem;
 import org.chromium.chrome.browser.download.DownloadManagerService;
@@ -22,7 +22,6 @@
 import org.chromium.components.offline_items_collection.OfflineItemShareInfo;
 import org.chromium.components.offline_items_collection.ShareCallback;
 import org.chromium.components.offline_items_collection.VisualsCallback;
-import org.chromium.content_public.browser.UiThreadTaskTraits;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -66,13 +65,7 @@
     @Override
     public void onDownloadItemUpdated(DownloadItem item) {
         if (!canShowDownloadItem(item)) return;
-
-        OfflineItem offlineItem = DownloadItem.createOfflineItem(item);
-        mDelegate.onItemUpdated(offlineItem, null);
-
-        if (offlineItem.externallyRemoved) {
-            PostTask.postTask(UiThreadTaskTraits.DEFAULT, () -> removeItem(offlineItem));
-        }
+        mDelegate.onItemUpdated(DownloadItem.createOfflineItem(item), null);
     }
 
     /** @see OfflineContentProvider.Observer#onItemRemoved(ContentId) */
@@ -153,7 +146,7 @@
     /** @see OfflineContentProvider#getItemById(ContentId, Callback) */
     public void getItemById(ContentId id, Callback<OfflineItem> callback) {
         assert false : "Not supported.";
-        PostTask.postTask(UiThreadTaskTraits.DEFAULT, () -> callback.onResult(null));
+        new Handler().post(() -> callback.onResult(null));
     }
 
     /** @see OfflineContentProvider#getAllItems(Callback) */
@@ -168,15 +161,14 @@
 
     /** @see OfflineContentProvider#getVisualsForItem(ContentId, VisualsCallback) */
     public void getVisualsForItem(ContentId id, VisualsCallback callback) {
-        PostTask.postTask(UiThreadTaskTraits.DEFAULT, () -> callback.onVisualsAvailable(id, null));
+        new Handler().post(() -> callback.onVisualsAvailable(id, null));
     }
 
     /** @see OfflineContentProvider#getShareInfoForItem(ContentId, ShareCallback) */
     public void getShareInfoForItem(OfflineItem item, ShareCallback callback) {
         OfflineItemShareInfo info = new OfflineItemShareInfo();
         info.uri = DownloadUtils.getUriForItem(item.filePath);
-        PostTask.postTask(
-                UiThreadTaskTraits.DEFAULT, () -> callback.onShareInfoAvailable(item.id, info));
+        new Handler().post(() -> callback.onShareInfoAvailable(item.id, info));
     }
 
     /** @see OfflineContentProvider#renameItem(ContentId, String, Callback)*/
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/service/DownloadBackgroundTask.java b/chrome/android/java/src/org/chromium/chrome/browser/download/service/DownloadBackgroundTask.java
index d62d652..e369ce8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/service/DownloadBackgroundTask.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/service/DownloadBackgroundTask.java
@@ -10,6 +10,7 @@
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.library_loader.LibraryProcessType;
 import org.chromium.chrome.browser.background_task_scheduler.NativeBackgroundTask;
+import org.chromium.chrome.browser.profiles.ProfileKey;
 import org.chromium.chrome.browser.util.FeatureUtilities;
 import org.chromium.components.background_task_scheduler.TaskParameters;
 import org.chromium.components.download.DownloadTaskType;
@@ -58,8 +59,9 @@
         assert BrowserStartupController.get(LibraryProcessType.PROCESS_BROWSER)
                         .isStartupSuccessfullyCompleted()
                 || mStartsServiceManagerOnly;
+        ProfileKey key = ProfileKey.getLastUsedProfileKey().getOriginalKey();
         nativeStartBackgroundTask(
-                mCurrentTaskType, needsReschedule -> callback.taskFinished(needsReschedule));
+                key, mCurrentTaskType, needsReschedule -> callback.taskFinished(needsReschedule));
     }
 
     @Override
@@ -76,8 +78,8 @@
     protected boolean onStopTaskWithNative(Context context, TaskParameters taskParameters) {
         @DownloadTaskType
         int taskType = taskParameters.getExtras().getInt(DownloadTaskScheduler.EXTRA_TASK_TYPE);
-
-        return nativeStopBackgroundTask(taskType);
+        ProfileKey key = ProfileKey.getLastUsedProfileKey().getOriginalKey();
+        return nativeStopBackgroundTask(key, taskType);
     }
 
     @Override
@@ -85,6 +87,7 @@
         DownloadTaskScheduler.rescheduleAllTasks();
     }
 
-    private native void nativeStartBackgroundTask(int taskType, Callback<Boolean> callback);
-    private native boolean nativeStopBackgroundTask(int taskType);
+    private native void nativeStartBackgroundTask(
+            ProfileKey key, int taskType, Callback<Boolean> callback);
+    private native boolean nativeStopBackgroundTask(ProfileKey key, int taskType);
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/NativeStartupBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/init/NativeStartupBridge.java
index dda29fe..d1e012d2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/NativeStartupBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/NativeStartupBridge.java
@@ -39,16 +39,4 @@
             }
         });
     }
-
-    @CalledByNative
-    private static void handlePostNativeStartupSynchronously() {
-        final BrowserParts parts = new EmptyBrowserParts() {};
-        try {
-            ChromeBrowserInitializer.getInstance().handlePostNativeStartup(
-                    /*isAsync=*/false, parts);
-        } catch (ProcessInitException e) {
-            Log.e(TAG, "Cannot handlePostNativeStartup synchronously.", e);
-            System.exit(-1);
-        }
-    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/jsdialog/JavascriptModalDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/jsdialog/JavascriptModalDialog.java
index abe927a..7a668a9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/jsdialog/JavascriptModalDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/jsdialog/JavascriptModalDialog.java
@@ -75,7 +75,6 @@
                                    .with(ModalDialogProperties.TITLE, mTitle)
                                    .with(ModalDialogProperties.CUSTOM_VIEW, mDialogCustomView)
                                    .with(ModalDialogProperties.CONTROLLER, this)
-                                   .with(ModalDialogProperties.FILTER_TOUCH_FOR_SECURITY, true)
                                    .with(ModalDialogProperties.CONTENT_DESCRIPTION, mMessage)
                                    .build();
             mDialogModel.set(TouchlessDialogProperties.ALT_ACTION,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/native_page/ContextMenuManager.java b/chrome/android/java/src/org/chromium/chrome/browser/native_page/ContextMenuManager.java
index 373f5e0..78c4455 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/native_page/ContextMenuManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/native_page/ContextMenuManager.java
@@ -30,24 +30,25 @@
  * {@link Delegate#isItemSupported(int)}.
  */
 public class ContextMenuManager implements OnCloseContextMenuListener {
-    @IntDef({ContextMenuItemId.OPEN_IN_NEW_TAB, ContextMenuItemId.OPEN_IN_INCOGNITO_TAB,
-            ContextMenuItemId.OPEN_IN_NEW_WINDOW, ContextMenuItemId.SAVE_FOR_OFFLINE,
-            ContextMenuItemId.ADD_TO_MY_APPS, ContextMenuItemId.REMOVE,
-            ContextMenuItemId.LEARN_MORE})
+    @IntDef({ContextMenuItemId.SEARCH, ContextMenuItemId.OPEN_IN_NEW_TAB,
+            ContextMenuItemId.OPEN_IN_INCOGNITO_TAB, ContextMenuItemId.OPEN_IN_NEW_WINDOW,
+            ContextMenuItemId.SAVE_FOR_OFFLINE, ContextMenuItemId.ADD_TO_MY_APPS,
+            ContextMenuItemId.REMOVE, ContextMenuItemId.LEARN_MORE})
     @Retention(RetentionPolicy.SOURCE)
     public @interface ContextMenuItemId {
         // The order of the items will be based on the value of their ID. So if new items are added,
         // the value of the existing ones should be modified so they stay in order.
         // Values are also used for indexing - should start from 0 and can't have gaps.
-        int OPEN_IN_NEW_TAB = 0;
-        int OPEN_IN_INCOGNITO_TAB = 1;
-        int OPEN_IN_NEW_WINDOW = 2;
-        int SAVE_FOR_OFFLINE = 3;
-        int ADD_TO_MY_APPS = 4;
-        int REMOVE = 5;
-        int LEARN_MORE = 6;
+        int SEARCH = 0;
+        int OPEN_IN_NEW_TAB = 1;
+        int OPEN_IN_INCOGNITO_TAB = 2;
+        int OPEN_IN_NEW_WINDOW = 3;
+        int SAVE_FOR_OFFLINE = 4;
+        int ADD_TO_MY_APPS = 5;
+        int REMOVE = 6;
+        int LEARN_MORE = 7;
 
-        int NUM_ENTRIES = 7;
+        int NUM_ENTRIES = 8;
     }
 
     private final NativePageNavigationDelegate mNavigationDelegate;
@@ -223,6 +224,8 @@
         if (!delegate.isItemSupported(itemId)) return false;
 
         switch (itemId) {
+            case ContextMenuItemId.SEARCH:
+                return false;
             case ContextMenuItemId.OPEN_IN_NEW_TAB:
                 return true;
             case ContextMenuItemId.OPEN_IN_INCOGNITO_TAB:
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
index 1e5145e..af4fafb5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
@@ -690,17 +690,23 @@
      * @param tab The tab to be reloaded.
      */
     public static void reload(Tab tab) {
+        // Only the transition type with both RELOAD and FROM_ADDRESS_BAR set will force the
+        // navigation to be treated as reload (see ShouldTreatNavigationAsReload()). Without this,
+        // reloading an URL containing a hash will be treated as same document load and thus
+        // no loading is triggered.
+        int transitionTypeForReload = PageTransition.RELOAD | PageTransition.FROM_ADDRESS_BAR;
+
         OfflinePageItem offlinePage = getOfflinePage(tab);
         if (isShowingTrustedOfflinePage(tab) || offlinePage == null) {
             // If current page is an offline page, reload it with custom behavior defined in extra
             // header respected.
-            LoadUrlParams params = new LoadUrlParams(tab.getOriginalUrl(), PageTransition.RELOAD);
+            LoadUrlParams params = new LoadUrlParams(tab.getOriginalUrl(), transitionTypeForReload);
             params.setVerbatimHeaders(getOfflinePageHeaderForReload(tab));
             tab.loadUrl(params);
             return;
         }
 
-        LoadUrlParams params = new LoadUrlParams(offlinePage.getUrl(), PageTransition.RELOAD);
+        LoadUrlParams params = new LoadUrlParams(offlinePage.getUrl(), transitionTypeForReload);
         tab.loadUrl(params);
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfiguration.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfiguration.java
index e1c8d59..b3113a84 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfiguration.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfiguration.java
@@ -6,6 +6,7 @@
 
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.chrome.browser.ChromeFeatureList;
+import org.chromium.chrome.browser.profiles.ProfileKey;
 
 /**
  * Allows the querying and setting of Offline Prefetch related configurations.
@@ -26,14 +27,14 @@
      * user setting to be true. If the current browser Profile is null this method returns false.
      */
     public static boolean isPrefetchingEnabled() {
-        return nativeIsPrefetchingEnabled();
+        return nativeIsPrefetchingEnabled(ProfileKey.getLastUsedProfileKey());
     }
 
     /**
      * Return the value of offline_pages.enabled_by_server pref.
      */
     public static boolean isPrefetchingEnabledByServer() {
-        return nativeIsEnabledByServer();
+        return nativeIsEnabledByServer(ProfileKey.getLastUsedProfileKey());
     }
 
     /**
@@ -42,14 +43,14 @@
      * since the last check.
      */
     public static boolean isForbiddenCheckDue() {
-        return nativeIsForbiddenCheckDue();
+        return nativeIsForbiddenCheckDue(ProfileKey.getLastUsedProfileKey());
     }
 
     /**
      * Returns true if the GeneratePageBundle-forbidden check has never run and is due to run.
      */
     public static boolean isEnabledByServerUnknown() {
-        return nativeIsEnabledByServerUnknown();
+        return nativeIsEnabledByServerUnknown(ProfileKey.getLastUsedProfileKey());
     }
 
     /**
@@ -57,7 +58,7 @@
      * enabled or disabled. If the current browser Profile is null the setting will not be changed.
      */
     public static void setPrefetchingEnabledInSettings(boolean enabled) {
-        nativeSetPrefetchingEnabledInSettings(enabled);
+        nativeSetPrefetchingEnabledInSettings(ProfileKey.getLastUsedProfileKey(), enabled);
     }
 
     /**
@@ -65,13 +66,14 @@
      * enabled or disabled.
      */
     public static boolean isPrefetchingEnabledInSettings() {
-        return nativeIsPrefetchingEnabledInSettings();
+        return nativeIsPrefetchingEnabledInSettings(ProfileKey.getLastUsedProfileKey());
     }
 
-    private static native boolean nativeIsPrefetchingEnabled();
-    private static native boolean nativeIsEnabledByServer();
-    private static native boolean nativeIsForbiddenCheckDue();
-    private static native boolean nativeIsEnabledByServerUnknown();
-    private static native void nativeSetPrefetchingEnabledInSettings(boolean enabled);
-    private static native boolean nativeIsPrefetchingEnabledInSettings();
+    private static native boolean nativeIsPrefetchingEnabled(ProfileKey key);
+    private static native boolean nativeIsEnabledByServer(ProfileKey key);
+    private static native boolean nativeIsForbiddenCheckDue(ProfileKey key);
+    private static native boolean nativeIsEnabledByServerUnknown(ProfileKey key);
+    private static native void nativeSetPrefetchingEnabledInSettings(
+            ProfileKey key, boolean enabled);
+    private static native boolean nativeIsPrefetchingEnabledInSettings(ProfileKey key);
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
index 74a09560..d36b7263 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
@@ -355,6 +355,9 @@
     /** The helper to create and fill the response to send to the merchant. */
     private PaymentResponseHelper mPaymentResponseHelper;
 
+    /** If not empty, use this error message for rejecting PaymentRequest.show(). */
+    private String mProhibitedOriginOrInvalidSslErrorMessage;
+
     /**
      * Builds the PaymentRequest service implementation.
      *
@@ -428,8 +431,11 @@
         mRequestPayerEmail = options != null && options.requestPayerEmail;
         mShippingType = options == null ? PaymentShippingType.SHIPPING : options.shippingType;
 
+        // TODO(crbug.com/978471): Improve architecture for handling prohibited origins and invalid
+        // SSL certificates.
         if (!UrlUtil.isOriginAllowedToUseWebPaymentApis(mWebContents.getLastCommittedUrl())) {
-            Log.d(TAG, ErrorStrings.PROHIBITED_ORIGIN);
+            mProhibitedOriginOrInvalidSslErrorMessage = ErrorStrings.PROHIBITED_ORIGIN;
+            Log.d(TAG, mProhibitedOriginOrInvalidSslErrorMessage);
             Log.d(TAG, ErrorStrings.PROHIBITED_ORIGIN_OR_INVALID_SSL_EXPLANATION);
             // Don't show any UI. Resolve .canMakePayment() with "false". Reject .show() with
             // "NotSupportedError".
@@ -440,14 +446,17 @@
         mJourneyLogger.setRequestedInformation(
                 mRequestShipping, mRequestPayerEmail, mRequestPayerPhone, mRequestPayerName);
 
-        if (OriginSecurityChecker.isSchemeCryptographic(mWebContents.getLastCommittedUrl())
-                && !SslValidityChecker.isSslCertificateValid(mWebContents)) {
-            Log.d(TAG, ErrorStrings.INVALID_SSL_CERTIFICATE);
-            Log.d(TAG, ErrorStrings.PROHIBITED_ORIGIN_OR_INVALID_SSL_EXPLANATION);
-            // Don't show any UI. Resolve .canMakePayment() with "false". Reject .show() with
-            // "NotSupportedError".
-            onAllPaymentAppsCreated();
-            return;
+        if (OriginSecurityChecker.isSchemeCryptographic(mWebContents.getLastCommittedUrl())) {
+            mProhibitedOriginOrInvalidSslErrorMessage =
+                    SslValidityChecker.getInvalidSslCertificateErrorMessage(mWebContents);
+            if (!TextUtils.isEmpty(mProhibitedOriginOrInvalidSslErrorMessage)) {
+                Log.d(TAG, mProhibitedOriginOrInvalidSslErrorMessage);
+                Log.d(TAG, ErrorStrings.PROHIBITED_ORIGIN_OR_INVALID_SSL_EXPLANATION);
+                // Don't show any UI. Resolve .canMakePayment() with "false". Reject .show() with
+                // "NotSupportedError".
+                onAllPaymentAppsCreated();
+                return;
+            }
         }
 
         mMethodData = getValidatedMethodData(methodData, mCardEditor);
@@ -2046,11 +2055,20 @@
             mJourneyLogger.setNotShown(mArePaymentMethodsSupported
                             ? NotShownReason.NO_MATCHING_PAYMENT_METHOD
                             : NotShownReason.NO_SUPPORTED_PAYMENT_METHOD);
-            disconnectFromClientWithDebugMessage(mIsIncognito
-                            ? ErrorStrings.USER_CANCELLED
-                            : ErrorStrings.GENERIC_PAYMENT_METHOD_NOT_SUPPORTED_MESSAGE,
-                    mIsIncognito ? PaymentErrorReason.USER_CANCEL
-                                 : PaymentErrorReason.NOT_SUPPORTED);
+            if (!TextUtils.isEmpty(mProhibitedOriginOrInvalidSslErrorMessage)) {
+                // Chrome always refuses payments with invalid SSL and in prohibited origin types.
+                disconnectFromClientWithDebugMessage(mProhibitedOriginOrInvalidSslErrorMessage,
+                        PaymentErrorReason.NOT_SUPPORTED);
+            } else if (mIsIncognito) {
+                // If the user is in the incognito mode, hide the absence of their payment methods
+                // from the merchant site.
+                disconnectFromClientWithDebugMessage(
+                        ErrorStrings.USER_CANCELLED, PaymentErrorReason.USER_CANCEL);
+            } else {
+                disconnectFromClientWithDebugMessage(
+                        ErrorStrings.GENERIC_PAYMENT_METHOD_NOT_SUPPORTED_MESSAGE,
+                        PaymentErrorReason.NOT_SUPPORTED);
+            }
             if (sObserverForTest != null) sObserverForTest.onPaymentRequestServiceShowFailed();
             return true;
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/SslValidityChecker.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/SslValidityChecker.java
index 7d632377..76e7690 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/SslValidityChecker.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/SslValidityChecker.java
@@ -11,13 +11,19 @@
 @JNINamespace("payments")
 public class SslValidityChecker {
     /**
-     * Returns true for web contents with a valid SSL certificate.
+     *  Returns a developer-facing error message for invalid SSL certificate state or an empty
+     *  string when the SSL certificate is valid. Only EV_SECURE, SECURE, and
+     *  SECURE_WITH_POLICY_INSTALLED_CERT are considered valid for web payments, unless
+     *  --ignore-certificate-errors is specified on the command line.
      *
-     * @param webContents The web contents to check.
-     * @return Whether the web contents have a valid SSL certificate.
+     * @param webContents The web contents whose SSL certificate state will be used for the error
+     *                     message. Should not be null. A null |web_contents| parameter will return
+     *                     an "Invalid certificate" error message.
+     * @return A developer-facing error message about the SSL certificate state in the given web
+     *         contents or an empty string when the SSL certificate is valid.
      */
-    public static boolean isSslCertificateValid(WebContents webContents) {
-        return nativeIsSslCertificateValid(webContents);
+    public static String getInvalidSslCertificateErrorMessage(WebContents webContents) {
+        return nativeGetInvalidSslCertificateErrorMessage(webContents);
     }
 
     /**
@@ -32,6 +38,7 @@
 
     private SslValidityChecker() {}
 
-    private static native boolean nativeIsSslCertificateValid(WebContents webContents);
+    private static native String nativeGetInvalidSslCertificateErrorMessage(
+            WebContents webContents);
     private static native boolean nativeIsValidPageInPaymentHandlerWindow(WebContents webContents);
 }
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/TouchlessAddToHomescreenDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/TouchlessAddToHomescreenDialog.java
index f1dfdd5..ff19bcd 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/TouchlessAddToHomescreenDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/TouchlessAddToHomescreenDialog.java
@@ -13,12 +13,12 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ImageView;
-import android.widget.TextView;
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.touchless.dialog.TouchlessDialogProperties;
 import org.chromium.chrome.browser.touchless.dialog.TouchlessDialogProperties.DialogListItemProperties;
+import org.chromium.chrome.browser.widget.AlertDialogEditText;
 import org.chromium.ui.modaldialog.DialogDismissalCause;
 import org.chromium.ui.modaldialog.ModalDialogManager;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
@@ -102,8 +102,16 @@
                 .with(DialogListItemProperties.MULTI_CLICKABLE, false)
                 .with(DialogListItemProperties.CLICK_LISTENER,
                         (v) -> {
-                            if (TextUtils.isEmpty(title)) return;
-                            mDelegate.addToHomescreen(title);
+                            ViewGroup group =
+                                    (ViewGroup) mModel.get(ModalDialogProperties.CUSTOM_VIEW);
+                            String customTitle =
+                                    ((AlertDialogEditText) group.findViewById(R.id.app_title))
+                                            .getText()
+                                            .toString();
+                            if (TextUtils.isEmpty(customTitle)) customTitle = title;
+
+                            if (TextUtils.isEmpty(customTitle)) return;
+                            mDelegate.addToHomescreen(customTitle);
                             mDialogManager.dismissDialog(mModel, DialogDismissalCause.UNKNOWN);
                         })
                 .build();
@@ -118,11 +126,12 @@
 
         group.findViewById(R.id.spinny).setVisibility(View.GONE);
         group.findViewById(R.id.icon).setVisibility(View.VISIBLE);
-        group.findViewById(R.id.app_info).setVisibility(View.VISIBLE);
+        group.findViewById(R.id.app_title).setVisibility(View.VISIBLE);
 
         if (icon != null) ((ImageView) group.findViewById(R.id.icon)).setImageBitmap(icon);
-        if (title != null) ((TextView) group.findViewById(R.id.name)).setText(title);
-        if (origin != null) ((TextView) group.findViewById(R.id.origin)).setText(origin);
+        if (title != null) {
+            ((AlertDialogEditText) group.findViewById(R.id.app_title)).setText(title);
+        }
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java
index cb780c2f..8eddaf0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.webapps;
 
 import android.app.Activity;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
@@ -48,6 +49,11 @@
     public static final String ACTION_START_WEBAPP =
             "com.google.android.apps.chrome.webapps.WebappManager.ACTION_START_WEBAPP";
 
+    public static final String SECURE_WEBAPP_LAUNCHER =
+            "org.chromium.chrome.browser.webapps.SecureWebAppLauncher";
+    public static final String ACTION_START_SECURE_WEBAPP =
+            "org.chromium.chrome.browser.webapps.WebappManager.ACTION_START_SECURE_WEBAPP";
+
     /**
      * Delay in ms for relaunching WebAPK as a result of getting intent with extra
      * {@link WebApkConstants.EXTRA_RELAUNCH}. The delay was chosen arbirtarily and seems to
@@ -157,6 +163,12 @@
         // does not specify required values such as the uri.
         if (webappInfo == null) return false;
 
+        // The component is not exported and can only be launched by Chrome.
+        if (intent.getComponent().equals(new ComponentName(
+                    ContextUtils.getApplicationContext(), SECURE_WEBAPP_LAUNCHER))) {
+            return true;
+        }
+
         String webappUrl = webappInfo.uri().toString();
         String webappMac = IntentUtils.safeGetStringExtra(intent, ShortcutHelper.EXTRA_MAC);
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/BluetoothChooserDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/BluetoothChooserDialogTest.java
index ace91f6..82d414f1 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/BluetoothChooserDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/BluetoothChooserDialogTest.java
@@ -255,7 +255,7 @@
         Assert.assertEquals(View.VISIBLE, items.getVisibility());
         Assert.assertEquals(View.GONE, progress.getVisibility());
 
-        ItemChooserDialog.ItemAdapter itemAdapter =
+        DeviceItemAdapter itemAdapter =
                 mChooserDialog.mItemChooserDialog.getItemAdapterForTesting();
         Assert.assertTrue(itemAdapter.getItem(0).hasSameContents(
                 "id-1", "Name 1", null /* icon */, null /* iconDescription */));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ItemChooserDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ItemChooserDialogTest.java
index f5063d9..4ea6f4b2 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ItemChooserDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ItemChooserDialogTest.java
@@ -372,7 +372,7 @@
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             Dialog dialog = mChooserDialog.getDialogForTesting();
             Assert.assertTrue(dialog.isShowing());
-            ItemChooserDialog.ItemAdapter itemAdapter = mChooserDialog.getItemAdapterForTesting();
+            DeviceItemAdapter itemAdapter = mChooserDialog.getItemAdapterForTesting();
 
             {
                 // Add item 1 with icon.
@@ -406,7 +406,7 @@
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             Dialog dialog = mChooserDialog.getDialogForTesting();
             Assert.assertTrue(dialog.isShowing());
-            ItemChooserDialog.ItemAdapter itemAdapter = mChooserDialog.getItemAdapterForTesting();
+            DeviceItemAdapter itemAdapter = mChooserDialog.getItemAdapterForTesting();
 
             {
                 // Add item 1 to no icon.
@@ -440,7 +440,7 @@
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             Dialog dialog = mChooserDialog.getDialogForTesting();
             Assert.assertTrue(dialog.isShowing());
-            ItemChooserDialog.ItemAdapter itemAdapter = mChooserDialog.getItemAdapterForTesting();
+            DeviceItemAdapter itemAdapter = mChooserDialog.getItemAdapterForTesting();
 
             {
                 // Update item 1 with icon.
@@ -581,7 +581,7 @@
 
         selectItem(dialog, 1, "key1", true);
         TestThreadUtils.runOnUiThreadBlocking(() -> {
-            ItemChooserDialog.ItemAdapter itemAdapter = mChooserDialog.getItemAdapterForTesting();
+            DeviceItemAdapter itemAdapter = mChooserDialog.getItemAdapterForTesting();
             Assert.assertEquals("key1", itemAdapter.getSelectedItemKey());
             mChooserDialog.setEnabled("key1", false);
             // The selected item is disabled, so no item is selected.
@@ -665,7 +665,7 @@
         selectItem(dialog, 2, "key2", true);
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             final Button button = (Button) dialog.findViewById(R.id.positive);
-            ItemChooserDialog.ItemAdapter itemAdapter = mChooserDialog.getItemAdapterForTesting();
+            DeviceItemAdapter itemAdapter = mChooserDialog.getItemAdapterForTesting();
 
             Assert.assertTrue(button.isEnabled());
 
@@ -699,7 +699,7 @@
         selectItem(dialog, 2, "key2", true);
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             Button button = (Button) dialog.findViewById(R.id.positive);
-            ItemChooserDialog.ItemAdapter itemAdapter = mChooserDialog.getItemAdapterForTesting();
+            DeviceItemAdapter itemAdapter = mChooserDialog.getItemAdapterForTesting();
             Assert.assertTrue(button.isEnabled());
 
             // Remove the selected item.
@@ -723,7 +723,7 @@
             final ListView items = (ListView) dialog.findViewById(R.id.items);
             final Button button = (Button) dialog.findViewById(R.id.positive);
 
-            ItemChooserDialog.ItemAdapter itemAdapter = mChooserDialog.getItemAdapterForTesting();
+            DeviceItemAdapter itemAdapter = mChooserDialog.getItemAdapterForTesting();
             final String nonExistentKey = "key";
 
             // Initially the itemAdapter is empty.
@@ -775,7 +775,7 @@
             final ListView items = (ListView) dialog.findViewById(R.id.items);
             final Button button = (Button) dialog.findViewById(R.id.positive);
 
-            ItemChooserDialog.ItemAdapter itemAdapter = mChooserDialog.getItemAdapterForTesting();
+            DeviceItemAdapter itemAdapter = mChooserDialog.getItemAdapterForTesting();
             final String nonExistentKey = "key";
 
             // Initially the itemAdapter is empty.
@@ -842,7 +842,7 @@
             Dialog dialog = mChooserDialog.getDialogForTesting();
             Assert.assertTrue(dialog.isShowing());
 
-            ItemChooserDialog.ItemAdapter itemAdapter = mChooserDialog.getItemAdapterForTesting();
+            DeviceItemAdapter itemAdapter = mChooserDialog.getItemAdapterForTesting();
 
             // Add item 1.
             mChooserDialog.addOrUpdateItem("key1", "desc1");
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java
index 445f350f..11aa7109 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java
@@ -279,40 +279,6 @@
     @Test
     @SmallTest
     @Feature({"Webapps"})
-    public void testSmallSplashScreenAppears() throws Exception {
-        // Register a smaller icon for the splash screen.
-        Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
-        int thresholdSize = context.getResources().getDimensionPixelSize(
-                R.dimen.webapp_splash_image_size_threshold);
-        int size = context.getResources().getDimensionPixelSize(
-                R.dimen.webapp_splash_image_size_minimum);
-        Bitmap splashBitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
-        String bitmapString = ShortcutHelper.encodeBitmapAsString(splashBitmap);
-
-        TestFetchStorageCallback callback = new TestFetchStorageCallback();
-        WebappRegistry.getInstance().register(WebappActivityTestRule.WEBAPP_ID, callback);
-        callback.waitForCallback(0);
-        callback.getStorage().updateSplashScreenImage(bitmapString);
-
-        ViewGroup splashScreen = mActivityTestRule.startWebappActivityAndWaitForSplashScreen();
-        Assert.assertTrue(mActivityTestRule.isSplashScreenVisible());
-
-        // The icon is centered within a fixed-size area on the splash screen.
-        ImageView splashImage =
-                (ImageView) splashScreen.findViewById(R.id.webapp_splash_screen_icon);
-        Assert.assertEquals(thresholdSize, splashImage.getMeasuredWidth());
-        Assert.assertEquals(thresholdSize, splashImage.getMeasuredHeight());
-
-        // The web app name is anchored to the icon.
-        TextView splashText = (TextView) splashScreen.findViewById(R.id.webapp_splash_screen_name);
-        int[] rules = ((RelativeLayout.LayoutParams) splashText.getLayoutParams()).getRules();
-        Assert.assertEquals(0, rules[RelativeLayout.ALIGN_PARENT_BOTTOM]);
-        Assert.assertEquals(R.id.webapp_splash_screen_icon, rules[RelativeLayout.BELOW]);
-    }
-
-    @Test
-    @SmallTest
-    @Feature({"Webapps"})
     public void testSplashScreenWithoutImageAppears() throws Exception {
         // Register an image that's too small for the splash screen.
         Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/background_task_scheduler/NativeBackgroundTaskTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/background_task_scheduler/NativeBackgroundTaskTest.java
index 8c7def2..dd5d60a 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/background_task_scheduler/NativeBackgroundTaskTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/background_task_scheduler/NativeBackgroundTaskTest.java
@@ -88,8 +88,6 @@
         public void addStartupCompletedObserver(StartupCallback callback) {}
 
         @Override
-        public void initChromiumBrowserProcessForTests() {}
-        @Override
         public void setContentMainCallbackForTests(Runnable r) {}
 
         public void setIsStartupSuccessfullyCompleted(boolean flag) {
diff --git a/chrome/android/touchless/java/res/drawable/ic_check_circle.xml b/chrome/android/touchless/java/res/drawable/ic_check_circle.xml
new file mode 100644
index 0000000..796d6e0
--- /dev/null
+++ b/chrome/android/touchless/java/res/drawable/ic_check_circle.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2019 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file. -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:tools="http://schemas.android.com/tools"
+        tools:targetApi="21"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="@color/touchless_icon_color"
+        android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM10,14.2l-2.6,-2.6L6,13l4,4 8,-8 -1.4,-1.4z"/>
+</vector>
diff --git a/chrome/android/touchless/java/res/drawable/ic_search.xml b/chrome/android/touchless/java/res/drawable/ic_search.xml
new file mode 100644
index 0000000..e59e61d
--- /dev/null
+++ b/chrome/android/touchless/java/res/drawable/ic_search.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:tools="http://schemas.android.com/tools"
+        android:height="24dp"
+        android:viewportHeight="24"
+        android:viewportWidth="24"
+        android:width="24dp"
+        tools:ignore="NewApi">
+    <path
+        android:fillColor="@color/touchless_icon_color"
+        android:pathData="M20.49,19l-5.73,-5.73C15.53,12.2 16,10.91 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.41,0 2.7,-0.47 3.77,-1.24L19,20.49 20.49,19zM5,9.5C5,7.01 7.01,5 9.5,5S14,7.01 14,9.5 11.99,14 9.5,14 5,11.99 5,9.5z"/>
+</vector>
diff --git a/chrome/android/touchless/java/res/layout/touchless_dialog_view.xml b/chrome/android/touchless/java/res/layout/touchless_dialog_view.xml
index 2b1d343..d288cab 100644
--- a/chrome/android/touchless/java/res/layout/touchless_dialog_view.xml
+++ b/chrome/android/touchless/java/res/layout/touchless_dialog_view.xml
@@ -47,10 +47,12 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:paddingTop="8dp"
+        android:paddingBottom="12dp"
         android:paddingHorizontal="8dp"
         android:divider="@android:color/transparent"
         android:dividerHeight="8dp"
         android:layout_gravity="center"
+        android:clipToPadding="false"
         android:scrollbars="none" />
 
 </LinearLayout>
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsAdapter.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsAdapter.java
index 0bb5a1e6..eb2f5e04 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsAdapter.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsAdapter.java
@@ -180,6 +180,8 @@
                     (view)
                             -> mNavDelegate.navigateToSuggestionUrl(
                                     WindowOpenDisposition.CURRENT_TAB, UrlConstants.EXPLORE_URL));
+            ContextMenuManager.registerViewForTouchlessContextMenu(
+                    tile, new ContextMenuManager.EmptyDelegate());
         } else if (holder.getItemViewType() == ViewType.SUGGESTION_TYPE) {
             // If site suggestion, attach context menu handler; clicks navigate to site url.
             int itemCount = mModel.get(ITEM_COUNT_KEY);
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessAddToHomescreenManager.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessAddToHomescreenManager.java
index 8ff0687e..30a8adeb 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessAddToHomescreenManager.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessAddToHomescreenManager.java
@@ -4,9 +4,9 @@
 
 package org.chromium.chrome.browser.touchless;
 
-import android.app.Activity;
 import android.graphics.Bitmap;
 
+import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ShortcutHelper;
 import org.chromium.chrome.browser.webapps.AddToHomescreenDialog;
 import org.chromium.chrome.browser.webapps.TouchlessAddToHomescreenDialog;
@@ -16,14 +16,14 @@
  * Add to homescreen manager specifically for touchless devices.
  */
 class TouchlessAddToHomescreenManager implements AddToHomescreenDialog.Delegate {
-    private final Activity mActivity;
+    private final ChromeActivity mActivity;
     private final ModalDialogManager mDialogManager;
     private final String mUrl;
     private final String mTitle;
     private final Bitmap mIconBitmap;
 
-    public TouchlessAddToHomescreenManager(Activity activity, ModalDialogManager dialogManager,
-            String url, String title, Bitmap iconBitmap) {
+    public TouchlessAddToHomescreenManager(ChromeActivity activity,
+            ModalDialogManager dialogManager, String url, String title, Bitmap iconBitmap) {
         mActivity = activity;
         mDialogManager = dialogManager;
         mUrl = url;
@@ -42,7 +42,8 @@
 
     @Override
     public void addToHomescreen(String title) {
-        ShortcutHelper.addShortcut(mUrl, mUrl, title, mIconBitmap, false, 0);
+        ShortcutHelper.addShortcut(
+                mActivity.getActivityTab(), mUrl, mUrl, title, mIconBitmap, false, 0, "");
     }
 
     @Override
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessContextMenuManager.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessContextMenuManager.java
index c15d905..7abdcb9 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessContextMenuManager.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessContextMenuManager.java
@@ -4,14 +4,16 @@
 
 package org.chromium.chrome.browser.touchless;
 
-import android.app.Activity;
 import android.graphics.Bitmap;
 import android.support.annotation.DrawableRes;
 import android.support.annotation.StringRes;
 import android.view.View;
 import android.view.View.OnClickListener;
 
+import org.chromium.chrome.browser.AppHooks;
+import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.native_page.ContextMenuManager;
+import org.chromium.chrome.browser.native_page.ContextMenuManager.ContextMenuItemId;
 import org.chromium.chrome.browser.native_page.NativePageNavigationDelegate;
 import org.chromium.chrome.browser.touchless.dialog.TouchlessDialogProperties;
 import org.chromium.chrome.browser.touchless.dialog.TouchlessDialogProperties.ActionNames;
@@ -59,12 +61,12 @@
         }
     }
 
-    private final Activity mActivity;
+    private final ChromeActivity mActivity;
     private final ModalDialogManager mDialogManager;
     private PropertyModel mTouchlessMenuModel;
     private ModalDialogManager mModalDialogManager;
 
-    public TouchlessContextMenuManager(Activity activity, ModalDialogManager dialogManager,
+    public TouchlessContextMenuManager(ChromeActivity activity, ModalDialogManager dialogManager,
             NativePageNavigationDelegate navigationDelegate,
             TouchEnabledDelegate touchEnabledDelegate, Runnable closeContextMenuCallback,
             String userActionPrefix) {
@@ -105,6 +107,9 @@
 
     @Override
     protected @StringRes int getResourceIdForMenuItem(@ContextMenuItemId int id) {
+        if (id == ContextMenuItemId.SEARCH) {
+            return org.chromium.chrome.R.string.search_or_type_web_address;
+        }
         if (id == ContextMenuItemId.ADD_TO_MY_APPS) {
             return R.string.menu_add_to_apps;
         }
@@ -115,6 +120,10 @@
     @Override
     protected boolean handleMenuItemClick(
             @ContextMenuItemId int itemId, ContextMenuManager.Delegate delegate) {
+        if (itemId == ContextMenuItemId.SEARCH) {
+            AppHooks.get().onSearchContextMenuClick();
+            return true;
+        }
         if (itemId == ContextMenuItemId.ADD_TO_MY_APPS) {
             Delegate touchlessDelegate = (Delegate) delegate;
             TouchlessAddToHomescreenManager touchlessAddToHomescreenManager =
@@ -122,7 +131,7 @@
                             touchlessDelegate.getUrl(), touchlessDelegate.getTitle(),
                             touchlessDelegate.getIconBitmap());
             touchlessAddToHomescreenManager.start();
-            return false;
+            return true;
         }
         return super.handleMenuItemClick(itemId, delegate);
     }
@@ -132,6 +141,8 @@
             @ContextMenuItemId int itemId, ContextMenuManager.Delegate delegate) {
         // Here we filter out any item IDs that don't make sense in touchless.
         switch (itemId) {
+            case ContextMenuItemId.SEARCH:
+                return true;
             case ContextMenuItemId.REMOVE:
                 // fall through
             case ContextMenuItemId.LEARN_MORE:
@@ -202,6 +213,8 @@
      */
     private @DrawableRes int getIconIdForMenuItem(@ContextMenuItemId int itemId) {
         switch (itemId) {
+            case ContextMenuItemId.SEARCH:
+                return R.drawable.ic_search;
             case ContextMenuItemId.REMOVE:
                 return R.drawable.ic_remove_circle_outline_24dp;
             case ContextMenuItemId.LEARN_MORE:
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/dialog/TouchlessDialogPresenter.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/dialog/TouchlessDialogPresenter.java
index 8da79bd..5ed0af8c 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/dialog/TouchlessDialogPresenter.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/dialog/TouchlessDialogPresenter.java
@@ -180,10 +180,14 @@
         ChromeImageView imageView = view.findViewById(R.id.dialog_item_icon);
         TextView textView = view.findViewById(R.id.dialog_item_text);
         if (DialogListItemProperties.ICON == propertyKey) {
-            imageView.setVisibility(View.VISIBLE);
-            Drawable icon = model.get(DialogListItemProperties.ICON).mutate();
-            icon.clearColorFilter();
-            imageView.setImageDrawable(icon);
+            if (model.get(DialogListItemProperties.ICON) == null) {
+                imageView.setImageDrawable(null);
+            } else {
+                imageView.setVisibility(View.VISIBLE);
+                Drawable icon = model.get(DialogListItemProperties.ICON).mutate();
+                icon.clearColorFilter();
+                imageView.setImageDrawable(icon);
+            }
         } else if (DialogListItemProperties.TEXT == propertyKey) {
             textView.setText(model.get(DialogListItemProperties.TEXT));
         } else if (DialogListItemProperties.CLICK_LISTENER == propertyKey) {
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/permissions/TouchlessPermissionDialogModel.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/permissions/TouchlessPermissionDialogModel.java
index 0a4173cc..32c98f3c 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/permissions/TouchlessPermissionDialogModel.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/permissions/TouchlessPermissionDialogModel.java
@@ -50,7 +50,6 @@
                         .with(ModalDialogProperties.TITLE, delegate.getTitleText())
                         .with(ModalDialogProperties.TITLE_ICON, icon)
                         .with(ModalDialogProperties.CONTROLLER, controller)
-                        .with(ModalDialogProperties.FILTER_TOUCH_FOR_SECURITY, true)
                         .with(ModalDialogProperties.CONTENT_DESCRIPTION, delegate.getMessageText())
                         .build();
 
diff --git a/chrome/android/webapk/libs/common/res_splash/layout/webapp_splash_screen_small.xml b/chrome/android/webapk/libs/common/res_splash/layout/webapp_splash_screen_small.xml
deleted file mode 100644
index 9d3cb220..0000000
--- a/chrome/android/webapk/libs/common/res_splash/layout/webapp_splash_screen_small.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 The Chromium Authors. All rights reserved.
-
-     Use of this source code is governed by a BSD-style license that can be
-     found in the LICENSE file.
--->
-
-<!-- The spec offsets the center of the ImageView from the center of the screen by either 16 or
-     24dp, depending on the device type.  That's implemented here by adding a bottom margin of twice
-     that amount to the RelativeLayout, which effectively moves its center upward by the desired dp.
- -->
-<RelativeLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/webapp_splash_screen_layout"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:layout_marginBottom="@dimen/webapp_splash_offset" >
-
-    <ImageView
-        android:id="@+id/webapp_splash_screen_icon"
-        android:layout_width="@dimen/webapp_splash_small_image_size"
-        android:layout_height="@dimen/webapp_splash_small_image_size"
-        android:layout_centerInParent="true"
-        android:scaleType="center"
-        tools:ignore="ContentDescription" />
-
-    <TextView
-        android:id="@+id/webapp_splash_screen_name"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_below="@id/webapp_splash_screen_icon"
-        android:layout_centerHorizontal="true"
-        android:layout_marginTop="@dimen/webapp_splash_small_title_margin_top"
-        style="@style/WebappSplashScreenTextTheme" />
-
-</RelativeLayout>
diff --git a/chrome/android/webapk/libs/common/res_splash/values-sw600dp/common_dimens.xml b/chrome/android/webapk/libs/common/res_splash/values-sw600dp/common_dimens.xml
index 1fa4a23..e0b278d70 100644
--- a/chrome/android/webapk/libs/common/res_splash/values-sw600dp/common_dimens.xml
+++ b/chrome/android/webapk/libs/common/res_splash/values-sw600dp/common_dimens.xml
@@ -6,4 +6,5 @@
 <resources>
     <dimen name="webapp_splash_offset">48dp</dimen>
     <dimen name="webapp_splash_large_title_margin_bottom">8dp</dimen>
+    <dimen name="webapp_splash_image_size_minimum">48dp</dimen>
 </resources>
diff --git a/chrome/android/webapk/libs/common/res_splash/values/common_dimens.xml b/chrome/android/webapk/libs/common/res_splash/values/common_dimens.xml
index fdcb563..ead441c2 100644
--- a/chrome/android/webapk/libs/common/res_splash/values/common_dimens.xml
+++ b/chrome/android/webapk/libs/common/res_splash/values/common_dimens.xml
@@ -7,9 +7,7 @@
     <dimen name="webapp_splash_offset">32dp</dimen>
     <dimen name="webapp_splash_image_size_ideal">128dp</dimen>
     <dimen name="webapp_splash_image_size_threshold">80dp</dimen>
-    <dimen name="webapp_splash_image_size_minimum">48dp</dimen>
+    <dimen name="webapp_splash_image_size_minimum">16dp</dimen>
 
-    <dimen name="webapp_splash_small_image_size">80dp</dimen>
-    <dimen name="webapp_splash_small_title_margin_top">32dp</dimen>
     <dimen name="webapp_splash_large_title_margin_bottom">16dp</dimen>
 </resources>
diff --git a/chrome/android/webapk/libs/common/src/org/chromium/webapk/lib/common/splash/SplashLayout.java b/chrome/android/webapk/libs/common/src/org/chromium/webapk/lib/common/splash/SplashLayout.java
index 0fc21f2..69031fe 100644
--- a/chrome/android/webapk/libs/common/src/org/chromium/webapk/lib/common/splash/SplashLayout.java
+++ b/chrome/android/webapk/libs/common/src/org/chromium/webapk/lib/common/splash/SplashLayout.java
@@ -68,7 +68,6 @@
             case IconClassification.INVALID:
                 return R.layout.webapp_splash_screen_no_icon;
             case IconClassification.SMALL:
-                return R.layout.webapp_splash_screen_small;
             case IconClassification.LARGE:
             default:
                 return R.layout.webapp_splash_screen_large;
diff --git a/chrome/android/webapk/shell_apk/current_version/current_version.gni b/chrome/android/webapk/shell_apk/current_version/current_version.gni
index fe83047..c3a202956 100644
--- a/chrome/android/webapk/shell_apk/current_version/current_version.gni
+++ b/chrome/android/webapk/shell_apk/current_version/current_version.gni
@@ -12,4 +12,4 @@
 # //chrome/android/webapk/shell_apk:webapk is changed. This includes
 # Java files, Android resource files and AndroidManifest.xml. Does not affect
 # Chrome.apk
-current_shell_apk_version = 96
+current_shell_apk_version = 97
diff --git a/chrome/app/BUILD.gn b/chrome/app/BUILD.gn
index e09d899..3099bceb 100644
--- a/chrome/app/BUILD.gn
+++ b/chrome/app/BUILD.gn
@@ -395,7 +395,7 @@
     ]
   }
 
-  if (enable_gwp_asan_malloc || enable_gwp_asan_partitionalloc) {
+  if (enable_gwp_asan) {
     deps += [ "//components/gwp_asan/client" ]
   }
 }
diff --git a/chrome/app/chrome_main_delegate.cc b/chrome/app/chrome_main_delegate.cc
index 7edc2a2..0dc8e1e 100644
--- a/chrome/app/chrome_main_delegate.cc
+++ b/chrome/app/chrome_main_delegate.cc
@@ -88,7 +88,6 @@
 #include "chrome/browser/chrome_browser_application_mac.h"
 #include "chrome/browser/mac/relauncher.h"
 #include "chrome/browser/shell_integration.h"
-#include "chrome/common/mac/cfbundle_blocker.h"
 #include "components/crash/core/common/objc_zombie.h"
 #include "ui/base/l10n/l10n_util_mac.h"
 #endif
@@ -167,8 +166,7 @@
 #include "chrome/child/pdf_child_init.h"
 #endif
 
-#if BUILDFLAG(ENABLE_GWP_ASAN_MALLOC) || \
-    BUILDFLAG(ENABLE_GWP_ASAN_PARTITIONALLOC)
+#if BUILDFLAG(ENABLE_GWP_ASAN)
 #include "components/gwp_asan/client/gwp_asan.h"  // nogncheck
 #endif
 
@@ -631,8 +629,6 @@
   // there have more impact.
   const bool is_browser = !command_line.HasSwitch(switches::kProcessType);
   ObjcEvilDoers::ZombieEnable(true, is_browser ? 10000 : 1000);
-
-  chrome::common::mac::EnableCFBundleBlocker();
 #endif
 
   content::Profiling::ProcessStarted();
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index fda5c2f..bf8d9315 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -5076,4 +5076,43 @@
   <message name="IDS_SETTINGS_SECURITY_KEYS_HIDE_PINS" desc="A tool-tip message that is shown to describe the action of an icon in the dialog where users set or enter PINs for security keys. This message indicates to the user that clicking the icon will cause the PINs to be displayed like passwords: with the characters replaced by bullet points. (Security keys are external devices used to authenticate people and PINs are short, often numeric, codes that are commonly used with, for example, ATMs.)">
     Hide PINs
   </message>
+  <message name="IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_LABEL" desc="The label for a menu item that when clicked let's the user view and erase credentials on their security key (an authentication hardware device).">
+    Manage sign-in data
+  </message>
+  <message name="IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_DESC" desc="The description for a menu item that when clicked let's the user view and erase credentials on their security key (an authentication hardware device).">
+    View and erase the sign-in data stored on your security key
+  </message>
+  <message name="IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_DIALOG_TITLE" desc="The title of a dialog that lets users view and erase credentials on their security key (an authentication hardware device).">
+    Security key sign-in data
+  </message>
+  <message name="IDS_SETTINGS_SECURITY_KEYS_SAVED_CREDENTIALS_TITLE" desc="The heading of a table that lists credentials stored on a security key (an authentication hardware device).">">
+    Stored security key sign-in data
+  </message>
+  <message name="IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_WEBSITE" desc="A column heading of a table that lists credentials stored on a security key (an authentication hardware device). This column contains the domain name (e.g. google.com) for each credential.">
+    Website
+  </message>
+  <message name="IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_USERNAME" desc="A column heading of a table that lists credentials stored on a security key (an authentication hardware device). This column contains the user name (e.g. exampleuser@google.com) for each credential.">
+    Username
+  </message>
+  <message name="IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_TOUCH" desc="A label instructing the user to physically touch the activation button on their security key (an authentication hardware device).">
+    Insert and touch your security key to view its sign-in data.
+  </message>
+  <message name="IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_PIN_PROMPT" desc="A label instructing the user to enter the PIN (short, often numeric codes that are often used with, for example, ATM cards) for their security key (an authentication hardware device).">
+    Enter the PIN for your security key to view its sign-in data. If you don’t know the PIN, you’ll need to reset the security key.
+  </message>
+  <message name="IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_NO_CREDENTIALS" desc="An error message shown when a user attempts to view the credentials on their security key (an authentication hardware device) but no such credentials exist.">
+    This security key does not have any sign-in data stored.
+  </message>
+  <message name="IDS_SETTINGS_SECURITY_KEYS_NO_CREDENTIAL_MANAGEMENT" desc="An error message shown when a user attempts to view the credentials on their security key (an authentication hardware device) but the security key is not capable of storing credentials.">
+    This security key can't store any sign-in data.
+  </message>
+  <message name="IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_REMOVED" desc="An error message shown when a user attempts to view the credentials on their security key (an authentication hardware device), but the user removed the security key (by unplugging it from their USB port, for example).">
+    Your security key was removed.
+  </message>
+  <message name="IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_NO_PIN" desc="An error message shown when a user attempts to view the credentials on their security key (an authentication hardware device), but the user has not set up a PIN (short, often numeric codes that are often used with, for example, ATM cards) for that security key.">
+    Your security key is not protected with a PIN. Create a PIN first to manage sign-in data.
+  </message>
+  <message name="IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_ERROR" desc="An error message shown when a user attempts to view the credentials on their security key (an authentication hardware device), but an error with the device was encountered.">
+    Gathering sign-in data from your security key failed>
+  </message>
 </grit-part>
diff --git a/chrome/app/theme/theme_resources.grd b/chrome/app/theme/theme_resources.grd
index f494eaf9..38932794 100644
--- a/chrome/app/theme/theme_resources.grd
+++ b/chrome/app/theme/theme_resources.grd
@@ -184,33 +184,34 @@
         </if>
         <structure type="chrome_scaled_image" name="IDR_PRODUCT_LOGO_ENTERPRISE" file="google_chrome/product_logo_enterprise.png" />
       </if>
-
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_0" file="common/profile_avatar_generic.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_1" file="common/profile_avatar_generic_aqua.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_2" file="common/profile_avatar_generic_blue.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_3" file="common/profile_avatar_generic_green.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_4" file="common/profile_avatar_generic_orange.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_5" file="common/profile_avatar_generic_purple.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_6" file="common/profile_avatar_generic_red.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_7" file="common/profile_avatar_generic_yellow.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_8" file="common/profile_avatar_secret_agent.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_9" file="common/profile_avatar_superhero.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_10" file="common/profile_avatar_volley_ball.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_11" file="common/profile_avatar_businessman.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_12" file="common/profile_avatar_ninja.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_13" file="common/profile_avatar_alien.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_14" file="common/profile_avatar_awesome.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_15" file="common/profile_avatar_flower.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_16" file="common/profile_avatar_pizza.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_17" file="common/profile_avatar_soccer.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_18" file="common/profile_avatar_burger.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_19" file="common/profile_avatar_cat.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_20" file="common/profile_avatar_cupcake.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_21" file="common/profile_avatar_dog.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_22" file="common/profile_avatar_horse.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_23" file="common/profile_avatar_margarita.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_24" file="common/profile_avatar_note.png" />
-      <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_25" file="common/profile_avatar_sun_cloud.png" />
+      <if expr="not is_android">
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_0" file="common/profile_avatar_generic.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_1" file="common/profile_avatar_generic_aqua.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_2" file="common/profile_avatar_generic_blue.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_3" file="common/profile_avatar_generic_green.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_4" file="common/profile_avatar_generic_orange.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_5" file="common/profile_avatar_generic_purple.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_6" file="common/profile_avatar_generic_red.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_7" file="common/profile_avatar_generic_yellow.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_8" file="common/profile_avatar_secret_agent.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_9" file="common/profile_avatar_superhero.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_10" file="common/profile_avatar_volley_ball.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_11" file="common/profile_avatar_businessman.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_12" file="common/profile_avatar_ninja.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_13" file="common/profile_avatar_alien.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_14" file="common/profile_avatar_awesome.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_15" file="common/profile_avatar_flower.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_16" file="common/profile_avatar_pizza.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_17" file="common/profile_avatar_soccer.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_18" file="common/profile_avatar_burger.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_19" file="common/profile_avatar_cat.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_20" file="common/profile_avatar_cupcake.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_21" file="common/profile_avatar_dog.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_22" file="common/profile_avatar_horse.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_23" file="common/profile_avatar_margarita.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_24" file="common/profile_avatar_note.png" />
+        <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_25" file="common/profile_avatar_sun_cloud.png" />
+      </if>
       <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_26" file="common/profile_avatar_placeholder.png" />
       <if expr="not is_android and not chromeos">
         <structure type="chrome_scaled_image" name="IDR_PROFILE_AVATAR_27" file="common/modern_avatars/origami/avatar_cat.png" />
diff --git a/chrome/app/vr_strings.grdp b/chrome/app/vr_strings.grdp
index a6ba9729..5059a31 100644
--- a/chrome/app/vr_strings.grdp
+++ b/chrome/app/vr_strings.grdp
@@ -6,10 +6,6 @@
     Press App button to exit
   </message>
 
-  <message name="IDS_ISOLATED_XR_PROCESS_NAME" desc="The name of the utility process used for XR compositing.">
-    XR Isolated Device Service
-  </message>
-
   <!-- Powerful feature use and permission indicators. -->
   <message name="IDS_VR_SHELL_SITE_IS_TRACKING_LOCATION" desc="Text displayed in a transient bubble to inform the user that the page is tracking location.">
     Site is tracking your location
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index e0a915e..247b74b 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1314,6 +1314,8 @@
     "previews/previews_lite_page_url_loader_interceptor.h",
     "previews/previews_offline_helper.cc",
     "previews/previews_offline_helper.h",
+    "previews/previews_prober.cc",
+    "previews/previews_prober.h",
     "previews/previews_service.cc",
     "previews/previews_service.h",
     "previews/previews_service_factory.cc",
@@ -4918,7 +4920,10 @@
       "supervised_user/supervised_user_whitelist_service.h",
       "supervised_user/supervised_users.h",
     ]
-    deps += [ "//chrome/common:supervised_user_commands_mojom" ]
+    deps += [
+      "//chrome/browser/supervised_user/kids_chrome_management:proto",
+      "//chrome/common:supervised_user_commands_mojom",
+    ]
   }
   if (enable_supervised_users && !is_android) {
     sources += [
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 9933081..078c3aa 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -184,7 +184,7 @@
 #endif
 
 #if BUILDFLAG(ENABLE_PRINTING)
-#include "printing/printing_features.h"
+#include "printing/common/printing_features.h"
 #endif
 
 #if defined(USE_OZONE)
@@ -4002,6 +4002,12 @@
      flag_descriptions::kMouseSubframeNoImplicitCaptureDescription, kOsAll,
      FEATURE_VALUE_TYPE(features::kMouseSubframeNoImplicitCapture)},
 
+#if defined(OS_ANDROID)
+    {"touch-to-fill", flag_descriptions::kTouchToFillAndroidName,
+     flag_descriptions::kTouchToFillAndroidDescription, kOsAndroid,
+     FEATURE_VALUE_TYPE(password_manager::features::kTouchToFillAndroid)},
+#endif  // defined(OS_ANDROID)
+
     // NOTE: Adding a new flag requires adding a corresponding entry to enum
     // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag
     // Histograms" in tools/metrics/histograms/README.md (run the
diff --git a/chrome/browser/android/DEPS b/chrome/browser/android/DEPS
index b5da37d..314ece51 100644
--- a/chrome/browser/android/DEPS
+++ b/chrome/browser/android/DEPS
@@ -1,10 +1,10 @@
 include_rules = [
   "-components/devtools_bridge",
   "+cc/layers/layer.h",
-  "+chrome_jni_registration/chrome_jni_registration.h",
   "+chrome/android/test_support_jni_headers",
   "+chrome/lib/image_fetcher/public/android/jni_headers",
   "+chrome/lib/util/public/android/jni_headers",
+  "+chrome_jni_registration/chrome_jni_registration.h",
   "+device/vr/buildflags/buildflags.h",
   "+media/gpu",
   "+media/video",
diff --git a/chrome/browser/android/download/download_controller.cc b/chrome/browser/android/download/download_controller.cc
index 76b0fe0a..28eea4b0 100644
--- a/chrome/browser/android/download/download_controller.cc
+++ b/chrome/browser/android/download/download_controller.cc
@@ -393,7 +393,7 @@
   Profile* profile = Profile::FromBrowserContext(
       content::DownloadItemUtils::GetBrowserContext(download_item));
   ProfileKey* profile_key =
-      profile ? profile->GetProfileKey() : ::android::GetMainProfileKey();
+      profile ? profile->GetProfileKey() : ::android::GetLastUsedProfileKey();
 
   DownloadOfflineContentProviderFactory::GetForKey(profile_key)
       ->OnDownloadStarted(download_item);
diff --git a/chrome/browser/android/download/service/download_background_task.cc b/chrome/browser/android/download/service/download_background_task.cc
index 3b54f6b..4da6083 100644
--- a/chrome/browser/android/download/service/download_background_task.cc
+++ b/chrome/browser/android/download/service/download_background_task.cc
@@ -7,9 +7,9 @@
 #include "base/callback_forward.h"
 #include "chrome/android/chrome_jni_headers/DownloadBackgroundTask_jni.h"
 #include "chrome/browser/android/download/download_manager_service.h"
-#include "chrome/browser/android/profile_key_util.h"
 #include "chrome/browser/download/download_service_factory.h"
 #include "chrome/browser/profiles/profile_key.h"
+#include "chrome/browser/profiles/profile_key_android.h"
 #include "components/download/public/background_service/download_service.h"
 #include "components/download/public/common/auto_resumption_handler.h"
 #include "content/public/browser/browser_context.h"
@@ -19,10 +19,10 @@
 namespace download {
 namespace android {
 
-DownloadService* GetDownloadService() {
-  ProfileKey* profile_key = ::android::GetMainProfileKey();
-  DCHECK(profile_key);
-  return DownloadServiceFactory::GetForKey(profile_key);
+DownloadService* GetDownloadService(const JavaParamRef<jobject>& jkey) {
+  ProfileKey* key = ProfileKeyAndroid::FromProfileKeyAndroid(jkey);
+  DCHECK(key);
+  return DownloadServiceFactory::GetForKey(key);
 }
 
 AutoResumptionHandler* GetAutoResumptionHandler() {
@@ -34,9 +34,10 @@
 // static
 void JNI_DownloadBackgroundTask_StartBackgroundTask(
     JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& jcaller,
+    const JavaParamRef<jobject>& jcaller,
+    const JavaParamRef<jobject>& jkey,
     jint task_type,
-    const base::android::JavaParamRef<jobject>& jcallback) {
+    const JavaParamRef<jobject>& jcallback) {
   TaskFinishedCallback finish_callback =
       base::BindOnce(&base::android::RunBooleanCallbackAndroid,
                      base::android::ScopedJavaGlobalRef<jobject>(jcallback));
@@ -50,7 +51,7 @@
     case download::DownloadTaskType::DOWNLOAD_TASK:
       FALLTHROUGH;
     case download::DownloadTaskType::CLEANUP_TASK:
-      GetDownloadService()->OnStartScheduledTask(
+      GetDownloadService(jkey)->OnStartScheduledTask(
           static_cast<DownloadTaskType>(task_type), std::move(finish_callback));
       break;
   }
@@ -59,7 +60,8 @@
 // static
 jboolean JNI_DownloadBackgroundTask_StopBackgroundTask(
     JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& jcaller,
+    const JavaParamRef<jobject>& jcaller,
+    const JavaParamRef<jobject>& jkey,
     jint task_type) {
   switch (static_cast<DownloadTaskType>(task_type)) {
     case download::DownloadTaskType::DOWNLOAD_AUTO_RESUMPTION_TASK: {
@@ -69,7 +71,7 @@
     case download::DownloadTaskType::DOWNLOAD_TASK:
       FALLTHROUGH;
     case download::DownloadTaskType::CLEANUP_TASK:
-      return GetDownloadService()->OnStopScheduledTask(
+      return GetDownloadService(jkey)->OnStopScheduledTask(
           static_cast<DownloadTaskType>(task_type));
   }
   return false;
diff --git a/chrome/browser/android/profile_key_util.cc b/chrome/browser/android/profile_key_util.cc
index 963130e..30a8746 100644
--- a/chrome/browser/android/profile_key_util.cc
+++ b/chrome/browser/android/profile_key_util.cc
@@ -18,7 +18,7 @@
 
 }  // namespace
 
-ProfileKey* GetMainProfileKey() {
+ProfileKey* GetLastUsedProfileKey() {
   ProfileKey* key = ProfileKeyStartupAccessor::GetInstance()->profile_key();
   if (!key)
     key = GetProfile()->GetProfileKey();
diff --git a/chrome/browser/android/profile_key_util.h b/chrome/browser/android/profile_key_util.h
index 17c0226..3bc5f51 100644
--- a/chrome/browser/android/profile_key_util.h
+++ b/chrome/browser/android/profile_key_util.h
@@ -9,14 +9,15 @@
 
 namespace android {
 
-// This gets the profile key belonging to the main profile on android. This
-// works in both reduced mode and full browser mode.
+// This gets the profile key belonging to the last used profile on android, (or
+// the "main" one in reduced mode). This works in both reduced mode and full
+// browser mode.
 //
 // BE WARNED you should only use this if it would have been acceptable to use
 // ProfileManager::GetLastUsedProfile() in the same context. If your usecase
 // cares about different profiles and their keys, then you should plumb through
 // the correct key instead.
-ProfileKey* GetMainProfileKey();
+ProfileKey* GetLastUsedProfileKey();
 
 }  // namespace android
 
diff --git a/chrome/browser/android/shortcut_helper.cc b/chrome/browser/android/shortcut_helper.cc
index 5eccb3af..10704ea 100644
--- a/chrome/browser/android/shortcut_helper.cc
+++ b/chrome/browser/android/shortcut_helper.cc
@@ -20,6 +20,7 @@
 #include "base/time/time.h"
 #include "chrome/android/chrome_jni_headers/ShortcutHelper_jni.h"
 #include "chrome/browser/android/color_helpers.h"
+#include "chrome/browser/android/tab_android.h"
 #include "chrome/browser/android/webapk/chrome_webapk_host.h"
 #include "chrome/browser/android/webapk/webapk_install_service.h"
 #include "chrome/browser/android/webapk/webapk_metrics.h"
@@ -114,11 +115,13 @@
       java_short_name, java_best_primary_icon_url, java_bitmap,
       is_icon_maskable, info.display, info.orientation, info.source,
       OptionalSkColorToJavaColor(info.theme_color),
-      OptionalSkColorToJavaColor(info.background_color), callback_pointer);
+      OptionalSkColorToJavaColor(info.background_color), callback_pointer,
+      false /* isShortcutAsWebapp */);
 }
 
 // Adds a shortcut which opens in a browser tab to the launcher.
-void AddShortcutWithSkBitmap(const ShortcutInfo& info,
+void AddShortcutWithSkBitmap(content::WebContents* web_contents,
+                             const ShortcutInfo& info,
                              const std::string& id,
                              const SkBitmap& icon_bitmap,
                              bool is_icon_maskable) {
@@ -129,12 +132,17 @@
       base::android::ConvertUTF8ToJavaString(env, info.url.spec());
   ScopedJavaLocalRef<jstring> java_user_title =
       base::android::ConvertUTF16ToJavaString(env, info.user_title);
+  ScopedJavaLocalRef<jstring> java_best_primary_icon_url =
+      base::android::ConvertUTF8ToJavaString(env,
+                                             info.best_primary_icon_url.spec());
   ScopedJavaLocalRef<jobject> java_bitmap;
   if (!icon_bitmap.drawsNothing())
     java_bitmap = gfx::ConvertToJavaBitmap(&icon_bitmap);
-
-  Java_ShortcutHelper_addShortcut(env, java_id, java_url, java_user_title,
-                                  java_bitmap, is_icon_maskable, info.source);
+  TabAndroid* tab = TabAndroid::FromWebContents(web_contents);
+  Java_ShortcutHelper_addShortcut(env, tab ? tab->GetJavaObject() : nullptr,
+                                  java_id, java_url, java_user_title,
+                                  java_bitmap, is_icon_maskable, info.source,
+                                  java_best_primary_icon_url);
 }
 
 }  // anonymous namespace
@@ -183,7 +191,8 @@
                        info.minimum_splash_image_size_in_px, webapp_id));
     return;
   }
-  AddShortcutWithSkBitmap(info, webapp_id, icon_bitmap, is_icon_maskable);
+  AddShortcutWithSkBitmap(web_contents, info, webapp_id, icon_bitmap,
+                          is_icon_maskable);
 }
 
 void ShortcutHelper::ShowWebApkInstallInProgressToast() {
diff --git a/chrome/browser/android/startup_bridge.cc b/chrome/browser/android/startup_bridge.cc
index 12af6b0..a88bba95 100644
--- a/chrome/browser/android/startup_bridge.cc
+++ b/chrome/browser/android/startup_bridge.cc
@@ -22,11 +22,4 @@
   Java_NativeStartupBridge_loadFullBrowser(env);
 }
 
-void HandlePostNativeStartupSynchronously() {
-  // The C++ initialization of the browser has already been done.
-  DCHECK(g_browser_process);
-  JNIEnv* env = base::android::AttachCurrentThread();
-  Java_NativeStartupBridge_handlePostNativeStartupSynchronously(env);
-}
-
 }  // namespace android_startup
diff --git a/chrome/browser/android/startup_bridge.h b/chrome/browser/android/startup_bridge.h
index 0c1b40b..913cef9 100644
--- a/chrome/browser/android/startup_bridge.h
+++ b/chrome/browser/android/startup_bridge.h
@@ -7,11 +7,6 @@
 
 namespace android_startup {
 extern void LoadFullBrowser();
-
-// Called to start up java bits of chrome synchronously after the C++ bits have
-// been initialized. Used for browser tests which must run the browser
-// synchronously before running the test.
-extern void HandlePostNativeStartupSynchronously();
 }
 
 #endif  // CHROME_BROWSER_ANDROID_STARTUP_BRIDGE_H_
diff --git a/chrome/browser/background_fetch/background_fetch_browsertest.cc b/chrome/browser/background_fetch/background_fetch_browsertest.cc
index f241e64..0cac6a71 100644
--- a/chrome/browser/background_fetch/background_fetch_browsertest.cc
+++ b/chrome/browser/background_fetch/background_fetch_browsertest.cc
@@ -416,9 +416,10 @@
         browser()->tab_strip_model()->GetActiveWebContents();
     DownloadRequestLimiter::TabDownloadState* tab_download_state =
         g_browser_process->download_request_limiter()->GetDownloadState(
-            web_contents, web_contents, true /* create */);
+            web_contents, true /* create */);
     tab_download_state->set_download_seen();
     tab_download_state->SetDownloadStatusAndNotify(
+        web_contents->GetVisibleURL().GetOrigin(),
         DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED);
   }
 
diff --git a/chrome/browser/background_fetch/background_fetch_delegate_impl.cc b/chrome/browser/background_fetch/background_fetch_delegate_impl.cc
index 7af48c92..72c0e12 100644
--- a/chrome/browser/background_fetch/background_fetch_delegate_impl.cc
+++ b/chrome/browser/background_fetch/background_fetch_delegate_impl.cc
@@ -266,7 +266,7 @@
     // The fetch should be thought of as one download. So the origin will be
     // used as the URL, and the |request_method| is set to GET.
     limiter->CanDownload(
-        wc_getter, origin.GetURL(), "GET",
+        wc_getter, origin.GetURL(), "GET", base::nullopt,
         base::AdaptCallbackForRepeating(base::BindOnce(
             &BackgroundFetchDelegateImpl::
                 DidGetPermissionFromDownloadRequestLimiter,
diff --git a/chrome/browser/browser_switcher/bho/BUILD.gn b/chrome/browser/browser_switcher/bho/BUILD.gn
index b3ee523a..f81f61e 100644
--- a/chrome/browser/browser_switcher/bho/BUILD.gn
+++ b/chrome/browser/browser_switcher/bho/BUILD.gn
@@ -103,4 +103,8 @@
   sources = [
     "ie_bho_idl.idl",
   ]
+
+  # We have a custom output directory (that excludes the toolchain details).
+  generated_dir =
+      "//third_party/win_build_output/midl/chrome/browser/browser_switcher/bho"
 }
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 0149bfa..a63c9220 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -258,6 +258,7 @@
 #include "components/services/quarantine/quarantine_service.h"
 #include "components/services/unzip/public/interfaces/constants.mojom.h"
 #include "components/signin/core/browser/account_consistency_method.h"
+#include "components/signin/core/browser/signin_pref_names.h"
 #include "components/spellcheck/spellcheck_buildflags.h"
 #include "components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h"
 #include "components/translate/core/common/translate_switches.h"
@@ -4662,13 +4663,14 @@
 }  // namespace
 
 std::vector<std::unique_ptr<content::URLLoaderThrottle>>
-ChromeContentBrowserClient::CreateURLLoaderThrottles(
+ChromeContentBrowserClient::CreateURLLoaderThrottlesOnIO(
     const network::ResourceRequest& request,
     content::ResourceContext* resource_context,
     const base::RepeatingCallback<content::WebContents*()>& wc_getter,
     content::NavigationUIData* navigation_ui_data,
     int frame_tree_node_id) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  DCHECK(!base::FeatureList::IsEnabled(features::kNavigationLoaderOnUI));
 
   std::vector<std::unique_ptr<content::URLLoaderThrottle>> result;
 
@@ -4772,6 +4774,54 @@
   return result;
 }
 
+std::vector<std::unique_ptr<content::URLLoaderThrottle>>
+ChromeContentBrowserClient::CreateURLLoaderThrottles(
+    const network::ResourceRequest& request,
+    content::BrowserContext* browser_context,
+    const base::RepeatingCallback<content::WebContents*()>& wc_getter,
+    content::NavigationUIData* navigation_ui_data,
+    int frame_tree_node_id) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  std::vector<std::unique_ptr<content::URLLoaderThrottle>> result;
+
+  Profile* profile = Profile::FromBrowserContext(browser_context);
+
+  ChromeNavigationUIData* chrome_navigation_ui_data =
+      static_cast<ChromeNavigationUIData*>(navigation_ui_data);
+
+  if (chrome_navigation_ui_data &&
+      chrome_navigation_ui_data->prerender_mode() != prerender::NO_PRERENDER) {
+    result.push_back(std::make_unique<prerender::PrerenderURLLoaderThrottle>(
+        chrome_navigation_ui_data->prerender_mode(),
+        chrome_navigation_ui_data->prerender_histogram_prefix(),
+        base::BindOnce(GetPrerenderCanceller, wc_getter),
+        base::CreateSingleThreadTaskRunnerWithTraits({BrowserThread::UI})));
+  }
+
+  bool is_off_the_record = profile->IsOffTheRecord();
+  bool is_signed_in = !is_off_the_record &&
+                      !profile->GetPrefs()
+                           ->GetString(prefs::kGoogleServicesUserAccountId)
+                           .empty();
+
+  chrome::mojom::DynamicParams dynamic_params = {
+      profile->GetPrefs()->GetBoolean(prefs::kForceGoogleSafeSearch),
+      profile->GetPrefs()->GetInteger(prefs::kForceYouTubeRestrict),
+      profile->GetPrefs()->GetString(prefs::kAllowedDomainsForApps),
+      variations::VariationsHttpHeaderProvider::GetInstance()
+          ->GetClientDataHeader(is_signed_in)};
+  result.push_back(std::make_unique<GoogleURLLoaderThrottle>(
+      is_off_the_record, std::move(dynamic_params)));
+
+#if BUILDFLAG(ENABLE_PLUGINS)
+  result.push_back(std::make_unique<PluginResponseInterceptorURLLoaderThrottle>(
+      browser_context, request.resource_type, frame_tree_node_id));
+#endif
+
+  return result;
+}
+
 void ChromeContentBrowserClient::RegisterNonNetworkNavigationURLLoaderFactories(
     int frame_tree_node_id,
     NonNetworkURLLoaderFactoryMap* factories) {
@@ -5225,9 +5275,10 @@
 #endif
 }
 
-bool ChromeContentBrowserClient::IsSafeRedirectTarget(
+bool ChromeContentBrowserClient::IsSafeRedirectTargetOnIO(
     const GURL& url,
     content::ResourceContext* context) {
+  DCHECK(!base::FeatureList::IsEnabled(features::kNavigationLoaderOnUI));
 #if BUILDFLAG(ENABLE_EXTENSIONS)
   if (url.SchemeIs(extensions::kExtensionScheme)) {
     ProfileIOData* io_data = ProfileIOData::FromResourceContext(context);
@@ -5242,6 +5293,23 @@
   return true;
 }
 
+bool ChromeContentBrowserClient::IsSafeRedirectTarget(
+    const GURL& url,
+    content::BrowserContext* context) {
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+  if (url.SchemeIs(extensions::kExtensionScheme)) {
+    const Extension* extension = extensions::ExtensionRegistry::Get(context)
+                                     ->enabled_extensions()
+                                     .GetByID(url.host());
+    if (!extension)
+      return false;
+    return extensions::WebAccessibleResourcesInfo::IsResourceWebAccessible(
+        extension, url.path());
+  }
+#endif  // BUILDFLAG(ENABLE_EXTENSIONS)
+  return true;
+}
+
 void ChromeContentBrowserClient::RegisterRendererPreferenceWatcher(
     content::BrowserContext* browser_context,
     blink::mojom::RendererPreferenceWatcherPtr watcher) {
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h
index 02795a8e..52f60d5 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -464,12 +464,19 @@
   base::FilePath GetLoggingFileName(
       const base::CommandLine& command_line) override;
   std::vector<std::unique_ptr<content::URLLoaderThrottle>>
-  CreateURLLoaderThrottles(
+  CreateURLLoaderThrottlesOnIO(
       const network::ResourceRequest& request,
       content::ResourceContext* resource_context,
       const base::RepeatingCallback<content::WebContents*()>& wc_getter,
       content::NavigationUIData* navigation_ui_data,
       int frame_tree_node_id) override;
+  std::vector<std::unique_ptr<content::URLLoaderThrottle>>
+  CreateURLLoaderThrottles(
+      const network::ResourceRequest& request,
+      content::BrowserContext* browser_context,
+      const base::RepeatingCallback<content::WebContents*()>& wc_getter,
+      content::NavigationUIData* navigation_ui_data,
+      int frame_tree_node_id) override;
   void RegisterNonNetworkNavigationURLLoaderFactories(
       int frame_tree_node_id,
       NonNetworkURLLoaderFactoryMap* factories) override;
@@ -551,8 +558,10 @@
       network::mojom::URLLoaderFactory*& out_factory) override;
   std::unique_ptr<content::OverlayWindow> CreateWindowForPictureInPicture(
       content::PictureInPictureWindowController* controller) override;
+  bool IsSafeRedirectTargetOnIO(const GURL& url,
+                                content::ResourceContext* context) override;
   bool IsSafeRedirectTarget(const GURL& url,
-                            content::ResourceContext* context) override;
+                            content::BrowserContext* context) override;
   void RegisterRendererPreferenceWatcher(
       content::BrowserContext* browser_context,
       blink::mojom::RendererPreferenceWatcherPtr watcher) override;
diff --git a/chrome/browser/chrome_notification_types.h b/chrome/browser/chrome_notification_types.h
index 10c15de..46129190 100644
--- a/chrome/browser/chrome_notification_types.h
+++ b/chrome/browser/chrome_notification_types.h
@@ -335,12 +335,6 @@
   // The source is the browser's FullscreenController, no details.
   NOTIFICATION_MOUSE_LOCK_CHANGED,
 
-  // Sent when a global error has changed and the error UI should update it
-  // self. The source is a Source<Profile> containing the profile for the
-  // error. The detail is a GlobalError object that has changed or NULL if
-  // all error UIs should update.
-  NOTIFICATION_GLOBAL_ERRORS_CHANGED,
-
   // Note:-
   // Currently only Content and Chrome define and use notifications.
   // Custom notifications not belonging to Content and Chrome should start
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 641b5a6..7c18b16 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -1701,6 +1701,8 @@
     "policy/remote_commands/user_command_arc_job.h",
     "policy/remote_commands/user_commands_factory_chromeos.cc",
     "policy/remote_commands/user_commands_factory_chromeos.h",
+    "policy/rsu/lookup_key_uploader.cc",
+    "policy/rsu/lookup_key_uploader.h",
     "policy/secondary_google_account_signin_policy_handler.cc",
     "policy/secondary_google_account_signin_policy_handler.h",
     "policy/server_backed_device_state.cc",
@@ -2585,6 +2587,7 @@
     "policy/remote_commands/device_command_start_crd_session_unittest.cc",
     "policy/remote_commands/device_command_wipe_users_job_unittest.cc",
     "policy/remote_commands/user_command_arc_job_unittest.cc",
+    "policy/rsu/lookup_key_uploader_unittest.cc",
     "policy/secondary_google_account_signin_policy_handler_unittest.cc",
     "policy/server_backed_state_keys_broker_unittest.cc",
     "policy/single_app_install_event_log_unittest.cc",
diff --git a/chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service.cc b/chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service.cc
index d203e70..cb52254 100644
--- a/chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service.cc
+++ b/chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service.cc
@@ -52,6 +52,7 @@
 bool ParentAccessService::IsApprovalRequired(SupervisedAction action) {
   switch (action) {
     case SupervisedAction::kUpdateClock:
+    case SupervisedAction::kUpdateTimezone:
       if (!base::FeatureList::IsEnabled(
               features::kParentAccessCodeForTimeChange)) {
         return false;
diff --git a/chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service.h b/chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service.h
index 508abdc4..08bc22f 100644
--- a/chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service.h
+++ b/chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service.h
@@ -44,7 +44,9 @@
     // When Chrome is unable to automatically verify if the OS time is correct
     // the user becomes able to manually change the clock. The entry points are
     // the settings page (in-session) and the tray bubble (out-session).
-    kUpdateClock
+    kUpdateClock,
+    // Change timezone from the settings page.
+    kUpdateTimezone
   };
 
   // Registers preferences.
diff --git a/chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service_browsertest.cc b/chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service_browsertest.cc
index f62c85d..fc6575d 100644
--- a/chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service_browsertest.cc
+++ b/chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service_browsertest.cc
@@ -308,7 +308,7 @@
   auto test_value = test_values_.begin();
   test_clock_.SetNow(test_value->first);
 
-  AccountId other_child = AccountId::FromUserEmail("other.child@gmail.com");
+  AccountId other_child = AccountId::FromUserEmail("otherchild@gmail.com");
   EXPECT_FALSE(ParentAccessService::Get().ValidateParentAccessCode(
       other_child, test_value->second));
 }
diff --git a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.cc b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.cc
index 836b2fd3..e8d5640 100644
--- a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.cc
+++ b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.cc
@@ -295,10 +295,10 @@
   DCHECK(identity_manager);
   const CoreAccountInfo account_info =
       identity_manager->GetPrimaryAccountInfo();
+
   // A regular signed-in (i.e., non-login) profile should always have an email.
-  // TODO(crbug.com/857494): Enable this DCHECK once all browser tests create
-  // correctly signed in profiles.
-  // DCHECK(!account_info.email.empty());
+  DCHECK(!account_info.email.empty());
+
   return AccountIdFromAccountInfo(account_info);
 }
 
@@ -364,18 +364,17 @@
   pref_manager_.reset(new proximity_auth::ProximityAuthProfilePrefManager(
       profile()->GetPrefs(), multidevice_setup_client_));
 
-  // TODO(tengs): Due to badly configured browser_tests, Chrome crashes during
-  // shutdown. Revisit this condition after migration is fully completed.
+  // TODO(crbug.com/857494): Thousands of unrelated browser_tests provide a
+  // profile with an empty email to this service, causing crashes further on.
+  // Investigate what this service is doing so differently (i.e., incorrectly)
+  // from others that causes such issues with so many browser_tests.
   if (!base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kTestType)) {
-    // Note: There is no local state in tests.
-    if (g_browser_process->local_state()) {
-      pref_manager_->StartSyncingToLocalState(g_browser_process->local_state(),
-                                              GetAccountId());
-    }
-
-    LoadRemoteDevices();
+    pref_manager_->StartSyncingToLocalState(g_browser_process->local_state(),
+                                            GetAccountId());
   }
 
+  LoadRemoteDevices();
+
   registrar_.Init(profile()->GetPrefs());
   registrar_.Add(
       proximity_auth::prefs::kProximityAuthIsChromeOSLoginEnabled,
@@ -394,6 +393,8 @@
   device_sync_client_->RemoveObserver(this);
 
   multidevice_setup_client_->RemoveObserver(this);
+
+  weak_ptr_factory_.InvalidateWeakPtrs();
 }
 
 bool EasyUnlockServiceRegular::IsAllowedInternal() const {
diff --git a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_unittest_chromeos.cc b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_unittest_chromeos.cc
index f4fccec..2e84101 100644
--- a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_unittest_chromeos.cc
+++ b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_unittest_chromeos.cc
@@ -83,14 +83,10 @@
 // EasyUnlockService factory function injected into testing profiles.
 std::unique_ptr<KeyedService> CreateEasyUnlockServiceForTest(
     content::BrowserContext* context) {
-  std::unique_ptr<EasyUnlockServiceRegular> service(
-      new EasyUnlockServiceRegular(
-          Profile::FromBrowserContext(context),
-          nullptr /* secure_channel_client */,
-          std::make_unique<MockEasyUnlockNotificationController>(),
-          GetDefaultDeviceSyncClient(), GetDefaultMultiDeviceSetupClient()));
-  service->Initialize();
-  return std::move(service);
+  return std::make_unique<EasyUnlockServiceRegular>(
+      Profile::FromBrowserContext(context), nullptr /* secure_channel_client */,
+      std::make_unique<MockEasyUnlockNotificationController>(),
+      GetDefaultDeviceSyncClient(), GetDefaultMultiDeviceSetupClient());
 }
 
 }  // namespace
@@ -165,6 +161,10 @@
         AccountId::FromUserEmailGaiaId(email, *gaia_id));
     profile.get()->set_profile_name(email);
 
+    // Only initialize the service once the profile is completely ready. If done
+    // earlier, indirect usage of user_manager::KnownUser would crash.
+    EasyUnlockService::Get(profile.get())->Initialize();
+
     return profile;
   }
 
diff --git a/chrome/browser/chromeos/login/signin/oauth2_login_manager.cc b/chrome/browser/chromeos/login/signin/oauth2_login_manager.cc
index 03833c3..c7629fa 100644
--- a/chrome/browser/chromeos/login/signin/oauth2_login_manager.cc
+++ b/chrome/browser/chromeos/login/signin/oauth2_login_manager.cc
@@ -139,7 +139,7 @@
     // Token is loaded. Undo the flagging before token loading.
     DCHECK(!account_info.gaia.empty());
     user_manager::UserManager::Get()->SaveUserOAuthStatus(
-        AccountId::FromUserEmailGaiaId(account_info.email, account_info.gaia),
+        AccountIdFromAccountInfo(account_info),
         user_manager::User::OAUTH2_TOKEN_STATUS_VALID);
 
     VerifySessionCookies();
diff --git a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc
index 297a446..a68bdc2 100644
--- a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc
+++ b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc
@@ -30,6 +30,7 @@
 #include "chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.h"
 #include "chrome/browser/chromeos/policy/heartbeat_scheduler.h"
 #include "chrome/browser/chromeos/policy/remote_commands/device_commands_factory_chromeos.h"
+#include "chrome/browser/chromeos/policy/rsu/lookup_key_uploader.h"
 #include "chrome/browser/chromeos/policy/server_backed_state_keys_broker.h"
 #include "chrome/browser/chromeos/policy/status_collector/device_status_collector.h"
 #include "chrome/browser/chromeos/policy/status_uploader.h"
@@ -241,6 +242,7 @@
   registry->RegisterBooleanPref(prefs::kDeviceEnrollmentCanExit, true);
   registry->RegisterDictionaryPref(prefs::kServerBackedDeviceState);
   registry->RegisterBooleanPref(prefs::kRemoveUsersRemoteCommand, false);
+  registry->RegisterStringPref(prefs::kLastRsuDeviceIdUploaded, std::string());
 }
 
 // static
@@ -305,6 +307,9 @@
       new chromeos::attestation::EnrollmentCertificateUploaderImpl(client()));
   enrollment_policy_observer_.reset(
       new chromeos::attestation::EnrollmentPolicyObserver(client()));
+  lookup_key_uploader_.reset(
+      new LookupKeyUploader(device_store(), g_browser_process->local_state(),
+                            enrollment_certificate_uploader_.get()));
 
   // Don't create a MachineCertificateUploader or start the
   // AttestationPolicyObserver if machine cert requests are disabled.
diff --git a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h
index 291893f..449c655 100644
--- a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h
+++ b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h
@@ -47,6 +47,7 @@
 class SchemaRegistry;
 class StatusUploader;
 class SystemLogUploader;
+class LookupKeyUploader;
 
 enum class ZeroTouchEnrollmentMode { DISABLED, ENABLED, FORCED, HANDS_OFF };
 
@@ -211,6 +212,9 @@
   std::unique_ptr<chromeos::attestation::AttestationPolicyObserver>
       attestation_policy_observer_;
 
+  // Uploader for remote server unlock related lookup keys.
+  std::unique_ptr<LookupKeyUploader> lookup_key_uploader_;
+
   // Wrapper schema registry that will track the signin profile schema registry
   // once it is passed to this class.
   std::unique_ptr<ForwardingSchemaRegistry>
diff --git a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
index 6f01f1f..6ff2ed4f 100644
--- a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
+++ b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
@@ -415,6 +415,18 @@
           nullptr);
     }
   }
+
+  if (policy.has_device_powerwash_allowed()) {
+    const em::DevicePowerwashAllowedProto& container(
+        policy.device_powerwash_allowed());
+    if (container.has_device_powerwash_allowed()) {
+      policies->Set(
+          key::kDevicePowerwashAllowed, POLICY_LEVEL_MANDATORY,
+          POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD,
+          std::make_unique<base::Value>(container.device_powerwash_allowed()),
+          nullptr);
+    }
+  }
 }
 
 void DecodeNetworkPolicies(const em::ChromeDeviceSettingsProto& policy,
diff --git a/chrome/browser/chromeos/policy/rsu/lookup_key_uploader.cc b/chrome/browser/chromeos/policy/rsu/lookup_key_uploader.cc
new file mode 100644
index 0000000..ac346a3
--- /dev/null
+++ b/chrome/browser/chromeos/policy/rsu/lookup_key_uploader.cc
@@ -0,0 +1,104 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/policy/rsu/lookup_key_uploader.h"
+
+#include "base/strings/strcat.h"
+#include "base/task/post_task.h"
+#include "base/time/default_clock.h"
+#include "chrome/browser/chromeos/attestation/enrollment_certificate_uploader.h"
+#include "chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.h"
+#include "chrome/common/pref_names.h"
+#include "chromeos/dbus/cryptohome/cryptohome_client.h"
+#include "chromeos/dbus/cryptohome/rpc.pb.h"
+#include "components/policy/core/common/cloud/cloud_policy_client.h"
+#include "components/prefs/pref_service.h"
+
+namespace policy {
+
+const base::TimeDelta LookupKeyUploader::kRetryFrequency =
+    base::TimeDelta::FromHours(10);
+
+LookupKeyUploader::LookupKeyUploader(
+    DeviceCloudPolicyStoreChromeOS* policy_store,
+    PrefService* pref_service,
+    chromeos::attestation::EnrollmentCertificateUploader* certificate_uploader)
+    : policy_store_(policy_store),
+      prefs_(pref_service),
+      certificate_uploader_(certificate_uploader),
+      cryptohome_client_(chromeos::CryptohomeClient::Get()),
+      clock_(base::DefaultClock::GetInstance()),
+      weak_factory_(this) {
+  // Can be null in tests.
+  if (policy_store_)
+    policy_store_->AddObserver(this);
+}
+
+LookupKeyUploader::~LookupKeyUploader() {
+  // Can be null in tests.
+  if (policy_store_)
+    policy_store_->RemoveObserver(this);
+}
+
+void LookupKeyUploader::OnStoreLoaded(CloudPolicyStore* store) {
+  if (!needs_upload_ || clock_->Now() - last_upload_time_ < kRetryFrequency)
+    return;
+  needs_upload_ = false;
+  cryptohome_client_->WaitForServiceToBeAvailable(base::BindOnce(
+      &LookupKeyUploader::OnCryptohomeReady, weak_factory_.GetWeakPtr()));
+}
+
+void LookupKeyUploader::OnCryptohomeReady(bool available) {
+  if (!available) {
+    needs_upload_ = true;
+    return;
+  }
+
+  cryptohome_client_->GetRsuDeviceId(base::BindOnce(
+      &LookupKeyUploader::OnRsuDeviceIdReceived, weak_factory_.GetWeakPtr()));
+}
+
+void LookupKeyUploader::OnStoreError(CloudPolicyStore* store) {
+  // Do nothing.
+}
+
+void LookupKeyUploader::OnRsuDeviceIdReceived(
+    base::Optional<cryptohome::BaseReply> result) {
+  if (!result.has_value()) {
+    Result(std::string(), false /* success */);
+    return;
+  }
+
+  if (!result->HasExtension(cryptohome::GetRsuDeviceIdReply::reply) ||
+      !result->GetExtension(cryptohome::GetRsuDeviceIdReply::reply)
+           .has_rsu_device_id() ||
+      result->GetExtension(cryptohome::GetRsuDeviceIdReply::reply)
+          .rsu_device_id()
+          .empty()) {
+    LOG(ERROR) << "Failed to extract RSU lookup key.";
+    Result(std::string(), false /* success */);
+    return;
+  }
+  const std::string rsu_device_id =
+      result->GetExtension(cryptohome::GetRsuDeviceIdReply::reply)
+          .rsu_device_id();
+
+  // If this ID was uploaded previously -- we are not uploading it.
+  if (rsu_device_id == prefs_->GetString(prefs::kLastRsuDeviceIdUploaded))
+    return;
+  certificate_uploader_->ObtainAndUploadCertificate(base::BindOnce(
+      &LookupKeyUploader::Result, weak_factory_.GetWeakPtr(), rsu_device_id));
+}
+
+void LookupKeyUploader::Result(const std::string& uploaded_key, bool success) {
+  last_upload_time_ = clock_->Now();
+  if (success) {
+    prefs_->SetString(prefs::kLastRsuDeviceIdUploaded, uploaded_key);
+    return;
+  }
+  // Reschedule upload on fail.
+  needs_upload_ = true;
+}
+
+}  // namespace policy
diff --git a/chrome/browser/chromeos/policy/rsu/lookup_key_uploader.h b/chrome/browser/chromeos/policy/rsu/lookup_key_uploader.h
new file mode 100644
index 0000000..d44b8f8
--- /dev/null
+++ b/chrome/browser/chromeos/policy/rsu/lookup_key_uploader.h
@@ -0,0 +1,90 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_POLICY_RSU_LOOKUP_KEY_UPLOADER_H_
+#define CHROME_BROWSER_CHROMEOS_POLICY_RSU_LOOKUP_KEY_UPLOADER_H_
+
+#include <memory>
+#include <string>
+
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "base/optional.h"
+#include "base/time/clock.h"
+#include "base/time/time.h"
+#include "components/policy/core/common/cloud/cloud_policy_store.h"
+
+class PrefService;
+
+namespace chromeos {
+namespace attestation {
+class EnrollmentCertificateUploader;
+}
+class CryptohomeClient;
+}  // namespace chromeos
+
+namespace cryptohome {
+class BaseReply;
+}
+
+namespace policy {
+
+class DeviceCloudPolicyStoreChromeOS;
+
+// This class is used for uploading Remote Server Unlock lookup keys once per
+// enrollment, attempting it whenever we receive device policy from the cloud.
+class LookupKeyUploader : public CloudPolicyStore::Observer {
+ public:
+  // The observer immediately connects with DeviceCloudPolicyStoreChromeOS
+  // to listen for policy load events.
+  LookupKeyUploader(DeviceCloudPolicyStoreChromeOS* policy_store,
+                    PrefService* pref_service,
+                    chromeos::attestation::EnrollmentCertificateUploader*
+                        certificate_uploader);
+
+  ~LookupKeyUploader() override;
+
+ private:
+  // Minimum period of time between consecutive uploads.
+  static const base::TimeDelta kRetryFrequency;
+
+  friend class LookupKeyUploaderTest;
+  // Observers from ChromePolicy store.
+  void OnStoreLoaded(CloudPolicyStore* store) override;
+  void OnStoreError(CloudPolicyStore* store) override;
+
+  void Start();
+  void OnCryptohomeReady(bool available);
+  void OnRsuDeviceIdReceived(base::Optional<cryptohome::BaseReply> result);
+  void HandleRsuDeviceId(const std::string& rsu_device_id);
+
+  void Result(const std::string& uploaded_key, bool success);
+  // Used in tests.
+  void SetClock(base::Clock* clock) { clock_ = clock; }
+
+  DeviceCloudPolicyStoreChromeOS* policy_store_;
+  PrefService* prefs_;
+  chromeos::attestation::EnrollmentCertificateUploader* certificate_uploader_;
+  chromeos::CryptohomeClient* cryptohome_client_;
+
+  // Whether we need to upload the lookup key right now. By default, it is set
+  // to true. Later, it is set to false after first successful upload or finding
+  // prefs::kLastRSULookupKeyUploaded to be equal to the current lookup key.
+  bool needs_upload_ = true;
+
+  base::Clock* clock_;
+  // Timestamp of the last lookup key upload, used for resrticting too frequent
+  // usage.
+  base::Time last_upload_time_;
+
+  // Note: This should remain the last member so it'll be destroyed and
+  // invalidate the weak pointers before any other members are destroyed.
+  base::WeakPtrFactory<LookupKeyUploader> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(LookupKeyUploader);
+};
+
+}  // namespace policy
+
+#endif  // CHROME_BROWSER_CHROMEOS_POLICY_RSU_LOOKUP_KEY_UPLOADER_H_
diff --git a/chrome/browser/chromeos/policy/rsu/lookup_key_uploader_unittest.cc b/chrome/browser/chromeos/policy/rsu/lookup_key_uploader_unittest.cc
new file mode 100644
index 0000000..40c8c59
--- /dev/null
+++ b/chrome/browser/chromeos/policy/rsu/lookup_key_uploader_unittest.cc
@@ -0,0 +1,120 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/policy/rsu/lookup_key_uploader.h"
+
+#include <memory>
+#include <string>
+
+#include "base/macros.h"
+#include "base/run_loop.h"
+#include "base/test/gmock_callback_support.h"
+#include "base/test/simple_test_clock.h"
+#include "base/time/time.h"
+#include "chrome/browser/chromeos/attestation/mock_enrollment_certificate_uploader.h"
+#include "chrome/browser/chromeos/settings/device_settings_test_helper.h"
+#include "chrome/common/pref_names.h"
+#include "chromeos/dbus/cryptohome/cryptohome_client.h"
+#include "chromeos/dbus/cryptohome/fake_cryptohome_client.h"
+#include "components/prefs/pref_registry_simple.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using chromeos::attestation::MockEnrollmentCertificateUploader;
+using testing::_;
+using testing::Invoke;
+
+namespace policy {
+
+namespace {
+const char kValidRsuDeviceId[] = "123";
+}
+class LookupKeyUploaderTest : public chromeos::DeviceSettingsTestBase {
+ protected:
+  LookupKeyUploaderTest() = default;
+
+  void SetUp() override {
+    chromeos::DeviceSettingsTestBase::SetUp();
+    pref_service_.registry()->RegisterStringPref(
+        prefs::kLastRsuDeviceIdUploaded, std::string());
+    lookup_key_uploader_ = std::make_unique<LookupKeyUploader>(
+        nullptr, &pref_service_, &certificate_uploader_);
+    lookup_key_uploader_->SetClock(&clock_);
+    // We initialize clock to imitate real time.
+    clock_.Advance(base::TimeDelta::FromDays(50));
+  }
+
+  void ExpectSavedIdToBe(const std::string& key) {
+    EXPECT_EQ(pref_service_.GetString(prefs::kLastRsuDeviceIdUploaded), key);
+  }
+  bool NeedsUpload() { return lookup_key_uploader_->needs_upload_; }
+
+  void SetCryptohomeReplyTo(const std::string& rsu_device_id) {
+    chromeos::FakeCryptohomeClient::Get()->set_rsu_device_id(rsu_device_id);
+  }
+
+  void AdvanceTime() { clock_.Advance(lookup_key_uploader_->kRetryFrequency); }
+  void Start() {
+    lookup_key_uploader_->OnStoreLoaded(nullptr);
+    base::RunLoop().RunUntilIdle();
+  }
+
+  TestingPrefServiceSimple pref_service_;
+  base::SimpleTestClock clock_;
+  MockEnrollmentCertificateUploader certificate_uploader_;
+  std::unique_ptr<LookupKeyUploader> lookup_key_uploader_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(LookupKeyUploaderTest);
+};
+
+TEST_F(LookupKeyUploaderTest, Uploads) {
+  EXPECT_CALL(certificate_uploader_, ObtainAndUploadCertificate(_))
+      .WillOnce(Invoke([](base::OnceCallback<void(bool status)> callback) {
+        std::move(callback).Run(true);
+      }));
+  SetCryptohomeReplyTo(kValidRsuDeviceId);
+  Start();
+  ExpectSavedIdToBe(kValidRsuDeviceId);
+}
+
+TEST_F(LookupKeyUploaderTest, ReuploadsOnFail) {
+  SetCryptohomeReplyTo("");
+  Start();
+  EXPECT_CALL(certificate_uploader_, ObtainAndUploadCertificate(_)).Times(0);
+  EXPECT_TRUE(NeedsUpload());
+}
+
+TEST_F(LookupKeyUploaderTest, DoesntUploadTwice) {
+  pref_service_.SetString(prefs::kLastRsuDeviceIdUploaded, kValidRsuDeviceId);
+  SetCryptohomeReplyTo(kValidRsuDeviceId);
+  Start();
+  EXPECT_CALL(certificate_uploader_, ObtainAndUploadCertificate(_)).Times(0);
+  ExpectSavedIdToBe(kValidRsuDeviceId);
+  EXPECT_FALSE(NeedsUpload());
+}
+
+TEST_F(LookupKeyUploaderTest, DoesNotUploadVeryFrequently) {
+  SetCryptohomeReplyTo("");
+  Start();
+  EXPECT_TRUE(NeedsUpload());  // Will ask for restart.
+
+  // Next upload should not be executed -- because of the frequency limit.
+  SetCryptohomeReplyTo(kValidRsuDeviceId);
+  Start();
+  ExpectSavedIdToBe("");
+  EXPECT_TRUE(NeedsUpload());  // Will ask for restart.
+
+  AdvanceTime();
+
+  EXPECT_CALL(certificate_uploader_, ObtainAndUploadCertificate(_))
+      .WillOnce(Invoke([](base::OnceCallback<void(bool status)> callback) {
+        std::move(callback).Run(true);
+      }));
+  Start();
+  ExpectSavedIdToBe(kValidRsuDeviceId);
+  EXPECT_FALSE(NeedsUpload());
+}
+
+}  // namespace policy
diff --git a/chrome/browser/chromeos/settings/device_settings_provider.cc b/chrome/browser/chromeos/settings/device_settings_provider.cc
index dd152f6..1b0cd86 100644
--- a/chrome/browser/chromeos/settings/device_settings_provider.cc
+++ b/chrome/browser/chromeos/settings/device_settings_provider.cc
@@ -85,6 +85,7 @@
     kDeviceNativePrintersAccessMode,
     kDeviceNativePrintersBlacklist,
     kDeviceNativePrintersWhitelist,
+    kDevicePowerwashAllowed,
     kDeviceQuirksDownloadEnabled,
     kDeviceRebootOnUserSignout,
     kDeviceScheduledUpdateCheck,
@@ -809,6 +810,15 @@
         kDeviceSecondFactorAuthenticationMode,
         policy.device_second_factor_authentication().mode());
   }
+
+  if (policy.has_device_powerwash_allowed()) {
+    const em::DevicePowerwashAllowedProto& container(
+        policy.device_powerwash_allowed());
+    if (container.has_device_powerwash_allowed()) {
+      new_values_cache->SetBoolean(kDevicePowerwashAllowed,
+                                   container.device_powerwash_allowed());
+    }
+  }
 }
 
 void DecodeLogUploadPolicies(const em::ChromeDeviceSettingsProto& policy,
diff --git a/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc b/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc
index 93985de..52a31be 100644
--- a/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc
+++ b/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc
@@ -311,6 +311,13 @@
     BuildAndInstallDevicePolicy();
   }
 
+  void SetDevicePowerwashAllowed(bool device_powerwash_allowed) {
+    em::DevicePowerwashAllowedProto* proto =
+        device_policy_->payload().mutable_device_powerwash_allowed();
+    proto->set_device_powerwash_allowed(device_powerwash_allowed);
+    BuildAndInstallDevicePolicy();
+  }
+
   ScopedTestingLocalState local_state_;
 
   std::unique_ptr<DeviceSettingsProvider> provider_;
@@ -825,4 +832,15 @@
             *provider_->Get(kDeviceSecondFactorAuthenticationMode));
 }
 
+TEST_F(DeviceSettingsProviderTest, DevicePowerwashAllowed) {
+  // Policy should not be set by default
+  VerifyPolicyValue(kDevicePowerwashAllowed, nullptr);
+
+  SetDevicePowerwashAllowed(true);
+  EXPECT_EQ(base::Value(true), *provider_->Get(kDevicePowerwashAllowed));
+
+  SetDevicePowerwashAllowed(false);
+  EXPECT_EQ(base::Value(false), *provider_->Get(kDevicePowerwashAllowed));
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/ui/request_pin_view.cc b/chrome/browser/chromeos/ui/request_pin_view.cc
index 88feacc..cc5150b 100644
--- a/chrome/browser/chromeos/ui/request_pin_view.cc
+++ b/chrome/browser/chromeos/ui/request_pin_view.cc
@@ -81,7 +81,7 @@
   error_label_->SetVisible(true);
   error_label_->SetText(
       l10n_util::GetStringUTF16(IDS_REQUEST_PIN_DIALOG_PROCESSING));
-  error_label_->SetTooltipText(error_label_->text());
+  error_label_->SetTooltipText(error_label_->GetText());
   error_label_->SetEnabledColor(SK_ColorGRAY);
   error_label_->SizeToPreferredSize();
   // The |textfield_| and OK button become disabled, but the user still can
diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc
index 4f956f5..62385a4 100644
--- a/chrome/browser/download/chrome_download_manager_delegate.cc
+++ b/chrome/browser/download/chrome_download_manager_delegate.cc
@@ -249,11 +249,13 @@
     const content::ResourceRequestInfo::WebContentsGetter& web_contents_getter,
     const GURL& url,
     const std::string& request_method,
+    base::Optional<url::Origin> request_initiator,
     CanDownloadCallback can_download_cb) {
   DownloadRequestLimiter* limiter =
       g_browser_process->download_request_limiter();
   if (limiter) {
     limiter->CanDownload(web_contents_getter, url, request_method,
+                         std::move(request_initiator),
                          base::BindOnce(std::move(can_download_cb), true));
   }
 }
@@ -265,11 +267,12 @@
     const content::ResourceRequestInfo::WebContentsGetter& web_contents_getter,
     const GURL& url,
     const std::string& request_method,
+    base::Optional<url::Origin> request_initiator,
     CanDownloadCallback can_download_cb,
     bool granted) {
   if (granted) {
     CheckCanDownload(web_contents_getter, url, request_method,
-                     std::move(can_download_cb));
+                     std::move(request_initiator), std::move(can_download_cb));
   } else {
     std::move(can_download_cb).Run(false, false);
   }
@@ -1387,6 +1390,7 @@
     const content::ResourceRequestInfo::WebContentsGetter& web_contents_getter,
     const GURL& url,
     const std::string& request_method,
+    base::Optional<url::Origin> request_initiator,
     content::CheckDownloadAllowedCallback check_download_allowed_cb) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   CanDownloadCallback cb = base::BindOnce(
@@ -1396,9 +1400,11 @@
   DownloadControllerBase::Get()->AcquireFileAccessPermission(
       web_contents_getter,
       base::Bind(&OnDownloadAcquireFileAccessPermissionDone,
-                 web_contents_getter, url, request_method, base::Passed(&cb)));
+                 web_contents_getter, url, request_method,
+                 std::move(request_initiator), base::Passed(&cb)));
 #else
-  CheckCanDownload(web_contents_getter, url, request_method, std::move(cb));
+  CheckCanDownload(web_contents_getter, url, request_method,
+                   std::move(request_initiator), std::move(cb));
 #endif
 }
 
diff --git a/chrome/browser/download/chrome_download_manager_delegate.h b/chrome/browser/download/chrome_download_manager_delegate.h
index 8f63737..54d230f 100644
--- a/chrome/browser/download/chrome_download_manager_delegate.h
+++ b/chrome/browser/download/chrome_download_manager_delegate.h
@@ -123,6 +123,7 @@
           web_contents_getter,
       const GURL& url,
       const std::string& request_method,
+      base::Optional<url::Origin> request_initiator,
       content::CheckDownloadAllowedCallback check_download_allowed_cb) override;
 
   // Opens a download using the platform handler. DownloadItem::OpenDownload,
diff --git a/chrome/browser/download/download_browsertest.cc b/chrome/browser/download/download_browsertest.cc
index 53178fa..c7c1264 100644
--- a/chrome/browser/download/download_browsertest.cc
+++ b/chrome/browser/download/download_browsertest.cc
@@ -1440,11 +1440,11 @@
       browser()->tab_strip_model()->GetActiveWebContents();
   DownloadRequestLimiter::TabDownloadState* tab_download_state =
       g_browser_process->download_request_limiter()->GetDownloadState(
-          web_contents, web_contents, true);
+          web_contents, true);
   ASSERT_TRUE(tab_download_state);
   tab_download_state->set_download_seen();
   tab_download_state->SetDownloadStatusAndNotify(
-      DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED);
+      same_site_url.GetOrigin(), DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED);
 
   // Try to start the download via Javascript and wait for the corresponding
   // load stop event.
@@ -1493,12 +1493,12 @@
       browser()->tab_strip_model()->GetActiveWebContents();
   DownloadRequestLimiter::TabDownloadState* tab_download_state =
       g_browser_process->download_request_limiter()->GetDownloadState(
-          web_contents, web_contents, true);
+          web_contents, true);
   ASSERT_TRUE(tab_download_state);
   // Let the first download to fail.
   tab_download_state->set_download_seen();
   tab_download_state->SetDownloadStatusAndNotify(
-      DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED);
+      url.GetOrigin(), DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED);
   bool download_attempted;
   ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
       browser()->tab_strip_model()->GetActiveWebContents(),
@@ -1512,7 +1512,7 @@
   std::unique_ptr<content::DownloadTestObserver> observer(
       CreateWaiter(browser(), 1));
   tab_download_state->SetDownloadStatusAndNotify(
-      DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS);
+      url.GetOrigin(), DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS);
   ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
       browser()->tab_strip_model()->GetActiveWebContents(),
       "window.domAutomationController.send(startDownload2());",
diff --git a/chrome/browser/download/download_permission_request.cc b/chrome/browser/download/download_permission_request.cc
index 502baf6c..d5df316 100644
--- a/chrome/browser/download/download_permission_request.cc
+++ b/chrome/browser/download/download_permission_request.cc
@@ -5,7 +5,6 @@
 #include "chrome/browser/download/download_permission_request.h"
 
 #include "chrome/grit/generated_resources.h"
-#include "content/public/browser/web_contents.h"
 #include "ui/base/l10n/l10n_util.h"
 
 #if defined(OS_ANDROID)
@@ -17,12 +16,9 @@
 #endif
 
 DownloadPermissionRequest::DownloadPermissionRequest(
-    base::WeakPtr<DownloadRequestLimiter::TabDownloadState> host)
-    : host_(host) {
-  content::WebContents* web_contents = host_->web_contents();
-  DCHECK(web_contents);
-  request_origin_ = web_contents->GetURL().GetOrigin();
-}
+    base::WeakPtr<DownloadRequestLimiter::TabDownloadState> host,
+    const GURL& request_origin)
+    : host_(host), request_origin_(request_origin) {}
 
 DownloadPermissionRequest::~DownloadPermissionRequest() {}
 
@@ -60,21 +56,21 @@
 void DownloadPermissionRequest::PermissionGranted() {
   if (host_) {
     // This may invalidate |host_|.
-    host_->Accept();
+    host_->Accept(request_origin_);
   }
 }
 
 void DownloadPermissionRequest::PermissionDenied() {
   if (host_) {
     // This may invalidate |host_|.
-    host_->Cancel();
+    host_->Cancel(request_origin_);
   }
 }
 
 void DownloadPermissionRequest::Cancelled() {
   if (host_) {
     // This may invalidate |host_|.
-    host_->CancelOnce();
+    host_->CancelOnce(request_origin_);
   }
 }
 
diff --git a/chrome/browser/download/download_permission_request.h b/chrome/browser/download/download_permission_request.h
index f44e2d1..1a09d07 100644
--- a/chrome/browser/download/download_permission_request.h
+++ b/chrome/browser/download/download_permission_request.h
@@ -16,8 +16,9 @@
 // an unsuspecting user.
 class DownloadPermissionRequest : public PermissionRequest {
  public:
-  explicit DownloadPermissionRequest(
-      base::WeakPtr<DownloadRequestLimiter::TabDownloadState> host);
+  DownloadPermissionRequest(
+      base::WeakPtr<DownloadRequestLimiter::TabDownloadState> host,
+      const GURL& request_origin);
   ~DownloadPermissionRequest() override;
 
  private:
diff --git a/chrome/browser/download/download_request_limiter.cc b/chrome/browser/download/download_request_limiter.cc
index 05a181e..e22cc6e 100644
--- a/chrome/browser/download/download_request_limiter.cc
+++ b/chrome/browser/download/download_request_limiter.cc
@@ -98,22 +98,20 @@
 
 DownloadRequestLimiter::TabDownloadState::TabDownloadState(
     DownloadRequestLimiter* host,
-    content::WebContents* contents,
-    content::WebContents* originating_web_contents)
+    content::WebContents* contents)
     : content::WebContentsObserver(contents),
       web_contents_(contents),
       host_(host),
       status_(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD),
       ui_status_(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT),
+      origin_(contents->GetVisibleURL()),
       download_count_(0),
       download_seen_(false),
       observer_(this),
       factory_(this) {
   observer_.Add(GetContentSettings(contents));
   NavigationEntry* last_entry =
-      originating_web_contents
-          ? originating_web_contents->GetController().GetLastCommittedEntry()
-          : contents->GetController().GetLastCommittedEntry();
+      contents->GetController().GetLastCommittedEntry();
   if (last_entry)
     initial_page_host_ = last_entry->GetURL().host();
 }
@@ -127,8 +125,10 @@
 }
 
 void DownloadRequestLimiter::TabDownloadState::SetDownloadStatusAndNotify(
+    const GURL& request_origin,
     DownloadStatus status) {
-  SetDownloadStatusAndNotifyImpl(status, GetSettingFromDownloadStatus(status));
+  SetDownloadStatusAndNotifyImpl(request_origin, status,
+                                 GetSettingFromDownloadStatus(status));
 }
 
 void DownloadRequestLimiter::TabDownloadState::DidStartNavigation(
@@ -140,14 +140,18 @@
   ui_status_ = DOWNLOAD_UI_DEFAULT;
 
   if (status_ == PROMPT_BEFORE_DOWNLOAD || status_ == DOWNLOADS_NOT_ALLOWED) {
-    std::string host = navigation_handle->GetURL().host();
     // If the navigation is renderer-initiated (but not user-initiated), ensure
     // that a prompting or blocking limiter state is not reset, so
     // window.location.href or meta refresh can't be abused to avoid the
     // limiter.
     if (navigation_handle->IsRendererInitiated()) {
-      if (!host.empty())
-        restricted_hosts_.emplace(host);
+      GURL origin = navigation_handle->GetURL().GetOrigin();
+      // Mark the origin as restricted. If the origin does not exist in
+      // |restricted_status_map_|, give it a default value of
+      // PROMPT_BEFORE_DOWNLOAD and content setting will be checked later once
+      // CanDownloadImpl() is called.
+      if (!origin.is_empty())
+        restricted_status_map_.emplace(origin, PROMPT_BEFORE_DOWNLOAD);
       return;
     }
 
@@ -228,7 +232,8 @@
 }
 
 void DownloadRequestLimiter::TabDownloadState::PromptUserForDownload(
-    DownloadRequestLimiter::Callback callback) {
+    DownloadRequestLimiter::Callback callback,
+    const GURL& request_origin) {
   callbacks_.push_back(std::move(callback));
   DCHECK(web_contents_);
   if (is_showing_prompt())
@@ -238,14 +243,16 @@
       PermissionRequestManager::FromWebContents(web_contents_);
   if (permission_request_manager) {
     permission_request_manager->AddRequest(
-        new DownloadPermissionRequest(factory_.GetWeakPtr()));
+        new DownloadPermissionRequest(factory_.GetWeakPtr(), request_origin));
   } else {
-    Cancel();
+    // Call CancelOnce() so we don't set the content settings.
+    CancelOnce(request_origin);
   }
 }
 
 void DownloadRequestLimiter::TabDownloadState::SetContentSetting(
-    ContentSetting setting) {
+    ContentSetting setting,
+    const GURL& request_origin) {
   if (!web_contents_)
     return;
   HostContentSettingsMap* settings =
@@ -253,28 +260,40 @@
   if (!settings)
     return;
   settings->SetContentSettingDefaultScope(
-      web_contents_->GetURL(), GURL(),
-      CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS, std::string(), setting);
+      request_origin, GURL(), CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS,
+      std::string(), setting);
 }
 
-void DownloadRequestLimiter::TabDownloadState::Cancel() {
-  SetContentSetting(CONTENT_SETTING_BLOCK);
+void DownloadRequestLimiter::TabDownloadState::Cancel(
+    const GURL& request_origin) {
+  SetContentSetting(CONTENT_SETTING_BLOCK, request_origin);
   bool throttled = NotifyCallbacks(false);
-  SetDownloadStatusAndNotify(throttled ? PROMPT_BEFORE_DOWNLOAD
-                                       : DOWNLOADS_NOT_ALLOWED);
+  SetDownloadStatusAndNotify(request_origin, throttled ? PROMPT_BEFORE_DOWNLOAD
+                                                       : DOWNLOADS_NOT_ALLOWED);
 }
 
-void DownloadRequestLimiter::TabDownloadState::CancelOnce() {
+void DownloadRequestLimiter::TabDownloadState::CancelOnce(
+    const GURL& request_origin) {
   bool throttled = NotifyCallbacks(false);
-  SetDownloadStatusAndNotify(throttled ? PROMPT_BEFORE_DOWNLOAD
-                                       : DOWNLOADS_NOT_ALLOWED);
+  SetDownloadStatusAndNotify(request_origin, throttled ? PROMPT_BEFORE_DOWNLOAD
+                                                       : DOWNLOADS_NOT_ALLOWED);
 }
 
-void DownloadRequestLimiter::TabDownloadState::Accept() {
-  SetContentSetting(CONTENT_SETTING_ALLOW);
+void DownloadRequestLimiter::TabDownloadState::Accept(
+    const GURL& request_origin) {
+  SetContentSetting(CONTENT_SETTING_ALLOW, request_origin);
   bool throttled = NotifyCallbacks(true);
-  SetDownloadStatusAndNotify(throttled ? PROMPT_BEFORE_DOWNLOAD
-                                       : ALLOW_ALL_DOWNLOADS);
+  SetDownloadStatusAndNotify(
+      request_origin, throttled ? PROMPT_BEFORE_DOWNLOAD : ALLOW_ALL_DOWNLOADS);
+}
+
+DownloadRequestLimiter::DownloadStatus
+DownloadRequestLimiter::TabDownloadState::GetDownloadStatus(
+    const GURL& request_origin) {
+  auto it = restricted_status_map_.find(request_origin);
+  if (it != restricted_status_map_.end())
+    return it->second;
+  return ALLOW_ONE_DOWNLOAD;
 }
 
 DownloadRequestLimiter::TabDownloadState::TabDownloadState()
@@ -317,15 +336,11 @@
   // Analogous to TabSpecificContentSettings::OnContentSettingChanged:
   const ContentSettingsDetails details(primary_pattern, secondary_pattern,
                                        content_type, resource_identifier);
-  NavigationController& controller = web_contents()->GetController();
 
-  // The visible NavigationEntry is the URL in the URL field of a tab.
-  // Currently this should be matched by the |primary_pattern|.
-  NavigationEntry* entry = controller.GetVisibleEntry();
-  GURL entry_url;
-  if (entry)
-    entry_url = entry->GetURL();
-  if (!details.update_all() && !details.primary_pattern().Matches(entry_url))
+  // Check if the settings change affects the most recent origin passed
+  // to SetDownloadStatusAndNotify(). If so, we need to update the omnibox
+  // decoration.
+  if (!details.update_all() && !details.primary_pattern().Matches(origin_))
     return;
 
   // Content settings have been updated for our web contents, e.g. via the OIB
@@ -344,11 +359,11 @@
     return;
 
   ContentSetting setting = content_settings->GetContentSetting(
-      web_contents()->GetURL(), web_contents()->GetURL(),
-      CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS, std::string());
+      origin_, origin_, CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS,
+      std::string());
 
   // Update the internal state to match if necessary.
-  SetDownloadStatusAndNotifyImpl(GetDownloadStatusFromSetting(setting),
+  SetDownloadStatusAndNotifyImpl(origin_, GetDownloadStatusFromSetting(setting),
                                  setting);
 }
 
@@ -384,33 +399,39 @@
 }
 
 void DownloadRequestLimiter::TabDownloadState::SetDownloadStatusAndNotifyImpl(
+    const GURL& request_origin,
     DownloadStatus status,
     ContentSetting setting) {
   DCHECK((GetSettingFromDownloadStatus(status) == setting) ||
          (GetDownloadStatusFromSetting(setting) == status))
       << "status " << status << " and setting " << setting
       << " do not correspond to each other";
-
   ContentSetting last_setting = GetSettingFromDownloadStatus(status_);
   DownloadUiStatus last_ui_status = ui_status_;
+  GURL last_origin = origin_;
 
   status_ = status;
   ui_status_ = GetUiStatusFromDownloadStatus(status_, download_seen_);
+  origin_ = request_origin;
+
+  if (!origin_.is_empty()) {
+    if (status_ == PROMPT_BEFORE_DOWNLOAD || status_ == DOWNLOADS_NOT_ALLOWED)
+      restricted_status_map_[request_origin] = status_;
+    else
+      restricted_status_map_.erase(request_origin);
+  }
 
   if (!web_contents())
     return;
 
-  if (status_ == PROMPT_BEFORE_DOWNLOAD || status_ == DOWNLOADS_NOT_ALLOWED) {
-    if (!initial_page_host_.empty())
-      restricted_hosts_.emplace(initial_page_host_);
-  }
-
   // We want to send a notification if the UI status has changed to ensure that
   // the omnibox decoration updates appropriately. This is effectively the same
   // as other permissions which might be in an allow state, but do not show UI
   // until they are actively used.
-  if (last_setting == setting && last_ui_status == ui_status_)
+  if (last_setting == setting && last_ui_status == ui_status_ &&
+      origin_ == last_origin) {
     return;
+  }
 
   content::NotificationService::current()->Notify(
       chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED,
@@ -423,9 +444,9 @@
   if (navigation_handle->FromDownloadCrossOriginRedirect())
     return true;
 
-  std::string host = navigation_handle->GetURL().host();
+  GURL origin = navigation_handle->GetURL().GetOrigin();
   if (navigation_handle->GetPageTransition() & ui::PAGE_TRANSITION_FORWARD_BACK)
-    return restricted_hosts_.find(host) != restricted_hosts_.end();
+    return restricted_status_map_.find(origin) != restricted_status_map_.end();
   return false;
 }
 
@@ -441,21 +462,28 @@
 
 DownloadRequestLimiter::DownloadStatus
 DownloadRequestLimiter::GetDownloadStatus(content::WebContents* web_contents) {
-  TabDownloadState* state = GetDownloadState(web_contents, nullptr, false);
+  TabDownloadState* state = GetDownloadState(web_contents, false);
   return state ? state->download_status() : ALLOW_ONE_DOWNLOAD;
 }
 
 DownloadRequestLimiter::DownloadUiStatus
 DownloadRequestLimiter::GetDownloadUiStatus(
     content::WebContents* web_contents) {
-  TabDownloadState* state = GetDownloadState(web_contents, nullptr, false);
+  TabDownloadState* state = GetDownloadState(web_contents, false);
   return state ? state->download_ui_status() : DOWNLOAD_UI_DEFAULT;
 }
 
+GURL DownloadRequestLimiter::GetDownloadOrigin(
+    content::WebContents* web_contents) {
+  TabDownloadState* state = GetDownloadState(web_contents, false);
+  if (state && !state->origin().is_empty())
+    return state->origin();
+  return web_contents->GetVisibleURL();
+}
+
 DownloadRequestLimiter::TabDownloadState*
 DownloadRequestLimiter::GetDownloadState(
     content::WebContents* web_contents,
-    content::WebContents* originating_web_contents,
     bool create) {
   DCHECK(web_contents);
   auto i = state_map_.find(web_contents);
@@ -465,8 +493,7 @@
   if (!create)
     return nullptr;
 
-  TabDownloadState* state =
-      new TabDownloadState(this, web_contents, originating_web_contents);
+  TabDownloadState* state = new TabDownloadState(this, web_contents);
   state_map_[web_contents] = state;
   return state;
 }
@@ -475,6 +502,7 @@
     const content::ResourceRequestInfo::WebContentsGetter& web_contents_getter,
     const GURL& url,
     const std::string& request_method,
+    base::Optional<url::Origin> request_initiator,
     Callback callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
@@ -493,9 +521,10 @@
   // Note that because |originating_contents| might go away before
   // OnCanDownloadDecided is invoked, we look it up by |render_process_host_id|
   // and |render_view_id|.
-  base::OnceCallback<void(bool)> can_download_callback = base::BindOnce(
-      &DownloadRequestLimiter::OnCanDownloadDecided, factory_.GetWeakPtr(),
-      web_contents_getter, request_method, std::move(callback));
+  base::OnceCallback<void(bool)> can_download_callback =
+      base::BindOnce(&DownloadRequestLimiter::OnCanDownloadDecided,
+                     factory_.GetWeakPtr(), web_contents_getter, request_method,
+                     std::move(request_initiator), std::move(callback));
 
   originating_contents->GetDelegate()->CanDownload(
       url, request_method, std::move(can_download_callback));
@@ -504,6 +533,7 @@
 void DownloadRequestLimiter::OnCanDownloadDecided(
     const content::ResourceRequestInfo::WebContentsGetter& web_contents_getter,
     const std::string& request_method,
+    base::Optional<url::Origin> request_initiator,
     Callback orig_callback,
     bool allow) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -514,7 +544,7 @@
   }
 
   CanDownloadImpl(originating_contents, request_method,
-                  std::move(orig_callback));
+                  std::move(request_initiator), std::move(orig_callback));
 }
 
 HostContentSettingsMap* DownloadRequestLimiter::GetContentSettings(
@@ -526,69 +556,86 @@
 void DownloadRequestLimiter::CanDownloadImpl(
     content::WebContents* originating_contents,
     const std::string& request_method,
+    base::Optional<url::Origin> request_initiator,
     Callback callback) {
   DCHECK(originating_contents);
 
-  TabDownloadState* state =
-      GetDownloadState(originating_contents, originating_contents, true);
+  TabDownloadState* state = GetDownloadState(originating_contents, true);
   state->set_download_seen();
   bool ret = true;
 
+  // |request_initiator| may come from another web_contents. Check the content
+  // settings first to see if the download needs to be blocked.
+  GURL initiator = request_initiator ? request_initiator->GetURL()
+                                     : originating_contents->GetVisibleURL();
+  GURL origin = initiator.GetOrigin();
+  DownloadStatus status = state->GetDownloadStatus(origin);
+
+  // Always check for the content setting first. Having an content setting
+  // observer won't work as |request_initiator| might be different from the tab
+  // URL.
+  HostContentSettingsMap* content_settings =
+      GetContentSettings(originating_contents);
+  ContentSetting setting = CONTENT_SETTING_ASK;
+  if (content_settings) {
+    setting = content_settings->GetContentSetting(
+        initiator, initiator, CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS,
+        std::string());
+    // Override the status if content setting is block or always allow.
+    if (setting == CONTENT_SETTING_BLOCK)
+      status = DOWNLOADS_NOT_ALLOWED;
+    else if (setting == CONTENT_SETTING_ALLOW)
+      status = ALLOW_ALL_DOWNLOADS;
+  }
+
   // Always call SetDownloadStatusAndNotify since we may need to change the
   // omnibox UI even if the internal state stays the same. For instance, we want
   // to hide the indicator until a download is triggered, even if we know
   // downloads are blocked. This mirrors the behaviour of other omnibox
   // decorations like geolocation.
-  switch (state->download_status()) {
+  switch (status) {
     case ALLOW_ALL_DOWNLOADS:
       if (state->download_count() &&
           !(state->download_count() %
             DownloadRequestLimiter::kMaxDownloadsAtOnce)) {
-        state->SetDownloadStatusAndNotify(PROMPT_BEFORE_DOWNLOAD);
+        state->SetDownloadStatusAndNotify(origin, PROMPT_BEFORE_DOWNLOAD);
       } else {
-        state->SetDownloadStatusAndNotify(ALLOW_ALL_DOWNLOADS);
+        state->SetDownloadStatusAndNotify(origin, ALLOW_ALL_DOWNLOADS);
       }
       std::move(callback).Run(true);
       state->increment_download_count();
       break;
 
     case ALLOW_ONE_DOWNLOAD:
-      state->SetDownloadStatusAndNotify(PROMPT_BEFORE_DOWNLOAD);
+      state->SetDownloadStatusAndNotify(origin, PROMPT_BEFORE_DOWNLOAD);
       std::move(callback).Run(true);
       state->increment_download_count();
       break;
 
     case DOWNLOADS_NOT_ALLOWED:
-      state->SetDownloadStatusAndNotify(DOWNLOADS_NOT_ALLOWED);
+      state->SetDownloadStatusAndNotify(origin, DOWNLOADS_NOT_ALLOWED);
       ret = false;
       std::move(callback).Run(false);
       break;
 
     case PROMPT_BEFORE_DOWNLOAD: {
-      HostContentSettingsMap* content_settings =
-          GetContentSettings(originating_contents);
-      ContentSetting setting = CONTENT_SETTING_ASK;
-      if (content_settings) {
-        setting = content_settings->GetContentSetting(
-            originating_contents->GetURL(), originating_contents->GetURL(),
-            CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS, std::string());
-      }
       switch (setting) {
         case CONTENT_SETTING_ALLOW: {
-          state->SetDownloadStatusAndNotify(ALLOW_ALL_DOWNLOADS);
+          state->SetDownloadStatusAndNotify(origin, ALLOW_ALL_DOWNLOADS);
           std::move(callback).Run(true);
           state->increment_download_count();
           break;
         }
         case CONTENT_SETTING_BLOCK: {
-          state->SetDownloadStatusAndNotify(DOWNLOADS_NOT_ALLOWED);
+          state->SetDownloadStatusAndNotify(origin, DOWNLOADS_NOT_ALLOWED);
           ret = false;
           std::move(callback).Run(false);
           break;
         }
         case CONTENT_SETTING_DEFAULT:
         case CONTENT_SETTING_ASK:
-          state->PromptUserForDownload(std::move(callback));
+          state->PromptUserForDownload(std::move(callback),
+                                       initiator.GetOrigin());
           state->increment_download_count();
           ret = false;
           break;
diff --git a/chrome/browser/download/download_request_limiter.h b/chrome/browser/download/download_request_limiter.h
index 9b00b28..f1a4901 100644
--- a/chrome/browser/download/download_request_limiter.h
+++ b/chrome/browser/download/download_request_limiter.h
@@ -88,21 +88,19 @@
   class TabDownloadState : public content_settings::Observer,
                            public content::WebContentsObserver {
    public:
-    // Creates a new TabDownloadState. |controller| is the controller the
-    // TabDownloadState tracks the state of and is the host for any dialogs that
-    // are displayed. |originating_controller| is used to determine the host of
-    // the initial download. If |originating_controller| is null, |controller|
-    // is used. |originating_controller| is typically null, but differs from
-    // |controller| in the case of a constrained popup requesting the download.
+    // Creates a new TabDownloadState. |host| is DownloadRequestLimiter object
+    // that owns this object. This object will listen to all the navigations
+    // and downloads happening on the |web_contents| to determine the new
+    // download status.
     TabDownloadState(DownloadRequestLimiter* host,
-                     content::WebContents* web_contents,
-                     content::WebContents* originating_web_contents);
+                     content::WebContents* web_contents);
     ~TabDownloadState() override;
 
     // Sets the current limiter state and the underlying automatic downloads
     // content setting. Sends a notification that the content setting has been
     // changed (if it has changed).
-    void SetDownloadStatusAndNotify(DownloadStatus status);
+    void SetDownloadStatusAndNotify(const GURL& request_origin,
+                                    DownloadStatus status);
 
     // Status of the download.
     DownloadStatus download_status() const { return status_; }
@@ -118,6 +116,8 @@
       return download_count_;
     }
 
+    const GURL& origin() const { return origin_; }
+
     bool download_seen() const { return download_seen_; }
     void set_download_seen() { download_seen_ = true; }
 
@@ -132,13 +132,16 @@
     // Asks the user if they really want to allow the download.
     // See description above CanDownloadOnIOThread for details on lifetime of
     // callback.
-    void PromptUserForDownload(DownloadRequestLimiter::Callback callback);
+    void PromptUserForDownload(DownloadRequestLimiter::Callback callback,
+                               const GURL& request_origin);
 
     // Invoked from DownloadRequestDialogDelegate. Notifies the delegates and
     // changes the status appropriately. Virtual for testing.
-    virtual void Cancel();
-    virtual void CancelOnce();
-    virtual void Accept();
+    virtual void Cancel(const GURL& request_origin);
+    virtual void CancelOnce(const GURL& request_origin);
+    virtual void Accept(const GURL& request_origin);
+
+    DownloadStatus GetDownloadStatus(const GURL& request_origin);
 
    protected:
     // Used for testing.
@@ -160,8 +163,9 @@
         ContentSettingsType content_type,
         const std::string& resource_identifier) override;
 
-    // Remember to either block or allow automatic downloads from this origin.
-    void SetContentSetting(ContentSetting setting);
+    // Remember to either block or allow automatic downloads from
+    // |request_origin|.
+    void SetContentSetting(ContentSetting setting, const GURL& request_origin);
 
     // Notifies the callbacks as to whether the download is allowed or not.
     // Returns false if it didn't notify all callbacks.
@@ -169,7 +173,8 @@
 
     // Set the download limiter state and notify if it has changed. Callers must
     // guarantee that |status| and |setting| correspond to each other.
-    void SetDownloadStatusAndNotifyImpl(DownloadStatus status,
+    void SetDownloadStatusAndNotifyImpl(const GURL& request_origin,
+                                        DownloadStatus status,
                                         ContentSetting setting);
 
     // Check if download is restricted (either requires prompting or is blocked)
@@ -183,9 +188,15 @@
     // Host of the first page the download started on. This may be empty.
     std::string initial_page_host_;
 
+    // Current tab status and UI status. Renderer initiated navigations will
+    // not change these values if the current tab state is restricted.
     DownloadStatus status_;
     DownloadUiStatus ui_status_;
 
+    // Origin for initiating the current download. The value was kept for
+    // updating the omnibox decoration.
+    GURL origin_;
+
     size_t download_count_;
 
     // True if a download has been seen on the current page load.
@@ -197,9 +208,9 @@
     // callbacks.
     std::vector<DownloadRequestLimiter::Callback> callbacks_;
 
-    // A list of hosts that won't cause tab's download state to change if the
-    // state is PROMPT_BEFORE_DOWNLOAD or DOWNLOADS_NOT_ALLOWED.
-    std::set<std::string> restricted_hosts_;
+    // Origins that have restricted download state.
+    using DownloadStatusMap = std::map<GURL, DownloadStatus>;
+    DownloadStatusMap restricted_status_map_;
 
     ScopedObserver<HostContentSettingsMap, content_settings::Observer>
         observer_;
@@ -223,11 +234,16 @@
   // omnibox decoration.
   DownloadUiStatus GetDownloadUiStatus(content::WebContents* web_contents);
 
+  // Returns the download origin that is associated with the current UI status
+  // for the purposes of showing an omnibox decoration.
+  GURL GetDownloadOrigin(content::WebContents* web_contents);
+
   // Check if download can proceed and notifies the callback on UI thread.
   void CanDownload(const content::ResourceRequestInfo::WebContentsGetter&
                        web_contents_getter,
                    const GURL& url,
                    const std::string& request_method,
+                   base::Optional<url::Origin> request_initiator,
                    Callback callback);
 
  private:
@@ -255,15 +271,14 @@
   //
   // The returned TabDownloadState is owned by the DownloadRequestLimiter and
   // deleted when no longer needed (the Remove method is invoked).
-  TabDownloadState* GetDownloadState(
-      content::WebContents* web_contents,
-      content::WebContents* originating_web_contents,
-      bool create);
+  TabDownloadState* GetDownloadState(content::WebContents* web_contents,
+                                     bool create);
 
   // Does the work of updating the download status on the UI thread and
   // potentially prompting the user.
   void CanDownloadImpl(content::WebContents* originating_contents,
                        const std::string& request_method,
+                       base::Optional<url::Origin> request_initiator,
                        Callback callback);
 
   // Invoked when decision to download has been made.
@@ -271,6 +286,7 @@
       const content::ResourceRequestInfo::WebContentsGetter&
           web_contents_getter,
       const std::string& request_method,
+      base::Optional<url::Origin> request_initiator,
       Callback orig_callback,
       bool allow);
 
diff --git a/chrome/browser/download/download_request_limiter_unittest.cc b/chrome/browser/download/download_request_limiter_unittest.cc
index 3406b9a9..1dcc88e 100644
--- a/chrome/browser/download/download_request_limiter_unittest.cc
+++ b/chrome/browser/download/download_request_limiter_unittest.cc
@@ -67,9 +67,15 @@
   }
 
   void CanDownloadFor(WebContents* web_contents) {
+    CanDownloadFor(web_contents, base::nullopt);
+  }
+
+  void CanDownloadFor(WebContents* web_contents,
+                      base::Optional<url::Origin> origin) {
     download_request_limiter_->CanDownloadImpl(
         web_contents,
         "GET",  // request method
+        std::move(origin),
         base::Bind(&DownloadRequestLimiterTest::ContinueDownload,
                    base::Unretained(this)));
     base::RunLoop().RunUntilIdle();
@@ -82,8 +88,7 @@
   void OnUserInteractionFor(WebContents* web_contents,
                             blink::WebInputEvent::Type type) {
     DownloadRequestLimiter::TabDownloadState* state =
-        download_request_limiter_->GetDownloadState(web_contents, nullptr,
-                                                    false);
+        download_request_limiter_->GetDownloadState(web_contents, false);
     if (state)
       state->DidGetUserInteraction(type);
   }
@@ -103,7 +108,7 @@
   void UpdateContentSettings(WebContents* web_contents,
                              ContentSetting setting) {
     // Ensure a download state exists.
-    download_request_limiter_->GetDownloadState(web_contents, nullptr, true);
+    download_request_limiter_->GetDownloadState(web_contents, true);
     SetHostContentSetting(web_contents, setting);
   }
 
@@ -117,11 +122,17 @@
   }
 
   void SetHostContentSetting(WebContents* contents, ContentSetting setting) {
+    SetHostContentSetting(contents, contents->GetURL(), setting);
+  }
+
+  void SetHostContentSetting(WebContents* contents,
+                             const GURL& host,
+                             ContentSetting setting) {
     HostContentSettingsMapFactory::GetForProfile(
         Profile::FromBrowserContext(contents->GetBrowserContext()))
         ->SetContentSettingDefaultScope(
-            contents->GetURL(), GURL(),
-            CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS, std::string(), setting);
+            host, GURL(), CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS,
+            std::string(), setting);
   }
 
   void LoadCompleted() {
@@ -753,7 +764,7 @@
 
   // DownloadRequestLimiter won't try to make a permission request or infobar
   // if there is no PermissionRequestManager, and we want to test that it will
-  // Cancel() instead of prompting.
+  // CancelOnce() instead of prompting.
   ExpectAndResetCounts(0, 0, 0, __LINE__);
   EXPECT_EQ(DownloadRequestLimiter::ALLOW_ONE_DOWNLOAD,
             download_request_limiter_->GetDownloadStatus(web_contents.get()));
@@ -807,9 +818,11 @@
   LoadCompleted();
   SetHostContentSetting(web_contents(), CONTENT_SETTING_ALLOW);
 
+  // The content setting will be checked first and overwrite the
+  // ALLOW_ONE_DOWNLOAD default status.
   CanDownload();
   ExpectAndResetCounts(1, 0, 0, __LINE__);
-  EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
+  EXPECT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS,
             download_request_limiter_->GetDownloadStatus(web_contents()));
 
   CanDownload();
@@ -885,3 +898,59 @@
             download_request_limiter_->GetDownloadStatus(web_contents()));
 }
 
+// Test that renderer initiated download from another origin are handled
+// properly.
+TEST_F(DownloadRequestLimiterTest, RendererInitiatedDownloadFromAnotherOrigin) {
+  NavigateAndCommit(GURL("http://foo.com/bar"));
+  LoadCompleted();
+
+  // Sets the content setting to block for another origin.
+  SetHostContentSetting(web_contents(), GURL("http://foobar.com"),
+                        CONTENT_SETTING_BLOCK);
+
+  // Trigger a renderer initiated download from the other origin.
+  CanDownloadFor(web_contents(),
+                 url::Origin::Create(GURL("http://foobar.com")));
+  ExpectAndResetCounts(0, 1, 0, __LINE__);
+  EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
+            download_request_limiter_->GetDownloadStatus(web_contents()));
+  EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_BLOCKED,
+            download_request_limiter_->GetDownloadUiStatus(web_contents()));
+
+  // The current tab is not affected, still allowing one download.
+  CanDownloadFor(web_contents());
+  ExpectAndResetCounts(1, 0, 0, __LINE__);
+  EXPECT_EQ(DownloadRequestLimiter::PROMPT_BEFORE_DOWNLOAD,
+            download_request_limiter_->GetDownloadStatus(web_contents()));
+  EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_DEFAULT,
+            download_request_limiter_->GetDownloadUiStatus(web_contents()));
+
+  // Change the content setting to allow for the other origin.
+  SetHostContentSetting(web_contents(), GURL("http://foobar.com"),
+                        CONTENT_SETTING_ALLOW);
+  CanDownloadFor(web_contents(),
+                 url::Origin::Create(GURL("http://foobar.com")));
+  ExpectAndResetCounts(1, 0, 0, __LINE__);
+  EXPECT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS,
+            download_request_limiter_->GetDownloadStatus(web_contents()));
+  EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_ALLOWED,
+            download_request_limiter_->GetDownloadUiStatus(web_contents()));
+
+  // Trigger another download in the current tab, and cancel the prompt.
+  UpdateExpectations(CANCEL);
+  CanDownloadFor(web_contents());
+  ExpectAndResetCounts(0, 1, 1, __LINE__);
+  EXPECT_EQ(DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED,
+            download_request_limiter_->GetDownloadStatus(web_contents()));
+  EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_BLOCKED,
+            download_request_limiter_->GetDownloadUiStatus(web_contents()));
+
+  // Download should proceed work for the other origin.
+  CanDownloadFor(web_contents(),
+                 url::Origin::Create(GURL("http://foobar.com")));
+  ExpectAndResetCounts(1, 0, 0, __LINE__);
+  EXPECT_EQ(DownloadRequestLimiter::ALLOW_ALL_DOWNLOADS,
+            download_request_limiter_->GetDownloadStatus(web_contents()));
+  EXPECT_EQ(DownloadRequestLimiter::DOWNLOAD_UI_ALLOWED,
+            download_request_limiter_->GetDownloadUiStatus(web_contents()));
+}
diff --git a/chrome/browser/download/notification/download_item_notification.cc b/chrome/browser/download/notification/download_item_notification.cc
index 7db12421..a8f4a7a 100644
--- a/chrome/browser/download/notification/download_item_notification.cc
+++ b/chrome/browser/download/notification/download_item_notification.cc
@@ -773,7 +773,7 @@
 
 base::string16 DownloadItemNotification::GetSubStatusString() const {
   if (item_->IsDangerous())
-    return base::string16();
+    return GetWarningStatusString();
 
   switch (item_->GetState()) {
     case download::DownloadItem::IN_PROGRESS:
@@ -816,7 +816,7 @@
 
 base::string16 DownloadItemNotification::GetStatusString() const {
   if (item_->IsDangerous())
-    return GetWarningStatusString();
+    return base::string16();
 
   // The hostname. (E.g.:"example.com" or "127.0.0.1")
   base::string16 host_name = url_formatter::FormatUrlForSecurityDisplay(
diff --git a/chrome/browser/engagement/important_sites_usage_counter_unittest.cc b/chrome/browser/engagement/important_sites_usage_counter_unittest.cc
index 1e386c0..7294ff6 100644
--- a/chrome/browser/engagement/important_sites_usage_counter_unittest.cc
+++ b/chrome/browser/engagement/important_sites_usage_counter_unittest.cc
@@ -34,7 +34,11 @@
     run_loop_.reset(new base::RunLoop());
   }
 
-  void TearDown() override { content::RunAllTasksUntilIdle(); }
+  void TearDown() override {
+    // Release the quota manager and wait for the database to be closed.
+    quota_manager_.reset();
+    content::RunAllTasksUntilIdle();
+  }
 
   TestingProfile* profile() { return &profile_; }
 
diff --git a/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc b/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc
index b88a6a08..737409c6 100644
--- a/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc
+++ b/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc
@@ -140,7 +140,7 @@
   chromeos::RequestPinView* view =
       service->pin_dialog_manager()->active_view_for_testing();
   EXPECT_EQ(gfx::kGoogleRed600,
-            view->error_label_for_testing()->enabled_color());
+            view->error_label_for_testing()->GetEnabledColor());
 }
 
 class CertificateProviderApiTest : public extensions::ExtensionApiTest {
diff --git a/chrome/browser/extensions/api/extension_action/extension_action_api.cc b/chrome/browser/extensions/api/extension_action/extension_action_api.cc
index 1f2c8aa8..2c0dc07 100644
--- a/chrome/browser/extensions/api/extension_action/extension_action_api.cc
+++ b/chrome/browser/extensions/api/extension_action/extension_action_api.cc
@@ -95,6 +95,9 @@
   ExtensionFunctionRegistry& registry =
       ExtensionFunctionRegistry::GetInstance();
 
+  // Actions
+  registry.RegisterFunction<ActionSetIconFunction>();
+
   // Browser Actions
   registry.RegisterFunction<BrowserActionSetIconFunction>();
   registry.RegisterFunction<BrowserActionSetTitleFunction>();
diff --git a/chrome/browser/extensions/api/extension_action/extension_action_api.h b/chrome/browser/extensions/api/extension_action/extension_action_api.h
index d75a9023..6c23857 100644
--- a/chrome/browser/extensions/api/extension_action/extension_action_api.h
+++ b/chrome/browser/extensions/api/extension_action/extension_action_api.h
@@ -251,6 +251,20 @@
 };
 
 //
+// action.* aliases for supported action APIs.
+//
+
+class ActionSetIconFunction : public ExtensionActionSetIconFunction {
+ public:
+  DECLARE_EXTENSION_FUNCTION("action.setIcon", ACTION_SETICON)
+
+ protected:
+  ~ActionSetIconFunction() override {}
+};
+
+// TODO(devlin): Add the rest of the action APIs here.
+
+//
 // browserAction.* aliases for supported browserAction APIs.
 //
 
diff --git a/chrome/browser/extensions/api/extension_action/extension_action_apitest.cc b/chrome/browser/extensions/api/extension_action/extension_action_apitest.cc
index f46b801..3792d8ac 100644
--- a/chrome/browser/extensions/api/extension_action/extension_action_apitest.cc
+++ b/chrome/browser/extensions/api/extension_action/extension_action_apitest.cc
@@ -129,18 +129,28 @@
   }
 
   // Ensures the |action| is enabled on the tab with the given |tab_id|.
-  void EnsureActionIsEnabled(ExtensionAction* action, int tab_id) const {
-    if (!action->GetIsVisible(tab_id))
-      action->SetIsVisible(tab_id, true);
+  void EnsureActionIsEnabledOnActiveTab(ExtensionAction* action) {
+    const int tab_id = GetActiveTabId();
+    if (action->GetIsVisible(tab_id))
+      return;
+    action->SetIsVisible(tab_id, true);
+    // Just setting the state on the action doesn't update the UI. Ensure
+    // observers are notified.
+    extensions::ExtensionActionAPI* extension_action_api =
+        extensions::ExtensionActionAPI::Get(profile());
+    extension_action_api->NotifyChange(action, GetActiveTab(), profile());
   }
 
   // Returns the id of the currently-active tab.
   int GetActiveTabId() const {
-    content::WebContents* web_contents =
-        browser()->tab_strip_model()->GetActiveWebContents();
+    content::WebContents* web_contents = GetActiveTab();
     return SessionTabHelper::IdForTab(web_contents).id();
   }
 
+  content::WebContents* GetActiveTab() const {
+    return browser()->tab_strip_model()->GetActiveWebContents();
+  }
+
   // Returns the action associated with |extension|.
   ExtensionAction* GetExtensionAction(const Extension& extension) {
     auto* action_manager = ExtensionActionManager::Get(profile());
@@ -359,7 +369,7 @@
 
   const int tab_id = GetActiveTabId();
   EXPECT_TRUE(ActionHasDefaultState(*action, tab_id));
-  EnsureActionIsEnabled(action, tab_id);
+  EnsureActionIsEnabledOnActiveTab(action);
   EXPECT_FALSE(action->HasPopup(tab_id));
 
   ResultCatcher result_catcher;
@@ -404,7 +414,7 @@
 
   const int tab_id = GetActiveTabId();
   EXPECT_TRUE(ActionHasDefaultState(*action, tab_id));
-  EnsureActionIsEnabled(action, tab_id);
+  EnsureActionIsEnabledOnActiveTab(action);
   EXPECT_TRUE(action->HasPopup(tab_id));
 
   ResultCatcher result_catcher;
@@ -431,6 +441,139 @@
   EXPECT_EQ(0u, frames.size());
 }
 
+// Tests setting the icon dynamically from the background page.
+IN_PROC_BROWSER_TEST_P(MultiActionAPITest, DynamicSetIcon) {
+  constexpr char kManifestTemplate[] =
+      R"({
+           "name": "Test Clicking",
+           "manifest_version": 2,
+           "version": "0.1",
+           "%s": {
+             "default_icon": "red_icon.png"
+           },
+           "background": { "scripts": ["background.js"] }
+         })";
+  constexpr char kBackgroundJsTemplate[] =
+      R"(function setIcon(details) {
+           chrome.%s.setIcon(details, () => {
+             chrome.test.assertNoLastError();
+             chrome.test.notifyPass();
+           });
+         })";
+
+  std::string blue_icon;
+  std::string red_icon;
+  {
+    base::ScopedAllowBlockingForTesting allow_blocking;
+    ASSERT_TRUE(base::ReadFileToString(
+        test_data_dir_.AppendASCII("icon_rgb_0_0_255.png"), &blue_icon));
+    ASSERT_TRUE(base::ReadFileToString(
+        test_data_dir_.AppendASCII("icon_rgb_255_0_0.png"), &red_icon));
+  }
+
+  TestExtensionDir test_dir;
+  test_dir.WriteManifest(
+      base::StringPrintf(kManifestTemplate, GetManifestKey(GetParam())));
+  test_dir.WriteFile(
+      FILE_PATH_LITERAL("background.js"),
+      base::StringPrintf(kBackgroundJsTemplate, GetAPIName(GetParam())));
+  test_dir.WriteFile(FILE_PATH_LITERAL("blue_icon.png"), blue_icon);
+  test_dir.WriteFile(FILE_PATH_LITERAL("red_icon.png"), red_icon);
+
+  const Extension* extension = LoadExtension(test_dir.UnpackedPath());
+  ASSERT_TRUE(extension);
+
+  ExtensionAction* action = GetExtensionAction(*extension);
+  ASSERT_TRUE(action);
+
+  int tab_id = GetActiveTabId();
+  EXPECT_TRUE(ActionHasDefaultState(*action, tab_id));
+  EnsureActionIsEnabledOnActiveTab(action);
+
+  std::unique_ptr<BrowserActionTestUtil> toolbar_helper =
+      BrowserActionTestUtil::Create(browser());
+
+  ASSERT_EQ(1, toolbar_helper->NumberOfBrowserActions());
+  EXPECT_EQ(extension->id(), toolbar_helper->GetExtensionId(0));
+
+  gfx::Image default_icon = toolbar_helper->GetIcon(0);
+  EXPECT_FALSE(default_icon.IsEmpty());
+
+  // Check the midpoint. All these icons are solid, but the rendered icon
+  // includes padding.
+  const int mid_x = default_icon.Width() / 2;
+  const int mid_y = default_icon.Height() / 2;
+  // Note: We only validate the color here as a quick-and-easy way of validating
+  // the icon is what we expect. Other tests do much more rigorous testing of
+  // the icon's rendering.
+  EXPECT_EQ(SK_ColorRED, default_icon.AsBitmap().getColor(mid_x, mid_y));
+
+  // Create a new tab.
+  ui_test_utils::NavigateToURLWithDisposition(
+      browser(), GURL("chrome://newtab"),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+
+  const int new_tab_id = GetActiveTabId();
+  EXPECT_NE(new_tab_id, tab_id);
+  EXPECT_TRUE(ActionHasDefaultState(*action, new_tab_id));
+  EnsureActionIsEnabledOnActiveTab(action);
+
+  // The new tab should still have the same icon (the default).
+  gfx::Image new_tab_icon = toolbar_helper->GetIcon(0);
+  EXPECT_FALSE(default_icon.IsEmpty());
+  EXPECT_EQ(SK_ColorRED, default_icon.AsBitmap().getColor(mid_x, mid_y));
+
+  // Set the icon for the new tab to a different icon in the extension package.
+  {
+    ResultCatcher result_catcher;
+    browsertest_util::ExecuteScriptInBackgroundPageNoWait(
+        profile(), extension->id(),
+        base::StringPrintf("setIcon({tabId: %d, path: 'blue_icon.png'});",
+                           new_tab_id));
+    EXPECT_TRUE(result_catcher.GetNextResult()) << result_catcher.message();
+  }
+
+  new_tab_icon = toolbar_helper->GetIcon(0);
+  EXPECT_FALSE(new_tab_icon.IsEmpty());
+  EXPECT_EQ(SK_ColorBLUE, new_tab_icon.AsBitmap().getColor(mid_x, mid_y));
+
+  // Next, set the icon to a dynamically-generated one (from canvas image data).
+  {
+    ResultCatcher result_catcher;
+    constexpr char kSetIconFromImageData[] =
+        R"({
+             let canvas = document.createElement('canvas');
+             canvas.width = 32;
+             canvas.height = 32;
+             let context = canvas.getContext('2d');
+             context.clearRect(0, 0, 32, 32);
+             context.fillStyle = '#00FF00';  // Green
+             context.fillRect(0, 0, 32, 32);
+             let imageData = context.getImageData(0, 0, 32, 32);
+             setIcon({tabId: %d, imageData: imageData});
+           })";
+    browsertest_util::ExecuteScriptInBackgroundPageNoWait(
+        profile(), extension->id(),
+        base::StringPrintf(kSetIconFromImageData, new_tab_id));
+    EXPECT_TRUE(result_catcher.GetNextResult()) << result_catcher.message();
+  }
+
+  new_tab_icon = toolbar_helper->GetIcon(0);
+  EXPECT_FALSE(new_tab_icon.IsEmpty());
+  EXPECT_EQ(SK_ColorGREEN, new_tab_icon.AsBitmap().getColor(mid_x, mid_y));
+
+  // Switch back to the first tab. The icon should still be red, since the other
+  // changes were for specific tabs.
+  browser()->tab_strip_model()->ActivateTabAt(0);
+  gfx::Image first_tab_icon = toolbar_helper->GetIcon(0);
+  EXPECT_FALSE(first_tab_icon.IsEmpty());
+  EXPECT_EQ(SK_ColorRED, first_tab_icon.AsBitmap().getColor(mid_x, mid_y));
+
+  // TODO(devlin): Add tests for setting icons as a dictionary of
+  // { size -> image_data }.
+}
+
 INSTANTIATE_TEST_SUITE_P(,
                          MultiActionAPITest,
                          testing::Values(ActionInfo::TYPE_ACTION,
diff --git a/chrome/browser/extensions/api/settings_private/chromeos_resolve_time_zone_by_geolocation_on_off.cc b/chrome/browser/extensions/api/settings_private/chromeos_resolve_time_zone_by_geolocation_on_off.cc
index 63e56da..35f577e 100644
--- a/chrome/browser/extensions/api/settings_private/chromeos_resolve_time_zone_by_geolocation_on_off.cc
+++ b/chrome/browser/extensions/api/settings_private/chromeos_resolve_time_zone_by_geolocation_on_off.cc
@@ -66,12 +66,11 @@
   if (!value->is_bool())
     return SetPrefResult::PREF_TYPE_MISMATCH;
 
-  // Check if preference is policy or primary-user controlled, or if the user is
-  // a child, and therefore cannot deactivate automatic timezone.
+  // Check if preference is policy or primary-user controlled, and therefore
+  // cannot deactivate automatic timezone.
   if (chromeos::system::TimeZoneResolverManager::
           IsTimeZoneResolutionPolicyControlled() ||
-      !profile_->IsSameProfile(ProfileManager::GetPrimaryUserProfile()) ||
-      profile_->IsChild()) {
+      !profile_->IsSameProfile(ProfileManager::GetPrimaryUserProfile())) {
     return SetPrefResult::PREF_NOT_MODIFIABLE;
   }
 
diff --git a/chrome/browser/extensions/api/settings_private/generated_time_zone_pref_base.cc b/chrome/browser/extensions/api/settings_private/generated_time_zone_pref_base.cc
index 133958a..1e3d563 100644
--- a/chrome/browser/extensions/api/settings_private/generated_time_zone_pref_base.cc
+++ b/chrome/browser/extensions/api/settings_private/generated_time_zone_pref_base.cc
@@ -36,11 +36,8 @@
 
 void GeneratedTimeZonePrefBase::UpdateTimeZonePrefControlledBy(
     settings_api::PrefObject* out_pref) const {
-  if (profile_->IsChild()) {
-    out_pref->controlled_by = settings_api::ControlledBy::CONTROLLED_BY_PARENT;
-    out_pref->enforcement = settings_api::ENFORCEMENT_ENFORCED;
-  } else if (chromeos::system::TimeZoneResolverManager::
-                 IsTimeZoneResolutionPolicyControlled()) {
+  if (chromeos::system::TimeZoneResolverManager::
+          IsTimeZoneResolutionPolicyControlled()) {
     out_pref->controlled_by = settings_api::CONTROLLED_BY_DEVICE_POLICY;
     out_pref->enforcement = settings_api::ENFORCEMENT_ENFORCED;
   } else if (!profile_->IsSameProfile(
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc
index b92f113..dd972f5 100644
--- a/chrome/browser/extensions/extension_service_unittest.cc
+++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -74,6 +74,7 @@
 #include "chrome/browser/ui/global_error/global_error.h"
 #include "chrome/browser/ui/global_error/global_error_service.h"
 #include "chrome/browser/ui/global_error/global_error_service_factory.h"
+#include "chrome/browser/ui/global_error/global_error_waiter.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
@@ -6764,14 +6765,12 @@
   // the expected number of errors in external_install_manager(). We also verify
   // that only the first BUBBLE_ALERT error is shown.
   for (size_t i = 0; i < data.size(); ++i) {
-    content::WindowedNotificationObserver global_error_observer(
-        chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED,
-        content::NotificationService::AllSources());
+    test::GlobalErrorWaiter error_waiter(profile());
     provider->UpdateOrAddExtension(data[i].id, data[i].version,
                                    data[i].crx_path);
     WaitForExternalExtensionInstalled();
     // Make sure ExternalInstallError::OnDialogReady() fires.
-    global_error_observer.Wait();
+    error_waiter.Wait();
 
     const size_t expected_error_count = i + 1u;
     std::vector<ExternalInstallError*> errors =
@@ -6813,15 +6812,13 @@
             data_dir().AppendASCII("update_from_webstore3.pem"),
             webstore_crx_three);
 
-    content::WindowedNotificationObserver global_error_observer(
-        chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED,
-        content::NotificationService::AllSources());
+    test::GlobalErrorWaiter error_waiter(profile());
     provider->UpdateOrAddExtension(
         updates_from_webstore3, "1",
         temp_dir().GetPath().AppendASCII("webstore3.crx"));
     WaitForExternalExtensionInstalled();
     // Make sure ExternalInstallError::OnDialogReady() fires.
-    global_error_observer.Wait();
+    error_waiter.Wait();
 
     std::vector<ExternalInstallError*> errors =
         service_->external_install_manager()->GetErrorsForTesting();
@@ -6866,14 +6863,12 @@
           data_dir().AppendASCII("update_from_webstore2.pem"),
           data[1].crx_path);
   {
-    content::WindowedNotificationObserver global_error_observer(
-        chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED,
-        content::NotificationService::AllSources());
+    test::GlobalErrorWaiter error_waiter(profile());
     provider->UpdateOrAddExtension(data[0].id, data[0].version,
                                    data[0].crx_path);
     WaitForExternalExtensionInstalled();
     // Make sure ExternalInstallError::OnDialogReady() fires.
-    global_error_observer.Wait();
+    error_waiter.Wait();
 
     std::vector<ExternalInstallError*> errors =
         service_->external_install_manager()->GetErrorsForTesting();
@@ -6903,14 +6898,12 @@
   // BUBBLE_ALERT.
   // Make sure that this bubble alert does not replace the current bubble alert.
   {
-    content::WindowedNotificationObserver global_error_observer(
-        chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED,
-        content::NotificationService::AllSources());
+    test::GlobalErrorWaiter error_waiter(profile());
     provider->UpdateOrAddExtension(data[1].id, data[1].version,
                                    data[1].crx_path);
     WaitForExternalExtensionInstalled();
     // Make sure ExternalInstallError::OnDialogReady() fires.
-    global_error_observer.Wait();
+    error_waiter.Wait();
 
     std::vector<ExternalInstallError*> errors =
         service_->external_install_manager()->GetErrorsForTesting();
diff --git a/chrome/browser/extensions/external_install_error_browsertest.cc b/chrome/browser/extensions/external_install_error_browsertest.cc
index 6319220..4100c6d 100644
--- a/chrome/browser/extensions/external_install_error_browsertest.cc
+++ b/chrome/browser/extensions/external_install_error_browsertest.cc
@@ -2,12 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/extensions/external_install_error.h"
-
-#include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/extensions/extension_browsertest.h"
 #include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/external_install_error.h"
 #include "chrome/browser/extensions/external_install_manager.h"
+#include "chrome/browser/ui/global_error/global_error_waiter.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/test/test_utils.h"
 #include "extensions/browser/extension_prefs.h"
@@ -17,14 +16,7 @@
 
 namespace extensions {
 
-class ExternalInstallErrorTest : public ExtensionBrowserTest {
- public:
-  ExternalInstallErrorTest() = default;
-  ~ExternalInstallErrorTest() override = default;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(ExternalInstallErrorTest);
-};
+using ExternalInstallErrorTest = ExtensionBrowserTest;
 
 // Test that global errors don't crash on shutdown. See crbug.com/720081.
 IN_PROC_BROWSER_TEST_F(ExternalInstallErrorTest, TestShutdown) {
@@ -36,9 +28,7 @@
   {
     // Wait for an external extension to be installed and a global error about
     // it added.
-    content::WindowedNotificationObserver global_error_observer(
-        chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED,
-        content::NotificationService::AllSources());
+    test::GlobalErrorWaiter waiter(profile());
     content::WindowedNotificationObserver install_observer(
         NOTIFICATION_CRX_INSTALLER_DONE,
         content::NotificationService::AllSources());
@@ -49,7 +39,7 @@
     extension_service()->AddProviderForTesting(std::move(provider));
     extension_service()->CheckForExternalUpdates();
     install_observer.Wait();
-    global_error_observer.Wait();
+    waiter.Wait();
   }
 
   // Verify the extension is in the expected state (disabled for being
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 8ee2c512..2d76195 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -2923,6 +2923,11 @@
     "expiry_milestone": 80
   },
   {
+    "name": "touch-to-fill",
+    "owners": [ "jdoerrie" ],
+    "expiry_milestone": 80
+  },
+  {
     "name": "touchpad-overscroll-history-navigation",
     "owners": [ "chaopeng", "input-dev" ],
     "expiry_milestone": 76
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 8827816..a3ee270 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -1891,6 +1891,11 @@
 const char kTouchSelectionStrategyCharacter[] = "Character";
 const char kTouchSelectionStrategyDirection[] = "Direction";
 
+const char kTouchToFillAndroidName[] = "Touch To Fill UI for Passwords";
+const char kTouchToFillAndroidDescription[] =
+    "Adds a Touch To Fill sheet to the keyboard accessory which will be shown "
+    "instead of the keyboard when a password can be filled.";
+
 const char kTraceUploadUrlName[] = "Trace label for navigation tracing";
 const char kTraceUploadUrlDescription[] =
     "This is to be used in conjunction with the enable-navigation-tracing "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 1eddd0c..e5aff3b25 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1122,6 +1122,9 @@
 extern const char kTouchSelectionStrategyCharacter[];
 extern const char kTouchSelectionStrategyDirection[];
 
+extern const char kTouchToFillAndroidName[];
+extern const char kTouchToFillAndroidDescription[];
+
 extern const char kTraceUploadUrlName[];
 extern const char kTraceUploadUrlDescription[];
 extern const char kTraceUploadUrlChoiceOther[];
diff --git a/chrome/browser/hid/chrome_hid_delegate.cc b/chrome/browser/hid/chrome_hid_delegate.cc
index 697cb92..4b9ec91 100644
--- a/chrome/browser/hid/chrome_hid_delegate.cc
+++ b/chrome/browser/hid/chrome_hid_delegate.cc
@@ -42,31 +42,32 @@
 }
 
 bool ChromeHidDelegate::CanRequestDevicePermission(
-    content::RenderFrameHost* frame) {
-  auto* web_contents = content::WebContents::FromRenderFrameHost(frame);
+    content::WebContents* web_contents,
+    const url::Origin& requesting_origin) {
   auto* profile =
       Profile::FromBrowserContext(web_contents->GetBrowserContext());
   auto* chooser_context = HidChooserContextFactory::GetForProfile(profile);
-  return chooser_context->CanRequestObjectPermission(
-      frame->GetLastCommittedOrigin(),
-      web_contents->GetMainFrame()->GetLastCommittedOrigin());
+  const auto& embedding_origin =
+      web_contents->GetMainFrame()->GetLastCommittedOrigin();
+  return chooser_context->CanRequestObjectPermission(requesting_origin,
+                                                     embedding_origin);
 }
 
 bool ChromeHidDelegate::HasDevicePermission(
-    content::RenderFrameHost* frame,
+    content::WebContents* web_contents,
+    const url::Origin& requesting_origin,
     const device::mojom::HidDeviceInfo& device) {
-  auto* web_contents = content::WebContents::FromRenderFrameHost(frame);
   auto* profile =
       Profile::FromBrowserContext(web_contents->GetBrowserContext());
   auto* chooser_context = HidChooserContextFactory::GetForProfile(profile);
-  return chooser_context->HasDevicePermission(
-      frame->GetLastCommittedOrigin(),
-      web_contents->GetMainFrame()->GetLastCommittedOrigin(), device);
+  const auto& embedding_origin =
+      web_contents->GetMainFrame()->GetLastCommittedOrigin();
+  return chooser_context->HasDevicePermission(requesting_origin,
+                                              embedding_origin, device);
 }
 
 device::mojom::HidManager* ChromeHidDelegate::GetHidManager(
-    content::RenderFrameHost* frame) {
-  auto* web_contents = content::WebContents::FromRenderFrameHost(frame);
+    content::WebContents* web_contents) {
   auto* profile =
       Profile::FromBrowserContext(web_contents->GetBrowserContext());
   auto* chooser_context = HidChooserContextFactory::GetForProfile(profile);
diff --git a/chrome/browser/hid/chrome_hid_delegate.h b/chrome/browser/hid/chrome_hid_delegate.h
index 5c174e9..3ff4be5 100644
--- a/chrome/browser/hid/chrome_hid_delegate.h
+++ b/chrome/browser/hid/chrome_hid_delegate.h
@@ -19,11 +19,14 @@
       content::RenderFrameHost* frame,
       std::vector<blink::mojom::HidDeviceFilterPtr> filters,
       content::HidChooser::Callback callback) override;
-  bool CanRequestDevicePermission(content::RenderFrameHost* frame) override;
-  bool HasDevicePermission(content::RenderFrameHost* frame,
+  bool CanRequestDevicePermission(
+      content::WebContents* web_contents,
+      const url::Origin& requesting_origin) override;
+  bool HasDevicePermission(content::WebContents* web_contents,
+                           const url::Origin& requesting_origin,
                            const device::mojom::HidDeviceInfo& device) override;
   device::mojom::HidManager* GetHidManager(
-      content::RenderFrameHost* frame) override;
+      content::WebContents* web_contents) override;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(ChromeHidDelegate);
diff --git a/chrome/browser/media/DEPS b/chrome/browser/media/DEPS
index 4439343..1ab3f91 100644
--- a/chrome/browser/media/DEPS
+++ b/chrome/browser/media/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
+  "+chrome/android/features/media_router/jni_headers",
   "+media/audio",
   "+media/base",
   "+media/cast",
@@ -10,7 +11,6 @@
   "+services/data_decoder/data_decoder_service.h",
   "+services/data_decoder/public",
   "+services/device/public/mojom",
-  "+chrome/android/features/media_router/jni_headers",
 ]
 
 specific_include_rules = {
diff --git a/chrome/browser/media/webrtc/webrtc_video_quality_browsertest.cc b/chrome/browser/media/webrtc/webrtc_video_quality_browsertest.cc
index 2ca00c5..f989fba5 100644
--- a/chrome/browser/media/webrtc/webrtc_video_quality_browsertest.cc
+++ b/chrome/browser/media/webrtc/webrtc_video_quality_browsertest.cc
@@ -58,8 +58,6 @@
     FILE_PATH_LITERAL("captured_video.yuv");
 static const base::FilePath::CharType kCapturedWebmFileName[] =
     FILE_PATH_LITERAL("captured_video.webm");
-static const base::FilePath::CharType kStatsFileName[] =
-    FILE_PATH_LITERAL("stats.txt");
 static const char kMainWebrtcTestHtmlPage[] =
     "/webrtc/webrtc_jsep01_test.html";
 static const char kCapturingWebrtcHtmlPage[] =
@@ -91,11 +89,6 @@
 // You must also compile the frame_analyzer target before you run this
 // test to get all the tools built.
 //
-// The external compare_videos.py script also depends on two external
-// executables which must be located in the PATH when running this test.
-// * zxing (see the CPP version at https://code.google.com/p/zxing)
-// * ffmpeg 0.11.1 or compatible version (see http://www.ffmpeg.org)
-//
 // The test runs several custom binaries - rgba_to_i420 converter and
 // frame_analyzer. Both tools can be found under third_party/webrtc/rtc_tools.
 // The test also runs a stand alone Python implementation of a WebSocket server
@@ -179,18 +172,15 @@
   // Compares the |captured_video_filename| with the |reference_video_filename|.
   //
   // The barcode decoder decodes the captured video containing barcodes overlaid
-  // into every frame of the video. It produces a set of PNG images and a
-  // |stats_file| that maps each captured frame to a frame in the reference
-  // video. The frames should be of size |width| x |height|.
+  // into every frame of the video. It produces a set of PNG images.
+  // The frames should be of size |width| x |height|.
   // All measurements calculated are printed as perf parsable numbers to stdout.
   bool CompareVideosAndPrintResult(
       const std::string& test_label,
       int width,
       int height,
       const base::FilePath& captured_video_filename,
-      const base::FilePath& reference_video_filename,
-      const base::FilePath& stats_file) {
-
+      const base::FilePath& reference_video_filename) {
     base::FilePath path_to_analyzer = base::MakeAbsoluteFilePath(
         GetBrowserDir().Append(kFrameAnalyzerExecutable));
     base::FilePath path_to_compare_script = GetSourceDir().Append(
@@ -208,17 +198,6 @@
       return false;
     }
 
-    base::FilePath path_to_zxing = test::GetToolForPlatform("zxing");
-    if (!base::PathExists(path_to_zxing)) {
-      LOG(ERROR) << "Missing zxing: should be in " << path_to_zxing.value();
-      return false;
-    }
-    base::FilePath path_to_ffmpeg = test::GetToolForPlatform("ffmpeg");
-    if (!base::PathExists(path_to_ffmpeg)) {
-      LOG(ERROR) << "Missing ffmpeg: should be in " << path_to_ffmpeg.value();
-      return false;
-    }
-
     // Note: don't append switches to this command since it will mess up the
     // -u in the python invocation!
     base::CommandLine compare_command(base::CommandLine::NO_PROGRAM);
@@ -236,12 +215,6 @@
     compare_command.AppendArg(base::NumberToString(width));
     compare_command.AppendArg("--yuv_frame_height");
     compare_command.AppendArg(base::NumberToString(height));
-    compare_command.AppendArg("--zxing_path");
-    compare_command.AppendArgPath(path_to_zxing);
-    compare_command.AppendArg("--ffmpeg_path");
-    compare_command.AppendArgPath(path_to_ffmpeg);
-    compare_command.AppendArg("--stats_file");
-    compare_command.AppendArgPath(stats_file);
 
     DVLOG(0) << "Running " << compare_command.GetCommandLineString();
     std::string output;
@@ -312,8 +285,7 @@
         test_config_.height, GetWorkingDir().Append(kCapturedYuvFileName),
         test::GetReferenceFilesDir()
             .Append(test_config_.reference_video)
-            .AddExtension(test::kYuvFileExtension),
-        GetWorkingDir().Append(kStatsFileName)));
+            .AddExtension(test::kYuvFileExtension)));
   }
 
  protected:
diff --git a/chrome/browser/notifications/chrome_ash_message_center_client_unittest.cc b/chrome/browser/notifications/chrome_ash_message_center_client_unittest.cc
index d083784..f8e0f0b 100644
--- a/chrome/browser/notifications/chrome_ash_message_center_client_unittest.cc
+++ b/chrome/browser/notifications/chrome_ash_message_center_client_unittest.cc
@@ -115,7 +115,7 @@
 // in ChromeOS.
 
 TEST_F(ChromeAshMessageCenterClientTest, NotifierSortOrder) {
-  TestingProfile* profile = CreateProfile("Profile-1");
+  TestingProfile* profile = CreateProfile("profile1@gmail.com");
   extensions::TestExtensionSystem* test_extension_system =
       static_cast<extensions::TestExtensionSystem*>(
           extensions::ExtensionSystem::Get(profile));
@@ -229,7 +229,7 @@
 }
 
 TEST_F(ChromeAshMessageCenterClientTest, SetWebPageNotifierEnabled) {
-  Profile* profile = CreateProfile("MyProfile");
+  Profile* profile = CreateProfile("myprofile@gmail.com");
   CreateClient();
 
   GURL origin("https://example.com/");
diff --git a/chrome/browser/offline_pages/android/DEPS b/chrome/browser/offline_pages/android/DEPS
index cf1c484..51ec2c30 100644
--- a/chrome/browser/offline_pages/android/DEPS
+++ b/chrome/browser/offline_pages/android/DEPS
@@ -1,6 +1,6 @@
 include_rules = [
   # This folder contains Android-specific code.
   "+base/android",
-  "+chrome/browser/android",
   "+chrome/android/test_support_jni_headers",
+  "+chrome/browser/android",
 ]
diff --git a/chrome/browser/offline_pages/android/offline_test_util_jni.cc b/chrome/browser/offline_pages/android/offline_test_util_jni.cc
index 2f76339..3ff4dc2e 100644
--- a/chrome/browser/offline_pages/android/offline_test_util_jni.cc
+++ b/chrome/browser/offline_pages/android/offline_test_util_jni.cc
@@ -258,7 +258,7 @@
 void JNI_OfflineTestUtil_SetPrefetchingEnabledByServer(
     JNIEnv* env,
     const jboolean enabled) {
-  ProfileKey* key = ::android::GetMainProfileKey();
+  ProfileKey* key = ::android::GetLastUsedProfileKey();
 
   prefetch_prefs::SetEnabledByServer(key->GetPrefs(), enabled);
   if (!enabled) {
@@ -270,7 +270,7 @@
     JNIEnv* env,
     const JavaParamRef<jstring>& gcm_token) {
   prefetch_prefs::SetCachedPrefetchGCMToken(
-      ::android::GetMainProfileKey()->GetPrefs(),
+      ::android::GetLastUsedProfileKey()->GetPrefs(),
       base::android::ConvertJavaStringToUTF8(env, gcm_token));
 }
 
diff --git a/chrome/browser/offline_pages/android/prefetch_background_task_android.cc b/chrome/browser/offline_pages/android/prefetch_background_task_android.cc
index bb8abe71..eeeec54 100644
--- a/chrome/browser/offline_pages/android/prefetch_background_task_android.cc
+++ b/chrome/browser/offline_pages/android/prefetch_background_task_android.cc
@@ -27,7 +27,7 @@
 static jboolean JNI_PrefetchBackgroundTask_StartPrefetchTask(
     JNIEnv* env,
     const JavaParamRef<jobject>& jcaller) {
-  ProfileKey* profile_key = ::android::GetMainProfileKey();
+  ProfileKey* profile_key = ::android::GetLastUsedProfileKey();
   DCHECK(profile_key);
 
   PrefetchService* prefetch_service =
diff --git a/chrome/browser/offline_pages/android/prefetch_configuration_impl_android.cc b/chrome/browser/offline_pages/android/prefetch_configuration_impl_android.cc
index 2a6d1d1..40a2296 100644
--- a/chrome/browser/offline_pages/android/prefetch_configuration_impl_android.cc
+++ b/chrome/browser/offline_pages/android/prefetch_configuration_impl_android.cc
@@ -4,15 +4,10 @@
 
 #include "base/android/jni_android.h"
 #include "chrome/android/chrome_jni_headers/PrefetchConfiguration_jni.h"
-#include "chrome/browser/android/profile_key_util.h"
-#include "chrome/browser/offline_pages/prefetch/prefetch_service_factory.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/profiles/profile_android.h"
 #include "chrome/browser/profiles/profile_key.h"
-#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/profiles/profile_key_android.h"
 #include "components/offline_pages/core/offline_page_feature.h"
 #include "components/offline_pages/core/prefetch/prefetch_prefs.h"
-#include "components/offline_pages/core/prefetch/prefetch_service.h"
 
 using base::android::JavaParamRef;
 
@@ -22,39 +17,51 @@
 namespace offline_pages {
 namespace android {
 
+JNI_EXPORT jboolean JNI_PrefetchConfiguration_IsPrefetchingEnabled(
+    JNIEnv* env,
+    const JavaParamRef<jobject>& jkey) {
+  ProfileKey* key = ProfileKeyAndroid::FromProfileKeyAndroid(jkey);
+  return static_cast<jboolean>(prefetch_prefs::IsEnabled(key->GetPrefs()));
+}
+
 JNI_EXPORT jboolean
-JNI_PrefetchConfiguration_IsPrefetchingEnabled(JNIEnv* env) {
+JNI_PrefetchConfiguration_IsEnabledByServer(JNIEnv* env,
+                                            const JavaParamRef<jobject>& jkey) {
+  ProfileKey* key = ProfileKeyAndroid::FromProfileKeyAndroid(jkey);
   return static_cast<jboolean>(
-      prefetch_prefs::IsEnabled(::android::GetMainProfileKey()->GetPrefs()));
+      prefetch_prefs::IsEnabledByServer(key->GetPrefs()));
 }
 
-JNI_EXPORT jboolean JNI_PrefetchConfiguration_IsEnabledByServer(JNIEnv* env) {
-  return static_cast<jboolean>(prefetch_prefs::IsEnabledByServer(
-      ::android::GetMainProfileKey()->GetPrefs()));
+JNI_EXPORT jboolean JNI_PrefetchConfiguration_IsForbiddenCheckDue(
+    JNIEnv* env,
+    const JavaParamRef<jobject>& jkey) {
+  ProfileKey* key = ProfileKeyAndroid::FromProfileKeyAndroid(jkey);
+  return static_cast<jboolean>(
+      prefetch_prefs::IsForbiddenCheckDue(key->GetPrefs()));
 }
 
-JNI_EXPORT jboolean JNI_PrefetchConfiguration_IsForbiddenCheckDue(JNIEnv* env) {
-  return static_cast<jboolean>(prefetch_prefs::IsForbiddenCheckDue(
-      ::android::GetMainProfileKey()->GetPrefs()));
-}
-
-JNI_EXPORT jboolean
-JNI_PrefetchConfiguration_IsEnabledByServerUnknown(JNIEnv* env) {
-  return static_cast<jboolean>(prefetch_prefs::IsEnabledByServerUnknown(
-      ::android::GetMainProfileKey()->GetPrefs()));
+JNI_EXPORT jboolean JNI_PrefetchConfiguration_IsEnabledByServerUnknown(
+    JNIEnv* env,
+    const JavaParamRef<jobject>& jkey) {
+  ProfileKey* key = ProfileKeyAndroid::FromProfileKeyAndroid(jkey);
+  return static_cast<jboolean>(
+      prefetch_prefs::IsEnabledByServerUnknown(key->GetPrefs()));
 }
 
 JNI_EXPORT void JNI_PrefetchConfiguration_SetPrefetchingEnabledInSettings(
     JNIEnv* env,
+    const JavaParamRef<jobject>& jkey,
     jboolean enabled) {
-  prefetch_prefs::SetPrefetchingEnabledInSettings(
-      ::android::GetMainProfileKey()->GetPrefs(), enabled);
+  ProfileKey* key = ProfileKeyAndroid::FromProfileKeyAndroid(jkey);
+  prefetch_prefs::SetPrefetchingEnabledInSettings(key->GetPrefs(), enabled);
 }
 
-JNI_EXPORT jboolean
-JNI_PrefetchConfiguration_IsPrefetchingEnabledInSettings(JNIEnv* env) {
-  return static_cast<jboolean>(prefetch_prefs::IsPrefetchingEnabledInSettings(
-      ::android::GetMainProfileKey()->GetPrefs()));
+JNI_EXPORT jboolean JNI_PrefetchConfiguration_IsPrefetchingEnabledInSettings(
+    JNIEnv* env,
+    const JavaParamRef<jobject>& jkey) {
+  ProfileKey* key = ProfileKeyAndroid::FromProfileKeyAndroid(jkey);
+  return static_cast<jboolean>(
+      prefetch_prefs::IsPrefetchingEnabledInSettings(key->GetPrefs()));
 }
 
 }  // namespace android
diff --git a/chrome/browser/offline_pages/android/prefetch_test_bridge.cc b/chrome/browser/offline_pages/android/prefetch_test_bridge.cc
index ca7eac9b..128c86e 100644
--- a/chrome/browser/offline_pages/android/prefetch_test_bridge.cc
+++ b/chrome/browser/offline_pages/android/prefetch_test_bridge.cc
@@ -34,13 +34,13 @@
     JNIEnv* env,
     jboolean enable) {
   prefetch_prefs::SetLimitlessPrefetchingEnabled(
-      ::android::GetMainProfileKey()->GetPrefs(), enable != 0);
+      ::android::GetLastUsedProfileKey()->GetPrefs(), enable != 0);
 }
 
 JNI_EXPORT jboolean
 JNI_PrefetchTestBridge_IsLimitlessPrefetchingEnabled(JNIEnv* env) {
   return static_cast<jboolean>(prefetch_prefs::IsLimitlessPrefetchingEnabled(
-      ::android::GetMainProfileKey()->GetPrefs()));
+      ::android::GetLastUsedProfileKey()->GetPrefs()));
 }
 
 JNI_EXPORT void JNI_PrefetchTestBridge_SkipNTPSuggestionsAPIKeyCheck(
@@ -54,7 +54,7 @@
     const JavaParamRef<jstring>& j_url,
     const JavaParamRef<jbyteArray>& j_image_data) {
   image_fetcher::ImageFetcherService* service =
-      ImageFetcherServiceFactory::GetForKey(::android::GetMainProfileKey());
+      ImageFetcherServiceFactory::GetForKey(::android::GetLastUsedProfileKey());
   DCHECK(service);
   scoped_refptr<image_fetcher::ImageCache> cache =
       service->ImageCacheForTesting();
@@ -86,7 +86,7 @@
       PrefetchURL(url.spec(), url, title, GURL(thumbnail_url),
                   GURL(favicon_url), snippet, attribution)};
 
-  PrefetchServiceFactory::GetForKey(::android::GetMainProfileKey())
+  PrefetchServiceFactory::GetForKey(::android::GetLastUsedProfileKey())
       ->GetPrefetchDispatcher()
       ->AddCandidatePrefetchURLs(kSuggestedArticlesNamespace,
                                  new_candidate_urls);
diff --git a/chrome/browser/page_load_metrics/observers/previews_ukm_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/previews_ukm_observer_unittest.cc
index 4774d1e6..5919754c 100644
--- a/chrome/browser/page_load_metrics/observers/previews_ukm_observer_unittest.cc
+++ b/chrome/browser/page_load_metrics/observers/previews_ukm_observer_unittest.cc
@@ -214,9 +214,7 @@
     navigation->Commit();
   }
 
-  void ValidateUKM(bool server_lofi_expected,
-                   bool client_lofi_expected,
-                   bool lite_page_expected,
+  void ValidateUKM(bool lite_page_expected,
                    bool lite_page_redirect_expected,
                    bool noscript_expected,
                    bool resource_loading_hints_expected,
@@ -231,8 +229,7 @@
                    base::Optional<base::TimeDelta> navigation_restart_penalty,
                    base::Optional<int64_t> hint_generation_timestamp,
                    base::Optional<int> hint_source) {
-    ValidatePreviewsUKM(server_lofi_expected, client_lofi_expected,
-                        lite_page_expected, lite_page_redirect_expected,
+    ValidatePreviewsUKM(lite_page_expected, lite_page_redirect_expected,
                         noscript_expected, resource_loading_hints_expected,
                         opt_out_value, origin_opt_out_expected,
                         save_data_enabled_expected, offline_preview_expected,
@@ -270,8 +267,6 @@
 
  private:
   void ValidatePreviewsUKM(
-      bool server_lofi_expected,
-      bool client_lofi_expected,
       bool lite_page_expected,
       bool lite_page_redirect_expected,
       bool noscript_expected,
@@ -287,11 +282,11 @@
       base::Optional<base::TimeDelta> navigation_restart_penalty) {
     using UkmEntry = ukm::builders::Previews;
     auto entries = test_ukm_recorder().GetEntriesByName(UkmEntry::kEntryName);
-    if (!server_lofi_expected && !client_lofi_expected && !lite_page_expected &&
-        !lite_page_redirect_expected && !noscript_expected &&
-        !resource_loading_hints_expected && opt_out_value == 0 &&
-        !origin_opt_out_expected && !save_data_enabled_expected &&
-        !offline_preview_expected && !previews_likely_expected &&
+    if (!lite_page_expected && !lite_page_redirect_expected &&
+        !noscript_expected && !resource_loading_hints_expected &&
+        opt_out_value == 0 && !origin_opt_out_expected &&
+        !save_data_enabled_expected && !offline_preview_expected &&
+        !previews_likely_expected &&
         coin_flip_result_expected == CoinFlipHoldbackResult::kNotSet &&
         !navigation_restart_penalty.has_value()) {
       EXPECT_EQ(0u, entries.size());
@@ -300,10 +295,6 @@
     EXPECT_EQ(1u, entries.size());
     for (const auto* const entry : entries) {
       test_ukm_recorder().ExpectEntrySourceHasUrl(entry, GURL(kDefaultTestUrl));
-      EXPECT_EQ(server_lofi_expected, test_ukm_recorder().EntryHasMetric(
-                                          entry, UkmEntry::kserver_lofiName));
-      EXPECT_EQ(client_lofi_expected, test_ukm_recorder().EntryHasMetric(
-                                          entry, UkmEntry::kclient_lofiName));
       EXPECT_EQ(lite_page_expected, test_ukm_recorder().EntryHasMetric(
                                         entry, UkmEntry::klite_pageName));
       EXPECT_EQ(lite_page_redirect_expected,
@@ -458,8 +449,7 @@
           base::nullopt /* hint_version_string */);
   NavigateToUntrackedUrl();
 
-  ValidateUKM(false /* server_lofi_expected */,
-              false /* client_lofi_expected */, false /* lite_page_expected */,
+  ValidateUKM(false /* lite_page_expected */,
               false /* lite_page_redirect_expected */,
               false /* noscript_expected */,
               false /* resource_loading_hints_expected */,
@@ -485,8 +475,7 @@
   NavigateToUntrackedUrl();
 
   // Opt out should not be added since we don't track this type.
-  ValidateUKM(false /* server_lofi_expected */,
-              false /* client_lofi_expected */, false /* lite_page_expected */,
+  ValidateUKM(false /* lite_page_expected */,
               false /* lite_page_redirect_expected */,
               false /* noscript_expected */,
               false /* resource_loading_hints_expected */,
@@ -511,8 +500,7 @@
 
   NavigateToUntrackedUrl();
 
-  ValidateUKM(false /* server_lofi_expected */,
-              false /* client_lofi_expected */, true /* lite_page_expected */,
+  ValidateUKM(true /* lite_page_expected */,
               false /* lite_page_redirect_expected */,
               false /* noscript_expected */,
               false /* resource_loading_hints_expected */,
@@ -538,8 +526,7 @@
   observer()->BroadcastEventToObservers(PreviewsUITabHelper::OptOutEventKey());
   NavigateToUntrackedUrl();
 
-  ValidateUKM(false /* server_lofi_expected */,
-              false /* client_lofi_expected */, true /* lite_page_expected */,
+  ValidateUKM(true /* lite_page_expected */,
               false /* lite_page_redirect_expected */,
               false /* noscript_expected */,
               false /* resource_loading_hints_expected */,
@@ -564,8 +551,7 @@
 
   NavigateToUntrackedUrl();
 
-  ValidateUKM(false /* server_lofi_expected */,
-              false /* client_lofi_expected */, false /* lite_page_expected */,
+  ValidateUKM(false /* lite_page_expected */,
               true /* lite_page_redirect_expected */,
               false /* noscript_expected */,
               false /* resource_loading_hints_expected */,
@@ -591,8 +577,7 @@
   observer()->BroadcastEventToObservers(PreviewsUITabHelper::OptOutEventKey());
   NavigateToUntrackedUrl();
 
-  ValidateUKM(false /* server_lofi_expected */,
-              false /* client_lofi_expected */, false /* lite_page_expected */,
+  ValidateUKM(false /* lite_page_expected */,
               true /* lite_page_redirect_expected */,
               false /* noscript_expected */,
               false /* resource_loading_hints_expected */,
@@ -617,7 +602,7 @@
   NavigateToUntrackedUrl();
 
   ValidateUKM(
-      false /* server_lofi_expected */, false /* client_lofi_expected */,
+
       false /* lite_page_expected */, false /* lite_page_redirect_expected */,
       true /* noscript_expected */, false /* resource_loading_hints_expected */,
       0 /* opt_out_value */, false /* origin_opt_out_expected */,
@@ -643,7 +628,7 @@
   NavigateToUntrackedUrl();
 
   ValidateUKM(
-      false /* server_lofi_expected */, false /* client_lofi_expected */,
+
       false /* lite_page_expected */, false /* lite_page_redirect_expected */,
       true /* noscript_expected */, false /* resource_loading_hints_expected */,
       2 /* opt_out_value */, false /* origin_opt_out_expected */,
@@ -667,8 +652,7 @@
 
   NavigateToUntrackedUrl();
 
-  ValidateUKM(false /* server_lofi_expected */,
-              false /* client_lofi_expected */, false /* lite_page_expected */,
+  ValidateUKM(false /* lite_page_expected */,
               false /* lite_page_redirect_expected */,
               false /* noscript_expected */,
               false /* resource_loading_hints_expected */,
@@ -694,7 +678,7 @@
   NavigateToUntrackedUrl();
 
   ValidateUKM(
-      false /* server_lofi_expected */, false /* client_lofi_expected */,
+
       false /* lite_page_expected */, false /* lite_page_redirect_expected */,
       false /* noscript_expected */, true /* resource_loading_hints_expected */,
       0 /* opt_out_value */, false /* origin_opt_out_expected */,
@@ -720,7 +704,7 @@
   NavigateToUntrackedUrl();
 
   ValidateUKM(
-      false /* server_lofi_expected */, false /* client_lofi_expected */,
+
       false /* lite_page_expected */, false /* lite_page_redirect_expected */,
       false /* noscript_expected */, true /* resource_loading_hints_expected */,
       2 /* opt_out_value */, false /* origin_opt_out_expected */,
@@ -744,8 +728,7 @@
 
   NavigateToUntrackedUrl();
 
-  ValidateUKM(false /* server_lofi_expected */,
-              false /* client_lofi_expected */, false /* lite_page_expected */,
+  ValidateUKM(false /* lite_page_expected */,
               false /* lite_page_redirect_expected */,
               false /* noscript_expected */,
               false /* resource_loading_hints_expected */,
@@ -770,8 +753,7 @@
 
   NavigateToUntrackedUrl();
 
-  ValidateUKM(false /* server_lofi_expected */,
-              false /* client_lofi_expected */, false /* lite_page_expected */,
+  ValidateUKM(false /* lite_page_expected */,
               false /* lite_page_redirect_expected */,
               false /* noscript_expected */,
               false /* resource_loading_hints_expected */,
@@ -800,7 +782,7 @@
   NavigateToUntrackedUrl();
 
   ValidateUKM(
-      false /* server_lofi_expected */, false /* client_lofi_expected */,
+
       false /* lite_page_expected */, false /* lite_page_redirect_expected */,
       false /* noscript_expected */,
       false /* resource_loading_hints_expected */, 0 /* opt_out_value */,
@@ -825,8 +807,7 @@
 
   NavigateToUntrackedUrl();
 
-  ValidateUKM(false /* server_lofi_expected */,
-              false /* client_lofi_expected */, false /* lite_page_expected */,
+  ValidateUKM(false /* lite_page_expected */,
               false /* lite_page_redirect_expected */,
               false /* noscript_expected */,
               false /* resource_loading_hints_expected */,
@@ -851,8 +832,7 @@
 
   NavigateToUntrackedUrl();
 
-  ValidateUKM(false /* server_lofi_expected */,
-              false /* client_lofi_expected */, false /* lite_page_expected */,
+  ValidateUKM(false /* lite_page_expected */,
               false /* lite_page_redirect_expected */,
               false /* noscript_expected */,
               false /* resource_loading_hints_expected */,
@@ -877,8 +857,7 @@
 
   NavigateToUntrackedUrl();
 
-  ValidateUKM(false /* server_lofi_expected */,
-              false /* client_lofi_expected */, false /* lite_page_expected */,
+  ValidateUKM(false /* lite_page_expected */,
               false /* lite_page_redirect_expected */,
               false /* noscript_expected */,
               false /* resource_loading_hints_expected */,
@@ -903,8 +882,7 @@
 
   NavigateToUntrackedUrl();
 
-  ValidateUKM(false /* server_lofi_expected */,
-              false /* client_lofi_expected */, false /* lite_page_expected */,
+  ValidateUKM(false /* lite_page_expected */,
               false /* lite_page_redirect_expected */,
               false /* noscript_expected */,
               false /* resource_loading_hints_expected */,
@@ -929,8 +907,7 @@
 
   NavigateToUntrackedUrl();
 
-  ValidateUKM(false /* server_lofi_expected */,
-              false /* client_lofi_expected */, false /* lite_page_expected */,
+  ValidateUKM(false /* lite_page_expected */,
               false /* lite_page_redirect_expected */,
               false /* noscript_expected */,
               false /* resource_loading_hints_expected */,
@@ -964,8 +941,7 @@
 
   NavigateToUntrackedUrl();
 
-  ValidateUKM(false /* server_lofi_expected */,
-              false /* client_lofi_expected */, false /* lite_page_expected */,
+  ValidateUKM(false /* lite_page_expected */,
               false /* lite_page_redirect_expected */,
               false /* noscript_expected */,
               false /* resource_loading_hints_expected */,
@@ -1006,8 +982,7 @@
 
   NavigateToUntrackedUrl();
 
-  ValidateUKM(false /* server_lofi_expected */,
-              false /* client_lofi_expected */, false /* lite_page_expected */,
+  ValidateUKM(false /* lite_page_expected */,
               false /* lite_page_redirect_expected */,
               false /* noscript_expected */,
               false /* resource_loading_hints_expected */,
@@ -1046,7 +1021,7 @@
   NavigateToUntrackedUrl();
 
   ValidateUKM(
-      false /* server_lofi_expected */, false /* client_lofi_expected */,
+
       false /* lite_page_expected */, false /* lite_page_redirect_expected */,
       false /* noscript_expected */,
       false /* resource_loading_hints_expected */, 0 /* opt_out_value */,
@@ -1077,7 +1052,7 @@
   NavigateToUntrackedUrl();
 
   ValidateUKM(
-      false /* server_lofi_expected */, false /* client_lofi_expected */,
+
       false /* lite_page_expected */, false /* lite_page_redirect_expected */,
       false /* noscript_expected */,
       false /* resource_loading_hints_expected */, 0 /* opt_out_value */,
@@ -1101,8 +1076,7 @@
 
   NavigateToUntrackedUrl();
 
-  ValidateUKM(false /* server_lofi_expected */,
-              false /* client_lofi_expected */, false /* lite_page_expected */,
+  ValidateUKM(false /* lite_page_expected */,
               false /* lite_page_redirect_expected */,
               false /* noscript_expected */,
               false /* resource_loading_hints_expected */,
@@ -1127,8 +1101,7 @@
 
   web_contents()->WasHidden();
 
-  ValidateUKM(false /* server_lofi_expected */,
-              false /* client_lofi_expected */, false /* lite_page_expected */,
+  ValidateUKM(false /* lite_page_expected */,
               false /* lite_page_redirect_expected */,
               false /* noscript_expected */,
               false /* resource_loading_hints_expected */,
@@ -1153,8 +1126,7 @@
 
   SimulateAppEnterBackground();
 
-  ValidateUKM(false /* server_lofi_expected */,
-              false /* client_lofi_expected */, false /* lite_page_expected */,
+  ValidateUKM(false /* lite_page_expected */,
               false /* lite_page_redirect_expected */,
               false /* noscript_expected */,
               false /* resource_loading_hints_expected */,
diff --git a/chrome/browser/payments/android/ssl_validity_checker_android.cc b/chrome/browser/payments/android/ssl_validity_checker_android.cc
index 4a96c6f..65fff7ac 100644
--- a/chrome/browser/payments/android/ssl_validity_checker_android.cc
+++ b/chrome/browser/payments/android/ssl_validity_checker_android.cc
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/android/jni_string.h"
 #include "base/android/scoped_java_ref.h"
 #include "chrome/android/chrome_jni_headers/SslValidityChecker_jni.h"
 #include "chrome/browser/payments/ssl_validity_checker.h"
@@ -10,11 +11,15 @@
 namespace payments {
 
 // static
-jboolean JNI_SslValidityChecker_IsSslCertificateValid(
+base::android::ScopedJavaLocalRef<jstring>
+JNI_SslValidityChecker_GetInvalidSslCertificateErrorMessage(
     JNIEnv* env,
     const base::android::JavaParamRef<jobject>& jweb_contents) {
-  return SslValidityChecker::IsSslCertificateValid(
-      content::WebContents::FromJavaWebContents(jweb_contents));
+  content::WebContents* web_contents =
+      content::WebContents::FromJavaWebContents(jweb_contents);
+  return base::android::ConvertUTF8ToJavaString(
+      env,
+      SslValidityChecker::GetInvalidSslCertificateErrorMessage(web_contents));
 }
 
 // static
diff --git a/chrome/browser/payments/chrome_payment_request_delegate.cc b/chrome/browser/payments/chrome_payment_request_delegate.cc
index ca4c819..44468e6 100644
--- a/chrome/browser/payments/chrome_payment_request_delegate.cc
+++ b/chrome/browser/payments/chrome_payment_request_delegate.cc
@@ -6,6 +6,7 @@
 
 #include <vector>
 
+#include "base/logging.h"
 #include "base/memory/ref_counted.h"
 #include "chrome/browser/autofill/address_normalizer_factory.h"
 #include "chrome/browser/autofill/personal_data_manager_factory.h"
@@ -108,10 +109,6 @@
   return profile && profile->IsIncognitoProfile();
 }
 
-bool ChromePaymentRequestDelegate::IsSslCertificateValid() {
-  return SslValidityChecker::IsSslCertificateValid(web_contents_);
-}
-
 const GURL& ChromePaymentRequestDelegate::GetLastCommittedURL() const {
   return web_contents_->GetLastCommittedURL();
 }
@@ -194,4 +191,10 @@
   return shown_dialog_ && shown_dialog_->IsInteractive();
 }
 
+std::string
+ChromePaymentRequestDelegate::GetInvalidSslCertificateErrorMessage() {
+  return SslValidityChecker::GetInvalidSslCertificateErrorMessage(
+      web_contents_);
+}
+
 }  // namespace payments
diff --git a/chrome/browser/payments/chrome_payment_request_delegate.h b/chrome/browser/payments/chrome_payment_request_delegate.h
index c76e7a1..d40ba84e 100644
--- a/chrome/browser/payments/chrome_payment_request_delegate.h
+++ b/chrome/browser/payments/chrome_payment_request_delegate.h
@@ -33,7 +33,6 @@
   autofill::PersonalDataManager* GetPersonalDataManager() override;
   const std::string& GetApplicationLocale() const override;
   bool IsIncognito() const override;
-  bool IsSslCertificateValid() override;
   const GURL& GetLastCommittedURL() const override;
   void DoFullCardRequest(
       const autofill::CreditCard& credit_card,
@@ -54,6 +53,7 @@
       const GURL& url,
       PaymentHandlerOpenWindowCallback callback) override;
   bool IsInteractive() const override;
+  std::string GetInvalidSslCertificateErrorMessage() override;
 
  protected:
   // Reference to the dialog so that we can satisfy calls to CloseDialog(). This
diff --git a/chrome/browser/payments/ssl_validity_checker.cc b/chrome/browser/payments/ssl_validity_checker.cc
index fc4fb0dd..b1c7957 100644
--- a/chrome/browser/payments/ssl_validity_checker.cc
+++ b/chrome/browser/payments/ssl_validity_checker.cc
@@ -8,29 +8,69 @@
 #include "base/logging.h"
 #include "chrome/browser/ssl/security_state_tab_helper.h"
 #include "components/network_session_configurator/common/network_switches.h"
+#include "components/payments/core/error_strings.h"
 #include "components/payments/core/url_util.h"
 #include "components/security_state/core/security_state.h"
 #include "url/gurl.h"
 
 namespace payments {
+namespace {
 
-// static
-bool SslValidityChecker::IsSslCertificateValid(
+// Returns the security level of |web_contents|. The |web_contents| parameter
+// should not be null.
+security_state::SecurityLevel GetSecurityLevel(
     content::WebContents* web_contents) {
-  if (!web_contents)
-    return false;
-
+  DCHECK(web_contents);
   SecurityStateTabHelper::CreateForWebContents(web_contents);
   SecurityStateTabHelper* helper =
       SecurityStateTabHelper::FromWebContents(web_contents);
   DCHECK(helper);
-  security_state::SecurityLevel security_level = helper->GetSecurityLevel();
-  return security_level == security_state::EV_SECURE ||
-         security_level == security_state::SECURE ||
-         security_level == security_state::SECURE_WITH_POLICY_INSTALLED_CERT ||
-         // No early return, so the other code is exercised in tests, too.
-         base::CommandLine::ForCurrentProcess()->HasSwitch(
-             switches::kIgnoreCertificateErrors);
+  return helper->GetSecurityLevel();
+}
+
+}  // namespace
+
+// static std::string
+std::string SslValidityChecker::GetInvalidSslCertificateErrorMessage(
+    content::WebContents* web_contents) {
+  if (!web_contents)
+    return errors::kInvalidSslCertificate;
+
+  security_state::SecurityLevel security_level = GetSecurityLevel(web_contents);
+  std::string level;
+  switch (security_level) {
+    // Indicate valid SSL with an empty string.
+    case security_state::SECURE:
+    case security_state::EV_SECURE:
+    case security_state::SECURE_WITH_POLICY_INSTALLED_CERT:
+      return "";
+
+    case security_state::NONE:
+      level = "NONE";
+      break;
+    case security_state::HTTP_SHOW_WARNING:
+      level = "HTTP_SHOW_WARNING";
+      break;
+    case security_state::DANGEROUS:
+      level = "DANGEROUS";
+      break;
+
+    case security_state::SECURITY_LEVEL_COUNT:
+      NOTREACHED();
+      return errors::kInvalidSslCertificate;
+  }
+
+  std::string message;
+  bool replaced =
+      base::ReplaceChars(errors::kDetailedInvalidSslCertificateMessageFormat,
+                         "$", level, &message);
+  DCHECK(replaced);
+
+  // No early return, so the other code is exercised in tests, too.
+  return base::CommandLine::ForCurrentProcess()->HasSwitch(
+             switches::kIgnoreCertificateErrors)
+             ? ""
+             : message;
 }
 
 // static
@@ -43,8 +83,17 @@
   if (!UrlUtil::IsValidUrlInPaymentHandlerWindow(url))
     return false;
 
-  if (url.SchemeIsCryptographic())
-    return IsSslCertificateValid(web_contents);
+  if (url.SchemeIsCryptographic()) {
+    security_state::SecurityLevel security_level =
+        GetSecurityLevel(web_contents);
+    return security_level == security_state::SECURE ||
+           security_level == security_state::EV_SECURE ||
+           security_level ==
+               security_state::SECURE_WITH_POLICY_INSTALLED_CERT ||
+           // No early return, so the other code is exercised in tests, too.
+           base::CommandLine::ForCurrentProcess()->HasSwitch(
+               switches::kIgnoreCertificateErrors);
+  }
 
   return true;
 }
diff --git a/chrome/browser/payments/ssl_validity_checker.h b/chrome/browser/payments/ssl_validity_checker.h
index 76581b1..09dab3f 100644
--- a/chrome/browser/payments/ssl_validity_checker.h
+++ b/chrome/browser/payments/ssl_validity_checker.h
@@ -5,6 +5,8 @@
 #ifndef CHROME_BROWSER_PAYMENTS_SSL_VALIDITY_CHECKER_H_
 #define CHROME_BROWSER_PAYMENTS_SSL_VALIDITY_CHECKER_H_
 
+#include <string>
+
 #include "base/macros.h"
 
 namespace content {
@@ -15,11 +17,17 @@
 
 class SslValidityChecker {
  public:
-  // Returns true for |web_contents| with a valid SSL certificate. Only
-  // EV_SECURE, SECURE, and SECURE_WITH_POLICY_INSTALLED_CERT are considered
-  // valid for web payments, unless --ignore-ceritificate-errors is specified on
-  // the command line.
-  static bool IsSslCertificateValid(content::WebContents* web_contents);
+  // Returns a developer-facing error message for invalid SSL certificate state
+  // or an empty string when the SSL certificate is valid. Only EV_SECURE,
+  // SECURE, and SECURE_WITH_POLICY_INSTALLED_CERT are considered valid for web
+  // payments, unless --ignore-certificate-errors is specified on the command
+  // line.
+  //
+  // The |web_contents| parameter should not be null. A null
+  // |web_contents| parameter will return an "Invalid certificate" error
+  // message.
+  static std::string GetInvalidSslCertificateErrorMessage(
+      content::WebContents* web_contents);
 
   // Whether the given page should be allowed to be displayed in a payment
   // handler window.
diff --git a/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc b/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc
index b9cf8a2..3b209814 100644
--- a/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc
+++ b/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc
@@ -30,6 +30,16 @@
       weak_factory_(this) {}
 
 PluginResponseInterceptorURLLoaderThrottle::
+    PluginResponseInterceptorURLLoaderThrottle(
+        content::BrowserContext* browser_context,
+        int resource_type,
+        int frame_tree_node_id)
+    : browser_context_(browser_context),
+      resource_type_(resource_type),
+      frame_tree_node_id_(frame_tree_node_id),
+      weak_factory_(this) {}
+
+PluginResponseInterceptorURLLoaderThrottle::
     ~PluginResponseInterceptorURLLoaderThrottle() = default;
 
 void PluginResponseInterceptorURLLoaderThrottle::WillProcessResponse(
@@ -42,8 +52,17 @@
     return;
   }
 
-  std::string extension_id = PluginUtils::GetExtensionIdForMimeType(
-      resource_context_, response_head->mime_type);
+  std::string extension_id;
+  if (resource_context_) {
+    DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+    extension_id = PluginUtils::GetExtensionIdForMimeType(
+        resource_context_, response_head->mime_type);
+  } else {
+    DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+    extension_id = PluginUtils::GetExtensionIdForMimeType(
+        browser_context_, response_head->mime_type);
+  }
+
   if (extension_id.empty())
     return;
 
diff --git a/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.h b/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.h
index 061a7b5d..31e215e 100644
--- a/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.h
+++ b/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.h
@@ -12,6 +12,7 @@
 #include "content/public/common/url_loader_throttle.h"
 
 namespace content {
+class BrowserContext;
 class ResourceContext;
 }
 
@@ -30,6 +31,10 @@
       content::ResourceContext* resource_context,
       int resource_type,
       int frame_tree_node_id);
+  PluginResponseInterceptorURLLoaderThrottle(
+      content::BrowserContext* browser_context,
+      int resource_type,
+      int frame_tree_node_id);
   ~PluginResponseInterceptorURLLoaderThrottle() override;
 
  private:
@@ -41,7 +46,8 @@
   // layer chance to initialize its browser side state.
   void ResumeLoad();
 
-  content::ResourceContext* const resource_context_;
+  content::ResourceContext* const resource_context_ = nullptr;
+  content::BrowserContext* const browser_context_ = nullptr;
   const int resource_type_;
   const int frame_tree_node_id_;
 
diff --git a/chrome/browser/plugins/plugin_utils.cc b/chrome/browser/plugins/plugin_utils.cc
index 0f0847ab..73d60aa 100644
--- a/chrome/browser/plugins/plugin_utils.cc
+++ b/chrome/browser/plugins/plugin_utils.cc
@@ -15,6 +15,10 @@
 #include "url/origin.h"
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
+#include "chrome/common/pref_names.h"
+#include "components/prefs/pref_service.h"
+#include "extensions/browser/extension_registry.h"
+#include "extensions/browser/extension_util.h"
 #include "extensions/browser/info_map.h"
 #include "extensions/common/constants.h"
 #include "extensions/common/extension.h"
@@ -100,6 +104,45 @@
     *setting = ContentSetting::CONTENT_SETTING_DETECT_IMPORTANT_CONTENT;
 }
 
+// Helper function to get the mime type to extension map using data from either
+// ProfileIOData or Profile.
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+base::flat_map<std::string, std::string> GetMimeTypeToExtensionIdMapInternal(
+    bool profile_is_off_the_record,
+    bool always_open_pdf_externally,
+    base::RepeatingCallback<const extensions::Extension*(const std::string&)>
+        get_extension,
+    base::RepeatingCallback<bool(const std::string&)> is_incognito_enabled) {
+  base::flat_map<std::string, std::string> mime_type_to_extension_id_map;
+  std::vector<std::string> whitelist = MimeTypesHandler::GetMIMETypeWhitelist();
+  // Go through the white-listed extensions and try to use them to intercept
+  // the URL request.
+  for (const std::string& extension_id : whitelist) {
+    const extensions::Extension* extension = get_extension.Run(extension_id);
+    // The white-listed extension may not be installed, so we have to NULL check
+    // |extension|.
+    if (!extension || (profile_is_off_the_record &&
+                       !is_incognito_enabled.Run(extension_id))) {
+      continue;
+    }
+
+    if (extension_id == extension_misc::kPdfExtensionId &&
+        always_open_pdf_externally) {
+      continue;
+    }
+
+    if (MimeTypesHandler* handler = MimeTypesHandler::GetHandler(extension)) {
+      for (const auto& supported_mime_type : handler->mime_type_set()) {
+        DCHECK(!base::Contains(mime_type_to_extension_id_map,
+                               supported_mime_type));
+        mime_type_to_extension_id_map[supported_mime_type] = extension_id;
+      }
+    }
+  }
+  return mime_type_to_extension_id_map;
+}
+#endif
+
 }  // namespace
 
 // static
@@ -175,41 +218,54 @@
 }
 
 // static
+std::string PluginUtils::GetExtensionIdForMimeType(
+    content::BrowserContext* browser_context,
+    const std::string& mime_type) {
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+  Profile* profile = Profile::FromBrowserContext(browser_context);
+  auto map = GetMimeTypeToExtensionIdMapInternal(
+      profile->IsOffTheRecord(),
+      profile->GetPrefs()->GetBoolean(prefs::kPluginsAlwaysOpenPdfExternally),
+      base::BindRepeating(
+          [](content::BrowserContext* context,
+             const std::string& extension_id) {
+            return extensions::ExtensionRegistry::Get(context)
+                ->enabled_extensions()
+                .GetByID(extension_id);
+          },
+          browser_context),
+      base::BindRepeating(
+          [](content::BrowserContext* context,
+             const std::string& extension_id) {
+            return extensions::util::IsIncognitoEnabled(extension_id, context);
+          },
+          browser_context));
+  auto it = map.find(mime_type);
+  if (it != map.end())
+    return it->second;
+#endif
+  return std::string();
+}
+
 base::flat_map<std::string, std::string>
 PluginUtils::GetMimeTypeToExtensionIdMap(
     content::ResourceContext* resource_context) {
-  base::flat_map<std::string, std::string> mime_type_to_extension_id_map;
 #if BUILDFLAG(ENABLE_EXTENSIONS)
   ProfileIOData* io_data = ProfileIOData::FromResourceContext(resource_context);
-  bool profile_is_off_the_record = io_data->IsOffTheRecord();
-  const scoped_refptr<const extensions::InfoMap> extension_info_map(
+  scoped_refptr<extensions::InfoMap> extension_info_map(
       io_data->GetExtensionInfoMap());
-  std::vector<std::string> whitelist = MimeTypesHandler::GetMIMETypeWhitelist();
-  // Go through the white-listed extensions and try to use them to intercept
-  // the URL request.
-  for (const std::string& extension_id : whitelist) {
-    const extensions::Extension* extension =
-        extension_info_map->extensions().GetByID(extension_id);
-    // The white-listed extension may not be installed, so we have to NULL check
-    // |extension|.
-    if (!extension || (profile_is_off_the_record &&
-                       !extension_info_map->IsIncognitoEnabled(extension_id))) {
-      continue;
-    }
-
-    if (extension_id == extension_misc::kPdfExtensionId &&
-        io_data->always_open_pdf_externally()->GetValue()) {
-      continue;
-    }
-
-    if (MimeTypesHandler* handler = MimeTypesHandler::GetHandler(extension)) {
-      for (const auto& supported_mime_type : handler->mime_type_set()) {
-        DCHECK(!base::Contains(mime_type_to_extension_id_map,
-                               supported_mime_type));
-        mime_type_to_extension_id_map[supported_mime_type] = extension_id;
-      }
-    }
-  }
+  return GetMimeTypeToExtensionIdMapInternal(
+      io_data->IsOffTheRecord(),
+      io_data->always_open_pdf_externally()->GetValue(),
+      base::BindRepeating(
+          [](const scoped_refptr<extensions::InfoMap>& info_map,
+             const std::string& extension_id) {
+            return info_map->extensions().GetByID(extension_id);
+          },
+          extension_info_map),
+      base::BindRepeating(&extensions::InfoMap::IsIncognitoEnabled,
+                          extension_info_map));
+#else
+  return {};
 #endif
-  return mime_type_to_extension_id_map;
 }
diff --git a/chrome/browser/plugins/plugin_utils.h b/chrome/browser/plugins/plugin_utils.h
index 65f5cf6d..2751f5e 100644
--- a/chrome/browser/plugins/plugin_utils.h
+++ b/chrome/browser/plugins/plugin_utils.h
@@ -15,6 +15,7 @@
 class HostContentSettingsMap;
 
 namespace content {
+class BrowserContext;
 class ResourceContext;
 struct WebPluginInfo;
 }
@@ -61,9 +62,14 @@
 
   // If there's an extension that is allowed to handle |mime_type|, returns its
   // ID. Otherwise returns an empty string.
+  // Must be called on IO thread.
   static std::string GetExtensionIdForMimeType(
       content::ResourceContext* resource_context,
       const std::string& mime_type);
+  // Same as above, but must be called on UI thread.
+  static std::string GetExtensionIdForMimeType(
+      content::BrowserContext* browser_context,
+      const std::string& mime_type);
 
   // Returns a map populated with MIME types that are handled by an extension as
   // keys and the corresponding extensions Ids as values.
diff --git a/chrome/browser/previews/previews_prober.cc b/chrome/browser/previews/previews_prober.cc
new file mode 100644
index 0000000..15856e3
--- /dev/null
+++ b/chrome/browser/previews/previews_prober.cc
@@ -0,0 +1,116 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/previews/previews_prober.h"
+
+#include "net/base/load_flags.h"
+#include "net/base/net_errors.h"
+#include "net/http/http_status_code.h"
+#include "net/traffic_annotation/network_traffic_annotation.h"
+#include "services/network/public/cpp/resource_request.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "services/network/public/cpp/simple_url_loader.h"
+
+namespace {
+
+std::string HttpMethodToString(PreviewsProber::HttpMethod http_method) {
+  switch (http_method) {
+    case PreviewsProber::HttpMethod::kGet:
+      return "GET";
+    case PreviewsProber::HttpMethod::kHead:
+      return "HEAD";
+  }
+}
+
+}  // namespace
+
+PreviewsProber::PreviewsProber(
+    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
+    const std::string& name,
+    const GURL& url,
+    const HttpMethod http_method)
+    : name_(name),
+      url_(url),
+      http_method_(http_method),
+      is_active_(false),
+      last_probe_status_(base::nullopt),
+      url_loader_factory_(url_loader_factory) {}
+
+PreviewsProber::~PreviewsProber() = default;
+
+void PreviewsProber::SendNowIfInactive() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  if (is_active_)
+    return;
+  CreateAndStartURLLoader();
+}
+
+void PreviewsProber::CreateAndStartURLLoader() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(!is_active_);
+  DCHECK(!url_loader_);
+
+  is_active_ = true;
+
+  net::NetworkTrafficAnnotationTag traffic_annotation =
+      net::DefineNetworkTrafficAnnotation("previews_prober", R"(
+        semantics {
+          sender: "Previews Prober"
+          description:
+            "Requests a small resource to test network connectivity to a given "
+            "resource or domain which will either be a Google owned domain or"
+            "the website that the user is navigating to."
+          trigger:
+            "Requested when Lite mode and Previews are enabled on startup and "
+            "on every network change."
+          data: "None."
+          destination: WEBSITE
+        }
+        policy {
+          cookies_allowed: NO
+          setting:
+            "Users can control Lite mode on Android via the settings menu. "
+            "Lite mode is not available on iOS, and on desktop only for "
+            "developer testing."
+          policy_exception_justification: "Not implemented."
+        })");
+  auto request = std::make_unique<network::ResourceRequest>();
+  request->url = url_;
+  request->method = HttpMethodToString(http_method_);
+  request->load_flags = net::LOAD_DISABLE_CACHE;
+  request->allow_credentials = false;
+
+  // TODO(crbug/977603): Set retry options.
+  url_loader_ =
+      network::SimpleURLLoader::Create(std::move(request), traffic_annotation);
+
+  url_loader_->DownloadToString(
+      url_loader_factory_.get(),
+      base::BindOnce(&PreviewsProber::OnURLLoadComplete,
+                     base::Unretained(this)),
+      1024);
+}
+
+void PreviewsProber::OnURLLoadComplete(
+    std::unique_ptr<std::string> response_body) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  int response_code = -1;
+  if (url_loader_->ResponseInfo() && url_loader_->ResponseInfo()->headers) {
+    response_code = url_loader_->ResponseInfo()->headers->response_code();
+  }
+
+  // TODO(crbug/977603): Replace with delegate check.
+  last_probe_status_ =
+      url_loader_->NetError() == net::OK && response_code == net::HTTP_OK;
+
+  url_loader_.reset();
+  is_active_ = false;
+}
+
+base::Optional<bool> PreviewsProber::LastProbeWasSuccessful() const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  return last_probe_status_;
+}
diff --git a/chrome/browser/previews/previews_prober.h b/chrome/browser/previews/previews_prober.h
new file mode 100644
index 0000000..d7f9ad9
--- /dev/null
+++ b/chrome/browser/previews/previews_prober.h
@@ -0,0 +1,77 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_PREVIEWS_PREVIEWS_PROBER_H_
+#define CHROME_BROWSER_PREVIEWS_PREVIEWS_PROBER_H_
+
+#include <memory>
+#include <string>
+
+#include "base/macros.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/optional.h"
+#include "base/sequence_checker.h"
+#include "url/gurl.h"
+
+namespace network {
+class SimpleURLLoader;
+class SharedURLLoaderFactory;
+}  // namespace network
+
+// This class is a utility to probe a given URL with a given set of behaviors.
+// This can be used for determining whether a specific network resource is
+// available or accessible by Chrome.
+class PreviewsProber {
+ public:
+  enum class HttpMethod {
+    kGet,
+    kHead,
+  };
+
+  PreviewsProber(
+      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
+      const std::string& name,
+      const GURL& url,
+      HttpMethod http_method);
+  ~PreviewsProber();
+
+  // Sends a probe now if the prober is currently inactive. If the probe is
+  // active (i.e.: there are probes in flight), this is a no-op.
+  void SendNowIfInactive();
+
+  // Returns the successfulness of the last probe, if there was one.
+  base::Optional<bool> LastProbeWasSuccessful() const;
+
+ private:
+  void CreateAndStartURLLoader();
+  void OnURLLoadComplete(std::unique_ptr<std::string> response_body);
+
+  // The name given to this prober instance, used in metrics, prefs, and traffic
+  // annotations.
+  const std::string name_;
+
+  // The URL that will be probed.
+  const GURL url_;
+
+  // The HTTP method used for probing.
+  const HttpMethod http_method_;
+
+  // Whether the prober is currently sending probes.
+  bool is_active_;
+
+  // The status of the last completed probe, if any.
+  base::Optional<bool> last_probe_status_;
+
+  // Used for setting up the |url_loader_|.
+  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
+
+  // The URLLoader used for the probe. Expected to be non-null iff |is_active_|.
+  std::unique_ptr<network::SimpleURLLoader> url_loader_;
+
+  SEQUENCE_CHECKER(sequence_checker_);
+
+  DISALLOW_COPY_AND_ASSIGN(PreviewsProber);
+};
+
+#endif  // CHROME_BROWSER_PREVIEWS_PREVIEWS_PROBER_H_
diff --git a/chrome/browser/previews/previews_prober_unittest.cc b/chrome/browser/previews/previews_prober_unittest.cc
new file mode 100644
index 0000000..165bd6d
--- /dev/null
+++ b/chrome/browser/previews/previews_prober_unittest.cc
@@ -0,0 +1,108 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/previews/previews_prober.h"
+
+#include "base/test/scoped_task_environment.h"
+#include "net/base/load_flags.h"
+#include "net/base/net_errors.h"
+#include "net/http/http_status_code.h"
+#include "services/network/public/cpp/resource_request.h"
+#include "services/network/public/cpp/resource_response.h"
+#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
+#include "services/network/test/test_url_loader_factory.h"
+#include "services/network/test/test_utils.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+const GURL kTestUrl("https://test.com");
+const char kName[] = "testing";
+}  // namespace
+
+class PreviewsProberTest : public testing::Test {
+ public:
+  PreviewsProberTest()
+      : test_shared_loader_factory_(
+            base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
+                &test_url_loader_factory_)) {}
+
+  std::unique_ptr<PreviewsProber> NewProber() {
+    return std::make_unique<PreviewsProber>(test_shared_loader_factory_, kName,
+                                            kTestUrl,
+                                            PreviewsProber::HttpMethod::kGet);
+  }
+
+  void RunUntilIdle() { scoped_task_environment_.RunUntilIdle(); }
+
+  void SetResponse(net::HttpStatusCode http_status, net::Error net_error) {
+    network::ResourceResponseHead head =
+        network::CreateResourceResponseHead(http_status);
+    network::URLLoaderCompletionStatus status(net_error);
+    test_url_loader_factory_.AddResponse(kTestUrl, head, "content", status);
+  }
+
+  void VerifyRequest() {
+    ASSERT_EQ(test_url_loader_factory_.NumPending(), 1);
+
+    network::TestURLLoaderFactory::PendingRequest* request =
+        test_url_loader_factory_.GetPendingRequest(0);
+    EXPECT_EQ(request->request.url, kTestUrl);
+    EXPECT_EQ(request->request.method, "GET");
+    EXPECT_EQ(request->request.load_flags, net::LOAD_DISABLE_CACHE);
+    EXPECT_FALSE(request->request.allow_credentials);
+  }
+
+ private:
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
+  network::TestURLLoaderFactory test_url_loader_factory_;
+  scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_;
+};
+
+TEST_F(PreviewsProberTest, OK) {
+  std::unique_ptr<PreviewsProber> prober = NewProber();
+  EXPECT_EQ(prober->LastProbeWasSuccessful(), base::nullopt);
+
+  prober->SendNowIfInactive();
+  VerifyRequest();
+
+  SetResponse(net::HTTP_OK, net::OK);
+  RunUntilIdle();
+  EXPECT_TRUE(prober->LastProbeWasSuccessful().value());
+}
+
+TEST_F(PreviewsProberTest, MultipleStart) {
+  std::unique_ptr<PreviewsProber> prober = NewProber();
+  EXPECT_EQ(prober->LastProbeWasSuccessful(), base::nullopt);
+
+  // Calling |SendNowIfInactive| many times should result in only one url
+  // request, which is verified in |VerifyRequest|.
+  prober->SendNowIfInactive();
+  prober->SendNowIfInactive();
+  prober->SendNowIfInactive();
+  VerifyRequest();
+}
+
+TEST_F(PreviewsProberTest, NetError) {
+  std::unique_ptr<PreviewsProber> prober = NewProber();
+  EXPECT_EQ(prober->LastProbeWasSuccessful(), base::nullopt);
+
+  prober->SendNowIfInactive();
+  VerifyRequest();
+
+  SetResponse(net::HTTP_OK, net::ERR_FAILED);
+  RunUntilIdle();
+  EXPECT_FALSE(prober->LastProbeWasSuccessful().value());
+}
+
+TEST_F(PreviewsProberTest, HttpError) {
+  std::unique_ptr<PreviewsProber> prober = NewProber();
+  EXPECT_EQ(prober->LastProbeWasSuccessful(), base::nullopt);
+
+  prober->SendNowIfInactive();
+  VerifyRequest();
+
+  SetResponse(net::HTTP_NOT_FOUND, net::OK);
+  RunUntilIdle();
+  EXPECT_FALSE(prober->LastProbeWasSuccessful().value());
+}
diff --git a/chrome/browser/printing/pdf_to_emf_converter.cc b/chrome/browser/printing/pdf_to_emf_converter.cc
index 6c5f6cf8..a6f2dcbb 100644
--- a/chrome/browser/printing/pdf_to_emf_converter.cc
+++ b/chrome/browser/printing/pdf_to_emf_converter.cc
@@ -146,7 +146,7 @@
 
     int page_number() const { return page_number_; }
 
-    const PdfConverter::GetPageCallback& callback() const { return callback_; }
+    PdfConverter::GetPageCallback callback() const { return callback_; }
 
    private:
     int page_number_;
@@ -159,7 +159,7 @@
   void Initialize(scoped_refptr<base::RefCountedMemory> data);
 
   void GetPage(int page_number,
-               const PdfConverter::GetPageCallback& get_page_callback) override;
+               PdfConverter::GetPageCallback get_page_callback) override;
 
   void Stop();
 
@@ -305,7 +305,7 @@
 
 void PdfConverterImpl::GetPage(
     int page_number,
-    const PdfConverter::GetPageCallback& get_page_callback) {
+    PdfConverter::GetPageCallback get_page_callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK(pdf_to_emf_converter_.is_bound());
 
diff --git a/chrome/browser/printing/pdf_to_emf_converter.h b/chrome/browser/printing/pdf_to_emf_converter.h
index 0808982..f1d6791 100644
--- a/chrome/browser/printing/pdf_to_emf_converter.h
+++ b/chrome/browser/printing/pdf_to_emf_converter.h
@@ -35,8 +35,7 @@
   // PDF provided in Start() call.
   // Calls |get_page_callback| after conversion. |emf| of callback in not NULL
   // if conversion succeeded.
-  virtual void GetPage(int page_number,
-                       const GetPageCallback& get_page_callback) = 0;
+  virtual void GetPage(int page_number, GetPageCallback get_page_callback) = 0;
 };
 
 // Object used by tests to exercise the temporary file creation failure code
diff --git a/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc b/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc
index b038a8c..0794ce5 100644
--- a/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc
+++ b/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc
@@ -30,14 +30,14 @@
 
 constexpr size_t kHeaderSize = sizeof(ENHMETAHEADER);
 
-void StartCallbackImpl(base::Closure quit_closure,
+void StartCallbackImpl(base::OnceClosure quit_closure,
                        int* page_count_out,
                        int page_count_in) {
   *page_count_out = page_count_in;
-  quit_closure.Run();
+  std::move(quit_closure).Run();
 }
 
-void GetPageCallbackImpl(base::Closure quit_closure,
+void GetPageCallbackImpl(base::OnceClosure quit_closure,
                          int* page_number_out,
                          std::unique_ptr<MetafilePlayer>* file_out,
                          int page_number_in,
@@ -45,7 +45,7 @@
                          std::unique_ptr<MetafilePlayer> file_in) {
   *page_number_out = page_number_in;
   *file_out = std::move(file_in);
-  quit_closure.Run();
+  std::move(quit_closure).Run();
 }
 
 // |page_number| is 0-based. Returned result has 1-based page number.
@@ -231,7 +231,7 @@
   int page_count = -1;
   std::unique_ptr<PdfConverter> pdf_converter = PdfConverter::StartPdfConverter(
       base::MakeRefCounted<base::RefCountedStaticMemory>(), PdfRenderSettings(),
-      base::Bind(&StartCallbackImpl, run_loop.QuitClosure(), &page_count));
+      base::BindOnce(&StartCallbackImpl, run_loop.QuitClosure(), &page_count));
   run_loop.Run();
   EXPECT_EQ(0, page_count);
 }
@@ -244,7 +244,7 @@
   int page_count = -1;
   std::unique_ptr<PdfConverter> pdf_converter = PdfConverter::StartPdfConverter(
       bad_pdf_data, PdfRenderSettings(),
-      base::Bind(&StartCallbackImpl, run_loop.QuitClosure(), &page_count));
+      base::BindOnce(&StartCallbackImpl, run_loop.QuitClosure(), &page_count));
   run_loop.Run();
   EXPECT_EQ(0, page_count);
 }
diff --git a/chrome/browser/printing/print_browsertest.cc b/chrome/browser/printing/print_browsertest.cc
index 22bd2c5..e2a8b92 100644
--- a/chrome/browser/printing/print_browsertest.cc
+++ b/chrome/browser/printing/print_browsertest.cc
@@ -112,7 +112,7 @@
 class TestPrintFrameContentMsgFilter : public content::BrowserMessageFilter {
  public:
   TestPrintFrameContentMsgFilter(int document_cookie,
-                                 const base::RepeatingClosure& msg_callback)
+                                 base::RepeatingClosure msg_callback)
       : content::BrowserMessageFilter(PrintMsgStart),
         document_cookie_(document_cookie),
         task_runner_(base::SequencedTaskRunnerHandle::Get()),
diff --git a/chrome/browser/printing/print_dialog_cloud_win.cc b/chrome/browser/printing/print_dialog_cloud_win.cc
index 66eeefd..0880b83 100644
--- a/chrome/browser/printing/print_dialog_cloud_win.cc
+++ b/chrome/browser/printing/print_dialog_cloud_win.cc
@@ -132,9 +132,9 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   base::PostTaskWithTraitsAndReplyWithResult(
       FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_BLOCKING},
-      base::Bind(&ReadFile, path_to_file),
-      base::Bind(&CreatePrintDialog, browser_context, print_job_title,
-                 print_ticket, file_type));
+      base::BindOnce(&ReadFile, path_to_file),
+      base::BindOnce(&CreatePrintDialog, browser_context, print_job_title,
+                     print_ticket, file_type));
 }
 
 }  // namespace
diff --git a/chrome/browser/printing/print_job.cc b/chrome/browser/printing/print_job.cc
index 3db50ac..b039a047 100644
--- a/chrome/browser/printing/print_job.cc
+++ b/chrome/browser/printing/print_job.cc
@@ -256,7 +256,7 @@
                                                  std::move(start_callback));
   }
 
-  void GetMorePages(const PdfConverter::GetPageCallback& get_page_callback) {
+  void GetMorePages(PdfConverter::GetPageCallback get_page_callback) {
     const int kMaxNumberOfTempFilesPerDocument = 3;
     while (pages_in_progress_ < kMaxNumberOfTempFilesPerDocument &&
            current_page_ < page_count_) {
@@ -265,7 +265,7 @@
     }
   }
 
-  void OnPageProcessed(const PdfConverter::GetPageCallback& get_page_callback) {
+  void OnPageProcessed(PdfConverter::GetPageCallback get_page_callback) {
     --pages_in_progress_;
     GetMorePages(get_page_callback);
     // Release converter if we don't need this any more.
@@ -353,7 +353,7 @@
   }
 
   pdf_conversion_state_->GetMorePages(
-      base::Bind(&PrintJob::OnPdfPageConverted, this));
+      base::BindRepeating(&PrintJob::OnPdfPageConverted, this));
 }
 
 void PrintJob::StartPdfToTextConversion(
@@ -459,7 +459,7 @@
     case JobEventDetails::PAGE_DONE:
       if (pdf_conversion_state_) {
         pdf_conversion_state_->OnPageProcessed(
-            base::Bind(&PrintJob::OnPdfPageConverted, this));
+            base::BindRepeating(&PrintJob::OnPdfPageConverted, this));
       }
       break;
 #endif  // defined(OS_WIN)
diff --git a/chrome/browser/printing/print_preview_dialog_controller.cc b/chrome/browser/printing/print_preview_dialog_controller.cc
index cedaf48..d2a3be7 100644
--- a/chrome/browser/printing/print_preview_dialog_controller.cc
+++ b/chrome/browser/printing/print_preview_dialog_controller.cc
@@ -300,7 +300,7 @@
 }
 
 void PrintPreviewDialogController::ForEachPreviewDialog(
-    base::Callback<void(content::WebContents*)> callback) {
+    base::RepeatingCallback<void(content::WebContents*)> callback) {
   for (const auto& it : preview_dialog_map_)
     callback.Run(it.first);
 }
diff --git a/chrome/browser/printing/print_preview_dialog_controller.h b/chrome/browser/printing/print_preview_dialog_controller.h
index d4646e3..351c0dfb 100644
--- a/chrome/browser/printing/print_preview_dialog_controller.h
+++ b/chrome/browser/printing/print_preview_dialog_controller.h
@@ -62,7 +62,7 @@
 
   // Run |callback| on the dialog of each active print preview operation.
   void ForEachPreviewDialog(
-      base::Callback<void(content::WebContents*)> callback);
+      base::RepeatingCallback<void(content::WebContents*)> callback);
 
   // Erase the initiator info associated with |preview_dialog|.
   void EraseInitiatorInfo(content::WebContents* preview_dialog);
diff --git a/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc b/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
index 98fb0002..7735464 100644
--- a/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
+++ b/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
@@ -53,8 +53,8 @@
       : WebContentsObserver(dialog) {}
   ~RequestPrintPreviewObserver() override = default;
 
-  void set_quit_closure(const base::Closure& quit_closure) {
-    quit_closure_ = quit_closure;
+  void set_quit_closure(base::OnceClosure quit_closure) {
+    quit_closure_ = std::move(quit_closure);
   }
 
  private:
@@ -71,10 +71,11 @@
 
   void OnRequestPrintPreview(
       const PrintHostMsg_RequestPrintPreview_Params& /* params */) {
-    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, quit_closure_);
+    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                                  std::move(quit_closure_));
   }
 
-  base::Closure quit_closure_;
+  base::OnceClosure quit_closure_;
 
   DISALLOW_COPY_AND_ASSIGN(RequestPrintPreviewObserver);
 };
@@ -120,9 +121,9 @@
 };
 
 void PluginsLoadedCallback(
-    const base::Closure& quit_closure,
+    base::OnceClosure quit_closure,
     const std::vector<content::WebPluginInfo>& /* info */) {
-  quit_closure.Run();
+  std::move(quit_closure).Run();
 }
 
 bool GetPdfPluginInfo(content::WebPluginInfo* info) {
@@ -292,7 +293,7 @@
   {
     base::RunLoop run_loop;
     content::PluginService::GetInstance()->GetPlugins(
-        base::Bind(&PluginsLoadedCallback, run_loop.QuitClosure()));
+        base::BindOnce(&PluginsLoadedCallback, run_loop.QuitClosure()));
     run_loop.Run();
   }
   // Get the PDF plugin info.
diff --git a/chrome/browser/printing/print_preview_pdf_generated_browsertest.cc b/chrome/browser/printing/print_preview_pdf_generated_browsertest.cc
index d328244..bb799ad 100644
--- a/chrome/browser/printing/print_preview_pdf_generated_browsertest.cc
+++ b/chrome/browser/printing/print_preview_pdf_generated_browsertest.cc
@@ -130,13 +130,14 @@
   ~PrintPreviewObserver() override {}
 
   // Sets closure for the observer so that it can end the loop.
-  void set_quit_closure(const base::Closure &closure) {
-    quit_closure_ = closure;
+  void set_quit_closure(base::OnceClosure closure) {
+    quit_closure_ = std::move(closure);
   }
 
   // Actually stops the message loop so that the test can proceed.
   void EndLoop() {
-    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, quit_closure_);
+    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                                  std::move(quit_closure_));
   }
 
   bool OnMessageReceived(const IPC::Message& message) override {
@@ -199,9 +200,8 @@
     } else if (state_ == kWaitingForFinalMessage) {
       // Called by |GetUI()->handler_|, it is a callback function that call
       // |EndLoop| when an attempt to save the PDF has been made.
-      base::Closure end_loop_closure =
-          base::Bind(&PrintPreviewObserver::EndLoop, base::Unretained(this));
-      GetUI()->SetPdfSavedClosureForTesting(end_loop_closure);
+      GetUI()->SetPdfSavedClosureForTesting(base::BindOnce(
+          &PrintPreviewObserver::EndLoop, base::Unretained(this)));
       ASSERT_FALSE(pdf_file_save_path_.empty());
       GetUI()->SetSelectedFileForTesting(pdf_file_save_path_);
       return;
@@ -290,7 +290,7 @@
   }
 
   Browser* browser_;
-  base::Closure quit_closure_;
+  base::OnceClosure quit_closure_;
   std::unique_ptr<PrintPreviewSettings> settings_;
 
   // State of the observer. The state indicates what message to send
diff --git a/chrome/browser/printing/print_view_manager.cc b/chrome/browser/printing/print_view_manager.cc
index 136f166e..c3a8b80 100644
--- a/chrome/browser/printing/print_view_manager.cc
+++ b/chrome/browser/printing/print_view_manager.cc
@@ -33,8 +33,8 @@
 
 // Keeps track of pending scripted print preview closures.
 // No locking, only access on the UI thread.
-base::LazyInstance<std::map<content::RenderProcessHost*, base::Closure>>::Leaky
-    g_scripted_print_preview_closure_map = LAZY_INSTANCE_INITIALIZER;
+base::LazyInstance<std::map<content::RenderProcessHost*, base::OnceClosure>>::
+    Leaky g_scripted_print_preview_closure_map = LAZY_INSTANCE_INITIALIZER;
 
 void EnableInternalPDFPluginForContents(int render_process_id,
                                         int render_frame_id) {
@@ -170,7 +170,7 @@
     auto& map = g_scripted_print_preview_closure_map.Get();
     auto it = map.find(scripted_print_preview_rph_);
     CHECK(it != map.end());
-    it->second.Run();
+    std::move(it->second).Run();
     map.erase(it);
 
     // PrintPreviewAlmostDone() usually already calls this. Calling it again
@@ -238,8 +238,8 @@
   DCHECK(!print_preview_rfh_);
   print_preview_rfh_ = rfh;
   print_preview_state_ = SCRIPTED_PREVIEW;
-  map[rph] = base::Bind(&PrintViewManager::OnScriptedPrintPreviewReply,
-                        base::Unretained(this), reply_msg);
+  map[rph] = base::BindOnce(&PrintViewManager::OnScriptedPrintPreviewReply,
+                            base::Unretained(this), reply_msg);
   scripted_print_preview_rph_ = rph;
   DCHECK(!scripted_print_preview_rph_set_blocked_);
   if (!scripted_print_preview_rph_->IsBlocked()) {
diff --git a/chrome/browser/printing/print_view_manager_base.cc b/chrome/browser/printing/print_view_manager_base.cc
index 9cffbb0f..a8502fdf 100644
--- a/chrome/browser/printing/print_view_manager_base.cc
+++ b/chrome/browser/printing/print_view_manager_base.cc
@@ -115,8 +115,8 @@
       Profile::FromBrowserContext(web_contents->GetBrowserContext());
   printing_enabled_.Init(
       prefs::kPrintingEnabled, profile->GetPrefs(),
-      base::Bind(&PrintViewManagerBase::UpdatePrintingEnabled,
-                 weak_ptr_factory_.GetWeakPtr()));
+      base::BindRepeating(&PrintViewManagerBase::UpdatePrintingEnabled,
+                          weak_ptr_factory_.GetWeakPtr()));
 }
 
 PrintViewManagerBase::~PrintViewManagerBase() {
diff --git a/chrome/browser/printing/pwg_raster_converter.cc b/chrome/browser/printing/pwg_raster_converter.cc
index 67dd930..5a50534 100644
--- a/chrome/browser/printing/pwg_raster_converter.cc
+++ b/chrome/browser/printing/pwg_raster_converter.cc
@@ -100,7 +100,7 @@
   memcpy(memory.mapping.memory(), data->front(), data->size());
   pdf_to_pwg_raster_converter_ptr_->Convert(
       std::move(memory.region), settings_, bitmap_settings_,
-      base::Bind(&PwgRasterConverterHelper::RunCallback, this));
+      base::BindOnce(&PwgRasterConverterHelper::RunCallback, this));
 }
 
 void PwgRasterConverterHelper::RunCallback(
diff --git a/chrome/browser/printing/pwg_raster_converter_browsertest.cc b/chrome/browser/printing/pwg_raster_converter_browsertest.cc
index b2e3f2b..3f20e6a 100644
--- a/chrome/browser/printing/pwg_raster_converter_browsertest.cc
+++ b/chrome/browser/printing/pwg_raster_converter_browsertest.cc
@@ -40,11 +40,11 @@
 
 void ResultCallbackImpl(bool* called,
                         base::ReadOnlySharedMemoryRegion* pwg_region_out,
-                        base::Closure quit_closure,
+                        base::OnceClosure quit_closure,
                         base::ReadOnlySharedMemoryRegion pwg_region_in) {
   *called = true;
   *pwg_region_out = std::move(pwg_region_in);
-  quit_closure.Run();
+  std::move(quit_closure).Run();
 }
 
 void GetPdfData(const char* file_name,
diff --git a/chrome/browser/profiles/profile_attributes_storage_unittest.cc b/chrome/browser/profiles/profile_attributes_storage_unittest.cc
index f6d2063..d167180 100644
--- a/chrome/browser/profiles/profile_attributes_storage_unittest.cc
+++ b/chrome/browser/profiles/profile_attributes_storage_unittest.cc
@@ -654,6 +654,8 @@
   ASSERT_FALSE(entry->IsSigninRequired());
 }
 
+// Avatar icons not used on Android.
+#if !defined(OS_ANDROID)
 TEST_F(ProfileAttributesStorageTest, AvatarIconIndex) {
   AddTestingProfile();
 
@@ -673,6 +675,7 @@
   VerifyAndResetCallExpectations();
   ASSERT_EQ(3U, entry->GetAvatarIconIndex());
 }
+#endif
 
 // High res avatar downloading is only supported on desktop.
 #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
diff --git a/chrome/browser/profiles/profile_avatar_icon_util.cc b/chrome/browser/profiles/profile_avatar_icon_util.cc
index 60eefdc..c394433 100644
--- a/chrome/browser/profiles/profile_avatar_icon_util.cc
+++ b/chrome/browser/profiles/profile_avatar_icon_util.cc
@@ -260,17 +260,27 @@
 constexpr char kHighResAvatarFolderName[] = "Avatars";
 
 // The size of the function-static kDefaultAvatarIconResources array below.
-#if !defined(OS_CHROMEOS) && !defined(OS_ANDROID)
-constexpr size_t kDefaultAvatarIconsCount = 56;
-#else
+#if defined(OS_ANDROID)
+constexpr size_t kDefaultAvatarIconsCount = 1;
+#elif defined(OS_CHROMEOS)
 constexpr size_t kDefaultAvatarIconsCount = 27;
+#else
+constexpr size_t kDefaultAvatarIconsCount = 56;
 #endif
 
+#if !defined(OS_ANDROID)
 // The first 8 icons are generic.
 constexpr size_t kGenericAvatarIconsCount = 8;
+#else
+constexpr size_t kGenericAvatarIconsCount = 0;
+#endif
 
-// The avatar used as a placeholder (grey silhouette).
+#if !defined(OS_ANDROID)
+// The avatar used as a placeholder.
 constexpr size_t kPlaceholderAvatarIndex = 26;
+#else
+constexpr size_t kPlaceholderAvatarIndex = 0;
+#endif
 
 gfx::Image GetSizedAvatarIcon(const gfx::Image& image,
                               bool is_rectangle,
@@ -388,7 +398,8 @@
 const IconResourceInfo* GetDefaultAvatarIconResourceInfo(size_t index) {
   CHECK_LT(index, kDefaultAvatarIconsCount);
   static const IconResourceInfo resource_info[kDefaultAvatarIconsCount] = {
-    // Old avatar icons:
+  // Old avatar icons:
+#if !defined(OS_ANDROID)
     {IDR_PROFILE_AVATAR_0, "avatar_generic.png", IDS_DEFAULT_AVATAR_LABEL_0},
     {IDR_PROFILE_AVATAR_1, "avatar_generic_aqua.png",
      IDS_DEFAULT_AVATAR_LABEL_1},
@@ -427,7 +438,7 @@
     {IDR_PROFILE_AVATAR_24, "avatar_note.png", IDS_DEFAULT_AVATAR_LABEL_24},
     {IDR_PROFILE_AVATAR_25, "avatar_sun_cloud.png",
      IDS_DEFAULT_AVATAR_LABEL_25},
-
+#endif
     // Placeholder avatar icon:
     {IDR_PROFILE_AVATAR_26, NULL, -1},
 
@@ -514,7 +525,9 @@
 }
 
 std::string GetDefaultAvatarIconUrl(size_t index) {
+#if !defined(OS_ANDROID)
   CHECK(IsDefaultAvatarIconIndex(index));
+#endif
   return base::StringPrintf("%s%" PRIuS, kDefaultUrlPrefix, index);
 }
 
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
index 3973bda5..e5367a3 100644
--- a/chrome/browser/profiles/profile_impl.cc
+++ b/chrome/browser/profiles/profile_impl.cc
@@ -1341,8 +1341,7 @@
 #if BUILDFLAG(ENABLE_CROS_ASSISTANT)
   if (service_name == chromeos::assistant::mojom::kServiceName) {
     return std::make_unique<chromeos::assistant::Service>(
-        std::move(request), content::GetNetworkConnectionTracker(),
-        GetURLLoaderFactory()->Clone());
+        std::move(request), GetURLLoaderFactory()->Clone());
   }
 #endif  // BUILDFLAG(ENABLE_CROS_ASSISTANT)
 
diff --git a/chrome/browser/profiles/profile_info_cache_unittest.cc b/chrome/browser/profiles/profile_info_cache_unittest.cc
index 297efdf..47b7ca0 100644
--- a/chrome/browser/profiles/profile_info_cache_unittest.cc
+++ b/chrome/browser/profiles/profile_info_cache_unittest.cc
@@ -131,16 +131,21 @@
 
 TEST_F(ProfileInfoCacheTest, AddProfiles) {
   EXPECT_EQ(0u, GetCache()->GetNumberOfProfiles());
-
+  // Avatar icons not used on Android.
+#if !defined(OS_ANDROID)
   ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
+#endif
+
   for (uint32_t i = 0; i < 4; ++i) {
     base::FilePath profile_path =
         GetProfilePath(base::StringPrintf("path_%ud", i));
     base::string16 profile_name =
         ASCIIToUTF16(base::StringPrintf("name_%ud", i));
+#if !defined(OS_ANDROID)
     const SkBitmap* icon = rb.GetImageNamed(
         profiles::GetDefaultAvatarIconResourceIDAtIndex(
             i)).ToSkBitmap();
+#endif
     std::string supervised_user_id = "";
 #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
     if (i == 3)
@@ -157,10 +162,12 @@
     EXPECT_EQ(i + 1, GetCache()->GetNumberOfProfiles());
     EXPECT_EQ(profile_name, GetCache()->GetNameOfProfileAtIndex(i));
     EXPECT_EQ(profile_path, GetCache()->GetPathOfProfileAtIndex(i));
+#if !defined(OS_ANDROID)
     const SkBitmap* actual_icon =
         GetCache()->GetAvatarIconOfProfileAtIndex(i).ToSkBitmap();
     EXPECT_EQ(icon->width(), actual_icon->width());
     EXPECT_EQ(icon->height(), actual_icon->height());
+#endif
     EXPECT_EQ(i == 3, GetCache()->ProfileIsSupervisedAtIndex(i));
     EXPECT_EQ(i == 3, GetCache()->IsOmittedProfileAtIndex(i));
     EXPECT_EQ(supervised_user_id,
@@ -178,7 +185,9 @@
     base::string16 profile_name =
         ASCIIToUTF16(base::StringPrintf("name_%ud", i));
     EXPECT_EQ(profile_name, GetCache()->GetNameOfProfileAtIndex(i));
+#if !defined(OS_ANDROID)
     EXPECT_EQ(i, GetCache()->GetAvatarIconIndexOfProfileAtIndex(i));
+#endif
     EXPECT_EQ(true, GetCache()->GetBackgroundStatusOfProfileAtIndex(i));
     base::string16 gaia_name = ASCIIToUTF16(base::StringPrintf("gaia_%ud", i));
     EXPECT_EQ(gaia_name, GetCache()->GetGAIANameOfProfileAtIndex(i));
@@ -228,6 +237,8 @@
   EXPECT_EQ(new_gaia_id, GetCache()->GetGAIAIdOfProfileAtIndex(1));
   EXPECT_NE(new_user_name, GetCache()->GetUserNameOfProfileAtIndex(0));
 
+  // Avatar icons not used on Android.
+#if !defined(OS_ANDROID)
   const size_t new_icon_index = 3;
   GetCache()->SetAvatarIconOfProfileAtIndex(1, new_icon_index);
   EXPECT_EQ(new_icon_index, GetCache()->GetAvatarIconIndexOfProfileAtIndex(1));
@@ -239,6 +250,7 @@
   GetCache()->SetAvatarIconOfProfileAtIndex(1, wrong_icon_index);
   EXPECT_EQ(generic_icon_index,
             GetCache()->GetAvatarIconIndexOfProfileAtIndex(1));
+#endif
 }
 
 TEST_F(ProfileInfoCacheTest, Sort) {
@@ -397,12 +409,15 @@
   GetCache()->SetProfileIsUsingDefaultAvatarAtIndex(1, false);
   EXPECT_FALSE(GetCache()->ProfileIsUsingDefaultAvatarAtIndex(1));
   EXPECT_FALSE(GetCache()->IsUsingGAIAPictureOfProfileAtIndex(1));
+// Avatar icons not used on Android.
+#if !defined(OS_ANDROID)
   int other_avatar_id =
       profiles::GetDefaultAvatarIconResourceIDAtIndex(kOtherAvatarIndex);
   const gfx::Image& other_avatar_image(
       ui::ResourceBundle::GetSharedInstance().GetImageNamed(other_avatar_id));
   EXPECT_TRUE(gfx::test::AreImagesEqual(
       other_avatar_image, GetCache()->GetAvatarIconOfProfileAtIndex(1)));
+#endif
 
   // Explicitly setting the GAIA picture should make it preferred again.
   GetCache()->SetIsUsingGAIAPictureOfProfileAtIndex(1, true);
@@ -418,8 +433,10 @@
   EXPECT_FALSE(GetCache()->IsUsingGAIAPictureOfProfileAtIndex(1));
   EXPECT_TRUE(gfx::test::AreImagesEqual(
       gaia_image, *GetCache()->GetGAIAPictureOfProfileAtIndex(1)));
+#if !defined(OS_ANDROID)
   EXPECT_TRUE(gfx::test::AreImagesEqual(
       other_avatar_image, GetCache()->GetAvatarIconOfProfileAtIndex(1)));
+#endif
 }
 
 TEST_F(ProfileInfoCacheTest, PersistGAIAPicture) {
diff --git a/chrome/browser/profiles/profile_key_android.cc b/chrome/browser/profiles/profile_key_android.cc
index d67e4d81..4fdc25e6 100644
--- a/chrome/browser/profiles/profile_key_android.cc
+++ b/chrome/browser/profiles/profile_key_android.cc
@@ -44,7 +44,7 @@
 // static
 ScopedJavaLocalRef<jobject> ProfileKeyAndroid::GetLastUsedProfileKey(
     JNIEnv* env) {
-  ProfileKey* key = ::android::GetMainProfileKey();
+  ProfileKey* key = ::android::GetLastUsedProfileKey();
   if (key == nullptr) {
     NOTREACHED() << "ProfileKey not found.";
     return ScopedJavaLocalRef<jobject>();
diff --git a/chrome/browser/recovery/recovery_install_global_error.cc b/chrome/browser/recovery/recovery_install_global_error.cc
index 01202a5c..e51586b 100644
--- a/chrome/browser/recovery/recovery_install_global_error.cc
+++ b/chrome/browser/recovery/recovery_install_global_error.cc
@@ -34,10 +34,8 @@
     elevation_needed_ =
         pref->GetBoolean(prefs::kRecoveryComponentNeedsElevation);
   }
-  if (elevation_needed_) {
-    GlobalErrorServiceFactory::GetForProfile(profile_)->NotifyErrorsChanged(
-        this);
-  }
+  if (elevation_needed_)
+    GlobalErrorServiceFactory::GetForProfile(profile_)->NotifyErrorsChanged();
 
   pref_registrar_.Init(pref);
   pref_registrar_.Add(
@@ -157,5 +155,5 @@
   if (elevation_needed_)
     has_shown_bubble_view_ = false;
 
-  GlobalErrorServiceFactory::GetForProfile(profile_)->NotifyErrorsChanged(this);
+  GlobalErrorServiceFactory::GetForProfile(profile_)->NotifyErrorsChanged();
 }
diff --git a/chrome/browser/resources/settings/appearance_page/home_url_input.html b/chrome/browser/resources/settings/appearance_page/home_url_input.html
index d2db2dc..6d293ea30 100644
--- a/chrome/browser/resources/settings/appearance_page/home_url_input.html
+++ b/chrome/browser/resources/settings/appearance_page/home_url_input.html
@@ -20,6 +20,10 @@
         width: 100%;
         --cr-input-width: 50%;
       }
+
+      cr-input::part(row-container) {
+        justify-content: normal;
+      }
     </style>
     <!-- Max length of 100 KB to prevent browser from freezing. -->
     <cr-input id="input" value="{{value}}" error-message="$i18n{notValid}"
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.html b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.html
index 2eaabb66..3e432f90 100644
--- a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.html
+++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.html
@@ -80,9 +80,6 @@
 
       settings-checkbox {
         --settings-row-two-line-min-height: 48px;
-        --settings-checkbox-label: {
-          line-height: 1.25rem;
-        }
       }
 
       #basic-tab settings-checkbox + settings-checkbox {
diff --git a/chrome/browser/resources/settings/date_time_page/date_time_page.js b/chrome/browser/resources/settings/date_time_page/date_time_page.js
index ec58887..186c536e 100644
--- a/chrome/browser/resources/settings/date_time_page/date_time_page.js
+++ b/chrome/browser/resources/settings/date_time_page/date_time_page.js
@@ -54,13 +54,19 @@
           activeTimeZoneDisplayName,
           prefs.generated.resolve_timezone_by_geolocation_on_off.value,
           prefs.generated.resolve_timezone_by_geolocation_method_short.value)`
-    }
+    },
+
+    /** @private */
+    isChild_: {type: Boolean, value: loadTimeData.getBoolean('isChild')},
   },
 
   /** @override */
   attached: function() {
     this.addWebUIListener(
         'can-set-date-time-changed', this.onCanSetDateTimeChanged_.bind(this));
+    this.addWebUIListener(
+        'access-code-validation-complete',
+        this.openTimeZoneSubpage_.bind(this));
 
     chrome.send('dateTimePageReady');
   },
@@ -99,7 +105,24 @@
     return id ? this.i18n(id) : '';
   },
 
+  /**
+   * Called when the timezone row is clicked. Child accounts need parental
+   * approval to modify their timezone, this method starts this process on the
+   * C++ side, and once it is complete the 'access-code-validation-complete'
+   * event is triggered which invokes openTimeZoneSubpage_. For non-child
+   * accounts the method is invoked immediately.
+   * @private
+   */
   onTimeZoneSettings_: function() {
+    if (this.isChild_) {
+      chrome.send('handleShowParentAccessForTimeZone');
+      return;
+    }
+    this.openTimeZoneSubpage_();
+  },
+
+  /** @private */
+  openTimeZoneSubpage_: function() {
     settings.navigateTo(settings.routes.DATETIME_TIMEZONE_SUBPAGE);
   },
 });
diff --git a/chrome/browser/resources/settings/device_page/display.js b/chrome/browser/resources/settings/device_page/display.js
index 371dd50..630be8d5 100644
--- a/chrome/browser/resources/settings/device_page/display.js
+++ b/chrome/browser/resources/settings/device_page/display.js
@@ -570,6 +570,10 @@
    */
   showUnifiedDesktop_: function(
       unifiedDesktopAvailable, unifiedDesktopMode, displays) {
+    if (displays === undefined) {
+      return false;
+    }
+
     return unifiedDesktopMode ||
         (unifiedDesktopAvailable && displays.length > 1 &&
          !this.isMirrored_(displays));
diff --git a/chrome/browser/resources/settings/internet_page/internet_page.js b/chrome/browser/resources/settings/internet_page/internet_page.js
index da5717c..8284287 100644
--- a/chrome/browser/resources/settings/internet_page/internet_page.js
+++ b/chrome/browser/resources/settings/internet_page/internet_page.js
@@ -617,7 +617,7 @@
     }
 
     if (!CrOnc.isMobileNetwork(properties) &&
-        (properties.Connectable === false || properties.ErrorState)) {
+        (properties.Connectable === false || !!properties.ErrorState)) {
       this.showConfig_(
           true /* configAndConnect */, networkType, properties.GUID, name);
       return;
diff --git a/chrome/browser/resources/settings/languages_page/edit_dictionary_page.html b/chrome/browser/resources/settings/languages_page/edit_dictionary_page.html
index a712eee..c3732a62 100644
--- a/chrome/browser/resources/settings/languages_page/edit_dictionary_page.html
+++ b/chrome/browser/resources/settings/languages_page/edit_dictionary_page.html
@@ -25,6 +25,10 @@
         --cr-input-width: var(--settings-input-max-width);
       }
 
+      #newWord::part(row-container) {
+        justify-content: normal;
+      }
+
       iron-list .word {
         flex: 1;
       }
diff --git a/chrome/browser/resources/settings/languages_page/languages_page.html b/chrome/browser/resources/settings/languages_page/languages_page.html
index 01c30725..4456949 100644
--- a/chrome/browser/resources/settings/languages_page/languages_page.html
+++ b/chrome/browser/resources/settings/languages_page/languages_page.html
@@ -220,28 +220,35 @@
                     $i18n{translateTargetLabel}
                   </div>
 <if expr="chromeos or is_win">
-                  <template is="dom-if"
-                  if="[[pageVisibility.uiDisplayedInThisLanguage]]">
-                    <div class="explain-selected"
-                        hidden="[[!isProspectiveUILanguage_(
-                            item.language.code,
-                            languages.prospectiveUILanguage)]]">
-                      $i18n{isDisplayedInThisLanguage}
-                    </div>
-                  </template>
+                  <div class="explain-selected"
+<if expr="is_win">
+                      hidden="[[!isProspectiveUILanguage_(
+                          item.language.code,
+                          languages.prospectiveUILanguage)]]">
 </if>
+<if expr="chromeos">
+                      hidden="[[!shouldShowExplanation_(
+                          item.language.code,
+                          languages.prospectiveUILanguage,
+                          pageVisibility.uiDisplayedInThisLanguage)]]">
+</if>
+                    $i18n{isDisplayedInThisLanguage}
+                  </div>
+</if> <!-- chromeos or is_win -->
                 </div>
 <if expr="chromeos or is_win">
                 <template is="dom-if" if="[[isRestartRequired_(
                     item.language.code, languages.prospectiveUILanguage)]]"
                     restamp>
                   <cr-button id="restartButton"
+<if expr="chromeos">
                       hidden="[[!pageVisibility.uiDisplayedInThisLanguage]]"
+</if>
                       on-click="onRestartTap_">
                     $i18n{restart}
                   </cr-button>
                 </template>
-</if>
+</if> <!-- chromeos or is_win -->
                 <cr-icon-button class="icon-more-vert"
                     title="$i18n{moreActions}" id="more-[[item.language.code]]"
                     on-click="onDotsTap_"></cr-icon-button>
@@ -411,7 +418,9 @@
                 class$="[[getMenuClass_(prefs.translate.enabled.value)]]">
 <if expr="chromeos or is_win">
               <cr-checkbox id="uiLanguageItem"
+<if expr="chromeos">
                   hidden="[[!pageVisibility.uiDisplayedInThisLanguage]]"
+</if>
                   class="dropdown-item"
                   checked="[[isProspectiveUILanguage_(
                       detailLanguage_.language.code,
@@ -424,7 +433,7 @@
                     !detailLanguage_.language.isProhibitedLanguage]]">
                 </iron-icon>
               </cr-checkbox>
-</if>
+</if> <!-- chromeos or is_win -->
               <cr-checkbox id="offerTranslations"
                   class="dropdown-item"
                   checked="[[detailLanguage_.translateEnabled]]"
diff --git a/chrome/browser/resources/settings/languages_page/languages_page.js b/chrome/browser/resources/settings/languages_page/languages_page.js
index 3bf2ad24..8db7567 100644
--- a/chrome/browser/resources/settings/languages_page/languages_page.js
+++ b/chrome/browser/resources/settings/languages_page/languages_page.js
@@ -506,6 +506,23 @@
     return languageCode == prospectiveUILanguage;
   },
 
+  // <if expr="chromeos">
+  // TODO(hsuregan): Remove when SplitSettings is complete.
+  /**
+   * Incorporates pageVisibility check along with isProspectiveUILanguage_().
+   * @param {string} languageCode The language code identifying a language.
+   * @param {string} prospectiveUILanguage The prospective UI language.
+   * @return {boolean} True if the given language matches the prospective UI
+   *     pref (which may be different from the actual UI language).
+   * @private
+   */
+  shouldShowExplanation_: function(languageCode, prospectiveUILanguage) {
+    return this.pageVisibility &&
+        this.pageVisibility.uiDisplayedInThisLanguage &&
+        this.isProspectiveUILanguage_(languageCode, prospectiveUILanguage);
+  },
+  // </if>
+
   /**
    * @param {string} prospectiveUILanguage
    * @return {string}
diff --git a/chrome/browser/resources/settings/privacy_page/BUILD.gn b/chrome/browser/resources/settings/privacy_page/BUILD.gn
index 3077a57..dca9d34 100644
--- a/chrome/browser/resources/settings/privacy_page/BUILD.gn
+++ b/chrome/browser/resources/settings/privacy_page/BUILD.gn
@@ -9,6 +9,7 @@
     ":personalization_options",
     ":privacy_page",
     ":privacy_page_browser_proxy",
+    ":security_keys_credential_management_dialog",
     ":security_keys_reset_dialog",
     ":security_keys_set_pin_dialog",
     ":security_keys_subpage",
@@ -80,6 +81,20 @@
   externs_list = [ "$externs_path/settings_private.js" ]
 }
 
+js_library("security_keys_pin_field") {
+  deps = [
+    "//ui/webui/resources/js:i18n_behavior",
+  ]
+}
+
+js_library("security_keys_credential_management_dialog") {
+  deps = [
+    ":security_keys_browser_proxy",
+    ":security_keys_pin_field",
+    "//ui/webui/resources/js:i18n_behavior",
+  ]
+}
+
 js_library("security_keys_reset_dialog") {
   deps = [
     ":security_keys_browser_proxy",
diff --git a/chrome/browser/resources/settings/privacy_page/security_keys_browser_proxy.js b/chrome/browser/resources/settings/privacy_page/security_keys_browser_proxy.js
index 662cdb8..a753c164 100644
--- a/chrome/browser/resources/settings/privacy_page/security_keys_browser_proxy.js
+++ b/chrome/browser/resources/settings/privacy_page/security_keys_browser_proxy.js
@@ -4,6 +4,15 @@
 
 cr.exportPath('settings');
 
+/**
+ * @typedef {{id: string,
+ *            relyingPartyId: string,
+ *            userName: string,
+ *            userDisplayName: string}}
+ * @see chrome/browser/ui/webui/settings/settings_security_key_handler.cc
+ */
+let Credential;
+
 cr.define('settings', function() {
   /** @interface */
   class SecurityKeysBrowserProxy {
@@ -29,6 +38,36 @@
     setPIN(oldPIN, newPIN) {}
 
     /**
+     * Starts a credential management operation.
+     *
+     * Callers must listen to errors that can occur during the operation via a
+     * 'security-keys-credential-management-error' WebListener. Values received
+     * via this listener are localized error strings. When the
+     * WebListener fires, the operation must be considered terminated.
+     *
+     * @return {!Promise} a promise that resolves when the handler is ready for
+     *     the authenticator PIN to be provided.
+     */
+    startCredentialManagement() {}
+
+    /**
+     * Provides a PIN for a credential management operation. The
+     * startCredentialManagement() promise must have resolved before this method
+     * may be called.
+     * @return {!Promise<?number>} a promise that resolves with null if the PIN
+     *     was correct or the number of retries remaining otherwise.
+     */
+    credentialManagementProvidePIN(pin) {}
+
+    /**
+     * Enumerates credentials on the authenticator. A correct PIN must have
+     * previously been supplied via credentialManagementProvidePIN() before this
+     * method may be called.
+     * @return {!Promise<!Array<!Credential>>}
+     */
+    credentialManagementEnumerate() {}
+
+    /**
      * Starts a reset operation by flashing all security keys and sending a
      * reset command to the one that the user activates. Resolves with a CTAP
      * error code.
@@ -63,6 +102,21 @@
     }
 
     /** @override */
+    startCredentialManagement() {
+      return cr.sendWithPromise('securityKeyCredentialManagement');
+    }
+
+    /** @override */
+    credentialManagementProvidePIN(pin) {
+      return cr.sendWithPromise('securityKeyCredentialManagementPIN', pin);
+    }
+
+    /** @override */
+    credentialManagementEnumerate() {
+      return cr.sendWithPromise('securityKeyCredentialManagementEnumerate');
+    }
+
+    /** @override */
     reset() {
       return cr.sendWithPromise('securityKeyReset');
     }
diff --git a/chrome/browser/resources/settings/privacy_page/security_keys_credential_management_dialog.html b/chrome/browser/resources/settings/privacy_page/security_keys_credential_management_dialog.html
new file mode 100644
index 0000000..5e6ff75
--- /dev/null
+++ b/chrome/browser/resources/settings/privacy_page/security_keys_credential_management_dialog.html
@@ -0,0 +1,120 @@
+<link rel="import" href="chrome://resources/html/polymer.html">
+
+<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html">
+<link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html">
+<link rel="import" href="chrome://resources/html/i18n_behavior.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/iron-list/iron-list.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/iron-pages/iron-pages.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/paper-spinner/paper-spinner-lite.html">
+<link rel="import" href="../i18n_setup.html">
+<link rel="import" href="../settings_shared_css.html">
+<link rel="import" href="../site_favicon.html">
+<link rel="import" href="security_keys_browser_proxy.html">
+<link rel="import" href="security_keys_pin_field.html">
+
+<dom-module id="settings-security-keys-credential-management-dialog">
+  <template>
+    <style include="settings-shared">
+      paper-spinner-lite {
+        padding-bottom: 12px;
+      }
+
+      #header {
+        display: flex;
+      }
+
+      .site {
+        flex: 3;
+      }
+
+      .user {
+        flex: 2;
+      }
+
+      .list-item .site {
+        align-items: center;
+        display: flex;
+      }
+
+      .list-item .site,
+      .list-item .user {
+        word-break: break-word;
+      }
+
+      site-favicon {
+        margin-inline-end: 8px;
+        min-width: 16px;
+      }
+    </style>
+
+    <cr-dialog id="dialog" close-text="$i18n{cancel}" ignore-popstate
+        on-close="onDialogClosed_">
+      <div slot="title">$i18n{securityKeysCredentialManagementDialogTitle}</div>
+
+      <div slot="body">
+        <iron-pages attr-for-selected="id" selected="[[dialogPage_]]"
+            on-iron-select="onIronSelect_">
+          <div id="initial">
+            <p>$i18n{securityKeysCredentialManagementTouch}</p>
+            <paper-spinner-lite active></paper-spinner-lite>
+          </div>
+
+          <div id="pinPrompt">
+            <p>$i18nRaw{securityKeysCredentialManagementPinPrompt}</p>
+            <settings-security-keys-pin-field id="pin">
+            </settings-security-keys-pin-field>
+          </div>
+
+          <div id="credentials">
+            <div id="header" class="list-item column-header"
+                hidden="[[!hasSome_(credentials_)]]">
+              <div class="site">$i18n{securityKeysCredentialWebsite}</div>
+              <div class="user">$i18n{securityKeysCredentialUsername}</div>
+            </div>
+
+            <div id="container">
+              <iron-list id="credentialList" items="[[credentials_]]"
+                  class="cr-separators list-with-header">
+                <template>
+                  <div class="list-item">
+                    <div class="site" aria-label="[[item.relyingPartyId]]">
+                      <site-favicon url="[[item.relyingPartyId]]">
+                      </site-favicon>
+                      <div>[[item.relyingPartyId]]</div>
+                    </div>
+                    <div class="user">[[formatUser_(item)]]</div>
+                  </div>
+                </template>
+              </iron-list>
+            </div>
+
+            <div class="list-item" hidden="[[hasSome_(credentials_)]]">
+              $i18n{securityKeysCredentialManagementNoCredentials}
+            </div>
+          </div>
+
+          <div id="error">[[errorMsg_]]</div>
+        </iron-pages>
+      </div>
+
+      <div slot="button-container">
+        <cr-button id="cancelButton" class="cancel-button"
+            on-click="close_" hidden="[[!cancelButtonVisible_]]">
+          $i18n{cancel}
+        </cr-button>
+        <cr-button id="confirmButton" class="action-button"
+            on-click="confirmButtonClick_"
+            hidden="[[!confirmButtonVisible_]]">
+          $i18n{ok}
+        </cr-button>
+        <cr-button id="closeButton" class="action-button"
+            on-click="close_"
+            hidden="[[!closeButtonVisible_]]">
+          $i18n{close}
+        </cr-button>
+      </div>
+    </cr-dialog>
+
+  </template>
+  <script src="security_keys_credential_management_dialog.js"></script>
+</dom-module>
diff --git a/chrome/browser/resources/settings/privacy_page/security_keys_credential_management_dialog.js b/chrome/browser/resources/settings/privacy_page/security_keys_credential_management_dialog.js
new file mode 100644
index 0000000..309171c
--- /dev/null
+++ b/chrome/browser/resources/settings/privacy_page/security_keys_credential_management_dialog.js
@@ -0,0 +1,210 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(function() {
+'use strict';
+
+/**
+ * @fileoverview 'settings-security-keys-credential-management-dialog' is a
+ * dialog for viewing and erasing credentials stored on a security key.
+ */
+Polymer({
+  is: 'settings-security-keys-credential-management-dialog',
+
+  behaviors: [
+    I18nBehavior,
+    WebUIListenerBehavior,
+  ],
+
+  properties: {
+    /**
+     * The ID of the element currently shown in the dialog.
+     * @private
+     */
+    dialogPage_: {
+      type: String,
+      value: 'initial',
+      observer: 'dialogPageChanged_',
+    },
+
+    /**
+     * The list of credentials displayed in the dialog.
+     * @private {!Array<!Credential>}
+     */
+    credentials_: {
+      type: Array,
+      value: () => [],
+    },
+
+    /**
+     * The message displayed on the "error" dialog page.
+     * @private
+     */
+    errorMsg_: String,
+
+    /** @private */
+    cancelButtonVisible_: Boolean,
+
+    /** @private */
+    confirmButtonVisible_: Boolean,
+
+    /** @private */
+    closeButtonVisible_: Boolean,
+  },
+
+  /** @private {?settings.SecurityKeysBrowserProxy} */
+  browserProxy_: null,
+
+  /** @override */
+  attached: function() {
+    this.$.dialog.showModal();
+    this.addWebUIListener(
+        'security-keys-credential-management-finished',
+        this.onError_.bind(this));
+    this.browserProxy_ = settings.SecurityKeysBrowserProxyImpl.getInstance();
+    this.browserProxy_.startCredentialManagement().then(
+        this.collectPin_.bind(this));
+  },
+
+  /** @private */
+  collectPin_: function() {
+    this.dialogPage_ = 'pinPrompt';
+    this.$.pin.focus();
+  },
+
+  /**
+   * @private
+   * @param {string} error
+   */
+  onError_: function(error) {
+    this.errorMsg_ = error;
+    this.dialogPage_ = 'error';
+  },
+
+  /** @private */
+  submitPIN_: function() {
+    if (!this.$.pin.validate()) {
+      return;
+    }
+    this.browserProxy_.credentialManagementProvidePIN(this.$.pin.value)
+        .then((retries) => {
+          if (retries != null) {
+            this.$.pin.showIncorrectPINError(retries);
+            this.collectPin_();
+            return;
+          }
+          this.browserProxy_.credentialManagementEnumerate().then(
+              this.onCredentials_.bind(this));
+        });
+  },
+
+  /**
+   * @param {number} retries
+   * @return {string} localized error string for an invalid PIN attempt and a
+   *     given number of remaining retries.
+   */
+  pinRetriesError_: function(retries) {
+    // Warn the user if the number of retries is getting low.
+    if (1 < retries && retries <= 3) {
+      return this.i18n('securityKeysPINIncorrectRetriesPl', retries.toString());
+    }
+    return this.i18n(
+        retries == 1 ? 'securityKeysPINIncorrectRetriesSin' :
+                       'securityKeysPINIncorrect');
+  },
+
+  /**
+   * @private
+   * @param {!Array<!Credential>} credentials
+   */
+  onCredentials_: function(credentials) {
+    this.credentials_ = credentials;
+    this.$.credentialList.fire('iron-resize');
+    this.dialogPage_ = 'credentials';
+  },
+
+  /** @private */
+  dialogPageChanged_: function() {
+    switch (this.dialogPage_) {
+      case 'initial':
+        this.cancelButtonVisible_ = true;
+        this.confirmButtonVisible_ = false;
+        this.closeButtonVisible_ = false;
+        break;
+      case 'pinPrompt':
+        this.cancelButtonVisible_ = true;
+        this.confirmButtonVisible_ = true;
+        this.closeButtonVisible_ = false;
+        break;
+      case 'credentials':
+        this.cancelButtonVisible_ = false;
+        this.confirmButtonVisible_ = false;
+        this.closeButtonVisible_ = true;
+        break;
+      case 'error':
+        this.cancelButtonVisible_ = false;
+        this.confirmButtonVisible_ = false;
+        this.closeButtonVisible_ = true;
+        break;
+    }
+  },
+
+  /** @private */
+  confirmButtonClick_: function() {
+    assert(this.dialogPage_ == 'pinPrompt');
+    this.submitPIN_();
+  },
+
+  /** @private */
+  close_: function() {
+    this.$.dialog.close();
+  },
+
+  /**
+   * Stringifies the user entity of a Credential for display in the dialog.
+   * @private
+   * @param {!Credential} credential
+   * @return {string}
+   */
+  formatUser_: function(credential) {
+    if (this.isEmpty_(credential.userDisplayName)) {
+      return credential.userName;
+    }
+    return `${credential.userDisplayName} (${credential.userName})`;
+  },
+
+  /** @private */
+  onDialogClosed_: function() {
+    this.browserProxy_.close();
+  },
+
+  /**
+   * @private
+   * @param {?string} str
+   * @return {boolean} true if the string doesn't exist or is empty.
+   */
+  isEmpty_: function(str) {
+    return !str || str.length == 0;
+  },
+
+  /**
+   * @private
+   * @param {?Array<Object>} list
+   * @return {boolean} true if the list exists and has items.
+   */
+  hasSome_: function(list) {
+    return !!(list && list.length);
+  },
+
+  /**
+   * @param {!Event} e
+   * @private
+   */
+  onIronSelect_: function(e) {
+    // Prevent this event from bubbling since it is unnecessarily triggering the
+    // listener within settings-animated-pages.
+    e.stopPropagation();
+  },
+});
+})();
diff --git a/chrome/browser/resources/settings/privacy_page/security_keys_pin_field.html b/chrome/browser/resources/settings/privacy_page/security_keys_pin_field.html
new file mode 100644
index 0000000..bd62a4001
--- /dev/null
+++ b/chrome/browser/resources/settings/privacy_page/security_keys_pin_field.html
@@ -0,0 +1,34 @@
+<link rel="import" href="chrome://resources/html/polymer.html">
+
+<link rel="import" href="chrome://resources/html/i18n_behavior.html">
+<link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html">
+<link rel="import" href="chrome://resources/cr_elements/cr_icon_button/cr_icon_button.html">
+<link rel="import" href="../i18n_setup.html">
+<link rel="import" href="../settings_shared_css.html">
+
+<dom-module id="settings-security-keys-pin-field">
+  <template>
+    <style include="settings-shared">
+      cr-input {
+        display: inline-block;
+        padding-inline-end: 2em;
+        --cr-input-width: 8em;
+      }
+    </style>
+
+    <cr-input id="pin" value="{{value}}" minLength="4"
+        maxLength="255" spellcheck="false"
+        on-input="onPINInput_"
+        invalid="[[isNonEmpty_(error)]]"
+        label="[[label]]" tabindex="0"
+        type$="[[inputType_(inputVisible_)]]"
+        error-message="[[error]]">
+      <cr-icon-button slot="suffix" id="showButton"
+          class$="[[showButtonClass_(inputVisible_)]]"
+          title="[[showButtonTitle_(inputVisible_)]]"
+          focus-row-control focus-type="showPassword"
+          on-click="showButtonClick_"></cr-icon-button>
+    </cr-input>
+  </template>
+  <script src="security_keys_pin_field.js"></script>
+</dom-module>
diff --git a/chrome/browser/resources/settings/privacy_page/security_keys_pin_field.js b/chrome/browser/resources/settings/privacy_page/security_keys_pin_field.js
new file mode 100644
index 0000000..abace08a
--- /dev/null
+++ b/chrome/browser/resources/settings/privacy_page/security_keys_pin_field.js
@@ -0,0 +1,161 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview 'settings-security-keys-pin-field' is a component for entering
+ * a security key PIN.
+ */
+Polymer({
+  is: 'settings-security-keys-pin-field',
+
+  behaviors: [
+    I18nBehavior,
+  ],
+
+  properties: {
+    /** The label of the input field. */
+    label: String,
+
+    /** The validation error label of the input field. */
+    error: String,
+
+    /** The value of the input field. */
+    value: String,
+
+    /**
+     * Whether the contents of the input field are visible.
+     * @private
+     */
+    inputVisible_: Boolean,
+  },
+
+  /** @override */
+  attached: function() {
+    this.inputVisible_ = false;
+  },
+
+  /** Focuses the PIN input field. */
+  focus: function() {
+    this.$.pin.focus();
+  },
+
+  /**
+   * Validates the PIN and sets the validation error if it is not valid.
+   * @return {boolean} True iff the PIN is valid.
+   */
+  validate: function() {
+    const error = this.isValidPIN_(this.value);
+    if (error != '') {
+      this.error = error;
+      return false;
+    }
+    return true;
+  },
+
+  /**
+   * Sets the validation error to indicate the PIN was incorrect.
+   * @param {number} retries The number of retries remaining.
+   */
+  showIncorrectPINError: function(retries) {
+    // Warn the user if the number of retries is getting low.
+    let error;
+    if (1 < retries && retries <= 3) {
+      error =
+          this.i18n('securityKeysPINIncorrectRetriesPl', retries.toString());
+    } else if (retries == 1) {
+      error = this.i18n('securityKeysPINIncorrectRetriesSin');
+    } else {
+      error = this.i18n('securityKeysPINIncorrect');
+    }
+    this.error = error;
+  },
+
+  /** @private */
+  onPINInput_: function() {
+    // Typing in the PIN box after an error makes the error message
+    // disappear.
+    this.error = '';
+  },
+
+  /**
+   * Polymer helper function to detect when an error string is empty.
+   * @param {string} s Arbitrary string
+   * @return {boolean} True iff |s| is non-empty.
+   * @private
+   */
+  isNonEmpty_: function(s) {
+    return s != '';
+  },
+
+  /**
+   * @return {string} The PIN-input element type.
+   * @private
+   */
+  inputType_: function() {
+    return this.inputVisible_ ? 'text' : 'password';
+  },
+
+  /**
+   * @return {string} The class (and thus icon) to be displayed.
+   * @private
+   */
+  showButtonClass_: function() {
+    return 'icon-visibility' + (this.inputVisible_ ? '-off' : '');
+  },
+
+  /**
+   * @return {string} The tooltip for the icon.
+   * @private
+   */
+  showButtonTitle_: function() {
+    return this.i18n(
+        this.inputVisible_ ? 'securityKeysHidePINs' : 'securityKeysShowPINs');
+  },
+
+  /**
+   * onClick handler for the show/hide icon.
+   * @private
+   */
+  showButtonClick_: function() {
+    this.inputVisible_ = !this.inputVisible_;
+  },
+
+  /**
+   * @param {string} pin A candidate PIN.
+   * @return {string} An error string or else '' to indicate validity.
+   * @private
+   */
+  isValidPIN_: function(pin) {
+    // The UTF-8 encoding of the PIN must be between 4
+    // and 63 bytes, and the final byte cannot be zero.
+    const utf8Encoded = new TextEncoder().encode(pin);
+    if (utf8Encoded.length < 4) {
+      return this.i18n('securityKeysPINTooShort');
+    }
+    if (utf8Encoded.length > 63 ||
+        // If the PIN somehow has a NUL at the end then it's invalid, but this
+        // is so obscure that we don't try to message it. Rather we just say
+        // that it's too long because trimming the final character is the best
+        // response by the user.
+        utf8Encoded[utf8Encoded.length - 1] == 0) {
+      return this.i18n('securityKeysPINTooLong');
+    }
+
+    // A PIN must contain at least four code-points. Javascript strings are
+    // UCS-2 and the |length| property counts UCS-2 elements, not code-points.
+    // (For example, '\u{1f6b4}'.length == 2, but it's a single code-point.)
+    // Therefore, iterate over the string (which does yield codepoints) and
+    // check that four or more were seen.
+    let length = 0;
+    for (const codepoint of pin) {
+      length++;
+    }
+
+    if (length < 4) {
+      return this.i18n('securityKeysPINTooShort');
+    }
+
+    return '';
+  },
+});
diff --git a/chrome/browser/resources/settings/privacy_page/security_keys_subpage.html b/chrome/browser/resources/settings/privacy_page/security_keys_subpage.html
index 496b5bf..e1d58b3 100644
--- a/chrome/browser/resources/settings/privacy_page/security_keys_subpage.html
+++ b/chrome/browser/resources/settings/privacy_page/security_keys_subpage.html
@@ -5,6 +5,7 @@
 <link rel="import" href="chrome://resources/html/cr/ui/focus_without_ink.html">
 <link rel="import" href="../settings_shared_css.html">
 
+<link rel="import" href="security_keys_credential_management_dialog.html">
 <link rel="import" href="security_keys_set_pin_dialog.html">
 <link rel="import" href="security_keys_reset_dialog.html">
 
@@ -17,6 +18,14 @@
       label="$i18n{securityKeysSetPIN}"
       sub-label="$i18n{securityKeysSetPINDesc}"
       on-click="onSetPIN_"></cr-link-row>
+    <template is="dom-if" if="[[enableCredentialManagement_]]">
+      <cr-link-row
+        id="credentialManagementButton"
+        class="hr"
+        label="$i18n{securityKeysCredentialManagementLabel}"
+        sub-label="$i18n{securityKeysCredentialManagementDesc}"
+        on-click="onCredentialManagement_"></cr-link-row>
+    </template>
     <cr-link-row
       id="resetButton"
       class="hr"
@@ -29,6 +38,12 @@
       </settings-security-keys-set-pin-dialog>
     </template>
 
+    <template is="dom-if" if="[[showCredentialManagementDialog_]]" restamp>
+      <settings-security-keys-credential-management-dialog
+        on-close="onCredentialManagementDialogClosed_">
+      </settings-security-keys-credential-management-dialog>
+    </template>
+
     <template is="dom-if" if="[[showResetDialog_]]" restamp>
       <settings-security-keys-reset-dialog on-close="onResetDialogClosed_">
       </settings-security-keys-reset-dialog>
diff --git a/chrome/browser/resources/settings/privacy_page/security_keys_subpage.js b/chrome/browser/resources/settings/privacy_page/security_keys_subpage.js
index a27010d..b0eee41 100644
--- a/chrome/browser/resources/settings/privacy_page/security_keys_subpage.js
+++ b/chrome/browser/resources/settings/privacy_page/security_keys_subpage.js
@@ -11,11 +11,26 @@
 
   properties: {
     /** @private */
+    enableCredentialManagement_: {
+      type: Boolean,
+      readOnly: true,
+      value: function() {
+        return loadTimeData.getBoolean(
+            'enableSecurityKeysCredentialManagement');
+      }
+    },
+
+    /** @private */
     showSetPINDialog_: {
       type: Boolean,
       value: false,
     },
     /** @private */
+    showCredentialManagementDialog_: {
+      type: Boolean,
+      value: false,
+    },
+    /** @private */
     showResetDialog_: {
       type: Boolean,
       value: false,
@@ -34,6 +49,17 @@
   },
 
   /** @private */
+  onCredentialManagement_: function() {
+    this.showCredentialManagementDialog_ = true;
+  },
+
+  /** @private */
+  onCredentialManagementDialogClosed_: function() {
+    this.showCredentialManagementDialog_ = false;
+    cr.ui.focusWithoutInk(this.$.credentialManagementButton);
+  },
+
+  /** @private */
   onReset_: function() {
     this.showResetDialog_ = true;
   },
diff --git a/chrome/browser/resources/settings/settings_resources.grd b/chrome/browser/resources/settings/settings_resources.grd
index f4f8663a..6e6b2c12 100644
--- a/chrome/browser/resources/settings/settings_resources.grd
+++ b/chrome/browser/resources/settings/settings_resources.grd
@@ -386,6 +386,18 @@
       <structure name="IDR_SETTINGS_SECURITY_KEYS_SET_PIN_DIALOG_JS"
                  file="privacy_page/security_keys_set_pin_dialog.js"
                  type="chrome_html"/>
+      <structure name="IDR_SETTINGS_SECURITY_KEYS_PIN_FIELD_HTML"
+                 file="privacy_page/security_keys_pin_field.html"
+                 type="chrome_html" />
+      <structure name="IDR_SETTINGS_SECURITY_KEYS_PIN_FIELD_JS"
+                 file="privacy_page/security_keys_pin_field.js"
+                 type="chrome_html"/>
+      <structure name="IDR_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_DIALOG_HTML"
+                 file="privacy_page/security_keys_credential_management_dialog.html"
+                 type="chrome_html" />
+      <structure name="IDR_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_DIALOG_JS"
+                 file="privacy_page/security_keys_credential_management_dialog.js"
+                 type="chrome_html"/>
       <structure name="IDR_SETTINGS_SECURITY_KEYS_RESET_DIALOG_HTML"
                  file="privacy_page/security_keys_reset_dialog.html"
                  type="chrome_html" />
diff --git a/chrome/browser/resources/welcome/onboarding_welcome/shared/navi_colors_css.html b/chrome/browser/resources/welcome/onboarding_welcome/shared/navi_colors_css.html
index 5973c32..45b22f1 100644
--- a/chrome/browser/resources/welcome/onboarding_welcome/shared/navi_colors_css.html
+++ b/chrome/browser/resources/welcome/onboarding_welcome/shared/navi_colors_css.html
@@ -20,10 +20,8 @@
         --navi-shape-red-color: rgb(233, 66, 53); /* #E94235 */
         --navi-shape-yellow-dots-color: rgb(253, 214, 99); /* #FDD663 */
         --navi-shape-yellow-semicircle-color: rgb(250, 207, 76); /* #FACF4C */
-        --navi-step-indicator-active: {
-          background: var(--google-blue-600);
-          opacity: .5;  /* Only in light mode */
-        };
+        --navi-step-indicator-active-color:
+            rgba(var(--google-blue-600-rgb), .5);
         --navi-step-indicator-color: var(--google-grey-200);
         --navi-wallpaper-text-color: var(--google-grey-refresh-700);
       }
@@ -43,9 +41,7 @@
           --navi-shape-red-color: rgb(238, 103, 92); /* #EE675C */
           /* --navi-shape-yellow-dots-color is same color in dark mode */
           --navi-shape-yellow-semicircle-color: rgb(253, 214, 99); /* #FDD663 */
-          --navi-step-indicator-active: {
-            background: var(--google-blue-refresh-300);
-          };
+          --navi-step-indicator-active-color: var(--google-blue-refresh-300);
           --navi-step-indicator-color: var(--google-grey-refresh-500);
           --navi-wallpaper-text-color: var(--google-grey-200);
         }
diff --git a/chrome/browser/resources/welcome/onboarding_welcome/shared/step_indicator.html b/chrome/browser/resources/welcome/onboarding_welcome/shared/step_indicator.html
index 4ee644b..4123eb5 100644
--- a/chrome/browser/resources/welcome/onboarding_welcome/shared/step_indicator.html
+++ b/chrome/browser/resources/welcome/onboarding_welcome/shared/step_indicator.html
@@ -21,7 +21,7 @@
       }
 
       span.active {
-        @apply --navi-step-indicator-active;
+        background: var(--navi-step-indicator-active-color);
       }
     </style>
     <template is="dom-repeat" items="[[dots_]]">
diff --git a/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc b/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
index b6d133f..27d6027 100644
--- a/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
@@ -623,6 +623,12 @@
   // Owned by the V4Database.
   TestV4StoreFactory* store_factory_;
 
+#if defined(ADDRESS_SANITIZER)
+  // TODO(lukasza): https://crbug.com/971820: Disallow renderer crashes once the
+  // bug is fixed.
+  content::ScopedAllowRendererCrashes scoped_allow_renderer_crashes_;
+#endif
+
   DISALLOW_COPY_AND_ASSIGN(V4SafeBrowsingServiceTest);
 };
 
@@ -1268,12 +1274,6 @@
   V4SafeBrowsingServiceMetadataTest() {}
 
  private:
-#if defined(ADDRESS_SANITIZER)
-  // TODO(lukasza): https://crbug.com/971820: Disallow renderer crashes once the
-  // bug is fixed.
-  content::ScopedAllowRendererCrashes scoped_allow_renderer_crashes_;
-#endif
-
   DISALLOW_COPY_AND_ASSIGN(V4SafeBrowsingServiceMetadataTest);
 };
 
diff --git a/chrome/browser/safe_browsing/services_delegate_desktop.cc b/chrome/browser/safe_browsing/services_delegate_desktop.cc
index 4f59570..71461f0 100644
--- a/chrome/browser/safe_browsing/services_delegate_desktop.cc
+++ b/chrome/browser/safe_browsing/services_delegate_desktop.cc
@@ -116,6 +116,9 @@
   resource_request_detector_.reset();
   incident_service_.reset();
 
+  // Delete the VerdictCacheManager instances
+  cache_manager_map_.clear();
+
   // Delete the ChromePasswordProtectionService instances.
   password_protection_service_map_.clear();
 
diff --git a/chrome/browser/sharing/sharing_service.cc b/chrome/browser/sharing/sharing_service.cc
index 1e56494..1a7ed4a 100644
--- a/chrome/browser/sharing/sharing_service.cc
+++ b/chrome/browser/sharing/sharing_service.cc
@@ -4,7 +4,9 @@
 
 #include "chrome/browser/sharing/sharing_service.h"
 
+#include <algorithm>
 #include <map>
+#include <unordered_set>
 
 #include "base/time/time.h"
 #include "chrome/browser/sharing/sharing_device_info.h"
@@ -38,10 +40,21 @@
 
   const base::Time min_updated_time = base::Time::Now() - kDeviceExpiration;
 
+  // Sort the DeviceInfo vector so the most recently modified devices are first.
+  std::sort(all_devices.begin(), all_devices.end(),
+            [](const auto& device1, const auto& device2) {
+              return device1->last_updated_timestamp() >
+                     device2->last_updated_timestamp();
+            });
+
+  std::unordered_set<std::string> device_names;
   std::vector<SharingDeviceInfo> device_candidates;
   for (const auto& device : all_devices) {
+    // If the current device is considered expired for our purposes, stop here
+    // since the next devices in the vector are at least as expired than this
+    // one.
     if (device->last_updated_timestamp() < min_updated_time)
-      continue;
+      break;
 
     auto synced_device = synced_devices.find(device->guid());
     if (synced_device == synced_devices.end())
@@ -51,9 +64,13 @@
     if ((device_capabilities & required_capabilities) != required_capabilities)
       continue;
 
-    device_candidates.emplace_back(device->guid(), device->client_name(),
-                                   device->last_updated_timestamp(),
-                                   device_capabilities);
+    // Only insert the first occurrence of each device name.
+    auto inserted = device_names.insert(device->client_name());
+    if (inserted.second) {
+      device_candidates.emplace_back(device->guid(), device->client_name(),
+                                     device->last_updated_timestamp(),
+                                     device_capabilities);
+    }
   }
 
   // TODO(knollr): Remove devices from |sync_prefs_| that are in
diff --git a/chrome/browser/sharing/sharing_service_unittest.cc b/chrome/browser/sharing/sharing_service_unittest.cc
index 8fd4a126..3e41aa2 100644
--- a/chrome/browser/sharing/sharing_service_unittest.cc
+++ b/chrome/browser/sharing/sharing_service_unittest.cc
@@ -127,3 +127,26 @@
 
   EXPECT_TRUE(candidates.empty());
 }
+
+TEST_F(SharingServiceTest, GetDeviceCandidates_DuplicateDeviceNames) {
+  // Add first device.
+  std::string id1 = base::GenerateGUID();
+  std::unique_ptr<syncer::DeviceInfo> device_info_1 = CreateFakeDeviceInfo(id1);
+  device_info_tracker_.Add(device_info_1.get());
+  sync_prefs_->SetSyncDevice(id1, CreateFakeSyncDevice());
+
+  // Advance time for a bit to create a newer device.
+  scoped_task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(10));
+
+  // Add second device.
+  std::string id2 = base::GenerateGUID();
+  std::unique_ptr<syncer::DeviceInfo> device_info_2 = CreateFakeDeviceInfo(id2);
+  device_info_tracker_.Add(device_info_2.get());
+  sync_prefs_->SetSyncDevice(id2, CreateFakeSyncDevice());
+
+  std::vector<SharingDeviceInfo> candidates =
+      sharing_service_->GetDeviceCandidates(kNoCapabilities);
+
+  ASSERT_EQ(1u, candidates.size());
+  EXPECT_EQ(id2, candidates[0].guid());
+}
diff --git a/chrome/browser/shell_integration_win.cc b/chrome/browser/shell_integration_win.cc
index 74b5b38..4ee45c5 100644
--- a/chrome/browser/shell_integration_win.cc
+++ b/chrome/browser/shell_integration_win.cc
@@ -249,8 +249,7 @@
  private:
   // win::SettingsAppMonitor::Delegate:
   void OnInitialized(HRESULT result) override {
-    UMA_HISTOGRAM_BOOLEAN("SettingsAppMonitor.InitializationResult",
-                          SUCCEEDED(result));
+    // UMA indicates that this succeeds > 99.98% of the time.
     if (SUCCEEDED(result)) {
       base::RecordAction(
           base::UserMetricsAction("SettingsAppMonitor.Initialized"));
diff --git a/chrome/browser/signin/mirror_browsertest.cc b/chrome/browser/signin/mirror_browsertest.cc
index 50d8f0c..1ca7b7b 100644
--- a/chrome/browser/signin/mirror_browsertest.cc
+++ b/chrome/browser/signin/mirror_browsertest.cc
@@ -66,7 +66,7 @@
 
   // ContentBrowserClient overrides:
   std::vector<std::unique_ptr<content::URLLoaderThrottle>>
-  CreateURLLoaderThrottles(
+  CreateURLLoaderThrottlesOnIO(
       const network::ResourceRequest& request,
       content::ResourceContext* resource_context,
       const base::RepeatingCallback<content::WebContents*()>& wc_getter,
@@ -77,6 +77,16 @@
       throttles.push_back(std::make_unique<HeaderModifyingThrottle>());
     return throttles;
   }
+  std::vector<std::unique_ptr<content::URLLoaderThrottle>>
+  CreateURLLoaderThrottles(
+      const network::ResourceRequest& request,
+      content::BrowserContext* browser_context,
+      const base::RepeatingCallback<content::WebContents*()>& wc_getter,
+      content::NavigationUIData* navigation_ui_data,
+      int frame_tree_node_id) override {
+    return CreateURLLoaderThrottlesOnIO(request, nullptr, wc_getter,
+                                        navigation_ui_data, frame_tree_node_id);
+  }
 
  private:
   const GURL watch_url_;
diff --git a/chrome/browser/signin/signin_global_error.cc b/chrome/browser/signin/signin_global_error.cc
index ed47809..d51f78a 100644
--- a/chrome/browser/signin/signin_global_error.cc
+++ b/chrome/browser/signin/signin_global_error.cc
@@ -176,5 +176,5 @@
 }
 
 void SigninGlobalError::OnErrorChanged() {
-  GlobalErrorServiceFactory::GetForProfile(profile_)->NotifyErrorsChanged(this);
+  GlobalErrorServiceFactory::GetForProfile(profile_)->NotifyErrorsChanged();
 }
diff --git a/chrome/browser/supervised_user/kids_chrome_management/BUILD.gn b/chrome/browser/supervised_user/kids_chrome_management/BUILD.gn
new file mode 100644
index 0000000..6bdd7ebb
--- /dev/null
+++ b/chrome/browser/supervised_user/kids_chrome_management/BUILD.gn
@@ -0,0 +1,12 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//third_party/protobuf/proto_library.gni")
+
+proto_library("proto") {
+  sources = [
+    "families_common.proto",
+    "kidschromemanagement_messages.proto",
+  ]
+}
diff --git a/chrome/browser/supervised_user/kids_chrome_management/families_common.proto b/chrome/browser/supervised_user/kids_chrome_management/families_common.proto
new file mode 100644
index 0000000..667eb329
--- /dev/null
+++ b/chrome/browser/supervised_user/kids_chrome_management/families_common.proto
@@ -0,0 +1,55 @@
+syntax = "proto2";
+
+option optimize_for = LITE_RUNTIME;
+
+package kids_chrome_management;
+
+// Basic user profile information.
+message UserProfile {
+  // Obfuscated Gaia ID of the member. Required.
+  optional string obfuscated_user_id = 1;
+
+  // Primary email address of the user. Required.
+  optional string email = 2;
+
+  // The user's full name, synthesized with structured and unstructured name
+  // fields informed by the user. Optional.
+  optional string display_name = 3;
+
+  // Portrait photo of the user. Optional.
+  optional string profile_image_url = 4;
+
+  // Default profile image to use if profile_image_url is not set. Required.
+  optional string default_profile_image_url = 5;
+
+  // Next id: 6
+}
+
+// The role a user has within a family.
+// Details on which actions are tied to those roles.
+enum FamilyRole {
+  UNKNOWN_FAMILY_ROLE = 0;
+  // The (only) head of household of the family.
+  HEAD_OF_HOUSEHOLD = 1;
+  // A parent in the family.
+  PARENT = 2;
+  // A member of the family. Can be an overage child or any other member
+  // without approval rights.
+  MEMBER = 3;
+  // An underage child in the family. The user always has a Unicorn account.
+  CHILD = 4;
+  // An unconfirmed member of the family who has been directly added to the
+  // family.
+  UNCONFIRMED_MEMBER = 5;
+
+  // next ID: 6
+}
+
+// Data about a family member.
+message FamilyMember {
+  // The user's role in the family. Required.
+  optional FamilyRole role = 1;
+
+  // Profile of the family member. Required.
+  optional UserProfile profile = 2;
+}
diff --git a/chrome/browser/supervised_user/kids_chrome_management/kidschromemanagement_messages.proto b/chrome/browser/supervised_user/kids_chrome_management/kidschromemanagement_messages.proto
new file mode 100644
index 0000000..f989342
--- /dev/null
+++ b/chrome/browser/supervised_user/kids_chrome_management/kidschromemanagement_messages.proto
@@ -0,0 +1,70 @@
+syntax = "proto2";
+
+option optimize_for = LITE_RUNTIME;
+
+package kids_chrome_management;
+
+import "families_common.proto";
+
+message ListFamilyMembersRequest {
+  // Must always be "mine" (enforced by the API config). Required.
+  optional string family_id = 1;
+
+  // Next id: 2
+}
+
+message ListFamilyMembersResponse {
+  // Obfuscated Gaia ID of the calling user. Required.
+  optional string self_obfuscated_gaia_id = 1;
+
+  // List of family members from the family requested. Required.
+  // Contains at least the Head of Household.
+  // Throws an exception and fails if the user is not in any family.
+  repeated FamilyMember members = 2;
+
+  // Next id: 3
+}
+
+message RequestRestrictedUrlAccessRequest {
+  // Must be "me". Required.
+  optional string person_id = 1;
+
+  // URL of the restricted website to which the access is requested. Required.
+  // URL scheme must be https, http or ftp.
+  optional string url = 2;
+
+  // Next id: 3
+}
+
+message RequestRestrictedUrlAccessResponse {
+  // Next id: 1
+}
+
+message ClassifyUrlRequest {
+  // Must be "me". Required.
+  optional string person_id = 1;
+
+  // The URL to be classified. Required.
+  optional string url = 2;
+
+  // Region_code is a 2-letter ISO 3166-1 code. Required.
+  // When set, uses specific logic to classify URLs for that region.
+  optional string region_code = 3;
+}
+
+message ClassifyUrlResponse {
+  enum DisplayClassification {
+    UNKNOWN_DISPLAY_CLASSIFICATION = 0;
+
+    // Allow url to be displayed
+    ALLOWED = 1;
+
+    // Block url and allow kid to request parent for permission
+    RESTRICTED = 2;
+  }
+
+  // URL classification. Required.
+  optional DisplayClassification display_classification = 1;
+
+  // Next id: 2
+}
\ No newline at end of file
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index b73c50b..c34eab4b 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -899,6 +899,7 @@
       "global_error/global_error.cc",
       "global_error/global_error.h",
       "global_error/global_error_bubble_view_base.h",
+      "global_error/global_error_observer.h",
       "global_error/global_error_service.cc",
       "global_error/global_error_service.h",
       "global_error/global_error_service_factory.cc",
@@ -3898,6 +3899,8 @@
       "exclusive_access/fullscreen_controller_state_tests.h",
       "exclusive_access/fullscreen_controller_test.cc",
       "exclusive_access/fullscreen_controller_test.h",
+      "global_error/global_error_waiter.cc",
+      "global_error/global_error_waiter.h",
       "passwords/manage_passwords_ui_controller_mock.cc",
       "passwords/manage_passwords_ui_controller_mock.h",
       "passwords/password_dialog_controller_mock.cc",
diff --git a/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc b/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc
index 9d5f2ab..2690785 100644
--- a/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc
+++ b/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc
@@ -154,7 +154,7 @@
 }
 
 // Test that OpenSearchResult that dismisses app list runs fine without
-// user-after-free.
+// use-after-free.
 IN_PROC_BROWSER_TEST_F(AppListClientImplBrowserTest, OpenSearchResult) {
   AppListClientImpl* client = AppListClientImpl::GetInstance();
   ASSERT_TRUE(client);
@@ -172,7 +172,12 @@
 
   // Any app that opens a window to dismiss app list is good enough for this
   // test.
+#if defined(GOOGLE_CHROME_BUILD)
+  const std::string app_title = "chrome";
+#else
   const std::string app_title = "chromium";
+#endif  // !defined(GOOGLE_CHROME_BUILD)
+
   const std::string app_result_id =
       "chrome-extension://mgndgikekgjfcpckkfioiadnlibdjbkf/";
 
diff --git a/chrome/browser/ui/ash/kiosk_next_shell_client.cc b/chrome/browser/ui/ash/kiosk_next_shell_client.cc
index 4f46a996..b32d313 100644
--- a/chrome/browser/ui/ash/kiosk_next_shell_client.cc
+++ b/chrome/browser/ui/ash/kiosk_next_shell_client.cc
@@ -4,15 +4,7 @@
 
 #include "chrome/browser/ui/ash/kiosk_next_shell_client.h"
 
-#include <utility>
-
-#include "apps/launcher.h"
 #include "base/logging.h"
-#include "chrome/browser/chromeos/profiles/profile_helper.h"
-#include "chrome/common/extensions/extension_constants.h"
-#include "components/account_id/account_id.h"
-#include "extensions/browser/extension_registry.h"
-#include "extensions/common/constants.h"
 
 namespace {
 
@@ -41,13 +33,5 @@
 }
 
 void KioskNextShellClient::LaunchKioskNextShell(const AccountId& account_id) {
-  has_launched_ = true;
-  Profile* profile =
-      chromeos::ProfileHelper::Get()->GetProfileByAccountId(account_id);
-  const extensions::Extension* app =
-      extensions::ExtensionRegistry::Get(profile)->GetInstalledExtension(
-          extension_misc::kKioskNextHomeAppId);
-  DCHECK(app);
-  apps::LaunchPlatformApp(profile, app,
-                          extensions::AppLaunchSource::kSourceChromeInternal);
+  // TODO(https://crbug.com/977019): Finish cleaning up this class.
 }
diff --git a/chrome/browser/ui/ash/kiosk_next_shell_client_browsertest.cc b/chrome/browser/ui/ash/kiosk_next_shell_client_browsertest.cc
deleted file mode 100644
index 5f61dd9..0000000
--- a/chrome/browser/ui/ash/kiosk_next_shell_client_browsertest.cc
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "apps/test/app_window_waiter.h"
-#include "ash/public/cpp/ash_features.h"
-#include "ash/public/cpp/ash_pref_names.h"
-#include "ash/public/cpp/shell_window_ids.h"
-#include "base/run_loop.h"
-#include "base/test/scoped_feature_list.h"
-#include "base/test/test_timeouts.h"
-#include "build/build_config.h"
-#include "chrome/browser/chrome_notification_types.h"
-#include "chrome/browser/chromeos/login/test/fake_gaia_mixin.h"
-#include "chrome/browser/chromeos/login/test/oobe_base_test.h"
-#include "chrome/browser/chromeos/login/ui/login_display_host.h"
-#include "chrome/browser/chromeos/profiles/profile_helper.h"
-#include "chrome/browser/extensions/component_loader.h"
-#include "chrome/browser/ui/ash/kiosk_next_shell_client.h"
-#include "chrome/browser/ui/browser_finder.h"
-#include "chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h"
-#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
-#include "chrome/common/extensions/extension_constants.h"
-#include "components/prefs/pref_service.h"
-#include "components/user_manager/user.h"
-#include "components/user_manager/user_manager.h"
-#include "content/public/browser/notification_service.h"
-#include "content/public/test/test_utils.h"
-#include "extensions/browser/app_window/app_window.h"
-#include "extensions/browser/app_window/app_window_registry.h"
-#include "net/test/embedded_test_server/embedded_test_server.h"
-#include "ui/aura/window.h"
-#include "ui/base/ui_base_features.h"
-
-namespace chromeos {
-namespace {
-
-class KioskNextShellClientTest : public OobeBaseTest {
- public:
-  KioskNextShellClientTest() : OobeBaseTest() {
-    feature_list_.InitAndEnableFeature(ash::features::kKioskNextShell);
-  }
-
-  void Login(const std::string& username) {
-    WaitForSigninScreen();
-
-    content::WindowedNotificationObserver session_started_observer(
-        chrome::NOTIFICATION_SESSION_STARTED,
-        content::NotificationService::AllSources());
-
-    LoginDisplayHost::default_host()
-        ->GetOobeUI()
-        ->GetView<GaiaScreenHandler>()
-        ->ShowSigninScreenForTest(username, "password", "[]");
-
-    // Wait for the session to start after submitting the credentials. This
-    // will wait until all the background requests are done.
-    session_started_observer.Wait();
-  }
-
-  void LoginAndEnableKioskNextShellPref() {
-    Login("username");
-
-    // Take some time to finish login and register user prefs.
-    base::RunLoop().RunUntilIdle();
-
-    // Update the now registered Kiosk Next Shell pref.
-    ProfileHelper::Get()
-        ->GetProfileByUser(user_manager::UserManager::Get()->GetActiveUser())
-        ->GetPrefs()
-        ->SetBoolean(ash::prefs::kKioskNextShellEnabled, true);
-  }
-
- private:
-  FakeGaiaMixin fake_gaia_{&mixin_host_, embedded_test_server()};
-
-  base::test::ScopedFeatureList feature_list_;
-};
-
-IN_PROC_BROWSER_TEST_F(KioskNextShellClientTest, PRE_BrowserNotLaunched) {
-  LoginAndEnableKioskNextShellPref();
-}
-
-// Ensures that browser is not launched when feature is enabled and prefs allow.
-IN_PROC_BROWSER_TEST_F(KioskNextShellClientTest, BrowserNotLaunched) {
-  extensions::ComponentLoader::EnableBackgroundExtensionsForTesting();
-  Login("username");
-  Profile* profile = ProfileHelper::Get()->GetProfileByUser(
-      user_manager::UserManager::Get()->GetActiveUser());
-  EXPECT_EQ(0u, chrome::GetBrowserCount(profile));
-}
-
-// Checks that the Kiosk Next Home window does not launch in sign-in when
-// its pref is disabled.
-//
-// See https://crbug.com/971256
-#if defined(OS_LINUX)
-#define MAYBE_KioskNextShellNotLaunched DISABLED_KioskNextShellNotLaunched
-#else
-#define MAYBE_KioskNextShellNotLaunched KioskNextShellNotLaunched
-#endif
-IN_PROC_BROWSER_TEST_F(KioskNextShellClientTest,
-                       MAYBE_KioskNextShellNotLaunched) {
-  // Enable all component extensions.
-  extensions::ComponentLoader::EnableBackgroundExtensionsForTesting();
-
-  Login("username");
-
-  // Wait for the app to launch before verifying that it didn't.
-  apps::AppWindowWaiter waiter(
-      extensions::AppWindowRegistry::Get(ProfileHelper::Get()->GetProfileByUser(
-          user_manager::UserManager::Get()->GetActiveUser())),
-      extension_misc::kKioskNextHomeAppId);
-  EXPECT_FALSE(waiter.WaitForShownWithTimeout(TestTimeouts::action_timeout()));
-}
-
-IN_PROC_BROWSER_TEST_F(KioskNextShellClientTest, PRE_KioskNextShellLaunch) {
-  LoginAndEnableKioskNextShellPref();
-}
-
-// Checks that the Kiosk Next Home window is launched on sign-in when the
-// feature is enabled and its pref allows it.
-IN_PROC_BROWSER_TEST_F(KioskNextShellClientTest, KioskNextShellLaunch) {
-  // Enable all component extensions.
-  extensions::ComponentLoader::EnableBackgroundExtensionsForTesting();
-
-  Login("username");
-
-  // Wait for the app to launch.
-  apps::AppWindowWaiter waiter(
-      extensions::AppWindowRegistry::Get(ProfileHelper::Get()->GetProfileByUser(
-          user_manager::UserManager::Get()->GetActiveUser())),
-      extension_misc::kKioskNextHomeAppId);
-  extensions::AppWindow* app_window =
-      waiter.WaitForShownWithTimeout(TestTimeouts::action_timeout());
-  ASSERT_TRUE(app_window);
-
-  // Verify the window is in the Home Screen container.
-  EXPECT_EQ(app_window->GetNativeWindow()->parent(),
-            app_window->GetNativeWindow()->GetRootWindow()->GetChildById(
-                ash::kShellWindowId_HomeScreenContainer));
-}
-
-}  // namespace
-}  // namespace chromeos
diff --git a/chrome/browser/ui/ash/launcher_animations_interactive_uitest.cc b/chrome/browser/ui/ash/launcher_animations_interactive_uitest.cc
index 18ab477..2e9c2c7d 100644
--- a/chrome/browser/ui/ash/launcher_animations_interactive_uitest.cc
+++ b/chrome/browser/ui/ash/launcher_animations_interactive_uitest.cc
@@ -137,6 +137,34 @@
                          LauncherAnimationsFullscreenTest,
                          /*reuse_widget=*/::testing::Bool());
 
+class LauncherAnimationsExpandToFullscreenTest
+    : public LauncherAnimationsTestBase {
+ public:
+  LauncherAnimationsExpandToFullscreenTest() = default;
+  ~LauncherAnimationsExpandToFullscreenTest() override = default;
+
+ private:
+  // LauncherAnimationsTestBase:
+  std::string GetAnimationSmoothnessMetricsName() const override {
+    return "FullscreenAllApps.ClamshellMode";
+  }
+
+  DISALLOW_COPY_AND_ASSIGN(LauncherAnimationsExpandToFullscreenTest);
+};
+
+IN_PROC_BROWSER_TEST_P(LauncherAnimationsExpandToFullscreenTest, Run) {
+  SendKeyAndWaitForState(ui::VKEY_BROWSER_SEARCH, false,
+                         ash::AppListViewState::kPeeking);
+  SendKeyAndWaitForState(ui::VKEY_BROWSER_SEARCH, true,
+                         ash::AppListViewState::kFullscreenAllApps);
+  SendKeyAndWaitForState(ui::VKEY_BROWSER_SEARCH, true,
+                         ash::AppListViewState::kClosed);
+}
+
+INSTANTIATE_TEST_SUITE_P(LauncherAnimations,
+                         LauncherAnimationsExpandToFullscreenTest,
+                         /*reuse_widget=*/::testing::Bool());
+
 class LauncherAnimationsPeekingTest : public LauncherAnimationsTestBase {
  public:
   LauncherAnimationsPeekingTest() = default;
diff --git a/chrome/browser/ui/ash/multi_user/multi_profile_support_unittest.cc b/chrome/browser/ui/ash/multi_user/multi_profile_support_unittest.cc
index d14fcba7..730496c 100644
--- a/chrome/browser/ui/ash/multi_user/multi_profile_support_unittest.cc
+++ b/chrome/browser/ui/ash/multi_user/multi_profile_support_unittest.cc
@@ -73,12 +73,10 @@
 
 namespace {
 
-const char kAAccountIdString[] =
-    "{\"account_type\":\"unknown\",\"email\":\"A\"}";
-const char kBAccountIdString[] =
-    "{\"account_type\":\"unknown\",\"email\":\"B\"}";
+const char kAAccountIdString[] = R"({"account_type":"unknown","email":"a"})";
+const char kBAccountIdString[] = R"({"account_type":"unknown","email":"b"})";
 const char kArrowBAccountIdString[] =
-    "->{\"account_type\":\"unknown\",\"email\":\"B\"}";
+    R"(->{"account_type":"unknown","email":"b"})";
 
 const content::BrowserContext* GetActiveContext() {
   const user_manager::UserManager* user_manager =
@@ -196,8 +194,8 @@
 
   // Returns a list of all open windows in the following form:
   // "<H(idden)/S(hown)/D(eleted)>[<Owner>[,<shownForUser>]], .."
-  // Like: "S[B], .." would mean that window#0 is shown and belongs to user B.
-  // or "S[B,A], .." would mean that window#0 is shown, belongs to B but is
+  // Like: "S[b], .." would mean that window#0 is shown and belongs to user B.
+  // or "S[b,a], .." would mean that window#0 is shown, belongs to B but is
   // shown by A, and "D,..." would mean that window#0 is deleted.
   std::string GetStatus() {
     return GetStatusImpl(/* follow_transients */ false);
@@ -311,7 +309,7 @@
     windows_[i]->Show();
   }
   ::MultiUserWindowManagerHelper::CreateInstanceForTest(
-      AccountId::FromUserEmail("A"));
+      AccountId::FromUserEmail("a"));
   ash::MultiUserWindowManagerImpl::Get()->SetAnimationSpeedForTest(
       ash::MultiUserWindowManagerImpl::ANIMATION_SPEED_DISABLED);
   wallpaper_controller_client_ =
@@ -382,8 +380,8 @@
             ::MultiUserWindowManagerHelper::GetWindowManager());
   EXPECT_FALSE(multi_user_window_manager()->AreWindowsSharedAmongUsers());
 
-  const AccountId account_id_A(AccountId::FromUserEmail("A"));
-  const AccountId account_id_B(AccountId::FromUserEmail("B"));
+  const AccountId account_id_A(AccountId::FromUserEmail("a"));
+  const AccountId account_id_B(AccountId::FromUserEmail("b"));
 
   // The owner of an unowned window should be empty and it should be shown on
   // all windows.
@@ -432,51 +430,51 @@
 TEST_F(MultiProfileSupportTest, OwnerTests) {
   SetUpForThisManyWindows(5);
 
-  const AccountId account_id_A(AccountId::FromUserEmail("A"));
-  const AccountId account_id_B(AccountId::FromUserEmail("B"));
-  const AccountId account_id_C(AccountId::FromUserEmail("C"));
+  const AccountId account_id_A(AccountId::FromUserEmail("a"));
+  const AccountId account_id_B(AccountId::FromUserEmail("b"));
+  const AccountId account_id_C(AccountId::FromUserEmail("c"));
 
   // Set some windows to the active owner.
   multi_user_window_manager()->SetWindowOwner(window(0), account_id_A);
-  EXPECT_EQ("S[A], S[], S[], S[], S[]", GetStatus());
+  EXPECT_EQ("S[a], S[], S[], S[], S[]", GetStatus());
   multi_user_window_manager()->SetWindowOwner(window(2), account_id_A);
-  EXPECT_EQ("S[A], S[], S[A], S[], S[]", GetStatus());
+  EXPECT_EQ("S[a], S[], S[a], S[], S[]", GetStatus());
 
   // Set some windows to an inactive owner. Note that the windows should hide.
   multi_user_window_manager()->SetWindowOwner(window(1), account_id_B);
-  EXPECT_EQ("S[A], H[B], S[A], S[], S[]", GetStatus());
+  EXPECT_EQ("S[a], H[b], S[a], S[], S[]", GetStatus());
   multi_user_window_manager()->SetWindowOwner(window(3), account_id_B);
-  EXPECT_EQ("S[A], H[B], S[A], H[B], S[]", GetStatus());
+  EXPECT_EQ("S[a], H[b], S[a], H[b], S[]", GetStatus());
 
   // Assume that the user has now changed to C - which should show / hide
   // accordingly.
   StartUserTransitionAnimation(account_id_C);
-  EXPECT_EQ("H[A], H[B], H[A], H[B], S[]", GetStatus());
+  EXPECT_EQ("H[a], H[b], H[a], H[b], S[]", GetStatus());
 
   // If someone tries to show an inactive window it should only work if it can
   // be shown / hidden.
   StartUserTransitionAnimation(account_id_A);
-  EXPECT_EQ("S[A], H[B], S[A], H[B], S[]", GetStatus());
+  EXPECT_EQ("S[a], H[b], S[a], H[b], S[]", GetStatus());
   window(3)->Show();
-  EXPECT_EQ("S[A], H[B], S[A], H[B], S[]", GetStatus());
+  EXPECT_EQ("S[a], H[b], S[a], H[b], S[]", GetStatus());
   window(2)->Hide();
-  EXPECT_EQ("S[A], H[B], H[A], H[B], S[]", GetStatus());
+  EXPECT_EQ("S[a], H[b], H[a], H[b], S[]", GetStatus());
   window(2)->Show();
-  EXPECT_EQ("S[A], H[B], S[A], H[B], S[]", GetStatus());
+  EXPECT_EQ("S[a], H[b], S[a], H[b], S[]", GetStatus());
 }
 
 TEST_F(MultiProfileSupportTest, CloseWindowTests) {
   SetUpForThisManyWindows(1);
 
-  const AccountId account_id_A(AccountId::FromUserEmail("A"));
-  const AccountId account_id_B(AccountId::FromUserEmail("B"));
+  const AccountId account_id_A(AccountId::FromUserEmail("a"));
+  const AccountId account_id_B(AccountId::FromUserEmail("b"));
 
   multi_user_window_manager()->SetWindowOwner(window(0), account_id_B);
-  EXPECT_EQ("H[B]", GetStatus());
+  EXPECT_EQ("H[b]", GetStatus());
   ShowWindowForUserNoUserTransition(window(0), account_id_A);
-  EXPECT_EQ("S[B,A]", GetStatus());
+  EXPECT_EQ("S[b,a]", GetStatus());
   EXPECT_TRUE(multi_user_window_manager()->AreWindowsSharedAmongUsers());
-  EXPECT_EQ("B", GetOwnersOfVisibleWindowsAsString());
+  EXPECT_EQ("b", GetOwnersOfVisibleWindowsAsString());
 
   aura::Window* to_be_deleted = window(0);
 
@@ -502,9 +500,9 @@
 TEST_F(MultiProfileSupportTest, SharedWindowTests) {
   SetUpForThisManyWindows(5);
 
-  const AccountId account_id_A(AccountId::FromUserEmail("A"));
-  const AccountId account_id_B(AccountId::FromUserEmail("B"));
-  const AccountId account_id_C(AccountId::FromUserEmail("C"));
+  const AccountId account_id_A(AccountId::FromUserEmail("a"));
+  const AccountId account_id_B(AccountId::FromUserEmail("b"));
+  const AccountId account_id_C(AccountId::FromUserEmail("c"));
 
   // Set some owners and make sure we got what we asked for.
   multi_user_window_manager()->SetWindowOwner(window(0), account_id_A);
@@ -512,9 +510,9 @@
   multi_user_window_manager()->SetWindowOwner(window(2), account_id_B);
   multi_user_window_manager()->SetWindowOwner(window(3), account_id_B);
   multi_user_window_manager()->SetWindowOwner(window(4), account_id_C);
-  EXPECT_EQ("S[A], S[A], H[B], H[B], H[C]", GetStatus());
+  EXPECT_EQ("S[a], S[a], H[b], H[b], H[c]", GetStatus());
   EXPECT_FALSE(multi_user_window_manager()->AreWindowsSharedAmongUsers());
-  EXPECT_EQ("A", GetOwnersOfVisibleWindowsAsString());
+  EXPECT_EQ("a", GetOwnersOfVisibleWindowsAsString());
 
   // For all following tests we override window 2 to be shown by user B.
   ShowWindowForUserNoUserTransition(window(1), account_id_B);
@@ -522,41 +520,41 @@
   // Change window 3 between two users and see that it changes
   // accordingly (or not).
   ShowWindowForUserNoUserTransition(window(2), account_id_A);
-  EXPECT_EQ("S[A], H[A,B], S[B,A], H[B], H[C]", GetStatus());
+  EXPECT_EQ("S[a], H[a,b], S[b,a], H[b], H[c]", GetStatus());
   EXPECT_TRUE(multi_user_window_manager()->AreWindowsSharedAmongUsers());
-  EXPECT_EQ("A B", GetOwnersOfVisibleWindowsAsString());
+  EXPECT_EQ("a b", GetOwnersOfVisibleWindowsAsString());
   ShowWindowForUserNoUserTransition(window(2), account_id_C);
-  EXPECT_EQ("S[A], H[A,B], H[B,C], H[B], H[C]", GetStatus());
+  EXPECT_EQ("S[a], H[a,b], H[b,c], H[b], H[c]", GetStatus());
   EXPECT_TRUE(multi_user_window_manager()->AreWindowsSharedAmongUsers());
-  EXPECT_EQ("A", GetOwnersOfVisibleWindowsAsString());
+  EXPECT_EQ("a", GetOwnersOfVisibleWindowsAsString());
 
   // Switch the users and see that the results are correct.
   StartUserTransitionAnimation(account_id_B);
-  EXPECT_EQ("H[A], S[A,B], H[B,C], S[B], H[C]", GetStatus());
-  EXPECT_EQ("A B", GetOwnersOfVisibleWindowsAsString());
+  EXPECT_EQ("H[a], S[a,b], H[b,c], S[b], H[c]", GetStatus());
+  EXPECT_EQ("a b", GetOwnersOfVisibleWindowsAsString());
   StartUserTransitionAnimation(account_id_C);
-  EXPECT_EQ("H[A], H[A,B], S[B,C], H[B], S[C]", GetStatus());
-  EXPECT_EQ("B C", GetOwnersOfVisibleWindowsAsString());
+  EXPECT_EQ("H[a], H[a,b], S[b,c], H[b], S[c]", GetStatus());
+  EXPECT_EQ("b c", GetOwnersOfVisibleWindowsAsString());
 
   // Showing on the desktop of the already owning user should have no impact.
   ShowWindowForUserNoUserTransition(window(4), account_id_C);
-  EXPECT_EQ("H[A], H[A,B], S[B,C], H[B], S[C]", GetStatus());
-  EXPECT_EQ("B C", GetOwnersOfVisibleWindowsAsString());
+  EXPECT_EQ("H[a], H[a,b], S[b,c], H[b], S[c]", GetStatus());
+  EXPECT_EQ("b c", GetOwnersOfVisibleWindowsAsString());
 
   // Changing however a shown window back to the original owner should hide it.
   ShowWindowForUserNoUserTransition(window(2), account_id_B);
-  EXPECT_EQ("H[A], H[A,B], H[B], H[B], S[C]", GetStatus());
+  EXPECT_EQ("H[a], H[a,b], H[b], H[b], S[c]", GetStatus());
   EXPECT_TRUE(multi_user_window_manager()->AreWindowsSharedAmongUsers());
-  EXPECT_EQ("C", GetOwnersOfVisibleWindowsAsString());
+  EXPECT_EQ("c", GetOwnersOfVisibleWindowsAsString());
 
   // And the change should be "permanent" - switching somewhere else and coming
   // back.
   StartUserTransitionAnimation(account_id_B);
-  EXPECT_EQ("H[A], S[A,B], S[B], S[B], H[C]", GetStatus());
-  EXPECT_EQ("A B", GetOwnersOfVisibleWindowsAsString());
+  EXPECT_EQ("H[a], S[a,b], S[b], S[b], H[c]", GetStatus());
+  EXPECT_EQ("a b", GetOwnersOfVisibleWindowsAsString());
   StartUserTransitionAnimation(account_id_C);
-  EXPECT_EQ("H[A], H[A,B], H[B], H[B], S[C]", GetStatus());
-  EXPECT_EQ("C", GetOwnersOfVisibleWindowsAsString());
+  EXPECT_EQ("H[a], H[a,b], H[b], H[b], S[c]", GetStatus());
+  EXPECT_EQ("c", GetOwnersOfVisibleWindowsAsString());
 
   // After switching window 2 back to its original desktop, all desktops should
   // be "clean" again.
@@ -568,8 +566,8 @@
 TEST_F(MultiProfileSupportTest, DoubleSharedWindowTests) {
   SetUpForThisManyWindows(1);
 
-  const AccountId account_id_A(AccountId::FromUserEmail("A"));
-  const AccountId account_id_B(AccountId::FromUserEmail("B"));
+  const AccountId account_id_A(AccountId::FromUserEmail("a"));
+  const AccountId account_id_B(AccountId::FromUserEmail("b"));
 
   multi_user_window_manager()->SetWindowOwner(window(0), account_id_B);
 
@@ -592,9 +590,9 @@
 TEST_F(MultiProfileSupportTest, PreserveWindowVisibilityTests) {
   SetUpForThisManyWindows(5);
 
-  const AccountId account_id_A(AccountId::FromUserEmail("A"));
-  const AccountId account_id_B(AccountId::FromUserEmail("B"));
-  const AccountId account_id_C(AccountId::FromUserEmail("C"));
+  const AccountId account_id_A(AccountId::FromUserEmail("a"));
+  const AccountId account_id_B(AccountId::FromUserEmail("b"));
+  const AccountId account_id_C(AccountId::FromUserEmail("c"));
 
   // Set some owners and make sure we got what we asked for.
   // Note that we try to cover all combinations in one go.
@@ -604,45 +602,45 @@
   multi_user_window_manager()->SetWindowOwner(window(3), account_id_B);
   ShowWindowForUserNoUserTransition(window(2), account_id_A);
   ShowWindowForUserNoUserTransition(window(3), account_id_A);
-  EXPECT_EQ("S[A], S[A], S[B,A], S[B,A], S[]", GetStatus());
+  EXPECT_EQ("S[a], S[a], S[b,a], S[b,a], S[]", GetStatus());
 
   // Hiding a window should be respected - no matter if it is owned by that user
   // owned by someone else but shown on that desktop - or not owned.
   window(0)->Hide();
   window(2)->Hide();
   window(4)->Hide();
-  EXPECT_EQ("H[A], S[A], H[B,A], S[B,A], H[]", GetStatus());
+  EXPECT_EQ("H[a], S[a], H[b,a], S[b,a], H[]", GetStatus());
 
   // Flipping to another user and back should preserve all show / hide states.
   StartUserTransitionAnimation(account_id_B);
-  EXPECT_EQ("H[A], H[A], H[B,A], H[B,A], H[]", GetStatus());
+  EXPECT_EQ("H[a], H[a], H[b,a], H[b,a], H[]", GetStatus());
 
   StartUserTransitionAnimation(account_id_A);
-  EXPECT_EQ("H[A], S[A], H[B,A], S[B,A], H[]", GetStatus());
+  EXPECT_EQ("H[a], S[a], H[b,a], S[b,a], H[]", GetStatus());
 
   // After making them visible and switching fore and back everything should be
   // visible.
   window(0)->Show();
   window(2)->Show();
   window(4)->Show();
-  EXPECT_EQ("S[A], S[A], S[B,A], S[B,A], S[]", GetStatus());
+  EXPECT_EQ("S[a], S[a], S[b,a], S[b,a], S[]", GetStatus());
 
   StartUserTransitionAnimation(account_id_B);
-  EXPECT_EQ("H[A], H[A], H[B,A], H[B,A], S[]", GetStatus());
+  EXPECT_EQ("H[a], H[a], H[b,a], H[b,a], S[]", GetStatus());
 
   StartUserTransitionAnimation(account_id_A);
-  EXPECT_EQ("S[A], S[A], S[B,A], S[B,A], S[]", GetStatus());
+  EXPECT_EQ("S[a], S[a], S[b,a], S[b,a], S[]", GetStatus());
 
   // Now test that making windows visible through "normal operation" while the
   // user's desktop is hidden leads to the correct result.
   StartUserTransitionAnimation(account_id_B);
-  EXPECT_EQ("H[A], H[A], H[B,A], H[B,A], S[]", GetStatus());
+  EXPECT_EQ("H[a], H[a], H[b,a], H[b,a], S[]", GetStatus());
   window(0)->Show();
   window(2)->Show();
   window(4)->Show();
-  EXPECT_EQ("H[A], H[A], H[B,A], H[B,A], S[]", GetStatus());
+  EXPECT_EQ("H[a], H[a], H[b,a], H[b,a], S[]", GetStatus());
   StartUserTransitionAnimation(account_id_A);
-  EXPECT_EQ("S[A], S[A], S[B,A], S[B,A], S[]", GetStatus());
+  EXPECT_EQ("S[a], S[a], S[b,a], S[b,a], S[]", GetStatus());
 }
 
 // Check that minimizing a window which is owned by another user will move it
@@ -650,28 +648,28 @@
 TEST_F(MultiProfileSupportTest, MinimizeChangesOwnershipBack) {
   SetUpForThisManyWindows(4);
 
-  const AccountId account_id_A(AccountId::FromUserEmail("A"));
-  const AccountId account_id_B(AccountId::FromUserEmail("B"));
+  const AccountId account_id_A(AccountId::FromUserEmail("a"));
+  const AccountId account_id_B(AccountId::FromUserEmail("b"));
 
   multi_user_window_manager()->SetWindowOwner(window(0), account_id_A);
   multi_user_window_manager()->SetWindowOwner(window(1), account_id_B);
   multi_user_window_manager()->SetWindowOwner(window(2), account_id_B);
   ShowWindowForUserNoUserTransition(window(1), account_id_A);
-  EXPECT_EQ("S[A], S[B,A], H[B], S[]", GetStatus());
+  EXPECT_EQ("S[a], S[b,a], H[b], S[]", GetStatus());
   EXPECT_TRUE(
       MultiUserWindowManagerHelper::GetInstance()->IsWindowOnDesktopOfUser(
           window(1), account_id_A));
   wm::GetWindowState(window(1))->Minimize();
   // At this time the window is still on the desktop of that user, but the user
   // does not have a way to get to it.
-  EXPECT_EQ("S[A], H[B,A], H[B], S[]", GetStatus());
+  EXPECT_EQ("S[a], H[b,a], H[b], S[]", GetStatus());
   EXPECT_TRUE(
       MultiUserWindowManagerHelper::GetInstance()->IsWindowOnDesktopOfUser(
           window(1), account_id_A));
   EXPECT_TRUE(wm::GetWindowState(window(1))->IsMinimized());
   // Change to user B and make sure that minimizing does not change anything.
   StartUserTransitionAnimation(account_id_B);
-  EXPECT_EQ("H[A], S[B], S[B], S[]", GetStatus());
+  EXPECT_EQ("H[a], S[b], S[b], S[]", GetStatus());
   EXPECT_FALSE(wm::GetWindowState(window(1))->IsMinimized());
 }
 
@@ -679,39 +677,39 @@
 TEST_F(MultiProfileSupportTest, MinimizeSuppressesViewTransfer) {
   SetUpForThisManyWindows(1);
 
-  const AccountId account_id_A(AccountId::FromUserEmail("A"));
-  const AccountId account_id_B(AccountId::FromUserEmail("B"));
+  const AccountId account_id_A(AccountId::FromUserEmail("a"));
+  const AccountId account_id_B(AccountId::FromUserEmail("b"));
 
   multi_user_window_manager()->SetWindowOwner(window(0), account_id_A);
   wm::GetWindowState(window(0))->Minimize();
-  EXPECT_EQ("H[A]", GetStatus());
+  EXPECT_EQ("H[a]", GetStatus());
 
   // Try to transfer the window to user B - which should get ignored.
   ShowWindowForUserNoUserTransition(window(0), account_id_B);
-  EXPECT_EQ("H[A]", GetStatus());
+  EXPECT_EQ("H[a]", GetStatus());
 }
 
 // Testing that the activation state changes to the active window.
 TEST_F(MultiProfileSupportTest, ActiveWindowTests) {
   SetUpForThisManyWindows(4);
 
-  const AccountId account_id_A(AccountId::FromUserEmail("A"));
-  const AccountId account_id_B(AccountId::FromUserEmail("B"));
-  const AccountId account_id_C(AccountId::FromUserEmail("C"));
+  const AccountId account_id_A(AccountId::FromUserEmail("a"));
+  const AccountId account_id_B(AccountId::FromUserEmail("b"));
+  const AccountId account_id_C(AccountId::FromUserEmail("c"));
 
   // Set some windows to the active owner.
   multi_user_window_manager()->SetWindowOwner(window(0), account_id_A);
   multi_user_window_manager()->SetWindowOwner(window(1), account_id_A);
   multi_user_window_manager()->SetWindowOwner(window(2), account_id_B);
   multi_user_window_manager()->SetWindowOwner(window(3), account_id_B);
-  EXPECT_EQ("S[A], S[A], H[B], H[B]", GetStatus());
+  EXPECT_EQ("S[a], S[a], H[b], H[b]", GetStatus());
 
   // Set the active window for user A to be #1
   ::wm::ActivateWindow(window(1));
 
   // Change to user B and make sure that one of its windows is active.
   StartUserTransitionAnimation(account_id_B);
-  EXPECT_EQ("H[A], H[A], S[B], S[B]", GetStatus());
+  EXPECT_EQ("H[a], H[a], S[b], S[b]", GetStatus());
   EXPECT_TRUE(::wm::IsActiveWindow(window(3)) ||
               ::wm::IsActiveWindow(window(2)));
   // Set the active window for user B now to be #2
@@ -742,8 +740,8 @@
 TEST_F(MultiProfileSupportTest, TransientWindows) {
   SetUpForThisManyWindows(10);
 
-  const AccountId account_id_A(AccountId::FromUserEmail("A"));
-  const AccountId account_id_B(AccountId::FromUserEmail("B"));
+  const AccountId account_id_A(AccountId::FromUserEmail("a"));
+  const AccountId account_id_B(AccountId::FromUserEmail("b"));
 
   // We create a hierarchy like this:
   //    0 (A)  4 (B)   7 (-)   - The top level owned/not owned windows
@@ -768,12 +766,12 @@
   // By now the hierarchy should have updated itself to show all windows of A
   // and hide all windows of B. Unowned windows should remain in what ever state
   // they are in.
-  EXPECT_EQ("S[A], S[], S[], S[], H[B], H[], H[], S[], S[], S[]", GetStatus());
+  EXPECT_EQ("S[a], S[], S[], S[], H[b], H[], H[], S[], S[], S[]", GetStatus());
 
   // Trying to show a hidden transient window shouldn't change anything for now.
   window(5)->Show();
   window(6)->Show();
-  EXPECT_EQ("S[A], S[], S[], S[], H[B], H[], H[], S[], S[], S[]", GetStatus());
+  EXPECT_EQ("S[a], S[], S[], S[], H[b], H[], H[], S[], S[], S[]", GetStatus());
 
   // Hiding on the other hand a shown window should work and hide also its
   // children. Note that hide will have an immediate impact on itself and all
@@ -781,13 +779,13 @@
   // transient children are removed from its owner later on.
   window(2)->Hide();
   window(9)->Hide();
-  EXPECT_EQ("S[A], S[], H[], H[], H[B], H[], H[], S[], S[], H[]", GetStatus());
+  EXPECT_EQ("S[a], S[], H[], H[], H[b], H[], H[], S[], S[], H[]", GetStatus());
 
   // Switching users and switch back should return to the previous state.
   StartUserTransitionAnimation(account_id_B);
-  EXPECT_EQ("H[A], H[], H[], H[], S[B], S[], S[], S[], S[], H[]", GetStatus());
+  EXPECT_EQ("H[a], H[], H[], H[], S[b], S[], S[], S[], S[], H[]", GetStatus());
   StartUserTransitionAnimation(account_id_A);
-  EXPECT_EQ("S[A], S[], H[], H[], H[B], H[], H[], S[], S[], H[]", GetStatus());
+  EXPECT_EQ("S[a], S[], H[], H[], H[b], H[], H[], S[], S[], H[]", GetStatus());
 
   // Removing a window from its transient parent should return to the previously
   // set visibility state.
@@ -802,7 +800,7 @@
   //                   9
   ::wm::RemoveTransientChild(window(2), window(3));
   ::wm::RemoveTransientChild(window(4), window(6));
-  EXPECT_EQ("S[A], S[], H[], H[], H[B], H[], S[], S[], S[], H[]", GetStatus());
+  EXPECT_EQ("S[a], S[], H[], H[], H[b], H[], S[], S[], S[], H[]", GetStatus());
   // Before we leave we need to reverse all transient window ownerships.
   ::wm::RemoveTransientChild(window(0), window(1));
   ::wm::RemoveTransientChild(window(1), window(2));
@@ -817,7 +815,7 @@
   SetUpForThisManyWindows(2);
   aura::Window* parent = window(0);
   aura::Window* transient = window(1);
-  const AccountId account_id(AccountId::FromUserEmail("A"));
+  const AccountId account_id(AccountId::FromUserEmail("a"));
   multi_user_window_manager()->SetWindowOwner(parent, account_id);
 
   // Simulate chrome::ShowWebDialog() showing a transient dialog, which calls
@@ -826,7 +824,7 @@
   multi_user_window_manager()->SetWindowOwner(transient, account_id);
 
   // Both windows are shown and owned by user A.
-  EXPECT_EQ("S[A], S[A]", GetStatusUseTransientOwners());
+  EXPECT_EQ("S[a], S[a]", GetStatusUseTransientOwners());
 
   // Cleanup.
   ::wm::RemoveTransientChild(parent, transient);
@@ -836,8 +834,8 @@
 TEST_F(MultiProfileSupportTest, PreserveInitialVisibility) {
   SetUpForThisManyWindows(4);
 
-  const AccountId account_id_A(AccountId::FromUserEmail("A"));
-  const AccountId account_id_B(AccountId::FromUserEmail("B"));
+  const AccountId account_id_A(AccountId::FromUserEmail("a"));
+  const AccountId account_id_B(AccountId::FromUserEmail("b"));
 
   // Set our initial show state before we assign an owner.
   window(0)->Show();
@@ -851,11 +849,11 @@
   multi_user_window_manager()->SetWindowOwner(window(1), account_id_A);
   multi_user_window_manager()->SetWindowOwner(window(2), account_id_B);
   multi_user_window_manager()->SetWindowOwner(window(3), account_id_B);
-  EXPECT_EQ("S[A], H[A], H[B], H[B]", GetStatus());
+  EXPECT_EQ("S[a], H[a], H[b], H[b]", GetStatus());
   StartUserTransitionAnimation(account_id_B);
-  EXPECT_EQ("H[A], H[A], S[B], H[B]", GetStatus());
+  EXPECT_EQ("H[a], H[a], S[b], H[b]", GetStatus());
   StartUserTransitionAnimation(account_id_A);
-  EXPECT_EQ("S[A], H[A], H[B], H[B]", GetStatus());
+  EXPECT_EQ("S[a], H[a], H[b], H[b]", GetStatus());
 
   // Second test: Transferring the window to another desktop preserves the
   // show state.
@@ -863,11 +861,11 @@
   ShowWindowForUserNoUserTransition(window(1), account_id_B);
   ShowWindowForUserNoUserTransition(window(2), account_id_A);
   ShowWindowForUserNoUserTransition(window(3), account_id_A);
-  EXPECT_EQ("H[A,B], H[A,B], S[B,A], H[B,A]", GetStatus());
+  EXPECT_EQ("H[a,b], H[a,b], S[b,a], H[b,a]", GetStatus());
   StartUserTransitionAnimation(account_id_B);
-  EXPECT_EQ("S[A,B], H[A,B], H[B,A], H[B,A]", GetStatus());
+  EXPECT_EQ("S[a,b], H[a,b], H[b,a], H[b,a]", GetStatus());
   StartUserTransitionAnimation(account_id_A);
-  EXPECT_EQ("H[A,B], H[A,B], S[B,A], H[B,A]", GetStatus());
+  EXPECT_EQ("H[a,b], H[a,b], S[b,a], H[b,a]", GetStatus());
 }
 
 // Test that in case of an activated tablet mode, windows from all users get
@@ -875,8 +873,8 @@
 TEST_F(MultiProfileSupportTest, TabletModeInteraction) {
   SetUpForThisManyWindows(2);
 
-  const AccountId account_id_A(AccountId::FromUserEmail("A"));
-  const AccountId account_id_B(AccountId::FromUserEmail("B"));
+  const AccountId account_id_A(AccountId::FromUserEmail("a"));
+  const AccountId account_id_B(AccountId::FromUserEmail("b"));
 
   multi_user_window_manager()->SetWindowOwner(window(0), account_id_A);
   multi_user_window_manager()->SetWindowOwner(window(1), account_id_B);
@@ -978,9 +976,9 @@
 TEST_F(MultiProfileSupportTest, FullUserSwitchAnimationTests) {
   SetUpForThisManyWindows(3);
 
-  const AccountId account_id_A(AccountId::FromUserEmail("A"));
-  const AccountId account_id_B(AccountId::FromUserEmail("B"));
-  const AccountId account_id_C(AccountId::FromUserEmail("C"));
+  const AccountId account_id_A(AccountId::FromUserEmail("a"));
+  const AccountId account_id_B(AccountId::FromUserEmail("b"));
+  const AccountId account_id_C(AccountId::FromUserEmail("c"));
 
   // Turn the use of delays and animation on.
   ash::MultiUserWindowManagerImpl::Get()->SetAnimationSpeedForTest(
@@ -989,27 +987,27 @@
   multi_user_window_manager()->SetWindowOwner(window(0), account_id_A);
   multi_user_window_manager()->SetWindowOwner(window(1), account_id_B);
   multi_user_window_manager()->SetWindowOwner(window(2), account_id_C);
-  EXPECT_EQ("S[A], H[B], H[C]", GetStatus());
-  EXPECT_EQ("A", GetOwnersOfVisibleWindowsAsString());
+  EXPECT_EQ("S[a], H[b], H[c]", GetStatus());
+  EXPECT_EQ("a", GetOwnersOfVisibleWindowsAsString());
 
   // Switch the user fore and back and see that the results are correct.
   SwitchUserAndWaitForAnimation(account_id_B);
 
-  EXPECT_EQ("H[A], S[B], H[C]", GetStatus());
-  EXPECT_EQ("B", GetOwnersOfVisibleWindowsAsString());
+  EXPECT_EQ("H[a], S[b], H[c]", GetStatus());
+  EXPECT_EQ("b", GetOwnersOfVisibleWindowsAsString());
 
   SwitchUserAndWaitForAnimation(account_id_A);
 
-  EXPECT_EQ("S[A], H[B], H[C]", GetStatus());
+  EXPECT_EQ("S[a], H[b], H[c]", GetStatus());
 
   // Switch the user quickly to another user and before the animation is done
   // switch back and see that this works.
   StartUserTransitionAnimation(account_id_B);
-  EXPECT_EQ("H[A], S[B], H[C]", GetStatus());
+  EXPECT_EQ("H[a], S[b], H[c]", GetStatus());
   // Check that after switching to C, C is fully visible.
   SwitchUserAndWaitForAnimation(account_id_C);
-  EXPECT_EQ("H[A], H[B], S[C]", GetStatus());
-  EXPECT_EQ("C", GetOwnersOfVisibleWindowsAsString());
+  EXPECT_EQ("H[a], H[b], S[c]", GetStatus());
+  EXPECT_EQ("c", GetOwnersOfVisibleWindowsAsString());
 }
 
 // Make sure that we do not crash upon shutdown when an animation is pending and
@@ -1017,8 +1015,8 @@
 TEST_F(MultiProfileSupportTest, SystemShutdownWithActiveAnimation) {
   SetUpForThisManyWindows(2);
 
-  const AccountId account_id_A(AccountId::FromUserEmail("A"));
-  const AccountId account_id_B(AccountId::FromUserEmail("B"));
+  const AccountId account_id_A(AccountId::FromUserEmail("a"));
+  const AccountId account_id_B(AccountId::FromUserEmail("b"));
 
   // Turn the use of delays and animation on.
   ash::MultiUserWindowManagerImpl::Get()->SetAnimationSpeedForTest(
@@ -1037,9 +1035,9 @@
 TEST_F(MultiProfileSupportTest, AnimationSteps) {
   SetUpForThisManyWindows(3);
 
-  const AccountId account_id_A(AccountId::FromUserEmail("A"));
-  const AccountId account_id_B(AccountId::FromUserEmail("B"));
-  const AccountId account_id_C(AccountId::FromUserEmail("C"));
+  const AccountId account_id_A(AccountId::FromUserEmail("a"));
+  const AccountId account_id_B(AccountId::FromUserEmail("b"));
+  const AccountId account_id_C(AccountId::FromUserEmail("c"));
 
   // Turn the use of delays and animation on.
   ash::MultiUserWindowManagerImpl::Get()->SetAnimationSpeedForTest(
@@ -1050,21 +1048,21 @@
   multi_user_window_manager()->SetWindowOwner(window(2), account_id_C);
   EXPECT_FALSE(CoversScreen(window(0)));
   EXPECT_FALSE(CoversScreen(window(1)));
-  EXPECT_EQ("S[A], H[B], H[C]", GetStatus());
-  EXPECT_EQ("A", GetOwnersOfVisibleWindowsAsString());
+  EXPECT_EQ("S[a], H[b], H[c]", GetStatus());
+  EXPECT_EQ("a", GetOwnersOfVisibleWindowsAsString());
   EXPECT_EQ(1.0f, window(0)->layer()->GetTargetOpacity());
 
   // Start the animation and see that the old window is becoming invisible, the
   // new one is becoming visible, and the background starts transitionining.
   StartUserTransitionAnimation(account_id_B);
   EXPECT_EQ(kArrowBAccountIdString, GetWallpaperUserIdForTest());
-  EXPECT_EQ("H[A], S[B], H[C]", GetStatus());
+  EXPECT_EQ("H[a], S[b], H[c]", GetStatus());
   EXPECT_EQ(0.0f, window(0)->layer()->GetTargetOpacity());
   EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity());
 
   AdvanceUserTransitionAnimation();
   EXPECT_EQ(kArrowBAccountIdString, GetWallpaperUserIdForTest());
-  EXPECT_EQ("H[A], S[B], H[C]", GetStatus());
+  EXPECT_EQ("H[a], S[b], H[c]", GetStatus());
   EXPECT_EQ(0.0f, window(0)->layer()->GetTargetOpacity());
   EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity());
 
@@ -1095,9 +1093,9 @@
 TEST_F(MultiProfileSupportTest, AnimationStepsMaximizeToNormal) {
   SetUpForThisManyWindows(3);
 
-  const AccountId account_id_A(AccountId::FromUserEmail("A"));
-  const AccountId account_id_B(AccountId::FromUserEmail("B"));
-  const AccountId account_id_C(AccountId::FromUserEmail("C"));
+  const AccountId account_id_A(AccountId::FromUserEmail("a"));
+  const AccountId account_id_B(AccountId::FromUserEmail("b"));
+  const AccountId account_id_C(AccountId::FromUserEmail("c"));
 
   // Turn the use of delays and animation on.
   ash::MultiUserWindowManagerImpl::Get()->SetAnimationSpeedForTest(
@@ -1109,27 +1107,27 @@
   multi_user_window_manager()->SetWindowOwner(window(2), account_id_C);
   EXPECT_TRUE(CoversScreen(window(0)));
   EXPECT_FALSE(CoversScreen(window(1)));
-  EXPECT_EQ("S[A], H[B], H[C]", GetStatus());
-  EXPECT_EQ("A", GetOwnersOfVisibleWindowsAsString());
+  EXPECT_EQ("S[a], H[b], H[c]", GetStatus());
+  EXPECT_EQ("a", GetOwnersOfVisibleWindowsAsString());
   EXPECT_EQ(1.0f, window(0)->layer()->GetTargetOpacity());
 
   // Start the animation and see that the new background is immediately set.
   StartUserTransitionAnimation(account_id_B);
-  EXPECT_EQ("H[A], S[B], H[C]", GetStatus());
+  EXPECT_EQ("H[a], S[b], H[c]", GetStatus());
   EXPECT_EQ(kBAccountIdString, GetWallpaperUserIdForTest());
   EXPECT_EQ(0.0f, window(0)->layer()->GetTargetOpacity());
   EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity());
 
   // The next step will not change anything.
   AdvanceUserTransitionAnimation();
-  EXPECT_EQ("H[A], S[B], H[C]", GetStatus());
+  EXPECT_EQ("H[a], S[b], H[c]", GetStatus());
   EXPECT_EQ(kBAccountIdString, GetWallpaperUserIdForTest());
   EXPECT_EQ(0.0f, window(0)->layer()->GetTargetOpacity());
   EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity());
 
   // The final step will also not have any visible impact.
   AdvanceUserTransitionAnimation();
-  EXPECT_EQ("H[A], S[B], H[C]", GetStatus());
+  EXPECT_EQ("H[a], S[b], H[c]", GetStatus());
   EXPECT_EQ(kBAccountIdString, GetWallpaperUserIdForTest());
   EXPECT_EQ(0.0f, window(0)->layer()->GetTargetOpacity());
   EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity());
@@ -1140,9 +1138,9 @@
 TEST_F(MultiProfileSupportTest, AnimationStepsNormalToMaximized) {
   SetUpForThisManyWindows(3);
 
-  const AccountId account_id_A(AccountId::FromUserEmail("A"));
-  const AccountId account_id_B(AccountId::FromUserEmail("B"));
-  const AccountId account_id_C(AccountId::FromUserEmail("C"));
+  const AccountId account_id_A(AccountId::FromUserEmail("a"));
+  const AccountId account_id_B(AccountId::FromUserEmail("b"));
+  const AccountId account_id_C(AccountId::FromUserEmail("c"));
 
   // Turn the use of delays and animation on.
   ash::MultiUserWindowManagerImpl::Get()->SetAnimationSpeedForTest(
@@ -1154,28 +1152,28 @@
   multi_user_window_manager()->SetWindowOwner(window(2), account_id_C);
   EXPECT_FALSE(CoversScreen(window(0)));
   EXPECT_TRUE(CoversScreen(window(1)));
-  EXPECT_EQ("S[A], H[B], H[C]", GetStatus());
-  EXPECT_EQ("A", GetOwnersOfVisibleWindowsAsString());
+  EXPECT_EQ("S[a], H[b], H[c]", GetStatus());
+  EXPECT_EQ("a", GetOwnersOfVisibleWindowsAsString());
   EXPECT_EQ(1.0f, window(0)->layer()->GetTargetOpacity());
 
   // Start the animation and see that the old window is becoming invisible, the
   // new one visible and the background remains as is.
   StartUserTransitionAnimation(account_id_B);
-  EXPECT_EQ("H[A], S[B], H[C]", GetStatus());
+  EXPECT_EQ("H[a], S[b], H[c]", GetStatus());
   EXPECT_EQ("", GetWallpaperUserIdForTest());
   EXPECT_EQ(0.0f, window(0)->layer()->GetTargetOpacity());
   EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity());
 
   // The next step will not change anything.
   AdvanceUserTransitionAnimation();
-  EXPECT_EQ("H[A], S[B], H[C]", GetStatus());
+  EXPECT_EQ("H[a], S[b], H[c]", GetStatus());
   EXPECT_EQ("", GetWallpaperUserIdForTest());
   EXPECT_EQ(0.0f, window(0)->layer()->GetTargetOpacity());
   EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity());
 
   // The final step however will switch the background.
   AdvanceUserTransitionAnimation();
-  EXPECT_EQ("H[A], S[B], H[C]", GetStatus());
+  EXPECT_EQ("H[a], S[b], H[c]", GetStatus());
   EXPECT_EQ(kBAccountIdString, GetWallpaperUserIdForTest());
   EXPECT_EQ(0.0f, window(0)->layer()->GetTargetOpacity());
   EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity());
@@ -1186,9 +1184,9 @@
 TEST_F(MultiProfileSupportTest, AnimationStepsMaximizedToMaximized) {
   SetUpForThisManyWindows(3);
 
-  const AccountId account_id_A(AccountId::FromUserEmail("A"));
-  const AccountId account_id_B(AccountId::FromUserEmail("B"));
-  const AccountId account_id_C(AccountId::FromUserEmail("C"));
+  const AccountId account_id_A(AccountId::FromUserEmail("a"));
+  const AccountId account_id_B(AccountId::FromUserEmail("b"));
+  const AccountId account_id_C(AccountId::FromUserEmail("c"));
 
   // Turn the use of delays and animation on.
   ash::MultiUserWindowManagerImpl::Get()->SetAnimationSpeedForTest(
@@ -1201,49 +1199,49 @@
   multi_user_window_manager()->SetWindowOwner(window(2), account_id_C);
   EXPECT_TRUE(CoversScreen(window(0)));
   EXPECT_TRUE(CoversScreen(window(1)));
-  EXPECT_EQ("S[A], H[B], H[C]", GetStatus());
-  EXPECT_EQ("A", GetOwnersOfVisibleWindowsAsString());
+  EXPECT_EQ("S[a], H[b], H[c]", GetStatus());
+  EXPECT_EQ("a", GetOwnersOfVisibleWindowsAsString());
   EXPECT_EQ(1.0f, window(0)->layer()->GetTargetOpacity());
 
   // Start the animation and see that the all windows are hidden (except that of
   // the new user).
   StartUserTransitionAnimation(account_id_B);
-  EXPECT_EQ("H[A], S[B], H[C]", GetStatus());
+  EXPECT_EQ("H[a], S[b], H[c]", GetStatus());
   EXPECT_EQ(kBAccountIdString, GetWallpaperUserIdForTest());
   EXPECT_EQ(0.0f, window(0)->layer()->GetTargetOpacity());
   EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity());
 
   // The next step will not change anything.
   AdvanceUserTransitionAnimation();
-  EXPECT_EQ("H[A], S[B], H[C]", GetStatus());
+  EXPECT_EQ("H[a], S[b], H[c]", GetStatus());
   EXPECT_EQ(kBAccountIdString, GetWallpaperUserIdForTest());
   EXPECT_EQ(0.0f, window(0)->layer()->GetTargetOpacity());
   EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity());
 
   // The final step however will hide the old window.
   AdvanceUserTransitionAnimation();
-  EXPECT_EQ("H[A], S[B], H[C]", GetStatus());
+  EXPECT_EQ("H[a], S[b], H[c]", GetStatus());
   EXPECT_EQ(kBAccountIdString, GetWallpaperUserIdForTest());
   EXPECT_EQ(0.0f, window(0)->layer()->GetTargetOpacity());
   EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity());
 
   // Switching back will do the exact same thing.
   StartUserTransitionAnimation(account_id_A);
-  EXPECT_EQ("S[A], H[B], H[C]", GetStatus());
+  EXPECT_EQ("S[a], H[b], H[c]", GetStatus());
   EXPECT_EQ(kAAccountIdString, GetWallpaperUserIdForTest());
   EXPECT_EQ(1.0f, window(0)->layer()->GetTargetOpacity());
   EXPECT_EQ(0.0f, window(1)->layer()->GetTargetOpacity());
 
   // The next step will not change anything.
   AdvanceUserTransitionAnimation();
-  EXPECT_EQ("S[A], H[B], H[C]", GetStatus());
+  EXPECT_EQ("S[a], H[b], H[c]", GetStatus());
   EXPECT_EQ(kAAccountIdString, GetWallpaperUserIdForTest());
   EXPECT_EQ(1.0f, window(0)->layer()->GetTargetOpacity());
   EXPECT_EQ(0.0f, window(1)->layer()->GetTargetOpacity());
 
   // The final step is also not changing anything to the status.
   AdvanceUserTransitionAnimation();
-  EXPECT_EQ("S[A], H[B], H[C]", GetStatus());
+  EXPECT_EQ("S[a], H[b], H[c]", GetStatus());
   EXPECT_EQ(kAAccountIdString, GetWallpaperUserIdForTest());
   EXPECT_EQ(1.0f, window(0)->layer()->GetTargetOpacity());
   EXPECT_EQ(0.0f, window(1)->layer()->GetTargetOpacity());
@@ -1314,8 +1312,8 @@
 TEST_F(MultiProfileSupportTest, TransientWindowActivationTest) {
   SetUpForThisManyWindows(3);
 
-  const AccountId account_id_A(AccountId::FromUserEmail("A"));
-  const AccountId account_id_B(AccountId::FromUserEmail("B"));
+  const AccountId account_id_A(AccountId::FromUserEmail("a"));
+  const AccountId account_id_B(AccountId::FromUserEmail("b"));
 
   // Create a window hierarchy like this:
   // 0 (A)          - The normal windows
@@ -1463,8 +1461,8 @@
 TEST_F(MultiProfileSupportTest, WindowsOrderPreservedTests) {
   SetUpForThisManyWindows(3);
 
-  const AccountId account_id_A(AccountId::FromUserEmail("A"));
-  const AccountId account_id_B(AccountId::FromUserEmail("B"));
+  const AccountId account_id_A(AccountId::FromUserEmail("a"));
+  const AccountId account_id_B(AccountId::FromUserEmail("b"));
   AddTestUser(account_id_A);
   AddTestUser(account_id_B);
   SwitchActiveUser(account_id_A);
@@ -1475,7 +1473,7 @@
   multi_user_window_manager()->SetWindowOwner(window(0), account_id_A);
   multi_user_window_manager()->SetWindowOwner(window(1), account_id_A);
   multi_user_window_manager()->SetWindowOwner(window(2), account_id_A);
-  EXPECT_EQ("S[A], S[A], S[A]", GetStatus());
+  EXPECT_EQ("S[a], S[a], S[a]", GetStatus());
 
   // Activate the windows one by one.
   activation_client->ActivateWindow(window(2));
@@ -1490,11 +1488,11 @@
   EXPECT_EQ(mru_list[2], window(2));
 
   SwitchActiveUser(account_id_B);
-  EXPECT_EQ("H[A], H[A], H[A]", GetStatus());
+  EXPECT_EQ("H[a], H[a], H[a]", GetStatus());
   EXPECT_EQ(activation_client->GetActiveWindow(), nullptr);
 
   SwitchActiveUser(account_id_A);
-  EXPECT_EQ("S[A], S[A], S[A]", GetStatus());
+  EXPECT_EQ("S[a], S[a], S[a]", GetStatus());
   EXPECT_EQ(activation_client->GetActiveWindow(), window(0));
 
   mru_list =
@@ -1510,8 +1508,8 @@
 TEST_F(MultiProfileSupportTest, FindBrowserWithActiveWindow) {
   SetUpForThisManyWindows(1);
 
-  const AccountId account_id_A(AccountId::FromUserEmail("A"));
-  const AccountId account_id_B(AccountId::FromUserEmail("B"));
+  const AccountId account_id_A(AccountId::FromUserEmail("a"));
+  const AccountId account_id_B(AccountId::FromUserEmail("b"));
   AddTestUser(account_id_A);
   AddTestUser(account_id_B);
   SwitchActiveUser(account_id_A);
@@ -1545,8 +1543,8 @@
 
   // Add two windows, one to each user and set their initial bounds.
   SetUpForThisManyWindows(2);
-  const AccountId user1(AccountId::FromUserEmail("A"));
-  const AccountId user2(AccountId::FromUserEmail("B"));
+  const AccountId user1(AccountId::FromUserEmail("a"));
+  const AccountId user2(AccountId::FromUserEmail("b"));
   AddTestUser(user1);
   AddTestUser(user2);
   SwitchActiveUser(user1);
@@ -1583,8 +1581,8 @@
 TEST_F(MultiProfileSupportTest, AccountIdChangesAfterSwitch) {
   SetUpForThisManyWindows(1);
 
-  const AccountId account1(AccountId::FromUserEmail("A"));
-  const AccountId account2(AccountId::FromUserEmail("B"));
+  const AccountId account1(AccountId::FromUserEmail("a"));
+  const AccountId account2(AccountId::FromUserEmail("b"));
   AddTestUser(account1);
   AddTestUser(account2);
   SwitchActiveUser(account1);
diff --git a/chrome/browser/ui/ash/multi_user/multi_user_context_menu_chromeos_unittest.cc b/chrome/browser/ui/ash/multi_user/multi_user_context_menu_chromeos_unittest.cc
index d0c1b9d..97b2320 100644
--- a/chrome/browser/ui/ash/multi_user/multi_user_context_menu_chromeos_unittest.cc
+++ b/chrome/browser/ui/ash/multi_user/multi_user_context_menu_chromeos_unittest.cc
@@ -70,7 +70,7 @@
   window_->Show();
 
   MultiUserWindowManagerHelper::CreateInstanceForTest(
-      AccountId::FromUserEmail("A"));
+      AccountId::FromUserEmail("a"));
 }
 
 void MultiUserContextMenuChromeOSTest::TearDown() {
@@ -94,7 +94,7 @@
   // Make the window owned and check that there is no menu (since only a single
   // user exists).
   MultiUserWindowManagerHelper::GetWindowManager()->SetWindowOwner(
-      window(), AccountId::FromUserEmail("A"));
+      window(), AccountId::FromUserEmail("a"));
   EXPECT_EQ(nullptr, CreateMultiUserContextMenu(window()).get());
 
   // After adding another user a menu should get created.
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
index fae835f7..df5b034 100644
--- a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
+++ b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
@@ -1400,15 +1400,16 @@
 // Initialize the radio group by setting the appropriate labels for the
 // content type and setting the default value based on the content setting.
 void ContentSettingDownloadsBubbleModel::SetRadioGroup() {
-  const GURL& url = web_contents()->GetURL();
-  base::string16 display_host = url_formatter::FormatUrlForSecurityDisplay(url);
-
   DownloadRequestLimiter* download_request_limiter =
       g_browser_process->download_request_limiter();
+  const GURL& download_origin =
+      download_request_limiter->GetDownloadOrigin(web_contents());
+  base::string16 display_host =
+      url_formatter::FormatUrlForSecurityDisplay(download_origin);
   DCHECK(download_request_limiter);
 
   RadioGroup radio_group;
-  radio_group.url = url;
+  radio_group.url = download_origin;
   switch (download_request_limiter->GetDownloadUiStatus(web_contents())) {
     case DownloadRequestLimiter::DOWNLOAD_UI_ALLOWED:
       radio_group.radio_items = {
@@ -1428,7 +1429,8 @@
       return;
   }
   radio_group.user_managed = GetSettingManagedByUser(
-      url, CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS, GetProfile(), nullptr);
+      download_origin, CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS, GetProfile(),
+      nullptr);
   set_radio_group(radio_group);
 }
 
diff --git a/chrome/browser/ui/content_settings/content_setting_image_model_browsertest.cc b/chrome/browser/ui/content_settings/content_setting_image_model_browsertest.cc
index ad37ca4c..f97bf656 100644
--- a/chrome/browser/ui/content_settings/content_setting_image_model_browsertest.cc
+++ b/chrome/browser/ui/content_settings/content_setting_image_model_browsertest.cc
@@ -33,9 +33,10 @@
   // Automatic downloads are handled by DownloadRequestLimiter.
   DownloadRequestLimiter::TabDownloadState* tab_download_state =
       g_browser_process->download_request_limiter()->GetDownloadState(
-          web_contents, web_contents, true);
+          web_contents, true);
   tab_download_state->set_download_seen();
   tab_download_state->SetDownloadStatusAndNotify(
+      web_contents->GetVisibleURL().GetOrigin(),
       DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED);
 
   // Test that image models tied to a single content setting create bubbles tied
diff --git a/chrome/browser/ui/global_error/global_error_browsertest.cc b/chrome/browser/ui/global_error/global_error_browsertest.cc
index 2eeb0f4..783b0c92 100644
--- a/chrome/browser/ui/global_error/global_error_browsertest.cc
+++ b/chrome/browser/ui/global_error/global_error_browsertest.cc
@@ -21,6 +21,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/recovery/recovery_install_global_error.h"
 #include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/global_error/global_error_observer.h"
 #include "chrome/browser/ui/global_error/global_error_service.h"
 #include "chrome/browser/ui/global_error/global_error_service_factory.h"
 #include "chrome/browser/ui/test/test_browser_dialog.h"
@@ -76,6 +77,34 @@
   return crx_path;
 }
 
+// Helper to wait for a global error to be added. To stop waiting, the global
+// error must have a bubble view.
+class GlobalErrorWaiter : public GlobalErrorObserver {
+ public:
+  explicit GlobalErrorWaiter(Profile* profile)
+      : service_(GlobalErrorServiceFactory::GetForProfile(profile)) {
+    scoped_observer_.Add(service_);
+  }
+
+  ~GlobalErrorWaiter() override = default;
+
+  // GlobalErrorObserver
+  void OnGlobalErrorsChanged() override {
+    if (service_->GetFirstGlobalErrorWithBubbleView())
+      run_loop_.Quit();
+  }
+
+  void Wait() { run_loop_.Run(); }
+
+ private:
+  base::RunLoop run_loop_;
+  GlobalErrorService* service_;
+  ScopedObserver<GlobalErrorService, GlobalErrorObserver> scoped_observer_{
+      this};
+
+  DISALLOW_COPY_AND_ASSIGN(GlobalErrorWaiter);
+};
+
 }  // namespace
 
 class GlobalErrorBubbleTest : public DialogBrowserTest {
@@ -92,12 +121,6 @@
 };
 
 void GlobalErrorBubbleTest::ShowUi(const std::string& name) {
-  content::WindowedNotificationObserver global_errors_updated(
-      chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED,
-      base::Bind([](const content::NotificationSource& source,
-                    const content::NotificationDetails& details) -> bool {
-        return content::Details<GlobalError>(details).ptr()->HasBubbleView();
-      }));
   Profile* profile = browser()->profile();
   extensions::ExtensionService* extension_service =
       extensions::ExtensionSystem::Get(profile)->extension_service();
@@ -111,14 +134,16 @@
   extension_service->AddExtension(test_extension.get());
 
   if (name == "ExtensionDisabledGlobalError") {
+    GlobalErrorWaiter waiter(profile);
     extensions::AddExtensionDisabledError(extension_service,
                                           test_extension.get(), false);
-    global_errors_updated.Wait();
+    waiter.Wait();
     ShowPendingError(browser());
   } else if (name == "ExtensionDisabledGlobalErrorRemote") {
+    GlobalErrorWaiter waiter(profile);
     extensions::AddExtensionDisabledError(extension_service,
                                           test_extension.get(), true);
-    global_errors_updated.Wait();
+    waiter.Wait();
     ShowPendingError(browser());
   } else if (name == "ExtensionGlobalError") {
     extensions::TestBlacklist test_blacklist(
@@ -129,11 +154,10 @@
     test_blacklist.SetBlacklistState(test_extension->id(),
                                      extensions::BLACKLISTED_MALWARE, true);
     // Ensure ExtensionService::ManageBlacklist() runs, which shows the dialog.
-    // (This flow doesn't use NOTIFICATION_GLOBAL_ERRORS_CHANGED.) This is
-    // asynchronous, and using TestBlacklist ensures the tasks run without
-    // delay, but some tasks run on the IO thread, so post a task there to
-    // ensure it was flushed.
-    // The test also needs to invoke OnBlacklistUpdated() directly. Usually this
+    // (This flow doesn't use OnGlobalErrorsChanged.) This is asynchronous, and
+    // using TestBlacklist ensures the tasks run without delay, but some tasks
+    // run on the IO thread, so post a task there to ensure it was flushed. The
+    // test also needs to invoke OnBlacklistUpdated() directly. Usually this
     // happens via a callback from the SafeBrowsing DB, but TestBlacklist
     // replaced the SafeBrowsing DB with a fake one, so the notification source
     // is different.
@@ -158,6 +182,7 @@
     base::FilePath crx_path = PackCRXInTempDir(
         &temp_dir, "update_from_webstore", "update_from_webstore.pem");
 
+    GlobalErrorWaiter waiter(profile);
     auto provider = std::make_unique<extensions::MockExternalProvider>(
         extension_service, extensions::Manifest::EXTERNAL_PREF);
     extensions::MockExternalProvider* provider_ptr = provider.get();
@@ -168,13 +193,13 @@
 
     // ExternalInstallError::OnDialogReady() adds the error and shows the dialog
     // immediately.
-    global_errors_updated.Wait();
+    waiter.Wait();
   } else if (name == "RecoveryInstallGlobalError") {
+    GlobalErrorWaiter waiter(profile);
     g_browser_process->local_state()->SetBoolean(
         prefs::kRecoveryComponentNeedsElevation, true);
-    global_errors_updated.Wait();
+    waiter.Wait();
     ShowPendingError(browser());
-
 #if !defined(OS_CHROMEOS)
   } else if (name == "SigninGlobalError") {
     SigninGlobalErrorFactory::GetForProfile(profile)->ShowBubbleView(browser());
diff --git a/chrome/browser/ui/global_error/global_error_observer.h b/chrome/browser/ui/global_error/global_error_observer.h
new file mode 100644
index 0000000..3c5174c
--- /dev/null
+++ b/chrome/browser/ui/global_error/global_error_observer.h
@@ -0,0 +1,16 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_GLOBAL_ERROR_GLOBAL_ERROR_OBSERVER_H_
+#define CHROME_BROWSER_UI_GLOBAL_ERROR_GLOBAL_ERROR_OBSERVER_H_
+
+#include "base/observer_list_types.h"
+
+class GlobalErrorObserver : public base::CheckedObserver {
+ public:
+  // Called whenever the set of GlobalErrors has changed.
+  virtual void OnGlobalErrorsChanged() = 0;
+};
+
+#endif  // CHROME_BROWSER_UI_GLOBAL_ERROR_GLOBAL_ERROR_OBSERVER_H_
diff --git a/chrome/browser/ui/global_error/global_error_service.cc b/chrome/browser/ui/global_error/global_error_service.cc
index 09061c4..5fc9305 100644
--- a/chrome/browser/ui/global_error/global_error_service.cc
+++ b/chrome/browser/ui/global_error/global_error_service.cc
@@ -8,16 +8,21 @@
 
 #include <algorithm>
 
-#include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/global_error/global_error.h"
 #include "chrome/browser/ui/global_error/global_error_bubble_view_base.h"
-#include "content/public/browser/notification_service.h"
 
-GlobalErrorService::GlobalErrorService(Profile* profile) : profile_(profile) {
+GlobalErrorService::GlobalErrorService() = default;
+
+GlobalErrorService::~GlobalErrorService() = default;
+
+void GlobalErrorService::AddObserver(GlobalErrorObserver* observer) {
+  observer_list_.AddObserver(observer);
 }
 
-GlobalErrorService::~GlobalErrorService() {}
+void GlobalErrorService::RemoveObserver(GlobalErrorObserver* observer) {
+  observer_list_.RemoveObserver(observer);
+}
 
 void GlobalErrorService::AddGlobalError(std::unique_ptr<GlobalError> error) {
   DCHECK(error);
@@ -29,7 +34,7 @@
 void GlobalErrorService::AddUnownedGlobalError(GlobalError* error) {
   DCHECK(error);
   all_errors_.push_back(error);
-  NotifyErrorsChanged(error);
+  NotifyErrorsChanged();
 }
 
 std::unique_ptr<GlobalError> GlobalErrorService::RemoveGlobalError(
@@ -46,7 +51,7 @@
   GlobalErrorBubbleViewBase* bubble = error->GetBubbleView();
   if (bubble)
     bubble->CloseBubbleView();
-  NotifyErrorsChanged(error);
+  NotifyErrorsChanged();
 }
 
 GlobalError* GlobalErrorService::GetGlobalErrorByMenuItemCommandID(
@@ -83,22 +88,7 @@
   return nullptr;
 }
 
-void GlobalErrorService::NotifyErrorsChanged(GlobalError* error) {
-  // GlobalErrorService is bound only to original profile so we need to send
-  // notifications to both it and its off-the-record profile to update
-  // incognito windows as well.
-  std::vector<Profile*> profiles_to_notify;
-  if (profile_) {
-    profiles_to_notify.push_back(profile_);
-    if (profile_->IsOffTheRecord())
-      profiles_to_notify.push_back(profile_->GetOriginalProfile());
-    else if (profile_->HasOffTheRecordProfile())
-      profiles_to_notify.push_back(profile_->GetOffTheRecordProfile());
-    for (size_t i = 0; i < profiles_to_notify.size(); ++i) {
-      content::NotificationService::current()->Notify(
-        chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED,
-        content::Source<Profile>(profiles_to_notify[i]),
-        content::Details<GlobalError>(error));
-    }
-  }
+void GlobalErrorService::NotifyErrorsChanged() {
+  for (auto& observer : observer_list_)
+    observer.OnGlobalErrorsChanged();
 }
diff --git a/chrome/browser/ui/global_error/global_error_service.h b/chrome/browser/ui/global_error/global_error_service.h
index 37f806cdd..b2c7818 100644
--- a/chrome/browser/ui/global_error/global_error_service.h
+++ b/chrome/browser/ui/global_error/global_error_service.h
@@ -10,10 +10,11 @@
 #include <vector>
 
 #include "base/macros.h"
+#include "base/observer_list.h"
+#include "chrome/browser/ui/global_error/global_error_observer.h"
 #include "components/keyed_service/core/keyed_service.h"
 
 class GlobalError;
-class Profile;
 
 // This service manages a list of errors that are meant to be shown globally.
 // If an error applies to an entire profile and not just to a tab then the
@@ -25,11 +26,13 @@
   // Type used to represent the list of currently active errors.
   using GlobalErrorList = std::vector<GlobalError*>;
 
-  // Constructs a GlobalErrorService object for the given profile. The profile
-  // maybe NULL for tests.
-  explicit GlobalErrorService(Profile* profile);
+  // Constructs a GlobalErrorService object.
+  GlobalErrorService();
   ~GlobalErrorService() override;
 
+  void AddObserver(GlobalErrorObserver* observer);
+  void RemoveObserver(GlobalErrorObserver* observer);
+
   // Adds the given error to the list of global errors and displays it on
   // browser windows. If no browser windows are open then the error is
   // displayed once a browser window is opened.
@@ -66,14 +69,14 @@
   const GlobalErrorList& errors() { return all_errors_; }
 
   // Post a notification that a global error has changed and that the error UI
-  // should update it self. Pass NULL for the given error to mean all error UIs
-  // should update.
-  void NotifyErrorsChanged(GlobalError* error);
+  // should update it self.
+  void NotifyErrorsChanged();
 
  private:
+  base::ObserverList<GlobalErrorObserver> observer_list_;
+
   GlobalErrorList all_errors_;
   std::map<GlobalError*, std::unique_ptr<GlobalError>> owned_errors_;
-  Profile* profile_;
 
   DISALLOW_COPY_AND_ASSIGN(GlobalErrorService);
 };
diff --git a/chrome/browser/ui/global_error/global_error_service_factory.cc b/chrome/browser/ui/global_error/global_error_service_factory.cc
index 819d50e5..9e30886 100644
--- a/chrome/browser/ui/global_error/global_error_service_factory.cc
+++ b/chrome/browser/ui/global_error/global_error_service_factory.cc
@@ -22,16 +22,14 @@
 
 GlobalErrorServiceFactory::GlobalErrorServiceFactory()
     : BrowserContextKeyedServiceFactory(
-        "GlobalErrorService",
-        BrowserContextDependencyManager::GetInstance()) {
-}
+          "GlobalErrorService",
+          BrowserContextDependencyManager::GetInstance()) {}
 
-GlobalErrorServiceFactory::~GlobalErrorServiceFactory() {
-}
+GlobalErrorServiceFactory::~GlobalErrorServiceFactory() = default;
 
 KeyedService* GlobalErrorServiceFactory::BuildServiceInstanceFor(
     content::BrowserContext* profile) const {
-  return new GlobalErrorService(static_cast<Profile*>(profile));
+  return new GlobalErrorService();
 }
 
 content::BrowserContext* GlobalErrorServiceFactory::GetBrowserContextToUse(
diff --git a/chrome/browser/ui/global_error/global_error_service_unittest.cc b/chrome/browser/ui/global_error/global_error_service_unittest.cc
index 00eb7f2..e702803e 100644
--- a/chrome/browser/ui/global_error/global_error_service_unittest.cc
+++ b/chrome/browser/ui/global_error/global_error_service_unittest.cc
@@ -73,7 +73,7 @@
 
 // Test adding errors to the global error service.
 TEST(GlobalErrorServiceTest, AddError) {
-  std::unique_ptr<GlobalErrorService> service(new GlobalErrorService(NULL));
+  auto service = std::make_unique<GlobalErrorService>();
   EXPECT_EQ(0u, service->errors().size());
 
   BaseError* error1 = new BaseError;
@@ -95,7 +95,7 @@
 
 // Test removing errors from the global error service.
 TEST(GlobalErrorServiceTest, RemoveError) {
-  std::unique_ptr<GlobalErrorService> service(new GlobalErrorService(NULL));
+  auto service = std::make_unique<GlobalErrorService>();
   BaseError error1;
   service->AddUnownedGlobalError(&error1);
   BaseError error2;
@@ -124,7 +124,7 @@
   MenuError* error2 = new MenuError(2, GlobalError::SEVERITY_MEDIUM);
   MenuError* error3 = new MenuError(3, GlobalError::SEVERITY_HIGH);
 
-  GlobalErrorService service(NULL);
+  GlobalErrorService service;
   service.AddGlobalError(base::WrapUnique(error1));
   service.AddGlobalError(base::WrapUnique(error2));
   service.AddGlobalError(base::WrapUnique(error3));
@@ -140,7 +140,7 @@
   MenuError* error2 = new MenuError(2, GlobalError::SEVERITY_MEDIUM);
   MenuError* error3 = new MenuError(3, GlobalError::SEVERITY_HIGH);
 
-  GlobalErrorService service(NULL);
+  GlobalErrorService service;
   EXPECT_EQ(NULL, service.GetHighestSeverityGlobalErrorWithAppMenuItem());
 
   service.AddGlobalError(base::WrapUnique(error1));
diff --git a/chrome/browser/ui/global_error/global_error_waiter.cc b/chrome/browser/ui/global_error/global_error_waiter.cc
new file mode 100644
index 0000000..74e2eb6
--- /dev/null
+++ b/chrome/browser/ui/global_error/global_error_waiter.cc
@@ -0,0 +1,28 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/global_error/global_error_waiter.h"
+#include "chrome/browser/ui/global_error/global_error_service_factory.h"
+
+namespace test {
+
+GlobalErrorWaiter::GlobalErrorWaiter(Profile* profile) {
+  scoped_observer_.Add(GlobalErrorServiceFactory::GetForProfile(profile));
+}
+
+GlobalErrorWaiter::~GlobalErrorWaiter() = default;
+
+void GlobalErrorWaiter::OnGlobalErrorsChanged() {
+  if (run_loop_.running())
+    run_loop_.Quit();
+  else
+    errors_changed_ = true;
+}
+
+void GlobalErrorWaiter::Wait() {
+  if (!errors_changed_)
+    run_loop_.Run();
+}
+
+}  // namespace test
diff --git a/chrome/browser/ui/global_error/global_error_waiter.h b/chrome/browser/ui/global_error/global_error_waiter.h
new file mode 100644
index 0000000..00ae5f8
--- /dev/null
+++ b/chrome/browser/ui/global_error/global_error_waiter.h
@@ -0,0 +1,43 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_GLOBAL_ERROR_GLOBAL_ERROR_WAITER_H_
+#define CHROME_BROWSER_UI_GLOBAL_ERROR_GLOBAL_ERROR_WAITER_H_
+
+#include "base/macros.h"
+#include "base/run_loop.h"
+#include "base/scoped_observer.h"
+#include "chrome/browser/ui/global_error/global_error_observer.h"
+#include "chrome/browser/ui/global_error/global_error_service.h"
+
+class Profile;
+
+namespace test {
+
+// A helper class to wait for a GlobalError change notification from
+// GlobalErrorService.
+class GlobalErrorWaiter : public GlobalErrorObserver {
+ public:
+  explicit GlobalErrorWaiter(Profile* profile);
+  ~GlobalErrorWaiter() override;
+
+  // GlobalErrorObserver:
+  void OnGlobalErrorsChanged() override;
+
+  // Wait() will return once a notification has been observed. It will return
+  // immediately if one has already been seen.
+  void Wait();
+
+ private:
+  bool errors_changed_ = false;
+  base::RunLoop run_loop_;
+  ScopedObserver<GlobalErrorService, GlobalErrorObserver> scoped_observer_{
+      this};
+
+  DISALLOW_COPY_AND_ASSIGN(GlobalErrorWaiter);
+};
+
+}  // namespace test
+
+#endif  // CHROME_BROWSER_UI_GLOBAL_ERROR_GLOBAL_ERROR_WAITER_H_
diff --git a/chrome/browser/ui/toolbar/app_menu_icon_controller.cc b/chrome/browser/ui/toolbar/app_menu_icon_controller.cc
index a455f0afc..7dd9cd9 100644
--- a/chrome/browser/ui/toolbar/app_menu_icon_controller.cc
+++ b/chrome/browser/ui/toolbar/app_menu_icon_controller.cc
@@ -7,10 +7,8 @@
 #include "base/logging.h"
 #include "build/build_config.h"
 #include "chrome/app/vector_icons/vector_icons.h"
-#include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/defaults.h"
 #include "chrome/browser/themes/theme_properties.h"
-#include "chrome/browser/ui/global_error/global_error_service.h"
 #include "chrome/browser/ui/global_error/global_error_service_factory.h"
 #include "chrome/browser/upgrade_detector/upgrade_detector.h"
 #include "chrome/common/channel_info.h"
@@ -113,8 +111,8 @@
   DCHECK(profile_);
   DCHECK(delegate_);
 
-  registrar_.Add(this, chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED,
-                 content::Source<Profile>(profile_));
+  global_error_observer_.Add(
+      GlobalErrorServiceFactory::GetForProfile(profile_));
 
   upgrade_detector_->AddObserver(this);
 }
@@ -174,11 +172,7 @@
                                         promo_highlight_color));
 }
 
-void AppMenuIconController::Observe(
-    int type,
-    const content::NotificationSource& source,
-    const content::NotificationDetails& details) {
-  DCHECK_EQ(chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED, type);
+void AppMenuIconController::OnGlobalErrorsChanged() {
   UpdateDelegate();
 }
 
diff --git a/chrome/browser/ui/toolbar/app_menu_icon_controller.h b/chrome/browser/ui/toolbar/app_menu_icon_controller.h
index 0f5580c..1af2ff55 100644
--- a/chrome/browser/ui/toolbar/app_menu_icon_controller.h
+++ b/chrome/browser/ui/toolbar/app_menu_icon_controller.h
@@ -9,12 +9,11 @@
 
 #include "base/macros.h"
 #include "base/optional.h"
+#include "base/scoped_observer.h"
 #include "build/build_config.h"
+#include "chrome/browser/ui/global_error/global_error_observer.h"
+#include "chrome/browser/ui/global_error/global_error_service.h"
 #include "chrome/browser/upgrade_detector/upgrade_observer.h"
-#include "content/public/browser/notification_details.h"
-#include "content/public/browser/notification_observer.h"
-#include "content/public/browser/notification_registrar.h"
-#include "content/public/browser/notification_service.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/image/image_skia.h"
 
@@ -28,9 +27,8 @@
 
 // AppMenuIconController encapsulates the logic for badging the app menu icon
 // as a result of various events - such as available updates, errors, etc.
-class AppMenuIconController :
-    public content::NotificationObserver,
-    public UpgradeObserver {
+class AppMenuIconController : public GlobalErrorObserver,
+                              public UpgradeObserver {
  public:
   enum class IconType {
     NONE,
@@ -92,10 +90,8 @@
       base::Optional<SkColor> promo_highlight_color = base::nullopt) const;
 
  private:
-  // content::NotificationObserver:
-  void Observe(int type,
-               const content::NotificationSource& source,
-               const content::NotificationDetails& details) override;
+  // GlobalErrorObserver:
+  void OnGlobalErrorsChanged() override;
 
   // UpgradeObserver:
   void OnUpgradeRecommended() override;
@@ -105,7 +101,8 @@
   UpgradeDetector* const upgrade_detector_;
   Profile* const profile_;
   Delegate* const delegate_;
-  content::NotificationRegistrar registrar_;
+  ScopedObserver<GlobalErrorService, GlobalErrorObserver>
+      global_error_observer_{this};
 
   DISALLOW_COPY_AND_ASSIGN(AppMenuIconController);
 };
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc
index 7738bc4..b3b3a7a 100644
--- a/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc
+++ b/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc
@@ -61,8 +61,11 @@
 }
 
 std::unique_ptr<views::View> SaveCardOfferBubbleViews::CreateExtraView() {
-  if (controller()->GetSyncState() !=
-      AutofillSyncSigninState::kSignedInAndWalletSyncTransportEnabled) {
+  // Only show the (i) info icon for upload saves using implicit sync.
+  // GetLegalMessageLines() being empty denotes a local save.
+  if (controller()->GetLegalMessageLines().empty() ||
+      controller()->GetSyncState() !=
+          AutofillSyncSigninState::kSignedInAndWalletSyncTransportEnabled) {
     return nullptr;
   }
 
diff --git a/chrome/browser/ui/views/bulleted_label_list_view.cc b/chrome/browser/ui/views/bulleted_label_list_view.cc
index f52c1855..373ed7cb 100644
--- a/chrome/browser/ui/views/bulleted_label_list_view.cc
+++ b/chrome/browser/ui/views/bulleted_label_list_view.cc
@@ -76,6 +76,6 @@
   label->SetMultiLine(true);
   label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
 
-  layout->AddView(std::make_unique<BulletView>(label->enabled_color()));
+  layout->AddView(std::make_unique<BulletView>(label->GetEnabledColor()));
   layout->AddView(std::move(label));
 }
diff --git a/chrome/browser/ui/views/confirm_bubble_views.cc b/chrome/browser/ui/views/confirm_bubble_views.cc
index fb5f841..ff7bb499 100644
--- a/chrome/browser/ui/views/confirm_bubble_views.cc
+++ b/chrome/browser/ui/views/confirm_bubble_views.cc
@@ -40,7 +40,7 @@
 
   // Add the message label.
   auto label = std::make_unique<views::Label>(model_->GetMessageText());
-  DCHECK(!label->text().empty());
+  DCHECK(!label->GetText().empty());
   label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
   label->SetMultiLine(true);
   label->SizeToFit(kMaxMessageWidth);
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_source_view.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_source_view.cc
index 7af8468c..d851617 100644
--- a/chrome/browser/ui/views/desktop_capture/desktop_media_source_view.cc
+++ b/chrome/browser/ui/views/desktop_capture/desktop_media_source_view.cc
@@ -201,5 +201,5 @@
 
 void DesktopMediaSourceView::GetAccessibleNodeData(ui::AXNodeData* node_data) {
   node_data->role = ax::mojom::Role::kButton;
-  node_data->SetName(label_->text());
+  node_data->SetName(label_->GetText());
 }
diff --git a/chrome/browser/ui/views/download/download_item_view.cc b/chrome/browser/ui/views/download/download_item_view.cc
index 8849c880..0921798 100644
--- a/chrome/browser/ui/views/download/download_item_view.cc
+++ b/chrome/browser/ui/views/download/download_item_view.cc
@@ -123,8 +123,8 @@
   DISALLOW_COPY_AND_ASSIGN(SeparatorBorder);
 };
 
-base::string16 SpltStringWithNewLineAtPosition(const base::string16& text,
-                                               size_t pos) {
+base::string16 SplitStringWithNewLineAtPosition(const base::string16& text,
+                                                size_t pos) {
   base::string16 new_text = text;
   // This can be a low surrogate codepoint, but u_isUWhiteSpace will
   // return false and inserting a new line after a surrogate pair
@@ -625,7 +625,7 @@
 
 int DownloadItemView::GetYForFilenameText() const {
   int text_height = font_list_.GetBaseline();
-  if (!status_label_->text().empty())
+  if (!status_label_->GetText().empty())
     text_height += kVerticalTextPadding + status_font_list_.GetBaseline();
   return (height() - text_height) / 2;
 }
@@ -997,7 +997,7 @@
   if (size.width() <= 200)
     return size;
 
-  base::string16 label_text = label->text();
+  base::string16 label_text = label->GetText();
   base::TrimWhitespace(label_text, base::TRIM_ALL, &label_text);
   DCHECK_EQ(base::string16::npos, label_text.find('\n'));
 
@@ -1034,7 +1034,7 @@
   // word in the text, |pos| could reach the end of the text.
   if (pos < original_text.length()) {
     searching_backward = true;
-    prev_text = SpltStringWithNewLineAtPosition(original_text, pos);
+    prev_text = SplitStringWithNewLineAtPosition(original_text, pos);
     label->SetText(prev_text);
     min_width_size = label->GetPreferredSize();
   }
@@ -1043,7 +1043,7 @@
   base::string16 current_text;
   if (pos != 0) {
     base::string16 current_text =
-        SpltStringWithNewLineAtPosition(original_text, pos);
+        SplitStringWithNewLineAtPosition(original_text, pos);
     label->SetText(current_text);
     size = label->GetPreferredSize();
 
@@ -1078,7 +1078,7 @@
         break;
       pos = break_points.back();
     }
-    current_text = SpltStringWithNewLineAtPosition(original_text, pos);
+    current_text = SplitStringWithNewLineAtPosition(original_text, pos);
     label->SetText(current_text);
     size = label->GetPreferredSize();
 
@@ -1107,9 +1107,9 @@
 void DownloadItemView::UpdateAccessibleName() {
   base::string16 new_name;
   if (IsShowingWarningDialog()) {
-    new_name = dangerous_download_label_->text();
+    new_name = dangerous_download_label_->GetText();
   } else {
-    new_name = status_label_->text() + base::char16(' ') +
+    new_name = status_label_->GetText() + base::char16(' ') +
                model_->GetFileNameToReportUser().LossyDisplayName();
   }
 
diff --git a/chrome/browser/ui/views/download/download_item_view_unittest.cc b/chrome/browser/ui/views/download/download_item_view_unittest.cc
index 7f0a7953..d114ad2 100644
--- a/chrome/browser/ui/views/download/download_item_view_unittest.cc
+++ b/chrome/browser/ui/views/download/download_item_view_unittest.cc
@@ -18,7 +18,7 @@
   views::Label label(label_text);
   label.SetMultiLine(true);
   DownloadItemView::AdjustTextAndGetSize(&label);
-  EXPECT_EQ(label_text, label.text());
+  EXPECT_EQ(label_text, label.GetText());
 
   // When we have multiple linebreaks that result in the same minimum width, we
   // should place as much text as possible on the first line.
@@ -29,7 +29,7 @@
       "aaaa aaaa aaaa aaaa aaaa aaaa");
   label.SetText(label_text);
   DownloadItemView::AdjustTextAndGetSize(&label);
-  EXPECT_EQ(expected_text, label.text());
+  EXPECT_EQ(expected_text, label.GetText());
 
   // If the label is a single word and extremely long, we should not break it
   // into 2 lines.
@@ -37,7 +37,7 @@
       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
   label.SetText(label_text);
   DownloadItemView::AdjustTextAndGetSize(&label);
-  EXPECT_EQ(label_text, label.text());
+  EXPECT_EQ(label_text, label.GetText());
 
   // Two lines have the same length.
   label_text =
@@ -47,7 +47,7 @@
       "bb aaaa aaaa aaaa aaaa");
   label.SetText(label_text);
   DownloadItemView::AdjustTextAndGetSize(&label);
-  EXPECT_EQ(expected_text, label.text());
+  EXPECT_EQ(expected_text, label.GetText());
 
   // Text begins with a very long word.
   label_text = base::ASCIIToUTF16(
@@ -57,7 +57,7 @@
       "aaaa aaaa");
   label.SetText(label_text);
   DownloadItemView::AdjustTextAndGetSize(&label);
-  EXPECT_EQ(expected_text, label.text());
+  EXPECT_EQ(expected_text, label.GetText());
 
   // Text ends with a very long word.
   label_text = base::ASCIIToUTF16(
@@ -67,5 +67,5 @@
       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
   label.SetText(label_text);
   DownloadItemView::AdjustTextAndGetSize(&label);
-  EXPECT_EQ(expected_text, label.text());
+  EXPECT_EQ(expected_text, label.GetText());
 }
diff --git a/chrome/browser/ui/views/find_bar_view.cc b/chrome/browser/ui/views/find_bar_view.cc
index 68df677d..2accdcc 100644
--- a/chrome/browser/ui/views/find_bar_view.cc
+++ b/chrome/browser/ui/views/find_bar_view.cc
@@ -270,7 +270,7 @@
 }
 
 base::string16 FindBarView::GetMatchCountText() const {
-  return match_count_text_->text();
+  return match_count_text_->GetText();
 }
 
 void FindBarView::UpdateForResult(const FindNotificationDetails& result,
diff --git a/chrome/browser/ui/views/frame/hosted_app_origin_text.cc b/chrome/browser/ui/views/frame/hosted_app_origin_text.cc
index f9f2702..110b55b 100644
--- a/chrome/browser/ui/views/frame/hosted_app_origin_text.cc
+++ b/chrome/browser/ui/views/frame/hosted_app_origin_text.cc
@@ -97,5 +97,5 @@
 
 void HostedAppOriginText::GetAccessibleNodeData(ui::AXNodeData* node_data) {
   node_data->role = ax::mojom::Role::kApplication;
-  node_data->SetName(label_->text());
+  node_data->SetName(label_->GetText());
 }
diff --git a/chrome/browser/ui/views/hover_button.cc b/chrome/browser/ui/views/hover_button.cc
index 62b7c316..4bbe54b3 100644
--- a/chrome/browser/ui/views/hover_button.cc
+++ b/chrome/browser/ui/views/hover_button.cc
@@ -42,7 +42,7 @@
                                  bool set_tooltip) {
   const base::string16 accessible_name =
       second == nullptr ? first->text()
-                        : base::JoinString({first->text(), second->text()},
+                        : base::JoinString({first->text(), second->GetText()},
                                            base::ASCIIToUTF16("\n"));
   if (set_tooltip) {
     const int available_width = available_space.width() - taken_width;
@@ -256,7 +256,7 @@
 }
 
 void HoverButton::SetSubtitleElideBehavior(gfx::ElideBehavior elide_behavior) {
-  if (subtitle_ && !subtitle_->text().empty())
+  if (subtitle_ && !subtitle_->GetText().empty())
     subtitle_->SetElideBehavior(elide_behavior);
 }
 
diff --git a/chrome/browser/ui/views/infobars/alternate_nav_infobar_view.cc b/chrome/browser/ui/views/infobars/alternate_nav_infobar_view.cc
index 559bbc54..cc2b4e2 100644
--- a/chrome/browser/ui/views/infobars/alternate_nav_infobar_view.cc
+++ b/chrome/browser/ui/views/infobars/alternate_nav_infobar_view.cc
@@ -63,7 +63,7 @@
   if (last_label_width < last_label->GetMinimumSize().width()) {
     last_label_width = 0;
     if (!labels->empty())
-      labels->back()->SetText(labels->back()->text() + gfx::kEllipsisUTF16);
+      labels->back()->SetText(labels->back()->GetText() + gfx::kEllipsisUTF16);
   }
   last_label->SetSize(gfx::Size(last_label_width, last_label->height()));
   if (!labels->empty())
diff --git a/chrome/browser/ui/views/infobars/confirm_infobar.cc b/chrome/browser/ui/views/infobars/confirm_infobar.cc
index 1bc597c..40598dfd 100644
--- a/chrome/browser/ui/views/infobars/confirm_infobar.cc
+++ b/chrome/browser/ui/views/infobars/confirm_infobar.cc
@@ -75,7 +75,7 @@
   ChromeLayoutProvider* layout_provider = ChromeLayoutProvider::Get();
 
   label_->SetPosition(gfx::Point(x, OffsetY(label_)));
-  if (!label_->text().empty())
+  if (!label_->GetText().empty())
     x = label_->bounds().right() +
         layout_provider->GetDistanceMetric(
             views::DISTANCE_RELATED_LABEL_HORIZONTAL);
@@ -148,11 +148,11 @@
   const int button_spacing = layout_provider->GetDistanceMetric(
       views::DISTANCE_RELATED_BUTTON_HORIZONTAL);
 
-  int width = (label_->text().empty() || (!ok_button_ && !cancel_button_))
+  int width = (label_->GetText().empty() || (!ok_button_ && !cancel_button_))
                   ? 0
                   : label_spacing;
   if (ok_button_)
     width += ok_button_->width() + (cancel_button_ ? button_spacing : 0);
   width += cancel_button_ ? cancel_button_->width() : 0;
-  return width + ((link_->text().empty() || !width) ? 0 : label_spacing);
+  return width + ((link_->GetText().empty() || !width) ? 0 : label_spacing);
 }
diff --git a/chrome/browser/ui/views/location_bar/content_setting_bubble_dialog_browsertest.cc b/chrome/browser/ui/views/location_bar/content_setting_bubble_dialog_browsertest.cc
index e0d0efc..b730137e 100644
--- a/chrome/browser/ui/views/location_bar/content_setting_bubble_dialog_browsertest.cc
+++ b/chrome/browser/ui/views/location_bar/content_setting_bubble_dialog_browsertest.cc
@@ -76,9 +76,10 @@
       // Automatic downloads are handled by DownloadRequestLimiter.
       DownloadRequestLimiter::TabDownloadState* tab_download_state =
           g_browser_process->download_request_limiter()->GetDownloadState(
-              web_contents, web_contents, true);
+              web_contents, true);
       tab_download_state->set_download_seen();
       tab_download_state->SetDownloadStatusAndNotify(
+          web_contents->GetVisibleURL().GetOrigin(),
           DownloadRequestLimiter::DOWNLOADS_NOT_ALLOWED);
       break;
     }
diff --git a/chrome/browser/ui/views/location_bar/icon_label_bubble_view.cc b/chrome/browser/ui/views/location_bar/icon_label_bubble_view.cc
index 3939df5..9bc1f70c 100644
--- a/chrome/browser/ui/views/location_bar/icon_label_bubble_view.cc
+++ b/chrome/browser/ui/views/location_bar/icon_label_bubble_view.cc
@@ -159,7 +159,7 @@
 bool IconLabelBubbleView::ShouldShowLabel() const {
   if (slide_animation_.is_animating() || is_animation_paused_)
     return !IsShrinking() || (width() > image()->GetPreferredSize().width());
-  return label()->GetVisible() && !label()->text().empty();
+  return label()->GetVisible() && !label()->GetText().empty();
 }
 
 void IconLabelBubbleView::SetLabel(const base::string16& label_text) {
@@ -252,8 +252,8 @@
 
   float separator_width =
       GetWidthBetweenIconAndSeparator() + GetEndPaddingWithSeparator();
-  int separator_x = label()->text().empty() ? image()->bounds().right()
-                                            : label()->bounds().right();
+  int separator_x = label()->GetText().empty() ? image()->bounds().right()
+                                               : label()->bounds().right();
   separator_view_->SetBounds(separator_x, separator_bounds.y(), separator_width,
                              separator_height);
 
diff --git a/chrome/browser/ui/views/location_bar/keyword_hint_view.cc b/chrome/browser/ui/views/location_bar/keyword_hint_view.cc
index 44c174e..0575455b8 100644
--- a/chrome/browser/ui/views/location_bar/keyword_hint_view.cc
+++ b/chrome/browser/ui/views/location_bar/keyword_hint_view.cc
@@ -78,7 +78,7 @@
 void KeywordHintView::SetKeyword(const base::string16& keyword) {
   // When the virtual keyboard is visible, we show a modified touch UI
   // containing only the chip and no surrounding labels.
-  const bool was_touch_ui = leading_label_->text().empty();
+  const bool was_touch_ui = leading_label_->GetText().empty();
   const bool is_touch_ui =
       LocationBarView::IsVirtualKeyboardVisible(GetWidget());
   if (is_touch_ui == was_touch_ui && keyword_ == keyword)
@@ -124,8 +124,8 @@
 
     const base::string16 tab_key_name =
         l10n_util::GetStringUTF16(IDS_OMNIBOX_KEYWORD_HINT_KEY_ACCNAME);
-    SetAccessibleName(leading_label_->text() + tab_key_name +
-                      trailing_label_->text());
+    SetAccessibleName(leading_label_->GetText() + tab_key_name +
+                      trailing_label_->GetText());
   }
 
   // Fire an accessibility event, causing the hint to be spoken.
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc
index 39d6d6e..62afe960 100644
--- a/chrome/browser/ui/views/location_bar/location_bar_view.cc
+++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc
@@ -599,7 +599,7 @@
   // Layout |ime_inline_autocomplete_view_| next to the user input.
   if (ime_inline_autocomplete_view_->GetVisible()) {
     int width =
-        gfx::GetStringWidth(ime_inline_autocomplete_view_->text(),
+        gfx::GetStringWidth(ime_inline_autocomplete_view_->GetText(),
                             ime_inline_autocomplete_view_->font_list()) +
         ime_inline_autocomplete_view_->GetInsets().width();
     // All the target languages (IMEs) are LTR, and we do not need to support
diff --git a/chrome/browser/ui/views/location_bar/location_icon_view.cc b/chrome/browser/ui/views/location_bar/location_icon_view.cc
index 713a40a..61a0c6e 100644
--- a/chrome/browser/ui/views/location_bar/location_icon_view.cc
+++ b/chrome/browser/ui/views/location_bar/location_icon_view.cc
@@ -87,7 +87,7 @@
   // If no display text exists, ensure that the accessibility label is added.
   auto accessibility_label = base::UTF16ToUTF8(
       delegate_->GetLocationBarModel()->GetSecureAccessibilityText());
-  if (label()->text().empty() && !accessibility_label.empty()) {
+  if (label()->GetText().empty() && !accessibility_label.empty()) {
     node_data->AddStringAttribute(ax::mojom::StringAttribute::kDescription,
                                   accessibility_label);
   }
@@ -105,7 +105,7 @@
   int width = 0;
 
   base::string16 text = GetText();
-  if (text == label()->text()) {
+  if (text == label()->GetText()) {
     // Optimize this common case by not creating a new label.
     // GetPreferredSize is not dependent on the label's current
     // width, so this returns the same value as the branch below.
diff --git a/chrome/browser/ui/views/location_bar/selected_keyword_view.cc b/chrome/browser/ui/views/location_bar/selected_keyword_view.cc
index e419f174..110a39d 100644
--- a/chrome/browser/ui/views/location_bar/selected_keyword_view.cc
+++ b/chrome/browser/ui/views/location_bar/selected_keyword_view.cc
@@ -65,7 +65,7 @@
   bool use_full_label =
       width() >
       GetSizeForLabelWidth(partial_label_.GetPreferredSize().width()).width();
-  SetLabel(use_full_label ? full_label_.text() : partial_label_.text());
+  SetLabel(use_full_label ? full_label_.GetText() : partial_label_.GetText());
 
   IconLabelBubbleView::Layout();
 }
diff --git a/chrome/browser/ui/views/location_bar/selected_keyword_view_interactive_uitest.cc b/chrome/browser/ui/views/location_bar/selected_keyword_view_interactive_uitest.cc
index 81cecc4..6647921 100644
--- a/chrome/browser/ui/views/location_bar/selected_keyword_view_interactive_uitest.cc
+++ b/chrome/browser/ui/views/location_bar/selected_keyword_view_interactive_uitest.cc
@@ -53,7 +53,7 @@
 
   // Verify that the label in the omnibox is the extension's shortname.
   EXPECT_EQ(extension->short_name(),
-            base::UTF16ToUTF8(selected_keyword_view->label()->text()));
+            base::UTF16ToUTF8(selected_keyword_view->label()->GetText()));
 }
 
 }  // namespace
diff --git a/chrome/browser/ui/views/location_bar/zoom_bubble_view_browsertest.cc b/chrome/browser/ui/views/location_bar/zoom_bubble_view_browsertest.cc
index 96ca287..1249d61 100644
--- a/chrome/browser/ui/views/location_bar/zoom_bubble_view_browsertest.cc
+++ b/chrome/browser/ui/views/location_bar/zoom_bubble_view_browsertest.cc
@@ -244,7 +244,7 @@
   ASSERT_TRUE(bubble);
 
   const double old_zoom_level = zoom_controller->GetZoomLevel();
-  const base::string16 old_label = bubble->label_->text();
+  const base::string16 old_label = bubble->label_->GetText();
 
   scoped_refptr<const extensions::Extension> extension =
       extensions::ExtensionBuilder("Test").Build();
@@ -254,7 +254,7 @@
   zoom_controller->SetZoomLevelByClient(new_zoom_level, client);
 
   ASSERT_EQ(ZoomBubbleView::GetZoomBubble(), bubble);
-  const base::string16 new_label = bubble->label_->text();
+  const base::string16 new_label = bubble->label_->GetText();
 
   EXPECT_NE(new_label, old_label);
 }
diff --git a/chrome/browser/ui/views/md_text_button_with_down_arrow.cc b/chrome/browser/ui/views/md_text_button_with_down_arrow.cc
index caf94262..bc416efc0 100644
--- a/chrome/browser/ui/views/md_text_button_with_down_arrow.cc
+++ b/chrome/browser/ui/views/md_text_button_with_down_arrow.cc
@@ -43,7 +43,7 @@
 void MdTextButtonWithDownArrow::SetDropArrowImage() {
   gfx::ImageSkia drop_arrow_image = gfx::CreateVectorIcon(
       kMenuDropArrowIcon,
-      color_utils::DeriveDefaultIconColor(label()->enabled_color()));
+      color_utils::DeriveDefaultIconColor(label()->GetEnabledColor()));
   SetImage(Button::STATE_NORMAL, drop_arrow_image);
 }
 
diff --git a/chrome/browser/ui/views/media_router/cast_dialog_sink_button.cc b/chrome/browser/ui/views/media_router/cast_dialog_sink_button.cc
index fc2eef3..a7c92b5 100644
--- a/chrome/browser/ui/views/media_router/cast_dialog_sink_button.cc
+++ b/chrome/browser/ui/views/media_router/cast_dialog_sink_button.cc
@@ -148,7 +148,7 @@
     const base::string16& status_text) {
   if (subtitle()) {
     if (!saved_status_text_)
-      saved_status_text_ = subtitle()->text();
+      saved_status_text_ = subtitle()->GetText();
     subtitle()->SetText(status_text);
   }
 }
diff --git a/chrome/browser/ui/views/media_router/cast_dialog_sink_button_unittest.cc b/chrome/browser/ui/views/media_router/cast_dialog_sink_button_unittest.cc
index f5795eb..8bf296f0d 100644
--- a/chrome/browser/ui/views/media_router/cast_dialog_sink_button_unittest.cc
+++ b/chrome/browser/ui/views/media_router/cast_dialog_sink_button_unittest.cc
@@ -38,16 +38,16 @@
   sink.state = UIMediaSinkState::AVAILABLE;
   CastDialogSinkButton button(nullptr, sink, 0);
   EXPECT_EQ(l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_SINK_AVAILABLE),
-            button.subtitle()->text());
+            button.subtitle()->GetText());
   // Disabling an AVAILABLE sink button should change its label to "Source not
   // supported".
   button.SetEnabled(false);
   EXPECT_EQ(l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_SOURCE_NOT_SUPPORTED),
-            button.subtitle()->text());
+            button.subtitle()->GetText());
   // Re-enabling it should make set the label to "Available" again.
   button.SetEnabled(true);
   EXPECT_EQ(l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_SINK_AVAILABLE),
-            button.subtitle()->text());
+            button.subtitle()->GetText());
 }
 
 TEST_F(CastDialogSinkButtonTest, SetStatusLabelForActiveSink) {
@@ -55,18 +55,18 @@
   sink.state = UIMediaSinkState::CONNECTING;
   CastDialogSinkButton button1(nullptr, sink, 0);
   EXPECT_EQ(l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_SINK_CONNECTING),
-            button1.subtitle()->text());
+            button1.subtitle()->GetText());
 
   sink.state = UIMediaSinkState::CONNECTED;
   sink.status_text = base::UTF8ToUTF16("status text");
   CastDialogSinkButton button2(nullptr, sink, 1);
-  EXPECT_EQ(sink.status_text, button2.subtitle()->text());
+  EXPECT_EQ(sink.status_text, button2.subtitle()->GetText());
 
   // The status label should be "Disconnecting..." even if |status_text| is set.
   sink.state = UIMediaSinkState::DISCONNECTING;
   CastDialogSinkButton button3(nullptr, sink, 2);
   EXPECT_EQ(l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_SINK_DISCONNECTING),
-            button3.subtitle()->text());
+            button3.subtitle()->GetText());
 }
 
 TEST_F(CastDialogSinkButtonTest, SetStatusLabelForSinkWithIssue) {
@@ -77,11 +77,11 @@
   sink.state = UIMediaSinkState::AVAILABLE;
   CastDialogSinkButton button1(nullptr, sink, 0);
   EXPECT_EQ(base::UTF8ToUTF16(sink.issue->info().title),
-            button1.subtitle()->text());
+            button1.subtitle()->GetText());
   sink.state = UIMediaSinkState::CONNECTED;
   CastDialogSinkButton button2(nullptr, sink, 1);
   EXPECT_EQ(base::UTF8ToUTF16(sink.issue->info().title),
-            button2.subtitle()->text());
+            button2.subtitle()->GetText());
 }
 
 TEST_F(CastDialogSinkButtonTest, OverrideStatusText) {
@@ -93,27 +93,27 @@
 
   // Calling RestoreStatusText does nothing when status has not been overridden.
   button.subtitle()->SetText(status0);
-  ASSERT_EQ(button.subtitle()->text(), status0);
+  ASSERT_EQ(button.subtitle()->GetText(), status0);
   button.RestoreStatusText();
-  EXPECT_EQ(button.subtitle()->text(), status0);
+  EXPECT_EQ(button.subtitle()->GetText(), status0);
 
   // OverrideStatusText replaces status text.
   button.OverrideStatusText(status1);
-  EXPECT_EQ(button.subtitle()->text(), status1);
+  EXPECT_EQ(button.subtitle()->GetText(), status1);
 
   // Additional calls to OverrideStatusText change the text.
   button.OverrideStatusText(status2);
-  EXPECT_EQ(button.subtitle()->text(), status2);
+  EXPECT_EQ(button.subtitle()->GetText(), status2);
 
   // RestoreStatusText restores the saved status text.
   button.RestoreStatusText();
-  EXPECT_EQ(button.subtitle()->text(), status0);
+  EXPECT_EQ(button.subtitle()->GetText(), status0);
 
   // Additional calls to RestoreStatusText don't change the text.
   button.subtitle()->SetText(status1);
-  ASSERT_EQ(button.subtitle()->text(), status1);
+  ASSERT_EQ(button.subtitle()->GetText(), status1);
   button.RestoreStatusText();
-  EXPECT_EQ(button.subtitle()->text(), status1);
+  EXPECT_EQ(button.subtitle()->GetText(), status1);
 }
 
 }  // namespace media_router
diff --git a/chrome/browser/ui/views/overlay/skip_ad_label_button.cc b/chrome/browser/ui/views/overlay/skip_ad_label_button.cc
index 36e947e..da780c96 100644
--- a/chrome/browser/ui/views/overlay/skip_ad_label_button.cc
+++ b/chrome/browser/ui/views/overlay/skip_ad_label_button.cc
@@ -36,8 +36,8 @@
 
   // Accessibility.
   SetFocusForPlatform();
-  SetAccessibleName(label()->text());
-  SetTooltipText(label()->text());
+  SetAccessibleName(label()->GetText());
+  SetTooltipText(label()->GetText());
   SetInstallFocusRingOnFocus(true);
 }
 
diff --git a/chrome/browser/ui/views/page_action/page_action_icon_view.cc b/chrome/browser/ui/views/page_action/page_action_icon_view.cc
index 426b1ea..82cef23 100644
--- a/chrome/browser/ui/views/page_action/page_action_icon_view.cc
+++ b/chrome/browser/ui/views/page_action/page_action_icon_view.cc
@@ -72,7 +72,7 @@
 }
 
 SkColor PageActionIconView::GetLabelColorForTesting() const {
-  return label()->enabled_color();
+  return label()->GetEnabledColor();
 }
 
 void PageActionIconView::ExecuteForTesting() {
diff --git a/chrome/browser/ui/views/page_info/chosen_object_view.cc b/chrome/browser/ui/views/page_info/chosen_object_view.cc
index ca2da014..857ade89 100644
--- a/chrome/browser/ui/views/page_info/chosen_object_view.cc
+++ b/chrome/browser/ui/views/page_info/chosen_object_view.cc
@@ -71,7 +71,7 @@
   auto label = std::make_unique<views::Label>(
       PageInfoUI::ChosenObjectToUIString(*info_), CONTEXT_BODY_TEXT_LARGE);
   icon_->SetImage(
-      PageInfoUI::GetChosenObjectIcon(*info_, false, label->enabled_color()));
+      PageInfoUI::GetChosenObjectIcon(*info_, false, label->GetEnabledColor()));
   layout->AddView(std::move(label));
 
   // Create the delete button.
diff --git a/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc b/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc
index 7777b6c6..e79ce0f 100644
--- a/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc
+++ b/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc
@@ -103,7 +103,7 @@
   }
 
   base::string16 GetPermissionLabelTextAt(int index) {
-    return GetPermissionSelectorAt(index)->label_->text();
+    return GetPermissionSelectorAt(index)->label_->GetText();
   }
 
   base::string16 GetPermissionComboboxTextAt(int index) {
@@ -385,7 +385,7 @@
   EXPECT_EQ(4u, children.size());
 
   views::Label* label = static_cast<views::Label*>(children[1]);
-  EXPECT_EQ(base::ASCIIToUTF16("Gizmo"), label->text());
+  EXPECT_EQ(base::ASCIIToUTF16("Gizmo"), label->GetText());
 
   views::Button* button = static_cast<views::Button*>(children[2]);
   const ui::MouseEvent event(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
@@ -436,14 +436,14 @@
 
   views::Label* label = static_cast<views::Label*>(children[1]);
   EXPECT_EQ(base::ASCIIToUTF16("Unknown product 0x162E from Google Inc."),
-            label->text());
+            label->GetText());
 
   views::Button* button = static_cast<views::Button*>(children[2]);
   EXPECT_EQ(button->state(), views::Button::STATE_DISABLED);
 
   views::Label* desc_label = static_cast<views::Label*>(children[3]);
   EXPECT_EQ(base::ASCIIToUTF16("USB device allowed by your administrator"),
-            desc_label->text());
+            desc_label->GetText());
 
   // Policy granted USB permissions should not be able to be deleted.
   const ui::MouseEvent event(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
@@ -497,13 +497,13 @@
     EXPECT_EQ(4u, children.size());
 
     views::Label* label = static_cast<views::Label*>(children[1]);
-    EXPECT_EQ(base::ASCIIToUTF16("Gizmo"), label->text());
+    EXPECT_EQ(base::ASCIIToUTF16("Gizmo"), label->GetText());
 
     views::Button* button = static_cast<views::Button*>(children[2]);
     EXPECT_NE(button->state(), views::Button::STATE_DISABLED);
 
     views::Label* desc_label = static_cast<views::Label*>(children[3]);
-    EXPECT_EQ(base::ASCIIToUTF16("USB device"), desc_label->text());
+    EXPECT_EQ(base::ASCIIToUTF16("USB device"), desc_label->GetText());
 
     views::ButtonListener* button_listener =
         static_cast<views::ButtonListener*>(object_view);
@@ -524,14 +524,14 @@
 
     views::Label* label = static_cast<views::Label*>(children[1]);
     EXPECT_EQ(base::ASCIIToUTF16("Unknown product 0x162E from Google Inc."),
-              label->text());
+              label->GetText());
 
     views::Button* button = static_cast<views::Button*>(children[2]);
     EXPECT_EQ(button->state(), views::Button::STATE_DISABLED);
 
     views::Label* desc_label = static_cast<views::Label*>(children[3]);
     EXPECT_EQ(base::ASCIIToUTF16("USB device allowed by your administrator"),
-              desc_label->text());
+              desc_label->GetText());
 
     views::ButtonListener* button_listener =
         static_cast<views::ButtonListener*>(object_view);
@@ -652,7 +652,7 @@
   api_->CreateView();
   const auto& children = api_->permissions_view()->children();
   views::Label* label = static_cast<views::Label*>(children[1]);
-  EXPECT_EQ(base::ASCIIToUTF16("Flash"), label->text());
+  EXPECT_EQ(base::ASCIIToUTF16("Flash"), label->GetText());
 
   // Change the Flash setting back to the default.
   map->SetContentSettingDefaultScope(url, url, CONTENT_SETTINGS_TYPE_PLUGINS,
@@ -662,7 +662,7 @@
   // Check the Flash permission is still showing since the user changed it
   // previously.
   label = static_cast<views::Label*>(children[1]);
-  EXPECT_EQ(base::ASCIIToUTF16("Flash"), label->text());
+  EXPECT_EQ(base::ASCIIToUTF16("Flash"), label->GetText());
 }
 #endif
 
diff --git a/chrome/browser/ui/views/page_info/permission_selector_row.cc b/chrome/browser/ui/views/page_info/permission_selector_row.cc
index cf67130..1a8c9b1 100644
--- a/chrome/browser/ui/views/page_info/permission_selector_row.cc
+++ b/chrome/browser/ui/views/page_info/permission_selector_row.cc
@@ -173,7 +173,7 @@
       PageInfoUI::PermissionTypeToUIString(permission.type),
       CONTEXT_BODY_TEXT_LARGE);
   icon_->SetImage(
-      PageInfoUI::GetPermissionIcon(permission, label->enabled_color()));
+      PageInfoUI::GetPermissionIcon(permission, label->GetEnabledColor()));
   label_ = layout->AddView(std::move(label));
   // Create the menu model.
   menu_model_.reset(new PermissionMenuModel(
@@ -284,7 +284,7 @@
     const PageInfoUI::PermissionInfo& permission) {
   // Change the permission icon to reflect the selected setting.
   icon_->SetImage(
-      PageInfoUI::GetPermissionIcon(permission, label_->enabled_color()));
+      PageInfoUI::GetPermissionIcon(permission, label_->GetEnabledColor()));
 
   bool use_default = permission.setting == CONTENT_SETTING_DEFAULT;
   auto* combobox = static_cast<internal::PermissionCombobox*>(combobox_);
diff --git a/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc b/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc
index f29b53c..168b055 100644
--- a/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc
+++ b/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc
@@ -577,19 +577,19 @@
   views::View* view = parent_view->GetViewByID(
       static_cast<int>(DialogViewID::PROFILE_LABEL_LINE_1));
   if (view)
-    line_labels.push_back(static_cast<views::Label*>(view)->text());
+    line_labels.push_back(static_cast<views::Label*>(view)->GetText());
   view = parent_view->GetViewByID(
       static_cast<int>(DialogViewID::PROFILE_LABEL_LINE_2));
   if (view)
-    line_labels.push_back(static_cast<views::Label*>(view)->text());
+    line_labels.push_back(static_cast<views::Label*>(view)->GetText());
   view = parent_view->GetViewByID(
       static_cast<int>(DialogViewID::PROFILE_LABEL_LINE_3));
   if (view)
-    line_labels.push_back(static_cast<views::Label*>(view)->text());
+    line_labels.push_back(static_cast<views::Label*>(view)->GetText());
   view = parent_view->GetViewByID(
       static_cast<int>(DialogViewID::PROFILE_LABEL_ERROR));
   if (view)
-    line_labels.push_back(static_cast<views::Label*>(view)->text());
+    line_labels.push_back(static_cast<views::Label*>(view)->GetText());
 
   return line_labels;
 }
@@ -605,11 +605,11 @@
   views::View* view = parent_view->GetViewByID(
       static_cast<int>(DialogViewID::SHIPPING_OPTION_DESCRIPTION));
   DCHECK(view);
-  labels.push_back(static_cast<views::Label*>(view)->text());
+  labels.push_back(static_cast<views::Label*>(view)->GetText());
   view = parent_view->GetViewByID(
       static_cast<int>(DialogViewID::SHIPPING_OPTION_AMOUNT));
   DCHECK(view);
-  labels.push_back(static_cast<views::Label*>(view)->text());
+  labels.push_back(static_cast<views::Label*>(view)->GetText());
   return labels;
 }
 
@@ -792,7 +792,7 @@
     DialogViewID view_id) {
   views::View* view = dialog_view()->GetViewByID(static_cast<int>(view_id));
   DCHECK(view);
-  return static_cast<views::Label*>(view)->text();
+  return static_cast<views::Label*>(view)->GetText();
 }
 
 const base::string16& PaymentRequestBrowserTestBase::GetStyledLabelText(
@@ -807,7 +807,7 @@
   views::View* view = dialog_view()->GetViewByID(
       static_cast<int>(DialogViewID::ERROR_LABEL_OFFSET) + type);
   DCHECK(view);
-  return static_cast<views::Label*>(view)->text();
+  return static_cast<views::Label*>(view)->GetText();
 }
 
 void PaymentRequestBrowserTestBase::SetCanMakePaymentEnabledPref(
diff --git a/chrome/browser/ui/views/payments/payment_request_show_promise_browsertest.cc b/chrome/browser/ui/views/payments/payment_request_show_promise_browsertest.cc
index 9a067a7..de01ad79 100644
--- a/chrome/browser/ui/views/payments/payment_request_show_promise_browsertest.cc
+++ b/chrome/browser/ui/views/payments/payment_request_show_promise_browsertest.cc
@@ -55,9 +55,9 @@
     views::View* view = dialog_view()->GetViewByID(
         static_cast<int>(DialogViewID::ORDER_SUMMARY_LINE_ITEM_1));
     EXPECT_TRUE(!view || !view->GetVisible() ||
-                static_cast<views::Label*>(view)->text().empty())
+                static_cast<views::Label*>(view)->GetText().empty())
         << "Found unexpected display item: "
-        << static_cast<views::Label*>(view)->text();
+        << static_cast<views::Label*>(view)->GetText();
   }
 
   // Verifies that the shipping address section does not display any warning
@@ -68,7 +68,7 @@
     if (!view || !view->GetVisible())
       return;
 
-    EXPECT_EQ(base::string16(), static_cast<views::Label*>(view)->text());
+    EXPECT_EQ(base::string16(), static_cast<views::Label*>(view)->GetText());
   }
 
   // Verifies that the shipping address section has |expected_message| in the
diff --git a/chrome/browser/ui/views/payments/payment_sheet_view_controller.cc b/chrome/browser/ui/views/payments/payment_sheet_view_controller.cc
index f4d6407..69a13d7c 100644
--- a/chrome/browser/ui/views/payments/payment_sheet_view_controller.cc
+++ b/chrome/browser/ui/views/payments/payment_sheet_view_controller.cc
@@ -294,7 +294,7 @@
         std::make_unique<views::Label>(section_name_);
     chevron->SetImage(gfx::CreateVectorIcon(
         views::kSubmenuArrowIcon,
-        color_utils::DeriveDefaultIconColor(label->enabled_color())));
+        color_utils::DeriveDefaultIconColor(label->GetEnabledColor())));
     std::unique_ptr<PaymentRequestRowView> section = CreatePaymentSheetRow(
         listener_, section_name_, accessible_content_, std::move(content_view),
         std::move(extra_content_view), std::move(chevron),
diff --git a/chrome/browser/ui/views/payments/profile_list_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/profile_list_view_controller_browsertest.cc
index 59899a4..0a55ccd 100644
--- a/chrome/browser/ui/views/payments/profile_list_view_controller_browsertest.cc
+++ b/chrome/browser/ui/views/payments/profile_list_view_controller_browsertest.cc
@@ -67,8 +67,8 @@
     constexpr int kId = static_cast<int>(DialogViewID::PROFILE_LABEL_LINE_1);
     return static_cast<views::Label*>(sheet->children()[num]->GetViewByID(kId));
   };
-  EXPECT_EQ(base::ASCIIToUTF16("John H. Doe"), get_label(0)->text());
-  EXPECT_EQ(base::ASCIIToUTF16("Jane A. Smith"), get_label(1)->text());
+  EXPECT_EQ(base::ASCIIToUTF16("John H. Doe"), get_label(0)->GetText());
+  EXPECT_EQ(base::ASCIIToUTF16("Jane A. Smith"), get_label(1)->GetText());
 }
 
 }  // namespace payments
diff --git a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc
index 6236b4c1..855feb37 100644
--- a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc
+++ b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc
@@ -850,7 +850,7 @@
   views::View* error_label = sheet->children().front()->GetViewByID(
       static_cast<int>(DialogViewID::PROFILE_LABEL_ERROR));
   EXPECT_EQ(base::ASCIIToUTF16("Phone number required"),
-            static_cast<views::Label*>(error_label)->text());
+            static_cast<views::Label*>(error_label)->GetText());
 }
 
 // Tests that if the a profile has a country and no state, the editor makes the
@@ -877,7 +877,7 @@
   views::View* error_label = sheet->children().front()->GetViewByID(
       static_cast<int>(DialogViewID::PROFILE_LABEL_ERROR));
   EXPECT_EQ(base::ASCIIToUTF16("Enter a valid address"),
-            static_cast<views::Label*>(error_label)->text());
+            static_cast<views::Label*>(error_label)->GetText());
 
   ResetEventWaiter(DialogEvent::SHIPPING_ADDRESS_EDITOR_OPENED);
   ClickOnChildInListViewAndWait(/*child_index=*/0, /*num_children=*/1,
@@ -952,7 +952,7 @@
   views::View* error_label = sheet->children().front()->GetViewByID(
       static_cast<int>(DialogViewID::PROFILE_LABEL_ERROR));
   EXPECT_EQ(base::ASCIIToUTF16("Enter a valid address"),
-            static_cast<views::Label*>(error_label)->text());
+            static_cast<views::Label*>(error_label)->GetText());
 
   ResetEventWaiter(DialogEvent::SHIPPING_ADDRESS_EDITOR_OPENED);
   ClickOnChildInListViewAndWait(/*child_index=*/0, /*num_children=*/1,
@@ -1002,7 +1002,7 @@
   views::View* error_label = sheet->children().front()->GetViewByID(
       static_cast<int>(DialogViewID::PROFILE_LABEL_ERROR));
   EXPECT_EQ(base::ASCIIToUTF16("Enter a valid address"),
-            static_cast<views::Label*>(error_label)->text());
+            static_cast<views::Label*>(error_label)->GetText());
 
   ResetEventWaiter(DialogEvent::SHIPPING_ADDRESS_EDITOR_OPENED);
   ClickOnChildInListViewAndWait(/*child_index=*/0, /*num_children=*/1,
@@ -1057,7 +1057,7 @@
   views::View* error_label = sheet->children().front()->GetViewByID(
       static_cast<int>(DialogViewID::PROFILE_LABEL_ERROR));
   EXPECT_EQ(base::ASCIIToUTF16("Enter a valid address"),
-            static_cast<views::Label*>(error_label)->text());
+            static_cast<views::Label*>(error_label)->GetText());
 
   ResetEventWaiter(DialogEvent::SHIPPING_ADDRESS_EDITOR_OPENED);
   ClickOnChildInListViewAndWait(/*child_index=*/0, /*num_children=*/1,
@@ -1104,7 +1104,7 @@
   views::View* error_label = sheet->children().front()->GetViewByID(
       static_cast<int>(DialogViewID::PROFILE_LABEL_ERROR));
   EXPECT_EQ(base::ASCIIToUTF16("Enter a valid address"),
-            static_cast<views::Label*>(error_label)->text());
+            static_cast<views::Label*>(error_label)->GetText());
 
   ResetEventWaiter(DialogEvent::SHIPPING_ADDRESS_EDITOR_OPENED);
   ClickOnChildInListViewAndWait(/*child_index=*/0, /*num_children=*/1,
diff --git a/chrome/browser/ui/views/payments/test_chrome_payment_request_delegate.cc b/chrome/browser/ui/views/payments/test_chrome_payment_request_delegate.cc
index 30dc1a8..fd51c4fa 100644
--- a/chrome/browser/ui/views/payments/test_chrome_payment_request_delegate.cc
+++ b/chrome/browser/ui/views/payments/test_chrome_payment_request_delegate.cc
@@ -32,10 +32,6 @@
   return is_incognito_;
 }
 
-bool TestChromePaymentRequestDelegate::IsSslCertificateValid() {
-  return is_valid_ssl_;
-}
-
 autofill::RegionDataLoader*
 TestChromePaymentRequestDelegate::GetRegionDataLoader() {
   if (region_data_loader_)
@@ -51,4 +47,9 @@
   return is_browser_window_active_;
 }
 
+std::string
+TestChromePaymentRequestDelegate::GetInvalidSslCertificateErrorMessage() {
+  return is_valid_ssl_ ? "" : "Invalid SSL certificate";
+}
+
 }  // namespace payments
diff --git a/chrome/browser/ui/views/payments/test_chrome_payment_request_delegate.h b/chrome/browser/ui/views/payments/test_chrome_payment_request_delegate.h
index 1aef796..c663565 100644
--- a/chrome/browser/ui/views/payments/test_chrome_payment_request_delegate.h
+++ b/chrome/browser/ui/views/payments/test_chrome_payment_request_delegate.h
@@ -40,10 +40,10 @@
   // ChromePaymentRequestDelegate.
   void ShowDialog(PaymentRequest* request) override;
   bool IsIncognito() const override;
-  bool IsSslCertificateValid() override;
   autofill::RegionDataLoader* GetRegionDataLoader() override;
   PrefService* GetPrefService() override;
   bool IsBrowserWindowActive() const override;
+  std::string GetInvalidSslCertificateErrorMessage() override;
 
   PaymentRequestDialogView* dialog_view() {
     return static_cast<PaymentRequestDialogView*>(shown_dialog_);
diff --git a/chrome/browser/ui/views/permission_bubble/permission_prompt_impl.cc b/chrome/browser/ui/views/permission_bubble/permission_prompt_impl.cc
index 011f46c2..c2d5b1d 100644
--- a/chrome/browser/ui/views/permission_bubble/permission_prompt_impl.cc
+++ b/chrome/browser/ui/views/permission_bubble/permission_prompt_impl.cc
@@ -169,7 +169,7 @@
   std::unique_ptr<views::Label> title =
       std::make_unique<PermissionsLabel>(GetWindowTitle());
   title->SetHorizontalAlignment(gfx::ALIGN_LEFT);
-  title->set_collapse_when_hidden(true);
+  title->SetCollapseWhenHidden(true);
   title->SetMultiLine(true);
 
   // Elide from head in order to keep the most significant part of the origin
diff --git a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view_browsertest.cc b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view_browsertest.cc
index 7f4aa55..80846989 100644
--- a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view_browsertest.cc
+++ b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view_browsertest.cc
@@ -101,12 +101,12 @@
 
   const base::string16& GetHoverCardTitle(
       const TabHoverCardBubbleView* hover_card) {
-    return hover_card->title_label_->text();
+    return hover_card->title_label_->GetText();
   }
 
   const base::string16& GetHoverCardDomain(
       const TabHoverCardBubbleView* hover_card) {
-    return hover_card->domain_label_->text();
+    return hover_card->domain_label_->GetText();
   }
 
   void MouseExitTabStrip() {
diff --git a/chrome/browser/ui/views/tabs/tab_unittest.cc b/chrome/browser/ui/views/tabs/tab_unittest.cc
index 56fa08da..7897fed 100644
--- a/chrome/browser/ui/views/tabs/tab_unittest.cc
+++ b/chrome/browser/ui/views/tabs/tab_unittest.cc
@@ -824,7 +824,7 @@
     for (TabState state : {TAB_INACTIVE, TAB_ACTIVE}) {
       controller.set_active_tab(state == TAB_ACTIVE);
       tab.UpdateForegroundColors();
-      const SkColor fg_color = tab.title_->enabled_color();
+      const SkColor fg_color = tab.title_->GetEnabledColor();
       const SkColor bg_color = controller.GetTabBackgroundColor(state);
       const float contrast = color_utils::GetContrastRatio(fg_color, bg_color);
       EXPECT_GE(contrast, color_utils::kMinimumReadableContrastRatio);
diff --git a/chrome/browser/ui/views/toolbar/app_menu.cc b/chrome/browser/ui/views/toolbar/app_menu.cc
index bcec2ab..bc0e9601 100644
--- a/chrome/browser/ui/views/toolbar/app_menu.cc
+++ b/chrome/browser/ui/views/toolbar/app_menu.cc
@@ -19,13 +19,13 @@
 #include "build/build_config.h"
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
-#include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search/search.h"
 #include "chrome/browser/ui/bookmarks/bookmark_stats.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
 #include "chrome/browser/ui/browser_window.h"
+#include "chrome/browser/ui/global_error/global_error_service_factory.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/toolbar/app_menu_model.h"
 #include "chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.h"
@@ -40,10 +40,6 @@
 #include "components/zoom/zoom_controller.h"
 #include "components/zoom/zoom_event_manager.h"
 #include "content/public/browser/host_zoom_map.h"
-#include "content/public/browser/notification_observer.h"
-#include "content/public/browser/notification_registrar.h"
-#include "content/public/browser/notification_source.h"
-#include "content/public/browser/notification_types.h"
 #include "content/public/browser/web_contents.h"
 #include "extensions/common/feature_switch.h"
 #include "third_party/skia/include/core/SkCanvas.h"
@@ -165,8 +161,9 @@
     if (type_ == LEADING_BORDER) {
       // We need to flip the canvas for RTL iff the button is not auto-flipping
       // already, so we end up flipping exactly once.
-      gfx::ScopedRTLFlipCanvas scoped_canvas(
-          canvas, view->width(), !view->flip_canvas_on_paint_for_rtl_ui());
+      gfx::ScopedCanvas scoped_canvas(canvas);
+      if (!view->flip_canvas_on_paint_for_rtl_ui())
+        scoped_canvas.FlipIfRTL(view->width());
       ui::NativeTheme::ExtraParams params;
       gfx::Rect separator_bounds =
           gfx::Rect(0, 0, MenuConfig::instance().separator_thickness, h);
@@ -684,7 +681,6 @@
 
   std::unique_ptr<content::HostZoomMap::Subscription>
       browser_zoom_subscription_;
-  content::NotificationRegistrar registrar_;
 
   // Button for incrementing the zoom.
   LabelButton* increment_button_;
@@ -782,8 +778,8 @@
     : browser_(browser),
       run_types_(run_types),
       alert_reopen_tab_items_(alert_reopen_tab_items) {
-  registrar_.Add(this, chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED,
-                 content::Source<Profile>(browser_->profile()));
+  global_error_observer_.Add(
+      GlobalErrorServiceFactory::GetForProfile(browser->profile()));
 }
 
 AppMenu::~AppMenu() {
@@ -1064,11 +1060,7 @@
     root_->Cancel();
 }
 
-void AppMenu::Observe(int type,
-                      const content::NotificationSource& source,
-                      const content::NotificationDetails& details) {
-  DCHECK_EQ(chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED, type);
-
+void AppMenu::OnGlobalErrorsChanged() {
   // A change in the global errors list can add or remove items from the
   // menu. Close the menu to avoid have a stale menu on-screen.
   if (root_)
diff --git a/chrome/browser/ui/views/toolbar/app_menu.h b/chrome/browser/ui/views/toolbar/app_menu.h
index f5e44fe..a90c4c8 100644
--- a/chrome/browser/ui/views/toolbar/app_menu.h
+++ b/chrome/browser/ui/views/toolbar/app_menu.h
@@ -11,11 +11,12 @@
 
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
+#include "base/scoped_observer.h"
 #include "base/time/time.h"
 #include "base/timer/elapsed_timer.h"
+#include "chrome/browser/ui/global_error/global_error_observer.h"
+#include "chrome/browser/ui/global_error/global_error_service.h"
 #include "components/bookmarks/browser/base_bookmark_model_observer.h"
-#include "content/public/browser/notification_observer.h"
-#include "content/public/browser/notification_registrar.h"
 #include "ui/base/models/menu_model.h"
 #include "ui/views/controls/menu/menu_delegate.h"
 
@@ -32,7 +33,7 @@
 // AppMenu adapts the AppMenuModel to view's menu related classes.
 class AppMenu : public views::MenuDelegate,
                 public bookmarks::BaseBookmarkModelObserver,
-                public content::NotificationObserver,
+                public GlobalErrorObserver,
                 public base::SupportsWeakPtr<AppMenu> {
  public:
   AppMenu(Browser* browser, int run_types, bool alert_reopen_tab_items);
@@ -97,10 +98,8 @@
   // bookmarks::BaseBookmarkModelObserver overrides:
   void BookmarkModelChanged() override;
 
-  // content::NotificationObserver overrides:
-  void Observe(int type,
-               const content::NotificationSource& source,
-               const content::NotificationDetails& details) override;
+  // GlobalErrorObserver:
+  void OnGlobalErrorsChanged() override;
 
   ExtensionToolbarMenuView* extension_toolbar_for_testing() {
     return extension_toolbar_;
@@ -182,7 +181,8 @@
   // Used for managing "Recent tabs" menu items.
   std::unique_ptr<RecentTabsMenuModelDelegate> recent_tabs_menu_model_delegate_;
 
-  content::NotificationRegistrar registrar_;
+  ScopedObserver<GlobalErrorService, GlobalErrorObserver>
+      global_error_observer_{this};
 
   // The bit mask of views::MenuRunner::RunTypes.
   const int run_types_;
diff --git a/chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views_unittest.cc b/chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views_unittest.cc
index ae5d30c..6db55858 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views_unittest.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views_unittest.cc
@@ -204,7 +204,7 @@
   EXPECT_FALSE(bubble()->GetDialogClientView()->cancel_button());
   EXPECT_FALSE(bubble()->learn_more_button());
   EXPECT_TRUE(bubble()->item_list());
-  EXPECT_EQ(ItemListString(), bubble()->item_list()->text());
+  EXPECT_EQ(ItemListString(), bubble()->item_list()->GetText());
 
   CloseBubble();
 }
@@ -415,7 +415,7 @@
   ASSERT_TRUE(extra_view);
   EXPECT_EQ("Label", std::string(extra_view->GetClassName()));
   EXPECT_EQ(l10n_util::GetStringUTF16(IDS_EXTENSIONS_INSTALLED_BY_ADMIN),
-            static_cast<views::Label*>(extra_view.get())->text());
+            static_cast<views::Label*>(extra_view.get())->GetText());
   CloseBubble();
 }
 
@@ -442,7 +442,7 @@
     std::string class_name = v->GetClassName();
     if (class_name == "Label") {
       EXPECT_EQ(l10n_util::GetStringUTF16(IDS_EXTENSIONS_INSTALLED_BY_ADMIN),
-                static_cast<const views::Label*>(v)->text());
+                static_cast<const views::Label*>(v)->GetText());
     } else {
       ASSERT_EQ("ImageView", class_name);
       EXPECT_TRUE(gfx::test::AreImagesEqual(
diff --git a/chrome/browser/ui/views/translate/translate_bubble_view.cc b/chrome/browser/ui/views/translate/translate_bubble_view.cc
index 2df3f76c..fe99a680 100644
--- a/chrome/browser/ui/views/translate/translate_bubble_view.cc
+++ b/chrome/browser/ui/views/translate/translate_bubble_view.cc
@@ -80,7 +80,7 @@
 }  // namespace
 
 // static
-TranslateBubbleView* TranslateBubbleView::translate_bubble_view_ = NULL;
+TranslateBubbleView* TranslateBubbleView::translate_bubble_view_ = nullptr;
 
 TranslateBubbleView::~TranslateBubbleView() {
   // A child view could refer to a model which is owned by this class when
@@ -223,39 +223,28 @@
   // Create different view based on user selection in
   // kUseButtonTranslateBubbleUI.
   if (bubble_ui_model_ == language::TranslateUIBubbleModel::BUTTON_GM2) {
-    before_translate_view_ = GM2CreateViewBeforeTranslate();
-    translating_view_ = GM2CreateViewTranslating();
-    after_translate_view_ = GM2CreateViewAfterTranslate();
-    error_view_ = CreateViewError();
-    advanced_view_ = CreateViewAdvanced();
+    before_translate_view_ = AddChildView(GM2CreateViewBeforeTranslate());
+    translating_view_ = AddChildView(GM2CreateViewTranslating());
+    after_translate_view_ = AddChildView(GM2CreateViewAfterTranslate());
+    error_view_ = AddChildView(CreateViewError());
+    advanced_view_ = AddChildView(CreateViewAdvanced());
   } else if (bubble_ui_model_ == language::TranslateUIBubbleModel::TAB) {
     // |tab_translate_view| is the child view being used before/during/after
     // translate in TAB UI.
-    tab_translate_view_ = CreateViewTab();
+    tab_translate_view_ = AddChildView(CreateViewTab());
     before_translate_view_ = tab_translate_view_;
     translating_view_ = tab_translate_view_;
     after_translate_view_ = tab_translate_view_;
-    advanced_view_source_ = TabUiCreateViewAdvanedSource();
-    advanced_view_target_ = TabUiCreateViewAdvanedTarget();
-    error_view_ = CreateViewError();
+    advanced_view_source_ = AddChildView(TabUiCreateViewAdvanedSource());
+    advanced_view_target_ = AddChildView(TabUiCreateViewAdvanedTarget());
+    error_view_ = AddChildView(CreateViewError());
   } else {
-    before_translate_view_ = CreateViewBeforeTranslate();
-    translating_view_ = CreateViewTranslating();
-    after_translate_view_ = CreateViewAfterTranslate();
-    error_view_ = CreateViewError();
-    advanced_view_ = CreateViewAdvanced();
+    before_translate_view_ = AddChildView(CreateViewBeforeTranslate());
+    translating_view_ = AddChildView(CreateViewTranslating());
+    after_translate_view_ = AddChildView(CreateViewAfterTranslate());
+    advanced_view_ = AddChildView(CreateViewAdvanced());
+    error_view_ = AddChildView(CreateViewError());
   }
-  AddChildView(before_translate_view_);
-  AddChildView(translating_view_);
-  AddChildView(after_translate_view_);
-  // TAB UI has two additional advanced view.
-  if (bubble_ui_model_ == language::TranslateUIBubbleModel::TAB) {
-    AddChildView(advanced_view_source_);
-    AddChildView(advanced_view_target_);
-  } else {
-    AddChildView(advanced_view_);
-  }
-  AddChildView(error_view_);
 
   AddAccelerator(ui::Accelerator(ui::VKEY_RETURN, ui::EF_NONE));
 
@@ -379,7 +368,7 @@
   // because we'll be destroyed asynchronously and the shown state will be
   // checked before then.
   DCHECK_EQ(translate_bubble_view_, this);
-  translate_bubble_view_ = NULL;
+  translate_bubble_view_ = nullptr;
 }
 
 bool TranslateBubbleView::AcceleratorPressed(
@@ -596,27 +585,11 @@
     translate::TranslateErrors::Type error_type,
     content::WebContents* web_contents)
     : LocationBarBubbleDelegateView(anchor_view, gfx::Point(), web_contents),
-      before_translate_view_(NULL),
-      translating_view_(NULL),
-      after_translate_view_(NULL),
-      error_view_(NULL),
-      advanced_view_(NULL),
-      tab_translate_view_(NULL),
-      advanced_view_source_(NULL),
-      advanced_view_target_(NULL),
-      source_language_combobox_(NULL),
-      target_language_combobox_(NULL),
-      before_always_translate_checkbox_(NULL),
-      advanced_always_translate_checkbox_(NULL),
-      advanced_cancel_button_(NULL),
-      advanced_done_button_(NULL),
-      before_translate_options_button_(NULL),
       model_(std::move(model)),
       error_type_(error_type),
       is_in_incognito_window_(
           web_contents && web_contents->GetBrowserContext()->IsOffTheRecord()),
-      bubble_ui_model_(language::GetTranslateUiBubbleModel()),
-      should_always_translate_(false) {
+      bubble_ui_model_(language::GetTranslateUiBubbleModel()) {
   DCHECK(anchor_view);
   translate_bubble_view_ = this;
   if (web_contents)  // web_contents can be null in unit_tests.
@@ -688,20 +661,12 @@
       SwitchView(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE);
       SizeToContents();
     } else {
-      // Remove and re-add the child view to update tab title without modifying
-      // existing tabbed_pane class. RemoveChildView doesn't delete the child
-      // view. It only removes child view from the children() vector.
-      // TODO(crbug.com/974811): Update tab title using setter and getter when
-      // it's available.
-      RemoveChildView(before_translate_view_);
-      delete before_translate_view_;
-
-      tab_translate_view_ = CreateViewTab();
-      before_translate_view_ = tab_translate_view_;
-      translating_view_ = tab_translate_view_;
-      after_translate_view_ = tab_translate_view_;
-
-      AddChildView(tab_translate_view_);
+      base::string16 original_language_name;
+      base::string16 target_language_name;
+      DCHECK(tabbed_pane_);
+      UpdateLanguageNames(&original_language_name, &target_language_name);
+      tabbed_pane_->GetTabAt(0)->SetTitleText(original_language_name);
+      tabbed_pane_->GetTabAt(1)->SetTitleText(target_language_name);
       SwitchView(TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE);
       tabbed_pane_->SelectTabAt(1);
     }
@@ -779,7 +744,7 @@
   Layout();
 }
 
-views::View* TranslateBubbleView::CreateViewBeforeTranslate() {
+std::unique_ptr<views::View> TranslateBubbleView::CreateViewBeforeTranslate() {
   base::string16 original_language_name =
       model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex());
   if (original_language_name.empty()) {
@@ -787,7 +752,7 @@
         l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_UNKNOWN_LANGUAGE);
   }
 
-  views::View* view = new views::View();
+  auto view = std::make_unique<views::View>();
   views::GridLayout* layout =
       view->SetLayoutManager(std::make_unique<views::GridLayout>());
 
@@ -814,13 +779,14 @@
 
   if (model_->ShouldShowAlwaysTranslateShortcut()) {
     layout->StartRow(views::GridLayout::kFixedSize, kCheckboxColumnSetId);
-    before_always_translate_checkbox_ = new views::Checkbox(
+    auto before_always_translate_checkbox = std::make_unique<views::Checkbox>(
         l10n_util::GetStringFUTF16(
             IDS_TRANSLATE_BUBBLE_ALWAYS_TRANSLATE_LANG,
             model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex())),
         this);
-    before_always_translate_checkbox_->SetID(BUTTON_ID_ALWAYS_TRANSLATE);
-    layout->AddView(before_always_translate_checkbox_);
+    before_always_translate_checkbox->SetID(BUTTON_ID_ALWAYS_TRANSLATE);
+    before_always_translate_checkbox_ =
+        layout->AddView(std::move(before_always_translate_checkbox));
   }
 
   layout->StartRowWithPadding(
@@ -832,17 +798,20 @@
       this, l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_ACCEPT));
   accept_button->SetID(BUTTON_ID_TRANSLATE);
   accept_button->SetIsDefault(true);
-  before_translate_options_button_ = new views::MdTextButtonWithDownArrow(
-      this,
-      l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_OPTIONS_MENU_BUTTON));
-  before_translate_options_button_->SetID(BUTTON_ID_OPTIONS_MENU);
-  before_translate_options_button_->set_request_focus_on_press(true);
+  auto before_translate_options_button =
+      std::make_unique<views::MdTextButtonWithDownArrow>(
+          this,
+          l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_OPTIONS_MENU_BUTTON));
+  before_translate_options_button->SetID(BUTTON_ID_OPTIONS_MENU);
+  before_translate_options_button->set_request_focus_on_press(true);
 
   if (views::PlatformStyle::kIsOkButtonLeading) {
     layout->AddView(std::move(accept_button));
-    layout->AddView(before_translate_options_button_);
+    before_translate_options_button_ =
+        layout->AddView(std::move(before_translate_options_button));
   } else {
-    layout->AddView(before_translate_options_button_);
+    before_translate_options_button_ =
+        layout->AddView(std::move(before_translate_options_button));
     layout->AddView(std::move(accept_button));
   }
 
@@ -859,20 +828,13 @@
 
 // This view is shown if "Tab" is selected for feature
 // kUseButtonTranslateBubbleUi before/on/after translate.
-views::View* TranslateBubbleView::CreateViewTab() {
-  base::string16 original_language_name =
-      model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex());
-  previous_source_language_index_ = model_->GetOriginalLanguageIndex();
-  base::string16 target_language_name =
-      model_->GetLanguageNameAt(model_->GetTargetLanguageIndex());
-  previous_target_language_index_ = model_->GetTargetLanguageIndex();
-  if (original_language_name.empty()) {
-    original_language_name =
-        l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_UNKNOWN_LANGUAGE);
-  }
+std::unique_ptr<views::View> TranslateBubbleView::CreateViewTab() {
+  base::string16 original_language_name;
+  base::string16 target_language_name;
+  UpdateLanguageNames(&original_language_name, &target_language_name);
 
   ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
-  views::View* view = new views::View();
+  auto view = std::make_unique<views::View>();
   views::GridLayout* layout =
       view->SetLayoutManager(std::make_unique<views::GridLayout>());
 
@@ -961,13 +923,13 @@
   return view;
 }
 
-views::View* TranslateBubbleView::GM2CreateView(
+std::unique_ptr<views::View> TranslateBubbleView::GM2CreateView(
     std::unique_ptr<views::Button> action_button,
     std::unique_ptr<views::View> status_indicator,
     bool active_option_button,
     std::unique_ptr<views::Label> source_language_label,
     std::unique_ptr<views::Label> target_language_label) {
-  views::View* view = new views::View();
+  auto view = std::make_unique<views::View>();
   views::GridLayout* layout =
       view->SetLayoutManager(std::make_unique<views::GridLayout>());
   ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
@@ -1076,7 +1038,8 @@
   return view;
 }
 
-views::View* TranslateBubbleView::GM2CreateViewBeforeTranslate() {
+std::unique_ptr<views::View>
+TranslateBubbleView::GM2CreateViewBeforeTranslate() {
   base::string16 gm2_source_language =
       model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex());
   base::string16 gm2_target_language =
@@ -1112,7 +1075,7 @@
                        std::move(gm2_target_language_label));
 }
 
-views::View* TranslateBubbleView::GM2CreateViewTranslating() {
+std::unique_ptr<views::View> TranslateBubbleView::GM2CreateViewTranslating() {
   base::string16 gm2_source_language =
       model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex());
   base::string16 gm2_target_language =
@@ -1145,11 +1108,11 @@
                        std::move(gm2_target_language_label));
 }
 
-views::View* TranslateBubbleView::CreateViewTranslating() {
+std::unique_ptr<views::View> TranslateBubbleView::CreateViewTranslating() {
   base::string16 target_language_name =
       model_->GetLanguageNameAt(model_->GetTargetLanguageIndex());
 
-  views::View* view = new views::View();
+  auto view = std::make_unique<views::View>();
   views::GridLayout* layout =
       view->SetLayoutManager(std::make_unique<views::GridLayout>());
 
@@ -1184,7 +1147,8 @@
   return view;
 }
 
-views::View* TranslateBubbleView::GM2CreateViewAfterTranslate() {
+std::unique_ptr<views::View>
+TranslateBubbleView::GM2CreateViewAfterTranslate() {
   base::string16 gm2_source_language =
       model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex());
   base::string16 gm2_target_language =
@@ -1220,8 +1184,8 @@
                        std::move(gm2_target_language_label));
 }
 
-views::View* TranslateBubbleView::CreateViewAfterTranslate() {
-  views::View* view = new views::View();
+std::unique_ptr<views::View> TranslateBubbleView::CreateViewAfterTranslate() {
+  auto view = std::make_unique<views::View>();
   views::GridLayout* layout =
       view->SetLayoutManager(std::make_unique<views::GridLayout>());
 
@@ -1251,19 +1215,19 @@
   button->SetID(BUTTON_ID_SHOW_ORIGINAL);
   layout->AddView(std::move(button));
 
-  views::Button* options_menu_button = new views::MdTextButtonWithDownArrow(
+  auto options_menu_button = std::make_unique<views::MdTextButtonWithDownArrow>(
       this,
       l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_OPTIONS_MENU_BUTTON));
   options_menu_button->SetID(BUTTON_ID_OPTIONS_MENU);
   options_menu_button->set_request_focus_on_press(true);
 
-  layout->AddView(options_menu_button);
+  layout->AddView(std::move(options_menu_button));
 
   return view;
 }
 
-views::View* TranslateBubbleView::CreateViewError() {
-  views::View* view = new views::View();
+std::unique_ptr<views::View> TranslateBubbleView::CreateViewError() {
+  auto view = std::make_unique<views::View>();
   views::GridLayout* layout =
       view->SetLayoutManager(std::make_unique<views::GridLayout>());
 
@@ -1304,41 +1268,36 @@
 
 // TODO(hajimehoshi): Revice this later to show a specific message for each
 // error. (crbug/307350)
-views::View* TranslateBubbleView::CreateViewAdvanced() {
-  views::Label* source_language_label = new views::Label(
-      l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_PAGE_LANGUAGE));
-
-  views::Label* target_language_label = new views::Label(
-      l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_TRANSLATION_LANGUAGE));
-
+std::unique_ptr<views::View> TranslateBubbleView::CreateViewAdvanced() {
   // Index + 1 because GetOriginalLanguageIndex() returns the actual index - 1
   // to accommodate added label "Unknown". (crbug/721600)
   int source_default_index = model_->GetOriginalLanguageIndex() + 1;
   source_language_combobox_model_.reset(
       new SourceLanguageComboboxModel(source_default_index, model_.get()));
-  source_language_combobox_ =
-      new views::Combobox(source_language_combobox_model_.get());
+  auto source_language_combobox =
+      std::make_unique<views::Combobox>(source_language_combobox_model_.get());
 
-  source_language_combobox_->SetID(COMBOBOX_ID_SOURCE_LANGUAGE);
-  source_language_combobox_->set_listener(this);
+  source_language_combobox->SetID(COMBOBOX_ID_SOURCE_LANGUAGE);
+  source_language_combobox->set_listener(this);
 
   int target_default_index = model_->GetTargetLanguageIndex();
   target_language_combobox_model_.reset(
       new TargetLanguageComboboxModel(target_default_index, model_.get()));
-  target_language_combobox_ =
-      new views::Combobox(target_language_combobox_model_.get());
+  auto target_language_combobox =
+      std::make_unique<views::Combobox>(target_language_combobox_model_.get());
 
-  target_language_combobox_->SetID(COMBOBOX_ID_TARGET_LANGUAGE);
-  target_language_combobox_->set_listener(this);
+  target_language_combobox->SetID(COMBOBOX_ID_TARGET_LANGUAGE);
+  target_language_combobox->set_listener(this);
 
   // In an incognito window, "Always translate" checkbox shouldn't be shown.
+  std::unique_ptr<views::Checkbox> advanced_always_translate_checkbox;
   if (!is_in_incognito_window_) {
-    advanced_always_translate_checkbox_ = new views::Checkbox(
+    advanced_always_translate_checkbox = std::make_unique<views::Checkbox>(
         l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_ALWAYS), this);
-    advanced_always_translate_checkbox_->SetID(BUTTON_ID_ALWAYS_TRANSLATE);
+    advanced_always_translate_checkbox->SetID(BUTTON_ID_ALWAYS_TRANSLATE);
   }
 
-  views::View* view = new AdvancedViewContainer();
+  auto view = std::make_unique<AdvancedViewContainer>();
   views::GridLayout* layout =
       view->SetLayoutManager(std::make_unique<views::GridLayout>());
 
@@ -1384,22 +1343,27 @@
                 0);
 
   layout->StartRow(views::GridLayout::kFixedSize, COLUMN_SET_ID_LANGUAGES);
-  layout->AddView(source_language_label);
-  layout->AddView(source_language_combobox_);
+  layout->AddView(std::make_unique<views::Label>(
+      l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_PAGE_LANGUAGE)));
+  source_language_combobox_ =
+      layout->AddView(std::move(source_language_combobox));
 
   const int vertical_spacing =
       provider->GetDistanceMetric(views::DISTANCE_RELATED_CONTROL_VERTICAL);
   layout->AddPaddingRow(views::GridLayout::kFixedSize, vertical_spacing);
 
   layout->StartRow(views::GridLayout::kFixedSize, COLUMN_SET_ID_LANGUAGES);
-  layout->AddView(target_language_label);
-  layout->AddView(target_language_combobox_);
+  layout->AddView(std::make_unique<views::Label>(
+      l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_TRANSLATION_LANGUAGE)));
+  target_language_combobox_ =
+      layout->AddView(std::move(target_language_combobox));
 
-  if (!is_in_incognito_window_) {
+  if (advanced_always_translate_checkbox) {
     layout->AddPaddingRow(views::GridLayout::kFixedSize, vertical_spacing);
     layout->StartRow(views::GridLayout::kFixedSize,
                      COLUMN_SET_ID_ALWAYS_CHECKBOX);
-    layout->AddView(advanced_always_translate_checkbox_);
+    advanced_always_translate_checkbox_ =
+        layout->AddView(std::move(advanced_always_translate_checkbox));
   }
 
   layout->AddPaddingRow(views::GridLayout::kFixedSize, vertical_spacing);
@@ -1414,18 +1378,16 @@
   auto advanced_cancel_button = views::MdTextButton::CreateSecondaryUiButton(
       this, l10n_util::GetStringUTF16(IDS_CANCEL));
   advanced_cancel_button->SetID(BUTTON_ID_CANCEL);
-  advanced_done_button_ = advanced_done_button.release();
-  advanced_cancel_button_ = advanced_cancel_button.release();
-
-  layout->AddView(advanced_done_button_);
-  layout->AddView(advanced_cancel_button_);
+  advanced_done_button_ = layout->AddView(std::move(advanced_done_button));
+  advanced_cancel_button_ = layout->AddView(std::move(advanced_cancel_button));
 
   UpdateAdvancedView();
 
   return view;
 }
 
-views::View* TranslateBubbleView::TabUiCreateViewAdvanedSource() {
+std::unique_ptr<views::View>
+TranslateBubbleView::TabUiCreateViewAdvanedSource() {
   // Bubble title
   std::unique_ptr<views::Label> source_language_title_label =
       std::make_unique<views::Label>(
@@ -1441,16 +1403,18 @@
 
   // Ideally all child view elements shall be created using unique_ptr.
   // Using normal pointer for compatibility with existing code.
-  source_language_combobox_ =
-      new views::Combobox(source_language_combobox_model_.get());
+  auto source_language_combobox =
+      std::make_unique<views::Combobox>(source_language_combobox_model_.get());
 
-  source_language_combobox_->SetID(COMBOBOX_ID_SOURCE_LANGUAGE);
-  source_language_combobox_->set_listener(this);
-  return CreateViewAdvancedTabUi(source_language_combobox_,
+  source_language_combobox->SetID(COMBOBOX_ID_SOURCE_LANGUAGE);
+  source_language_combobox->set_listener(this);
+  source_language_combobox_ = source_language_combobox.get();
+  return CreateViewAdvancedTabUi(std::move(source_language_combobox),
                                  std::move(source_language_title_label));
 }
 
-views::View* TranslateBubbleView::TabUiCreateViewAdvanedTarget() {
+std::unique_ptr<views::View>
+TranslateBubbleView::TabUiCreateViewAdvanedTarget() {
   // Bubble title
   std::unique_ptr<views::Label> target_language_title_label =
       std::make_unique<views::Label>(
@@ -1463,17 +1427,18 @@
 
   // Ideally all view components shall be created using unique_ptr.
   // Using normal pointer for compatibility with existing code.
-  target_language_combobox_ =
-      new views::Combobox(target_language_combobox_model_.get());
+  auto target_language_combobox =
+      std::make_unique<views::Combobox>(target_language_combobox_model_.get());
 
-  target_language_combobox_->SetID(COMBOBOX_ID_TARGET_LANGUAGE);
-  target_language_combobox_->set_listener(this);
-  return CreateViewAdvancedTabUi(target_language_combobox_,
+  target_language_combobox->SetID(COMBOBOX_ID_TARGET_LANGUAGE);
+  target_language_combobox->set_listener(this);
+  target_language_combobox_ = target_language_combobox.get();
+  return CreateViewAdvancedTabUi(std::move(target_language_combobox),
                                  std::move(target_language_title_label));
 }
 
-views::View* TranslateBubbleView::CreateViewAdvancedTabUi(
-    views::Combobox* combobox,
+std::unique_ptr<views::View> TranslateBubbleView::CreateViewAdvancedTabUi(
+    std::unique_ptr<views::Combobox> combobox,
     std::unique_ptr<views::Label> language_title_label) {
   const int language_icon_id = IDR_TRANSLATE_BUBBLE_ICON;
   std::unique_ptr<views::ImageView> language_icon =
@@ -1501,7 +1466,7 @@
   close_button->SetFocusForPlatform();
   close_button->SetID(BUTTON_ID_CLOSE);
 
-  views::View* view = new AdvancedViewContainer();
+  auto view = std::make_unique<AdvancedViewContainer>();
   views::GridLayout* layout =
       view->SetLayoutManager(std::make_unique<views::GridLayout>());
 
@@ -1573,7 +1538,7 @@
 
   // TODO(crbug.com/963148): Combobox doesn't take up the whole row as shown
   // in mock.
-  layout->AddView(combobox);
+  layout->AddView(std::move(combobox));
 
   layout->AddPaddingRow(views::GridLayout::kFixedSize, vertical_spacing);
 
@@ -1645,3 +1610,19 @@
                                     ? IDS_DONE
                                     : IDS_TRANSLATE_BUBBLE_ACCEPT));
 }
+
+void TranslateBubbleView::UpdateLanguageNames(
+    base::string16* original_language_name,
+    base::string16* target_language_name) {
+  DCHECK(original_language_name && target_language_name);
+  previous_source_language_index_ = model_->GetOriginalLanguageIndex();
+  *original_language_name =
+      model_->GetLanguageNameAt(previous_source_language_index_);
+  previous_target_language_index_ = model_->GetTargetLanguageIndex();
+  *target_language_name =
+      model_->GetLanguageNameAt(previous_target_language_index_);
+  if (original_language_name->empty()) {
+    *original_language_name =
+        l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_UNKNOWN_LANGUAGE);
+  }
+}
diff --git a/chrome/browser/ui/views/translate/translate_bubble_view.h b/chrome/browser/ui/views/translate/translate_bubble_view.h
index da575a16..a2dabed 100644
--- a/chrome/browser/ui/views/translate/translate_bubble_view.h
+++ b/chrome/browser/ui/views/translate/translate_bubble_view.h
@@ -234,64 +234,58 @@
   // Updates the visibilities of child views according to the current view type.
   void UpdateChildVisibilities();
 
-  // Creates the 'before translate' view for the existing Button UI. Caller
-  // takes ownership of the returned view.
-  views::View* CreateViewBeforeTranslate();
+  // Creates the 'before translate' view.
+  std::unique_ptr<views::View> CreateViewBeforeTranslate();
 
   // Creates the view for TAB UI. This view is being used before/during/after
   // translate.
-  views::View* CreateViewTab();
+  std::unique_ptr<views::View> CreateViewTab();
 
   // AddTab function requires a view element to be shown below each tab.
   // This function creates an empty view so no extra white space below the tab.
   std::unique_ptr<views::View> CreateEmptyPane();
 
-  // Creates the 'translating' view for the existing Button UI. Caller takes
-  // ownership of the returned view.
-  views::View* CreateViewTranslating();
+  // Creates the 'translating' view.
+  std::unique_ptr<views::View> CreateViewTranslating();
 
-  // Creates the 'after translate' view for the existing Button UI. Caller takes
-  // ownership of the returned view.
-  views::View* CreateViewAfterTranslate();
+  // Creates the 'after translate' view.
+  std::unique_ptr<views::View> CreateViewAfterTranslate();
 
   // Creates the 'error' view. Caller takes ownership of the returned view.
   // Three options depending on UI selection in kUseButtonTranslateBubbleUI.
-  views::View* CreateViewError();
+  std::unique_ptr<views::View> CreateViewError();
 
   // Creates the 'advanced' view. Caller takes ownership of the returned view.
   // Three options depending on UI selection in kUseButtonTranslateBubbleUI.
-  views::View* CreateViewAdvanced();
+  std::unique_ptr<views::View> CreateViewAdvanced();
 
-  // Creates source language label and combobox for Tab UI advanced view.
-  views::View* TabUiCreateViewAdvanedSource();
+  // Creates source language label and combobox for Tab Ui advanced view
+  std::unique_ptr<views::View> TabUiCreateViewAdvanedSource();
 
-  // Creates source language label and combobox for Tab UI advanced view.
-  views::View* TabUiCreateViewAdvanedTarget();
+  // Creates source language label and combobox for Tab Ui advanced view
+  std::unique_ptr<views::View> TabUiCreateViewAdvanedTarget();
 
   // Creates the skeleton view for GM2 UI.
-  views::View* GM2CreateView(
+  std::unique_ptr<views::View> GM2CreateView(
       std::unique_ptr<views::Button> action_button,
       std::unique_ptr<views::View> status_indicator,
       bool active_option_button,
       std::unique_ptr<views::Label> source_language_label,
       std::unique_ptr<views::Label> target_language_label);
 
-  // Creates the 'before translate' view for Button_GM2 UI. Caller takes
-  // ownership of the returned view.
-  views::View* GM2CreateViewBeforeTranslate();
+  // Creates the 'before translate' view for Button_GM2 UI.
+  std::unique_ptr<views::View> GM2CreateViewBeforeTranslate();
 
-  // Creates the 'translating' view for Button_GM2 UI. Caller takes ownership
-  // of the returned view.
-  views::View* GM2CreateViewTranslating();
+  // Creates the 'translating' view for Button_GM2 UI.
+  std::unique_ptr<views::View> GM2CreateViewTranslating();
 
-  // Creates the 'after translate' view for Button_GM2 UI. Caller takes
-  // ownership of the returned view.
-  views::View* GM2CreateViewAfterTranslate();
+  // Creates the 'after translate' view for Button_GM2 UI.
+  std::unique_ptr<views::View> GM2CreateViewAfterTranslate();
 
   // Creates the 'advanced' view to show source/target language combobox under
   // TAB UI. Caller takes ownership of the returned view.
-  views::View* CreateViewAdvancedTabUi(
-      views::Combobox* combobox,
+  std::unique_ptr<views::View> CreateViewAdvancedTabUi(
+      std::unique_ptr<views::Combobox> combobox,
       std::unique_ptr<views::Label> language_title_label);
 
   // Get the current always translate checkbox
@@ -317,41 +311,46 @@
   // Handles the reset button in advanced view under Tab UI.
   void ResetLanguage();
 
+  // Retrieve the names of the from/to languages and reset the language
+  // indices.
+  void UpdateLanguageNames(base::string16* original_language_name,
+                           base::string16* target_language_name);
+
   static TranslateBubbleView* translate_bubble_view_;
 
-  views::View* before_translate_view_;
-  views::View* translating_view_;
-  views::View* after_translate_view_;
-  views::View* error_view_;
-  views::View* advanced_view_;
-  views::View* tab_translate_view_;
-  views::View* advanced_view_source_;
-  views::View* advanced_view_target_;
+  views::View* before_translate_view_ = nullptr;
+  views::View* translating_view_ = nullptr;
+  views::View* after_translate_view_ = nullptr;
+  views::View* error_view_ = nullptr;
+  views::View* advanced_view_ = nullptr;
+  views::View* tab_translate_view_ = nullptr;
+  views::View* advanced_view_source_ = nullptr;
+  views::View* advanced_view_target_ = nullptr;
 
   std::unique_ptr<SourceLanguageComboboxModel> source_language_combobox_model_;
   std::unique_ptr<TargetLanguageComboboxModel> target_language_combobox_model_;
 
-  views::Combobox* source_language_combobox_;
-  views::Combobox* target_language_combobox_;
+  views::Combobox* source_language_combobox_ = nullptr;
+  views::Combobox* target_language_combobox_ = nullptr;
 
-  views::Checkbox* before_always_translate_checkbox_;
-  views::Checkbox* advanced_always_translate_checkbox_;
-  views::TabbedPane* tabbed_pane_;
+  views::Checkbox* before_always_translate_checkbox_ = nullptr;
+  views::Checkbox* advanced_always_translate_checkbox_ = nullptr;
+  views::TabbedPane* tabbed_pane_ = nullptr;
 
   // Button_GM2 UI source/target language label class variable to be updated
   // based on user selction in
-  views::Label* gm2_source_language_label_;
-  views::Label* gm2_target_language_label_;
+  views::Label* gm2_source_language_label_ = nullptr;
+  views::Label* gm2_target_language_label_ = nullptr;
 
-  views::LabelButton* advanced_cancel_button_;
-  views::LabelButton* advanced_done_button_;
+  views::LabelButton* advanced_cancel_button_ = nullptr;
+  views::LabelButton* advanced_done_button_ = nullptr;
 
   // Default source/target language without user interaction.
   int previous_source_language_index_;
   int previous_target_language_index_;
 
   // Used to trigger the options menu in tests.
-  views::Button* before_translate_options_button_;
+  views::Button* before_translate_options_button_ = nullptr;
 
   std::unique_ptr<ui::SimpleMenuModel> options_menu_model_;
   std::unique_ptr<views::MenuRunner> options_menu_runner_;
@@ -367,7 +366,7 @@
 
   const language::TranslateUIBubbleModel bubble_ui_model_;
 
-  bool should_always_translate_;
+  bool should_always_translate_ = false;
 
   std::unique_ptr<WebContentMouseHandler> mouse_handler_;
 
diff --git a/chrome/browser/ui/views/webauthn/authenticator_request_sheet_view.cc b/chrome/browser/ui/views/webauthn/authenticator_request_sheet_view.cc
index c031f51de..2720d085 100644
--- a/chrome/browser/ui/views/webauthn/authenticator_request_sheet_view.cc
+++ b/chrome/browser/ui/views/webauthn/authenticator_request_sheet_view.cc
@@ -122,9 +122,10 @@
     auto color_reference = std::make_unique<views::Label>(
         base::string16(), views::style::CONTEXT_DIALOG_TITLE,
         views::style::STYLE_PRIMARY);
-    views::SetImageFromVectorIcon(
-        back_arrow.get(), vector_icons::kBackArrowIcon,
-        color_utils::DeriveDefaultIconColor(color_reference->enabled_color()));
+    views::SetImageFromVectorIcon(back_arrow.get(),
+                                  vector_icons::kBackArrowIcon,
+                                  color_utils::DeriveDefaultIconColor(
+                                      color_reference->GetEnabledColor()));
     back_arrow->SizeToPreferredSize();
     back_arrow->SetX(dialog_insets.left());
     back_arrow->SetY(dialog_insets.top());
diff --git a/chrome/browser/ui/views/webauthn/hover_list_view.cc b/chrome/browser/ui/views/webauthn/hover_list_view.cc
index a086395..ff6ea9e6 100644
--- a/chrome/browser/ui/views/webauthn/hover_list_view.cc
+++ b/chrome/browser/ui/views/webauthn/hover_list_view.cc
@@ -79,7 +79,7 @@
   auto color_reference_label = std::make_unique<views::Label>(
       base::string16(), CONTEXT_BODY_TEXT_SMALL, views::style::STYLE_PRIMARY);
   const SkColor icon_color = color_utils::DeriveDefaultIconColor(
-      color_reference_label->enabled_color());
+      color_reference_label->GetEnabledColor());
 
   auto item_image = std::make_unique<views::ImageView>();
   if (vector_icon) {
diff --git a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
index cd1d375..ef95db9 100644
--- a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
@@ -407,12 +407,25 @@
 }
 
 void CoreOobeHandler::HandleToggleResetScreen() {
-  // Powerwash is generally not available on enterprise devices. First, check
-  // the common case of a correctly enrolled device.
+  // TODO(igorcov): Move this logic in a static method in wizard_controller,
+  // passing as parameter a callback(bool). Here, call the newly created method
+  // and pass as a callback a simple function that will call LaunchResetScreen
+  // if the input bool parameter is true.
+  // Check the common case of a correctly enrolled device.
   if (g_browser_process->platform_part()
           ->browser_policy_connector_chromeos()
           ->IsEnterpriseManaged()) {
-    // Powerwash is only available if allowed by the admin specifically for the
+    // Admin can explicitly allow to powerwash. If the policy is not loaded yet,
+    // we consider by default that the device is not allowed to powerwash.
+    bool is_powerwash_allowed = false;
+    CrosSettings::Get()->GetBoolean(kDevicePowerwashAllowed,
+                                    &is_powerwash_allowed);
+    if (is_powerwash_allowed) {
+      LaunchResetScreen();
+      return;
+    }
+
+    // Check if powerwash is only allowed by the admin specifically for the
     // purpose of installing a TPM firmware update.
     tpm_firmware_update::GetAvailableUpdateModes(
         base::BindOnce([](const std::set<tpm_firmware_update::Mode>& modes) {
@@ -437,9 +450,7 @@
   // and thus pending for enterprise management. These should not be allowed to
   // powerwash either. Note that taking consumer device ownership has the side
   // effect of dropping the FRE requirement if it was previously in effect.
-  const AutoEnrollmentController::FRERequirement requirement =
-      AutoEnrollmentController::GetFRERequirement();
-  if (requirement !=
+  if (AutoEnrollmentController::GetFRERequirement() !=
       AutoEnrollmentController::FRERequirement::kExplicitlyRequired) {
     LaunchResetScreen();
   }
diff --git a/chrome/browser/ui/webui/print_preview/cloud_printer_handler.cc b/chrome/browser/ui/webui/print_preview/cloud_printer_handler.cc
index 3a54ee70..c8d5070a 100644
--- a/chrome/browser/ui/webui/print_preview/cloud_printer_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/cloud_printer_handler.cc
@@ -19,7 +19,7 @@
 void CloudPrinterHandler::Reset() {}
 
 void CloudPrinterHandler::StartGetPrinters(
-    const AddedPrintersCallback& added_printers_callback,
+    AddedPrintersCallback added_printers_callback,
     GetPrintersDoneCallback done_callback) {
   // TODO(https://crbug.com/829414): Actually retrieve the printers
   std::move(done_callback).Run();
diff --git a/chrome/browser/ui/webui/print_preview/cloud_printer_handler.h b/chrome/browser/ui/webui/print_preview/cloud_printer_handler.h
index f6c198f..8d8dbb8c 100644
--- a/chrome/browser/ui/webui/print_preview/cloud_printer_handler.h
+++ b/chrome/browser/ui/webui/print_preview/cloud_printer_handler.h
@@ -22,7 +22,7 @@
 
   // PrinterHandler implementation:
   void Reset() override;
-  void StartGetPrinters(const AddedPrintersCallback& added_printers_callback,
+  void StartGetPrinters(AddedPrintersCallback added_printers_callback,
                         GetPrintersDoneCallback done_callback) override;
   void StartGetCapability(const std::string& destination_id,
                           GetCapabilityCallback calback) override;
diff --git a/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc b/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
index 73119198..e57fe7d 100644
--- a/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
@@ -120,7 +120,7 @@
 }
 
 void ExtensionPrinterHandler::StartGetPrinters(
-    const AddedPrintersCallback& callback,
+    AddedPrintersCallback callback,
     GetPrintersDoneCallback done_callback) {
   // Assume that there can only be one printer enumeration occuring at once.
   DCHECK_EQ(pending_enumeration_count_, 0);
@@ -142,13 +142,13 @@
     UsbDeviceManager* usb_manager = UsbDeviceManager::Get(profile_);
     DCHECK(usb_manager);
     usb_manager->GetDevices(
-        base::Bind(&ExtensionPrinterHandler::OnUsbDevicesEnumerated,
-                   weak_ptr_factory_.GetWeakPtr(), callback));
+        base::BindOnce(&ExtensionPrinterHandler::OnUsbDevicesEnumerated,
+                       weak_ptr_factory_.GetWeakPtr(), callback));
   }
 
   GetPrinterProviderAPI(profile_)->DispatchGetPrintersRequested(
       base::BindRepeating(&ExtensionPrinterHandler::WrapGetPrintersCallback,
-                          weak_ptr_factory_.GetWeakPtr(), callback));
+                          weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
 
 void ExtensionPrinterHandler::StartGetCapability(
@@ -280,7 +280,7 @@
 }
 
 void ExtensionPrinterHandler::WrapGetPrintersCallback(
-    const AddedPrintersCallback& callback,
+    AddedPrintersCallback callback,
     const base::ListValue& printers,
     bool done) {
   DCHECK_GT(pending_enumeration_count_, 0);
@@ -317,7 +317,7 @@
 }
 
 void ExtensionPrinterHandler::OnUsbDevicesEnumerated(
-    const AddedPrintersCallback& callback,
+    AddedPrintersCallback callback,
     std::vector<device::mojom::UsbDeviceInfoPtr> devices) {
   ExtensionRegistry* registry = ExtensionRegistry::Get(profile_);
   DevicePermissionsManager* permissions_manager =
diff --git a/chrome/browser/ui/webui/print_preview/extension_printer_handler.h b/chrome/browser/ui/webui/print_preview/extension_printer_handler.h
index 2dacc08..6fb8c001 100644
--- a/chrome/browser/ui/webui/print_preview/extension_printer_handler.h
+++ b/chrome/browser/ui/webui/print_preview/extension_printer_handler.h
@@ -48,7 +48,7 @@
 
   // PrinterHandler implementation:
   void Reset() override;
-  void StartGetPrinters(const AddedPrintersCallback& added_printers_callback,
+  void StartGetPrinters(AddedPrintersCallback added_printers_callback,
                         GetPrintersDoneCallback done_callback) override;
   void StartGetCapability(const std::string& destination_id,
                           GetCapabilityCallback callback) override;
@@ -83,7 +83,7 @@
   // Methods used as wrappers to callbacks for extensions::PrinterProviderAPI
   // methods, primarily so the callbacks can be bound to this class' weak ptr.
   // They just propagate results to callbacks passed to them.
-  void WrapGetPrintersCallback(const AddedPrintersCallback& callback,
+  void WrapGetPrintersCallback(AddedPrintersCallback callback,
                                const base::ListValue& printers,
                                bool done);
   void WrapGetCapabilityCallback(GetCapabilityCallback callback,
@@ -93,7 +93,7 @@
                                   const base::DictionaryValue& printer_info);
 
   void OnUsbDevicesEnumerated(
-      const AddedPrintersCallback& callback,
+      AddedPrintersCallback callback,
       std::vector<device::mojom::UsbDeviceInfoPtr> devices);
 
   Profile* const profile_;
diff --git a/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc b/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc
index 7d19304d..13276fa 100644
--- a/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc
+++ b/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc
@@ -538,8 +538,8 @@
   bool is_done = false;
 
   extension_printer_handler_->StartGetPrinters(
-      base::Bind(&RecordPrinterList, &call_count, &printers),
-      base::Bind(&RecordPrintersDone, &is_done));
+      base::BindRepeating(&RecordPrinterList, &call_count, &printers),
+      base::BindOnce(&RecordPrintersDone, &is_done));
 
   EXPECT_FALSE(printers.get());
   FakePrinterProviderAPI* fake_api = GetPrinterProviderAPI();
@@ -566,8 +566,8 @@
   bool is_done = false;
 
   extension_printer_handler_->StartGetPrinters(
-      base::Bind(&RecordPrinterList, &call_count, &printers),
-      base::Bind(&RecordPrintersDone, &is_done));
+      base::BindRepeating(&RecordPrinterList, &call_count, &printers),
+      base::BindOnce(&RecordPrintersDone, &is_done));
 
   EXPECT_FALSE(printers.get());
   FakePrinterProviderAPI* fake_api = GetPrinterProviderAPI();
@@ -608,8 +608,8 @@
   std::unique_ptr<base::ListValue> printers;
   bool is_done = false;
   extension_printer_handler_->StartGetPrinters(
-      base::Bind(&RecordPrinterList, &call_count, &printers),
-      base::Bind(&RecordPrintersDone, &is_done));
+      base::BindRepeating(&RecordPrinterList, &call_count, &printers),
+      base::BindOnce(&RecordPrintersDone, &is_done));
 
   base::RunLoop().RunUntilIdle();
 
@@ -656,7 +656,7 @@
   std::unique_ptr<base::DictionaryValue> capability;
 
   extension_printer_handler_->StartGetCapability(
-      kPrinterId, base::Bind(&RecordCapability, &call_count, &capability));
+      kPrinterId, base::BindOnce(&RecordCapability, &call_count, &capability));
 
   EXPECT_EQ(0u, call_count);
 
@@ -683,7 +683,7 @@
   std::unique_ptr<base::DictionaryValue> capability;
 
   extension_printer_handler_->StartGetCapability(
-      kPrinterId, base::Bind(&RecordCapability, &call_count, &capability));
+      kPrinterId, base::BindOnce(&RecordCapability, &call_count, &capability));
 
   EXPECT_EQ(0u, call_count);
 
@@ -715,7 +715,7 @@
 
   extension_printer_handler_->StartPrint(
       title, *base::JSONReader::Read(kPdfSettings), print_data,
-      base::Bind(&RecordPrintResult, &call_count, &success, &status));
+      base::BindOnce(&RecordPrintResult, &call_count, &success, &status));
 
   EXPECT_EQ(0u, call_count);
   FakePrinterProviderAPI* fake_api = GetPrinterProviderAPI();
@@ -751,7 +751,7 @@
 
   extension_printer_handler_->StartPrint(
       title, *base::JSONReader::Read(kPdfSettings), print_data,
-      base::Bind(&RecordPrintResult, &call_count, &success, &status));
+      base::BindOnce(&RecordPrintResult, &call_count, &success, &status));
 
   EXPECT_EQ(0u, call_count);
   FakePrinterProviderAPI* fake_api = GetPrinterProviderAPI();
@@ -776,7 +776,7 @@
 
   extension_printer_handler_->StartPrint(
       title, *base::JSONReader::Read(kAllTypesSettings), print_data,
-      base::Bind(&RecordPrintResult, &call_count, &success, &status));
+      base::BindOnce(&RecordPrintResult, &call_count, &success, &status));
 
   EXPECT_EQ(0u, call_count);
 
@@ -813,7 +813,7 @@
 
   extension_printer_handler_->StartPrint(
       title, *base::JSONReader::Read(kSimpleRasterSettings), print_data,
-      base::Bind(&RecordPrintResult, &call_count, &success, &status));
+      base::BindOnce(&RecordPrintResult, &call_count, &success, &status));
 
   EXPECT_EQ(0u, call_count);
 
@@ -866,7 +866,7 @@
 
   extension_printer_handler_->StartPrint(
       title, *base::JSONReader::Read(kDuplexSettings), print_data,
-      base::Bind(&RecordPrintResult, &call_count, &success, &status));
+      base::BindOnce(&RecordPrintResult, &call_count, &success, &status));
 
   EXPECT_EQ(0u, call_count);
 
@@ -919,7 +919,7 @@
 
   extension_printer_handler_->StartPrint(
       title, *base::JSONReader::Read(kSimpleRasterSettings), print_data,
-      base::Bind(&RecordPrintResult, &call_count, &success, &status));
+      base::BindOnce(&RecordPrintResult, &call_count, &success, &status));
 
   EXPECT_EQ(0u, call_count);
 
@@ -947,7 +947,7 @@
 
   extension_printer_handler_->StartPrint(
       title, *base::JSONReader::Read(kInvalidSettings), print_data,
-      base::Bind(&RecordPrintResult, &call_count, &success, &status));
+      base::BindOnce(&RecordPrintResult, &call_count, &success, &status));
 
   EXPECT_EQ(1u, call_count);
 
@@ -968,7 +968,7 @@
 
   extension_printer_handler_->StartPrint(
       title, *base::JSONReader::Read(kSimpleRasterSettings), print_data,
-      base::Bind(&RecordPrintResult, &call_count, &success, &status));
+      base::BindOnce(&RecordPrintResult, &call_count, &success, &status));
 
   EXPECT_EQ(1u, call_count);
 
@@ -987,7 +987,8 @@
   std::string printer_id = base::StringPrintf(
       "provisional-usb:fake extension id:%s", device->guid.c_str());
   extension_printer_handler_->StartGrantPrinterAccess(
-      printer_id, base::Bind(&RecordPrinterInfo, &call_count, &printer_info));
+      printer_id,
+      base::BindOnce(&RecordPrinterInfo, &call_count, &printer_info));
 
   EXPECT_FALSE(printer_info.get());
   FakePrinterProviderAPI* fake_api = GetPrinterProviderAPI();
@@ -1019,7 +1020,7 @@
   extension_printer_handler_->StartGrantPrinterAccess(
       base::StringPrintf("provisional-usb:fake extension id:%s",
                          device->guid.c_str()),
-      base::Bind(&RecordPrinterInfo, &call_count, &printer_info));
+      base::BindOnce(&RecordPrinterInfo, &call_count, &printer_info));
 
   EXPECT_FALSE(printer_info.get());
   FakePrinterProviderAPI* fake_api = GetPrinterProviderAPI();
diff --git a/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc b/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc
index 65229b67..5832a33 100644
--- a/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc
+++ b/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc
@@ -152,7 +152,7 @@
 }
 
 void LocalPrinterHandlerChromeos::StartGetPrinters(
-    const AddedPrintersCallback& added_printers_callback,
+    AddedPrintersCallback added_printers_callback,
     GetPrintersDoneCallback done_callback) {
   // SyncedPrintersManager is not thread safe and must be called from the UI
   // thread.
@@ -172,7 +172,7 @@
   AddPrintersToList(printers_manager_->GetPrinters(PrinterClass::kAutomatic),
                     &printer_list);
 
-  ConvertPrinterListForCallback(added_printers_callback,
+  ConvertPrinterListForCallback(std::move(added_printers_callback),
                                 std::move(done_callback), printer_list);
 }
 
diff --git a/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.h b/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.h
index 5a124f8..7136f4e0 100644
--- a/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.h
+++ b/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.h
@@ -42,7 +42,7 @@
   // PrinterHandler implementation
   void Reset() override;
   void GetDefaultPrinter(DefaultPrinterCallback cb) override;
-  void StartGetPrinters(const AddedPrintersCallback& added_printers_callback,
+  void StartGetPrinters(AddedPrintersCallback added_printers_callback,
                         GetPrintersDoneCallback done_callback) override;
   void StartGetCapability(const std::string& printer_name,
                           GetCapabilityCallback cb) override;
diff --git a/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc b/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc
index 03bd08a..0074a2f8 100644
--- a/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc
+++ b/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc
@@ -112,14 +112,14 @@
 }
 
 void LocalPrinterHandlerDefault::StartGetPrinters(
-    const AddedPrintersCallback& callback,
+    AddedPrintersCallback callback,
     GetPrintersDoneCallback done_callback) {
   VLOG(1) << "Enumerate printers start";
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   base::PostTaskAndReplyWithResult(
       task_runner_.get(), FROM_HERE, base::BindOnce(&EnumeratePrintersAsync),
-      base::BindOnce(&ConvertPrinterListForCallback, callback,
+      base::BindOnce(&ConvertPrinterListForCallback, std::move(callback),
                      std::move(done_callback)));
 }
 
diff --git a/chrome/browser/ui/webui/print_preview/local_printer_handler_default.h b/chrome/browser/ui/webui/print_preview/local_printer_handler_default.h
index 2565924..1f6d48aa 100644
--- a/chrome/browser/ui/webui/print_preview/local_printer_handler_default.h
+++ b/chrome/browser/ui/webui/print_preview/local_printer_handler_default.h
@@ -34,7 +34,7 @@
   // PrinterHandler implementation.
   void Reset() override;
   void GetDefaultPrinter(DefaultPrinterCallback cb) override;
-  void StartGetPrinters(const AddedPrintersCallback& added_printers_callback,
+  void StartGetPrinters(AddedPrintersCallback added_printers_callback,
                         GetPrintersDoneCallback done_callback) override;
   void StartGetCapability(const std::string& destination_id,
                           GetCapabilityCallback callback) override;
diff --git a/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc b/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc
index f922611..11dbe4f 100644
--- a/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc
@@ -115,13 +115,13 @@
 // Callback that stores a PDF file on disk.
 void PrintToPdfCallback(scoped_refptr<base::RefCountedMemory> data,
                         const base::FilePath& path,
-                        const base::Closure& pdf_file_saved_closure) {
+                        base::OnceClosure pdf_file_saved_closure) {
   base::File file(path,
                   base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
   file.WriteAtCurrentPos(reinterpret_cast<const char*>(data->front()),
                          base::checked_cast<int>(data->size()));
   if (!pdf_file_saved_closure.is_null())
-    pdf_file_saved_closure.Run();
+    std::move(pdf_file_saved_closure).Run();
 }
 
 base::FilePath SelectSaveDirectory(const base::FilePath& path,
@@ -153,7 +153,7 @@
 }
 
 void PdfPrinterHandler::StartGetPrinters(
-    const AddedPrintersCallback& added_printers_callback,
+    AddedPrintersCallback added_printers_callback,
     GetPrintersDoneCallback done_callback) {
   NOTREACHED();
 }
@@ -226,8 +226,8 @@
 }
 
 void PdfPrinterHandler::SetPdfSavedClosureForTesting(
-    const base::Closure& closure) {
-  pdf_file_saved_closure_ = closure;
+    base::OnceClosure closure) {
+  pdf_file_saved_closure_ = std::move(closure);
 }
 
 // static
@@ -315,9 +315,9 @@
   if (!prompt_user) {
     base::PostTaskWithTraitsAndReplyWithResult(
         FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
-        base::Bind(&base::GetUniquePath, path.Append(default_filename)),
-        base::Bind(&PdfPrinterHandler::OnGotUniqueFileName,
-                   weak_ptr_factory_.GetWeakPtr()));
+        base::BindOnce(&base::GetUniquePath, path.Append(default_filename)),
+        base::BindOnce(&PdfPrinterHandler::OnGotUniqueFileName,
+                       weak_ptr_factory_.GetWeakPtr()));
     return;
   }
 
@@ -342,7 +342,7 @@
   base::PostTaskWithTraits(
       FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
       base::BindOnce(&PrintToPdfCallback, print_data_, print_to_pdf_path_,
-                     pdf_file_saved_closure_));
+                     std::move(pdf_file_saved_closure_)));
   print_to_pdf_path_.clear();
   std::move(print_callback_).Run(base::Value());
 }
diff --git a/chrome/browser/ui/webui/print_preview/pdf_printer_handler.h b/chrome/browser/ui/webui/print_preview/pdf_printer_handler.h
index eae9098..7e70b276 100644
--- a/chrome/browser/ui/webui/print_preview/pdf_printer_handler.h
+++ b/chrome/browser/ui/webui/print_preview/pdf_printer_handler.h
@@ -44,7 +44,7 @@
   // PrinterHandler implementation
   void Reset() override;
   // Required by PrinterHandler implementation but should never be called.
-  void StartGetPrinters(const AddedPrintersCallback& added_printers_callback,
+  void StartGetPrinters(AddedPrintersCallback added_printers_callback,
                         GetPrintersDoneCallback done_callback) override;
   void StartGetCapability(const std::string& destination_id,
                           GetCapabilityCallback callback) override;
@@ -60,7 +60,7 @@
   void FileSelectionCanceled(void* params) override;
 
   // Sets |pdf_file_saved_closure_| to |closure|.
-  void SetPdfSavedClosureForTesting(const base::Closure& closure);
+  void SetPdfSavedClosureForTesting(base::OnceClosure closure);
 
   // Exposed for testing.
   static base::FilePath GetFileNameForPrintJobTitle(
@@ -99,7 +99,7 @@
 
   // Notifies tests that want to know if the PDF has been saved. This doesn't
   // notify the test if it was a successful save, only that it was attempted.
-  base::Closure pdf_file_saved_closure_;
+  base::OnceClosure pdf_file_saved_closure_;
 
   // The data to print
   scoped_refptr<base::RefCountedMemory> print_data_;
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
index 46b7e8d..585aec24 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -648,10 +648,10 @@
   // starts.
   handler->Reset();
   handler->StartGetPrinters(
-      base::Bind(&PrintPreviewHandler::OnAddedPrinters,
-                 weak_factory_.GetWeakPtr(), printer_type),
-      base::Bind(&PrintPreviewHandler::OnGetPrintersDone,
-                 weak_factory_.GetWeakPtr(), callback_id));
+      base::BindRepeating(&PrintPreviewHandler::OnAddedPrinters,
+                          weak_factory_.GetWeakPtr(), printer_type),
+      base::BindOnce(&PrintPreviewHandler::OnGetPrintersDone,
+                     weak_factory_.GetWeakPtr(), callback_id));
 }
 
 void PrintPreviewHandler::HandleGrantExtensionPrinterAccess(
@@ -665,8 +665,8 @@
   GetPrinterHandler(PrinterType::kExtensionPrinter)
       ->StartGrantPrinterAccess(
           printer_id,
-          base::Bind(&PrintPreviewHandler::OnGotExtensionPrinterInfo,
-                     weak_factory_.GetWeakPtr(), callback_id));
+          base::BindOnce(&PrintPreviewHandler::OnGotExtensionPrinterInfo,
+                         weak_factory_.GetWeakPtr(), callback_id));
 }
 
 void PrintPreviewHandler::HandleGetPrinterCapabilities(
@@ -969,8 +969,9 @@
   AllowJavascript();
 
   GetPrinterHandler(PrinterType::kLocalPrinter)
-      ->GetDefaultPrinter(base::Bind(&PrintPreviewHandler::SendInitialSettings,
-                                     weak_factory_.GetWeakPtr(), callback_id));
+      ->GetDefaultPrinter(
+          base::BindOnce(&PrintPreviewHandler::SendInitialSettings,
+                         weak_factory_.GetWeakPtr(), callback_id));
 }
 
 void PrintPreviewHandler::GetUserAccountList(base::Value* settings) {
@@ -1392,8 +1393,8 @@
 }
 
 void PrintPreviewHandler::SetPdfSavedClosureForTesting(
-    const base::Closure& closure) {
-  GetPdfPrinterHandler()->SetPdfSavedClosureForTesting(closure);
+    base::OnceClosure closure) {
+  GetPdfPrinterHandler()->SetPdfSavedClosureForTesting(std::move(closure));
 }
 
 void PrintPreviewHandler::SendEnableManipulateSettingsForTest() {
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.h b/chrome/browser/ui/webui/print_preview/print_preview_handler.h
index 540db6f5..a3d35fd 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler.h
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.h
@@ -114,7 +114,7 @@
                               void* params);
 
   // Sets |pdf_file_saved_closure_| to |closure|.
-  void SetPdfSavedClosureForTesting(const base::Closure& closure);
+  void SetPdfSavedClosureForTesting(base::OnceClosure closure);
 
   // Fires the 'enable-manipulate-settings-for-test' WebUI event.
   void SendEnableManipulateSettingsForTest();
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
index 64af66f..446db2e1 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
@@ -128,7 +128,7 @@
     std::move(cb).Run(default_printer_);
   }
 
-  void StartGetPrinters(const AddedPrintersCallback& added_printers_callback,
+  void StartGetPrinters(AddedPrintersCallback added_printers_callback,
                         GetPrintersDoneCallback done_callback) override {
     if (!printers_.empty())
       added_printers_callback.Run(printers_);
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
index d79c41a..5eaad87 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
@@ -785,9 +785,8 @@
   handler_->FileSelectedForTesting(path, 0, nullptr);
 }
 
-void PrintPreviewUI::SetPdfSavedClosureForTesting(
-    const base::Closure& closure) {
-  handler_->SetPdfSavedClosureForTesting(closure);
+void PrintPreviewUI::SetPdfSavedClosureForTesting(base::OnceClosure closure) {
+  handler_->SetPdfSavedClosureForTesting(std::move(closure));
 }
 
 void PrintPreviewUI::SendEnableManipulateSettingsForTest() {
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_ui.h b/chrome/browser/ui/webui/print_preview/print_preview_ui.h
index 2958b36..2aca55e 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_ui.h
+++ b/chrome/browser/ui/webui/print_preview/print_preview_ui.h
@@ -202,7 +202,7 @@
   void SetSelectedFileForTesting(const base::FilePath& path);
 
   // Passes |closure| to PrintPreviewHandler::SetPdfSavedClosureForTesting().
-  void SetPdfSavedClosureForTesting(const base::Closure& closure);
+  void SetPdfSavedClosureForTesting(base::OnceClosure closure);
 
   // Tell the handler to send the enable-manipulate-settings-for-test WebUI
   // event.
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_utils.cc b/chrome/browser/ui/webui/print_preview/print_preview_utils.cc
index 71f576dd..e9d21dc1 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_utils.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_utils.cc
@@ -165,7 +165,7 @@
 }
 
 void ConvertPrinterListForCallback(
-    const PrinterHandler::AddedPrintersCallback& callback,
+    PrinterHandler::AddedPrintersCallback callback,
     PrinterHandler::GetPrintersDoneCallback done_callback,
     const PrinterList& printer_list) {
   base::ListValue printers;
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_utils.h b/chrome/browser/ui/webui/print_preview/print_preview_utils.h
index b7c00de..d678ae7 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_utils.h
+++ b/chrome/browser/ui/webui/print_preview/print_preview_utils.h
@@ -30,7 +30,7 @@
 // Converts |printer_list| to a base::ListValue form, runs |callback| with the
 // converted list as the argument if it is not empty, and runs |done_callback|.
 void ConvertPrinterListForCallback(
-    const PrinterHandler::AddedPrintersCallback& callback,
+    PrinterHandler::AddedPrintersCallback callback,
     PrinterHandler::GetPrintersDoneCallback done_callback,
     const PrinterList& printer_list);
 
diff --git a/chrome/browser/ui/webui/print_preview/printer_handler.h b/chrome/browser/ui/webui/print_preview/printer_handler.h
index 4d6a476..2ccef52c 100644
--- a/chrome/browser/ui/webui/print_preview/printer_handler.h
+++ b/chrome/browser/ui/webui/print_preview/printer_handler.h
@@ -88,9 +88,8 @@
   // are found. May be called multiple times, or never if there are no printers
   // to add.
   // |done_callback| must be called exactly once when the search is complete.
-  virtual void StartGetPrinters(
-      const AddedPrintersCallback& added_printers_callback,
-      GetPrintersDoneCallback done_callback) = 0;
+  virtual void StartGetPrinters(AddedPrintersCallback added_printers_callback,
+                                GetPrintersDoneCallback done_callback) = 0;
 
   // Starts getting printing capability of the printer with the provided
   // destination ID.
diff --git a/chrome/browser/ui/webui/print_preview/privet_printer_handler.cc b/chrome/browser/ui/webui/print_preview/privet_printer_handler.cc
index cdf3179..3f072e1 100644
--- a/chrome/browser/ui/webui/print_preview/privet_printer_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/privet_printer_handler.cc
@@ -54,7 +54,7 @@
 }
 
 void PrivetPrinterHandler::StartGetPrinters(
-    const AddedPrintersCallback& added_printers_callback,
+    AddedPrintersCallback added_printers_callback,
     GetPrintersDoneCallback done_callback) {
   using local_discovery::ServiceDiscoverySharedClient;
   scoped_refptr<ServiceDiscoverySharedClient> service_discovery =
@@ -71,8 +71,8 @@
   DCHECK(!capabilities_callback_);
   capabilities_callback_ = std::move(callback);
   CreateHTTP(destination_id,
-             base::Bind(&PrivetPrinterHandler::CapabilitiesUpdateClient,
-                        weak_ptr_factory_.GetWeakPtr()));
+             base::BindOnce(&PrivetPrinterHandler::CapabilitiesUpdateClient,
+                            weak_ptr_factory_.GetWeakPtr()));
 }
 
 void PrivetPrinterHandler::StartPrint(
@@ -163,8 +163,8 @@
 
   privet_capabilities_operation_ =
       privet_http_client_->CreateCapabilitiesOperation(
-          base::Bind(&PrivetPrinterHandler::OnGotCapabilities,
-                     weak_ptr_factory_.GetWeakPtr()));
+          base::BindOnce(&PrivetPrinterHandler::OnGotCapabilities,
+                         weak_ptr_factory_.GetWeakPtr()));
   privet_capabilities_operation_->Start();
 }
 
diff --git a/chrome/browser/ui/webui/print_preview/privet_printer_handler.h b/chrome/browser/ui/webui/print_preview/privet_printer_handler.h
index 5c5f6bb..7b77b61 100644
--- a/chrome/browser/ui/webui/print_preview/privet_printer_handler.h
+++ b/chrome/browser/ui/webui/print_preview/privet_printer_handler.h
@@ -40,7 +40,7 @@
 
   // PrinterHandler implementation:
   void Reset() override;
-  void StartGetPrinters(const AddedPrintersCallback& added_printers_callback,
+  void StartGetPrinters(AddedPrintersCallback added_printers_callback,
                         GetPrintersDoneCallback done_callback) override;
   void StartGetCapability(const std::string& destination_id,
                           GetCapabilityCallback calback) override;
diff --git a/chrome/browser/ui/webui/settings/chromeos/date_time_handler.cc b/chrome/browser/ui/webui/settings/chromeos/date_time_handler.cc
index c3a3202..a5db2fe 100644
--- a/chrome/browser/ui/webui/settings/chromeos/date_time_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/date_time_handler.cc
@@ -4,10 +4,14 @@
 
 #include "chrome/browser/ui/webui/settings/chromeos/date_time_handler.h"
 
+#include "ash/public/cpp/login_screen.h"
+#include "ash/public/cpp/login_types.h"
 #include "base/bind.h"
 #include "base/command_line.h"
+#include "base/logging.h"
 #include "base/values.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service.h"
 #include "chrome/browser/chromeos/set_time_dialog.h"
 #include "chrome/browser/chromeos/system/timezone_resolver_manager.h"
 #include "chrome/browser/chromeos/system/timezone_util.h"
@@ -17,6 +21,7 @@
 #include "chromeos/settings/timezone_settings.h"
 #include "components/policy/proto/chrome_device_policy.pb.h"
 #include "components/prefs/pref_service.h"
+#include "components/user_manager/user_manager.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui.h"
 #include "content/public/browser/web_ui_data_source.h"
@@ -87,6 +92,10 @@
       "showSetDateTimeUI",
       base::BindRepeating(&DateTimeHandler::HandleShowSetDateTimeUI,
                           base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(
+      "handleShowParentAccessForTimeZone",
+      base::BindRepeating(&DateTimeHandler::HandleShowParentAccessForTimeZone,
+                          base::Unretained(this)));
 }
 
 void DateTimeHandler::OnJavascriptAllowed() {
@@ -141,6 +150,29 @@
       web_ui()->GetWebContents()->GetTopLevelNativeWindow());
 }
 
+void DateTimeHandler::HandleShowParentAccessForTimeZone(
+    const base::ListValue* args) {
+  DCHECK(user_manager::UserManager::Get()->GetActiveUser()->IsChild());
+
+  if (!parent_access::ParentAccessService::IsApprovalRequired(
+          parent_access::ParentAccessService::SupervisedAction::
+              kUpdateTimezone)) {
+    OnParentAccessValidation(true);
+    return;
+  }
+
+  ash::LoginScreen::Get()->ShowParentAccessWidget(
+      user_manager::UserManager::Get()->GetActiveUser()->GetAccountId(),
+      base::BindRepeating(&DateTimeHandler::OnParentAccessValidation,
+                          weak_ptr_factory_.GetWeakPtr()),
+      ash::ParentAccessRequestReason::kChangeTime);
+}
+
+void DateTimeHandler::OnParentAccessValidation(bool success) {
+  if (success)
+    FireWebUIListener("access-code-validation-complete");
+}
+
 void DateTimeHandler::NotifyTimezoneAutomaticDetectionPolicy() {
   bool managed = !IsTimezoneAutomaticDetectionUserEditable();
   bool force_enabled = managed &&
diff --git a/chrome/browser/ui/webui/settings/chromeos/date_time_handler.h b/chrome/browser/ui/webui/settings/chromeos/date_time_handler.h
index c4f2a32..bd69d93 100644
--- a/chrome/browser/ui/webui/settings/chromeos/date_time_handler.h
+++ b/chrome/browser/ui/webui/settings/chromeos/date_time_handler.h
@@ -55,6 +55,14 @@
   // Called to show the Set Time UI.
   void HandleShowSetDateTimeUI(const base::ListValue* args);
 
+  // Handles clicks on the timezone row on the settings page. This should only
+  // be called when the current user is a child.
+  void HandleShowParentAccessForTimeZone(const base::ListValue* args);
+
+  // Called when the parent access code was validated with result equals
+  // |success|.
+  void OnParentAccessValidation(bool success);
+
   // Updates the UI, enabling or disabling the time zone automatic detection
   // setting according to policy.
   void NotifyTimezoneAutomaticDetectionPolicy();
diff --git a/chrome/browser/ui/webui/settings/people_handler_unittest.cc b/chrome/browser/ui/webui/settings/people_handler_unittest.cc
index 7090d96..a8a61ae6 100644
--- a/chrome/browser/ui/webui/settings/people_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/people_handler_unittest.cc
@@ -66,7 +66,7 @@
   return arg == value;
 }
 
-const char kTestUser[] = "chrome.p13n.test@gmail.com";
+const char kTestUser[] = "chrome_p13n_test@gmail.com";
 const char kTestCallbackId[] = "test-callback-id";
 
 // Returns a UserSelectableTypeSet with all types set.
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
index 98cdd7b5..cc86b18 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -2963,7 +2963,29 @@
 
 void AddSecurityKeysStrings(content::WebUIDataSource* html_source) {
   static constexpr LocalizedString kSecurityKeysStrings[] = {
+      {"securityKeysPINTooShort",
+       IDS_SETTINGS_SECURITY_KEYS_PIN_ERROR_TOO_SHORT},
       {"securityKeysConfirmPIN", IDS_SETTINGS_SECURITY_KEYS_CONFIRM_PIN},
+      {"securityKeysCredentialWebsite",
+       IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_WEBSITE},
+      {"securityKeysNoCredentialManagement",
+       IDS_SETTINGS_SECURITY_KEYS_NO_CREDENTIAL_MANAGEMENT},
+      {"securityKeysCredentialManagementRemoved",
+       IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_REMOVED},
+      {"securityKeysCredentialManagementDesc",
+       IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_DESC},
+      {"securityKeysCredentialManagementDialogTitle",
+       IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_DIALOG_TITLE},
+      {"securityKeysCredentialManagementLabel",
+       IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_LABEL},
+      {"securityKeysCredentialManagementNoCredentials",
+       IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_NO_CREDENTIALS},
+      {"securityKeysCredentialManagementPinPrompt",
+       IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_PIN_PROMPT},
+      {"securityKeysCredentialManagementTouch",
+       IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_TOUCH},
+      {"securityKeysCredentialUsername",
+       IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_USERNAME},
       {"securityKeysCurrentPIN", IDS_SETTINGS_SECURITY_KEYS_CURRENT_PIN},
       {"securityKeysCurrentPINIntro",
        IDS_SETTINGS_SECURITY_KEYS_CURRENT_PIN_INTRO},
@@ -2999,6 +3021,8 @@
       {"securityKeysResetStep2", IDS_SETTINGS_SECURITY_KEYS_RESET_STEP2},
       {"securityKeysResetSuccess", IDS_SETTINGS_SECURITY_KEYS_RESET_SUCCESS},
       {"securityKeysResetTitle", IDS_SETTINGS_SECURITY_KEYS_RESET_TITLE},
+      {"securityKeysSavedCredentials",
+       IDS_SETTINGS_SECURITY_KEYS_SAVED_CREDENTIALS_TITLE},
       {"securityKeysSetPIN", IDS_SETTINGS_SECURITY_KEYS_SET_PIN},
       {"securityKeysSetPINChangeTitle",
        IDS_SETTINGS_SECURITY_KEYS_SET_PIN_CHANGE_TITLE},
@@ -3022,6 +3046,15 @@
               !device::WinWebAuthnApi::GetDefault()->IsAvailable())
 #endif
   );
+  html_source->AddBoolean(
+      "enableSecurityKeysCredentialManagement",
+      base::FeatureList::IsEnabled(device::kWebAuthPINSupport) &&
+          base::FeatureList::IsEnabled(device::kWebAuthCredentialManagement)
+#if defined(OS_WIN)
+          && (!base::FeatureList::IsEnabled(device::kWebAuthUseNativeWinApi) ||
+              !device::WinWebAuthnApi::GetDefault()->IsAvailable())
+#endif
+  );
 }
 
 }  // namespace
diff --git a/chrome/browser/ui/webui/settings/settings_security_key_handler.cc b/chrome/browser/ui/webui/settings/settings_security_key_handler.cc
index eb03b1d..afa2094 100644
--- a/chrome/browser/ui/webui/settings/settings_security_key_handler.cc
+++ b/chrome/browser/ui/webui/settings/settings_security_key_handler.cc
@@ -2,30 +2,31 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "chrome/browser/ui/webui/settings/settings_security_key_handler.h"
+
 #include <utility>
 
 #include "base/callback.h"
 #include "base/optional.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/values.h"
-#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
-#include "chrome/browser/ui/webui/settings/settings_security_key_handler.h"
+#include "chrome/grit/generated_resources.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/system_connector.h"
 #include "content/public/browser/web_ui.h"
+#include "content/public/common/service_manager_connection.h"
+#include "device/fido/credential_management.h"
+#include "device/fido/credential_management_handler.h"
+#include "device/fido/fido_discovery_factory.h"
 #include "device/fido/pin.h"
 #include "device/fido/reset_request_handler.h"
 #include "device/fido/set_pin_request_handler.h"
+#include "ui/base/l10n/l10n_util.h"
 
 using content::BrowserThread;
 
 namespace {
 
-constexpr char kStartSetPIN[] = "securityKeyStartSetPIN";
-constexpr char kSetPIN[] = "securityKeySetPIN";
-constexpr char kClose[] = "securityKeyClose";
-constexpr char kReset[] = "securityKeyReset";
-constexpr char kCompleteReset[] = "securityKeyCompleteReset";
-
 base::flat_set<device::FidoTransportProtocol> supported_transports() {
   // If we ever support BLE devices then additional thought will be required
   // in the UI; therefore don't enable them here. NFC is not supported on
@@ -45,21 +46,36 @@
 
 void SecurityKeysHandler::RegisterMessages() {
   web_ui()->RegisterMessageCallback(
-      kStartSetPIN, base::BindRepeating(&SecurityKeysHandler::HandleStartSetPIN,
-                                        base::Unretained(this)));
+      "securityKeyStartSetPIN",
+      base::BindRepeating(&SecurityKeysHandler::HandleStartSetPIN,
+                          base::Unretained(this)));
   web_ui()->RegisterMessageCallback(
-      kSetPIN, base::BindRepeating(&SecurityKeysHandler::HandleSetPIN,
-                                   base::Unretained(this)));
+      "securityKeySetPIN",
+      base::BindRepeating(&SecurityKeysHandler::HandleSetPIN,
+                          base::Unretained(this)));
   web_ui()->RegisterMessageCallback(
-      kClose, base::BindRepeating(&SecurityKeysHandler::HandleClose,
-                                  base::Unretained(this)));
+      "securityKeyClose", base::BindRepeating(&SecurityKeysHandler::HandleClose,
+                                              base::Unretained(this)));
   web_ui()->RegisterMessageCallback(
-      kReset, base::BindRepeating(&SecurityKeysHandler::HandleReset,
-                                  base::Unretained(this)));
+      "securityKeyReset", base::BindRepeating(&SecurityKeysHandler::HandleReset,
+                                              base::Unretained(this)));
   web_ui()->RegisterMessageCallback(
-      kCompleteReset,
+      "securityKeyCompleteReset",
       base::BindRepeating(&SecurityKeysHandler::HandleCompleteReset,
                           base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(
+      "securityKeyCredentialManagement",
+      base::BindRepeating(&SecurityKeysHandler::HandleCredentialManagement,
+                          base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(
+      "securityKeyCredentialManagementPIN",
+      base::BindRepeating(&SecurityKeysHandler::HandleCredentialManagementPIN,
+                          base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(
+      "securityKeyCredentialManagementEnumerate",
+      base::BindRepeating(
+          &SecurityKeysHandler::HandleCredentialManagementEnumerate,
+          base::Unretained(this)));
 }
 
 void SecurityKeysHandler::OnJavascriptAllowed() {}
@@ -79,7 +95,11 @@
   state_ = State::kNone;
   set_pin_.reset();
   reset_.reset();
+  discovery_factory_.reset();
+  credential_management_.reset();
   callback_id_.clear();
+  credential_management_provide_pin_cb_.Reset();
+  DCHECK(!credential_management_provide_pin_cb_);
 }
 
 void SecurityKeysHandler::HandleStartSetPIN(const base::ListValue* args) {
@@ -241,6 +261,174 @@
   }
 }
 
+void SecurityKeysHandler::HandleCredentialManagement(
+    const base::ListValue* args) {
+  DCHECK_EQ(State::kNone, state_);
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK_EQ(1u, args->GetSize());
+  DCHECK(!credential_management_);
+  DCHECK(!discovery_factory_);
+
+  AllowJavascript();
+  DCHECK(callback_id_.empty());
+  callback_id_ = args->GetList()[0].GetString();
+
+  state_ = State::kCredentialManagementStart;
+  discovery_factory_ = std::make_unique<device::FidoDiscoveryFactory>();
+  credential_management_ =
+      std::make_unique<device::CredentialManagementHandler>(
+          content::ServiceManagerConnection::GetForProcess()->GetConnector(),
+          discovery_factory_.get(), supported_transports(),
+          base::BindOnce(&SecurityKeysHandler::OnCredentialManagementReady,
+                         weak_factory_->GetWeakPtr()),
+          base::BindRepeating(
+              &SecurityKeysHandler::OnCredentialManagementGatherPIN,
+              weak_factory_->GetWeakPtr()),
+          base::BindOnce(&SecurityKeysHandler::OnCredentialManagementFinished,
+                         weak_factory_->GetWeakPtr()));
+}
+
+void SecurityKeysHandler::HandleCredentialManagementPIN(
+    const base::ListValue* args) {
+  DCHECK_EQ(State::kCredentialManagementPIN, state_);
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK_EQ(2u, args->GetSize());
+  DCHECK(credential_management_);
+  DCHECK(credential_management_provide_pin_cb_);
+  DCHECK(callback_id_.empty());
+
+  callback_id_ = args->GetList()[0].GetString();
+  std::string pin = args->GetList()[1].GetString();
+
+  std::move(credential_management_provide_pin_cb_).Run(pin);
+}
+
+void SecurityKeysHandler::HandleCredentialManagementEnumerate(
+    const base::ListValue* args) {
+  DCHECK_EQ(state_, State::kCredentialManagementReady);
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK_EQ(1u, args->GetSize());
+  DCHECK(credential_management_);
+  DCHECK(callback_id_.empty());
+
+  state_ = State::kCredentialManagementGettingCredentials;
+  callback_id_ = args->GetList()[0].GetString();
+  credential_management_->GetCredentials(base::BindOnce(
+      &SecurityKeysHandler::OnHaveCredentials, weak_factory_->GetWeakPtr()));
+}
+
+void SecurityKeysHandler::OnCredentialManagementReady() {
+  DCHECK(state_ == State::kCredentialManagementStart ||
+         state_ == State::kCredentialManagementPIN);
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK(credential_management_);
+  DCHECK(!callback_id_.empty());
+
+  state_ = State::kCredentialManagementReady;
+  ResolveJavascriptCallback(base::Value(std::move(callback_id_)),
+                            base::Value());
+}
+
+void SecurityKeysHandler::OnHaveCredentials(
+    device::CtapDeviceResponseCode status,
+    base::Optional<std::vector<device::AggregatedEnumerateCredentialsResponse>>
+        responses,
+    base::Optional<size_t> remaining_credentials) {
+  DCHECK_EQ(State::kCredentialManagementGettingCredentials, state_);
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK(credential_management_);
+  DCHECK(!callback_id_.empty());
+
+  if (status != device::CtapDeviceResponseCode::kSuccess) {
+    OnCredentialManagementFinished(
+        device::FidoReturnCode::kAuthenticatorResponseInvalid);
+    return;
+  }
+  DCHECK(responses);
+  DCHECK(remaining_credentials);
+
+  state_ = State::kCredentialManagementReady;
+
+  base::Value::ListStorage credentials;
+  if (responses) {
+    for (const auto& response : *responses) {
+      for (const auto& credential : response.credentials) {
+        base::DictionaryValue credential_value;
+        credential_value.SetString(
+            "id", base::HexEncode(credential.credential_id.id().data(),
+                                  credential.credential_id.id().size()));
+        credential_value.SetString("relyingPartyId", response.rp.id);
+        credential_value.SetString("userName",
+                                   credential.user.name.value_or(""));
+        credential_value.SetString("userDisplayName",
+                                   credential.user.display_name.value_or(""));
+        credentials.emplace_back(std::move(credential_value));
+      }
+    }
+  }
+
+  ResolveJavascriptCallback(base::Value(std::move(callback_id_)),
+                            base::ListValue(std::move(credentials)));
+}
+
+void SecurityKeysHandler::OnCredentialManagementGatherPIN(
+    int64_t num_retries,
+    base::OnceCallback<void(std::string)> callback) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK(!callback_id_.empty());
+  DCHECK(!credential_management_provide_pin_cb_);
+
+  credential_management_provide_pin_cb_ = std::move(callback);
+
+  if (state_ == State::kCredentialManagementStart) {
+    // Resolve the promise to startCredentialManagement().
+    state_ = State::kCredentialManagementPIN;
+    ResolveJavascriptCallback(base::Value(std::move(callback_id_)),
+                              base::Value());
+    return;
+  }
+
+  // Resolve the promise to credentialManagementProvidePIN().
+  DCHECK_EQ(state_, State::kCredentialManagementPIN);
+  ResolveJavascriptCallback(base::Value(std::move(callback_id_)),
+                            base::Value(static_cast<int>(num_retries)));
+}
+
+void SecurityKeysHandler::OnCredentialManagementFinished(
+    device::FidoReturnCode status) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  int error;
+
+  switch (status) {
+    case device::FidoReturnCode::kSoftPINBlock:
+      error = IDS_SETTINGS_SECURITY_KEYS_PIN_SOFT_LOCK;
+      break;
+    case device::FidoReturnCode::kHardPINBlock:
+      error = IDS_SETTINGS_SECURITY_KEYS_PIN_HARD_LOCK;
+      break;
+    case device::FidoReturnCode::kAuthenticatorMissingCredentialManagement:
+      error = IDS_SETTINGS_SECURITY_KEYS_NO_CREDENTIAL_MANAGEMENT;
+      break;
+    case device::FidoReturnCode::kAuthenticatorMissingUserVerification:
+      error = IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_NO_PIN;
+      break;
+    case device::FidoReturnCode::kAuthenticatorResponseInvalid:
+      error = IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_ERROR;
+      break;
+    case device::FidoReturnCode::kSuccess:
+      error = IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_REMOVED;
+      break;
+    default:
+      NOTREACHED();
+      error = IDS_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_ERROR;
+      break;
+  }
+
+  FireWebUIListener("security-keys-credential-management-finished",
+                    base::Value(l10n_util::GetStringUTF8(std::move(error))));
+}
+
 void SecurityKeysHandler::HandleClose(const base::ListValue* args) {
   DCHECK_EQ(0u, args->GetSize());
   Close();
diff --git a/chrome/browser/ui/webui/settings/settings_security_key_handler.h b/chrome/browser/ui/webui/settings/settings_security_key_handler.h
index 353d85c..924dc08 100644
--- a/chrome/browser/ui/webui/settings/settings_security_key_handler.h
+++ b/chrome/browser/ui/webui/settings/settings_security_key_handler.h
@@ -11,6 +11,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
+#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
 #include "device/fido/fido_constants.h"
 
 namespace base {
@@ -18,6 +19,9 @@
 }
 
 namespace device {
+struct AggregatedEnumerateCredentialsResponse;
+class FidoDiscoveryFactory;
+class CredentialManagementHandler;
 class SetPINRequestHandler;
 class ResetRequestHandler;
 }  // namespace device
@@ -50,21 +54,49 @@
     kWaitingForResetNoCallbackYet,
     kWaitingForResetHaveCallback,
     kWaitingForCompleteReset,
+
+    kCredentialManagementStart,
+    kCredentialManagementPIN,
+    kCredentialManagementReady,
+    kCredentialManagementGettingCredentials,
   };
 
   void Close();
+
+  // PIN
   void HandleStartSetPIN(const base::ListValue* args);
   void OnGatherPIN(base::Optional<int64_t> num_retries);
   void OnSetPINComplete(device::CtapDeviceResponseCode code);
   void HandleSetPIN(const base::ListValue* args);
+
+  // Reset
   void HandleReset(const base::ListValue* args);
   void OnResetSent();
   void HandleCompleteReset(const base::ListValue* args);
   void OnResetFinished(device::CtapDeviceResponseCode result);
+
+  // Credential Management
+  void HandleCredentialManagement(const base::ListValue* args);
+  void HandleCredentialManagementPIN(const base::ListValue* args);
+  void HandleCredentialManagementEnumerate(const base::ListValue* args);
+  void OnCredentialManagementReady();
+  void OnHaveCredentials(
+      device::CtapDeviceResponseCode status,
+      base::Optional<
+          std::vector<device::AggregatedEnumerateCredentialsResponse>>
+          responses,
+      base::Optional<size_t> remaining_credentials);
+  void OnCredentialManagementGatherPIN(int64_t num_retries,
+                                       base::OnceCallback<void(std::string)>);
+  void OnCredentialManagementFinished(device::FidoReturnCode status);
+
   void HandleClose(const base::ListValue* args);
 
   State state_;
+  base::OnceCallback<void(std::string)> credential_management_provide_pin_cb_;
+  std::unique_ptr<device::FidoDiscoveryFactory> discovery_factory_;
   std::unique_ptr<device::SetPINRequestHandler> set_pin_;
+  std::unique_ptr<device::CredentialManagementHandler> credential_management_;
   std::unique_ptr<device::ResetRequestHandler> reset_;
   base::Optional<device::CtapDeviceResponseCode> reset_result_;
   std::string callback_id_;
diff --git a/chrome/browser/vr/DEPS b/chrome/browser/vr/DEPS
index 6c9833be..712beb21 100644
--- a/chrome/browser/vr/DEPS
+++ b/chrome/browser/vr/DEPS
@@ -3,8 +3,8 @@
   "+cc/base",
   "+cc/test",
   "+cc/trees",
-  "+device/vr/util",
   "+chrome/android/features/vr/jni_headers",
+  "+device/vr/util",
 ]
 
 specific_include_rules = {
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn
index b82d3ee..522ee58 100644
--- a/chrome/common/BUILD.gn
+++ b/chrome/common/BUILD.gn
@@ -143,8 +143,6 @@
     "logging_chrome.h",
     "mac/app_shim_launch.h",
     "mac/app_shim_param_traits.h",
-    "mac/cfbundle_blocker.h",
-    "mac/cfbundle_blocker.mm",
     "mac/launchd.h",
     "mac/launchd.mm",
     "mac/service_management.h",
@@ -467,10 +465,7 @@
   }
 
   if (is_mac) {
-    public_deps += [
-      "//third_party/google_toolbox_for_mac",
-      "//third_party/mach_override",
-    ]
+    public_deps += [ "//third_party/google_toolbox_for_mac" ]
 
     libs = [ "ServiceManagement.framework" ]
   }
diff --git a/chrome/common/chrome_content_client.cc b/chrome/common/chrome_content_client.cc
index c70139f..b0e032b 100644
--- a/chrome/common/chrome_content_client.cc
+++ b/chrome/common/chrome_content_client.cc
@@ -654,39 +654,39 @@
 #endif
 }
 
-base::string16 ChromeContentClient::GetLocalizedString(int message_id) const {
+base::string16 ChromeContentClient::GetLocalizedString(int message_id) {
   return l10n_util::GetStringUTF16(message_id);
 }
 
 base::string16 ChromeContentClient::GetLocalizedString(
     int message_id,
-    const base::string16& replacement) const {
+    const base::string16& replacement) {
   return l10n_util::GetStringFUTF16(message_id, replacement);
 }
 
 base::StringPiece ChromeContentClient::GetDataResource(
     int resource_id,
-    ui::ScaleFactor scale_factor) const {
+    ui::ScaleFactor scale_factor) {
   return ui::ResourceBundle::GetSharedInstance().GetRawDataResourceForScale(
       resource_id, scale_factor);
 }
 
 base::RefCountedMemory* ChromeContentClient::GetDataResourceBytes(
-    int resource_id) const {
+    int resource_id) {
   return ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytes(
       resource_id);
 }
 
-bool ChromeContentClient::IsDataResourceGzipped(int resource_id) const {
+bool ChromeContentClient::IsDataResourceGzipped(int resource_id) {
   return ui::ResourceBundle::GetSharedInstance().IsGzipped(resource_id);
 }
 
-gfx::Image& ChromeContentClient::GetNativeImageNamed(int resource_id) const {
+gfx::Image& ChromeContentClient::GetNativeImageNamed(int resource_id) {
   return ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed(
       resource_id);
 }
 
-base::DictionaryValue ChromeContentClient::GetNetLogConstants() const {
+base::DictionaryValue ChromeContentClient::GetNetLogConstants() {
   auto platform_dict = net_log::GetPlatformConstantsForNetLog(
       base::CommandLine::ForCurrentProcess()->GetCommandLineString(),
       chrome::GetChannelName());
diff --git a/chrome/common/chrome_content_client.h b/chrome/common/chrome_content_client.h
index 54a950d1..c5a25907 100644
--- a/chrome/common/chrome_content_client.h
+++ b/chrome/common/chrome_content_client.h
@@ -83,18 +83,15 @@
       std::vector<media::CdmHostFilePath>* cdm_host_file_paths) override;
 
   void AddAdditionalSchemes(Schemes* schemes) override;
-  base::string16 GetLocalizedString(int message_id) const override;
-  base::string16 GetLocalizedString(
-      int message_id,
-      const base::string16& replacement) const override;
-  base::StringPiece GetDataResource(
-      int resource_id,
-      ui::ScaleFactor scale_factor) const override;
-  base::RefCountedMemory* GetDataResourceBytes(
-      int resource_id) const override;
-  bool IsDataResourceGzipped(int resource_id) const override;
-  gfx::Image& GetNativeImageNamed(int resource_id) const override;
-  base::DictionaryValue GetNetLogConstants() const override;
+  base::string16 GetLocalizedString(int message_id) override;
+  base::string16 GetLocalizedString(int message_id,
+                                    const base::string16& replacement) override;
+  base::StringPiece GetDataResource(int resource_id,
+                                    ui::ScaleFactor scale_factor) override;
+  base::RefCountedMemory* GetDataResourceBytes(int resource_id) override;
+  bool IsDataResourceGzipped(int resource_id) override;
+  gfx::Image& GetNativeImageNamed(int resource_id) override;
+  base::DictionaryValue GetNetLogConstants() override;
   std::string GetProcessTypeNameInEnglish(int type) override;
 
   bool AllowScriptExtensionForServiceWorker(
diff --git a/chrome/common/mac/DEPS b/chrome/common/mac/DEPS
index 0d09bcaa..d6b1434b6 100644
--- a/chrome/common/mac/DEPS
+++ b/chrome/common/mac/DEPS
@@ -1,4 +1,3 @@
 include_rules = [
   "+third_party/google_toolbox_for_mac/src",
-  "+third_party/mach_override",
 ]
diff --git a/chrome/common/mac/cfbundle_blocker.h b/chrome/common/mac/cfbundle_blocker.h
deleted file mode 100644
index 9d5ce4e..0000000
--- a/chrome/common/mac/cfbundle_blocker.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_COMMON_MAC_CFBUNDLE_BLOCKER_H_
-#define CHROME_COMMON_MAC_CFBUNDLE_BLOCKER_H_
-
-#if defined(__OBJC__)
-@class NSString;
-#else
-class NSString;
-#endif
-
-namespace chrome {
-namespace common {
-namespace mac {
-
-// Arranges to block loading of some third-party plugin code that might try
-// to inject itself into the process. Modules loaded by CFBundle are blocked
-// if located within specific directories. Because NSBundle uses CFBundle
-// behind the scenes, this also blocks modules loaded by NSBundle when located
-// in those same specific directories.
-//
-// Blocked modules include input managers, contextual menu items, and
-// scripting additions installed in per-user (~/Library), per-machine
-// (/Library), or network (/Network/Library) locations. Modules installed in
-// the operating system location (/System/Library) are never blocked.
-//
-// This mechanism does not prevent CFBundle (or NSBundle) objects from being
-// created, but it does block them from loading modules into the process.
-// Returns whether the blocking mechanism setup was successful.
-bool EnableCFBundleBlocker();
-
-}  // namespace mac
-}  // namespace common
-}  // namespace chrome
-
-#endif  // CHROME_COMMON_MAC_CFBUNDLE_BLOCKER_H_
diff --git a/chrome/common/mac/cfbundle_blocker.mm b/chrome/common/mac/cfbundle_blocker.mm
deleted file mode 100644
index 86b3a730..0000000
--- a/chrome/common/mac/cfbundle_blocker.mm
+++ /dev/null
@@ -1,345 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/common/mac/cfbundle_blocker.h"
-#include "chrome/common/mac/cfbundle_blocker_private.h"
-
-#include <CoreFoundation/CoreFoundation.h>
-#import <Foundation/Foundation.h>
-#include <Security/Security.h>
-#include <stddef.h>
-
-#include "base/logging.h"
-#include "base/mac/foundation_util.h"
-#include "base/mac/scoped_cftyperef.h"
-#include "base/mac/scoped_nsautorelease_pool.h"
-#import "base/mac/scoped_nsobject.h"
-#include "base/stl_util.h"
-#include "base/strings/sys_string_conversions.h"
-#include "third_party/mach_override/mach_override.h"
-
-namespace chrome {
-namespace common {
-namespace mac {
-
-// Call this to execute the original implementation of
-// _CFBundleLoadExecutableAndReturnError.
-_CFBundleLoadExecutableAndReturnError_Type
-    g_original_underscore_cfbundle_load_executable_and_return_error;
-
-namespace {
-
-// Returns an autoreleased array of paths that contain plugins that should be
-// forbidden to load. Each element of the array will be a string containing
-// an absolute pathname ending in '/'.
-NSArray* BlockedPaths() {
-  NSMutableArray* blocked_paths;
-
-  {
-    base::mac::ScopedNSAutoreleasePool autorelease_pool;
-
-    // ~/Library, /Library, and /Network/Library. Things in /System/Library
-    // aren't blacklisted.
-    NSArray* blocked_prefixes =
-       NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
-                                           NSUserDomainMask |
-                                               NSLocalDomainMask |
-                                               NSNetworkDomainMask,
-                                           YES);
-
-    // Everything in the suffix list has a trailing slash so as to only block
-    // loading things contained in these directories.
-    NSString* const blocked_suffixes[] = {
-      // Don't load third-party scripting additions either. Scripting
-      // additions are loaded by AppleScript from within AEProcessAppleEvent
-      // in response to an Apple Event.
-      @"ScriptingAdditions/"
-
-      // This list is intentionally incomplete. For example, it doesn't block
-      // printer drivers or Internet plugins.
-    };
-
-    NSUInteger blocked_paths_count =
-        [blocked_prefixes count] * base::size(blocked_suffixes);
-
-    // Not autoreleased here, because the enclosing pool is scoped too
-    // narrowly.
-    blocked_paths =
-        [[NSMutableArray alloc] initWithCapacity:blocked_paths_count];
-
-    // Build a flat list by adding each suffix to each prefix.
-    for (NSString* blocked_prefix in blocked_prefixes) {
-      for (size_t blocked_suffix_index = 0;
-           blocked_suffix_index < base::size(blocked_suffixes);
-           ++blocked_suffix_index) {
-        NSString* blocked_suffix = blocked_suffixes[blocked_suffix_index];
-        NSString* blocked_path =
-            [blocked_prefix stringByAppendingPathComponent:blocked_suffix];
-
-        [blocked_paths addObject:blocked_path];
-      }
-    }
-
-    DCHECK_EQ([blocked_paths count], blocked_paths_count);
-  }
-
-  return [blocked_paths autorelease];
-}
-
-// Returns true if bundle_path identifies a path within a blocked directory.
-// Blocked directories are those returned by BlockedPaths().
-bool IsBundlePathBlocked(NSString* bundle_path) {
-  static NSArray* blocked_paths = [BlockedPaths() retain];
-
-  for (NSString* blocked_path in blocked_paths) {
-    NSUInteger blocked_path_length = [blocked_path length];
-
-    // Do a case-insensitive comparison because most users will be on
-    // case-insensitive HFS+ filesystems and it's cheaper than asking the
-    // disk. This is like [bundle_path hasPrefix:blocked_path] but is
-    // case-insensitive.
-    if ([bundle_path length] >= blocked_path_length &&
-        [bundle_path compare:blocked_path
-                     options:NSCaseInsensitiveSearch
-                       range:NSMakeRange(0, blocked_path_length)] ==
-        NSOrderedSame) {
-      // If bundle_path is inside blocked_path (it has blocked_path as a
-      // prefix), refuse to load it.
-      return true;
-    }
-  }
-
-  // bundle_path is not inside any blocked_path from blocked_paths.
-  return false;
-}
-
-Boolean ChromeCFBundleLoadExecutableAndReturnError(CFBundleRef bundle,
-                                                   Boolean force_global,
-                                                   CFErrorRef* error) {
-  base::mac::ScopedNSAutoreleasePool autorelease_pool;
-
-  DCHECK(g_original_underscore_cfbundle_load_executable_and_return_error);
-
-  base::ScopedCFTypeRef<CFURLRef> url_cf(CFBundleCopyBundleURL(bundle));
-  base::scoped_nsobject<NSString> path(base::mac::CFToNSCast(
-      CFURLCopyFileSystemPath(url_cf, kCFURLPOSIXPathStyle)));
-
-  NSString* bundle_id = base::mac::CFToNSCast(CFBundleGetIdentifier(bundle));
-
-  NSDictionary* bundle_dictionary =
-      base::mac::CFToNSCast(CFBundleGetInfoDictionary(bundle));
-  NSString* version = [bundle_dictionary objectForKey:
-      base::mac::CFToNSCast(kCFBundleVersionKey)];
-  if (![version isKindOfClass:[NSString class]]) {
-    // Deal with pranksters.
-    version = nil;
-  }
-
-  if (IsBundlePathBlocked(path) && !IsBundleAllowed(bundle_id, version)) {
-    NSString* bundle_id_print = bundle_id ? bundle_id : @"(nil)";
-    NSString* version_print = version ? version : @"(nil)";
-
-    // Provide a hint for the user (or module developer) to figure out
-    // that the bundle was blocked.
-    LOG(INFO) << "Blocking attempt to load bundle "
-              << [bundle_id_print UTF8String]
-              << " version "
-              << [version_print UTF8String]
-              << " at "
-              << [path fileSystemRepresentation];
-
-    if (error) {
-      base::ScopedCFTypeRef<CFStringRef> app_bundle_id(
-          base::SysUTF8ToCFStringRef(base::mac::BaseBundleID()));
-
-      // 0xb10c10ad = "block load"
-      const CFIndex kBundleLoadBlocked = 0xb10c10ad;
-
-      NSMutableDictionary* error_dict =
-          [NSMutableDictionary dictionaryWithCapacity:4];
-      if (bundle_id) {
-        [error_dict setObject:bundle_id forKey:@"bundle_id"];
-      }
-      if (version) {
-        [error_dict setObject:version forKey:@"version"];
-      }
-      if (path) {
-        [error_dict setObject:path forKey:@"path"];
-      }
-      NSURL* url_ns = base::mac::CFToNSCast(url_cf);
-      NSString* url_absolute_string = [url_ns absoluteString];
-      if (url_absolute_string) {
-        [error_dict setObject:url_absolute_string forKey:@"url"];
-      }
-
-      *error = CFErrorCreate(NULL,
-                             app_bundle_id,
-                             kBundleLoadBlocked,
-                             base::mac::NSToCFCast(error_dict));
-    }
-
-    return FALSE;
-  }
-
-  // Not blocked. Call through to the original implementation.
-  return g_original_underscore_cfbundle_load_executable_and_return_error(
-      bundle, force_global, error);
-}
-
-#if !defined(MAC_OS_X_VERSION_10_14) || \
-    MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_14
-constexpr SecCodeSignatureFlags kSecCodeSignatureRuntime = 0x10000;
-#endif
-
-// The kSecCodeSignatureEnforcement flag, which is implied with
-// kSecCodeSignatureRuntime, means that all executable pages must be backed by
-// a valid code signature. The use of mach_override will break that requirement,
-// so the CFBundleBlocker must be disabled.
-bool IsSignedWithEnforcement() {
-  base::ScopedCFTypeRef<SecCodeRef> self_code;
-  OSStatus status =
-      SecCodeCopySelf(kSecCSDefaultFlags, self_code.InitializeInto());
-  if (status != noErr)
-    return false;
-
-  base::ScopedCFTypeRef<CFDictionaryRef> signing_info;
-  status = SecCodeCopySigningInformation(self_code, kSecCSDefaultFlags,
-                                         signing_info.InitializeInto());
-  if (status != noErr)
-    return false;
-
-  CFNumberRef signing_flags_cf = base::mac::GetValueFromDictionary<CFNumberRef>(
-      signing_info, kSecCodeInfoFlags);
-  if (!signing_flags_cf)
-    return false;
-
-  int signing_flags = 0;
-  if (!CFNumberGetValue(signing_flags_cf, kCFNumberIntType, &signing_flags))
-    return false;
-
-  return (signing_flags & kSecCodeSignatureRuntime) ||
-         (signing_flags & kSecCodeSignatureEnforcement);
-}
-
-}  // namespace
-
-bool EnableCFBundleBlocker() {
-  // If the binary is signed with enforcement, loading third-party bundles will
-  // be blocked by macOS.
-  if (IsSignedWithEnforcement())
-    return true;
-
-  mach_error_t err = mach_override_ptr(
-      reinterpret_cast<void*>(_CFBundleLoadExecutableAndReturnError),
-      reinterpret_cast<void*>(ChromeCFBundleLoadExecutableAndReturnError),
-      reinterpret_cast<void**>(
-          &g_original_underscore_cfbundle_load_executable_and_return_error));
-  if (err != err_none) {
-    DLOG(WARNING) << "mach_override _CFBundleLoadExecutableAndReturnError: "
-                  << err;
-    return false;
-  }
-  return true;
-}
-
-namespace {
-
-struct AllowedBundle {
-  // The bundle identifier to permit. These are matched with a case-sensitive
-  // literal comparison. "Children" of the declared bundle ID are permitted:
-  // if bundle_id here is @"org.chromium", it would match both @"org.chromium"
-  // and @"org.chromium.Chromium".
-  NSString* bundle_id;
-
-  // If bundle_id should only be permitted as of a certain minimum version,
-  // this string defines that version, which will be compared to the bundle's
-  // version with a numeric comparison. If bundle_id may be permitted at any
-  // version, set minimum_version to nil.
-  NSString* minimum_version;
-};
-
-}  // namespace
-
-bool IsBundleAllowed(NSString* bundle_id, NSString* version) {
-  // The list of bundles that are allowed to load. Before adding an entry to
-  // this list, be sure that it's well-behaved. Specifically, anything that
-  // uses mach_override
-  // (https://github.com/rentzsch/mach_star/tree/master/mach_override) must
-  // use version 51ae3d199463fa84548f466d649f0821d579fdaf (July 22, 2011) or
-  // newer. Products added to the list must not cause crashes. Entries should
-  // include the name of the product, URL, and the name and e-mail address of
-  // someone responsible for the product's engineering. To add items to this
-  // list, file a bug at http://crbug.com/new using the "Defect on Mac OS"
-  // template, and provide the bundle ID (or IDs) and minimum CFBundleVersion
-  // that's safe for Chrome to load, along with the necessary product and
-  // contact information. Whitelisted bundles in this list may be removed if
-  // they are found to cause instability or otherwise behave badly. With
-  // proper contact information, Chrome developers may try to contact
-  // maintainers to resolve any problems.
-  const AllowedBundle kAllowedBundles[] = {
-    // Google Authenticator BT
-    // Dave MacLachlan <dmaclach@google.com>
-    { @"com.google.osax.Google_Authenticator_BT", nil },
-
-    // Default Folder X, http://www.stclairsoft.com/DefaultFolderX/
-    // Jon Gotow <gotow@stclairsoft.com>
-    { @"com.stclairsoft.DefaultFolderX", @"4.4.3" },
-
-    // MySpeed, http://www.enounce.com/myspeed
-    // Edward Bianchi <ejbianchi@enounce.com>
-    { @"com.enounce.MySpeed.osax", @"1201" },
-
-    // SIMBL (fork), https://github.com/albertz/simbl
-    // Albert Zeyer <albzey@googlemail.com>
-    { @"net.culater.SIMBL", nil },
-
-    // Smart Scroll, http://marcmoini.com/sx_en.html
-    // Marc Moini <marc@a9ff.com>
-    { @"com.marcmoini.SmartScroll", @"3.9" },
-
-    // Bartender for Mac, http://www.macbartender.com
-    // Ben Surtees <ben@surteesstudios.com>
-    { @"com.surteesstudios.BartenderHelper", @"1.2.20" },
-    { @"com.surteesstudios.BartenderHelperSeventy", @"1.2.20" },
-    { @"com.surteesstudios.BartenderHelperBundle", @"1.2.20" },
-  };
-
-  for (size_t index = 0; index < base::size(kAllowedBundles); ++index) {
-    const AllowedBundle& allowed_bundle = kAllowedBundles[index];
-    NSString* allowed_bundle_id = allowed_bundle.bundle_id;
-    NSUInteger allowed_bundle_id_length = [allowed_bundle_id length];
-
-    // Permit bundle identifiers that are exactly equal to the allowed
-    // identifier, as well as "children" of the allowed identifier.
-    if ([bundle_id isEqualToString:allowed_bundle_id] ||
-        ([bundle_id length] > allowed_bundle_id_length &&
-         [bundle_id characterAtIndex:allowed_bundle_id_length] == '.' &&
-         [bundle_id hasPrefix:allowed_bundle_id])) {
-      NSString* minimum_version = allowed_bundle.minimum_version;
-      if (!minimum_version) {
-        // If the rule didn't declare any version requirement, the bundle is
-        // allowed to load.
-        return true;
-      }
-
-      if (!version) {
-        // If there wasn't any version but one was required, the bundle isn't
-        // allowed to load.
-        return false;
-      }
-
-      // A numeric search is appropriate for comparing version numbers.
-      NSComparisonResult result = [version compare:minimum_version
-                                           options:NSNumericSearch];
-      return result != NSOrderedAscending;
-    }
-  }
-
-  // Nothing matched.
-  return false;
-}
-
-}  // namespace mac
-}  // namespace common
-}  // namespace chrome
diff --git a/chrome/common/mac/cfbundle_blocker_private.h b/chrome/common/mac/cfbundle_blocker_private.h
deleted file mode 100644
index adc3f36..0000000
--- a/chrome/common/mac/cfbundle_blocker_private.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (c) 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_COMMON_MAC_CFBUNDLE_BLOCKER_PRIVATE_H_
-#define CHROME_COMMON_MAC_CFBUNDLE_BLOCKER_PRIVATE_H_
-
-#include <CoreFoundation/CoreFoundation.h>
-
-extern "C" {
-
-// _CFBundleLoadExecutableAndReturnError is the internal implementation that
-// results in a dylib being loaded via dlopen. Both CFBundleLoadExecutable and
-// CFBundleLoadExecutableAndReturnError are funneled into this routine. Other
-// CFBundle functions may also call directly into here, perhaps due to
-// inlining their calls to CFBundleLoadExecutable.
-//
-// See CF-476.19/CFBundle.c (10.5.8), CF-550.43/CFBundle.c (10.6.8), and
-// CF-635/Bundle.c (10.7.0) and the disassembly of the shipping object code.
-//
-// Because this is a private function not declared by
-// <CoreFoundation/CoreFoundation.h>, provide a declaration here.
-Boolean _CFBundleLoadExecutableAndReturnError(CFBundleRef bundle,
-                                              Boolean force_global,
-                                              CFErrorRef* error);
-
-}  // extern "C"
-
-// These are internal declarations that are shared between the implementation
-// and the unit tests only.
-namespace chrome {
-namespace common {
-namespace mac {
-
-// Returns true if |bundle_id| and |version| identify a bundle that is allowed
-// to be loaded even when found in a blocked directory.
-//
-// Exposed only for testing. Do not call from outside the implementation.
-bool IsBundleAllowed(NSString* bundle_id, NSString* version);
-
-typedef Boolean (*_CFBundleLoadExecutableAndReturnError_Type)(CFBundleRef,
-                                                              Boolean,
-                                                              CFErrorRef*);
-
-// A function pointer that allows calling the original intercepted
-// implementation. The unit tests use it to restore back the functionality.
-// It is NULL until the blocking (intercepting) starts.
-extern _CFBundleLoadExecutableAndReturnError_Type
-    g_original_underscore_cfbundle_load_executable_and_return_error;
-
-}  // namespace mac
-}  // namespace common
-}  // namespace chrome
-
-#endif  // CHROME_COMMON_MAC_CFBUNDLE_BLOCKER_PRIVATE_H_
diff --git a/chrome/common/mac/cfbundle_blocker_unittest.mm b/chrome/common/mac/cfbundle_blocker_unittest.mm
deleted file mode 100644
index c19138e..0000000
--- a/chrome/common/mac/cfbundle_blocker_unittest.mm
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/common/mac/cfbundle_blocker.h"
-#include "chrome/common/mac/cfbundle_blocker_private.h"
-
-#import <Foundation/Foundation.h>
-#include <stddef.h>
-
-#include "base/stl_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/mach_override/mach_override.h"
-
-namespace chrome {
-namespace common {
-namespace mac {
-namespace {
-
-struct IsBundleAllowedTestcase {
-  NSString* bundle_id;
-  NSString* version;
-  bool allowed;
-};
-
-TEST(CFBundleBlockerTest, IsBundleAllowed) {
-  const IsBundleAllowedTestcase kTestcases[] = {
-    // Block things without a bundle ID.
-    { nil, nil, false },
-
-    // Block bundle IDs that aren't in the whitelist.
-    { @"org.chromium.Chromium.evil", nil, false },
-
-    // The AllowedBundle structure for Google Authetnicator BT doesn't
-    // require a version, so this should work equally well with any version
-    // including no version at all.
-    { @"com.google.osax.Google_Authenticator_BT", nil, true },
-    { @"com.google.osax.Google_Authenticator_BT", @"0.5.0.0", true },
-
-    // Typos should be blocked.
-    { @"com.google.osax.Google_Authenticator_B", nil, false },
-    { @"com.google.osax.Google_Authenticator_BQ", nil, false },
-    { @"com.google.osax.Google_Authenticator_BTQ", nil, false },
-    { @"com.google.osax", nil, false },
-    { @"com.google", nil, false },
-    { @"com", nil, false },
-    { @"", nil, false },
-
-    // MySpeed requires a version, so make sure that versions below don't work
-    // and versions above do.
-    { @"com.enounce.MySpeed.osax", nil, false },
-    { @"com.enounce.MySpeed.osax", @"", false },
-    { @"com.enounce.MySpeed.osax", @"1200", false },
-    { @"com.enounce.MySpeed.osax", @"1201", true },
-    { @"com.enounce.MySpeed.osax", @"1202", true },
-
-    // DefaultFolderX is whitelisted as com.stclairsoft.DefaultFolderX. Make
-    // sure that "child" IDs such as com.stclairsoft.DefaultFolderX.osax work.
-    // It uses a dotted versioning scheme, so test the version comparator out.
-    { @"com.stclairsoft.DefaultFolderX.osax", nil, false },
-    { @"com.stclairsoft.DefaultFolderX.osax", @"", false },
-    { @"com.stclairsoft.DefaultFolderX.osax", @"3.5.4", false },
-    { @"com.stclairsoft.DefaultFolderX.osax", @"4.3.4", false },
-    { @"com.stclairsoft.DefaultFolderX.osax", @"4.4.2", false },
-    { @"com.stclairsoft.DefaultFolderX.osax", @"4.4.3", true },
-    { @"com.stclairsoft.DefaultFolderX.osax", @"4.4.4", true },
-    { @"com.stclairsoft.DefaultFolderX.osax", @"4.4.10", true },
-    { @"com.stclairsoft.DefaultFolderX.osax", @"4.5", true },
-    { @"com.stclairsoft.DefaultFolderX.osax", @"4.5.2", true },
-    { @"com.stclairsoft.DefaultFolderX.osax", @"4.10", true },
-    { @"com.stclairsoft.DefaultFolderX.osax", @"4.10.2", true },
-    { @"com.stclairsoft.DefaultFolderX.osax", @"5", true },
-    { @"com.stclairsoft.DefaultFolderX.osax", @"5.3", true },
-    { @"com.stclairsoft.DefaultFolderX.osax", @"5.3.2", true },
-
-    // Other "child" IDs that might want to load.
-    { @"com.stclairsoft.DefaultFolderX.CarbonPatcher", @"4.4.3", true },
-    { @"com.stclairsoft.DefaultFolderX.CocoaPatcher", @"4.4.3", true },
-  };
-
-  for (size_t index = 0; index < base::size(kTestcases); ++index) {
-    const IsBundleAllowedTestcase& testcase = kTestcases[index];
-    NSString* bundle_id = testcase.bundle_id;
-    NSString* version = testcase.version;
-    NSString* version_print = version ? version : @"(nil)";
-    EXPECT_EQ(testcase.allowed, IsBundleAllowed(bundle_id, version))
-        << "index " << index
-        << ", bundle_id " << [bundle_id UTF8String]
-        << ", version " << [version_print UTF8String];
-  }
-}
-
-TEST(CFBundleBlockerTest, EnableCFBundleBlocker_AllocationAttempts) {
-  static uint64_t s_num_test_calls = 0;
-  ++s_num_test_calls;
-  if (g_original_underscore_cfbundle_load_executable_and_return_error) {
-    // The override has already happened. Overriding twice may lead to a hang
-    // so we need to restore it first.
-    mach_error_t err = mach_override_ptr(
-        reinterpret_cast<void*>(_CFBundleLoadExecutableAndReturnError),
-        reinterpret_cast<void*>(
-            g_original_underscore_cfbundle_load_executable_and_return_error),
-        nullptr);
-    ASSERT_EQ(err_none, err)
-        << "Failed to restore CFBundleLoadExecutableAndReturnError";
-  }
-  uint64_t allocations_num_start = mach_override_ptr_allocation_attempts();
-  EXPECT_TRUE(EnableCFBundleBlocker());
-  // Note that each time mach_override_ptr is called to override the same
-  // function address. Each will allocate a page that will be attempted
-  // in the next call. So if this test is called in the same process multiple
-  // times, mach_override_ptr will end up attempting to allocate the same
-  // addresses over and over. Hence the 2 * s_num_test_calls added.
-  ASSERT_LE(mach_override_ptr_allocation_attempts(),
-            100UL + allocations_num_start + 2 * s_num_test_calls)
-      << "Too many allocation attempts. "
-         "See https://bugs.chromium.org/p/chromium/issues/detail?id=730918";
-}
-
-}  // namespace
-}  // namespace mac
-}  // namespace common
-}  // namespace chrome
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index 317e6b52..998abe35 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -969,6 +969,9 @@
 // chrome.login API.
 const char kLoginExtensionApiDataForNextLoginAttempt[] =
     "extensions_api.login.data_for_next_login_attempt";
+
+// String containing last RSU lookup key uploaded. Empty until first upload.
+const char kLastRsuDeviceIdUploaded[] = "rsu.last_rsu_device_id_uploaded";
 #endif  // defined(OS_CHROMEOS)
 
 // A boolean pref set to true if a Home button to open the Home pages should be
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index 1d6b2f22..1f84118 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -678,6 +678,7 @@
 extern const char kKnownUserParentAccessCodeConfig[];
 extern const char kSamlInSessionPasswordChangeEnabled[];
 extern const char kSamlPasswordExpirationAdvanceWarningDays[];
+extern const char kLastRsuDeviceIdUploaded[];
 #endif  // defined(OS_CHROMEOS)
 
 extern const char kClearPluginLSODataEnabled[];
diff --git a/chrome/credential_provider/gaiacp/gaia_credential_base.cc b/chrome/credential_provider/gaiacp/gaia_credential_base.cc
index 0c5128d9..a09208b9 100644
--- a/chrome/credential_provider/gaiacp/gaia_credential_base.cc
+++ b/chrome/credential_provider/gaiacp/gaia_credential_base.cc
@@ -23,6 +23,8 @@
 #include "base/path_service.h"
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
+#include "base/strings/string_split.h"
+#include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
 #include "base/win/current_module.h"
@@ -46,11 +48,13 @@
 #include "chrome/credential_provider/gaiacp/reg_utils.h"
 #include "chrome/credential_provider/gaiacp/scoped_lsa_policy.h"
 #include "chrome/credential_provider/gaiacp/scoped_user_profile.h"
+#include "chrome/credential_provider/gaiacp/win_http_url_fetcher.h"
 #include "chrome/installer/launcher_support/chrome_launcher_support.h"
 #include "content/public/common/content_switches.h"
 #include "google_apis/gaia/gaia_auth_util.h"
 #include "google_apis/gaia/gaia_switches.h"
 #include "google_apis/gaia/gaia_urls.h"
+#include "net/base/escape.h"
 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
 
 namespace credential_provider {
@@ -58,6 +62,23 @@
 namespace {
 
 constexpr wchar_t kEmailDomainsKey[] = L"ed";
+constexpr char kGetAccessTokenBodyWithScopeFormat[] =
+    "client_id=%s&"
+    "client_secret=%s&"
+    "grant_type=refresh_token&"
+    "refresh_token=%s&"
+    "scope=%s";
+constexpr wchar_t kRegEnableADAssociation[] = L"enable_ad_association";
+// The access scopes should be separated by single space.
+constexpr char kAccessScopes[] =
+    "https://www.googleapis.com/auth/admin.directory.user";
+constexpr int kHttpTimeout = 3000;  // in milliseconds
+
+// Names of keys used to fetch the custom attributes from google admin sdk
+// users directory api.
+constexpr char kKeyCustomSchemas[] = "customSchemas";
+constexpr char kKeyEmployeeData[] = "employeeData";
+constexpr char kKeyAdUpn[] = "ad_upn";
 
 base::string16 GetEmailDomains() {
   std::vector<wchar_t> email_domains(16);
@@ -75,6 +96,178 @@
   return base::string16(&email_domains[0]);
 }
 
+bool EnableAdToGoogleAssociation() {
+  DWORD enable_ad_association = 0;
+  HRESULT hr = GetGlobalFlag(kRegEnableADAssociation, &enable_ad_association);
+  return SUCCEEDED(hr) && enable_ad_association;
+}
+
+// Use WinHttpUrlFetcher to communicate with the admin sdk and fetch the active
+// directory UPN from the admin configured custom attributes.
+HRESULT GetAdUpnFromCloudDirectory(const base::string16& email,
+                                   const std::string& access_token,
+                                   std::string* ad_upn) {
+  DCHECK(email.size() > 0);
+  DCHECK(access_token.size() > 0);
+  DCHECK(ad_upn);
+
+  std::string escape_url_encoded_email =
+      net::EscapeUrlEncodedData(base::UTF16ToUTF8(email), true);
+  std::string get_cd_user_url = base::StringPrintf(
+      "https://www.googleapis.com/admin/directory/v1/users/"
+      "%s?projection=full&viewType=domain_public",
+      escape_url_encoded_email.c_str());
+  LOGFN(INFO) << "Encoded URL : " << get_cd_user_url;
+  auto fetcher = WinHttpUrlFetcher::Create(GURL(get_cd_user_url));
+  fetcher->SetRequestHeader("Accept", "application/json");
+  fetcher->SetHttpRequestTimeout(kHttpTimeout);
+
+  std::string access_token_header =
+      base::StringPrintf("Bearer %s", access_token.c_str());
+  fetcher->SetRequestHeader("Authorization", access_token_header.c_str());
+  std::vector<char> cd_user_response;
+  HRESULT hr = fetcher->Fetch(&cd_user_response);
+  std::string cd_user_response_json_string =
+      std::string(cd_user_response.begin(), cd_user_response.end());
+  if (FAILED(hr)) {
+    LOGFN(INFO) << "fetcher->Fetch hr=" << putHR(hr);
+    return hr;
+  }
+
+  *ad_upn = SearchForKeyInStringDictUTF8(
+      cd_user_response_json_string,
+      {kKeyCustomSchemas, kKeyEmployeeData, kKeyAdUpn});
+  return S_OK;
+}
+
+// Request a downscoped access token using the refresh token provided in the
+// input.
+HRESULT RequestDownscopedAccessToken(const std::string& refresh_token,
+                                     std::string* access_token) {
+  DCHECK(refresh_token.size() > 0);
+  DCHECK(access_token);
+
+  GaiaUrls* gaia_urls = GaiaUrls::GetInstance();
+  std::string enc_client_id =
+      net::EscapeUrlEncodedData(gaia_urls->oauth2_chrome_client_id(), true);
+  std::string enc_client_secret =
+      net::EscapeUrlEncodedData(gaia_urls->oauth2_chrome_client_secret(), true);
+  std::string enc_refresh_token =
+      net::EscapeUrlEncodedData(refresh_token, true);
+  std::string get_access_token_body = base::StringPrintf(
+      kGetAccessTokenBodyWithScopeFormat, enc_client_id.c_str(),
+      enc_client_secret.c_str(), enc_refresh_token.c_str(),
+      net::EscapeUrlEncodedData(kAccessScopes, true).c_str());
+  std::string get_oauth_token_url =
+      base::StringPrintf("%s", gaia_urls->oauth2_token_url().spec().c_str());
+
+  auto oauth_fetcher = WinHttpUrlFetcher::Create(GURL(get_oauth_token_url));
+  oauth_fetcher->SetRequestBody(get_access_token_body.c_str());
+  oauth_fetcher->SetRequestHeader("content-type",
+                                  "application/x-www-form-urlencoded");
+  oauth_fetcher->SetHttpRequestTimeout(kHttpTimeout);
+
+  std::vector<char> oauth_response;
+  HRESULT oauth_hr = oauth_fetcher->Fetch(&oauth_response);
+  if (FAILED(oauth_hr)) {
+    LOGFN(ERROR) << "oauth_fetcher.Fetch hr=" << putHR(oauth_hr);
+    return oauth_hr;
+  }
+
+  std::string oauth_response_json_string =
+      std::string(oauth_response.begin(), oauth_response.end());
+  *access_token = SearchForKeyInStringDictUTF8(oauth_response_json_string,
+                                               {kKeyAccessToken});
+  if (access_token->empty()) {
+    LOGFN(ERROR) << "Fetched access token with new scopes is empty.";
+    return E_FAIL;
+  }
+  return S_OK;
+}
+
+// Find an AD account associated with GCPW user if one exists.
+// (1) Verifies if the gaia user has a corresponding mapping in Google
+//   Admin SDK Users Directory and contains the custom_schema that contains
+//   the ad_upn or local_user_name for the corresponding user.
+// (2) If there is an entry in cloud directory, gcpw would search for the SID
+//   corresponding to that user entry on the device.
+// (3) If a SID is found, then it would log the user onto the device using
+//   username extracted from Google Admin SDK Users Directory and password
+//   being the same as the gaia entity.
+// (4) If there is no entry found in cloud directory, gcpw would fallback to
+//   attempting creation of a new user on the device.
+//
+// Below are the failure scenarios :
+// (1) If an invalid upn is set in the custom attributes, the login would fail.
+// (2) If an attempt to find SID from domain controller failed, then we fail
+//     the login.
+// Note that if an empty upn is found in the custom attribute, then the login
+// would try and attempt to create local user.
+HRESULT FindAdUserSidIfAvailable(const std::string& refresh_token,
+                                 const base::string16& email,
+                                 wchar_t* sid,
+                                 const DWORD sid_length) {
+  // Step 1: Get the downscoped access token with required admin sdk scopes.
+  std::string access_token;
+  HRESULT hr = RequestDownscopedAccessToken(refresh_token, &access_token);
+
+  if (FAILED(hr)) {
+    LOGFN(ERROR) << "RequestDownscopedAccessToken hr=" << putHR(hr);
+    return hr;
+  }
+
+  // Step 2: Make a get call to admin sdk using the fetched access_token and
+  // retrieve the ad_upn.
+  std::string ad_upn;
+  hr = GetAdUpnFromCloudDirectory(email, access_token, &ad_upn);
+  if (FAILED(hr)) {
+    LOGFN(ERROR) << "GetAdUpnFromCloudDirectory hr=" << putHR(hr);
+    return hr;
+  }
+
+  base::string16 ad_domain;
+  base::string16 ad_user;
+  if (ad_upn.empty()) {
+    LOGFN(INFO) << "Found empty ad_upn in cloud directory. Fall back to "
+                   "creating local account";
+    return S_FALSE;
+  }
+
+  // The format for ad_upn custom attribute is domainName/userName.
+  const base::char16 kSlashDelimiter[] = STRING16_LITERAL("/");
+  std::vector<base::string16> tokens =
+      base::SplitString(base::UTF8ToUTF16(ad_upn), kSlashDelimiter,
+                        base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
+
+  // Values fetched from custom attribute shouldn't be empty.
+  if (tokens.size() != 2) {
+    LOGFN(ERROR) << "Found unparseable ad_upn in cloud directory : " << ad_upn;
+    return E_FAIL;
+  }
+
+  ad_domain = tokens.at(0);
+  ad_user = tokens.at(1);
+
+  OSUserManager* os_user_manager = OSUserManager::Get();
+  DCHECK(os_user_manager);
+  base::string16 existing_sid = base::string16();
+
+  LOGFN(INFO) << "Get user sid for user " << ad_user << " and domain name "
+              << ad_domain;
+  hr = os_user_manager->GetUserSID(ad_domain.c_str(), ad_user.c_str(),
+                                   &existing_sid);
+  LOGFN(INFO) << "GetUserSID result=" << hr;
+
+  if (existing_sid.length() > 0) {
+    LOGFN(INFO) << "Found existing SID = " << existing_sid;
+    wcscpy_s(sid, sid_length, existing_sid.c_str());
+    return S_OK;
+  } else {
+    LOGFN(ERROR) << "No existing sid found with UPN : " << ad_upn;
+    return E_FAIL;
+  }
+}
+
 // Tries to find a user associated to the gaia_id stored in |result| under the
 // key |kKeyId|. If one exists, then this function will fill out |gaia_id|,
 // |username|, |domain| and |sid| with the user's information. If not this
@@ -83,15 +276,15 @@
 // since only local users can be created. |sid| will be empty until the user is
 // created later on. |is_consumer_account| will be set to true if the email used
 // to sign in is gmail or googlemail.
-void MakeUsernameForAccount(const base::Value& result,
-                            base::string16* gaia_id,
-                            wchar_t* username,
-                            DWORD username_length,
-                            wchar_t* domain,
-                            DWORD domain_length,
-                            wchar_t* sid,
-                            DWORD sid_length,
-                            bool* is_consumer_account) {
+HRESULT MakeUsernameForAccount(const base::Value& result,
+                               base::string16* gaia_id,
+                               wchar_t* username,
+                               DWORD username_length,
+                               wchar_t* domain,
+                               DWORD domain_length,
+                               wchar_t* sid,
+                               DWORD sid_length,
+                               bool* is_consumer_account) {
   DCHECK(gaia_id);
   DCHECK(username);
   DCHECK(domain);
@@ -108,15 +301,44 @@
   *is_consumer_account = consumer_domain_pos != base::string16::npos;
 
   *gaia_id = GetDictString(result, kKeyId);
+
   // First try to detect if this gaia account has been used to create an OS
   // user already.  If so, return the OS username of that user.
   HRESULT hr = GetSidFromId(*gaia_id, sid, sid_length);
+
+  bool has_existing_user_sid = false;
+  // Check if the machine is domain joined and get the domain name if domain
+  // joined.
   if (SUCCEEDED(hr)) {
-    hr = OSUserManager::Get()->FindUserBySID(sid, username, username_length,
-                                             domain, domain_length);
-    if (SUCCEEDED(hr))
-      return;
+    // This makes sure that we don't invoke the network calls on every login
+    // attempt and instead fallback to the SID to gaia id mapping created by
+    // GCPW.
+    LOGFN(INFO) << "Found existing SID created in GCPW registry entry = "
+                << sid;
+    has_existing_user_sid = true;
+  } else if (EnableAdToGoogleAssociation() &&
+             OSUserManager::Get()->IsDeviceDomainJoined()) {
+    LOGFN(INFO) << "No existing SID found in the GCPW registry.";
+
+    std::string refresh_token = GetDictStringUTF8(result, kKeyRefreshToken);
+    hr = FindAdUserSidIfAvailable(refresh_token, email, sid, sid_length);
+    if (FAILED(hr)) {
+      LOGFN(ERROR) << "FindAdUserSidIfAvailable hr=" << putHR(hr);
+      return hr;
+    } else if (hr == S_OK) {
+      has_existing_user_sid = true;
+    }
+  } else {
+    LOGFN(INFO) << "Falling back to creation of new user";
   }
+
+  if (has_existing_user_sid) {
+    HRESULT hr = OSUserManager::Get()->FindUserBySID(
+        sid, username, username_length, domain, domain_length);
+    if (SUCCEEDED(hr))
+      return hr;
+  }
+
   LOGFN(INFO) << "No existing user found associated to gaia id:" << *gaia_id;
   wcscpy_s(domain, domain_length, OSUserManager::GetLocalDomain().c_str());
   username[0] = 0;
@@ -162,9 +384,11 @@
   }
 
   wcscpy_s(username, username_length, os_username.c_str());
+
+  return S_OK;
 }
 
-// Waits for the login UI to completes and returns the result of the operation.
+// Waits for the login UI to complete and returns the result of the operation.
 // This function returns S_OK on success, E_UNEXPECTED on failure, and E_ABORT
 // if the user aborted or timed out (or was killed during cleanup).
 HRESULT WaitForLoginUIAndGetResult(
@@ -1657,10 +1881,18 @@
   wchar_t found_sid[kWindowsSidBufferLength];
   bool is_consumer_account = false;
   base::string16 gaia_id;
-  MakeUsernameForAccount(result, &gaia_id, found_username,
-                         base::size(found_username), found_domain,
-                         base::size(found_domain), found_sid,
-                         base::size(found_sid), &is_consumer_account);
+  HRESULT hr = MakeUsernameForAccount(
+      result, &gaia_id, found_username, base::size(found_username),
+      found_domain, base::size(found_domain), found_sid, base::size(found_sid),
+      &is_consumer_account);
+
+  if (FAILED(hr)) {
+    LOGFN(ERROR) << "MakeUsernameForAccount hr=" << putHR(hr);
+    // TODO(crbug.com/976406): Set the error text appropriate messages
+    // instead of falling back to IDS_INTERNAL_ERROR_BASE.
+    *error_text = AllocErrorString(IDS_INTERNAL_ERROR_BASE);
+    return hr;
+  }
 
   // Disallow consumer accounts when mdm enrollment is enabled and the global
   // flag to allow consumer accounts is not set.
@@ -1679,8 +1911,8 @@
   // If an existing user associated to the gaia id was found, make sure that it
   // is valid for this credential.
   if (found_sid[0]) {
-    HRESULT hr = ValidateExistingUser(found_username, found_domain, found_sid,
-                                      error_text);
+    hr = ValidateExistingUser(found_username, found_domain, found_sid,
+                              error_text);
 
     if (FAILED(hr)) {
       LOGFN(ERROR) << "ValidateExistingUser hr=" << putHR(hr);
@@ -1716,7 +1948,7 @@
   base::string16 local_password = GetDictString(result, kKeyPassword);
   base::string16 local_fullname = GetDictString(result, kKeyFullname);
   base::string16 comment(GetStringResource(IDS_USER_ACCOUNT_COMMENT_BASE));
-  HRESULT hr = CreateNewUser(
+  hr = CreateNewUser(
       OSUserManager::Get(), found_username, local_password.c_str(),
       local_fullname.c_str(), comment.c_str(),
       /*add_to_users_group=*/true, kMaxUsernameAttempts, username, sid);
diff --git a/chrome/credential_provider/gaiacp/gaia_credential_base_unittests.cc b/chrome/credential_provider/gaiacp/gaia_credential_base_unittests.cc
index dbec687..404858d 100644
--- a/chrome/credential_provider/gaiacp/gaia_credential_base_unittests.cc
+++ b/chrome/credential_provider/gaiacp/gaia_credential_base_unittests.cc
@@ -6,6 +6,7 @@
 
 #include <sddl.h>  // For ConvertSidToStringSid()
 
+#include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/credential_provider/common/gcp_strings.h"
 #include "chrome/credential_provider/gaiacp/gaia_credential_base.h"
@@ -15,6 +16,8 @@
 #include "chrome/credential_provider/gaiacp/reg_utils.h"
 #include "chrome/credential_provider/test/gls_runner_test_base.h"
 #include "chrome/credential_provider/test/test_credential.h"
+#include "google_apis/gaia/gaia_urls.h"
+#include "net/base/escape.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace credential_provider {
@@ -822,6 +825,287 @@
   EXPECT_EQ(test->GetFinalEmail(), email);
 }
 
+/** Test various active directory sign in scenarios. */
+
+class GcpGaiaCredentialBaseAdScenariosTest : public GcpGaiaCredentialBaseTest {
+ protected:
+  void SetUp() override;
+
+  // Create provider and start logon.
+  CComPtr<ICredentialProviderCredential> cred_;
+  // The admin sdk users directory get URL.
+  std::string get_cd_user_url_ = base::StringPrintf(
+      "https://www.googleapis.com/admin/directory/v1/users/"
+      "%s?projection=full&viewType=domain_public",
+      net::EscapeUrlEncodedData(kDefaultEmail, true).c_str());
+  GaiaUrls* gaia_urls_ = GaiaUrls::GetInstance();
+};
+
+void GcpGaiaCredentialBaseAdScenariosTest::SetUp() {
+  GcpGaiaCredentialBaseTest::SetUp();
+
+  // Set the device as a domain joined machine.
+  fake_os_user_manager()->SetIsDeviceDomainJoined(true);
+
+  // Override registry to enable AD association with google.
+  constexpr wchar_t kRegEnableADAssociation[] = L"enable_ad_association";
+  ASSERT_EQ(S_OK, SetGlobalFlagForTesting(kRegEnableADAssociation, 1));
+
+  ASSERT_EQ(S_OK, InitializeProviderAndGetCredential(0, &cred_));
+}
+
+// Fetching downscoped access token required for calling admin sdk failed.
+// The login attempt would fail in this scenario.
+TEST_F(GcpGaiaCredentialBaseAdScenariosTest,
+       GetSerialization_WithAD_CallToFetchDownscopedAccessTokenFailed) {
+  // Attempt to fetch the token from gaia fails.
+  fake_http_url_fetcher_factory()->SetFakeFailedResponse(
+      GURL(gaia_urls_->oauth2_token_url().spec().c_str()), E_FAIL);
+
+  CComPtr<ITestCredential> test;
+  ASSERT_EQ(S_OK, cred_.QueryInterface(&test));
+
+  ASSERT_EQ(S_OK, StartLogonProcessAndWait());
+
+  ASSERT_TRUE(base::size(test->GetFinalEmail()) == 0);
+
+  // Make sure no user was created and the login attempt failed.
+  PSID sid = nullptr;
+  EXPECT_EQ(
+      HRESULT_FROM_WIN32(NERR_UserNotFound),
+      fake_os_user_manager()->GetUserSID(
+          OSUserManager::GetLocalDomain().c_str(), kDefaultUsername, &sid));
+  ASSERT_EQ(nullptr, sid);
+
+  // No new user is created.
+  EXPECT_EQ(1ul, fake_os_user_manager()->GetUserCount());
+
+  // TODO(crbug.com/976406): Set the error message appropriately for failure
+  // scenarios.
+  ASSERT_EQ(S_OK, FinishLogonProcess(
+                      /*expected_success=*/false,
+                      /*expected_credentials_change_fired=*/false,
+                      IDS_INTERNAL_ERROR_BASE));
+}
+
+// Empty access token returned.
+TEST_F(GcpGaiaCredentialBaseAdScenariosTest,
+       GetSerialization_WithAD_EmptyAccessTokenReturned) {
+  // Set token result to not contain any access token.
+  fake_http_url_fetcher_factory()->SetFakeResponse(
+      GURL(gaia_urls_->oauth2_token_url().spec().c_str()),
+      FakeWinHttpUrlFetcher::Headers(), "{}");
+
+  CComPtr<ITestCredential> test;
+  ASSERT_EQ(S_OK, cred_.QueryInterface(&test));
+
+  ASSERT_EQ(S_OK, StartLogonProcessAndWait());
+
+  ASSERT_TRUE(base::size(test->GetFinalEmail()) == 0);
+
+  // Make sure no user was created and the login attempt failed.
+  PSID sid = nullptr;
+  EXPECT_EQ(
+      HRESULT_FROM_WIN32(NERR_UserNotFound),
+      fake_os_user_manager()->GetUserSID(
+          OSUserManager::GetLocalDomain().c_str(), kDefaultUsername, &sid));
+  ASSERT_EQ(nullptr, sid);
+
+  // No new user is created.
+  EXPECT_EQ(1ul, fake_os_user_manager()->GetUserCount());
+
+  ASSERT_EQ(S_OK, FinishLogonProcess(
+                      /*expected_success=*/false,
+                      /*expected_credentials_change_fired=*/false,
+                      IDS_INTERNAL_ERROR_BASE));
+}
+
+// Empty AD UPN entry is returned via admin sdk.
+TEST_F(GcpGaiaCredentialBaseAdScenariosTest,
+       GetSerialization_WithAD_NoAdUpnFoundFromAdminSdk) {
+  // Set token result a valid access token.
+  fake_http_url_fetcher_factory()->SetFakeResponse(
+      GURL(gaia_urls_->oauth2_token_url().spec().c_str()),
+      FakeWinHttpUrlFetcher::Headers(), "{\"access_token\": \"dummy_token\"}");
+
+  // Set empty response from admin sdk.
+  fake_http_url_fetcher_factory()->SetFakeResponse(
+      GURL(get_cd_user_url_.c_str()), FakeWinHttpUrlFetcher::Headers(), "{}");
+
+  CComPtr<ITestCredential> test;
+  ASSERT_EQ(S_OK, cred_.QueryInterface(&test));
+
+  ASSERT_EQ(S_OK, StartLogonProcessAndWait());
+
+  EXPECT_EQ(test->GetFinalEmail(), kDefaultEmail);
+
+  // Make sure a "foo" user was created.
+  PSID sid;
+  EXPECT_EQ(S_OK, fake_os_user_manager()->GetUserSID(
+                      OSUserManager::GetLocalDomain().c_str(), kDefaultUsername,
+                      &sid));
+  ::LocalFree(sid);
+
+  // New user should be created.
+  EXPECT_EQ(2ul, fake_os_user_manager()->GetUserCount());
+}
+
+// Call to the admin sdk to fetch the AD UPN failed.
+TEST_F(GcpGaiaCredentialBaseAdScenariosTest,
+       GetSerialization_WithAD_CallToAdminSdkFailed) {
+  // Set token result a valid access token.
+  fake_http_url_fetcher_factory()->SetFakeResponse(
+      GURL(gaia_urls_->oauth2_token_url().spec().c_str()),
+      FakeWinHttpUrlFetcher::Headers(), "{\"access_token\": \"dummy_token\"}");
+
+  // Fail the call from admin sdk.
+  fake_http_url_fetcher_factory()->SetFakeFailedResponse(
+      GURL(get_cd_user_url_.c_str()), E_FAIL);
+
+  CComPtr<ITestCredential> test;
+  ASSERT_EQ(S_OK, cred_.QueryInterface(&test));
+
+  ASSERT_EQ(S_OK, StartLogonProcessAndWait());
+
+  ASSERT_TRUE(base::size(test->GetFinalEmail()) == 0);
+
+  // Make sure no user was created and the login attempt failed.
+  PSID sid = nullptr;
+  EXPECT_EQ(
+      HRESULT_FROM_WIN32(NERR_UserNotFound),
+      fake_os_user_manager()->GetUserSID(
+          OSUserManager::GetLocalDomain().c_str(), kDefaultUsername, &sid));
+  ASSERT_EQ(nullptr, sid);
+
+  // No new user is created.
+  EXPECT_EQ(1ul, fake_os_user_manager()->GetUserCount());
+
+  ASSERT_EQ(S_OK, FinishLogonProcess(
+                      /*expected_success=*/false,
+                      /*expected_credentials_change_fired=*/false,
+                      IDS_INTERNAL_ERROR_BASE));
+}
+
+// Customer configured invalid ad upn.
+TEST_F(GcpGaiaCredentialBaseAdScenariosTest,
+       GetSerialization_WithAD_InvalidADUPNConfigured) {
+  // Add the user as a domain joined user.
+  const wchar_t user_name[] = L"ad_user";
+  const wchar_t domain_name[] = L"ad_domain";
+  const wchar_t password[] = L"password";
+
+  CComBSTR ad_sid;
+  DWORD error;
+  HRESULT add_domain_user_hr = fake_os_user_manager()->AddUser(
+      user_name, password, L"fullname", L"comment", true, domain_name, &ad_sid,
+      &error);
+  ASSERT_EQ(S_OK, add_domain_user_hr);
+  ASSERT_EQ(0u, error);
+
+  // Set token result a valid access token.
+  fake_http_url_fetcher_factory()->SetFakeResponse(
+      GURL(gaia_urls_->oauth2_token_url().spec().c_str()),
+      FakeWinHttpUrlFetcher::Headers(), "{\"access_token\": \"dummy_token\"}");
+
+  // Invalid configuration in admin sdk. Don't set the username.
+  std::string admin_sdk_response = base::StringPrintf(
+      "{\"customSchemas\": {\"employeeData\": {\"ad_upn\":"
+      " \"%ls/\"}}}",
+      domain_name);
+  fake_http_url_fetcher_factory()->SetFakeResponse(
+      GURL(get_cd_user_url_.c_str()), FakeWinHttpUrlFetcher::Headers(),
+      admin_sdk_response);
+
+  CComPtr<ITestCredential> test;
+  ASSERT_EQ(S_OK, cred_.QueryInterface(&test));
+
+  ASSERT_EQ(S_OK, StartLogonProcessAndWait());
+
+  ASSERT_TRUE(base::size(test->GetFinalEmail()) == 0);
+
+  // Make sure no user was created and the login attempt failed.
+  PSID sid = nullptr;
+  EXPECT_EQ(
+      HRESULT_FROM_WIN32(NERR_UserNotFound),
+      fake_os_user_manager()->GetUserSID(
+          OSUserManager::GetLocalDomain().c_str(), kDefaultUsername, &sid));
+  ASSERT_EQ(nullptr, sid);
+
+  // No new user is created.
+  EXPECT_EQ(2ul, fake_os_user_manager()->GetUserCount());
+
+  ASSERT_EQ(S_OK, FinishLogonProcess(
+                      /*expected_success=*/false,
+                      /*expected_credentials_change_fired=*/false,
+                      IDS_INTERNAL_ERROR_BASE));
+}
+
+// This is the success scenario where all preconditions are met in the
+// AD login scenario. The user is successfully logged in.
+TEST_F(GcpGaiaCredentialBaseAdScenariosTest,
+       GetSerialization_WithADSuccessScenario) {
+  // Add the user as a domain joined user.
+  const wchar_t user_name[] = L"ad_user";
+  const wchar_t domain_name[] = L"ad_domain";
+  const wchar_t password[] = L"password";
+
+  CComBSTR ad_sid;
+  DWORD error;
+  HRESULT add_domain_user_hr = fake_os_user_manager()->AddUser(
+      user_name, password, L"fullname", L"comment", true, domain_name, &ad_sid,
+      &error);
+  ASSERT_EQ(S_OK, add_domain_user_hr);
+  ASSERT_EQ(0u, error);
+
+  // Set token result as a valid access token.
+  fake_http_url_fetcher_factory()->SetFakeResponse(
+      GURL(gaia_urls_->oauth2_token_url().spec().c_str()),
+      FakeWinHttpUrlFetcher::Headers(), "{\"access_token\": \"dummy_token\"}");
+
+  // Set valid response from admin sdk.
+  std::string admin_sdk_response = base::StringPrintf(
+      "{\"customSchemas\": {\"employeeData\": {\"ad_upn\":"
+      " \"%ls/%ls\"}}}",
+      domain_name, user_name);
+  fake_http_url_fetcher_factory()->SetFakeResponse(
+      GURL(get_cd_user_url_.c_str()), FakeWinHttpUrlFetcher::Headers(),
+      admin_sdk_response);
+
+  CComPtr<ITestCredential> test;
+  ASSERT_EQ(S_OK, cred_.QueryInterface(&test));
+
+  ASSERT_EQ(S_OK, StartLogonProcessAndWait());
+
+  EXPECT_EQ(test->GetFinalEmail(), kDefaultEmail);
+
+  // Make sure no user was created and the login happens on the
+  // existing user instead.
+  PSID sid = nullptr;
+  EXPECT_EQ(
+      HRESULT_FROM_WIN32(NERR_UserNotFound),
+      fake_os_user_manager()->GetUserSID(
+          OSUserManager::GetLocalDomain().c_str(), kDefaultUsername, &sid));
+  ASSERT_EQ(nullptr, sid);
+
+  // Finishing logon process should trigger credential changed and trigger
+  // GetSerialization.
+  ASSERT_EQ(S_OK, FinishLogonProcess(true, true, 0));
+
+  // Verify that the registry entry for the user was created.
+  wchar_t gaia_id[256];
+  ULONG length = base::size(gaia_id);
+  std::wstring sid_str(ad_sid, SysStringLen(ad_sid));
+  ::SysFreeString(ad_sid);
+
+  HRESULT gaia_id_hr =
+      GetUserProperty(sid_str.c_str(), kUserId, gaia_id, &length);
+  ASSERT_EQ(S_OK, gaia_id_hr);
+  ASSERT_TRUE(gaia_id[0]);
+
+  // Verify that the authentication results dictionary is now empty.
+  ASSERT_TRUE(test->IsAuthenticationResultsEmpty());
+}
+
 // Tests various sign in scenarios with consumer and non-consumer domains.
 // Parameters are:
 // 1. Is mdm enrollment enabled.
diff --git a/chrome/credential_provider/gaiacp/gcp_utils.cc b/chrome/credential_provider/gaiacp/gcp_utils.cc
index a5d0b618..c43b0ca 100644
--- a/chrome/credential_provider/gaiacp/gcp_utils.cc
+++ b/chrome/credential_provider/gaiacp/gcp_utils.cc
@@ -29,10 +29,12 @@
 #include "base/files/file.h"
 #include "base/files/file_enumerator.h"
 #include "base/files/file_util.h"
+#include "base/json/json_reader.h"
 #include "base/macros.h"
 #include "base/no_destructor.h"
 #include "base/path_service.h"
 #include "base/stl_util.h"
+#include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/win/current_module.h"
@@ -727,6 +729,22 @@
     ::RtlSecureZeroMemory(buffer, length);
 }
 
+std::string SearchForKeyInStringDictUTF8(
+    const std::string& json_string,
+    const std::initializer_list<base::StringPiece>& path) {
+  DCHECK(path.size() > 0);
+
+  base::Optional<base::Value> json_obj =
+      base::JSONReader::Read(json_string, base::JSON_ALLOW_TRAILING_COMMAS);
+  if (!json_obj || !json_obj->is_dict()) {
+    LOGFN(ERROR) << "base::JSONReader::Read failed to translate to JSON";
+    return std::string();
+  }
+  const std::string* value =
+      json_obj->FindStringPath(base::JoinString(path, "."));
+  return value ? *value : std::string();
+}
+
 base::string16 GetDictString(const base::Value& dict, const char* name) {
   DCHECK(name);
   DCHECK(dict.is_dict());
diff --git a/chrome/credential_provider/gaiacp/gcp_utils.h b/chrome/credential_provider/gaiacp/gcp_utils.h
index 8689f2c..1958cbcc 100644
--- a/chrome/credential_provider/gaiacp/gcp_utils.h
+++ b/chrome/credential_provider/gaiacp/gcp_utils.h
@@ -232,9 +232,18 @@
 
 // Helpers to get strings from base::Values that are expected to be
 // DictionaryValues.
+
 base::string16 GetDictString(const base::Value& dict, const char* name);
 base::string16 GetDictString(const std::unique_ptr<base::Value>& dict,
                              const char* name);
+// Perform a recursive search on a nested dictionary object. Note that the
+// names provided in the input should be in order. Below is an example : Lets
+// say the json object is {"key1": {"key2": {"key3": "value1"}}, "key4":
+// "value2"}. Then to search for the key "key3", this method should be called
+// by providing the names vector as {"key1", "key2", "key3"}.
+std::string SearchForKeyInStringDictUTF8(
+    const std::string& json_string,
+    const std::initializer_list<base::StringPiece>& path);
 std::string GetDictStringUTF8(const base::Value& dict, const char* name);
 std::string GetDictStringUTF8(const std::unique_ptr<base::Value>& dict,
                               const char* name);
diff --git a/chrome/credential_provider/gaiacp/os_user_manager.cc b/chrome/credential_provider/gaiacp/os_user_manager.cc
index 80e0299..ed45672 100644
--- a/chrome/credential_provider/gaiacp/os_user_manager.cc
+++ b/chrome/credential_provider/gaiacp/os_user_manager.cc
@@ -73,6 +73,11 @@
 }
 
 // static
+bool OSUserManager::IsDeviceDomainJoined() {
+  return base::win::IsEnrolledToDomain();
+}
+
+// static
 base::string16 OSUserManager::GetLocalDomain() {
   // If the domain is the current computer, then there is no domain controller.
   wchar_t computer_name[MAX_COMPUTERNAME_LENGTH + 1];
diff --git a/chrome/credential_provider/gaiacp/os_user_manager.h b/chrome/credential_provider/gaiacp/os_user_manager.h
index ff982534..4376cd8 100644
--- a/chrome/credential_provider/gaiacp/os_user_manager.h
+++ b/chrome/credential_provider/gaiacp/os_user_manager.h
@@ -99,6 +99,9 @@
   // to another.
   static void SetInstanceForTesting(OSUserManager* instance);
 
+  // Checks if the device is domain joined.
+  virtual bool IsDeviceDomainJoined();
+
  protected:
   OSUserManager() {}
 
diff --git a/chrome/credential_provider/gaiacp/win_http_url_fetcher.cc b/chrome/credential_provider/gaiacp/win_http_url_fetcher.cc
index d5eca95e..26f6e22 100644
--- a/chrome/credential_provider/gaiacp/win_http_url_fetcher.cc
+++ b/chrome/credential_provider/gaiacp/win_http_url_fetcher.cc
@@ -69,6 +69,12 @@
   return S_OK;
 }
 
+HRESULT WinHttpUrlFetcher::SetHttpRequestTimeout(const int timeout_in_millis) {
+  DCHECK(timeout_in_millis);
+  timeout_in_millis_ = timeout_in_millis;
+  return S_OK;
+}
+
 HRESULT WinHttpUrlFetcher::Fetch(std::vector<char>* response) {
   USES_CONVERSION;
   DCHECK(response);
@@ -94,6 +100,19 @@
   }
 
   {
+    // Set timeout if specified.
+    if (timeout_in_millis_ != 0) {
+      if (!::WinHttpSetTimeouts(session_.Get(), timeout_in_millis_,
+                                timeout_in_millis_, timeout_in_millis_,
+                                timeout_in_millis_)) {
+        HRESULT hr = HRESULT_FROM_WIN32(::GetLastError());
+        LOGFN(ERROR) << "WinHttpSetTimeouts hr=" << putHR(hr);
+        return hr;
+      }
+    }
+  }
+
+  {
     bool use_post = !body_.empty();
     ScopedWinHttpHandle::Handle request = ::WinHttpOpenRequest(
         connect.Get(), use_post ? L"POST" : L"GET",
diff --git a/chrome/credential_provider/gaiacp/win_http_url_fetcher.h b/chrome/credential_provider/gaiacp/win_http_url_fetcher.h
index 341f6c449..3295c2d 100644
--- a/chrome/credential_provider/gaiacp/win_http_url_fetcher.h
+++ b/chrome/credential_provider/gaiacp/win_http_url_fetcher.h
@@ -27,6 +27,7 @@
 
   virtual HRESULT SetRequestHeader(const char* name, const char* value);
   virtual HRESULT SetRequestBody(const char* body);
+  virtual HRESULT SetHttpRequestTimeout(const int timeout_in_millis);
   virtual HRESULT Fetch(std::vector<char>* response);
   virtual HRESULT Close();
 
@@ -48,6 +49,7 @@
   std::string body_;
   ScopedWinHttpHandle session_;
   ScopedWinHttpHandle request_;
+  int timeout_in_millis_ = 0;
 
   // Gets storage of the function pointer used to create instances of this
   // class for tests.
diff --git a/chrome/credential_provider/test/gcp_fakes.cc b/chrome/credential_provider/test/gcp_fakes.cc
index 91094a33..69ca05a 100644
--- a/chrome/credential_provider/test/gcp_fakes.cc
+++ b/chrome/credential_provider/test/gcp_fakes.cc
@@ -141,6 +141,7 @@
   return AddUser(username, password, fullname, comment, add_to_users_group,
                  OSUserManager::GetLocalDomain().c_str(), sid, error);
 }
+
 HRESULT FakeOSUserManager::AddUser(const wchar_t* username,
                                    const wchar_t* password,
                                    const wchar_t* fullname,
@@ -159,6 +160,11 @@
   if (should_fail_user_creation_)
     return E_FAIL;
 
+  // Username or password cannot be empty.
+  if (username == nullptr || !username[0] || password == nullptr ||
+      !password[0])
+    return E_FAIL;
+
   bool user_found = username_to_info_.count(username) > 0;
 
   if (user_found) {
@@ -271,6 +277,10 @@
   return token->IsValid() ? S_OK : HRESULT_FROM_WIN32(::GetLastError());
 }
 
+bool FakeOSUserManager::IsDeviceDomainJoined() {
+  return is_device_domain_joined_;
+}
+
 HRESULT FakeOSUserManager::GetUserSID(const wchar_t* domain,
                                       const wchar_t* username,
                                       PSID* sid) {
@@ -579,17 +589,30 @@
       Response(headers, response, send_response_event_handle);
 }
 
+void FakeWinHttpUrlFetcherFactory::SetFakeFailedResponse(const GURL& url,
+                                                         HRESULT failed_hr) {
+  // Make sure that the HRESULT set is a failed attempt.
+  DCHECK(FAILED(failed_hr));
+  failed_http_fetch_hr_[url] = failed_hr;
+}
+
 std::unique_ptr<WinHttpUrlFetcher> FakeWinHttpUrlFetcherFactory::Create(
     const GURL& url) {
-  if (fake_responses_.count(url) == 0)
+  if (fake_responses_.count(url) == 0 && failed_http_fetch_hr_.count(url) == 0)
     return nullptr;
 
-  const Response& response = fake_responses_[url];
-
   FakeWinHttpUrlFetcher* fetcher = new FakeWinHttpUrlFetcher(std::move(url));
-  fetcher->response_headers_ = response.headers;
-  fetcher->response_ = response.response;
-  fetcher->send_response_event_handle_ = response.send_response_event_handle;
+
+  if (fake_responses_.count(url) != 0) {
+    const Response& response = fake_responses_[url];
+
+    fetcher->response_headers_ = response.headers;
+    fetcher->response_ = response.response;
+    fetcher->send_response_event_handle_ = response.send_response_event_handle;
+  } else {
+    DCHECK(failed_http_fetch_hr_.count(url) > 0);
+    fetcher->response_hr_ = failed_http_fetch_hr_[url];
+  }
   ++requests_created_;
 
   return std::unique_ptr<WinHttpUrlFetcher>(fetcher);
@@ -605,6 +628,9 @@
 }
 
 HRESULT FakeWinHttpUrlFetcher::Fetch(std::vector<char>* response) {
+  if (FAILED(response_hr_))
+    return response_hr_;
+
   if (send_response_event_handle_ != INVALID_HANDLE_VALUE)
     ::WaitForSingleObject(send_response_event_handle_, INFINITE);
 
diff --git a/chrome/credential_provider/test/gcp_fakes.h b/chrome/credential_provider/test/gcp_fakes.h
index 368d5d7..088e98b1 100644
--- a/chrome/credential_provider/test/gcp_fakes.h
+++ b/chrome/credential_provider/test/gcp_fakes.h
@@ -69,6 +69,15 @@
                   bool add_to_users_group,
                   BSTR* sid,
                   DWORD* error) override;
+  // Add a user to the OS with domain associated with it.
+  HRESULT AddUser(const wchar_t* username,
+                  const wchar_t* password,
+                  const wchar_t* fullname,
+                  const wchar_t* comment,
+                  bool add_to_users_group,
+                  const wchar_t* domain,
+                  BSTR* sid,
+                  DWORD* error);
   HRESULT ChangeUserPassword(const wchar_t* domain,
                              const wchar_t* username,
                              const wchar_t* password,
@@ -103,10 +112,16 @@
                                          const wchar_t* username,
                                          bool allow) override;
 
+  bool IsDeviceDomainJoined() override;
+
   void SetShouldFailUserCreation(bool should_fail) {
     should_fail_user_creation_ = should_fail;
   }
 
+  void SetIsDeviceDomainJoined(bool is_device_domain_joined) {
+    is_device_domain_joined_ = is_device_domain_joined;
+  }
+
   struct UserInfo {
     UserInfo(const wchar_t* domain,
              const wchar_t* password,
@@ -165,16 +180,7 @@
   DWORD next_rid_ = 0;
   std::map<base::string16, UserInfo> username_to_info_;
   bool should_fail_user_creation_ = false;
-
-  // Add a user to the OS with domain associated with it.
-  HRESULT AddUser(const wchar_t* username,
-                  const wchar_t* password,
-                  const wchar_t* fullname,
-                  const wchar_t* comment,
-                  bool add_to_users_group,
-                  const wchar_t* domain,
-                  BSTR* sid,
-                  DWORD* error);
+  bool is_device_domain_joined_ = false;
 };
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -273,6 +279,12 @@
       const WinHttpUrlFetcher::Headers& headers,
       const std::string& response,
       HANDLE send_response_event_handle = INVALID_HANDLE_VALUE);
+
+  // Sets the response as a failed http attempt. The return result
+  // from http_url_fetcher.Fetch() would be set as the input HRESULT
+  // to this method.
+  void SetFakeFailedResponse(const GURL& url, HRESULT failed_hr);
+
   size_t requests_created() const { return requests_created_; }
 
  private:
@@ -293,6 +305,7 @@
   };
 
   std::map<GURL, Response> fake_responses_;
+  std::map<GURL, HRESULT> failed_http_fetch_hr_;
   size_t requests_created_ = 0;
 };
 
@@ -316,6 +329,7 @@
   Headers response_headers_;
   std::string response_;
   HANDLE send_response_event_handle_;
+  HRESULT response_hr_ = S_OK;
 };
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.cc b/chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.cc
index d0f6fc72..0f44a18 100644
--- a/chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.cc
+++ b/chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.cc
@@ -111,6 +111,7 @@
 void ChromeExtensionsDispatcherDelegate::PopulateSourceMap(
     extensions::ResourceBundleSourceMap* source_map) {
   // Custom bindings.
+  source_map->RegisterSource("action", IDR_ACTION_CUSTOM_BINDINGS_JS);
   source_map->RegisterSource("browserAction",
                              IDR_BROWSER_ACTION_CUSTOM_BINDINGS_JS);
   source_map->RegisterSource("declarativeContent",
diff --git a/chrome/renderer/resources/extensions/action_custom_bindings.js b/chrome/renderer/resources/extensions/action_custom_bindings.js
new file mode 100644
index 0000000..f526a23f
--- /dev/null
+++ b/chrome/renderer/resources/extensions/action_custom_bindings.js
@@ -0,0 +1,18 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Custom binding for the action API.
+
+var setIcon = require('setIcon').setIcon;
+
+apiBridge.registerCustomHook(function(bindingsAPI) {
+  var apiFunctions = bindingsAPI.apiFunctions;
+
+  apiFunctions.setHandleRequest('setIcon', function(details, callback) {
+    setIcon(details, $Function.bind(function(args) {
+      bindingUtil.sendRequest('action.setIcon', [args, callback],
+                              /*options=*/undefined);
+    }, this));
+  });
+});
diff --git a/chrome/renderer/resources/renderer_resources.grd b/chrome/renderer/resources/renderer_resources.grd
index 058e668..91746f85 100644
--- a/chrome/renderer/resources/renderer_resources.grd
+++ b/chrome/renderer/resources/renderer_resources.grd
@@ -23,6 +23,7 @@
       <!-- Extension libraries. -->
       <if expr="enable_extensions">
         <!-- Custom bindings for extension APIs. -->
+        <include name="IDR_ACTION_CUSTOM_BINDINGS_JS" file="extensions\action_custom_bindings.js" type="BINDATA" />
         <include name="IDR_BROWSER_ACTION_CUSTOM_BINDINGS_JS" file="extensions\browser_action_custom_bindings.js" type="BINDATA" />
         <include name="IDR_CAST_STREAMING_RTP_STREAM_CUSTOM_BINDINGS_JS" file="extensions\cast_streaming_rtp_stream_custom_bindings.js" type="BINDATA" />
         <include name="IDR_CAST_STREAMING_SESSION_CUSTOM_BINDINGS_JS" file="extensions\cast_streaming_session_custom_bindings.js" type="BINDATA" />
diff --git a/chrome/services/isolated_xr_device/manifest.cc b/chrome/services/isolated_xr_device/manifest.cc
index b67057f..9c1deb6 100644
--- a/chrome/services/isolated_xr_device/manifest.cc
+++ b/chrome/services/isolated_xr_device/manifest.cc
@@ -14,7 +14,7 @@
   static base::NoDestructor<service_manager::Manifest> manifest{
       service_manager::ManifestBuilder()
           .WithServiceName(device::mojom::kVrIsolatedServiceName)
-          .WithDisplayName(IDS_ISOLATED_XR_PROCESS_NAME)
+          .WithDisplayName("XR Isolated Device Service")
           .WithOptions(
               service_manager::ManifestOptionsBuilder()
                   .WithExecutionMode(service_manager::Manifest::ExecutionMode::
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index c85b3c2..5171b2c5 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -471,6 +471,7 @@
       ":test_support_ui_android",
       "//chrome:chrome_android_core",
       "//chrome/android:app_hooks_java",
+      "//components/crash/android:crashpad_main",
 
       # TODO(crbug.com/961849): This is needed for ShellManager which is what
       # the ChromeBrowserTestsActivity is using to build the java UI. It's
@@ -544,7 +545,11 @@
     deps = [
       "//base:base_java",
       "//base:base_java_test_support",
+      "//build/android/buildhooks:build_hooks_android_java",
       "//chrome/android:chrome_all_java",
+      "//components/crash/android:handler_java",
+      "//components/crash/android:java",
+      "//components/module_installer/android:module_installer_impl_java",
       "//content/public/android:content_java",
       "//content/public/test/android:android_test_message_pump_support_java",
       "//content/shell/android:content_shell_browsertests_java",
@@ -2196,7 +2201,6 @@
         sources += [
           "../browser/chromeos/kiosk_next/kiosk_next_browser_factory_browsertest.cc",
           "../browser/chromeos/kiosk_next_home/kiosk_next_home_browsertest.cc",
-          "../browser/ui/ash/kiosk_next_shell_client_browsertest.cc",
         ]
       }
       sources -= [
@@ -3000,6 +3004,7 @@
     "../browser/previews/previews_lite_page_predictor_unittest.cc",
     "../browser/previews/previews_lite_page_url_loader_interceptor_unittest.cc",
     "../browser/previews/previews_offline_helper_unittest.cc",
+    "../browser/previews/previews_prober_unittest.cc",
     "../browser/previews/previews_service_unittest.cc",
     "../browser/previews/previews_top_host_provider_impl_unittest.cc",
     "../browser/previews/previews_ui_tab_helper_unittest.cc",
@@ -3008,7 +3013,6 @@
     "../browser/profiles/guest_mode_policy_handler_unittest.cc",
     "../browser/profiles/incognito_mode_policy_handler_unittest.cc",
     "../browser/profiles/profile_attributes_storage_unittest.cc",
-    "../browser/profiles/profile_avatar_icon_util_unittest.cc",
     "../browser/profiles/profile_downloader_unittest.cc",
     "../browser/profiles/profile_info_cache_unittest.cc",
     "../browser/profiles/profile_info_cache_unittest.h",
@@ -3129,7 +3133,6 @@
     "../common/crash_keys_unittest.cc",
     "../common/heap_profiler_controller_unittest.cc",
     "../common/ini_parser_unittest.cc",
-    "../common/mac/cfbundle_blocker_unittest.mm",
     "../common/mac/mock_launchd.h",
     "../common/mac/mock_launchd.mm",
     "../common/mac/staging_watcher_unittest.mm",
@@ -3202,6 +3205,7 @@
       # CRLSets are not supported on Android or iOS, but available on all other
       # platforms.
       "../browser/component_updater/crl_set_component_installer_unittest.cc",
+      "../browser/profiles/profile_avatar_icon_util_unittest.cc",
       "../browser/ui/autofill/payments/autofill_dialog_models_unittest.cc",
       "../browser/ui/bookmarks/bookmark_editor_unittest.cc",
       "../browser/ui/bookmarks/bookmark_ui_utils_desktop_unittest.cc",
diff --git a/chrome/test/android/browsertests_apk/AndroidManifest.xml.jinja2 b/chrome/test/android/browsertests_apk/AndroidManifest.xml.jinja2
index 1af39f6..2c15484 100644
--- a/chrome/test/android/browsertests_apk/AndroidManifest.xml.jinja2
+++ b/chrome/test/android/browsertests_apk/AndroidManifest.xml.jinja2
@@ -7,15 +7,19 @@
  -->
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
     package="org.chromium.android_browsertests_apk">
 
     <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="23" />
+    <uses-feature android:glEsVersion="0x00020000" />
+
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
     <uses-permission android:name="android.permission.CAMERA" />
     <uses-permission android:name="android.permission.INTERNET"/>
     <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
     <uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
+    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
     <uses-permission android:name="android.permission.RECORD_AUDIO"/>
     <uses-permission android:name="android.permission.VIBRATE"/>
     <uses-permission android:name="android.permission.WAKE_LOCK"/>
@@ -25,7 +29,7 @@
             android:label="ChromeBrowserTests">
         <activity android:name="ChromeBrowserTestsActivity"
                   android:launchMode="singleTask"
-                  android:theme="@android:style/Theme.Holo.Light.NoActionBar"
+                  android:theme="@style/Theme.Chromium.TabbedMode"
                   android:configChanges="orientation|keyboardHidden|keyboard|screenSize"
                   android:hardwareAccelerated="true"
                   android:process=":test_process">
@@ -34,8 +38,61 @@
                 <category android:name="android.intent.category.LAUNCHER"/>
             </intent-filter>
         </activity>
-        <!-- The following service entries exist in order to allow us to
-             start more than one sandboxed process. -->
+
+        <activity android:name="org.chromium.chrome.browser.media.MediaLauncherActivity"
+                  android:theme="@android:style/Theme.NoDisplay"
+                  android:excludeFromRecents="true"
+                  android:exported="true"
+                  android:enabled="false"><!-- This will be selectively enabled at runtime. -->
+          <intent-filter tools:ignore="AppLinkUrlError">
+            <action android:name="android.intent.action.VIEW" />
+            <category android:name="android.intent.category.DEFAULT" />
+            <!-- TODO(https://crbug.com/800875): Limit these to
+                 supported MIME types. -->
+            <data android:mimeType="image/*" />
+            <data android:mimeType="video/*" />
+            <data android:scheme="file" />
+            <data android:scheme="content" />
+          </intent-filter>
+        </activity>
+        <activity-alias android:name="org.chromium.chrome.browser.media.AudioLauncherActivity"
+                        android:targetActivity="org.chromium.chrome.browser.media.MediaLauncherActivity"
+                        android:theme="@android:style/Theme.NoDisplay"
+                        android:excludeFromRecents="true"
+                        android:exported="true"
+                        android:enabled="false"><!-- This will be selectively enabled at runtime. -->
+          <intent-filter tools:ignore="AppLinkUrlError">
+            <action android:name="android.intent.action.VIEW" />
+            <category android:name="android.intent.category.DEFAULT" />
+            <!-- TODO(https://crbug.com/800875): Limit these to supported MIME types. -->
+            <data android:mimeType="audio/*" />
+            <data android:scheme="file" />
+            <data android:scheme="content" />
+          </intent-filter>
+        </activity-alias>
+
+        <activity android:name="org.chromium.chrome.browser.incognito.IncognitoTabLauncher"
+                  android:theme="@android:style/Theme.NoDisplay"
+                  android:taskAffinity=""
+                  android:enabled="false"
+                  android:excludeFromRecents="true"
+                  android:exported="true">
+          <intent-filter>
+            <action android:name="org.chromium.chrome.browser.incognito.OPEN_PRIVATE_TAB" />
+            <category android:name="android.intent.category.DEFAULT" />
+          </intent-filter>
+        </activity>
+
+        <service android:name="org.chromium.components.background_task_scheduler.BackgroundTaskJobService"
+                 android:exported="false"
+                 android:permission="android.permission.BIND_JOB_SERVICE"/>
+
+        <service android:name="org.chromium.chrome.browser.crash.ChromeMinidumpUploadJobService"
+                 android:permission="android.permission.BIND_JOB_SERVICE"
+                 android:exported="false"/>
+
+        <!-- The following service entries exist in order to allow us
+             to start more than one sandboxed process. -->
 
         <!-- NOTE: If you change the values of "android:process" for any of the below services,
              you also need to update kHelperProcessExecutableName in chrome_constants.cc. -->
diff --git a/chrome/test/android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsActivity.java b/chrome/test/android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsActivity.java
index e598bf6..87281dd 100644
--- a/chrome/test/android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsActivity.java
+++ b/chrome/test/android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsActivity.java
@@ -4,135 +4,76 @@
 
 package org.chromium.android_browsertests_apk;
 
-import android.os.Bundle;
-import android.view.Window;
-import android.view.WindowManager;
+import android.content.Intent;
 
-import org.chromium.base.Log;
-import org.chromium.base.StrictModeContext;
-import org.chromium.base.ThreadUtils;
-import org.chromium.base.library_loader.LibraryLoader;
 import org.chromium.base.library_loader.LibraryProcessType;
-import org.chromium.base.library_loader.ProcessInitException;
 import org.chromium.base.test.util.UrlUtils;
-import org.chromium.chrome.browser.init.BrowserParts;
-import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
-import org.chromium.chrome.browser.init.EmptyBrowserParts;
+import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.content_public.browser.BrowserStartupController;
 import org.chromium.native_test.NativeBrowserTest;
-import org.chromium.native_test.NativeBrowserTestActivity;
+import org.chromium.native_test.NativeTest;
 
 import java.io.File;
 
 /**
  * Android activity for running chrome browser tests.
  */
-public class ChromeBrowserTestsActivity extends NativeBrowserTestActivity {
+public class ChromeBrowserTestsActivity extends ChromeTabbedActivity {
     private static final String TAG = "cr_browser_test";
 
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        appendCommandLineFlags(
-                "--remote-debugging-socket-name android_browsertests_devtools_remote");
-    }
+    private NativeTest mTest = new NativeTest();
 
     @Override
-    protected void initializeBrowserProcess() {
-        // TODO(ajwong): This is forked from ContentShellBrowserTestActivity. Should it be pulled
-        // out into a static?
-        try (StrictModeContext unused = StrictModeContext.allowDiskReads()) {
-            LibraryLoader.getInstance().ensureInitialized(LibraryProcessType.PROCESS_BROWSER);
-        } catch (ProcessInitException e) {
-            Log.e(TAG, "Cannot load android_browsertests.", e);
-            System.exit(-1);
+    public void performPreInflationStartup() {
+        // These steps for NativeTest are usually performed in onCreate, but we can not
+        // override onCreate in this class since a super class marks it as final. The
+        // performPreInflationStartup() steps is another early step in initialization of the
+        // activity so we do that here.
+        mTest.preCreate(this);
+        super.performPreInflationStartup();
+        // Sets up the command line for tests.
+        mTest.postCreate(this);
+        // Append things we want for Android-based browser tests. C++ will also append things.
+        for (String flag : NativeBrowserTest.BROWSER_TESTS_FLAGS) {
+            mTest.appendCommandLineFlags(flag);
         }
+        mTest.appendCommandLineFlags(
+                "--remote-debugging-socket-name android_browsertests_devtools_remote");
 
-        // Don't use the production BrowserStartupController, as we want to replace it with
-        // one that doesn't actually run ContentMain(). The BrowserTestBase class does the
-        // work of ContentMain() itself once we pass control to C++ to run tests. That occurs
-        // after this current method runs.
-        // This replacement startup controller will be used when the C++ code calls into
-        // ChromeBrowserTestsActivity.handlePostNativeStartup() to modify that behaviour.
-        BrowserStartupController startupController = new BrowserStartupController() {
-            @Override
-            public void startBrowserProcessesAsync(boolean startGpuProcess,
-                    boolean startServiceManagerOnly, final StartupCallback callback) {
-                assert false; // Browser tests do a sync startup.
-            }
+        NativeBrowserTest.deletePrivateDataDirectory(getPrivateDataDirectory());
 
-            @Override
-            public void startBrowserProcessesSync(boolean singleProcess) {
-                ThreadUtils.assertOnUiThread();
-                mStartupCompleted = true;
-                // Runs the stuff that BrowserStartupController wants to do, without actually
-                // running a chrome process.
-                BrowserStartupController.get(LibraryProcessType.PROCESS_BROWSER)
-                        .initChromiumBrowserProcessForTests();
-            }
-
-            @Override
-            public boolean isStartupSuccessfullyCompleted() {
-                ThreadUtils.assertOnUiThread();
-                // Technically C++ code should call through and set this after starting the browser
-                // process but it will have done so by the time it goes through
-                // handlePostNativeStartupSynchronously() which will call
-                // startBrowserProcessesSync() in this class.
-                return mStartupCompleted;
-            }
-
-            @Override
-            public boolean isServiceManagerSuccessfullyStarted() {
-                ThreadUtils.assertOnUiThread();
-                // Technically C++ code should call through and set this after starting the service
-                // manager but it will have done so by the time it goes through
-                // handlePostNativeStartupSynchronously() which will call
-                // startBrowserProcessesSync() in this class.
-                return mStartupCompleted;
-            }
-
-            @Override
-            public void addStartupCompletedObserver(StartupCallback callback) {
-                ThreadUtils.assertOnUiThread();
-                // Pass the callback through to the "real" BrowserStartupController because many
-                // pieces of code will do the same, and we want them all in one place. The
-                // initChromiumBrowserProcessForTests() will run them all so that none are missed.
-                BrowserStartupController.get(LibraryProcessType.PROCESS_BROWSER)
-                        .addStartupCompletedObserver(callback);
-            }
-
-            @Override
-            public void initChromiumBrowserProcessForTests() {
-                assert false;
-            }
-
-            @Override
-            public void setContentMainCallbackForTests(Runnable completionCallback) {
-                assert false;
-            }
-
-            private boolean mStartupCompleted;
-        };
-        ChromeBrowserInitializer.setBrowserStartupControllerForTesting(startupController);
-
-        // This does the pre-native stuff before handing control to C++ with runTests. Then
-        // C++ will call back through handlePostNativeStartupSynchronously() to do the
-        // post-native startup in ChromeBrowserInitializer.
-        final BrowserParts parts = new EmptyBrowserParts() {};
-        ChromeBrowserInitializer.getInstance().handlePreNativeStartup(parts);
-
-        Window wind = this.getWindow();
-        wind.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
-        wind.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
-        wind.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
-
-        // TODO(danakj): Make startup async and inherit from ChromeTabbedActivity.
-        NativeBrowserTest.javaStartupTasksComplete();
-        runTests();
+        // Replace ContentMain() with running our NativeTest suite.
+        BrowserStartupController.get(LibraryProcessType.PROCESS_BROWSER)
+                .setContentMainCallbackForTests(() -> {
+                    // This jumps into C++ to set up and run the test harness. The test harness runs
+                    // ContentMain()-equivalent code, and then waits for javaStartupTasksComplete()
+                    // to be called. We delay that until finishNativeInitialization() is done which
+                    // marks the end of the startup tasks posted from C++ in ContentMain() and then
+                    // by Java in BrowserStartupControllerImpl::browserStartupComplete().
+                    mTest.postStart(this, false);
+                });
     }
 
+    /**
+     * Tests should not go through the first run process every time.
+     */
     @Override
-    protected File getPrivateDataDirectory() {
+    protected boolean requiresFirstRunToBeCompleted(Intent intent) {
+        return false;
+    }
+
+    /**
+     * This is the point at which Java initialization tasks are done and tests can be run.
+     * While mTest.postStart() runs the test harness, it waits for Java initialization
+     * tasks, and this signals that they are done.
+     */
+    @Override
+    public void finishNativeInitialization() {
+        super.finishNativeInitialization();
+        NativeBrowserTest.javaStartupTasksComplete();
+    }
+
+    private File getPrivateDataDirectory() {
         // TODO(agrieve): We should not be touching the side-loaded test data directory.
         //     https://crbug.com/617734
         return new File(UrlUtils.getIsolatedTestRoot(),
diff --git a/chrome/test/android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsApplication.java b/chrome/test/android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsApplication.java
index 0c8bb59..8cde625 100644
--- a/chrome/test/android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsApplication.java
+++ b/chrome/test/android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsApplication.java
@@ -12,11 +12,6 @@
 
 /**
  * A basic chrome.browser.tests {@link android.app.Application}.
- *
- * TODO(danakj): This class sets up some of the things that ChromeApplication
- * does but we should maybe subclass ChromeApplication or share code. There are
- * many things missing from attachBaseContext() that ChromeApplication sets up
- * and it's not clear yet if they are needed or not.
  */
 public class ChromeBrowserTestsApplication extends NativeBrowserTestApplication {
     static final String PRIVATE_DATA_DIRECTORY_SUFFIX = "chrome";
diff --git a/chrome/test/base/android/android_browser_test.cc b/chrome/test/base/android/android_browser_test.cc
index 08882b5..61b67c7 100644
--- a/chrome/test/base/android/android_browser_test.cc
+++ b/chrome/test/base/android/android_browser_test.cc
@@ -4,7 +4,8 @@
 
 #include "chrome/test/base/android/android_browser_test.h"
 
-#include "chrome/browser/android/startup_bridge.h"
+#include "chrome/browser/ui/android/tab_model/tab_model.h"
+#include "chrome/browser/ui/android/tab_model/tab_model_list.h"
 #include "chrome/test/base/test_launcher_utils.h"
 #include "content/public/test/test_utils.h"
 
@@ -27,16 +28,14 @@
 }
 
 void AndroidBrowserTest::PreRunTestOnMainThread() {
-  android_startup::HandlePostNativeStartupSynchronously();
-
-  // Pump startup related events.
-  content::RunAllPendingInMessageLoop();
 }
 
 void AndroidBrowserTest::PostRunTestOnMainThread() {
-  // Sometimes tests leave Quit tasks in the MessageLoop (for shame), so let's
-  // run all pending messages here to avoid preempting the QuitBrowsers tasks.
-  // TODO(https://crbug.com/922118): Remove this once it is no longer possible
-  // to post QuitCurrent* tasks.
+  for (size_t i = 0; i < TabModelList::size(); ++i) {
+    while (TabModelList::get(i)->GetTabCount())
+      TabModelList::get(i)->CloseTabAt(0);
+  }
+
+  // Run any shutdown events from closing tabs.
   content::RunAllPendingInMessageLoop();
 }
diff --git a/chrome/test/base/android/android_browser_test_browsertest_android.cc b/chrome/test/base/android/android_browser_test_browsertest_android.cc
index cf2b90f..51d6ad9 100644
--- a/chrome/test/base/android/android_browser_test_browsertest_android.cc
+++ b/chrome/test/base/android/android_browser_test_browsertest_android.cc
@@ -2,7 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "chrome/browser/ui/android/tab_model/tab_model.h"
+#include "chrome/browser/ui/android/tab_model/tab_model_list.h"
 #include "chrome/test/base/android/android_browser_test.h"
 #include "content/public/test/browser_test.h"
+#include "content/public/test/browser_test_utils.h"
 
-IN_PROC_BROWSER_TEST_F(AndroidBrowserTest, Smoke) {}
+IN_PROC_BROWSER_TEST_F(AndroidBrowserTest, Smoke) {
+  ASSERT_EQ(TabModelList::size(), 1u);
+
+  // Grab a tab an navigate its contents
+  TabModel* tab_model = TabModelList::get(0);
+  EXPECT_TRUE(content::NavigateToURL(tab_model->GetActiveWebContents(),
+                                     GURL("about:blank")));
+}
diff --git a/chrome/test/data/extensions/api_test/icon_rgb_0_0_255.png b/chrome/test/data/extensions/api_test/icon_rgb_0_0_255.png
new file mode 100644
index 0000000..a24e310
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/icon_rgb_0_0_255.png
Binary files differ
diff --git a/chrome/test/data/extensions/api_test/icon_rgb_255_0_0.png b/chrome/test/data/extensions/api_test/icon_rgb_255_0_0.png
new file mode 100644
index 0000000..a4c3c7e
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/icon_rgb_255_0_0.png
Binary files differ
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index fc9e5c3..cd351bbe 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -4653,6 +4653,17 @@
     ]
   },
 
+  "DevicePowerwashAllowed": {
+    "os": ["chromeos"],
+    "test_policy": { "DevicePowerwashAllowed": true },
+    "pref_mappings": [
+      {
+        "pref": "cros.device.device_powerwash_allowed",
+        "local_state": true
+      }
+    ]
+  },
+
   "----- Chrome Frame policies -------------------------------------------": {},
 
   "ChromeFrameRendererSettings": {
diff --git a/chrome/test/data/webui/settings/device_page_tests.js b/chrome/test/data/webui/settings/device_page_tests.js
index 63ed566..004d81f7 100644
--- a/chrome/test/data/webui/settings/device_page_tests.js
+++ b/chrome/test/data/webui/settings/device_page_tests.js
@@ -736,6 +736,18 @@
             showAndGetDeviceSubpage('display', settings.routes.DISPLAY)
                 .then(function(page) {
                   displayPage = page;
+                  // Verify all the conditionals that get run during page load
+                  // before the display info has been populated.
+                  expectEquals(undefined, displayPage.displays);
+                  expectFalse(
+                      displayPage.showMirror_(true, displayPage.displays));
+                  expectFalse(
+                      displayPage.showMirror_(false, displayPage.displays));
+                  expectFalse(displayPage.isMirrored_(displayPage.displays));
+                  expectFalse(displayPage.showUnifiedDesktop_(
+                      true, true, displayPage.displays));
+                  expectFalse(displayPage.showUnifiedDesktop_(
+                      false, false, displayPage.displays));
                 }),
             // Wait for the initial call to getInfo.
             fakeSystemDisplay.getInfoCalled.promise,
@@ -761,6 +773,12 @@
             expectFalse(displayPage.showMirror_(false, displayPage.displays));
             expectFalse(displayPage.isMirrored_(displayPage.displays));
 
+            // Verify unified desktop only shown when enabled.
+            expectTrue(displayPage.showUnifiedDesktop_(
+                true, true, displayPage.displays));
+            expectFalse(displayPage.showUnifiedDesktop_(
+                false, false, displayPage.displays));
+
             // Add a second display.
             addDisplay(2);
             fakeSystemDisplay.onDisplayChanged.callListeners();
@@ -784,6 +802,12 @@
             expectTrue(displayPage.showMirror_(false, displayPage.displays));
             expectFalse(displayPage.isMirrored_(displayPage.displays));
 
+            // Verify unified desktop only shown when enabled.
+            expectTrue(displayPage.showUnifiedDesktop_(
+                true, true, displayPage.displays));
+            expectFalse(displayPage.showUnifiedDesktop_(
+                false, false, displayPage.displays));
+
             // Select the second display and make it primary. Also change the
             // orientation of the second display.
             const displayLayout = displayPage.$$('#displayLayout');
diff --git a/chromecast/common/cast_content_client.cc b/chromecast/common/cast_content_client.cc
index 9f86049..e6ee8463 100644
--- a/chromecast/common/cast_content_client.cc
+++ b/chromecast/common/cast_content_client.cc
@@ -113,22 +113,22 @@
 #endif
 }
 
-base::string16 CastContentClient::GetLocalizedString(int message_id) const {
+base::string16 CastContentClient::GetLocalizedString(int message_id) {
   return l10n_util::GetStringUTF16(message_id);
 }
 
 base::StringPiece CastContentClient::GetDataResource(
     int resource_id,
-    ui::ScaleFactor scale_factor) const {
+    ui::ScaleFactor scale_factor) {
   return ui::ResourceBundle::GetSharedInstance().GetRawDataResourceForScale(
       resource_id, scale_factor);
 }
 
-bool CastContentClient::IsDataResourceGzipped(int resource_id) const {
+bool CastContentClient::IsDataResourceGzipped(int resource_id) {
   return ui::ResourceBundle::GetSharedInstance().IsGzipped(resource_id);
 }
 
-gfx::Image& CastContentClient::GetNativeImageNamed(int resource_id) const {
+gfx::Image& CastContentClient::GetNativeImageNamed(int resource_id) {
   return ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed(
       resource_id);
 }
diff --git a/chromecast/common/cast_content_client.h b/chromecast/common/cast_content_client.h
index 9fe1674..20b9084 100644
--- a/chromecast/common/cast_content_client.h
+++ b/chromecast/common/cast_content_client.h
@@ -21,12 +21,11 @@
   // content::ContentClient implementation:
   void SetActiveURL(const GURL& url, std::string top_origin) override;
   void AddAdditionalSchemes(Schemes* schemes) override;
-  base::string16 GetLocalizedString(int message_id) const override;
-  base::StringPiece GetDataResource(
-      int resource_id,
-      ui::ScaleFactor scale_factor) const override;
-  bool IsDataResourceGzipped(int resource_id) const override;
-  gfx::Image& GetNativeImageNamed(int resource_id) const override;
+  base::string16 GetLocalizedString(int message_id) override;
+  base::StringPiece GetDataResource(int resource_id,
+                                    ui::ScaleFactor scale_factor) override;
+  bool IsDataResourceGzipped(int resource_id) override;
+  gfx::Image& GetNativeImageNamed(int resource_id) override;
 #if defined(OS_ANDROID)
   ::media::MediaDrmBridgeClient* GetMediaDrmBridgeClient() override;
 #endif  // OS_ANDROID
diff --git a/chromecast/common/cast_url_loader_throttle.cc b/chromecast/common/cast_url_loader_throttle.cc
index b2cb7743..04b99d01 100644
--- a/chromecast/common/cast_url_loader_throttle.cc
+++ b/chromecast/common/cast_url_loader_throttle.cc
@@ -38,7 +38,7 @@
   }
 }
 
-bool CastURLLoaderThrottle::makes_unsafe_redirect() const {
+bool CastURLLoaderThrottle::makes_unsafe_redirect() {
   // Yes, this makes cross-scheme redirects.
   return true;
 }
diff --git a/chromecast/common/cast_url_loader_throttle.h b/chromecast/common/cast_url_loader_throttle.h
index 79a3709..6e3ef4d 100644
--- a/chromecast/common/cast_url_loader_throttle.h
+++ b/chromecast/common/cast_url_loader_throttle.h
@@ -39,7 +39,7 @@
   void DetachFromCurrentSequence() override;
   void WillStartRequest(network::ResourceRequest* request,
                         bool* defer) override;
-  bool makes_unsafe_redirect() const override;
+  bool makes_unsafe_redirect() override;
 
   void ResumeRequest(int error, net::HttpRequestHeaders headers);
 
diff --git a/chromeos/dbus/cryptohome/cryptohome_client.cc b/chromeos/dbus/cryptohome/cryptohome_client.cc
index 0f96f18..70d0fe3 100644
--- a/chromeos/dbus/cryptohome/cryptohome_client.cc
+++ b/chromeos/dbus/cryptohome/cryptohome_client.cc
@@ -1011,6 +1011,13 @@
                        weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
   }
 
+  void GetRsuDeviceId(
+      DBusMethodCallback<cryptohome::BaseReply> callback) override {
+    cryptohome::GetRsuDeviceIdRequest request;
+    CallCryptohomeMethod(cryptohome::kCryptohomeGetRsuDeviceId, request,
+                         std::move(callback));
+  }
+
   void LockToSingleUserMountUntilReboot(
       const cryptohome::LockToSingleUserMountUntilRebootRequest& request,
       DBusMethodCallback<cryptohome::BaseReply> callback) override {
diff --git a/chromeos/dbus/cryptohome/cryptohome_client.h b/chromeos/dbus/cryptohome/cryptohome_client.h
index a564b101..85a300b 100644
--- a/chromeos/dbus/cryptohome/cryptohome_client.h
+++ b/chromeos/dbus/cryptohome/cryptohome_client.h
@@ -215,6 +215,11 @@
       const cryptohome::MountGuestRequest& request,
       DBusMethodCallback<cryptohome::BaseReply> callback) = 0;
 
+  // Calls GetRsuDeviceId method. |callback| is called after the method call
+  // succeeds.
+  virtual void GetRsuDeviceId(
+      DBusMethodCallback<cryptohome::BaseReply> callback) = 0;
+
   // Calls TpmIsReady method.
   virtual void TpmIsReady(DBusMethodCallback<bool> callback) = 0;
 
diff --git a/chromeos/dbus/cryptohome/fake_cryptohome_client.cc b/chromeos/dbus/cryptohome/fake_cryptohome_client.cc
index 2cd6e20..200e9857 100644
--- a/chromeos/dbus/cryptohome/fake_cryptohome_client.cc
+++ b/chromeos/dbus/cryptohome/fake_cryptohome_client.cc
@@ -171,6 +171,15 @@
   ReturnProtobufMethodCallback(cryptohome::BaseReply(), std::move(callback));
 }
 
+void FakeCryptohomeClient::GetRsuDeviceId(
+    DBusMethodCallback<cryptohome::BaseReply> callback) {
+  cryptohome::BaseReply reply;
+  cryptohome::GetRsuDeviceIdReply* get_rsu_lookup_key_reply =
+      reply.MutableExtension(cryptohome::GetRsuDeviceIdReply::reply);
+  get_rsu_lookup_key_reply->set_rsu_device_id(rsu_device_id_);
+  ReturnProtobufMethodCallback(reply, std::move(callback));
+}
+
 void FakeCryptohomeClient::TpmIsReady(DBusMethodCallback<bool> callback) {
   base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::BindOnce(std::move(callback), true));
diff --git a/chromeos/dbus/cryptohome/fake_cryptohome_client.h b/chromeos/dbus/cryptohome/fake_cryptohome_client.h
index a51dcc4c..f377ff0 100644
--- a/chromeos/dbus/cryptohome/fake_cryptohome_client.h
+++ b/chromeos/dbus/cryptohome/fake_cryptohome_client.h
@@ -70,6 +70,8 @@
   void MountGuestEx(
       const cryptohome::MountGuestRequest& request,
       DBusMethodCallback<cryptohome::BaseReply> callback) override;
+  void GetRsuDeviceId(
+      DBusMethodCallback<cryptohome::BaseReply> callback) override;
   void TpmIsReady(DBusMethodCallback<bool> callback) override;
   void TpmIsEnabled(DBusMethodCallback<bool> callback) override;
   bool CallTpmIsEnabledAndBlock(bool* enabled) override;
@@ -304,6 +306,10 @@
     enable_auth_check_ = enable_auth_check;
   }
 
+  void set_rsu_device_id(const std::string& rsu_device_id) {
+    rsu_device_id_ = rsu_device_id;
+  }
+
   void SetTpmAttestationUserCertificate(
       const cryptohome::AccountIdentifier& cryptohome_id,
       const std::string& key_name,
@@ -443,6 +449,9 @@
   // Controls if CheckKeyEx actually checks the key.
   bool enable_auth_check_ = false;
 
+  // Reply to GetRsuDeviceId().
+  std::string rsu_device_id_;
+
   // MountEx fields.
   cryptohome::CryptohomeErrorCode cryptohome_error_ =
       cryptohome::CRYPTOHOME_ERROR_NOT_SET;
diff --git a/chromeos/dbus/upstart/fake_upstart_client.cc b/chromeos/dbus/upstart/fake_upstart_client.cc
index 5f89736..6c57690a 100644
--- a/chromeos/dbus/upstart/fake_upstart_client.cc
+++ b/chromeos/dbus/upstart/fake_upstart_client.cc
@@ -28,6 +28,9 @@
   g_instance = nullptr;
 }
 
+void FakeUpstartClient::AddObserver(Observer* observer) {}
+void FakeUpstartClient::RemoveObserver(Observer* observer) {}
+
 // static
 FakeUpstartClient* FakeUpstartClient::Get() {
   return g_instance;
diff --git a/chromeos/dbus/upstart/fake_upstart_client.h b/chromeos/dbus/upstart/fake_upstart_client.h
index 9f7017bd..be13c4a0 100644
--- a/chromeos/dbus/upstart/fake_upstart_client.h
+++ b/chromeos/dbus/upstart/fake_upstart_client.h
@@ -17,6 +17,10 @@
   FakeUpstartClient();
   ~FakeUpstartClient() override;
 
+  // Adds or removes an observer.
+  void AddObserver(Observer* observer) override;
+  void RemoveObserver(Observer* observer) override;
+
   // Returns the fake global instance if initialized. May return null.
   static FakeUpstartClient* Get();
 
diff --git a/chromeos/dbus/upstart/upstart_client.cc b/chromeos/dbus/upstart/upstart_client.cc
index 1440145..43f66dc 100644
--- a/chromeos/dbus/upstart/upstart_client.cc
+++ b/chromeos/dbus/upstart/upstart_client.cc
@@ -10,6 +10,7 @@
 #include "dbus/bus.h"
 #include "dbus/message.h"
 #include "dbus/object_proxy.h"
+#include "third_party/cros_system_api/dbus/service_constants.h"
 
 namespace chromeos {
 
@@ -35,10 +36,27 @@
 class UpstartClientImpl : public UpstartClient {
  public:
   explicit UpstartClientImpl(dbus::Bus* bus)
-      : bus_(bus), weak_ptr_factory_(this) {}
+      : bus_(bus), weak_ptr_factory_(this) {
+    dbus::ObjectProxy* arc_proxy = bus_->GetObjectProxy(
+        arc::kArcServiceName, dbus::ObjectPath(arc::kArcServicePath));
+    arc_proxy->ConnectToSignal(
+        arc::kArcInterfaceName, arc::kArcStopped,
+        base::Bind(&UpstartClientImpl::ArcStoppedReceived,
+                   weak_ptr_factory_.GetWeakPtr()),
+        base::Bind(&UpstartClientImpl::SignalConnected,
+                   weak_ptr_factory_.GetWeakPtr()));
+  }
 
   ~UpstartClientImpl() override = default;
 
+  void AddObserver(Observer* observer) override {
+    observers_.AddObserver(observer);
+  }
+
+  void RemoveObserver(Observer* observer) override {
+    observers_.RemoveObserver(observer);
+  }
+
   // UpstartClient overrides:
   void StartJob(const std::string& job,
                 const std::vector<std::string>& upstart_env,
@@ -102,12 +120,26 @@
                        weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
   }
 
+  // Called when the object is connected to the signal.
+  void SignalConnected(const std::string& interface_name,
+                       const std::string& signal_name,
+                       bool success) {
+    LOG_IF(ERROR, !success) << "Failed to connect to " << signal_name;
+  }
+
+  void ArcStoppedReceived(dbus::Signal* signal) {
+    for (auto& observer : observers_)
+      observer.ArcStopped();
+  }
+
   void OnVoidMethod(VoidDBusMethodCallback callback, dbus::Response* response) {
     std::move(callback).Run(response);
   }
 
   dbus::Bus* bus_ = nullptr;
 
+  base::ObserverList<Observer> observers_;
+
   // Note: This should remain the last member so it'll be destroyed and
   // invalidate its weak pointers before any other members are destroyed.
   base::WeakPtrFactory<UpstartClientImpl> weak_ptr_factory_;
diff --git a/chromeos/dbus/upstart/upstart_client.h b/chromeos/dbus/upstart/upstart_client.h
index 1d4fadd..c1835d1 100644
--- a/chromeos/dbus/upstart/upstart_client.h
+++ b/chromeos/dbus/upstart/upstart_client.h
@@ -11,6 +11,7 @@
 #include "base/callback.h"
 #include "base/component_export.h"
 #include "base/macros.h"
+#include "base/observer_list.h"
 #include "chromeos/dbus/dbus_method_call_status.h"
 
 namespace dbus {
@@ -24,6 +25,13 @@
 // initializes the DBusThreadManager instance.
 class COMPONENT_EXPORT(UPSTART_CLIENT) UpstartClient {
  public:
+  class Observer : public base::CheckedObserver {
+   public:
+    ~Observer() override {}
+    // Called when the ARC is stopped after it had already started.
+    virtual void ArcStopped() {}
+  };
+
   virtual ~UpstartClient();
 
   // Creates and initializes the global instance. |bus| must not be null.
@@ -38,6 +46,10 @@
   // Returns the global instance if initialized. May return null.
   static UpstartClient* Get();
 
+  // Adds or removes an observer.
+  virtual void AddObserver(Observer* observer) = 0;
+  virtual void RemoveObserver(Observer* observer) = 0;
+
   // Starts an Upstart job.
   // |job|: Name of Upstart job.
   // |upstart_env|: List of upstart environment variables to be passed to the
diff --git a/chromeos/services/assistant/BUILD.gn b/chromeos/services/assistant/BUILD.gn
index 80316dd..1fb5132 100644
--- a/chromeos/services/assistant/BUILD.gn
+++ b/chromeos/services/assistant/BUILD.gn
@@ -102,6 +102,7 @@
       "//chromeos/assistant/internal/proto/google3",
       "//chromeos/dbus",
       "//chromeos/resources",
+      "//chromeos/services/network_config/public/mojom",
       "//chromeos/strings",
       "//libassistant/shared/internal_api:fuchsia_api_helper",
       "//libassistant/shared/internal_api/c:api_wrappers_entrypoint",
@@ -151,12 +152,14 @@
   if (enable_cros_libassistant) {
     sources += [
       "platform/audio_output_provider_impl_unittest.cc",
+      "platform/network_provider_impl_unittest.cc",
       "platform/power_manager_provider_impl_unittest.cc",
       "platform/system_provider_impl_unittest.cc",
     ]
 
     deps += [
       "//chromeos/dbus",
+      "//chromeos/services/network_config/public/mojom",
       "//libassistant/shared/public",
       "//services/device/public/cpp:test_support",
     ]
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.cc b/chromeos/services/assistant/assistant_manager_service_impl.cc
index 427d819..1da8f63 100644
--- a/chromeos/services/assistant/assistant_manager_service_impl.cc
+++ b/chromeos/services/assistant/assistant_manager_service_impl.cc
@@ -133,7 +133,6 @@
     service_manager::Connector* connector,
     device::mojom::BatteryMonitorPtr battery_monitor,
     Service* service,
-    network::NetworkConnectionTracker* network_connection_tracker,
     std::unique_ptr<network::SharedURLLoaderFactoryInfo>
         url_loader_factory_info)
     : media_session_(std::make_unique<AssistantMediaSession>(connector, this)),
@@ -153,7 +152,7 @@
   platform_api_ = std::make_unique<PlatformApiImpl>(
       connector, media_session_.get(), std::move(battery_monitor),
       service_->main_task_runner(), background_thread_.task_runner(),
-      network_connection_tracker, service->assistant_state()->locale().value());
+      service->assistant_state()->locale().value());
 
   media_session::mojom::MediaControllerManagerPtr controller_manager_ptr;
   connector->BindInterface(media_session::mojom::kServiceName,
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.h b/chromeos/services/assistant/assistant_manager_service_impl.h
index 474c32b5..2609d7bb 100644
--- a/chromeos/services/assistant/assistant_manager_service_impl.h
+++ b/chromeos/services/assistant/assistant_manager_service_impl.h
@@ -95,7 +95,6 @@
       service_manager::Connector* connector,
       device::mojom::BatteryMonitorPtr battery_monitor,
       Service* service,
-      network::NetworkConnectionTracker* network_connection_tracker,
       std::unique_ptr<network::SharedURLLoaderFactoryInfo>
           url_loader_factory_info);
 
diff --git a/chromeos/services/assistant/platform/network_provider_impl.cc b/chromeos/services/assistant/platform/network_provider_impl.cc
index 85c9d99..411864d 100644
--- a/chromeos/services/assistant/platform/network_provider_impl.cc
+++ b/chromeos/services/assistant/platform/network_provider_impl.cc
@@ -3,53 +3,78 @@
 // found in the LICENSE file.
 
 #include "chromeos/services/assistant/platform/network_provider_impl.h"
-#include "base/bind.h"
 
-using assistant_client::NetworkProvider;
+#include <algorithm>
+
+#include "base/bind.h"
+#include "chromeos/services/network_config/public/mojom/constants.mojom.h"
+#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom-forward.h"
+#include "services/service_manager/public/cpp/connector.h"
+
 using ConnectionStatus = assistant_client::NetworkProvider::ConnectionStatus;
+using NetworkStatePropertiesPtr =
+    chromeos::network_config::mojom::NetworkStatePropertiesPtr;
+using ConnectionStateType =
+    chromeos::network_config::mojom::ConnectionStateType;
 
 namespace chromeos {
 namespace assistant {
 
-NetworkProviderImpl::NetworkProviderImpl(
-    network::NetworkConnectionTracker* network_connection_tracker)
-    : network_connection_tracker_(network_connection_tracker),
-      weak_factory_(this) {
-  if (network_connection_tracker_) {
-    network_connection_tracker_->AddNetworkConnectionObserver(this);
-    network_connection_tracker_->GetConnectionType(
-        &connection_type_,
-        base::BindOnce(&NetworkProviderImpl::OnConnectionChanged,
-                       weak_factory_.GetWeakPtr()));
-  }
+NetworkProviderImpl::NetworkProviderImpl(service_manager::Connector* connector)
+    : connection_status_(ConnectionStatus::UNKNOWN), binding_(this) {
+  // |connector| can be null for the unittests
+  if (connector)
+    Init(connector);
 }
 
-NetworkProviderImpl::~NetworkProviderImpl() {
-  if (network_connection_tracker_)
-    network_connection_tracker_->RemoveNetworkConnectionObserver(this);
+NetworkProviderImpl::~NetworkProviderImpl() = default;
+
+network_config::mojom::CrosNetworkConfigObserverPtr
+NetworkProviderImpl::BindAndGetPtr() {
+  DCHECK(!binding_.is_bound());
+  network_config::mojom::CrosNetworkConfigObserverPtr observer_ptr;
+  binding_.Bind(mojo::MakeRequest(&observer_ptr));
+  return observer_ptr;
 }
 
-void NetworkProviderImpl::OnConnectionChanged(
-    network::mojom::ConnectionType type) {
-  connection_type_ = type;
+void NetworkProviderImpl::OnActiveNetworksChanged(
+    std::vector<network_config::mojom::NetworkStatePropertiesPtr> networks) {
+  const bool is_any_network_online =
+      std::any_of(networks.begin(), networks.end(), [](const auto& network) {
+        return network->connection_state == ConnectionStateType::kOnline;
+      });
+
+  if (is_any_network_online)
+    connection_status_ = ConnectionStatus::CONNECTED;
+  else
+    connection_status_ = ConnectionStatus::DISCONNECTED_FROM_INTERNET;
+}
+
+void NetworkProviderImpl::Init(service_manager::Connector* connector) {
+  BindCrosNetworkConfig(connector);
+  AddAndFireCrosNetworkConfigObserver();
+}
+
+void NetworkProviderImpl::BindCrosNetworkConfig(
+    service_manager::Connector* connector) {
+  DCHECK(!cros_network_config_ptr_.is_bound());
+  connector->BindInterface(chromeos::network_config::mojom::kServiceName,
+                           &cros_network_config_ptr_);
+}
+
+void NetworkProviderImpl::AddAndFireCrosNetworkConfigObserver() {
+  cros_network_config_ptr_->AddObserver(BindAndGetPtr());
+  cros_network_config_ptr_->GetNetworkStateList(
+      network_config::mojom::NetworkFilter::New(
+          network_config::mojom::FilterType::kActive,
+          network_config::mojom::NetworkType::kAll,
+          network_config::mojom::kNoLimit),
+      base::BindOnce(&NetworkProviderImpl::OnActiveNetworksChanged,
+                     base::Unretained(this)));
 }
 
 ConnectionStatus NetworkProviderImpl::GetConnectionStatus() {
-  // TODO(updowndota): Check actual internect connectivity in addition to the
-  // physical connectivity.
-  switch (connection_type_) {
-    case network::mojom::ConnectionType::CONNECTION_UNKNOWN:
-      return ConnectionStatus::UNKNOWN;
-    case network::mojom::ConnectionType::CONNECTION_ETHERNET:
-    case network::mojom::ConnectionType::CONNECTION_WIFI:
-    case network::mojom::ConnectionType::CONNECTION_2G:
-    case network::mojom::ConnectionType::CONNECTION_3G:
-    case network::mojom::ConnectionType::CONNECTION_4G:
-    case network::mojom::ConnectionType::CONNECTION_BLUETOOTH:
-      return ConnectionStatus::CONNECTED;
-    case network::mojom::ConnectionType::CONNECTION_NONE:
-      return ConnectionStatus::DISCONNECTED_FROM_INTERNET;
-  }
+  return connection_status_;
 }
 
 // Mdns responder is not supported in ChromeOS.
diff --git a/chromeos/services/assistant/platform/network_provider_impl.h b/chromeos/services/assistant/platform/network_provider_impl.h
index 12890f7..a312cefa 100644
--- a/chromeos/services/assistant/platform/network_provider_impl.h
+++ b/chromeos/services/assistant/platform/network_provider_impl.h
@@ -6,33 +6,46 @@
 #define CHROMEOS_SERVICES_ASSISTANT_PLATFORM_NETWORK_PROVIDER_IMPL_H_
 
 #include "base/macros.h"
-#include "base/memory/weak_ptr.h"
+#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h"
 #include "libassistant/shared/public/platform_net.h"
-#include "services/network/public/cpp/network_connection_tracker.h"
-#include "services/network/public/mojom/network_change_manager.mojom.h"
+#include "mojo/public/cpp/bindings/binding.h"
+
+namespace service_manager {
+class Connector;
+}  // namespace service_manager
 
 namespace chromeos {
 namespace assistant {
 
-class NetworkProviderImpl
+class COMPONENT_EXPORT(ASSISTANT_SERVICE) NetworkProviderImpl
     : public assistant_client::NetworkProvider,
-      public network::NetworkConnectionTracker::NetworkConnectionObserver {
+      public network_config::mojom::CrosNetworkConfigObserver {
  public:
-  explicit NetworkProviderImpl(
-      network::NetworkConnectionTracker* network_connection_tracker);
+  NetworkProviderImpl(service_manager::Connector* connector);
   ~NetworkProviderImpl() override;
 
-  // network::NetworkConnectionTracker::NetworkConnectionObserver:
-  void OnConnectionChanged(network::mojom::ConnectionType type) override;
-
-  // assistant_client::NetworkProvider::NetworkChangeObserver overrides:
+  // assistant_client::NetworkProvider:
   ConnectionStatus GetConnectionStatus() override;
   assistant_client::MdnsResponder* GetMdnsResponder() override;
 
+  network_config::mojom::CrosNetworkConfigObserverPtr BindAndGetPtr();
+
+  // network_config::mojom::CrosNetworkConfigObserver:
+  void OnActiveNetworksChanged(
+      std::vector<network_config::mojom::NetworkStatePropertiesPtr> networks)
+      override;
+  void OnNetworkStateListChanged() override {}
+  void OnDeviceStateListChanged() override {}
+
  private:
-  network::NetworkConnectionTracker* network_connection_tracker_;
-  network::mojom::ConnectionType connection_type_;
-  base::WeakPtrFactory<NetworkProviderImpl> weak_factory_;
+  void Init(service_manager::Connector* connector);
+
+  void BindCrosNetworkConfig(service_manager::Connector* connector);
+  void AddAndFireCrosNetworkConfigObserver();
+
+  ConnectionStatus connection_status_;
+  mojo::Binding<network_config::mojom::CrosNetworkConfigObserver> binding_;
+  network_config::mojom::CrosNetworkConfigPtr cros_network_config_ptr_;
 
   DISALLOW_COPY_AND_ASSIGN(NetworkProviderImpl);
 };
diff --git a/chromeos/services/assistant/platform/network_provider_impl_unittest.cc b/chromeos/services/assistant/platform/network_provider_impl_unittest.cc
new file mode 100644
index 0000000..15fda9d
--- /dev/null
+++ b/chromeos/services/assistant/platform/network_provider_impl_unittest.cc
@@ -0,0 +1,101 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromeos/services/assistant/platform/network_provider_impl.h"
+
+#include <utility>
+#include <vector>
+
+#include "base/macros.h"
+#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom-forward.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace chromeos {
+namespace assistant {
+
+using network_config::mojom::ConnectionStateType;
+using network_config::mojom::NetworkStatePropertiesPtr;
+using ConnectionStatus = NetworkProviderImpl::ConnectionStatus;
+
+class NetworkProviderImplTest : public ::testing::Test {
+ public:
+  NetworkProviderImplTest() : network_provider_(nullptr) {}
+  ~NetworkProviderImplTest() override {}
+
+  void PublishConnectionStateType(ConnectionStateType connection_type) {
+    std::vector<NetworkStatePropertiesPtr> active_networks;
+    active_networks.push_back(CreateNetworkState(connection_type));
+
+    PublishActiveNetworks(std::move(active_networks));
+  }
+
+  NetworkStatePropertiesPtr CreateNetworkState(
+      ConnectionStateType connection_type) const {
+    NetworkStatePropertiesPtr network_state =
+        network_config::mojom::NetworkStateProperties::New();
+    network_state->connection_state = connection_type;
+    return network_state;
+  }
+
+  void PublishActiveNetworks(
+      std::vector<NetworkStatePropertiesPtr> active_networks) {
+    network_provider_.OnActiveNetworksChanged(std::move(active_networks));
+  }
+
+  std::vector<std::pair<ConnectionStateType, ConnectionStatus>>
+  GetStatusPairs() {
+    return {
+        {ConnectionStateType::kOnline, ConnectionStatus::CONNECTED},
+        {ConnectionStateType::kConnected,
+         ConnectionStatus::DISCONNECTED_FROM_INTERNET},
+        {ConnectionStateType::kPortal,
+         ConnectionStatus::DISCONNECTED_FROM_INTERNET},
+        {ConnectionStateType::kNotConnected,
+         ConnectionStatus::DISCONNECTED_FROM_INTERNET},
+    };
+  }
+
+ protected:
+  NetworkProviderImpl network_provider_;
+
+  DISALLOW_COPY_AND_ASSIGN(NetworkProviderImplTest);
+};
+
+TEST_F(NetworkProviderImplTest, StartWithStatusUnknown) {
+  EXPECT_EQ(ConnectionStatus::UNKNOWN, network_provider_.GetConnectionStatus());
+}
+
+TEST_F(NetworkProviderImplTest, ChangeStateBasedOnConnectionStateType) {
+  for (const auto& test : GetStatusPairs()) {
+    ConnectionStateType input = test.first;
+    ConnectionStatus expected = test.second;
+
+    PublishConnectionStateType(input);
+
+    EXPECT_EQ(expected, network_provider_.GetConnectionStatus())
+        << "Failure with input " << input;
+  }
+}
+
+TEST_F(NetworkProviderImplTest, IsOnlineIfOneOfTheActiveNetworksIsOnline) {
+  std::vector<NetworkStatePropertiesPtr> active_networks{};
+  active_networks.push_back(
+      CreateNetworkState(ConnectionStateType::kNotConnected));
+  active_networks.push_back(CreateNetworkState(ConnectionStateType::kOnline));
+
+  PublishActiveNetworks(std::move(active_networks));
+
+  EXPECT_EQ(ConnectionStatus::CONNECTED,
+            network_provider_.GetConnectionStatus());
+}
+
+TEST_F(NetworkProviderImplTest, IsOfflineIfThereAreNoNetworks) {
+  PublishActiveNetworks({});
+
+  EXPECT_EQ(ConnectionStatus::DISCONNECTED_FROM_INTERNET,
+            network_provider_.GetConnectionStatus());
+}
+
+}  // namespace assistant
+}  // namespace chromeos
diff --git a/chromeos/services/assistant/platform_api_impl.cc b/chromeos/services/assistant/platform_api_impl.cc
index 43311dc..24e0675 100644
--- a/chromeos/services/assistant/platform_api_impl.cc
+++ b/chromeos/services/assistant/platform_api_impl.cc
@@ -82,7 +82,6 @@
     device::mojom::BatteryMonitorPtr battery_monitor,
     scoped_refptr<base::SequencedTaskRunner> main_thread_task_runner,
     scoped_refptr<base::SingleThreadTaskRunner> background_task_runner,
-    network::NetworkConnectionTracker* network_connection_tracker,
     std::string pref_locale)
     : audio_input_provider_(connector,
                             media::AudioDeviceDescription::kDefaultDeviceId,
@@ -91,7 +90,7 @@
                              media_session,
                              background_task_runner,
                              media::AudioDeviceDescription::kDefaultDeviceId),
-      network_provider_(network_connection_tracker),
+      network_provider_(connector),
       pref_locale_(pref_locale) {
   // Only enable native power features if they are supported by the UI.
   std::unique_ptr<PowerManagerProviderImpl> provider;
diff --git a/chromeos/services/assistant/platform_api_impl.h b/chromeos/services/assistant/platform_api_impl.h
index cd87acdf7..ea009b3 100644
--- a/chromeos/services/assistant/platform_api_impl.h
+++ b/chromeos/services/assistant/platform_api_impl.h
@@ -40,7 +40,6 @@
       device::mojom::BatteryMonitorPtr battery_monitor,
       scoped_refptr<base::SequencedTaskRunner> main_thread_task_runner,
       scoped_refptr<base::SingleThreadTaskRunner> background_task_runner,
-      network::NetworkConnectionTracker* network_connection_tracker,
       std::string pref_locale);
   ~PlatformApiImpl() override;
 
@@ -102,6 +101,9 @@
   std::unique_ptr<SystemProviderImpl> system_provider_;
   std::string pref_locale_;
 
+  chromeos::network_config::mojom::CrosNetworkConfigPtr
+      cros_network_config_ptr_;
+
   DISALLOW_COPY_AND_ASSIGN(PlatformApiImpl);
 };
 
diff --git a/chromeos/services/assistant/public/cpp/BUILD.gn b/chromeos/services/assistant/public/cpp/BUILD.gn
index 3ed32ec..13b97ba 100644
--- a/chromeos/services/assistant/public/cpp/BUILD.gn
+++ b/chromeos/services/assistant/public/cpp/BUILD.gn
@@ -11,6 +11,7 @@
   deps = [
     "//base",
     "//chromeos/services/assistant/public/mojom",
+    "//chromeos/services/network_config/public/mojom",
     "//services/service_manager/public/cpp",
   ]
 }
diff --git a/chromeos/services/assistant/public/cpp/manifest.cc b/chromeos/services/assistant/public/cpp/manifest.cc
index 1b61200ef..270d1105 100644
--- a/chromeos/services/assistant/public/cpp/manifest.cc
+++ b/chromeos/services/assistant/public/cpp/manifest.cc
@@ -8,6 +8,7 @@
 #include "chromeos/services/assistant/public/mojom/assistant.mojom.h"
 #include "chromeos/services/assistant/public/mojom/constants.mojom.h"
 #include "chromeos/services/assistant/public/mojom/settings.mojom.h"
+#include "chromeos/services/network_config/public/mojom/constants.mojom.h"
 #include "services/service_manager/public/cpp/manifest_builder.h"
 
 namespace chromeos {
@@ -31,6 +32,9 @@
           .RequireCapability("device", "device:wake_lock")
           .RequireCapability("identity", "identity_accessor")
           .RequireCapability("media_session", "app")
+          .RequireCapability(
+              chromeos::network_config::mojom::kServiceName,
+              chromeos::network_config::mojom::kNetworkConfigCapability)
 
           .Build()};
   return *manifest;
diff --git a/chromeos/services/assistant/service.cc b/chromeos/services/assistant/service.cc
index db97ff7..fc680c83 100644
--- a/chromeos/services/assistant/service.cc
+++ b/chromeos/services/assistant/service.cc
@@ -59,7 +59,6 @@
 }  // namespace
 
 Service::Service(service_manager::mojom::ServiceRequest request,
-                 network::NetworkConnectionTracker* network_connection_tracker,
                  std::unique_ptr<network::SharedURLLoaderFactoryInfo>
                      url_loader_factory_info)
     : service_binding_(this, std::move(request)),
@@ -67,7 +66,6 @@
       token_refresh_timer_(std::make_unique<base::OneShotTimer>()),
       main_task_runner_(base::SequencedTaskRunnerHandle::Get()),
       power_manager_observer_(this),
-      network_connection_tracker_(network_connection_tracker),
       url_loader_factory_info_(std::move(url_loader_factory_info)),
       weak_ptr_factory_(this) {
   registry_.AddInterface<mojom::AssistantPlatform>(base::BindRepeating(
@@ -306,8 +304,7 @@
     RetryRefreshToken();
     return;
   }
-  account_id_ = AccountId::FromUserEmailGaiaId(account_info.value().email,
-                                               account_info.value().gaia);
+  account_id_ = AccountIdFromAccountInfo(account_info.value());
   identity::ScopeSet scopes;
   scopes.insert(kScopeAssistant);
   scopes.insert(kScopeAuthGcm);
@@ -362,7 +359,7 @@
   DCHECK(url_loader_factory_info_);
   assistant_manager_service_ = std::make_unique<AssistantManagerServiceImpl>(
       service_binding_.GetConnector(), std::move(battery_monitor), this,
-      network_connection_tracker_, std::move(url_loader_factory_info_));
+      std::move(url_loader_factory_info_));
 #else
   assistant_manager_service_ =
       std::make_unique<FakeAssistantManagerServiceImpl>();
diff --git a/chromeos/services/assistant/service.h b/chromeos/services/assistant/service.h
index 41b95d9..846a9333 100644
--- a/chromeos/services/assistant/service.h
+++ b/chromeos/services/assistant/service.h
@@ -40,7 +40,6 @@
 }  // namespace base
 
 namespace network {
-class NetworkConnectionTracker;
 class SharedURLLoaderFactoryInfo;
 }  // namespace network
 
@@ -61,7 +60,6 @@
       public ash::DefaultVoiceInteractionObserver {
  public:
   Service(service_manager::mojom::ServiceRequest request,
-          network::NetworkConnectionTracker* network_connection_tracker,
           std::unique_ptr<network::SharedURLLoaderFactoryInfo>
               url_loader_factory_info);
   ~Service() override;
@@ -211,7 +209,6 @@
       assistant_screen_context_controller_;
   ash::AssistantStateProxy assistant_state_;
 
-  network::NetworkConnectionTracker* network_connection_tracker_;
   // non-null until |assistant_manager_service_| is created.
   std::unique_ptr<network::SharedURLLoaderFactoryInfo> url_loader_factory_info_;
 
diff --git a/chromeos/services/assistant/service_unittest.cc b/chromeos/services/assistant/service_unittest.cc
index 07c0214..0e69aa1 100644
--- a/chromeos/services/assistant/service_unittest.cc
+++ b/chromeos/services/assistant/service_unittest.cc
@@ -32,7 +32,7 @@
 namespace {
 constexpr base::TimeDelta kDefaultTokenExpirationDelay =
     base::TimeDelta::FromMilliseconds(1000);
-}
+}  // namespace
 
 class FakeIdentityAccessor : identity::mojom::IdentityAccessor {
  public:
@@ -170,7 +170,6 @@
 
     service_ = std::make_unique<Service>(
         test_connector_factory_.RegisterInstance(mojom::kServiceName),
-        nullptr /* network_connection_tracker */,
         shared_url_loader_factory_->Clone());
 
     mock_task_runner_ = base::MakeRefCounted<base::TestMockTimeTaskRunner>(
diff --git a/chromeos/settings/cros_settings_names.cc b/chromeos/settings/cros_settings_names.cc
index 9fe24df..928655a 100644
--- a/chromeos/settings/cros_settings_names.cc
+++ b/chromeos/settings/cros_settings_names.cc
@@ -388,4 +388,6 @@
 const char kDeviceSecondFactorAuthenticationMode[] =
     "cros.device.device_second_factor_authentication_mode";
 
+// A boolean pref specifying if the device is allowed to powerwash.
+const char kDevicePowerwashAllowed[] = "cros.device.device_powerwash_allowed";
 }  // namespace chromeos
diff --git a/chromeos/settings/cros_settings_names.h b/chromeos/settings/cros_settings_names.h
index b1676b604..1031971 100644
--- a/chromeos/settings/cros_settings_names.h
+++ b/chromeos/settings/cros_settings_names.h
@@ -225,6 +225,9 @@
 COMPONENT_EXPORT(CHROMEOS_SETTINGS)
 extern const char kDeviceSecondFactorAuthenticationMode[];
 
+COMPONENT_EXPORT(CHROMEOS_SETTINGS)
+extern const char kDevicePowerwashAllowed[];
+
 }  // namespace chromeos
 
 #endif  // CHROMEOS_SETTINGS_CROS_SETTINGS_NAMES_H_
diff --git a/components/account_id/account_id.cc b/components/account_id/account_id.cc
index a376f56..7110751d 100644
--- a/components/account_id/account_id.cc
+++ b/components/account_id/account_id.cc
@@ -39,6 +39,7 @@
                      const std::string& user_email,
                      const AccountType& account_type)
     : id_(id), user_email_(user_email), account_type_(account_type) {
+  DCHECK(user_email == gaia::CanonicalizeEmail(user_email));
   DCHECK(account_type != AccountType::UNKNOWN || id.empty());
   DCHECK(account_type != AccountType::ACTIVE_DIRECTORY || !id.empty());
   // Fail if e-mail looks similar to GaiaIdKey.
@@ -154,6 +155,7 @@
 }
 
 void AccountId::SetUserEmail(const std::string& email) {
+  DCHECK(email == gaia::CanonicalizeEmail(email));
   DCHECK(!email.empty());
   user_email_ = email;
 }
diff --git a/components/arc/BUILD.gn b/components/arc/BUILD.gn
index 5a7826d..7bdab54 100644
--- a/components/arc/BUILD.gn
+++ b/components/arc/BUILD.gn
@@ -211,6 +211,8 @@
     "//chromeos/constants",
     "//chromeos/cryptohome",
     "//chromeos/dbus:common",
+    "//chromeos/dbus:concierge_proto",
+    "//chromeos/dbus:dbus",
     "//chromeos/dbus/session_manager",
     "//chromeos/dbus/session_manager:login_manager_proto",
     "//chromeos/dbus/upstart",
@@ -232,6 +234,7 @@
     ":connection_holder",
     ":prefs",
     "//components/arc/common",
+    "//dbus",
   ]
 }
 
@@ -345,6 +348,7 @@
     "session/arc_data_remover_unittest.cc",
     "session/arc_session_impl_unittest.cc",
     "session/arc_session_runner_unittest.cc",
+    "session/arc_vm_client_adapter_unittest.cc",
     "timer/arc_timer_bridge_unittest.cc",
     "wake_lock/arc_wake_lock_bridge_unittest.cc",
   ]
diff --git a/components/arc/session/arc_container_client_adapter.cc b/components/arc/session/arc_container_client_adapter.cc
index 30f73341..43ba3dc 100644
--- a/components/arc/session/arc_container_client_adapter.cc
+++ b/components/arc/session/arc_container_client_adapter.cc
@@ -12,21 +12,27 @@
 #include "chromeos/dbus/dbus_method_call_status.h"
 #include "chromeos/dbus/login_manager/arc.pb.h"
 #include "chromeos/dbus/session_manager/session_manager_client.h"
+#include "chromeos/dbus/upstart/upstart_client.h"
 
 namespace arc {
 
 class ArcContainerClientAdapter
     : public ArcClientAdapter,
-      public chromeos::SessionManagerClient::Observer {
+      public chromeos::SessionManagerClient::Observer,
+      public chromeos::UpstartClient::Observer {
  public:
   ArcContainerClientAdapter() {
     if (chromeos::SessionManagerClient::Get())
       chromeos::SessionManagerClient::Get()->AddObserver(this);
+    if (chromeos::UpstartClient::Get())
+      chromeos::UpstartClient::Get()->AddObserver(this);
   }
 
   ~ArcContainerClientAdapter() override {
     if (chromeos::SessionManagerClient::Get())
       chromeos::SessionManagerClient::Get()->RemoveObserver(this);
+    if (chromeos::UpstartClient::Get())
+      chromeos::UpstartClient::Get()->RemoveObserver(this);
   }
 
   // ArcClientAdapter overrides:
@@ -57,6 +63,12 @@
       observer.ArcInstanceStopped();
   }
 
+  // chromeos::UpstartClient::Observer overrides:
+  void ArcStopped() override {
+    for (auto& observer : observer_list_)
+      observer.ArcInstanceStopped();
+  }
+
  private:
   DISALLOW_COPY_AND_ASSIGN(ArcContainerClientAdapter);
 };
diff --git a/components/arc/session/arc_vm_client_adapter.cc b/components/arc/session/arc_vm_client_adapter.cc
index aed7e2c..edb2613 100644
--- a/components/arc/session/arc_vm_client_adapter.cc
+++ b/components/arc/session/arc_vm_client_adapter.cc
@@ -6,23 +6,48 @@
 
 #include <string>
 #include <utility>
+#include <vector>
 
 #include "base/bind.h"
 #include "base/guid.h"
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
+#include "base/optional.h"
+#include "base/system/sys_info.h"
 #include "base/task/post_task.h"
-#include "chromeos/dbus/login_manager/arc.pb.h"
-#include "chromeos/dbus/upstart/upstart_client.h"
+#include "chromeos/dbus/concierge_client.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/debug_daemon_client.h"
 
 namespace arc {
 
 namespace {
 
-// The conversion of upstart job names to dbus object paths is undocumented. See
-// arc_data_remover.cc for more information.
-constexpr char kArcVmUpstartJob[] = "arcvm";
+constexpr char kArcVmName[] = "arcvm";
+constexpr char kHomeDirectory[] = "/home";
+constexpr char kKernelPath[] = "/opt/google/vms/android/vmlinux";
+constexpr char kRootFsPath[] = "/opt/google/vms/android/system.raw.img";
+constexpr char kVendorImagePath[] = "/opt/google/vms/android/vendor.raw.img";
+
+chromeos::ConciergeClient* GetConciergeClient() {
+  return chromeos::DBusThreadManager::Get()->GetConciergeClient();
+}
+
+std::vector<std::string> CreateKernelParams() {
+  // TODO(cmtm): Generate the same parameters as arc-setup based on both
+  // StartArcMiniContainerRequest and UpgradeArcContainerRequest.
+
+  // TODO(yusukes): Enable SELinux.
+  std::vector<std::string> params{
+      {"androidboot.selinux=permissive"},
+      {"androidboot.hardware=bertha"},
+      {"androidboot.debuggable=1"},
+      {"androidboot.native_bridge=libhoudini.so"},
+      {"forwarder.enable=0"},
+  };
+  return params;
+}
 
 }  // namespace
 
@@ -35,48 +60,182 @@
   void StartMiniArc(const StartArcMiniContainerRequest& request,
                     chromeos::VoidDBusMethodCallback callback) override {
     // TODO(yusukes): Support mini ARC.
-    VLOG(2) << "Mini ARC instance is not supported yet.";
+    VLOG(2) << "Mini ARCVM instance is not supported.";
     base::PostTask(FROM_HERE, base::BindOnce(std::move(callback), true));
   }
 
   void UpgradeArc(const UpgradeArcContainerRequest& request,
                   chromeos::VoidDBusMethodCallback callback) override {
-    // TODO(yusukes): Consider doing the same as crostini rather than taking to
-    // Upstart.
-    VLOG(1) << "Starting arcvm";
-    auto* upstart_client = chromeos::UpstartClient::Get();
-    DCHECK(upstart_client);
-    upstart_client->StartJob(
-        kArcVmUpstartJob,
-        // arc_session_impl.cc fills the |account_id| field, and it is always
-        // guaranteed that the ID is not for Incognito mode and is a valid one.
-        // TODO(yusukes): Pass other fields of the |request| to the job.
-        {"CHROMEOS_USER=" + request.account_id()}, std::move(callback));
+    VLOG(1) << "Starting Concierge service";
+    chromeos::DBusThreadManager::Get()->GetDebugDaemonClient()->StartConcierge(
+        base::BindOnce(&ArcVmClientAdapter::OnConciergeStarted,
+                       weak_factory_.GetWeakPtr(), std::move(callback),
+                       CreateKernelParams()));
   }
 
   void StopArcInstance() override {
-    // TODO(yusukes): Consider doing the same as crostini rather than taking to
-    // Upstart.
     VLOG(1) << "Stopping arcvm";
-    auto* upstart_client = chromeos::UpstartClient::Get();
-    DCHECK(upstart_client);
-    upstart_client->StopJob(
-        kArcVmUpstartJob,
-        base::BindOnce(&ArcVmClientAdapter::OnArcInstanceStopped,
-                       weak_factory_.GetWeakPtr()));
+    vm_tools::concierge::StopVmRequest request;
+    request.set_name(kArcVmName);
+    request.set_owner_id(user_id_hash_);
+    GetConciergeClient()->StopVm(
+        request, base::BindOnce(&ArcVmClientAdapter::OnVmStopped,
+                                weak_factory_.GetWeakPtr()));
   }
 
-  void SetUserIdHashForProfile(const std::string& hash) override {}
+  void SetUserIdHashForProfile(const std::string& hash) override {
+    DCHECK(!hash.empty());
+    user_id_hash_ = hash;
+  }
 
  private:
-  void OnArcInstanceStopped(bool result) {
-    VLOG(1) << "OnArcInstanceStopped result=" << result;
-    if (!result)
-      LOG(WARNING) << "Failed to stop arcvm. Instance not running?";
+  // TODO(yusukes|cmtm): Monitor unexpected crosvm crash/shutdown and call this
+  // method.
+  void OnArcInstanceStopped() {
+    VLOG(1) << "arcvm stopped.";
     for (auto& observer : observer_list_)
       observer.ArcInstanceStopped();
   }
 
+  void OnConciergeStarted(chromeos::VoidDBusMethodCallback callback,
+                          std::vector<std::string> params,
+                          bool success) {
+    if (!success) {
+      LOG(ERROR) << "Failed to start Concierge service for arcvm";
+      std::move(callback).Run(false);
+      return;
+    }
+    VLOG(1) << "Concierge service started for arcvm.";
+
+    // TODO(cmtm): Export host-side /data to the VM, and remove the call.
+    base::PostTaskWithTraitsAndReplyWithResult(
+        FROM_HERE, {base::MayBlock()},
+        base::BindOnce(&base::SysInfo::AmountOfFreeDiskSpace,
+                       base::FilePath(kHomeDirectory)),
+        base::BindOnce(&ArcVmClientAdapter::CreateDiskImageAfterSizeCheck,
+                       weak_factory_.GetWeakPtr(), std::move(callback),
+                       std::move(params)));
+  }
+
+  // TODO(cmtm): Export host-side /data to the VM, and remove the function.
+  void CreateDiskImageAfterSizeCheck(chromeos::VoidDBusMethodCallback callback,
+                                     std::vector<std::string> params,
+                                     int64_t free_disk_bytes) {
+    VLOG(2) << "Got free disk size: " << free_disk_bytes;
+    if (user_id_hash_.empty()) {
+      LOG(ERROR) << "User ID hash is not set";
+      std::move(callback).Run(false);
+      return;
+    }
+
+    vm_tools::concierge::CreateDiskImageRequest request;
+    request.set_cryptohome_id(user_id_hash_);
+    request.set_disk_path(kArcVmName);
+    // The type of disk image to be created.
+    request.set_image_type(vm_tools::concierge::DISK_IMAGE_AUTO);
+    request.set_storage_location(vm_tools::concierge::STORAGE_CRYPTOHOME_ROOT);
+    // The logical size of the new disk image, in bytes.
+    request.set_disk_size(free_disk_bytes / 2);
+
+    GetConciergeClient()->CreateDiskImage(
+        std::move(request),
+        base::BindOnce(&ArcVmClientAdapter::OnDiskImageCreated,
+                       weak_factory_.GetWeakPtr(), std::move(callback),
+                       std::move(params)));
+  }
+
+  void OnDiskImageCreated(
+      chromeos::VoidDBusMethodCallback callback,
+      std::vector<std::string> params,
+      base::Optional<vm_tools::concierge::CreateDiskImageResponse> reply) {
+    if (!reply.has_value()) {
+      LOG(ERROR) << "Failed to create disk image. Empty response.";
+      std::move(callback).Run(false);
+      return;
+    }
+
+    const vm_tools::concierge::CreateDiskImageResponse& response =
+        reply.value();
+    if (response.status() != vm_tools::concierge::DISK_STATUS_EXISTS &&
+        response.status() != vm_tools::concierge::DISK_STATUS_CREATED) {
+      LOG(ERROR) << "Failed to create disk image: "
+                 << response.failure_reason();
+      std::move(callback).Run(false);
+      return;
+    }
+    VLOG(1) << "Disk image for arcvm created. status=" << response.status()
+            << ", disk=" << response.disk_path();
+
+    DCHECK(!user_id_hash_.empty());
+    vm_tools::concierge::StartArcVmRequest request;
+    request.set_name(kArcVmName);
+    request.set_owner_id(user_id_hash_);
+
+    request.add_params("root=/dev/vda");
+    // TODO(b/135229848): Use ro unless rw is requested.
+    request.add_params("rw");
+    request.add_params("init=/init");
+    for (auto& param : params)
+      request.add_params(std::move(param));
+
+    vm_tools::concierge::VirtualMachineSpec* vm = request.mutable_vm();
+    vm->set_kernel(kKernelPath);
+    // Add / as /dev/vda.
+    vm->set_rootfs(kRootFsPath);
+
+    // Add /data as /dev/vdb.
+    vm_tools::concierge::DiskImage* disk_image = request.add_disks();
+    disk_image->set_path(response.disk_path());
+    disk_image->set_image_type(vm_tools::concierge::DISK_IMAGE_AUTO);
+    disk_image->set_writable(true);
+    disk_image->set_do_mount(true);
+    // Add /vendor as /dev/vdc.
+    disk_image = request.add_disks();
+    disk_image->set_path(kVendorImagePath);
+    disk_image->set_image_type(vm_tools::concierge::DISK_IMAGE_AUTO);
+    disk_image->set_writable(false);
+    disk_image->set_do_mount(true);
+
+    GetConciergeClient()->StartArcVm(
+        request,
+        base::BindOnce(&ArcVmClientAdapter::OnVmStarted,
+                       weak_factory_.GetWeakPtr(), std::move(callback)));
+  }
+
+  void OnVmStarted(chromeos::VoidDBusMethodCallback callback,
+                   base::Optional<vm_tools::concierge::StartVmResponse> reply) {
+    if (!reply.has_value()) {
+      LOG(ERROR) << "Failed to start arcvm. Empty response.";
+      std::move(callback).Run(false);
+      return;
+    }
+
+    const vm_tools::concierge::StartVmResponse& response = reply.value();
+    if (response.status() != vm_tools::concierge::VM_STATUS_RUNNING) {
+      LOG(ERROR) << "Failed to start arcvm: status=" << response.status()
+                 << ", reason=" << response.failure_reason();
+      std::move(callback).Run(false);
+      return;
+    }
+    VLOG(1) << "arcvm started.";
+    std::move(callback).Run(true);
+    // TODO(yusukes): Share folders like Downloads/ with ARCVM.
+  }
+
+  void OnVmStopped(base::Optional<vm_tools::concierge::StopVmResponse> reply) {
+    if (!reply.has_value()) {
+      LOG(ERROR) << "Failed to stop arcvm. Empty response.";
+    } else {
+      const vm_tools::concierge::StopVmResponse& response = reply.value();
+      if (!response.success())
+        LOG(ERROR) << "Failed to stop arcvm: " << response.failure_reason();
+    }
+    OnArcInstanceStopped();
+  }
+
+  // A hash of the primary profile user ID.
+  std::string user_id_hash_;
+
   // For callbacks.
   base::WeakPtrFactory<ArcVmClientAdapter> weak_factory_;
 
diff --git a/components/arc/session/arc_vm_client_adapter_unittest.cc b/components/arc/session/arc_vm_client_adapter_unittest.cc
new file mode 100644
index 0000000..a957206e
--- /dev/null
+++ b/components/arc/session/arc_vm_client_adapter_unittest.cc
@@ -0,0 +1,303 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/arc/session/arc_vm_client_adapter.h"
+
+#include <memory>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/memory/ptr_util.h"
+#include "base/run_loop.h"
+#include "base/task/post_task.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/fake_concierge_client.h"
+#include "chromeos/dbus/fake_debug_daemon_client.h"
+#include "chromeos/dbus/login_manager/arc.pb.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace arc {
+namespace {
+
+constexpr const char kUserIdHash[] = "this_is_a_valid_user_id_hash";
+
+// A debugd client that can fail to start Concierge.
+// TODO(yusukes): Merge the feature to FakeDebugDaemonClient.
+class TestDebugDaemonClient : public chromeos::FakeDebugDaemonClient {
+ public:
+  TestDebugDaemonClient() = default;
+  ~TestDebugDaemonClient() override = default;
+
+  void StartConcierge(ConciergeCallback callback) override {
+    start_concierge_called_ = true;
+    std::move(callback).Run(start_concierge_result_);
+  }
+
+  bool start_concierge_called() const { return start_concierge_called_; }
+  void set_start_concierge_result(bool result) {
+    start_concierge_result_ = result;
+  }
+
+ private:
+  bool start_concierge_called_ = false;
+  bool start_concierge_result_ = true;
+
+  DISALLOW_COPY_AND_ASSIGN(TestDebugDaemonClient);
+};
+
+// A concierge that remembers the parameter passed to StartArcVm.
+// TODO(yusukes): Merge the feature to FakeConciergeClient.
+class TestConciergeClient : public chromeos::FakeConciergeClient {
+ public:
+  TestConciergeClient() = default;
+  ~TestConciergeClient() override = default;
+
+  void StartArcVm(
+      const vm_tools::concierge::StartArcVmRequest& request,
+      chromeos::DBusMethodCallback<vm_tools::concierge::StartVmResponse>
+          callback) override {
+    start_arc_vm_request_ = request;
+    chromeos::FakeConciergeClient::StartArcVm(request, std::move(callback));
+  }
+
+  const vm_tools::concierge::StartArcVmRequest& start_arc_vm_request() const {
+    return start_arc_vm_request_;
+  }
+
+ private:
+  vm_tools::concierge::StartArcVmRequest start_arc_vm_request_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestConciergeClient);
+};
+
+class ArcVmClientAdapterTest : public testing::Test,
+                               public ArcClientAdapter::Observer {
+ public:
+  ArcVmClientAdapterTest() {
+    // Create and set new fake clients every time to reset clients' status.
+    chromeos::DBusThreadManager::GetSetterForTesting()->SetDebugDaemonClient(
+        std::make_unique<TestDebugDaemonClient>());
+    chromeos::DBusThreadManager::GetSetterForTesting()->SetConciergeClient(
+        std::make_unique<TestConciergeClient>());
+  }
+
+  ~ArcVmClientAdapterTest() override {
+    chromeos::DBusThreadManager::GetSetterForTesting()->SetConciergeClient(
+        nullptr);
+    chromeos::DBusThreadManager::GetSetterForTesting()->SetDebugDaemonClient(
+        nullptr);
+  }
+
+  void SetUp() override {
+    run_loop_ = std::make_unique<base::RunLoop>();
+    adapter_ = CreateArcVmClientAdapter();
+    arc_instance_stopped_called_ = false;
+    adapter_->AddObserver(this);
+
+    // The fake client returns VM_STATUS_STARTING by default. Change it
+    // to VM_STATUS_RUNNING which is used by ARCVM.
+    vm_tools::concierge::StartVmResponse start_vm_response;
+    start_vm_response.set_status(vm_tools::concierge::VM_STATUS_RUNNING);
+    GetTestConciergeClient()->set_start_vm_response(start_vm_response);
+  }
+
+  void TearDown() override {
+    adapter_->RemoveObserver(this);
+    adapter_.reset();
+    run_loop_.reset();
+  }
+
+  // ArcClientAdapter::Observer:
+  void ArcInstanceStopped() override {
+    arc_instance_stopped_called_ = true;
+    run_loop()->Quit();
+  }
+
+  void ExpectTrueThenQuit(bool result) {
+    EXPECT_TRUE(result);
+    run_loop()->Quit();
+  }
+
+  void ExpectFalseThenQuit(bool result) {
+    EXPECT_FALSE(result);
+    run_loop()->Quit();
+  }
+
+ protected:
+  bool GetStartConciergeCalled() {
+    return GetTestDebugDaemonClient()->start_concierge_called();
+  }
+
+  void SetStartConciergeResponse(bool response) {
+    GetTestDebugDaemonClient()->set_start_concierge_result(response);
+  }
+
+  void SetValidUserIdHash() { adapter()->SetUserIdHashForProfile(kUserIdHash); }
+
+  void RestartRunLoop() { run_loop_ = std::make_unique<base::RunLoop>(); }
+
+  base::RunLoop* run_loop() { return run_loop_.get(); }
+  ArcClientAdapter* adapter() { return adapter_.get(); }
+  bool arc_instance_stopped_called() const {
+    return arc_instance_stopped_called_;
+  }
+  TestConciergeClient* GetTestConciergeClient() {
+    return static_cast<TestConciergeClient*>(
+        chromeos::DBusThreadManager::Get()->GetConciergeClient());
+  }
+
+ private:
+  TestDebugDaemonClient* GetTestDebugDaemonClient() {
+    return static_cast<TestDebugDaemonClient*>(
+        chromeos::DBusThreadManager::Get()->GetDebugDaemonClient());
+  }
+
+  std::unique_ptr<base::RunLoop> run_loop_;
+  std::unique_ptr<ArcClientAdapter> adapter_;
+  bool arc_instance_stopped_called_;
+
+  content::TestBrowserThreadBundle test_browser_thread_bundle_;
+
+  DISALLOW_COPY_AND_ASSIGN(ArcVmClientAdapterTest);
+};
+
+// Tests that SetUserIdHashForProfile() doesn't crash.
+TEST_F(ArcVmClientAdapterTest, SetUserIdHashForProfile) {
+  adapter()->SetUserIdHashForProfile("deadbeef");
+}
+
+// Tests that StartMiniArc() always succeeds.
+TEST_F(ArcVmClientAdapterTest, StartMiniArc) {
+  StartArcMiniContainerRequest req;
+  adapter()->StartMiniArc(
+      req, base::BindOnce(&ArcVmClientAdapterTest::ExpectTrueThenQuit,
+                          base::Unretained(this)));
+  run_loop()->Run();
+  // Also confirm that no VM is started. ARCVM doesn't support mini ARC.
+  EXPECT_FALSE(GetTestConciergeClient()->start_arc_vm_called());
+}
+
+// Tests that StopArcInstance() notifies the observer.
+TEST_F(ArcVmClientAdapterTest, StopArcInstance) {
+  adapter()->StopArcInstance();
+  run_loop()->Run();
+  EXPECT_TRUE(GetTestConciergeClient()->stop_vm_called());
+  EXPECT_TRUE(arc_instance_stopped_called());
+}
+
+// Tests that UpgradeArc() handles StartConcierge() failures properly. This test
+// inherits ArcVmClientAdapterTest because it uses its own DebugDaemonClient
+// instead of the default one for testing.
+TEST_F(ArcVmClientAdapterTest, UpgradeArc_StartConciergeFailure) {
+  SetValidUserIdHash();
+  // Inject failure to StartConcierge().
+  SetStartConciergeResponse(false);
+  UpgradeArcContainerRequest req;
+  adapter()->UpgradeArc(
+      req, base::BindOnce(&ArcVmClientAdapterTest::ExpectFalseThenQuit,
+                          base::Unretained(this)));
+  run_loop()->Run();
+  EXPECT_TRUE(GetStartConciergeCalled());
+  EXPECT_FALSE(GetTestConciergeClient()->start_arc_vm_called());
+  EXPECT_FALSE(arc_instance_stopped_called());
+
+  // Try to stop the VM.
+  RestartRunLoop();
+  adapter()->StopArcInstance();
+  run_loop()->Run();
+  EXPECT_TRUE(GetTestConciergeClient()->stop_vm_called());
+  EXPECT_TRUE(arc_instance_stopped_called());
+}
+
+// Tests that "no user ID hash" failure is handled properly.
+TEST_F(ArcVmClientAdapterTest, UpgradeArc_NoUserId) {
+  // Don't call SetValidUserIdHash(). Note that we cannot call StartArcVm()
+  // without a valid ID.
+  UpgradeArcContainerRequest req;
+  adapter()->UpgradeArc(
+      req, base::BindOnce(&ArcVmClientAdapterTest::ExpectFalseThenQuit,
+                          base::Unretained(this)));
+  run_loop()->Run();
+  EXPECT_TRUE(GetStartConciergeCalled());
+  EXPECT_FALSE(GetTestConciergeClient()->start_arc_vm_called());
+  EXPECT_FALSE(arc_instance_stopped_called());
+
+  // Try to stop the VM.
+  RestartRunLoop();
+  adapter()->StopArcInstance();
+  run_loop()->Run();
+  EXPECT_TRUE(GetTestConciergeClient()->stop_vm_called());
+  EXPECT_TRUE(arc_instance_stopped_called());
+}
+
+// Tests that StartArcVm() failure is handled properly.
+TEST_F(ArcVmClientAdapterTest, UpgradeArc_StartArcVmFailure) {
+  SetValidUserIdHash();
+  // Inject failure to StartArcVm().
+  vm_tools::concierge::StartVmResponse start_vm_response;
+  start_vm_response.set_status(vm_tools::concierge::VM_STATUS_UNKNOWN);
+  GetTestConciergeClient()->set_start_vm_response(start_vm_response);
+
+  UpgradeArcContainerRequest req;
+  adapter()->UpgradeArc(
+      req, base::BindOnce(&ArcVmClientAdapterTest::ExpectFalseThenQuit,
+                          base::Unretained(this)));
+  run_loop()->Run();
+  EXPECT_TRUE(GetStartConciergeCalled());
+  EXPECT_TRUE(GetTestConciergeClient()->start_arc_vm_called());
+  EXPECT_FALSE(arc_instance_stopped_called());
+
+  // Try to stop the VM.
+  RestartRunLoop();
+  adapter()->StopArcInstance();
+  run_loop()->Run();
+  EXPECT_TRUE(GetTestConciergeClient()->stop_vm_called());
+  EXPECT_TRUE(arc_instance_stopped_called());
+}
+
+// Tests that successful StartArcVm() call is handled properly.
+TEST_F(ArcVmClientAdapterTest, UpgradeArc_Success) {
+  SetValidUserIdHash();
+  UpgradeArcContainerRequest req;
+  adapter()->UpgradeArc(
+      req, base::BindOnce(&ArcVmClientAdapterTest::ExpectTrueThenQuit,
+                          base::Unretained(this)));
+  run_loop()->Run();
+  EXPECT_TRUE(GetStartConciergeCalled());
+  EXPECT_TRUE(GetTestConciergeClient()->start_arc_vm_called());
+  EXPECT_FALSE(arc_instance_stopped_called());
+
+  // Try to stop the VM.
+  RestartRunLoop();
+  adapter()->StopArcInstance();
+  run_loop()->Run();
+  EXPECT_TRUE(GetTestConciergeClient()->stop_vm_called());
+  EXPECT_TRUE(arc_instance_stopped_called());
+}
+
+// Tests that StartArcVm() is called with valid parameters.
+TEST_F(ArcVmClientAdapterTest, UpgradeArc_StartArcVmParams) {
+  SetValidUserIdHash();
+  UpgradeArcContainerRequest req;
+  adapter()->UpgradeArc(
+      req, base::BindOnce(&ArcVmClientAdapterTest::ExpectTrueThenQuit,
+                          base::Unretained(this)));
+  run_loop()->Run();
+  ASSERT_TRUE(GetTestConciergeClient()->start_arc_vm_called());
+
+  // Verify parameters
+  const auto& params = GetTestConciergeClient()->start_arc_vm_request();
+  EXPECT_EQ("arcvm", params.name());
+  EXPECT_EQ(kUserIdHash, params.owner_id());
+  EXPECT_FALSE(params.vm().kernel().empty());
+  // Make sure system.raw.img is passed.
+  EXPECT_FALSE(params.vm().rootfs().empty());
+  // Make sure vendor.raw.img is passed.
+  EXPECT_LE(1, params.disks_size());
+  EXPECT_LT(0, params.params_size());
+}
+
+}  // namespace
+}  // namespace arc
diff --git a/components/autofill/core/browser/validation_unittest.cc b/components/autofill/core/browser/validation_unittest.cc
index dbaa1e8..013b851 100644
--- a/components/autofill/core/browser/validation_unittest.cc
+++ b/components/autofill/core/browser/validation_unittest.cc
@@ -451,11 +451,13 @@
 class AutofillIsUPIVirtualPaymentAddress
     : public testing::TestWithParam<std::string> {};
 
-TEST_P(AutofillIsUPIVirtualPaymentAddress, IsUPIVirtualPaymentAddress) {
+TEST_P(AutofillIsUPIVirtualPaymentAddress, IsUPIVirtualPaymentAddress_Banks) {
   // Expected format is user@bank
-  EXPECT_TRUE(IsUPIVirtualPaymentAddress(ASCIIToUTF16("user@" + GetParam())));
+  EXPECT_TRUE(
+      IsUPIVirtualPaymentAddress(ASCIIToUTF16("user.name-1@" + GetParam())));
 
-  // Deviations should not match: bank, @bank, user@prefixbank, user@banksuffix.
+  // Deviations should not match: bank, @bank, user@prefixbank, user@banksuffix,
+  // disallowed symbols.
   EXPECT_FALSE(IsUPIVirtualPaymentAddress(ASCIIToUTF16(GetParam())));
   EXPECT_FALSE(IsUPIVirtualPaymentAddress(ASCIIToUTF16(GetParam() + "@")));
   EXPECT_FALSE(IsUPIVirtualPaymentAddress(ASCIIToUTF16("@" + GetParam())));
@@ -463,6 +465,7 @@
       IsUPIVirtualPaymentAddress(ASCIIToUTF16("user@invalid" + GetParam())));
   EXPECT_FALSE(
       IsUPIVirtualPaymentAddress(ASCIIToUTF16("user@" + GetParam() + ".com")));
+  EXPECT_FALSE(IsUPIVirtualPaymentAddress(ASCIIToUTF16("~user@" + GetParam())));
 }
 
 INSTANTIATE_TEST_SUITE_P(UPIVirtualPaymentAddress,
@@ -494,4 +497,15 @@
                                          "vijb",
                                          "ybl"));
 
+TEST_P(AutofillIsUPIVirtualPaymentAddress, IsUPIVirtualPaymentAddress_Others) {
+  EXPECT_TRUE(
+      IsUPIVirtualPaymentAddress(ASCIIToUTF16("12345@HDFC0000001.ifsc.npci")));
+  EXPECT_TRUE(
+      IsUPIVirtualPaymentAddress(ASCIIToUTF16("234567890123@aadhaar.npci")));
+  EXPECT_TRUE(
+      IsUPIVirtualPaymentAddress(ASCIIToUTF16("9800011111@mobile.npci")));
+  EXPECT_TRUE(
+      IsUPIVirtualPaymentAddress(ASCIIToUTF16("1234123412341234@rupay.npci")));
+}
+
 }  // namespace autofill
diff --git a/components/autofill/core/common/autofill_regex_constants.cc b/components/autofill/core/common/autofill_regex_constants.cc
index 6874f809..16c74348 100644
--- a/components/autofill/core/common/autofill_regex_constants.cc
+++ b/components/autofill/core/common/autofill_regex_constants.cc
@@ -384,63 +384,118 @@
 // validation.cc
 /////////////////////////////////////////////////////////////////////////////
 const char kUPIVirtualPaymentAddressRe[] =
-    "^\\w+@("
-    "airtel|"       // My Airtel-Recharge, Bill, Bank
-    "allbank|"      // Allahabad Bank UPI
-    "andb|"         // Andhra Bank ONE
-    "axisbank|"     // Axis Pay
-    "axisgo|"       // Ola
-    "barodampay|"   // Baroda MPay
-    "boi|"          // BHIM BOI UPI
-    "centralbank|"  // Cent UPI
-    "cnrb|"         // Canara Bank UPI - Empower
-    "csbpay|"       // CSB UPI
-    "dbs|"          // digibank by DBS
-    "dcb|"          // DCB Bank
-    "denabank|"     // Dena Bank E-UPI
-    "fbl|"          // Cointab
-    "federal|"      // Lotza
-    "hdfcbank|"     // HDFC Bank MobileBanking
-    "hsbc|"         // HSBC Simply Pay
-    "icici|"        // Pockets- ICICI Bank
-    "idbi|"         // PayWiz
-    "idfcbank|"     // IDFC Bank UPI App
-    "indianbank|"   // Indian Bank UPI
-    "indus|"        // Indus Pay
-    "iob|"          // IOB UPI
-    "jkb|"          // BHIM JK Bank UPI
-    "jsb|"          // JetPay UPI
-    "kaypay|"       // KayPay
-    "kbl|"          // KBL Smartz
-    "kotak|"        // kotak Mahindra Bank
-    "kvb|"          // KVB Upay
-    "lvb|"          // LVB UPay
-    "mahb|"         // MAHAUPI
-    "obc|"          // Oriental BHIM UPI
-    "okicici|"      // Tez
-    "okhdfcbank|"   // Tez
-    "okaxis|"       // Tez
-    "paytm|"        // Paytm
-    "pingpay|"      // Samsung Pay
-    "pnb|"          // PNB UPI
-    "pockets|"      // Pockets- ICICI Bank
-    "psb|"          // PSB UPI App
-    "rbl|"          // RBL Pay
-    "sbi|"          // SBI Pay
-    "scb|"          // Standard Chartered
-    "sib|"          // SIB M-Pay (UPI Pay)
-    "syndicate|"    // Synd UPI
-    "tjsb|"         // TranZapp
-    "ubi|"          // United UPI
-    "uboi|"         // Union Bank UPI
-    "uco|"          // UCO UPI
-    "unionbank|"    // Union Bank UPI
-    "united|"       // United UPI
-    "upi|"          // BHIM Bharat Interface for Money
-    "utbi|"         // United UPI
-    "vijb|"         // Vijaya UPI App
-    "ybl|"          // Yes Pay
-    "yesbank"       // NuPay
+    "^[\\w.+-_]+@("        // eg user@
+    "\\w+\\.ifsc\\.npci|"  // IFSC code
+    "aadhaar\\.npci|"      // Aadhaar number
+    "mobile\\.npci|"       // Mobile number
+    "rupay\\.npci|"        // RuPay card number
+    "airtel|"  // List of banks https://www.npci.org.in/upi-live-members
+    "airtelpaymentsbank|"
+    "albk|"
+    "allahabadbank|"
+    "allbank|"
+    "andb|"
+    "apb|"
+    "apl|"
+    "axis|"
+    "axisbank|"
+    "axisgo|"
+    "bandhan|"
+    "barodampay|"
+    "birla|"
+    "boi|"
+    "cbin|"
+    "cboi|"
+    "centralbank|"
+    "cmsidfc|"
+    "cnrb|"
+    "csbcash|"
+    "csbpay|"
+    "cub|"
+    "dbs|"
+    "dcb|"
+    "dcbbank|"
+    "denabank|"
+    "dlb|"
+    "eazypay|"
+    "equitas|"
+    "ezeepay|"
+    "fbl|"
+    "federal|"
+    "finobank|"
+    "hdfcbank|"
+    "hsbc|"
+    "icici|"
+    "idbi|"
+    "idbibank|"
+    "idfc|"
+    "idfcbank|"
+    "idfcnetc|"
+    "ikwik|"
+    "imobile|"
+    "indbank|"
+    "indianbank|"
+    "indianbk|"
+    "indus|"
+    "iob|"
+    "jkb|"
+    "jsb|"
+    "jsbp|"
+    "karb|"
+    "karurvysyabank|"
+    "kaypay|"
+    "kbl|"
+    "kbl052|"
+    "kmb|"
+    "kmbl|"
+    "kotak|"
+    "kvb|"
+    "kvbank|"
+    "lime|"
+    "lvb|"
+    "lvbank|"
+    "mahb|"
+    "obc|"
+    "okaxis|"
+    "okbizaxis|"
+    "okhdfcbank|"
+    "okicici|"
+    "oksbi|"
+    "paytm|"
+    "payzapp|"
+    "pingpay|"
+    "pnb|"
+    "pockets|"
+    "psb|"
+    "purz|"
+    "rajgovhdfcbank|"
+    "rbl|"
+    "sbi|"
+    "sc|"
+    "scb|"
+    "scbl|"
+    "scmobile|"
+    "sib|"
+    "srcb|"
+    "synd|"
+    "syndbank|"
+    "syndicate|"
+    "tjsb|"
+    "tjsp|"
+    "ubi|"
+    "uboi|"
+    "uco|"
+    "unionbank|"
+    "unionbankofindia|"
+    "united|"
+    "upi|"
+    "utbi|"
+    "vijayabank|"
+    "vijb|"
+    "vjb|"
+    "ybl|"
+    "yesbank|"
+    "yesbankltd"
     ")$";
 
 /////////////////////////////////////////////////////////////////////////////
diff --git a/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureConsumer.java b/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureConsumer.java
index f4f8d46..a2b4e58 100644
--- a/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureConsumer.java
+++ b/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureConsumer.java
@@ -7,7 +7,8 @@
 import org.chromium.content_public.browser.WebContents;
 
 /**
- * This abstract class is for consumer to consume the captured content.
+ * This abstract class is for consumer to consume the captured content. This object is used by
+ * multiple objects and typically released by the last RFH in the WebContents.
  */
 public abstract class ContentCaptureConsumer {
     private ContentCaptureReceiverManager mManager;
@@ -45,7 +46,8 @@
 
     public void onWebContentsChanged(WebContents current) {
         if (!ContentCaptureFeatures.isEnabled()) return;
-        if (mManager != null) mManager.setContentCaptureConsumer(null);
+        // Not reset previous mManager's ContentCaptureConsumer, because it will be used to notify
+        // of the removal of session.
         if (current != null) {
             mManager = ContentCaptureReceiverManager.createOrGet(current);
             mManager.setContentCaptureConsumer(this);
@@ -53,10 +55,4 @@
             mManager = null;
         }
     }
-
-    public void destroy() {
-        if (mManager == null) return;
-        mManager.setContentCaptureConsumer(null);
-        mManager = null;
-    }
 }
diff --git a/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureData.java b/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureData.java
index 94baa45..237e4b2 100644
--- a/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureData.java
+++ b/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureData.java
@@ -6,6 +6,7 @@
 
 import android.graphics.Rect;
 
+import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
 
 import java.util.ArrayList;
@@ -21,7 +22,8 @@
     private ArrayList<ContentCaptureData> mChildren;
 
     @CalledByNative
-    private static ContentCaptureData createContentCaptureData(
+    @VisibleForTesting
+    public static ContentCaptureData createContentCaptureData(
             Object parent, long id, String value, int x, int y, int width, int height) {
         ContentCaptureData data = new ContentCaptureData(id, value, x, y, width, height);
         if (parent != null) {
diff --git a/components/content_capture/browser/content_capture_receiver.cc b/components/content_capture/browser/content_capture_receiver.cc
index 6c74d643..0ae5838 100644
--- a/components/content_capture/browser/content_capture_receiver.cc
+++ b/components/content_capture/browser/content_capture_receiver.cc
@@ -17,7 +17,12 @@
 ContentCaptureReceiver::ContentCaptureReceiver(content::RenderFrameHost* rfh)
     : bindings_(this), rfh_(rfh), id_(GetIdFrom(rfh)) {}
 
-ContentCaptureReceiver::~ContentCaptureReceiver() = default;
+ContentCaptureReceiver::~ContentCaptureReceiver() {
+  auto* manager = ContentCaptureReceiverManager::FromWebContents(
+      content::WebContents::FromRenderFrameHost(rfh_));
+  DCHECK(manager);
+  manager->DidRemoveSession(this);
+}
 
 int64_t ContentCaptureReceiver::GetIdFrom(content::RenderFrameHost* rfh) {
   return static_cast<int64_t>(rfh->GetProcess()->GetID()) << 32 |
@@ -77,22 +82,22 @@
 }
 
 void ContentCaptureReceiver::StartCapture() {
-  if (content_capture_enabled)
+  if (content_capture_enabled_)
     return;
 
   if (auto& sender = GetContentCaptureSender()) {
     sender->StartCapture();
-    content_capture_enabled = true;
+    content_capture_enabled_ = true;
   }
 }
 
 void ContentCaptureReceiver::StopCapture() {
-  if (!content_capture_enabled)
+  if (!content_capture_enabled_)
     return;
 
   if (auto& sender = GetContentCaptureSender()) {
     sender->StopCapture();
-    content_capture_enabled = false;
+    content_capture_enabled_ = false;
   }
 }
 
@@ -110,20 +115,17 @@
   if (url == frame_content_capture_data_.value)
     return frame_content_capture_data_;
 
-  bool should_remove_session = frame_content_capture_data_.id != 0;
+  if (frame_content_capture_data_.id != 0) {
+    auto* manager = ContentCaptureReceiverManager::FromWebContents(
+        content::WebContents::FromRenderFrameHost(rfh_));
+    manager->DidRemoveSession(this);
+  }
+
   frame_content_capture_data_.id = id_;
   frame_content_capture_data_.value = url;
   const base::Optional<gfx::Size>& size = rfh_->GetFrameSize();
   if (size.has_value())
     frame_content_capture_data_.bounds = gfx::Rect(size.value());
-
-  // frame_content_capture_data_ must be set to new value before removing
-  // sesesion, otherwises, it causes infinite loop.
-  if (should_remove_session) {
-    auto* manager = ContentCaptureReceiverManager::FromWebContents(
-        content::WebContents::FromRenderFrameHost(rfh_));
-    manager->DidRemoveSession(this);
-  }
   return frame_content_capture_data_;
 }
 
diff --git a/components/content_capture/browser/content_capture_receiver.h b/components/content_capture/browser/content_capture_receiver.h
index 66184a94..e3f28308 100644
--- a/components/content_capture/browser/content_capture_receiver.h
+++ b/components/content_capture/browser/content_capture_receiver.h
@@ -41,6 +41,9 @@
 
   // Return ContentCaptureData of the associated frame.
   const ContentCaptureData& GetFrameContentCaptureData();
+  const ContentCaptureData& GetFrameContentCaptureDataLastSeen() const {
+    return frame_content_capture_data_;
+  }
 
  private:
   const mojom::ContentCaptureSenderAssociatedPtr& GetContentCaptureSender();
@@ -56,7 +59,7 @@
   // frame's; if the Id is generated in sender, the
   // ContentCaptureReceiverManager can't get parent frame id in both cases.
   int64_t id_;
-  bool content_capture_enabled = false;
+  bool content_capture_enabled_ = false;
   mojom::ContentCaptureSenderAssociatedPtr content_capture_sender_ = nullptr;
   DISALLOW_COPY_AND_ASSIGN(ContentCaptureReceiver);
 };
diff --git a/components/content_capture/browser/content_capture_receiver_manager.cc b/components/content_capture/browser/content_capture_receiver_manager.cc
index 56441eed..d3140e1 100644
--- a/components/content_capture/browser/content_capture_receiver_manager.cc
+++ b/components/content_capture/browser/content_capture_receiver_manager.cc
@@ -130,8 +130,15 @@
   ContentCaptureSession session;
   // The session should include the removed frame that the
   // |content_capture_receiver| associated with.
-  BuildContentCaptureSession(content_capture_receiver,
-                             false /* ancestor_only */, &session);
+  // We want the last reported content capture session, instead of the current
+  // one for the scenario like below:
+  // Main frame navigates to different url which has the same origin of previous
+  // one, it triggers the previous child frame being removed but the main RFH
+  // unchanged, if we use BuildContentCaptureSession() which always use the
+  // current URL to build session, the new session will be created for current
+  // main frame URL, the returned ContentCaptureSession is wrong.
+  if (!BuildContentCaptureSessionLastSeen(content_capture_receiver, &session))
+    return;
   DidRemoveSession(session);
 }
 
@@ -156,4 +163,20 @@
   }
 }
 
+bool ContentCaptureReceiverManager::BuildContentCaptureSessionLastSeen(
+    ContentCaptureReceiver* content_capture_receiver,
+    ContentCaptureSession* session) {
+  session->push_back(
+      content_capture_receiver->GetFrameContentCaptureDataLastSeen());
+  content::RenderFrameHost* rfh = content_capture_receiver->rfh()->GetParent();
+  while (rfh) {
+    ContentCaptureReceiver* receiver = ContentCaptureReceiverForFrame(rfh);
+    if (!receiver)
+      return false;
+    session->push_back(receiver->GetFrameContentCaptureDataLastSeen());
+    rfh = receiver->rfh()->GetParent();
+  }
+  return true;
+}
+
 }  // namespace content_capture
diff --git a/components/content_capture/browser/content_capture_receiver_manager.h b/components/content_capture/browser/content_capture_receiver_manager.h
index 79bb2cf2..a313f6fc 100644
--- a/components/content_capture/browser/content_capture_receiver_manager.h
+++ b/components/content_capture/browser/content_capture_receiver_manager.h
@@ -86,6 +86,13 @@
       bool ancestor_only,
       ContentCaptureSession* session);
 
+  // Builds ContentCaptureSession for |content_capture_receiver| into |session|,
+  // return true if succeed, this method returns the session that has been
+  // reported and shall be used for removing session.
+  bool BuildContentCaptureSessionLastSeen(
+      ContentCaptureReceiver* content_capture_receiver,
+      ContentCaptureSession* session);
+
   ContentCaptureReceiver* ContentCaptureReceiverForFrame(
       content::RenderFrameHost* render_frame_host);
 
diff --git a/components/content_capture/browser/content_capture_receiver_test.cc b/components/content_capture/browser/content_capture_receiver_test.cc
index fcb66dd..dd4541f3 100644
--- a/components/content_capture/browser/content_capture_receiver_test.cc
+++ b/components/content_capture/browser/content_capture_receiver_test.cc
@@ -50,17 +50,38 @@
       nullptr;
 };
 
+class SessionRemovedTestHelper {
+ public:
+  void DidRemoveSession(const ContentCaptureSession& data) {
+    removed_sessions_.push_back(data);
+  }
+
+  const std::vector<ContentCaptureSession>& removed_sessions() const {
+    return removed_sessions_;
+  }
+
+  void Reset() { removed_sessions_.clear(); }
+
+ private:
+  std::vector<ContentCaptureSession> removed_sessions_;
+};
+
 // The helper class implements ContentCaptureReceiverManager and keeps the
 // result for verification.
 class ContentCaptureReceiverManagerHelper
     : public ContentCaptureReceiverManager {
  public:
-  static void Create(content::WebContents* web_contents) {
-    new ContentCaptureReceiverManagerHelper(web_contents);
+  static void Create(content::WebContents* web_contents,
+                     SessionRemovedTestHelper* session_removed_test_helper) {
+    new ContentCaptureReceiverManagerHelper(web_contents,
+                                            session_removed_test_helper);
   }
 
-  ContentCaptureReceiverManagerHelper(content::WebContents* web_contents)
-      : ContentCaptureReceiverManager(web_contents) {}
+  ContentCaptureReceiverManagerHelper(
+      content::WebContents* web_contents,
+      SessionRemovedTestHelper* session_removed_test_helper)
+      : ContentCaptureReceiverManager(web_contents),
+        session_removed_test_helper_(session_removed_test_helper) {}
 
   void DidCaptureContent(const ContentCaptureSession& parent_session,
                          const ContentCaptureData& data) override {
@@ -81,7 +102,9 @@
   }
 
   void DidRemoveSession(const ContentCaptureSession& data) override {
-    removed_session_ = data;
+    if (session_removed_test_helper_)
+      session_removed_test_helper_->DidRemoveSession(data);
+    removed_sessions_.push_back(data);
   }
 
   bool ShouldCapture(const GURL& url) override { return false; }
@@ -100,12 +123,14 @@
 
   const ContentCaptureData& updated_data() const { return updated_data_; }
 
-  const ContentCaptureSession& removed_session() const {
-    return removed_session_;
+  const std::vector<ContentCaptureSession>& removed_sessions() const {
+    return removed_sessions_;
   }
 
   const std::vector<int64_t>& removed_ids() const { return removed_ids_; }
 
+  void Reset() { removed_sessions_.clear(); }
+
  private:
   ContentCaptureSession parent_session_;
   ContentCaptureSession updated_parent_session_;
@@ -113,14 +138,16 @@
   ContentCaptureData captured_data_;
   ContentCaptureData updated_data_;
   std::vector<int64_t> removed_ids_;
-  ContentCaptureSession removed_session_;
+  std::vector<ContentCaptureSession> removed_sessions_;
+  SessionRemovedTestHelper* session_removed_test_helper_;
 };
 
 class ContentCaptureReceiverTest : public content::RenderViewHostTestHarness {
  public:
   void SetUp() override {
     content::RenderViewHostTestHarness::SetUp();
-    ContentCaptureReceiverManagerHelper::Create(web_contents());
+    ContentCaptureReceiverManagerHelper::Create(web_contents(),
+                                                &session_removed_test_helper_);
     content_capture_receiver_manager_helper_ =
         static_cast<ContentCaptureReceiverManagerHelper*>(
             ContentCaptureReceiverManager::FromWebContents(web_contents()));
@@ -167,6 +194,7 @@
   }
 
   void NavigateMainFrame(const GURL& url) {
+    content_capture_receiver_manager_helper()->Reset();
     NavigateAndCommit(url);
     main_frame_ = web_contents()->GetMainFrame();
   }
@@ -237,6 +265,10 @@
     return content_capture_receiver_manager_helper_;
   }
 
+  SessionRemovedTestHelper* session_removed_test_helper() {
+    return &session_removed_test_helper_;
+  }
+
   void VerifySession(const ContentCaptureSession& expected,
                      const ContentCaptureSession& result) const {
     EXPECT_EQ(expected.size(), result.size());
@@ -276,6 +308,17 @@
     run_loop.RunUntilIdle();
   }
 
+  void BuildChildSession(const ContentCaptureSession& parent,
+                         const ContentCaptureData& data,
+                         ContentCaptureSession* child) {
+    ContentCaptureData child_frame = data;
+    child_frame.children.clear();
+    child->clear();
+    child->push_back(child_frame);
+    DCHECK(parent.size() == 1);
+    child->push_back(parent.front());
+  }
+
  protected:
   ContentCaptureReceiverManagerHelper*
       content_capture_receiver_manager_helper_ = nullptr;
@@ -293,6 +336,7 @@
   ContentCaptureData test_data_update_;
   // Expected removed Ids.
   std::vector<int64_t> expected_removed_ids_{2};
+  SessionRemovedTestHelper session_removed_test_helper_;
 };
 
 TEST_F(ContentCaptureReceiverTest, DidCaptureContent) {
@@ -300,7 +344,7 @@
   EXPECT_TRUE(
       content_capture_receiver_manager_helper()->parent_session().empty());
   EXPECT_TRUE(
-      content_capture_receiver_manager_helper()->removed_session().empty());
+      content_capture_receiver_manager_helper()->removed_sessions().empty());
   EXPECT_EQ(GetExpectedTestData(true /* main_frame */),
             content_capture_receiver_manager_helper()->captured_data());
 }
@@ -311,7 +355,7 @@
   EXPECT_TRUE(
       content_capture_receiver_manager_helper()->parent_session().empty());
   EXPECT_TRUE(
-      content_capture_receiver_manager_helper()->removed_session().empty());
+      content_capture_receiver_manager_helper()->removed_sessions().empty());
   EXPECT_EQ(GetExpectedTestData(true /* main_frame */),
             content_capture_receiver_manager_helper()->captured_data());
   // Simulates to update the content within the same document.
@@ -321,7 +365,7 @@
       content_capture_receiver_manager_helper()->parent_session().empty());
   // Verifies that the sesssion isn't removed.
   EXPECT_TRUE(
-      content_capture_receiver_manager_helper()->removed_session().empty());
+      content_capture_receiver_manager_helper()->removed_sessions().empty());
   EXPECT_EQ(GetExpectedTestDataUpdate(true /* main_frame */),
             content_capture_receiver_manager_helper()->captured_data());
 }
@@ -331,7 +375,7 @@
   EXPECT_TRUE(
       content_capture_receiver_manager_helper()->parent_session().empty());
   EXPECT_TRUE(
-      content_capture_receiver_manager_helper()->removed_session().empty());
+      content_capture_receiver_manager_helper()->removed_sessions().empty());
   ContentCaptureData expected_data = GetExpectedTestData(true /* main_frame */);
   EXPECT_EQ(expected_data,
             content_capture_receiver_manager_helper()->captured_data());
@@ -342,7 +386,7 @@
                   ->updated_parent_session()
                   .empty());
   EXPECT_TRUE(
-      content_capture_receiver_manager_helper()->removed_session().empty());
+      content_capture_receiver_manager_helper()->removed_sessions().empty());
   EXPECT_EQ(GetExpectedTestDataChange(expected_data.id),
             content_capture_receiver_manager_helper()->updated_data());
 }
@@ -353,7 +397,7 @@
   EXPECT_TRUE(
       content_capture_receiver_manager_helper()->parent_session().empty());
   EXPECT_TRUE(
-      content_capture_receiver_manager_helper()->removed_session().empty());
+      content_capture_receiver_manager_helper()->removed_sessions().empty());
   EXPECT_EQ(GetExpectedTestData(true /* main_frame */),
             content_capture_receiver_manager_helper()->captured_data());
   // Simulates to navigate other document.
@@ -362,11 +406,12 @@
       content_capture_receiver_manager_helper()->parent_session().empty());
   // Verifies that the previous session was removed.
   EXPECT_EQ(
-      1u, content_capture_receiver_manager_helper()->removed_session().size());
+      1u, content_capture_receiver_manager_helper()->removed_sessions().size());
   std::vector<ContentCaptureData> expected{
       GetExpectedTestData(true /* main_frame */)};
-  VerifySession(expected,
-                content_capture_receiver_manager_helper()->removed_session());
+  VerifySession(
+      expected,
+      content_capture_receiver_manager_helper()->removed_sessions().front());
   // Verifies that we get the test_data2() from the new document.
   EXPECT_EQ(GetExpectedTestData2(true /* main_frame */),
             content_capture_receiver_manager_helper()->captured_data());
@@ -378,7 +423,7 @@
   EXPECT_TRUE(
       content_capture_receiver_manager_helper()->parent_session().empty());
   EXPECT_TRUE(
-      content_capture_receiver_manager_helper()->removed_session().empty());
+      content_capture_receiver_manager_helper()->removed_sessions().empty());
   EXPECT_EQ(GetExpectedTestData(true /* main_frame */),
             content_capture_receiver_manager_helper()->captured_data());
   // Simulates to remove the content.
@@ -386,7 +431,7 @@
   EXPECT_TRUE(
       content_capture_receiver_manager_helper()->parent_session().empty());
   EXPECT_TRUE(
-      content_capture_receiver_manager_helper()->removed_session().empty());
+      content_capture_receiver_manager_helper()->removed_sessions().empty());
   // Verifies that the removed_ids() was removed from the correct session.
   EXPECT_EQ(expected_removed_ids(),
             content_capture_receiver_manager_helper()->removed_ids());
@@ -404,7 +449,7 @@
   EXPECT_TRUE(
       content_capture_receiver_manager_helper()->parent_session().empty());
   EXPECT_TRUE(
-      content_capture_receiver_manager_helper()->removed_session().empty());
+      content_capture_receiver_manager_helper()->removed_sessions().empty());
   EXPECT_EQ(GetExpectedTestData(true /* main_frame */),
             content_capture_receiver_manager_helper()->captured_data());
   // Simulate to capture the content from child frame.
@@ -417,7 +462,7 @@
   VerifySession(expected,
                 content_capture_receiver_manager_helper()->parent_session());
   EXPECT_TRUE(
-      content_capture_receiver_manager_helper()->removed_session().empty());
+      content_capture_receiver_manager_helper()->removed_sessions().empty());
   // Verifies that we receive the correct content from child frame.
   EXPECT_EQ(GetExpectedTestData2(false /* main_frame */),
             content_capture_receiver_manager_helper()->captured_data());
@@ -435,24 +480,44 @@
   ContentCaptureData data = GetExpectedTestData(true /* main_frame */);
   // Currently, there is no way to fake frame size, set it to 0.
   data.bounds = gfx::Rect();
-  std::vector<ContentCaptureData> expected{data};
+  ContentCaptureSession expected{data};
 
   VerifySession(expected,
                 content_capture_receiver_manager_helper()->parent_session());
   EXPECT_TRUE(
-      content_capture_receiver_manager_helper()->removed_session().empty());
+      content_capture_receiver_manager_helper()->removed_sessions().empty());
   // Verifies that we receive the correct content from child frame.
   EXPECT_EQ(GetExpectedTestData2(false /* main_frame */),
             content_capture_receiver_manager_helper()->captured_data());
 
+  // Get the child session, so we can verify that it has been removed in next
+  // navigation
+  ContentCaptureData child_frame = GetExpectedTestData2(false);
+  // child_frame.children.clear();
+  ContentCaptureSession removed_child_session;
+  BuildChildSession(expected,
+                    content_capture_receiver_manager_helper()->captured_data(),
+                    &removed_child_session);
+
   // When main frame navigates to same url, the parent session will not change.
   NavigateMainFrame(GURL(kMainFrameUrl));
   SetupChildFrame();
   DidCaptureContentForChildFrame(test_data2(), true /* first_data */);
   VerifySession(expected,
                 content_capture_receiver_manager_helper()->parent_session());
-  EXPECT_TRUE(
-      content_capture_receiver_manager_helper()->removed_session().empty());
+  // Verify the child frame is removed.
+  EXPECT_EQ(
+      1u, content_capture_receiver_manager_helper()->removed_sessions().size());
+  VerifySession(
+      removed_child_session,
+      content_capture_receiver_manager_helper()->removed_sessions().front());
+
+  // Get main and child session to verify that they are removed in next
+  // navigateion.
+  ContentCaptureSession removed_main_session = expected;
+  BuildChildSession(expected,
+                    content_capture_receiver_manager_helper()->captured_data(),
+                    &removed_child_session);
 
   // When main frame navigates to same domain, the parent session will change.
   NavigateMainFrame(GURL(kMainFrameUrl2));
@@ -470,6 +535,24 @@
   expected.push_back(data);
   VerifySession(expected,
                 content_capture_receiver_manager_helper()->parent_session());
+  // There are two sessions removed, one the main frame because we navigate to
+  // different URL (though the domain is same), another one is child frame
+  // because of the main frame change.
+  EXPECT_EQ(
+      2u, content_capture_receiver_manager_helper()->removed_sessions().size());
+
+  VerifySession(
+      removed_child_session,
+      content_capture_receiver_manager_helper()->removed_sessions().front());
+  VerifySession(
+      removed_main_session,
+      content_capture_receiver_manager_helper()->removed_sessions().back());
+
+  // Keep current sessions to verify removed sessions later.
+  removed_main_session = expected;
+  BuildChildSession(expected,
+                    content_capture_receiver_manager_helper()->captured_data(),
+                    &removed_child_session);
 
   // When main frame navigates to different domain, the parent session will
   // change.
@@ -484,6 +567,28 @@
   expected.push_back(data);
   VerifySession(expected,
                 content_capture_receiver_manager_helper()->parent_session());
+  EXPECT_EQ(
+      2u, content_capture_receiver_manager_helper()->removed_sessions().size());
+  VerifySession(
+      removed_child_session,
+      content_capture_receiver_manager_helper()->removed_sessions().front());
+  VerifySession(
+      removed_main_session,
+      content_capture_receiver_manager_helper()->removed_sessions().back());
+
+  // Keep current sessions to verify removed sessions later.
+  removed_main_session = expected;
+  BuildChildSession(expected,
+                    content_capture_receiver_manager_helper()->captured_data(),
+                    &removed_child_session);
+
+  session_removed_test_helper()->Reset();
+  DeleteContents();
+  EXPECT_EQ(2u, session_removed_test_helper()->removed_sessions().size());
+  VerifySession(removed_child_session,
+                session_removed_test_helper()->removed_sessions().front());
+  VerifySession(removed_main_session,
+                session_removed_test_helper()->removed_sessions().back());
 }
 
 class ContentCaptureReceiverMultipleFrameTest
@@ -497,7 +602,7 @@
     NavigateAndCommit(GURL("about:blank"));
     content::RenderFrameHostTester::For(web_contents()->GetMainFrame())
         ->AppendChild("child");
-    ContentCaptureReceiverManagerHelper::Create(web_contents());
+    ContentCaptureReceiverManagerHelper::Create(web_contents(), nullptr);
     content_capture_receiver_manager_helper_ =
         static_cast<ContentCaptureReceiverManagerHelper*>(
             ContentCaptureReceiverManager::FromWebContents(web_contents()));
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/BidirectionalStreamNetworkException.java b/components/cronet/android/java/src/org/chromium/net/impl/BidirectionalStreamNetworkException.java
index 560179b..fecb113 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/BidirectionalStreamNetworkException.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/BidirectionalStreamNetworkException.java
@@ -20,7 +20,7 @@
     @Override
     public boolean immediatelyRetryable() {
         switch (mCronetInternalErrorCode) {
-            case NetError.ERR_SPDY_PING_FAILED:
+            case NetError.ERR_HTTP2_PING_FAILED:
             case NetError.ERR_QUIC_HANDSHAKE_FAILED:
                 assert mErrorCode == ERROR_OTHER;
                 return true;
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/BidirectionalStreamTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/BidirectionalStreamTest.java
index 33abd12..b68b8e4 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/BidirectionalStreamTest.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/BidirectionalStreamTest.java
@@ -1557,7 +1557,7 @@
         checkSpecificErrorCode(NetError.ERR_ADDRESS_UNREACHABLE,
                 NetworkException.ERROR_ADDRESS_UNREACHABLE, false);
         // BidirectionalStream specific retryable error codes.
-        checkSpecificErrorCode(NetError.ERR_SPDY_PING_FAILED, NetworkException.ERROR_OTHER, true);
+        checkSpecificErrorCode(NetError.ERR_HTTP2_PING_FAILED, NetworkException.ERROR_OTHER, true);
         checkSpecificErrorCode(
                 NetError.ERR_QUIC_HANDSHAKE_FAILED, NetworkException.ERROR_OTHER, true);
     }
diff --git a/components/cronet/third_party/curl_headers/COPYING b/components/cronet/third_party/curl_headers/COPYING
new file mode 100644
index 0000000..3528bd7
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/COPYING
@@ -0,0 +1,22 @@
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright (c) 1996 - 2019, Daniel Stenberg, <daniel@haxx.se>, and many
+contributors, see the THANKS file.
+
+All rights reserved.
+
+Permission to use, copy, modify, and distribute this software for any purpose
+with or without fee is hereby granted, provided that the above copyright
+notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN
+NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
+OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder shall not
+be used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization of the copyright holder.
diff --git a/components/cronet/third_party/curl_headers/LICENSE b/components/cronet/third_party/curl_headers/LICENSE
new file mode 100644
index 0000000..3528bd7
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/LICENSE
@@ -0,0 +1,22 @@
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright (c) 1996 - 2019, Daniel Stenberg, <daniel@haxx.se>, and many
+contributors, see the THANKS file.
+
+All rights reserved.
+
+Permission to use, copy, modify, and distribute this software for any purpose
+with or without fee is hereby granted, provided that the above copyright
+notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN
+NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
+OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder shall not
+be used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization of the copyright holder.
diff --git a/components/cronet/third_party/curl_headers/OWNERS b/components/cronet/third_party/curl_headers/OWNERS
new file mode 100644
index 0000000..bc62f31c
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/OWNERS
@@ -0,0 +1,4 @@
+pauljensen@chromium.org
+caraitto@chromium.org
+
+# Component: Internals>Network>Library
diff --git a/components/cronet/third_party/curl_headers/README.chromium b/components/cronet/third_party/curl_headers/README.chromium
new file mode 100644
index 0000000..e6e9bc3
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/README.chromium
@@ -0,0 +1,15 @@
+Name: libcurl (headers and examples only)
+Short Name: libcurl
+URL: https://github.com/curl/curl
+Version: 7.65.1
+Revision: 69248b58f649e35b09a126c12781353e3471f5c6
+License: MIT/X11-like
+License File: NOT_SHIPPED
+Security Critical: no
+Description:
+Headers and examples from the libcurl repository. Useful for creating
+alternative implementations of the libcurl API.
+Local Modifications:
+Only includes COPYING, include/, and docs/examples/ -- all other files and
+directories from the original repository are not included -- DOES NOT contain
+the implementation of the libcurl API.
diff --git a/components/cronet/third_party/curl_headers/docs/examples/.gitignore b/components/cronet/third_party/curl_headers/docs/examples/.gitignore
new file mode 100644
index 0000000..3873712
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/.gitignore
@@ -0,0 +1,91 @@
+10-at-a-time
+anyauthput
+certinfo
+chkspeed
+cookie_interface
+debug
+externalsocket
+fileupload
+fopen
+ftp-wildcard
+ftpget
+ftpgetinfo
+ftpgetresp
+ftpsget
+ftpupload
+ftpuploadfrommem
+ftpuploadresume
+getinfo
+getinmemory
+getredirect
+http-post
+http2-download
+http2-pushinmemory
+http2-serverpush
+http2-upload
+httpcustomheader
+httpput
+https
+imap
+imap-append
+imap-copy
+imap-create
+imap-delete
+imap-examine
+imap-fetch
+imap-list
+imap-lsub
+imap-multi
+imap-noop
+imap-search
+imap-ssl
+imap-store
+imap-tls
+multi-app
+multi-debugcallback
+multi-double
+multi-formadd
+multi-post
+multi-single
+parseurl
+persistent
+pop3-dele
+pop3-list
+pop3-multi
+pop3-noop
+pop3-retr
+pop3-ssl
+pop3-stat
+pop3-tls
+pop3-top
+pop3-uidl
+pop3s
+pop3slist
+post-callback
+postinmemory
+postit2
+postit2-formadd
+progressfunc
+resolve
+rtsp
+sendrecv
+sepheaders
+sftpget
+sftpuploadresume
+shared-connection-cache
+simple
+simplepost
+simplesmtp
+simplessl
+smtp-expn
+smtp-mail
+smtp-mime
+smtp-multi
+smtp-ssl
+smtp-tls
+smtp-vrfy
+sslbackend
+urlapi
+url2file
+usercertinmem
+xmlstream
diff --git a/components/cronet/third_party/curl_headers/docs/examples/10-at-a-time.c b/components/cronet/third_party/curl_headers/docs/examples/10-at-a-time.c
new file mode 100644
index 0000000..b50eaa6
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/10-at-a-time.c
@@ -0,0 +1,150 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Download many files in parallel, in the same thread.
+ * </DESC>
+ */
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#ifndef WIN32
+#  include <unistd.h>
+#endif
+#include <curl/curl.h>
+
+static const char *urls[] = {
+  "https://www.microsoft.com",
+  "https://opensource.org",
+  "https://www.google.com",
+  "https://www.yahoo.com",
+  "https://www.ibm.com",
+  "https://www.mysql.com",
+  "https://www.oracle.com",
+  "https://www.ripe.net",
+  "https://www.iana.org",
+  "https://www.amazon.com",
+  "https://www.netcraft.com",
+  "https://www.heise.de",
+  "https://www.chip.de",
+  "https://www.ca.com",
+  "https://www.cnet.com",
+  "https://www.mozilla.org",
+  "https://www.cnn.com",
+  "https://www.wikipedia.org",
+  "https://www.dell.com",
+  "https://www.hp.com",
+  "https://www.cert.org",
+  "https://www.mit.edu",
+  "https://www.nist.gov",
+  "https://www.ebay.com",
+  "https://www.playstation.com",
+  "https://www.uefa.com",
+  "https://www.ieee.org",
+  "https://www.apple.com",
+  "https://www.symantec.com",
+  "https://www.zdnet.com",
+  "https://www.fujitsu.com/global/",
+  "https://www.supermicro.com",
+  "https://www.hotmail.com",
+  "https://www.ietf.org",
+  "https://www.bbc.co.uk",
+  "https://news.google.com",
+  "https://www.foxnews.com",
+  "https://www.msn.com",
+  "https://www.wired.com",
+  "https://www.sky.com",
+  "https://www.usatoday.com",
+  "https://www.cbs.com",
+  "https://www.nbc.com/",
+  "https://slashdot.org",
+  "https://www.informationweek.com",
+  "https://apache.org",
+  "https://www.un.org",
+};
+
+#define MAX_PARALLEL 10 /* number of simultaneous transfers */
+#define NUM_URLS sizeof(urls)/sizeof(char *)
+
+static size_t write_cb(char *data, size_t n, size_t l, void *userp)
+{
+  /* take care of the data here, ignored in this example */
+  (void)data;
+  (void)userp;
+  return n*l;
+}
+
+static void add_transfer(CURLM *cm, int i)
+{
+  CURL *eh = curl_easy_init();
+  curl_easy_setopt(eh, CURLOPT_WRITEFUNCTION, write_cb);
+  curl_easy_setopt(eh, CURLOPT_URL, urls[i]);
+  curl_easy_setopt(eh, CURLOPT_PRIVATE, urls[i]);
+  curl_multi_add_handle(cm, eh);
+}
+
+int main(void)
+{
+  CURLM *cm;
+  CURLMsg *msg;
+  unsigned int transfers = 0;
+  int msgs_left = -1;
+  int still_alive = 1;
+
+  curl_global_init(CURL_GLOBAL_ALL);
+  cm = curl_multi_init();
+
+  /* Limit the amount of simultaneous connections curl should allow: */
+  curl_multi_setopt(cm, CURLMOPT_MAXCONNECTS, (long)MAX_PARALLEL);
+
+  for(transfers = 0; transfers < MAX_PARALLEL; transfers++)
+    add_transfer(cm, transfers);
+
+  do {
+    curl_multi_perform(cm, &still_alive);
+
+    while((msg = curl_multi_info_read(cm, &msgs_left))) {
+      if(msg->msg == CURLMSG_DONE) {
+        char *url;
+        CURL *e = msg->easy_handle;
+        curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, &url);
+        fprintf(stderr, "R: %d - %s <%s>\n",
+                msg->data.result, curl_easy_strerror(msg->data.result), url);
+        curl_multi_remove_handle(cm, e);
+        curl_easy_cleanup(e);
+      }
+      else {
+        fprintf(stderr, "E: CURLMsg (%d)\n", msg->msg);
+      }
+      if(transfers < NUM_URLS)
+        add_transfer(cm, transfers++);
+    }
+    if(still_alive)
+      curl_multi_wait(cm, NULL, 0, 1000, NULL);
+
+  } while(still_alive || (transfers < NUM_URLS));
+
+  curl_multi_cleanup(cm);
+  curl_global_cleanup();
+
+  return EXIT_SUCCESS;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/Makefile.am b/components/cronet/third_party/curl_headers/docs/examples/Makefile.am
new file mode 100644
index 0000000..53867cb
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/Makefile.am
@@ -0,0 +1,70 @@
+#***************************************************************************
+#                                  _   _ ____  _
+#  Project                     ___| | | |  _ \| |
+#                             / __| | | | |_) | |
+#                            | (__| |_| |  _ <| |___
+#                             \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+AUTOMAKE_OPTIONS = foreign nostdinc
+
+EXTRA_DIST = README Makefile.example Makefile.inc Makefile.m32 \
+  Makefile.netware makefile.dj $(COMPLICATED_EXAMPLES)
+
+# Specify our include paths here, and do it relative to $(top_srcdir) and
+# $(top_builddir), to ensure that these paths which belong to the library
+# being currently built and tested are searched before the library which
+# might possibly already be installed in the system.
+#
+# $(top_srcdir)/include is for libcurl's external include files
+
+AM_CPPFLAGS = -I$(top_srcdir)/include
+
+LIBDIR = $(top_builddir)/lib
+
+# Avoid libcurl obsolete stuff
+AM_CPPFLAGS += -DCURL_NO_OLDIES
+
+if USE_CPPFLAG_CURL_STATICLIB
+AM_CPPFLAGS += -DCURL_STATICLIB
+endif
+
+# Prevent LIBS from being used for all link targets
+LIBS = $(BLANK_AT_MAKETIME)
+
+# Dependencies
+if USE_EXPLICIT_LIB_DEPS
+LDADD = $(LIBDIR)/libcurl.la @LIBCURL_LIBS@
+else
+LDADD = $(LIBDIR)/libcurl.la
+endif
+
+# This might hold -Werror
+CFLAGS += @CURL_CFLAG_EXTRAS@
+
+# Makefile.inc provides the check_PROGRAMS and COMPLICATED_EXAMPLES defines
+include Makefile.inc
+
+all: $(check_PROGRAMS)
+
+CHECKSRC = $(CS_$(V))
+CS_0 = @echo "  RUN     " $@;
+CS_1 =
+CS_ = $(CS_0)
+
+checksrc:
+	$(CHECKSRC)(@PERL@ $(top_srcdir)/lib/checksrc.pl -ASNPRINTF $(srcdir)/*.c)
diff --git a/components/cronet/third_party/curl_headers/docs/examples/Makefile.example b/components/cronet/third_party/curl_headers/docs/examples/Makefile.example
new file mode 100644
index 0000000..17e614e
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/Makefile.example
@@ -0,0 +1,53 @@
+#***************************************************************************
+#                                  _   _ ____  _
+#  Project                     ___| | | |  _ \| |
+#                             / __| | | | |_) | |
+#                            | (__| |_| |  _ <| |___
+#                             \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+# What to call the final executable
+TARGET = example
+
+# Which object files that the executable consists of
+OBJS= ftpget.o
+
+# What compiler to use
+CC = gcc
+
+# Compiler flags, -g for debug, -c to make an object file
+CFLAGS = -c -g
+
+# This should point to a directory that holds libcurl, if it isn't
+# in the system's standard lib dir
+# We also set a -L to include the directory where we have the openssl
+# libraries
+LDFLAGS = -L/home/dast/lib -L/usr/local/ssl/lib
+
+# We need -lcurl for the curl stuff
+# We need -lsocket and -lnsl when on Solaris
+# We need -lssl and -lcrypto when using libcurl with SSL support
+# We need -lpthread for the pthread example
+LIBS = -lcurl -lsocket -lnsl -lssl -lcrypto
+
+# Link the target with all objects and libraries
+$(TARGET) : $(OBJS)
+	$(CC)  -o $(TARGET) $(OBJS) $(LDFLAGS) $(LIBS)
+
+# Compile the source files into object files
+ftpget.o : ftpget.c
+	$(CC) $(CFLAGS) $<
diff --git a/components/cronet/third_party/curl_headers/docs/examples/Makefile.inc b/components/cronet/third_party/curl_headers/docs/examples/Makefile.inc
new file mode 100644
index 0000000..8dd55b9
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/Makefile.inc
@@ -0,0 +1,47 @@
+#***************************************************************************
+#                                  _   _ ____  _
+#  Project                     ___| | | |  _ \| |
+#                             / __| | | | |_) | |
+#                            | (__| |_| |  _ <| |___
+#                             \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+# These are all libcurl example programs to be test compiled
+check_PROGRAMS = 10-at-a-time anyauthput cookie_interface debug fileupload \
+  fopen ftpget ftpgetresp ftpupload getinfo getinmemory http-post httpput  \
+  https multi-app multi-debugcallback multi-double multi-post multi-single \
+  persistent post-callback postit2 sepheaders simple simplepost simplessl  \
+  sendrecv httpcustomheader certinfo chkspeed ftpgetinfo ftp-wildcard      \
+  smtp-mail smtp-mime smtp-multi smtp-ssl smtp-tls smtp-vrfy smtp-expn     \
+  rtsp externalsocket resolve progressfunc pop3-retr pop3-list pop3-uidl   \
+  pop3-dele pop3-top pop3-stat pop3-noop pop3-ssl pop3-tls pop3-multi      \
+  imap-list imap-lsub imap-fetch imap-store imap-append imap-examine       \
+  imap-search imap-create imap-delete imap-copy imap-noop imap-ssl         \
+  imap-tls imap-multi url2file sftpget ftpsget postinmemory http2-download \
+  http2-upload http2-serverpush getredirect ftpuploadfrommem               \
+  ftpuploadresume sslbackend postit2-formadd multi-formadd                 \
+  shared-connection-cache sftpuploadresume http2-pushinmemory parseurl     \
+  urlapi
+
+# These examples require external dependencies that may not be commonly
+# available on POSIX systems, so don't bother attempting to compile them here.
+COMPLICATED_EXAMPLES = curlgtk.c curlx.c htmltitle.cpp cacertinmem.c \
+  ghiper.c hiperfifo.c htmltidy.c multithread.c opensslthreadlock.c \
+  sampleconv.c synctime.c threaded-ssl.c evhiperfifo.c \
+  smooth-gtk-thread.c version-check.pl href_extractor.c asiohiper.cpp \
+  multi-uv.c xmlstream.c usercertinmem.c sessioninfo.c \
+  threaded-shared-conn.c crawler.c ephiperfifo.c
diff --git a/components/cronet/third_party/curl_headers/docs/examples/Makefile.m32 b/components/cronet/third_party/curl_headers/docs/examples/Makefile.m32
new file mode 100644
index 0000000..160afb6
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/Makefile.m32
@@ -0,0 +1,366 @@
+#***************************************************************************
+#                                  _   _ ____  _
+#  Project                     ___| | | |  _ \| |
+#                             / __| | | | |_) | |
+#                            | (__| |_| |  _ <| |___
+#                             \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+#***************************************************************************
+
+###########################################################################
+#
+## Makefile for building curl examples with MingW (GCC-3.2 or later)
+## and optionally OpenSSL (1.0.2a), libssh2 (1.5), zlib (1.2.8), librtmp (2.4),
+## brotli (1.0.1)
+##
+## Usage:   mingw32-make -f Makefile.m32 CFG=-feature1[-feature2][-feature3][...]
+## Example: mingw32-make -f Makefile.m32 CFG=-zlib-ssl-sspi-winidn
+##
+## Hint: you can also set environment vars to control the build, f.e.:
+## set ZLIB_PATH=c:/zlib-1.2.8
+## set ZLIB=1
+#
+###########################################################################
+
+# Edit the path below to point to the base of your Zlib sources.
+ifndef ZLIB_PATH
+ZLIB_PATH = ../../../zlib-1.2.8
+endif
+# Edit the path below to point to the base of your Brotli sources.
+ifndef BROTLI_PATH
+BROTLI_PATH = ../../../brotli-1.0.1
+endif
+# Edit the path below to point to the base of your OpenSSL package.
+ifndef OPENSSL_PATH
+OPENSSL_PATH = ../../../openssl-1.0.2a
+endif
+# Edit the path below to point to the base of your LibSSH2 package.
+ifndef LIBSSH2_PATH
+LIBSSH2_PATH = ../../../libssh2-1.5.0
+endif
+# Edit the path below to point to the base of your librtmp package.
+ifndef LIBRTMP_PATH
+LIBRTMP_PATH = ../../../librtmp-2.4
+endif
+# Edit the path below to point to the base of your libmetalink package.
+ifndef LIBMETALINK_PATH
+LIBMETALINK_PATH = ../../../libmetalink-0.1.3
+endif
+# Edit the path below to point to the base of your libexpat package.
+ifndef LIBEXPAT_PATH
+LIBEXPAT_PATH = ../../../expat-2.1.0
+endif
+# Edit the path below to point to the base of your libxml2 package.
+ifndef LIBXML2_PATH
+LIBXML2_PATH = ../../../libxml2-2.9.2
+endif
+# Edit the path below to point to the base of your libidn2 package.
+ifndef LIBIDN2_PATH
+LIBIDN2_PATH = ../../../libidn2-2.0.3
+endif
+# Edit the path below to point to the base of your MS IDN package.
+# Microsoft Internationalized Domain Names (IDN) Mitigation APIs 1.1
+# https://www.microsoft.com/en-us/download/details.aspx?id=734
+ifndef WINIDN_PATH
+WINIDN_PATH = ../../../Microsoft IDN Mitigation APIs
+endif
+# Edit the path below to point to the base of your Novell LDAP NDK.
+ifndef LDAP_SDK
+LDAP_SDK = c:/novell/ndk/cldapsdk/win32
+endif
+# Edit the path below to point to the base of your nghttp2 package.
+ifndef NGHTTP2_PATH
+NGHTTP2_PATH = ../../../nghttp2-1.0.0
+endif
+
+PROOT = ../..
+
+# Edit the path below to point to the base of your c-ares package.
+ifndef LIBCARES_PATH
+LIBCARES_PATH = $(PROOT)/ares
+endif
+
+ifeq ($(CURL_CC),)
+CURL_CC := $(CROSSPREFIX)gcc
+endif
+ifeq ($(CURL_AR),)
+CURL_AR := $(CROSSPREFIX)ar
+endif
+
+CC = $(CURL_CC)
+CFLAGS = $(CURL_CFLAG_EXTRAS) -g -O2 -Wall -W
+CFLAGS += -fno-strict-aliasing
+# comment LDFLAGS below to keep debug info
+LDFLAGS = $(CURL_LDFLAG_EXTRAS) $(CURL_LDFLAG_EXTRAS_EXE) -s
+RC = $(CROSSPREFIX)windres
+RCFLAGS = --include-dir=$(PROOT)/include -O COFF
+
+# Set environment var ARCH to your architecture to override autodetection.
+ifndef ARCH
+ifeq ($(findstring x86_64,$(shell $(CC) -dumpmachine)),x86_64)
+ARCH = w64
+else
+ARCH = w32
+endif
+endif
+
+ifeq ($(ARCH),w64)
+CFLAGS  += -m64 -D_AMD64_
+LDFLAGS += -m64
+RCFLAGS += -F pe-x86-64
+else
+CFLAGS  += -m32
+LDFLAGS += -m32
+RCFLAGS += -F pe-i386
+endif
+
+# Platform-dependent helper tool macros
+ifeq ($(findstring /sh,$(SHELL)),/sh)
+DEL     = rm -f $1
+RMDIR   = rm -fr $1
+MKDIR   = mkdir -p $1
+COPY    = -cp -afv $1 $2
+#COPYR  = -cp -afr $1/* $2
+COPYR   = -rsync -aC $1/* $2
+TOUCH   = touch $1
+CAT     = cat
+ECHONL  = echo ""
+DL = '
+else
+ifeq "$(OS)" "Windows_NT"
+DEL     = -del 2>NUL /q /f $(subst /,\,$1)
+RMDIR   = -rd 2>NUL /q /s $(subst /,\,$1)
+else
+DEL     = -del 2>NUL $(subst /,\,$1)
+RMDIR   = -deltree 2>NUL /y $(subst /,\,$1)
+endif
+MKDIR   = -md 2>NUL $(subst /,\,$1)
+COPY    = -copy 2>NUL /y $(subst /,\,$1) $(subst /,\,$2)
+COPYR   = -xcopy 2>NUL /q /y /e $(subst /,\,$1) $(subst /,\,$2)
+TOUCH   = copy 2>&1>NUL /b $(subst /,\,$1) +,,
+CAT     = type
+ECHONL  = $(ComSpec) /c echo.
+endif
+
+########################################################
+## Nothing more to do below this line!
+
+ifeq ($(findstring -dyn,$(CFG)),-dyn)
+DYN = 1
+endif
+ifeq ($(findstring -ares,$(CFG)),-ares)
+ARES = 1
+endif
+ifeq ($(findstring -rtmp,$(CFG)),-rtmp)
+RTMP = 1
+SSL = 1
+ZLIB = 1
+endif
+ifeq ($(findstring -ssh2,$(CFG)),-ssh2)
+SSH2 = 1
+SSL = 1
+ZLIB = 1
+endif
+ifeq ($(findstring -ssl,$(CFG)),-ssl)
+SSL = 1
+endif
+ifeq ($(findstring -zlib,$(CFG)),-zlib)
+ZLIB = 1
+endif
+ifeq ($(findstring -brotli,$(CFG)),-brotli)
+BROTLI = 1
+endif
+ifeq ($(findstring -idn2,$(CFG)),-idn2)
+IDN2 = 1
+endif
+ifeq ($(findstring -winidn,$(CFG)),-winidn)
+WINIDN = 1
+endif
+ifeq ($(findstring -sspi,$(CFG)),-sspi)
+SSPI = 1
+endif
+ifeq ($(findstring -ldaps,$(CFG)),-ldaps)
+LDAPS = 1
+endif
+ifeq ($(findstring -ipv6,$(CFG)),-ipv6)
+IPV6 = 1
+endif
+ifeq ($(findstring -metalink,$(CFG)),-metalink)
+METALINK = 1
+endif
+ifeq ($(findstring -winssl,$(CFG)),-winssl)
+WINSSL = 1
+SSPI = 1
+endif
+ifeq ($(findstring -nghttp2,$(CFG)),-nghttp2)
+NGHTTP2 = 1
+endif
+
+INCLUDES = -I. -I$(PROOT) -I$(PROOT)/include -I$(PROOT)/lib
+
+ifdef DYN
+  curl_DEPENDENCIES = $(PROOT)/lib/libcurldll.a $(PROOT)/lib/libcurl.dll
+  curl_LDADD = -L$(PROOT)/lib -lcurldll
+else
+  curl_DEPENDENCIES = $(PROOT)/lib/libcurl.a
+  curl_LDADD = -L$(PROOT)/lib -lcurl
+  CFLAGS += -DCURL_STATICLIB
+  LDFLAGS += -static
+endif
+ifdef ARES
+  ifndef DYN
+    curl_DEPENDENCIES += $(LIBCARES_PATH)/libcares.a
+  endif
+  CFLAGS += -DUSE_ARES
+  curl_LDADD += -L"$(LIBCARES_PATH)" -lcares
+endif
+ifdef RTMP
+  CFLAGS += -DUSE_LIBRTMP
+  curl_LDADD += -L"$(LIBRTMP_PATH)/librtmp" -lrtmp -lwinmm
+endif
+ifdef NGHTTP2
+  CFLAGS += -DUSE_NGHTTP2
+  curl_LDADD += -L"$(NGHTTP2_PATH)/lib" -lnghttp2
+endif
+ifdef SSH2
+  CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H
+  curl_LDADD += -L"$(LIBSSH2_PATH)/win32" -lssh2
+  ifdef WINSSL
+    ifndef DYN
+      curl_LDADD += -lbcrypt -lcrypt32
+    endif
+  endif
+endif
+ifdef SSL
+  ifndef OPENSSL_INCLUDE
+    ifeq "$(wildcard $(OPENSSL_PATH)/outinc)" "$(OPENSSL_PATH)/outinc"
+      OPENSSL_INCLUDE = $(OPENSSL_PATH)/outinc
+    endif
+    ifeq "$(wildcard $(OPENSSL_PATH)/include)" "$(OPENSSL_PATH)/include"
+      OPENSSL_INCLUDE = $(OPENSSL_PATH)/include
+    endif
+  endif
+  ifneq "$(wildcard $(OPENSSL_INCLUDE)/openssl/opensslv.h)" "$(OPENSSL_INCLUDE)/openssl/opensslv.h"
+  $(error Invalid path to OpenSSL package: $(OPENSSL_PATH))
+  endif
+  ifndef OPENSSL_LIBPATH
+    OPENSSL_LIBS = -lssl -lcrypto
+    ifeq "$(wildcard $(OPENSSL_PATH)/out)" "$(OPENSSL_PATH)/out"
+      OPENSSL_LIBPATH = $(OPENSSL_PATH)/out
+      ifdef DYN
+        OPENSSL_LIBS = -lssl32 -leay32
+      endif
+    endif
+    ifeq "$(wildcard $(OPENSSL_PATH)/lib)" "$(OPENSSL_PATH)/lib"
+      OPENSSL_LIBPATH = $(OPENSSL_PATH)/lib
+    endif
+  endif
+  ifndef DYN
+    OPENSSL_LIBS += -lgdi32 -lcrypt32
+  endif
+  INCLUDES += -I"$(OPENSSL_INCLUDE)"
+  CFLAGS += -DUSE_OPENSSL
+  curl_LDADD += -L"$(OPENSSL_LIBPATH)" $(OPENSSL_LIBS)
+endif
+ifdef WINSSL
+  CFLAGS += -DUSE_SCHANNEL
+  curl_LDADD += -lcrypt32
+endif
+ifdef ZLIB
+  INCLUDES += -I"$(ZLIB_PATH)"
+  CFLAGS += -DHAVE_LIBZ -DHAVE_ZLIB_H
+  curl_LDADD += -L"$(ZLIB_PATH)" -lz
+endif
+ifdef BROTLI
+  INCLUDES += -I"$(BROTLI_PATH)/include"
+  CFLAGS += -DHAVE_BROTLI
+  curl_LDADD += -L"$(BROTLI_PATH)/lib"
+  ifdef BROTLI_LIBS
+    curl_LDADD += $(BROTLI_LIBS)
+  else
+    curl_LDADD += -lbrotlidec
+  endif
+endif
+ifdef IDN2
+  CFLAGS += -DUSE_LIBIDN2
+  curl_LDADD += -L"$(LIBIDN2_PATH)/lib" -lidn2
+else
+ifdef WINIDN
+  CFLAGS += -DUSE_WIN32_IDN
+  curl_LDADD += -L"$(WINIDN_PATH)" -lnormaliz
+endif
+endif
+ifdef METALINK
+  INCLUDES += -I"$(LIBMETALINK_PATH)/include"
+  CFLAGS += -DUSE_METALINK
+  curl_LDADD += -L"$(LIBMETALINK_PATH)/lib" -lmetalink
+  ifndef DYN
+    ifeq ($(findstring libexpat_metalink_parser.o,$(shell $(AR) t "$(LIBMETALINK_PATH)/lib/libmetalink.a")),libexpat_metalink_parser.o)
+      curl_LDADD += -L"$(LIBEXPAT_PATH)/lib" -lexpat
+    else
+      curl_LDADD += -L"$(LIBXML2_PATH)/lib" -lxml2
+    endif
+  endif
+endif
+ifdef SSPI
+  CFLAGS += -DUSE_WINDOWS_SSPI
+endif
+ifdef IPV6
+  CFLAGS += -DENABLE_IPV6 -D_WIN32_WINNT=0x0501
+endif
+ifdef LDAPS
+  CFLAGS += -DHAVE_LDAP_SSL
+endif
+ifdef USE_LDAP_NOVELL
+  CFLAGS += -DCURL_HAS_NOVELL_LDAPSDK
+  curl_LDADD += -L"$(LDAP_SDK)/lib/mscvc" -lldapsdk -lldapssl -lldapx
+endif
+ifdef USE_LDAP_OPENLDAP
+  CFLAGS += -DCURL_HAS_OPENLDAP_LDAPSDK
+  curl_LDADD += -L"$(LDAP_SDK)/lib" -lldap -llber
+endif
+ifndef USE_LDAP_NOVELL
+ifndef USE_LDAP_OPENLDAP
+  curl_LDADD += -lwldap32
+endif
+endif
+curl_LDADD += -lws2_32
+
+# Makefile.inc provides the check_PROGRAMS and COMPLICATED_EXAMPLES defines
+include Makefile.inc
+
+check_PROGRAMS := $(patsubst %,%.exe,$(strip $(check_PROGRAMS)))
+check_PROGRAMS += ftpuploadresume.exe synctime.exe
+
+.PRECIOUS: %.o
+
+
+all: $(check_PROGRAMS)
+
+%.exe: %.o $(curl_DEPENDENCIES)
+	$(CC) $(LDFLAGS) -o $@ $< $(curl_LDADD)
+
+%.o: %.c
+	$(CC) $(INCLUDES) $(CFLAGS) -c $<
+
+%.res: %.rc
+	$(RC) $(RCFLAGS) -i $< -o $@
+
+clean:
+	@$(call DEL, $(check_PROGRAMS:.exe=.o))
+
+distclean vclean: clean
+	@$(call DEL, $(check_PROGRAMS))
diff --git a/components/cronet/third_party/curl_headers/docs/examples/Makefile.netware b/components/cronet/third_party/curl_headers/docs/examples/Makefile.netware
new file mode 100644
index 0000000..1f50a926
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/Makefile.netware
@@ -0,0 +1,415 @@
+#################################################################
+#
+## Makefile for building curl.nlm (NetWare version - gnu make)
+## Use: make -f Makefile.netware
+##
+## Comments to: Guenter Knauf
+#
+#################################################################
+
+# Edit the path below to point to the base of your Novell NDK.
+ifndef NDKBASE
+NDKBASE = c:/novell
+endif
+
+# Edit the path below to point to the base of your Zlib sources.
+ifndef ZLIB_PATH
+ZLIB_PATH = ../../../zlib-1.2.8
+endif
+
+# Edit the path below to point to the base of your OpenSSL package.
+ifndef OPENSSL_PATH
+OPENSSL_PATH = ../../../openssl-1.0.2a
+endif
+
+# Edit the path below to point to the base of your LibSSH2 package.
+ifndef LIBSSH2_PATH
+LIBSSH2_PATH = ../../../libssh2-1.5.0
+endif
+
+# Edit the path below to point to the base of your libidn package.
+ifndef LIBIDN_PATH
+LIBIDN_PATH = ../../../libidn-1.32
+endif
+
+# Edit the path below to point to the base of your librtmp package.
+ifndef LIBRTMP_PATH
+LIBRTMP_PATH = ../../../librtmp-2.4
+endif
+
+# Edit the path below to point to the base of your fbopenssl package.
+ifndef FBOPENSSL_PATH
+FBOPENSSL_PATH = ../../fbopenssl-0.4
+endif
+
+# Edit the path below to point to the base of your c-ares package.
+ifndef LIBCARES_PATH
+LIBCARES_PATH = ../../ares
+endif
+
+ifndef INSTDIR
+INSTDIR = ..$(DS)..$(DS)curl-$(LIBCURL_VERSION_STR)-bin-nw
+endif
+
+# Edit the vars below to change NLM target settings.
+TARGET  = examples
+VERSION = $(LIBCURL_VERSION)
+COPYR   = Copyright (C) $(LIBCURL_COPYRIGHT_STR)
+DESCR   = curl ($(LIBARCH))
+MTSAFE  = YES
+STACK   = 8192
+SCREEN  = Example Program
+# Comment the line below if you don't want to load protected automatically.
+# LDRING = 3
+
+# Uncomment the next line to enable linking with POSIX semantics.
+# POSIXFL = 1
+
+# Edit the var below to point to your lib architecture.
+ifndef LIBARCH
+LIBARCH = LIBC
+endif
+
+# must be equal to NDEBUG or DEBUG, CURLDEBUG
+ifndef DB
+DB = NDEBUG
+endif
+# Optimization: -O<n> or debugging: -g
+ifeq ($(DB),NDEBUG)
+  OPT = -O2
+  OBJDIR = release
+else
+  OPT = -g
+  OBJDIR = debug
+endif
+
+# The following lines defines your compiler.
+ifdef CWFolder
+  METROWERKS = $(CWFolder)
+endif
+ifdef METROWERKS
+  # MWCW_PATH = $(subst \,/,$(METROWERKS))/Novell Support
+  MWCW_PATH = $(subst \,/,$(METROWERKS))/Novell Support/Metrowerks Support
+  CC = mwccnlm
+else
+  CC = gcc
+endif
+PERL = perl
+# Here you can find a native Win32 binary of the original awk:
+# http://www.gknw.net/development/prgtools/awk-20100523.zip
+AWK = awk
+CP = cp -afv
+MKDIR = mkdir
+# RM = rm -f
+# If you want to mark the target as MTSAFE you will need a tool for
+# generating the xdc data for the linker; here's a minimal tool:
+# http://www.gknw.net/development/prgtools/mkxdc.zip
+MPKXDC = mkxdc
+
+# LIBARCH_U = $(shell $(AWK) 'BEGIN {print toupper(ARGV[1])}' $(LIBARCH))
+LIBARCH_L = $(shell $(AWK) 'BEGIN {print tolower(ARGV[1])}' $(LIBARCH))
+
+# Include the version info retrieved from curlver.h
+-include $(OBJDIR)/version.inc
+
+# Global flags for all compilers
+CFLAGS += $(OPT) -D$(DB) -DNETWARE -DHAVE_CONFIG_H -nostdinc
+
+ifeq ($(CC),mwccnlm)
+  LD = mwldnlm
+  LDFLAGS = -nostdlib $< $(PRELUDE) $(LDLIBS) -o $@ -commandfile
+  LIBEXT  = lib
+  CFLAGS  += -gccinc -inline off -opt nointrinsics -proc 586
+  CFLAGS  += -relax_pointers
+  #CFLAGS += -w on
+  ifeq ($(LIBARCH),LIBC)
+    ifeq ($(POSIXFL),1)
+      PRELUDE = $(NDK_LIBC)/imports/posixpre.o
+    else
+      PRELUDE = $(NDK_LIBC)/imports/libcpre.o
+    endif
+    CFLAGS += -align 4
+  else
+    # PRELUDE = $(NDK_CLIB)/imports/clibpre.o
+    # to avoid the __init_* / __deinit_* woes don't use prelude from NDK
+    PRELUDE = "$(MWCW_PATH)/libraries/runtime/prelude.obj"
+    # CFLAGS += -include "$(MWCW_PATH)/headers/nlm_clib_prefix.h"
+    CFLAGS += -align 1
+  endif
+else
+  LD = nlmconv
+  LDFLAGS = -T
+  LIBEXT  = a
+  CFLAGS  += -m32
+  CFLAGS  += -fno-builtin -fno-strict-aliasing
+  ifeq ($(findstring gcc,$(CC)),gcc)
+    CFLAGS += -fpcc-struct-return
+  endif
+  CFLAGS += -Wall # -pedantic
+  ifeq ($(LIBARCH),LIBC)
+    ifeq ($(POSIXFL),1)
+      PRELUDE = $(NDK_LIBC)/imports/posixpre.gcc.o
+    else
+      PRELUDE = $(NDK_LIBC)/imports/libcpre.gcc.o
+    endif
+  else
+    # PRELUDE = $(NDK_CLIB)/imports/clibpre.gcc.o
+    # to avoid the __init_* / __deinit_* woes don't use prelude from NDK
+    # http://www.gknw.net/development/mk_nlm/gcc_pre.zip
+    PRELUDE = $(NDK_ROOT)/pre/prelude.o
+    CFLAGS += -include $(NDKBASE)/nlmconv/genlm.h
+  endif
+endif
+
+NDK_ROOT = $(NDKBASE)/ndk
+ifndef NDK_CLIB
+NDK_CLIB = $(NDK_ROOT)/nwsdk
+endif
+ifndef NDK_LIBC
+NDK_LIBC = $(NDK_ROOT)/libc
+endif
+ifndef NDK_LDAP
+NDK_LDAP = $(NDK_ROOT)/cldapsdk/netware
+endif
+CURL_INC = ../../include
+CURL_LIB = ../../lib
+
+INCLUDES = -I$(CURL_INC)
+
+ifeq ($(findstring -static,$(CFG)),-static)
+LINK_STATIC = 1
+endif
+ifeq ($(findstring -ares,$(CFG)),-ares)
+WITH_ARES = 1
+endif
+ifeq ($(findstring -rtmp,$(CFG)),-rtmp)
+WITH_RTMP = 1
+WITH_SSL = 1
+WITH_ZLIB = 1
+endif
+ifeq ($(findstring -ssh2,$(CFG)),-ssh2)
+WITH_SSH2 = 1
+WITH_SSL = 1
+WITH_ZLIB = 1
+endif
+ifeq ($(findstring -ssl,$(CFG)),-ssl)
+WITH_SSL = 1
+endif
+ifeq ($(findstring -zlib,$(CFG)),-zlib)
+WITH_ZLIB = 1
+endif
+ifeq ($(findstring -idn,$(CFG)),-idn)
+WITH_IDN = 1
+endif
+ifeq ($(findstring -ipv6,$(CFG)),-ipv6)
+ENABLE_IPV6 = 1
+endif
+
+ifdef LINK_STATIC
+  LDLIBS = $(CURL_LIB)/libcurl.$(LIBEXT)
+ifdef WITH_ARES
+  LDLIBS += $(LIBCARES_PATH)/libcares.$(LIBEXT)
+endif
+else
+  MODULES = libcurl.nlm
+  IMPORTS = @$(CURL_LIB)/libcurl.imp
+endif
+ifdef WITH_SSH2
+  # INCLUDES += -I$(LIBSSH2_PATH)/include
+  ifdef LINK_STATIC
+    LDLIBS += $(LIBSSH2_PATH)/nw/libssh2.$(LIBEXT)
+  else
+    MODULES += libssh2.nlm
+    IMPORTS += @$(LIBSSH2_PATH)/nw/libssh2.imp
+  endif
+endif
+ifdef WITH_RTMP
+  # INCLUDES += -I$(LIBRTMP_PATH)
+ifdef LINK_STATIC
+  LDLIBS += $(LIBRTMP_PATH)/librtmp/librtmp.$(LIBEXT)
+endif
+endif
+ifdef WITH_SSL
+  INCLUDES += -I$(OPENSSL_PATH)/outinc_nw_$(LIBARCH_L)
+  LDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/ssl.$(LIBEXT)
+  LDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/crypto.$(LIBEXT)
+  IMPORTS += GetProcessSwitchCount RunningProcess
+else
+endif
+ifdef WITH_ZLIB
+  # INCLUDES += -I$(ZLIB_PATH)
+ifdef LINK_STATIC
+  LDLIBS += $(ZLIB_PATH)/nw/$(LIBARCH)/libz.$(LIBEXT)
+else
+  MODULES += libz.nlm
+  IMPORTS += @$(ZLIB_PATH)/nw/$(LIBARCH)/libz.imp
+endif
+endif
+ifdef WITH_IDN
+  # INCLUDES += -I$(LIBIDN_PATH)/include
+  LDLIBS += $(LIBIDN_PATH)/lib/libidn.$(LIBEXT)
+endif
+
+ifeq ($(LIBARCH),LIBC)
+  INCLUDES += -I$(NDK_LIBC)/include
+  # INCLUDES += -I$(NDK_LIBC)/include/nks
+  # INCLUDES += -I$(NDK_LIBC)/include/winsock
+  CFLAGS += -D_POSIX_SOURCE
+else
+  INCLUDES += -I$(NDK_CLIB)/include/nlm
+  # INCLUDES += -I$(NDK_CLIB)/include
+endif
+ifndef DISABLE_LDAP
+  # INCLUDES += -I$(NDK_LDAP)/$(LIBARCH_L)/inc
+endif
+CFLAGS += $(INCLUDES)
+
+ifeq ($(MTSAFE),YES)
+  XDCOPT = -n
+endif
+ifeq ($(MTSAFE),NO)
+  XDCOPT = -u
+endif
+ifdef XDCOPT
+  XDCDATA = $(OBJDIR)/$(TARGET).xdc
+endif
+
+ifeq ($(findstring /sh,$(SHELL)),/sh)
+DL  = '
+DS  = /
+PCT = %
+#-include $(NDKBASE)/nlmconv/ncpfs.inc
+else
+DS  = \\
+PCT = %%
+endif
+
+# Makefile.inc provides the CSOURCES and HHEADERS defines
+include Makefile.inc
+
+check_PROGRAMS := $(patsubst %,%.nlm,$(strip $(check_PROGRAMS)))
+
+.PRECIOUS: $(OBJDIR)/%.o $(OBJDIR)/%.def $(OBJDIR)/%.xdc
+
+
+all: prebuild $(check_PROGRAMS)
+
+prebuild: $(OBJDIR) $(OBJDIR)/version.inc
+
+$(OBJDIR)/%.o: %.c
+	@echo Compiling $<
+	$(CC) $(CFLAGS) -c $< -o $@
+
+$(OBJDIR)/version.inc: $(CURL_INC)/curl/curlver.h $(OBJDIR)
+	@echo Creating $@
+	@$(AWK) -f ../../packages/NetWare/get_ver.awk $< > $@
+
+install: $(INSTDIR) all
+	@$(CP) $(check_PROGRAMS) $(INSTDIR)
+
+clean:
+	-$(RM) -r $(OBJDIR)
+
+distclean vclean: clean
+	-$(RM) $(check_PROGRAMS)
+
+$(OBJDIR) $(INSTDIR):
+	@$(MKDIR) $@
+
+%.nlm: $(OBJDIR)/%.o $(OBJDIR)/%.def $(XDCDATA)
+	@echo Linking $@
+	@-$(RM) $@
+	@$(LD) $(LDFLAGS) $(OBJDIR)/$(@:.nlm=.def)
+
+$(OBJDIR)/%.xdc: Makefile.netware
+	@echo Creating $@
+	@$(MPKXDC) $(XDCOPT) $@
+
+$(OBJDIR)/%.def: Makefile.netware
+	@echo $(DL)# DEF file for linking with $(LD)$(DL) > $@
+	@echo $(DL)# Do not edit this file - it is created by Make!$(DL) >> $@
+	@echo $(DL)# All your changes will be lost!!$(DL) >> $@
+	@echo $(DL)#$(DL) >> $@
+	@echo $(DL)copyright "$(COPYR)"$(DL) >> $@
+	@echo $(DL)description "$(DESCR) $(notdir $(@:.def=)) Example"$(DL) >> $@
+	@echo $(DL)version $(VERSION)$(DL) >> $@
+ifdef NLMTYPE
+	@echo $(DL)type $(NLMTYPE)$(DL) >> $@
+endif
+ifdef STACK
+	@echo $(DL)stack $(STACK)$(DL) >> $@
+endif
+ifdef SCREEN
+	@echo $(DL)screenname "$(DESCR) $(notdir $(@:.def=)) $(SCREEN)"$(DL) >> $@
+else
+	@echo $(DL)screenname "DEFAULT"$(DL) >> $@
+endif
+ifneq ($(DB),NDEBUG)
+	@echo $(DL)debug$(DL) >> $@
+endif
+	@echo $(DL)threadname "_$(notdir $(@:.def=))"$(DL) >> $@
+ifdef XDCDATA
+	@echo $(DL)xdcdata $(XDCDATA)$(DL) >> $@
+endif
+ifeq ($(LDRING),0)
+	@echo $(DL)flag_on 16$(DL) >> $@
+endif
+ifeq ($(LDRING),3)
+	@echo $(DL)flag_on 512$(DL) >> $@
+endif
+ifeq ($(LIBARCH),CLIB)
+	@echo $(DL)start _Prelude$(DL) >> $@
+	@echo $(DL)exit _Stop$(DL) >> $@
+	@echo $(DL)import @$(NDK_CLIB)/imports/clib.imp$(DL) >> $@
+	@echo $(DL)import @$(NDK_CLIB)/imports/threads.imp$(DL) >> $@
+	@echo $(DL)import @$(NDK_CLIB)/imports/nlmlib.imp$(DL) >> $@
+	@echo $(DL)import @$(NDK_CLIB)/imports/socklib.imp$(DL) >> $@
+	@echo $(DL)module clib$(DL) >> $@
+ifndef DISABLE_LDAP
+	@echo $(DL)import @$(NDK_LDAP)/clib/imports/ldapsdk.imp$(DL) >> $@
+	@echo $(DL)import @$(NDK_LDAP)/clib/imports/ldapssl.imp$(DL) >> $@
+#	@echo $(DL)import @$(NDK_LDAP)/clib/imports/ldapx.imp$(DL) >> $@
+	@echo $(DL)module ldapsdk ldapssl$(DL) >> $@
+endif
+else
+ifeq ($(POSIXFL),1)
+	@echo $(DL)flag_on 4194304$(DL) >> $@
+endif
+	@echo $(DL)flag_on 64$(DL) >> $@
+	@echo $(DL)pseudopreemption$(DL) >> $@
+ifeq ($(findstring posixpre,$(PRELUDE)),posixpre)
+	@echo $(DL)start POSIX_Start$(DL) >> $@
+	@echo $(DL)exit POSIX_Stop$(DL) >> $@
+	@echo $(DL)check POSIX_CheckUnload$(DL) >> $@
+else
+	@echo $(DL)start _LibCPrelude$(DL) >> $@
+	@echo $(DL)exit _LibCPostlude$(DL) >> $@
+	@echo $(DL)check _LibCCheckUnload$(DL) >> $@
+endif
+	@echo $(DL)import @$(NDK_LIBC)/imports/libc.imp$(DL) >> $@
+	@echo $(DL)import @$(NDK_LIBC)/imports/netware.imp$(DL) >> $@
+	@echo $(DL)module libc$(DL) >> $@
+ifndef DISABLE_LDAP
+	@echo $(DL)import @$(NDK_LDAP)/libc/imports/lldapsdk.imp$(DL) >> $@
+	@echo $(DL)import @$(NDK_LDAP)/libc/imports/lldapssl.imp$(DL) >> $@
+#	@echo $(DL)import @$(NDK_LDAP)/libc/imports/lldapx.imp$(DL) >> $@
+	@echo $(DL)module lldapsdk lldapssl$(DL) >> $@
+endif
+endif
+ifdef MODULES
+	@echo $(DL)module $(MODULES)$(DL) >> $@
+endif
+ifdef EXPORTS
+	@echo $(DL)export $(EXPORTS)$(DL) >> $@
+endif
+ifdef IMPORTS
+	@echo $(DL)import $(IMPORTS)$(DL) >> $@
+endif
+ifeq ($(findstring nlmconv,$(LD)),nlmconv)
+	@echo $(DL)input $(PRELUDE)$(DL) >> $@
+	@echo $(DL)input $(@:.def=.o)$(DL) >> $@
+ifdef LDLIBS
+	@echo $(DL)input $(LDLIBS)$(DL) >> $@
+endif
+	@echo $(DL)output $(notdir $(@:.def=.nlm))$(DL) >> $@
+endif
diff --git a/components/cronet/third_party/curl_headers/docs/examples/README b/components/cronet/third_party/curl_headers/docs/examples/README
new file mode 100644
index 0000000..078cabe
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/README
@@ -0,0 +1,38 @@
+                                  _   _ ____  _
+                              ___| | | |  _ \| |
+                             / __| | | | |_) | |
+                            | (__| |_| |  _ <| |___
+                             \___|\___/|_| \_\_____|
+
+This directory is for libcurl programming examples. They are meant to show
+some simple steps on how you can build your own application to take full
+advantage of libcurl.
+
+If you end up with other small but still useful example sources, please mail
+them for submission in future packages and on the web site.
+
+BUILDING
+
+The Makefile.example is an example makefile that could be used to build these
+examples. Just edit the file according to your system and requirements first.
+
+Most examples should build fine using a command line like this:
+
+  $ `curl-config --cc --cflags --libs` -o example example.c
+
+Some compilers don't like having the arguments in this order but instead
+want you do reorganize them like:
+
+  $ `curl-config --cc` -o example example.c `curl-config --cflags --libs`
+
+*PLEASE* do not use the curl.haxx.se site as a test target for your libcurl
+applications/experiments. Even if some of the examples use that site as a URL
+at some places, it doesn't mean that the URLs work or that we expect you to
+actually torture our web site with your tests!  Thanks.
+
+EXAMPLES
+
+Each example source code file is designed to be and work stand-alone and
+rather self-explanatory. The examples may at times lack the level of error
+checks you need in a real world, but that is then only for the sake of
+readability: to make the code smaller and easier to follow.
diff --git a/components/cronet/third_party/curl_headers/docs/examples/adddocsref.pl b/components/cronet/third_party/curl_headers/docs/examples/adddocsref.pl
new file mode 100755
index 0000000..ce6f582
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/adddocsref.pl
@@ -0,0 +1,35 @@
+#!/usr/bin/env perl
+
+# pass files as argument(s)
+
+my $docroot="https://curl.haxx.se/libcurl/c";
+
+for $f (@ARGV) {
+    open(NEW, ">$f.new");
+    open(F, "<$f");
+    while(<F>) {
+        my $l = $_;
+        if($l =~ /\/* $docroot/) {
+            # just ignore preciously added refs
+        }
+        elsif($l =~ /^( *).*curl_easy_setopt\([^,]*, *([^ ,]*) *,/) {
+            my ($prefix, $anc) = ($1, $2);
+            $anc =~ s/_//g;
+            print NEW "$prefix/* $docroot/curl_easy_setopt.html#$anc */\n";
+            print NEW $l;
+        }
+        elsif($l =~ /^( *).*(curl_([^\(]*))\(/) {
+            my ($prefix, $func) = ($1, $2);
+            print NEW "$prefix/* $docroot/$func.html */\n";
+            print NEW $l;
+        }
+        else {
+            print NEW $l;
+        }
+    }
+    close(F);
+    close(NEW);
+
+    system("mv $f $f.org");
+    system("mv $f.new $f");
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/anyauthput.c b/components/cronet/third_party/curl_headers/docs/examples/anyauthput.c
new file mode 100644
index 0000000..14da10c
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/anyauthput.c
@@ -0,0 +1,171 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * HTTP PUT upload with authentiction using "any" method. libcurl picks the
+ * one the server supports/wants.
+ * </DESC>
+ */
+#include <stdio.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <curl/curl.h>
+
+#ifdef WIN32
+#  include <io.h>
+#  define READ_3RD_ARG unsigned int
+#else
+#  include <unistd.h>
+#  define READ_3RD_ARG size_t
+#endif
+
+#if LIBCURL_VERSION_NUM < 0x070c03
+#error "upgrade your libcurl to no less than 7.12.3"
+#endif
+
+/*
+ * This example shows a HTTP PUT operation with authentiction using "any"
+ * type. It PUTs a file given as a command line argument to the URL also given
+ * on the command line.
+ *
+ * Since libcurl 7.12.3, using "any" auth and POST/PUT requires a set ioctl
+ * function.
+ *
+ * This example also uses its own read callback.
+ */
+
+/* ioctl callback function */
+static curlioerr my_ioctl(CURL *handle, curliocmd cmd, void *userp)
+{
+  int *fdp = (int *)userp;
+  int fd = *fdp;
+
+  (void)handle; /* not used in here */
+
+  switch(cmd) {
+  case CURLIOCMD_RESTARTREAD:
+    /* mr libcurl kindly asks as to rewind the read data stream to start */
+    if(-1 == lseek(fd, 0, SEEK_SET))
+      /* couldn't rewind */
+      return CURLIOE_FAILRESTART;
+
+    break;
+
+  default: /* ignore unknown commands */
+    return CURLIOE_UNKNOWNCMD;
+  }
+  return CURLIOE_OK; /* success! */
+}
+
+/* read callback function, fread() look alike */
+static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
+{
+  ssize_t retcode;
+  curl_off_t nread;
+
+  int *fdp = (int *)stream;
+  int fd = *fdp;
+
+  retcode = read(fd, ptr, (READ_3RD_ARG)(size * nmemb));
+
+  nread = (curl_off_t)retcode;
+
+  fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
+          " bytes from file\n", nread);
+
+  return retcode;
+}
+
+int main(int argc, char **argv)
+{
+  CURL *curl;
+  CURLcode res;
+  int hd;
+  struct stat file_info;
+
+  char *file;
+  char *url;
+
+  if(argc < 3)
+    return 1;
+
+  file = argv[1];
+  url = argv[2];
+
+  /* get the file size of the local file */
+  hd = open(file, O_RDONLY);
+  fstat(hd, &file_info);
+
+  /* In windows, this will init the winsock stuff */
+  curl_global_init(CURL_GLOBAL_ALL);
+
+  /* get a curl handle */
+  curl = curl_easy_init();
+  if(curl) {
+    /* we want to use our own read function */
+    curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
+
+    /* which file to upload */
+    curl_easy_setopt(curl, CURLOPT_READDATA, (void *)&hd);
+
+    /* set the ioctl function */
+    curl_easy_setopt(curl, CURLOPT_IOCTLFUNCTION, my_ioctl);
+
+    /* pass the file descriptor to the ioctl callback as well */
+    curl_easy_setopt(curl, CURLOPT_IOCTLDATA, (void *)&hd);
+
+    /* enable "uploading" (which means PUT when doing HTTP) */
+    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+
+    /* specify target URL, and note that this URL should also include a file
+       name, not only a directory (as you can do with GTP uploads) */
+    curl_easy_setopt(curl, CURLOPT_URL, url);
+
+    /* and give the size of the upload, this supports large file sizes
+       on systems that have general support for it */
+    curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE,
+                     (curl_off_t)file_info.st_size);
+
+    /* tell libcurl we can use "any" auth, which lets the lib pick one, but it
+       also costs one extra round-trip and possibly sending of all the PUT
+       data twice!!! */
+    curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY);
+
+    /* set user name and password for the authentication */
+    curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password");
+
+    /* Now run off and do what you've been told! */
+    res = curl_easy_perform(curl);
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+  close(hd); /* close the local file */
+
+  curl_global_cleanup();
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/asiohiper.cpp b/components/cronet/third_party/curl_headers/docs/examples/asiohiper.cpp
new file mode 100644
index 0000000..de14805
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/asiohiper.cpp
@@ -0,0 +1,496 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2012 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * demonstrate the use of multi socket interface with boost::asio
+ * </DESC>
+ */
+/*
+ * This program is in c++ and uses boost::asio instead of libevent/libev.
+ * Requires boost::asio, boost::bind and boost::system
+ *
+ * This is an adaptation of libcurl's "hiperfifo.c" and "evhiperfifo.c"
+ * sample programs. This example implements a subset of the functionality from
+ * hiperfifo.c, for full functionality refer hiperfifo.c or evhiperfifo.c
+ *
+ * Written by Lijo Antony based on hiperfifo.c by Jeff Pohlmeyer
+ *
+ * When running, the program creates an easy handle for a URL and
+ * uses the curl_multi API to fetch it.
+ *
+ * Note:
+ *  For the sake of simplicity, URL is hard coded to "www.google.com"
+ *
+ * This is purely a demo app, all retrieved data is simply discarded by the
+ * write callback.
+ *
+ * ===========================================================================
+ * WARNING: This example program is known to have flaws:
+ * https://github.com/curl/curl/issues/2407
+ *
+ * It still kept in the example repository with the hope that it might be
+ * useful, and maybe some day someone who knows enough about boost::asio will
+ * read this text, accept the challenge and make the example code work
+ * correctly. Until then: expect this example program to fail occasionally.
+ * ===========================================================================
+ */
+
+
+#include <curl/curl.h>
+#include <boost/asio.hpp>
+#include <boost/bind.hpp>
+#include <iostream>
+
+#define MSG_OUT stdout /* Send info to stdout, change to stderr if you want */
+
+/* boost::asio related objects
+ * using global variables for simplicity
+ */
+boost::asio::io_service io_service;
+boost::asio::deadline_timer timer(io_service);
+std::map<curl_socket_t, boost::asio::ip::tcp::socket *> socket_map;
+
+/* Global information, common to all connections */
+typedef struct _GlobalInfo
+{
+  CURLM *multi;
+  int still_running;
+} GlobalInfo;
+
+/* Information associated with a specific easy handle */
+typedef struct _ConnInfo
+{
+  CURL *easy;
+  char *url;
+  GlobalInfo *global;
+  char error[CURL_ERROR_SIZE];
+} ConnInfo;
+
+static void timer_cb(const boost::system::error_code & error, GlobalInfo *g);
+
+/* Update the event timer after curl_multi library calls */
+static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
+{
+  fprintf(MSG_OUT, "\nmulti_timer_cb: timeout_ms %ld", timeout_ms);
+
+  /* cancel running timer */
+  timer.cancel();
+
+  if(timeout_ms > 0) {
+    /* update timer */
+    timer.expires_from_now(boost::posix_time::millisec(timeout_ms));
+    timer.async_wait(boost::bind(&timer_cb, _1, g));
+  }
+  else if(timeout_ms == 0) {
+    /* call timeout function immediately */
+    boost::system::error_code error; /*success*/
+    timer_cb(error, g);
+  }
+
+  return 0;
+}
+
+/* Die if we get a bad CURLMcode somewhere */
+static void mcode_or_die(const char *where, CURLMcode code)
+{
+  if(CURLM_OK != code) {
+    const char *s;
+    switch(code) {
+    case CURLM_CALL_MULTI_PERFORM:
+      s = "CURLM_CALL_MULTI_PERFORM";
+      break;
+    case CURLM_BAD_HANDLE:
+      s = "CURLM_BAD_HANDLE";
+      break;
+    case CURLM_BAD_EASY_HANDLE:
+      s = "CURLM_BAD_EASY_HANDLE";
+      break;
+    case CURLM_OUT_OF_MEMORY:
+      s = "CURLM_OUT_OF_MEMORY";
+      break;
+    case CURLM_INTERNAL_ERROR:
+      s = "CURLM_INTERNAL_ERROR";
+      break;
+    case CURLM_UNKNOWN_OPTION:
+      s = "CURLM_UNKNOWN_OPTION";
+      break;
+    case CURLM_LAST:
+      s = "CURLM_LAST";
+      break;
+    default:
+      s = "CURLM_unknown";
+      break;
+    case CURLM_BAD_SOCKET:
+      s = "CURLM_BAD_SOCKET";
+      fprintf(MSG_OUT, "\nERROR: %s returns %s", where, s);
+      /* ignore this error */
+      return;
+    }
+
+    fprintf(MSG_OUT, "\nERROR: %s returns %s", where, s);
+
+    exit(code);
+  }
+}
+
+/* Check for completed transfers, and remove their easy handles */
+static void check_multi_info(GlobalInfo *g)
+{
+  char *eff_url;
+  CURLMsg *msg;
+  int msgs_left;
+  ConnInfo *conn;
+  CURL *easy;
+  CURLcode res;
+
+  fprintf(MSG_OUT, "\nREMAINING: %d", g->still_running);
+
+  while((msg = curl_multi_info_read(g->multi, &msgs_left))) {
+    if(msg->msg == CURLMSG_DONE) {
+      easy = msg->easy_handle;
+      res = msg->data.result;
+      curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
+      curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
+      fprintf(MSG_OUT, "\nDONE: %s => (%d) %s", eff_url, res, conn->error);
+      curl_multi_remove_handle(g->multi, easy);
+      free(conn->url);
+      curl_easy_cleanup(easy);
+      free(conn);
+    }
+  }
+}
+
+/* Called by asio when there is an action on a socket */
+static void event_cb(GlobalInfo *g, curl_socket_t s,
+                     int action, const boost::system::error_code & error,
+                     int *fdp)
+{
+  fprintf(MSG_OUT, "\nevent_cb: action=%d", action);
+
+  if(socket_map.find(s) == socket_map.end()) {
+    fprintf(MSG_OUT, "\nevent_cb: socket already closed");
+    return;
+  }
+
+  /* make sure the event matches what are wanted */
+  if(*fdp == action || *fdp == CURL_POLL_INOUT) {
+    CURLMcode rc;
+    if(error)
+      action = CURL_CSELECT_ERR;
+    rc = curl_multi_socket_action(g->multi, s, action, &g->still_running);
+
+    mcode_or_die("event_cb: curl_multi_socket_action", rc);
+    check_multi_info(g);
+
+    if(g->still_running <= 0) {
+      fprintf(MSG_OUT, "\nlast transfer done, kill timeout");
+      timer.cancel();
+    }
+
+    /* keep on watching.
+     * the socket may have been closed and/or fdp may have been changed
+     * in curl_multi_socket_action(), so check them both */
+    if(!error && socket_map.find(s) != socket_map.end() &&
+       (*fdp == action || *fdp == CURL_POLL_INOUT)) {
+      boost::asio::ip::tcp::socket *tcp_socket = socket_map.find(s)->second;
+
+      if(action == CURL_POLL_IN) {
+        tcp_socket->async_read_some(boost::asio::null_buffers(),
+                                    boost::bind(&event_cb, g, s,
+                                                action, _1, fdp));
+      }
+      if(action == CURL_POLL_OUT) {
+        tcp_socket->async_write_some(boost::asio::null_buffers(),
+                                     boost::bind(&event_cb, g, s,
+                                                 action, _1, fdp));
+      }
+    }
+  }
+}
+
+/* Called by asio when our timeout expires */
+static void timer_cb(const boost::system::error_code & error, GlobalInfo *g)
+{
+  if(!error) {
+    fprintf(MSG_OUT, "\ntimer_cb: ");
+
+    CURLMcode rc;
+    rc = curl_multi_socket_action(g->multi, CURL_SOCKET_TIMEOUT, 0,
+                                  &g->still_running);
+
+    mcode_or_die("timer_cb: curl_multi_socket_action", rc);
+    check_multi_info(g);
+  }
+}
+
+/* Clean up any data */
+static void remsock(int *f, GlobalInfo *g)
+{
+  fprintf(MSG_OUT, "\nremsock: ");
+
+  if(f) {
+    free(f);
+  }
+}
+
+static void setsock(int *fdp, curl_socket_t s, CURL *e, int act, int oldact,
+                    GlobalInfo *g)
+{
+  fprintf(MSG_OUT, "\nsetsock: socket=%d, act=%d, fdp=%p", s, act, fdp);
+
+  std::map<curl_socket_t, boost::asio::ip::tcp::socket *>::iterator it =
+    socket_map.find(s);
+
+  if(it == socket_map.end()) {
+    fprintf(MSG_OUT, "\nsocket %d is a c-ares socket, ignoring", s);
+    return;
+  }
+
+  boost::asio::ip::tcp::socket * tcp_socket = it->second;
+
+  *fdp = act;
+
+  if(act == CURL_POLL_IN) {
+    fprintf(MSG_OUT, "\nwatching for socket to become readable");
+    if(oldact != CURL_POLL_IN && oldact != CURL_POLL_INOUT) {
+      tcp_socket->async_read_some(boost::asio::null_buffers(),
+                                  boost::bind(&event_cb, g, s,
+                                              CURL_POLL_IN, _1, fdp));
+    }
+  }
+  else if(act == CURL_POLL_OUT) {
+    fprintf(MSG_OUT, "\nwatching for socket to become writable");
+    if(oldact != CURL_POLL_OUT && oldact != CURL_POLL_INOUT) {
+      tcp_socket->async_write_some(boost::asio::null_buffers(),
+                                   boost::bind(&event_cb, g, s,
+                                               CURL_POLL_OUT, _1, fdp));
+    }
+  }
+  else if(act == CURL_POLL_INOUT) {
+    fprintf(MSG_OUT, "\nwatching for socket to become readable & writable");
+    if(oldact != CURL_POLL_IN && oldact != CURL_POLL_INOUT) {
+      tcp_socket->async_read_some(boost::asio::null_buffers(),
+                                  boost::bind(&event_cb, g, s,
+                                              CURL_POLL_IN, _1, fdp));
+    }
+    if(oldact != CURL_POLL_OUT && oldact != CURL_POLL_INOUT) {
+      tcp_socket->async_write_some(boost::asio::null_buffers(),
+                                   boost::bind(&event_cb, g, s,
+                                               CURL_POLL_OUT, _1, fdp));
+    }
+  }
+}
+
+static void addsock(curl_socket_t s, CURL *easy, int action, GlobalInfo *g)
+{
+  /* fdp is used to store current action */
+  int *fdp = (int *) calloc(sizeof(int), 1);
+
+  setsock(fdp, s, easy, action, 0, g);
+  curl_multi_assign(g->multi, s, fdp);
+}
+
+/* CURLMOPT_SOCKETFUNCTION */
+static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
+{
+  fprintf(MSG_OUT, "\nsock_cb: socket=%d, what=%d, sockp=%p", s, what, sockp);
+
+  GlobalInfo *g = (GlobalInfo*) cbp;
+  int *actionp = (int *) sockp;
+  const char *whatstr[] = { "none", "IN", "OUT", "INOUT", "REMOVE"};
+
+  fprintf(MSG_OUT,
+          "\nsocket callback: s=%d e=%p what=%s ", s, e, whatstr[what]);
+
+  if(what == CURL_POLL_REMOVE) {
+    fprintf(MSG_OUT, "\n");
+    remsock(actionp, g);
+  }
+  else {
+    if(!actionp) {
+      fprintf(MSG_OUT, "\nAdding data: %s", whatstr[what]);
+      addsock(s, e, what, g);
+    }
+    else {
+      fprintf(MSG_OUT,
+              "\nChanging action from %s to %s",
+              whatstr[*actionp], whatstr[what]);
+      setsock(actionp, s, e, what, *actionp, g);
+    }
+  }
+
+  return 0;
+}
+
+/* CURLOPT_WRITEFUNCTION */
+static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data)
+{
+  size_t written = size * nmemb;
+  char *pBuffer = (char *)malloc(written + 1);
+
+  strncpy(pBuffer, (const char *)ptr, written);
+  pBuffer[written] = '\0';
+
+  fprintf(MSG_OUT, "%s", pBuffer);
+
+  free(pBuffer);
+
+  return written;
+}
+
+/* CURLOPT_PROGRESSFUNCTION */
+static int prog_cb(void *p, double dltotal, double dlnow, double ult,
+                   double uln)
+{
+  ConnInfo *conn = (ConnInfo *)p;
+
+  (void)ult;
+  (void)uln;
+
+  fprintf(MSG_OUT, "\nProgress: %s (%g/%g)", conn->url, dlnow, dltotal);
+  fprintf(MSG_OUT, "\nProgress: %s (%g)", conn->url, ult);
+
+  return 0;
+}
+
+/* CURLOPT_OPENSOCKETFUNCTION */
+static curl_socket_t opensocket(void *clientp, curlsocktype purpose,
+                                struct curl_sockaddr *address)
+{
+  fprintf(MSG_OUT, "\nopensocket :");
+
+  curl_socket_t sockfd = CURL_SOCKET_BAD;
+
+  /* restrict to IPv4 */
+  if(purpose == CURLSOCKTYPE_IPCXN && address->family == AF_INET) {
+    /* create a tcp socket object */
+    boost::asio::ip::tcp::socket *tcp_socket =
+      new boost::asio::ip::tcp::socket(io_service);
+
+    /* open it and get the native handle*/
+    boost::system::error_code ec;
+    tcp_socket->open(boost::asio::ip::tcp::v4(), ec);
+
+    if(ec) {
+      /* An error occurred */
+      std::cout << std::endl << "Couldn't open socket [" << ec << "][" <<
+        ec.message() << "]";
+      fprintf(MSG_OUT, "\nERROR: Returning CURL_SOCKET_BAD to signal error");
+    }
+    else {
+      sockfd = tcp_socket->native_handle();
+      fprintf(MSG_OUT, "\nOpened socket %d", sockfd);
+
+      /* save it for monitoring */
+      socket_map.insert(std::pair<curl_socket_t,
+                        boost::asio::ip::tcp::socket *>(sockfd, tcp_socket));
+    }
+  }
+
+  return sockfd;
+}
+
+/* CURLOPT_CLOSESOCKETFUNCTION */
+static int close_socket(void *clientp, curl_socket_t item)
+{
+  fprintf(MSG_OUT, "\nclose_socket : %d", item);
+
+  std::map<curl_socket_t, boost::asio::ip::tcp::socket *>::iterator it =
+    socket_map.find(item);
+
+  if(it != socket_map.end()) {
+    delete it->second;
+    socket_map.erase(it);
+  }
+
+  return 0;
+}
+
+/* Create a new easy handle, and add it to the global curl_multi */
+static void new_conn(char *url, GlobalInfo *g)
+{
+  ConnInfo *conn;
+  CURLMcode rc;
+
+  conn = (ConnInfo *) calloc(1, sizeof(ConnInfo));
+
+  conn->easy = curl_easy_init();
+  if(!conn->easy) {
+    fprintf(MSG_OUT, "\ncurl_easy_init() failed, exiting!");
+    exit(2);
+  }
+
+  conn->global = g;
+  conn->url = strdup(url);
+  curl_easy_setopt(conn->easy, CURLOPT_URL, conn->url);
+  curl_easy_setopt(conn->easy, CURLOPT_WRITEFUNCTION, write_cb);
+  curl_easy_setopt(conn->easy, CURLOPT_WRITEDATA, &conn);
+  curl_easy_setopt(conn->easy, CURLOPT_VERBOSE, 1L);
+  curl_easy_setopt(conn->easy, CURLOPT_ERRORBUFFER, conn->error);
+  curl_easy_setopt(conn->easy, CURLOPT_PRIVATE, conn);
+  curl_easy_setopt(conn->easy, CURLOPT_NOPROGRESS, 1L);
+  curl_easy_setopt(conn->easy, CURLOPT_PROGRESSFUNCTION, prog_cb);
+  curl_easy_setopt(conn->easy, CURLOPT_PROGRESSDATA, conn);
+  curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_TIME, 3L);
+  curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_LIMIT, 10L);
+
+  /* call this function to get a socket */
+  curl_easy_setopt(conn->easy, CURLOPT_OPENSOCKETFUNCTION, opensocket);
+
+  /* call this function to close a socket */
+  curl_easy_setopt(conn->easy, CURLOPT_CLOSESOCKETFUNCTION, close_socket);
+
+  fprintf(MSG_OUT,
+          "\nAdding easy %p to multi %p (%s)", conn->easy, g->multi, url);
+  rc = curl_multi_add_handle(g->multi, conn->easy);
+  mcode_or_die("new_conn: curl_multi_add_handle", rc);
+
+  /* note that the add_handle() will set a time-out to trigger very soon so
+     that the necessary socket_action() call will be called by this app */
+}
+
+int main(int argc, char **argv)
+{
+  GlobalInfo g;
+
+  (void)argc;
+  (void)argv;
+
+  memset(&g, 0, sizeof(GlobalInfo));
+  g.multi = curl_multi_init();
+
+  curl_multi_setopt(g.multi, CURLMOPT_SOCKETFUNCTION, sock_cb);
+  curl_multi_setopt(g.multi, CURLMOPT_SOCKETDATA, &g);
+  curl_multi_setopt(g.multi, CURLMOPT_TIMERFUNCTION, multi_timer_cb);
+  curl_multi_setopt(g.multi, CURLMOPT_TIMERDATA, &g);
+
+  new_conn((char *)"www.google.com", &g);  /* add a URL */
+
+  /* enter io_service run loop */
+  io_service.run();
+
+  curl_multi_cleanup(g.multi);
+
+  fprintf(MSG_OUT, "\ndone.\n");
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/cacertinmem.c b/components/cronet/third_party/curl_headers/docs/examples/cacertinmem.c
new file mode 100644
index 0000000..ea295d01
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/cacertinmem.c
@@ -0,0 +1,181 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * CA cert in memory with OpenSSL to get a HTTPS page.
+ * </DESC>
+ */
+
+#include <openssl/err.h>
+#include <openssl/ssl.h>
+#include <curl/curl.h>
+#include <stdio.h>
+
+static size_t writefunction(void *ptr, size_t size, size_t nmemb, void *stream)
+{
+  fwrite(ptr, size, nmemb, (FILE *)stream);
+  return (nmemb*size);
+}
+
+static CURLcode sslctx_function(CURL *curl, void *sslctx, void *parm)
+{
+  CURLcode rv = CURLE_ABORTED_BY_CALLBACK;
+
+  /** This example uses two (fake) certificates **/
+  static const char mypem[] =
+    "-----BEGIN CERTIFICATE-----\n"
+    "MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE\n"
+    "AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw\n"
+    "CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ\n"
+    "BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND\n"
+    "VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb\n"
+    "qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY\n"
+    "HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo\n"
+    "G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA\n"
+    "0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH\n"
+    "k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47\n"
+    "JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m\n"
+    "AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD\n"
+    "vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms\n"
+    "tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH\n"
+    "7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h\n"
+    "I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA\n"
+    "h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF\n"
+    "d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H\n"
+    "pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7\n"
+    "-----END CERTIFICATE-----\n"
+    "-----BEGIN CERTIFICATE-----\n"
+    "MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE\n"
+    "AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x\n"
+    "CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW\n"
+    "MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF\n"
+    "RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC\n"
+    "AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7\n"
+    "09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7\n"
+    "XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P\n"
+    "gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe\n"
+    "I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i\n"
+    "5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi\n"
+    "ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn\n"
+    "MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ\n"
+    "o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6\n"
+    "zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN\n"
+    "GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt\n"
+    "r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK\n"
+    "Z05phkOTOPu220+DkdRgfks+KzgHVZhepA==\n"
+    "-----END CERTIFICATE-----\n";
+
+  BIO *cbio = BIO_new_mem_buf(mypem, sizeof(mypem));
+  X509_STORE  *cts = SSL_CTX_get_cert_store((SSL_CTX *)sslctx);
+  int i;
+  STACK_OF(X509_INFO) *inf;
+  (void)curl;
+  (void)parm;
+
+  if(!cts || !cbio) {
+    return rv;
+  }
+
+  inf = PEM_X509_INFO_read_bio(cbio, NULL, NULL, NULL);
+
+  if(!inf) {
+    BIO_free(cbio);
+    return rv;
+  }
+
+  for(i = 0; i < sk_X509_INFO_num(inf); i++) {
+    X509_INFO *itmp = sk_X509_INFO_value(inf, i);
+    if(itmp->x509) {
+      X509_STORE_add_cert(cts, itmp->x509);
+    }
+    if(itmp->crl) {
+      X509_STORE_add_crl(cts, itmp->crl);
+    }
+  }
+
+  sk_X509_INFO_pop_free(inf, X509_INFO_free);
+  BIO_free(cbio);
+
+  rv = CURLE_OK;
+  return rv;
+}
+
+int main(void)
+{
+  CURL *ch;
+  CURLcode rv;
+
+  curl_global_init(CURL_GLOBAL_ALL);
+  ch = curl_easy_init();
+  curl_easy_setopt(ch, CURLOPT_VERBOSE, 0L);
+  curl_easy_setopt(ch, CURLOPT_HEADER, 0L);
+  curl_easy_setopt(ch, CURLOPT_NOPROGRESS, 1L);
+  curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1L);
+  curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, *writefunction);
+  curl_easy_setopt(ch, CURLOPT_WRITEDATA, stdout);
+  curl_easy_setopt(ch, CURLOPT_HEADERFUNCTION, *writefunction);
+  curl_easy_setopt(ch, CURLOPT_HEADERDATA, stderr);
+  curl_easy_setopt(ch, CURLOPT_SSLCERTTYPE, "PEM");
+  curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 1L);
+  curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
+
+  /* Turn off the default CA locations, otherwise libcurl will load CA
+   * certificates from the locations that were detected/specified at
+   * build-time
+   */
+  curl_easy_setopt(ch, CURLOPT_CAINFO, NULL);
+  curl_easy_setopt(ch, CURLOPT_CAPATH, NULL);
+
+  /* first try: retrieve page without ca certificates -> should fail
+   * unless libcurl was built --with-ca-fallback enabled at build-time
+   */
+  rv = curl_easy_perform(ch);
+  if(rv == CURLE_OK)
+    printf("*** transfer succeeded ***\n");
+  else
+    printf("*** transfer failed ***\n");
+
+  /* use a fresh connection (optional)
+   * this option seriously impacts performance of multiple transfers but
+   * it is necessary order to demonstrate this example. recall that the
+   * ssl ctx callback is only called _before_ an SSL connection is
+   * established, therefore it will not affect existing verified SSL
+   * connections already in the connection cache associated with this
+   * handle. normally you would set the ssl ctx function before making
+   * any transfers, and not use this option.
+   */
+  curl_easy_setopt(ch, CURLOPT_FRESH_CONNECT, 1L);
+
+  /* second try: retrieve page using cacerts' certificate -> will succeed
+   * load the certificate by installing a function doing the necessary
+   * "modifications" to the SSL CONTEXT just before link init
+   */
+  curl_easy_setopt(ch, CURLOPT_SSL_CTX_FUNCTION, *sslctx_function);
+  rv = curl_easy_perform(ch);
+  if(rv == CURLE_OK)
+    printf("*** transfer succeeded ***\n");
+  else
+    printf("*** transfer failed ***\n");
+
+  curl_easy_cleanup(ch);
+  curl_global_cleanup();
+  return rv;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/certinfo.c b/components/cronet/third_party/curl_headers/docs/examples/certinfo.c
new file mode 100644
index 0000000..1aee614
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/certinfo.c
@@ -0,0 +1,85 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Extract lots of TLS certificate info.
+ * </DESC>
+ */
+#include <stdio.h>
+
+#include <curl/curl.h>
+
+static size_t wrfu(void *ptr,  size_t  size,  size_t  nmemb,  void *stream)
+{
+  (void)stream;
+  (void)ptr;
+  return size * nmemb;
+}
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+
+  curl_global_init(CURL_GLOBAL_DEFAULT);
+
+  curl = curl_easy_init();
+  if(curl) {
+    curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/");
+
+    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, wrfu);
+
+    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
+    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
+
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L);
+    curl_easy_setopt(curl, CURLOPT_CERTINFO, 1L);
+
+    res = curl_easy_perform(curl);
+
+    if(!res) {
+      struct curl_certinfo *certinfo;
+
+      res = curl_easy_getinfo(curl, CURLINFO_CERTINFO, &certinfo);
+
+      if(!res && certinfo) {
+        int i;
+
+        printf("%d certs!\n", certinfo->num_of_certs);
+
+        for(i = 0; i < certinfo->num_of_certs; i++) {
+          struct curl_slist *slist;
+
+          for(slist = certinfo->certinfo[i]; slist; slist = slist->next)
+            printf("%s\n", slist->data);
+
+        }
+      }
+
+    }
+
+    curl_easy_cleanup(curl);
+  }
+
+  curl_global_cleanup();
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/chkspeed.c b/components/cronet/third_party/curl_headers/docs/examples/chkspeed.c
new file mode 100644
index 0000000..0b0ba72a
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/chkspeed.c
@@ -0,0 +1,213 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Show transfer timing info after download completes.
+ * </DESC>
+ */
+/* Example source code to show how the callback function can be used to
+ * download data into a chunk of memory instead of storing it in a file.
+ * After successful download we use curl_easy_getinfo() calls to get the
+ * amount of downloaded bytes, the time used for the whole download, and
+ * the average download speed.
+ * On Linux you can create the download test files with:
+ * dd if=/dev/urandom of=file_1M.bin bs=1M count=1
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include <curl/curl.h>
+
+#define URL_BASE "http://speedtest.your.domain/"
+#define URL_1M   URL_BASE "file_1M.bin"
+#define URL_2M   URL_BASE "file_2M.bin"
+#define URL_5M   URL_BASE "file_5M.bin"
+#define URL_10M  URL_BASE "file_10M.bin"
+#define URL_20M  URL_BASE "file_20M.bin"
+#define URL_50M  URL_BASE "file_50M.bin"
+#define URL_100M URL_BASE "file_100M.bin"
+
+#define CHKSPEED_VERSION "1.0"
+
+static size_t WriteCallback(void *ptr, size_t size, size_t nmemb, void *data)
+{
+  /* we are not interested in the downloaded bytes itself,
+     so we only return the size we would have saved ... */
+  (void)ptr;  /* unused */
+  (void)data; /* unused */
+  return (size_t)(size * nmemb);
+}
+
+int main(int argc, char *argv[])
+{
+  CURL *curl_handle;
+  CURLcode res;
+  int prtall = 0, prtsep = 0, prttime = 0;
+  const char *url = URL_1M;
+  char *appname = argv[0];
+
+  if(argc > 1) {
+    /* parse input parameters */
+    for(argc--, argv++; *argv; argc--, argv++) {
+      if(strncasecmp(*argv, "-", 1) == 0) {
+        if(strncasecmp(*argv, "-H", 2) == 0) {
+          fprintf(stderr,
+                  "\rUsage: %s [-m=1|2|5|10|20|50|100] [-t] [-x] [url]\n",
+                  appname);
+          exit(1);
+        }
+        else if(strncasecmp(*argv, "-V", 2) == 0) {
+          fprintf(stderr, "\r%s %s - %s\n",
+                  appname, CHKSPEED_VERSION, curl_version());
+          exit(1);
+        }
+        else if(strncasecmp(*argv, "-A", 2) == 0) {
+          prtall = 1;
+        }
+        else if(strncasecmp(*argv, "-X", 2) == 0) {
+          prtsep = 1;
+        }
+        else if(strncasecmp(*argv, "-T", 2) == 0) {
+          prttime = 1;
+        }
+        else if(strncasecmp(*argv, "-M=", 3) == 0) {
+          long m = strtol((*argv) + 3, NULL, 10);
+          switch(m) {
+          case 1:
+            url = URL_1M;
+            break;
+          case 2:
+            url = URL_2M;
+            break;
+          case 5:
+            url = URL_5M;
+            break;
+          case 10:
+            url = URL_10M;
+            break;
+          case 20:
+            url = URL_20M;
+            break;
+          case 50:
+            url = URL_50M;
+            break;
+          case 100:
+            url = URL_100M;
+            break;
+          default:
+            fprintf(stderr, "\r%s: invalid parameter %s\n",
+                    appname, *argv + 3);
+            exit(1);
+          }
+        }
+        else {
+          fprintf(stderr, "\r%s: invalid or unknown option %s\n",
+                  appname, *argv);
+          exit(1);
+        }
+      }
+      else {
+        url = *argv;
+      }
+    }
+  }
+
+  /* print separator line */
+  if(prtsep) {
+    printf("-------------------------------------------------\n");
+  }
+  /* print localtime */
+  if(prttime) {
+    time_t t = time(NULL);
+    printf("Localtime: %s", ctime(&t));
+  }
+
+  /* init libcurl */
+  curl_global_init(CURL_GLOBAL_ALL);
+
+  /* init the curl session */
+  curl_handle = curl_easy_init();
+
+  /* specify URL to get */
+  curl_easy_setopt(curl_handle, CURLOPT_URL, url);
+
+  /* send all data to this function  */
+  curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteCallback);
+
+  /* some servers don't like requests that are made without a user-agent
+     field, so we provide one */
+  curl_easy_setopt(curl_handle, CURLOPT_USERAGENT,
+                   "libcurl-speedchecker/" CHKSPEED_VERSION);
+
+  /* get it! */
+  res = curl_easy_perform(curl_handle);
+
+  if(CURLE_OK == res) {
+    curl_off_t val;
+
+    /* check for bytes downloaded */
+    res = curl_easy_getinfo(curl_handle, CURLINFO_SIZE_DOWNLOAD_T, &val);
+    if((CURLE_OK == res) && (val>0))
+      printf("Data downloaded: %" CURL_FORMAT_CURL_OFF_T " bytes.\n", val);
+
+    /* check for total download time */
+    res = curl_easy_getinfo(curl_handle, CURLINFO_TOTAL_TIME_T, &val);
+    if((CURLE_OK == res) && (val>0))
+      printf("Total download time: %" CURL_FORMAT_CURL_OFF_T ".%06ld sec.\n",
+             (val / 1000000), (long)(val % 1000000));
+
+    /* check for average download speed */
+    res = curl_easy_getinfo(curl_handle, CURLINFO_SPEED_DOWNLOAD_T, &val);
+    if((CURLE_OK == res) && (val>0))
+      printf("Average download speed: %" CURL_FORMAT_CURL_OFF_T
+             " kbyte/sec.\n", val / 1024);
+
+    if(prtall) {
+      /* check for name resolution time */
+      res = curl_easy_getinfo(curl_handle, CURLINFO_NAMELOOKUP_TIME_T, &val);
+      if((CURLE_OK == res) && (val>0))
+        printf("Name lookup time: %" CURL_FORMAT_CURL_OFF_T ".%06ld sec.\n",
+               (val / 1000000), (long)(val % 1000000));
+
+      /* check for connect time */
+      res = curl_easy_getinfo(curl_handle, CURLINFO_CONNECT_TIME_T, &val);
+      if((CURLE_OK == res) && (val>0))
+        printf("Connect time: %" CURL_FORMAT_CURL_OFF_T ".%06ld sec.\n",
+               (val / 1000000), (long)(val % 1000000));
+    }
+  }
+  else {
+    fprintf(stderr, "Error while fetching '%s' : %s\n",
+            url, curl_easy_strerror(res));
+  }
+
+  /* cleanup curl stuff */
+  curl_easy_cleanup(curl_handle);
+
+  /* we're done with libcurl, so clean it up */
+  curl_global_cleanup();
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/cookie_interface.c b/components/cronet/third_party/curl_headers/docs/examples/cookie_interface.c
new file mode 100644
index 0000000..32e9a1d1
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/cookie_interface.c
@@ -0,0 +1,140 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Import and export cookies with COOKIELIST.
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <time.h>
+
+#include <curl/curl.h>
+
+static void
+print_cookies(CURL *curl)
+{
+  CURLcode res;
+  struct curl_slist *cookies;
+  struct curl_slist *nc;
+  int i;
+
+  printf("Cookies, curl knows:\n");
+  res = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies);
+  if(res != CURLE_OK) {
+    fprintf(stderr, "Curl curl_easy_getinfo failed: %s\n",
+            curl_easy_strerror(res));
+    exit(1);
+  }
+  nc = cookies;
+  i = 1;
+  while(nc) {
+    printf("[%d]: %s\n", i, nc->data);
+    nc = nc->next;
+    i++;
+  }
+  if(i == 1) {
+    printf("(none)\n");
+  }
+  curl_slist_free_all(cookies);
+}
+
+int
+main(void)
+{
+  CURL *curl;
+  CURLcode res;
+
+  curl_global_init(CURL_GLOBAL_ALL);
+  curl = curl_easy_init();
+  if(curl) {
+    char nline[256];
+
+    curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/");
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+    curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); /* start cookie engine */
+    res = curl_easy_perform(curl);
+    if(res != CURLE_OK) {
+      fprintf(stderr, "Curl perform failed: %s\n", curl_easy_strerror(res));
+      return 1;
+    }
+
+    print_cookies(curl);
+
+    printf("Erasing curl's knowledge of cookies!\n");
+    curl_easy_setopt(curl, CURLOPT_COOKIELIST, "ALL");
+
+    print_cookies(curl);
+
+    printf("-----------------------------------------------\n"
+           "Setting a cookie \"PREF\" via cookie interface:\n");
+#ifdef WIN32
+#define snprintf _snprintf
+#endif
+    /* Netscape format cookie */
+    snprintf(nline, sizeof(nline), "%s\t%s\t%s\t%s\t%lu\t%s\t%s",
+             ".example.com", "TRUE", "/", "FALSE",
+             (unsigned long)time(NULL) + 31337UL,
+             "PREF", "hello example, i like you very much!");
+    res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline);
+    if(res != CURLE_OK) {
+      fprintf(stderr, "Curl curl_easy_setopt failed: %s\n",
+              curl_easy_strerror(res));
+      return 1;
+    }
+
+    /* HTTP-header style cookie. If you use the Set-Cookie format and don't
+    specify a domain then the cookie is sent for any domain and will not be
+    modified, likely not what you intended. Starting in 7.43.0 any-domain
+    cookies will not be exported either. For more information refer to the
+    CURLOPT_COOKIELIST documentation.
+    */
+    snprintf(nline, sizeof(nline),
+      "Set-Cookie: OLD_PREF=3d141414bf4209321; "
+      "expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.example.com");
+    res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline);
+    if(res != CURLE_OK) {
+      fprintf(stderr, "Curl curl_easy_setopt failed: %s\n",
+              curl_easy_strerror(res));
+      return 1;
+    }
+
+    print_cookies(curl);
+
+    res = curl_easy_perform(curl);
+    if(res != CURLE_OK) {
+      fprintf(stderr, "Curl perform failed: %s\n", curl_easy_strerror(res));
+      return 1;
+    }
+
+    curl_easy_cleanup(curl);
+  }
+  else {
+    fprintf(stderr, "Curl init failed!\n");
+    return 1;
+  }
+
+  curl_global_cleanup();
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/crawler.c b/components/cronet/third_party/curl_headers/docs/examples/crawler.c
new file mode 100644
index 0000000..496d88c
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/crawler.c
@@ -0,0 +1,216 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Web crawler based on curl and libxml2.
+ * Copyright (C) 2018 Jeroen Ooms <jeroenooms@gmail.com>
+ * License: MIT
+ *
+ * To compile:
+ *   gcc crawler.c $(pkg-config --cflags --libs libxml-2.0 libcurl)
+ *
+ */
+/* <DESC>
+ * Web crawler based on curl and libxml2 to stress-test curl with
+ * hundreds of concurrent connections to various servers.
+ * </DESC>
+ */
+
+/* Parameters */
+int max_con = 200;
+int max_total = 20000;
+int max_requests = 500;
+int max_link_per_page = 5;
+int follow_relative_links = 0;
+char *start_page = "https://www.reuters.com";
+
+#include <libxml/HTMLparser.h>
+#include <libxml/xpath.h>
+#include <libxml/uri.h>
+#include <curl/curl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <signal.h>
+
+int pending_interrupt = 0;
+void sighandler(int dummy)
+{
+  pending_interrupt = 1;
+}
+
+/* resizable buffer */
+typedef struct {
+  char *buf;
+  size_t size;
+} memory;
+
+size_t grow_buffer(void *contents, size_t sz, size_t nmemb, void *ctx)
+{
+  size_t realsize = sz * nmemb;
+  memory *mem = (memory*) ctx;
+  char *ptr = realloc(mem->buf, mem->size + realsize);
+  if(!ptr) {
+    /* out of memory */
+    printf("not enough memory (realloc returned NULL)\n");
+    return 0;
+  }
+  mem->buf = ptr;
+  memcpy(&(mem->buf[mem->size]), contents, realsize);
+  mem->size += realsize;
+  return realsize;
+}
+
+CURL *make_handle(char *url)
+{
+  CURL *handle = curl_easy_init();
+
+  /* Important: use HTTP2 over HTTPS */
+  curl_easy_setopt(handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2TLS);
+  curl_easy_setopt(handle, CURLOPT_URL, url);
+
+  /* buffer body */
+  memory *mem = malloc(sizeof(memory));
+  mem->size = 0;
+  mem->buf = malloc(1);
+  curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, grow_buffer);
+  curl_easy_setopt(handle, CURLOPT_WRITEDATA, mem);
+  curl_easy_setopt(handle, CURLOPT_PRIVATE, mem);
+
+  /* For completeness */
+  curl_easy_setopt(handle, CURLOPT_ACCEPT_ENCODING, "");
+  curl_easy_setopt(handle, CURLOPT_TIMEOUT, 5L);
+  curl_easy_setopt(handle, CURLOPT_FOLLOWLOCATION, 1L);
+  curl_easy_setopt(handle, CURLOPT_MAXREDIRS, 10L);
+  curl_easy_setopt(handle, CURLOPT_CONNECTTIMEOUT, 2L);
+  curl_easy_setopt(handle, CURLOPT_COOKIEFILE, "");
+  curl_easy_setopt(handle, CURLOPT_FILETIME, 1L);
+  curl_easy_setopt(handle, CURLOPT_USERAGENT, "mini crawler");
+  curl_easy_setopt(handle, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
+  curl_easy_setopt(handle, CURLOPT_UNRESTRICTED_AUTH, 1L);
+  curl_easy_setopt(handle, CURLOPT_PROXYAUTH, CURLAUTH_ANY);
+  curl_easy_setopt(handle, CURLOPT_EXPECT_100_TIMEOUT_MS, 0L);
+  return handle;
+}
+
+/* HREF finder implemented in libxml2 but could be any HTML parser */
+size_t follow_links(CURLM *multi_handle, memory *mem, char *url)
+{
+  int opts = HTML_PARSE_NOBLANKS | HTML_PARSE_NOERROR | \
+             HTML_PARSE_NOWARNING | HTML_PARSE_NONET;
+  htmlDocPtr doc = htmlReadMemory(mem->buf, mem->size, url, NULL, opts);
+  if(!doc)
+    return 0;
+  xmlChar *xpath = (xmlChar*) "//a/@href";
+  xmlXPathContextPtr context = xmlXPathNewContext(doc);
+  xmlXPathObjectPtr result = xmlXPathEvalExpression(xpath, context);
+  xmlXPathFreeContext(context);
+  if(!result)
+    return 0;
+  xmlNodeSetPtr nodeset = result->nodesetval;
+  if(xmlXPathNodeSetIsEmpty(nodeset)) {
+    xmlXPathFreeObject(result);
+    return 0;
+  }
+  size_t count = 0;
+  for(int i = 0; i < nodeset->nodeNr; i++) {
+    double r = rand();
+    int x = r * nodeset->nodeNr / RAND_MAX;
+    const xmlNode *node = nodeset->nodeTab[x]->xmlChildrenNode;
+    xmlChar *href = xmlNodeListGetString(doc, node, 1);
+    if(follow_relative_links) {
+      xmlChar *orig = href;
+      href = xmlBuildURI(href, (xmlChar *) url);
+      xmlFree(orig);
+    }
+    char *link = (char *) href;
+    if(!link || strlen(link) < 20)
+      continue;
+    if(!strncmp(link, "http://", 7) || !strncmp(link, "https://", 8)) {
+      curl_multi_add_handle(multi_handle, make_handle(link));
+      if(count++ == max_link_per_page)
+        break;
+    }
+    xmlFree(link);
+  }
+  xmlXPathFreeObject(result);
+  return count;
+}
+
+int is_html(char *ctype)
+{
+  return ctype != NULL && strlen(ctype) > 10 && strstr(ctype, "text/html");
+}
+
+int main(void)
+{
+  signal(SIGINT, sighandler);
+  LIBXML_TEST_VERSION;
+  curl_global_init(CURL_GLOBAL_DEFAULT);
+  CURLM *multi_handle = curl_multi_init();
+  curl_multi_setopt(multi_handle, CURLMOPT_MAX_TOTAL_CONNECTIONS, max_con);
+  curl_multi_setopt(multi_handle, CURLMOPT_MAX_HOST_CONNECTIONS, 6L);
+
+  /* enables http/2 if available */
+#ifdef CURLPIPE_MULTIPLEX
+  curl_multi_setopt(multi_handle, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
+#endif
+
+  /* sets html start page */
+  curl_multi_add_handle(multi_handle, make_handle(start_page));
+
+  int msgs_left;
+  int pending = 0;
+  int complete = 0;
+  int still_running = 1;
+  while(still_running && !pending_interrupt) {
+    int numfds;
+    curl_multi_wait(multi_handle, NULL, 0, 1000, &numfds);
+    curl_multi_perform(multi_handle, &still_running);
+
+    /* See how the transfers went */
+    CURLMsg *m = NULL;
+    while((m = curl_multi_info_read(multi_handle, &msgs_left))) {
+      if(m->msg == CURLMSG_DONE) {
+        CURL *handle = m->easy_handle;
+        char *url;
+        memory *mem;
+        curl_easy_getinfo(handle, CURLINFO_PRIVATE, &mem);
+        curl_easy_getinfo(handle, CURLINFO_EFFECTIVE_URL, &url);
+        if(m->data.result == CURLE_OK) {
+          long res_status;
+          curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &res_status);
+          if(res_status == 200) {
+            char *ctype;
+            curl_easy_getinfo(handle, CURLINFO_CONTENT_TYPE, &ctype);
+            printf("[%d] HTTP 200 (%s): %s\n", complete, ctype, url);
+            if(is_html(ctype) && mem->size > 100) {
+              if(pending < max_requests && (complete + pending) < max_total) {
+                pending += follow_links(multi_handle, mem, url);
+                still_running = 1;
+              }
+            }
+          }
+          else {
+            printf("[%d] HTTP %d: %s\n", complete, (int) res_status, url);
+          }
+        }
+        else {
+          printf("[%d] Connection failure: %s\n", complete, url);
+        }
+        curl_multi_remove_handle(multi_handle, handle);
+        curl_easy_cleanup(handle);
+        free(mem->buf);
+        free(mem);
+        complete++;
+        pending--;
+      }
+    }
+  }
+  curl_multi_cleanup(multi_handle);
+  curl_global_cleanup();
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/curlgtk.c b/components/cronet/third_party/curl_headers/docs/examples/curlgtk.c
new file mode 100644
index 0000000..4083c8f
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/curlgtk.c
@@ -0,0 +1,106 @@
+/*****************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  Copyright (c) 2000 David Odin (aka DindinX) for MandrakeSoft
+ */
+/* <DESC>
+ * use the libcurl in a gtk-threaded application
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <gtk/gtk.h>
+
+#include <curl/curl.h>
+
+GtkWidget *Bar;
+
+size_t my_write_func(void *ptr, size_t size, size_t nmemb, FILE *stream)
+{
+  return fwrite(ptr, size, nmemb, stream);
+}
+
+size_t my_read_func(void *ptr, size_t size, size_t nmemb, FILE *stream)
+{
+  return fread(ptr, size, nmemb, stream);
+}
+
+int my_progress_func(GtkWidget *bar,
+                     double t, /* dltotal */
+                     double d, /* dlnow */
+                     double ultotal,
+                     double ulnow)
+{
+/*  printf("%d / %d (%g %%)\n", d, t, d*100.0/t);*/
+  gdk_threads_enter();
+  gtk_progress_set_value(GTK_PROGRESS(bar), d*100.0/t);
+  gdk_threads_leave();
+  return 0;
+}
+
+void *my_thread(void *ptr)
+{
+  CURL *curl;
+
+  curl = curl_easy_init();
+  if(curl) {
+    gchar *url = ptr;
+    const char *filename = "test.curl";
+    FILE *outfile = fopen(filename, "wb");
+
+    curl_easy_setopt(curl, CURLOPT_URL, url);
+    curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile);
+    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_write_func);
+    curl_easy_setopt(curl, CURLOPT_READFUNCTION, my_read_func);
+    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
+    curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, my_progress_func);
+    curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, Bar);
+
+    curl_easy_perform(curl);
+
+    fclose(outfile);
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return NULL;
+}
+
+int main(int argc, char **argv)
+{
+  GtkWidget *Window, *Frame, *Frame2;
+  GtkAdjustment *adj;
+
+  /* Must initialize libcurl before any threads are started */
+  curl_global_init(CURL_GLOBAL_ALL);
+
+  /* Init thread */
+  g_thread_init(NULL);
+
+  gtk_init(&argc, &argv);
+  Window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+  Frame = gtk_frame_new(NULL);
+  gtk_frame_set_shadow_type(GTK_FRAME(Frame), GTK_SHADOW_OUT);
+  gtk_container_add(GTK_CONTAINER(Window), Frame);
+  Frame2 = gtk_frame_new(NULL);
+  gtk_frame_set_shadow_type(GTK_FRAME(Frame2), GTK_SHADOW_IN);
+  gtk_container_add(GTK_CONTAINER(Frame), Frame2);
+  gtk_container_set_border_width(GTK_CONTAINER(Frame2), 5);
+  adj = (GtkAdjustment*)gtk_adjustment_new(0, 0, 100, 0, 0, 0);
+  Bar = gtk_progress_bar_new_with_adjustment(adj);
+  gtk_container_add(GTK_CONTAINER(Frame2), Bar);
+  gtk_widget_show_all(Window);
+
+  if(!g_thread_create(&my_thread, argv[1], FALSE, NULL) != 0)
+    g_warning("can't create the thread");
+
+
+  gdk_threads_enter();
+  gtk_main();
+  gdk_threads_leave();
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/curlx.c b/components/cronet/third_party/curl_headers/docs/examples/curlx.c
new file mode 100644
index 0000000..df4ab3f
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/curlx.c
@@ -0,0 +1,574 @@
+/*
+  curlx.c  Authors: Peter Sylvester, Jean-Paul Merlin
+
+  This is a little program to demonstrate the usage of
+
+  - an ssl initialisation callback setting a user key and trustbases
+  coming from a pkcs12 file
+  - using an ssl application callback to find a URI in the
+  certificate presented during ssl session establishment.
+
+*/
+/* <DESC>
+ * demonstrates use of SSL context callback, requires OpenSSL
+ * </DESC>
+ */
+
+/*
+ * Copyright (c) 2003 The OpenEvidence Project.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions, the following disclaimer,
+ *    and the original OpenSSL and SSLeay Licences below.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions, the following disclaimer
+ *    and the original OpenSSL and SSLeay Licences below in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ *    software must display the following acknowledgments:
+ *    "This product includes software developed by the Openevidence Project
+ *    for use in the OpenEvidence Toolkit. (http://www.openevidence.org/)"
+ *    This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit (https://www.openssl.org/)"
+ *    This product includes cryptographic software written by Eric Young
+ *    (eay@cryptsoft.com).  This product includes software written by Tim
+ *    Hudson (tjh@cryptsoft.com)."
+ *
+ * 4. The names "OpenEvidence Toolkit" and "OpenEvidence Project" must not be
+ *    used to endorse or promote products derived from this software without
+ *    prior written permission. For written permission, please contact
+ *    openevidence-core@openevidence.org.
+ *
+ * 5. Products derived from this software may not be called "OpenEvidence"
+ *    nor may "OpenEvidence" appear in their names without prior written
+ *    permission of the OpenEvidence Project.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ *    acknowledgments:
+ *    "This product includes software developed by the OpenEvidence Project
+ *    for use in the OpenEvidence Toolkit (http://www.openevidence.org/)
+ *    This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit (https://www.openssl.org/)"
+ *    This product includes cryptographic software written by Eric Young
+ *    (eay@cryptsoft.com).  This product includes software written by Tim
+ *    Hudson (tjh@cryptsoft.com)."
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE OpenEvidence PROJECT ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenEvidence PROJECT OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This product includes software developed by the OpenSSL Project
+ * for use in the OpenSSL Toolkit (https://www.openssl.org/)
+ * This product includes cryptographic software written by Eric Young
+ * (eay@cryptsoft.com).  This product includes software written by Tim
+ * Hudson (tjh@cryptsoft.com).
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <curl/curl.h>
+#include <openssl/x509v3.h>
+#include <openssl/x509_vfy.h>
+#include <openssl/crypto.h>
+#include <openssl/lhash.h>
+#include <openssl/objects.h>
+#include <openssl/err.h>
+#include <openssl/evp.h>
+#include <openssl/x509.h>
+#include <openssl/pkcs12.h>
+#include <openssl/bio.h>
+#include <openssl/ssl.h>
+
+static const char *curlx_usage[]={
+  "usage: curlx args\n",
+  " -p12 arg         - tia  file ",
+  " -envpass arg     - environment variable which content the tia private"
+  " key password",
+  " -out arg         - output file (response)- default stdout",
+  " -in arg          - input file (request)- default stdin",
+  " -connect arg     - URL of the server for the connection ex:"
+  " www.openevidence.org",
+  " -mimetype arg    - MIME type for data in ex : application/timestamp-query"
+  " or application/dvcs -default application/timestamp-query",
+  " -acceptmime arg  - MIME type acceptable for the response ex : "
+  "application/timestamp-response or application/dvcs -default none",
+  " -accesstype arg  - an Object identifier in an AIA/SIA method, e.g."
+  " AD_DVCS or ad_timestamping",
+  NULL
+};
+
+/*
+
+./curlx -p12 psy.p12 -envpass XX -in request -verbose -accesstype AD_DVCS
+-mimetype application/dvcs -acceptmime application/dvcs -out response
+
+*/
+
+/*
+ * We use this ZERO_NULL to avoid picky compiler warnings,
+ * when assigning a NULL pointer to a function pointer var.
+ */
+
+#define ZERO_NULL 0
+
+/* This is a context that we pass to all callbacks */
+
+typedef struct sslctxparm_st {
+  unsigned char *p12file;
+  const char *pst;
+  PKCS12 *p12;
+  EVP_PKEY *pkey;
+  X509 *usercert;
+  STACK_OF(X509) * ca;
+  CURL *curl;
+  BIO *errorbio;
+  int accesstype;
+  int verbose;
+
+} sslctxparm;
+
+/* some helper function. */
+
+static char *ia5string(ASN1_IA5STRING *ia5)
+{
+  char *tmp;
+  if(!ia5 || !ia5->length)
+    return NULL;
+  tmp = OPENSSL_malloc(ia5->length + 1);
+  memcpy(tmp, ia5->data, ia5->length);
+  tmp[ia5->length] = 0;
+  return tmp;
+}
+
+/* A convenience routine to get an access URI. */
+static unsigned char *my_get_ext(X509 *cert, const int type,
+                                 int extensiontype)
+{
+  int i;
+  STACK_OF(ACCESS_DESCRIPTION) * accessinfo;
+  accessinfo =  X509_get_ext_d2i(cert, extensiontype, NULL, NULL);
+
+  if(!sk_ACCESS_DESCRIPTION_num(accessinfo))
+    return NULL;
+  for(i = 0; i < sk_ACCESS_DESCRIPTION_num(accessinfo); i++) {
+    ACCESS_DESCRIPTION * ad = sk_ACCESS_DESCRIPTION_value(accessinfo, i);
+    if(OBJ_obj2nid(ad->method) == type) {
+      if(ad->location->type == GEN_URI) {
+        return ia5string(ad->location->d.ia5);
+      }
+      return NULL;
+    }
+  }
+  return NULL;
+}
+
+/* This is an application verification call back, it does not
+   perform any addition verification but tries to find a URL
+   in the presented certificate. If found, this will become
+   the URL to be used in the POST.
+*/
+
+static int ssl_app_verify_callback(X509_STORE_CTX *ctx, void *arg)
+{
+  sslctxparm * p = (sslctxparm *) arg;
+  int ok;
+
+  if(p->verbose > 2)
+    BIO_printf(p->errorbio, "entering ssl_app_verify_callback\n");
+
+  ok = X509_verify_cert(ctx);
+  if(ok && ctx->cert) {
+    unsigned char *accessinfo;
+    if(p->verbose > 1)
+      X509_print_ex(p->errorbio, ctx->cert, 0, 0);
+
+    accessinfo = my_get_ext(ctx->cert, p->accesstype, NID_sinfo_access);
+    if(accessinfo) {
+      if(p->verbose)
+        BIO_printf(p->errorbio, "Setting URL from SIA to: %s\n", accessinfo);
+
+      curl_easy_setopt(p->curl, CURLOPT_URL, accessinfo);
+    }
+    else if(accessinfo = my_get_ext(ctx->cert, p->accesstype,
+                                    NID_info_access)) {
+      if(p->verbose)
+        BIO_printf(p->errorbio, "Setting URL from AIA to: %s\n", accessinfo);
+
+      curl_easy_setopt(p->curl, CURLOPT_URL, accessinfo);
+    }
+  }
+  if(p->verbose > 2)
+    BIO_printf(p->errorbio, "leaving ssl_app_verify_callback with %d\n", ok);
+
+  return ok;
+}
+
+
+/* The SSL initialisation callback. The callback sets:
+   - a private key and certificate
+   - a trusted ca certificate
+   - a preferred cipherlist
+   - an application verification callback (the function above)
+*/
+
+static CURLcode sslctxfun(CURL *curl, void *sslctx, void *parm)
+{
+  sslctxparm *p = (sslctxparm *) parm;
+  SSL_CTX *ctx = (SSL_CTX *) sslctx;
+
+  if(!SSL_CTX_use_certificate(ctx, p->usercert)) {
+    BIO_printf(p->errorbio, "SSL_CTX_use_certificate problem\n");
+    goto err;
+  }
+  if(!SSL_CTX_use_PrivateKey(ctx, p->pkey)) {
+    BIO_printf(p->errorbio, "SSL_CTX_use_PrivateKey\n");
+    goto err;
+  }
+
+  if(!SSL_CTX_check_private_key(ctx)) {
+    BIO_printf(p->errorbio, "SSL_CTX_check_private_key\n");
+    goto err;
+  }
+
+  SSL_CTX_set_quiet_shutdown(ctx, 1);
+  SSL_CTX_set_cipher_list(ctx, "RC4-MD5");
+  SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);
+
+  X509_STORE_add_cert(SSL_CTX_get_cert_store(ctx),
+                      sk_X509_value(p->ca, sk_X509_num(p->ca)-1));
+
+  SSL_CTX_set_verify_depth(ctx, 2);
+  SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, ZERO_NULL);
+  SSL_CTX_set_cert_verify_callback(ctx, ssl_app_verify_callback, parm);
+
+  return CURLE_OK;
+  err:
+  ERR_print_errors(p->errorbio);
+  return CURLE_SSL_CERTPROBLEM;
+
+}
+
+int main(int argc, char **argv)
+{
+  BIO* in = NULL;
+  BIO* out = NULL;
+
+  char *outfile = NULL;
+  char *infile = NULL;
+
+  int tabLength = 100;
+  char *binaryptr;
+  char *mimetype;
+  char *mimetypeaccept = NULL;
+  char *contenttype;
+  const char **pp;
+  unsigned char *hostporturl = NULL;
+  BIO *p12bio;
+  char **args = argv + 1;
+  unsigned char *serverurl;
+  sslctxparm p;
+  char *response;
+
+  CURLcode res;
+  struct curl_slist *headers = NULL;
+  int badarg = 0;
+
+  binaryptr = malloc(tabLength);
+
+  p.verbose = 0;
+  p.errorbio = BIO_new_fp(stderr, BIO_NOCLOSE);
+
+  curl_global_init(CURL_GLOBAL_DEFAULT);
+
+  /* we need some more for the P12 decoding */
+
+  OpenSSL_add_all_ciphers();
+  OpenSSL_add_all_digests();
+  ERR_load_crypto_strings();
+
+  while(*args && *args[0] == '-') {
+    if(!strcmp (*args, "-in")) {
+      if(args[1]) {
+        infile = *(++args);
+      }
+      else
+        badarg = 1;
+    }
+    else if(!strcmp (*args, "-out")) {
+      if(args[1]) {
+        outfile = *(++args);
+      }
+      else
+        badarg = 1;
+    }
+    else if(!strcmp (*args, "-p12")) {
+      if(args[1]) {
+        p.p12file = *(++args);
+      }
+      else
+        badarg = 1;
+    }
+    else if(strcmp(*args, "-envpass") == 0) {
+      if(args[1]) {
+        p.pst = getenv(*(++args));
+      }
+      else
+        badarg = 1;
+    }
+    else if(strcmp(*args, "-connect") == 0) {
+      if(args[1]) {
+        hostporturl = *(++args);
+      }
+      else
+        badarg = 1;
+    }
+    else if(strcmp(*args, "-mimetype") == 0) {
+      if(args[1]) {
+        mimetype = *(++args);
+      }
+      else
+        badarg = 1;
+    }
+    else if(strcmp(*args, "-acceptmime") == 0) {
+      if(args[1]) {
+        mimetypeaccept = *(++args);
+      }
+      else
+        badarg = 1;
+    }
+    else if(strcmp(*args, "-accesstype") == 0) {
+      if(args[1]) {
+        p.accesstype = OBJ_obj2nid(OBJ_txt2obj(*++args, 0));
+        if(p.accesstype == 0)
+          badarg = 1;
+      }
+      else
+        badarg = 1;
+    }
+    else if(strcmp(*args, "-verbose") == 0) {
+      p.verbose++;
+    }
+    else
+      badarg = 1;
+    args++;
+  }
+
+  if(mimetype == NULL || mimetypeaccept == NULL)
+    badarg = 1;
+
+  if(badarg) {
+    for(pp = curlx_usage; (*pp != NULL); pp++)
+      BIO_printf(p.errorbio, "%s\n", *pp);
+    BIO_printf(p.errorbio, "\n");
+    goto err;
+  }
+
+  /* set input */
+
+  in = BIO_new(BIO_s_file());
+  if(in == NULL) {
+    BIO_printf(p.errorbio, "Error setting input bio\n");
+    goto err;
+  }
+  else if(infile == NULL)
+    BIO_set_fp(in, stdin, BIO_NOCLOSE|BIO_FP_TEXT);
+  else if(BIO_read_filename(in, infile) <= 0) {
+    BIO_printf(p.errorbio, "Error opening input file %s\n", infile);
+    BIO_free(in);
+    goto err;
+  }
+
+  /* set output  */
+
+  out = BIO_new(BIO_s_file());
+  if(out == NULL) {
+    BIO_printf(p.errorbio, "Error setting output bio.\n");
+    goto err;
+  }
+  else if(outfile == NULL)
+    BIO_set_fp(out, stdout, BIO_NOCLOSE|BIO_FP_TEXT);
+  else if(BIO_write_filename(out, outfile) <= 0) {
+    BIO_printf(p.errorbio, "Error opening output file %s\n", outfile);
+    BIO_free(out);
+    goto err;
+  }
+
+
+  p.errorbio = BIO_new_fp(stderr, BIO_NOCLOSE);
+
+  p.curl = curl_easy_init();
+  if(!p.curl) {
+    BIO_printf(p.errorbio, "Cannot init curl lib\n");
+    goto err;
+  }
+
+  p12bio = BIO_new_file(p.p12file, "rb");
+  if(!p12bio) {
+    BIO_printf(p.errorbio, "Error opening P12 file %s\n", p.p12file);
+    goto err;
+  }
+  p.p12 = d2i_PKCS12_bio(p12bio, NULL);
+  if(!p.p12) {
+    BIO_printf(p.errorbio, "Cannot decode P12 structure %s\n", p.p12file);
+    goto err;
+  }
+
+  p.ca = NULL;
+  if(!(PKCS12_parse (p.p12, p.pst, &(p.pkey), &(p.usercert), &(p.ca) ) )) {
+    BIO_printf(p.errorbio, "Invalid P12 structure in %s\n", p.p12file);
+    goto err;
+  }
+
+  if(sk_X509_num(p.ca) <= 0) {
+    BIO_printf(p.errorbio, "No trustworthy CA given.%s\n", p.p12file);
+    goto err;
+  }
+
+  if(p.verbose > 1)
+    X509_print_ex(p.errorbio, p.usercert, 0, 0);
+
+  /* determine URL to go */
+
+  if(hostporturl) {
+    size_t len = strlen(hostporturl) + 9;
+    serverurl = malloc(len);
+    snprintf(serverurl, len, "https://%s", hostporturl);
+  }
+  else if(p.accesstype != 0) { /* see whether we can find an AIA or SIA for a
+                                  given access type */
+    serverurl = my_get_ext(p.usercert, p.accesstype, NID_info_access);
+    if(!serverurl) {
+      int j = 0;
+      BIO_printf(p.errorbio, "no service URL in user cert "
+                 "cherching in others certificats\n");
+      for(j = 0; j<sk_X509_num(p.ca); j++) {
+        serverurl = my_get_ext(sk_X509_value(p.ca, j), p.accesstype,
+                               NID_info_access);
+        if(serverurl)
+          break;
+        serverurl = my_get_ext(sk_X509_value(p.ca, j), p.accesstype,
+                               NID_sinfo_access);
+        if(serverurl)
+          break;
+      }
+    }
+  }
+
+  if(!serverurl) {
+    BIO_printf(p.errorbio, "no service URL in certificats,"
+               " check '-accesstype (AD_DVCS | ad_timestamping)'"
+               " or use '-connect'\n");
+    goto err;
+  }
+
+  if(p.verbose)
+    BIO_printf(p.errorbio, "Service URL: <%s>\n", serverurl);
+
+  curl_easy_setopt(p.curl, CURLOPT_URL, serverurl);
+
+  /* Now specify the POST binary data */
+
+  curl_easy_setopt(p.curl, CURLOPT_POSTFIELDS, binaryptr);
+  curl_easy_setopt(p.curl, CURLOPT_POSTFIELDSIZE, (long)tabLength);
+
+  /* pass our list of custom made headers */
+
+  contenttype = malloc(15 + strlen(mimetype));
+  snprintf(contenttype, 15 + strlen(mimetype), "Content-type: %s", mimetype);
+  headers = curl_slist_append(headers, contenttype);
+  curl_easy_setopt(p.curl, CURLOPT_HTTPHEADER, headers);
+
+  if(p.verbose)
+    BIO_printf(p.errorbio, "Service URL: <%s>\n", serverurl);
+
+  {
+    FILE *outfp;
+    BIO_get_fp(out, &outfp);
+    curl_easy_setopt(p.curl, CURLOPT_WRITEDATA, outfp);
+  }
+
+  res = curl_easy_setopt(p.curl, CURLOPT_SSL_CTX_FUNCTION, sslctxfun);
+
+  if(res != CURLE_OK)
+    BIO_printf(p.errorbio, "%d %s=%d %d\n", __LINE__,
+               "CURLOPT_SSL_CTX_FUNCTION", CURLOPT_SSL_CTX_FUNCTION, res);
+
+  curl_easy_setopt(p.curl, CURLOPT_SSL_CTX_DATA, &p);
+
+  {
+    char *ptr;
+    int lu; int i = 0;
+    while((lu = BIO_read(in, &binaryptr[i], tabLength-i)) >0) {
+      i += lu;
+      if(i == tabLength) {
+        tabLength += 100;
+        ptr = realloc(binaryptr, tabLength); /* should be more careful */
+        if(!ptr) {
+          /* out of memory */
+          BIO_printf(p.errorbio, "out of memory (realloc returned NULL)\n");
+          goto fail;
+        }
+        binaryptr = ptr;
+        ptr = NULL;
+      }
+    }
+    tabLength = i;
+  }
+  /* Now specify the POST binary data */
+
+  curl_easy_setopt(p.curl, CURLOPT_POSTFIELDS, binaryptr);
+  curl_easy_setopt(p.curl, CURLOPT_POSTFIELDSIZE, (long)tabLength);
+
+
+  /* Perform the request, res will get the return code */
+
+  BIO_printf(p.errorbio, "%d %s %d\n", __LINE__, "curl_easy_perform",
+             res = curl_easy_perform(p.curl));
+  {
+    curl_easy_getinfo(p.curl, CURLINFO_CONTENT_TYPE, &response);
+    if(mimetypeaccept && p.verbose) {
+      if(!strcmp(mimetypeaccept, response))
+        BIO_printf(p.errorbio, "the response has a correct mimetype : %s\n",
+                   response);
+      else
+        BIO_printf(p.errorbio, "the response doesn\'t have an acceptable "
+                   "mime type, it is %s instead of %s\n",
+                   response, mimetypeaccept);
+    }
+  }
+
+  /*** code d'erreur si accept mime ***, egalement code return HTTP != 200 ***/
+
+/* free the header list*/
+fail:
+  curl_slist_free_all(headers);
+
+  /* always cleanup */
+  curl_easy_cleanup(p.curl);
+
+  BIO_free(in);
+  BIO_free(out);
+  return (EXIT_SUCCESS);
+
+  err: BIO_printf(p.errorbio, "error");
+  exit(1);
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/debug.c b/components/cronet/third_party/curl_headers/docs/examples/debug.c
new file mode 100644
index 0000000..884184a
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/debug.c
@@ -0,0 +1,154 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Show how CURLOPT_DEBUGFUNCTION can be used.
+ * </DESC>
+ */
+#include <stdio.h>
+#include <curl/curl.h>
+
+struct data {
+  char trace_ascii; /* 1 or 0 */
+};
+
+static
+void dump(const char *text,
+          FILE *stream, unsigned char *ptr, size_t size,
+          char nohex)
+{
+  size_t i;
+  size_t c;
+
+  unsigned int width = 0x10;
+
+  if(nohex)
+    /* without the hex output, we can fit more on screen */
+    width = 0x40;
+
+  fprintf(stream, "%s, %10.10lu bytes (0x%8.8lx)\n",
+          text, (unsigned long)size, (unsigned long)size);
+
+  for(i = 0; i<size; i += width) {
+
+    fprintf(stream, "%4.4lx: ", (unsigned long)i);
+
+    if(!nohex) {
+      /* hex not disabled, show it */
+      for(c = 0; c < width; c++)
+        if(i + c < size)
+          fprintf(stream, "%02x ", ptr[i + c]);
+        else
+          fputs("   ", stream);
+    }
+
+    for(c = 0; (c < width) && (i + c < size); c++) {
+      /* check for 0D0A; if found, skip past and start a new line of output */
+      if(nohex && (i + c + 1 < size) && ptr[i + c] == 0x0D &&
+         ptr[i + c + 1] == 0x0A) {
+        i += (c + 2 - width);
+        break;
+      }
+      fprintf(stream, "%c",
+              (ptr[i + c] >= 0x20) && (ptr[i + c]<0x80)?ptr[i + c]:'.');
+      /* check again for 0D0A, to avoid an extra \n if it's at width */
+      if(nohex && (i + c + 2 < size) && ptr[i + c + 1] == 0x0D &&
+         ptr[i + c + 2] == 0x0A) {
+        i += (c + 3 - width);
+        break;
+      }
+    }
+    fputc('\n', stream); /* newline */
+  }
+  fflush(stream);
+}
+
+static
+int my_trace(CURL *handle, curl_infotype type,
+             char *data, size_t size,
+             void *userp)
+{
+  struct data *config = (struct data *)userp;
+  const char *text;
+  (void)handle; /* prevent compiler warning */
+
+  switch(type) {
+  case CURLINFO_TEXT:
+    fprintf(stderr, "== Info: %s", data);
+    /* FALLTHROUGH */
+  default: /* in case a new one is introduced to shock us */
+    return 0;
+
+  case CURLINFO_HEADER_OUT:
+    text = "=> Send header";
+    break;
+  case CURLINFO_DATA_OUT:
+    text = "=> Send data";
+    break;
+  case CURLINFO_SSL_DATA_OUT:
+    text = "=> Send SSL data";
+    break;
+  case CURLINFO_HEADER_IN:
+    text = "<= Recv header";
+    break;
+  case CURLINFO_DATA_IN:
+    text = "<= Recv data";
+    break;
+  case CURLINFO_SSL_DATA_IN:
+    text = "<= Recv SSL data";
+    break;
+  }
+
+  dump(text, stderr, (unsigned char *)data, size, config->trace_ascii);
+  return 0;
+}
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+  struct data config;
+
+  config.trace_ascii = 1; /* enable ascii tracing */
+
+  curl = curl_easy_init();
+  if(curl) {
+    curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace);
+    curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &config);
+
+    /* the DEBUGFUNCTION has no effect until we enable VERBOSE */
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+    /* example.com is redirected, so we tell libcurl to follow redirection */
+    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+
+    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+    res = curl_easy_perform(curl);
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/ephiperfifo.c b/components/cronet/third_party/curl_headers/docs/examples/ephiperfifo.c
new file mode 100644
index 0000000..bc4b0f0
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/ephiperfifo.c
@@ -0,0 +1,551 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * multi socket API usage with epoll and timerfd
+ * </DESC>
+ */
+/* Example application source code using the multi socket interface to
+ * download many files at once.
+ *
+ * This example features the same basic functionality as hiperfifo.c does,
+ * but this uses epoll and timerfd instead of libevent.
+ *
+ * Written by Jeff Pohlmeyer, converted to use epoll by Josh Bialkowski
+
+Requires a linux system with epoll
+
+When running, the program creates the named pipe "hiper.fifo"
+
+Whenever there is input into the fifo, the program reads the input as a list
+of URL's and creates some new easy handles to fetch each URL via the
+curl_multi "hiper" API.
+
+
+Thus, you can try a single URL:
+  % echo http://www.yahoo.com > hiper.fifo
+
+Or a whole bunch of them:
+  % cat my-url-list > hiper.fifo
+
+The fifo buffer is handled almost instantly, so you can even add more URL's
+while the previous requests are still being downloaded.
+
+Note:
+  For the sake of simplicity, URL length is limited to 1023 char's !
+
+This is purely a demo app, all retrieved data is simply discarded by the write
+callback.
+
+*/
+
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/epoll.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/timerfd.h>
+#include <sys/types.h>
+#include <time.h>
+#include <unistd.h>
+
+#include <curl/curl.h>
+
+#ifdef __GNUC__
+#define _Unused __attribute__((unused))
+#else
+#define _Unused
+#endif
+
+#define MSG_OUT stdout /* Send info to stdout, change to stderr if you want */
+
+
+/* Global information, common to all connections */
+typedef struct _GlobalInfo
+{
+  int epfd;    /* epoll filedescriptor */
+  int tfd;     /* timer filedescriptor */
+  int fifofd;  /* fifo filedescriptor */
+  CURLM *multi;
+  int still_running;
+  FILE *input;
+} GlobalInfo;
+
+
+/* Information associated with a specific easy handle */
+typedef struct _ConnInfo
+{
+  CURL *easy;
+  char *url;
+  GlobalInfo *global;
+  char error[CURL_ERROR_SIZE];
+} ConnInfo;
+
+
+/* Information associated with a specific socket */
+typedef struct _SockInfo
+{
+  curl_socket_t sockfd;
+  CURL *easy;
+  int action;
+  long timeout;
+  GlobalInfo *global;
+} SockInfo;
+
+#define __case(code) \
+  case code: s = __STRING(code)
+
+/* Die if we get a bad CURLMcode somewhere */
+static void mcode_or_die(const char *where, CURLMcode code)
+{
+  if(CURLM_OK != code) {
+    const char *s;
+    switch(code) {
+      __case(CURLM_BAD_HANDLE); break;
+      __case(CURLM_BAD_EASY_HANDLE); break;
+      __case(CURLM_OUT_OF_MEMORY); break;
+      __case(CURLM_INTERNAL_ERROR); break;
+      __case(CURLM_UNKNOWN_OPTION); break;
+      __case(CURLM_LAST); break;
+      default: s = "CURLM_unknown"; break;
+      __case(CURLM_BAD_SOCKET);
+      fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s);
+      /* ignore this error */
+      return;
+    }
+    fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s);
+    exit(code);
+  }
+}
+
+static void timer_cb(GlobalInfo* g, int revents);
+
+/* Update the timer after curl_multi library does it's thing. Curl will
+ * inform us through this callback what it wants the new timeout to be,
+ * after it does some work. */
+static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
+{
+  struct itimerspec its;
+
+  fprintf(MSG_OUT, "multi_timer_cb: Setting timeout to %ld ms\n", timeout_ms);
+
+  if(timeout_ms > 0) {
+    its.it_interval.tv_sec = 1;
+    its.it_interval.tv_nsec = 0;
+    its.it_value.tv_sec = timeout_ms / 1000;
+    its.it_value.tv_nsec = (timeout_ms % 1000) * 1000 * 1000;
+  }
+  else if(timeout_ms == 0) {
+    /* libcurl wants us to timeout now, however setting both fields of
+     * new_value.it_value to zero disarms the timer. The closest we can
+     * do is to schedule the timer to fire in 1 ns. */
+    its.it_interval.tv_sec = 1;
+    its.it_interval.tv_nsec = 0;
+    its.it_value.tv_sec = 0;
+    its.it_value.tv_nsec = 1;
+  }
+  else {
+    memset(&its, 0, sizeof(struct itimerspec));
+  }
+
+  timerfd_settime(g->tfd, /*flags=*/0, &its, NULL);
+  return 0;
+}
+
+
+/* Check for completed transfers, and remove their easy handles */
+static void check_multi_info(GlobalInfo *g)
+{
+  char *eff_url;
+  CURLMsg *msg;
+  int msgs_left;
+  ConnInfo *conn;
+  CURL *easy;
+  CURLcode res;
+
+  fprintf(MSG_OUT, "REMAINING: %d\n", g->still_running);
+  while((msg = curl_multi_info_read(g->multi, &msgs_left))) {
+    if(msg->msg == CURLMSG_DONE) {
+      easy = msg->easy_handle;
+      res = msg->data.result;
+      curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
+      curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
+      fprintf(MSG_OUT, "DONE: %s => (%d) %s\n", eff_url, res, conn->error);
+      curl_multi_remove_handle(g->multi, easy);
+      free(conn->url);
+      curl_easy_cleanup(easy);
+      free(conn);
+    }
+  }
+}
+
+/* Called by libevent when we get action on a multi socket filedescriptor*/
+static void event_cb(GlobalInfo *g, int fd, int revents)
+{
+  CURLMcode rc;
+  struct itimerspec its;
+
+  int action = ((revents & EPOLLIN) ? CURL_CSELECT_IN : 0) |
+               ((revents & EPOLLOUT) ? CURL_CSELECT_OUT : 0);
+
+  rc = curl_multi_socket_action(g->multi, fd, action, &g->still_running);
+  mcode_or_die("event_cb: curl_multi_socket_action", rc);
+
+  check_multi_info(g);
+  if(g->still_running <= 0) {
+    fprintf(MSG_OUT, "last transfer done, kill timeout\n");
+    memset(&its, 0, sizeof(struct itimerspec));
+    timerfd_settime(g->tfd, 0, &its, NULL);
+  }
+}
+
+/* Called by main loop when our timeout expires */
+static void timer_cb(GlobalInfo* g, int revents)
+{
+  CURLMcode rc;
+  uint64_t count = 0;
+  ssize_t err = 0;
+
+  err = read(g->tfd, &count, sizeof(uint64_t));
+  if(err == -1) {
+    /* Note that we may call the timer callback even if the timerfd isn't
+     * readable. It's possible that there are multiple events stored in the
+     * epoll buffer (i.e. the timer may have fired multiple times). The
+     * event count is cleared after the first call so future events in the
+     * epoll buffer will fail to read from the timer. */
+    if(errno == EAGAIN) {
+      fprintf(MSG_OUT, "EAGAIN on tfd %d\n", g->tfd);
+      return;
+    }
+  }
+  if(err != sizeof(uint64_t)) {
+    fprintf(stderr, "read(tfd) == %ld", err);
+    perror("read(tfd)");
+  }
+
+  rc = curl_multi_socket_action(g->multi,
+                                  CURL_SOCKET_TIMEOUT, 0, &g->still_running);
+  mcode_or_die("timer_cb: curl_multi_socket_action", rc);
+  check_multi_info(g);
+}
+
+
+
+/* Clean up the SockInfo structure */
+static void remsock(SockInfo *f, GlobalInfo* g)
+{
+  if(f) {
+    if(f->sockfd) {
+      if(epoll_ctl(g->epfd, EPOLL_CTL_DEL, f->sockfd, NULL))
+        fprintf(stderr, "EPOLL_CTL_DEL failed for fd: %d : %s\n",
+                f->sockfd, strerror(errno));
+    }
+    free(f);
+  }
+}
+
+
+
+/* Assign information to a SockInfo structure */
+static void setsock(SockInfo *f, curl_socket_t s, CURL *e, int act,
+                    GlobalInfo *g)
+{
+  struct epoll_event ev;
+  int kind = ((act & CURL_POLL_IN) ? EPOLLIN : 0) |
+             ((act & CURL_POLL_OUT) ? EPOLLOUT : 0);
+
+  if(f->sockfd) {
+    if(epoll_ctl(g->epfd, EPOLL_CTL_DEL, f->sockfd, NULL))
+      fprintf(stderr, "EPOLL_CTL_DEL failed for fd: %d : %s\n",
+              f->sockfd, strerror(errno));
+  }
+
+  f->sockfd = s;
+  f->action = act;
+  f->easy = e;
+
+  ev.events = kind;
+  ev.data.fd = s;
+  if(epoll_ctl(g->epfd, EPOLL_CTL_ADD, s, &ev))
+    fprintf(stderr, "EPOLL_CTL_ADD failed for fd: %d : %s\n",
+            s, strerror(errno));
+}
+
+
+
+/* Initialize a new SockInfo structure */
+static void addsock(curl_socket_t s, CURL *easy, int action, GlobalInfo *g)
+{
+  SockInfo *fdp = (SockInfo*)calloc(sizeof(SockInfo), 1);
+
+  fdp->global = g;
+  setsock(fdp, s, easy, action, g);
+  curl_multi_assign(g->multi, s, fdp);
+}
+
+/* CURLMOPT_SOCKETFUNCTION */
+static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
+{
+  GlobalInfo *g = (GlobalInfo*) cbp;
+  SockInfo *fdp = (SockInfo*) sockp;
+  const char *whatstr[]={ "none", "IN", "OUT", "INOUT", "REMOVE" };
+
+  fprintf(MSG_OUT,
+          "socket callback: s=%d e=%p what=%s ", s, e, whatstr[what]);
+  if(what == CURL_POLL_REMOVE) {
+    fprintf(MSG_OUT, "\n");
+    remsock(fdp, g);
+  }
+  else {
+    if(!fdp) {
+      fprintf(MSG_OUT, "Adding data: %s\n", whatstr[what]);
+      addsock(s, e, what, g);
+    }
+    else {
+      fprintf(MSG_OUT,
+              "Changing action from %s to %s\n",
+              whatstr[fdp->action], whatstr[what]);
+      setsock(fdp, s, e, what, g);
+    }
+  }
+  return 0;
+}
+
+
+
+/* CURLOPT_WRITEFUNCTION */
+static size_t write_cb(void *ptr _Unused, size_t size, size_t nmemb,
+                       void *data)
+{
+  size_t realsize = size * nmemb;
+  (void)_Unused;
+  (void)data;
+
+  return realsize;
+}
+
+
+/* CURLOPT_PROGRESSFUNCTION */
+static int prog_cb(void *p, double dltotal, double dlnow, double ult _Unused,
+                   double uln _Unused)
+{
+  ConnInfo *conn = (ConnInfo *)p;
+
+  fprintf(MSG_OUT, "Progress: %s (%g/%g)\n", conn->url, dlnow, dltotal);
+  return 0;
+}
+
+
+/* Create a new easy handle, and add it to the global curl_multi */
+static void new_conn(char *url, GlobalInfo *g)
+{
+  ConnInfo *conn;
+  CURLMcode rc;
+
+  conn = (ConnInfo*)calloc(1, sizeof(ConnInfo));
+  conn->error[0]='\0';
+
+  conn->easy = curl_easy_init();
+  if(!conn->easy) {
+    fprintf(MSG_OUT, "curl_easy_init() failed, exiting!\n");
+    exit(2);
+  }
+  conn->global = g;
+  conn->url = strdup(url);
+  curl_easy_setopt(conn->easy, CURLOPT_URL, conn->url);
+  curl_easy_setopt(conn->easy, CURLOPT_WRITEFUNCTION, write_cb);
+  curl_easy_setopt(conn->easy, CURLOPT_WRITEDATA, conn);
+  curl_easy_setopt(conn->easy, CURLOPT_VERBOSE, 1L);
+  curl_easy_setopt(conn->easy, CURLOPT_ERRORBUFFER, conn->error);
+  curl_easy_setopt(conn->easy, CURLOPT_PRIVATE, conn);
+  curl_easy_setopt(conn->easy, CURLOPT_NOPROGRESS, 0L);
+  curl_easy_setopt(conn->easy, CURLOPT_PROGRESSFUNCTION, prog_cb);
+  curl_easy_setopt(conn->easy, CURLOPT_PROGRESSDATA, conn);
+  curl_easy_setopt(conn->easy, CURLOPT_FOLLOWLOCATION, 1L);
+  curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_TIME, 3L);
+  curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_LIMIT, 10L);
+  fprintf(MSG_OUT,
+          "Adding easy %p to multi %p (%s)\n", conn->easy, g->multi, url);
+  rc = curl_multi_add_handle(g->multi, conn->easy);
+  mcode_or_die("new_conn: curl_multi_add_handle", rc);
+
+  /* note that the add_handle() will set a time-out to trigger very soon so
+     that the necessary socket_action() call will be called by this app */
+}
+
+/* This gets called whenever data is received from the fifo */
+static void fifo_cb(GlobalInfo* g, int revents)
+{
+  char s[1024];
+  long int rv = 0;
+  int n = 0;
+
+  do {
+    s[0]='\0';
+    rv = fscanf(g->input, "%1023s%n", s, &n);
+    s[n]='\0';
+    if(n && s[0]) {
+      new_conn(s, g); /* if we read a URL, go get it! */
+    }
+    else
+      break;
+  } while(rv != EOF);
+}
+
+/* Create a named pipe and tell libevent to monitor it */
+static const char *fifo = "hiper.fifo";
+static int init_fifo(GlobalInfo *g)
+{
+  struct stat st;
+  curl_socket_t sockfd;
+  struct epoll_event epev;
+
+  fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo);
+  if(lstat (fifo, &st) == 0) {
+    if((st.st_mode & S_IFMT) == S_IFREG) {
+      errno = EEXIST;
+      perror("lstat");
+      exit(1);
+    }
+  }
+  unlink(fifo);
+  if(mkfifo (fifo, 0600) == -1) {
+    perror("mkfifo");
+    exit(1);
+  }
+  sockfd = open(fifo, O_RDWR | O_NONBLOCK, 0);
+  if(sockfd == -1) {
+    perror("open");
+    exit(1);
+  }
+
+  g->fifofd = sockfd;
+  g->input = fdopen(sockfd, "r");
+
+  epev.events = EPOLLIN;
+  epev.data.fd = sockfd;
+  epoll_ctl(g->epfd, EPOLL_CTL_ADD, sockfd, &epev);
+
+  fprintf(MSG_OUT, "Now, pipe some URL's into > %s\n", fifo);
+  return 0;
+}
+
+static void clean_fifo(GlobalInfo *g)
+{
+    epoll_ctl(g->epfd, EPOLL_CTL_DEL, g->fifofd, NULL);
+    fclose(g->input);
+    unlink(fifo);
+}
+
+
+int g_should_exit_ = 0;
+
+void SignalHandler(int signo)
+{
+  if(signo == SIGINT) {
+    g_should_exit_ = 1;
+  }
+}
+
+int main(int argc _Unused, char **argv _Unused)
+{
+  GlobalInfo g;
+  struct itimerspec its;
+  struct epoll_event ev;
+  struct epoll_event events[10];
+
+  g_should_exit_ = 0;
+  signal(SIGINT, SignalHandler);
+
+  memset(&g, 0, sizeof(GlobalInfo));
+  g.epfd = epoll_create1(EPOLL_CLOEXEC);
+  if(g.epfd == -1) {
+    perror("epoll_create1 failed");
+    exit(1);
+  }
+
+  g.tfd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK | TFD_CLOEXEC);
+  if(g.tfd == -1) {
+    perror("timerfd_create failed");
+    exit(1);
+  }
+
+  memset(&its, 0, sizeof(struct itimerspec));
+  its.it_interval.tv_sec = 1;
+  its.it_value.tv_sec = 1;
+  timerfd_settime(g.tfd, 0, &its, NULL);
+
+  ev.events = EPOLLIN;
+  ev.data.fd = g.tfd;
+  epoll_ctl(g.epfd, EPOLL_CTL_ADD, g.tfd, &ev);
+
+  init_fifo(&g);
+  g.multi = curl_multi_init();
+
+  /* setup the generic multi interface options we want */
+  curl_multi_setopt(g.multi, CURLMOPT_SOCKETFUNCTION, sock_cb);
+  curl_multi_setopt(g.multi, CURLMOPT_SOCKETDATA, &g);
+  curl_multi_setopt(g.multi, CURLMOPT_TIMERFUNCTION, multi_timer_cb);
+  curl_multi_setopt(g.multi, CURLMOPT_TIMERDATA, &g);
+
+  /* we don't call any curl_multi_socket*() function yet as we have no handles
+     added! */
+
+  fprintf(MSG_OUT, "Entering wait loop\n");
+  fflush(MSG_OUT);
+  while(!g_should_exit_) {
+    int idx;
+    int err = epoll_wait(g.epfd, events,
+                         sizeof(events)/sizeof(struct epoll_event), 10000);
+    if(err == -1) {
+      if(errno == EINTR) {
+        fprintf(MSG_OUT, "note: wait interrupted\n");
+        continue;
+      }
+      else {
+        perror("epoll_wait");
+        exit(1);
+      }
+    }
+
+    for(idx = 0; idx < err; ++idx) {
+      if(events[idx].data.fd == g.fifofd) {
+        fifo_cb(&g, events[idx].events);
+      }
+      else if(events[idx].data.fd == g.tfd) {
+        timer_cb(&g, events[idx].events);
+      }
+      else {
+        event_cb(&g, events[idx].data.fd, events[idx].events);
+      }
+    }
+  }
+
+  fprintf(MSG_OUT, "Exiting normally.\n");
+  fflush(MSG_OUT);
+
+  curl_multi_cleanup(g.multi);
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/evhiperfifo.c b/components/cronet/third_party/curl_headers/docs/examples/evhiperfifo.c
new file mode 100644
index 0000000..4d77d52
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/evhiperfifo.c
@@ -0,0 +1,448 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * multi socket interface together with libev
+ * </DESC>
+ */
+/* Example application source code using the multi socket interface to
+ * download many files at once.
+ *
+ * This example features the same basic functionality as hiperfifo.c does,
+ * but this uses libev instead of libevent.
+ *
+ * Written by Jeff Pohlmeyer, converted to use libev by Markus Koetter
+
+Requires libev and a (POSIX?) system that has mkfifo().
+
+This is an adaptation of libcurl's "hipev.c" and libevent's "event-test.c"
+sample programs.
+
+When running, the program creates the named pipe "hiper.fifo"
+
+Whenever there is input into the fifo, the program reads the input as a list
+of URL's and creates some new easy handles to fetch each URL via the
+curl_multi "hiper" API.
+
+
+Thus, you can try a single URL:
+  % echo http://www.yahoo.com > hiper.fifo
+
+Or a whole bunch of them:
+  % cat my-url-list > hiper.fifo
+
+The fifo buffer is handled almost instantly, so you can even add more URL's
+while the previous requests are still being downloaded.
+
+Note:
+  For the sake of simplicity, URL length is limited to 1023 char's !
+
+This is purely a demo app, all retrieved data is simply discarded by the write
+callback.
+
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/time.h>
+#include <time.h>
+#include <unistd.h>
+#include <sys/poll.h>
+#include <curl/curl.h>
+#include <ev.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <errno.h>
+
+#define DPRINT(x...) printf(x)
+
+#define MSG_OUT stdout /* Send info to stdout, change to stderr if you want */
+
+
+/* Global information, common to all connections */
+typedef struct _GlobalInfo
+{
+  struct ev_loop *loop;
+  struct ev_io fifo_event;
+  struct ev_timer timer_event;
+  CURLM *multi;
+  int still_running;
+  FILE *input;
+} GlobalInfo;
+
+
+/* Information associated with a specific easy handle */
+typedef struct _ConnInfo
+{
+  CURL *easy;
+  char *url;
+  GlobalInfo *global;
+  char error[CURL_ERROR_SIZE];
+} ConnInfo;
+
+
+/* Information associated with a specific socket */
+typedef struct _SockInfo
+{
+  curl_socket_t sockfd;
+  CURL *easy;
+  int action;
+  long timeout;
+  struct ev_io ev;
+  int evset;
+  GlobalInfo *global;
+} SockInfo;
+
+static void timer_cb(EV_P_ struct ev_timer *w, int revents);
+
+/* Update the event timer after curl_multi library calls */
+static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
+{
+  DPRINT("%s %li\n", __PRETTY_FUNCTION__,  timeout_ms);
+  ev_timer_stop(g->loop, &g->timer_event);
+  if(timeout_ms >= 0) {
+    /* -1 means delete, other values are timeout times in milliseconds */
+    double  t = timeout_ms / 1000;
+    ev_timer_init(&g->timer_event, timer_cb, t, 0.);
+    ev_timer_start(g->loop, &g->timer_event);
+  }
+  return 0;
+}
+
+/* Die if we get a bad CURLMcode somewhere */
+static void mcode_or_die(const char *where, CURLMcode code)
+{
+  if(CURLM_OK != code) {
+    const char *s;
+    switch(code) {
+    case CURLM_BAD_HANDLE:
+      s = "CURLM_BAD_HANDLE";
+      break;
+    case CURLM_BAD_EASY_HANDLE:
+      s = "CURLM_BAD_EASY_HANDLE";
+      break;
+    case CURLM_OUT_OF_MEMORY:
+      s = "CURLM_OUT_OF_MEMORY";
+      break;
+    case CURLM_INTERNAL_ERROR:
+      s = "CURLM_INTERNAL_ERROR";
+      break;
+    case CURLM_UNKNOWN_OPTION:
+      s = "CURLM_UNKNOWN_OPTION";
+      break;
+    case CURLM_LAST:
+      s = "CURLM_LAST";
+      break;
+    default:
+      s = "CURLM_unknown";
+      break;
+    case CURLM_BAD_SOCKET:
+      s = "CURLM_BAD_SOCKET";
+      fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s);
+      /* ignore this error */
+      return;
+    }
+    fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s);
+    exit(code);
+  }
+}
+
+
+
+/* Check for completed transfers, and remove their easy handles */
+static void check_multi_info(GlobalInfo *g)
+{
+  char *eff_url;
+  CURLMsg *msg;
+  int msgs_left;
+  ConnInfo *conn;
+  CURL *easy;
+  CURLcode res;
+
+  fprintf(MSG_OUT, "REMAINING: %d\n", g->still_running);
+  while((msg = curl_multi_info_read(g->multi, &msgs_left))) {
+    if(msg->msg == CURLMSG_DONE) {
+      easy = msg->easy_handle;
+      res = msg->data.result;
+      curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
+      curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
+      fprintf(MSG_OUT, "DONE: %s => (%d) %s\n", eff_url, res, conn->error);
+      curl_multi_remove_handle(g->multi, easy);
+      free(conn->url);
+      curl_easy_cleanup(easy);
+      free(conn);
+    }
+  }
+}
+
+
+
+/* Called by libevent when we get action on a multi socket */
+static void event_cb(EV_P_ struct ev_io *w, int revents)
+{
+  DPRINT("%s  w %p revents %i\n", __PRETTY_FUNCTION__, w, revents);
+  GlobalInfo *g = (GlobalInfo*) w->data;
+  CURLMcode rc;
+
+  int action = ((revents & EV_READ) ? CURL_POLL_IN : 0) |
+    ((revents & EV_WRITE) ? CURL_POLL_OUT : 0);
+  rc = curl_multi_socket_action(g->multi, w->fd, action, &g->still_running);
+  mcode_or_die("event_cb: curl_multi_socket_action", rc);
+  check_multi_info(g);
+  if(g->still_running <= 0) {
+    fprintf(MSG_OUT, "last transfer done, kill timeout\n");
+    ev_timer_stop(g->loop, &g->timer_event);
+  }
+}
+
+/* Called by libevent when our timeout expires */
+static void timer_cb(EV_P_ struct ev_timer *w, int revents)
+{
+  DPRINT("%s  w %p revents %i\n", __PRETTY_FUNCTION__, w, revents);
+
+  GlobalInfo *g = (GlobalInfo *)w->data;
+  CURLMcode rc;
+
+  rc = curl_multi_socket_action(g->multi, CURL_SOCKET_TIMEOUT, 0,
+                                &g->still_running);
+  mcode_or_die("timer_cb: curl_multi_socket_action", rc);
+  check_multi_info(g);
+}
+
+/* Clean up the SockInfo structure */
+static void remsock(SockInfo *f, GlobalInfo *g)
+{
+  printf("%s  \n", __PRETTY_FUNCTION__);
+  if(f) {
+    if(f->evset)
+      ev_io_stop(g->loop, &f->ev);
+    free(f);
+  }
+}
+
+
+
+/* Assign information to a SockInfo structure */
+static void setsock(SockInfo *f, curl_socket_t s, CURL *e, int act,
+                    GlobalInfo *g)
+{
+  printf("%s  \n", __PRETTY_FUNCTION__);
+
+  int kind = ((act & CURL_POLL_IN) ? EV_READ : 0) |
+             ((act & CURL_POLL_OUT) ? EV_WRITE : 0);
+
+  f->sockfd = s;
+  f->action = act;
+  f->easy = e;
+  if(f->evset)
+    ev_io_stop(g->loop, &f->ev);
+  ev_io_init(&f->ev, event_cb, f->sockfd, kind);
+  f->ev.data = g;
+  f->evset = 1;
+  ev_io_start(g->loop, &f->ev);
+}
+
+
+
+/* Initialize a new SockInfo structure */
+static void addsock(curl_socket_t s, CURL *easy, int action, GlobalInfo *g)
+{
+  SockInfo *fdp = calloc(sizeof(SockInfo), 1);
+
+  fdp->global = g;
+  setsock(fdp, s, easy, action, g);
+  curl_multi_assign(g->multi, s, fdp);
+}
+
+/* CURLMOPT_SOCKETFUNCTION */
+static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
+{
+  DPRINT("%s e %p s %i what %i cbp %p sockp %p\n",
+         __PRETTY_FUNCTION__, e, s, what, cbp, sockp);
+
+  GlobalInfo *g = (GlobalInfo*) cbp;
+  SockInfo *fdp = (SockInfo*) sockp;
+  const char *whatstr[]={ "none", "IN", "OUT", "INOUT", "REMOVE"};
+
+  fprintf(MSG_OUT,
+          "socket callback: s=%d e=%p what=%s ", s, e, whatstr[what]);
+  if(what == CURL_POLL_REMOVE) {
+    fprintf(MSG_OUT, "\n");
+    remsock(fdp, g);
+  }
+  else {
+    if(!fdp) {
+      fprintf(MSG_OUT, "Adding data: %s\n", whatstr[what]);
+      addsock(s, e, what, g);
+    }
+    else {
+      fprintf(MSG_OUT,
+              "Changing action from %s to %s\n",
+              whatstr[fdp->action], whatstr[what]);
+      setsock(fdp, s, e, what, g);
+    }
+  }
+  return 0;
+}
+
+
+/* CURLOPT_WRITEFUNCTION */
+static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data)
+{
+  size_t realsize = size * nmemb;
+  ConnInfo *conn = (ConnInfo*) data;
+  (void)ptr;
+  (void)conn;
+  return realsize;
+}
+
+
+/* CURLOPT_PROGRESSFUNCTION */
+static int prog_cb(void *p, double dltotal, double dlnow, double ult,
+                   double uln)
+{
+  ConnInfo *conn = (ConnInfo *)p;
+  (void)ult;
+  (void)uln;
+
+  fprintf(MSG_OUT, "Progress: %s (%g/%g)\n", conn->url, dlnow, dltotal);
+  return 0;
+}
+
+
+/* Create a new easy handle, and add it to the global curl_multi */
+static void new_conn(char *url, GlobalInfo *g)
+{
+  ConnInfo *conn;
+  CURLMcode rc;
+
+  conn = calloc(1, sizeof(ConnInfo));
+  conn->error[0]='\0';
+
+  conn->easy = curl_easy_init();
+  if(!conn->easy) {
+    fprintf(MSG_OUT, "curl_easy_init() failed, exiting!\n");
+    exit(2);
+  }
+  conn->global = g;
+  conn->url = strdup(url);
+  curl_easy_setopt(conn->easy, CURLOPT_URL, conn->url);
+  curl_easy_setopt(conn->easy, CURLOPT_WRITEFUNCTION, write_cb);
+  curl_easy_setopt(conn->easy, CURLOPT_WRITEDATA, conn);
+  curl_easy_setopt(conn->easy, CURLOPT_VERBOSE, 1L);
+  curl_easy_setopt(conn->easy, CURLOPT_ERRORBUFFER, conn->error);
+  curl_easy_setopt(conn->easy, CURLOPT_PRIVATE, conn);
+  curl_easy_setopt(conn->easy, CURLOPT_NOPROGRESS, 0L);
+  curl_easy_setopt(conn->easy, CURLOPT_PROGRESSFUNCTION, prog_cb);
+  curl_easy_setopt(conn->easy, CURLOPT_PROGRESSDATA, conn);
+  curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_TIME, 3L);
+  curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_LIMIT, 10L);
+
+  fprintf(MSG_OUT,
+          "Adding easy %p to multi %p (%s)\n", conn->easy, g->multi, url);
+  rc = curl_multi_add_handle(g->multi, conn->easy);
+  mcode_or_die("new_conn: curl_multi_add_handle", rc);
+
+  /* note that the add_handle() will set a time-out to trigger very soon so
+     that the necessary socket_action() call will be called by this app */
+}
+
+/* This gets called whenever data is received from the fifo */
+static void fifo_cb(EV_P_ struct ev_io *w, int revents)
+{
+  char s[1024];
+  long int rv = 0;
+  int n = 0;
+  GlobalInfo *g = (GlobalInfo *)w->data;
+
+  do {
+    s[0]='\0';
+    rv = fscanf(g->input, "%1023s%n", s, &n);
+    s[n]='\0';
+    if(n && s[0]) {
+      new_conn(s, g);  /* if we read a URL, go get it! */
+    }
+    else
+      break;
+  } while(rv != EOF);
+}
+
+/* Create a named pipe and tell libevent to monitor it */
+static int init_fifo(GlobalInfo *g)
+{
+  struct stat st;
+  static const char *fifo = "hiper.fifo";
+  curl_socket_t sockfd;
+
+  fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo);
+  if(lstat (fifo, &st) == 0) {
+    if((st.st_mode & S_IFMT) == S_IFREG) {
+      errno = EEXIST;
+      perror("lstat");
+      exit(1);
+    }
+  }
+  unlink(fifo);
+  if(mkfifo (fifo, 0600) == -1) {
+    perror("mkfifo");
+    exit(1);
+  }
+  sockfd = open(fifo, O_RDWR | O_NONBLOCK, 0);
+  if(sockfd == -1) {
+    perror("open");
+    exit(1);
+  }
+  g->input = fdopen(sockfd, "r");
+
+  fprintf(MSG_OUT, "Now, pipe some URL's into > %s\n", fifo);
+  ev_io_init(&g->fifo_event, fifo_cb, sockfd, EV_READ);
+  ev_io_start(g->loop, &g->fifo_event);
+  return (0);
+}
+
+int main(int argc, char **argv)
+{
+  GlobalInfo g;
+  (void)argc;
+  (void)argv;
+
+  memset(&g, 0, sizeof(GlobalInfo));
+  g.loop = ev_default_loop(0);
+
+  init_fifo(&g);
+  g.multi = curl_multi_init();
+
+  ev_timer_init(&g.timer_event, timer_cb, 0., 0.);
+  g.timer_event.data = &g;
+  g.fifo_event.data = &g;
+  curl_multi_setopt(g.multi, CURLMOPT_SOCKETFUNCTION, sock_cb);
+  curl_multi_setopt(g.multi, CURLMOPT_SOCKETDATA, &g);
+  curl_multi_setopt(g.multi, CURLMOPT_TIMERFUNCTION, multi_timer_cb);
+  curl_multi_setopt(g.multi, CURLMOPT_TIMERDATA, &g);
+
+  /* we don't call any curl_multi_socket*() function yet as we have no handles
+     added! */
+
+  ev_loop(g.loop, 0);
+  curl_multi_cleanup(g.multi);
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/externalsocket.c b/components/cronet/third_party/curl_headers/docs/examples/externalsocket.c
new file mode 100644
index 0000000..d89b041
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/externalsocket.c
@@ -0,0 +1,174 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * An example demonstrating how an application can pass in a custom
+ * socket to libcurl to use. This example also handles the connect itself.
+ * </DESC>
+ */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <curl/curl.h>
+
+#ifdef WIN32
+#include <windows.h>
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#define close closesocket
+#else
+#include <sys/types.h>        /*  socket types              */
+#include <sys/socket.h>       /*  socket definitions        */
+#include <netinet/in.h>
+#include <arpa/inet.h>        /*  inet (3) functions         */
+#include <unistd.h>           /*  misc. Unix functions      */
+#endif
+
+#include <errno.h>
+
+/* The IP address and port number to connect to */
+#define IPADDR "127.0.0.1"
+#define PORTNUM 80
+
+#ifndef INADDR_NONE
+#define INADDR_NONE 0xffffffff
+#endif
+
+static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
+{
+  size_t written = fwrite(ptr, size, nmemb, (FILE *)stream);
+  return written;
+}
+
+static int closecb(void *clientp, curl_socket_t item)
+{
+  (void)clientp;
+  printf("libcurl wants to close %d now\n", (int)item);
+  return 0;
+}
+
+static curl_socket_t opensocket(void *clientp,
+                                curlsocktype purpose,
+                                struct curl_sockaddr *address)
+{
+  curl_socket_t sockfd;
+  (void)purpose;
+  (void)address;
+  sockfd = *(curl_socket_t *)clientp;
+  /* the actual externally set socket is passed in via the OPENSOCKETDATA
+     option */
+  return sockfd;
+}
+
+static int sockopt_callback(void *clientp, curl_socket_t curlfd,
+                            curlsocktype purpose)
+{
+  (void)clientp;
+  (void)curlfd;
+  (void)purpose;
+  /* This return code was added in libcurl 7.21.5 */
+  return CURL_SOCKOPT_ALREADY_CONNECTED;
+}
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+  struct sockaddr_in servaddr;  /*  socket address structure  */
+  curl_socket_t sockfd;
+
+#ifdef WIN32
+  WSADATA wsaData;
+  int initwsa = WSAStartup(MAKEWORD(2, 0), &wsaData);
+  if(initwsa != 0) {
+    printf("WSAStartup failed: %d\n", initwsa);
+    return 1;
+  }
+#endif
+
+  curl = curl_easy_init();
+  if(curl) {
+    /*
+     * Note that libcurl will internally think that you connect to the host
+     * and port that you specify in the URL option.
+     */
+    curl_easy_setopt(curl, CURLOPT_URL, "http://99.99.99.99:9999");
+
+    /* Create the socket "manually" */
+    sockfd = socket(AF_INET, SOCK_STREAM, 0);
+    if(sockfd == CURL_SOCKET_BAD) {
+      printf("Error creating listening socket.\n");
+      return 3;
+    }
+
+    memset(&servaddr, 0, sizeof(servaddr));
+    servaddr.sin_family = AF_INET;
+    servaddr.sin_port   = htons(PORTNUM);
+
+    servaddr.sin_addr.s_addr = inet_addr(IPADDR);
+    if(INADDR_NONE == servaddr.sin_addr.s_addr) {
+      close(sockfd);
+      return 2;
+    }
+
+    if(connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) ==
+       -1) {
+      close(sockfd);
+      printf("client error: connect: %s\n", strerror(errno));
+      return 1;
+    }
+
+    /* no progress meter please */
+    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
+
+    /* send all data to this function  */
+    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
+
+    /* call this function to get a socket */
+    curl_easy_setopt(curl, CURLOPT_OPENSOCKETFUNCTION, opensocket);
+    curl_easy_setopt(curl, CURLOPT_OPENSOCKETDATA, &sockfd);
+
+    /* call this function to close sockets */
+    curl_easy_setopt(curl, CURLOPT_CLOSESOCKETFUNCTION, closecb);
+    curl_easy_setopt(curl, CURLOPT_CLOSESOCKETDATA, &sockfd);
+
+    /* call this function to set options for the socket */
+    curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, sockopt_callback);
+
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
+
+    res = curl_easy_perform(curl);
+
+    curl_easy_cleanup(curl);
+
+    close(sockfd);
+
+    if(res) {
+      printf("libcurl error: %d\n", res);
+      return 4;
+    }
+  }
+
+#ifdef WIN32
+  WSACleanup();
+#endif
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/fileupload.c b/components/cronet/third_party/curl_headers/docs/examples/fileupload.c
new file mode 100644
index 0000000..8128608
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/fileupload.c
@@ -0,0 +1,89 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Upload to a file:// URL
+ * </DESC>
+ */
+#include <stdio.h>
+#include <curl/curl.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+  struct stat file_info;
+  curl_off_t speed_upload, total_time;
+  FILE *fd;
+
+  fd = fopen("debugit", "rb"); /* open file to upload */
+  if(!fd)
+    return 1; /* can't continue */
+
+  /* to get the file size */
+  if(fstat(fileno(fd), &file_info) != 0)
+    return 1; /* can't continue */
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* upload to this place */
+    curl_easy_setopt(curl, CURLOPT_URL,
+                     "file:///home/dast/src/curl/debug/new");
+
+    /* tell it to "upload" to the URL */
+    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+
+    /* set where to read from (on Windows you need to use READFUNCTION too) */
+    curl_easy_setopt(curl, CURLOPT_READDATA, fd);
+
+    /* and give the size of the upload (optional) */
+    curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE,
+                     (curl_off_t)file_info.st_size);
+
+    /* enable verbose for easier tracing */
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+    res = curl_easy_perform(curl);
+    /* Check for errors */
+    if(res != CURLE_OK) {
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    }
+    else {
+      /* now extract transfer info */
+      curl_easy_getinfo(curl, CURLINFO_SPEED_UPLOAD_T, &speed_upload);
+      curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME_T, &total_time);
+
+      fprintf(stderr, "Speed: %" CURL_FORMAT_CURL_OFF_T " bytes/sec during %"
+              CURL_FORMAT_CURL_OFF_T ".%06ld seconds\n",
+              speed_upload,
+              (total_time / 1000000), (long)(total_time % 1000000));
+
+    }
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+  fclose(fd);
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/fopen.c b/components/cronet/third_party/curl_headers/docs/examples/fopen.c
new file mode 100644
index 0000000..f1706fb
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/fopen.c
@@ -0,0 +1,546 @@
+/*****************************************************************************
+ *
+ * This example source code introduces a c library buffered I/O interface to
+ * URL reads it supports fopen(), fread(), fgets(), feof(), fclose(),
+ * rewind(). Supported functions have identical prototypes to their normal c
+ * lib namesakes and are preceaded by url_ .
+ *
+ * Using this code you can replace your program's fopen() with url_fopen()
+ * and fread() with url_fread() and it become possible to read remote streams
+ * instead of (only) local files. Local files (ie those that can be directly
+ * fopened) will drop back to using the underlying clib implementations
+ *
+ * See the main() function at the bottom that shows an app that retrieves from
+ * a specified url using fgets() and fread() and saves as two output files.
+ *
+ * Copyright (c) 2003, 2017 Simtec Electronics
+ *
+ * Re-implemented by Vincent Sanders <vince@kyllikki.org> with extensive
+ * reference to original curl example code
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This example requires libcurl 7.9.7 or later.
+ */
+/* <DESC>
+ * implements an fopen() abstraction allowing reading from URLs
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <string.h>
+#ifndef WIN32
+#  include <sys/time.h>
+#endif
+#include <stdlib.h>
+#include <errno.h>
+
+#include <curl/curl.h>
+
+enum fcurl_type_e {
+  CFTYPE_NONE = 0,
+  CFTYPE_FILE = 1,
+  CFTYPE_CURL = 2
+};
+
+struct fcurl_data
+{
+  enum fcurl_type_e type;     /* type of handle */
+  union {
+    CURL *curl;
+    FILE *file;
+  } handle;                   /* handle */
+
+  char *buffer;               /* buffer to store cached data*/
+  size_t buffer_len;          /* currently allocated buffers length */
+  size_t buffer_pos;          /* end of data in buffer*/
+  int still_running;          /* Is background url fetch still in progress */
+};
+
+typedef struct fcurl_data URL_FILE;
+
+/* exported functions */
+URL_FILE *url_fopen(const char *url, const char *operation);
+int url_fclose(URL_FILE *file);
+int url_feof(URL_FILE *file);
+size_t url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file);
+char *url_fgets(char *ptr, size_t size, URL_FILE *file);
+void url_rewind(URL_FILE *file);
+
+/* we use a global one for convenience */
+static CURLM *multi_handle;
+
+/* curl calls this routine to get more data */
+static size_t write_callback(char *buffer,
+                             size_t size,
+                             size_t nitems,
+                             void *userp)
+{
+  char *newbuff;
+  size_t rembuff;
+
+  URL_FILE *url = (URL_FILE *)userp;
+  size *= nitems;
+
+  rembuff = url->buffer_len - url->buffer_pos; /* remaining space in buffer */
+
+  if(size > rembuff) {
+    /* not enough space in buffer */
+    newbuff = realloc(url->buffer, url->buffer_len + (size - rembuff));
+    if(newbuff == NULL) {
+      fprintf(stderr, "callback buffer grow failed\n");
+      size = rembuff;
+    }
+    else {
+      /* realloc succeeded increase buffer size*/
+      url->buffer_len += size - rembuff;
+      url->buffer = newbuff;
+    }
+  }
+
+  memcpy(&url->buffer[url->buffer_pos], buffer, size);
+  url->buffer_pos += size;
+
+  return size;
+}
+
+/* use to attempt to fill the read buffer up to requested number of bytes */
+static int fill_buffer(URL_FILE *file, size_t want)
+{
+  fd_set fdread;
+  fd_set fdwrite;
+  fd_set fdexcep;
+  struct timeval timeout;
+  int rc;
+  CURLMcode mc; /* curl_multi_fdset() return code */
+
+  /* only attempt to fill buffer if transactions still running and buffer
+   * doesn't exceed required size already
+   */
+  if((!file->still_running) || (file->buffer_pos > want))
+    return 0;
+
+  /* attempt to fill buffer */
+  do {
+    int maxfd = -1;
+    long curl_timeo = -1;
+
+    FD_ZERO(&fdread);
+    FD_ZERO(&fdwrite);
+    FD_ZERO(&fdexcep);
+
+    /* set a suitable timeout to fail on */
+    timeout.tv_sec = 60; /* 1 minute */
+    timeout.tv_usec = 0;
+
+    curl_multi_timeout(multi_handle, &curl_timeo);
+    if(curl_timeo >= 0) {
+      timeout.tv_sec = curl_timeo / 1000;
+      if(timeout.tv_sec > 1)
+        timeout.tv_sec = 1;
+      else
+        timeout.tv_usec = (curl_timeo % 1000) * 1000;
+    }
+
+    /* get file descriptors from the transfers */
+    mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
+
+    if(mc != CURLM_OK) {
+      fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
+      break;
+    }
+
+    /* On success the value of maxfd is guaranteed to be >= -1. We call
+       select(maxfd + 1, ...); specially in case of (maxfd == -1) there are
+       no fds ready yet so we call select(0, ...) --or Sleep() on Windows--
+       to sleep 100ms, which is the minimum suggested value in the
+       curl_multi_fdset() doc. */
+
+    if(maxfd == -1) {
+#ifdef _WIN32
+      Sleep(100);
+      rc = 0;
+#else
+      /* Portable sleep for platforms other than Windows. */
+      struct timeval wait = { 0, 100 * 1000 }; /* 100ms */
+      rc = select(0, NULL, NULL, NULL, &wait);
+#endif
+    }
+    else {
+      /* Note that on some platforms 'timeout' may be modified by select().
+         If you need access to the original value save a copy beforehand. */
+      rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
+    }
+
+    switch(rc) {
+    case -1:
+      /* select error */
+      break;
+
+    case 0:
+    default:
+      /* timeout or readable/writable sockets */
+      curl_multi_perform(multi_handle, &file->still_running);
+      break;
+    }
+  } while(file->still_running && (file->buffer_pos < want));
+  return 1;
+}
+
+/* use to remove want bytes from the front of a files buffer */
+static int use_buffer(URL_FILE *file, size_t want)
+{
+  /* sort out buffer */
+  if((file->buffer_pos - want) <= 0) {
+    /* ditch buffer - write will recreate */
+    free(file->buffer);
+    file->buffer = NULL;
+    file->buffer_pos = 0;
+    file->buffer_len = 0;
+  }
+  else {
+    /* move rest down make it available for later */
+    memmove(file->buffer,
+            &file->buffer[want],
+            (file->buffer_pos - want));
+
+    file->buffer_pos -= want;
+  }
+  return 0;
+}
+
+URL_FILE *url_fopen(const char *url, const char *operation)
+{
+  /* this code could check for URLs or types in the 'url' and
+     basically use the real fopen() for standard files */
+
+  URL_FILE *file;
+  (void)operation;
+
+  file = calloc(1, sizeof(URL_FILE));
+  if(!file)
+    return NULL;
+
+  file->handle.file = fopen(url, operation);
+  if(file->handle.file)
+    file->type = CFTYPE_FILE; /* marked as URL */
+
+  else {
+    file->type = CFTYPE_CURL; /* marked as URL */
+    file->handle.curl = curl_easy_init();
+
+    curl_easy_setopt(file->handle.curl, CURLOPT_URL, url);
+    curl_easy_setopt(file->handle.curl, CURLOPT_WRITEDATA, file);
+    curl_easy_setopt(file->handle.curl, CURLOPT_VERBOSE, 0L);
+    curl_easy_setopt(file->handle.curl, CURLOPT_WRITEFUNCTION, write_callback);
+
+    if(!multi_handle)
+      multi_handle = curl_multi_init();
+
+    curl_multi_add_handle(multi_handle, file->handle.curl);
+
+    /* lets start the fetch */
+    curl_multi_perform(multi_handle, &file->still_running);
+
+    if((file->buffer_pos == 0) && (!file->still_running)) {
+      /* if still_running is 0 now, we should return NULL */
+
+      /* make sure the easy handle is not in the multi handle anymore */
+      curl_multi_remove_handle(multi_handle, file->handle.curl);
+
+      /* cleanup */
+      curl_easy_cleanup(file->handle.curl);
+
+      free(file);
+
+      file = NULL;
+    }
+  }
+  return file;
+}
+
+int url_fclose(URL_FILE *file)
+{
+  int ret = 0;/* default is good return */
+
+  switch(file->type) {
+  case CFTYPE_FILE:
+    ret = fclose(file->handle.file); /* passthrough */
+    break;
+
+  case CFTYPE_CURL:
+    /* make sure the easy handle is not in the multi handle anymore */
+    curl_multi_remove_handle(multi_handle, file->handle.curl);
+
+    /* cleanup */
+    curl_easy_cleanup(file->handle.curl);
+    break;
+
+  default: /* unknown or supported type - oh dear */
+    ret = EOF;
+    errno = EBADF;
+    break;
+  }
+
+  free(file->buffer);/* free any allocated buffer space */
+  free(file);
+
+  return ret;
+}
+
+int url_feof(URL_FILE *file)
+{
+  int ret = 0;
+
+  switch(file->type) {
+  case CFTYPE_FILE:
+    ret = feof(file->handle.file);
+    break;
+
+  case CFTYPE_CURL:
+    if((file->buffer_pos == 0) && (!file->still_running))
+      ret = 1;
+    break;
+
+  default: /* unknown or supported type - oh dear */
+    ret = -1;
+    errno = EBADF;
+    break;
+  }
+  return ret;
+}
+
+size_t url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file)
+{
+  size_t want;
+
+  switch(file->type) {
+  case CFTYPE_FILE:
+    want = fread(ptr, size, nmemb, file->handle.file);
+    break;
+
+  case CFTYPE_CURL:
+    want = nmemb * size;
+
+    fill_buffer(file, want);
+
+    /* check if there's data in the buffer - if not fill_buffer()
+     * either errored or EOF */
+    if(!file->buffer_pos)
+      return 0;
+
+    /* ensure only available data is considered */
+    if(file->buffer_pos < want)
+      want = file->buffer_pos;
+
+    /* xfer data to caller */
+    memcpy(ptr, file->buffer, want);
+
+    use_buffer(file, want);
+
+    want = want / size;     /* number of items */
+    break;
+
+  default: /* unknown or supported type - oh dear */
+    want = 0;
+    errno = EBADF;
+    break;
+
+  }
+  return want;
+}
+
+char *url_fgets(char *ptr, size_t size, URL_FILE *file)
+{
+  size_t want = size - 1;/* always need to leave room for zero termination */
+  size_t loop;
+
+  switch(file->type) {
+  case CFTYPE_FILE:
+    ptr = fgets(ptr, (int)size, file->handle.file);
+    break;
+
+  case CFTYPE_CURL:
+    fill_buffer(file, want);
+
+    /* check if there's data in the buffer - if not fill either errored or
+     * EOF */
+    if(!file->buffer_pos)
+      return NULL;
+
+    /* ensure only available data is considered */
+    if(file->buffer_pos < want)
+      want = file->buffer_pos;
+
+    /*buffer contains data */
+    /* look for newline or eof */
+    for(loop = 0; loop < want; loop++) {
+      if(file->buffer[loop] == '\n') {
+        want = loop + 1;/* include newline */
+        break;
+      }
+    }
+
+    /* xfer data to caller */
+    memcpy(ptr, file->buffer, want);
+    ptr[want] = 0;/* always null terminate */
+
+    use_buffer(file, want);
+
+    break;
+
+  default: /* unknown or supported type - oh dear */
+    ptr = NULL;
+    errno = EBADF;
+    break;
+  }
+
+  return ptr;/*success */
+}
+
+void url_rewind(URL_FILE *file)
+{
+  switch(file->type) {
+  case CFTYPE_FILE:
+    rewind(file->handle.file); /* passthrough */
+    break;
+
+  case CFTYPE_CURL:
+    /* halt transaction */
+    curl_multi_remove_handle(multi_handle, file->handle.curl);
+
+    /* restart */
+    curl_multi_add_handle(multi_handle, file->handle.curl);
+
+    /* ditch buffer - write will recreate - resets stream pos*/
+    free(file->buffer);
+    file->buffer = NULL;
+    file->buffer_pos = 0;
+    file->buffer_len = 0;
+
+    break;
+
+  default: /* unknown or supported type - oh dear */
+    break;
+  }
+}
+
+#define FGETSFILE "fgets.test"
+#define FREADFILE "fread.test"
+#define REWINDFILE "rewind.test"
+
+/* Small main program to retrieve from a url using fgets and fread saving the
+ * output to two test files (note the fgets method will corrupt binary files if
+ * they contain 0 chars */
+int main(int argc, char *argv[])
+{
+  URL_FILE *handle;
+  FILE *outf;
+
+  size_t nread;
+  char buffer[256];
+  const char *url;
+
+  if(argc < 2)
+    url = "http://192.168.7.3/testfile";/* default to testurl */
+  else
+    url = argv[1];/* use passed url */
+
+  /* copy from url line by line with fgets */
+  outf = fopen(FGETSFILE, "wb+");
+  if(!outf) {
+    perror("couldn't open fgets output file\n");
+    return 1;
+  }
+
+  handle = url_fopen(url, "r");
+  if(!handle) {
+    printf("couldn't url_fopen() %s\n", url);
+    fclose(outf);
+    return 2;
+  }
+
+  while(!url_feof(handle)) {
+    url_fgets(buffer, sizeof(buffer), handle);
+    fwrite(buffer, 1, strlen(buffer), outf);
+  }
+
+  url_fclose(handle);
+
+  fclose(outf);
+
+
+  /* Copy from url with fread */
+  outf = fopen(FREADFILE, "wb+");
+  if(!outf) {
+    perror("couldn't open fread output file\n");
+    return 1;
+  }
+
+  handle = url_fopen("testfile", "r");
+  if(!handle) {
+    printf("couldn't url_fopen() testfile\n");
+    fclose(outf);
+    return 2;
+  }
+
+  do {
+    nread = url_fread(buffer, 1, sizeof(buffer), handle);
+    fwrite(buffer, 1, nread, outf);
+  } while(nread);
+
+  url_fclose(handle);
+
+  fclose(outf);
+
+
+  /* Test rewind */
+  outf = fopen(REWINDFILE, "wb+");
+  if(!outf) {
+    perror("couldn't open fread output file\n");
+    return 1;
+  }
+
+  handle = url_fopen("testfile", "r");
+  if(!handle) {
+    printf("couldn't url_fopen() testfile\n");
+    fclose(outf);
+    return 2;
+  }
+
+  nread = url_fread(buffer, 1, sizeof(buffer), handle);
+  fwrite(buffer, 1, nread, outf);
+  url_rewind(handle);
+
+  buffer[0]='\n';
+  fwrite(buffer, 1, 1, outf);
+
+  nread = url_fread(buffer, 1, sizeof(buffer), handle);
+  fwrite(buffer, 1, nread, outf);
+
+  url_fclose(handle);
+
+  fclose(outf);
+
+  return 0;/* all done */
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/ftp-wildcard.c b/components/cronet/third_party/curl_headers/docs/examples/ftp-wildcard.c
new file mode 100644
index 0000000..f249bc1
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/ftp-wildcard.c
@@ -0,0 +1,152 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * FTP wildcard pattern matching
+ * </DESC>
+ */
+#include <curl/curl.h>
+#include <stdio.h>
+
+struct callback_data {
+  FILE *output;
+};
+
+static long file_is_coming(struct curl_fileinfo *finfo,
+                           struct callback_data *data,
+                           int remains);
+
+static long file_is_downloaded(struct callback_data *data);
+
+static size_t write_it(char *buff, size_t size, size_t nmemb,
+                       void *cb_data);
+
+int main(int argc, char **argv)
+{
+  int rc = CURLE_OK;
+
+  /* curl easy handle */
+  CURL *handle;
+
+  /* help data */
+  struct callback_data data = { 0 };
+
+  /* global initialization */
+  rc = curl_global_init(CURL_GLOBAL_ALL);
+  if(rc)
+    return rc;
+
+  /* initialization of easy handle */
+  handle = curl_easy_init();
+  if(!handle) {
+    curl_global_cleanup();
+    return CURLE_OUT_OF_MEMORY;
+  }
+
+  /* turn on wildcard matching */
+  curl_easy_setopt(handle, CURLOPT_WILDCARDMATCH, 1L);
+
+  /* callback is called before download of concrete file started */
+  curl_easy_setopt(handle, CURLOPT_CHUNK_BGN_FUNCTION, file_is_coming);
+
+  /* callback is called after data from the file have been transferred */
+  curl_easy_setopt(handle, CURLOPT_CHUNK_END_FUNCTION, file_is_downloaded);
+
+  /* this callback will write contents into files */
+  curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, write_it);
+
+  /* put transfer data into callbacks */
+  curl_easy_setopt(handle, CURLOPT_CHUNK_DATA, &data);
+  curl_easy_setopt(handle, CURLOPT_WRITEDATA, &data);
+
+  /* curl_easy_setopt(handle, CURLOPT_VERBOSE, 1L); */
+
+  /* set an URL containing wildcard pattern (only in the last part) */
+  if(argc == 2)
+    curl_easy_setopt(handle, CURLOPT_URL, argv[1]);
+  else
+    curl_easy_setopt(handle, CURLOPT_URL, "ftp://example.com/test/*");
+
+  /* and start transfer! */
+  rc = curl_easy_perform(handle);
+
+  curl_easy_cleanup(handle);
+  curl_global_cleanup();
+  return rc;
+}
+
+static long file_is_coming(struct curl_fileinfo *finfo,
+                           struct callback_data *data,
+                           int remains)
+{
+  printf("%3d %40s %10luB ", remains, finfo->filename,
+         (unsigned long)finfo->size);
+
+  switch(finfo->filetype) {
+  case CURLFILETYPE_DIRECTORY:
+    printf(" DIR\n");
+    break;
+  case CURLFILETYPE_FILE:
+    printf("FILE ");
+    break;
+  default:
+    printf("OTHER\n");
+    break;
+  }
+
+  if(finfo->filetype == CURLFILETYPE_FILE) {
+    /* do not transfer files >= 50B */
+    if(finfo->size > 50) {
+      printf("SKIPPED\n");
+      return CURL_CHUNK_BGN_FUNC_SKIP;
+    }
+
+    data->output = fopen(finfo->filename, "wb");
+    if(!data->output) {
+      return CURL_CHUNK_BGN_FUNC_FAIL;
+    }
+  }
+
+  return CURL_CHUNK_BGN_FUNC_OK;
+}
+
+static long file_is_downloaded(struct callback_data *data)
+{
+  if(data->output) {
+    printf("DOWNLOADED\n");
+    fclose(data->output);
+    data->output = 0x0;
+  }
+  return CURL_CHUNK_END_FUNC_OK;
+}
+
+static size_t write_it(char *buff, size_t size, size_t nmemb,
+                       void *cb_data)
+{
+  struct callback_data *data = cb_data;
+  size_t written = 0;
+  if(data->output)
+    written = fwrite(buff, size, nmemb, data->output);
+  else
+    /* listing output */
+    written = fwrite(buff, size, nmemb, stdout);
+  return written;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/ftpget.c b/components/cronet/third_party/curl_headers/docs/examples/ftpget.c
new file mode 100644
index 0000000..fc7ab4a39
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/ftpget.c
@@ -0,0 +1,92 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include <stdio.h>
+
+#include <curl/curl.h>
+
+/* <DESC>
+ * Get a single file from an FTP server.
+ * </DESC>
+ */
+
+struct FtpFile {
+  const char *filename;
+  FILE *stream;
+};
+
+static size_t my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream)
+{
+  struct FtpFile *out = (struct FtpFile *)stream;
+  if(!out->stream) {
+    /* open file for writing */
+    out->stream = fopen(out->filename, "wb");
+    if(!out->stream)
+      return -1; /* failure, can't open file to write */
+  }
+  return fwrite(buffer, size, nmemb, out->stream);
+}
+
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+  struct FtpFile ftpfile = {
+    "curl.tar.gz", /* name to store the file as if successful */
+    NULL
+  };
+
+  curl_global_init(CURL_GLOBAL_DEFAULT);
+
+  curl = curl_easy_init();
+  if(curl) {
+    /*
+     * You better replace the URL with one that works!
+     */
+    curl_easy_setopt(curl, CURLOPT_URL,
+                     "ftp://ftp.example.com/curl/curl-7.9.2.tar.gz");
+    /* Define our callback to get called when there's data to be written */
+    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
+    /* Set a pointer to our struct to pass to the callback */
+    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);
+
+    /* Switch on full protocol/debug output */
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+    res = curl_easy_perform(curl);
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+
+    if(CURLE_OK != res) {
+      /* we failed */
+      fprintf(stderr, "curl told us %d\n", res);
+    }
+  }
+
+  if(ftpfile.stream)
+    fclose(ftpfile.stream); /* close the local file */
+
+  curl_global_cleanup();
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/ftpgetinfo.c b/components/cronet/third_party/curl_headers/docs/examples/ftpgetinfo.c
new file mode 100644
index 0000000..db16408d
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/ftpgetinfo.c
@@ -0,0 +1,90 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include <stdio.h>
+#include <string.h>
+
+#include <curl/curl.h>
+
+/* <DESC>
+ * Checks a single file's size and mtime from an FTP server.
+ * </DESC>
+ */
+
+static size_t throw_away(void *ptr, size_t size, size_t nmemb, void *data)
+{
+  (void)ptr;
+  (void)data;
+  /* we are not interested in the headers itself,
+     so we only return the size we would have saved ... */
+  return (size_t)(size * nmemb);
+}
+
+int main(void)
+{
+  char ftpurl[] = "ftp://ftp.example.com/gnu/binutils/binutils-2.19.1.tar.bz2";
+  CURL *curl;
+  CURLcode res;
+  long filetime = -1;
+  double filesize = 0.0;
+  const char *filename = strrchr(ftpurl, '/') + 1;
+
+  curl_global_init(CURL_GLOBAL_DEFAULT);
+
+  curl = curl_easy_init();
+  if(curl) {
+    curl_easy_setopt(curl, CURLOPT_URL, ftpurl);
+    /* No download if the file */
+    curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
+    /* Ask for filetime */
+    curl_easy_setopt(curl, CURLOPT_FILETIME, 1L);
+    curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, throw_away);
+    curl_easy_setopt(curl, CURLOPT_HEADER, 0L);
+    /* Switch on full protocol/debug output */
+    /* curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); */
+
+    res = curl_easy_perform(curl);
+
+    if(CURLE_OK == res) {
+      /* https://curl.haxx.se/libcurl/c/curl_easy_getinfo.html */
+      res = curl_easy_getinfo(curl, CURLINFO_FILETIME, &filetime);
+      if((CURLE_OK == res) && (filetime >= 0)) {
+        time_t file_time = (time_t)filetime;
+        printf("filetime %s: %s", filename, ctime(&file_time));
+      }
+      res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD,
+                              &filesize);
+      if((CURLE_OK == res) && (filesize>0.0))
+        printf("filesize %s: %0.0f bytes\n", filename, filesize);
+    }
+    else {
+      /* we failed */
+      fprintf(stderr, "curl told us %d\n", res);
+    }
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  curl_global_cleanup();
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/ftpgetresp.c b/components/cronet/third_party/curl_headers/docs/examples/ftpgetresp.c
new file mode 100644
index 0000000..7dc34407
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/ftpgetresp.c
@@ -0,0 +1,77 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include <stdio.h>
+
+#include <curl/curl.h>
+
+/* <DESC>
+ * Similar to ftpget.c but also stores the received response-lines
+ * in a separate file using our own callback!
+ * </DESC>
+ */
+static size_t
+write_response(void *ptr, size_t size, size_t nmemb, void *data)
+{
+  FILE *writehere = (FILE *)data;
+  return fwrite(ptr, size, nmemb, writehere);
+}
+
+#define FTPBODY "ftp-list"
+#define FTPHEADERS "ftp-responses"
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+  FILE *ftpfile;
+  FILE *respfile;
+
+  /* local file name to store the file as */
+  ftpfile = fopen(FTPBODY, "wb"); /* b is binary, needed on win32 */
+
+  /* local file name to store the FTP server's response lines in */
+  respfile = fopen(FTPHEADERS, "wb"); /* b is binary, needed on win32 */
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Get a file listing from sunet */
+    curl_easy_setopt(curl, CURLOPT_URL, "ftp://ftp.example.com/");
+    curl_easy_setopt(curl, CURLOPT_WRITEDATA, ftpfile);
+    /* If you intend to use this on windows with a libcurl DLL, you must use
+       CURLOPT_WRITEFUNCTION as well */
+    curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, write_response);
+    curl_easy_setopt(curl, CURLOPT_HEADERDATA, respfile);
+    res = curl_easy_perform(curl);
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  fclose(ftpfile); /* close the local file */
+  fclose(respfile); /* close the response file */
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/ftpsget.c b/components/cronet/third_party/curl_headers/docs/examples/ftpsget.c
new file mode 100644
index 0000000..91162e62
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/ftpsget.c
@@ -0,0 +1,99 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include <stdio.h>
+
+#include <curl/curl.h>
+
+/* <DESC>
+ * Get a single file from an FTPS server.
+ * </DESC>
+ */
+
+struct FtpFile {
+  const char *filename;
+  FILE *stream;
+};
+
+static size_t my_fwrite(void *buffer, size_t size, size_t nmemb,
+                        void *stream)
+{
+  struct FtpFile *out = (struct FtpFile *)stream;
+  if(!out->stream) {
+    /* open file for writing */
+    out->stream = fopen(out->filename, "wb");
+    if(!out->stream)
+      return -1; /* failure, can't open file to write */
+  }
+  return fwrite(buffer, size, nmemb, out->stream);
+}
+
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+  struct FtpFile ftpfile = {
+    "yourfile.bin", /* name to store the file as if successful */
+    NULL
+  };
+
+  curl_global_init(CURL_GLOBAL_DEFAULT);
+
+  curl = curl_easy_init();
+  if(curl) {
+    /*
+     * You better replace the URL with one that works! Note that we use an
+     * FTP:// URL with standard explicit FTPS. You can also do FTPS:// URLs if
+     * you want to do the rarer kind of transfers: implicit.
+     */
+    curl_easy_setopt(curl, CURLOPT_URL,
+                     "ftp://user@server/home/user/file.txt");
+    /* Define our callback to get called when there's data to be written */
+    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
+    /* Set a pointer to our struct to pass to the callback */
+    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);
+
+    /* We activate SSL and we require it for both control and data */
+    curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL);
+
+    /* Switch on full protocol/debug output */
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+    res = curl_easy_perform(curl);
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+
+    if(CURLE_OK != res) {
+      /* we failed */
+      fprintf(stderr, "curl told us %d\n", res);
+    }
+  }
+
+  if(ftpfile.stream)
+    fclose(ftpfile.stream); /* close the local file */
+
+  curl_global_cleanup();
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/ftpupload.c b/components/cronet/third_party/curl_headers/docs/examples/ftpupload.c
new file mode 100644
index 0000000..bd77bb1
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/ftpupload.c
@@ -0,0 +1,139 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include <stdio.h>
+#include <string.h>
+
+#include <curl/curl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#ifdef WIN32
+#include <io.h>
+#else
+#include <unistd.h>
+#endif
+
+/* <DESC>
+ * Performs an FTP upload and renames the file just after a successful
+ * transfer.
+ * </DESC>
+ */
+
+#define LOCAL_FILE      "/tmp/uploadthis.txt"
+#define UPLOAD_FILE_AS  "while-uploading.txt"
+#define REMOTE_URL      "ftp://example.com/"  UPLOAD_FILE_AS
+#define RENAME_FILE_TO  "renamed-and-fine.txt"
+
+/* NOTE: if you want this example to work on Windows with libcurl as a
+   DLL, you MUST also provide a read callback with CURLOPT_READFUNCTION.
+   Failing to do so will give you a crash since a DLL may not use the
+   variable's memory when passed in to it from an app like this. */
+static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
+{
+  curl_off_t nread;
+  /* in real-world cases, this would probably get this data differently
+     as this fread() stuff is exactly what the library already would do
+     by default internally */
+  size_t retcode = fread(ptr, size, nmemb, stream);
+
+  nread = (curl_off_t)retcode;
+
+  fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
+          " bytes from file\n", nread);
+  return retcode;
+}
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+  FILE *hd_src;
+  struct stat file_info;
+  curl_off_t fsize;
+
+  struct curl_slist *headerlist = NULL;
+  static const char buf_1 [] = "RNFR " UPLOAD_FILE_AS;
+  static const char buf_2 [] = "RNTO " RENAME_FILE_TO;
+
+  /* get the file size of the local file */
+  if(stat(LOCAL_FILE, &file_info)) {
+    printf("Couldn't open '%s': %s\n", LOCAL_FILE, strerror(errno));
+    return 1;
+  }
+  fsize = (curl_off_t)file_info.st_size;
+
+  printf("Local file size: %" CURL_FORMAT_CURL_OFF_T " bytes.\n", fsize);
+
+  /* get a FILE * of the same file */
+  hd_src = fopen(LOCAL_FILE, "rb");
+
+  /* In windows, this will init the winsock stuff */
+  curl_global_init(CURL_GLOBAL_ALL);
+
+  /* get a curl handle */
+  curl = curl_easy_init();
+  if(curl) {
+    /* build a list of commands to pass to libcurl */
+    headerlist = curl_slist_append(headerlist, buf_1);
+    headerlist = curl_slist_append(headerlist, buf_2);
+
+    /* we want to use our own read function */
+    curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
+
+    /* enable uploading */
+    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+
+    /* specify target */
+    curl_easy_setopt(curl, CURLOPT_URL, REMOTE_URL);
+
+    /* pass in that last of FTP commands to run after the transfer */
+    curl_easy_setopt(curl, CURLOPT_POSTQUOTE, headerlist);
+
+    /* now specify which file to upload */
+    curl_easy_setopt(curl, CURLOPT_READDATA, hd_src);
+
+    /* Set the size of the file to upload (optional).  If you give a *_LARGE
+       option you MUST make sure that the type of the passed-in argument is a
+       curl_off_t. If you use CURLOPT_INFILESIZE (without _LARGE) you must
+       make sure that to pass in a type 'long' argument. */
+    curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE,
+                     (curl_off_t)fsize);
+
+    /* Now run off and do what you've been told! */
+    res = curl_easy_perform(curl);
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* clean up the FTP commands list */
+    curl_slist_free_all(headerlist);
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+  fclose(hd_src); /* close the local file */
+
+  curl_global_cleanup();
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/ftpuploadfrommem.c b/components/cronet/third_party/curl_headers/docs/examples/ftpuploadfrommem.c
new file mode 100644
index 0000000..134cda3
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/ftpuploadfrommem.c
@@ -0,0 +1,124 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * FTP upload a file from memory
+ * </DESC>
+ */
+#include <stdio.h>
+#include <string.h>
+#include <curl/curl.h>
+
+static const char data[]=
+  "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
+  "Nam rhoncus odio id venenatis volutpat. Vestibulum dapibus "
+  "bibendum ullamcorper. Maecenas finibus elit augue, vel "
+  "condimentum odio maximus nec. In hac habitasse platea dictumst. "
+  "Vestibulum vel dolor et turpis rutrum finibus ac at nulla. "
+  "Vivamus nec neque ac elit blandit pretium vitae maximus ipsum. "
+  "Quisque sodales magna vel erat auctor, sed pellentesque nisi "
+  "rhoncus. Donec vehicula maximus pretium. Aliquam eu tincidunt "
+  "lorem.";
+
+struct WriteThis {
+  const char *readptr;
+  size_t sizeleft;
+};
+
+static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
+{
+  struct WriteThis *upload = (struct WriteThis *)userp;
+  size_t max = size*nmemb;
+
+  if(max < 1)
+    return 0;
+
+  if(upload->sizeleft) {
+    size_t copylen = max;
+    if(copylen > upload->sizeleft)
+      copylen = upload->sizeleft;
+    memcpy(ptr, upload->readptr, copylen);
+    upload->readptr += copylen;
+    upload->sizeleft -= copylen;
+    return copylen;
+  }
+
+  return 0;                          /* no more data left to deliver */
+}
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+
+  struct WriteThis upload;
+
+  upload.readptr = data;
+  upload.sizeleft = strlen(data);
+
+  /* In windows, this will init the winsock stuff */
+  res = curl_global_init(CURL_GLOBAL_DEFAULT);
+  /* Check for errors */
+  if(res != CURLE_OK) {
+    fprintf(stderr, "curl_global_init() failed: %s\n",
+            curl_easy_strerror(res));
+    return 1;
+  }
+
+  /* get a curl handle */
+  curl = curl_easy_init();
+  if(curl) {
+    /* First set the URL, the target file */
+    curl_easy_setopt(curl, CURLOPT_URL,
+                     "ftp://example.com/path/to/upload/file");
+
+    /* User and password for the FTP login */
+    curl_easy_setopt(curl, CURLOPT_USERPWD, "login:secret");
+
+    /* Now specify we want to UPLOAD data */
+    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+
+    /* we want to use our own read function */
+    curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
+
+    /* pointer to pass to our read function */
+    curl_easy_setopt(curl, CURLOPT_READDATA, &upload);
+
+    /* get verbose debug output please */
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+    /* Set the expected upload size. */
+    curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE,
+                     (curl_off_t)upload.sizeleft);
+
+    /* Perform the request, res will get the return code */
+    res = curl_easy_perform(curl);
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+  curl_global_cleanup();
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/ftpuploadresume.c b/components/cronet/third_party/curl_headers/docs/examples/ftpuploadresume.c
new file mode 100644
index 0000000..fc7f803
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/ftpuploadresume.c
@@ -0,0 +1,161 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Upload to FTP, resuming failed transfers.
+ * </DESC>
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* parse headers for Content-Length */
+static size_t getcontentlengthfunc(void *ptr, size_t size, size_t nmemb,
+                                   void *stream)
+{
+  int r;
+  long len = 0;
+
+  r = sscanf(ptr, "Content-Length: %ld\n", &len);
+  if(r)
+    *((long *) stream) = len;
+
+  return size * nmemb;
+}
+
+/* discard downloaded data */
+static size_t discardfunc(void *ptr, size_t size, size_t nmemb, void *stream)
+{
+  (void)ptr;
+  (void)stream;
+  return size * nmemb;
+}
+
+/* read data to upload */
+static size_t readfunc(void *ptr, size_t size, size_t nmemb, void *stream)
+{
+  FILE *f = stream;
+  size_t n;
+
+  if(ferror(f))
+    return CURL_READFUNC_ABORT;
+
+  n = fread(ptr, size, nmemb, f) * size;
+
+  return n;
+}
+
+
+static int upload(CURL *curlhandle, const char *remotepath,
+                  const char *localpath, long timeout, long tries)
+{
+  FILE *f;
+  long uploaded_len = 0;
+  CURLcode r = CURLE_GOT_NOTHING;
+  int c;
+
+  f = fopen(localpath, "rb");
+  if(!f) {
+    perror(NULL);
+    return 0;
+  }
+
+  curl_easy_setopt(curlhandle, CURLOPT_UPLOAD, 1L);
+
+  curl_easy_setopt(curlhandle, CURLOPT_URL, remotepath);
+
+  if(timeout)
+    curl_easy_setopt(curlhandle, CURLOPT_FTP_RESPONSE_TIMEOUT, timeout);
+
+  curl_easy_setopt(curlhandle, CURLOPT_HEADERFUNCTION, getcontentlengthfunc);
+  curl_easy_setopt(curlhandle, CURLOPT_HEADERDATA, &uploaded_len);
+
+  curl_easy_setopt(curlhandle, CURLOPT_WRITEFUNCTION, discardfunc);
+
+  curl_easy_setopt(curlhandle, CURLOPT_READFUNCTION, readfunc);
+  curl_easy_setopt(curlhandle, CURLOPT_READDATA, f);
+
+  /* disable passive mode */
+  curl_easy_setopt(curlhandle, CURLOPT_FTPPORT, "-");
+  curl_easy_setopt(curlhandle, CURLOPT_FTP_CREATE_MISSING_DIRS, 1L);
+
+  curl_easy_setopt(curlhandle, CURLOPT_VERBOSE, 1L);
+
+  for(c = 0; (r != CURLE_OK) && (c < tries); c++) {
+    /* are we resuming? */
+    if(c) { /* yes */
+      /* determine the length of the file already written */
+
+      /*
+       * With NOBODY and NOHEADER, libcurl will issue a SIZE
+       * command, but the only way to retrieve the result is
+       * to parse the returned Content-Length header. Thus,
+       * getcontentlengthfunc(). We need discardfunc() above
+       * because HEADER will dump the headers to stdout
+       * without it.
+       */
+      curl_easy_setopt(curlhandle, CURLOPT_NOBODY, 1L);
+      curl_easy_setopt(curlhandle, CURLOPT_HEADER, 1L);
+
+      r = curl_easy_perform(curlhandle);
+      if(r != CURLE_OK)
+        continue;
+
+      curl_easy_setopt(curlhandle, CURLOPT_NOBODY, 0L);
+      curl_easy_setopt(curlhandle, CURLOPT_HEADER, 0L);
+
+      fseek(f, uploaded_len, SEEK_SET);
+
+      curl_easy_setopt(curlhandle, CURLOPT_APPEND, 1L);
+    }
+    else { /* no */
+      curl_easy_setopt(curlhandle, CURLOPT_APPEND, 0L);
+    }
+
+    r = curl_easy_perform(curlhandle);
+  }
+
+  fclose(f);
+
+  if(r == CURLE_OK)
+    return 1;
+  else {
+    fprintf(stderr, "%s\n", curl_easy_strerror(r));
+    return 0;
+  }
+}
+
+int main(void)
+{
+  CURL *curlhandle = NULL;
+
+  curl_global_init(CURL_GLOBAL_ALL);
+  curlhandle = curl_easy_init();
+
+  upload(curlhandle, "ftp://user:pass@example.com/path/file", "C:\\file",
+         0, 3);
+
+  curl_easy_cleanup(curlhandle);
+  curl_global_cleanup();
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/getinfo.c b/components/cronet/third_party/curl_headers/docs/examples/getinfo.c
new file mode 100644
index 0000000..d5a820d
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/getinfo.c
@@ -0,0 +1,52 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Use getinfo to get content-type after completed transfer.
+ * </DESC>
+ */
+#include <stdio.h>
+#include <curl/curl.h>
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+
+  curl = curl_easy_init();
+  if(curl) {
+    curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/");
+    res = curl_easy_perform(curl);
+
+    if(CURLE_OK == res) {
+      char *ct;
+      /* ask for the content-type */
+      res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);
+
+      if((CURLE_OK == res) && ct)
+        printf("We received Content-Type: %s\n", ct);
+    }
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/getinmemory.c b/components/cronet/third_party/curl_headers/docs/examples/getinmemory.c
new file mode 100644
index 0000000..130d821
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/getinmemory.c
@@ -0,0 +1,116 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Shows how the write callback function can be used to download data into a
+ * chunk of memory instead of storing it in a file.
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <curl/curl.h>
+
+struct MemoryStruct {
+  char *memory;
+  size_t size;
+};
+
+static size_t
+WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
+{
+  size_t realsize = size * nmemb;
+  struct MemoryStruct *mem = (struct MemoryStruct *)userp;
+
+  char *ptr = realloc(mem->memory, mem->size + realsize + 1);
+  if(ptr == NULL) {
+    /* out of memory! */
+    printf("not enough memory (realloc returned NULL)\n");
+    return 0;
+  }
+
+  mem->memory = ptr;
+  memcpy(&(mem->memory[mem->size]), contents, realsize);
+  mem->size += realsize;
+  mem->memory[mem->size] = 0;
+
+  return realsize;
+}
+
+int main(void)
+{
+  CURL *curl_handle;
+  CURLcode res;
+
+  struct MemoryStruct chunk;
+
+  chunk.memory = malloc(1);  /* will be grown as needed by the realloc above */
+  chunk.size = 0;    /* no data at this point */
+
+  curl_global_init(CURL_GLOBAL_ALL);
+
+  /* init the curl session */
+  curl_handle = curl_easy_init();
+
+  /* specify URL to get */
+  curl_easy_setopt(curl_handle, CURLOPT_URL, "https://www.example.com/");
+
+  /* send all data to this function  */
+  curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
+
+  /* we pass our 'chunk' struct to the callback function */
+  curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
+
+  /* some servers don't like requests that are made without a user-agent
+     field, so we provide one */
+  curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
+
+  /* get it! */
+  res = curl_easy_perform(curl_handle);
+
+  /* check for errors */
+  if(res != CURLE_OK) {
+    fprintf(stderr, "curl_easy_perform() failed: %s\n",
+            curl_easy_strerror(res));
+  }
+  else {
+    /*
+     * Now, our chunk.memory points to a memory block that is chunk.size
+     * bytes big and contains the remote file.
+     *
+     * Do something nice with it!
+     */
+
+    printf("%lu bytes retrieved\n", (unsigned long)chunk.size);
+  }
+
+  /* cleanup curl stuff */
+  curl_easy_cleanup(curl_handle);
+
+  free(chunk.memory);
+
+  /* we're done with libcurl, so clean it up */
+  curl_global_cleanup();
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/getredirect.c b/components/cronet/third_party/curl_headers/docs/examples/getredirect.c
new file mode 100644
index 0000000..64157f9c
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/getredirect.c
@@ -0,0 +1,70 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Show how to extract Location: header and URL to redirect to.
+ * </DESC>
+ */
+#include <stdio.h>
+#include <curl/curl.h>
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+  char *location;
+  long response_code;
+
+  curl = curl_easy_init();
+  if(curl) {
+    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+    /* example.com is redirected, figure out the redirection! */
+
+    /* Perform the request, res will get the return code */
+    res = curl_easy_perform(curl);
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+    else {
+      res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
+      if((res == CURLE_OK) &&
+         ((response_code / 100) != 3)) {
+        /* a redirect implies a 3xx response code */
+        fprintf(stderr, "Not a redirect.\n");
+      }
+      else {
+        res = curl_easy_getinfo(curl, CURLINFO_REDIRECT_URL, &location);
+
+        if((res == CURLE_OK) && location) {
+          /* This is the new absolute URL that you could redirect to, even if
+           * the Location: response header may have been a relative URL. */
+          printf("Redirected to: %s\n", location);
+        }
+      }
+    }
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/ghiper.c b/components/cronet/third_party/curl_headers/docs/examples/ghiper.c
new file mode 100644
index 0000000..1fa3b59
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/ghiper.c
@@ -0,0 +1,436 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * multi socket API usage together with with glib2
+ * </DESC>
+ */
+/* Example application source code using the multi socket interface to
+ * download many files at once.
+ *
+ * Written by Jeff Pohlmeyer
+
+ Requires glib-2.x and a (POSIX?) system that has mkfifo().
+
+ This is an adaptation of libcurl's "hipev.c" and libevent's "event-test.c"
+ sample programs, adapted to use glib's g_io_channel in place of libevent.
+
+ When running, the program creates the named pipe "hiper.fifo"
+
+ Whenever there is input into the fifo, the program reads the input as a list
+ of URL's and creates some new easy handles to fetch each URL via the
+ curl_multi "hiper" API.
+
+
+ Thus, you can try a single URL:
+ % echo http://www.yahoo.com > hiper.fifo
+
+ Or a whole bunch of them:
+ % cat my-url-list > hiper.fifo
+
+ The fifo buffer is handled almost instantly, so you can even add more URL's
+ while the previous requests are still being downloaded.
+
+ This is purely a demo app, all retrieved data is simply discarded by the write
+ callback.
+
+*/
+
+#include <glib.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <curl/curl.h>
+
+#define MSG_OUT g_print   /* Change to "g_error" to write to stderr */
+#define SHOW_VERBOSE 0    /* Set to non-zero for libcurl messages */
+#define SHOW_PROGRESS 0   /* Set to non-zero to enable progress callback */
+
+/* Global information, common to all connections */
+typedef struct _GlobalInfo {
+  CURLM *multi;
+  guint timer_event;
+  int still_running;
+} GlobalInfo;
+
+/* Information associated with a specific easy handle */
+typedef struct _ConnInfo {
+  CURL *easy;
+  char *url;
+  GlobalInfo *global;
+  char error[CURL_ERROR_SIZE];
+} ConnInfo;
+
+/* Information associated with a specific socket */
+typedef struct _SockInfo {
+  curl_socket_t sockfd;
+  CURL *easy;
+  int action;
+  long timeout;
+  GIOChannel *ch;
+  guint ev;
+  GlobalInfo *global;
+} SockInfo;
+
+/* Die if we get a bad CURLMcode somewhere */
+static void mcode_or_die(const char *where, CURLMcode code)
+{
+  if(CURLM_OK != code) {
+    const char *s;
+    switch(code) {
+    case     CURLM_BAD_HANDLE:         s = "CURLM_BAD_HANDLE";         break;
+    case     CURLM_BAD_EASY_HANDLE:    s = "CURLM_BAD_EASY_HANDLE";    break;
+    case     CURLM_OUT_OF_MEMORY:      s = "CURLM_OUT_OF_MEMORY";      break;
+    case     CURLM_INTERNAL_ERROR:     s = "CURLM_INTERNAL_ERROR";     break;
+    case     CURLM_BAD_SOCKET:         s = "CURLM_BAD_SOCKET";         break;
+    case     CURLM_UNKNOWN_OPTION:     s = "CURLM_UNKNOWN_OPTION";     break;
+    case     CURLM_LAST:               s = "CURLM_LAST";               break;
+    default: s = "CURLM_unknown";
+    }
+    MSG_OUT("ERROR: %s returns %s\n", where, s);
+    exit(code);
+  }
+}
+
+/* Check for completed transfers, and remove their easy handles */
+static void check_multi_info(GlobalInfo *g)
+{
+  char *eff_url;
+  CURLMsg *msg;
+  int msgs_left;
+  ConnInfo *conn;
+  CURL *easy;
+  CURLcode res;
+
+  MSG_OUT("REMAINING: %d\n", g->still_running);
+  while((msg = curl_multi_info_read(g->multi, &msgs_left))) {
+    if(msg->msg == CURLMSG_DONE) {
+      easy = msg->easy_handle;
+      res = msg->data.result;
+      curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
+      curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
+      MSG_OUT("DONE: %s => (%d) %s\n", eff_url, res, conn->error);
+      curl_multi_remove_handle(g->multi, easy);
+      free(conn->url);
+      curl_easy_cleanup(easy);
+      free(conn);
+    }
+  }
+}
+
+/* Called by glib when our timeout expires */
+static gboolean timer_cb(gpointer data)
+{
+  GlobalInfo *g = (GlobalInfo *)data;
+  CURLMcode rc;
+
+  rc = curl_multi_socket_action(g->multi,
+                                CURL_SOCKET_TIMEOUT, 0, &g->still_running);
+  mcode_or_die("timer_cb: curl_multi_socket_action", rc);
+  check_multi_info(g);
+  return FALSE;
+}
+
+/* Update the event timer after curl_multi library calls */
+static int update_timeout_cb(CURLM *multi, long timeout_ms, void *userp)
+{
+  struct timeval timeout;
+  GlobalInfo *g = (GlobalInfo *)userp;
+  timeout.tv_sec = timeout_ms/1000;
+  timeout.tv_usec = (timeout_ms%1000)*1000;
+
+  MSG_OUT("*** update_timeout_cb %ld => %ld:%ld ***\n",
+          timeout_ms, timeout.tv_sec, timeout.tv_usec);
+
+  /*
+   * if timeout_ms is -1, just delete the timer
+   *
+   * For other values of timeout_ms, this should set or *update* the timer to
+   * the new value
+   */
+  if(timeout_ms >= 0)
+    g->timer_event = g_timeout_add(timeout_ms, timer_cb, g);
+  return 0;
+}
+
+/* Called by glib when we get action on a multi socket */
+static gboolean event_cb(GIOChannel *ch, GIOCondition condition, gpointer data)
+{
+  GlobalInfo *g = (GlobalInfo*) data;
+  CURLMcode rc;
+  int fd = g_io_channel_unix_get_fd(ch);
+
+  int action =
+    ((condition & G_IO_IN) ? CURL_CSELECT_IN : 0) |
+    ((condition & G_IO_OUT) ? CURL_CSELECT_OUT : 0);
+
+  rc = curl_multi_socket_action(g->multi, fd, action, &g->still_running);
+  mcode_or_die("event_cb: curl_multi_socket_action", rc);
+
+  check_multi_info(g);
+  if(g->still_running) {
+    return TRUE;
+  }
+  else {
+    MSG_OUT("last transfer done, kill timeout\n");
+    if(g->timer_event) {
+      g_source_remove(g->timer_event);
+    }
+    return FALSE;
+  }
+}
+
+/* Clean up the SockInfo structure */
+static void remsock(SockInfo *f)
+{
+  if(!f) {
+    return;
+  }
+  if(f->ev) {
+    g_source_remove(f->ev);
+  }
+  g_free(f);
+}
+
+/* Assign information to a SockInfo structure */
+static void setsock(SockInfo *f, curl_socket_t s, CURL *e, int act,
+                    GlobalInfo *g)
+{
+  GIOCondition kind =
+    ((act & CURL_POLL_IN) ? G_IO_IN : 0) |
+    ((act & CURL_POLL_OUT) ? G_IO_OUT : 0);
+
+  f->sockfd = s;
+  f->action = act;
+  f->easy = e;
+  if(f->ev) {
+    g_source_remove(f->ev);
+  }
+  f->ev = g_io_add_watch(f->ch, kind, event_cb, g);
+}
+
+/* Initialize a new SockInfo structure */
+static void addsock(curl_socket_t s, CURL *easy, int action, GlobalInfo *g)
+{
+  SockInfo *fdp = g_malloc0(sizeof(SockInfo));
+
+  fdp->global = g;
+  fdp->ch = g_io_channel_unix_new(s);
+  setsock(fdp, s, easy, action, g);
+  curl_multi_assign(g->multi, s, fdp);
+}
+
+/* CURLMOPT_SOCKETFUNCTION */
+static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
+{
+  GlobalInfo *g = (GlobalInfo*) cbp;
+  SockInfo *fdp = (SockInfo*) sockp;
+  static const char *whatstr[]={ "none", "IN", "OUT", "INOUT", "REMOVE" };
+
+  MSG_OUT("socket callback: s=%d e=%p what=%s ", s, e, whatstr[what]);
+  if(what == CURL_POLL_REMOVE) {
+    MSG_OUT("\n");
+    remsock(fdp);
+  }
+  else {
+    if(!fdp) {
+      MSG_OUT("Adding data: %s%s\n",
+              (what & CURL_POLL_IN) ? "READ" : "",
+              (what & CURL_POLL_OUT) ? "WRITE" : "");
+      addsock(s, e, what, g);
+    }
+    else {
+      MSG_OUT(
+        "Changing action from %d to %d\n", fdp->action, what);
+      setsock(fdp, s, e, what, g);
+    }
+  }
+  return 0;
+}
+
+/* CURLOPT_WRITEFUNCTION */
+static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data)
+{
+  size_t realsize = size * nmemb;
+  ConnInfo *conn = (ConnInfo*) data;
+  (void)ptr;
+  (void)conn;
+  return realsize;
+}
+
+/* CURLOPT_PROGRESSFUNCTION */
+static int prog_cb(void *p, double dltotal, double dlnow, double ult,
+                   double uln)
+{
+  ConnInfo *conn = (ConnInfo *)p;
+  MSG_OUT("Progress: %s (%g/%g)\n", conn->url, dlnow, dltotal);
+  return 0;
+}
+
+/* Create a new easy handle, and add it to the global curl_multi */
+static void new_conn(char *url, GlobalInfo *g)
+{
+  ConnInfo *conn;
+  CURLMcode rc;
+
+  conn = g_malloc0(sizeof(ConnInfo));
+  conn->error[0]='\0';
+  conn->easy = curl_easy_init();
+  if(!conn->easy) {
+    MSG_OUT("curl_easy_init() failed, exiting!\n");
+    exit(2);
+  }
+  conn->global = g;
+  conn->url = g_strdup(url);
+  curl_easy_setopt(conn->easy, CURLOPT_URL, conn->url);
+  curl_easy_setopt(conn->easy, CURLOPT_WRITEFUNCTION, write_cb);
+  curl_easy_setopt(conn->easy, CURLOPT_WRITEDATA, &conn);
+  curl_easy_setopt(conn->easy, CURLOPT_VERBOSE, (long)SHOW_VERBOSE);
+  curl_easy_setopt(conn->easy, CURLOPT_ERRORBUFFER, conn->error);
+  curl_easy_setopt(conn->easy, CURLOPT_PRIVATE, conn);
+  curl_easy_setopt(conn->easy, CURLOPT_NOPROGRESS, SHOW_PROGRESS?0L:1L);
+  curl_easy_setopt(conn->easy, CURLOPT_PROGRESSFUNCTION, prog_cb);
+  curl_easy_setopt(conn->easy, CURLOPT_PROGRESSDATA, conn);
+  curl_easy_setopt(conn->easy, CURLOPT_FOLLOWLOCATION, 1L);
+  curl_easy_setopt(conn->easy, CURLOPT_CONNECTTIMEOUT, 30L);
+  curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_LIMIT, 1L);
+  curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_TIME, 30L);
+
+  MSG_OUT("Adding easy %p to multi %p (%s)\n", conn->easy, g->multi, url);
+  rc = curl_multi_add_handle(g->multi, conn->easy);
+  mcode_or_die("new_conn: curl_multi_add_handle", rc);
+
+  /* note that the add_handle() will set a time-out to trigger very soon so
+     that the necessary socket_action() call will be called by this app */
+}
+
+/* This gets called by glib whenever data is received from the fifo */
+static gboolean fifo_cb(GIOChannel *ch, GIOCondition condition, gpointer data)
+{
+#define BUF_SIZE 1024
+  gsize len, tp;
+  gchar *buf, *tmp, *all = NULL;
+  GIOStatus rv;
+
+  do {
+    GError *err = NULL;
+    rv = g_io_channel_read_line(ch, &buf, &len, &tp, &err);
+    if(buf) {
+      if(tp) {
+        buf[tp]='\0';
+      }
+      new_conn(buf, (GlobalInfo*)data);
+      g_free(buf);
+    }
+    else {
+      buf = g_malloc(BUF_SIZE + 1);
+      while(TRUE) {
+        buf[BUF_SIZE]='\0';
+        g_io_channel_read_chars(ch, buf, BUF_SIZE, &len, &err);
+        if(len) {
+          buf[len]='\0';
+          if(all) {
+            tmp = all;
+            all = g_strdup_printf("%s%s", tmp, buf);
+            g_free(tmp);
+          }
+          else {
+            all = g_strdup(buf);
+          }
+        }
+        else {
+          break;
+        }
+      }
+      if(all) {
+        new_conn(all, (GlobalInfo*)data);
+        g_free(all);
+      }
+      g_free(buf);
+    }
+    if(err) {
+      g_error("fifo_cb: %s", err->message);
+      g_free(err);
+      break;
+    }
+  } while((len) && (rv == G_IO_STATUS_NORMAL));
+  return TRUE;
+}
+
+int init_fifo(void)
+{
+  struct stat st;
+  const char *fifo = "hiper.fifo";
+  int socket;
+
+  if(lstat (fifo, &st) == 0) {
+    if((st.st_mode & S_IFMT) == S_IFREG) {
+      errno = EEXIST;
+      perror("lstat");
+      exit(1);
+    }
+  }
+
+  unlink(fifo);
+  if(mkfifo (fifo, 0600) == -1) {
+    perror("mkfifo");
+    exit(1);
+  }
+
+  socket = open(fifo, O_RDWR | O_NONBLOCK, 0);
+
+  if(socket == -1) {
+    perror("open");
+    exit(1);
+  }
+  MSG_OUT("Now, pipe some URL's into > %s\n", fifo);
+
+  return socket;
+}
+
+int main(int argc, char **argv)
+{
+  GlobalInfo *g;
+  GMainLoop*gmain;
+  int fd;
+  GIOChannel* ch;
+  g = g_malloc0(sizeof(GlobalInfo));
+
+  fd = init_fifo();
+  ch = g_io_channel_unix_new(fd);
+  g_io_add_watch(ch, G_IO_IN, fifo_cb, g);
+  gmain = g_main_loop_new(NULL, FALSE);
+  g->multi = curl_multi_init();
+  curl_multi_setopt(g->multi, CURLMOPT_SOCKETFUNCTION, sock_cb);
+  curl_multi_setopt(g->multi, CURLMOPT_SOCKETDATA, g);
+  curl_multi_setopt(g->multi, CURLMOPT_TIMERFUNCTION, update_timeout_cb);
+  curl_multi_setopt(g->multi, CURLMOPT_TIMERDATA, g);
+
+  /* we don't call any curl_multi_socket*() function yet as we have no handles
+     added! */
+
+  g_main_loop_run(gmain);
+  curl_multi_cleanup(g->multi);
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/hiperfifo.c b/components/cronet/third_party/curl_headers/docs/examples/hiperfifo.c
new file mode 100644
index 0000000..a50522a
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/hiperfifo.c
@@ -0,0 +1,458 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * multi socket API usage with libevent 2
+ * </DESC>
+ */
+/* Example application source code using the multi socket interface to
+   download many files at once.
+
+Written by Jeff Pohlmeyer
+
+Requires libevent version 2 and a (POSIX?) system that has mkfifo().
+
+This is an adaptation of libcurl's "hipev.c" and libevent's "event-test.c"
+sample programs.
+
+When running, the program creates the named pipe "hiper.fifo"
+
+Whenever there is input into the fifo, the program reads the input as a list
+of URL's and creates some new easy handles to fetch each URL via the
+curl_multi "hiper" API.
+
+
+Thus, you can try a single URL:
+  % echo http://www.yahoo.com > hiper.fifo
+
+Or a whole bunch of them:
+  % cat my-url-list > hiper.fifo
+
+The fifo buffer is handled almost instantly, so you can even add more URL's
+while the previous requests are still being downloaded.
+
+Note:
+  For the sake of simplicity, URL length is limited to 1023 char's !
+
+This is purely a demo app, all retrieved data is simply discarded by the write
+callback.
+
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/time.h>
+#include <time.h>
+#include <unistd.h>
+#include <sys/poll.h>
+#include <curl/curl.h>
+#include <event2/event.h>
+#include <event2/event_struct.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <sys/cdefs.h>
+
+#ifdef __GNUC__
+#define _Unused __attribute__((unused))
+#else
+#define _Unused
+#endif
+
+#define MSG_OUT stdout /* Send info to stdout, change to stderr if you want */
+
+
+/* Global information, common to all connections */
+typedef struct _GlobalInfo
+{
+  struct event_base *evbase;
+  struct event fifo_event;
+  struct event timer_event;
+  CURLM *multi;
+  int still_running;
+  FILE *input;
+  int stopped;
+} GlobalInfo;
+
+
+/* Information associated with a specific easy handle */
+typedef struct _ConnInfo
+{
+  CURL *easy;
+  char *url;
+  GlobalInfo *global;
+  char error[CURL_ERROR_SIZE];
+} ConnInfo;
+
+
+/* Information associated with a specific socket */
+typedef struct _SockInfo
+{
+  curl_socket_t sockfd;
+  CURL *easy;
+  int action;
+  long timeout;
+  struct event ev;
+  GlobalInfo *global;
+} SockInfo;
+
+#define __case(code) \
+  case code: s = __STRING(code)
+
+/* Die if we get a bad CURLMcode somewhere */
+static void mcode_or_die(const char *where, CURLMcode code)
+{
+  if(CURLM_OK != code) {
+    const char *s;
+    switch(code) {
+      __case(CURLM_BAD_HANDLE); break;
+      __case(CURLM_BAD_EASY_HANDLE); break;
+      __case(CURLM_OUT_OF_MEMORY); break;
+      __case(CURLM_INTERNAL_ERROR); break;
+      __case(CURLM_UNKNOWN_OPTION); break;
+      __case(CURLM_LAST); break;
+      default: s = "CURLM_unknown"; break;
+      __case(CURLM_BAD_SOCKET);
+      fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s);
+      /* ignore this error */
+      return;
+    }
+    fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s);
+    exit(code);
+  }
+}
+
+
+/* Update the event timer after curl_multi library calls */
+static int multi_timer_cb(CURLM *multi _Unused, long timeout_ms, GlobalInfo *g)
+{
+  struct timeval timeout;
+
+  timeout.tv_sec = timeout_ms/1000;
+  timeout.tv_usec = (timeout_ms%1000)*1000;
+  fprintf(MSG_OUT, "multi_timer_cb: Setting timeout to %ld ms\n", timeout_ms);
+
+  /*
+   * if timeout_ms is -1, just delete the timer
+   *
+   * For all other values of timeout_ms, this should set or *update* the timer
+   * to the new value
+   */
+  if(timeout_ms == -1)
+    evtimer_del(&g->timer_event);
+  else /* includes timeout zero */
+    evtimer_add(&g->timer_event, &timeout);
+  return 0;
+}
+
+
+/* Check for completed transfers, and remove their easy handles */
+static void check_multi_info(GlobalInfo *g)
+{
+  char *eff_url;
+  CURLMsg *msg;
+  int msgs_left;
+  ConnInfo *conn;
+  CURL *easy;
+  CURLcode res;
+
+  fprintf(MSG_OUT, "REMAINING: %d\n", g->still_running);
+  while((msg = curl_multi_info_read(g->multi, &msgs_left))) {
+    if(msg->msg == CURLMSG_DONE) {
+      easy = msg->easy_handle;
+      res = msg->data.result;
+      curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
+      curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
+      fprintf(MSG_OUT, "DONE: %s => (%d) %s\n", eff_url, res, conn->error);
+      curl_multi_remove_handle(g->multi, easy);
+      free(conn->url);
+      curl_easy_cleanup(easy);
+      free(conn);
+    }
+  }
+  if(g->still_running == 0 && g->stopped)
+    event_base_loopbreak(g->evbase);
+}
+
+
+
+/* Called by libevent when we get action on a multi socket */
+static void event_cb(int fd, short kind, void *userp)
+{
+  GlobalInfo *g = (GlobalInfo*) userp;
+  CURLMcode rc;
+
+  int action =
+    ((kind & EV_READ) ? CURL_CSELECT_IN : 0) |
+    ((kind & EV_WRITE) ? CURL_CSELECT_OUT : 0);
+
+  rc = curl_multi_socket_action(g->multi, fd, action, &g->still_running);
+  mcode_or_die("event_cb: curl_multi_socket_action", rc);
+
+  check_multi_info(g);
+  if(g->still_running <= 0) {
+    fprintf(MSG_OUT, "last transfer done, kill timeout\n");
+    if(evtimer_pending(&g->timer_event, NULL)) {
+      evtimer_del(&g->timer_event);
+    }
+  }
+}
+
+
+
+/* Called by libevent when our timeout expires */
+static void timer_cb(int fd _Unused, short kind _Unused, void *userp)
+{
+  GlobalInfo *g = (GlobalInfo *)userp;
+  CURLMcode rc;
+
+  rc = curl_multi_socket_action(g->multi,
+                                  CURL_SOCKET_TIMEOUT, 0, &g->still_running);
+  mcode_or_die("timer_cb: curl_multi_socket_action", rc);
+  check_multi_info(g);
+}
+
+
+
+/* Clean up the SockInfo structure */
+static void remsock(SockInfo *f)
+{
+  if(f) {
+    event_del(&f->ev);
+    free(f);
+  }
+}
+
+
+
+/* Assign information to a SockInfo structure */
+static void setsock(SockInfo *f, curl_socket_t s, CURL *e, int act,
+                    GlobalInfo *g)
+{
+  int kind =
+     ((act & CURL_POLL_IN) ? EV_READ : 0) |
+     ((act & CURL_POLL_OUT) ? EV_WRITE : 0) | EV_PERSIST;
+
+  f->sockfd = s;
+  f->action = act;
+  f->easy = e;
+  event_del(&f->ev);
+  event_assign(&f->ev, g->evbase, f->sockfd, kind, event_cb, g);
+  event_add(&f->ev, NULL);
+}
+
+
+
+/* Initialize a new SockInfo structure */
+static void addsock(curl_socket_t s, CURL *easy, int action, GlobalInfo *g)
+{
+  SockInfo *fdp = calloc(sizeof(SockInfo), 1);
+
+  fdp->global = g;
+  setsock(fdp, s, easy, action, g);
+  curl_multi_assign(g->multi, s, fdp);
+}
+
+/* CURLMOPT_SOCKETFUNCTION */
+static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
+{
+  GlobalInfo *g = (GlobalInfo*) cbp;
+  SockInfo *fdp = (SockInfo*) sockp;
+  const char *whatstr[]={ "none", "IN", "OUT", "INOUT", "REMOVE" };
+
+  fprintf(MSG_OUT,
+          "socket callback: s=%d e=%p what=%s ", s, e, whatstr[what]);
+  if(what == CURL_POLL_REMOVE) {
+    fprintf(MSG_OUT, "\n");
+    remsock(fdp);
+  }
+  else {
+    if(!fdp) {
+      fprintf(MSG_OUT, "Adding data: %s\n", whatstr[what]);
+      addsock(s, e, what, g);
+    }
+    else {
+      fprintf(MSG_OUT,
+              "Changing action from %s to %s\n",
+              whatstr[fdp->action], whatstr[what]);
+      setsock(fdp, s, e, what, g);
+    }
+  }
+  return 0;
+}
+
+
+
+/* CURLOPT_WRITEFUNCTION */
+static size_t write_cb(void *ptr _Unused, size_t size, size_t nmemb,
+                       void *data)
+{
+  size_t realsize = size * nmemb;
+  (void)_Unused;
+  (void)data;
+
+  return realsize;
+}
+
+
+/* CURLOPT_PROGRESSFUNCTION */
+static int prog_cb(void *p, double dltotal, double dlnow, double ult _Unused,
+                   double uln _Unused)
+{
+  ConnInfo *conn = (ConnInfo *)p;
+
+  fprintf(MSG_OUT, "Progress: %s (%g/%g)\n", conn->url, dlnow, dltotal);
+  return 0;
+}
+
+
+/* Create a new easy handle, and add it to the global curl_multi */
+static void new_conn(char *url, GlobalInfo *g)
+{
+  ConnInfo *conn;
+  CURLMcode rc;
+
+  conn = calloc(1, sizeof(ConnInfo));
+  conn->error[0]='\0';
+
+  conn->easy = curl_easy_init();
+  if(!conn->easy) {
+    fprintf(MSG_OUT, "curl_easy_init() failed, exiting!\n");
+    exit(2);
+  }
+  conn->global = g;
+  conn->url = strdup(url);
+  curl_easy_setopt(conn->easy, CURLOPT_URL, conn->url);
+  curl_easy_setopt(conn->easy, CURLOPT_WRITEFUNCTION, write_cb);
+  curl_easy_setopt(conn->easy, CURLOPT_WRITEDATA, conn);
+  curl_easy_setopt(conn->easy, CURLOPT_VERBOSE, 1L);
+  curl_easy_setopt(conn->easy, CURLOPT_ERRORBUFFER, conn->error);
+  curl_easy_setopt(conn->easy, CURLOPT_PRIVATE, conn);
+  curl_easy_setopt(conn->easy, CURLOPT_NOPROGRESS, 0L);
+  curl_easy_setopt(conn->easy, CURLOPT_PROGRESSFUNCTION, prog_cb);
+  curl_easy_setopt(conn->easy, CURLOPT_PROGRESSDATA, conn);
+  curl_easy_setopt(conn->easy, CURLOPT_FOLLOWLOCATION, 1L);
+  fprintf(MSG_OUT,
+          "Adding easy %p to multi %p (%s)\n", conn->easy, g->multi, url);
+  rc = curl_multi_add_handle(g->multi, conn->easy);
+  mcode_or_die("new_conn: curl_multi_add_handle", rc);
+
+  /* note that the add_handle() will set a time-out to trigger very soon so
+     that the necessary socket_action() call will be called by this app */
+}
+
+/* This gets called whenever data is received from the fifo */
+static void fifo_cb(int fd _Unused, short event _Unused, void *arg)
+{
+  char s[1024];
+  long int rv = 0;
+  int n = 0;
+  GlobalInfo *g = (GlobalInfo *)arg;
+
+  do {
+    s[0]='\0';
+    rv = fscanf(g->input, "%1023s%n", s, &n);
+    s[n]='\0';
+    if(n && s[0]) {
+      if(!strcmp(s, "stop")) {
+        g->stopped = 1;
+        if(g->still_running == 0)
+          event_base_loopbreak(g->evbase);
+      }
+      else
+        new_conn(s, arg);  /* if we read a URL, go get it! */
+    }
+    else
+      break;
+  } while(rv != EOF);
+}
+
+/* Create a named pipe and tell libevent to monitor it */
+static const char *fifo = "hiper.fifo";
+static int init_fifo(GlobalInfo *g)
+{
+  struct stat st;
+  curl_socket_t sockfd;
+
+  fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo);
+  if(lstat (fifo, &st) == 0) {
+    if((st.st_mode & S_IFMT) == S_IFREG) {
+      errno = EEXIST;
+      perror("lstat");
+      exit(1);
+    }
+  }
+  unlink(fifo);
+  if(mkfifo (fifo, 0600) == -1) {
+    perror("mkfifo");
+    exit(1);
+  }
+  sockfd = open(fifo, O_RDWR | O_NONBLOCK, 0);
+  if(sockfd == -1) {
+    perror("open");
+    exit(1);
+  }
+  g->input = fdopen(sockfd, "r");
+
+  fprintf(MSG_OUT, "Now, pipe some URL's into > %s\n", fifo);
+  event_assign(&g->fifo_event, g->evbase, sockfd, EV_READ|EV_PERSIST,
+               fifo_cb, g);
+  event_add(&g->fifo_event, NULL);
+  return (0);
+}
+
+static void clean_fifo(GlobalInfo *g)
+{
+    event_del(&g->fifo_event);
+    fclose(g->input);
+    unlink(fifo);
+}
+
+int main(int argc _Unused, char **argv _Unused)
+{
+  GlobalInfo g;
+
+  memset(&g, 0, sizeof(GlobalInfo));
+  g.evbase = event_base_new();
+  init_fifo(&g);
+  g.multi = curl_multi_init();
+  evtimer_assign(&g.timer_event, g.evbase, timer_cb, &g);
+
+  /* setup the generic multi interface options we want */
+  curl_multi_setopt(g.multi, CURLMOPT_SOCKETFUNCTION, sock_cb);
+  curl_multi_setopt(g.multi, CURLMOPT_SOCKETDATA, &g);
+  curl_multi_setopt(g.multi, CURLMOPT_TIMERFUNCTION, multi_timer_cb);
+  curl_multi_setopt(g.multi, CURLMOPT_TIMERDATA, &g);
+
+  /* we don't call any curl_multi_socket*() function yet as we have no handles
+     added! */
+
+  event_base_dispatch(g.evbase);
+
+  /* this, of course, won't get called since only way to stop this program is
+     via ctrl-C, but it is here to show how cleanup /would/ be done. */
+  clean_fifo(&g);
+  event_del(&g.timer_event);
+  event_base_free(g.evbase);
+  curl_multi_cleanup(g.multi);
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/href_extractor.c b/components/cronet/third_party/curl_headers/docs/examples/href_extractor.c
new file mode 100644
index 0000000..aa2b4381
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/href_extractor.c
@@ -0,0 +1,86 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2012 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * Uses the "Streaming HTML parser" to extract the href pieces in a streaming
+ * manner from a downloaded HTML.
+ * </DESC>
+ */
+/*
+ * The HTML parser is found at https://github.com/arjunc77/htmlstreamparser
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+#include <htmlstreamparser.h>
+
+
+static size_t write_callback(void *buffer, size_t size, size_t nmemb,
+                             void *hsp)
+{
+  size_t realsize = size * nmemb, p;
+  for(p = 0; p < realsize; p++) {
+    html_parser_char_parse(hsp, ((char *)buffer)[p]);
+    if(html_parser_cmp_tag(hsp, "a", 1))
+      if(html_parser_cmp_attr(hsp, "href", 4))
+        if(html_parser_is_in(hsp, HTML_VALUE_ENDED)) {
+          html_parser_val(hsp)[html_parser_val_length(hsp)] = '\0';
+          printf("%s\n", html_parser_val(hsp));
+        }
+  }
+  return realsize;
+}
+
+int main(int argc, char *argv[])
+{
+  char tag[1], attr[4], val[128];
+  CURL *curl;
+  HTMLSTREAMPARSER *hsp;
+
+  if(argc != 2) {
+    printf("Usage: %s URL\n", argv[0]);
+    return EXIT_FAILURE;
+  }
+
+  curl = curl_easy_init();
+
+  hsp = html_parser_init();
+
+  html_parser_set_tag_to_lower(hsp, 1);
+  html_parser_set_attr_to_lower(hsp, 1);
+  html_parser_set_tag_buffer(hsp, tag, sizeof(tag));
+  html_parser_set_attr_buffer(hsp, attr, sizeof(attr));
+  html_parser_set_val_buffer(hsp, val, sizeof(val)-1);
+
+  curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
+  curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
+  curl_easy_setopt(curl, CURLOPT_WRITEDATA, hsp);
+  curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+
+  curl_easy_perform(curl);
+
+  curl_easy_cleanup(curl);
+
+  html_parser_cleanup(hsp);
+
+  return EXIT_SUCCESS;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/htmltidy.c b/components/cronet/third_party/curl_headers/docs/examples/htmltidy.c
new file mode 100644
index 0000000..1b48e0a
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/htmltidy.c
@@ -0,0 +1,128 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Download a document and use libtidy to parse the HTML.
+ * </DESC>
+ */
+/*
+ * LibTidy => https://www.html-tidy.org/
+ */
+
+#include <stdio.h>
+#include <tidy.h>
+#include <tidybuffio.h>
+#include <curl/curl.h>
+
+/* curl write callback, to fill tidy's input buffer...  */
+uint write_cb(char *in, uint size, uint nmemb, TidyBuffer *out)
+{
+  uint r;
+  r = size * nmemb;
+  tidyBufAppend(out, in, r);
+  return r;
+}
+
+/* Traverse the document tree */
+void dumpNode(TidyDoc doc, TidyNode tnod, int indent)
+{
+  TidyNode child;
+  for(child = tidyGetChild(tnod); child; child = tidyGetNext(child) ) {
+    ctmbstr name = tidyNodeGetName(child);
+    if(name) {
+      /* if it has a name, then it's an HTML tag ... */
+      TidyAttr attr;
+      printf("%*.*s%s ", indent, indent, "<", name);
+      /* walk the attribute list */
+      for(attr = tidyAttrFirst(child); attr; attr = tidyAttrNext(attr) ) {
+        printf(tidyAttrName(attr));
+        tidyAttrValue(attr)?printf("=\"%s\" ",
+                                   tidyAttrValue(attr)):printf(" ");
+      }
+      printf(">\n");
+    }
+    else {
+      /* if it doesn't have a name, then it's probably text, cdata, etc... */
+      TidyBuffer buf;
+      tidyBufInit(&buf);
+      tidyNodeGetText(doc, child, &buf);
+      printf("%*.*s\n", indent, indent, buf.bp?(char *)buf.bp:"");
+      tidyBufFree(&buf);
+    }
+    dumpNode(doc, child, indent + 4); /* recursive */
+  }
+}
+
+
+int main(int argc, char **argv)
+{
+  if(argc == 2) {
+    CURL *curl;
+    char curl_errbuf[CURL_ERROR_SIZE];
+    TidyDoc tdoc;
+    TidyBuffer docbuf = {0};
+    TidyBuffer tidy_errbuf = {0};
+    int err;
+
+    curl = curl_easy_init();
+    curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
+    curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curl_errbuf);
+    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
+
+    tdoc = tidyCreate();
+    tidyOptSetBool(tdoc, TidyForceOutput, yes); /* try harder */
+    tidyOptSetInt(tdoc, TidyWrapLen, 4096);
+    tidySetErrorBuffer(tdoc, &tidy_errbuf);
+    tidyBufInit(&docbuf);
+
+    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &docbuf);
+    err = curl_easy_perform(curl);
+    if(!err) {
+      err = tidyParseBuffer(tdoc, &docbuf); /* parse the input */
+      if(err >= 0) {
+        err = tidyCleanAndRepair(tdoc); /* fix any problems */
+        if(err >= 0) {
+          err = tidyRunDiagnostics(tdoc); /* load tidy error buffer */
+          if(err >= 0) {
+            dumpNode(tdoc, tidyGetRoot(tdoc), 0); /* walk the tree */
+            fprintf(stderr, "%s\n", tidy_errbuf.bp); /* show errors */
+          }
+        }
+      }
+    }
+    else
+      fprintf(stderr, "%s\n", curl_errbuf);
+
+    /* clean-up */
+    curl_easy_cleanup(curl);
+    tidyBufFree(&docbuf);
+    tidyBufFree(&tidy_errbuf);
+    tidyRelease(tdoc);
+    return err;
+
+  }
+  else
+    printf("usage: %s <url>\n", argv[0]);
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/htmltitle.cpp b/components/cronet/third_party/curl_headers/docs/examples/htmltitle.cpp
new file mode 100644
index 0000000..8148888
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/htmltitle.cpp
@@ -0,0 +1,294 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Get a web page, extract the title with libxml.
+ * </DESC>
+
+ Written by Lars Nilsson
+
+ GNU C++ compile command line suggestion (edit paths accordingly):
+
+ g++ -Wall -I/opt/curl/include -I/opt/libxml/include/libxml2 htmltitle.cpp \
+ -o htmltitle -L/opt/curl/lib -L/opt/libxml/lib -lcurl -lxml2
+*/
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <string>
+#include <curl/curl.h>
+#include <libxml/HTMLparser.h>
+
+//
+//  Case-insensitive string comparison
+//
+
+#ifdef _MSC_VER
+#define COMPARE(a, b) (!_stricmp((a), (b)))
+#else
+#define COMPARE(a, b) (!strcasecmp((a), (b)))
+#endif
+
+//
+//  libxml callback context structure
+//
+
+struct Context
+{
+  Context(): addTitle(false) { }
+
+  bool addTitle;
+  std::string title;
+};
+
+//
+//  libcurl variables for error strings and returned data
+
+static char errorBuffer[CURL_ERROR_SIZE];
+static std::string buffer;
+
+//
+//  libcurl write callback function
+//
+
+static int writer(char *data, size_t size, size_t nmemb,
+                  std::string *writerData)
+{
+  if(writerData == NULL)
+    return 0;
+
+  writerData->append(data, size*nmemb);
+
+  return size * nmemb;
+}
+
+//
+//  libcurl connection initialization
+//
+
+static bool init(CURL *&conn, char *url)
+{
+  CURLcode code;
+
+  conn = curl_easy_init();
+
+  if(conn == NULL) {
+    fprintf(stderr, "Failed to create CURL connection\n");
+    exit(EXIT_FAILURE);
+  }
+
+  code = curl_easy_setopt(conn, CURLOPT_ERRORBUFFER, errorBuffer);
+  if(code != CURLE_OK) {
+    fprintf(stderr, "Failed to set error buffer [%d]\n", code);
+    return false;
+  }
+
+  code = curl_easy_setopt(conn, CURLOPT_URL, url);
+  if(code != CURLE_OK) {
+    fprintf(stderr, "Failed to set URL [%s]\n", errorBuffer);
+    return false;
+  }
+
+  code = curl_easy_setopt(conn, CURLOPT_FOLLOWLOCATION, 1L);
+  if(code != CURLE_OK) {
+    fprintf(stderr, "Failed to set redirect option [%s]\n", errorBuffer);
+    return false;
+  }
+
+  code = curl_easy_setopt(conn, CURLOPT_WRITEFUNCTION, writer);
+  if(code != CURLE_OK) {
+    fprintf(stderr, "Failed to set writer [%s]\n", errorBuffer);
+    return false;
+  }
+
+  code = curl_easy_setopt(conn, CURLOPT_WRITEDATA, &buffer);
+  if(code != CURLE_OK) {
+    fprintf(stderr, "Failed to set write data [%s]\n", errorBuffer);
+    return false;
+  }
+
+  return true;
+}
+
+//
+//  libxml start element callback function
+//
+
+static void StartElement(void *voidContext,
+                         const xmlChar *name,
+                         const xmlChar **attributes)
+{
+  Context *context = (Context *)voidContext;
+
+  if(COMPARE((char *)name, "TITLE")) {
+    context->title = "";
+    context->addTitle = true;
+  }
+  (void) attributes;
+}
+
+//
+//  libxml end element callback function
+//
+
+static void EndElement(void *voidContext,
+                       const xmlChar *name)
+{
+  Context *context = (Context *)voidContext;
+
+  if(COMPARE((char *)name, "TITLE"))
+    context->addTitle = false;
+}
+
+//
+//  Text handling helper function
+//
+
+static void handleCharacters(Context *context,
+                             const xmlChar *chars,
+                             int length)
+{
+  if(context->addTitle)
+    context->title.append((char *)chars, length);
+}
+
+//
+//  libxml PCDATA callback function
+//
+
+static void Characters(void *voidContext,
+                       const xmlChar *chars,
+                       int length)
+{
+  Context *context = (Context *)voidContext;
+
+  handleCharacters(context, chars, length);
+}
+
+//
+//  libxml CDATA callback function
+//
+
+static void cdata(void *voidContext,
+                  const xmlChar *chars,
+                  int length)
+{
+  Context *context = (Context *)voidContext;
+
+  handleCharacters(context, chars, length);
+}
+
+//
+//  libxml SAX callback structure
+//
+
+static htmlSAXHandler saxHandler =
+{
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  StartElement,
+  EndElement,
+  NULL,
+  Characters,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  cdata,
+  NULL
+};
+
+//
+//  Parse given (assumed to be) HTML text and return the title
+//
+
+static void parseHtml(const std::string &html,
+                      std::string &title)
+{
+  htmlParserCtxtPtr ctxt;
+  Context context;
+
+  ctxt = htmlCreatePushParserCtxt(&saxHandler, &context, "", 0, "",
+                                  XML_CHAR_ENCODING_NONE);
+
+  htmlParseChunk(ctxt, html.c_str(), html.size(), 0);
+  htmlParseChunk(ctxt, "", 0, 1);
+
+  htmlFreeParserCtxt(ctxt);
+
+  title = context.title;
+}
+
+int main(int argc, char *argv[])
+{
+  CURL *conn = NULL;
+  CURLcode code;
+  std::string title;
+
+  // Ensure one argument is given
+
+  if(argc != 2) {
+    fprintf(stderr, "Usage: %s <url>\n", argv[0]);
+    exit(EXIT_FAILURE);
+  }
+
+  curl_global_init(CURL_GLOBAL_DEFAULT);
+
+  // Initialize CURL connection
+
+  if(!init(conn, argv[1])) {
+    fprintf(stderr, "Connection initializion failed\n");
+    exit(EXIT_FAILURE);
+  }
+
+  // Retrieve content for the URL
+
+  code = curl_easy_perform(conn);
+  curl_easy_cleanup(conn);
+
+  if(code != CURLE_OK) {
+    fprintf(stderr, "Failed to get '%s' [%s]\n", argv[1], errorBuffer);
+    exit(EXIT_FAILURE);
+  }
+
+  // Parse the (assumed) HTML code
+  parseHtml(buffer, title);
+
+  // Display the extracted title
+  printf("Title: %s\n", title.c_str());
+
+  return EXIT_SUCCESS;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/http-post.c b/components/cronet/third_party/curl_headers/docs/examples/http-post.c
new file mode 100644
index 0000000..01754527
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/http-post.c
@@ -0,0 +1,59 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * simple HTTP POST using the easy interface
+ * </DESC>
+ */
+#include <stdio.h>
+#include <curl/curl.h>
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+
+  /* In windows, this will init the winsock stuff */
+  curl_global_init(CURL_GLOBAL_ALL);
+
+  /* get a curl handle */
+  curl = curl_easy_init();
+  if(curl) {
+    /* First set the URL that is about to receive our POST. This URL can
+       just as well be a https:// URL if that is what should receive the
+       data. */
+    curl_easy_setopt(curl, CURLOPT_URL, "http://postit.example.com/moo.cgi");
+    /* Now specify the POST data */
+    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=daniel&project=curl");
+
+    /* Perform the request, res will get the return code */
+    res = curl_easy_perform(curl);
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+  curl_global_cleanup();
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/http2-download.c b/components/cronet/third_party/curl_headers/docs/examples/http2-download.c
new file mode 100644
index 0000000..333b7df
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/http2-download.c
@@ -0,0 +1,290 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Multiplexed HTTP/2 downloads over a single connection
+ * </DESC>
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* somewhat unix-specific */
+#include <sys/time.h>
+#include <unistd.h>
+
+/* curl stuff */
+#include <curl/curl.h>
+
+#ifndef CURLPIPE_MULTIPLEX
+/* This little trick will just make sure that we don't enable pipelining for
+   libcurls old enough to not have this symbol. It is _not_ defined to zero in
+   a recent libcurl header. */
+#define CURLPIPE_MULTIPLEX 0
+#endif
+
+struct transfer {
+  CURL *easy;
+  unsigned int num;
+  FILE *out;
+};
+
+#define NUM_HANDLES 1000
+
+static
+void dump(const char *text, int num, unsigned char *ptr, size_t size,
+          char nohex)
+{
+  size_t i;
+  size_t c;
+
+  unsigned int width = 0x10;
+
+  if(nohex)
+    /* without the hex output, we can fit more on screen */
+    width = 0x40;
+
+  fprintf(stderr, "%d %s, %lu bytes (0x%lx)\n",
+          num, text, (unsigned long)size, (unsigned long)size);
+
+  for(i = 0; i<size; i += width) {
+
+    fprintf(stderr, "%4.4lx: ", (unsigned long)i);
+
+    if(!nohex) {
+      /* hex not disabled, show it */
+      for(c = 0; c < width; c++)
+        if(i + c < size)
+          fprintf(stderr, "%02x ", ptr[i + c]);
+        else
+          fputs("   ", stderr);
+    }
+
+    for(c = 0; (c < width) && (i + c < size); c++) {
+      /* check for 0D0A; if found, skip past and start a new line of output */
+      if(nohex && (i + c + 1 < size) && ptr[i + c] == 0x0D &&
+         ptr[i + c + 1] == 0x0A) {
+        i += (c + 2 - width);
+        break;
+      }
+      fprintf(stderr, "%c",
+              (ptr[i + c] >= 0x20) && (ptr[i + c]<0x80)?ptr[i + c]:'.');
+      /* check again for 0D0A, to avoid an extra \n if it's at width */
+      if(nohex && (i + c + 2 < size) && ptr[i + c + 1] == 0x0D &&
+         ptr[i + c + 2] == 0x0A) {
+        i += (c + 3 - width);
+        break;
+      }
+    }
+    fputc('\n', stderr); /* newline */
+  }
+}
+
+static
+int my_trace(CURL *handle, curl_infotype type,
+             char *data, size_t size,
+             void *userp)
+{
+  const char *text;
+  struct transfer *t = (struct transfer *)userp;
+  unsigned int num = t->num;
+  (void)handle; /* prevent compiler warning */
+
+  switch(type) {
+  case CURLINFO_TEXT:
+    fprintf(stderr, "== %u Info: %s", num, data);
+    /* FALLTHROUGH */
+  default: /* in case a new one is introduced to shock us */
+    return 0;
+
+  case CURLINFO_HEADER_OUT:
+    text = "=> Send header";
+    break;
+  case CURLINFO_DATA_OUT:
+    text = "=> Send data";
+    break;
+  case CURLINFO_SSL_DATA_OUT:
+    text = "=> Send SSL data";
+    break;
+  case CURLINFO_HEADER_IN:
+    text = "<= Recv header";
+    break;
+  case CURLINFO_DATA_IN:
+    text = "<= Recv data";
+    break;
+  case CURLINFO_SSL_DATA_IN:
+    text = "<= Recv SSL data";
+    break;
+  }
+
+  dump(text, num, (unsigned char *)data, size, 1);
+  return 0;
+}
+
+static void setup(struct transfer *t, int num)
+{
+  char filename[128];
+  CURL *hnd;
+
+  hnd = t->easy = curl_easy_init();
+
+  snprintf(filename, 128, "dl-%d", num);
+
+  t->out = fopen(filename, "wb");
+
+  /* write to this file */
+  curl_easy_setopt(hnd, CURLOPT_WRITEDATA, t->out);
+
+  /* set the same URL */
+  curl_easy_setopt(hnd, CURLOPT_URL, "https://localhost:8443/index.html");
+
+  /* please be verbose */
+  curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
+  curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, my_trace);
+  curl_easy_setopt(hnd, CURLOPT_DEBUGDATA, t);
+
+  /* HTTP/2 please */
+  curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
+
+  /* we use a self-signed test server, skip verification during debugging */
+  curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYPEER, 0L);
+  curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYHOST, 0L);
+
+#if (CURLPIPE_MULTIPLEX > 0)
+  /* wait for pipe connection to confirm */
+  curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
+#endif
+}
+
+/*
+ * Download many transfers over HTTP/2, using the same connection!
+ */
+int main(int argc, char **argv)
+{
+  struct transfer trans[NUM_HANDLES];
+  CURLM *multi_handle;
+  int i;
+  int still_running = 0; /* keep number of running handles */
+  int num_transfers;
+  if(argc > 1) {
+    /* if given a number, do that many transfers */
+    num_transfers = atoi(argv[1]);
+    if((num_transfers < 1) || (num_transfers > NUM_HANDLES))
+      num_transfers = 3; /* a suitable low default */
+  }
+  else
+    num_transfers = 3; /* suitable default */
+
+  /* init a multi stack */
+  multi_handle = curl_multi_init();
+
+  for(i = 0; i < num_transfers; i++) {
+    setup(&trans[i], i);
+
+    /* add the individual transfer */
+    curl_multi_add_handle(multi_handle, trans[i].easy);
+  }
+
+  curl_multi_setopt(multi_handle, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
+
+  /* we start some action by calling perform right away */
+  curl_multi_perform(multi_handle, &still_running);
+
+  while(still_running) {
+    struct timeval timeout;
+    int rc; /* select() return code */
+    CURLMcode mc; /* curl_multi_fdset() return code */
+
+    fd_set fdread;
+    fd_set fdwrite;
+    fd_set fdexcep;
+    int maxfd = -1;
+
+    long curl_timeo = -1;
+
+    FD_ZERO(&fdread);
+    FD_ZERO(&fdwrite);
+    FD_ZERO(&fdexcep);
+
+    /* set a suitable timeout to play around with */
+    timeout.tv_sec = 1;
+    timeout.tv_usec = 0;
+
+    curl_multi_timeout(multi_handle, &curl_timeo);
+    if(curl_timeo >= 0) {
+      timeout.tv_sec = curl_timeo / 1000;
+      if(timeout.tv_sec > 1)
+        timeout.tv_sec = 1;
+      else
+        timeout.tv_usec = (curl_timeo % 1000) * 1000;
+    }
+
+    /* get file descriptors from the transfers */
+    mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
+
+    if(mc != CURLM_OK) {
+      fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
+      break;
+    }
+
+    /* On success the value of maxfd is guaranteed to be >= -1. We call
+       select(maxfd + 1, ...); specially in case of (maxfd == -1) there are
+       no fds ready yet so we call select(0, ...) --or Sleep() on Windows--
+       to sleep 100ms, which is the minimum suggested value in the
+       curl_multi_fdset() doc. */
+
+    if(maxfd == -1) {
+#ifdef _WIN32
+      Sleep(100);
+      rc = 0;
+#else
+      /* Portable sleep for platforms other than Windows. */
+      struct timeval wait = { 0, 100 * 1000 }; /* 100ms */
+      rc = select(0, NULL, NULL, NULL, &wait);
+#endif
+    }
+    else {
+      /* Note that on some platforms 'timeout' may be modified by select().
+         If you need access to the original value save a copy beforehand. */
+      rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
+    }
+
+    switch(rc) {
+    case -1:
+      /* select error */
+      break;
+    case 0:
+    default:
+      /* timeout or readable/writable sockets */
+      curl_multi_perform(multi_handle, &still_running);
+      break;
+    }
+  }
+
+  for(i = 0; i < num_transfers; i++) {
+    curl_multi_remove_handle(multi_handle, trans[i].easy);
+    curl_easy_cleanup(trans[i].easy);
+  }
+
+  curl_multi_cleanup(multi_handle);
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/http2-pushinmemory.c b/components/cronet/third_party/curl_headers/docs/examples/http2-pushinmemory.c
new file mode 100644
index 0000000..00406a8
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/http2-pushinmemory.c
@@ -0,0 +1,188 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * HTTP/2 server push. Receive all data in memory.
+ * </DESC>
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* somewhat unix-specific */
+#include <sys/time.h>
+#include <unistd.h>
+
+/* curl stuff */
+#include <curl/curl.h>
+
+struct Memory {
+  char *memory;
+  size_t size;
+};
+
+static size_t
+write_cb(void *contents, size_t size, size_t nmemb, void *userp)
+{
+  size_t realsize = size * nmemb;
+  struct Memory *mem = (struct Memory *)userp;
+  char *ptr = realloc(mem->memory, mem->size + realsize + 1);
+  if(!ptr) {
+    /* out of memory! */
+    printf("not enough memory (realloc returned NULL)\n");
+    return 0;
+  }
+
+  mem->memory = ptr;
+  memcpy(&(mem->memory[mem->size]), contents, realsize);
+  mem->size += realsize;
+  mem->memory[mem->size] = 0;
+
+  return realsize;
+}
+
+#define MAX_FILES 10
+static struct Memory files[MAX_FILES];
+static int pushindex = 1;
+
+static void init_memory(struct Memory *chunk)
+{
+  chunk->memory = malloc(1);  /* grown as needed with realloc */
+  chunk->size = 0;            /* no data at this point */
+}
+
+static void setup(CURL *hnd)
+{
+  /* set the same URL */
+  curl_easy_setopt(hnd, CURLOPT_URL, "https://localhost:8443/index.html");
+
+  /* HTTP/2 please */
+  curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
+
+  /* we use a self-signed test server, skip verification during debugging */
+  curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYPEER, 0L);
+  curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYHOST, 0L);
+
+  /* write data to a struct  */
+  curl_easy_setopt(hnd, CURLOPT_WRITEFUNCTION, write_cb);
+  init_memory(&files[0]);
+  curl_easy_setopt(hnd, CURLOPT_WRITEDATA, &files[0]);
+
+  /* wait for pipe connection to confirm */
+  curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
+}
+
+/* called when there's an incoming push */
+static int server_push_callback(CURL *parent,
+                                CURL *easy,
+                                size_t num_headers,
+                                struct curl_pushheaders *headers,
+                                void *userp)
+{
+  char *headp;
+  int *transfers = (int *)userp;
+  (void)parent; /* we have no use for this */
+  (void)num_headers; /* unused */
+
+  if(pushindex == MAX_FILES)
+    /* can't fit anymore */
+    return CURL_PUSH_DENY;
+
+  /* write to this buffer */
+  init_memory(&files[pushindex]);
+  curl_easy_setopt(easy, CURLOPT_WRITEDATA, &files[pushindex]);
+  pushindex++;
+
+  headp = curl_pushheader_byname(headers, ":path");
+  if(headp)
+    fprintf(stderr, "* Pushed :path '%s'\n", headp /* skip :path + colon */);
+
+  (*transfers)++; /* one more */
+  return CURL_PUSH_OK;
+}
+
+
+/*
+ * Download a file over HTTP/2, take care of server push.
+ */
+int main(void)
+{
+  CURL *easy;
+  CURLM *multi;
+  int still_running; /* keep number of running handles */
+  int transfers = 1; /* we start with one */
+  int i;
+  struct CURLMsg *m;
+
+  /* init a multi stack */
+  multi = curl_multi_init();
+
+  easy = curl_easy_init();
+
+  /* set options */
+  setup(easy);
+
+  /* add the easy transfer */
+  curl_multi_add_handle(multi, easy);
+
+  curl_multi_setopt(multi, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
+  curl_multi_setopt(multi, CURLMOPT_PUSHFUNCTION, server_push_callback);
+  curl_multi_setopt(multi, CURLMOPT_PUSHDATA, &transfers);
+
+  while(transfers) {
+    int rc;
+    CURLMcode mcode = curl_multi_perform(multi, &still_running);
+    if(mcode)
+      break;
+
+    mcode = curl_multi_wait(multi, NULL, 0, 1000, &rc);
+    if(mcode)
+      break;
+
+
+    /*
+     * When doing server push, libcurl itself created and added one or more
+     * easy handles but *we* need to clean them up when they are done.
+     */
+    do {
+      int msgq = 0;;
+      m = curl_multi_info_read(multi, &msgq);
+      if(m && (m->msg == CURLMSG_DONE)) {
+        CURL *e = m->easy_handle;
+        transfers--;
+        curl_multi_remove_handle(multi, e);
+        curl_easy_cleanup(e);
+      }
+    } while(m);
+
+  }
+
+
+  curl_multi_cleanup(multi);
+
+  /* 'pushindex' is now the number of received transfers */
+  for(i = 0; i < pushindex; i++) {
+    /* do something fun with the data, and then free it when done */
+    free(files[i].memory);
+  }
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/http2-serverpush.c b/components/cronet/third_party/curl_headers/docs/examples/http2-serverpush.c
new file mode 100644
index 0000000..63dff4c
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/http2-serverpush.c
@@ -0,0 +1,334 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * HTTP/2 server push
+ * </DESC>
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* somewhat unix-specific */
+#include <sys/time.h>
+#include <unistd.h>
+
+/* curl stuff */
+#include <curl/curl.h>
+
+#ifndef CURLPIPE_MULTIPLEX
+#error "too old libcurl, can't do HTTP/2 server push!"
+#endif
+
+static
+void dump(const char *text, unsigned char *ptr, size_t size,
+          char nohex)
+{
+  size_t i;
+  size_t c;
+
+  unsigned int width = 0x10;
+
+  if(nohex)
+    /* without the hex output, we can fit more on screen */
+    width = 0x40;
+
+  fprintf(stderr, "%s, %lu bytes (0x%lx)\n",
+          text, (unsigned long)size, (unsigned long)size);
+
+  for(i = 0; i<size; i += width) {
+
+    fprintf(stderr, "%4.4lx: ", (unsigned long)i);
+
+    if(!nohex) {
+      /* hex not disabled, show it */
+      for(c = 0; c < width; c++)
+        if(i + c < size)
+          fprintf(stderr, "%02x ", ptr[i + c]);
+        else
+          fputs("   ", stderr);
+    }
+
+    for(c = 0; (c < width) && (i + c < size); c++) {
+      /* check for 0D0A; if found, skip past and start a new line of output */
+      if(nohex && (i + c + 1 < size) && ptr[i + c] == 0x0D &&
+         ptr[i + c + 1] == 0x0A) {
+        i += (c + 2 - width);
+        break;
+      }
+      fprintf(stderr, "%c",
+              (ptr[i + c] >= 0x20) && (ptr[i + c]<0x80)?ptr[i + c]:'.');
+      /* check again for 0D0A, to avoid an extra \n if it's at width */
+      if(nohex && (i + c + 2 < size) && ptr[i + c + 1] == 0x0D &&
+         ptr[i + c + 2] == 0x0A) {
+        i += (c + 3 - width);
+        break;
+      }
+    }
+    fputc('\n', stderr); /* newline */
+  }
+}
+
+static
+int my_trace(CURL *handle, curl_infotype type,
+             char *data, size_t size,
+             void *userp)
+{
+  const char *text;
+  (void)handle; /* prevent compiler warning */
+  (void)userp;
+  switch(type) {
+  case CURLINFO_TEXT:
+    fprintf(stderr, "== Info: %s", data);
+    /* FALLTHROUGH */
+  default: /* in case a new one is introduced to shock us */
+    return 0;
+
+  case CURLINFO_HEADER_OUT:
+    text = "=> Send header";
+    break;
+  case CURLINFO_DATA_OUT:
+    text = "=> Send data";
+    break;
+  case CURLINFO_SSL_DATA_OUT:
+    text = "=> Send SSL data";
+    break;
+  case CURLINFO_HEADER_IN:
+    text = "<= Recv header";
+    break;
+  case CURLINFO_DATA_IN:
+    text = "<= Recv data";
+    break;
+  case CURLINFO_SSL_DATA_IN:
+    text = "<= Recv SSL data";
+    break;
+  }
+
+  dump(text, (unsigned char *)data, size, 1);
+  return 0;
+}
+
+#define OUTPUTFILE "dl"
+
+static int setup(CURL *hnd)
+{
+  FILE *out = fopen(OUTPUTFILE, "wb");
+  if(!out)
+    /* failed */
+    return 1;
+
+  /* write to this file */
+  curl_easy_setopt(hnd, CURLOPT_WRITEDATA, out);
+
+  /* set the same URL */
+  curl_easy_setopt(hnd, CURLOPT_URL, "https://localhost:8443/index.html");
+
+  /* please be verbose */
+  curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
+  curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, my_trace);
+
+  /* HTTP/2 please */
+  curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
+
+  /* we use a self-signed test server, skip verification during debugging */
+  curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYPEER, 0L);
+  curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYHOST, 0L);
+
+#if (CURLPIPE_MULTIPLEX > 0)
+  /* wait for pipe connection to confirm */
+  curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
+#endif
+  return 0; /* all is good */
+}
+
+/* called when there's an incoming push */
+static int server_push_callback(CURL *parent,
+                                CURL *easy,
+                                size_t num_headers,
+                                struct curl_pushheaders *headers,
+                                void *userp)
+{
+  char *headp;
+  size_t i;
+  int *transfers = (int *)userp;
+  char filename[128];
+  FILE *out;
+  static unsigned int count = 0;
+
+  (void)parent; /* we have no use for this */
+
+  snprintf(filename, 128, "push%u", count++);
+
+  /* here's a new stream, save it in a new file for each new push */
+  out = fopen(filename, "wb");
+  if(!out) {
+    /* if we can't save it, deny it */
+    fprintf(stderr, "Failed to create output file for push\n");
+    return CURL_PUSH_DENY;
+  }
+
+  /* write to this file */
+  curl_easy_setopt(easy, CURLOPT_WRITEDATA, out);
+
+  fprintf(stderr, "**** push callback approves stream %u, got %lu headers!\n",
+          count, (unsigned long)num_headers);
+
+  for(i = 0; i<num_headers; i++) {
+    headp = curl_pushheader_bynum(headers, i);
+    fprintf(stderr, "**** header %lu: %s\n", (unsigned long)i, headp);
+  }
+
+  headp = curl_pushheader_byname(headers, ":path");
+  if(headp) {
+    fprintf(stderr, "**** The PATH is %s\n", headp /* skip :path + colon */);
+  }
+
+  (*transfers)++; /* one more */
+  return CURL_PUSH_OK;
+}
+
+
+/*
+ * Download a file over HTTP/2, take care of server push.
+ */
+int main(void)
+{
+  CURL *easy;
+  CURLM *multi_handle;
+  int still_running; /* keep number of running handles */
+  int transfers = 1; /* we start with one */
+  struct CURLMsg *m;
+
+  /* init a multi stack */
+  multi_handle = curl_multi_init();
+
+  easy = curl_easy_init();
+
+  /* set options */
+  if(setup(easy)) {
+    fprintf(stderr, "failed\n");
+    return 1;
+  }
+
+  /* add the easy transfer */
+  curl_multi_add_handle(multi_handle, easy);
+
+  curl_multi_setopt(multi_handle, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
+  curl_multi_setopt(multi_handle, CURLMOPT_PUSHFUNCTION, server_push_callback);
+  curl_multi_setopt(multi_handle, CURLMOPT_PUSHDATA, &transfers);
+
+  /* we start some action by calling perform right away */
+  curl_multi_perform(multi_handle, &still_running);
+
+  do {
+    struct timeval timeout;
+    int rc; /* select() return code */
+    CURLMcode mc; /* curl_multi_fdset() return code */
+
+    fd_set fdread;
+    fd_set fdwrite;
+    fd_set fdexcep;
+    int maxfd = -1;
+
+    long curl_timeo = -1;
+
+    FD_ZERO(&fdread);
+    FD_ZERO(&fdwrite);
+    FD_ZERO(&fdexcep);
+
+    /* set a suitable timeout to play around with */
+    timeout.tv_sec = 1;
+    timeout.tv_usec = 0;
+
+    curl_multi_timeout(multi_handle, &curl_timeo);
+    if(curl_timeo >= 0) {
+      timeout.tv_sec = curl_timeo / 1000;
+      if(timeout.tv_sec > 1)
+        timeout.tv_sec = 1;
+      else
+        timeout.tv_usec = (curl_timeo % 1000) * 1000;
+    }
+
+    /* get file descriptors from the transfers */
+    mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
+
+    if(mc != CURLM_OK) {
+      fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
+      break;
+    }
+
+    /* On success the value of maxfd is guaranteed to be >= -1. We call
+       select(maxfd + 1, ...); specially in case of (maxfd == -1) there are
+       no fds ready yet so we call select(0, ...) --or Sleep() on Windows--
+       to sleep 100ms, which is the minimum suggested value in the
+       curl_multi_fdset() doc. */
+
+    if(maxfd == -1) {
+#ifdef _WIN32
+      Sleep(100);
+      rc = 0;
+#else
+      /* Portable sleep for platforms other than Windows. */
+      struct timeval wait = { 0, 100 * 1000 }; /* 100ms */
+      rc = select(0, NULL, NULL, NULL, &wait);
+#endif
+    }
+    else {
+      /* Note that on some platforms 'timeout' may be modified by select().
+         If you need access to the original value save a copy beforehand. */
+      rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
+    }
+
+    switch(rc) {
+    case -1:
+      /* select error */
+      break;
+    case 0:
+    default:
+      /* timeout or readable/writable sockets */
+      curl_multi_perform(multi_handle, &still_running);
+      break;
+    }
+
+    /*
+     * A little caution when doing server push is that libcurl itself has
+     * created and added one or more easy handles but we need to clean them up
+     * when we are done.
+     */
+
+    do {
+      int msgq = 0;;
+      m = curl_multi_info_read(multi_handle, &msgq);
+      if(m && (m->msg == CURLMSG_DONE)) {
+        CURL *e = m->easy_handle;
+        transfers--;
+        curl_multi_remove_handle(multi_handle, e);
+        curl_easy_cleanup(e);
+      }
+    } while(m);
+
+  } while(transfers); /* as long as we have transfers going */
+
+  curl_multi_cleanup(multi_handle);
+
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/http2-upload.c b/components/cronet/third_party/curl_headers/docs/examples/http2-upload.c
new file mode 100644
index 0000000..45864cf
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/http2-upload.c
@@ -0,0 +1,347 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Multiplexed HTTP/2 uploads over a single connection
+ * </DESC>
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+/* somewhat unix-specific */
+#include <sys/time.h>
+#include <unistd.h>
+
+/* curl stuff */
+#include <curl/curl.h>
+
+#ifndef CURLPIPE_MULTIPLEX
+/* This little trick will just make sure that we don't enable pipelining for
+   libcurls old enough to not have this symbol. It is _not_ defined to zero in
+   a recent libcurl header. */
+#define CURLPIPE_MULTIPLEX 0
+#endif
+
+#define NUM_HANDLES 1000
+
+struct input {
+  FILE *in;
+  size_t bytes_read; /* count up */
+  CURL *hnd;
+  int num;
+};
+
+static
+void dump(const char *text, int num, unsigned char *ptr, size_t size,
+          char nohex)
+{
+  size_t i;
+  size_t c;
+  unsigned int width = 0x10;
+
+  if(nohex)
+    /* without the hex output, we can fit more on screen */
+    width = 0x40;
+
+  fprintf(stderr, "%d %s, %lu bytes (0x%lx)\n",
+          num, text, (unsigned long)size, (unsigned long)size);
+
+  for(i = 0; i<size; i += width) {
+
+    fprintf(stderr, "%4.4lx: ", (unsigned long)i);
+
+    if(!nohex) {
+      /* hex not disabled, show it */
+      for(c = 0; c < width; c++)
+        if(i + c < size)
+          fprintf(stderr, "%02x ", ptr[i + c]);
+        else
+          fputs("   ", stderr);
+    }
+
+    for(c = 0; (c < width) && (i + c < size); c++) {
+      /* check for 0D0A; if found, skip past and start a new line of output */
+      if(nohex && (i + c + 1 < size) && ptr[i + c] == 0x0D &&
+         ptr[i + c + 1] == 0x0A) {
+        i += (c + 2 - width);
+        break;
+      }
+      fprintf(stderr, "%c",
+              (ptr[i + c] >= 0x20) && (ptr[i + c]<0x80)?ptr[i + c]:'.');
+      /* check again for 0D0A, to avoid an extra \n if it's at width */
+      if(nohex && (i + c + 2 < size) && ptr[i + c + 1] == 0x0D &&
+         ptr[i + c + 2] == 0x0A) {
+        i += (c + 3 - width);
+        break;
+      }
+    }
+    fputc('\n', stderr); /* newline */
+  }
+}
+
+static
+int my_trace(CURL *handle, curl_infotype type,
+             char *data, size_t size,
+             void *userp)
+{
+  char timebuf[60];
+  const char *text;
+  struct input *i = (struct input *)userp;
+  int num = i->num;
+  static time_t epoch_offset;
+  static int    known_offset;
+  struct timeval tv;
+  time_t secs;
+  struct tm *now;
+  (void)handle; /* prevent compiler warning */
+
+  gettimeofday(&tv, NULL);
+  if(!known_offset) {
+    epoch_offset = time(NULL) - tv.tv_sec;
+    known_offset = 1;
+  }
+  secs = epoch_offset + tv.tv_sec;
+  now = localtime(&secs);  /* not thread safe but we don't care */
+  snprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d.%06ld",
+           now->tm_hour, now->tm_min, now->tm_sec, (long)tv.tv_usec);
+
+  switch(type) {
+  case CURLINFO_TEXT:
+    fprintf(stderr, "%s [%d] Info: %s", timebuf, num, data);
+    /* FALLTHROUGH */
+  default: /* in case a new one is introduced to shock us */
+    return 0;
+
+  case CURLINFO_HEADER_OUT:
+    text = "=> Send header";
+    break;
+  case CURLINFO_DATA_OUT:
+    text = "=> Send data";
+    break;
+  case CURLINFO_SSL_DATA_OUT:
+    text = "=> Send SSL data";
+    break;
+  case CURLINFO_HEADER_IN:
+    text = "<= Recv header";
+    break;
+  case CURLINFO_DATA_IN:
+    text = "<= Recv data";
+    break;
+  case CURLINFO_SSL_DATA_IN:
+    text = "<= Recv SSL data";
+    break;
+  }
+
+  dump(text, num, (unsigned char *)data, size, 1);
+  return 0;
+}
+
+static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
+{
+  struct input *i = userp;
+  size_t retcode = fread(ptr, size, nmemb, i->in);
+  i->bytes_read += retcode;
+  return retcode;
+}
+
+static void setup(struct input *i, int num, const char *upload)
+{
+  FILE *out;
+  char url[256];
+  char filename[128];
+  struct stat file_info;
+  curl_off_t uploadsize;
+  CURL *hnd;
+
+  hnd = i->hnd = curl_easy_init();
+  i->num = num;
+  snprintf(filename, 128, "dl-%d", num);
+  out = fopen(filename, "wb");
+
+  snprintf(url, 256, "https://localhost:8443/upload-%d", num);
+
+  /* get the file size of the local file */
+  stat(upload, &file_info);
+  uploadsize = file_info.st_size;
+
+  i->in = fopen(upload, "rb");
+
+  /* write to this file */
+  curl_easy_setopt(hnd, CURLOPT_WRITEDATA, out);
+
+  /* we want to use our own read function */
+  curl_easy_setopt(hnd, CURLOPT_READFUNCTION, read_callback);
+  /* read from this file */
+  curl_easy_setopt(hnd, CURLOPT_READDATA, i);
+  /* provide the size of the upload */
+  curl_easy_setopt(hnd, CURLOPT_INFILESIZE_LARGE, uploadsize);
+
+  /* send in the URL to store the upload as */
+  curl_easy_setopt(hnd, CURLOPT_URL, url);
+
+  /* upload please */
+  curl_easy_setopt(hnd, CURLOPT_UPLOAD, 1L);
+
+  /* please be verbose */
+  curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
+  curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, my_trace);
+  curl_easy_setopt(hnd, CURLOPT_DEBUGDATA, i);
+
+  /* HTTP/2 please */
+  curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
+
+  /* we use a self-signed test server, skip verification during debugging */
+  curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYPEER, 0L);
+  curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYHOST, 0L);
+
+#if (CURLPIPE_MULTIPLEX > 0)
+  /* wait for pipe connection to confirm */
+  curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
+#endif
+}
+
+/*
+ * Upload all files over HTTP/2, using the same physical connection!
+ */
+int main(int argc, char **argv)
+{
+  struct input trans[NUM_HANDLES];
+  CURLM *multi_handle;
+  int i;
+  int still_running = 0; /* keep number of running handles */
+  const char *filename = "index.html";
+  int num_transfers;
+
+  if(argc > 1) {
+    /* if given a number, do that many transfers */
+    num_transfers = atoi(argv[1]);
+
+    if(!num_transfers || (num_transfers > NUM_HANDLES))
+      num_transfers = 3; /* a suitable low default */
+
+    if(argc > 2)
+      /* if given a file name, upload this! */
+      filename = argv[2];
+  }
+  else
+    num_transfers = 3;
+
+  /* init a multi stack */
+  multi_handle = curl_multi_init();
+
+  for(i = 0; i<num_transfers; i++) {
+    setup(&trans[i], i, filename);
+
+    /* add the individual transfer */
+    curl_multi_add_handle(multi_handle, trans[i].hnd);
+  }
+
+  curl_multi_setopt(multi_handle, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
+
+  /* We do HTTP/2 so let's stick to one connection per host */
+  curl_multi_setopt(multi_handle, CURLMOPT_MAX_HOST_CONNECTIONS, 1L);
+
+  /* we start some action by calling perform right away */
+  curl_multi_perform(multi_handle, &still_running);
+
+  while(still_running) {
+    struct timeval timeout;
+    int rc; /* select() return code */
+    CURLMcode mc; /* curl_multi_fdset() return code */
+
+    fd_set fdread;
+    fd_set fdwrite;
+    fd_set fdexcep;
+    int maxfd = -1;
+
+    long curl_timeo = -1;
+
+    FD_ZERO(&fdread);
+    FD_ZERO(&fdwrite);
+    FD_ZERO(&fdexcep);
+
+    /* set a suitable timeout to play around with */
+    timeout.tv_sec = 1;
+    timeout.tv_usec = 0;
+
+    curl_multi_timeout(multi_handle, &curl_timeo);
+    if(curl_timeo >= 0) {
+      timeout.tv_sec = curl_timeo / 1000;
+      if(timeout.tv_sec > 1)
+        timeout.tv_sec = 1;
+      else
+        timeout.tv_usec = (curl_timeo % 1000) * 1000;
+    }
+
+    /* get file descriptors from the transfers */
+    mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
+
+    if(mc != CURLM_OK) {
+      fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
+      break;
+    }
+
+    /* On success the value of maxfd is guaranteed to be >= -1. We call
+       select(maxfd + 1, ...); specially in case of (maxfd == -1) there are
+       no fds ready yet so we call select(0, ...) --or Sleep() on Windows--
+       to sleep 100ms, which is the minimum suggested value in the
+       curl_multi_fdset() doc. */
+
+    if(maxfd == -1) {
+#ifdef _WIN32
+      Sleep(100);
+      rc = 0;
+#else
+      /* Portable sleep for platforms other than Windows. */
+      struct timeval wait = { 0, 100 * 1000 }; /* 100ms */
+      rc = select(0, NULL, NULL, NULL, &wait);
+#endif
+    }
+    else {
+      /* Note that on some platforms 'timeout' may be modified by select().
+         If you need access to the original value save a copy beforehand. */
+      rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
+    }
+
+    switch(rc) {
+    case -1:
+      /* select error */
+      break;
+    case 0:
+    default:
+      /* timeout or readable/writable sockets */
+      curl_multi_perform(multi_handle, &still_running);
+      break;
+    }
+  }
+
+  curl_multi_cleanup(multi_handle);
+
+  for(i = 0; i<num_transfers; i++) {
+    curl_multi_remove_handle(multi_handle, trans[i].hnd);
+    curl_easy_cleanup(trans[i].hnd);
+  }
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/httpcustomheader.c b/components/cronet/third_party/curl_headers/docs/examples/httpcustomheader.c
new file mode 100644
index 0000000..6712f8c
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/httpcustomheader.c
@@ -0,0 +1,70 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * HTTP request with custom modified, removed and added headers
+ * </DESC>
+ */
+#include <stdio.h>
+#include <curl/curl.h>
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+
+  curl = curl_easy_init();
+  if(curl) {
+    struct curl_slist *chunk = NULL;
+
+    /* Remove a header curl would otherwise add by itself */
+    chunk = curl_slist_append(chunk, "Accept:");
+
+    /* Add a custom header */
+    chunk = curl_slist_append(chunk, "Another: yes");
+
+    /* Modify a header curl otherwise adds differently */
+    chunk = curl_slist_append(chunk, "Host: example.com");
+
+    /* Add a header with "blank" contents to the right of the colon. Note that
+       we're then using a semicolon in the string we pass to curl! */
+    chunk = curl_slist_append(chunk, "X-silly-header;");
+
+    /* set our custom set of headers */
+    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
+
+    curl_easy_setopt(curl, CURLOPT_URL, "localhost");
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+    res = curl_easy_perform(curl);
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+
+    /* free the custom headers */
+    curl_slist_free_all(chunk);
+  }
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/httpput.c b/components/cronet/third_party/curl_headers/docs/examples/httpput.c
new file mode 100644
index 0000000..6be9b8d
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/httpput.c
@@ -0,0 +1,124 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * HTTP PUT with easy interface and read callback
+ * </DESC>
+ */
+#include <stdio.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <curl/curl.h>
+
+/*
+ * This example shows a HTTP PUT operation. PUTs a file given as a command
+ * line argument to the URL also given on the command line.
+ *
+ * This example also uses its own read callback.
+ *
+ * Here's an article on how to setup a PUT handler for Apache:
+ * http://www.apacheweek.com/features/put
+ */
+
+static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
+{
+  size_t retcode;
+  curl_off_t nread;
+
+  /* in real-world cases, this would probably get this data differently
+     as this fread() stuff is exactly what the library already would do
+     by default internally */
+  retcode = fread(ptr, size, nmemb, stream);
+
+  nread = (curl_off_t)retcode;
+
+  fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
+          " bytes from file\n", nread);
+
+  return retcode;
+}
+
+int main(int argc, char **argv)
+{
+  CURL *curl;
+  CURLcode res;
+  FILE * hd_src;
+  struct stat file_info;
+
+  char *file;
+  char *url;
+
+  if(argc < 3)
+    return 1;
+
+  file = argv[1];
+  url = argv[2];
+
+  /* get the file size of the local file */
+  stat(file, &file_info);
+
+  /* get a FILE * of the same file, could also be made with
+     fdopen() from the previous descriptor, but hey this is just
+     an example! */
+  hd_src = fopen(file, "rb");
+
+  /* In windows, this will init the winsock stuff */
+  curl_global_init(CURL_GLOBAL_ALL);
+
+  /* get a curl handle */
+  curl = curl_easy_init();
+  if(curl) {
+    /* we want to use our own read function */
+    curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
+
+    /* enable uploading */
+    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+
+    /* HTTP PUT please */
+    curl_easy_setopt(curl, CURLOPT_PUT, 1L);
+
+    /* specify target URL, and note that this URL should include a file
+       name, not only a directory */
+    curl_easy_setopt(curl, CURLOPT_URL, url);
+
+    /* now specify which file to upload */
+    curl_easy_setopt(curl, CURLOPT_READDATA, hd_src);
+
+    /* provide the size of the upload, we specicially typecast the value
+       to curl_off_t since we must be sure to use the correct data size */
+    curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE,
+                     (curl_off_t)file_info.st_size);
+
+    /* Now run off and do what you've been told! */
+    res = curl_easy_perform(curl);
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+  fclose(hd_src); /* close the local file */
+
+  curl_global_cleanup();
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/https.c b/components/cronet/third_party/curl_headers/docs/examples/https.c
new file mode 100644
index 0000000..cca83fee
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/https.c
@@ -0,0 +1,78 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Simple HTTPS GET
+ * </DESC>
+ */
+#include <stdio.h>
+#include <curl/curl.h>
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+
+  curl_global_init(CURL_GLOBAL_DEFAULT);
+
+  curl = curl_easy_init();
+  if(curl) {
+    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+
+#ifdef SKIP_PEER_VERIFICATION
+    /*
+     * If you want to connect to a site who isn't using a certificate that is
+     * signed by one of the certs in the CA bundle you have, you can skip the
+     * verification of the server's certificate. This makes the connection
+     * A LOT LESS SECURE.
+     *
+     * If you have a CA cert for the server stored someplace else than in the
+     * default bundle, then the CURLOPT_CAPATH option might come handy for
+     * you.
+     */
+    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
+#endif
+
+#ifdef SKIP_HOSTNAME_VERIFICATION
+    /*
+     * If the site you're connecting to uses a different host name that what
+     * they have mentioned in their server certificate's commonName (or
+     * subjectAltName) fields, libcurl will refuse to connect. You can skip
+     * this check, but this will make the connection less secure.
+     */
+    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
+#endif
+
+    /* Perform the request, res will get the return code */
+    res = curl_easy_perform(curl);
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  curl_global_cleanup();
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/imap-append.c b/components/cronet/third_party/curl_headers/docs/examples/imap-append.c
new file mode 100644
index 0000000..157d574
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/imap-append.c
@@ -0,0 +1,132 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * IMAP example showing how to send e-mails
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to send mail using libcurl's IMAP
+ * capabilities.
+ *
+ * Note that this example requires libcurl 7.30.0 or above.
+ */
+
+#define FROM    "<sender@example.org>"
+#define TO      "<addressee@example.net>"
+#define CC      "<info@example.org>"
+
+static const char *payload_text[] = {
+  "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n",
+  "To: " TO "\r\n",
+  "From: " FROM "(Example User)\r\n",
+  "Cc: " CC "(Another example User)\r\n",
+  "Message-ID: "
+  "<dcd7cb36-11db-487a-9f3a-e652a9458efd@rfcpedant.example.org>\r\n",
+  "Subject: IMAP example message\r\n",
+  "\r\n", /* empty line to divide headers from body, see RFC5322 */
+  "The body of the message starts here.\r\n",
+  "\r\n",
+  "It could be a lot of lines, could be MIME encoded, whatever.\r\n",
+  "Check RFC5322.\r\n",
+  NULL
+};
+
+struct upload_status {
+  int lines_read;
+};
+
+static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp)
+{
+  struct upload_status *upload_ctx = (struct upload_status *)userp;
+  const char *data;
+
+  if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) {
+    return 0;
+  }
+
+  data = payload_text[upload_ctx->lines_read];
+
+  if(data) {
+    size_t len = strlen(data);
+    memcpy(ptr, data, len);
+    upload_ctx->lines_read++;
+
+    return len;
+  }
+
+  return 0;
+}
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    const char **p;
+    long infilesize;
+    struct upload_status upload_ctx;
+
+    upload_ctx.lines_read = 0;
+
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* This will create a new message 100. Note that you should perform an
+     * EXAMINE command to obtain the UID of the next message to create and a
+     * SELECT to ensure you are creating the message in the OUTBOX. */
+    curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/100");
+
+    /* In this case, we're using a callback function to specify the data. You
+     * could just use the CURLOPT_READDATA option to specify a FILE pointer to
+     * read from. */
+    curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source);
+    curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx);
+    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+
+    infilesize = 0;
+    for(p = payload_text; *p; ++p) {
+      infilesize += (long)strlen(*p);
+    }
+    curl_easy_setopt(curl, CURLOPT_INFILESIZE, infilesize);
+
+    /* Perform the append */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/imap-copy.c b/components/cronet/third_party/curl_headers/docs/examples/imap-copy.c
new file mode 100644
index 0000000..1ef43f89
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/imap-copy.c
@@ -0,0 +1,71 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * IMAP example showing how to copy an e-mail from one folder to another
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to copy a mail from one mailbox folder
+ * to another using libcurl's IMAP capabilities.
+ *
+ * Note that this example requires libcurl 7.30.0 or above.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* This is source mailbox folder to select */
+    curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/INBOX");
+
+    /* Set the COPY command specifying the message ID and destination folder */
+    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "COPY 1 FOLDER");
+
+    /* Note that to perform a move operation you will need to perform the copy,
+     * then mark the original mail as Deleted and EXPUNGE or CLOSE. Please see
+     * imap-store.c for more information on deleting messages. */
+
+    /* Perform the custom request */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/imap-create.c b/components/cronet/third_party/curl_headers/docs/examples/imap-create.c
new file mode 100644
index 0000000..6f04453b
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/imap-create.c
@@ -0,0 +1,67 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * IMAP example showing how to create a new folder
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to create a new mailbox folder using
+ * libcurl's IMAP capabilities.
+ *
+ * Note that this example requires libcurl 7.30.0 or above.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* This is just the server URL */
+    curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com");
+
+    /* Set the CREATE command specifying the new folder name */
+    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "CREATE FOLDER");
+
+    /* Perform the custom request */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/imap-delete.c b/components/cronet/third_party/curl_headers/docs/examples/imap-delete.c
new file mode 100644
index 0000000..cf1ae0bb
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/imap-delete.c
@@ -0,0 +1,67 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * IMAP example showing how to delete a folder
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to delete an existing mailbox folder
+ * using libcurl's IMAP capabilities.
+ *
+ * Note that this example requires libcurl 7.30.0 or above.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* This is just the server URL */
+    curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com");
+
+    /* Set the DELETE command specifying the existing folder */
+    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE FOLDER");
+
+    /* Perform the custom request */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/imap-examine.c b/components/cronet/third_party/curl_headers/docs/examples/imap-examine.c
new file mode 100644
index 0000000..b89e9dc
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/imap-examine.c
@@ -0,0 +1,67 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * IMAP example showing how to obtain information about a folder
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to obtain information about a mailbox
+ * folder using libcurl's IMAP capabilities via the EXAMINE command.
+ *
+ * Note that this example requires libcurl 7.30.0 or above.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* This is just the server URL */
+    curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com");
+
+    /* Set the EXAMINE command specifying the mailbox folder */
+    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "EXAMINE OUTBOX");
+
+    /* Perform the custom request */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/imap-fetch.c b/components/cronet/third_party/curl_headers/docs/examples/imap-fetch.c
new file mode 100644
index 0000000..192d2e9
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/imap-fetch.c
@@ -0,0 +1,65 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * IMAP example showing how to retreieve e-mails
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to fetch mail using libcurl's IMAP
+ * capabilities.
+ *
+ * Note that this example requires libcurl 7.30.0 or above.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* This will fetch message 1 from the user's inbox */
+    curl_easy_setopt(curl, CURLOPT_URL,
+                     "imap://imap.example.com/INBOX/;UID=1");
+
+    /* Perform the fetch */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/imap-list.c b/components/cronet/third_party/curl_headers/docs/examples/imap-list.c
new file mode 100644
index 0000000..291e1e6
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/imap-list.c
@@ -0,0 +1,66 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * IMAP example to list the folders within a mailbox
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to list the folders within an IMAP
+ * mailbox.
+ *
+ * Note that this example requires libcurl 7.30.0 or above.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* This will list the folders within the user's mailbox. If you want to
+     * list the folders within a specific folder, for example the inbox, then
+     * specify the folder as a path in the URL such as /INBOX */
+    curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com");
+
+    /* Perform the list */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/imap-lsub.c b/components/cronet/third_party/curl_headers/docs/examples/imap-lsub.c
new file mode 100644
index 0000000..d130c3d
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/imap-lsub.c
@@ -0,0 +1,68 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * IMAP example to list the subscribed folders
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to list the subscribed folders within
+ * an IMAP mailbox.
+ *
+ * Note that this example requires libcurl 7.30.0 or above.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* This is just the server URL */
+    curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com");
+
+    /* Set the LSUB command. Note the syntax is very similar to that of a LIST
+       command. */
+    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "LSUB \"\" *");
+
+    /* Perform the custom request */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/imap-multi.c b/components/cronet/third_party/curl_headers/docs/examples/imap-multi.c
new file mode 100644
index 0000000..07d1b8b
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/imap-multi.c
@@ -0,0 +1,173 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * IMAP example using the multi interface
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to fetch mail using libcurl's IMAP
+ * capabilities. It builds on the imap-fetch.c example to demonstrate how to
+ * use libcurl's multi interface.
+ *
+ * Note that this example requires libcurl 7.30.0 or above.
+ */
+
+#define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000
+
+static struct timeval tvnow(void)
+{
+  struct timeval now;
+
+  /* time() returns the value of time in seconds since the epoch */
+  now.tv_sec = (long)time(NULL);
+  now.tv_usec = 0;
+
+  return now;
+}
+
+static long tvdiff(struct timeval newer, struct timeval older)
+{
+  return (newer.tv_sec - older.tv_sec) * 1000 +
+    (newer.tv_usec - older.tv_usec) / 1000;
+}
+
+int main(void)
+{
+  CURL *curl;
+  CURLM *mcurl;
+  int still_running = 1;
+  struct timeval mp_start;
+
+  curl_global_init(CURL_GLOBAL_DEFAULT);
+
+  curl = curl_easy_init();
+  if(!curl)
+    return 1;
+
+  mcurl = curl_multi_init();
+  if(!mcurl)
+    return 2;
+
+  /* Set username and password */
+  curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+  curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+  /* This will fetch message 1 from the user's inbox */
+  curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/INBOX/;UID=1");
+
+  /* Tell the multi stack about our easy handle */
+  curl_multi_add_handle(mcurl, curl);
+
+  /* Record the start time which we can use later */
+  mp_start = tvnow();
+
+  /* We start some action by calling perform right away */
+  curl_multi_perform(mcurl, &still_running);
+
+  while(still_running) {
+    struct timeval timeout;
+    fd_set fdread;
+    fd_set fdwrite;
+    fd_set fdexcep;
+    int maxfd = -1;
+    int rc;
+    CURLMcode mc; /* curl_multi_fdset() return code */
+
+    long curl_timeo = -1;
+
+    /* Initialise the file descriptors */
+    FD_ZERO(&fdread);
+    FD_ZERO(&fdwrite);
+    FD_ZERO(&fdexcep);
+
+    /* Set a suitable timeout to play around with */
+    timeout.tv_sec = 1;
+    timeout.tv_usec = 0;
+
+    curl_multi_timeout(mcurl, &curl_timeo);
+    if(curl_timeo >= 0) {
+      timeout.tv_sec = curl_timeo / 1000;
+      if(timeout.tv_sec > 1)
+        timeout.tv_sec = 1;
+      else
+        timeout.tv_usec = (curl_timeo % 1000) * 1000;
+    }
+
+    /* get file descriptors from the transfers */
+    mc = curl_multi_fdset(mcurl, &fdread, &fdwrite, &fdexcep, &maxfd);
+
+    if(mc != CURLM_OK) {
+      fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
+      break;
+    }
+
+    /* On success the value of maxfd is guaranteed to be >= -1. We call
+       select(maxfd + 1, ...); specially in case of (maxfd == -1) there are
+       no fds ready yet so we call select(0, ...) --or Sleep() on Windows--
+       to sleep 100ms, which is the minimum suggested value in the
+       curl_multi_fdset() doc. */
+
+    if(maxfd == -1) {
+#ifdef _WIN32
+      Sleep(100);
+      rc = 0;
+#else
+      /* Portable sleep for platforms other than Windows. */
+      struct timeval wait = { 0, 100 * 1000 }; /* 100ms */
+      rc = select(0, NULL, NULL, NULL, &wait);
+#endif
+    }
+    else {
+      /* Note that on some platforms 'timeout' may be modified by select().
+         If you need access to the original value save a copy beforehand. */
+      rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
+    }
+
+    if(tvdiff(tvnow(), mp_start) > MULTI_PERFORM_HANG_TIMEOUT) {
+      fprintf(stderr,
+              "ABORTING: Since it seems that we would have run forever.\n");
+      break;
+    }
+
+    switch(rc) {
+    case -1:  /* select error */
+      break;
+    case 0:   /* timeout */
+    default:  /* action */
+      curl_multi_perform(mcurl, &still_running);
+      break;
+    }
+  }
+
+  /* Always cleanup */
+  curl_multi_remove_handle(mcurl, curl);
+  curl_multi_cleanup(mcurl);
+  curl_easy_cleanup(curl);
+  curl_global_cleanup();
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/imap-noop.c b/components/cronet/third_party/curl_headers/docs/examples/imap-noop.c
new file mode 100644
index 0000000..566890e
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/imap-noop.c
@@ -0,0 +1,67 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * IMAP example showing how to perform a noop
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to perform a noop using libcurl's IMAP
+ * capabilities.
+ *
+ * Note that this example requires libcurl 7.30.0 or above.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* This is just the server URL */
+    curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com");
+
+    /* Set the NOOP command */
+    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "NOOP");
+
+    /* Perform the custom request */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/imap-search.c b/components/cronet/third_party/curl_headers/docs/examples/imap-search.c
new file mode 100644
index 0000000..427dcc9
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/imap-search.c
@@ -0,0 +1,71 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * IMAP example showing how to search for new e-mails
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to search for new messages using
+ * libcurl's IMAP capabilities.
+ *
+ * Note that this example requires libcurl 7.30.0 or above.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* This is mailbox folder to select */
+    curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/INBOX");
+
+    /* Set the SEARCH command specifying what we want to search for. Note that
+     * this can contain a message sequence set and a number of search criteria
+     * keywords including flags such as ANSWERED, DELETED, DRAFT, FLAGGED, NEW,
+     * RECENT and SEEN. For more information about the search criteria please
+     * see RFC-3501 section 6.4.4.   */
+    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "SEARCH NEW");
+
+    /* Perform the custom request */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/imap-ssl.c b/components/cronet/third_party/curl_headers/docs/examples/imap-ssl.c
new file mode 100644
index 0000000..69839ad
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/imap-ssl.c
@@ -0,0 +1,92 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * IMAP example using SSL
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to fetch mail using libcurl's IMAP
+ * capabilities. It builds on the imap-fetch.c example adding transport
+ * security to protect the authentication details from being snooped.
+ *
+ * Note that this example requires libcurl 7.30.0 or above.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* This will fetch message 1 from the user's inbox. Note the use of
+    * imaps:// rather than imap:// to request a SSL based connection. */
+    curl_easy_setopt(curl, CURLOPT_URL,
+                     "imaps://imap.example.com/INBOX/;UID=1");
+
+    /* If you want to connect to a site who isn't using a certificate that is
+     * signed by one of the certs in the CA bundle you have, you can skip the
+     * verification of the server's certificate. This makes the connection
+     * A LOT LESS SECURE.
+     *
+     * If you have a CA cert for the server stored someplace else than in the
+     * default bundle, then the CURLOPT_CAPATH option might come handy for
+     * you. */
+#ifdef SKIP_PEER_VERIFICATION
+    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
+#endif
+
+    /* If the site you're connecting to uses a different host name that what
+     * they have mentioned in their server certificate's commonName (or
+     * subjectAltName) fields, libcurl will refuse to connect. You can skip
+     * this check, but this will make the connection less secure. */
+#ifdef SKIP_HOSTNAME_VERIFICATION
+    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
+#endif
+
+    /* Since the traffic will be encrypted, it is very useful to turn on debug
+     * information within libcurl to see what is happening during the
+     * transfer */
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+    /* Perform the fetch */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/imap-store.c b/components/cronet/third_party/curl_headers/docs/examples/imap-store.c
new file mode 100644
index 0000000..8479457b
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/imap-store.c
@@ -0,0 +1,82 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * IMAP example showing how to modify the properties of an e-mail
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to modify an existing mail using
+ * libcurl's IMAP capabilities with the STORE command.
+ *
+ * Note that this example requires libcurl 7.30.0 or above.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* This is the mailbox folder to select */
+    curl_easy_setopt(curl, CURLOPT_URL, "imap://imap.example.com/INBOX");
+
+    /* Set the STORE command with the Deleted flag for message 1. Note that
+     * you can use the STORE command to set other flags such as Seen, Answered,
+     * Flagged, Draft and Recent. */
+    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "STORE 1 +Flags \\Deleted");
+
+    /* Perform the custom request */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+    else {
+      /* Set the EXPUNGE command, although you can use the CLOSE command if you
+       * don't want to know the result of the STORE */
+      curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "EXPUNGE");
+
+      /* Perform the second custom request */
+      res = curl_easy_perform(curl);
+
+      /* Check for errors */
+      if(res != CURLE_OK)
+        fprintf(stderr, "curl_easy_perform() failed: %s\n",
+                curl_easy_strerror(res));
+    }
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/imap-tls.c b/components/cronet/third_party/curl_headers/docs/examples/imap-tls.c
new file mode 100644
index 0000000..7daa0bf
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/imap-tls.c
@@ -0,0 +1,92 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * IMAP example using TLS
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to fetch mail using libcurl's IMAP
+ * capabilities. It builds on the imap-fetch.c example adding transport
+ * security to protect the authentication details from being snooped.
+ *
+ * Note that this example requires libcurl 7.30.0 or above.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* This will fetch message 1 from the user's inbox */
+    curl_easy_setopt(curl, CURLOPT_URL,
+                     "imap://imap.example.com/INBOX/;UID=1");
+
+    /* In this example, we'll start with a plain text connection, and upgrade
+     * to Transport Layer Security (TLS) using the STARTTLS command. Be careful
+     * of using CURLUSESSL_TRY here, because if TLS upgrade fails, the transfer
+     * will continue anyway - see the security discussion in the libcurl
+     * tutorial for more details. */
+    curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL);
+
+    /* If your server doesn't have a valid certificate, then you can disable
+     * part of the Transport Layer Security protection by setting the
+     * CURLOPT_SSL_VERIFYPEER and CURLOPT_SSL_VERIFYHOST options to 0 (false).
+     *   curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
+     *   curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
+     *
+     * That is, in general, a bad idea. It is still better than sending your
+     * authentication details in plain text though.  Instead, you should get
+     * the issuer certificate (or the host certificate if the certificate is
+     * self-signed) and add it to the set of certificates that are known to
+     * libcurl using CURLOPT_CAINFO and/or CURLOPT_CAPATH. See docs/SSLCERTS
+     * for more information. */
+    curl_easy_setopt(curl, CURLOPT_CAINFO, "/path/to/certificate.pem");
+
+    /* Since the traffic will be encrypted, it is very useful to turn on debug
+     * information within libcurl to see what is happening during the
+     * transfer */
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+    /* Perform the fetch */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/makefile.dj b/components/cronet/third_party/curl_headers/docs/examples/makefile.dj
new file mode 100644
index 0000000..17d93ab8
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/makefile.dj
@@ -0,0 +1,55 @@
+#***************************************************************************
+#                                  _   _ ____  _
+#  Project                     ___| | | |  _ \| |
+#                             / __| | | | |_) | |
+#                            | (__| |_| |  _ <| |___
+#                             \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+TOPDIR = ../..
+
+include $(TOPDIR)/packages/DOS/common.dj
+
+CFLAGS += -DFALSE=0 -DTRUE=1
+
+LIBS = $(TOPDIR)/lib/libcurl.a
+
+ifeq ($(USE_SSL),1)
+  LIBS += $(OPENSSL_ROOT)/lib/libssl.a $(OPENSSL_ROOT)/lib/libcrypt.a
+endif
+
+ifeq ($(USE_IDNA),1)
+  LIBS += $(LIBIDN_ROOT)/lib/dj_obj/libidn.a -liconv
+endif
+
+LIBS += $(WATT32_ROOT)/lib/libwatt.a $(ZLIB_ROOT)/libz.a
+
+include Makefile.inc
+
+PROGRAMS = $(patsubst %,%.exe,$(check_PROGRAMS))
+
+all: $(PROGRAMS)
+	@echo Welcome to libcurl example program
+
+%.exe: %.c
+	$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
+	@echo
+
+clean vclean realclean:
+	- rm -f $(PROGRAMS) depend.dj
+
+-include depend.dj
diff --git a/components/cronet/third_party/curl_headers/docs/examples/multi-app.c b/components/cronet/third_party/curl_headers/docs/examples/multi-app.c
new file mode 100644
index 0000000..b98a25161
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/multi-app.c
@@ -0,0 +1,177 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * A basic application source code using the multi interface doing two
+ * transfers in parallel.
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+/* somewhat unix-specific */
+#include <sys/time.h>
+#include <unistd.h>
+
+/* curl stuff */
+#include <curl/curl.h>
+
+/*
+ * Download a HTTP file and upload an FTP file simultaneously.
+ */
+
+#define HANDLECOUNT 2   /* Number of simultaneous transfers */
+#define HTTP_HANDLE 0   /* Index for the HTTP transfer */
+#define FTP_HANDLE 1    /* Index for the FTP transfer */
+
+int main(void)
+{
+  CURL *handles[HANDLECOUNT];
+  CURLM *multi_handle;
+
+  int still_running = 0; /* keep number of running handles */
+  int i;
+
+  CURLMsg *msg; /* for picking up messages with the transfer status */
+  int msgs_left; /* how many messages are left */
+
+  /* Allocate one CURL handle per transfer */
+  for(i = 0; i<HANDLECOUNT; i++)
+    handles[i] = curl_easy_init();
+
+  /* set the options (I left out a few, you'll get the point anyway) */
+  curl_easy_setopt(handles[HTTP_HANDLE], CURLOPT_URL, "https://example.com");
+
+  curl_easy_setopt(handles[FTP_HANDLE], CURLOPT_URL, "ftp://example.com");
+  curl_easy_setopt(handles[FTP_HANDLE], CURLOPT_UPLOAD, 1L);
+
+  /* init a multi stack */
+  multi_handle = curl_multi_init();
+
+  /* add the individual transfers */
+  for(i = 0; i<HANDLECOUNT; i++)
+    curl_multi_add_handle(multi_handle, handles[i]);
+
+  /* we start some action by calling perform right away */
+  curl_multi_perform(multi_handle, &still_running);
+
+  while(still_running) {
+    struct timeval timeout;
+    int rc; /* select() return code */
+    CURLMcode mc; /* curl_multi_fdset() return code */
+
+    fd_set fdread;
+    fd_set fdwrite;
+    fd_set fdexcep;
+    int maxfd = -1;
+
+    long curl_timeo = -1;
+
+    FD_ZERO(&fdread);
+    FD_ZERO(&fdwrite);
+    FD_ZERO(&fdexcep);
+
+    /* set a suitable timeout to play around with */
+    timeout.tv_sec = 1;
+    timeout.tv_usec = 0;
+
+    curl_multi_timeout(multi_handle, &curl_timeo);
+    if(curl_timeo >= 0) {
+      timeout.tv_sec = curl_timeo / 1000;
+      if(timeout.tv_sec > 1)
+        timeout.tv_sec = 1;
+      else
+        timeout.tv_usec = (curl_timeo % 1000) * 1000;
+    }
+
+    /* get file descriptors from the transfers */
+    mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
+
+    if(mc != CURLM_OK) {
+      fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
+      break;
+    }
+
+    /* On success the value of maxfd is guaranteed to be >= -1. We call
+       select(maxfd + 1, ...); specially in case of (maxfd == -1) there are
+       no fds ready yet so we call select(0, ...) --or Sleep() on Windows--
+       to sleep 100ms, which is the minimum suggested value in the
+       curl_multi_fdset() doc. */
+
+    if(maxfd == -1) {
+#ifdef _WIN32
+      Sleep(100);
+      rc = 0;
+#else
+      /* Portable sleep for platforms other than Windows. */
+      struct timeval wait = { 0, 100 * 1000 }; /* 100ms */
+      rc = select(0, NULL, NULL, NULL, &wait);
+#endif
+    }
+    else {
+      /* Note that on some platforms 'timeout' may be modified by select().
+         If you need access to the original value save a copy beforehand. */
+      rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
+    }
+
+    switch(rc) {
+    case -1:
+      /* select error */
+      break;
+    case 0: /* timeout */
+    default: /* action */
+      curl_multi_perform(multi_handle, &still_running);
+      break;
+    }
+  }
+
+  /* See how the transfers went */
+  while((msg = curl_multi_info_read(multi_handle, &msgs_left))) {
+    if(msg->msg == CURLMSG_DONE) {
+      int idx;
+
+      /* Find out which handle this message is about */
+      for(idx = 0; idx<HANDLECOUNT; idx++) {
+        int found = (msg->easy_handle == handles[idx]);
+        if(found)
+          break;
+      }
+
+      switch(idx) {
+      case HTTP_HANDLE:
+        printf("HTTP transfer completed with status %d\n", msg->data.result);
+        break;
+      case FTP_HANDLE:
+        printf("FTP transfer completed with status %d\n", msg->data.result);
+        break;
+      }
+    }
+  }
+
+  curl_multi_cleanup(multi_handle);
+
+  /* Free the CURL handles */
+  for(i = 0; i<HANDLECOUNT; i++)
+    curl_easy_cleanup(handles[i]);
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/multi-debugcallback.c b/components/cronet/third_party/curl_headers/docs/examples/multi-debugcallback.c
new file mode 100644
index 0000000..59f72442
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/multi-debugcallback.c
@@ -0,0 +1,231 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * multi interface and debug callback
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+/* somewhat unix-specific */
+#include <sys/time.h>
+#include <unistd.h>
+
+/* curl stuff */
+#include <curl/curl.h>
+
+typedef char bool;
+#define TRUE 1
+
+static
+void dump(const char *text,
+          FILE *stream, unsigned char *ptr, size_t size,
+          bool nohex)
+{
+  size_t i;
+  size_t c;
+
+  unsigned int width = 0x10;
+
+  if(nohex)
+    /* without the hex output, we can fit more on screen */
+    width = 0x40;
+
+  fprintf(stream, "%s, %10.10lu bytes (0x%8.8lx)\n",
+          text, (unsigned long)size, (unsigned long)size);
+
+  for(i = 0; i<size; i += width) {
+
+    fprintf(stream, "%4.4lx: ", (unsigned long)i);
+
+    if(!nohex) {
+      /* hex not disabled, show it */
+      for(c = 0; c < width; c++)
+        if(i + c < size)
+          fprintf(stream, "%02x ", ptr[i + c]);
+        else
+          fputs("   ", stream);
+    }
+
+    for(c = 0; (c < width) && (i + c < size); c++) {
+      /* check for 0D0A; if found, skip past and start a new line of output */
+      if(nohex && (i + c + 1 < size) && ptr[i + c] == 0x0D &&
+         ptr[i + c + 1] == 0x0A) {
+        i += (c + 2 - width);
+        break;
+      }
+      fprintf(stream, "%c",
+              (ptr[i + c] >= 0x20) && (ptr[i + c]<0x80)?ptr[i + c]:'.');
+      /* check again for 0D0A, to avoid an extra \n if it's at width */
+      if(nohex && (i + c + 2 < size) && ptr[i + c + 1] == 0x0D &&
+         ptr[i + c + 2] == 0x0A) {
+        i += (c + 3 - width);
+        break;
+      }
+    }
+    fputc('\n', stream); /* newline */
+  }
+  fflush(stream);
+}
+
+static
+int my_trace(CURL *handle, curl_infotype type,
+             unsigned char *data, size_t size,
+             void *userp)
+{
+  const char *text;
+
+  (void)userp;
+  (void)handle; /* prevent compiler warning */
+
+  switch(type) {
+  case CURLINFO_TEXT:
+    fprintf(stderr, "== Info: %s", data);
+    /* FALLTHROUGH */
+  default: /* in case a new one is introduced to shock us */
+    return 0;
+
+  case CURLINFO_HEADER_OUT:
+    text = "=> Send header";
+    break;
+  case CURLINFO_DATA_OUT:
+    text = "=> Send data";
+    break;
+  case CURLINFO_HEADER_IN:
+    text = "<= Recv header";
+    break;
+  case CURLINFO_DATA_IN:
+    text = "<= Recv data";
+    break;
+  }
+
+  dump(text, stderr, data, size, TRUE);
+  return 0;
+}
+
+/*
+ * Simply download a HTTP file.
+ */
+int main(void)
+{
+  CURL *http_handle;
+  CURLM *multi_handle;
+
+  int still_running = 0; /* keep number of running handles */
+
+  http_handle = curl_easy_init();
+
+  /* set the options (I left out a few, you'll get the point anyway) */
+  curl_easy_setopt(http_handle, CURLOPT_URL, "https://www.example.com/");
+
+  curl_easy_setopt(http_handle, CURLOPT_DEBUGFUNCTION, my_trace);
+  curl_easy_setopt(http_handle, CURLOPT_VERBOSE, 1L);
+
+  /* init a multi stack */
+  multi_handle = curl_multi_init();
+
+  /* add the individual transfers */
+  curl_multi_add_handle(multi_handle, http_handle);
+
+  /* we start some action by calling perform right away */
+  curl_multi_perform(multi_handle, &still_running);
+
+  while(still_running) {
+    struct timeval timeout;
+    int rc; /* select() return code */
+    CURLMcode mc; /* curl_multi_fdset() return code */
+
+    fd_set fdread;
+    fd_set fdwrite;
+    fd_set fdexcep;
+    int maxfd = -1;
+
+    long curl_timeo = -1;
+
+    FD_ZERO(&fdread);
+    FD_ZERO(&fdwrite);
+    FD_ZERO(&fdexcep);
+
+    /* set a suitable timeout to play around with */
+    timeout.tv_sec = 1;
+    timeout.tv_usec = 0;
+
+    curl_multi_timeout(multi_handle, &curl_timeo);
+    if(curl_timeo >= 0) {
+      timeout.tv_sec = curl_timeo / 1000;
+      if(timeout.tv_sec > 1)
+        timeout.tv_sec = 1;
+      else
+        timeout.tv_usec = (curl_timeo % 1000) * 1000;
+    }
+
+    /* get file descriptors from the transfers */
+    mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
+
+    if(mc != CURLM_OK) {
+      fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
+      break;
+    }
+
+    /* On success the value of maxfd is guaranteed to be >= -1. We call
+       select(maxfd + 1, ...); specially in case of (maxfd == -1) there are
+       no fds ready yet so we call select(0, ...) --or Sleep() on Windows--
+       to sleep 100ms, which is the minimum suggested value in the
+       curl_multi_fdset() doc. */
+
+    if(maxfd == -1) {
+#ifdef _WIN32
+      Sleep(100);
+      rc = 0;
+#else
+      /* Portable sleep for platforms other than Windows. */
+      struct timeval wait = { 0, 100 * 1000 }; /* 100ms */
+      rc = select(0, NULL, NULL, NULL, &wait);
+#endif
+    }
+    else {
+      /* Note that on some platforms 'timeout' may be modified by select().
+         If you need access to the original value save a copy beforehand. */
+      rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
+    }
+
+    switch(rc) {
+    case -1:
+      /* select error */
+      still_running = 0;
+      printf("select() returns error, this is badness\n");
+      break;
+    case 0:
+    default:
+      /* timeout or readable/writable sockets */
+      curl_multi_perform(multi_handle, &still_running);
+      break;
+    }
+  }
+
+  curl_multi_cleanup(multi_handle);
+
+  curl_easy_cleanup(http_handle);
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/multi-double.c b/components/cronet/third_party/curl_headers/docs/examples/multi-double.c
new file mode 100644
index 0000000..644e64b
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/multi-double.c
@@ -0,0 +1,143 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * multi interface code doing two parallel HTTP transfers
+ * </DESC>
+ */
+#include <stdio.h>
+#include <string.h>
+
+/* somewhat unix-specific */
+#include <sys/time.h>
+#include <unistd.h>
+
+/* curl stuff */
+#include <curl/curl.h>
+
+/*
+ * Simply download two HTTP files!
+ */
+int main(void)
+{
+  CURL *http_handle;
+  CURL *http_handle2;
+  CURLM *multi_handle;
+
+  int still_running = 0; /* keep number of running handles */
+
+  http_handle = curl_easy_init();
+  http_handle2 = curl_easy_init();
+
+  /* set options */
+  curl_easy_setopt(http_handle, CURLOPT_URL, "https://www.example.com/");
+
+  /* set options */
+  curl_easy_setopt(http_handle2, CURLOPT_URL, "http://localhost/");
+
+  /* init a multi stack */
+  multi_handle = curl_multi_init();
+
+  /* add the individual transfers */
+  curl_multi_add_handle(multi_handle, http_handle);
+  curl_multi_add_handle(multi_handle, http_handle2);
+
+  /* we start some action by calling perform right away */
+  curl_multi_perform(multi_handle, &still_running);
+
+  while(still_running) {
+    struct timeval timeout;
+    int rc; /* select() return code */
+    CURLMcode mc; /* curl_multi_fdset() return code */
+
+    fd_set fdread;
+    fd_set fdwrite;
+    fd_set fdexcep;
+    int maxfd = -1;
+
+    long curl_timeo = -1;
+
+    FD_ZERO(&fdread);
+    FD_ZERO(&fdwrite);
+    FD_ZERO(&fdexcep);
+
+    /* set a suitable timeout to play around with */
+    timeout.tv_sec = 1;
+    timeout.tv_usec = 0;
+
+    curl_multi_timeout(multi_handle, &curl_timeo);
+    if(curl_timeo >= 0) {
+      timeout.tv_sec = curl_timeo / 1000;
+      if(timeout.tv_sec > 1)
+        timeout.tv_sec = 1;
+      else
+        timeout.tv_usec = (curl_timeo % 1000) * 1000;
+    }
+
+    /* get file descriptors from the transfers */
+    mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
+
+    if(mc != CURLM_OK) {
+      fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
+      break;
+    }
+
+    /* On success the value of maxfd is guaranteed to be >= -1. We call
+       select(maxfd + 1, ...); specially in case of (maxfd == -1) there are
+       no fds ready yet so we call select(0, ...) --or Sleep() on Windows--
+       to sleep 100ms, which is the minimum suggested value in the
+       curl_multi_fdset() doc. */
+
+    if(maxfd == -1) {
+#ifdef _WIN32
+      Sleep(100);
+      rc = 0;
+#else
+      /* Portable sleep for platforms other than Windows. */
+      struct timeval wait = { 0, 100 * 1000 }; /* 100ms */
+      rc = select(0, NULL, NULL, NULL, &wait);
+#endif
+    }
+    else {
+      /* Note that on some platforms 'timeout' may be modified by select().
+         If you need access to the original value save a copy beforehand. */
+      rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
+    }
+
+    switch(rc) {
+    case -1:
+      /* select error */
+      break;
+    case 0:
+    default:
+      /* timeout or readable/writable sockets */
+      curl_multi_perform(multi_handle, &still_running);
+      break;
+    }
+  }
+
+  curl_multi_cleanup(multi_handle);
+
+  curl_easy_cleanup(http_handle);
+  curl_easy_cleanup(http_handle2);
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/multi-formadd.c b/components/cronet/third_party/curl_headers/docs/examples/multi-formadd.c
new file mode 100644
index 0000000..c1bb135
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/multi-formadd.c
@@ -0,0 +1,171 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * using the multi interface to do a multipart formpost without blocking
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/time.h>
+
+#include <curl/curl.h>
+
+int main(void)
+{
+  CURL *curl;
+
+  CURLM *multi_handle;
+  int still_running = 0;
+
+  struct curl_httppost *formpost = NULL;
+  struct curl_httppost *lastptr = NULL;
+  struct curl_slist *headerlist = NULL;
+  static const char buf[] = "Expect:";
+
+  /* Fill in the file upload field. This makes libcurl load data from
+     the given file name when curl_easy_perform() is called. */
+  curl_formadd(&formpost,
+               &lastptr,
+               CURLFORM_COPYNAME, "sendfile",
+               CURLFORM_FILE, "postit2.c",
+               CURLFORM_END);
+
+  /* Fill in the filename field */
+  curl_formadd(&formpost,
+               &lastptr,
+               CURLFORM_COPYNAME, "filename",
+               CURLFORM_COPYCONTENTS, "postit2.c",
+               CURLFORM_END);
+
+  /* Fill in the submit field too, even if this is rarely needed */
+  curl_formadd(&formpost,
+               &lastptr,
+               CURLFORM_COPYNAME, "submit",
+               CURLFORM_COPYCONTENTS, "send",
+               CURLFORM_END);
+
+  curl = curl_easy_init();
+  multi_handle = curl_multi_init();
+
+  /* initialize custom header list (stating that Expect: 100-continue is not
+     wanted */
+  headerlist = curl_slist_append(headerlist, buf);
+  if(curl && multi_handle) {
+
+    /* what URL that receives this POST */
+    curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/upload.cgi");
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
+    curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
+
+    curl_multi_add_handle(multi_handle, curl);
+
+    curl_multi_perform(multi_handle, &still_running);
+
+    while(still_running) {
+      struct timeval timeout;
+      int rc; /* select() return code */
+      CURLMcode mc; /* curl_multi_fdset() return code */
+
+      fd_set fdread;
+      fd_set fdwrite;
+      fd_set fdexcep;
+      int maxfd = -1;
+
+      long curl_timeo = -1;
+
+      FD_ZERO(&fdread);
+      FD_ZERO(&fdwrite);
+      FD_ZERO(&fdexcep);
+
+      /* set a suitable timeout to play around with */
+      timeout.tv_sec = 1;
+      timeout.tv_usec = 0;
+
+      curl_multi_timeout(multi_handle, &curl_timeo);
+      if(curl_timeo >= 0) {
+        timeout.tv_sec = curl_timeo / 1000;
+        if(timeout.tv_sec > 1)
+          timeout.tv_sec = 1;
+        else
+          timeout.tv_usec = (curl_timeo % 1000) * 1000;
+      }
+
+      /* get file descriptors from the transfers */
+      mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
+
+      if(mc != CURLM_OK) {
+        fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
+        break;
+      }
+
+      /* On success the value of maxfd is guaranteed to be >= -1. We call
+         select(maxfd + 1, ...); specially in case of (maxfd == -1) there are
+         no fds ready yet so we call select(0, ...) --or Sleep() on Windows--
+         to sleep 100ms, which is the minimum suggested value in the
+         curl_multi_fdset() doc. */
+
+      if(maxfd == -1) {
+#ifdef _WIN32
+        Sleep(100);
+        rc = 0;
+#else
+        /* Portable sleep for platforms other than Windows. */
+        struct timeval wait = { 0, 100 * 1000 }; /* 100ms */
+        rc = select(0, NULL, NULL, NULL, &wait);
+#endif
+      }
+      else {
+        /* Note that on some platforms 'timeout' may be modified by select().
+           If you need access to the original value save a copy beforehand. */
+        rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
+      }
+
+      switch(rc) {
+      case -1:
+        /* select error */
+        break;
+      case 0:
+      default:
+        /* timeout or readable/writable sockets */
+        printf("perform!\n");
+        curl_multi_perform(multi_handle, &still_running);
+        printf("running: %d!\n", still_running);
+        break;
+      }
+    }
+
+    curl_multi_cleanup(multi_handle);
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+
+    /* then cleanup the formpost chain */
+    curl_formfree(formpost);
+
+    /* free slist */
+    curl_slist_free_all(headerlist);
+  }
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/multi-post.c b/components/cronet/third_party/curl_headers/docs/examples/multi-post.c
new file mode 100644
index 0000000..fe66ca9
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/multi-post.c
@@ -0,0 +1,167 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * using the multi interface to do a multipart formpost without blocking
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/time.h>
+
+#include <curl/curl.h>
+
+int main(void)
+{
+  CURL *curl;
+
+  CURLM *multi_handle;
+  int still_running = 0;
+
+  curl_mime *form = NULL;
+  curl_mimepart *field = NULL;
+  struct curl_slist *headerlist = NULL;
+  static const char buf[] = "Expect:";
+
+  curl = curl_easy_init();
+  multi_handle = curl_multi_init();
+
+  if(curl && multi_handle) {
+    /* Create the form */
+    form = curl_mime_init(curl);
+
+    /* Fill in the file upload field */
+    field = curl_mime_addpart(form);
+    curl_mime_name(field, "sendfile");
+    curl_mime_filedata(field, "multi-post.c");
+
+    /* Fill in the filename field */
+    field = curl_mime_addpart(form);
+    curl_mime_name(field, "filename");
+    curl_mime_data(field, "multi-post.c", CURL_ZERO_TERMINATED);
+
+    /* Fill in the submit field too, even if this is rarely needed */
+    field = curl_mime_addpart(form);
+    curl_mime_name(field, "submit");
+    curl_mime_data(field, "send", CURL_ZERO_TERMINATED);
+
+    /* initialize custom header list (stating that Expect: 100-continue is not
+       wanted */
+    headerlist = curl_slist_append(headerlist, buf);
+
+    /* what URL that receives this POST */
+    curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/upload.cgi");
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
+    curl_easy_setopt(curl, CURLOPT_MIMEPOST, form);
+
+    curl_multi_add_handle(multi_handle, curl);
+
+    curl_multi_perform(multi_handle, &still_running);
+
+    while(still_running) {
+      struct timeval timeout;
+      int rc; /* select() return code */
+      CURLMcode mc; /* curl_multi_fdset() return code */
+
+      fd_set fdread;
+      fd_set fdwrite;
+      fd_set fdexcep;
+      int maxfd = -1;
+
+      long curl_timeo = -1;
+
+      FD_ZERO(&fdread);
+      FD_ZERO(&fdwrite);
+      FD_ZERO(&fdexcep);
+
+      /* set a suitable timeout to play around with */
+      timeout.tv_sec = 1;
+      timeout.tv_usec = 0;
+
+      curl_multi_timeout(multi_handle, &curl_timeo);
+      if(curl_timeo >= 0) {
+        timeout.tv_sec = curl_timeo / 1000;
+        if(timeout.tv_sec > 1)
+          timeout.tv_sec = 1;
+        else
+          timeout.tv_usec = (curl_timeo % 1000) * 1000;
+      }
+
+      /* get file descriptors from the transfers */
+      mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
+
+      if(mc != CURLM_OK) {
+        fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
+        break;
+      }
+
+      /* On success the value of maxfd is guaranteed to be >= -1. We call
+         select(maxfd + 1, ...); specially in case of (maxfd == -1) there are
+         no fds ready yet so we call select(0, ...) --or Sleep() on Windows--
+         to sleep 100ms, which is the minimum suggested value in the
+         curl_multi_fdset() doc. */
+
+      if(maxfd == -1) {
+#ifdef _WIN32
+        Sleep(100);
+        rc = 0;
+#else
+        /* Portable sleep for platforms other than Windows. */
+        struct timeval wait = { 0, 100 * 1000 }; /* 100ms */
+        rc = select(0, NULL, NULL, NULL, &wait);
+#endif
+      }
+      else {
+        /* Note that on some platforms 'timeout' may be modified by select().
+           If you need access to the original value save a copy beforehand. */
+        rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
+      }
+
+      switch(rc) {
+      case -1:
+        /* select error */
+        break;
+      case 0:
+      default:
+        /* timeout or readable/writable sockets */
+        printf("perform!\n");
+        curl_multi_perform(multi_handle, &still_running);
+        printf("running: %d!\n", still_running);
+        break;
+      }
+    }
+
+    curl_multi_cleanup(multi_handle);
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+
+    /* then cleanup the form */
+    curl_mime_free(form);
+
+    /* free slist */
+    curl_slist_free_all(headerlist);
+  }
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/multi-single.c b/components/cronet/third_party/curl_headers/docs/examples/multi-single.c
new file mode 100644
index 0000000..530a5f5
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/multi-single.c
@@ -0,0 +1,111 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * using the multi interface to do a single download
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+/* somewhat unix-specific */
+#include <sys/time.h>
+#include <unistd.h>
+
+/* curl stuff */
+#include <curl/curl.h>
+
+#ifdef _WIN32
+#define WAITMS(x) Sleep(x)
+#else
+/* Portable sleep for platforms other than Windows. */
+#define WAITMS(x)                               \
+  struct timeval wait = { 0, (x) * 1000 };      \
+  (void)select(0, NULL, NULL, NULL, &wait);
+#endif
+
+/*
+ * Simply download a HTTP file.
+ */
+int main(void)
+{
+  CURL *http_handle;
+  CURLM *multi_handle;
+
+  int still_running = 0; /* keep number of running handles */
+  int repeats = 0;
+
+  curl_global_init(CURL_GLOBAL_DEFAULT);
+
+  http_handle = curl_easy_init();
+
+  /* set the options (I left out a few, you'll get the point anyway) */
+  curl_easy_setopt(http_handle, CURLOPT_URL, "https://www.example.com/");
+
+  /* init a multi stack */
+  multi_handle = curl_multi_init();
+
+  /* add the individual transfers */
+  curl_multi_add_handle(multi_handle, http_handle);
+
+  /* we start some action by calling perform right away */
+  curl_multi_perform(multi_handle, &still_running);
+
+  while(still_running) {
+    CURLMcode mc; /* curl_multi_wait() return code */
+    int numfds;
+
+    /* wait for activity, timeout or "nothing" */
+    mc = curl_multi_wait(multi_handle, NULL, 0, 1000, &numfds);
+
+    if(mc != CURLM_OK) {
+      fprintf(stderr, "curl_multi_wait() failed, code %d.\n", mc);
+      break;
+    }
+
+    /* 'numfds' being zero means either a timeout or no file descriptors to
+       wait for. Try timeout on first occurrence, then assume no file
+       descriptors and no file descriptors to wait for means wait for 100
+       milliseconds. */
+
+    if(!numfds) {
+      repeats++; /* count number of repeated zero numfds */
+      if(repeats > 1) {
+        WAITMS(100); /* sleep 100 milliseconds */
+      }
+    }
+    else
+      repeats = 0;
+
+    curl_multi_perform(multi_handle, &still_running);
+  }
+
+  curl_multi_remove_handle(multi_handle, http_handle);
+
+  curl_easy_cleanup(http_handle);
+
+  curl_multi_cleanup(multi_handle);
+
+  curl_global_cleanup();
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/multi-uv.c b/components/cronet/third_party/curl_headers/docs/examples/multi-uv.c
new file mode 100644
index 0000000..8ca4b90
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/multi-uv.c
@@ -0,0 +1,235 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * multi_socket API using libuv
+ * </DESC>
+ */
+/* Example application using the multi socket interface to download multiple
+   files in parallel, powered by libuv.
+
+   Requires libuv and (of course) libcurl.
+
+   See https://nikhilm.github.io/uvbook/ for more information on libuv.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <uv.h>
+#include <curl/curl.h>
+
+uv_loop_t *loop;
+CURLM *curl_handle;
+uv_timer_t timeout;
+
+typedef struct curl_context_s {
+  uv_poll_t poll_handle;
+  curl_socket_t sockfd;
+} curl_context_t;
+
+static curl_context_t* create_curl_context(curl_socket_t sockfd)
+{
+  curl_context_t *context;
+
+  context = (curl_context_t *) malloc(sizeof(*context));
+
+  context->sockfd = sockfd;
+
+  uv_poll_init_socket(loop, &context->poll_handle, sockfd);
+  context->poll_handle.data = context;
+
+  return context;
+}
+
+static void curl_close_cb(uv_handle_t *handle)
+{
+  curl_context_t *context = (curl_context_t *) handle->data;
+  free(context);
+}
+
+static void destroy_curl_context(curl_context_t *context)
+{
+  uv_close((uv_handle_t *) &context->poll_handle, curl_close_cb);
+}
+
+static void add_download(const char *url, int num)
+{
+  char filename[50];
+  FILE *file;
+  CURL *handle;
+
+  snprintf(filename, 50, "%d.download", num);
+
+  file = fopen(filename, "wb");
+  if(!file) {
+    fprintf(stderr, "Error opening %s\n", filename);
+    return;
+  }
+
+  handle = curl_easy_init();
+  curl_easy_setopt(handle, CURLOPT_WRITEDATA, file);
+  curl_easy_setopt(handle, CURLOPT_PRIVATE, file);
+  curl_easy_setopt(handle, CURLOPT_URL, url);
+  curl_multi_add_handle(curl_handle, handle);
+  fprintf(stderr, "Added download %s -> %s\n", url, filename);
+}
+
+static void check_multi_info(void)
+{
+  char *done_url;
+  CURLMsg *message;
+  int pending;
+  CURL *easy_handle;
+  FILE *file;
+
+  while((message = curl_multi_info_read(curl_handle, &pending))) {
+    switch(message->msg) {
+    case CURLMSG_DONE:
+      /* Do not use message data after calling curl_multi_remove_handle() and
+         curl_easy_cleanup(). As per curl_multi_info_read() docs:
+         "WARNING: The data the returned pointer points to will not survive
+         calling curl_multi_cleanup, curl_multi_remove_handle or
+         curl_easy_cleanup." */
+      easy_handle = message->easy_handle;
+
+      curl_easy_getinfo(easy_handle, CURLINFO_EFFECTIVE_URL, &done_url);
+      curl_easy_getinfo(easy_handle, CURLINFO_PRIVATE, &file);
+      printf("%s DONE\n", done_url);
+
+      curl_multi_remove_handle(curl_handle, easy_handle);
+      curl_easy_cleanup(easy_handle);
+      if(file) {
+        fclose(file);
+      }
+      break;
+
+    default:
+      fprintf(stderr, "CURLMSG default\n");
+      break;
+    }
+  }
+}
+
+static void curl_perform(uv_poll_t *req, int status, int events)
+{
+  int running_handles;
+  int flags = 0;
+  curl_context_t *context;
+
+  if(events & UV_READABLE)
+    flags |= CURL_CSELECT_IN;
+  if(events & UV_WRITABLE)
+    flags |= CURL_CSELECT_OUT;
+
+  context = (curl_context_t *) req->data;
+
+  curl_multi_socket_action(curl_handle, context->sockfd, flags,
+                           &running_handles);
+
+  check_multi_info();
+}
+
+static void on_timeout(uv_timer_t *req)
+{
+  int running_handles;
+  curl_multi_socket_action(curl_handle, CURL_SOCKET_TIMEOUT, 0,
+                           &running_handles);
+  check_multi_info();
+}
+
+static int start_timeout(CURLM *multi, long timeout_ms, void *userp)
+{
+  if(timeout_ms < 0) {
+    uv_timer_stop(&timeout);
+  }
+  else {
+    if(timeout_ms == 0)
+      timeout_ms = 1; /* 0 means directly call socket_action, but we'll do it
+                         in a bit */
+    uv_timer_start(&timeout, on_timeout, timeout_ms, 0);
+  }
+  return 0;
+}
+
+static int handle_socket(CURL *easy, curl_socket_t s, int action, void *userp,
+                  void *socketp)
+{
+  curl_context_t *curl_context;
+  int events = 0;
+
+  switch(action) {
+  case CURL_POLL_IN:
+  case CURL_POLL_OUT:
+  case CURL_POLL_INOUT:
+    curl_context = socketp ?
+      (curl_context_t *) socketp : create_curl_context(s);
+
+    curl_multi_assign(curl_handle, s, (void *) curl_context);
+
+    if(action != CURL_POLL_IN)
+      events |= UV_WRITABLE;
+    if(action != CURL_POLL_OUT)
+      events |= UV_READABLE;
+
+    uv_poll_start(&curl_context->poll_handle, events, curl_perform);
+    break;
+  case CURL_POLL_REMOVE:
+    if(socketp) {
+      uv_poll_stop(&((curl_context_t*)socketp)->poll_handle);
+      destroy_curl_context((curl_context_t*) socketp);
+      curl_multi_assign(curl_handle, s, NULL);
+    }
+    break;
+  default:
+    abort();
+  }
+
+  return 0;
+}
+
+int main(int argc, char **argv)
+{
+  loop = uv_default_loop();
+
+  if(argc <= 1)
+    return 0;
+
+  if(curl_global_init(CURL_GLOBAL_ALL)) {
+    fprintf(stderr, "Could not init curl\n");
+    return 1;
+  }
+
+  uv_timer_init(loop, &timeout);
+
+  curl_handle = curl_multi_init();
+  curl_multi_setopt(curl_handle, CURLMOPT_SOCKETFUNCTION, handle_socket);
+  curl_multi_setopt(curl_handle, CURLMOPT_TIMERFUNCTION, start_timeout);
+
+  while(argc-- > 1) {
+    add_download(argv[argc], argc);
+  }
+
+  uv_run(loop, UV_RUN_DEFAULT);
+  curl_multi_cleanup(curl_handle);
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/multithread.c b/components/cronet/third_party/curl_headers/docs/examples/multithread.c
new file mode 100644
index 0000000..a162000
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/multithread.c
@@ -0,0 +1,94 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * A multi-threaded example that uses pthreads to fetch several files at once
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <pthread.h>
+#include <curl/curl.h>
+
+#define NUMT 4
+
+/*
+  List of URLs to fetch.
+
+  If you intend to use a SSL-based protocol here you might need to setup TLS
+  library mutex callbacks as described here:
+
+  https://curl.haxx.se/libcurl/c/threadsafe.html
+
+*/
+const char * const urls[NUMT]= {
+  "https://curl.haxx.se/",
+  "ftp://cool.haxx.se/",
+  "https://www.cag.se/",
+  "www.haxx.se"
+};
+
+static void *pull_one_url(void *url)
+{
+  CURL *curl;
+
+  curl = curl_easy_init();
+  curl_easy_setopt(curl, CURLOPT_URL, url);
+  curl_easy_perform(curl); /* ignores error */
+  curl_easy_cleanup(curl);
+
+  return NULL;
+}
+
+
+/*
+   int pthread_create(pthread_t *new_thread_ID,
+   const pthread_attr_t *attr,
+   void * (*start_func)(void *), void *arg);
+*/
+
+int main(int argc, char **argv)
+{
+  pthread_t tid[NUMT];
+  int i;
+
+  /* Must initialize libcurl before any threads are started */
+  curl_global_init(CURL_GLOBAL_ALL);
+
+  for(i = 0; i< NUMT; i++) {
+    int error = pthread_create(&tid[i],
+                               NULL, /* default attributes please */
+                               pull_one_url,
+                               (void *)urls[i]);
+    if(0 != error)
+      fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error);
+    else
+      fprintf(stderr, "Thread %d, gets %s\n", i, urls[i]);
+  }
+
+  /* now wait for all threads to terminate */
+  for(i = 0; i< NUMT; i++) {
+    pthread_join(tid[i], NULL);
+    fprintf(stderr, "Thread %d terminated\n", i);
+  }
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/opensslthreadlock.c b/components/cronet/third_party/curl_headers/docs/examples/opensslthreadlock.c
new file mode 100644
index 0000000..649ef93a
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/opensslthreadlock.c
@@ -0,0 +1,95 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * one way to set the necessary OpenSSL locking callbacks if you want to do
+ * multi-threaded transfers with HTTPS/FTPS with libcurl built to use OpenSSL.
+ * </DESC>
+ */
+/*
+ * This is not a complete stand-alone example.
+ *
+ * Author: Jeremy Brown
+ */
+
+#include <stdio.h>
+#include <pthread.h>
+#include <openssl/err.h>
+
+#define MUTEX_TYPE       pthread_mutex_t
+#define MUTEX_SETUP(x)   pthread_mutex_init(&(x), NULL)
+#define MUTEX_CLEANUP(x) pthread_mutex_destroy(&(x))
+#define MUTEX_LOCK(x)    pthread_mutex_lock(&(x))
+#define MUTEX_UNLOCK(x)  pthread_mutex_unlock(&(x))
+#define THREAD_ID        pthread_self()
+
+
+void handle_error(const char *file, int lineno, const char *msg)
+{
+  fprintf(stderr, "** %s:%d %s\n", file, lineno, msg);
+  ERR_print_errors_fp(stderr);
+  /* exit(-1); */
+}
+
+/* This array will store all of the mutexes available to OpenSSL. */
+static MUTEX_TYPE *mutex_buf = NULL;
+
+static void locking_function(int mode, int n, const char *file, int line)
+{
+  if(mode & CRYPTO_LOCK)
+    MUTEX_LOCK(mutex_buf[n]);
+  else
+    MUTEX_UNLOCK(mutex_buf[n]);
+}
+
+static unsigned long id_function(void)
+{
+  return ((unsigned long)THREAD_ID);
+}
+
+int thread_setup(void)
+{
+  int i;
+
+  mutex_buf = malloc(CRYPTO_num_locks() * sizeof(MUTEX_TYPE));
+  if(!mutex_buf)
+    return 0;
+  for(i = 0;  i < CRYPTO_num_locks();  i++)
+    MUTEX_SETUP(mutex_buf[i]);
+  CRYPTO_set_id_callback(id_function);
+  CRYPTO_set_locking_callback(locking_function);
+  return 1;
+}
+
+int thread_cleanup(void)
+{
+  int i;
+
+  if(!mutex_buf)
+    return 0;
+  CRYPTO_set_id_callback(NULL);
+  CRYPTO_set_locking_callback(NULL);
+  for(i = 0;  i < CRYPTO_num_locks();  i++)
+    MUTEX_CLEANUP(mutex_buf[i]);
+  free(mutex_buf);
+  mutex_buf = NULL;
+  return 1;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/parseurl.c b/components/cronet/third_party/curl_headers/docs/examples/parseurl.c
new file mode 100644
index 0000000..ee427768
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/parseurl.c
@@ -0,0 +1,78 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Basic URL API use.
+ * </DESC>
+ */
+#include <stdio.h>
+#include <curl/curl.h>
+
+#if !CURL_AT_LEAST_VERSION(7, 62, 0)
+#error "this example requires curl 7.62.0 or later"
+#endif
+
+int main(void)
+{
+  CURLU *h;
+  CURLUcode uc;
+  char *host;
+  char *path;
+
+  h = curl_url(); /* get a handle to work with */
+  if(!h)
+    return 1;
+
+  /* parse a full URL */
+  uc = curl_url_set(h, CURLUPART_URL, "http://example.com/path/index.html", 0);
+  if(uc)
+    goto fail;
+
+  /* extract host name from the parsed URL */
+  uc = curl_url_get(h, CURLUPART_HOST, &host, 0);
+  if(!uc) {
+    printf("Host name: %s\n", host);
+    curl_free(host);
+  }
+
+  /* extract the path from the parsed URL */
+  uc = curl_url_get(h, CURLUPART_PATH, &path, 0);
+  if(!uc) {
+    printf("Path: %s\n", path);
+    curl_free(path);
+  }
+
+  /* redirect with a relative URL */
+  uc = curl_url_set(h, CURLUPART_URL, "../another/second.html", 0);
+  if(uc)
+    goto fail;
+
+  /* extract the new, updated path */
+  uc = curl_url_get(h, CURLUPART_PATH, &path, 0);
+  if(!uc) {
+    printf("Path: %s\n", path);
+    curl_free(path);
+  }
+
+  fail:
+  curl_url_cleanup(h); /* free url handle */
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/persistent.c b/components/cronet/third_party/curl_headers/docs/examples/persistent.c
new file mode 100644
index 0000000..723b68b
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/persistent.c
@@ -0,0 +1,68 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * re-using handles to do HTTP persistent connections
+ * </DESC>
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <curl/curl.h>
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+
+  curl_global_init(CURL_GLOBAL_ALL);
+
+  curl = curl_easy_init();
+  if(curl) {
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+    curl_easy_setopt(curl, CURLOPT_HEADER, 1L);
+
+    /* get the first document */
+    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+
+    /* Perform the request, res will get the return code */
+    res = curl_easy_perform(curl);
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* get another document from the same server using the same
+       connection */
+    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/docs/");
+
+    /* Perform the request, res will get the return code */
+    res = curl_easy_perform(curl);
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/pop3-dele.c b/components/cronet/third_party/curl_headers/docs/examples/pop3-dele.c
new file mode 100644
index 0000000..14497835
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/pop3-dele.c
@@ -0,0 +1,70 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * POP3 example showing how to delete e-mails
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to delete an existing mail using
+ * libcurl's POP3 capabilities.
+ *
+ * Note that this example requires libcurl 7.26.0 or above.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* You can specify the message either in the URL or DELE command */
+    curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com/1");
+
+    /* Set the DELE command */
+    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELE");
+
+    /* Do not perform a transfer as DELE returns no data */
+    curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
+
+    /* Perform the custom request */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/pop3-list.c b/components/cronet/third_party/curl_headers/docs/examples/pop3-list.c
new file mode 100644
index 0000000..b530a04
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/pop3-list.c
@@ -0,0 +1,64 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * POP3 example to list the contents of a mailbox
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* This is a simple example using libcurl's POP3 capabilities to list the
+ * contents of a mailbox.
+ *
+ * Note that this example requires libcurl 7.20.0 or above.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* This will list every message of the given mailbox */
+    curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com");
+
+    /* Perform the list */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/pop3-multi.c b/components/cronet/third_party/curl_headers/docs/examples/pop3-multi.c
new file mode 100644
index 0000000..4b87886
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/pop3-multi.c
@@ -0,0 +1,173 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * POP3 example using the multi interface
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to retrieve mail using libcurl's POP3
+ * capabilities. It builds on the pop3-retr.c example to demonstrate how to use
+ * libcurl's multi interface.
+ *
+ * Note that this example requires libcurl 7.20.0 or above.
+ */
+
+#define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000
+
+static struct timeval tvnow(void)
+{
+  struct timeval now;
+
+  /* time() returns the value of time in seconds since the epoch */
+  now.tv_sec = (long)time(NULL);
+  now.tv_usec = 0;
+
+  return now;
+}
+
+static long tvdiff(struct timeval newer, struct timeval older)
+{
+  return (newer.tv_sec - older.tv_sec) * 1000 +
+    (newer.tv_usec - older.tv_usec) / 1000;
+}
+
+int main(void)
+{
+  CURL *curl;
+  CURLM *mcurl;
+  int still_running = 1;
+  struct timeval mp_start;
+
+  curl_global_init(CURL_GLOBAL_DEFAULT);
+
+  curl = curl_easy_init();
+  if(!curl)
+    return 1;
+
+  mcurl = curl_multi_init();
+  if(!mcurl)
+    return 2;
+
+  /* Set username and password */
+  curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+  curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+  /* This will retrieve message 1 from the user's mailbox */
+  curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com/1");
+
+  /* Tell the multi stack about our easy handle */
+  curl_multi_add_handle(mcurl, curl);
+
+  /* Record the start time which we can use later */
+  mp_start = tvnow();
+
+  /* We start some action by calling perform right away */
+  curl_multi_perform(mcurl, &still_running);
+
+  while(still_running) {
+    struct timeval timeout;
+    fd_set fdread;
+    fd_set fdwrite;
+    fd_set fdexcep;
+    int maxfd = -1;
+    int rc;
+    CURLMcode mc; /* curl_multi_fdset() return code */
+
+    long curl_timeo = -1;
+
+    /* Initialise the file descriptors */
+    FD_ZERO(&fdread);
+    FD_ZERO(&fdwrite);
+    FD_ZERO(&fdexcep);
+
+    /* Set a suitable timeout to play around with */
+    timeout.tv_sec = 1;
+    timeout.tv_usec = 0;
+
+    curl_multi_timeout(mcurl, &curl_timeo);
+    if(curl_timeo >= 0) {
+      timeout.tv_sec = curl_timeo / 1000;
+      if(timeout.tv_sec > 1)
+        timeout.tv_sec = 1;
+      else
+        timeout.tv_usec = (curl_timeo % 1000) * 1000;
+    }
+
+    /* get file descriptors from the transfers */
+    mc = curl_multi_fdset(mcurl, &fdread, &fdwrite, &fdexcep, &maxfd);
+
+    if(mc != CURLM_OK) {
+      fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
+      break;
+    }
+
+    /* On success the value of maxfd is guaranteed to be >= -1. We call
+       select(maxfd + 1, ...); specially in case of (maxfd == -1) there are
+       no fds ready yet so we call select(0, ...) --or Sleep() on Windows--
+       to sleep 100ms, which is the minimum suggested value in the
+       curl_multi_fdset() doc. */
+
+    if(maxfd == -1) {
+#ifdef _WIN32
+      Sleep(100);
+      rc = 0;
+#else
+      /* Portable sleep for platforms other than Windows. */
+      struct timeval wait = { 0, 100 * 1000 }; /* 100ms */
+      rc = select(0, NULL, NULL, NULL, &wait);
+#endif
+    }
+    else {
+      /* Note that on some platforms 'timeout' may be modified by select().
+         If you need access to the original value save a copy beforehand. */
+      rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
+    }
+
+    if(tvdiff(tvnow(), mp_start) > MULTI_PERFORM_HANG_TIMEOUT) {
+      fprintf(stderr,
+              "ABORTING: Since it seems that we would have run forever.\n");
+      break;
+    }
+
+    switch(rc) {
+    case -1:  /* select error */
+      break;
+    case 0:   /* timeout */
+    default:  /* action */
+      curl_multi_perform(mcurl, &still_running);
+      break;
+    }
+  }
+
+  /* Always cleanup */
+  curl_multi_remove_handle(mcurl, curl);
+  curl_multi_cleanup(mcurl);
+  curl_easy_cleanup(curl);
+  curl_global_cleanup();
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/pop3-noop.c b/components/cronet/third_party/curl_headers/docs/examples/pop3-noop.c
new file mode 100644
index 0000000..bc162d0c
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/pop3-noop.c
@@ -0,0 +1,70 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * POP3 example showing how to perform a noop
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to perform a noop using libcurl's POP3
+ * capabilities.
+ *
+ * Note that this example requires libcurl 7.26.0 or above.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* This is just the server URL */
+    curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com");
+
+    /* Set the NOOP command */
+    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "NOOP");
+
+    /* Do not perform a transfer as NOOP returns no data */
+    curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
+
+    /* Perform the custom request */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/pop3-retr.c b/components/cronet/third_party/curl_headers/docs/examples/pop3-retr.c
new file mode 100644
index 0000000..b36ddb5
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/pop3-retr.c
@@ -0,0 +1,64 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * POP3 example showing how to retrieve e-mails
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to retrieve mail using libcurl's POP3
+ * capabilities.
+ *
+ * Note that this example requires libcurl 7.20.0 or above.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* This will retrieve message 1 from the user's mailbox */
+    curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com/1");
+
+    /* Perform the retr */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/pop3-ssl.c b/components/cronet/third_party/curl_headers/docs/examples/pop3-ssl.c
new file mode 100644
index 0000000..f0d4e26
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/pop3-ssl.c
@@ -0,0 +1,91 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * POP3 example using SSL
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to retrieve mail using libcurl's POP3
+ * capabilities. It builds on the pop3-retr.c example adding transport
+ * security to protect the authentication details from being snooped.
+ *
+ * Note that this example requires libcurl 7.20.0 or above.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* This will retrieve message 1 from the user's mailbox. Note the use of
+     * pop3s:// rather than pop3:// to request a SSL based connection. */
+    curl_easy_setopt(curl, CURLOPT_URL, "pop3s://pop.example.com/1");
+
+    /* If you want to connect to a site who isn't using a certificate that is
+     * signed by one of the certs in the CA bundle you have, you can skip the
+     * verification of the server's certificate. This makes the connection
+     * A LOT LESS SECURE.
+     *
+     * If you have a CA cert for the server stored someplace else than in the
+     * default bundle, then the CURLOPT_CAPATH option might come handy for
+     * you. */
+#ifdef SKIP_PEER_VERIFICATION
+    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
+#endif
+
+    /* If the site you're connecting to uses a different host name that what
+     * they have mentioned in their server certificate's commonName (or
+     * subjectAltName) fields, libcurl will refuse to connect. You can skip
+     * this check, but this will make the connection less secure. */
+#ifdef SKIP_HOSTNAME_VERIFICATION
+    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
+#endif
+
+    /* Since the traffic will be encrypted, it is very useful to turn on debug
+     * information within libcurl to see what is happening during the
+     * transfer */
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+    /* Perform the retr */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/pop3-stat.c b/components/cronet/third_party/curl_headers/docs/examples/pop3-stat.c
new file mode 100644
index 0000000..46a0a45
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/pop3-stat.c
@@ -0,0 +1,70 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * POP3 example showing how to obtain message statistics
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to obtain message statistics using
+ * libcurl's POP3 capabilities.
+ *
+ * Note that this example requires libcurl 7.26.0 or above.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* This is just the server URL */
+    curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com");
+
+    /* Set the STAT command */
+    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "STAT");
+
+    /* Do not perform a transfer as the data is in the response */
+    curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
+
+    /* Perform the custom request */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/pop3-tls.c b/components/cronet/third_party/curl_headers/docs/examples/pop3-tls.c
new file mode 100644
index 0000000..1a6c447
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/pop3-tls.c
@@ -0,0 +1,91 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * POP3 example using TLS
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to retrieve mail using libcurl's POP3
+ * capabilities. It builds on the pop3-retr.c example adding transport
+ * security to protect the authentication details from being snooped.
+ *
+ * Note that this example requires libcurl 7.20.0 or above.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* This will retrieve message 1 from the user's mailbox */
+    curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com/1");
+
+    /* In this example, we'll start with a plain text connection, and upgrade
+     * to Transport Layer Security (TLS) using the STLS command. Be careful of
+     * using CURLUSESSL_TRY here, because if TLS upgrade fails, the transfer
+     * will continue anyway - see the security discussion in the libcurl
+     * tutorial for more details. */
+    curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL);
+
+    /* If your server doesn't have a valid certificate, then you can disable
+     * part of the Transport Layer Security protection by setting the
+     * CURLOPT_SSL_VERIFYPEER and CURLOPT_SSL_VERIFYHOST options to 0 (false).
+     *   curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
+     *   curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
+     *
+     * That is, in general, a bad idea. It is still better than sending your
+     * authentication details in plain text though.  Instead, you should get
+     * the issuer certificate (or the host certificate if the certificate is
+     * self-signed) and add it to the set of certificates that are known to
+     * libcurl using CURLOPT_CAINFO and/or CURLOPT_CAPATH. See docs/SSLCERTS
+     * for more information. */
+    curl_easy_setopt(curl, CURLOPT_CAINFO, "/path/to/certificate.pem");
+
+    /* Since the traffic will be encrypted, it is very useful to turn on debug
+     * information within libcurl to see what is happening during the
+     * transfer */
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+    /* Perform the retr */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/pop3-top.c b/components/cronet/third_party/curl_headers/docs/examples/pop3-top.c
new file mode 100644
index 0000000..4f5937f
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/pop3-top.c
@@ -0,0 +1,67 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * POP3 example showing how to retrieve only the headers of an e-mail
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to retrieve only the headers of a mail
+ * using libcurl's POP3 capabilities.
+ *
+ * Note that this example requires libcurl 7.26.0 or above.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* This is just the server URL */
+    curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com");
+
+    /* Set the TOP command for message 1 to only include the headers */
+    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "TOP 1 0");
+
+    /* Perform the custom request */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/pop3-uidl.c b/components/cronet/third_party/curl_headers/docs/examples/pop3-uidl.c
new file mode 100644
index 0000000..f127120
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/pop3-uidl.c
@@ -0,0 +1,67 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * POP3 example to list the contents of a mailbox by unique ID
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* This is a simple example using libcurl's POP3 capabilities to list the
+ * contents of a mailbox by unique ID.
+ *
+ * Note that this example requires libcurl 7.26.0 or above.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* This is just the server URL */
+    curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com");
+
+    /* Set the UIDL command */
+    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "UIDL");
+
+    /* Perform the custom request */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/post-callback.c b/components/cronet/third_party/curl_headers/docs/examples/post-callback.c
new file mode 100644
index 0000000..ebb4e2a2
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/post-callback.c
@@ -0,0 +1,154 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Issue an HTTP POST and provide the data through the read callback.
+ * </DESC>
+ */
+#include <stdio.h>
+#include <string.h>
+#include <curl/curl.h>
+
+/* silly test data to POST */
+static const char data[]="Lorem ipsum dolor sit amet, consectetur adipiscing "
+  "elit. Sed vel urna neque. Ut quis leo metus. Quisque eleifend, ex at "
+  "laoreet rhoncus, odio ipsum semper metus, at tempus ante urna in mauris. "
+  "Suspendisse ornare tempor venenatis. Ut dui neque, pellentesque a varius "
+  "eget, mattis vitae ligula. Fusce ut pharetra est. Ut ullamcorper mi ac "
+  "sollicitudin semper. Praesent sit amet tellus varius, posuere nulla non, "
+  "rhoncus ipsum.";
+
+struct WriteThis {
+  const char *readptr;
+  size_t sizeleft;
+};
+
+static size_t read_callback(void *dest, size_t size, size_t nmemb, void *userp)
+{
+  struct WriteThis *wt = (struct WriteThis *)userp;
+  size_t buffer_size = size*nmemb;
+
+  if(wt->sizeleft) {
+    /* copy as much as possible from the source to the destination */
+    size_t copy_this_much = wt->sizeleft;
+    if(copy_this_much > buffer_size)
+      copy_this_much = buffer_size;
+    memcpy(dest, wt->readptr, copy_this_much);
+
+    wt->readptr += copy_this_much;
+    wt->sizeleft -= copy_this_much;
+    return copy_this_much; /* we copied this many bytes */
+  }
+
+  return 0; /* no more data left to deliver */
+}
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+
+  struct WriteThis wt;
+
+  wt.readptr = data;
+  wt.sizeleft = strlen(data);
+
+  /* In windows, this will init the winsock stuff */
+  res = curl_global_init(CURL_GLOBAL_DEFAULT);
+  /* Check for errors */
+  if(res != CURLE_OK) {
+    fprintf(stderr, "curl_global_init() failed: %s\n",
+            curl_easy_strerror(res));
+    return 1;
+  }
+
+  /* get a curl handle */
+  curl = curl_easy_init();
+  if(curl) {
+    /* First set the URL that is about to receive our POST. */
+    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/index.cgi");
+
+    /* Now specify we want to POST data */
+    curl_easy_setopt(curl, CURLOPT_POST, 1L);
+
+    /* we want to use our own read function */
+    curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
+
+    /* pointer to pass to our read function */
+    curl_easy_setopt(curl, CURLOPT_READDATA, &wt);
+
+    /* get verbose debug output please */
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+    /*
+      If you use POST to a HTTP 1.1 server, you can send data without knowing
+      the size before starting the POST if you use chunked encoding. You
+      enable this by adding a header like "Transfer-Encoding: chunked" with
+      CURLOPT_HTTPHEADER. With HTTP 1.0 or without chunked transfer, you must
+      specify the size in the request.
+    */
+#ifdef USE_CHUNKED
+    {
+      struct curl_slist *chunk = NULL;
+
+      chunk = curl_slist_append(chunk, "Transfer-Encoding: chunked");
+      res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
+      /* use curl_slist_free_all() after the *perform() call to free this
+         list again */
+    }
+#else
+    /* Set the expected POST size. If you want to POST large amounts of data,
+       consider CURLOPT_POSTFIELDSIZE_LARGE */
+    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)wt.sizeleft);
+#endif
+
+#ifdef DISABLE_EXPECT
+    /*
+      Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue"
+      header.  You can disable this header with CURLOPT_HTTPHEADER as usual.
+      NOTE: if you want chunked transfer too, you need to combine these two
+      since you can only set one list of headers with CURLOPT_HTTPHEADER. */
+
+    /* A less good option would be to enforce HTTP 1.0, but that might also
+       have other implications. */
+    {
+      struct curl_slist *chunk = NULL;
+
+      chunk = curl_slist_append(chunk, "Expect:");
+      res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
+      /* use curl_slist_free_all() after the *perform() call to free this
+         list again */
+    }
+#endif
+
+    /* Perform the request, res will get the return code */
+    res = curl_easy_perform(curl);
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+  curl_global_cleanup();
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/postinmemory.c b/components/cronet/third_party/curl_headers/docs/examples/postinmemory.c
new file mode 100644
index 0000000..376f334
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/postinmemory.c
@@ -0,0 +1,113 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Make a HTTP POST with data from memory and receive response in memory.
+ * </DESC>
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <curl/curl.h>
+
+struct MemoryStruct {
+  char *memory;
+  size_t size;
+};
+
+static size_t
+WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
+{
+  size_t realsize = size * nmemb;
+  struct MemoryStruct *mem = (struct MemoryStruct *)userp;
+
+  char *ptr = realloc(mem->memory, mem->size + realsize + 1);
+  if(!ptr) {
+    /* out of memory! */
+    printf("not enough memory (realloc returned NULL)\n");
+    return 0;
+  }
+
+  mem->memory = ptr;
+  memcpy(&(mem->memory[mem->size]), contents, realsize);
+  mem->size += realsize;
+  mem->memory[mem->size] = 0;
+
+  return realsize;
+}
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+  struct MemoryStruct chunk;
+  static const char *postthis = "Field=1&Field=2&Field=3";
+
+  chunk.memory = malloc(1);  /* will be grown as needed by realloc above */
+  chunk.size = 0;    /* no data at this point */
+
+  curl_global_init(CURL_GLOBAL_ALL);
+  curl = curl_easy_init();
+  if(curl) {
+    curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.org/");
+
+    /* send all data to this function  */
+    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
+
+    /* we pass our 'chunk' struct to the callback function */
+    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
+
+    /* some servers don't like requests that are made without a user-agent
+       field, so we provide one */
+    curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");
+
+    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postthis);
+
+    /* if we don't provide POSTFIELDSIZE, libcurl will strlen() by
+       itself */
+    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(postthis));
+
+    /* Perform the request, res will get the return code */
+    res = curl_easy_perform(curl);
+    /* Check for errors */
+    if(res != CURLE_OK) {
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+    }
+    else {
+      /*
+       * Now, our chunk.memory points to a memory block that is chunk.size
+       * bytes big and contains the remote file.
+       *
+       * Do something nice with it!
+       */
+      printf("%s\n",chunk.memory);
+    }
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+
+    /* we're done with libcurl, so clean it up */
+    curl_global_cleanup();
+  }
+  free(chunk.memory);
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/postit2-formadd.c b/components/cronet/third_party/curl_headers/docs/examples/postit2-formadd.c
new file mode 100644
index 0000000..a501ce9
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/postit2-formadd.c
@@ -0,0 +1,107 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * HTTP Multipart formpost with file upload and two additional parts.
+ * </DESC>
+ */
+/* Example code that uploads a file name 'foo' to a remote script that accepts
+ * "HTML form based" (as described in RFC1738) uploads using HTTP POST.
+ *
+ * The imaginary form we'll fill in looks like:
+ *
+ * <form method="post" enctype="multipart/form-data" action="examplepost.cgi">
+ * Enter file: <input type="file" name="sendfile" size="40">
+ * Enter file name: <input type="text" name="filename" size="30">
+ * <input type="submit" value="send" name="submit">
+ * </form>
+ *
+ * This exact source code has not been verified to work.
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <curl/curl.h>
+
+int main(int argc, char *argv[])
+{
+  CURL *curl;
+  CURLcode res;
+
+  struct curl_httppost *formpost = NULL;
+  struct curl_httppost *lastptr = NULL;
+  struct curl_slist *headerlist = NULL;
+  static const char buf[] = "Expect:";
+
+  curl_global_init(CURL_GLOBAL_ALL);
+
+  /* Fill in the file upload field */
+  curl_formadd(&formpost,
+               &lastptr,
+               CURLFORM_COPYNAME, "sendfile",
+               CURLFORM_FILE, "postit2.c",
+               CURLFORM_END);
+
+  /* Fill in the filename field */
+  curl_formadd(&formpost,
+               &lastptr,
+               CURLFORM_COPYNAME, "filename",
+               CURLFORM_COPYCONTENTS, "postit2.c",
+               CURLFORM_END);
+
+
+  /* Fill in the submit field too, even if this is rarely needed */
+  curl_formadd(&formpost,
+               &lastptr,
+               CURLFORM_COPYNAME, "submit",
+               CURLFORM_COPYCONTENTS, "send",
+               CURLFORM_END);
+
+  curl = curl_easy_init();
+  /* initialize custom header list (stating that Expect: 100-continue is not
+     wanted */
+  headerlist = curl_slist_append(headerlist, buf);
+  if(curl) {
+    /* what URL that receives this POST */
+    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/examplepost.cgi");
+    if((argc == 2) && (!strcmp(argv[1], "noexpectheader")))
+      /* only disable 100-continue header if explicitly requested */
+      curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
+    curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
+
+    /* Perform the request, res will get the return code */
+    res = curl_easy_perform(curl);
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+
+    /* then cleanup the formpost chain */
+    curl_formfree(formpost);
+    /* free slist */
+    curl_slist_free_all(headerlist);
+  }
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/postit2.c b/components/cronet/third_party/curl_headers/docs/examples/postit2.c
new file mode 100644
index 0000000..2808f7a
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/postit2.c
@@ -0,0 +1,103 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * HTTP Multipart formpost with file upload and two additional parts.
+ * </DESC>
+ */
+/* Example code that uploads a file name 'foo' to a remote script that accepts
+ * "HTML form based" (as described in RFC1738) uploads using HTTP POST.
+ *
+ * The imaginary form we'll fill in looks like:
+ *
+ * <form method="post" enctype="multipart/form-data" action="examplepost.cgi">
+ * Enter file: <input type="file" name="sendfile" size="40">
+ * Enter file name: <input type="text" name="filename" size="30">
+ * <input type="submit" value="send" name="submit">
+ * </form>
+ *
+ * This exact source code has not been verified to work.
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <curl/curl.h>
+
+int main(int argc, char *argv[])
+{
+  CURL *curl;
+  CURLcode res;
+
+  curl_mime *form = NULL;
+  curl_mimepart *field = NULL;
+  struct curl_slist *headerlist = NULL;
+  static const char buf[] = "Expect:";
+
+  curl_global_init(CURL_GLOBAL_ALL);
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Create the form */
+    form = curl_mime_init(curl);
+
+    /* Fill in the file upload field */
+    field = curl_mime_addpart(form);
+    curl_mime_name(field, "sendfile");
+    curl_mime_filedata(field, "postit2.c");
+
+    /* Fill in the filename field */
+    field = curl_mime_addpart(form);
+    curl_mime_name(field, "filename");
+    curl_mime_data(field, "postit2.c", CURL_ZERO_TERMINATED);
+
+    /* Fill in the submit field too, even if this is rarely needed */
+    field = curl_mime_addpart(form);
+    curl_mime_name(field, "submit");
+    curl_mime_data(field, "send", CURL_ZERO_TERMINATED);
+
+    /* initialize custom header list (stating that Expect: 100-continue is not
+       wanted */
+    headerlist = curl_slist_append(headerlist, buf);
+    /* what URL that receives this POST */
+    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/examplepost.cgi");
+    if((argc == 2) && (!strcmp(argv[1], "noexpectheader")))
+      /* only disable 100-continue header if explicitly requested */
+      curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
+    curl_easy_setopt(curl, CURLOPT_MIMEPOST, form);
+
+    /* Perform the request, res will get the return code */
+    res = curl_easy_perform(curl);
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+
+    /* then cleanup the form */
+    curl_mime_free(form);
+    /* free slist */
+    curl_slist_free_all(headerlist);
+  }
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/progressfunc.c b/components/cronet/third_party/curl_headers/docs/examples/progressfunc.c
new file mode 100644
index 0000000..86ad0d9
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/progressfunc.c
@@ -0,0 +1,144 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Use the progress callbacks, old and/or new one depending on available
+ * libcurl version.
+ * </DESC>
+ */
+#include <stdio.h>
+#include <curl/curl.h>
+
+#if LIBCURL_VERSION_NUM >= 0x073d00
+/* In libcurl 7.61.0, support was added for extracting the time in plain
+   microseconds. Older libcurl versions are stuck in using 'double' for this
+   information so we complicate this example a bit by supporting either
+   approach. */
+#define TIME_IN_US 1 /* microseconds */
+#define TIMETYPE curl_off_t
+#define TIMEOPT CURLINFO_TOTAL_TIME_T
+#define MINIMAL_PROGRESS_FUNCTIONALITY_INTERVAL     3000000
+#else
+#define TIMETYPE double
+#define TIMEOPT CURLINFO_TOTAL_TIME
+#define MINIMAL_PROGRESS_FUNCTIONALITY_INTERVAL     3
+#endif
+
+#define STOP_DOWNLOAD_AFTER_THIS_MANY_BYTES         6000
+
+struct myprogress {
+  TIMETYPE lastruntime; /* type depends on version, see above */
+  CURL *curl;
+};
+
+/* this is how the CURLOPT_XFERINFOFUNCTION callback works */
+static int xferinfo(void *p,
+                    curl_off_t dltotal, curl_off_t dlnow,
+                    curl_off_t ultotal, curl_off_t ulnow)
+{
+  struct myprogress *myp = (struct myprogress *)p;
+  CURL *curl = myp->curl;
+  TIMETYPE curtime = 0;
+
+  curl_easy_getinfo(curl, TIMEOPT, &curtime);
+
+  /* under certain circumstances it may be desirable for certain functionality
+     to only run every N seconds, in order to do this the transaction time can
+     be used */
+  if((curtime - myp->lastruntime) >= MINIMAL_PROGRESS_FUNCTIONALITY_INTERVAL) {
+    myp->lastruntime = curtime;
+#ifdef TIME_IN_US
+    fprintf(stderr, "TOTAL TIME: %" CURL_FORMAT_CURL_OFF_T ".%06ld\r\n",
+            (curtime / 1000000), (long)(curtime % 1000000));
+#else
+    fprintf(stderr, "TOTAL TIME: %f \r\n", curtime);
+#endif
+  }
+
+  fprintf(stderr, "UP: %" CURL_FORMAT_CURL_OFF_T " of %" CURL_FORMAT_CURL_OFF_T
+          "  DOWN: %" CURL_FORMAT_CURL_OFF_T " of %" CURL_FORMAT_CURL_OFF_T
+          "\r\n",
+          ulnow, ultotal, dlnow, dltotal);
+
+  if(dlnow > STOP_DOWNLOAD_AFTER_THIS_MANY_BYTES)
+    return 1;
+  return 0;
+}
+
+#if LIBCURL_VERSION_NUM < 0x072000
+/* for libcurl older than 7.32.0 (CURLOPT_PROGRESSFUNCTION) */
+static int older_progress(void *p,
+                          double dltotal, double dlnow,
+                          double ultotal, double ulnow)
+{
+  return xferinfo(p,
+                  (curl_off_t)dltotal,
+                  (curl_off_t)dlnow,
+                  (curl_off_t)ultotal,
+                  (curl_off_t)ulnow);
+}
+#endif
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+  struct myprogress prog;
+
+  curl = curl_easy_init();
+  if(curl) {
+    prog.lastruntime = 0;
+    prog.curl = curl;
+
+    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
+
+#if LIBCURL_VERSION_NUM >= 0x072000
+    /* xferinfo was introduced in 7.32.0, no earlier libcurl versions will
+       compile as they won't have the symbols around.
+
+       If built with a newer libcurl, but running with an older libcurl:
+       curl_easy_setopt() will fail in run-time trying to set the new
+       callback, making the older callback get used.
+
+       New libcurls will prefer the new callback and instead use that one even
+       if both callbacks are set. */
+
+    curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, xferinfo);
+    /* pass the struct pointer into the xferinfo function, note that this is
+       an alias to CURLOPT_PROGRESSDATA */
+    curl_easy_setopt(curl, CURLOPT_XFERINFODATA, &prog);
+#else
+    curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, older_progress);
+    /* pass the struct pointer into the progress function */
+    curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, &prog);
+#endif
+
+    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
+    res = curl_easy_perform(curl);
+
+    if(res != CURLE_OK)
+      fprintf(stderr, "%s\n", curl_easy_strerror(res));
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/resolve.c b/components/cronet/third_party/curl_headers/docs/examples/resolve.c
new file mode 100644
index 0000000..c0b5415
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/resolve.c
@@ -0,0 +1,56 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Use CURLOPT_RESOLVE to feed custom IP addresses for given host name + port
+ * number combinations.
+ * </DESC>
+ */
+#include <stdio.h>
+#include <curl/curl.h>
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  /* Each single name resolve string should be written using the format
+     HOST:PORT:ADDRESS where HOST is the name libcurl will try to resolve,
+     PORT is the port number of the service where libcurl wants to connect to
+     the HOST and ADDRESS is the numerical IP address
+   */
+  struct curl_slist *host = curl_slist_append(NULL,
+                                              "example.com:443:127.0.0.1");
+
+  curl = curl_easy_init();
+  if(curl) {
+    curl_easy_setopt(curl, CURLOPT_RESOLVE, host);
+    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+    res = curl_easy_perform(curl);
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  curl_slist_free_all(host);
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/rtsp.c b/components/cronet/third_party/curl_headers/docs/examples/rtsp.c
new file mode 100644
index 0000000..75b5d396
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/rtsp.c
@@ -0,0 +1,288 @@
+/*
+ * Copyright (c) 2011, Jim Hollinger
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *   * Neither the name of Jim Hollinger nor the names of its contributors
+ *     may be used to endorse or promote products derived from this
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+/* <DESC>
+ * A basic RTSP transfer
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined (WIN32)
+#  include <conio.h>  /* _getch() */
+#else
+#  include <termios.h>
+#  include <unistd.h>
+
+static int _getch(void)
+{
+  struct termios oldt, newt;
+  int ch;
+  tcgetattr(STDIN_FILENO, &oldt);
+  newt = oldt;
+  newt.c_lflag &= ~( ICANON | ECHO);
+  tcsetattr(STDIN_FILENO, TCSANOW, &newt);
+  ch = getchar();
+  tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
+  return ch;
+}
+#endif
+
+#include <curl/curl.h>
+
+#define VERSION_STR  "V1.0"
+
+/* error handling macros */
+#define my_curl_easy_setopt(A, B, C)                             \
+  res = curl_easy_setopt((A), (B), (C));                         \
+  if(res != CURLE_OK)                                            \
+    fprintf(stderr, "curl_easy_setopt(%s, %s, %s) failed: %d\n", \
+            #A, #B, #C, res);
+
+#define my_curl_easy_perform(A)                                     \
+  res = curl_easy_perform(A);                                       \
+  if(res != CURLE_OK)                                               \
+    fprintf(stderr, "curl_easy_perform(%s) failed: %d\n", #A, res);
+
+
+/* send RTSP OPTIONS request */
+static void rtsp_options(CURL *curl, const char *uri)
+{
+  CURLcode res = CURLE_OK;
+  printf("\nRTSP: OPTIONS %s\n", uri);
+  my_curl_easy_setopt(curl, CURLOPT_RTSP_STREAM_URI, uri);
+  my_curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST, (long)CURL_RTSPREQ_OPTIONS);
+  my_curl_easy_perform(curl);
+}
+
+
+/* send RTSP DESCRIBE request and write sdp response to a file */
+static void rtsp_describe(CURL *curl, const char *uri,
+                          const char *sdp_filename)
+{
+  CURLcode res = CURLE_OK;
+  FILE *sdp_fp = fopen(sdp_filename, "wb");
+  printf("\nRTSP: DESCRIBE %s\n", uri);
+  if(sdp_fp == NULL) {
+    fprintf(stderr, "Could not open '%s' for writing\n", sdp_filename);
+    sdp_fp = stdout;
+  }
+  else {
+    printf("Writing SDP to '%s'\n", sdp_filename);
+  }
+  my_curl_easy_setopt(curl, CURLOPT_WRITEDATA, sdp_fp);
+  my_curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST, (long)CURL_RTSPREQ_DESCRIBE);
+  my_curl_easy_perform(curl);
+  my_curl_easy_setopt(curl, CURLOPT_WRITEDATA, stdout);
+  if(sdp_fp != stdout) {
+    fclose(sdp_fp);
+  }
+}
+
+/* send RTSP SETUP request */
+static void rtsp_setup(CURL *curl, const char *uri, const char *transport)
+{
+  CURLcode res = CURLE_OK;
+  printf("\nRTSP: SETUP %s\n", uri);
+  printf("      TRANSPORT %s\n", transport);
+  my_curl_easy_setopt(curl, CURLOPT_RTSP_STREAM_URI, uri);
+  my_curl_easy_setopt(curl, CURLOPT_RTSP_TRANSPORT, transport);
+  my_curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST, (long)CURL_RTSPREQ_SETUP);
+  my_curl_easy_perform(curl);
+}
+
+
+/* send RTSP PLAY request */
+static void rtsp_play(CURL *curl, const char *uri, const char *range)
+{
+  CURLcode res = CURLE_OK;
+  printf("\nRTSP: PLAY %s\n", uri);
+  my_curl_easy_setopt(curl, CURLOPT_RTSP_STREAM_URI, uri);
+  my_curl_easy_setopt(curl, CURLOPT_RANGE, range);
+  my_curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST, (long)CURL_RTSPREQ_PLAY);
+  my_curl_easy_perform(curl);
+
+  /* switch off using range again */
+  my_curl_easy_setopt(curl, CURLOPT_RANGE, NULL);
+}
+
+
+/* send RTSP TEARDOWN request */
+static void rtsp_teardown(CURL *curl, const char *uri)
+{
+  CURLcode res = CURLE_OK;
+  printf("\nRTSP: TEARDOWN %s\n", uri);
+  my_curl_easy_setopt(curl, CURLOPT_RTSP_REQUEST, (long)CURL_RTSPREQ_TEARDOWN);
+  my_curl_easy_perform(curl);
+}
+
+
+/* convert url into an sdp filename */
+static void get_sdp_filename(const char *url, char *sdp_filename,
+                             size_t namelen)
+{
+  const char *s = strrchr(url, '/');
+  strcpy(sdp_filename, "video.sdp");
+  if(s != NULL) {
+    s++;
+    if(s[0] != '\0') {
+      snprintf(sdp_filename, namelen, "%s.sdp", s);
+    }
+  }
+}
+
+
+/* scan sdp file for media control attribute */
+static void get_media_control_attribute(const char *sdp_filename,
+                                        char *control)
+{
+  int max_len = 256;
+  char *s = malloc(max_len);
+  FILE *sdp_fp = fopen(sdp_filename, "rb");
+  control[0] = '\0';
+  if(sdp_fp != NULL) {
+    while(fgets(s, max_len - 2, sdp_fp) != NULL) {
+      sscanf(s, " a = control: %s", control);
+    }
+    fclose(sdp_fp);
+  }
+  free(s);
+}
+
+
+/* main app */
+int main(int argc, char * const argv[])
+{
+#if 1
+  const char *transport = "RTP/AVP;unicast;client_port=1234-1235";  /* UDP */
+#else
+  /* TCP */
+  const char *transport = "RTP/AVP/TCP;unicast;client_port=1234-1235";
+#endif
+  const char *range = "0.000-";
+  int rc = EXIT_SUCCESS;
+  char *base_name = NULL;
+
+  printf("\nRTSP request %s\n", VERSION_STR);
+  printf("    Project web site: "
+    "https://github.com/BackupGGCode/rtsprequest\n");
+  printf("    Requires curl V7.20 or greater\n\n");
+
+  /* check command line */
+  if((argc != 2) && (argc != 3)) {
+    base_name = strrchr(argv[0], '/');
+    if(base_name == NULL) {
+      base_name = strrchr(argv[0], '\\');
+    }
+    if(base_name == NULL) {
+      base_name = argv[0];
+    }
+    else {
+      base_name++;
+    }
+    printf("Usage:   %s url [transport]\n", base_name);
+    printf("         url of video server\n");
+    printf("         transport (optional) specifier for media stream"
+           " protocol\n");
+    printf("         default transport: %s\n", transport);
+    printf("Example: %s rtsp://192.168.0.2/media/video1\n\n", base_name);
+    rc = EXIT_FAILURE;
+  }
+  else {
+    const char *url = argv[1];
+    char *uri = malloc(strlen(url) + 32);
+    char *sdp_filename = malloc(strlen(url) + 32);
+    char *control = malloc(strlen(url) + 32);
+    CURLcode res;
+    get_sdp_filename(url, sdp_filename, strlen(url) + 32);
+    if(argc == 3) {
+      transport = argv[2];
+    }
+
+    /* initialize curl */
+    res = curl_global_init(CURL_GLOBAL_ALL);
+    if(res == CURLE_OK) {
+      curl_version_info_data *data = curl_version_info(CURLVERSION_NOW);
+      CURL *curl;
+      fprintf(stderr, "    curl V%s loaded\n", data->version);
+
+      /* initialize this curl session */
+      curl = curl_easy_init();
+      if(curl != NULL) {
+        my_curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L);
+        my_curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
+        my_curl_easy_setopt(curl, CURLOPT_HEADERDATA, stdout);
+        my_curl_easy_setopt(curl, CURLOPT_URL, url);
+
+        /* request server options */
+        snprintf(uri, strlen(url) + 32, "%s", url);
+        rtsp_options(curl, uri);
+
+        /* request session description and write response to sdp file */
+        rtsp_describe(curl, uri, sdp_filename);
+
+        /* get media control attribute from sdp file */
+        get_media_control_attribute(sdp_filename, control);
+
+        /* setup media stream */
+        snprintf(uri, strlen(url) + 32, "%s/%s", url, control);
+        rtsp_setup(curl, uri, transport);
+
+        /* start playing media stream */
+        snprintf(uri, strlen(url) + 32, "%s/", url);
+        rtsp_play(curl, uri, range);
+        printf("Playing video, press any key to stop ...");
+        _getch();
+        printf("\n");
+
+        /* teardown session */
+        rtsp_teardown(curl, uri);
+
+        /* cleanup */
+        curl_easy_cleanup(curl);
+        curl = NULL;
+      }
+      else {
+        fprintf(stderr, "curl_easy_init() failed\n");
+      }
+      curl_global_cleanup();
+    }
+    else {
+      fprintf(stderr, "curl_global_init(%s) failed: %d\n",
+              "CURL_GLOBAL_ALL", res);
+    }
+    free(control);
+    free(sdp_filename);
+    free(uri);
+  }
+
+  return rc;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/sampleconv.c b/components/cronet/third_party/curl_headers/docs/examples/sampleconv.c
new file mode 100644
index 0000000..1c4aec6
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/sampleconv.c
@@ -0,0 +1,112 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * This is a simple example showing how a program on a non-ASCII platform
+ * would invoke callbacks to do its own codeset conversions instead of
+ * using the built-in iconv functions in libcurl.
+ * </DESC>
+ */
+/*
+
+   The IBM-1047 EBCDIC codeset is used for this example but the code
+   would be similar for other non-ASCII codesets.
+
+   Three callback functions are created below:
+        my_conv_from_ascii_to_ebcdic,
+        my_conv_from_ebcdic_to_ascii, and
+        my_conv_from_utf8_to_ebcdic
+
+   The "platform_xxx" calls represent platform-specific conversion routines.
+
+ */
+
+#include <stdio.h>
+#include <curl/curl.h>
+
+static CURLcode my_conv_from_ascii_to_ebcdic(char *buffer, size_t length)
+{
+  char *tempptrin, *tempptrout;
+  size_t bytes = length;
+  int rc;
+  tempptrin = tempptrout = buffer;
+  rc = platform_a2e(&tempptrin, &bytes, &tempptrout, &bytes);
+  if(rc == PLATFORM_CONV_OK) {
+    return CURLE_OK;
+  }
+  else {
+    return CURLE_CONV_FAILED;
+  }
+}
+
+static CURLcode my_conv_from_ebcdic_to_ascii(char *buffer, size_t length)
+{
+  char *tempptrin, *tempptrout;
+  size_t bytes = length;
+  int rc;
+  tempptrin = tempptrout = buffer;
+  rc = platform_e2a(&tempptrin, &bytes, &tempptrout, &bytes);
+  if(rc == PLATFORM_CONV_OK) {
+    return CURLE_OK;
+  }
+  else {
+    return CURLE_CONV_FAILED;
+  }
+}
+
+static CURLcode my_conv_from_utf8_to_ebcdic(char *buffer, size_t length)
+{
+  char *tempptrin, *tempptrout;
+  size_t bytes = length;
+  int rc;
+  tempptrin = tempptrout = buffer;
+  rc = platform_u2e(&tempptrin, &bytes, &tempptrout, &bytes);
+  if(rc == PLATFORM_CONV_OK) {
+    return CURLE_OK;
+  }
+  else {
+    return CURLE_CONV_FAILED;
+  }
+}
+
+int main(void)
+{
+  CURL *curl;
+
+  curl = curl_easy_init();
+  if(curl) {
+    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+
+    /* use platform-specific functions for codeset conversions */
+    curl_easy_setopt(curl, CURLOPT_CONV_FROM_NETWORK_FUNCTION,
+                     my_conv_from_ascii_to_ebcdic);
+    curl_easy_setopt(curl, CURLOPT_CONV_TO_NETWORK_FUNCTION,
+                     my_conv_from_ebcdic_to_ascii);
+    curl_easy_setopt(curl, CURLOPT_CONV_FROM_UTF8_FUNCTION,
+                     my_conv_from_utf8_to_ebcdic);
+
+    curl_easy_perform(curl);
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/sendrecv.c b/components/cronet/third_party/curl_headers/docs/examples/sendrecv.c
new file mode 100644
index 0000000..5660a795
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/sendrecv.c
@@ -0,0 +1,161 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * An example of curl_easy_send() and curl_easy_recv() usage.
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <curl/curl.h>
+
+/* Auxiliary function that waits on the socket. */
+static int wait_on_socket(curl_socket_t sockfd, int for_recv, long timeout_ms)
+{
+  struct timeval tv;
+  fd_set infd, outfd, errfd;
+  int res;
+
+  tv.tv_sec = timeout_ms / 1000;
+  tv.tv_usec = (timeout_ms % 1000) * 1000;
+
+  FD_ZERO(&infd);
+  FD_ZERO(&outfd);
+  FD_ZERO(&errfd);
+
+  FD_SET(sockfd, &errfd); /* always check for error */
+
+  if(for_recv) {
+    FD_SET(sockfd, &infd);
+  }
+  else {
+    FD_SET(sockfd, &outfd);
+  }
+
+  /* select() returns the number of signalled sockets or -1 */
+  res = select((int)sockfd + 1, &infd, &outfd, &errfd, &tv);
+  return res;
+}
+
+int main(void)
+{
+  CURL *curl;
+  /* Minimalistic http request */
+  const char *request = "GET / HTTP/1.0\r\nHost: example.com\r\n\r\n";
+  size_t request_len = strlen(request);
+
+  /* A general note of caution here: if you're using curl_easy_recv() or
+     curl_easy_send() to implement HTTP or _any_ other protocol libcurl
+     supports "natively", you're doing it wrong and you should stop.
+
+     This example uses HTTP only to show how to use this API, it does not
+     suggest that writing an application doing this is sensible.
+  */
+
+  curl = curl_easy_init();
+  if(curl) {
+    CURLcode res;
+    curl_socket_t sockfd;
+    size_t nsent_total = 0;
+
+    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+    /* Do not do the transfer - only connect to host */
+    curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L);
+    res = curl_easy_perform(curl);
+
+    if(res != CURLE_OK) {
+      printf("Error: %s\n", curl_easy_strerror(res));
+      return 1;
+    }
+
+    /* Extract the socket from the curl handle - we'll need it for waiting. */
+    res = curl_easy_getinfo(curl, CURLINFO_ACTIVESOCKET, &sockfd);
+
+    if(res != CURLE_OK) {
+      printf("Error: %s\n", curl_easy_strerror(res));
+      return 1;
+    }
+
+    printf("Sending request.\n");
+
+    do {
+      /* Warning: This example program may loop indefinitely.
+       * A production-quality program must define a timeout and exit this loop
+       * as soon as the timeout has expired. */
+      size_t nsent;
+      do {
+        nsent = 0;
+        res = curl_easy_send(curl, request + nsent_total,
+            request_len - nsent_total, &nsent);
+        nsent_total += nsent;
+
+        if(res == CURLE_AGAIN && !wait_on_socket(sockfd, 0, 60000L)) {
+          printf("Error: timeout.\n");
+          return 1;
+        }
+      } while(res == CURLE_AGAIN);
+
+      if(res != CURLE_OK) {
+        printf("Error: %s\n", curl_easy_strerror(res));
+        return 1;
+      }
+
+      printf("Sent %" CURL_FORMAT_CURL_OFF_T " bytes.\n",
+        (curl_off_t)nsent);
+
+    } while(nsent_total < request_len);
+
+    printf("Reading response.\n");
+
+    for(;;) {
+      /* Warning: This example program may loop indefinitely (see above). */
+      char buf[1024];
+      size_t nread;
+      do {
+        nread = 0;
+        res = curl_easy_recv(curl, buf, sizeof(buf), &nread);
+
+        if(res == CURLE_AGAIN && !wait_on_socket(sockfd, 1, 60000L)) {
+          printf("Error: timeout.\n");
+          return 1;
+        }
+      } while(res == CURLE_AGAIN);
+
+      if(res != CURLE_OK) {
+        printf("Error: %s\n", curl_easy_strerror(res));
+        break;
+      }
+
+      if(nread == 0) {
+        /* end of the response */
+        break;
+      }
+
+      printf("Received %" CURL_FORMAT_CURL_OFF_T " bytes.\n",
+        (curl_off_t)nread);
+    }
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/sepheaders.c b/components/cronet/third_party/curl_headers/docs/examples/sepheaders.c
new file mode 100644
index 0000000..8f3a5ff0
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/sepheaders.c
@@ -0,0 +1,94 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Simple HTTP GET that stores the headers in a separate file
+ * </DESC>
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <curl/curl.h>
+
+static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
+{
+  size_t written = fwrite(ptr, size, nmemb, (FILE *)stream);
+  return written;
+}
+
+int main(void)
+{
+  CURL *curl_handle;
+  static const char *headerfilename = "head.out";
+  FILE *headerfile;
+  static const char *bodyfilename = "body.out";
+  FILE *bodyfile;
+
+  curl_global_init(CURL_GLOBAL_ALL);
+
+  /* init the curl session */
+  curl_handle = curl_easy_init();
+
+  /* set URL to get */
+  curl_easy_setopt(curl_handle, CURLOPT_URL, "https://example.com");
+
+  /* no progress meter please */
+  curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L);
+
+  /* send all data to this function  */
+  curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data);
+
+  /* open the header file */
+  headerfile = fopen(headerfilename, "wb");
+  if(!headerfile) {
+    curl_easy_cleanup(curl_handle);
+    return -1;
+  }
+
+  /* open the body file */
+  bodyfile = fopen(bodyfilename, "wb");
+  if(!bodyfile) {
+    curl_easy_cleanup(curl_handle);
+    fclose(headerfile);
+    return -1;
+  }
+
+  /* we want the headers be written to this file handle */
+  curl_easy_setopt(curl_handle, CURLOPT_HEADERDATA, headerfile);
+
+  /* we want the body be written to this file handle instead of stdout */
+  curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, bodyfile);
+
+  /* get it! */
+  curl_easy_perform(curl_handle);
+
+  /* close the header file */
+  fclose(headerfile);
+
+  /* close the body file */
+  fclose(bodyfile);
+
+  /* cleanup curl stuff */
+  curl_easy_cleanup(curl_handle);
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/sessioninfo.c b/components/cronet/third_party/curl_headers/docs/examples/sessioninfo.c
new file mode 100644
index 0000000..86a813a
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/sessioninfo.c
@@ -0,0 +1,109 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Uses the CURLINFO_TLS_SESSION data.
+ * </DESC>
+ */
+
+/* Note that this example currently requires curl to be linked against
+   GnuTLS (and this program must also be linked against -lgnutls). */
+
+#include <stdio.h>
+
+#include <curl/curl.h>
+#include <gnutls/gnutls.h>
+
+static CURL *curl;
+
+static size_t wrfu(void *ptr, size_t size, size_t nmemb, void *stream)
+{
+  const struct curl_tlssessioninfo *info;
+  unsigned int cert_list_size;
+  const gnutls_datum_t *chainp;
+  CURLcode res;
+
+  (void)stream;
+  (void)ptr;
+
+  res = curl_easy_getinfo(curl, CURLINFO_TLS_SESSION, &info);
+
+  if(!res) {
+    switch(info->backend) {
+    case CURLSSLBACKEND_GNUTLS:
+      /* info->internals is now the gnutls_session_t */
+      chainp = gnutls_certificate_get_peers(info->internals, &cert_list_size);
+      if((chainp) && (cert_list_size)) {
+        unsigned int i;
+
+        for(i = 0; i < cert_list_size; i++) {
+          gnutls_x509_crt_t cert;
+          gnutls_datum_t dn;
+
+          if(GNUTLS_E_SUCCESS == gnutls_x509_crt_init(&cert)) {
+            if(GNUTLS_E_SUCCESS ==
+               gnutls_x509_crt_import(cert, &chainp[i], GNUTLS_X509_FMT_DER)) {
+              if(GNUTLS_E_SUCCESS ==
+                 gnutls_x509_crt_print(cert, GNUTLS_CRT_PRINT_FULL, &dn)) {
+                fprintf(stderr, "Certificate #%u: %.*s", i, dn.size, dn.data);
+
+                gnutls_free(dn.data);
+              }
+            }
+
+            gnutls_x509_crt_deinit(cert);
+          }
+        }
+      }
+      break;
+    case CURLSSLBACKEND_NONE:
+    default:
+      break;
+    }
+  }
+
+  return size * nmemb;
+}
+
+int main(void)
+{
+  curl_global_init(CURL_GLOBAL_DEFAULT);
+
+  curl = curl_easy_init();
+  if(curl) {
+    curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/");
+
+    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, wrfu);
+
+    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
+    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
+
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L);
+
+    (void) curl_easy_perform(curl);
+
+    curl_easy_cleanup(curl);
+  }
+
+  curl_global_cleanup();
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/sftpget.c b/components/cronet/third_party/curl_headers/docs/examples/sftpget.c
new file mode 100644
index 0000000..e5a74b9
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/sftpget.c
@@ -0,0 +1,110 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Gets a file using an SFTP URL.
+ * </DESC>
+ */
+
+#include <stdio.h>
+
+#include <curl/curl.h>
+
+/* define this to switch off the use of ssh-agent in this program */
+#undef DISABLE_SSH_AGENT
+
+/*
+ * This is an example showing how to get a single file from an SFTP server.
+ * It delays the actual destination file creation until the first write
+ * callback so that it won't create an empty file in case the remote file
+ * doesn't exist or something else fails.
+ */
+
+struct FtpFile {
+  const char *filename;
+  FILE *stream;
+};
+
+static size_t my_fwrite(void *buffer, size_t size, size_t nmemb,
+                        void *stream)
+{
+  struct FtpFile *out = (struct FtpFile *)stream;
+  if(!out->stream) {
+    /* open file for writing */
+    out->stream = fopen(out->filename, "wb");
+    if(!out->stream)
+      return -1; /* failure, can't open file to write */
+  }
+  return fwrite(buffer, size, nmemb, out->stream);
+}
+
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+  struct FtpFile ftpfile = {
+    "yourfile.bin", /* name to store the file as if successful */
+    NULL
+  };
+
+  curl_global_init(CURL_GLOBAL_DEFAULT);
+
+  curl = curl_easy_init();
+  if(curl) {
+    /*
+     * You better replace the URL with one that works!
+     */
+    curl_easy_setopt(curl, CURLOPT_URL,
+                     "sftp://user@server/home/user/file.txt");
+    /* Define our callback to get called when there's data to be written */
+    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
+    /* Set a pointer to our struct to pass to the callback */
+    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);
+
+#ifndef DISABLE_SSH_AGENT
+    /* We activate ssh agent. For this to work you need
+       to have ssh-agent running (type set | grep SSH_AGENT to check) or
+       pageant on Windows (there is an icon in systray if so) */
+    curl_easy_setopt(curl, CURLOPT_SSH_AUTH_TYPES, CURLSSH_AUTH_AGENT);
+#endif
+
+    /* Switch on full protocol/debug output */
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+    res = curl_easy_perform(curl);
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+
+    if(CURLE_OK != res) {
+      /* we failed */
+      fprintf(stderr, "curl told us %d\n", res);
+    }
+  }
+
+  if(ftpfile.stream)
+    fclose(ftpfile.stream); /* close the local file */
+
+  curl_global_cleanup();
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/sftpuploadresume.c b/components/cronet/third_party/curl_headers/docs/examples/sftpuploadresume.c
new file mode 100644
index 0000000..e7d9d23
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/sftpuploadresume.c
@@ -0,0 +1,135 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Upload to SFTP, resuming a previously aborted transfer.
+ * </DESC>
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <curl/curl.h>
+
+/* read data to upload */
+static size_t readfunc(void *ptr, size_t size, size_t nmemb, void *stream)
+{
+  FILE *f = (FILE *)stream;
+  size_t n;
+
+  if(ferror(f))
+    return CURL_READFUNC_ABORT;
+
+  n = fread(ptr, size, nmemb, f) * size;
+
+  return n;
+}
+
+/*
+ * sftpGetRemoteFileSize returns the remote file size in byte; -1 on error
+ */
+static curl_off_t sftpGetRemoteFileSize(const char *i_remoteFile)
+{
+  CURLcode result = CURLE_GOT_NOTHING;
+  curl_off_t remoteFileSizeByte = -1;
+  CURL *curlHandlePtr = curl_easy_init();
+
+  curl_easy_setopt(curlHandlePtr, CURLOPT_VERBOSE, 1L);
+
+  curl_easy_setopt(curlHandlePtr, CURLOPT_URL, i_remoteFile);
+  curl_easy_setopt(curlHandlePtr, CURLOPT_NOPROGRESS, 1);
+  curl_easy_setopt(curlHandlePtr, CURLOPT_NOBODY, 1);
+  curl_easy_setopt(curlHandlePtr, CURLOPT_HEADER, 1);
+  curl_easy_setopt(curlHandlePtr, CURLOPT_FILETIME, 1);
+
+  result = curl_easy_perform(curlHandlePtr);
+  if(CURLE_OK == result) {
+    result = curl_easy_getinfo(curlHandlePtr,
+                               CURLINFO_CONTENT_LENGTH_DOWNLOAD_T,
+                               &remoteFileSizeByte);
+    if(result)
+      return -1;
+    printf("filesize: %" CURL_FORMAT_CURL_OFF_T "\n", remoteFileSizeByte);
+  }
+  curl_easy_cleanup(curlHandlePtr);
+
+  return remoteFileSizeByte;
+}
+
+
+static int sftpResumeUpload(CURL *curlhandle, const char *remotepath,
+                            const char *localpath)
+{
+  FILE *f = NULL;
+  CURLcode result = CURLE_GOT_NOTHING;
+
+  curl_off_t remoteFileSizeByte = sftpGetRemoteFileSize(remotepath);
+  if(-1 == remoteFileSizeByte) {
+    printf("Error reading the remote file size: unable to resume upload\n");
+    return -1;
+  }
+
+  f = fopen(localpath, "rb");
+  if(!f) {
+    perror(NULL);
+    return 0;
+  }
+
+  curl_easy_setopt(curlhandle, CURLOPT_UPLOAD, 1L);
+  curl_easy_setopt(curlhandle, CURLOPT_URL, remotepath);
+  curl_easy_setopt(curlhandle, CURLOPT_READFUNCTION, readfunc);
+  curl_easy_setopt(curlhandle, CURLOPT_READDATA, f);
+
+#ifdef _WIN32
+  _fseeki64(f, remoteFileSizeByte, SEEK_SET);
+#else
+  fseek(f, (long)remoteFileSizeByte, SEEK_SET);
+#endif
+  curl_easy_setopt(curlhandle, CURLOPT_APPEND, 1L);
+  result = curl_easy_perform(curlhandle);
+
+  fclose(f);
+
+  if(result == CURLE_OK)
+    return 1;
+  else {
+    fprintf(stderr, "%s\n", curl_easy_strerror(result));
+    return 0;
+  }
+}
+
+int main(void)
+{
+  const char *remote = "sftp://user:pass@example.com/path/filename";
+  const char *filename = "filename";
+  CURL *curlhandle = NULL;
+
+  curl_global_init(CURL_GLOBAL_ALL);
+  curlhandle = curl_easy_init();
+
+  if(!sftpResumeUpload(curlhandle, remote, filename)) {
+    printf("resumed upload using curl %s failed\n", curl_version());
+  }
+
+  curl_easy_cleanup(curlhandle);
+  curl_global_cleanup();
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/shared-connection-cache.c b/components/cronet/third_party/curl_headers/docs/examples/shared-connection-cache.c
new file mode 100644
index 0000000..639ad9c5
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/shared-connection-cache.c
@@ -0,0 +1,85 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Connection cache shared between easy handles with the share interface
+ * </DESC>
+ */
+#include <stdio.h>
+#include <curl/curl.h>
+
+static void my_lock(CURL *handle, curl_lock_data data,
+                    curl_lock_access laccess, void *useptr)
+{
+  (void)handle;
+  (void)data;
+  (void)laccess;
+  (void)useptr;
+  fprintf(stderr, "-> Mutex lock\n");
+}
+
+static void my_unlock(CURL *handle, curl_lock_data data, void *useptr)
+{
+  (void)handle;
+  (void)data;
+  (void)useptr;
+  fprintf(stderr, "<- Mutex unlock\n");
+}
+
+int main(void)
+{
+  CURLSH *share;
+  int i;
+
+  share = curl_share_init();
+  curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT);
+
+  curl_share_setopt(share, CURLSHOPT_LOCKFUNC, my_lock);
+  curl_share_setopt(share, CURLSHOPT_UNLOCKFUNC, my_unlock);
+
+  /* Loop the transfer and cleanup the handle properly every lap. This will
+     still reuse connections since the pool is in the shared object! */
+
+  for(i = 0; i < 3; i++) {
+    CURL *curl = curl_easy_init();
+    if(curl) {
+      CURLcode res;
+
+      curl_easy_setopt(curl, CURLOPT_URL, "https://curl.haxx.se/");
+
+      /* use the share object */
+      curl_easy_setopt(curl, CURLOPT_SHARE, share);
+
+      /* Perform the request, res will get the return code */
+      res = curl_easy_perform(curl);
+      /* Check for errors */
+      if(res != CURLE_OK)
+        fprintf(stderr, "curl_easy_perform() failed: %s\n",
+                curl_easy_strerror(res));
+
+      /* always cleanup */
+      curl_easy_cleanup(curl);
+    }
+  }
+
+  curl_share_cleanup(share);
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/simple.c b/components/cronet/third_party/curl_headers/docs/examples/simple.c
new file mode 100644
index 0000000..c61227054
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/simple.c
@@ -0,0 +1,51 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Very simple HTTP GET
+ * </DESC>
+ */
+#include <stdio.h>
+#include <curl/curl.h>
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+
+  curl = curl_easy_init();
+  if(curl) {
+    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+    /* example.com is redirected, so we tell libcurl to follow redirection */
+    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+
+    /* Perform the request, res will get the return code */
+    res = curl_easy_perform(curl);
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/simplepost.c b/components/cronet/third_party/curl_headers/docs/examples/simplepost.c
new file mode 100644
index 0000000..8ec537b5
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/simplepost.c
@@ -0,0 +1,57 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Very simple HTTP POST
+ * </DESC>
+ */
+#include <stdio.h>
+#include <string.h>
+#include <curl/curl.h>
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+
+  static const char *postthis = "moo mooo moo moo";
+
+  curl = curl_easy_init();
+  if(curl) {
+    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
+    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postthis);
+
+    /* if we don't provide POSTFIELDSIZE, libcurl will strlen() by
+       itself */
+    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(postthis));
+
+    /* Perform the request, res will get the return code */
+    res = curl_easy_perform(curl);
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/simplessl.c b/components/cronet/third_party/curl_headers/docs/examples/simplessl.c
new file mode 100644
index 0000000..fdc7cf1
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/simplessl.c
@@ -0,0 +1,141 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Shows HTTPS usage with client certs and optional ssl engine use.
+ * </DESC>
+ */
+#include <stdio.h>
+
+#include <curl/curl.h>
+
+/* some requirements for this to work:
+   1.   set pCertFile to the file with the client certificate
+   2.   if the key is passphrase protected, set pPassphrase to the
+        passphrase you use
+   3.   if you are using a crypto engine:
+   3.1. set a #define USE_ENGINE
+   3.2. set pEngine to the name of the crypto engine you use
+   3.3. set pKeyName to the key identifier you want to use
+   4.   if you don't use a crypto engine:
+   4.1. set pKeyName to the file name of your client key
+   4.2. if the format of the key file is DER, set pKeyType to "DER"
+
+   !! verify of the server certificate is not implemented here !!
+
+   **** This example only works with libcurl 7.9.3 and later! ****
+
+*/
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+  FILE *headerfile;
+  const char *pPassphrase = NULL;
+
+  static const char *pCertFile = "testcert.pem";
+  static const char *pCACertFile = "cacert.pem";
+  static const char *pHeaderFile = "dumpit";
+
+  const char *pKeyName;
+  const char *pKeyType;
+
+  const char *pEngine;
+
+#ifdef USE_ENGINE
+  pKeyName  = "rsa_test";
+  pKeyType  = "ENG";
+  pEngine   = "chil";            /* for nChiper HSM... */
+#else
+  pKeyName  = "testkey.pem";
+  pKeyType  = "PEM";
+  pEngine   = NULL;
+#endif
+
+  headerfile = fopen(pHeaderFile, "wb");
+
+  curl_global_init(CURL_GLOBAL_DEFAULT);
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* what call to write: */
+    curl_easy_setopt(curl, CURLOPT_URL, "HTTPS://your.favourite.ssl.site");
+    curl_easy_setopt(curl, CURLOPT_HEADERDATA, headerfile);
+
+    do { /* dummy loop, just to break out from */
+      if(pEngine) {
+        /* use crypto engine */
+        if(curl_easy_setopt(curl, CURLOPT_SSLENGINE, pEngine) != CURLE_OK) {
+          /* load the crypto engine */
+          fprintf(stderr, "can't set crypto engine\n");
+          break;
+        }
+        if(curl_easy_setopt(curl, CURLOPT_SSLENGINE_DEFAULT, 1L) != CURLE_OK) {
+          /* set the crypto engine as default */
+          /* only needed for the first time you load
+             a engine in a curl object... */
+          fprintf(stderr, "can't set crypto engine as default\n");
+          break;
+        }
+      }
+      /* cert is stored PEM coded in file... */
+      /* since PEM is default, we needn't set it for PEM */
+      curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, "PEM");
+
+      /* set the cert for client authentication */
+      curl_easy_setopt(curl, CURLOPT_SSLCERT, pCertFile);
+
+      /* sorry, for engine we must set the passphrase
+         (if the key has one...) */
+      if(pPassphrase)
+        curl_easy_setopt(curl, CURLOPT_KEYPASSWD, pPassphrase);
+
+      /* if we use a key stored in a crypto engine,
+         we must set the key type to "ENG" */
+      curl_easy_setopt(curl, CURLOPT_SSLKEYTYPE, pKeyType);
+
+      /* set the private key (file or ID in engine) */
+      curl_easy_setopt(curl, CURLOPT_SSLKEY, pKeyName);
+
+      /* set the file with the certs vaildating the server */
+      curl_easy_setopt(curl, CURLOPT_CAINFO, pCACertFile);
+
+      /* disconnect if we can't validate server's cert */
+      curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
+
+      /* Perform the request, res will get the return code */
+      res = curl_easy_perform(curl);
+      /* Check for errors */
+      if(res != CURLE_OK)
+        fprintf(stderr, "curl_easy_perform() failed: %s\n",
+                curl_easy_strerror(res));
+
+      /* we are done... */
+    } while(0);
+    /* always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  curl_global_cleanup();
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/smooth-gtk-thread.c b/components/cronet/third_party/curl_headers/docs/examples/smooth-gtk-thread.c
new file mode 100644
index 0000000..b64c4861
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/smooth-gtk-thread.c
@@ -0,0 +1,224 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * A multi threaded application that uses a progress bar to show
+ * status.  It uses Gtk+ to make a smooth pulse.
+ * </DESC>
+ */
+/*
+ * Written by Jud Bishop after studying the other examples provided with
+ * libcurl.
+ *
+ * To compile (on a single line):
+ * gcc -ggdb `pkg-config --cflags  --libs gtk+-2.0` -lcurl -lssl -lcrypto
+ *   -lgthread-2.0 -dl  smooth-gtk-thread.c -o smooth-gtk-thread
+ */
+
+#include <stdio.h>
+#include <gtk/gtk.h>
+#include <glib.h>
+#include <unistd.h>
+#include <pthread.h>
+
+#include <curl/curl.h>
+
+#define NUMT 4
+
+pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
+int j = 0;
+gint num_urls = 9; /* Just make sure this is less than urls[]*/
+const char * const urls[]= {
+  "90022",
+  "90023",
+  "90024",
+  "90025",
+  "90026",
+  "90027",
+  "90028",
+  "90029",
+  "90030"
+};
+
+size_t write_file(void *ptr, size_t size, size_t nmemb, FILE *stream)
+{
+  /* printf("write_file\n"); */
+  return fwrite(ptr, size, nmemb, stream);
+}
+
+/* https://weather.com/weather/today/l/46214?cc=*&dayf=5&unit=i */
+void *pull_one_url(void *NaN)
+{
+  /* Stop threads from entering unless j is incremented */
+  pthread_mutex_lock(&lock);
+  while(j < num_urls) {
+    CURL *curl;
+    gchar *http;
+
+    printf("j = %d\n", j);
+
+    http =
+      g_strdup_printf("xoap.weather.com/weather/local/%s?cc=*&dayf=5&unit=i\n",
+                      urls[j]);
+
+    printf("http %s", http);
+
+    curl = curl_easy_init();
+    if(curl) {
+
+      FILE *outfile = fopen(urls[j], "wb");
+
+      /* Set the URL and transfer type */
+      curl_easy_setopt(curl, CURLOPT_URL, http);
+
+      /* Write to the file */
+      curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile);
+      curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_file);
+
+      j++;  /* critical line */
+      pthread_mutex_unlock(&lock);
+
+      curl_easy_perform(curl);
+
+      fclose(outfile);
+      printf("fclose\n");
+
+      curl_easy_cleanup(curl);
+    }
+    g_free(http);
+
+    /* Adds more latency, testing the mutex.*/
+    sleep(1);
+
+  } /* end while */
+  return NULL;
+}
+
+
+gboolean pulse_bar(gpointer data)
+{
+  gdk_threads_enter();
+  gtk_progress_bar_pulse(GTK_PROGRESS_BAR (data));
+  gdk_threads_leave();
+
+  /* Return true so the function will be called again;
+   * returning false removes this timeout function.
+   */
+  return TRUE;
+}
+
+void *create_thread(void *progress_bar)
+{
+  pthread_t tid[NUMT];
+  int i;
+
+  /* Make sure I don't create more threads than urls. */
+  for(i = 0; i < NUMT && i < num_urls ; i++) {
+    int error = pthread_create(&tid[i],
+                               NULL, /* default attributes please */
+                               pull_one_url,
+                               NULL);
+    if(0 != error)
+      fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error);
+    else
+      fprintf(stderr, "Thread %d, gets %s\n", i, urls[i]);
+  }
+
+  /* Wait for all threads to terminate. */
+  for(i = 0; i < NUMT && i < num_urls; i++) {
+    pthread_join(tid[i], NULL);
+    fprintf(stderr, "Thread %d terminated\n", i);
+  }
+
+  /* This stops the pulsing if you have it turned on in the progress bar
+     section */
+  g_source_remove(GPOINTER_TO_INT(g_object_get_data(G_OBJECT(progress_bar),
+                                                    "pulse_id")));
+
+  /* This destroys the progress bar */
+  gtk_widget_destroy(progress_bar);
+
+  /* [Un]Comment this out to kill the program rather than pushing close. */
+  /* gtk_main_quit(); */
+
+
+  return NULL;
+
+}
+
+static gboolean cb_delete(GtkWidget *window, gpointer data)
+{
+  gtk_main_quit();
+  return FALSE;
+}
+
+int main(int argc, char **argv)
+{
+  GtkWidget *top_window, *outside_frame, *inside_frame, *progress_bar;
+
+  /* Must initialize libcurl before any threads are started */
+  curl_global_init(CURL_GLOBAL_ALL);
+
+  /* Init thread */
+  g_thread_init(NULL);
+  gdk_threads_init();
+  gdk_threads_enter();
+
+  gtk_init(&argc, &argv);
+
+  /* Base window */
+  top_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+
+  /* Frame */
+  outside_frame = gtk_frame_new(NULL);
+  gtk_frame_set_shadow_type(GTK_FRAME(outside_frame), GTK_SHADOW_OUT);
+  gtk_container_add(GTK_CONTAINER(top_window), outside_frame);
+
+  /* Frame */
+  inside_frame = gtk_frame_new(NULL);
+  gtk_frame_set_shadow_type(GTK_FRAME(inside_frame), GTK_SHADOW_IN);
+  gtk_container_set_border_width(GTK_CONTAINER(inside_frame), 5);
+  gtk_container_add(GTK_CONTAINER(outside_frame), inside_frame);
+
+  /* Progress bar */
+  progress_bar = gtk_progress_bar_new();
+  gtk_progress_bar_pulse(GTK_PROGRESS_BAR (progress_bar));
+  /* Make uniform pulsing */
+  gint pulse_ref = g_timeout_add(300, pulse_bar, progress_bar);
+  g_object_set_data(G_OBJECT(progress_bar), "pulse_id",
+                    GINT_TO_POINTER(pulse_ref));
+  gtk_container_add(GTK_CONTAINER(inside_frame), progress_bar);
+
+  gtk_widget_show_all(top_window);
+  printf("gtk_widget_show_all\n");
+
+  g_signal_connect(G_OBJECT (top_window), "delete-event",
+                   G_CALLBACK(cb_delete), NULL);
+
+  if(!g_thread_create(&create_thread, progress_bar, FALSE, NULL) != 0)
+    g_warning("can't create the thread");
+
+  gtk_main();
+  gdk_threads_leave();
+  printf("gdk_threads_leave\n");
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/smtp-expn.c b/components/cronet/third_party/curl_headers/docs/examples/smtp-expn.c
new file mode 100644
index 0000000..fb0ed1d
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/smtp-expn.c
@@ -0,0 +1,79 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * SMTP example showing how to expand an e-mail mailing list
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to expand an e-mail mailing list.
+ *
+ * Notes:
+ *
+ * 1) This example requires libcurl 7.34.0 or above.
+ * 2) Not all email servers support this command.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+  struct curl_slist *recipients = NULL;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* This is the URL for your mailserver */
+    curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com");
+
+    /* Note that the CURLOPT_MAIL_RCPT takes a list, not a char array  */
+    recipients = curl_slist_append(recipients, "Friends");
+    curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);
+
+    /* Set the EXPN command */
+    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "EXPN");
+
+    /* Perform the custom request */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Free the list of recipients */
+    curl_slist_free_all(recipients);
+
+    /* Curl won't send the QUIT command until you call cleanup, so you should
+     * be able to re-use this connection for additional requests. It may not be
+     * a good idea to keep the connection open for a very long time though
+     * (more than a few minutes may result in the server timing out the
+     * connection) and you do want to clean up in the end.
+     */
+    curl_easy_cleanup(curl);
+  }
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/smtp-mail.c b/components/cronet/third_party/curl_headers/docs/examples/smtp-mail.c
new file mode 100644
index 0000000..3285b31
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/smtp-mail.c
@@ -0,0 +1,149 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * Send e-mail with SMTP
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <curl/curl.h>
+
+/*
+ * For an SMTP example using the multi interface please see smtp-multi.c.
+ */
+
+/* The libcurl options want plain addresses, the viewable headers in the mail
+ * can very well get a full name as well.
+ */
+#define FROM_ADDR    "<sender@example.org>"
+#define TO_ADDR      "<addressee@example.net>"
+#define CC_ADDR      "<info@example.org>"
+
+#define FROM_MAIL "Sender Person " FROM_ADDR
+#define TO_MAIL   "A Receiver " TO_ADDR
+#define CC_MAIL   "John CC Smith " CC_ADDR
+
+static const char *payload_text[] = {
+  "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n",
+  "To: " TO_MAIL "\r\n",
+  "From: " FROM_MAIL "\r\n",
+  "Cc: " CC_MAIL "\r\n",
+  "Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@"
+  "rfcpedant.example.org>\r\n",
+  "Subject: SMTP example message\r\n",
+  "\r\n", /* empty line to divide headers from body, see RFC5322 */
+  "The body of the message starts here.\r\n",
+  "\r\n",
+  "It could be a lot of lines, could be MIME encoded, whatever.\r\n",
+  "Check RFC5322.\r\n",
+  NULL
+};
+
+struct upload_status {
+  int lines_read;
+};
+
+static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp)
+{
+  struct upload_status *upload_ctx = (struct upload_status *)userp;
+  const char *data;
+
+  if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) {
+    return 0;
+  }
+
+  data = payload_text[upload_ctx->lines_read];
+
+  if(data) {
+    size_t len = strlen(data);
+    memcpy(ptr, data, len);
+    upload_ctx->lines_read++;
+
+    return len;
+  }
+
+  return 0;
+}
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+  struct curl_slist *recipients = NULL;
+  struct upload_status upload_ctx;
+
+  upload_ctx.lines_read = 0;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* This is the URL for your mailserver */
+    curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com");
+
+    /* Note that this option isn't strictly required, omitting it will result
+     * in libcurl sending the MAIL FROM command with empty sender data. All
+     * autoresponses should have an empty reverse-path, and should be directed
+     * to the address in the reverse-path which triggered them. Otherwise,
+     * they could cause an endless loop. See RFC 5321 Section 4.5.5 for more
+     * details.
+     */
+    curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM_ADDR);
+
+    /* Add two recipients, in this particular case they correspond to the
+     * To: and Cc: addressees in the header, but they could be any kind of
+     * recipient. */
+    recipients = curl_slist_append(recipients, TO_ADDR);
+    recipients = curl_slist_append(recipients, CC_ADDR);
+    curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);
+
+    /* We're using a callback function to specify the payload (the headers and
+     * body of the message). You could just use the CURLOPT_READDATA option to
+     * specify a FILE pointer to read from. */
+    curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source);
+    curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx);
+    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+
+    /* Send the message */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Free the list of recipients */
+    curl_slist_free_all(recipients);
+
+    /* curl won't send the QUIT command until you call cleanup, so you should
+     * be able to re-use this connection for additional messages (setting
+     * CURLOPT_MAIL_FROM and CURLOPT_MAIL_RCPT as required, and calling
+     * curl_easy_perform() again. It may not be a good idea to keep the
+     * connection open for a very long time though (more than a few minutes
+     * may result in the server timing out the connection), and you do want to
+     * clean up in the end.
+     */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/smtp-mime.c b/components/cronet/third_party/curl_headers/docs/examples/smtp-mime.c
new file mode 100644
index 0000000..4f3fbfd
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/smtp-mime.c
@@ -0,0 +1,163 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * SMTP example showing how to send mime e-mails
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to send mime mail using libcurl's SMTP
+ * capabilities. For an example of using the multi interface please see
+ * smtp-multi.c.
+ *
+ * Note that this example requires libcurl 7.56.0 or above.
+ */
+
+#define FROM    "<sender@example.org>"
+#define TO      "<addressee@example.net>"
+#define CC      "<info@example.org>"
+
+static const char *headers_text[] = {
+  "Date: Tue, 22 Aug 2017 14:08:43 +0100",
+  "To: " TO,
+  "From: " FROM " (Example User)",
+  "Cc: " CC " (Another example User)",
+  "Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@"
+    "rfcpedant.example.org>",
+  "Subject: example sending a MIME-formatted message",
+  NULL
+};
+
+static const char inline_text[] =
+  "This is the inline text message of the e-mail.\r\n"
+  "\r\n"
+  "  It could be a lot of lines that would be displayed in an e-mail\r\n"
+  "viewer that is not able to handle HTML.\r\n";
+
+static const char inline_html[] =
+  "<html><body>\r\n"
+  "<p>This is the inline <b>HTML</b> message of the e-mail.</p>"
+  "<br />\r\n"
+  "<p>It could be a lot of HTML data that would be displayed by "
+  "e-mail viewers able to handle HTML.</p>"
+  "</body></html>\r\n";
+
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+
+  curl = curl_easy_init();
+  if(curl) {
+    struct curl_slist *headers = NULL;
+    struct curl_slist *recipients = NULL;
+    struct curl_slist *slist = NULL;
+    curl_mime *mime;
+    curl_mime *alt;
+    curl_mimepart *part;
+    const char **cpp;
+
+    /* This is the URL for your mailserver */
+    curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com");
+
+    /* Note that this option isn't strictly required, omitting it will result
+     * in libcurl sending the MAIL FROM command with empty sender data. All
+     * autoresponses should have an empty reverse-path, and should be directed
+     * to the address in the reverse-path which triggered them. Otherwise,
+     * they could cause an endless loop. See RFC 5321 Section 4.5.5 for more
+     * details.
+     */
+    curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM);
+
+    /* Add two recipients, in this particular case they correspond to the
+     * To: and Cc: addressees in the header, but they could be any kind of
+     * recipient. */
+    recipients = curl_slist_append(recipients, TO);
+    recipients = curl_slist_append(recipients, CC);
+    curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);
+
+    /* Build and set the message header list. */
+    for(cpp = headers_text; *cpp; cpp++)
+      headers = curl_slist_append(headers, *cpp);
+    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
+
+    /* Build the mime message. */
+    mime = curl_mime_init(curl);
+
+    /* The inline part is an alternative proposing the html and the text
+       versions of the e-mail. */
+    alt = curl_mime_init(curl);
+
+    /* HTML message. */
+    part = curl_mime_addpart(alt);
+    curl_mime_data(part, inline_html, CURL_ZERO_TERMINATED);
+    curl_mime_type(part, "text/html");
+
+    /* Text message. */
+    part = curl_mime_addpart(alt);
+    curl_mime_data(part, inline_text, CURL_ZERO_TERMINATED);
+
+    /* Create the inline part. */
+    part = curl_mime_addpart(mime);
+    curl_mime_subparts(part, alt);
+    curl_mime_type(part, "multipart/alternative");
+    slist = curl_slist_append(NULL, "Content-Disposition: inline");
+    curl_mime_headers(part, slist, 1);
+
+    /* Add the current source program as an attachment. */
+    part = curl_mime_addpart(mime);
+    curl_mime_filedata(part, "smtp-mime.c");
+    curl_easy_setopt(curl, CURLOPT_MIMEPOST, mime);
+
+    /* Send the message */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Free lists. */
+    curl_slist_free_all(recipients);
+    curl_slist_free_all(headers);
+
+    /* curl won't send the QUIT command until you call cleanup, so you should
+     * be able to re-use this connection for additional messages (setting
+     * CURLOPT_MAIL_FROM and CURLOPT_MAIL_RCPT as required, and calling
+     * curl_easy_perform() again. It may not be a good idea to keep the
+     * connection open for a very long time though (more than a few minutes
+     * may result in the server timing out the connection), and you do want to
+     * clean up in the end.
+     */
+    curl_easy_cleanup(curl);
+
+    /* Free multipart message. */
+    curl_mime_free(mime);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/smtp-multi.c b/components/cronet/third_party/curl_headers/docs/examples/smtp-multi.c
new file mode 100644
index 0000000..bd70bdb
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/smtp-multi.c
@@ -0,0 +1,243 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * SMTP example using the multi interface
+ * </DESC>
+ */
+
+#include <string.h>
+#include <curl/curl.h>
+
+/* This is an example showing how to send mail using libcurl's SMTP
+ * capabilities. It builds on the smtp-mail.c example to demonstrate how to use
+ * libcurl's multi interface.
+ *
+ * Note that this example requires libcurl 7.20.0 or above.
+ */
+
+#define FROM     "<sender@example.com>"
+#define TO       "<recipient@example.com>"
+#define CC       "<info@example.com>"
+
+#define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000
+
+static const char *payload_text[] = {
+  "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n",
+  "To: " TO "\r\n",
+  "From: " FROM " (Example User)\r\n",
+  "Cc: " CC " (Another example User)\r\n",
+  "Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@"
+  "rfcpedant.example.org>\r\n",
+  "Subject: SMTP multi example message\r\n",
+  "\r\n", /* empty line to divide headers from body, see RFC5322 */
+  "The body of the message starts here.\r\n",
+  "\r\n",
+  "It could be a lot of lines, could be MIME encoded, whatever.\r\n",
+  "Check RFC5322.\r\n",
+  NULL
+};
+
+struct upload_status {
+  int lines_read;
+};
+
+static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp)
+{
+  struct upload_status *upload_ctx = (struct upload_status *)userp;
+  const char *data;
+
+  if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) {
+    return 0;
+  }
+
+  data = payload_text[upload_ctx->lines_read];
+
+  if(data) {
+    size_t len = strlen(data);
+    memcpy(ptr, data, len);
+    upload_ctx->lines_read++;
+
+    return len;
+  }
+
+  return 0;
+}
+
+static struct timeval tvnow(void)
+{
+  struct timeval now;
+
+  /* time() returns the value of time in seconds since the epoch */
+  now.tv_sec = (long)time(NULL);
+  now.tv_usec = 0;
+
+  return now;
+}
+
+static long tvdiff(struct timeval newer, struct timeval older)
+{
+  return (newer.tv_sec - older.tv_sec) * 1000 +
+    (newer.tv_usec - older.tv_usec) / 1000;
+}
+
+int main(void)
+{
+  CURL *curl;
+  CURLM *mcurl;
+  int still_running = 1;
+  struct timeval mp_start;
+  struct curl_slist *recipients = NULL;
+  struct upload_status upload_ctx;
+
+  upload_ctx.lines_read = 0;
+
+  curl_global_init(CURL_GLOBAL_DEFAULT);
+
+  curl = curl_easy_init();
+  if(!curl)
+    return 1;
+
+  mcurl = curl_multi_init();
+  if(!mcurl)
+    return 2;
+
+  /* This is the URL for your mailserver */
+  curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com");
+
+  /* Note that this option isn't strictly required, omitting it will result in
+   * libcurl sending the MAIL FROM command with empty sender data. All
+   * autoresponses should have an empty reverse-path, and should be directed
+   * to the address in the reverse-path which triggered them. Otherwise, they
+   * could cause an endless loop. See RFC 5321 Section 4.5.5 for more details.
+   */
+  curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM);
+
+  /* Add two recipients, in this particular case they correspond to the
+   * To: and Cc: addressees in the header, but they could be any kind of
+   * recipient. */
+  recipients = curl_slist_append(recipients, TO);
+  recipients = curl_slist_append(recipients, CC);
+  curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);
+
+  /* We're using a callback function to specify the payload (the headers and
+   * body of the message). You could just use the CURLOPT_READDATA option to
+   * specify a FILE pointer to read from. */
+  curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source);
+  curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx);
+  curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+
+  /* Tell the multi stack about our easy handle */
+  curl_multi_add_handle(mcurl, curl);
+
+  /* Record the start time which we can use later */
+  mp_start = tvnow();
+
+  /* We start some action by calling perform right away */
+  curl_multi_perform(mcurl, &still_running);
+
+  while(still_running) {
+    struct timeval timeout;
+    fd_set fdread;
+    fd_set fdwrite;
+    fd_set fdexcep;
+    int maxfd = -1;
+    int rc;
+    CURLMcode mc; /* curl_multi_fdset() return code */
+
+    long curl_timeo = -1;
+
+    /* Initialise the file descriptors */
+    FD_ZERO(&fdread);
+    FD_ZERO(&fdwrite);
+    FD_ZERO(&fdexcep);
+
+    /* Set a suitable timeout to play around with */
+    timeout.tv_sec = 1;
+    timeout.tv_usec = 0;
+
+    curl_multi_timeout(mcurl, &curl_timeo);
+    if(curl_timeo >= 0) {
+      timeout.tv_sec = curl_timeo / 1000;
+      if(timeout.tv_sec > 1)
+        timeout.tv_sec = 1;
+      else
+        timeout.tv_usec = (curl_timeo % 1000) * 1000;
+    }
+
+    /* get file descriptors from the transfers */
+    mc = curl_multi_fdset(mcurl, &fdread, &fdwrite, &fdexcep, &maxfd);
+
+    if(mc != CURLM_OK) {
+      fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
+      break;
+    }
+
+    /* On success the value of maxfd is guaranteed to be >= -1. We call
+       select(maxfd + 1, ...); specially in case of (maxfd == -1) there are
+       no fds ready yet so we call select(0, ...) --or Sleep() on Windows--
+       to sleep 100ms, which is the minimum suggested value in the
+       curl_multi_fdset() doc. */
+
+    if(maxfd == -1) {
+#ifdef _WIN32
+      Sleep(100);
+      rc = 0;
+#else
+      /* Portable sleep for platforms other than Windows. */
+      struct timeval wait = { 0, 100 * 1000 }; /* 100ms */
+      rc = select(0, NULL, NULL, NULL, &wait);
+#endif
+    }
+    else {
+      /* Note that on some platforms 'timeout' may be modified by select().
+         If you need access to the original value save a copy beforehand. */
+      rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
+    }
+
+    if(tvdiff(tvnow(), mp_start) > MULTI_PERFORM_HANG_TIMEOUT) {
+      fprintf(stderr,
+              "ABORTING: Since it seems that we would have run forever.\n");
+      break;
+    }
+
+    switch(rc) {
+    case -1:  /* select error */
+      break;
+    case 0:   /* timeout */
+    default:  /* action */
+      curl_multi_perform(mcurl, &still_running);
+      break;
+    }
+  }
+
+  /* Free the list of recipients */
+  curl_slist_free_all(recipients);
+
+  /* Always cleanup */
+  curl_multi_remove_handle(mcurl, curl);
+  curl_multi_cleanup(mcurl);
+  curl_easy_cleanup(curl);
+  curl_global_cleanup();
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/smtp-ssl.c b/components/cronet/third_party/curl_headers/docs/examples/smtp-ssl.c
new file mode 100644
index 0000000..019da7d
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/smtp-ssl.c
@@ -0,0 +1,169 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * SMTP example using SSL
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to send mail using libcurl's SMTP
+ * capabilities. It builds on the smtp-mail.c example to add authentication
+ * and, more importantly, transport security to protect the authentication
+ * details from being snooped.
+ *
+ * Note that this example requires libcurl 7.20.0 or above.
+ */
+
+#define FROM    "<sender@example.org>"
+#define TO      "<addressee@example.net>"
+#define CC      "<info@example.org>"
+
+static const char *payload_text[] = {
+  "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n",
+  "To: " TO "\r\n",
+  "From: " FROM " (Example User)\r\n",
+  "Cc: " CC " (Another example User)\r\n",
+  "Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@"
+  "rfcpedant.example.org>\r\n",
+  "Subject: SMTP SSL example message\r\n",
+  "\r\n", /* empty line to divide headers from body, see RFC5322 */
+  "The body of the message starts here.\r\n",
+  "\r\n",
+  "It could be a lot of lines, could be MIME encoded, whatever.\r\n",
+  "Check RFC5322.\r\n",
+  NULL
+};
+
+struct upload_status {
+  int lines_read;
+};
+
+static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp)
+{
+  struct upload_status *upload_ctx = (struct upload_status *)userp;
+  const char *data;
+
+  if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) {
+    return 0;
+  }
+
+  data = payload_text[upload_ctx->lines_read];
+
+  if(data) {
+    size_t len = strlen(data);
+    memcpy(ptr, data, len);
+    upload_ctx->lines_read++;
+
+    return len;
+  }
+
+  return 0;
+}
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+  struct curl_slist *recipients = NULL;
+  struct upload_status upload_ctx;
+
+  upload_ctx.lines_read = 0;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* This is the URL for your mailserver. Note the use of smtps:// rather
+     * than smtp:// to request a SSL based connection. */
+    curl_easy_setopt(curl, CURLOPT_URL, "smtps://mainserver.example.net");
+
+    /* If you want to connect to a site who isn't using a certificate that is
+     * signed by one of the certs in the CA bundle you have, you can skip the
+     * verification of the server's certificate. This makes the connection
+     * A LOT LESS SECURE.
+     *
+     * If you have a CA cert for the server stored someplace else than in the
+     * default bundle, then the CURLOPT_CAPATH option might come handy for
+     * you. */
+#ifdef SKIP_PEER_VERIFICATION
+    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
+#endif
+
+    /* If the site you're connecting to uses a different host name that what
+     * they have mentioned in their server certificate's commonName (or
+     * subjectAltName) fields, libcurl will refuse to connect. You can skip
+     * this check, but this will make the connection less secure. */
+#ifdef SKIP_HOSTNAME_VERIFICATION
+    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
+#endif
+
+    /* Note that this option isn't strictly required, omitting it will result
+     * in libcurl sending the MAIL FROM command with empty sender data. All
+     * autoresponses should have an empty reverse-path, and should be directed
+     * to the address in the reverse-path which triggered them. Otherwise,
+     * they could cause an endless loop. See RFC 5321 Section 4.5.5 for more
+     * details.
+     */
+    curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM);
+
+    /* Add two recipients, in this particular case they correspond to the
+     * To: and Cc: addressees in the header, but they could be any kind of
+     * recipient. */
+    recipients = curl_slist_append(recipients, TO);
+    recipients = curl_slist_append(recipients, CC);
+    curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);
+
+    /* We're using a callback function to specify the payload (the headers and
+     * body of the message). You could just use the CURLOPT_READDATA option to
+     * specify a FILE pointer to read from. */
+    curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source);
+    curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx);
+    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+
+    /* Since the traffic will be encrypted, it is very useful to turn on debug
+     * information within libcurl to see what is happening during the
+     * transfer */
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+    /* Send the message */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Free the list of recipients */
+    curl_slist_free_all(recipients);
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/smtp-tls.c b/components/cronet/third_party/curl_headers/docs/examples/smtp-tls.c
new file mode 100644
index 0000000..671a80d
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/smtp-tls.c
@@ -0,0 +1,171 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * SMTP example using TLS
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to send mail using libcurl's SMTP
+ * capabilities. It builds on the smtp-mail.c example to add authentication
+ * and, more importantly, transport security to protect the authentication
+ * details from being snooped.
+ *
+ * Note that this example requires libcurl 7.20.0 or above.
+ */
+
+#define FROM    "<sender@example.org>"
+#define TO      "<addressee@example.net>"
+#define CC      "<info@example.org>"
+
+static const char *payload_text[] = {
+  "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n",
+  "To: " TO "\r\n",
+  "From: " FROM " (Example User)\r\n",
+  "Cc: " CC " (Another example User)\r\n",
+  "Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@"
+  "rfcpedant.example.org>\r\n",
+  "Subject: SMTP TLS example message\r\n",
+  "\r\n", /* empty line to divide headers from body, see RFC5322 */
+  "The body of the message starts here.\r\n",
+  "\r\n",
+  "It could be a lot of lines, could be MIME encoded, whatever.\r\n",
+  "Check RFC5322.\r\n",
+  NULL
+};
+
+struct upload_status {
+  int lines_read;
+};
+
+static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp)
+{
+  struct upload_status *upload_ctx = (struct upload_status *)userp;
+  const char *data;
+
+  if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) {
+    return 0;
+  }
+
+  data = payload_text[upload_ctx->lines_read];
+
+  if(data) {
+    size_t len = strlen(data);
+    memcpy(ptr, data, len);
+    upload_ctx->lines_read++;
+
+    return len;
+  }
+
+  return 0;
+}
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res = CURLE_OK;
+  struct curl_slist *recipients = NULL;
+  struct upload_status upload_ctx;
+
+  upload_ctx.lines_read = 0;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* Set username and password */
+    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
+    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
+
+    /* This is the URL for your mailserver. Note the use of port 587 here,
+     * instead of the normal SMTP port (25). Port 587 is commonly used for
+     * secure mail submission (see RFC4403), but you should use whatever
+     * matches your server configuration. */
+    curl_easy_setopt(curl, CURLOPT_URL, "smtp://mainserver.example.net:587");
+
+    /* In this example, we'll start with a plain text connection, and upgrade
+     * to Transport Layer Security (TLS) using the STARTTLS command. Be careful
+     * of using CURLUSESSL_TRY here, because if TLS upgrade fails, the transfer
+     * will continue anyway - see the security discussion in the libcurl
+     * tutorial for more details. */
+    curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL);
+
+    /* If your server doesn't have a valid certificate, then you can disable
+     * part of the Transport Layer Security protection by setting the
+     * CURLOPT_SSL_VERIFYPEER and CURLOPT_SSL_VERIFYHOST options to 0 (false).
+     *   curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
+     *   curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
+     * That is, in general, a bad idea. It is still better than sending your
+     * authentication details in plain text though.  Instead, you should get
+     * the issuer certificate (or the host certificate if the certificate is
+     * self-signed) and add it to the set of certificates that are known to
+     * libcurl using CURLOPT_CAINFO and/or CURLOPT_CAPATH. See docs/SSLCERTS
+     * for more information. */
+    curl_easy_setopt(curl, CURLOPT_CAINFO, "/path/to/certificate.pem");
+
+    /* Note that this option isn't strictly required, omitting it will result
+     * in libcurl sending the MAIL FROM command with empty sender data. All
+     * autoresponses should have an empty reverse-path, and should be directed
+     * to the address in the reverse-path which triggered them. Otherwise,
+     * they could cause an endless loop. See RFC 5321 Section 4.5.5 for more
+     * details.
+     */
+    curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM);
+
+    /* Add two recipients, in this particular case they correspond to the
+     * To: and Cc: addressees in the header, but they could be any kind of
+     * recipient. */
+    recipients = curl_slist_append(recipients, TO);
+    recipients = curl_slist_append(recipients, CC);
+    curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);
+
+    /* We're using a callback function to specify the payload (the headers and
+     * body of the message). You could just use the CURLOPT_READDATA option to
+     * specify a FILE pointer to read from. */
+    curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source);
+    curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx);
+    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
+
+    /* Since the traffic will be encrypted, it is very useful to turn on debug
+     * information within libcurl to see what is happening during the transfer.
+     */
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+    /* Send the message */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Free the list of recipients */
+    curl_slist_free_all(recipients);
+
+    /* Always cleanup */
+    curl_easy_cleanup(curl);
+  }
+
+  return (int)res;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/smtp-vrfy.c b/components/cronet/third_party/curl_headers/docs/examples/smtp-vrfy.c
new file mode 100644
index 0000000..4e0623fb
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/smtp-vrfy.c
@@ -0,0 +1,79 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* <DESC>
+ * SMTP example showing how to verify an e-mail address
+ * </DESC>
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <curl/curl.h>
+
+/* This is a simple example showing how to verify an e-mail address from an
+ * SMTP server.
+ *
+ * Notes:
+ *
+ * 1) This example requires libcurl 7.34.0 or above.
+ * 2) Not all email servers support this command and even if your email server
+ *    does support it, it may respond with a 252 response code even though the
+ *    address doesn't exist.
+ */
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+  struct curl_slist *recipients = NULL;
+
+  curl = curl_easy_init();
+  if(curl) {
+    /* This is the URL for your mailserver */
+    curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com");
+
+    /* Note that the CURLOPT_MAIL_RCPT takes a list, not a char array  */
+    recipients = curl_slist_append(recipients, "<recipient@example.com>");
+    curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);
+
+    /* Perform the VRFY */
+    res = curl_easy_perform(curl);
+
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    /* Free the list of recipients */
+    curl_slist_free_all(recipients);
+
+    /* Curl won't send the QUIT command until you call cleanup, so you should
+     * be able to re-use this connection for additional requests. It may not be
+     * a good idea to keep the connection open for a very long time though
+     * (more than a few minutes may result in the server timing out the
+     * connection) and you do want to clean up in the end.
+     */
+    curl_easy_cleanup(curl);
+  }
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/sslbackend.c b/components/cronet/third_party/curl_headers/docs/examples/sslbackend.c
new file mode 100644
index 0000000..c1489a9
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/sslbackend.c
@@ -0,0 +1,77 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Shows HTTPS usage with client certs and optional ssl engine use.
+ * </DESC>
+ */
+#include <assert.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <curl/curl.h>
+
+/*
+ * An SSL-enabled libcurl is required for this sample to work (at least one
+ * SSL backend has to be configured).
+ *
+ *  **** This example only works with libcurl 7.56.0 and later! ****
+*/
+
+int main(int argc, char **argv)
+{
+  const char *name = argc > 1 ? argv[1] : "openssl";
+  CURLsslset result;
+
+  if(!strcmp("list", name)) {
+    const curl_ssl_backend **list;
+    int i;
+
+    result = curl_global_sslset(-1, NULL, &list);
+    assert(result == CURLSSLSET_UNKNOWN_BACKEND);
+
+    for(i = 0; list[i]; i++)
+      printf("SSL backend #%d: '%s' (ID: %d)\n",
+             i, list[i]->name, list[i]->id);
+
+    return 0;
+  }
+  else if(isdigit(*name)) {
+    int id = atoi(name);
+
+    result = curl_global_sslset((curl_sslbackend)id, NULL, NULL);
+  }
+  else
+    result = curl_global_sslset(-1, name, NULL);
+
+  if(result == CURLSSLSET_UNKNOWN_BACKEND) {
+    fprintf(stderr, "Unknown SSL backend id: %s\n", name);
+    return 1;
+  }
+
+  assert(result == CURLSSLSET_OK);
+
+  printf("Version with SSL backend '%s':\n\n\t%s\n", name, curl_version());
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/synctime.c b/components/cronet/third_party/curl_headers/docs/examples/synctime.c
new file mode 100644
index 0000000..905f5118
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/synctime.c
@@ -0,0 +1,374 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Set your system time from a remote HTTP server's Date: header.
+ * </DESC>
+ */
+/* This example code only builds as-is on Windows.
+ *
+ * While Unix/Linux user, you do not need this software.
+ * You can achieve the same result as synctime using curl, awk and date.
+ * Set proxy as according to your network, but beware of proxy Cache-Control.
+ *
+ * To set your system clock, root access is required.
+ * # date -s "`curl -sI https://nist.time.gov/timezone.cgi?UTC/s/0 \
+ *        | awk -F': ' '/Date: / {print $2}'`"
+ *
+ * To view remote webserver date and time.
+ * $ curl -sI https://nist.time.gov/timezone.cgi?UTC/s/0 \
+ *        | awk -F': ' '/Date: / {print $2}'
+ *
+ * Synchronising your computer clock via Internet time server usually relies
+ * on DAYTIME, TIME, or NTP protocols. These protocols provide good accurate
+ * time synchronisation but it does not work very well through a
+ * firewall/proxy. Some adjustment has to be made to the firewall/proxy for
+ * these protocols to work properly.
+ *
+ * There is an indirect method. Since most webserver provide server time in
+ * their HTTP header, therefore you could synchronise your computer clock
+ * using HTTP protocol which has no problem with firewall/proxy.
+ *
+ * For this software to work, you should take note of these items.
+ * 1. Your firewall/proxy must allow your computer to surf internet.
+ * 2. Webserver system time must in sync with the NTP time server,
+ *    or at least provide an accurate time keeping.
+ * 3. Webserver HTTP header does not provide the milliseconds units,
+ *    so there is no way to get very accurate time.
+ * 4. This software could only provide an accuracy of +- a few seconds,
+ *    as Round-Trip delay time is not taken into consideration.
+ *    Compensation of network, firewall/proxy delay cannot be simply divide
+ *    the Round-Trip delay time by half.
+ * 5. Win32 SetSystemTime() API will set your computer clock according to
+ *    GMT/UTC time. Therefore your computer timezone must be properly set.
+ * 6. Webserver data should not be cached by the proxy server. Some
+ *    webserver provide Cache-Control to prevent caching.
+ *
+ * References:
+ * https://web.archive.org/web/20100228012139/ \
+ *    tf.nist.gov/timefreq/service/its.htm
+ * https://web.archive.org/web/20100409024302/ \
+ *    tf.nist.gov/timefreq/service/firewall.htm
+ *
+ * Usage:
+ * This software will synchronise your computer clock only when you issue
+ * it with --synctime. By default, it only display the webserver's clock.
+ *
+ * Written by: Frank (contributed to libcurl)
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL THE AUTHOR OF THIS SOFTWARE BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ */
+
+#include <stdio.h>
+#include <time.h>
+#ifndef __CYGWIN__
+#include <winsock2.h>
+#include <windows.h>
+#endif
+#include <curl/curl.h>
+
+
+#define MAX_STRING              256
+#define MAX_STRING1             MAX_STRING + 1
+
+#define SYNCTIME_UA "synctime/1.0"
+
+typedef struct
+{
+  char http_proxy[MAX_STRING1];
+  char proxy_user[MAX_STRING1];
+  char timeserver[MAX_STRING1];
+} conf_t;
+
+const char DefaultTimeServer[3][MAX_STRING1] =
+{
+  "https://nist.time.gov/",
+  "https://www.google.com/"
+};
+
+const char *DayStr[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
+const char *MthStr[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
+                        "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
+
+int  ShowAllHeader;
+int  AutoSyncTime;
+SYSTEMTIME SYSTime;
+SYSTEMTIME LOCALTime;
+
+#define HTTP_COMMAND_HEAD       0
+#define HTTP_COMMAND_GET        1
+
+
+size_t SyncTime_CURL_WriteOutput(void *ptr, size_t size, size_t nmemb,
+                                 void *stream)
+{
+  fwrite(ptr, size, nmemb, stream);
+  return (nmemb*size);
+}
+
+size_t SyncTime_CURL_WriteHeader(void *ptr, size_t size, size_t nmemb,
+                                 void *stream)
+{
+  int   i, RetVal;
+  char  TmpStr1[26], TmpStr2[26];
+
+  (void)stream;
+
+  if(ShowAllHeader == 1)
+    fprintf(stderr, "%s", (char *)(ptr));
+
+  if(strncmp((char *)(ptr), "Date:", 5) == 0) {
+    if(ShowAllHeader == 0)
+      fprintf(stderr, "HTTP Server. %s", (char *)(ptr));
+
+    if(AutoSyncTime == 1) {
+      *TmpStr1 = 0;
+      *TmpStr2 = 0;
+      if(strlen((char *)(ptr)) > 50) /* Can prevent buffer overflow to
+                                         TmpStr1 & 2? */
+        AutoSyncTime = 0;
+      else {
+        RetVal = sscanf((char *)(ptr), "Date: %s %hu %s %hu %hu:%hu:%hu",
+                        TmpStr1, &SYSTime.wDay, TmpStr2, &SYSTime.wYear,
+                        &SYSTime.wHour, &SYSTime.wMinute, &SYSTime.wSecond);
+
+        if(RetVal == 7) {
+          SYSTime.wMilliseconds = 500;    /* adjust to midpoint, 0.5 sec */
+          for(i = 0; i<12; i++) {
+            if(strcmp(MthStr[i], TmpStr2) == 0) {
+              SYSTime.wMonth = i + 1;
+              break;
+            }
+          }
+          AutoSyncTime = 3;       /* Computer clock will be adjusted */
+        }
+        else {
+          AutoSyncTime = 0;       /* Error in sscanf() fields conversion */
+        }
+      }
+    }
+  }
+
+  if(strncmp((char *)(ptr), "X-Cache: HIT", 12) == 0) {
+    fprintf(stderr, "ERROR: HTTP Server data is cached."
+            " Server Date is no longer valid.\n");
+    AutoSyncTime = 0;
+  }
+  return (nmemb*size);
+}
+
+void SyncTime_CURL_Init(CURL *curl, char *proxy_port,
+                        char *proxy_user_password)
+{
+  if(strlen(proxy_port) > 0)
+    curl_easy_setopt(curl, CURLOPT_PROXY, proxy_port);
+
+  if(strlen(proxy_user_password) > 0)
+    curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, proxy_user_password);
+
+#ifdef SYNCTIME_UA
+  curl_easy_setopt(curl, CURLOPT_USERAGENT, SYNCTIME_UA);
+#endif
+  curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, *SyncTime_CURL_WriteOutput);
+  curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, *SyncTime_CURL_WriteHeader);
+}
+
+int SyncTime_CURL_Fetch(CURL *curl, char *URL_Str, char *OutFileName,
+                        int HttpGetBody)
+{
+  FILE *outfile;
+  CURLcode res;
+
+  outfile = NULL;
+  if(HttpGetBody == HTTP_COMMAND_HEAD)
+    curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);
+  else {
+    outfile = fopen(OutFileName, "wb");
+    curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile);
+  }
+
+  curl_easy_setopt(curl, CURLOPT_URL, URL_Str);
+  res = curl_easy_perform(curl);
+  if(outfile != NULL)
+    fclose(outfile);
+  return res;  /* (CURLE_OK) */
+}
+
+void showUsage(void)
+{
+  fprintf(stderr, "SYNCTIME: Synchronising computer clock with time server"
+          " using HTTP protocol.\n");
+  fprintf(stderr, "Usage   : SYNCTIME [Option]\n");
+  fprintf(stderr, "Options :\n");
+  fprintf(stderr, " --server=WEBSERVER        Use this time server instead"
+          " of default.\n");
+  fprintf(stderr, " --showall                 Show all HTTP header.\n");
+  fprintf(stderr, " --synctime                Synchronising computer clock"
+          " with time server.\n");
+  fprintf(stderr, " --proxy-user=USER[:PASS]  Set proxy username and"
+          " password.\n");
+  fprintf(stderr, " --proxy=HOST[:PORT]       Use HTTP proxy on given"
+          " port.\n");
+  fprintf(stderr, " --help                    Print this help.\n");
+  fprintf(stderr, "\n");
+  return;
+}
+
+int conf_init(conf_t *conf)
+{
+  int i;
+
+  *conf->http_proxy       = 0;
+  for(i = 0; i<MAX_STRING1; i++)
+    conf->proxy_user[i]     = 0;    /* Clean up password from memory */
+  *conf->timeserver       = 0;
+  return 1;
+}
+
+int main(int argc, char *argv[])
+{
+  CURL    *curl;
+  conf_t  conf[1];
+  int     RetValue;
+
+  ShowAllHeader   = 0;    /* Do not show HTTP Header */
+  AutoSyncTime    = 0;    /* Do not synchronise computer clock */
+  RetValue        = 0;    /* Successful Exit */
+  conf_init(conf);
+
+  if(argc > 1) {
+    int OptionIndex = 0;
+    while(OptionIndex < argc) {
+      if(strncmp(argv[OptionIndex], "--server=", 9) == 0)
+        snprintf(conf->timeserver, MAX_STRING, "%s", &argv[OptionIndex][9]);
+
+      if(strcmp(argv[OptionIndex], "--showall") == 0)
+        ShowAllHeader = 1;
+
+      if(strcmp(argv[OptionIndex], "--synctime") == 0)
+        AutoSyncTime = 1;
+
+      if(strncmp(argv[OptionIndex], "--proxy-user=", 13) == 0)
+        snprintf(conf->proxy_user, MAX_STRING, "%s", &argv[OptionIndex][13]);
+
+      if(strncmp(argv[OptionIndex], "--proxy=", 8) == 0)
+        snprintf(conf->http_proxy, MAX_STRING, "%s", &argv[OptionIndex][8]);
+
+      if((strcmp(argv[OptionIndex], "--help") == 0) ||
+          (strcmp(argv[OptionIndex], "/?") == 0)) {
+        showUsage();
+        return 0;
+      }
+      OptionIndex++;
+    }
+  }
+
+  if(*conf->timeserver == 0)     /* Use default server for time information */
+    snprintf(conf->timeserver, MAX_STRING, "%s", DefaultTimeServer[0]);
+
+  /* Init CURL before usage */
+  curl_global_init(CURL_GLOBAL_ALL);
+  curl = curl_easy_init();
+  if(curl) {
+    struct tm *lt;
+    struct tm *gmt;
+    time_t tt;
+    time_t tt_local;
+    time_t tt_gmt;
+    double tzonediffFloat;
+    int tzonediffWord;
+    char timeBuf[61];
+    char tzoneBuf[16];
+
+    SyncTime_CURL_Init(curl, conf->http_proxy, conf->proxy_user);
+
+    /* Calculating time diff between GMT and localtime */
+    tt       = time(0);
+    lt       = localtime(&tt);
+    tt_local = mktime(lt);
+    gmt      = gmtime(&tt);
+    tt_gmt   = mktime(gmt);
+    tzonediffFloat = difftime(tt_local, tt_gmt);
+    tzonediffWord  = (int)(tzonediffFloat/3600.0);
+
+    if((double)(tzonediffWord * 3600) == tzonediffFloat)
+      snprintf(tzoneBuf, 15, "%+03d'00'", tzonediffWord);
+    else
+      snprintf(tzoneBuf, 15, "%+03d'30'", tzonediffWord);
+
+    /* Get current system time and local time */
+    GetSystemTime(&SYSTime);
+    GetLocalTime(&LOCALTime);
+    snprintf(timeBuf, 60, "%s, %02d %s %04d %02d:%02d:%02d.%03d, ",
+             DayStr[LOCALTime.wDayOfWeek], LOCALTime.wDay,
+             MthStr[LOCALTime.wMonth-1], LOCALTime.wYear,
+             LOCALTime.wHour, LOCALTime.wMinute, LOCALTime.wSecond,
+             LOCALTime.wMilliseconds);
+
+    fprintf(stderr, "Fetch: %s\n\n", conf->timeserver);
+    fprintf(stderr, "Before HTTP. Date: %s%s\n\n", timeBuf, tzoneBuf);
+
+    /* HTTP HEAD command to the Webserver */
+    SyncTime_CURL_Fetch(curl, conf->timeserver, "index.htm",
+                        HTTP_COMMAND_HEAD);
+
+    GetLocalTime(&LOCALTime);
+    snprintf(timeBuf, 60, "%s, %02d %s %04d %02d:%02d:%02d.%03d, ",
+             DayStr[LOCALTime.wDayOfWeek], LOCALTime.wDay,
+             MthStr[LOCALTime.wMonth-1], LOCALTime.wYear,
+             LOCALTime.wHour, LOCALTime.wMinute, LOCALTime.wSecond,
+             LOCALTime.wMilliseconds);
+    fprintf(stderr, "\nAfter  HTTP. Date: %s%s\n", timeBuf, tzoneBuf);
+
+    if(AutoSyncTime == 3) {
+      /* Synchronising computer clock */
+      if(!SetSystemTime(&SYSTime)) {  /* Set system time */
+        fprintf(stderr, "ERROR: Unable to set system time.\n");
+        RetValue = 1;
+      }
+      else {
+        /* Successfully re-adjusted computer clock */
+        GetLocalTime(&LOCALTime);
+        snprintf(timeBuf, 60, "%s, %02d %s %04d %02d:%02d:%02d.%03d, ",
+                 DayStr[LOCALTime.wDayOfWeek], LOCALTime.wDay,
+                 MthStr[LOCALTime.wMonth-1], LOCALTime.wYear,
+                 LOCALTime.wHour, LOCALTime.wMinute, LOCALTime.wSecond,
+                 LOCALTime.wMilliseconds);
+        fprintf(stderr, "\nNew System's Date: %s%s\n", timeBuf, tzoneBuf);
+      }
+    }
+
+    /* Cleanup before exit */
+    conf_init(conf);
+    curl_easy_cleanup(curl);
+  }
+  return RetValue;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/threaded-shared-conn.c b/components/cronet/third_party/curl_headers/docs/examples/threaded-shared-conn.c
new file mode 100644
index 0000000..2eda6239
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/threaded-shared-conn.c
@@ -0,0 +1,156 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Multi-threaded transfers sharing a single connection pool
+ * </DESC>
+ *
+ * This example fires up NUM_THREADS threads and in each single thread, it
+ * downloads the same fixed URL a URL_ITERATIONS number of times. The received
+ * data is just thrown away. It sets up a single shared object that holds the
+ * connection cache and all easy handles in all threads share that same cache.
+ *
+ * This example uses pthreads for threads and mutexes, but should be easy to
+ * modify to use different thread/mutex system should you want to.
+ *
+ */
+
+#include <stdio.h>
+#include <pthread.h>
+#include <curl/curl.h>
+
+/*
+  URL to fetch. If you select HTTPS, you need to use a TLS backend with mutex
+  locks taken care of (OpenSSL 1.1.x, NSS, etc) or add SSL mutex callbacks!
+*/
+#define URL "http://localhost/4KB"
+
+/* number of threads to fire up in parallel */
+#define NUM_THREADS 67
+
+/* how many times each URL is transferred per thread */
+#define URL_ITERATIONS 11235
+
+static pthread_mutex_t connlock;
+
+static size_t write_db(void *ptr, size_t size, size_t nmemb, void *data)
+{
+  /* not interested in the downloaded bytes, return the size */
+  (void)ptr;  /* unused */
+  (void)data; /* unused */
+  return (size_t)(size * nmemb);
+}
+
+static void lock_cb(CURL *handle, curl_lock_data data,
+                    curl_lock_access access, void *userptr)
+{
+  (void)access; /* unused */
+  (void)userptr; /* unused */
+  (void)handle; /* unused */
+  (void)data; /* unused */
+  pthread_mutex_lock(&connlock);
+}
+
+static void unlock_cb(CURL *handle, curl_lock_data data,
+                      void *userptr)
+{
+  (void)userptr; /* unused */
+  (void)handle;  /* unused */
+  (void)data;    /* unused */
+  pthread_mutex_unlock(&connlock);
+}
+
+static void init_locks(void)
+{
+  pthread_mutex_init(&connlock, NULL);
+}
+
+static void kill_locks(void)
+{
+  pthread_mutex_destroy(&connlock);
+}
+
+struct initurl {
+  const char *url;
+  CURLSH *share;
+  int threadno;
+};
+
+static void *run_thread(void *ptr)
+{
+  struct initurl *u = (struct initurl *)ptr;
+  int i;
+
+  for(i = 0; i < URL_ITERATIONS; i++) {
+    CURL *curl = curl_easy_init();
+    curl_easy_setopt(curl, CURLOPT_URL, u->url);
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L);
+    curl_easy_setopt(curl, CURLOPT_SHARE, u->share);
+    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_db);
+    curl_easy_perform(curl); /* ignores error */
+    curl_easy_cleanup(curl);
+    fprintf(stderr, "Thread %d transfer %d\n", u->threadno, i);
+  }
+
+  return NULL;
+}
+
+int main(void)
+{
+  pthread_t tid[NUM_THREADS];
+  int i;
+  CURLSH *share;
+  struct initurl url[NUM_THREADS];
+
+  /* Must initialize libcurl before any threads are started */
+  curl_global_init(CURL_GLOBAL_ALL);
+
+  share = curl_share_init();
+  curl_share_setopt(share, CURLSHOPT_LOCKFUNC, lock_cb);
+  curl_share_setopt(share, CURLSHOPT_UNLOCKFUNC, unlock_cb);
+  curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT);
+
+  init_locks();
+
+  for(i = 0; i< NUM_THREADS; i++) {
+    int error;
+    url[i].url = URL;
+    url[i].share = share;
+    url[i].threadno = i;
+    error = pthread_create(&tid[i], NULL, run_thread, &url[i]);
+    if(0 != error)
+      fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error);
+    else
+      fprintf(stderr, "Thread %d, gets %s\n", i, URL);
+  }
+
+  /* now wait for all threads to terminate */
+  for(i = 0; i< NUM_THREADS; i++) {
+    pthread_join(tid[i], NULL);
+    fprintf(stderr, "Thread %d terminated\n", i);
+  }
+
+  kill_locks();
+
+  curl_share_cleanup(share);
+  curl_global_cleanup();
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/threaded-ssl.c b/components/cronet/third_party/curl_headers/docs/examples/threaded-ssl.c
new file mode 100644
index 0000000..522f8c4
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/threaded-ssl.c
@@ -0,0 +1,166 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Show the required mutex callback setups for GnuTLS and OpenSSL when using
+ * libcurl multi-threaded.
+ * </DESC>
+ */
+/* A multi-threaded example that uses pthreads and fetches 4 remote files at
+ * once over HTTPS. The lock callbacks and stuff assume OpenSSL <1.1 or GnuTLS
+ * (libgcrypt) so far.
+ *
+ * OpenSSL docs for this:
+ *   https://www.openssl.org/docs/crypto/threads.html
+ * gcrypt docs for this:
+ *   https://gnupg.org/documentation/manuals/gcrypt/Multi_002dThreading.html
+ */
+
+#define USE_OPENSSL /* or USE_GNUTLS accordingly */
+
+#include <stdio.h>
+#include <pthread.h>
+#include <curl/curl.h>
+
+#define NUMT 4
+
+/* we have this global to let the callback get easy access to it */
+static pthread_mutex_t *lockarray;
+
+#ifdef USE_OPENSSL
+#include <openssl/crypto.h>
+static void lock_callback(int mode, int type, char *file, int line)
+{
+  (void)file;
+  (void)line;
+  if(mode & CRYPTO_LOCK) {
+    pthread_mutex_lock(&(lockarray[type]));
+  }
+  else {
+    pthread_mutex_unlock(&(lockarray[type]));
+  }
+}
+
+static unsigned long thread_id(void)
+{
+  unsigned long ret;
+
+  ret = (unsigned long)pthread_self();
+  return ret;
+}
+
+static void init_locks(void)
+{
+  int i;
+
+  lockarray = (pthread_mutex_t *)OPENSSL_malloc(CRYPTO_num_locks() *
+                                                sizeof(pthread_mutex_t));
+  for(i = 0; i<CRYPTO_num_locks(); i++) {
+    pthread_mutex_init(&(lockarray[i]), NULL);
+  }
+
+  CRYPTO_set_id_callback((unsigned long (*)())thread_id);
+  CRYPTO_set_locking_callback((void (*)())lock_callback);
+}
+
+static void kill_locks(void)
+{
+  int i;
+
+  CRYPTO_set_locking_callback(NULL);
+  for(i = 0; i<CRYPTO_num_locks(); i++)
+    pthread_mutex_destroy(&(lockarray[i]));
+
+  OPENSSL_free(lockarray);
+}
+#endif
+
+#ifdef USE_GNUTLS
+#include <gcrypt.h>
+#include <errno.h>
+
+GCRY_THREAD_OPTION_PTHREAD_IMPL;
+
+void init_locks(void)
+{
+  gcry_control(GCRYCTL_SET_THREAD_CBS);
+}
+
+#define kill_locks()
+#endif
+
+/* List of URLs to fetch.*/
+const char * const urls[]= {
+  "https://www.example.com/",
+  "https://www2.example.com/",
+  "https://www3.example.com/",
+  "https://www4.example.com/",
+};
+
+static void *pull_one_url(void *url)
+{
+  CURL *curl;
+
+  curl = curl_easy_init();
+  curl_easy_setopt(curl, CURLOPT_URL, url);
+  /* this example doesn't verify the server's certificate, which means we
+     might be downloading stuff from an impostor */
+  curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
+  curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
+  curl_easy_perform(curl); /* ignores error */
+  curl_easy_cleanup(curl);
+
+  return NULL;
+}
+
+int main(int argc, char **argv)
+{
+  pthread_t tid[NUMT];
+  int i;
+  (void)argc; /* we don't use any arguments in this example */
+  (void)argv;
+
+  /* Must initialize libcurl before any threads are started */
+  curl_global_init(CURL_GLOBAL_ALL);
+
+  init_locks();
+
+  for(i = 0; i< NUMT; i++) {
+    int error = pthread_create(&tid[i],
+                               NULL, /* default attributes please */
+                               pull_one_url,
+                               (void *)urls[i]);
+    if(0 != error)
+      fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error);
+    else
+      fprintf(stderr, "Thread %d, gets %s\n", i, urls[i]);
+  }
+
+  /* now wait for all threads to terminate */
+  for(i = 0; i< NUMT; i++) {
+    pthread_join(tid[i], NULL);
+    fprintf(stderr, "Thread %d terminated\n", i);
+  }
+
+  kill_locks();
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/url2file.c b/components/cronet/third_party/curl_headers/docs/examples/url2file.c
new file mode 100644
index 0000000..1bede8c
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/url2file.c
@@ -0,0 +1,86 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Download a given URL into a local file named page.out.
+ * </DESC>
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <curl/curl.h>
+
+static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
+{
+  size_t written = fwrite(ptr, size, nmemb, (FILE *)stream);
+  return written;
+}
+
+int main(int argc, char *argv[])
+{
+  CURL *curl_handle;
+  static const char *pagefilename = "page.out";
+  FILE *pagefile;
+
+  if(argc < 2) {
+    printf("Usage: %s <URL>\n", argv[0]);
+    return 1;
+  }
+
+  curl_global_init(CURL_GLOBAL_ALL);
+
+  /* init the curl session */
+  curl_handle = curl_easy_init();
+
+  /* set URL to get here */
+  curl_easy_setopt(curl_handle, CURLOPT_URL, argv[1]);
+
+  /* Switch on full protocol/debug output while testing */
+  curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L);
+
+  /* disable progress meter, set to 0L to enable and disable debug output */
+  curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L);
+
+  /* send all data to this function  */
+  curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data);
+
+  /* open the file */
+  pagefile = fopen(pagefilename, "wb");
+  if(pagefile) {
+
+    /* write the page body to this file handle */
+    curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, pagefile);
+
+    /* get it! */
+    curl_easy_perform(curl_handle);
+
+    /* close the header file */
+    fclose(pagefile);
+  }
+
+  /* cleanup curl stuff */
+  curl_easy_cleanup(curl_handle);
+
+  curl_global_cleanup();
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/urlapi.c b/components/cronet/third_party/curl_headers/docs/examples/urlapi.c
new file mode 100644
index 0000000..594f942
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/urlapi.c
@@ -0,0 +1,72 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Set working URL with CURLU *.
+ * </DESC>
+ */
+#include <stdio.h>
+#include <curl/curl.h>
+
+#if !CURL_AT_LEAST_VERSION(7, 62, 0)
+#error "this example requires curl 7.62.0 or later"
+#endif
+
+int main(void)
+{
+  CURL *curl;
+  CURLcode res;
+
+  CURLU *urlp;
+  CURLUcode uc;
+
+  /* get a curl handle */
+  curl = curl_easy_init();
+
+  /* init Curl URL */
+  urlp = curl_url();
+  uc = curl_url_set(urlp, CURLUPART_URL,
+                    "http://example.com/path/index.html", 0);
+
+  if(uc) {
+    fprintf(stderr, "curl_url_set() failed: %in", uc);
+    goto cleanup;
+  }
+
+  if(curl) {
+    /* set urlp to use as working URL */
+    curl_easy_setopt(curl, CURLOPT_CURLU, urlp);
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+    res = curl_easy_perform(curl);
+    /* Check for errors */
+    if(res != CURLE_OK)
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+
+    goto cleanup;
+  }
+
+  cleanup:
+  curl_url_cleanup(urlp);
+  curl_easy_cleanup(curl);
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/usercertinmem.c b/components/cronet/third_party/curl_headers/docs/examples/usercertinmem.c
new file mode 100644
index 0000000..2dc26431
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/usercertinmem.c
@@ -0,0 +1,226 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2013 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Use an in-memory user certificate and RSA key and retrieve an https page.
+ * </DESC>
+ */
+/* Written by Ishan SinghLevett, based on Theo Borm's cacertinmem.c.
+ * Note that to maintain simplicity this example does not use a CA certificate
+ * for peer verification.  However, some form of peer verification
+ * must be used in real circumstances when a secure connection is required.
+ */
+
+#include <openssl/ssl.h>
+#include <openssl/x509.h>
+#include <openssl/pem.h>
+#include <curl/curl.h>
+#include <stdio.h>
+
+static size_t writefunction(void *ptr, size_t size, size_t nmemb, void *stream)
+{
+  fwrite(ptr, size, nmemb, stream);
+  return (nmemb*size);
+}
+
+static CURLcode sslctx_function(CURL *curl, void *sslctx, void *parm)
+{
+  X509 *cert = NULL;
+  BIO *bio = NULL;
+  BIO *kbio = NULL;
+  RSA *rsa = NULL;
+  int ret;
+
+  const char *mypem = /* www.cacert.org */
+    "-----BEGIN CERTIFICATE-----\n"\
+    "MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290\n"\
+    "IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB\n"\
+    "IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA\n"\
+    "Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO\n"\
+    "BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi\n"\
+    "MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ\n"\
+    "ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC\n"\
+    "CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ\n"\
+    "8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6\n"\
+    "zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y\n"\
+    "fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7\n"\
+    "w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc\n"\
+    "G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k\n"\
+    "epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q\n"\
+    "laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ\n"\
+    "QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU\n"\
+    "fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826\n"\
+    "YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w\n"\
+    "ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY\n"\
+    "gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe\n"\
+    "MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0\n"\
+    "IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy\n"\
+    "dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw\n"\
+    "czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0\n"\
+    "dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl\n"\
+    "aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC\n"\
+    "AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg\n"\
+    "b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB\n"\
+    "ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc\n"\
+    "nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg\n"\
+    "18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c\n"\
+    "gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl\n"\
+    "Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY\n"\
+    "sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T\n"\
+    "SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF\n"\
+    "CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum\n"\
+    "GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk\n"\
+    "zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW\n"\
+    "omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD\n"\
+    "-----END CERTIFICATE-----\n";
+
+/*replace the XXX with the actual RSA key*/
+  const char *mykey =
+    "-----BEGIN RSA PRIVATE KEY-----\n"\
+    "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
+    "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
+    "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
+    "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
+    "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
+    "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
+    "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
+    "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
+    "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
+    "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
+    "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
+    "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
+    "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
+    "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
+    "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
+    "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"\
+    "-----END RSA PRIVATE KEY-----\n";
+
+  (void)curl; /* avoid warnings */
+  (void)parm; /* avoid warnings */
+
+  /* get a BIO */
+  bio = BIO_new_mem_buf((char *)mypem, -1);
+
+  if(bio == NULL) {
+    printf("BIO_new_mem_buf failed\n");
+  }
+
+  /* use it to read the PEM formatted certificate from memory into an X509
+   * structure that SSL can use
+   */
+  cert = PEM_read_bio_X509(bio, NULL, 0, NULL);
+  if(cert == NULL) {
+    printf("PEM_read_bio_X509 failed...\n");
+  }
+
+  /*tell SSL to use the X509 certificate*/
+  ret = SSL_CTX_use_certificate((SSL_CTX*)sslctx, cert);
+  if(ret != 1) {
+    printf("Use certificate failed\n");
+  }
+
+  /*create a bio for the RSA key*/
+  kbio = BIO_new_mem_buf((char *)mykey, -1);
+  if(kbio == NULL) {
+    printf("BIO_new_mem_buf failed\n");
+  }
+
+  /*read the key bio into an RSA object*/
+  rsa = PEM_read_bio_RSAPrivateKey(kbio, NULL, 0, NULL);
+  if(rsa == NULL) {
+    printf("Failed to create key bio\n");
+  }
+
+  /*tell SSL to use the RSA key from memory*/
+  ret = SSL_CTX_use_RSAPrivateKey((SSL_CTX*)sslctx, rsa);
+  if(ret != 1) {
+    printf("Use Key failed\n");
+  }
+
+  /* free resources that have been allocated by openssl functions */
+  if(bio)
+    BIO_free(bio);
+
+  if(kbio)
+    BIO_free(kbio);
+
+  if(rsa)
+    RSA_free(rsa);
+
+  if(cert)
+    X509_free(cert);
+
+  /* all set to go */
+  return CURLE_OK;
+}
+
+int main(void)
+{
+  CURL *ch;
+  CURLcode rv;
+
+  curl_global_init(CURL_GLOBAL_ALL);
+  ch = curl_easy_init();
+  curl_easy_setopt(ch, CURLOPT_VERBOSE, 0L);
+  curl_easy_setopt(ch, CURLOPT_HEADER, 0L);
+  curl_easy_setopt(ch, CURLOPT_NOPROGRESS, 1L);
+  curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1L);
+  curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, writefunction);
+  curl_easy_setopt(ch, CURLOPT_WRITEDATA, stdout);
+  curl_easy_setopt(ch, CURLOPT_HEADERFUNCTION, writefunction);
+  curl_easy_setopt(ch, CURLOPT_HEADERDATA, stderr);
+  curl_easy_setopt(ch, CURLOPT_SSLCERTTYPE, "PEM");
+
+  /* both VERIFYPEER and VERIFYHOST are set to 0 in this case because there is
+     no CA certificate*/
+
+  curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 0L);
+  curl_easy_setopt(ch, CURLOPT_SSL_VERIFYHOST, 0L);
+  curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
+  curl_easy_setopt(ch, CURLOPT_SSLKEYTYPE, "PEM");
+
+  /* first try: retrieve page without user certificate and key -> will fail
+   */
+  rv = curl_easy_perform(ch);
+  if(rv == CURLE_OK) {
+    printf("*** transfer succeeded ***\n");
+  }
+  else {
+    printf("*** transfer failed ***\n");
+  }
+
+  /* second try: retrieve page using user certificate and key -> will succeed
+   * load the certificate and key by installing a function doing the necessary
+   * "modifications" to the SSL CONTEXT just before link init
+   */
+  curl_easy_setopt(ch, CURLOPT_SSL_CTX_FUNCTION, *sslctx_function);
+  rv = curl_easy_perform(ch);
+  if(rv == CURLE_OK) {
+    printf("*** transfer succeeded ***\n");
+  }
+  else {
+    printf("*** transfer failed ***\n");
+  }
+
+  curl_easy_cleanup(ch);
+  curl_global_cleanup();
+  return rv;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/version-check.pl b/components/cronet/third_party/curl_headers/docs/examples/version-check.pl
new file mode 100755
index 0000000..8f734fc
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/version-check.pl
@@ -0,0 +1,103 @@
+#!/usr/bin/env perl
+#***************************************************************************
+#                                  _   _ ____  _
+#  Project                     ___| | | |  _ \| |
+#                             / __| | | | |_) | |
+#                            | (__| |_| |  _ <| |___
+#                             \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+
+# This script accepts a source file as input on the command line.
+#
+# It first loads the 'symbols-in-versions' document and stores a lookup
+# table for all known symbols for which version they were introduced.
+#
+# It then scans the given source file to dig up all symbols starting with CURL.
+# Finally, it sorts the internal list of found symbols (using the version
+# number as sort key) and then it outputs the most recent version number and
+# the symbols from that version that are used.
+#
+# Usage:
+#
+#    version-check.pl [source file]
+#
+
+open(S, "<../libcurl/symbols-in-versions") || die;
+
+my %doc;
+my %rem;
+while(<S>) {
+    if(/(^CURL[^ \n]*) *(.*)/) {
+        my ($sym, $rest)=($1, $2);
+        my @a=split(/ +/, $rest);
+
+        $doc{$sym}=$a[0]; # when it was introduced
+
+        if($a[2]) {
+            # this symbol is documented to have been present the last time
+            # in this release
+            $rem{$sym}=$a[2];
+        }
+    }
+
+}
+
+close(S);
+
+sub age {
+    my ($ver)=@_;
+
+    my @s=split(/\./, $ver);
+    return $s[0]*10000+$s[1]*100+$s[2];
+}
+
+my %used;
+open(C, "<$ARGV[0]") || die;
+
+while(<C>) {
+    if(/\W(CURL[_A-Z0-9v]+)\W/) {
+        #print "$1\n";
+        $used{$1}++;
+    }
+}
+
+close(C);
+
+sub sortversions {
+    my $r = age($doc{$a}) <=> age($doc{$b});
+    if(!$r) {
+        $r = $a cmp $b;
+    }
+    return $r;
+}
+
+my @recent = reverse sort sortversions keys %used;
+
+# the most recent symbol
+my $newsym = $recent[0];
+# the most recent version
+my $newver = $doc{$newsym};
+
+print "The scanned source uses these symbols introduced in $newver:\n";
+
+for my $w (@recent) {
+    if($doc{$w} eq $newver) {
+        printf "  $w\n";
+        next;
+    }
+    last;
+}
diff --git a/components/cronet/third_party/curl_headers/docs/examples/xmlstream.c b/components/cronet/third_party/curl_headers/docs/examples/xmlstream.c
new file mode 100644
index 0000000..8036e48
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/docs/examples/xmlstream.c
@@ -0,0 +1,166 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/* <DESC>
+ * Stream-parse a document using the streaming Expat parser.
+ * </DESC>
+ */
+/* Written by David Strauss
+ *
+ * Expat => https://libexpat.github.io/
+ *
+ * gcc -Wall -I/usr/local/include xmlstream.c -lcurl -lexpat -o xmlstream
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include <expat.h>
+#include <curl/curl.h>
+
+struct MemoryStruct {
+  char *memory;
+  size_t size;
+};
+
+struct ParserStruct {
+  int ok;
+  size_t tags;
+  size_t depth;
+  struct MemoryStruct characters;
+};
+
+static void startElement(void *userData, const XML_Char *name,
+                         const XML_Char **atts)
+{
+  struct ParserStruct *state = (struct ParserStruct *) userData;
+  state->tags++;
+  state->depth++;
+
+  /* Get a clean slate for reading in character data. */
+  free(state->characters.memory);
+  state->characters.memory = NULL;
+  state->characters.size = 0;
+}
+
+static void characterDataHandler(void *userData, const XML_Char *s, int len)
+{
+  struct ParserStruct *state = (struct ParserStruct *) userData;
+  struct MemoryStruct *mem = &state->characters;
+
+  char *ptr = realloc(mem->memory, mem->size + len + 1);
+  if(!ptr) {
+    /* Out of memory. */
+    fprintf(stderr, "Not enough memory (realloc returned NULL).\n");
+    state->ok = 0;
+    return;
+  }
+
+  mem->memory = ptr;
+  memcpy(&(mem->memory[mem->size]), s, len);
+  mem->size += len;
+  mem->memory[mem->size] = 0;
+}
+
+static void endElement(void *userData, const XML_Char *name)
+{
+  struct ParserStruct *state = (struct ParserStruct *) userData;
+  state->depth--;
+
+  printf("%5lu   %10lu   %s\n", state->depth, state->characters.size, name);
+}
+
+static size_t parseStreamCallback(void *contents, size_t length, size_t nmemb,
+                                  void *userp)
+{
+  XML_Parser parser = (XML_Parser) userp;
+  size_t real_size = length * nmemb;
+  struct ParserStruct *state = (struct ParserStruct *) XML_GetUserData(parser);
+
+  /* Only parse if we're not already in a failure state. */
+  if(state->ok && XML_Parse(parser, contents, real_size, 0) == 0) {
+    int error_code = XML_GetErrorCode(parser);
+    fprintf(stderr, "Parsing response buffer of length %lu failed"
+            " with error code %d (%s).\n",
+            real_size, error_code, XML_ErrorString(error_code));
+    state->ok = 0;
+  }
+
+  return real_size;
+}
+
+int main(void)
+{
+  CURL *curl_handle;
+  CURLcode res;
+  XML_Parser parser;
+  struct ParserStruct state;
+
+  /* Initialize the state structure for parsing. */
+  memset(&state, 0, sizeof(struct ParserStruct));
+  state.ok = 1;
+
+  /* Initialize a namespace-aware parser. */
+  parser = XML_ParserCreateNS(NULL, '\0');
+  XML_SetUserData(parser, &state);
+  XML_SetElementHandler(parser, startElement, endElement);
+  XML_SetCharacterDataHandler(parser, characterDataHandler);
+
+  /* Initialize a libcurl handle. */
+  curl_global_init(CURL_GLOBAL_DEFAULT);
+  curl_handle = curl_easy_init();
+  curl_easy_setopt(curl_handle, CURLOPT_URL,
+                   "https://www.w3schools.com/xml/simple.xml");
+  curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, parseStreamCallback);
+  curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)parser);
+
+  printf("Depth   Characters   Closing Tag\n");
+
+  /* Perform the request and any follow-up parsing. */
+  res = curl_easy_perform(curl_handle);
+  if(res != CURLE_OK) {
+    fprintf(stderr, "curl_easy_perform() failed: %s\n",
+            curl_easy_strerror(res));
+  }
+  else if(state.ok) {
+    /* Expat requires one final call to finalize parsing. */
+    if(XML_Parse(parser, NULL, 0, 1) == 0) {
+      int error_code = XML_GetErrorCode(parser);
+      fprintf(stderr, "Finalizing parsing failed with error code %d (%s).\n",
+              error_code, XML_ErrorString(error_code));
+    }
+    else {
+      printf("                     --------------\n");
+      printf("                     %lu tags total\n", state.tags);
+    }
+  }
+
+  /* Clean up. */
+  free(state.characters.memory);
+  XML_ParserFree(parser);
+  curl_easy_cleanup(curl_handle);
+  curl_global_cleanup();
+
+  return 0;
+}
diff --git a/components/cronet/third_party/curl_headers/include/Makefile.am b/components/cronet/third_party/curl_headers/include/Makefile.am
new file mode 100644
index 0000000..3b24860
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/include/Makefile.am
@@ -0,0 +1,5 @@
+SUBDIRS = curl
+
+EXTRA_DIST = README
+
+AUTOMAKE_OPTIONS = foreign no-dependencies
diff --git a/components/cronet/third_party/curl_headers/include/README b/components/cronet/third_party/curl_headers/include/README
new file mode 100644
index 0000000..091ef76
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/include/README
@@ -0,0 +1,18 @@
+                                  _   _ ____  _
+                              ___| | | |  _ \| |
+                             / __| | | | |_) | |
+                            | (__| |_| |  _ <| |___
+                             \___|\___/|_| \_\_____|
+
+Include files for libcurl, external users.
+
+They're all placed in the curl subdirectory here for better fit in any kind
+of environment. You must include files from here using...
+
+        #include <curl/curl.h>
+
+... style and point the compiler's include path to the directory holding the
+curl subdirectory. It makes it more likely to survive future modifications.
+
+The public curl include files can be shared freely between different platforms
+and different architectures.
diff --git a/components/cronet/third_party/curl_headers/include/curl/.gitignore b/components/cronet/third_party/curl_headers/include/curl/.gitignore
new file mode 100644
index 0000000..555795fa
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/include/curl/.gitignore
@@ -0,0 +1,3 @@
+curlver.h.dist
+stamp-h2
+stamp-h3
diff --git a/components/cronet/third_party/curl_headers/include/curl/Makefile.am b/components/cronet/third_party/curl_headers/include/curl/Makefile.am
new file mode 100644
index 0000000..a31f61b1
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/include/curl/Makefile.am
@@ -0,0 +1,39 @@
+#***************************************************************************
+#                                  _   _ ____  _
+#  Project                     ___| | | |  _ \| |
+#                             / __| | | | |_) | |
+#                            | (__| |_| |  _ <| |___
+#                             \___|\___/|_| \_\_____|
+#
+# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.haxx.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+###########################################################################
+pkginclude_HEADERS = \
+  curl.h curlver.h easy.h mprintf.h stdcheaders.h multi.h \
+  typecheck-gcc.h system.h urlapi.h
+
+pkgincludedir= $(includedir)/curl
+
+CHECKSRC = $(CS_$(V))
+CS_0 = @echo "  RUN     " $@;
+CS_1 =
+CS_ = $(CS_0)
+
+checksrc:
+	$(CHECKSRC)@PERL@ $(top_srcdir)/lib/checksrc.pl -D$(top_srcdir)/include/curl $(pkginclude_HEADERS)
+
+if CURLDEBUG
+# for debug builds, we scan the sources on all regular make invokes
+all-local: checksrc
+endif
diff --git a/components/cronet/third_party/curl_headers/include/curl/curl.h b/components/cronet/third_party/curl_headers/include/curl/curl.h
new file mode 100644
index 0000000..e7f812da
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/include/curl/curl.h
@@ -0,0 +1,2870 @@
+#ifndef __CURL_CURL_H
+#define __CURL_CURL_H
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/*
+ * If you have libcurl problems, all docs and details are found here:
+ *   https://curl.haxx.se/libcurl/
+ *
+ * curl-library mailing list subscription and unsubscription web interface:
+ *   https://cool.haxx.se/mailman/listinfo/curl-library/
+ */
+
+#ifdef CURL_NO_OLDIES
+#define CURL_STRICTER
+#endif
+
+#include "curlver.h"         /* libcurl version defines   */
+#include "system.h"          /* determine things run-time */
+
+/*
+ * Define WIN32 when build target is Win32 API
+ */
+
+#if (defined(_WIN32) || defined(__WIN32__)) && \
+     !defined(WIN32) && !defined(__SYMBIAN32__)
+#define WIN32
+#endif
+
+#include <stdio.h>
+#include <limits.h>
+
+#if defined(__FreeBSD__) && (__FreeBSD__ >= 2)
+/* Needed for __FreeBSD_version symbol definition */
+#include <osreldate.h>
+#endif
+
+/* The include stuff here below is mainly for time_t! */
+#include <sys/types.h>
+#include <time.h>
+
+#if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__CYGWIN__)
+#if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H) || \
+      defined(__LWIP_OPT_H__) || defined(LWIP_HDR_OPT_H))
+/* The check above prevents the winsock2 inclusion if winsock.h already was
+   included, since they can't co-exist without problems */
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#endif
+#endif
+
+/* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish
+   libc5-based Linux systems. Only include it on systems that are known to
+   require it! */
+#if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \
+    defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \
+    defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) || \
+    defined(__CYGWIN__) || \
+   (defined(__FreeBSD_version) && (__FreeBSD_version < 800000))
+#include <sys/select.h>
+#endif
+
+#if !defined(WIN32) && !defined(_WIN32_WCE)
+#include <sys/socket.h>
+#endif
+
+#if !defined(WIN32) && !defined(__WATCOMC__) && !defined(__VXWORKS__)
+#include <sys/time.h>
+#endif
+
+#ifdef __BEOS__
+#include <support/SupportDefs.h>
+#endif
+
+/* Compatibility for non-Clang compilers */
+#ifndef __has_declspec_attribute
+#  define __has_declspec_attribute(x) 0
+#endif
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+#if defined(BUILDING_LIBCURL) || defined(CURL_STRICTER)
+typedef struct Curl_easy CURL;
+typedef struct Curl_share CURLSH;
+#else
+typedef void CURL;
+typedef void CURLSH;
+#endif
+
+/*
+ * libcurl external API function linkage decorations.
+ */
+
+#ifdef CURL_STATICLIB
+#  define CURL_EXTERN
+#elif defined(WIN32) || defined(__SYMBIAN32__) || \
+     (__has_declspec_attribute(dllexport) && \
+      __has_declspec_attribute(dllimport))
+#  if defined(BUILDING_LIBCURL)
+#    define CURL_EXTERN  __declspec(dllexport)
+#  else
+#    define CURL_EXTERN  __declspec(dllimport)
+#  endif
+#elif defined(BUILDING_LIBCURL) && defined(CURL_HIDDEN_SYMBOLS)
+#  define CURL_EXTERN CURL_EXTERN_SYMBOL
+#else
+#  define CURL_EXTERN
+#endif
+
+#ifndef curl_socket_typedef
+/* socket typedef */
+#if defined(WIN32) && !defined(__LWIP_OPT_H__) && !defined(LWIP_HDR_OPT_H)
+typedef SOCKET curl_socket_t;
+#define CURL_SOCKET_BAD INVALID_SOCKET
+#else
+typedef int curl_socket_t;
+#define CURL_SOCKET_BAD -1
+#endif
+#define curl_socket_typedef
+#endif /* curl_socket_typedef */
+
+/* enum for the different supported SSL backends */
+typedef enum {
+  CURLSSLBACKEND_NONE = 0,
+  CURLSSLBACKEND_OPENSSL = 1,
+  CURLSSLBACKEND_GNUTLS = 2,
+  CURLSSLBACKEND_NSS = 3,
+  CURLSSLBACKEND_OBSOLETE4 = 4,  /* Was QSOSSL. */
+  CURLSSLBACKEND_GSKIT = 5,
+  CURLSSLBACKEND_POLARSSL = 6,
+  CURLSSLBACKEND_WOLFSSL = 7,
+  CURLSSLBACKEND_SCHANNEL = 8,
+  CURLSSLBACKEND_SECURETRANSPORT = 9,
+  CURLSSLBACKEND_AXTLS = 10, /* never used since 7.63.0 */
+  CURLSSLBACKEND_MBEDTLS = 11,
+  CURLSSLBACKEND_MESALINK = 12
+} curl_sslbackend;
+
+/* aliases for library clones and renames */
+#define CURLSSLBACKEND_LIBRESSL CURLSSLBACKEND_OPENSSL
+#define CURLSSLBACKEND_BORINGSSL CURLSSLBACKEND_OPENSSL
+
+/* deprecated names: */
+#define CURLSSLBACKEND_CYASSL CURLSSLBACKEND_WOLFSSL
+#define CURLSSLBACKEND_DARWINSSL CURLSSLBACKEND_SECURETRANSPORT
+
+struct curl_httppost {
+  struct curl_httppost *next;       /* next entry in the list */
+  char *name;                       /* pointer to allocated name */
+  long namelength;                  /* length of name length */
+  char *contents;                   /* pointer to allocated data contents */
+  long contentslength;              /* length of contents field, see also
+                                       CURL_HTTPPOST_LARGE */
+  char *buffer;                     /* pointer to allocated buffer contents */
+  long bufferlength;                /* length of buffer field */
+  char *contenttype;                /* Content-Type */
+  struct curl_slist *contentheader; /* list of extra headers for this form */
+  struct curl_httppost *more;       /* if one field name has more than one
+                                       file, this link should link to following
+                                       files */
+  long flags;                       /* as defined below */
+
+/* specified content is a file name */
+#define CURL_HTTPPOST_FILENAME (1<<0)
+/* specified content is a file name */
+#define CURL_HTTPPOST_READFILE (1<<1)
+/* name is only stored pointer do not free in formfree */
+#define CURL_HTTPPOST_PTRNAME (1<<2)
+/* contents is only stored pointer do not free in formfree */
+#define CURL_HTTPPOST_PTRCONTENTS (1<<3)
+/* upload file from buffer */
+#define CURL_HTTPPOST_BUFFER (1<<4)
+/* upload file from pointer contents */
+#define CURL_HTTPPOST_PTRBUFFER (1<<5)
+/* upload file contents by using the regular read callback to get the data and
+   pass the given pointer as custom pointer */
+#define CURL_HTTPPOST_CALLBACK (1<<6)
+/* use size in 'contentlen', added in 7.46.0 */
+#define CURL_HTTPPOST_LARGE (1<<7)
+
+  char *showfilename;               /* The file name to show. If not set, the
+                                       actual file name will be used (if this
+                                       is a file part) */
+  void *userp;                      /* custom pointer used for
+                                       HTTPPOST_CALLBACK posts */
+  curl_off_t contentlen;            /* alternative length of contents
+                                       field. Used if CURL_HTTPPOST_LARGE is
+                                       set. Added in 7.46.0 */
+};
+
+/* This is the CURLOPT_PROGRESSFUNCTION callback prototype. It is now
+   considered deprecated but was the only choice up until 7.31.0 */
+typedef int (*curl_progress_callback)(void *clientp,
+                                      double dltotal,
+                                      double dlnow,
+                                      double ultotal,
+                                      double ulnow);
+
+/* This is the CURLOPT_XFERINFOFUNCTION callback prototype. It was introduced
+   in 7.32.0, avoids the use of floating point numbers and provides more
+   detailed information. */
+typedef int (*curl_xferinfo_callback)(void *clientp,
+                                      curl_off_t dltotal,
+                                      curl_off_t dlnow,
+                                      curl_off_t ultotal,
+                                      curl_off_t ulnow);
+
+#ifndef CURL_MAX_READ_SIZE
+  /* The maximum receive buffer size configurable via CURLOPT_BUFFERSIZE. */
+#define CURL_MAX_READ_SIZE 524288
+#endif
+
+#ifndef CURL_MAX_WRITE_SIZE
+  /* Tests have proven that 20K is a very bad buffer size for uploads on
+     Windows, while 16K for some odd reason performed a lot better.
+     We do the ifndef check to allow this value to easier be changed at build
+     time for those who feel adventurous. The practical minimum is about
+     400 bytes since libcurl uses a buffer of this size as a scratch area
+     (unrelated to network send operations). */
+#define CURL_MAX_WRITE_SIZE 16384
+#endif
+
+#ifndef CURL_MAX_HTTP_HEADER
+/* The only reason to have a max limit for this is to avoid the risk of a bad
+   server feeding libcurl with a never-ending header that will cause reallocs
+   infinitely */
+#define CURL_MAX_HTTP_HEADER (100*1024)
+#endif
+
+/* This is a magic return code for the write callback that, when returned,
+   will signal libcurl to pause receiving on the current transfer. */
+#define CURL_WRITEFUNC_PAUSE 0x10000001
+
+typedef size_t (*curl_write_callback)(char *buffer,
+                                      size_t size,
+                                      size_t nitems,
+                                      void *outstream);
+
+/* This callback will be called when a new resolver request is made */
+typedef int (*curl_resolver_start_callback)(void *resolver_state,
+                                            void *reserved, void *userdata);
+
+/* enumeration of file types */
+typedef enum {
+  CURLFILETYPE_FILE = 0,
+  CURLFILETYPE_DIRECTORY,
+  CURLFILETYPE_SYMLINK,
+  CURLFILETYPE_DEVICE_BLOCK,
+  CURLFILETYPE_DEVICE_CHAR,
+  CURLFILETYPE_NAMEDPIPE,
+  CURLFILETYPE_SOCKET,
+  CURLFILETYPE_DOOR, /* is possible only on Sun Solaris now */
+
+  CURLFILETYPE_UNKNOWN /* should never occur */
+} curlfiletype;
+
+#define CURLFINFOFLAG_KNOWN_FILENAME    (1<<0)
+#define CURLFINFOFLAG_KNOWN_FILETYPE    (1<<1)
+#define CURLFINFOFLAG_KNOWN_TIME        (1<<2)
+#define CURLFINFOFLAG_KNOWN_PERM        (1<<3)
+#define CURLFINFOFLAG_KNOWN_UID         (1<<4)
+#define CURLFINFOFLAG_KNOWN_GID         (1<<5)
+#define CURLFINFOFLAG_KNOWN_SIZE        (1<<6)
+#define CURLFINFOFLAG_KNOWN_HLINKCOUNT  (1<<7)
+
+/* Content of this structure depends on information which is known and is
+   achievable (e.g. by FTP LIST parsing). Please see the url_easy_setopt(3) man
+   page for callbacks returning this structure -- some fields are mandatory,
+   some others are optional. The FLAG field has special meaning. */
+struct curl_fileinfo {
+  char *filename;
+  curlfiletype filetype;
+  time_t time; /* always zero! */
+  unsigned int perm;
+  int uid;
+  int gid;
+  curl_off_t size;
+  long int hardlinks;
+
+  struct {
+    /* If some of these fields is not NULL, it is a pointer to b_data. */
+    char *time;
+    char *perm;
+    char *user;
+    char *group;
+    char *target; /* pointer to the target filename of a symlink */
+  } strings;
+
+  unsigned int flags;
+
+  /* used internally */
+  char *b_data;
+  size_t b_size;
+  size_t b_used;
+};
+
+/* return codes for CURLOPT_CHUNK_BGN_FUNCTION */
+#define CURL_CHUNK_BGN_FUNC_OK      0
+#define CURL_CHUNK_BGN_FUNC_FAIL    1 /* tell the lib to end the task */
+#define CURL_CHUNK_BGN_FUNC_SKIP    2 /* skip this chunk over */
+
+/* if splitting of data transfer is enabled, this callback is called before
+   download of an individual chunk started. Note that parameter "remains" works
+   only for FTP wildcard downloading (for now), otherwise is not used */
+typedef long (*curl_chunk_bgn_callback)(const void *transfer_info,
+                                        void *ptr,
+                                        int remains);
+
+/* return codes for CURLOPT_CHUNK_END_FUNCTION */
+#define CURL_CHUNK_END_FUNC_OK      0
+#define CURL_CHUNK_END_FUNC_FAIL    1 /* tell the lib to end the task */
+
+/* If splitting of data transfer is enabled this callback is called after
+   download of an individual chunk finished.
+   Note! After this callback was set then it have to be called FOR ALL chunks.
+   Even if downloading of this chunk was skipped in CHUNK_BGN_FUNC.
+   This is the reason why we don't need "transfer_info" parameter in this
+   callback and we are not interested in "remains" parameter too. */
+typedef long (*curl_chunk_end_callback)(void *ptr);
+
+/* return codes for FNMATCHFUNCTION */
+#define CURL_FNMATCHFUNC_MATCH    0 /* string corresponds to the pattern */
+#define CURL_FNMATCHFUNC_NOMATCH  1 /* pattern doesn't match the string */
+#define CURL_FNMATCHFUNC_FAIL     2 /* an error occurred */
+
+/* callback type for wildcard downloading pattern matching. If the
+   string matches the pattern, return CURL_FNMATCHFUNC_MATCH value, etc. */
+typedef int (*curl_fnmatch_callback)(void *ptr,
+                                     const char *pattern,
+                                     const char *string);
+
+/* These are the return codes for the seek callbacks */
+#define CURL_SEEKFUNC_OK       0
+#define CURL_SEEKFUNC_FAIL     1 /* fail the entire transfer */
+#define CURL_SEEKFUNC_CANTSEEK 2 /* tell libcurl seeking can't be done, so
+                                    libcurl might try other means instead */
+typedef int (*curl_seek_callback)(void *instream,
+                                  curl_off_t offset,
+                                  int origin); /* 'whence' */
+
+/* This is a return code for the read callback that, when returned, will
+   signal libcurl to immediately abort the current transfer. */
+#define CURL_READFUNC_ABORT 0x10000000
+/* This is a return code for the read callback that, when returned, will
+   signal libcurl to pause sending data on the current transfer. */
+#define CURL_READFUNC_PAUSE 0x10000001
+
+/* Return code for when the trailing headers' callback has terminated
+   without any errors*/
+#define CURL_TRAILERFUNC_OK 0
+/* Return code for when was an error in the trailing header's list and we
+  want to abort the request */
+#define CURL_TRAILERFUNC_ABORT 1
+
+typedef size_t (*curl_read_callback)(char *buffer,
+                                      size_t size,
+                                      size_t nitems,
+                                      void *instream);
+
+typedef int (*curl_trailer_callback)(struct curl_slist **list,
+                                      void *userdata);
+
+typedef enum {
+  CURLSOCKTYPE_IPCXN,  /* socket created for a specific IP connection */
+  CURLSOCKTYPE_ACCEPT, /* socket created by accept() call */
+  CURLSOCKTYPE_LAST    /* never use */
+} curlsocktype;
+
+/* The return code from the sockopt_callback can signal information back
+   to libcurl: */
+#define CURL_SOCKOPT_OK 0
+#define CURL_SOCKOPT_ERROR 1 /* causes libcurl to abort and return
+                                CURLE_ABORTED_BY_CALLBACK */
+#define CURL_SOCKOPT_ALREADY_CONNECTED 2
+
+typedef int (*curl_sockopt_callback)(void *clientp,
+                                     curl_socket_t curlfd,
+                                     curlsocktype purpose);
+
+struct curl_sockaddr {
+  int family;
+  int socktype;
+  int protocol;
+  unsigned int addrlen; /* addrlen was a socklen_t type before 7.18.0 but it
+                           turned really ugly and painful on the systems that
+                           lack this type */
+  struct sockaddr addr;
+};
+
+typedef curl_socket_t
+(*curl_opensocket_callback)(void *clientp,
+                            curlsocktype purpose,
+                            struct curl_sockaddr *address);
+
+typedef int
+(*curl_closesocket_callback)(void *clientp, curl_socket_t item);
+
+typedef enum {
+  CURLIOE_OK,            /* I/O operation successful */
+  CURLIOE_UNKNOWNCMD,    /* command was unknown to callback */
+  CURLIOE_FAILRESTART,   /* failed to restart the read */
+  CURLIOE_LAST           /* never use */
+} curlioerr;
+
+typedef enum {
+  CURLIOCMD_NOP,         /* no operation */
+  CURLIOCMD_RESTARTREAD, /* restart the read stream from start */
+  CURLIOCMD_LAST         /* never use */
+} curliocmd;
+
+typedef curlioerr (*curl_ioctl_callback)(CURL *handle,
+                                         int cmd,
+                                         void *clientp);
+
+#ifndef CURL_DID_MEMORY_FUNC_TYPEDEFS
+/*
+ * The following typedef's are signatures of malloc, free, realloc, strdup and
+ * calloc respectively.  Function pointers of these types can be passed to the
+ * curl_global_init_mem() function to set user defined memory management
+ * callback routines.
+ */
+typedef void *(*curl_malloc_callback)(size_t size);
+typedef void (*curl_free_callback)(void *ptr);
+typedef void *(*curl_realloc_callback)(void *ptr, size_t size);
+typedef char *(*curl_strdup_callback)(const char *str);
+typedef void *(*curl_calloc_callback)(size_t nmemb, size_t size);
+
+#define CURL_DID_MEMORY_FUNC_TYPEDEFS
+#endif
+
+/* the kind of data that is passed to information_callback*/
+typedef enum {
+  CURLINFO_TEXT = 0,
+  CURLINFO_HEADER_IN,    /* 1 */
+  CURLINFO_HEADER_OUT,   /* 2 */
+  CURLINFO_DATA_IN,      /* 3 */
+  CURLINFO_DATA_OUT,     /* 4 */
+  CURLINFO_SSL_DATA_IN,  /* 5 */
+  CURLINFO_SSL_DATA_OUT, /* 6 */
+  CURLINFO_END
+} curl_infotype;
+
+typedef int (*curl_debug_callback)
+       (CURL *handle,      /* the handle/transfer this concerns */
+        curl_infotype type, /* what kind of data */
+        char *data,        /* points to the data */
+        size_t size,       /* size of the data pointed to */
+        void *userptr);    /* whatever the user please */
+
+/* All possible error codes from all sorts of curl functions. Future versions
+   may return other values, stay prepared.
+
+   Always add new return codes last. Never *EVER* remove any. The return
+   codes must remain the same!
+ */
+
+typedef enum {
+  CURLE_OK = 0,
+  CURLE_UNSUPPORTED_PROTOCOL,    /* 1 */
+  CURLE_FAILED_INIT,             /* 2 */
+  CURLE_URL_MALFORMAT,           /* 3 */
+  CURLE_NOT_BUILT_IN,            /* 4 - [was obsoleted in August 2007 for
+                                    7.17.0, reused in April 2011 for 7.21.5] */
+  CURLE_COULDNT_RESOLVE_PROXY,   /* 5 */
+  CURLE_COULDNT_RESOLVE_HOST,    /* 6 */
+  CURLE_COULDNT_CONNECT,         /* 7 */
+  CURLE_WEIRD_SERVER_REPLY,      /* 8 */
+  CURLE_REMOTE_ACCESS_DENIED,    /* 9 a service was denied by the server
+                                    due to lack of access - when login fails
+                                    this is not returned. */
+  CURLE_FTP_ACCEPT_FAILED,       /* 10 - [was obsoleted in April 2006 for
+                                    7.15.4, reused in Dec 2011 for 7.24.0]*/
+  CURLE_FTP_WEIRD_PASS_REPLY,    /* 11 */
+  CURLE_FTP_ACCEPT_TIMEOUT,      /* 12 - timeout occurred accepting server
+                                    [was obsoleted in August 2007 for 7.17.0,
+                                    reused in Dec 2011 for 7.24.0]*/
+  CURLE_FTP_WEIRD_PASV_REPLY,    /* 13 */
+  CURLE_FTP_WEIRD_227_FORMAT,    /* 14 */
+  CURLE_FTP_CANT_GET_HOST,       /* 15 */
+  CURLE_HTTP2,                   /* 16 - A problem in the http2 framing layer.
+                                    [was obsoleted in August 2007 for 7.17.0,
+                                    reused in July 2014 for 7.38.0] */
+  CURLE_FTP_COULDNT_SET_TYPE,    /* 17 */
+  CURLE_PARTIAL_FILE,            /* 18 */
+  CURLE_FTP_COULDNT_RETR_FILE,   /* 19 */
+  CURLE_OBSOLETE20,              /* 20 - NOT USED */
+  CURLE_QUOTE_ERROR,             /* 21 - quote command failure */
+  CURLE_HTTP_RETURNED_ERROR,     /* 22 */
+  CURLE_WRITE_ERROR,             /* 23 */
+  CURLE_OBSOLETE24,              /* 24 - NOT USED */
+  CURLE_UPLOAD_FAILED,           /* 25 - failed upload "command" */
+  CURLE_READ_ERROR,              /* 26 - couldn't open/read from file */
+  CURLE_OUT_OF_MEMORY,           /* 27 */
+  /* Note: CURLE_OUT_OF_MEMORY may sometimes indicate a conversion error
+           instead of a memory allocation error if CURL_DOES_CONVERSIONS
+           is defined
+  */
+  CURLE_OPERATION_TIMEDOUT,      /* 28 - the timeout time was reached */
+  CURLE_OBSOLETE29,              /* 29 - NOT USED */
+  CURLE_FTP_PORT_FAILED,         /* 30 - FTP PORT operation failed */
+  CURLE_FTP_COULDNT_USE_REST,    /* 31 - the REST command failed */
+  CURLE_OBSOLETE32,              /* 32 - NOT USED */
+  CURLE_RANGE_ERROR,             /* 33 - RANGE "command" didn't work */
+  CURLE_HTTP_POST_ERROR,         /* 34 */
+  CURLE_SSL_CONNECT_ERROR,       /* 35 - wrong when connecting with SSL */
+  CURLE_BAD_DOWNLOAD_RESUME,     /* 36 - couldn't resume download */
+  CURLE_FILE_COULDNT_READ_FILE,  /* 37 */
+  CURLE_LDAP_CANNOT_BIND,        /* 38 */
+  CURLE_LDAP_SEARCH_FAILED,      /* 39 */
+  CURLE_OBSOLETE40,              /* 40 - NOT USED */
+  CURLE_FUNCTION_NOT_FOUND,      /* 41 - NOT USED starting with 7.53.0 */
+  CURLE_ABORTED_BY_CALLBACK,     /* 42 */
+  CURLE_BAD_FUNCTION_ARGUMENT,   /* 43 */
+  CURLE_OBSOLETE44,              /* 44 - NOT USED */
+  CURLE_INTERFACE_FAILED,        /* 45 - CURLOPT_INTERFACE failed */
+  CURLE_OBSOLETE46,              /* 46 - NOT USED */
+  CURLE_TOO_MANY_REDIRECTS,      /* 47 - catch endless re-direct loops */
+  CURLE_UNKNOWN_OPTION,          /* 48 - User specified an unknown option */
+  CURLE_TELNET_OPTION_SYNTAX,    /* 49 - Malformed telnet option */
+  CURLE_OBSOLETE50,              /* 50 - NOT USED */
+  CURLE_OBSOLETE51,              /* 51 - NOT USED */
+  CURLE_GOT_NOTHING,             /* 52 - when this is a specific error */
+  CURLE_SSL_ENGINE_NOTFOUND,     /* 53 - SSL crypto engine not found */
+  CURLE_SSL_ENGINE_SETFAILED,    /* 54 - can not set SSL crypto engine as
+                                    default */
+  CURLE_SEND_ERROR,              /* 55 - failed sending network data */
+  CURLE_RECV_ERROR,              /* 56 - failure in receiving network data */
+  CURLE_OBSOLETE57,              /* 57 - NOT IN USE */
+  CURLE_SSL_CERTPROBLEM,         /* 58 - problem with the local certificate */
+  CURLE_SSL_CIPHER,              /* 59 - couldn't use specified cipher */
+  CURLE_PEER_FAILED_VERIFICATION, /* 60 - peer's certificate or fingerprint
+                                     wasn't verified fine */
+  CURLE_BAD_CONTENT_ENCODING,    /* 61 - Unrecognized/bad encoding */
+  CURLE_LDAP_INVALID_URL,        /* 62 - Invalid LDAP URL */
+  CURLE_FILESIZE_EXCEEDED,       /* 63 - Maximum file size exceeded */
+  CURLE_USE_SSL_FAILED,          /* 64 - Requested FTP SSL level failed */
+  CURLE_SEND_FAIL_REWIND,        /* 65 - Sending the data requires a rewind
+                                    that failed */
+  CURLE_SSL_ENGINE_INITFAILED,   /* 66 - failed to initialise ENGINE */
+  CURLE_LOGIN_DENIED,            /* 67 - user, password or similar was not
+                                    accepted and we failed to login */
+  CURLE_TFTP_NOTFOUND,           /* 68 - file not found on server */
+  CURLE_TFTP_PERM,               /* 69 - permission problem on server */
+  CURLE_REMOTE_DISK_FULL,        /* 70 - out of disk space on server */
+  CURLE_TFTP_ILLEGAL,            /* 71 - Illegal TFTP operation */
+  CURLE_TFTP_UNKNOWNID,          /* 72 - Unknown transfer ID */
+  CURLE_REMOTE_FILE_EXISTS,      /* 73 - File already exists */
+  CURLE_TFTP_NOSUCHUSER,         /* 74 - No such user */
+  CURLE_CONV_FAILED,             /* 75 - conversion failed */
+  CURLE_CONV_REQD,               /* 76 - caller must register conversion
+                                    callbacks using curl_easy_setopt options
+                                    CURLOPT_CONV_FROM_NETWORK_FUNCTION,
+                                    CURLOPT_CONV_TO_NETWORK_FUNCTION, and
+                                    CURLOPT_CONV_FROM_UTF8_FUNCTION */
+  CURLE_SSL_CACERT_BADFILE,      /* 77 - could not load CACERT file, missing
+                                    or wrong format */
+  CURLE_REMOTE_FILE_NOT_FOUND,   /* 78 - remote file not found */
+  CURLE_SSH,                     /* 79 - error from the SSH layer, somewhat
+                                    generic so the error message will be of
+                                    interest when this has happened */
+
+  CURLE_SSL_SHUTDOWN_FAILED,     /* 80 - Failed to shut down the SSL
+                                    connection */
+  CURLE_AGAIN,                   /* 81 - socket is not ready for send/recv,
+                                    wait till it's ready and try again (Added
+                                    in 7.18.2) */
+  CURLE_SSL_CRL_BADFILE,         /* 82 - could not load CRL file, missing or
+                                    wrong format (Added in 7.19.0) */
+  CURLE_SSL_ISSUER_ERROR,        /* 83 - Issuer check failed.  (Added in
+                                    7.19.0) */
+  CURLE_FTP_PRET_FAILED,         /* 84 - a PRET command failed */
+  CURLE_RTSP_CSEQ_ERROR,         /* 85 - mismatch of RTSP CSeq numbers */
+  CURLE_RTSP_SESSION_ERROR,      /* 86 - mismatch of RTSP Session Ids */
+  CURLE_FTP_BAD_FILE_LIST,       /* 87 - unable to parse FTP file list */
+  CURLE_CHUNK_FAILED,            /* 88 - chunk callback reported error */
+  CURLE_NO_CONNECTION_AVAILABLE, /* 89 - No connection available, the
+                                    session will be queued */
+  CURLE_SSL_PINNEDPUBKEYNOTMATCH, /* 90 - specified pinned public key did not
+                                     match */
+  CURLE_SSL_INVALIDCERTSTATUS,   /* 91 - invalid certificate status */
+  CURLE_HTTP2_STREAM,            /* 92 - stream error in HTTP/2 framing layer
+                                    */
+  CURLE_RECURSIVE_API_CALL,      /* 93 - an api function was called from
+                                    inside a callback */
+  CURL_LAST /* never use! */
+} CURLcode;
+
+#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all
+                          the obsolete stuff removed! */
+
+/* Previously obsolete error code re-used in 7.38.0 */
+#define CURLE_OBSOLETE16 CURLE_HTTP2
+
+/* Previously obsolete error codes re-used in 7.24.0 */
+#define CURLE_OBSOLETE10 CURLE_FTP_ACCEPT_FAILED
+#define CURLE_OBSOLETE12 CURLE_FTP_ACCEPT_TIMEOUT
+
+/*  compatibility with older names */
+#define CURLOPT_ENCODING CURLOPT_ACCEPT_ENCODING
+#define CURLE_FTP_WEIRD_SERVER_REPLY CURLE_WEIRD_SERVER_REPLY
+
+/* The following were added in 7.62.0 */
+#define CURLE_SSL_CACERT CURLE_PEER_FAILED_VERIFICATION
+
+/* The following were added in 7.21.5, April 2011 */
+#define CURLE_UNKNOWN_TELNET_OPTION CURLE_UNKNOWN_OPTION
+
+/* The following were added in 7.17.1 */
+/* These are scheduled to disappear by 2009 */
+#define CURLE_SSL_PEER_CERTIFICATE CURLE_PEER_FAILED_VERIFICATION
+
+/* The following were added in 7.17.0 */
+/* These are scheduled to disappear by 2009 */
+#define CURLE_OBSOLETE CURLE_OBSOLETE50 /* no one should be using this! */
+#define CURLE_BAD_PASSWORD_ENTERED CURLE_OBSOLETE46
+#define CURLE_BAD_CALLING_ORDER CURLE_OBSOLETE44
+#define CURLE_FTP_USER_PASSWORD_INCORRECT CURLE_OBSOLETE10
+#define CURLE_FTP_CANT_RECONNECT CURLE_OBSOLETE16
+#define CURLE_FTP_COULDNT_GET_SIZE CURLE_OBSOLETE32
+#define CURLE_FTP_COULDNT_SET_ASCII CURLE_OBSOLETE29
+#define CURLE_FTP_WEIRD_USER_REPLY CURLE_OBSOLETE12
+#define CURLE_FTP_WRITE_ERROR CURLE_OBSOLETE20
+#define CURLE_LIBRARY_NOT_FOUND CURLE_OBSOLETE40
+#define CURLE_MALFORMAT_USER CURLE_OBSOLETE24
+#define CURLE_SHARE_IN_USE CURLE_OBSOLETE57
+#define CURLE_URL_MALFORMAT_USER CURLE_NOT_BUILT_IN
+
+#define CURLE_FTP_ACCESS_DENIED CURLE_REMOTE_ACCESS_DENIED
+#define CURLE_FTP_COULDNT_SET_BINARY CURLE_FTP_COULDNT_SET_TYPE
+#define CURLE_FTP_QUOTE_ERROR CURLE_QUOTE_ERROR
+#define CURLE_TFTP_DISKFULL CURLE_REMOTE_DISK_FULL
+#define CURLE_TFTP_EXISTS CURLE_REMOTE_FILE_EXISTS
+#define CURLE_HTTP_RANGE_ERROR CURLE_RANGE_ERROR
+#define CURLE_FTP_SSL_FAILED CURLE_USE_SSL_FAILED
+
+/* The following were added earlier */
+
+#define CURLE_OPERATION_TIMEOUTED CURLE_OPERATION_TIMEDOUT
+
+#define CURLE_HTTP_NOT_FOUND CURLE_HTTP_RETURNED_ERROR
+#define CURLE_HTTP_PORT_FAILED CURLE_INTERFACE_FAILED
+#define CURLE_FTP_COULDNT_STOR_FILE CURLE_UPLOAD_FAILED
+
+#define CURLE_FTP_PARTIAL_FILE CURLE_PARTIAL_FILE
+#define CURLE_FTP_BAD_DOWNLOAD_RESUME CURLE_BAD_DOWNLOAD_RESUME
+
+/* This was the error code 50 in 7.7.3 and a few earlier versions, this
+   is no longer used by libcurl but is instead #defined here only to not
+   make programs break */
+#define CURLE_ALREADY_COMPLETE 99999
+
+/* Provide defines for really old option names */
+#define CURLOPT_FILE CURLOPT_WRITEDATA /* name changed in 7.9.7 */
+#define CURLOPT_INFILE CURLOPT_READDATA /* name changed in 7.9.7 */
+#define CURLOPT_WRITEHEADER CURLOPT_HEADERDATA
+
+/* Since long deprecated options with no code in the lib that does anything
+   with them. */
+#define CURLOPT_WRITEINFO CURLOPT_OBSOLETE40
+#define CURLOPT_CLOSEPOLICY CURLOPT_OBSOLETE72
+
+#endif /*!CURL_NO_OLDIES*/
+
+/* This prototype applies to all conversion callbacks */
+typedef CURLcode (*curl_conv_callback)(char *buffer, size_t length);
+
+typedef CURLcode (*curl_ssl_ctx_callback)(CURL *curl,    /* easy handle */
+                                          void *ssl_ctx, /* actually an OpenSSL
+                                                            or WolfSSL SSL_CTX,
+                                                            or an mbedTLS
+                                                          mbedtls_ssl_config */
+                                          void *userptr);
+
+typedef enum {
+  CURLPROXY_HTTP = 0,   /* added in 7.10, new in 7.19.4 default is to use
+                           CONNECT HTTP/1.1 */
+  CURLPROXY_HTTP_1_0 = 1,   /* added in 7.19.4, force to use CONNECT
+                               HTTP/1.0  */
+  CURLPROXY_HTTPS = 2, /* added in 7.52.0 */
+  CURLPROXY_SOCKS4 = 4, /* support added in 7.15.2, enum existed already
+                           in 7.10 */
+  CURLPROXY_SOCKS5 = 5, /* added in 7.10 */
+  CURLPROXY_SOCKS4A = 6, /* added in 7.18.0 */
+  CURLPROXY_SOCKS5_HOSTNAME = 7 /* Use the SOCKS5 protocol but pass along the
+                                   host name rather than the IP address. added
+                                   in 7.18.0 */
+} curl_proxytype;  /* this enum was added in 7.10 */
+
+/*
+ * Bitmasks for CURLOPT_HTTPAUTH and CURLOPT_PROXYAUTH options:
+ *
+ * CURLAUTH_NONE         - No HTTP authentication
+ * CURLAUTH_BASIC        - HTTP Basic authentication (default)
+ * CURLAUTH_DIGEST       - HTTP Digest authentication
+ * CURLAUTH_NEGOTIATE    - HTTP Negotiate (SPNEGO) authentication
+ * CURLAUTH_GSSNEGOTIATE - Alias for CURLAUTH_NEGOTIATE (deprecated)
+ * CURLAUTH_NTLM         - HTTP NTLM authentication
+ * CURLAUTH_DIGEST_IE    - HTTP Digest authentication with IE flavour
+ * CURLAUTH_NTLM_WB      - HTTP NTLM authentication delegated to winbind helper
+ * CURLAUTH_BEARER       - HTTP Bearer token authentication
+ * CURLAUTH_ONLY         - Use together with a single other type to force no
+ *                         authentication or just that single type
+ * CURLAUTH_ANY          - All fine types set
+ * CURLAUTH_ANYSAFE      - All fine types except Basic
+ */
+
+#define CURLAUTH_NONE         ((unsigned long)0)
+#define CURLAUTH_BASIC        (((unsigned long)1)<<0)
+#define CURLAUTH_DIGEST       (((unsigned long)1)<<1)
+#define CURLAUTH_NEGOTIATE    (((unsigned long)1)<<2)
+/* Deprecated since the advent of CURLAUTH_NEGOTIATE */
+#define CURLAUTH_GSSNEGOTIATE CURLAUTH_NEGOTIATE
+/* Used for CURLOPT_SOCKS5_AUTH to stay terminologically correct */
+#define CURLAUTH_GSSAPI CURLAUTH_NEGOTIATE
+#define CURLAUTH_NTLM         (((unsigned long)1)<<3)
+#define CURLAUTH_DIGEST_IE    (((unsigned long)1)<<4)
+#define CURLAUTH_NTLM_WB      (((unsigned long)1)<<5)
+#define CURLAUTH_BEARER       (((unsigned long)1)<<6)
+#define CURLAUTH_ONLY         (((unsigned long)1)<<31)
+#define CURLAUTH_ANY          (~CURLAUTH_DIGEST_IE)
+#define CURLAUTH_ANYSAFE      (~(CURLAUTH_BASIC|CURLAUTH_DIGEST_IE))
+
+#define CURLSSH_AUTH_ANY       ~0     /* all types supported by the server */
+#define CURLSSH_AUTH_NONE      0      /* none allowed, silly but complete */
+#define CURLSSH_AUTH_PUBLICKEY (1<<0) /* public/private key files */
+#define CURLSSH_AUTH_PASSWORD  (1<<1) /* password */
+#define CURLSSH_AUTH_HOST      (1<<2) /* host key files */
+#define CURLSSH_AUTH_KEYBOARD  (1<<3) /* keyboard interactive */
+#define CURLSSH_AUTH_AGENT     (1<<4) /* agent (ssh-agent, pageant...) */
+#define CURLSSH_AUTH_GSSAPI    (1<<5) /* gssapi (kerberos, ...) */
+#define CURLSSH_AUTH_DEFAULT CURLSSH_AUTH_ANY
+
+#define CURLGSSAPI_DELEGATION_NONE        0      /* no delegation (default) */
+#define CURLGSSAPI_DELEGATION_POLICY_FLAG (1<<0) /* if permitted by policy */
+#define CURLGSSAPI_DELEGATION_FLAG        (1<<1) /* delegate always */
+
+#define CURL_ERROR_SIZE 256
+
+enum curl_khtype {
+  CURLKHTYPE_UNKNOWN,
+  CURLKHTYPE_RSA1,
+  CURLKHTYPE_RSA,
+  CURLKHTYPE_DSS,
+  CURLKHTYPE_ECDSA,
+  CURLKHTYPE_ED25519
+};
+
+struct curl_khkey {
+  const char *key; /* points to a zero-terminated string encoded with base64
+                      if len is zero, otherwise to the "raw" data */
+  size_t len;
+  enum curl_khtype keytype;
+};
+
+/* this is the set of return values expected from the curl_sshkeycallback
+   callback */
+enum curl_khstat {
+  CURLKHSTAT_FINE_ADD_TO_FILE,
+  CURLKHSTAT_FINE,
+  CURLKHSTAT_REJECT, /* reject the connection, return an error */
+  CURLKHSTAT_DEFER,  /* do not accept it, but we can't answer right now so
+                        this causes a CURLE_DEFER error but otherwise the
+                        connection will be left intact etc */
+  CURLKHSTAT_LAST    /* not for use, only a marker for last-in-list */
+};
+
+/* this is the set of status codes pass in to the callback */
+enum curl_khmatch {
+  CURLKHMATCH_OK,       /* match */
+  CURLKHMATCH_MISMATCH, /* host found, key mismatch! */
+  CURLKHMATCH_MISSING,  /* no matching host/key found */
+  CURLKHMATCH_LAST      /* not for use, only a marker for last-in-list */
+};
+
+typedef int
+  (*curl_sshkeycallback) (CURL *easy,     /* easy handle */
+                          const struct curl_khkey *knownkey, /* known */
+                          const struct curl_khkey *foundkey, /* found */
+                          enum curl_khmatch, /* libcurl's view on the keys */
+                          void *clientp); /* custom pointer passed from app */
+
+/* parameter for the CURLOPT_USE_SSL option */
+typedef enum {
+  CURLUSESSL_NONE,    /* do not attempt to use SSL */
+  CURLUSESSL_TRY,     /* try using SSL, proceed anyway otherwise */
+  CURLUSESSL_CONTROL, /* SSL for the control connection or fail */
+  CURLUSESSL_ALL,     /* SSL for all communication or fail */
+  CURLUSESSL_LAST     /* not an option, never use */
+} curl_usessl;
+
+/* Definition of bits for the CURLOPT_SSL_OPTIONS argument: */
+
+/* - ALLOW_BEAST tells libcurl to allow the BEAST SSL vulnerability in the
+   name of improving interoperability with older servers. Some SSL libraries
+   have introduced work-arounds for this flaw but those work-arounds sometimes
+   make the SSL communication fail. To regain functionality with those broken
+   servers, a user can this way allow the vulnerability back. */
+#define CURLSSLOPT_ALLOW_BEAST (1<<0)
+
+/* - NO_REVOKE tells libcurl to disable certificate revocation checks for those
+   SSL backends where such behavior is present. */
+#define CURLSSLOPT_NO_REVOKE (1<<1)
+
+/* The default connection attempt delay in milliseconds for happy eyeballs.
+   CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3 and happy-eyeballs-timeout-ms.d document
+   this value, keep them in sync. */
+#define CURL_HET_DEFAULT 200L
+
+/* The default connection upkeep interval in milliseconds. */
+#define CURL_UPKEEP_INTERVAL_DEFAULT 60000L
+
+#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all
+                          the obsolete stuff removed! */
+
+/* Backwards compatibility with older names */
+/* These are scheduled to disappear by 2009 */
+
+#define CURLFTPSSL_NONE CURLUSESSL_NONE
+#define CURLFTPSSL_TRY CURLUSESSL_TRY
+#define CURLFTPSSL_CONTROL CURLUSESSL_CONTROL
+#define CURLFTPSSL_ALL CURLUSESSL_ALL
+#define CURLFTPSSL_LAST CURLUSESSL_LAST
+#define curl_ftpssl curl_usessl
+#endif /*!CURL_NO_OLDIES*/
+
+/* parameter for the CURLOPT_FTP_SSL_CCC option */
+typedef enum {
+  CURLFTPSSL_CCC_NONE,    /* do not send CCC */
+  CURLFTPSSL_CCC_PASSIVE, /* Let the server initiate the shutdown */
+  CURLFTPSSL_CCC_ACTIVE,  /* Initiate the shutdown */
+  CURLFTPSSL_CCC_LAST     /* not an option, never use */
+} curl_ftpccc;
+
+/* parameter for the CURLOPT_FTPSSLAUTH option */
+typedef enum {
+  CURLFTPAUTH_DEFAULT, /* let libcurl decide */
+  CURLFTPAUTH_SSL,     /* use "AUTH SSL" */
+  CURLFTPAUTH_TLS,     /* use "AUTH TLS" */
+  CURLFTPAUTH_LAST /* not an option, never use */
+} curl_ftpauth;
+
+/* parameter for the CURLOPT_FTP_CREATE_MISSING_DIRS option */
+typedef enum {
+  CURLFTP_CREATE_DIR_NONE,  /* do NOT create missing dirs! */
+  CURLFTP_CREATE_DIR,       /* (FTP/SFTP) if CWD fails, try MKD and then CWD
+                               again if MKD succeeded, for SFTP this does
+                               similar magic */
+  CURLFTP_CREATE_DIR_RETRY, /* (FTP only) if CWD fails, try MKD and then CWD
+                               again even if MKD failed! */
+  CURLFTP_CREATE_DIR_LAST   /* not an option, never use */
+} curl_ftpcreatedir;
+
+/* parameter for the CURLOPT_FTP_FILEMETHOD option */
+typedef enum {
+  CURLFTPMETHOD_DEFAULT,   /* let libcurl pick */
+  CURLFTPMETHOD_MULTICWD,  /* single CWD operation for each path part */
+  CURLFTPMETHOD_NOCWD,     /* no CWD at all */
+  CURLFTPMETHOD_SINGLECWD, /* one CWD to full dir, then work on file */
+  CURLFTPMETHOD_LAST       /* not an option, never use */
+} curl_ftpmethod;
+
+/* bitmask defines for CURLOPT_HEADEROPT */
+#define CURLHEADER_UNIFIED  0
+#define CURLHEADER_SEPARATE (1<<0)
+
+/* CURLALTSVC_* are bits for the CURLOPT_ALTSVC_CTRL option */
+#define CURLALTSVC_IMMEDIATELY  (1<<0)
+#define CURLALTSVC_ALTUSED      (1<<1)
+#define CURLALTSVC_READONLYFILE (1<<2)
+#define CURLALTSVC_H1           (1<<3)
+#define CURLALTSVC_H2           (1<<4)
+#define CURLALTSVC_H3           (1<<5)
+
+/* CURLPROTO_ defines are for the CURLOPT_*PROTOCOLS options */
+#define CURLPROTO_HTTP   (1<<0)
+#define CURLPROTO_HTTPS  (1<<1)
+#define CURLPROTO_FTP    (1<<2)
+#define CURLPROTO_FTPS   (1<<3)
+#define CURLPROTO_SCP    (1<<4)
+#define CURLPROTO_SFTP   (1<<5)
+#define CURLPROTO_TELNET (1<<6)
+#define CURLPROTO_LDAP   (1<<7)
+#define CURLPROTO_LDAPS  (1<<8)
+#define CURLPROTO_DICT   (1<<9)
+#define CURLPROTO_FILE   (1<<10)
+#define CURLPROTO_TFTP   (1<<11)
+#define CURLPROTO_IMAP   (1<<12)
+#define CURLPROTO_IMAPS  (1<<13)
+#define CURLPROTO_POP3   (1<<14)
+#define CURLPROTO_POP3S  (1<<15)
+#define CURLPROTO_SMTP   (1<<16)
+#define CURLPROTO_SMTPS  (1<<17)
+#define CURLPROTO_RTSP   (1<<18)
+#define CURLPROTO_RTMP   (1<<19)
+#define CURLPROTO_RTMPT  (1<<20)
+#define CURLPROTO_RTMPE  (1<<21)
+#define CURLPROTO_RTMPTE (1<<22)
+#define CURLPROTO_RTMPS  (1<<23)
+#define CURLPROTO_RTMPTS (1<<24)
+#define CURLPROTO_GOPHER (1<<25)
+#define CURLPROTO_SMB    (1<<26)
+#define CURLPROTO_SMBS   (1<<27)
+#define CURLPROTO_ALL    (~0) /* enable everything */
+
+/* long may be 32 or 64 bits, but we should never depend on anything else
+   but 32 */
+#define CURLOPTTYPE_LONG          0
+#define CURLOPTTYPE_OBJECTPOINT   10000
+#define CURLOPTTYPE_STRINGPOINT   10000
+#define CURLOPTTYPE_FUNCTIONPOINT 20000
+#define CURLOPTTYPE_OFF_T         30000
+
+/* *STRINGPOINT is an alias for OBJECTPOINT to allow tools to extract the
+   string options from the header file */
+
+/* name is uppercase CURLOPT_<name>,
+   type is one of the defined CURLOPTTYPE_<type>
+   number is unique identifier */
+#ifdef CINIT
+#undef CINIT
+#endif
+
+#ifdef CURL_ISOCPP
+#define CINIT(na,t,nu) CURLOPT_ ## na = CURLOPTTYPE_ ## t + nu
+#else
+/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */
+#define LONG          CURLOPTTYPE_LONG
+#define OBJECTPOINT   CURLOPTTYPE_OBJECTPOINT
+#define STRINGPOINT   CURLOPTTYPE_OBJECTPOINT
+#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT
+#define OFF_T         CURLOPTTYPE_OFF_T
+#define CINIT(name,type,number) CURLOPT_/**/name = type + number
+#endif
+
+/*
+ * This macro-mania below setups the CURLOPT_[what] enum, to be used with
+ * curl_easy_setopt(). The first argument in the CINIT() macro is the [what]
+ * word.
+ */
+
+typedef enum {
+  /* This is the FILE * or void * the regular output should be written to. */
+  CINIT(WRITEDATA, OBJECTPOINT, 1),
+
+  /* The full URL to get/put */
+  CINIT(URL, STRINGPOINT, 2),
+
+  /* Port number to connect to, if other than default. */
+  CINIT(PORT, LONG, 3),
+
+  /* Name of proxy to use. */
+  CINIT(PROXY, STRINGPOINT, 4),
+
+  /* "user:password;options" to use when fetching. */
+  CINIT(USERPWD, STRINGPOINT, 5),
+
+  /* "user:password" to use with proxy. */
+  CINIT(PROXYUSERPWD, STRINGPOINT, 6),
+
+  /* Range to get, specified as an ASCII string. */
+  CINIT(RANGE, STRINGPOINT, 7),
+
+  /* not used */
+
+  /* Specified file stream to upload from (use as input): */
+  CINIT(READDATA, OBJECTPOINT, 9),
+
+  /* Buffer to receive error messages in, must be at least CURL_ERROR_SIZE
+   * bytes big. */
+  CINIT(ERRORBUFFER, OBJECTPOINT, 10),
+
+  /* Function that will be called to store the output (instead of fwrite). The
+   * parameters will use fwrite() syntax, make sure to follow them. */
+  CINIT(WRITEFUNCTION, FUNCTIONPOINT, 11),
+
+  /* Function that will be called to read the input (instead of fread). The
+   * parameters will use fread() syntax, make sure to follow them. */
+  CINIT(READFUNCTION, FUNCTIONPOINT, 12),
+
+  /* Time-out the read operation after this amount of seconds */
+  CINIT(TIMEOUT, LONG, 13),
+
+  /* If the CURLOPT_INFILE is used, this can be used to inform libcurl about
+   * how large the file being sent really is. That allows better error
+   * checking and better verifies that the upload was successful. -1 means
+   * unknown size.
+   *
+   * For large file support, there is also a _LARGE version of the key
+   * which takes an off_t type, allowing platforms with larger off_t
+   * sizes to handle larger files.  See below for INFILESIZE_LARGE.
+   */
+  CINIT(INFILESIZE, LONG, 14),
+
+  /* POST static input fields. */
+  CINIT(POSTFIELDS, OBJECTPOINT, 15),
+
+  /* Set the referrer page (needed by some CGIs) */
+  CINIT(REFERER, STRINGPOINT, 16),
+
+  /* Set the FTP PORT string (interface name, named or numerical IP address)
+     Use i.e '-' to use default address. */
+  CINIT(FTPPORT, STRINGPOINT, 17),
+
+  /* Set the User-Agent string (examined by some CGIs) */
+  CINIT(USERAGENT, STRINGPOINT, 18),
+
+  /* If the download receives less than "low speed limit" bytes/second
+   * during "low speed time" seconds, the operations is aborted.
+   * You could i.e if you have a pretty high speed connection, abort if
+   * it is less than 2000 bytes/sec during 20 seconds.
+   */
+
+  /* Set the "low speed limit" */
+  CINIT(LOW_SPEED_LIMIT, LONG, 19),
+
+  /* Set the "low speed time" */
+  CINIT(LOW_SPEED_TIME, LONG, 20),
+
+  /* Set the continuation offset.
+   *
+   * Note there is also a _LARGE version of this key which uses
+   * off_t types, allowing for large file offsets on platforms which
+   * use larger-than-32-bit off_t's.  Look below for RESUME_FROM_LARGE.
+   */
+  CINIT(RESUME_FROM, LONG, 21),
+
+  /* Set cookie in request: */
+  CINIT(COOKIE, STRINGPOINT, 22),
+
+  /* This points to a linked list of headers, struct curl_slist kind. This
+     list is also used for RTSP (in spite of its name) */
+  CINIT(HTTPHEADER, OBJECTPOINT, 23),
+
+  /* This points to a linked list of post entries, struct curl_httppost */
+  CINIT(HTTPPOST, OBJECTPOINT, 24),
+
+  /* name of the file keeping your private SSL-certificate */
+  CINIT(SSLCERT, STRINGPOINT, 25),
+
+  /* password for the SSL or SSH private key */
+  CINIT(KEYPASSWD, STRINGPOINT, 26),
+
+  /* send TYPE parameter? */
+  CINIT(CRLF, LONG, 27),
+
+  /* send linked-list of QUOTE commands */
+  CINIT(QUOTE, OBJECTPOINT, 28),
+
+  /* send FILE * or void * to store headers to, if you use a callback it
+     is simply passed to the callback unmodified */
+  CINIT(HEADERDATA, OBJECTPOINT, 29),
+
+  /* point to a file to read the initial cookies from, also enables
+     "cookie awareness" */
+  CINIT(COOKIEFILE, STRINGPOINT, 31),
+
+  /* What version to specifically try to use.
+     See CURL_SSLVERSION defines below. */
+  CINIT(SSLVERSION, LONG, 32),
+
+  /* What kind of HTTP time condition to use, see defines */
+  CINIT(TIMECONDITION, LONG, 33),
+
+  /* Time to use with the above condition. Specified in number of seconds
+     since 1 Jan 1970 */
+  CINIT(TIMEVALUE, LONG, 34),
+
+  /* 35 = OBSOLETE */
+
+  /* Custom request, for customizing the get command like
+     HTTP: DELETE, TRACE and others
+     FTP: to use a different list command
+     */
+  CINIT(CUSTOMREQUEST, STRINGPOINT, 36),
+
+  /* FILE handle to use instead of stderr */
+  CINIT(STDERR, OBJECTPOINT, 37),
+
+  /* 38 is not used */
+
+  /* send linked-list of post-transfer QUOTE commands */
+  CINIT(POSTQUOTE, OBJECTPOINT, 39),
+
+  CINIT(OBSOLETE40, OBJECTPOINT, 40), /* OBSOLETE, do not use! */
+
+  CINIT(VERBOSE, LONG, 41),      /* talk a lot */
+  CINIT(HEADER, LONG, 42),       /* throw the header out too */
+  CINIT(NOPROGRESS, LONG, 43),   /* shut off the progress meter */
+  CINIT(NOBODY, LONG, 44),       /* use HEAD to get http document */
+  CINIT(FAILONERROR, LONG, 45),  /* no output on http error codes >= 400 */
+  CINIT(UPLOAD, LONG, 46),       /* this is an upload */
+  CINIT(POST, LONG, 47),         /* HTTP POST method */
+  CINIT(DIRLISTONLY, LONG, 48),  /* bare names when listing directories */
+
+  CINIT(APPEND, LONG, 50),       /* Append instead of overwrite on upload! */
+
+  /* Specify whether to read the user+password from the .netrc or the URL.
+   * This must be one of the CURL_NETRC_* enums below. */
+  CINIT(NETRC, LONG, 51),
+
+  CINIT(FOLLOWLOCATION, LONG, 52),  /* use Location: Luke! */
+
+  CINIT(TRANSFERTEXT, LONG, 53), /* transfer data in text/ASCII format */
+  CINIT(PUT, LONG, 54),          /* HTTP PUT */
+
+  /* 55 = OBSOLETE */
+
+  /* DEPRECATED
+   * Function that will be called instead of the internal progress display
+   * function. This function should be defined as the curl_progress_callback
+   * prototype defines. */
+  CINIT(PROGRESSFUNCTION, FUNCTIONPOINT, 56),
+
+  /* Data passed to the CURLOPT_PROGRESSFUNCTION and CURLOPT_XFERINFOFUNCTION
+     callbacks */
+  CINIT(PROGRESSDATA, OBJECTPOINT, 57),
+#define CURLOPT_XFERINFODATA CURLOPT_PROGRESSDATA
+
+  /* We want the referrer field set automatically when following locations */
+  CINIT(AUTOREFERER, LONG, 58),
+
+  /* Port of the proxy, can be set in the proxy string as well with:
+     "[host]:[port]" */
+  CINIT(PROXYPORT, LONG, 59),
+
+  /* size of the POST input data, if strlen() is not good to use */
+  CINIT(POSTFIELDSIZE, LONG, 60),
+
+  /* tunnel non-http operations through a HTTP proxy */
+  CINIT(HTTPPROXYTUNNEL, LONG, 61),
+
+  /* Set the interface string to use as outgoing network interface */
+  CINIT(INTERFACE, STRINGPOINT, 62),
+
+  /* Set the krb4/5 security level, this also enables krb4/5 awareness.  This
+   * is a string, 'clear', 'safe', 'confidential' or 'private'.  If the string
+   * is set but doesn't match one of these, 'private' will be used.  */
+  CINIT(KRBLEVEL, STRINGPOINT, 63),
+
+  /* Set if we should verify the peer in ssl handshake, set 1 to verify. */
+  CINIT(SSL_VERIFYPEER, LONG, 64),
+
+  /* The CApath or CAfile used to validate the peer certificate
+     this option is used only if SSL_VERIFYPEER is true */
+  CINIT(CAINFO, STRINGPOINT, 65),
+
+  /* 66 = OBSOLETE */
+  /* 67 = OBSOLETE */
+
+  /* Maximum number of http redirects to follow */
+  CINIT(MAXREDIRS, LONG, 68),
+
+  /* Pass a long set to 1 to get the date of the requested document (if
+     possible)! Pass a zero to shut it off. */
+  CINIT(FILETIME, LONG, 69),
+
+  /* This points to a linked list of telnet options */
+  CINIT(TELNETOPTIONS, OBJECTPOINT, 70),
+
+  /* Max amount of cached alive connections */
+  CINIT(MAXCONNECTS, LONG, 71),
+
+  CINIT(OBSOLETE72, LONG, 72), /* OBSOLETE, do not use! */
+
+  /* 73 = OBSOLETE */
+
+  /* Set to explicitly use a new connection for the upcoming transfer.
+     Do not use this unless you're absolutely sure of this, as it makes the
+     operation slower and is less friendly for the network. */
+  CINIT(FRESH_CONNECT, LONG, 74),
+
+  /* Set to explicitly forbid the upcoming transfer's connection to be re-used
+     when done. Do not use this unless you're absolutely sure of this, as it
+     makes the operation slower and is less friendly for the network. */
+  CINIT(FORBID_REUSE, LONG, 75),
+
+  /* Set to a file name that contains random data for libcurl to use to
+     seed the random engine when doing SSL connects. */
+  CINIT(RANDOM_FILE, STRINGPOINT, 76),
+
+  /* Set to the Entropy Gathering Daemon socket pathname */
+  CINIT(EGDSOCKET, STRINGPOINT, 77),
+
+  /* Time-out connect operations after this amount of seconds, if connects are
+     OK within this time, then fine... This only aborts the connect phase. */
+  CINIT(CONNECTTIMEOUT, LONG, 78),
+
+  /* Function that will be called to store headers (instead of fwrite). The
+   * parameters will use fwrite() syntax, make sure to follow them. */
+  CINIT(HEADERFUNCTION, FUNCTIONPOINT, 79),
+
+  /* Set this to force the HTTP request to get back to GET. Only really usable
+     if POST, PUT or a custom request have been used first.
+   */
+  CINIT(HTTPGET, LONG, 80),
+
+  /* Set if we should verify the Common name from the peer certificate in ssl
+   * handshake, set 1 to check existence, 2 to ensure that it matches the
+   * provided hostname. */
+  CINIT(SSL_VERIFYHOST, LONG, 81),
+
+  /* Specify which file name to write all known cookies in after completed
+     operation. Set file name to "-" (dash) to make it go to stdout. */
+  CINIT(COOKIEJAR, STRINGPOINT, 82),
+
+  /* Specify which SSL ciphers to use */
+  CINIT(SSL_CIPHER_LIST, STRINGPOINT, 83),
+
+  /* Specify which HTTP version to use! This must be set to one of the
+     CURL_HTTP_VERSION* enums set below. */
+  CINIT(HTTP_VERSION, LONG, 84),
+
+  /* Specifically switch on or off the FTP engine's use of the EPSV command. By
+     default, that one will always be attempted before the more traditional
+     PASV command. */
+  CINIT(FTP_USE_EPSV, LONG, 85),
+
+  /* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") */
+  CINIT(SSLCERTTYPE, STRINGPOINT, 86),
+
+  /* name of the file keeping your private SSL-key */
+  CINIT(SSLKEY, STRINGPOINT, 87),
+
+  /* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") */
+  CINIT(SSLKEYTYPE, STRINGPOINT, 88),
+
+  /* crypto engine for the SSL-sub system */
+  CINIT(SSLENGINE, STRINGPOINT, 89),
+
+  /* set the crypto engine for the SSL-sub system as default
+     the param has no meaning...
+   */
+  CINIT(SSLENGINE_DEFAULT, LONG, 90),
+
+  /* Non-zero value means to use the global dns cache */
+  CINIT(DNS_USE_GLOBAL_CACHE, LONG, 91), /* DEPRECATED, do not use! */
+
+  /* DNS cache timeout */
+  CINIT(DNS_CACHE_TIMEOUT, LONG, 92),
+
+  /* send linked-list of pre-transfer QUOTE commands */
+  CINIT(PREQUOTE, OBJECTPOINT, 93),
+
+  /* set the debug function */
+  CINIT(DEBUGFUNCTION, FUNCTIONPOINT, 94),
+
+  /* set the data for the debug function */
+  CINIT(DEBUGDATA, OBJECTPOINT, 95),
+
+  /* mark this as start of a cookie session */
+  CINIT(COOKIESESSION, LONG, 96),
+
+  /* The CApath directory used to validate the peer certificate
+     this option is used only if SSL_VERIFYPEER is true */
+  CINIT(CAPATH, STRINGPOINT, 97),
+
+  /* Instruct libcurl to use a smaller receive buffer */
+  CINIT(BUFFERSIZE, LONG, 98),
+
+  /* Instruct libcurl to not use any signal/alarm handlers, even when using
+     timeouts. This option is useful for multi-threaded applications.
+     See libcurl-the-guide for more background information. */
+  CINIT(NOSIGNAL, LONG, 99),
+
+  /* Provide a CURLShare for mutexing non-ts data */
+  CINIT(SHARE, OBJECTPOINT, 100),
+
+  /* indicates type of proxy. accepted values are CURLPROXY_HTTP (default),
+     CURLPROXY_HTTPS, CURLPROXY_SOCKS4, CURLPROXY_SOCKS4A and
+     CURLPROXY_SOCKS5. */
+  CINIT(PROXYTYPE, LONG, 101),
+
+  /* Set the Accept-Encoding string. Use this to tell a server you would like
+     the response to be compressed. Before 7.21.6, this was known as
+     CURLOPT_ENCODING */
+  CINIT(ACCEPT_ENCODING, STRINGPOINT, 102),
+
+  /* Set pointer to private data */
+  CINIT(PRIVATE, OBJECTPOINT, 103),
+
+  /* Set aliases for HTTP 200 in the HTTP Response header */
+  CINIT(HTTP200ALIASES, OBJECTPOINT, 104),
+
+  /* Continue to send authentication (user+password) when following locations,
+     even when hostname changed. This can potentially send off the name
+     and password to whatever host the server decides. */
+  CINIT(UNRESTRICTED_AUTH, LONG, 105),
+
+  /* Specifically switch on or off the FTP engine's use of the EPRT command (
+     it also disables the LPRT attempt). By default, those ones will always be
+     attempted before the good old traditional PORT command. */
+  CINIT(FTP_USE_EPRT, LONG, 106),
+
+  /* Set this to a bitmask value to enable the particular authentications
+     methods you like. Use this in combination with CURLOPT_USERPWD.
+     Note that setting multiple bits may cause extra network round-trips. */
+  CINIT(HTTPAUTH, LONG, 107),
+
+  /* Set the ssl context callback function, currently only for OpenSSL or
+     WolfSSL ssl_ctx, or mbedTLS mbedtls_ssl_config in the second argument.
+     The function must match the curl_ssl_ctx_callback prototype. */
+  CINIT(SSL_CTX_FUNCTION, FUNCTIONPOINT, 108),
+
+  /* Set the userdata for the ssl context callback function's third
+     argument */
+  CINIT(SSL_CTX_DATA, OBJECTPOINT, 109),
+
+  /* FTP Option that causes missing dirs to be created on the remote server.
+     In 7.19.4 we introduced the convenience enums for this option using the
+     CURLFTP_CREATE_DIR prefix.
+  */
+  CINIT(FTP_CREATE_MISSING_DIRS, LONG, 110),
+
+  /* Set this to a bitmask value to enable the particular authentications
+     methods you like. Use this in combination with CURLOPT_PROXYUSERPWD.
+     Note that setting multiple bits may cause extra network round-trips. */
+  CINIT(PROXYAUTH, LONG, 111),
+
+  /* FTP option that changes the timeout, in seconds, associated with
+     getting a response.  This is different from transfer timeout time and
+     essentially places a demand on the FTP server to acknowledge commands
+     in a timely manner. */
+  CINIT(FTP_RESPONSE_TIMEOUT, LONG, 112),
+#define CURLOPT_SERVER_RESPONSE_TIMEOUT CURLOPT_FTP_RESPONSE_TIMEOUT
+
+  /* Set this option to one of the CURL_IPRESOLVE_* defines (see below) to
+     tell libcurl to resolve names to those IP versions only. This only has
+     affect on systems with support for more than one, i.e IPv4 _and_ IPv6. */
+  CINIT(IPRESOLVE, LONG, 113),
+
+  /* Set this option to limit the size of a file that will be downloaded from
+     an HTTP or FTP server.
+
+     Note there is also _LARGE version which adds large file support for
+     platforms which have larger off_t sizes.  See MAXFILESIZE_LARGE below. */
+  CINIT(MAXFILESIZE, LONG, 114),
+
+  /* See the comment for INFILESIZE above, but in short, specifies
+   * the size of the file being uploaded.  -1 means unknown.
+   */
+  CINIT(INFILESIZE_LARGE, OFF_T, 115),
+
+  /* Sets the continuation offset.  There is also a LONG version of this;
+   * look above for RESUME_FROM.
+   */
+  CINIT(RESUME_FROM_LARGE, OFF_T, 116),
+
+  /* Sets the maximum size of data that will be downloaded from
+   * an HTTP or FTP server.  See MAXFILESIZE above for the LONG version.
+   */
+  CINIT(MAXFILESIZE_LARGE, OFF_T, 117),
+
+  /* Set this option to the file name of your .netrc file you want libcurl
+     to parse (using the CURLOPT_NETRC option). If not set, libcurl will do
+     a poor attempt to find the user's home directory and check for a .netrc
+     file in there. */
+  CINIT(NETRC_FILE, STRINGPOINT, 118),
+
+  /* Enable SSL/TLS for FTP, pick one of:
+     CURLUSESSL_TRY     - try using SSL, proceed anyway otherwise
+     CURLUSESSL_CONTROL - SSL for the control connection or fail
+     CURLUSESSL_ALL     - SSL for all communication or fail
+  */
+  CINIT(USE_SSL, LONG, 119),
+
+  /* The _LARGE version of the standard POSTFIELDSIZE option */
+  CINIT(POSTFIELDSIZE_LARGE, OFF_T, 120),
+
+  /* Enable/disable the TCP Nagle algorithm */
+  CINIT(TCP_NODELAY, LONG, 121),
+
+  /* 122 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */
+  /* 123 OBSOLETE. Gone in 7.16.0 */
+  /* 124 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */
+  /* 125 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */
+  /* 126 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */
+  /* 127 OBSOLETE. Gone in 7.16.0 */
+  /* 128 OBSOLETE. Gone in 7.16.0 */
+
+  /* When FTP over SSL/TLS is selected (with CURLOPT_USE_SSL), this option
+     can be used to change libcurl's default action which is to first try
+     "AUTH SSL" and then "AUTH TLS" in this order, and proceed when a OK
+     response has been received.
+
+     Available parameters are:
+     CURLFTPAUTH_DEFAULT - let libcurl decide
+     CURLFTPAUTH_SSL     - try "AUTH SSL" first, then TLS
+     CURLFTPAUTH_TLS     - try "AUTH TLS" first, then SSL
+  */
+  CINIT(FTPSSLAUTH, LONG, 129),
+
+  CINIT(IOCTLFUNCTION, FUNCTIONPOINT, 130),
+  CINIT(IOCTLDATA, OBJECTPOINT, 131),
+
+  /* 132 OBSOLETE. Gone in 7.16.0 */
+  /* 133 OBSOLETE. Gone in 7.16.0 */
+
+  /* zero terminated string for pass on to the FTP server when asked for
+     "account" info */
+  CINIT(FTP_ACCOUNT, STRINGPOINT, 134),
+
+  /* feed cookie into cookie engine */
+  CINIT(COOKIELIST, STRINGPOINT, 135),
+
+  /* ignore Content-Length */
+  CINIT(IGNORE_CONTENT_LENGTH, LONG, 136),
+
+  /* Set to non-zero to skip the IP address received in a 227 PASV FTP server
+     response. Typically used for FTP-SSL purposes but is not restricted to
+     that. libcurl will then instead use the same IP address it used for the
+     control connection. */
+  CINIT(FTP_SKIP_PASV_IP, LONG, 137),
+
+  /* Select "file method" to use when doing FTP, see the curl_ftpmethod
+     above. */
+  CINIT(FTP_FILEMETHOD, LONG, 138),
+
+  /* Local port number to bind the socket to */
+  CINIT(LOCALPORT, LONG, 139),
+
+  /* Number of ports to try, including the first one set with LOCALPORT.
+     Thus, setting it to 1 will make no additional attempts but the first.
+  */
+  CINIT(LOCALPORTRANGE, LONG, 140),
+
+  /* no transfer, set up connection and let application use the socket by
+     extracting it with CURLINFO_LASTSOCKET */
+  CINIT(CONNECT_ONLY, LONG, 141),
+
+  /* Function that will be called to convert from the
+     network encoding (instead of using the iconv calls in libcurl) */
+  CINIT(CONV_FROM_NETWORK_FUNCTION, FUNCTIONPOINT, 142),
+
+  /* Function that will be called to convert to the
+     network encoding (instead of using the iconv calls in libcurl) */
+  CINIT(CONV_TO_NETWORK_FUNCTION, FUNCTIONPOINT, 143),
+
+  /* Function that will be called to convert from UTF8
+     (instead of using the iconv calls in libcurl)
+     Note that this is used only for SSL certificate processing */
+  CINIT(CONV_FROM_UTF8_FUNCTION, FUNCTIONPOINT, 144),
+
+  /* if the connection proceeds too quickly then need to slow it down */
+  /* limit-rate: maximum number of bytes per second to send or receive */
+  CINIT(MAX_SEND_SPEED_LARGE, OFF_T, 145),
+  CINIT(MAX_RECV_SPEED_LARGE, OFF_T, 146),
+
+  /* Pointer to command string to send if USER/PASS fails. */
+  CINIT(FTP_ALTERNATIVE_TO_USER, STRINGPOINT, 147),
+
+  /* callback function for setting socket options */
+  CINIT(SOCKOPTFUNCTION, FUNCTIONPOINT, 148),
+  CINIT(SOCKOPTDATA, OBJECTPOINT, 149),
+
+  /* set to 0 to disable session ID re-use for this transfer, default is
+     enabled (== 1) */
+  CINIT(SSL_SESSIONID_CACHE, LONG, 150),
+
+  /* allowed SSH authentication methods */
+  CINIT(SSH_AUTH_TYPES, LONG, 151),
+
+  /* Used by scp/sftp to do public/private key authentication */
+  CINIT(SSH_PUBLIC_KEYFILE, STRINGPOINT, 152),
+  CINIT(SSH_PRIVATE_KEYFILE, STRINGPOINT, 153),
+
+  /* Send CCC (Clear Command Channel) after authentication */
+  CINIT(FTP_SSL_CCC, LONG, 154),
+
+  /* Same as TIMEOUT and CONNECTTIMEOUT, but with ms resolution */
+  CINIT(TIMEOUT_MS, LONG, 155),
+  CINIT(CONNECTTIMEOUT_MS, LONG, 156),
+
+  /* set to zero to disable the libcurl's decoding and thus pass the raw body
+     data to the application even when it is encoded/compressed */
+  CINIT(HTTP_TRANSFER_DECODING, LONG, 157),
+  CINIT(HTTP_CONTENT_DECODING, LONG, 158),
+
+  /* Permission used when creating new files and directories on the remote
+     server for protocols that support it, SFTP/SCP/FILE */
+  CINIT(NEW_FILE_PERMS, LONG, 159),
+  CINIT(NEW_DIRECTORY_PERMS, LONG, 160),
+
+  /* Set the behaviour of POST when redirecting. Values must be set to one
+     of CURL_REDIR* defines below. This used to be called CURLOPT_POST301 */
+  CINIT(POSTREDIR, LONG, 161),
+
+  /* used by scp/sftp to verify the host's public key */
+  CINIT(SSH_HOST_PUBLIC_KEY_MD5, STRINGPOINT, 162),
+
+  /* Callback function for opening socket (instead of socket(2)). Optionally,
+     callback is able change the address or refuse to connect returning
+     CURL_SOCKET_BAD.  The callback should have type
+     curl_opensocket_callback */
+  CINIT(OPENSOCKETFUNCTION, FUNCTIONPOINT, 163),
+  CINIT(OPENSOCKETDATA, OBJECTPOINT, 164),
+
+  /* POST volatile input fields. */
+  CINIT(COPYPOSTFIELDS, OBJECTPOINT, 165),
+
+  /* set transfer mode (;type=<a|i>) when doing FTP via an HTTP proxy */
+  CINIT(PROXY_TRANSFER_MODE, LONG, 166),
+
+  /* Callback function for seeking in the input stream */
+  CINIT(SEEKFUNCTION, FUNCTIONPOINT, 167),
+  CINIT(SEEKDATA, OBJECTPOINT, 168),
+
+  /* CRL file */
+  CINIT(CRLFILE, STRINGPOINT, 169),
+
+  /* Issuer certificate */
+  CINIT(ISSUERCERT, STRINGPOINT, 170),
+
+  /* (IPv6) Address scope */
+  CINIT(ADDRESS_SCOPE, LONG, 171),
+
+  /* Collect certificate chain info and allow it to get retrievable with
+     CURLINFO_CERTINFO after the transfer is complete. */
+  CINIT(CERTINFO, LONG, 172),
+
+  /* "name" and "pwd" to use when fetching. */
+  CINIT(USERNAME, STRINGPOINT, 173),
+  CINIT(PASSWORD, STRINGPOINT, 174),
+
+    /* "name" and "pwd" to use with Proxy when fetching. */
+  CINIT(PROXYUSERNAME, STRINGPOINT, 175),
+  CINIT(PROXYPASSWORD, STRINGPOINT, 176),
+
+  /* Comma separated list of hostnames defining no-proxy zones. These should
+     match both hostnames directly, and hostnames within a domain. For
+     example, local.com will match local.com and www.local.com, but NOT
+     notlocal.com or www.notlocal.com. For compatibility with other
+     implementations of this, .local.com will be considered to be the same as
+     local.com. A single * is the only valid wildcard, and effectively
+     disables the use of proxy. */
+  CINIT(NOPROXY, STRINGPOINT, 177),
+
+  /* block size for TFTP transfers */
+  CINIT(TFTP_BLKSIZE, LONG, 178),
+
+  /* Socks Service */
+  CINIT(SOCKS5_GSSAPI_SERVICE, STRINGPOINT, 179), /* DEPRECATED, do not use! */
+
+  /* Socks Service */
+  CINIT(SOCKS5_GSSAPI_NEC, LONG, 180),
+
+  /* set the bitmask for the protocols that are allowed to be used for the
+     transfer, which thus helps the app which takes URLs from users or other
+     external inputs and want to restrict what protocol(s) to deal
+     with. Defaults to CURLPROTO_ALL. */
+  CINIT(PROTOCOLS, LONG, 181),
+
+  /* set the bitmask for the protocols that libcurl is allowed to follow to,
+     as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs
+     to be set in both bitmasks to be allowed to get redirected to. Defaults
+     to all protocols except FILE and SCP. */
+  CINIT(REDIR_PROTOCOLS, LONG, 182),
+
+  /* set the SSH knownhost file name to use */
+  CINIT(SSH_KNOWNHOSTS, STRINGPOINT, 183),
+
+  /* set the SSH host key callback, must point to a curl_sshkeycallback
+     function */
+  CINIT(SSH_KEYFUNCTION, FUNCTIONPOINT, 184),
+
+  /* set the SSH host key callback custom pointer */
+  CINIT(SSH_KEYDATA, OBJECTPOINT, 185),
+
+  /* set the SMTP mail originator */
+  CINIT(MAIL_FROM, STRINGPOINT, 186),
+
+  /* set the list of SMTP mail receiver(s) */
+  CINIT(MAIL_RCPT, OBJECTPOINT, 187),
+
+  /* FTP: send PRET before PASV */
+  CINIT(FTP_USE_PRET, LONG, 188),
+
+  /* RTSP request method (OPTIONS, SETUP, PLAY, etc...) */
+  CINIT(RTSP_REQUEST, LONG, 189),
+
+  /* The RTSP session identifier */
+  CINIT(RTSP_SESSION_ID, STRINGPOINT, 190),
+
+  /* The RTSP stream URI */
+  CINIT(RTSP_STREAM_URI, STRINGPOINT, 191),
+
+  /* The Transport: header to use in RTSP requests */
+  CINIT(RTSP_TRANSPORT, STRINGPOINT, 192),
+
+  /* Manually initialize the client RTSP CSeq for this handle */
+  CINIT(RTSP_CLIENT_CSEQ, LONG, 193),
+
+  /* Manually initialize the server RTSP CSeq for this handle */
+  CINIT(RTSP_SERVER_CSEQ, LONG, 194),
+
+  /* The stream to pass to INTERLEAVEFUNCTION. */
+  CINIT(INTERLEAVEDATA, OBJECTPOINT, 195),
+
+  /* Let the application define a custom write method for RTP data */
+  CINIT(INTERLEAVEFUNCTION, FUNCTIONPOINT, 196),
+
+  /* Turn on wildcard matching */
+  CINIT(WILDCARDMATCH, LONG, 197),
+
+  /* Directory matching callback called before downloading of an
+     individual file (chunk) started */
+  CINIT(CHUNK_BGN_FUNCTION, FUNCTIONPOINT, 198),
+
+  /* Directory matching callback called after the file (chunk)
+     was downloaded, or skipped */
+  CINIT(CHUNK_END_FUNCTION, FUNCTIONPOINT, 199),
+
+  /* Change match (fnmatch-like) callback for wildcard matching */
+  CINIT(FNMATCH_FUNCTION, FUNCTIONPOINT, 200),
+
+  /* Let the application define custom chunk data pointer */
+  CINIT(CHUNK_DATA, OBJECTPOINT, 201),
+
+  /* FNMATCH_FUNCTION user pointer */
+  CINIT(FNMATCH_DATA, OBJECTPOINT, 202),
+
+  /* send linked-list of name:port:address sets */
+  CINIT(RESOLVE, OBJECTPOINT, 203),
+
+  /* Set a username for authenticated TLS */
+  CINIT(TLSAUTH_USERNAME, STRINGPOINT, 204),
+
+  /* Set a password for authenticated TLS */
+  CINIT(TLSAUTH_PASSWORD, STRINGPOINT, 205),
+
+  /* Set authentication type for authenticated TLS */
+  CINIT(TLSAUTH_TYPE, STRINGPOINT, 206),
+
+  /* Set to 1 to enable the "TE:" header in HTTP requests to ask for
+     compressed transfer-encoded responses. Set to 0 to disable the use of TE:
+     in outgoing requests. The current default is 0, but it might change in a
+     future libcurl release.
+
+     libcurl will ask for the compressed methods it knows of, and if that
+     isn't any, it will not ask for transfer-encoding at all even if this
+     option is set to 1.
+
+  */
+  CINIT(TRANSFER_ENCODING, LONG, 207),
+
+  /* Callback function for closing socket (instead of close(2)). The callback
+     should have type curl_closesocket_callback */
+  CINIT(CLOSESOCKETFUNCTION, FUNCTIONPOINT, 208),
+  CINIT(CLOSESOCKETDATA, OBJECTPOINT, 209),
+
+  /* allow GSSAPI credential delegation */
+  CINIT(GSSAPI_DELEGATION, LONG, 210),
+
+  /* Set the name servers to use for DNS resolution */
+  CINIT(DNS_SERVERS, STRINGPOINT, 211),
+
+  /* Time-out accept operations (currently for FTP only) after this amount
+     of milliseconds. */
+  CINIT(ACCEPTTIMEOUT_MS, LONG, 212),
+
+  /* Set TCP keepalive */
+  CINIT(TCP_KEEPALIVE, LONG, 213),
+
+  /* non-universal keepalive knobs (Linux, AIX, HP-UX, more) */
+  CINIT(TCP_KEEPIDLE, LONG, 214),
+  CINIT(TCP_KEEPINTVL, LONG, 215),
+
+  /* Enable/disable specific SSL features with a bitmask, see CURLSSLOPT_* */
+  CINIT(SSL_OPTIONS, LONG, 216),
+
+  /* Set the SMTP auth originator */
+  CINIT(MAIL_AUTH, STRINGPOINT, 217),
+
+  /* Enable/disable SASL initial response */
+  CINIT(SASL_IR, LONG, 218),
+
+  /* Function that will be called instead of the internal progress display
+   * function. This function should be defined as the curl_xferinfo_callback
+   * prototype defines. (Deprecates CURLOPT_PROGRESSFUNCTION) */
+  CINIT(XFERINFOFUNCTION, FUNCTIONPOINT, 219),
+
+  /* The XOAUTH2 bearer token */
+  CINIT(XOAUTH2_BEARER, STRINGPOINT, 220),
+
+  /* Set the interface string to use as outgoing network
+   * interface for DNS requests.
+   * Only supported by the c-ares DNS backend */
+  CINIT(DNS_INTERFACE, STRINGPOINT, 221),
+
+  /* Set the local IPv4 address to use for outgoing DNS requests.
+   * Only supported by the c-ares DNS backend */
+  CINIT(DNS_LOCAL_IP4, STRINGPOINT, 222),
+
+  /* Set the local IPv6 address to use for outgoing DNS requests.
+   * Only supported by the c-ares DNS backend */
+  CINIT(DNS_LOCAL_IP6, STRINGPOINT, 223),
+
+  /* Set authentication options directly */
+  CINIT(LOGIN_OPTIONS, STRINGPOINT, 224),
+
+  /* Enable/disable TLS NPN extension (http2 over ssl might fail without) */
+  CINIT(SSL_ENABLE_NPN, LONG, 225),
+
+  /* Enable/disable TLS ALPN extension (http2 over ssl might fail without) */
+  CINIT(SSL_ENABLE_ALPN, LONG, 226),
+
+  /* Time to wait for a response to a HTTP request containing an
+   * Expect: 100-continue header before sending the data anyway. */
+  CINIT(EXPECT_100_TIMEOUT_MS, LONG, 227),
+
+  /* This points to a linked list of headers used for proxy requests only,
+     struct curl_slist kind */
+  CINIT(PROXYHEADER, OBJECTPOINT, 228),
+
+  /* Pass in a bitmask of "header options" */
+  CINIT(HEADEROPT, LONG, 229),
+
+  /* The public key in DER form used to validate the peer public key
+     this option is used only if SSL_VERIFYPEER is true */
+  CINIT(PINNEDPUBLICKEY, STRINGPOINT, 230),
+
+  /* Path to Unix domain socket */
+  CINIT(UNIX_SOCKET_PATH, STRINGPOINT, 231),
+
+  /* Set if we should verify the certificate status. */
+  CINIT(SSL_VERIFYSTATUS, LONG, 232),
+
+  /* Set if we should enable TLS false start. */
+  CINIT(SSL_FALSESTART, LONG, 233),
+
+  /* Do not squash dot-dot sequences */
+  CINIT(PATH_AS_IS, LONG, 234),
+
+  /* Proxy Service Name */
+  CINIT(PROXY_SERVICE_NAME, STRINGPOINT, 235),
+
+  /* Service Name */
+  CINIT(SERVICE_NAME, STRINGPOINT, 236),
+
+  /* Wait/don't wait for pipe/mutex to clarify */
+  CINIT(PIPEWAIT, LONG, 237),
+
+  /* Set the protocol used when curl is given a URL without a protocol */
+  CINIT(DEFAULT_PROTOCOL, STRINGPOINT, 238),
+
+  /* Set stream weight, 1 - 256 (default is 16) */
+  CINIT(STREAM_WEIGHT, LONG, 239),
+
+  /* Set stream dependency on another CURL handle */
+  CINIT(STREAM_DEPENDS, OBJECTPOINT, 240),
+
+  /* Set E-xclusive stream dependency on another CURL handle */
+  CINIT(STREAM_DEPENDS_E, OBJECTPOINT, 241),
+
+  /* Do not send any tftp option requests to the server */
+  CINIT(TFTP_NO_OPTIONS, LONG, 242),
+
+  /* Linked-list of host:port:connect-to-host:connect-to-port,
+     overrides the URL's host:port (only for the network layer) */
+  CINIT(CONNECT_TO, OBJECTPOINT, 243),
+
+  /* Set TCP Fast Open */
+  CINIT(TCP_FASTOPEN, LONG, 244),
+
+  /* Continue to send data if the server responds early with an
+   * HTTP status code >= 300 */
+  CINIT(KEEP_SENDING_ON_ERROR, LONG, 245),
+
+  /* The CApath or CAfile used to validate the proxy certificate
+     this option is used only if PROXY_SSL_VERIFYPEER is true */
+  CINIT(PROXY_CAINFO, STRINGPOINT, 246),
+
+  /* The CApath directory used to validate the proxy certificate
+     this option is used only if PROXY_SSL_VERIFYPEER is true */
+  CINIT(PROXY_CAPATH, STRINGPOINT, 247),
+
+  /* Set if we should verify the proxy in ssl handshake,
+     set 1 to verify. */
+  CINIT(PROXY_SSL_VERIFYPEER, LONG, 248),
+
+  /* Set if we should verify the Common name from the proxy certificate in ssl
+   * handshake, set 1 to check existence, 2 to ensure that it matches
+   * the provided hostname. */
+  CINIT(PROXY_SSL_VERIFYHOST, LONG, 249),
+
+  /* What version to specifically try to use for proxy.
+     See CURL_SSLVERSION defines below. */
+  CINIT(PROXY_SSLVERSION, LONG, 250),
+
+  /* Set a username for authenticated TLS for proxy */
+  CINIT(PROXY_TLSAUTH_USERNAME, STRINGPOINT, 251),
+
+  /* Set a password for authenticated TLS for proxy */
+  CINIT(PROXY_TLSAUTH_PASSWORD, STRINGPOINT, 252),
+
+  /* Set authentication type for authenticated TLS for proxy */
+  CINIT(PROXY_TLSAUTH_TYPE, STRINGPOINT, 253),
+
+  /* name of the file keeping your private SSL-certificate for proxy */
+  CINIT(PROXY_SSLCERT, STRINGPOINT, 254),
+
+  /* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") for
+     proxy */
+  CINIT(PROXY_SSLCERTTYPE, STRINGPOINT, 255),
+
+  /* name of the file keeping your private SSL-key for proxy */
+  CINIT(PROXY_SSLKEY, STRINGPOINT, 256),
+
+  /* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") for
+     proxy */
+  CINIT(PROXY_SSLKEYTYPE, STRINGPOINT, 257),
+
+  /* password for the SSL private key for proxy */
+  CINIT(PROXY_KEYPASSWD, STRINGPOINT, 258),
+
+  /* Specify which SSL ciphers to use for proxy */
+  CINIT(PROXY_SSL_CIPHER_LIST, STRINGPOINT, 259),
+
+  /* CRL file for proxy */
+  CINIT(PROXY_CRLFILE, STRINGPOINT, 260),
+
+  /* Enable/disable specific SSL features with a bitmask for proxy, see
+     CURLSSLOPT_* */
+  CINIT(PROXY_SSL_OPTIONS, LONG, 261),
+
+  /* Name of pre proxy to use. */
+  CINIT(PRE_PROXY, STRINGPOINT, 262),
+
+  /* The public key in DER form used to validate the proxy public key
+     this option is used only if PROXY_SSL_VERIFYPEER is true */
+  CINIT(PROXY_PINNEDPUBLICKEY, STRINGPOINT, 263),
+
+  /* Path to an abstract Unix domain socket */
+  CINIT(ABSTRACT_UNIX_SOCKET, STRINGPOINT, 264),
+
+  /* Suppress proxy CONNECT response headers from user callbacks */
+  CINIT(SUPPRESS_CONNECT_HEADERS, LONG, 265),
+
+  /* The request target, instead of extracted from the URL */
+  CINIT(REQUEST_TARGET, STRINGPOINT, 266),
+
+  /* bitmask of allowed auth methods for connections to SOCKS5 proxies */
+  CINIT(SOCKS5_AUTH, LONG, 267),
+
+  /* Enable/disable SSH compression */
+  CINIT(SSH_COMPRESSION, LONG, 268),
+
+  /* Post MIME data. */
+  CINIT(MIMEPOST, OBJECTPOINT, 269),
+
+  /* Time to use with the CURLOPT_TIMECONDITION. Specified in number of
+     seconds since 1 Jan 1970. */
+  CINIT(TIMEVALUE_LARGE, OFF_T, 270),
+
+  /* Head start in milliseconds to give happy eyeballs. */
+  CINIT(HAPPY_EYEBALLS_TIMEOUT_MS, LONG, 271),
+
+  /* Function that will be called before a resolver request is made */
+  CINIT(RESOLVER_START_FUNCTION, FUNCTIONPOINT, 272),
+
+  /* User data to pass to the resolver start callback. */
+  CINIT(RESOLVER_START_DATA, OBJECTPOINT, 273),
+
+  /* send HAProxy PROXY protocol header? */
+  CINIT(HAPROXYPROTOCOL, LONG, 274),
+
+  /* shuffle addresses before use when DNS returns multiple */
+  CINIT(DNS_SHUFFLE_ADDRESSES, LONG, 275),
+
+  /* Specify which TLS 1.3 ciphers suites to use */
+  CINIT(TLS13_CIPHERS, STRINGPOINT, 276),
+  CINIT(PROXY_TLS13_CIPHERS, STRINGPOINT, 277),
+
+  /* Disallow specifying username/login in URL. */
+  CINIT(DISALLOW_USERNAME_IN_URL, LONG, 278),
+
+  /* DNS-over-HTTPS URL */
+  CINIT(DOH_URL, STRINGPOINT, 279),
+
+  /* Preferred buffer size to use for uploads */
+  CINIT(UPLOAD_BUFFERSIZE, LONG, 280),
+
+  /* Time in ms between connection upkeep calls for long-lived connections. */
+  CINIT(UPKEEP_INTERVAL_MS, LONG, 281),
+
+  /* Specify URL using CURL URL API. */
+  CINIT(CURLU, OBJECTPOINT, 282),
+
+  /* add trailing data just after no more data is available */
+  CINIT(TRAILERFUNCTION, FUNCTIONPOINT, 283),
+
+  /* pointer to be passed to HTTP_TRAILER_FUNCTION */
+  CINIT(TRAILERDATA, OBJECTPOINT, 284),
+
+  /* set this to 1L to allow HTTP/0.9 responses or 0L to disallow */
+  CINIT(HTTP09_ALLOWED, LONG, 285),
+
+  /* alt-svc control bitmask */
+  CINIT(ALTSVC_CTRL, LONG, 286),
+
+  /* alt-svc cache file name to possibly read from/write to */
+  CINIT(ALTSVC, STRINGPOINT, 287),
+
+  /* maximum age of a connection to consider it for reuse (in seconds) */
+  CINIT(MAXAGE_CONN, LONG, 288),
+
+  CURLOPT_LASTENTRY /* the last unused */
+} CURLoption;
+
+#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all
+                          the obsolete stuff removed! */
+
+/* Backwards compatibility with older names */
+/* These are scheduled to disappear by 2011 */
+
+/* This was added in version 7.19.1 */
+#define CURLOPT_POST301 CURLOPT_POSTREDIR
+
+/* These are scheduled to disappear by 2009 */
+
+/* The following were added in 7.17.0 */
+#define CURLOPT_SSLKEYPASSWD CURLOPT_KEYPASSWD
+#define CURLOPT_FTPAPPEND CURLOPT_APPEND
+#define CURLOPT_FTPLISTONLY CURLOPT_DIRLISTONLY
+#define CURLOPT_FTP_SSL CURLOPT_USE_SSL
+
+/* The following were added earlier */
+
+#define CURLOPT_SSLCERTPASSWD CURLOPT_KEYPASSWD
+#define CURLOPT_KRB4LEVEL CURLOPT_KRBLEVEL
+
+#else
+/* This is set if CURL_NO_OLDIES is defined at compile-time */
+#undef CURLOPT_DNS_USE_GLOBAL_CACHE /* soon obsolete */
+#endif
+
+
+  /* Below here follows defines for the CURLOPT_IPRESOLVE option. If a host
+     name resolves addresses using more than one IP protocol version, this
+     option might be handy to force libcurl to use a specific IP version. */
+#define CURL_IPRESOLVE_WHATEVER 0 /* default, resolves addresses to all IP
+                                     versions that your system allows */
+#define CURL_IPRESOLVE_V4       1 /* resolve to IPv4 addresses */
+#define CURL_IPRESOLVE_V6       2 /* resolve to IPv6 addresses */
+
+  /* three convenient "aliases" that follow the name scheme better */
+#define CURLOPT_RTSPHEADER CURLOPT_HTTPHEADER
+
+  /* These enums are for use with the CURLOPT_HTTP_VERSION option. */
+enum {
+  CURL_HTTP_VERSION_NONE, /* setting this means we don't care, and that we'd
+                             like the library to choose the best possible
+                             for us! */
+  CURL_HTTP_VERSION_1_0,  /* please use HTTP 1.0 in the request */
+  CURL_HTTP_VERSION_1_1,  /* please use HTTP 1.1 in the request */
+  CURL_HTTP_VERSION_2_0,  /* please use HTTP 2 in the request */
+  CURL_HTTP_VERSION_2TLS, /* use version 2 for HTTPS, version 1.1 for HTTP */
+  CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE,  /* please use HTTP 2 without HTTP/1.1
+                                           Upgrade */
+
+  CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */
+};
+
+/* Convenience definition simple because the name of the version is HTTP/2 and
+   not 2.0. The 2_0 version of the enum name was set while the version was
+   still planned to be 2.0 and we stick to it for compatibility. */
+#define CURL_HTTP_VERSION_2 CURL_HTTP_VERSION_2_0
+
+/*
+ * Public API enums for RTSP requests
+ */
+enum {
+    CURL_RTSPREQ_NONE, /* first in list */
+    CURL_RTSPREQ_OPTIONS,
+    CURL_RTSPREQ_DESCRIBE,
+    CURL_RTSPREQ_ANNOUNCE,
+    CURL_RTSPREQ_SETUP,
+    CURL_RTSPREQ_PLAY,
+    CURL_RTSPREQ_PAUSE,
+    CURL_RTSPREQ_TEARDOWN,
+    CURL_RTSPREQ_GET_PARAMETER,
+    CURL_RTSPREQ_SET_PARAMETER,
+    CURL_RTSPREQ_RECORD,
+    CURL_RTSPREQ_RECEIVE,
+    CURL_RTSPREQ_LAST /* last in list */
+};
+
+  /* These enums are for use with the CURLOPT_NETRC option. */
+enum CURL_NETRC_OPTION {
+  CURL_NETRC_IGNORED,     /* The .netrc will never be read.
+                           * This is the default. */
+  CURL_NETRC_OPTIONAL,    /* A user:password in the URL will be preferred
+                           * to one in the .netrc. */
+  CURL_NETRC_REQUIRED,    /* A user:password in the URL will be ignored.
+                           * Unless one is set programmatically, the .netrc
+                           * will be queried. */
+  CURL_NETRC_LAST
+};
+
+enum {
+  CURL_SSLVERSION_DEFAULT,
+  CURL_SSLVERSION_TLSv1, /* TLS 1.x */
+  CURL_SSLVERSION_SSLv2,
+  CURL_SSLVERSION_SSLv3,
+  CURL_SSLVERSION_TLSv1_0,
+  CURL_SSLVERSION_TLSv1_1,
+  CURL_SSLVERSION_TLSv1_2,
+  CURL_SSLVERSION_TLSv1_3,
+
+  CURL_SSLVERSION_LAST /* never use, keep last */
+};
+
+enum {
+  CURL_SSLVERSION_MAX_NONE =     0,
+  CURL_SSLVERSION_MAX_DEFAULT =  (CURL_SSLVERSION_TLSv1   << 16),
+  CURL_SSLVERSION_MAX_TLSv1_0 =  (CURL_SSLVERSION_TLSv1_0 << 16),
+  CURL_SSLVERSION_MAX_TLSv1_1 =  (CURL_SSLVERSION_TLSv1_1 << 16),
+  CURL_SSLVERSION_MAX_TLSv1_2 =  (CURL_SSLVERSION_TLSv1_2 << 16),
+  CURL_SSLVERSION_MAX_TLSv1_3 =  (CURL_SSLVERSION_TLSv1_3 << 16),
+
+  /* never use, keep last */
+  CURL_SSLVERSION_MAX_LAST =     (CURL_SSLVERSION_LAST    << 16)
+};
+
+enum CURL_TLSAUTH {
+  CURL_TLSAUTH_NONE,
+  CURL_TLSAUTH_SRP,
+  CURL_TLSAUTH_LAST /* never use, keep last */
+};
+
+/* symbols to use with CURLOPT_POSTREDIR.
+   CURL_REDIR_POST_301, CURL_REDIR_POST_302 and CURL_REDIR_POST_303
+   can be bitwise ORed so that CURL_REDIR_POST_301 | CURL_REDIR_POST_302
+   | CURL_REDIR_POST_303 == CURL_REDIR_POST_ALL */
+
+#define CURL_REDIR_GET_ALL  0
+#define CURL_REDIR_POST_301 1
+#define CURL_REDIR_POST_302 2
+#define CURL_REDIR_POST_303 4
+#define CURL_REDIR_POST_ALL \
+    (CURL_REDIR_POST_301|CURL_REDIR_POST_302|CURL_REDIR_POST_303)
+
+typedef enum {
+  CURL_TIMECOND_NONE,
+
+  CURL_TIMECOND_IFMODSINCE,
+  CURL_TIMECOND_IFUNMODSINCE,
+  CURL_TIMECOND_LASTMOD,
+
+  CURL_TIMECOND_LAST
+} curl_TimeCond;
+
+/* Special size_t value signaling a zero-terminated string. */
+#define CURL_ZERO_TERMINATED ((size_t) -1)
+
+/* curl_strequal() and curl_strnequal() are subject for removal in a future
+   release */
+CURL_EXTERN int curl_strequal(const char *s1, const char *s2);
+CURL_EXTERN int curl_strnequal(const char *s1, const char *s2, size_t n);
+
+/* Mime/form handling support. */
+typedef struct curl_mime_s      curl_mime;      /* Mime context. */
+typedef struct curl_mimepart_s  curl_mimepart;  /* Mime part context. */
+
+/*
+ * NAME curl_mime_init()
+ *
+ * DESCRIPTION
+ *
+ * Create a mime context and return its handle. The easy parameter is the
+ * target handle.
+ */
+CURL_EXTERN curl_mime *curl_mime_init(CURL *easy);
+
+/*
+ * NAME curl_mime_free()
+ *
+ * DESCRIPTION
+ *
+ * release a mime handle and its substructures.
+ */
+CURL_EXTERN void curl_mime_free(curl_mime *mime);
+
+/*
+ * NAME curl_mime_addpart()
+ *
+ * DESCRIPTION
+ *
+ * Append a new empty part to the given mime context and return a handle to
+ * the created part.
+ */
+CURL_EXTERN curl_mimepart *curl_mime_addpart(curl_mime *mime);
+
+/*
+ * NAME curl_mime_name()
+ *
+ * DESCRIPTION
+ *
+ * Set mime/form part name.
+ */
+CURL_EXTERN CURLcode curl_mime_name(curl_mimepart *part, const char *name);
+
+/*
+ * NAME curl_mime_filename()
+ *
+ * DESCRIPTION
+ *
+ * Set mime part remote file name.
+ */
+CURL_EXTERN CURLcode curl_mime_filename(curl_mimepart *part,
+                                        const char *filename);
+
+/*
+ * NAME curl_mime_type()
+ *
+ * DESCRIPTION
+ *
+ * Set mime part type.
+ */
+CURL_EXTERN CURLcode curl_mime_type(curl_mimepart *part, const char *mimetype);
+
+/*
+ * NAME curl_mime_encoder()
+ *
+ * DESCRIPTION
+ *
+ * Set mime data transfer encoder.
+ */
+CURL_EXTERN CURLcode curl_mime_encoder(curl_mimepart *part,
+                                       const char *encoding);
+
+/*
+ * NAME curl_mime_data()
+ *
+ * DESCRIPTION
+ *
+ * Set mime part data source from memory data,
+ */
+CURL_EXTERN CURLcode curl_mime_data(curl_mimepart *part,
+                                    const char *data, size_t datasize);
+
+/*
+ * NAME curl_mime_filedata()
+ *
+ * DESCRIPTION
+ *
+ * Set mime part data source from named file.
+ */
+CURL_EXTERN CURLcode curl_mime_filedata(curl_mimepart *part,
+                                        const char *filename);
+
+/*
+ * NAME curl_mime_data_cb()
+ *
+ * DESCRIPTION
+ *
+ * Set mime part data source from callback function.
+ */
+CURL_EXTERN CURLcode curl_mime_data_cb(curl_mimepart *part,
+                                       curl_off_t datasize,
+                                       curl_read_callback readfunc,
+                                       curl_seek_callback seekfunc,
+                                       curl_free_callback freefunc,
+                                       void *arg);
+
+/*
+ * NAME curl_mime_subparts()
+ *
+ * DESCRIPTION
+ *
+ * Set mime part data source from subparts.
+ */
+CURL_EXTERN CURLcode curl_mime_subparts(curl_mimepart *part,
+                                        curl_mime *subparts);
+/*
+ * NAME curl_mime_headers()
+ *
+ * DESCRIPTION
+ *
+ * Set mime part headers.
+ */
+CURL_EXTERN CURLcode curl_mime_headers(curl_mimepart *part,
+                                       struct curl_slist *headers,
+                                       int take_ownership);
+
+/* Old form API. */
+/* name is uppercase CURLFORM_<name> */
+#ifdef CFINIT
+#undef CFINIT
+#endif
+
+#ifdef CURL_ISOCPP
+#define CFINIT(name) CURLFORM_ ## name
+#else
+/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */
+#define CFINIT(name) CURLFORM_/**/name
+#endif
+
+typedef enum {
+  CFINIT(NOTHING),        /********* the first one is unused ************/
+
+  /*  */
+  CFINIT(COPYNAME),
+  CFINIT(PTRNAME),
+  CFINIT(NAMELENGTH),
+  CFINIT(COPYCONTENTS),
+  CFINIT(PTRCONTENTS),
+  CFINIT(CONTENTSLENGTH),
+  CFINIT(FILECONTENT),
+  CFINIT(ARRAY),
+  CFINIT(OBSOLETE),
+  CFINIT(FILE),
+
+  CFINIT(BUFFER),
+  CFINIT(BUFFERPTR),
+  CFINIT(BUFFERLENGTH),
+
+  CFINIT(CONTENTTYPE),
+  CFINIT(CONTENTHEADER),
+  CFINIT(FILENAME),
+  CFINIT(END),
+  CFINIT(OBSOLETE2),
+
+  CFINIT(STREAM),
+  CFINIT(CONTENTLEN), /* added in 7.46.0, provide a curl_off_t length */
+
+  CURLFORM_LASTENTRY /* the last unused */
+} CURLformoption;
+
+#undef CFINIT /* done */
+
+/* structure to be used as parameter for CURLFORM_ARRAY */
+struct curl_forms {
+  CURLformoption option;
+  const char     *value;
+};
+
+/* use this for multipart formpost building */
+/* Returns code for curl_formadd()
+ *
+ * Returns:
+ * CURL_FORMADD_OK             on success
+ * CURL_FORMADD_MEMORY         if the FormInfo allocation fails
+ * CURL_FORMADD_OPTION_TWICE   if one option is given twice for one Form
+ * CURL_FORMADD_NULL           if a null pointer was given for a char
+ * CURL_FORMADD_MEMORY         if the allocation of a FormInfo struct failed
+ * CURL_FORMADD_UNKNOWN_OPTION if an unknown option was used
+ * CURL_FORMADD_INCOMPLETE     if the some FormInfo is not complete (or error)
+ * CURL_FORMADD_MEMORY         if a curl_httppost struct cannot be allocated
+ * CURL_FORMADD_MEMORY         if some allocation for string copying failed.
+ * CURL_FORMADD_ILLEGAL_ARRAY  if an illegal option is used in an array
+ *
+ ***************************************************************************/
+typedef enum {
+  CURL_FORMADD_OK, /* first, no error */
+
+  CURL_FORMADD_MEMORY,
+  CURL_FORMADD_OPTION_TWICE,
+  CURL_FORMADD_NULL,
+  CURL_FORMADD_UNKNOWN_OPTION,
+  CURL_FORMADD_INCOMPLETE,
+  CURL_FORMADD_ILLEGAL_ARRAY,
+  CURL_FORMADD_DISABLED, /* libcurl was built with this disabled */
+
+  CURL_FORMADD_LAST /* last */
+} CURLFORMcode;
+
+/*
+ * NAME curl_formadd()
+ *
+ * DESCRIPTION
+ *
+ * Pretty advanced function for building multi-part formposts. Each invoke
+ * adds one part that together construct a full post. Then use
+ * CURLOPT_HTTPPOST to send it off to libcurl.
+ */
+CURL_EXTERN CURLFORMcode curl_formadd(struct curl_httppost **httppost,
+                                      struct curl_httppost **last_post,
+                                      ...);
+
+/*
+ * callback function for curl_formget()
+ * The void *arg pointer will be the one passed as second argument to
+ *   curl_formget().
+ * The character buffer passed to it must not be freed.
+ * Should return the buffer length passed to it as the argument "len" on
+ *   success.
+ */
+typedef size_t (*curl_formget_callback)(void *arg, const char *buf,
+                                        size_t len);
+
+/*
+ * NAME curl_formget()
+ *
+ * DESCRIPTION
+ *
+ * Serialize a curl_httppost struct built with curl_formadd().
+ * Accepts a void pointer as second argument which will be passed to
+ * the curl_formget_callback function.
+ * Returns 0 on success.
+ */
+CURL_EXTERN int curl_formget(struct curl_httppost *form, void *arg,
+                             curl_formget_callback append);
+/*
+ * NAME curl_formfree()
+ *
+ * DESCRIPTION
+ *
+ * Free a multipart formpost previously built with curl_formadd().
+ */
+CURL_EXTERN void curl_formfree(struct curl_httppost *form);
+
+/*
+ * NAME curl_getenv()
+ *
+ * DESCRIPTION
+ *
+ * Returns a malloc()'ed string that MUST be curl_free()ed after usage is
+ * complete. DEPRECATED - see lib/README.curlx
+ */
+CURL_EXTERN char *curl_getenv(const char *variable);
+
+/*
+ * NAME curl_version()
+ *
+ * DESCRIPTION
+ *
+ * Returns a static ascii string of the libcurl version.
+ */
+CURL_EXTERN char *curl_version(void);
+
+/*
+ * NAME curl_easy_escape()
+ *
+ * DESCRIPTION
+ *
+ * Escapes URL strings (converts all letters consider illegal in URLs to their
+ * %XX versions). This function returns a new allocated string or NULL if an
+ * error occurred.
+ */
+CURL_EXTERN char *curl_easy_escape(CURL *handle,
+                                   const char *string,
+                                   int length);
+
+/* the previous version: */
+CURL_EXTERN char *curl_escape(const char *string,
+                              int length);
+
+
+/*
+ * NAME curl_easy_unescape()
+ *
+ * DESCRIPTION
+ *
+ * Unescapes URL encoding in strings (converts all %XX codes to their 8bit
+ * versions). This function returns a new allocated string or NULL if an error
+ * occurred.
+ * Conversion Note: On non-ASCII platforms the ASCII %XX codes are
+ * converted into the host encoding.
+ */
+CURL_EXTERN char *curl_easy_unescape(CURL *handle,
+                                     const char *string,
+                                     int length,
+                                     int *outlength);
+
+/* the previous version */
+CURL_EXTERN char *curl_unescape(const char *string,
+                                int length);
+
+/*
+ * NAME curl_free()
+ *
+ * DESCRIPTION
+ *
+ * Provided for de-allocation in the same translation unit that did the
+ * allocation. Added in libcurl 7.10
+ */
+CURL_EXTERN void curl_free(void *p);
+
+/*
+ * NAME curl_global_init()
+ *
+ * DESCRIPTION
+ *
+ * curl_global_init() should be invoked exactly once for each application that
+ * uses libcurl and before any call of other libcurl functions.
+ *
+ * This function is not thread-safe!
+ */
+CURL_EXTERN CURLcode curl_global_init(long flags);
+
+/*
+ * NAME curl_global_init_mem()
+ *
+ * DESCRIPTION
+ *
+ * curl_global_init() or curl_global_init_mem() should be invoked exactly once
+ * for each application that uses libcurl.  This function can be used to
+ * initialize libcurl and set user defined memory management callback
+ * functions.  Users can implement memory management routines to check for
+ * memory leaks, check for mis-use of the curl library etc.  User registered
+ * callback routines with be invoked by this library instead of the system
+ * memory management routines like malloc, free etc.
+ */
+CURL_EXTERN CURLcode curl_global_init_mem(long flags,
+                                          curl_malloc_callback m,
+                                          curl_free_callback f,
+                                          curl_realloc_callback r,
+                                          curl_strdup_callback s,
+                                          curl_calloc_callback c);
+
+/*
+ * NAME curl_global_cleanup()
+ *
+ * DESCRIPTION
+ *
+ * curl_global_cleanup() should be invoked exactly once for each application
+ * that uses libcurl
+ */
+CURL_EXTERN void curl_global_cleanup(void);
+
+/* linked-list structure for the CURLOPT_QUOTE option (and other) */
+struct curl_slist {
+  char *data;
+  struct curl_slist *next;
+};
+
+/*
+ * NAME curl_global_sslset()
+ *
+ * DESCRIPTION
+ *
+ * When built with multiple SSL backends, curl_global_sslset() allows to
+ * choose one. This function can only be called once, and it must be called
+ * *before* curl_global_init().
+ *
+ * The backend can be identified by the id (e.g. CURLSSLBACKEND_OPENSSL). The
+ * backend can also be specified via the name parameter (passing -1 as id).
+ * If both id and name are specified, the name will be ignored. If neither id
+ * nor name are specified, the function will fail with
+ * CURLSSLSET_UNKNOWN_BACKEND and set the "avail" pointer to the
+ * NULL-terminated list of available backends.
+ *
+ * Upon success, the function returns CURLSSLSET_OK.
+ *
+ * If the specified SSL backend is not available, the function returns
+ * CURLSSLSET_UNKNOWN_BACKEND and sets the "avail" pointer to a NULL-terminated
+ * list of available SSL backends.
+ *
+ * The SSL backend can be set only once. If it has already been set, a
+ * subsequent attempt to change it will result in a CURLSSLSET_TOO_LATE.
+ */
+
+typedef struct {
+  curl_sslbackend id;
+  const char *name;
+} curl_ssl_backend;
+
+typedef enum {
+  CURLSSLSET_OK = 0,
+  CURLSSLSET_UNKNOWN_BACKEND,
+  CURLSSLSET_TOO_LATE,
+  CURLSSLSET_NO_BACKENDS /* libcurl was built without any SSL support */
+} CURLsslset;
+
+CURL_EXTERN CURLsslset curl_global_sslset(curl_sslbackend id, const char *name,
+                                          const curl_ssl_backend ***avail);
+
+/*
+ * NAME curl_slist_append()
+ *
+ * DESCRIPTION
+ *
+ * Appends a string to a linked list. If no list exists, it will be created
+ * first. Returns the new list, after appending.
+ */
+CURL_EXTERN struct curl_slist *curl_slist_append(struct curl_slist *,
+                                                 const char *);
+
+/*
+ * NAME curl_slist_free_all()
+ *
+ * DESCRIPTION
+ *
+ * free a previously built curl_slist.
+ */
+CURL_EXTERN void curl_slist_free_all(struct curl_slist *);
+
+/*
+ * NAME curl_getdate()
+ *
+ * DESCRIPTION
+ *
+ * Returns the time, in seconds since 1 Jan 1970 of the time string given in
+ * the first argument. The time argument in the second parameter is unused
+ * and should be set to NULL.
+ */
+CURL_EXTERN time_t curl_getdate(const char *p, const time_t *unused);
+
+/* info about the certificate chain, only for OpenSSL, GnuTLS, Schannel, NSS
+   and GSKit builds. Asked for with CURLOPT_CERTINFO / CURLINFO_CERTINFO */
+struct curl_certinfo {
+  int num_of_certs;             /* number of certificates with information */
+  struct curl_slist **certinfo; /* for each index in this array, there's a
+                                   linked list with textual information in the
+                                   format "name: value" */
+};
+
+/* Information about the SSL library used and the respective internal SSL
+   handle, which can be used to obtain further information regarding the
+   connection. Asked for with CURLINFO_TLS_SSL_PTR or CURLINFO_TLS_SESSION. */
+struct curl_tlssessioninfo {
+  curl_sslbackend backend;
+  void *internals;
+};
+
+#define CURLINFO_STRING   0x100000
+#define CURLINFO_LONG     0x200000
+#define CURLINFO_DOUBLE   0x300000
+#define CURLINFO_SLIST    0x400000
+#define CURLINFO_PTR      0x400000 /* same as SLIST */
+#define CURLINFO_SOCKET   0x500000
+#define CURLINFO_OFF_T    0x600000
+#define CURLINFO_MASK     0x0fffff
+#define CURLINFO_TYPEMASK 0xf00000
+
+typedef enum {
+  CURLINFO_NONE, /* first, never use this */
+  CURLINFO_EFFECTIVE_URL    = CURLINFO_STRING + 1,
+  CURLINFO_RESPONSE_CODE    = CURLINFO_LONG   + 2,
+  CURLINFO_TOTAL_TIME       = CURLINFO_DOUBLE + 3,
+  CURLINFO_NAMELOOKUP_TIME  = CURLINFO_DOUBLE + 4,
+  CURLINFO_CONNECT_TIME     = CURLINFO_DOUBLE + 5,
+  CURLINFO_PRETRANSFER_TIME = CURLINFO_DOUBLE + 6,
+  CURLINFO_SIZE_UPLOAD      = CURLINFO_DOUBLE + 7,
+  CURLINFO_SIZE_UPLOAD_T    = CURLINFO_OFF_T  + 7,
+  CURLINFO_SIZE_DOWNLOAD    = CURLINFO_DOUBLE + 8,
+  CURLINFO_SIZE_DOWNLOAD_T  = CURLINFO_OFF_T  + 8,
+  CURLINFO_SPEED_DOWNLOAD   = CURLINFO_DOUBLE + 9,
+  CURLINFO_SPEED_DOWNLOAD_T = CURLINFO_OFF_T  + 9,
+  CURLINFO_SPEED_UPLOAD     = CURLINFO_DOUBLE + 10,
+  CURLINFO_SPEED_UPLOAD_T   = CURLINFO_OFF_T  + 10,
+  CURLINFO_HEADER_SIZE      = CURLINFO_LONG   + 11,
+  CURLINFO_REQUEST_SIZE     = CURLINFO_LONG   + 12,
+  CURLINFO_SSL_VERIFYRESULT = CURLINFO_LONG   + 13,
+  CURLINFO_FILETIME         = CURLINFO_LONG   + 14,
+  CURLINFO_FILETIME_T       = CURLINFO_OFF_T  + 14,
+  CURLINFO_CONTENT_LENGTH_DOWNLOAD   = CURLINFO_DOUBLE + 15,
+  CURLINFO_CONTENT_LENGTH_DOWNLOAD_T = CURLINFO_OFF_T  + 15,
+  CURLINFO_CONTENT_LENGTH_UPLOAD     = CURLINFO_DOUBLE + 16,
+  CURLINFO_CONTENT_LENGTH_UPLOAD_T   = CURLINFO_OFF_T  + 16,
+  CURLINFO_STARTTRANSFER_TIME = CURLINFO_DOUBLE + 17,
+  CURLINFO_CONTENT_TYPE     = CURLINFO_STRING + 18,
+  CURLINFO_REDIRECT_TIME    = CURLINFO_DOUBLE + 19,
+  CURLINFO_REDIRECT_COUNT   = CURLINFO_LONG   + 20,
+  CURLINFO_PRIVATE          = CURLINFO_STRING + 21,
+  CURLINFO_HTTP_CONNECTCODE = CURLINFO_LONG   + 22,
+  CURLINFO_HTTPAUTH_AVAIL   = CURLINFO_LONG   + 23,
+  CURLINFO_PROXYAUTH_AVAIL  = CURLINFO_LONG   + 24,
+  CURLINFO_OS_ERRNO         = CURLINFO_LONG   + 25,
+  CURLINFO_NUM_CONNECTS     = CURLINFO_LONG   + 26,
+  CURLINFO_SSL_ENGINES      = CURLINFO_SLIST  + 27,
+  CURLINFO_COOKIELIST       = CURLINFO_SLIST  + 28,
+  CURLINFO_LASTSOCKET       = CURLINFO_LONG   + 29,
+  CURLINFO_FTP_ENTRY_PATH   = CURLINFO_STRING + 30,
+  CURLINFO_REDIRECT_URL     = CURLINFO_STRING + 31,
+  CURLINFO_PRIMARY_IP       = CURLINFO_STRING + 32,
+  CURLINFO_APPCONNECT_TIME  = CURLINFO_DOUBLE + 33,
+  CURLINFO_CERTINFO         = CURLINFO_PTR    + 34,
+  CURLINFO_CONDITION_UNMET  = CURLINFO_LONG   + 35,
+  CURLINFO_RTSP_SESSION_ID  = CURLINFO_STRING + 36,
+  CURLINFO_RTSP_CLIENT_CSEQ = CURLINFO_LONG   + 37,
+  CURLINFO_RTSP_SERVER_CSEQ = CURLINFO_LONG   + 38,
+  CURLINFO_RTSP_CSEQ_RECV   = CURLINFO_LONG   + 39,
+  CURLINFO_PRIMARY_PORT     = CURLINFO_LONG   + 40,
+  CURLINFO_LOCAL_IP         = CURLINFO_STRING + 41,
+  CURLINFO_LOCAL_PORT       = CURLINFO_LONG   + 42,
+  CURLINFO_TLS_SESSION      = CURLINFO_PTR    + 43,
+  CURLINFO_ACTIVESOCKET     = CURLINFO_SOCKET + 44,
+  CURLINFO_TLS_SSL_PTR      = CURLINFO_PTR    + 45,
+  CURLINFO_HTTP_VERSION     = CURLINFO_LONG   + 46,
+  CURLINFO_PROXY_SSL_VERIFYRESULT = CURLINFO_LONG + 47,
+  CURLINFO_PROTOCOL         = CURLINFO_LONG   + 48,
+  CURLINFO_SCHEME           = CURLINFO_STRING + 49,
+  /* Fill in new entries below here! */
+
+  /* Preferably these would be defined conditionally based on the
+     sizeof curl_off_t being 64-bits */
+  CURLINFO_TOTAL_TIME_T     = CURLINFO_OFF_T + 50,
+  CURLINFO_NAMELOOKUP_TIME_T = CURLINFO_OFF_T + 51,
+  CURLINFO_CONNECT_TIME_T   = CURLINFO_OFF_T + 52,
+  CURLINFO_PRETRANSFER_TIME_T = CURLINFO_OFF_T + 53,
+  CURLINFO_STARTTRANSFER_TIME_T = CURLINFO_OFF_T + 54,
+  CURLINFO_REDIRECT_TIME_T  = CURLINFO_OFF_T + 55,
+  CURLINFO_APPCONNECT_TIME_T = CURLINFO_OFF_T + 56,
+
+  CURLINFO_LASTONE          = 56
+} CURLINFO;
+
+/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as
+   CURLINFO_HTTP_CODE */
+#define CURLINFO_HTTP_CODE CURLINFO_RESPONSE_CODE
+
+typedef enum {
+  CURLCLOSEPOLICY_NONE, /* first, never use this */
+
+  CURLCLOSEPOLICY_OLDEST,
+  CURLCLOSEPOLICY_LEAST_RECENTLY_USED,
+  CURLCLOSEPOLICY_LEAST_TRAFFIC,
+  CURLCLOSEPOLICY_SLOWEST,
+  CURLCLOSEPOLICY_CALLBACK,
+
+  CURLCLOSEPOLICY_LAST /* last, never use this */
+} curl_closepolicy;
+
+#define CURL_GLOBAL_SSL (1<<0) /* no purpose since since 7.57.0 */
+#define CURL_GLOBAL_WIN32 (1<<1)
+#define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32)
+#define CURL_GLOBAL_NOTHING 0
+#define CURL_GLOBAL_DEFAULT CURL_GLOBAL_ALL
+#define CURL_GLOBAL_ACK_EINTR (1<<2)
+
+
+/*****************************************************************************
+ * Setup defines, protos etc for the sharing stuff.
+ */
+
+/* Different data locks for a single share */
+typedef enum {
+  CURL_LOCK_DATA_NONE = 0,
+  /*  CURL_LOCK_DATA_SHARE is used internally to say that
+   *  the locking is just made to change the internal state of the share
+   *  itself.
+   */
+  CURL_LOCK_DATA_SHARE,
+  CURL_LOCK_DATA_COOKIE,
+  CURL_LOCK_DATA_DNS,
+  CURL_LOCK_DATA_SSL_SESSION,
+  CURL_LOCK_DATA_CONNECT,
+  CURL_LOCK_DATA_PSL,
+  CURL_LOCK_DATA_LAST
+} curl_lock_data;
+
+/* Different lock access types */
+typedef enum {
+  CURL_LOCK_ACCESS_NONE = 0,   /* unspecified action */
+  CURL_LOCK_ACCESS_SHARED = 1, /* for read perhaps */
+  CURL_LOCK_ACCESS_SINGLE = 2, /* for write perhaps */
+  CURL_LOCK_ACCESS_LAST        /* never use */
+} curl_lock_access;
+
+typedef void (*curl_lock_function)(CURL *handle,
+                                   curl_lock_data data,
+                                   curl_lock_access locktype,
+                                   void *userptr);
+typedef void (*curl_unlock_function)(CURL *handle,
+                                     curl_lock_data data,
+                                     void *userptr);
+
+
+typedef enum {
+  CURLSHE_OK,  /* all is fine */
+  CURLSHE_BAD_OPTION, /* 1 */
+  CURLSHE_IN_USE,     /* 2 */
+  CURLSHE_INVALID,    /* 3 */
+  CURLSHE_NOMEM,      /* 4 out of memory */
+  CURLSHE_NOT_BUILT_IN, /* 5 feature not present in lib */
+  CURLSHE_LAST        /* never use */
+} CURLSHcode;
+
+typedef enum {
+  CURLSHOPT_NONE,  /* don't use */
+  CURLSHOPT_SHARE,   /* specify a data type to share */
+  CURLSHOPT_UNSHARE, /* specify which data type to stop sharing */
+  CURLSHOPT_LOCKFUNC,   /* pass in a 'curl_lock_function' pointer */
+  CURLSHOPT_UNLOCKFUNC, /* pass in a 'curl_unlock_function' pointer */
+  CURLSHOPT_USERDATA,   /* pass in a user data pointer used in the lock/unlock
+                           callback functions */
+  CURLSHOPT_LAST  /* never use */
+} CURLSHoption;
+
+CURL_EXTERN CURLSH *curl_share_init(void);
+CURL_EXTERN CURLSHcode curl_share_setopt(CURLSH *, CURLSHoption option, ...);
+CURL_EXTERN CURLSHcode curl_share_cleanup(CURLSH *);
+
+/****************************************************************************
+ * Structures for querying information about the curl library at runtime.
+ */
+
+typedef enum {
+  CURLVERSION_FIRST,
+  CURLVERSION_SECOND,
+  CURLVERSION_THIRD,
+  CURLVERSION_FOURTH,
+  CURLVERSION_FIFTH,
+  CURLVERSION_LAST /* never actually use this */
+} CURLversion;
+
+/* The 'CURLVERSION_NOW' is the symbolic name meant to be used by
+   basically all programs ever that want to get version information. It is
+   meant to be a built-in version number for what kind of struct the caller
+   expects. If the struct ever changes, we redefine the NOW to another enum
+   from above. */
+#define CURLVERSION_NOW CURLVERSION_FIFTH
+
+typedef struct {
+  CURLversion age;          /* age of the returned struct */
+  const char *version;      /* LIBCURL_VERSION */
+  unsigned int version_num; /* LIBCURL_VERSION_NUM */
+  const char *host;         /* OS/host/cpu/machine when configured */
+  int features;             /* bitmask, see defines below */
+  const char *ssl_version;  /* human readable string */
+  long ssl_version_num;     /* not used anymore, always 0 */
+  const char *libz_version; /* human readable string */
+  /* protocols is terminated by an entry with a NULL protoname */
+  const char * const *protocols;
+
+  /* The fields below this were added in CURLVERSION_SECOND */
+  const char *ares;
+  int ares_num;
+
+  /* This field was added in CURLVERSION_THIRD */
+  const char *libidn;
+
+  /* These field were added in CURLVERSION_FOURTH */
+
+  /* Same as '_libiconv_version' if built with HAVE_ICONV */
+  int iconv_ver_num;
+
+  const char *libssh_version; /* human readable string */
+
+  /* These fields were added in CURLVERSION_FIFTH */
+
+  unsigned int brotli_ver_num; /* Numeric Brotli version
+                                  (MAJOR << 24) | (MINOR << 12) | PATCH */
+  const char *brotli_version; /* human readable string. */
+
+} curl_version_info_data;
+
+#define CURL_VERSION_IPV6         (1<<0)  /* IPv6-enabled */
+#define CURL_VERSION_KERBEROS4    (1<<1)  /* Kerberos V4 auth is supported
+                                             (deprecated) */
+#define CURL_VERSION_SSL          (1<<2)  /* SSL options are present */
+#define CURL_VERSION_LIBZ         (1<<3)  /* libz features are present */
+#define CURL_VERSION_NTLM         (1<<4)  /* NTLM auth is supported */
+#define CURL_VERSION_GSSNEGOTIATE (1<<5)  /* Negotiate auth is supported
+                                             (deprecated) */
+#define CURL_VERSION_DEBUG        (1<<6)  /* Built with debug capabilities */
+#define CURL_VERSION_ASYNCHDNS    (1<<7)  /* Asynchronous DNS resolves */
+#define CURL_VERSION_SPNEGO       (1<<8)  /* SPNEGO auth is supported */
+#define CURL_VERSION_LARGEFILE    (1<<9)  /* Supports files larger than 2GB */
+#define CURL_VERSION_IDN          (1<<10) /* Internationized Domain Names are
+                                             supported */
+#define CURL_VERSION_SSPI         (1<<11) /* Built against Windows SSPI */
+#define CURL_VERSION_CONV         (1<<12) /* Character conversions supported */
+#define CURL_VERSION_CURLDEBUG    (1<<13) /* Debug memory tracking supported */
+#define CURL_VERSION_TLSAUTH_SRP  (1<<14) /* TLS-SRP auth is supported */
+#define CURL_VERSION_NTLM_WB      (1<<15) /* NTLM delegation to winbind helper
+                                             is supported */
+#define CURL_VERSION_HTTP2        (1<<16) /* HTTP2 support built-in */
+#define CURL_VERSION_GSSAPI       (1<<17) /* Built against a GSS-API library */
+#define CURL_VERSION_KERBEROS5    (1<<18) /* Kerberos V5 auth is supported */
+#define CURL_VERSION_UNIX_SOCKETS (1<<19) /* Unix domain sockets support */
+#define CURL_VERSION_PSL          (1<<20) /* Mozilla's Public Suffix List, used
+                                             for cookie domain verification */
+#define CURL_VERSION_HTTPS_PROXY  (1<<21) /* HTTPS-proxy support built-in */
+#define CURL_VERSION_MULTI_SSL    (1<<22) /* Multiple SSL backends available */
+#define CURL_VERSION_BROTLI       (1<<23) /* Brotli features are present. */
+#define CURL_VERSION_ALTSVC       (1<<24) /* Alt-Svc handling built-in */
+
+ /*
+ * NAME curl_version_info()
+ *
+ * DESCRIPTION
+ *
+ * This function returns a pointer to a static copy of the version info
+ * struct. See above.
+ */
+CURL_EXTERN curl_version_info_data *curl_version_info(CURLversion);
+
+/*
+ * NAME curl_easy_strerror()
+ *
+ * DESCRIPTION
+ *
+ * The curl_easy_strerror function may be used to turn a CURLcode value
+ * into the equivalent human readable error string.  This is useful
+ * for printing meaningful error messages.
+ */
+CURL_EXTERN const char *curl_easy_strerror(CURLcode);
+
+/*
+ * NAME curl_share_strerror()
+ *
+ * DESCRIPTION
+ *
+ * The curl_share_strerror function may be used to turn a CURLSHcode value
+ * into the equivalent human readable error string.  This is useful
+ * for printing meaningful error messages.
+ */
+CURL_EXTERN const char *curl_share_strerror(CURLSHcode);
+
+/*
+ * NAME curl_easy_pause()
+ *
+ * DESCRIPTION
+ *
+ * The curl_easy_pause function pauses or unpauses transfers. Select the new
+ * state by setting the bitmask, use the convenience defines below.
+ *
+ */
+CURL_EXTERN CURLcode curl_easy_pause(CURL *handle, int bitmask);
+
+#define CURLPAUSE_RECV      (1<<0)
+#define CURLPAUSE_RECV_CONT (0)
+
+#define CURLPAUSE_SEND      (1<<2)
+#define CURLPAUSE_SEND_CONT (0)
+
+#define CURLPAUSE_ALL       (CURLPAUSE_RECV|CURLPAUSE_SEND)
+#define CURLPAUSE_CONT      (CURLPAUSE_RECV_CONT|CURLPAUSE_SEND_CONT)
+
+#ifdef  __cplusplus
+}
+#endif
+
+/* unfortunately, the easy.h and multi.h include files need options and info
+  stuff before they can be included! */
+#include "easy.h" /* nothing in curl is fun without the easy stuff */
+#include "multi.h"
+#include "urlapi.h"
+
+/* the typechecker doesn't work in C++ (yet) */
+#if defined(__GNUC__) && defined(__GNUC_MINOR__) && \
+    ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && \
+    !defined(__cplusplus) && !defined(CURL_DISABLE_TYPECHECK)
+#include "typecheck-gcc.h"
+#else
+#if defined(__STDC__) && (__STDC__ >= 1)
+/* This preprocessor magic that replaces a call with the exact same call is
+   only done to make sure application authors pass exactly three arguments
+   to these functions. */
+#define curl_easy_setopt(handle,opt,param) curl_easy_setopt(handle,opt,param)
+#define curl_easy_getinfo(handle,info,arg) curl_easy_getinfo(handle,info,arg)
+#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param)
+#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param)
+#endif /* __STDC__ >= 1 */
+#endif /* gcc >= 4.3 && !__cplusplus */
+
+#endif /* __CURL_CURL_H */
diff --git a/components/cronet/third_party/curl_headers/include/curl/curlver.h b/components/cronet/third_party/curl_headers/include/curl/curlver.h
new file mode 100644
index 0000000..4afe4a9
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/include/curl/curlver.h
@@ -0,0 +1,77 @@
+#ifndef __CURL_CURLVER_H
+#define __CURL_CURLVER_H
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* This header file contains nothing but libcurl version info, generated by
+   a script at release-time. This was made its own header file in 7.11.2 */
+
+/* This is the global package copyright */
+#define LIBCURL_COPYRIGHT "1996 - 2019 Daniel Stenberg, <daniel@haxx.se>."
+
+/* This is the version number of the libcurl package from which this header
+   file origins: */
+#define LIBCURL_VERSION "7.65.1-DEV"
+
+/* The numeric version number is also available "in parts" by using these
+   defines: */
+#define LIBCURL_VERSION_MAJOR 7
+#define LIBCURL_VERSION_MINOR 65
+#define LIBCURL_VERSION_PATCH 1
+
+/* This is the numeric version of the libcurl version number, meant for easier
+   parsing and comparions by programs. The LIBCURL_VERSION_NUM define will
+   always follow this syntax:
+
+         0xXXYYZZ
+
+   Where XX, YY and ZZ are the main version, release and patch numbers in
+   hexadecimal (using 8 bits each). All three numbers are always represented
+   using two digits.  1.2 would appear as "0x010200" while version 9.11.7
+   appears as "0x090b07".
+
+   This 6-digit (24 bits) hexadecimal number does not show pre-release number,
+   and it is always a greater number in a more recent release. It makes
+   comparisons with greater than and less than work.
+
+   Note: This define is the full hex number and _does not_ use the
+   CURL_VERSION_BITS() macro since curl's own configure script greps for it
+   and needs it to contain the full number.
+*/
+#define LIBCURL_VERSION_NUM 0x074101
+
+/*
+ * This is the date and time when the full source package was created. The
+ * timestamp is not stored in git, as the timestamp is properly set in the
+ * tarballs by the maketgz script.
+ *
+ * The format of the date follows this template:
+ *
+ * "2007-11-23"
+ */
+#define LIBCURL_TIMESTAMP "[unreleased]"
+
+#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|(z))
+#define CURL_AT_LEAST_VERSION(x,y,z) \
+  (LIBCURL_VERSION_NUM >= CURL_VERSION_BITS(x, y, z))
+
+#endif /* __CURL_CURLVER_H */
diff --git a/components/cronet/third_party/curl_headers/include/curl/easy.h b/components/cronet/third_party/curl_headers/include/curl/easy.h
new file mode 100644
index 0000000..f42a8a9
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/include/curl/easy.h
@@ -0,0 +1,112 @@
+#ifndef __CURL_EASY_H
+#define __CURL_EASY_H
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+CURL_EXTERN CURL *curl_easy_init(void);
+CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);
+CURL_EXTERN CURLcode curl_easy_perform(CURL *curl);
+CURL_EXTERN void curl_easy_cleanup(CURL *curl);
+
+/*
+ * NAME curl_easy_getinfo()
+ *
+ * DESCRIPTION
+ *
+ * Request internal information from the curl session with this function.  The
+ * third argument MUST be a pointer to a long, a pointer to a char * or a
+ * pointer to a double (as the documentation describes elsewhere).  The data
+ * pointed to will be filled in accordingly and can be relied upon only if the
+ * function returns CURLE_OK.  This function is intended to get used *AFTER* a
+ * performed transfer, all results from this function are undefined until the
+ * transfer is completed.
+ */
+CURL_EXTERN CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...);
+
+
+/*
+ * NAME curl_easy_duphandle()
+ *
+ * DESCRIPTION
+ *
+ * Creates a new curl session handle with the same options set for the handle
+ * passed in. Duplicating a handle could only be a matter of cloning data and
+ * options, internal state info and things like persistent connections cannot
+ * be transferred. It is useful in multithreaded applications when you can run
+ * curl_easy_duphandle() for each new thread to avoid a series of identical
+ * curl_easy_setopt() invokes in every thread.
+ */
+CURL_EXTERN CURL *curl_easy_duphandle(CURL *curl);
+
+/*
+ * NAME curl_easy_reset()
+ *
+ * DESCRIPTION
+ *
+ * Re-initializes a CURL handle to the default values. This puts back the
+ * handle to the same state as it was in when it was just created.
+ *
+ * It does keep: live connections, the Session ID cache, the DNS cache and the
+ * cookies.
+ */
+CURL_EXTERN void curl_easy_reset(CURL *curl);
+
+/*
+ * NAME curl_easy_recv()
+ *
+ * DESCRIPTION
+ *
+ * Receives data from the connected socket. Use after successful
+ * curl_easy_perform() with CURLOPT_CONNECT_ONLY option.
+ */
+CURL_EXTERN CURLcode curl_easy_recv(CURL *curl, void *buffer, size_t buflen,
+                                    size_t *n);
+
+/*
+ * NAME curl_easy_send()
+ *
+ * DESCRIPTION
+ *
+ * Sends data over the connected socket. Use after successful
+ * curl_easy_perform() with CURLOPT_CONNECT_ONLY option.
+ */
+CURL_EXTERN CURLcode curl_easy_send(CURL *curl, const void *buffer,
+                                    size_t buflen, size_t *n);
+
+
+/*
+ * NAME curl_easy_upkeep()
+ *
+ * DESCRIPTION
+ *
+ * Performs connection upkeep for the given session handle.
+ */
+CURL_EXTERN CURLcode curl_easy_upkeep(CURL *curl);
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif
diff --git a/components/cronet/third_party/curl_headers/include/curl/mprintf.h b/components/cronet/third_party/curl_headers/include/curl/mprintf.h
new file mode 100644
index 0000000..e20f546e
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/include/curl/mprintf.h
@@ -0,0 +1,50 @@
+#ifndef __CURL_MPRINTF_H
+#define __CURL_MPRINTF_H
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include <stdarg.h>
+#include <stdio.h> /* needed for FILE */
+#include "curl.h"  /* for CURL_EXTERN */
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+CURL_EXTERN int curl_mprintf(const char *format, ...);
+CURL_EXTERN int curl_mfprintf(FILE *fd, const char *format, ...);
+CURL_EXTERN int curl_msprintf(char *buffer, const char *format, ...);
+CURL_EXTERN int curl_msnprintf(char *buffer, size_t maxlength,
+                               const char *format, ...);
+CURL_EXTERN int curl_mvprintf(const char *format, va_list args);
+CURL_EXTERN int curl_mvfprintf(FILE *fd, const char *format, va_list args);
+CURL_EXTERN int curl_mvsprintf(char *buffer, const char *format, va_list args);
+CURL_EXTERN int curl_mvsnprintf(char *buffer, size_t maxlength,
+                                const char *format, va_list args);
+CURL_EXTERN char *curl_maprintf(const char *format, ...);
+CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args);
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif /* __CURL_MPRINTF_H */
diff --git a/components/cronet/third_party/curl_headers/include/curl/multi.h b/components/cronet/third_party/curl_headers/include/curl/multi.h
new file mode 100644
index 0000000..b19dbaf
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/include/curl/multi.h
@@ -0,0 +1,441 @@
+#ifndef __CURL_MULTI_H
+#define __CURL_MULTI_H
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+/*
+  This is an "external" header file. Don't give away any internals here!
+
+  GOALS
+
+  o Enable a "pull" interface. The application that uses libcurl decides where
+    and when to ask libcurl to get/send data.
+
+  o Enable multiple simultaneous transfers in the same thread without making it
+    complicated for the application.
+
+  o Enable the application to select() on its own file descriptors and curl's
+    file descriptors simultaneous easily.
+
+*/
+
+/*
+ * This header file should not really need to include "curl.h" since curl.h
+ * itself includes this file and we expect user applications to do #include
+ * <curl/curl.h> without the need for especially including multi.h.
+ *
+ * For some reason we added this include here at one point, and rather than to
+ * break existing (wrongly written) libcurl applications, we leave it as-is
+ * but with this warning attached.
+ */
+#include "curl.h"
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+#if defined(BUILDING_LIBCURL) || defined(CURL_STRICTER)
+typedef struct Curl_multi CURLM;
+#else
+typedef void CURLM;
+#endif
+
+typedef enum {
+  CURLM_CALL_MULTI_PERFORM = -1, /* please call curl_multi_perform() or
+                                    curl_multi_socket*() soon */
+  CURLM_OK,
+  CURLM_BAD_HANDLE,      /* the passed-in handle is not a valid CURLM handle */
+  CURLM_BAD_EASY_HANDLE, /* an easy handle was not good/valid */
+  CURLM_OUT_OF_MEMORY,   /* if you ever get this, you're in deep sh*t */
+  CURLM_INTERNAL_ERROR,  /* this is a libcurl bug */
+  CURLM_BAD_SOCKET,      /* the passed in socket argument did not match */
+  CURLM_UNKNOWN_OPTION,  /* curl_multi_setopt() with unsupported option */
+  CURLM_ADDED_ALREADY,   /* an easy handle already added to a multi handle was
+                            attempted to get added - again */
+  CURLM_RECURSIVE_API_CALL, /* an api function was called from inside a
+                               callback */
+  CURLM_LAST
+} CURLMcode;
+
+/* just to make code nicer when using curl_multi_socket() you can now check
+   for CURLM_CALL_MULTI_SOCKET too in the same style it works for
+   curl_multi_perform() and CURLM_CALL_MULTI_PERFORM */
+#define CURLM_CALL_MULTI_SOCKET CURLM_CALL_MULTI_PERFORM
+
+/* bitmask bits for CURLMOPT_PIPELINING */
+#define CURLPIPE_NOTHING   0L
+#define CURLPIPE_HTTP1     1L
+#define CURLPIPE_MULTIPLEX 2L
+
+typedef enum {
+  CURLMSG_NONE, /* first, not used */
+  CURLMSG_DONE, /* This easy handle has completed. 'result' contains
+                   the CURLcode of the transfer */
+  CURLMSG_LAST /* last, not used */
+} CURLMSG;
+
+struct CURLMsg {
+  CURLMSG msg;       /* what this message means */
+  CURL *easy_handle; /* the handle it concerns */
+  union {
+    void *whatever;    /* message-specific data */
+    CURLcode result;   /* return code for transfer */
+  } data;
+};
+typedef struct CURLMsg CURLMsg;
+
+/* Based on poll(2) structure and values.
+ * We don't use pollfd and POLL* constants explicitly
+ * to cover platforms without poll(). */
+#define CURL_WAIT_POLLIN    0x0001
+#define CURL_WAIT_POLLPRI   0x0002
+#define CURL_WAIT_POLLOUT   0x0004
+
+struct curl_waitfd {
+  curl_socket_t fd;
+  short events;
+  short revents; /* not supported yet */
+};
+
+/*
+ * Name:    curl_multi_init()
+ *
+ * Desc:    inititalize multi-style curl usage
+ *
+ * Returns: a new CURLM handle to use in all 'curl_multi' functions.
+ */
+CURL_EXTERN CURLM *curl_multi_init(void);
+
+/*
+ * Name:    curl_multi_add_handle()
+ *
+ * Desc:    add a standard curl handle to the multi stack
+ *
+ * Returns: CURLMcode type, general multi error code.
+ */
+CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle,
+                                            CURL *curl_handle);
+
+ /*
+  * Name:    curl_multi_remove_handle()
+  *
+  * Desc:    removes a curl handle from the multi stack again
+  *
+  * Returns: CURLMcode type, general multi error code.
+  */
+CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle,
+                                               CURL *curl_handle);
+
+ /*
+  * Name:    curl_multi_fdset()
+  *
+  * Desc:    Ask curl for its fd_set sets. The app can use these to select() or
+  *          poll() on. We want curl_multi_perform() called as soon as one of
+  *          them are ready.
+  *
+  * Returns: CURLMcode type, general multi error code.
+  */
+CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle,
+                                       fd_set *read_fd_set,
+                                       fd_set *write_fd_set,
+                                       fd_set *exc_fd_set,
+                                       int *max_fd);
+
+/*
+ * Name:     curl_multi_wait()
+ *
+ * Desc:     Poll on all fds within a CURLM set as well as any
+ *           additional fds passed to the function.
+ *
+ * Returns:  CURLMcode type, general multi error code.
+ */
+CURL_EXTERN CURLMcode curl_multi_wait(CURLM *multi_handle,
+                                      struct curl_waitfd extra_fds[],
+                                      unsigned int extra_nfds,
+                                      int timeout_ms,
+                                      int *ret);
+
+ /*
+  * Name:    curl_multi_perform()
+  *
+  * Desc:    When the app thinks there's data available for curl it calls this
+  *          function to read/write whatever there is right now. This returns
+  *          as soon as the reads and writes are done. This function does not
+  *          require that there actually is data available for reading or that
+  *          data can be written, it can be called just in case. It returns
+  *          the number of handles that still transfer data in the second
+  *          argument's integer-pointer.
+  *
+  * Returns: CURLMcode type, general multi error code. *NOTE* that this only
+  *          returns errors etc regarding the whole multi stack. There might
+  *          still have occurred problems on individual transfers even when
+  *          this returns OK.
+  */
+CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle,
+                                         int *running_handles);
+
+ /*
+  * Name:    curl_multi_cleanup()
+  *
+  * Desc:    Cleans up and removes a whole multi stack. It does not free or
+  *          touch any individual easy handles in any way. We need to define
+  *          in what state those handles will be if this function is called
+  *          in the middle of a transfer.
+  *
+  * Returns: CURLMcode type, general multi error code.
+  */
+CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle);
+
+/*
+ * Name:    curl_multi_info_read()
+ *
+ * Desc:    Ask the multi handle if there's any messages/informationals from
+ *          the individual transfers. Messages include informationals such as
+ *          error code from the transfer or just the fact that a transfer is
+ *          completed. More details on these should be written down as well.
+ *
+ *          Repeated calls to this function will return a new struct each
+ *          time, until a special "end of msgs" struct is returned as a signal
+ *          that there is no more to get at this point.
+ *
+ *          The data the returned pointer points to will not survive calling
+ *          curl_multi_cleanup().
+ *
+ *          The 'CURLMsg' struct is meant to be very simple and only contain
+ *          very basic information. If more involved information is wanted,
+ *          we will provide the particular "transfer handle" in that struct
+ *          and that should/could/would be used in subsequent
+ *          curl_easy_getinfo() calls (or similar). The point being that we
+ *          must never expose complex structs to applications, as then we'll
+ *          undoubtably get backwards compatibility problems in the future.
+ *
+ * Returns: A pointer to a filled-in struct, or NULL if it failed or ran out
+ *          of structs. It also writes the number of messages left in the
+ *          queue (after this read) in the integer the second argument points
+ *          to.
+ */
+CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle,
+                                          int *msgs_in_queue);
+
+/*
+ * Name:    curl_multi_strerror()
+ *
+ * Desc:    The curl_multi_strerror function may be used to turn a CURLMcode
+ *          value into the equivalent human readable error string.  This is
+ *          useful for printing meaningful error messages.
+ *
+ * Returns: A pointer to a zero-terminated error message.
+ */
+CURL_EXTERN const char *curl_multi_strerror(CURLMcode);
+
+/*
+ * Name:    curl_multi_socket() and
+ *          curl_multi_socket_all()
+ *
+ * Desc:    An alternative version of curl_multi_perform() that allows the
+ *          application to pass in one of the file descriptors that have been
+ *          detected to have "action" on them and let libcurl perform.
+ *          See man page for details.
+ */
+#define CURL_POLL_NONE   0
+#define CURL_POLL_IN     1
+#define CURL_POLL_OUT    2
+#define CURL_POLL_INOUT  3
+#define CURL_POLL_REMOVE 4
+
+#define CURL_SOCKET_TIMEOUT CURL_SOCKET_BAD
+
+#define CURL_CSELECT_IN   0x01
+#define CURL_CSELECT_OUT  0x02
+#define CURL_CSELECT_ERR  0x04
+
+typedef int (*curl_socket_callback)(CURL *easy,      /* easy handle */
+                                    curl_socket_t s, /* socket */
+                                    int what,        /* see above */
+                                    void *userp,     /* private callback
+                                                        pointer */
+                                    void *socketp);  /* private socket
+                                                        pointer */
+/*
+ * Name:    curl_multi_timer_callback
+ *
+ * Desc:    Called by libcurl whenever the library detects a change in the
+ *          maximum number of milliseconds the app is allowed to wait before
+ *          curl_multi_socket() or curl_multi_perform() must be called
+ *          (to allow libcurl's timed events to take place).
+ *
+ * Returns: The callback should return zero.
+ */
+typedef int (*curl_multi_timer_callback)(CURLM *multi,    /* multi handle */
+                                         long timeout_ms, /* see above */
+                                         void *userp);    /* private callback
+                                                             pointer */
+
+CURL_EXTERN CURLMcode curl_multi_socket(CURLM *multi_handle, curl_socket_t s,
+                                        int *running_handles);
+
+CURL_EXTERN CURLMcode curl_multi_socket_action(CURLM *multi_handle,
+                                               curl_socket_t s,
+                                               int ev_bitmask,
+                                               int *running_handles);
+
+CURL_EXTERN CURLMcode curl_multi_socket_all(CURLM *multi_handle,
+                                            int *running_handles);
+
+#ifndef CURL_ALLOW_OLD_MULTI_SOCKET
+/* This macro below was added in 7.16.3 to push users who recompile to use
+   the new curl_multi_socket_action() instead of the old curl_multi_socket()
+*/
+#define curl_multi_socket(x,y,z) curl_multi_socket_action(x,y,0,z)
+#endif
+
+/*
+ * Name:    curl_multi_timeout()
+ *
+ * Desc:    Returns the maximum number of milliseconds the app is allowed to
+ *          wait before curl_multi_socket() or curl_multi_perform() must be
+ *          called (to allow libcurl's timed events to take place).
+ *
+ * Returns: CURLM error code.
+ */
+CURL_EXTERN CURLMcode curl_multi_timeout(CURLM *multi_handle,
+                                         long *milliseconds);
+
+#undef CINIT /* re-using the same name as in curl.h */
+
+#ifdef CURL_ISOCPP
+#define CINIT(name,type,num) CURLMOPT_ ## name = CURLOPTTYPE_ ## type + num
+#else
+/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */
+#define LONG          CURLOPTTYPE_LONG
+#define OBJECTPOINT   CURLOPTTYPE_OBJECTPOINT
+#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT
+#define OFF_T         CURLOPTTYPE_OFF_T
+#define CINIT(name,type,number) CURLMOPT_/**/name = type + number
+#endif
+
+typedef enum {
+  /* This is the socket callback function pointer */
+  CINIT(SOCKETFUNCTION, FUNCTIONPOINT, 1),
+
+  /* This is the argument passed to the socket callback */
+  CINIT(SOCKETDATA, OBJECTPOINT, 2),
+
+    /* set to 1 to enable pipelining for this multi handle */
+  CINIT(PIPELINING, LONG, 3),
+
+   /* This is the timer callback function pointer */
+  CINIT(TIMERFUNCTION, FUNCTIONPOINT, 4),
+
+  /* This is the argument passed to the timer callback */
+  CINIT(TIMERDATA, OBJECTPOINT, 5),
+
+  /* maximum number of entries in the connection cache */
+  CINIT(MAXCONNECTS, LONG, 6),
+
+  /* maximum number of (pipelining) connections to one host */
+  CINIT(MAX_HOST_CONNECTIONS, LONG, 7),
+
+  /* maximum number of requests in a pipeline */
+  CINIT(MAX_PIPELINE_LENGTH, LONG, 8),
+
+  /* a connection with a content-length longer than this
+     will not be considered for pipelining */
+  CINIT(CONTENT_LENGTH_PENALTY_SIZE, OFF_T, 9),
+
+  /* a connection with a chunk length longer than this
+     will not be considered for pipelining */
+  CINIT(CHUNK_LENGTH_PENALTY_SIZE, OFF_T, 10),
+
+  /* a list of site names(+port) that are blacklisted from
+     pipelining */
+  CINIT(PIPELINING_SITE_BL, OBJECTPOINT, 11),
+
+  /* a list of server types that are blacklisted from
+     pipelining */
+  CINIT(PIPELINING_SERVER_BL, OBJECTPOINT, 12),
+
+  /* maximum number of open connections in total */
+  CINIT(MAX_TOTAL_CONNECTIONS, LONG, 13),
+
+   /* This is the server push callback function pointer */
+  CINIT(PUSHFUNCTION, FUNCTIONPOINT, 14),
+
+  /* This is the argument passed to the server push callback */
+  CINIT(PUSHDATA, OBJECTPOINT, 15),
+
+  CURLMOPT_LASTENTRY /* the last unused */
+} CURLMoption;
+
+
+/*
+ * Name:    curl_multi_setopt()
+ *
+ * Desc:    Sets options for the multi handle.
+ *
+ * Returns: CURLM error code.
+ */
+CURL_EXTERN CURLMcode curl_multi_setopt(CURLM *multi_handle,
+                                        CURLMoption option, ...);
+
+
+/*
+ * Name:    curl_multi_assign()
+ *
+ * Desc:    This function sets an association in the multi handle between the
+ *          given socket and a private pointer of the application. This is
+ *          (only) useful for curl_multi_socket uses.
+ *
+ * Returns: CURLM error code.
+ */
+CURL_EXTERN CURLMcode curl_multi_assign(CURLM *multi_handle,
+                                        curl_socket_t sockfd, void *sockp);
+
+
+/*
+ * Name: curl_push_callback
+ *
+ * Desc: This callback gets called when a new stream is being pushed by the
+ *       server. It approves or denies the new stream.
+ *
+ * Returns: CURL_PUSH_OK or CURL_PUSH_DENY.
+ */
+#define CURL_PUSH_OK   0
+#define CURL_PUSH_DENY 1
+
+struct curl_pushheaders;  /* forward declaration only */
+
+CURL_EXTERN char *curl_pushheader_bynum(struct curl_pushheaders *h,
+                                        size_t num);
+CURL_EXTERN char *curl_pushheader_byname(struct curl_pushheaders *h,
+                                         const char *name);
+
+typedef int (*curl_push_callback)(CURL *parent,
+                                  CURL *easy,
+                                  size_t num_headers,
+                                  struct curl_pushheaders *headers,
+                                  void *userp);
+
+#ifdef __cplusplus
+} /* end of extern "C" */
+#endif
+
+#endif
diff --git a/components/cronet/third_party/curl_headers/include/curl/stdcheaders.h b/components/cronet/third_party/curl_headers/include/curl/stdcheaders.h
new file mode 100644
index 0000000..027b6f4
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/include/curl/stdcheaders.h
@@ -0,0 +1,33 @@
+#ifndef __STDC_HEADERS_H
+#define __STDC_HEADERS_H
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include <sys/types.h>
+
+size_t fread(void *, size_t, size_t, FILE *);
+size_t fwrite(const void *, size_t, size_t, FILE *);
+
+int strcasecmp(const char *, const char *);
+int strncasecmp(const char *, const char *, size_t);
+
+#endif /* __STDC_HEADERS_H */
diff --git a/components/cronet/third_party/curl_headers/include/curl/system.h b/components/cronet/third_party/curl_headers/include/curl/system.h
new file mode 100644
index 0000000..1e555ec
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/include/curl/system.h
@@ -0,0 +1,493 @@
+#ifndef __CURL_SYSTEM_H
+#define __CURL_SYSTEM_H
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/*
+ * Try to keep one section per platform, compiler and architecture, otherwise,
+ * if an existing section is reused for a different one and later on the
+ * original is adjusted, probably the piggybacking one can be adversely
+ * changed.
+ *
+ * In order to differentiate between platforms/compilers/architectures use
+ * only compiler built in predefined preprocessor symbols.
+ *
+ * curl_off_t
+ * ----------
+ *
+ * For any given platform/compiler curl_off_t must be typedef'ed to a 64-bit
+ * wide signed integral data type. The width of this data type must remain
+ * constant and independent of any possible large file support settings.
+ *
+ * As an exception to the above, curl_off_t shall be typedef'ed to a 32-bit
+ * wide signed integral data type if there is no 64-bit type.
+ *
+ * As a general rule, curl_off_t shall not be mapped to off_t. This rule shall
+ * only be violated if off_t is the only 64-bit data type available and the
+ * size of off_t is independent of large file support settings. Keep your
+ * build on the safe side avoiding an off_t gating.  If you have a 64-bit
+ * off_t then take for sure that another 64-bit data type exists, dig deeper
+ * and you will find it.
+ *
+ */
+
+#if defined(__DJGPP__) || defined(__GO32__)
+#  if defined(__DJGPP__) && (__DJGPP__ > 1)
+#    define CURL_TYPEOF_CURL_OFF_T     long long
+#    define CURL_FORMAT_CURL_OFF_T     "lld"
+#    define CURL_FORMAT_CURL_OFF_TU    "llu"
+#    define CURL_SUFFIX_CURL_OFF_T     LL
+#    define CURL_SUFFIX_CURL_OFF_TU    ULL
+#  else
+#    define CURL_TYPEOF_CURL_OFF_T     long
+#    define CURL_FORMAT_CURL_OFF_T     "ld"
+#    define CURL_FORMAT_CURL_OFF_TU    "lu"
+#    define CURL_SUFFIX_CURL_OFF_T     L
+#    define CURL_SUFFIX_CURL_OFF_TU    UL
+#  endif
+#  define CURL_TYPEOF_CURL_SOCKLEN_T int
+
+#elif defined(__SALFORDC__)
+#  define CURL_TYPEOF_CURL_OFF_T     long
+#  define CURL_FORMAT_CURL_OFF_T     "ld"
+#  define CURL_FORMAT_CURL_OFF_TU    "lu"
+#  define CURL_SUFFIX_CURL_OFF_T     L
+#  define CURL_SUFFIX_CURL_OFF_TU    UL
+#  define CURL_TYPEOF_CURL_SOCKLEN_T int
+
+#elif defined(__BORLANDC__)
+#  if (__BORLANDC__ < 0x520)
+#    define CURL_TYPEOF_CURL_OFF_T     long
+#    define CURL_FORMAT_CURL_OFF_T     "ld"
+#    define CURL_FORMAT_CURL_OFF_TU    "lu"
+#    define CURL_SUFFIX_CURL_OFF_T     L
+#    define CURL_SUFFIX_CURL_OFF_TU    UL
+#  else
+#    define CURL_TYPEOF_CURL_OFF_T     __int64
+#    define CURL_FORMAT_CURL_OFF_T     "I64d"
+#    define CURL_FORMAT_CURL_OFF_TU    "I64u"
+#    define CURL_SUFFIX_CURL_OFF_T     i64
+#    define CURL_SUFFIX_CURL_OFF_TU    ui64
+#  endif
+#  define CURL_TYPEOF_CURL_SOCKLEN_T int
+
+#elif defined(__TURBOC__)
+#  define CURL_TYPEOF_CURL_OFF_T     long
+#  define CURL_FORMAT_CURL_OFF_T     "ld"
+#  define CURL_FORMAT_CURL_OFF_TU    "lu"
+#  define CURL_SUFFIX_CURL_OFF_T     L
+#  define CURL_SUFFIX_CURL_OFF_TU    UL
+#  define CURL_TYPEOF_CURL_SOCKLEN_T int
+
+#elif defined(__WATCOMC__)
+#  if defined(__386__)
+#    define CURL_TYPEOF_CURL_OFF_T     __int64
+#    define CURL_FORMAT_CURL_OFF_T     "I64d"
+#    define CURL_FORMAT_CURL_OFF_TU    "I64u"
+#    define CURL_SUFFIX_CURL_OFF_T     i64
+#    define CURL_SUFFIX_CURL_OFF_TU    ui64
+#  else
+#    define CURL_TYPEOF_CURL_OFF_T     long
+#    define CURL_FORMAT_CURL_OFF_T     "ld"
+#    define CURL_FORMAT_CURL_OFF_TU    "lu"
+#    define CURL_SUFFIX_CURL_OFF_T     L
+#    define CURL_SUFFIX_CURL_OFF_TU    UL
+#  endif
+#  define CURL_TYPEOF_CURL_SOCKLEN_T int
+
+#elif defined(__POCC__)
+#  if (__POCC__ < 280)
+#    define CURL_TYPEOF_CURL_OFF_T     long
+#    define CURL_FORMAT_CURL_OFF_T     "ld"
+#    define CURL_FORMAT_CURL_OFF_TU    "lu"
+#    define CURL_SUFFIX_CURL_OFF_T     L
+#    define CURL_SUFFIX_CURL_OFF_TU    UL
+#  elif defined(_MSC_VER)
+#    define CURL_TYPEOF_CURL_OFF_T     __int64
+#    define CURL_FORMAT_CURL_OFF_T     "I64d"
+#    define CURL_FORMAT_CURL_OFF_TU    "I64u"
+#    define CURL_SUFFIX_CURL_OFF_T     i64
+#    define CURL_SUFFIX_CURL_OFF_TU    ui64
+#  else
+#    define CURL_TYPEOF_CURL_OFF_T     long long
+#    define CURL_FORMAT_CURL_OFF_T     "lld"
+#    define CURL_FORMAT_CURL_OFF_TU    "llu"
+#    define CURL_SUFFIX_CURL_OFF_T     LL
+#    define CURL_SUFFIX_CURL_OFF_TU    ULL
+#  endif
+#  define CURL_TYPEOF_CURL_SOCKLEN_T int
+
+#elif defined(__LCC__)
+#  define CURL_TYPEOF_CURL_OFF_T     long
+#  define CURL_FORMAT_CURL_OFF_T     "ld"
+#  define CURL_FORMAT_CURL_OFF_TU    "lu"
+#  define CURL_SUFFIX_CURL_OFF_T     L
+#  define CURL_SUFFIX_CURL_OFF_TU    UL
+#  define CURL_TYPEOF_CURL_SOCKLEN_T int
+
+#elif defined(__SYMBIAN32__)
+#  if defined(__EABI__)  /* Treat all ARM compilers equally */
+#    define CURL_TYPEOF_CURL_OFF_T     long long
+#    define CURL_FORMAT_CURL_OFF_T     "lld"
+#    define CURL_FORMAT_CURL_OFF_TU    "llu"
+#    define CURL_SUFFIX_CURL_OFF_T     LL
+#    define CURL_SUFFIX_CURL_OFF_TU    ULL
+#  elif defined(__CW32__)
+#    pragma longlong on
+#    define CURL_TYPEOF_CURL_OFF_T     long long
+#    define CURL_FORMAT_CURL_OFF_T     "lld"
+#    define CURL_FORMAT_CURL_OFF_TU    "llu"
+#    define CURL_SUFFIX_CURL_OFF_T     LL
+#    define CURL_SUFFIX_CURL_OFF_TU    ULL
+#  elif defined(__VC32__)
+#    define CURL_TYPEOF_CURL_OFF_T     __int64
+#    define CURL_FORMAT_CURL_OFF_T     "lld"
+#    define CURL_FORMAT_CURL_OFF_TU    "llu"
+#    define CURL_SUFFIX_CURL_OFF_T     LL
+#    define CURL_SUFFIX_CURL_OFF_TU    ULL
+#  endif
+#  define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int
+
+#elif defined(__MWERKS__)
+#  define CURL_TYPEOF_CURL_OFF_T     long long
+#  define CURL_FORMAT_CURL_OFF_T     "lld"
+#  define CURL_FORMAT_CURL_OFF_TU    "llu"
+#  define CURL_SUFFIX_CURL_OFF_T     LL
+#  define CURL_SUFFIX_CURL_OFF_TU    ULL
+#  define CURL_TYPEOF_CURL_SOCKLEN_T int
+
+#elif defined(_WIN32_WCE)
+#  define CURL_TYPEOF_CURL_OFF_T     __int64
+#  define CURL_FORMAT_CURL_OFF_T     "I64d"
+#  define CURL_FORMAT_CURL_OFF_TU    "I64u"
+#  define CURL_SUFFIX_CURL_OFF_T     i64
+#  define CURL_SUFFIX_CURL_OFF_TU    ui64
+#  define CURL_TYPEOF_CURL_SOCKLEN_T int
+
+#elif defined(__MINGW32__)
+#  define CURL_TYPEOF_CURL_OFF_T     long long
+#  define CURL_FORMAT_CURL_OFF_T     "I64d"
+#  define CURL_FORMAT_CURL_OFF_TU    "I64u"
+#  define CURL_SUFFIX_CURL_OFF_T     LL
+#  define CURL_SUFFIX_CURL_OFF_TU    ULL
+#  define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
+#  define CURL_PULL_SYS_TYPES_H      1
+#  define CURL_PULL_WS2TCPIP_H       1
+
+#elif defined(__VMS)
+#  if defined(__VAX)
+#    define CURL_TYPEOF_CURL_OFF_T     long
+#    define CURL_FORMAT_CURL_OFF_T     "ld"
+#    define CURL_FORMAT_CURL_OFF_TU    "lu"
+#    define CURL_SUFFIX_CURL_OFF_T     L
+#    define CURL_SUFFIX_CURL_OFF_TU    UL
+#  else
+#    define CURL_TYPEOF_CURL_OFF_T     long long
+#    define CURL_FORMAT_CURL_OFF_T     "lld"
+#    define CURL_FORMAT_CURL_OFF_TU    "llu"
+#    define CURL_SUFFIX_CURL_OFF_T     LL
+#    define CURL_SUFFIX_CURL_OFF_TU    ULL
+#  endif
+#  define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int
+
+#elif defined(__OS400__)
+#  if defined(__ILEC400__)
+#    define CURL_TYPEOF_CURL_OFF_T     long long
+#    define CURL_FORMAT_CURL_OFF_T     "lld"
+#    define CURL_FORMAT_CURL_OFF_TU    "llu"
+#    define CURL_SUFFIX_CURL_OFF_T     LL
+#    define CURL_SUFFIX_CURL_OFF_TU    ULL
+#    define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
+#    define CURL_PULL_SYS_TYPES_H      1
+#    define CURL_PULL_SYS_SOCKET_H     1
+#  endif
+
+#elif defined(__MVS__)
+#  if defined(__IBMC__) || defined(__IBMCPP__)
+#    if defined(_ILP32)
+#    elif defined(_LP64)
+#    endif
+#    if defined(_LONG_LONG)
+#      define CURL_TYPEOF_CURL_OFF_T     long long
+#      define CURL_FORMAT_CURL_OFF_T     "lld"
+#      define CURL_FORMAT_CURL_OFF_TU    "llu"
+#      define CURL_SUFFIX_CURL_OFF_T     LL
+#      define CURL_SUFFIX_CURL_OFF_TU    ULL
+#    elif defined(_LP64)
+#      define CURL_TYPEOF_CURL_OFF_T     long
+#      define CURL_FORMAT_CURL_OFF_T     "ld"
+#      define CURL_FORMAT_CURL_OFF_TU    "lu"
+#      define CURL_SUFFIX_CURL_OFF_T     L
+#      define CURL_SUFFIX_CURL_OFF_TU    UL
+#    else
+#      define CURL_TYPEOF_CURL_OFF_T     long
+#      define CURL_FORMAT_CURL_OFF_T     "ld"
+#      define CURL_FORMAT_CURL_OFF_TU    "lu"
+#      define CURL_SUFFIX_CURL_OFF_T     L
+#      define CURL_SUFFIX_CURL_OFF_TU    UL
+#    endif
+#    define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
+#    define CURL_PULL_SYS_TYPES_H      1
+#    define CURL_PULL_SYS_SOCKET_H     1
+#  endif
+
+#elif defined(__370__)
+#  if defined(__IBMC__) || defined(__IBMCPP__)
+#    if defined(_ILP32)
+#    elif defined(_LP64)
+#    endif
+#    if defined(_LONG_LONG)
+#      define CURL_TYPEOF_CURL_OFF_T     long long
+#      define CURL_FORMAT_CURL_OFF_T     "lld"
+#      define CURL_FORMAT_CURL_OFF_TU    "llu"
+#      define CURL_SUFFIX_CURL_OFF_T     LL
+#      define CURL_SUFFIX_CURL_OFF_TU    ULL
+#    elif defined(_LP64)
+#      define CURL_TYPEOF_CURL_OFF_T     long
+#      define CURL_FORMAT_CURL_OFF_T     "ld"
+#      define CURL_FORMAT_CURL_OFF_TU    "lu"
+#      define CURL_SUFFIX_CURL_OFF_T     L
+#      define CURL_SUFFIX_CURL_OFF_TU    UL
+#    else
+#      define CURL_TYPEOF_CURL_OFF_T     long
+#      define CURL_FORMAT_CURL_OFF_T     "ld"
+#      define CURL_FORMAT_CURL_OFF_TU    "lu"
+#      define CURL_SUFFIX_CURL_OFF_T     L
+#      define CURL_SUFFIX_CURL_OFF_TU    UL
+#    endif
+#    define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
+#    define CURL_PULL_SYS_TYPES_H      1
+#    define CURL_PULL_SYS_SOCKET_H     1
+#  endif
+
+#elif defined(TPF)
+#  define CURL_TYPEOF_CURL_OFF_T     long
+#  define CURL_FORMAT_CURL_OFF_T     "ld"
+#  define CURL_FORMAT_CURL_OFF_TU    "lu"
+#  define CURL_SUFFIX_CURL_OFF_T     L
+#  define CURL_SUFFIX_CURL_OFF_TU    UL
+#  define CURL_TYPEOF_CURL_SOCKLEN_T int
+
+#elif defined(__TINYC__) /* also known as tcc */
+
+#  define CURL_TYPEOF_CURL_OFF_T     long long
+#  define CURL_FORMAT_CURL_OFF_T     "lld"
+#  define CURL_FORMAT_CURL_OFF_TU    "llu"
+#  define CURL_SUFFIX_CURL_OFF_T     LL
+#  define CURL_SUFFIX_CURL_OFF_TU    ULL
+#  define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
+#  define CURL_PULL_SYS_TYPES_H      1
+#  define CURL_PULL_SYS_SOCKET_H     1
+
+#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) /* Oracle Solaris Studio */
+#  if !defined(__LP64) && (defined(__ILP32) ||                          \
+                           defined(__i386) ||                           \
+                           defined(__sparcv8) ||                        \
+                           defined(__sparcv8plus))
+#    define CURL_TYPEOF_CURL_OFF_T     long long
+#    define CURL_FORMAT_CURL_OFF_T     "lld"
+#    define CURL_FORMAT_CURL_OFF_TU    "llu"
+#    define CURL_SUFFIX_CURL_OFF_T     LL
+#    define CURL_SUFFIX_CURL_OFF_TU    ULL
+#  elif defined(__LP64) || \
+        defined(__amd64) || defined(__sparcv9)
+#    define CURL_TYPEOF_CURL_OFF_T     long
+#    define CURL_FORMAT_CURL_OFF_T     "ld"
+#    define CURL_FORMAT_CURL_OFF_TU    "lu"
+#    define CURL_SUFFIX_CURL_OFF_T     L
+#    define CURL_SUFFIX_CURL_OFF_TU    UL
+#  endif
+#  define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
+#  define CURL_PULL_SYS_TYPES_H      1
+#  define CURL_PULL_SYS_SOCKET_H     1
+
+#elif defined(__xlc__) /* IBM xlc compiler */
+#  if !defined(_LP64)
+#    define CURL_TYPEOF_CURL_OFF_T     long long
+#    define CURL_FORMAT_CURL_OFF_T     "lld"
+#    define CURL_FORMAT_CURL_OFF_TU    "llu"
+#    define CURL_SUFFIX_CURL_OFF_T     LL
+#    define CURL_SUFFIX_CURL_OFF_TU    ULL
+#  else
+#    define CURL_TYPEOF_CURL_OFF_T     long
+#    define CURL_FORMAT_CURL_OFF_T     "ld"
+#    define CURL_FORMAT_CURL_OFF_TU    "lu"
+#    define CURL_SUFFIX_CURL_OFF_T     L
+#    define CURL_SUFFIX_CURL_OFF_TU    UL
+#  endif
+#  define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
+#  define CURL_PULL_SYS_TYPES_H      1
+#  define CURL_PULL_SYS_SOCKET_H     1
+
+/* ===================================== */
+/*    KEEP MSVC THE PENULTIMATE ENTRY    */
+/* ===================================== */
+
+#elif defined(_MSC_VER)
+#  if (_MSC_VER >= 900) && (_INTEGRAL_MAX_BITS >= 64)
+#    define CURL_TYPEOF_CURL_OFF_T     __int64
+#    define CURL_FORMAT_CURL_OFF_T     "I64d"
+#    define CURL_FORMAT_CURL_OFF_TU    "I64u"
+#    define CURL_SUFFIX_CURL_OFF_T     i64
+#    define CURL_SUFFIX_CURL_OFF_TU    ui64
+#  else
+#    define CURL_TYPEOF_CURL_OFF_T     long
+#    define CURL_FORMAT_CURL_OFF_T     "ld"
+#    define CURL_FORMAT_CURL_OFF_TU    "lu"
+#    define CURL_SUFFIX_CURL_OFF_T     L
+#    define CURL_SUFFIX_CURL_OFF_TU    UL
+#  endif
+#  define CURL_TYPEOF_CURL_SOCKLEN_T int
+
+/* ===================================== */
+/*    KEEP GENERIC GCC THE LAST ENTRY    */
+/* ===================================== */
+
+#elif defined(__GNUC__) && !defined(_SCO_DS)
+#  if !defined(__LP64__) &&                                             \
+  (defined(__ILP32__) || defined(__i386__) || defined(__hppa__) ||      \
+   defined(__ppc__) || defined(__powerpc__) || defined(__arm__) ||      \
+   defined(__sparc__) || defined(__mips__) || defined(__sh__) ||        \
+   defined(__XTENSA__) ||                                               \
+   (defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 4)  ||               \
+   (defined(__LONG_MAX__) && __LONG_MAX__ == 2147483647L))
+#    define CURL_TYPEOF_CURL_OFF_T     long long
+#    define CURL_FORMAT_CURL_OFF_T     "lld"
+#    define CURL_FORMAT_CURL_OFF_TU    "llu"
+#    define CURL_SUFFIX_CURL_OFF_T     LL
+#    define CURL_SUFFIX_CURL_OFF_TU    ULL
+#  elif defined(__LP64__) || \
+        defined(__x86_64__) || defined(__ppc64__) || defined(__sparc64__) || \
+        (defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 8) || \
+        (defined(__LONG_MAX__) && __LONG_MAX__ == 9223372036854775807L)
+#    define CURL_TYPEOF_CURL_OFF_T     long
+#    define CURL_FORMAT_CURL_OFF_T     "ld"
+#    define CURL_FORMAT_CURL_OFF_TU    "lu"
+#    define CURL_SUFFIX_CURL_OFF_T     L
+#    define CURL_SUFFIX_CURL_OFF_TU    UL
+#  endif
+#  define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
+#  define CURL_PULL_SYS_TYPES_H      1
+#  define CURL_PULL_SYS_SOCKET_H     1
+
+#else
+/* generic "safe guess" on old 32 bit style */
+# define CURL_TYPEOF_CURL_OFF_T     long
+# define CURL_FORMAT_CURL_OFF_T     "ld"
+# define CURL_FORMAT_CURL_OFF_TU    "lu"
+# define CURL_SUFFIX_CURL_OFF_T     L
+# define CURL_SUFFIX_CURL_OFF_TU    UL
+# define CURL_TYPEOF_CURL_SOCKLEN_T int
+#endif
+
+#ifdef _AIX
+/* AIX needs <sys/poll.h> */
+#define CURL_PULL_SYS_POLL_H
+#endif
+
+
+/* CURL_PULL_WS2TCPIP_H is defined above when inclusion of header file  */
+/* ws2tcpip.h is required here to properly make type definitions below. */
+#ifdef CURL_PULL_WS2TCPIP_H
+#  include <winsock2.h>
+#  include <windows.h>
+#  include <ws2tcpip.h>
+#endif
+
+/* CURL_PULL_SYS_TYPES_H is defined above when inclusion of header file  */
+/* sys/types.h is required here to properly make type definitions below. */
+#ifdef CURL_PULL_SYS_TYPES_H
+#  include <sys/types.h>
+#endif
+
+/* CURL_PULL_SYS_SOCKET_H is defined above when inclusion of header file  */
+/* sys/socket.h is required here to properly make type definitions below. */
+#ifdef CURL_PULL_SYS_SOCKET_H
+#  include <sys/socket.h>
+#endif
+
+/* CURL_PULL_SYS_POLL_H is defined above when inclusion of header file    */
+/* sys/poll.h is required here to properly make type definitions below.   */
+#ifdef CURL_PULL_SYS_POLL_H
+#  include <sys/poll.h>
+#endif
+
+/* Data type definition of curl_socklen_t. */
+#ifdef CURL_TYPEOF_CURL_SOCKLEN_T
+  typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t;
+#endif
+
+/* Data type definition of curl_off_t. */
+
+#ifdef CURL_TYPEOF_CURL_OFF_T
+  typedef CURL_TYPEOF_CURL_OFF_T curl_off_t;
+#endif
+
+/*
+ * CURL_ISOCPP and CURL_OFF_T_C definitions are done here in order to allow
+ * these to be visible and exported by the external libcurl interface API,
+ * while also making them visible to the library internals, simply including
+ * curl_setup.h, without actually needing to include curl.h internally.
+ * If some day this section would grow big enough, all this should be moved
+ * to its own header file.
+ */
+
+/*
+ * Figure out if we can use the ## preprocessor operator, which is supported
+ * by ISO/ANSI C and C++. Some compilers support it without setting __STDC__
+ * or  __cplusplus so we need to carefully check for them too.
+ */
+
+#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \
+  defined(__HP_aCC) || defined(__BORLANDC__) || defined(__LCC__) || \
+  defined(__POCC__) || defined(__SALFORDC__) || defined(__HIGHC__) || \
+  defined(__ILEC400__)
+  /* This compiler is believed to have an ISO compatible preprocessor */
+#define CURL_ISOCPP
+#else
+  /* This compiler is believed NOT to have an ISO compatible preprocessor */
+#undef CURL_ISOCPP
+#endif
+
+/*
+ * Macros for minimum-width signed and unsigned curl_off_t integer constants.
+ */
+
+#if defined(__BORLANDC__) && (__BORLANDC__ == 0x0551)
+#  define __CURL_OFF_T_C_HLPR2(x) x
+#  define __CURL_OFF_T_C_HLPR1(x) __CURL_OFF_T_C_HLPR2(x)
+#  define CURL_OFF_T_C(Val)  __CURL_OFF_T_C_HLPR1(Val) ## \
+                             __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_T)
+#  define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \
+                             __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_TU)
+#else
+#  ifdef CURL_ISOCPP
+#    define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix
+#  else
+#    define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val/**/Suffix
+#  endif
+#  define __CURL_OFF_T_C_HLPR1(Val,Suffix) __CURL_OFF_T_C_HLPR2(Val,Suffix)
+#  define CURL_OFF_T_C(Val)  __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_T)
+#  define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_TU)
+#endif
+
+#endif /* __CURL_SYSTEM_H */
diff --git a/components/cronet/third_party/curl_headers/include/curl/typecheck-gcc.h b/components/cronet/third_party/curl_headers/include/curl/typecheck-gcc.h
new file mode 100644
index 0000000..2d1de4d
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/include/curl/typecheck-gcc.h
@@ -0,0 +1,694 @@
+#ifndef __CURL_TYPECHECK_GCC_H
+#define __CURL_TYPECHECK_GCC_H
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+/* wraps curl_easy_setopt() with typechecking */
+
+/* To add a new kind of warning, add an
+ *   if(_curl_is_sometype_option(_curl_opt))
+ *     if(!_curl_is_sometype(value))
+ *       _curl_easy_setopt_err_sometype();
+ * block and define _curl_is_sometype_option, _curl_is_sometype and
+ * _curl_easy_setopt_err_sometype below
+ *
+ * NOTE: We use two nested 'if' statements here instead of the && operator, in
+ *       order to work around gcc bug #32061.  It affects only gcc 4.3.x/4.4.x
+ *       when compiling with -Wlogical-op.
+ *
+ * To add an option that uses the same type as an existing option, you'll just
+ * need to extend the appropriate _curl_*_option macro
+ */
+#define curl_easy_setopt(handle, option, value)                               \
+__extension__ ({                                                              \
+  __typeof__(option) _curl_opt = option;                                     \
+  if(__builtin_constant_p(_curl_opt)) {                                       \
+    if(_curl_is_long_option(_curl_opt))                                       \
+      if(!_curl_is_long(value))                                               \
+        _curl_easy_setopt_err_long();                                         \
+    if(_curl_is_off_t_option(_curl_opt))                                      \
+      if(!_curl_is_off_t(value))                                              \
+        _curl_easy_setopt_err_curl_off_t();                                   \
+    if(_curl_is_string_option(_curl_opt))                                     \
+      if(!_curl_is_string(value))                                             \
+        _curl_easy_setopt_err_string();                                       \
+    if(_curl_is_write_cb_option(_curl_opt))                                   \
+      if(!_curl_is_write_cb(value))                                           \
+        _curl_easy_setopt_err_write_callback();                               \
+    if((_curl_opt) == CURLOPT_RESOLVER_START_FUNCTION)                        \
+      if(!_curl_is_resolver_start_callback(value))                            \
+        _curl_easy_setopt_err_resolver_start_callback();                      \
+    if((_curl_opt) == CURLOPT_READFUNCTION)                                   \
+      if(!_curl_is_read_cb(value))                                            \
+        _curl_easy_setopt_err_read_cb();                                      \
+    if((_curl_opt) == CURLOPT_IOCTLFUNCTION)                                  \
+      if(!_curl_is_ioctl_cb(value))                                           \
+        _curl_easy_setopt_err_ioctl_cb();                                     \
+    if((_curl_opt) == CURLOPT_SOCKOPTFUNCTION)                                \
+      if(!_curl_is_sockopt_cb(value))                                         \
+        _curl_easy_setopt_err_sockopt_cb();                                   \
+    if((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION)                             \
+      if(!_curl_is_opensocket_cb(value))                                      \
+        _curl_easy_setopt_err_opensocket_cb();                                \
+    if((_curl_opt) == CURLOPT_PROGRESSFUNCTION)                               \
+      if(!_curl_is_progress_cb(value))                                        \
+        _curl_easy_setopt_err_progress_cb();                                  \
+    if((_curl_opt) == CURLOPT_DEBUGFUNCTION)                                  \
+      if(!_curl_is_debug_cb(value))                                           \
+        _curl_easy_setopt_err_debug_cb();                                     \
+    if((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION)                               \
+      if(!_curl_is_ssl_ctx_cb(value))                                         \
+        _curl_easy_setopt_err_ssl_ctx_cb();                                   \
+    if(_curl_is_conv_cb_option(_curl_opt))                                    \
+      if(!_curl_is_conv_cb(value))                                            \
+        _curl_easy_setopt_err_conv_cb();                                      \
+    if((_curl_opt) == CURLOPT_SEEKFUNCTION)                                   \
+      if(!_curl_is_seek_cb(value))                                            \
+        _curl_easy_setopt_err_seek_cb();                                      \
+    if(_curl_is_cb_data_option(_curl_opt))                                    \
+      if(!_curl_is_cb_data(value))                                            \
+        _curl_easy_setopt_err_cb_data();                                      \
+    if((_curl_opt) == CURLOPT_ERRORBUFFER)                                    \
+      if(!_curl_is_error_buffer(value))                                       \
+        _curl_easy_setopt_err_error_buffer();                                 \
+    if((_curl_opt) == CURLOPT_STDERR)                                         \
+      if(!_curl_is_FILE(value))                                               \
+        _curl_easy_setopt_err_FILE();                                         \
+    if(_curl_is_postfields_option(_curl_opt))                                 \
+      if(!_curl_is_postfields(value))                                         \
+        _curl_easy_setopt_err_postfields();                                   \
+    if((_curl_opt) == CURLOPT_HTTPPOST)                                       \
+      if(!_curl_is_arr((value), struct curl_httppost))                        \
+        _curl_easy_setopt_err_curl_httpost();                                 \
+    if((_curl_opt) == CURLOPT_MIMEPOST)                                       \
+      if(!_curl_is_ptr((value), curl_mime))                                   \
+        _curl_easy_setopt_err_curl_mimepost();                                \
+    if(_curl_is_slist_option(_curl_opt))                                      \
+      if(!_curl_is_arr((value), struct curl_slist))                           \
+        _curl_easy_setopt_err_curl_slist();                                   \
+    if((_curl_opt) == CURLOPT_SHARE)                                          \
+      if(!_curl_is_ptr((value), CURLSH))                                      \
+        _curl_easy_setopt_err_CURLSH();                                       \
+  }                                                                           \
+  curl_easy_setopt(handle, _curl_opt, value);                                 \
+})
+
+/* wraps curl_easy_getinfo() with typechecking */
+#define curl_easy_getinfo(handle, info, arg)                                  \
+__extension__ ({                                                              \
+  __typeof__(info) _curl_info = info;                                         \
+  if(__builtin_constant_p(_curl_info)) {                                      \
+    if(_curl_is_string_info(_curl_info))                                      \
+      if(!_curl_is_arr((arg), char *))                                        \
+        _curl_easy_getinfo_err_string();                                      \
+    if(_curl_is_long_info(_curl_info))                                        \
+      if(!_curl_is_arr((arg), long))                                          \
+        _curl_easy_getinfo_err_long();                                        \
+    if(_curl_is_double_info(_curl_info))                                      \
+      if(!_curl_is_arr((arg), double))                                        \
+        _curl_easy_getinfo_err_double();                                      \
+    if(_curl_is_slist_info(_curl_info))                                       \
+      if(!_curl_is_arr((arg), struct curl_slist *))                           \
+        _curl_easy_getinfo_err_curl_slist();                                  \
+    if(_curl_is_tlssessioninfo_info(_curl_info))                              \
+      if(!_curl_is_arr((arg), struct curl_tlssessioninfo *))                  \
+        _curl_easy_getinfo_err_curl_tlssesssioninfo();                        \
+    if(_curl_is_certinfo_info(_curl_info))                                    \
+      if(!_curl_is_arr((arg), struct curl_certinfo *))                        \
+        _curl_easy_getinfo_err_curl_certinfo();                               \
+    if(_curl_is_socket_info(_curl_info))                                      \
+      if(!_curl_is_arr((arg), curl_socket_t))                                 \
+        _curl_easy_getinfo_err_curl_socket();                                 \
+    if(_curl_is_off_t_info(_curl_info))                                       \
+      if(!_curl_is_arr((arg), curl_off_t))                                    \
+        _curl_easy_getinfo_err_curl_off_t();                                  \
+  }                                                                           \
+  curl_easy_getinfo(handle, _curl_info, arg);                                 \
+})
+
+/*
+ * For now, just make sure that the functions are called with three arguments
+ */
+#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param)
+#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param)
+
+
+/* the actual warnings, triggered by calling the _curl_easy_setopt_err*
+ * functions */
+
+/* To define a new warning, use _CURL_WARNING(identifier, "message") */
+#define _CURL_WARNING(id, message)                                            \
+  static void __attribute__((__warning__(message)))                           \
+  __attribute__((__unused__)) __attribute__((__noinline__))                   \
+  id(void) { __asm__(""); }
+
+_CURL_WARNING(_curl_easy_setopt_err_long,
+  "curl_easy_setopt expects a long argument for this option")
+_CURL_WARNING(_curl_easy_setopt_err_curl_off_t,
+  "curl_easy_setopt expects a curl_off_t argument for this option")
+_CURL_WARNING(_curl_easy_setopt_err_string,
+              "curl_easy_setopt expects a "
+              "string ('char *' or char[]) argument for this option"
+  )
+_CURL_WARNING(_curl_easy_setopt_err_write_callback,
+  "curl_easy_setopt expects a curl_write_callback argument for this option")
+_CURL_WARNING(_curl_easy_setopt_err_resolver_start_callback,
+              "curl_easy_setopt expects a "
+              "curl_resolver_start_callback argument for this option"
+  )
+_CURL_WARNING(_curl_easy_setopt_err_read_cb,
+  "curl_easy_setopt expects a curl_read_callback argument for this option")
+_CURL_WARNING(_curl_easy_setopt_err_ioctl_cb,
+  "curl_easy_setopt expects a curl_ioctl_callback argument for this option")
+_CURL_WARNING(_curl_easy_setopt_err_sockopt_cb,
+  "curl_easy_setopt expects a curl_sockopt_callback argument for this option")
+_CURL_WARNING(_curl_easy_setopt_err_opensocket_cb,
+              "curl_easy_setopt expects a "
+              "curl_opensocket_callback argument for this option"
+  )
+_CURL_WARNING(_curl_easy_setopt_err_progress_cb,
+  "curl_easy_setopt expects a curl_progress_callback argument for this option")
+_CURL_WARNING(_curl_easy_setopt_err_debug_cb,
+  "curl_easy_setopt expects a curl_debug_callback argument for this option")
+_CURL_WARNING(_curl_easy_setopt_err_ssl_ctx_cb,
+  "curl_easy_setopt expects a curl_ssl_ctx_callback argument for this option")
+_CURL_WARNING(_curl_easy_setopt_err_conv_cb,
+  "curl_easy_setopt expects a curl_conv_callback argument for this option")
+_CURL_WARNING(_curl_easy_setopt_err_seek_cb,
+  "curl_easy_setopt expects a curl_seek_callback argument for this option")
+_CURL_WARNING(_curl_easy_setopt_err_cb_data,
+              "curl_easy_setopt expects a "
+              "private data pointer as argument for this option")
+_CURL_WARNING(_curl_easy_setopt_err_error_buffer,
+              "curl_easy_setopt expects a "
+              "char buffer of CURL_ERROR_SIZE as argument for this option")
+_CURL_WARNING(_curl_easy_setopt_err_FILE,
+  "curl_easy_setopt expects a 'FILE *' argument for this option")
+_CURL_WARNING(_curl_easy_setopt_err_postfields,
+  "curl_easy_setopt expects a 'void *' or 'char *' argument for this option")
+_CURL_WARNING(_curl_easy_setopt_err_curl_httpost,
+              "curl_easy_setopt expects a 'struct curl_httppost *' "
+              "argument for this option")
+_CURL_WARNING(_curl_easy_setopt_err_curl_mimepost,
+              "curl_easy_setopt expects a 'curl_mime *' "
+              "argument for this option")
+_CURL_WARNING(_curl_easy_setopt_err_curl_slist,
+  "curl_easy_setopt expects a 'struct curl_slist *' argument for this option")
+_CURL_WARNING(_curl_easy_setopt_err_CURLSH,
+  "curl_easy_setopt expects a CURLSH* argument for this option")
+
+_CURL_WARNING(_curl_easy_getinfo_err_string,
+  "curl_easy_getinfo expects a pointer to 'char *' for this info")
+_CURL_WARNING(_curl_easy_getinfo_err_long,
+  "curl_easy_getinfo expects a pointer to long for this info")
+_CURL_WARNING(_curl_easy_getinfo_err_double,
+  "curl_easy_getinfo expects a pointer to double for this info")
+_CURL_WARNING(_curl_easy_getinfo_err_curl_slist,
+  "curl_easy_getinfo expects a pointer to 'struct curl_slist *' for this info")
+_CURL_WARNING(_curl_easy_getinfo_err_curl_tlssesssioninfo,
+              "curl_easy_getinfo expects a pointer to "
+              "'struct curl_tlssessioninfo *' for this info")
+_CURL_WARNING(_curl_easy_getinfo_err_curl_certinfo,
+              "curl_easy_getinfo expects a pointer to "
+              "'struct curl_certinfo *' for this info")
+_CURL_WARNING(_curl_easy_getinfo_err_curl_socket,
+  "curl_easy_getinfo expects a pointer to curl_socket_t for this info")
+_CURL_WARNING(_curl_easy_getinfo_err_curl_off_t,
+  "curl_easy_getinfo expects a pointer to curl_off_t for this info")
+
+/* groups of curl_easy_setops options that take the same type of argument */
+
+/* To add a new option to one of the groups, just add
+ *   (option) == CURLOPT_SOMETHING
+ * to the or-expression. If the option takes a long or curl_off_t, you don't
+ * have to do anything
+ */
+
+/* evaluates to true if option takes a long argument */
+#define _curl_is_long_option(option)                                          \
+  (0 < (option) && (option) < CURLOPTTYPE_OBJECTPOINT)
+
+#define _curl_is_off_t_option(option)                                         \
+  ((option) > CURLOPTTYPE_OFF_T)
+
+/* evaluates to true if option takes a char* argument */
+#define _curl_is_string_option(option)                                        \
+  ((option) == CURLOPT_ABSTRACT_UNIX_SOCKET ||                                \
+   (option) == CURLOPT_ACCEPT_ENCODING ||                                     \
+   (option) == CURLOPT_ALTSVC ||                                              \
+   (option) == CURLOPT_CAINFO ||                                              \
+   (option) == CURLOPT_CAPATH ||                                              \
+   (option) == CURLOPT_COOKIE ||                                              \
+   (option) == CURLOPT_COOKIEFILE ||                                          \
+   (option) == CURLOPT_COOKIEJAR ||                                           \
+   (option) == CURLOPT_COOKIELIST ||                                          \
+   (option) == CURLOPT_CRLFILE ||                                             \
+   (option) == CURLOPT_CUSTOMREQUEST ||                                       \
+   (option) == CURLOPT_DEFAULT_PROTOCOL ||                                    \
+   (option) == CURLOPT_DNS_INTERFACE ||                                       \
+   (option) == CURLOPT_DNS_LOCAL_IP4 ||                                       \
+   (option) == CURLOPT_DNS_LOCAL_IP6 ||                                       \
+   (option) == CURLOPT_DNS_SERVERS ||                                         \
+   (option) == CURLOPT_DOH_URL ||                                             \
+   (option) == CURLOPT_EGDSOCKET ||                                           \
+   (option) == CURLOPT_FTPPORT ||                                             \
+   (option) == CURLOPT_FTP_ACCOUNT ||                                         \
+   (option) == CURLOPT_FTP_ALTERNATIVE_TO_USER ||                             \
+   (option) == CURLOPT_INTERFACE ||                                           \
+   (option) == CURLOPT_ISSUERCERT ||                                          \
+   (option) == CURLOPT_KEYPASSWD ||                                           \
+   (option) == CURLOPT_KRBLEVEL ||                                            \
+   (option) == CURLOPT_LOGIN_OPTIONS ||                                       \
+   (option) == CURLOPT_MAIL_AUTH ||                                           \
+   (option) == CURLOPT_MAIL_FROM ||                                           \
+   (option) == CURLOPT_NETRC_FILE ||                                          \
+   (option) == CURLOPT_NOPROXY ||                                             \
+   (option) == CURLOPT_PASSWORD ||                                            \
+   (option) == CURLOPT_PINNEDPUBLICKEY ||                                     \
+   (option) == CURLOPT_PRE_PROXY ||                                           \
+   (option) == CURLOPT_PROXY ||                                               \
+   (option) == CURLOPT_PROXYPASSWORD ||                                       \
+   (option) == CURLOPT_PROXYUSERNAME ||                                       \
+   (option) == CURLOPT_PROXYUSERPWD ||                                        \
+   (option) == CURLOPT_PROXY_CAINFO ||                                        \
+   (option) == CURLOPT_PROXY_CAPATH ||                                        \
+   (option) == CURLOPT_PROXY_CRLFILE ||                                       \
+   (option) == CURLOPT_PROXY_KEYPASSWD ||                                     \
+   (option) == CURLOPT_PROXY_PINNEDPUBLICKEY ||                               \
+   (option) == CURLOPT_PROXY_SERVICE_NAME ||                                  \
+   (option) == CURLOPT_PROXY_SSLCERT ||                                       \
+   (option) == CURLOPT_PROXY_SSLCERTTYPE ||                                   \
+   (option) == CURLOPT_PROXY_SSLKEY ||                                        \
+   (option) == CURLOPT_PROXY_SSLKEYTYPE ||                                    \
+   (option) == CURLOPT_PROXY_SSL_CIPHER_LIST ||                               \
+   (option) == CURLOPT_PROXY_TLSAUTH_PASSWORD ||                              \
+   (option) == CURLOPT_PROXY_TLSAUTH_USERNAME ||                              \
+   (option) == CURLOPT_PROXY_TLSAUTH_TYPE ||                                  \
+   (option) == CURLOPT_RANDOM_FILE ||                                         \
+   (option) == CURLOPT_RANGE ||                                               \
+   (option) == CURLOPT_REFERER ||                                             \
+   (option) == CURLOPT_RTSP_SESSION_ID ||                                     \
+   (option) == CURLOPT_RTSP_STREAM_URI ||                                     \
+   (option) == CURLOPT_RTSP_TRANSPORT ||                                      \
+   (option) == CURLOPT_SERVICE_NAME ||                                        \
+   (option) == CURLOPT_SOCKS5_GSSAPI_SERVICE ||                               \
+   (option) == CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 ||                             \
+   (option) == CURLOPT_SSH_KNOWNHOSTS ||                                      \
+   (option) == CURLOPT_SSH_PRIVATE_KEYFILE ||                                 \
+   (option) == CURLOPT_SSH_PUBLIC_KEYFILE ||                                  \
+   (option) == CURLOPT_SSLCERT ||                                             \
+   (option) == CURLOPT_SSLCERTTYPE ||                                         \
+   (option) == CURLOPT_SSLENGINE ||                                           \
+   (option) == CURLOPT_SSLKEY ||                                              \
+   (option) == CURLOPT_SSLKEYTYPE ||                                          \
+   (option) == CURLOPT_SSL_CIPHER_LIST ||                                     \
+   (option) == CURLOPT_TLSAUTH_PASSWORD ||                                    \
+   (option) == CURLOPT_TLSAUTH_TYPE ||                                        \
+   (option) == CURLOPT_TLSAUTH_USERNAME ||                                    \
+   (option) == CURLOPT_UNIX_SOCKET_PATH ||                                    \
+   (option) == CURLOPT_URL ||                                                 \
+   (option) == CURLOPT_USERAGENT ||                                           \
+   (option) == CURLOPT_USERNAME ||                                            \
+   (option) == CURLOPT_USERPWD ||                                             \
+   (option) == CURLOPT_XOAUTH2_BEARER ||                                      \
+   0)
+
+/* evaluates to true if option takes a curl_write_callback argument */
+#define _curl_is_write_cb_option(option)                                      \
+  ((option) == CURLOPT_HEADERFUNCTION ||                                      \
+   (option) == CURLOPT_WRITEFUNCTION)
+
+/* evaluates to true if option takes a curl_conv_callback argument */
+#define _curl_is_conv_cb_option(option)                                       \
+  ((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION ||                            \
+   (option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION ||                          \
+   (option) == CURLOPT_CONV_FROM_UTF8_FUNCTION)
+
+/* evaluates to true if option takes a data argument to pass to a callback */
+#define _curl_is_cb_data_option(option)                                       \
+  ((option) == CURLOPT_CHUNK_DATA ||                                          \
+   (option) == CURLOPT_CLOSESOCKETDATA ||                                     \
+   (option) == CURLOPT_DEBUGDATA ||                                           \
+   (option) == CURLOPT_FNMATCH_DATA ||                                        \
+   (option) == CURLOPT_HEADERDATA ||                                          \
+   (option) == CURLOPT_INTERLEAVEDATA ||                                      \
+   (option) == CURLOPT_IOCTLDATA ||                                           \
+   (option) == CURLOPT_OPENSOCKETDATA ||                                      \
+   (option) == CURLOPT_PRIVATE ||                                             \
+   (option) == CURLOPT_PROGRESSDATA ||                                        \
+   (option) == CURLOPT_READDATA ||                                            \
+   (option) == CURLOPT_SEEKDATA ||                                            \
+   (option) == CURLOPT_SOCKOPTDATA ||                                         \
+   (option) == CURLOPT_SSH_KEYDATA ||                                         \
+   (option) == CURLOPT_SSL_CTX_DATA ||                                        \
+   (option) == CURLOPT_WRITEDATA ||                                           \
+   (option) == CURLOPT_RESOLVER_START_DATA ||                                 \
+   (option) == CURLOPT_CURLU ||                                               \
+   0)
+
+/* evaluates to true if option takes a POST data argument (void* or char*) */
+#define _curl_is_postfields_option(option)                                    \
+  ((option) == CURLOPT_POSTFIELDS ||                                          \
+   (option) == CURLOPT_COPYPOSTFIELDS ||                                      \
+   0)
+
+/* evaluates to true if option takes a struct curl_slist * argument */
+#define _curl_is_slist_option(option)                                         \
+  ((option) == CURLOPT_HTTP200ALIASES ||                                      \
+   (option) == CURLOPT_HTTPHEADER ||                                          \
+   (option) == CURLOPT_MAIL_RCPT ||                                           \
+   (option) == CURLOPT_POSTQUOTE ||                                           \
+   (option) == CURLOPT_PREQUOTE ||                                            \
+   (option) == CURLOPT_PROXYHEADER ||                                         \
+   (option) == CURLOPT_QUOTE ||                                               \
+   (option) == CURLOPT_RESOLVE ||                                             \
+   (option) == CURLOPT_TELNETOPTIONS ||                                       \
+   0)
+
+/* groups of curl_easy_getinfo infos that take the same type of argument */
+
+/* evaluates to true if info expects a pointer to char * argument */
+#define _curl_is_string_info(info)                                            \
+  (CURLINFO_STRING < (info) && (info) < CURLINFO_LONG)
+
+/* evaluates to true if info expects a pointer to long argument */
+#define _curl_is_long_info(info)                                              \
+  (CURLINFO_LONG < (info) && (info) < CURLINFO_DOUBLE)
+
+/* evaluates to true if info expects a pointer to double argument */
+#define _curl_is_double_info(info)                                            \
+  (CURLINFO_DOUBLE < (info) && (info) < CURLINFO_SLIST)
+
+/* true if info expects a pointer to struct curl_slist * argument */
+#define _curl_is_slist_info(info)                                       \
+  (((info) == CURLINFO_SSL_ENGINES) || ((info) == CURLINFO_COOKIELIST))
+
+/* true if info expects a pointer to struct curl_tlssessioninfo * argument */
+#define _curl_is_tlssessioninfo_info(info)                              \
+  (((info) == CURLINFO_TLS_SSL_PTR) || ((info) == CURLINFO_TLS_SESSION))
+
+/* true if info expects a pointer to struct curl_certinfo * argument */
+#define _curl_is_certinfo_info(info) ((info) == CURLINFO_CERTINFO)
+
+/* true if info expects a pointer to struct curl_socket_t argument */
+#define _curl_is_socket_info(info)                                            \
+  (CURLINFO_SOCKET < (info) && (info) < CURLINFO_OFF_T)
+
+/* true if info expects a pointer to curl_off_t argument */
+#define _curl_is_off_t_info(info)                                             \
+  (CURLINFO_OFF_T < (info))
+
+
+/* typecheck helpers -- check whether given expression has requested type*/
+
+/* For pointers, you can use the _curl_is_ptr/_curl_is_arr macros,
+ * otherwise define a new macro. Search for __builtin_types_compatible_p
+ * in the GCC manual.
+ * NOTE: these macros MUST NOT EVALUATE their arguments! The argument is
+ * the actual expression passed to the curl_easy_setopt macro. This
+ * means that you can only apply the sizeof and __typeof__ operators, no
+ * == or whatsoever.
+ */
+
+/* XXX: should evaluate to true if expr is a pointer */
+#define _curl_is_any_ptr(expr)                                                \
+  (sizeof(expr) == sizeof(void *))
+
+/* evaluates to true if expr is NULL */
+/* XXX: must not evaluate expr, so this check is not accurate */
+#define _curl_is_NULL(expr)                                                   \
+  (__builtin_types_compatible_p(__typeof__(expr), __typeof__(NULL)))
+
+/* evaluates to true if expr is type*, const type* or NULL */
+#define _curl_is_ptr(expr, type)                                              \
+  (_curl_is_NULL(expr) ||                                                     \
+   __builtin_types_compatible_p(__typeof__(expr), type *) ||                  \
+   __builtin_types_compatible_p(__typeof__(expr), const type *))
+
+/* evaluates to true if expr is one of type[], type*, NULL or const type* */
+#define _curl_is_arr(expr, type)                                              \
+  (_curl_is_ptr((expr), type) ||                                              \
+   __builtin_types_compatible_p(__typeof__(expr), type []))
+
+/* evaluates to true if expr is a string */
+#define _curl_is_string(expr)                                                 \
+  (_curl_is_arr((expr), char) ||                                              \
+   _curl_is_arr((expr), signed char) ||                                       \
+   _curl_is_arr((expr), unsigned char))
+
+/* evaluates to true if expr is a long (no matter the signedness)
+ * XXX: for now, int is also accepted (and therefore short and char, which
+ * are promoted to int when passed to a variadic function) */
+#define _curl_is_long(expr)                                                   \
+  (__builtin_types_compatible_p(__typeof__(expr), long) ||                    \
+   __builtin_types_compatible_p(__typeof__(expr), signed long) ||             \
+   __builtin_types_compatible_p(__typeof__(expr), unsigned long) ||           \
+   __builtin_types_compatible_p(__typeof__(expr), int) ||                     \
+   __builtin_types_compatible_p(__typeof__(expr), signed int) ||              \
+   __builtin_types_compatible_p(__typeof__(expr), unsigned int) ||            \
+   __builtin_types_compatible_p(__typeof__(expr), short) ||                   \
+   __builtin_types_compatible_p(__typeof__(expr), signed short) ||            \
+   __builtin_types_compatible_p(__typeof__(expr), unsigned short) ||          \
+   __builtin_types_compatible_p(__typeof__(expr), char) ||                    \
+   __builtin_types_compatible_p(__typeof__(expr), signed char) ||             \
+   __builtin_types_compatible_p(__typeof__(expr), unsigned char))
+
+/* evaluates to true if expr is of type curl_off_t */
+#define _curl_is_off_t(expr)                                                  \
+  (__builtin_types_compatible_p(__typeof__(expr), curl_off_t))
+
+/* evaluates to true if expr is abuffer suitable for CURLOPT_ERRORBUFFER */
+/* XXX: also check size of an char[] array? */
+#define _curl_is_error_buffer(expr)                                           \
+  (_curl_is_NULL(expr) ||                                                     \
+   __builtin_types_compatible_p(__typeof__(expr), char *) ||                  \
+   __builtin_types_compatible_p(__typeof__(expr), char[]))
+
+/* evaluates to true if expr is of type (const) void* or (const) FILE* */
+#if 0
+#define _curl_is_cb_data(expr)                                                \
+  (_curl_is_ptr((expr), void) ||                                              \
+   _curl_is_ptr((expr), FILE))
+#else /* be less strict */
+#define _curl_is_cb_data(expr)                                                \
+  _curl_is_any_ptr(expr)
+#endif
+
+/* evaluates to true if expr is of type FILE* */
+#define _curl_is_FILE(expr)                                             \
+  (_curl_is_NULL(expr) ||                                              \
+   (__builtin_types_compatible_p(__typeof__(expr), FILE *)))
+
+/* evaluates to true if expr can be passed as POST data (void* or char*) */
+#define _curl_is_postfields(expr)                                             \
+  (_curl_is_ptr((expr), void) ||                                              \
+   _curl_is_arr((expr), char) ||                                              \
+   _curl_is_arr((expr), unsigned char))
+
+/* helper: __builtin_types_compatible_p distinguishes between functions and
+ * function pointers, hide it */
+#define _curl_callback_compatible(func, type)                                 \
+  (__builtin_types_compatible_p(__typeof__(func), type) ||                    \
+   __builtin_types_compatible_p(__typeof__(func) *, type))
+
+/* evaluates to true if expr is of type curl_resolver_start_callback */
+#define _curl_is_resolver_start_callback(expr)       \
+  (_curl_is_NULL(expr) || \
+   _curl_callback_compatible((expr), curl_resolver_start_callback))
+
+/* evaluates to true if expr is of type curl_read_callback or "similar" */
+#define _curl_is_read_cb(expr)                                          \
+  (_curl_is_NULL(expr) ||                                                     \
+   _curl_callback_compatible((expr), __typeof__(fread) *) ||                  \
+   _curl_callback_compatible((expr), curl_read_callback) ||                   \
+   _curl_callback_compatible((expr), _curl_read_callback1) ||                 \
+   _curl_callback_compatible((expr), _curl_read_callback2) ||                 \
+   _curl_callback_compatible((expr), _curl_read_callback3) ||                 \
+   _curl_callback_compatible((expr), _curl_read_callback4) ||                 \
+   _curl_callback_compatible((expr), _curl_read_callback5) ||                 \
+   _curl_callback_compatible((expr), _curl_read_callback6))
+typedef size_t (*_curl_read_callback1)(char *, size_t, size_t, void *);
+typedef size_t (*_curl_read_callback2)(char *, size_t, size_t, const void *);
+typedef size_t (*_curl_read_callback3)(char *, size_t, size_t, FILE *);
+typedef size_t (*_curl_read_callback4)(void *, size_t, size_t, void *);
+typedef size_t (*_curl_read_callback5)(void *, size_t, size_t, const void *);
+typedef size_t (*_curl_read_callback6)(void *, size_t, size_t, FILE *);
+
+/* evaluates to true if expr is of type curl_write_callback or "similar" */
+#define _curl_is_write_cb(expr)                                               \
+  (_curl_is_read_cb(expr) ||                                            \
+   _curl_callback_compatible((expr), __typeof__(fwrite) *) ||                 \
+   _curl_callback_compatible((expr), curl_write_callback) ||                  \
+   _curl_callback_compatible((expr), _curl_write_callback1) ||                \
+   _curl_callback_compatible((expr), _curl_write_callback2) ||                \
+   _curl_callback_compatible((expr), _curl_write_callback3) ||                \
+   _curl_callback_compatible((expr), _curl_write_callback4) ||                \
+   _curl_callback_compatible((expr), _curl_write_callback5) ||                \
+   _curl_callback_compatible((expr), _curl_write_callback6))
+typedef size_t (*_curl_write_callback1)(const char *, size_t, size_t, void *);
+typedef size_t (*_curl_write_callback2)(const char *, size_t, size_t,
+                                       const void *);
+typedef size_t (*_curl_write_callback3)(const char *, size_t, size_t, FILE *);
+typedef size_t (*_curl_write_callback4)(const void *, size_t, size_t, void *);
+typedef size_t (*_curl_write_callback5)(const void *, size_t, size_t,
+                                       const void *);
+typedef size_t (*_curl_write_callback6)(const void *, size_t, size_t, FILE *);
+
+/* evaluates to true if expr is of type curl_ioctl_callback or "similar" */
+#define _curl_is_ioctl_cb(expr)                                         \
+  (_curl_is_NULL(expr) ||                                                     \
+   _curl_callback_compatible((expr), curl_ioctl_callback) ||                  \
+   _curl_callback_compatible((expr), _curl_ioctl_callback1) ||                \
+   _curl_callback_compatible((expr), _curl_ioctl_callback2) ||                \
+   _curl_callback_compatible((expr), _curl_ioctl_callback3) ||                \
+   _curl_callback_compatible((expr), _curl_ioctl_callback4))
+typedef curlioerr (*_curl_ioctl_callback1)(CURL *, int, void *);
+typedef curlioerr (*_curl_ioctl_callback2)(CURL *, int, const void *);
+typedef curlioerr (*_curl_ioctl_callback3)(CURL *, curliocmd, void *);
+typedef curlioerr (*_curl_ioctl_callback4)(CURL *, curliocmd, const void *);
+
+/* evaluates to true if expr is of type curl_sockopt_callback or "similar" */
+#define _curl_is_sockopt_cb(expr)                                       \
+  (_curl_is_NULL(expr) ||                                                     \
+   _curl_callback_compatible((expr), curl_sockopt_callback) ||                \
+   _curl_callback_compatible((expr), _curl_sockopt_callback1) ||              \
+   _curl_callback_compatible((expr), _curl_sockopt_callback2))
+typedef int (*_curl_sockopt_callback1)(void *, curl_socket_t, curlsocktype);
+typedef int (*_curl_sockopt_callback2)(const void *, curl_socket_t,
+                                      curlsocktype);
+
+/* evaluates to true if expr is of type curl_opensocket_callback or
+   "similar" */
+#define _curl_is_opensocket_cb(expr)                                    \
+  (_curl_is_NULL(expr) ||                                                     \
+   _curl_callback_compatible((expr), curl_opensocket_callback) ||             \
+   _curl_callback_compatible((expr), _curl_opensocket_callback1) ||           \
+   _curl_callback_compatible((expr), _curl_opensocket_callback2) ||           \
+   _curl_callback_compatible((expr), _curl_opensocket_callback3) ||           \
+   _curl_callback_compatible((expr), _curl_opensocket_callback4))
+typedef curl_socket_t (*_curl_opensocket_callback1)
+  (void *, curlsocktype, struct curl_sockaddr *);
+typedef curl_socket_t (*_curl_opensocket_callback2)
+  (void *, curlsocktype, const struct curl_sockaddr *);
+typedef curl_socket_t (*_curl_opensocket_callback3)
+  (const void *, curlsocktype, struct curl_sockaddr *);
+typedef curl_socket_t (*_curl_opensocket_callback4)
+  (const void *, curlsocktype, const struct curl_sockaddr *);
+
+/* evaluates to true if expr is of type curl_progress_callback or "similar" */
+#define _curl_is_progress_cb(expr)                                      \
+  (_curl_is_NULL(expr) ||                                                     \
+   _curl_callback_compatible((expr), curl_progress_callback) ||               \
+   _curl_callback_compatible((expr), _curl_progress_callback1) ||             \
+   _curl_callback_compatible((expr), _curl_progress_callback2))
+typedef int (*_curl_progress_callback1)(void *,
+    double, double, double, double);
+typedef int (*_curl_progress_callback2)(const void *,
+    double, double, double, double);
+
+/* evaluates to true if expr is of type curl_debug_callback or "similar" */
+#define _curl_is_debug_cb(expr)                                         \
+  (_curl_is_NULL(expr) ||                                                     \
+   _curl_callback_compatible((expr), curl_debug_callback) ||                  \
+   _curl_callback_compatible((expr), _curl_debug_callback1) ||                \
+   _curl_callback_compatible((expr), _curl_debug_callback2) ||                \
+   _curl_callback_compatible((expr), _curl_debug_callback3) ||                \
+   _curl_callback_compatible((expr), _curl_debug_callback4) ||                \
+   _curl_callback_compatible((expr), _curl_debug_callback5) ||                \
+   _curl_callback_compatible((expr), _curl_debug_callback6) ||                \
+   _curl_callback_compatible((expr), _curl_debug_callback7) ||                \
+   _curl_callback_compatible((expr), _curl_debug_callback8))
+typedef int (*_curl_debug_callback1) (CURL *,
+    curl_infotype, char *, size_t, void *);
+typedef int (*_curl_debug_callback2) (CURL *,
+    curl_infotype, char *, size_t, const void *);
+typedef int (*_curl_debug_callback3) (CURL *,
+    curl_infotype, const char *, size_t, void *);
+typedef int (*_curl_debug_callback4) (CURL *,
+    curl_infotype, const char *, size_t, const void *);
+typedef int (*_curl_debug_callback5) (CURL *,
+    curl_infotype, unsigned char *, size_t, void *);
+typedef int (*_curl_debug_callback6) (CURL *,
+    curl_infotype, unsigned char *, size_t, const void *);
+typedef int (*_curl_debug_callback7) (CURL *,
+    curl_infotype, const unsigned char *, size_t, void *);
+typedef int (*_curl_debug_callback8) (CURL *,
+    curl_infotype, const unsigned char *, size_t, const void *);
+
+/* evaluates to true if expr is of type curl_ssl_ctx_callback or "similar" */
+/* this is getting even messier... */
+#define _curl_is_ssl_ctx_cb(expr)                                       \
+  (_curl_is_NULL(expr) ||                                                     \
+   _curl_callback_compatible((expr), curl_ssl_ctx_callback) ||                \
+   _curl_callback_compatible((expr), _curl_ssl_ctx_callback1) ||              \
+   _curl_callback_compatible((expr), _curl_ssl_ctx_callback2) ||              \
+   _curl_callback_compatible((expr), _curl_ssl_ctx_callback3) ||              \
+   _curl_callback_compatible((expr), _curl_ssl_ctx_callback4) ||              \
+   _curl_callback_compatible((expr), _curl_ssl_ctx_callback5) ||              \
+   _curl_callback_compatible((expr), _curl_ssl_ctx_callback6) ||              \
+   _curl_callback_compatible((expr), _curl_ssl_ctx_callback7) ||              \
+   _curl_callback_compatible((expr), _curl_ssl_ctx_callback8))
+typedef CURLcode (*_curl_ssl_ctx_callback1)(CURL *, void *, void *);
+typedef CURLcode (*_curl_ssl_ctx_callback2)(CURL *, void *, const void *);
+typedef CURLcode (*_curl_ssl_ctx_callback3)(CURL *, const void *, void *);
+typedef CURLcode (*_curl_ssl_ctx_callback4)(CURL *, const void *,
+                                            const void *);
+#ifdef HEADER_SSL_H
+/* hack: if we included OpenSSL's ssl.h, we know about SSL_CTX
+ * this will of course break if we're included before OpenSSL headers...
+ */
+typedef CURLcode (*_curl_ssl_ctx_callback5)(CURL *, SSL_CTX, void *);
+typedef CURLcode (*_curl_ssl_ctx_callback6)(CURL *, SSL_CTX, const void *);
+typedef CURLcode (*_curl_ssl_ctx_callback7)(CURL *, const SSL_CTX, void *);
+typedef CURLcode (*_curl_ssl_ctx_callback8)(CURL *, const SSL_CTX,
+                                           const void *);
+#else
+typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback5;
+typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback6;
+typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback7;
+typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback8;
+#endif
+
+/* evaluates to true if expr is of type curl_conv_callback or "similar" */
+#define _curl_is_conv_cb(expr)                                          \
+  (_curl_is_NULL(expr) ||                                                     \
+   _curl_callback_compatible((expr), curl_conv_callback) ||                   \
+   _curl_callback_compatible((expr), _curl_conv_callback1) ||                 \
+   _curl_callback_compatible((expr), _curl_conv_callback2) ||                 \
+   _curl_callback_compatible((expr), _curl_conv_callback3) ||                 \
+   _curl_callback_compatible((expr), _curl_conv_callback4))
+typedef CURLcode (*_curl_conv_callback1)(char *, size_t length);
+typedef CURLcode (*_curl_conv_callback2)(const char *, size_t length);
+typedef CURLcode (*_curl_conv_callback3)(void *, size_t length);
+typedef CURLcode (*_curl_conv_callback4)(const void *, size_t length);
+
+/* evaluates to true if expr is of type curl_seek_callback or "similar" */
+#define _curl_is_seek_cb(expr)                                          \
+  (_curl_is_NULL(expr) ||                                                     \
+   _curl_callback_compatible((expr), curl_seek_callback) ||                   \
+   _curl_callback_compatible((expr), _curl_seek_callback1) ||                 \
+   _curl_callback_compatible((expr), _curl_seek_callback2))
+typedef CURLcode (*_curl_seek_callback1)(void *, curl_off_t, int);
+typedef CURLcode (*_curl_seek_callback2)(const void *, curl_off_t, int);
+
+
+#endif /* __CURL_TYPECHECK_GCC_H */
diff --git a/components/cronet/third_party/curl_headers/include/curl/urlapi.h b/components/cronet/third_party/curl_headers/include/curl/urlapi.h
new file mode 100644
index 0000000..58e89d8
--- /dev/null
+++ b/components/cronet/third_party/curl_headers/include/curl/urlapi.h
@@ -0,0 +1,123 @@
+#ifndef __CURL_URLAPI_H
+#define __CURL_URLAPI_H
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+
+#include "curl.h"
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+/* the error codes for the URL API */
+typedef enum {
+  CURLUE_OK,
+  CURLUE_BAD_HANDLE,          /* 1 */
+  CURLUE_BAD_PARTPOINTER,     /* 2 */
+  CURLUE_MALFORMED_INPUT,     /* 3 */
+  CURLUE_BAD_PORT_NUMBER,     /* 4 */
+  CURLUE_UNSUPPORTED_SCHEME,  /* 5 */
+  CURLUE_URLDECODE,           /* 6 */
+  CURLUE_OUT_OF_MEMORY,       /* 7 */
+  CURLUE_USER_NOT_ALLOWED,    /* 8 */
+  CURLUE_UNKNOWN_PART,        /* 9 */
+  CURLUE_NO_SCHEME,           /* 10 */
+  CURLUE_NO_USER,             /* 11 */
+  CURLUE_NO_PASSWORD,         /* 12 */
+  CURLUE_NO_OPTIONS,          /* 13 */
+  CURLUE_NO_HOST,             /* 14 */
+  CURLUE_NO_PORT,             /* 15 */
+  CURLUE_NO_QUERY,            /* 16 */
+  CURLUE_NO_FRAGMENT          /* 17 */
+} CURLUcode;
+
+typedef enum {
+  CURLUPART_URL,
+  CURLUPART_SCHEME,
+  CURLUPART_USER,
+  CURLUPART_PASSWORD,
+  CURLUPART_OPTIONS,
+  CURLUPART_HOST,
+  CURLUPART_PORT,
+  CURLUPART_PATH,
+  CURLUPART_QUERY,
+  CURLUPART_FRAGMENT,
+  CURLUPART_ZONEID /* added in 7.65.0 */
+} CURLUPart;
+
+#define CURLU_DEFAULT_PORT (1<<0)       /* return default port number */
+#define CURLU_NO_DEFAULT_PORT (1<<1)    /* act as if no port number was set,
+                                           if the port number matches the
+                                           default for the scheme */
+#define CURLU_DEFAULT_SCHEME (1<<2)     /* return default scheme if
+                                           missing */
+#define CURLU_NON_SUPPORT_SCHEME (1<<3) /* allow non-supported scheme */
+#define CURLU_PATH_AS_IS (1<<4)         /* leave dot sequences */
+#define CURLU_DISALLOW_USER (1<<5)      /* no user+password allowed */
+#define CURLU_URLDECODE (1<<6)          /* URL decode on get */
+#define CURLU_URLENCODE (1<<7)          /* URL encode on set */
+#define CURLU_APPENDQUERY (1<<8)        /* append a form style part */
+#define CURLU_GUESS_SCHEME (1<<9)       /* legacy curl-style guessing */
+
+typedef struct Curl_URL CURLU;
+
+/*
+ * curl_url() creates a new CURLU handle and returns a pointer to it.
+ * Must be freed with curl_url_cleanup().
+ */
+CURL_EXTERN CURLU *curl_url(void);
+
+/*
+ * curl_url_cleanup() frees the CURLU handle and related resources used for
+ * the URL parsing. It will not free strings previously returned with the URL
+ * API.
+ */
+CURL_EXTERN void curl_url_cleanup(CURLU *handle);
+
+/*
+ * curl_url_dup() duplicates a CURLU handle and returns a new copy. The new
+ * handle must also be freed with curl_url_cleanup().
+ */
+CURL_EXTERN CURLU *curl_url_dup(CURLU *in);
+
+/*
+ * curl_url_get() extracts a specific part of the URL from a CURLU
+ * handle. Returns error code. The returned pointer MUST be freed with
+ * curl_free() afterwards.
+ */
+CURL_EXTERN CURLUcode curl_url_get(CURLU *handle, CURLUPart what,
+                                   char **part, unsigned int flags);
+
+/*
+ * curl_url_set() sets a specific part of the URL in a CURLU handle. Returns
+ * error code. The passed in string will be copied. Passing a NULL instead of
+ * a part string, clears that part.
+ */
+CURL_EXTERN CURLUcode curl_url_set(CURLU *handle, CURLUPart what,
+                                   const char *part, unsigned int flags);
+
+
+#ifdef __cplusplus
+} /* end of extern "C" */
+#endif
+
+#endif
diff --git a/components/domain_reliability/util.cc b/components/domain_reliability/util.cc
index 06eb155..9ae0da34 100644
--- a/components/domain_reliability/util.cc
+++ b/components/domain_reliability/util.cc
@@ -22,53 +22,51 @@
   int net_error;
   const char* beacon_status;
 } net_error_map[] = {
-  { net::OK, "ok" },
-  { net::ERR_ABORTED, "aborted" },
-  { net::ERR_TIMED_OUT, "tcp.connection.timed_out" },
-  { net::ERR_CONNECTION_CLOSED, "tcp.connection.closed" },
-  { net::ERR_CONNECTION_RESET, "tcp.connection.reset" },
-  { net::ERR_CONNECTION_REFUSED, "tcp.connection.refused" },
-  { net::ERR_CONNECTION_ABORTED, "tcp.connection.aborted" },
-  { net::ERR_CONNECTION_FAILED, "tcp.connection.failed" },
-  { net::ERR_NAME_NOT_RESOLVED, "dns" },
-  { net::ERR_SSL_PROTOCOL_ERROR, "ssl.protocol.error" },
-  { net::ERR_ADDRESS_INVALID, "tcp.connection.address_invalid" },
-  { net::ERR_ADDRESS_UNREACHABLE, "tcp.connection.address_unreachable" },
-  { net::ERR_CONNECTION_TIMED_OUT, "tcp.connection.timed_out" },
-  { net::ERR_NAME_RESOLUTION_FAILED, "dns" },
-  { net::ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN,
-        "ssl.cert.pinned_key_not_in_cert_chain" },
-  { net::ERR_CERT_COMMON_NAME_INVALID, "ssl.cert.name_invalid" },
-  { net::ERR_CERT_DATE_INVALID, "ssl.cert.date_invalid" },
-  { net::ERR_CERT_AUTHORITY_INVALID, "ssl.cert.authority_invalid" },
-  { net::ERR_CERT_REVOKED, "ssl.cert.revoked" },
-  { net::ERR_CERT_INVALID, "ssl.cert.invalid" },
-  { net::ERR_EMPTY_RESPONSE, "http.response.empty" },
-  { net::ERR_SPDY_PING_FAILED, "spdy.ping_failed" },
-  { net::ERR_SPDY_PROTOCOL_ERROR, "spdy.protocol" },
-  { net::ERR_QUIC_PROTOCOL_ERROR, "quic.protocol" },
-  { net::ERR_DNS_MALFORMED_RESPONSE, "dns.protocol" },
-  { net::ERR_DNS_SERVER_FAILED, "dns.server" },
-  { net::ERR_DNS_TIMED_OUT, "dns.timed_out" },
-  { net::ERR_INSECURE_RESPONSE, "ssl" },
-  { net::ERR_CONTENT_LENGTH_MISMATCH, "http.response.content_length_mismatch" },
-  { net::ERR_INCOMPLETE_CHUNKED_ENCODING,
-        "http.response.incomplete_chunked_encoding" },
-  { net::ERR_SSL_VERSION_OR_CIPHER_MISMATCH,
-        "ssl.version_or_cipher_mismatch" },
-  { net::ERR_BAD_SSL_CLIENT_AUTH_CERT, "ssl.bad_client_auth_cert" },
-  { net::ERR_INVALID_CHUNKED_ENCODING,
-        "http.response.invalid_chunked_encoding" },
-  { net::ERR_RESPONSE_HEADERS_TRUNCATED, "http.response.headers.truncated" },
-  { net::ERR_REQUEST_RANGE_NOT_SATISFIABLE,
-        "http.request.range_not_satisfiable" },
-  { net::ERR_INVALID_RESPONSE, "http.response.invalid" },
-  { net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION,
-        "http.response.headers.multiple_content_disposition" },
-  { net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_LENGTH,
-        "http.response.headers.multiple_content_length" },
-  { net::ERR_SSL_UNRECOGNIZED_NAME_ALERT, "ssl.unrecognized_name_alert" }
-};
+    {net::OK, "ok"},
+    {net::ERR_ABORTED, "aborted"},
+    {net::ERR_TIMED_OUT, "tcp.connection.timed_out"},
+    {net::ERR_CONNECTION_CLOSED, "tcp.connection.closed"},
+    {net::ERR_CONNECTION_RESET, "tcp.connection.reset"},
+    {net::ERR_CONNECTION_REFUSED, "tcp.connection.refused"},
+    {net::ERR_CONNECTION_ABORTED, "tcp.connection.aborted"},
+    {net::ERR_CONNECTION_FAILED, "tcp.connection.failed"},
+    {net::ERR_NAME_NOT_RESOLVED, "dns"},
+    {net::ERR_SSL_PROTOCOL_ERROR, "ssl.protocol.error"},
+    {net::ERR_ADDRESS_INVALID, "tcp.connection.address_invalid"},
+    {net::ERR_ADDRESS_UNREACHABLE, "tcp.connection.address_unreachable"},
+    {net::ERR_CONNECTION_TIMED_OUT, "tcp.connection.timed_out"},
+    {net::ERR_NAME_RESOLUTION_FAILED, "dns"},
+    {net::ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN,
+     "ssl.cert.pinned_key_not_in_cert_chain"},
+    {net::ERR_CERT_COMMON_NAME_INVALID, "ssl.cert.name_invalid"},
+    {net::ERR_CERT_DATE_INVALID, "ssl.cert.date_invalid"},
+    {net::ERR_CERT_AUTHORITY_INVALID, "ssl.cert.authority_invalid"},
+    {net::ERR_CERT_REVOKED, "ssl.cert.revoked"},
+    {net::ERR_CERT_INVALID, "ssl.cert.invalid"},
+    {net::ERR_EMPTY_RESPONSE, "http.response.empty"},
+    {net::ERR_HTTP2_PING_FAILED, "spdy.ping_failed"},
+    {net::ERR_HTTP2_PROTOCOL_ERROR, "spdy.protocol"},
+    {net::ERR_QUIC_PROTOCOL_ERROR, "quic.protocol"},
+    {net::ERR_DNS_MALFORMED_RESPONSE, "dns.protocol"},
+    {net::ERR_DNS_SERVER_FAILED, "dns.server"},
+    {net::ERR_DNS_TIMED_OUT, "dns.timed_out"},
+    {net::ERR_INSECURE_RESPONSE, "ssl"},
+    {net::ERR_CONTENT_LENGTH_MISMATCH, "http.response.content_length_mismatch"},
+    {net::ERR_INCOMPLETE_CHUNKED_ENCODING,
+     "http.response.incomplete_chunked_encoding"},
+    {net::ERR_SSL_VERSION_OR_CIPHER_MISMATCH, "ssl.version_or_cipher_mismatch"},
+    {net::ERR_BAD_SSL_CLIENT_AUTH_CERT, "ssl.bad_client_auth_cert"},
+    {net::ERR_INVALID_CHUNKED_ENCODING,
+     "http.response.invalid_chunked_encoding"},
+    {net::ERR_RESPONSE_HEADERS_TRUNCATED, "http.response.headers.truncated"},
+    {net::ERR_REQUEST_RANGE_NOT_SATISFIABLE,
+     "http.request.range_not_satisfiable"},
+    {net::ERR_INVALID_RESPONSE, "http.response.invalid"},
+    {net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION,
+     "http.response.headers.multiple_content_disposition"},
+    {net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_LENGTH,
+     "http.response.headers.multiple_content_length"},
+    {net::ERR_SSL_UNRECOGNIZED_NAME_ALERT, "ssl.unrecognized_name_alert"}};
 
 bool CanReportFullBeaconURLToCollector(const GURL& beacon_url,
                                        const GURL& collector_url) {
diff --git a/components/gwp_asan/buildflags/BUILD.gn b/components/gwp_asan/buildflags/BUILD.gn
index 959f4889..671efd9c 100644
--- a/components/gwp_asan/buildflags/BUILD.gn
+++ b/components/gwp_asan/buildflags/BUILD.gn
@@ -10,5 +10,6 @@
   flags = [
     "ENABLE_GWP_ASAN_MALLOC=$enable_gwp_asan_malloc",
     "ENABLE_GWP_ASAN_PARTITIONALLOC=$enable_gwp_asan_partitionalloc",
+    "ENABLE_GWP_ASAN=$enable_gwp_asan",
   ]
 }
diff --git a/components/gwp_asan/buildflags/buildflags.gni b/components/gwp_asan/buildflags/buildflags.gni
index 040e23e..a1bdaed 100644
--- a/components/gwp_asan/buildflags/buildflags.gni
+++ b/components/gwp_asan/buildflags/buildflags.gni
@@ -10,3 +10,8 @@
   enable_gwp_asan_malloc = (is_win || is_mac) && use_allocator_shim
   enable_gwp_asan_partitionalloc = (is_win || is_mac) && use_partition_alloc
 }
+
+declare_args() {
+  # Convenience definition
+  enable_gwp_asan = enable_gwp_asan_malloc || enable_gwp_asan_partitionalloc
+}
diff --git a/components/media_message_center/media_notification_view_unittest.cc b/components/media_message_center/media_notification_view_unittest.cc
index a761822..e3616d4 100644
--- a/components/media_message_center/media_notification_view_unittest.cc
+++ b/components/media_message_center/media_notification_view_unittest.cc
@@ -530,8 +530,8 @@
   EXPECT_TRUE(title_label()->GetVisible());
   EXPECT_TRUE(artist_label()->GetVisible());
 
-  EXPECT_EQ(base::ASCIIToUTF16("title"), title_label()->text());
-  EXPECT_EQ(base::ASCIIToUTF16("artist"), artist_label()->text());
+  EXPECT_EQ(base::ASCIIToUTF16("title"), title_label()->GetText());
+  EXPECT_EQ(base::ASCIIToUTF16("artist"), artist_label()->GetText());
 
   EXPECT_EQ(kMediaTitleArtistRowExpectedHeight, title_artist_row()->height());
 }
@@ -559,9 +559,10 @@
   EXPECT_TRUE(artist_label()->GetVisible());
   EXPECT_TRUE(header_row()->summary_text_for_testing()->GetVisible());
 
-  EXPECT_EQ(metadata.title, title_label()->text());
-  EXPECT_EQ(metadata.artist, artist_label()->text());
-  EXPECT_EQ(metadata.album, header_row()->summary_text_for_testing()->text());
+  EXPECT_EQ(metadata.title, title_label()->GetText());
+  EXPECT_EQ(metadata.artist, artist_label()->GetText());
+  EXPECT_EQ(metadata.album,
+            header_row()->summary_text_for_testing()->GetText());
 
   EXPECT_EQ(kMediaTitleArtistRowExpectedHeight, title_artist_row()->height());
 
diff --git a/components/neterror/resources/images/default_100_percent/offline/100-offline-instruction.png b/components/neterror/resources/images/default_100_percent/offline/100-offline-instruction.png
new file mode 100644
index 0000000..33d4f27
--- /dev/null
+++ b/components/neterror/resources/images/default_100_percent/offline/100-offline-instruction.png
Binary files differ
diff --git a/components/neterror/resources/neterror.css b/components/neterror/resources/neterror.css
index 70c9b59..7bfa5f1 100644
--- a/components/neterror/resources/neterror.css
+++ b/components/neterror/resources/neterror.css
@@ -858,6 +858,16 @@
   display: none;
 }
 
+#offline-instruction {
+  image-rendering: pixelated;
+  left: 0;
+  margin: auto;
+  position: absolute;
+  right: 0;
+  top: 60px;
+  width: fit-content;
+}
+
 @media (max-width: 420px) {
   #download-button {
     padding-bottom: 12px;
diff --git a/components/neterror/resources/neterror.html b/components/neterror/resources/neterror.html
index 8412900..705793bb 100644
--- a/components/neterror/resources/neterror.html
+++ b/components/neterror/resources/neterror.html
@@ -131,6 +131,11 @@
     <div id="sub-frame-error-details" jsselect="summary" jsvalues=".innerHTML:msg"></div>
   </div>
 
+<if expr="SHOW_INSTRUCTIONS_FOR_DINO_PAGE">
+  <div id="offline-instruction" class="hidden">
+    <img src="images/default_100_percent/offline/100-offline-instruction.png"/>
+  </div>
+</if>
   <div id="offline-resources">
     <img id="offline-resources-1x" src="images/default_100_percent/offline/100-offline-sprite.png">
     <img id="offline-resources-2x" src="images/default_200_percent/offline/200-offline-sprite.png">
diff --git a/components/neterror/resources/offline.js b/components/neterror/resources/offline.js
index 99c112b..504b2a89 100644
--- a/components/neterror/resources/offline.js
+++ b/components/neterror/resources/offline.js
@@ -386,6 +386,14 @@
 
     this.outerContainerEl.appendChild(this.containerEl);
 
+// <if expr="SHOW_INSTRUCTIONS_FOR_DINO_PAGE">
+    if (this.isArcadeMode()) {
+      document.querySelector('#offline-instruction').classList
+          .remove(HIDDEN_CLASS);
+      this.containerEl.style.top = '50px'
+    }
+// </if>
+
     this.startListening();
     this.update();
 
@@ -472,6 +480,12 @@
       this.playingIntro = true;
       this.tRex.playingIntro = true;
 
+// <if expr="SHOW_INSTRUCTIONS_FOR_DINO_PAGE">
+      if (this.isArcadeMode()) {
+        document.querySelector('#offline-instruction').classList
+            .add(HIDDEN_CLASS);
+      }
+// </if>
       // CSS animation definition.
       var keyframes = '@-webkit-keyframes intro { ' +
             'from { width:' + Trex.config.WIDTH + 'px }' +
@@ -946,6 +960,10 @@
         Runner.config.ARCADE_MODE_INITIAL_TOP_POSITION) *
         Runner.config.ARCADE_MODE_TOP_POSITION_PERCENT)) *
         window.devicePixelRatio;
+// <if expr="SHOW_INSTRUCTIONS_FOR_DINO_PAGE">
+    // We add top padding in Runner#init, no need to do it here.
+    translateY = 0;
+// </if>
     this.containerEl.style.transform = 'scale(' + scale + ') translateY(' +
         translateY + 'px)';
   },
diff --git a/components/omnibox/common/omnibox_features.cc b/components/omnibox/common/omnibox_features.cc
index 7390237..ffb1c1b5 100644
--- a/components/omnibox/common/omnibox_features.cc
+++ b/components/omnibox/common/omnibox_features.cc
@@ -21,25 +21,15 @@
 
 // Feature used to hide the scheme from steady state URLs displayed in the
 // toolbar. It is restored during editing.
-const base::Feature kHideSteadyStateUrlScheme {
-  "OmniboxUIExperimentHideSteadyStateUrlScheme",
-#if defined(OS_IOS)
-      base::FEATURE_ENABLED_BY_DEFAULT
-#else
-      base::FEATURE_DISABLED_BY_DEFAULT
-#endif
-};
+const base::Feature kHideSteadyStateUrlScheme{
+    "OmniboxUIExperimentHideSteadyStateUrlScheme",
+    base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Feature used to hide trivial subdomains from steady state URLs displayed in
 // the toolbar. It is restored during editing.
-const base::Feature kHideSteadyStateUrlTrivialSubdomains {
-  "OmniboxUIExperimentHideSteadyStateUrlTrivialSubdomains",
-#if defined(OS_IOS)
-      base::FEATURE_ENABLED_BY_DEFAULT
-#else
-      base::FEATURE_DISABLED_BY_DEFAULT
-#endif
-};
+const base::Feature kHideSteadyStateUrlTrivialSubdomains{
+    "OmniboxUIExperimentHideSteadyStateUrlTrivialSubdomains",
+    base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Feature used to hide the path, query and ref from steady state URLs
 // displayed in the toolbar. It is restored during editing.
diff --git a/components/optimization_guide/proto/hints.proto b/components/optimization_guide/proto/hints.proto
index fd24217..2f4ea430 100644
--- a/components/optimization_guide/proto/hints.proto
+++ b/components/optimization_guide/proto/hints.proto
@@ -118,6 +118,9 @@
   LITE_PAGE_REDIRECT = 3;
   // This optimization does nothing (no-op).
   OPTIMIZATION_NONE = 4;
+  // This optimization defers execution of parser-blocking script until after
+  // parsing completes.
+  DEFER_ALL_SCRIPT = 5;
 }
 
 // Presents semantics for how page load URLs should be matched.
diff --git a/components/payments/content/BUILD.gn b/components/payments/content/BUILD.gn
index d55bb90c..d53cebb 100644
--- a/components/payments/content/BUILD.gn
+++ b/components/payments/content/BUILD.gn
@@ -136,6 +136,7 @@
     "//components/autofill/core/browser",
     "//components/autofill/core/browser:test_support",
     "//components/payments/core",
+    "//components/payments/core:error_strings",
     "//components/payments/core:test_support",
     "//components/strings:components_strings_grit",
     "//components/webdata/common",
diff --git a/components/payments/content/content_payment_request_delegate.h b/components/payments/content/content_payment_request_delegate.h
index ac5c967..6eaa019 100644
--- a/components/payments/content/content_payment_request_delegate.h
+++ b/components/payments/content/content_payment_request_delegate.h
@@ -5,6 +5,8 @@
 #ifndef COMPONENTS_PAYMENTS_CONTENT_CONTENT_PAYMENT_REQUEST_DELEGATE_H_
 #define COMPONENTS_PAYMENTS_CONTENT_CONTENT_PAYMENT_REQUEST_DELEGATE_H_
 
+#include <string>
+
 #include "components/payments/content/payment_request_display_manager.h"
 #include "components/payments/core/payment_request_delegate.h"
 
@@ -40,6 +42,16 @@
   // Returns whether user interaction is enabled. (False when showing a
   // spinner.)
   virtual bool IsInteractive() const = 0;
+
+  // Returns a developer-facing error message for invalid SSL certificate state
+  // or an empty string when the SSL certificate is valid. Only EV_SECURE,
+  // SECURE, and SECURE_WITH_POLICY_INSTALLED_CERT are considered valid for web
+  // payments, unless --ignore-certificate-errors is specified on the command
+  // line.
+  //
+  // The |web_contents| parameter should not be null. A null |web_contents|
+  // parameter will return an "Invalid certificate" error message.
+  virtual std::string GetInvalidSslCertificateErrorMessage() = 0;
 };
 
 }  // namespace payments
diff --git a/components/payments/content/payment_request.cc b/components/payments/content/payment_request.cc
index b460c509..87fc9d1f 100644
--- a/components/payments/content/payment_request.cc
+++ b/components/payments/content/payment_request.cc
@@ -128,20 +128,25 @@
     return;
   }
 
+  // TODO(crbug.com/978471): Improve architecture for handling prohibited
+  // origins and invalid SSL certificates.
   bool allowed_origin =
       UrlUtil::IsOriginAllowedToUseWebPaymentApis(last_committed_url);
   if (!allowed_origin) {
-    log_.Error(errors::kProhibitedOrigin);
+    prohibited_origin_or_invalid_ssl_error_message_ = errors::kProhibitedOrigin;
   }
 
-  bool invalid_ssl = last_committed_url.SchemeIsCryptographic() &&
-                     !delegate_->IsSslCertificateValid();
-  if (invalid_ssl) {
-    log_.Error(errors::kInvalidSslCertificate);
+  bool invalid_ssl = false;
+  if (last_committed_url.SchemeIsCryptographic()) {
+    DCHECK(prohibited_origin_or_invalid_ssl_error_message_.empty());
+    prohibited_origin_or_invalid_ssl_error_message_ =
+        delegate_->GetInvalidSslCertificateErrorMessage();
+    invalid_ssl = !prohibited_origin_or_invalid_ssl_error_message_.empty();
   }
 
   if (!allowed_origin || invalid_ssl) {
     // Intentionally don't set |spec_| and |state_|, so the UI is never shown.
+    log_.Error(prohibited_origin_or_invalid_ssl_error_message_);
     log_.Error(errors::kProhibitedOriginOrInvalidSslExplanation);
     return;
   }
@@ -484,7 +489,9 @@
     journey_logger_.SetNotShown(
         JourneyLogger::NOT_SHOWN_REASON_NO_SUPPORTED_PAYMENT_METHOD);
     client_->OnError(mojom::PaymentErrorReason::NOT_SUPPORTED,
-                     GetNotSupportedErrorMessage(spec_.get()));
+                     !prohibited_origin_or_invalid_ssl_error_message_.empty()
+                         ? prohibited_origin_or_invalid_ssl_error_message_
+                         : GetNotSupportedErrorMessage(spec_.get()));
     if (observer_for_testing_)
       observer_for_testing_->OnNotSupportedError();
     OnConnectionTerminated();
diff --git a/components/payments/content/payment_request.h b/components/payments/content/payment_request.h
index 58d49e3a..6e1dc09 100644
--- a/components/payments/content/payment_request.h
+++ b/components/payments/content/payment_request.h
@@ -223,6 +223,9 @@
   // production.
   bool skip_ui_for_non_url_payment_method_identifiers_for_test_ = false;
 
+  // If not empty, use this error message for rejecting PaymentRequest.show().
+  std::string prohibited_origin_or_invalid_ssl_error_message_;
+
   base::WeakPtrFactory<PaymentRequest> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(PaymentRequest);
diff --git a/components/payments/content/service_worker_payment_instrument_unittest.cc b/components/payments/content/service_worker_payment_instrument_unittest.cc
index dc4af5e0..e8fa2b4 100644
--- a/components/payments/content/service_worker_payment_instrument_unittest.cc
+++ b/components/payments/content/service_worker_payment_instrument_unittest.cc
@@ -34,7 +34,6 @@
   MOCK_METHOD0(GetPersonalDataManager, autofill::PersonalDataManager*());
   MOCK_CONST_METHOD0(GetApplicationLocale, const std::string&());
   MOCK_CONST_METHOD0(IsIncognito, bool());
-  MOCK_METHOD0(IsSslCertificateValid, bool());
   MOCK_CONST_METHOD0(GetLastCommittedURL, const GURL&());
   MOCK_METHOD2(
       DoFullCardRequest,
diff --git a/components/payments/content/test_content_payment_request_delegate.cc b/components/payments/content/test_content_payment_request_delegate.cc
index aaeabd5..88569f2 100644
--- a/components/payments/content/test_content_payment_request_delegate.cc
+++ b/components/payments/content/test_content_payment_request_delegate.cc
@@ -5,6 +5,7 @@
 #include "components/payments/content/test_content_payment_request_delegate.h"
 
 #include "components/payments/content/payment_manifest_web_data_service.h"
+#include "components/payments/core/error_strings.h"
 
 namespace payments {
 
@@ -62,10 +63,6 @@
   return core_delegate_.IsIncognito();
 }
 
-bool TestContentPaymentRequestDelegate::IsSslCertificateValid() {
-  return core_delegate_.IsSslCertificateValid();
-}
-
 const GURL& TestContentPaymentRequestDelegate::GetLastCommittedURL() const {
   return core_delegate_.GetLastCommittedURL();
 }
@@ -107,6 +104,11 @@
   return true;
 }
 
+std::string
+TestContentPaymentRequestDelegate::GetInvalidSslCertificateErrorMessage() {
+  return "";  // Empty string indicates valid SSL certificate.
+}
+
 autofill::TestAddressNormalizer*
 TestContentPaymentRequestDelegate::test_address_normalizer() {
   return core_delegate_.test_address_normalizer();
diff --git a/components/payments/content/test_content_payment_request_delegate.h b/components/payments/content/test_content_payment_request_delegate.h
index 10ee9d93..53f47ff 100644
--- a/components/payments/content/test_content_payment_request_delegate.h
+++ b/components/payments/content/test_content_payment_request_delegate.h
@@ -34,7 +34,6 @@
   autofill::PersonalDataManager* GetPersonalDataManager() override;
   const std::string& GetApplicationLocale() const override;
   bool IsIncognito() const override;
-  bool IsSslCertificateValid() override;
   const GURL& GetLastCommittedURL() const override;
   void DoFullCardRequest(
       const autofill::CreditCard& credit_card,
@@ -49,6 +48,7 @@
       const GURL& url,
       PaymentHandlerOpenWindowCallback callback) override;
   bool IsInteractive() const override;
+  std::string GetInvalidSslCertificateErrorMessage() override;
 
   autofill::TestAddressNormalizer* test_address_normalizer();
   void DelayFullCardRequestCompletion();
diff --git a/components/payments/core/autofill_payment_instrument_unittest.cc b/components/payments/core/autofill_payment_instrument_unittest.cc
index 44611c9..bb3d97f 100644
--- a/components/payments/core/autofill_payment_instrument_unittest.cc
+++ b/components/payments/core/autofill_payment_instrument_unittest.cc
@@ -88,8 +88,6 @@
 
   bool IsIncognito() const override { return false; }
 
-  bool IsSslCertificateValid() override { return true; }
-
   const GURL& GetLastCommittedURL() const override {
     return last_committed_url_;
   }
diff --git a/components/payments/core/error_strings.cc b/components/payments/core/error_strings.cc
index 78c30dff9..db7444d 100644
--- a/components/payments/core/error_strings.cc
+++ b/components/payments/core/error_strings.cc
@@ -25,6 +25,7 @@
 const char kCannotShowWithoutInit[] = "Attempted show without initialization.";
 const char kCannotUpdateWithoutInit[] = "Attempted updateWith without initialization.";
 const char kCannotUpdateWithoutShow[] = "Attempted updateWith without show.";
+const char kDetailedInvalidSslCertificateMessageFormat[] = "SSL certificate is not valid. Security level: $.";
 const char kGenericPaymentMethodNotSupportedMessage[] = "Payment method not supported.";
 const char kInvalidSslCertificate[] = "SSL certificate is not valid.";
 const char kInvalidState[] = "Invalid state.";
diff --git a/components/payments/core/error_strings.h b/components/payments/core/error_strings.h
index a343153..ae9ef1d 100644
--- a/components/payments/core/error_strings.h
+++ b/components/payments/core/error_strings.h
@@ -58,6 +58,11 @@
 // Mojo call PaymentRequest::Show() must precede PaymentRequest::UpdateWith().
 extern const char kCannotUpdateWithoutShow[];
 
+// The format for a detailed message about invalid SSL certificate. This format
+// should be used with base::ReplaceChars() function, where "$" is the character
+// to replace.
+extern const char kDetailedInvalidSslCertificateMessageFormat[];
+
 // A message about unsupported payment method.
 extern const char kGenericPaymentMethodNotSupportedMessage[];
 
diff --git a/components/payments/core/payment_request_base_delegate.h b/components/payments/core/payment_request_base_delegate.h
index dafa12b..ac9ffed 100644
--- a/components/payments/core/payment_request_base_delegate.h
+++ b/components/payments/core/payment_request_base_delegate.h
@@ -43,10 +43,6 @@
   // Returns whether the user is in Incognito mode.
   virtual bool IsIncognito() const = 0;
 
-  // Returns true if the SSL certificate is valid. Should be called only for
-  // cryptographic schemes.
-  virtual bool IsSslCertificateValid() = 0;
-
   // Returns the URL of the page that is currently being displayed.
   virtual const GURL& GetLastCommittedURL() const = 0;
 
diff --git a/components/payments/core/test_payment_request_delegate.cc b/components/payments/core/test_payment_request_delegate.cc
index bc6a3bcb..802c4fff 100644
--- a/components/payments/core/test_payment_request_delegate.cc
+++ b/components/payments/core/test_payment_request_delegate.cc
@@ -39,10 +39,6 @@
   return false;
 }
 
-bool TestPaymentRequestDelegate::IsSslCertificateValid() {
-  return true;
-}
-
 const GURL& TestPaymentRequestDelegate::GetLastCommittedURL() const {
   return last_committed_url_;
 }
diff --git a/components/payments/core/test_payment_request_delegate.h b/components/payments/core/test_payment_request_delegate.h
index b0555b1..15dc360 100644
--- a/components/payments/core/test_payment_request_delegate.h
+++ b/components/payments/core/test_payment_request_delegate.h
@@ -36,7 +36,6 @@
   autofill::PersonalDataManager* GetPersonalDataManager() override;
   const std::string& GetApplicationLocale() const override;
   bool IsIncognito() const override;
-  bool IsSslCertificateValid() override;
   const GURL& GetLastCommittedURL() const override;
   void DoFullCardRequest(
       const autofill::CreditCard& credit_card,
diff --git a/components/policy/proto/chrome_device_policy.proto b/components/policy/proto/chrome_device_policy.proto
index 5812693..a71b482 100644
--- a/components/policy/proto/chrome_device_policy.proto
+++ b/components/policy/proto/chrome_device_policy.proto
@@ -1278,6 +1278,12 @@
   optional string device_webusb_allow_devices_for_urls = 1;
 }
 
+// Settings that control if the device is allowed to powerwash.
+message DevicePowerwashAllowedProto {
+  // Determines if powerwash is allowed on the device.
+  optional bool device_powerwash_allowed = 1;
+}
+
 message ChromeDeviceSettingsProto {
   reserved 61;
   optional DevicePolicyRefreshRateProto device_policy_refresh_rate = 1;
@@ -1391,4 +1397,5 @@
   optional DeviceScheduledUpdateCheckProto device_scheduled_update_check = 89;
   optional DeviceWebUsbAllowDevicesForUrlsProto
       device_webusb_allow_devices_for_urls = 90;
+  optional DevicePowerwashAllowedProto device_powerwash_allowed = 91;
 }
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index d65ddbf..a9f38de 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -16123,6 +16123,28 @@
 
           If this policy is disabled or not set, the browser window is allowed to launch. Note that the browser window might not launch due to other policies or command-line flags.''',
     },
+    {
+      'id': 571,
+      'name': 'DevicePowerwashAllowed',
+      'type': 'main',
+      'schema': {
+        'type': 'boolean',
+      },
+      'device_only': True,
+      'example_value': True,
+      'features': {
+        'dynamic_refresh': True,
+        'per_profile': False,
+      },
+      'supported_on': ['chrome_os:77-'],
+      'caption': '''Allow the device to request powerwash''',
+      'tags': [],
+      'desc': '''
+      This policy when set to False, does not allow the device to trigger powerwash.
+      When set to True, it allows the device to trigger powerwash.
+      If left unset, it defaults to False, meaning it doesn't allow the device to powerwash.
+      ''',
+    },
   ],
 
   'messages': {
@@ -16470,7 +16492,8 @@
     'DeviceBatteryChargeCustomStartCharging': 'device_battery_charge_mode.custom_charge_start',
     'DeviceBatteryChargeCustomStopCharging': 'device_battery_charge_mode.custom_charge_stop',
     'DeviceScheduledUpdateCheck': 'device_scheduled_update_check.device_scheduled_update_check_settings',
-    'DeviceWebUsbAllowDevicesForUrls': 'device_webusb_allow_devices_for_urls.device_webusb_allow_devices_for_urls'
+    'DeviceWebUsbAllowDevicesForUrls': 'device_webusb_allow_devices_for_urls.device_webusb_allow_devices_for_urls',
+    'DevicePowerwashAllowed': 'device_powerwash_allowed.device_powerwash_allowed'
   },
   'policy_atomic_group_definitions': [
     {
@@ -16911,6 +16934,6 @@
   ],
   'placeholders': [],
   'deleted_policy_ids': [412, 546, 562],
-  'highest_id_currently_used': 570,
+  'highest_id_currently_used': 571,
   'highest_atomic_group_id_currently_used': 37
 }
diff --git a/components/previews/content/hints_fetcher.cc b/components/previews/content/hints_fetcher.cc
index 7c06cd2c..9ddd2206 100644
--- a/components/previews/content/hints_fetcher.cc
+++ b/components/previews/content/hints_fetcher.cc
@@ -55,7 +55,8 @@
       optimization_guide::proto::NOSCRIPT);
   get_hints_request_->add_supported_optimizations(
       optimization_guide::proto::RESOURCE_LOADING);
-  // TODO(dougarnett): Add DEFER_ALL_SCRIPT once supported.
+  get_hints_request_->add_supported_optimizations(
+      optimization_guide::proto::DEFER_ALL_SCRIPT);
   static_assert(static_cast<int>(PreviewsType::DEFER_ALL_SCRIPT) + 1 ==
                     static_cast<int>(PreviewsType::LAST),
                 "PreviewsType has been updated, make sure Optimization Guide "
diff --git a/components/previews/content/previews_decider_impl.cc b/components/previews/content/previews_decider_impl.cc
index d21753c..a523ac0 100644
--- a/components/previews/content/previews_decider_impl.cc
+++ b/components/previews/content/previews_decider_impl.cc
@@ -51,11 +51,11 @@
     case PreviewsType::NOSCRIPT:
     case PreviewsType::RESOURCE_LOADING_HINTS:
     case PreviewsType::LITE_PAGE_REDIRECT:
+    case PreviewsType::DEFER_ALL_SCRIPT:
       return true;
     // These types do not have server optimization hints.
     case PreviewsType::OFFLINE:
     case PreviewsType::LITE_PAGE:
-    case PreviewsType::DEFER_ALL_SCRIPT:
       return false;
     case PreviewsType::NONE:
     case PreviewsType::UNSPECIFIED:
@@ -333,7 +333,8 @@
       return ShouldAllowPreviewPerOptimizationHints(previews_data, url, type,
                                                     passed_reasons);
     } else if (type == PreviewsType::RESOURCE_LOADING_HINTS ||
-               type == PreviewsType::NOSCRIPT) {
+               type == PreviewsType::NOSCRIPT ||
+               type == PreviewsType::DEFER_ALL_SCRIPT) {
       return PreviewsEligibilityReason::HOST_NOT_WHITELISTED_BY_SERVER;
     }
   }
@@ -373,7 +374,8 @@
                                               PreviewsType type) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(PreviewsType::NOSCRIPT == type ||
-         PreviewsType::RESOURCE_LOADING_HINTS == type);
+         PreviewsType::RESOURCE_LOADING_HINTS == type ||
+         PreviewsType::DEFER_ALL_SCRIPT == type);
   if (previews_black_list_ && !blacklist_ignored_) {
     std::vector<PreviewsEligibilityReason> passed_reasons;
     // The blacklist will disallow certain hosts for periods of time based on
@@ -412,7 +414,8 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(type == PreviewsType::LITE_PAGE_REDIRECT ||
          type == PreviewsType::NOSCRIPT ||
-         type == PreviewsType::RESOURCE_LOADING_HINTS);
+         type == PreviewsType::RESOURCE_LOADING_HINTS ||
+         type == PreviewsType::DEFER_ALL_SCRIPT);
   // For LitePageRedirect, ensure it is not blacklisted for this request, and
   // hints have been fully loaded.
   //
@@ -446,7 +449,8 @@
     std::vector<PreviewsEligibilityReason>* passed_reasons) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(type == PreviewsType::NOSCRIPT ||
-         type == PreviewsType::RESOURCE_LOADING_HINTS);
+         type == PreviewsType::RESOURCE_LOADING_HINTS ||
+         type == PreviewsType::DEFER_ALL_SCRIPT);
 
   if (!previews_opt_guide_ || !previews_opt_guide_->has_hints())
     return PreviewsEligibilityReason::OPTIMIZATION_HINTS_NOT_AVAILABLE;
diff --git a/components/previews/content/previews_decider_impl_unittest.cc b/components/previews/content/previews_decider_impl_unittest.cc
index 9efe547..573f674 100644
--- a/components/previews/content/previews_decider_impl_unittest.cc
+++ b/components/previews/content/previews_decider_impl_unittest.cc
@@ -193,14 +193,16 @@
       PreviewsType type,
       net::EffectiveConnectionType* ect_threshold) const override {
     EXPECT_TRUE(type == PreviewsType::NOSCRIPT ||
-                type == PreviewsType::RESOURCE_LOADING_HINTS);
+                type == PreviewsType::RESOURCE_LOADING_HINTS ||
+                type == PreviewsType::DEFER_ALL_SCRIPT);
     // Use default ect trigger threshold for the preview type.
     *ect_threshold = previews::params::GetECTThresholdForPreview(type);
     if (type == PreviewsType::NOSCRIPT) {
       return url.host().compare("whitelisted.example.com") == 0 ||
              url.host().compare("noscript_only_whitelisted.example.com") == 0;
     }
-    if (type == PreviewsType::RESOURCE_LOADING_HINTS) {
+    if (type == PreviewsType::RESOURCE_LOADING_HINTS ||
+        type == PreviewsType::DEFER_ALL_SCRIPT) {
       return url.host().compare("whitelisted.example.com") == 0;
     }
     return false;
@@ -425,6 +427,7 @@
     allowed_types[static_cast<int>(PreviewsType::LITE_PAGE_REDIRECT)] = 0;
     allowed_types[static_cast<int>(PreviewsType::NOSCRIPT)] = 0;
     allowed_types[static_cast<int>(PreviewsType::RESOURCE_LOADING_HINTS)] = 0;
+    allowed_types[static_cast<int>(PreviewsType::DEFER_ALL_SCRIPT)] = 0;
 
     std::unique_ptr<TestPreviewsDeciderImpl> previews_decider_impl =
         std::make_unique<TestPreviewsDeciderImpl>(&clock_);
@@ -1186,7 +1189,7 @@
   scoped_feature_list.InitWithFeatures(
       {features::kPreviews, features::kLitePageServerPreviews,
        features::kOptimizationHints, features::kNoScriptPreviews,
-       features::kResourceLoadingHints},
+       features::kResourceLoadingHints, features::kDeferAllScriptPreviews},
       {});
   InitializeUIService();
 
@@ -1203,6 +1206,11 @@
       &user_data, GURL("https://whitelisted.example.com"), false,
       PreviewsType::RESOURCE_LOADING_HINTS));
 
+  // DeferAllScript is allowed before commit without hints.
+  EXPECT_TRUE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart(
+      &user_data, GURL("https://whitelisted.example.com"), false,
+      PreviewsType::DEFER_ALL_SCRIPT));
+
   // LitePageRedirect is not allowed before commit without hints.
   EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart(
       &user_data, GURL("https://whitelisted.example.com"), false,
@@ -1223,6 +1231,9 @@
       PreviewsType::RESOURCE_LOADING_HINTS));
   EXPECT_TRUE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart(
       &user_data, GURL("https://whitelisted.example.com"), false,
+      PreviewsType::DEFER_ALL_SCRIPT));
+  EXPECT_TRUE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart(
+      &user_data, GURL("https://whitelisted.example.com"), false,
       PreviewsType::LITE_PAGE_REDIRECT));
 }
 
@@ -1377,7 +1388,7 @@
         static_cast<int>(PreviewsEligibilityReason::NETWORK_NOT_SLOW), 1);
   }
 
-  // Verify preview not allowed for whitelisted url for unknown network quality.
+  // Verify preview not allowed for whitelisted url for offline network quality.
   {
     base::HistogramTester histogram_tester;
     PreviewsUserData user_data(kDefaultPageId);
@@ -1412,6 +1423,185 @@
   }
 }
 
+TEST_F(PreviewsDeciderImplTest, DeferAllScriptNotAllowedByDefault) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitWithFeatures(
+      {features::kPreviews, features::kOptimizationHints}, {});
+  InitializeUIService();
+  InitializeOptimizationGuideHints();
+
+  base::HistogramTester histogram_tester;
+  PreviewsUserData user_data(kDefaultPageId);
+
+  EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart(
+      &user_data, GURL("https://www.google.com"), false,
+      PreviewsType::DEFER_ALL_SCRIPT));
+}
+
+TEST_F(PreviewsDeciderImplTest,
+       DeferAllScriptDisallowedWithoutOptimizationHints) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitWithFeatures(
+      {features::kPreviews, features::kDeferAllScriptPreviews},
+      {features::kOptimizationHints});
+  InitializeUIService();
+
+  base::HistogramTester histogram_tester;
+  PreviewsUserData user_data(kDefaultPageId);
+  EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart(
+      &user_data, GURL("https://whitelisted.example.com"), false,
+      PreviewsType::DEFER_ALL_SCRIPT));
+  histogram_tester.ExpectUniqueSample(
+      "Previews.EligibilityReason",
+      static_cast<int>(
+          PreviewsEligibilityReason::HOST_NOT_WHITELISTED_BY_SERVER),
+      1);
+  histogram_tester.ExpectUniqueSample(
+      "Previews.EligibilityReason.DeferAllScript",
+      static_cast<int>(
+          PreviewsEligibilityReason::HOST_NOT_WHITELISTED_BY_SERVER),
+      1);
+}
+
+TEST_F(PreviewsDeciderImplTest, DeferAllScriptAllowedByFeatureAndWhitelist) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitWithFeatures(
+      {features::kPreviews, features::kDeferAllScriptPreviews,
+       features::kOptimizationHints},
+      {});
+  InitializeUIService();
+  InitializeOptimizationGuideHints();
+
+  for (const auto& test_ect : {net::EFFECTIVE_CONNECTION_TYPE_OFFLINE,
+                               net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G,
+                               net::EFFECTIVE_CONNECTION_TYPE_3G}) {
+    ReportEffectiveConnectionType(test_ect);
+
+    base::HistogramTester histogram_tester;
+    PreviewsUserData user_data(kDefaultPageId);
+
+    // Check whitelisted URL.
+    EXPECT_TRUE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart(
+        &user_data, GURL("https://whitelisted.example.com"), false,
+        PreviewsType::DEFER_ALL_SCRIPT));
+    EXPECT_EQ(test_ect, user_data.navigation_ect());
+    histogram_tester.ExpectUniqueSample(
+        "Previews.EligibilityReason.DeferAllScript",
+        static_cast<int>(PreviewsEligibilityReason::ALLOWED), 1);
+  }
+}
+
+TEST_F(PreviewsDeciderImplTest,
+       DeferAllScriptAllowedByFeatureWithoutKnownHints) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitWithFeatures(
+      {features::kPreviews, features::kDeferAllScriptPreviews,
+       features::kOptimizationHints},
+      {});
+  InitializeUIService();
+  InitializeOptimizationGuideHints();
+
+  base::HistogramTester histogram_tester;
+  PreviewsUserData user_data(kDefaultPageId);
+
+  // Verify preview allowed initially for url without known hints.
+  EXPECT_TRUE(previews_decider_impl()->ShouldAllowPreviewAtNavigationStart(
+      &user_data, GURL("https://www.google.com"), false,
+      PreviewsType::DEFER_ALL_SCRIPT));
+
+  histogram_tester.ExpectBucketCount(
+      "Previews.EligibilityReason.DeferAllScript",
+      static_cast<int>(PreviewsEligibilityReason::ALLOWED), 1);
+}
+
+TEST_F(PreviewsDeciderImplTest, DeferAllScriptCommitTimeWhitelistCheck) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitWithFeatures(
+      {features::kPreviews, features::kDeferAllScriptPreviews,
+       features::kOptimizationHints},
+      {});
+  InitializeUIService();
+  InitializeOptimizationGuideHints();
+
+  // First verify not allowed for non-whitelisted url.
+  {
+    base::HistogramTester histogram_tester;
+    PreviewsUserData user_data(kDefaultPageId);
+    user_data.set_navigation_ect(net::EFFECTIVE_CONNECTION_TYPE_2G);
+    EXPECT_FALSE(previews_decider_impl()->ShouldCommitPreview(
+        &user_data, GURL("https://www.google.com"),
+        PreviewsType::DEFER_ALL_SCRIPT));
+
+    histogram_tester.ExpectUniqueSample(
+        "Previews.EligibilityReason.DeferAllScript",
+        static_cast<int>(
+            PreviewsEligibilityReason::HOST_NOT_WHITELISTED_BY_SERVER),
+        1);
+  }
+
+  // Now verify preview for whitelisted url.
+  {
+    base::HistogramTester histogram_tester;
+    PreviewsUserData user_data(kDefaultPageId);
+    user_data.set_navigation_ect(net::EFFECTIVE_CONNECTION_TYPE_2G);
+    EXPECT_TRUE(previews_decider_impl()->ShouldCommitPreview(
+        &user_data, GURL("https://whitelisted.example.com"),
+        PreviewsType::DEFER_ALL_SCRIPT));
+
+    // Expect no eligibility logging.
+    histogram_tester.ExpectTotalCount(
+        "Previews.EligibilityReason.DeferAllScript", 0);
+  }
+
+  // Verify preview not allowed for whitelisted url when network is not slow.
+  {
+    base::HistogramTester histogram_tester;
+    PreviewsUserData user_data(kDefaultPageId);
+    user_data.set_navigation_ect(net::EFFECTIVE_CONNECTION_TYPE_4G);
+    EXPECT_FALSE(previews_decider_impl()->ShouldCommitPreview(
+        &user_data, GURL("https://whitelisted.example.com"),
+        PreviewsType::DEFER_ALL_SCRIPT));
+
+    histogram_tester.ExpectUniqueSample(
+        "Previews.EligibilityReason.DeferAllScript",
+        static_cast<int>(PreviewsEligibilityReason::NETWORK_NOT_SLOW), 1);
+  }
+
+  // Verify preview not allowed for whitelisted url for offline network quality.
+  {
+    base::HistogramTester histogram_tester;
+    PreviewsUserData user_data(kDefaultPageId);
+    user_data.set_navigation_ect(net::EFFECTIVE_CONNECTION_TYPE_OFFLINE);
+    EXPECT_FALSE(previews_decider_impl()->ShouldCommitPreview(
+        &user_data, GURL("https://whitelisted.example.com"),
+        PreviewsType::DEFER_ALL_SCRIPT));
+
+    histogram_tester.ExpectUniqueSample(
+        "Previews.EligibilityReason.DeferAllScript",
+        static_cast<int>(PreviewsEligibilityReason::DEVICE_OFFLINE), 1);
+  }
+
+  // Verify preview not allowed for session limited ECT threshold.
+  {
+    base::test::ScopedFeatureList nested_scoped_list;
+    nested_scoped_list.InitAndEnableFeatureWithParameters(
+        features::kSlowPageTriggering,
+        {{"session_max_ect_trigger", "Offline"}});
+    base::HistogramTester histogram_tester;
+    PreviewsUserData user_data(kDefaultPageId);
+    user_data.set_navigation_ect(net::EFFECTIVE_CONNECTION_TYPE_2G);
+    EXPECT_FALSE(previews_decider_impl()->ShouldCommitPreview(
+        &user_data, GURL("https://whitelisted.example.com"),
+        PreviewsType::DEFER_ALL_SCRIPT));
+
+    histogram_tester.ExpectUniqueSample(
+        "Previews.EligibilityReason.DeferAllScript",
+        static_cast<int>(
+            PreviewsEligibilityReason::NETWORK_NOT_SLOW_FOR_SESSION),
+        1);
+  }
+}
+
 TEST_F(PreviewsDeciderImplTest, LogPreviewNavigationPassInCorrectParams) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeature(features::kPreviews);
diff --git a/components/previews/content/previews_hints.cc b/components/previews/content/previews_hints.cc
index 12aa84c..e0e7204 100644
--- a/components/previews/content/previews_hints.cc
+++ b/components/previews/content/previews_hints.cc
@@ -125,6 +125,8 @@
       return PreviewsType::LITE_PAGE_REDIRECT;
     case optimization_guide::proto::OPTIMIZATION_NONE:
       return PreviewsType::NONE;
+    case optimization_guide::proto::DEFER_ALL_SCRIPT:
+      return PreviewsType::DEFER_ALL_SCRIPT;
   }
 }
 
@@ -143,6 +145,8 @@
     case optimization_guide::proto::OPTIMIZATION_NONE:
       // Always consider enabled to allow as no-op optimization.
       return true;
+    case optimization_guide::proto::DEFER_ALL_SCRIPT:
+      return previews::params::IsDeferAllScriptPreviewsEnabled();
   }
 }
 
diff --git a/components/previews/content/previews_hints_unittest.cc b/components/previews/content/previews_hints_unittest.cc
index 83b54ddd..f34b18f1 100644
--- a/components/previews/content/previews_hints_unittest.cc
+++ b/components/previews/content/previews_hints_unittest.cc
@@ -517,9 +517,9 @@
 }
 
 TEST_F(PreviewsHintsTest,
-       IsWhitelistedForSecondOptimizationNoScriptWithFirstDisabled) {
+       IsWhitelistedForSecondOptimizationDeferAllScriptWithFirstDisabled) {
   base::test::ScopedFeatureList scoped_list;
-  scoped_list.InitWithFeatures({features::kNoScriptPreviews},
+  scoped_list.InitWithFeatures({features::kDeferAllScriptPreviews},
                                {features::kResourceLoadingHints});
   optimization_guide::proto::Configuration config;
 
@@ -528,7 +528,7 @@
   hint1->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
   hint1->set_version("someversion");
 
-  // Page hint with NOSCRIPT optimization
+  // Page hint with RESOURCE_LOADING and DEFER_ALL_SCRIPT optimizations.
   optimization_guide::proto::PageHint* page_hint1 = hint1->add_page_hints();
   page_hint1->set_page_pattern("/has_multiple_optimizations/");
   optimization_guide::proto::Optimization* optimization1 =
@@ -537,7 +537,8 @@
       optimization_guide::proto::RESOURCE_LOADING);
   optimization_guide::proto::Optimization* optimization2 =
       page_hint1->add_whitelisted_optimizations();
-  optimization2->set_optimization_type(optimization_guide::proto::NOSCRIPT);
+  optimization2->set_optimization_type(
+      optimization_guide::proto::DEFER_ALL_SCRIPT);
 
   ParseConfig(config);
 
@@ -547,7 +548,7 @@
   std::string serialized_hint_version_string;
   EXPECT_TRUE(MaybeLoadHintAndCheckIsWhitelisted(
       GURL("https://www.somedomain.org/has_multiple_optimizations/"),
-      PreviewsType::NOSCRIPT, &inflation_percent, &ect_threshold,
+      PreviewsType::DEFER_ALL_SCRIPT, &inflation_percent, &ect_threshold,
       &serialized_hint_version_string));
   EXPECT_FALSE(MaybeLoadHintAndCheckIsWhitelisted(
       GURL("https://www.somedomain.org/has_multiple_optimizations/"),
@@ -559,7 +560,7 @@
        IsWhitelistedForSecondOptimizationResourceLoadingWithFirstDisabled) {
   base::test::ScopedFeatureList scoped_list;
   scoped_list.InitWithFeatures({features::kResourceLoadingHints},
-                               {features::kNoScriptPreviews});
+                               {features::kDeferAllScriptPreviews});
   optimization_guide::proto::Configuration config;
 
   optimization_guide::proto::Hint* hint1 = config.add_hints();
@@ -567,12 +568,13 @@
   hint1->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
   hint1->set_version("someversion");
 
-  // Page hint with NOSCRIPT optimization
+  // Page hint with RESOURCE_LOADING and DEFER_ALL_SCRIPT optimizations.
   optimization_guide::proto::PageHint* page_hint1 = hint1->add_page_hints();
   page_hint1->set_page_pattern("/has_multiple_optimizations/");
   optimization_guide::proto::Optimization* optimization1 =
       page_hint1->add_whitelisted_optimizations();
-  optimization1->set_optimization_type(optimization_guide::proto::NOSCRIPT);
+  optimization1->set_optimization_type(
+      optimization_guide::proto::DEFER_ALL_SCRIPT);
   optimization_guide::proto::Optimization* optimization2 =
       page_hint1->add_whitelisted_optimizations();
   optimization2->set_optimization_type(
diff --git a/components/previews/content/previews_optimization_guide_unittest.cc b/components/previews/content/previews_optimization_guide_unittest.cc
index ca17590f..91b78c09 100644
--- a/components/previews/content/previews_optimization_guide_unittest.cc
+++ b/components/previews/content/previews_optimization_guide_unittest.cc
@@ -673,6 +673,41 @@
 }
 
 TEST_F(PreviewsOptimizationGuideTest,
+       ProcessHintsWithValidCommandLineOverrideForDeferAllScript) {
+  base::test::ScopedFeatureList scoped_list;
+  scoped_list.InitWithFeatures({features::kDeferAllScriptPreviews}, {});
+
+  optimization_guide::proto::Configuration config;
+  optimization_guide::proto::Hint* hint = config.add_hints();
+  hint->set_key("somedomain.org");
+  hint->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
+  optimization_guide::proto::PageHint* page_hint = hint->add_page_hints();
+  page_hint->set_page_pattern("defer_default_2g");
+  optimization_guide::proto::Optimization* optimization =
+      page_hint->add_whitelisted_optimizations();
+  optimization->set_optimization_type(
+      optimization_guide::proto::DEFER_ALL_SCRIPT);
+
+  std::string encoded_config;
+  config.SerializeToString(&encoded_config);
+  base::Base64Encode(encoded_config, &encoded_config);
+
+  base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
+      switches::kHintsProtoOverride, encoded_config);
+  CreateServiceAndGuide();
+
+  // Verify page matches and ECT thresholds.
+  PreviewsUserData user_data(kDefaultPageId);
+  net::EffectiveConnectionType ect_threshold;
+
+  EXPECT_TRUE(guide()->GetHintsForTesting());
+  EXPECT_TRUE(MaybeLoadOptimizationHintsAndCheckIsWhitelisted(
+      &user_data, GURL("https://somedomain.org/defer_default_2g"),
+      PreviewsType::DEFER_ALL_SCRIPT, &ect_threshold));
+  EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_2G, ect_threshold);
+}
+
+TEST_F(PreviewsOptimizationGuideTest,
        ProcessHintsWithValidCommandLineOverrideAndPreexistingData) {
   base::test::ScopedFeatureList scoped_list;
   scoped_list.InitWithFeatures(
diff --git a/components/previews/core/previews_experiments.cc b/components/previews/core/previews_experiments.cc
index ecb559f..46471cb 100644
--- a/components/previews/core/previews_experiments.cc
+++ b/components/previews/core/previews_experiments.cc
@@ -322,7 +322,7 @@
 net::EffectiveConnectionType GetSessionMaxECTThreshold() {
   return GetParamValueAsECTByFeature(features::kSlowPageTriggering,
                                      kSessionMaxECTTrigger,
-                                     net::EFFECTIVE_CONNECTION_TYPE_2G);
+                                     net::EFFECTIVE_CONNECTION_TYPE_3G);
 }
 
 bool ArePreviewsAllowed() {
diff --git a/components/remote_cocoa/app_shim/bridged_content_view.mm b/components/remote_cocoa/app_shim/bridged_content_view.mm
index ba76a6c..4d4b3a5 100644
--- a/components/remote_cocoa/app_shim/bridged_content_view.mm
+++ b/components/remote_cocoa/app_shim/bridged_content_view.mm
@@ -220,9 +220,6 @@
   // By the time |self| is dealloc'd, it should never be in an NSWindow, and it
   // should never be the current input context.
   DCHECK_EQ(nil, [self window]);
-  // Sanity check: NSView always provides an -inputContext.
-  DCHECK_NE(nil, [super inputContext]);
-  DCHECK_NE([NSTextInputContext currentInputContext], [super inputContext]);
   [super dealloc];
 }
 
diff --git a/components/resources/BUILD.gn b/components/resources/BUILD.gn
index d8b4eac..fdb709b 100644
--- a/components/resources/BUILD.gn
+++ b/components/resources/BUILD.gn
@@ -36,7 +36,10 @@
   ]
 
   if (is_android && notouch_build) {
-    defines += [ "HIDE_ERROR_MESSAGE_FOR_DINO_PAGE" ]
+    defines += [
+      "HIDE_ERROR_MESSAGE_FOR_DINO_PAGE",
+      "SHOW_INSTRUCTIONS_FOR_DINO_PAGE",
+    ]
   }
 
   deps = [
diff --git a/components/signin/core/browser/BUILD.gn b/components/signin/core/browser/BUILD.gn
index b04eea2..f48cf94 100644
--- a/components/signin/core/browser/BUILD.gn
+++ b/components/signin/core/browser/BUILD.gn
@@ -59,6 +59,10 @@
     "//components/keyed_service/core",
     "//google_apis",
   ]
+
+  if (is_chromeos) {
+    deps += [ "//components/user_manager" ]
+  }
 }
 
 # This target forms the core of the IdentityManager implementation
diff --git a/components/signin/core/browser/DEPS b/components/signin/core/browser/DEPS
index 702863d..ea7de62b 100644
--- a/components/signin/core/browser/DEPS
+++ b/components/signin/core/browser/DEPS
@@ -6,6 +6,8 @@
   "+components/account_id",
   "+components/image_fetcher/core",
   "+components/metrics",
+  "+components/user_manager/known_user.h",
+  "+jni",
   "+mojo/public",
   "+services/identity/public",
   "+services/network/public",
diff --git a/components/signin/core/browser/account_info.cc b/components/signin/core/browser/account_info.cc
index 3c164ea3..1c5b9ff 100644
--- a/components/signin/core/browser/account_info.cc
+++ b/components/signin/core/browser/account_info.cc
@@ -5,6 +5,10 @@
 #include "components/signin/core/browser/account_info.h"
 #include "google_apis/gaia/gaia_auth_util.h"
 
+#if defined(OS_CHROMEOS)
+#include "components/user_manager/known_user.h"
+#endif
+
 namespace {
 
 // Updates |field| with |new_value| if non-empty and different; if |new_value|
@@ -121,8 +125,14 @@
 }
 
 AccountId AccountIdFromAccountInfo(const CoreAccountInfo& account_info) {
+#if defined(OS_CHROMEOS)
+  return user_manager::known_user::GetAccountId(
+      account_info.email, account_info.gaia, AccountType::GOOGLE);
+#else
   if (account_info.email.empty() || account_info.gaia.empty())
     return EmptyAccountId();
 
-  return AccountId::FromUserEmailGaiaId(account_info.email, account_info.gaia);
+  return AccountId::FromUserEmailGaiaId(
+      gaia::CanonicalizeEmail(account_info.email), account_info.gaia);
+#endif
 }
diff --git a/components/signin/core/browser/account_info_unittest.cc b/components/signin/core/browser/account_info_unittest.cc
index 2329095..b18426f6 100644
--- a/components/signin/core/browser/account_info_unittest.cc
+++ b/components/signin/core/browser/account_info_unittest.cc
@@ -130,3 +130,14 @@
   EXPECT_EQ("test_domain", info.hosted_domain);
   EXPECT_EQ("test_url", info.picture_url);
 }
+
+// Tests that AccountIdFromAccountInfo() passes along a canonicalized email to
+// AccountId.
+TEST_F(AccountInfoTest, AccountIdFromAccountInfo_CanonicalizesRawEmail) {
+  AccountInfo info;
+  info.email = "test.email@gmail.com";
+  info.gaia = "test_id";
+
+  EXPECT_EQ("testemail@gmail.com",
+            AccountIdFromAccountInfo(info).GetUserEmail());
+}
diff --git a/components/startup_metric_utils/browser/startup_metric_utils.cc b/components/startup_metric_utils/browser/startup_metric_utils.cc
index 5884ada..36657fa 100644
--- a/components/startup_metric_utils/browser/startup_metric_utils.cc
+++ b/components/startup_metric_utils/browser/startup_metric_utils.cc
@@ -320,18 +320,6 @@
       GetSystemUptimeOnProcessLaunch());
 }
 
-void RecordTimeOfDayGMTHistogram() {
-  base::Time::Exploded now_exploded;
-  base::Time::Now().UTCExplode(&now_exploded);
-
-  // We log the time as sparse histogram because we should only be recording a
-  // single value per Chrome lifetime. The format of the time is HHMM.
-  // Log the time in 10 minute intervals to make the histogram easier to read.
-  base::UmaHistogramSparse(
-      "Startup.TimeOfDayGMT",
-      100 * now_exploded.hour + 10 * (now_exploded.minute / 10));
-}
-
 // On Windows, records the number of hard-faults that have occurred in the
 // current chrome.exe process since it was started. This is a nop on other
 // platforms.
@@ -601,7 +589,6 @@
   AddStartupEventsForTelemetry();
   RecordTimeSinceLastStartup(pref_service);
   RecordSystemUptimeHistogram();
-  RecordTimeOfDayGMTHistogram();
 
   // Record values stored prior to startup temperature evaluation.
   if (ShouldLogStartupHistogram()) {
diff --git a/content/browser/accessibility/accessibility_action_browsertest.cc b/content/browser/accessibility/accessibility_action_browsertest.cc
index 925da66..b38f11a 100644
--- a/content/browser/accessibility/accessibility_action_browsertest.cc
+++ b/content/browser/accessibility/accessibility_action_browsertest.cc
@@ -115,7 +115,8 @@
   waiter2.WaitForNotification();
 
   BrowserAccessibility* focus = GetManager()->GetFocus();
-  EXPECT_EQ(focus->GetId(), target->GetId());
+  ASSERT_NE(nullptr, focus);
+  EXPECT_EQ(target->GetId(), focus->GetId());
 }
 
 IN_PROC_BROWSER_TEST_F(AccessibilityActionBrowserTest,
diff --git a/content/browser/accessibility/accessibility_tree_formatter.cc b/content/browser/accessibility/accessibility_tree_formatter.cc
index 2169274..81d2a74 100644
--- a/content/browser/accessibility/accessibility_tree_formatter.cc
+++ b/content/browser/accessibility/accessibility_tree_formatter.cc
@@ -101,6 +101,9 @@
   if (line.find(base::ASCIIToUTF16(kSkipString)) != base::string16::npos)
     return;
 
+  // Normalize any Windows-style line endings by removing \r.
+  base::RemoveChars(line, base::ASCIIToUTF16("\r"), &line);
+
   // Replace literal newlines with "<newline>"
   base::ReplaceChars(line, base::ASCIIToUTF16("\n"),
                      base::ASCIIToUTF16("<newline>"), &line);
diff --git a/content/browser/accessibility/accessibility_tree_formatter_mac.mm b/content/browser/accessibility/accessibility_tree_formatter_mac.mm
index 4f1c5cd1..71b71384 100644
--- a/content/browser/accessibility/accessibility_tree_formatter_mac.mm
+++ b/content/browser/accessibility/accessibility_tree_formatter_mac.mm
@@ -43,12 +43,16 @@
 
 std::unique_ptr<base::DictionaryValue> PopulatePosition(
     const BrowserAccessibility& node) {
+  DCHECK(node.instance_active());
+  BrowserAccessibilityManager* root_manager = node.manager()->GetRootManager();
+  DCHECK(root_manager);
+
   std::unique_ptr<base::DictionaryValue> position(new base::DictionaryValue);
   // The NSAccessibility position of an object is in global coordinates and
   // based on the lower-left corner of the object. To make this easier and less
   // confusing, convert it to local window coordinates using the top-left
   // corner when dumping the position.
-  BrowserAccessibility* root = node.manager()->GetRootManager()->GetRoot();
+  BrowserAccessibility* root = root_manager->GetRoot();
   BrowserAccessibilityCocoa* cocoa_root = ToBrowserAccessibilityCocoa(root);
   NSPoint root_position = [[cocoa_root position] pointValue];
   NSSize root_size = [[cocoa_root size] sizeValue];
diff --git a/content/browser/accessibility/accessibility_tree_formatter_win.cc b/content/browser/accessibility/accessibility_tree_formatter_win.cc
index 077eb10..e8330f43 100644
--- a/content/browser/accessibility/accessibility_tree_formatter_win.cc
+++ b/content/browser/accessibility/accessibility_tree_formatter_win.cc
@@ -277,11 +277,14 @@
 AccessibilityTreeFormatterWin::BuildAccessibilityTree(
     BrowserAccessibility* start_node) {
   DCHECK(start_node);
+  DCHECK(start_node->instance_active());
+  BrowserAccessibilityManager* root_manager =
+      start_node->manager()->GetRootManager();
+  DCHECK(root_manager);
 
   base::win::ScopedVariant variant_self(CHILDID_SELF);
   LONG root_x, root_y, root_width, root_height;
-  BrowserAccessibility* root =
-      start_node->manager()->GetRootManager()->GetRoot();
+  BrowserAccessibility* root = root_manager->GetRoot();
   HRESULT hr = ToBrowserAccessibilityWin(root)->GetCOM()->accLocation(
       &root_x, &root_y, &root_width, &root_height, variant_self);
   DCHECK(SUCCEEDED(hr));
diff --git a/content/browser/accessibility/accessibility_win_browsertest.cc b/content/browser/accessibility/accessibility_win_browsertest.cc
index 27860ca..962f174 100644
--- a/content/browser/accessibility/accessibility_win_browsertest.cc
+++ b/content/browser/accessibility/accessibility_win_browsertest.cc
@@ -893,7 +893,7 @@
   // Set focus to the radio group.
   auto waiter = std::make_unique<AccessibilityNotificationWaiter>(
       shell()->web_contents(), ui::kAXModeComplete, ax::mojom::Event::kFocus);
-  ExecuteScript(L"document.body.children[0].focus()");
+  ExecuteScript(L"document.body.children[0].focus();");
   waiter->WaitForNotification();
 
   // Check that the accessibility tree of the browser has been updated.
@@ -1003,7 +1003,9 @@
 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
                        TestNotificationFocusChanged) {
   // The role attribute causes the node to be in the accessibility tree.
-  LoadInitialAccessibilityTreeFromHtml("<div role=group tabindex='-1'></div>");
+  LoadInitialAccessibilityTreeFromHtml(R"HTML(
+      <div role="group" tabindex="-1">
+      </div>)HTML");
 
   // Check the browser's copy of the renderer accessibility tree.
   SCOPED_TRACE("Check initial tree");
@@ -1015,29 +1017,32 @@
   document_checker.AppendExpectedChild(&group_checker);
   document_checker.CheckAccessible(GetRendererAccessible());
 
-  // Focus the div in the document
-  std::unique_ptr<AccessibilityNotificationWaiter> waiter(
-      new AccessibilityNotificationWaiter(shell()->web_contents(),
-                                          ui::kAXModeComplete,
-                                          ax::mojom::Event::kFocus));
-  ExecuteScript(L"document.body.children[0].focus()");
-  waiter->WaitForNotification();
+  {
+    // Focus the div in the document
+    AccessibilityNotificationWaiter waiter(
+        shell()->web_contents(), ui::kAXModeComplete, ax::mojom::Event::kFocus);
+    ExecuteScript(L"document.body.children[0].focus();");
+    waiter.WaitForNotification();
+  }
 
   // Check that the accessibility tree of the browser has been updated.
   SCOPED_TRACE("Check updated tree after focusing div");
   group_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_FOCUSED);
   document_checker.CheckAccessible(GetRendererAccessible());
 
-  // Focus the document accessible. This will un-focus the current node.
-  waiter.reset(new AccessibilityNotificationWaiter(
-      shell()->web_contents(), ui::kAXModeComplete, ax::mojom::Event::kBlur));
-  Microsoft::WRL::ComPtr<IAccessible> document_accessible(
-      GetRendererAccessible());
-  ASSERT_NE(document_accessible.Get(), reinterpret_cast<IAccessible*>(NULL));
-  base::win::ScopedVariant childid_self(CHILDID_SELF);
-  HRESULT hr = document_accessible->accSelect(SELFLAG_TAKEFOCUS, childid_self);
-  ASSERT_EQ(S_OK, hr);
-  waiter->WaitForNotification();
+  {
+    // Focus the document accessible. This will un-focus the current node.
+    AccessibilityNotificationWaiter waiter(
+        shell()->web_contents(), ui::kAXModeComplete, ax::mojom::Event::kBlur);
+    Microsoft::WRL::ComPtr<IAccessible> document_accessible(
+        GetRendererAccessible());
+    ASSERT_NE(nullptr, document_accessible.Get());
+    base::win::ScopedVariant childid_self(CHILDID_SELF);
+    HRESULT hr =
+        document_accessible->accSelect(SELFLAG_TAKEFOCUS, childid_self);
+    ASSERT_EQ(S_OK, hr);
+    waiter.WaitForNotification();
+  }
 
   // Check that the accessibility tree of the browser has been updated.
   SCOPED_TRACE("Check updated tree after focusing document again");
@@ -1045,6 +1050,151 @@
   document_checker.CheckAccessible(GetRendererAccessible());
 }
 
+IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, FocusEventOnPageLoad) {
+  // Some screen readers, such as older versions of Jaws, require a focus event
+  // on the top document after the page loads, if there is no focused element on
+  // the page.
+  AccessibilityNotificationWaiter waiter(shell()->web_contents(),
+                                         ui::kAXModeComplete,
+                                         ax::mojom::Event::kLoadComplete);
+  GURL html_data_url(
+      "data:text/html," +
+      net::EscapeQueryParamValue(R"HTML(<p> Hello</ p>)HTML", false));
+  NavigateToURL(shell(), html_data_url);
+  WaitForAccessibilityFocusChange();
+  waiter.WaitForNotification();
+
+  Microsoft::WRL::ComPtr<IAccessible> document(GetRendererAccessible());
+  ASSERT_TRUE(document);
+  base::win::ScopedVariant focus;
+  base::win::ScopedVariant childid_self(CHILDID_SELF);
+  ASSERT_HRESULT_SUCCEEDED(document->get_accFocus(focus.Receive()));
+  EXPECT_EQ(VT_I4, focus.type());
+  EXPECT_EQ(CHILDID_SELF, V_I4(focus.ptr()));
+}
+
+IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, NoFocusEventOnRootChange) {
+  LoadInitialAccessibilityTreeFromHtml(R"HTML(
+      <p>Hello</p>
+      )HTML");
+
+  // Adding an iframe as a direct descendant of the root will reserialize the
+  // root node.
+  AccessibilityNotificationWaiter waiter(shell()->web_contents(),
+                                         ui::kAXModeComplete,
+                                         ax::mojom::Event::kLayoutComplete);
+  ExecuteScript(
+      L"let iframe = document.createElement('iframe');"
+      L"iframe.srcdoc = '<button>Button</button>';"
+      L"document.body.appendChild(iframe);");
+  waiter.WaitForNotification();
+
+  Microsoft::WRL::ComPtr<IAccessible> document(GetRendererAccessible());
+  ASSERT_TRUE(document);
+  base::win::ScopedVariant focus;
+  base::win::ScopedVariant childid_self(CHILDID_SELF);
+  ASSERT_HRESULT_SUCCEEDED(document->get_accFocus(focus.Receive()));
+  EXPECT_EQ(VT_I4, focus.type());
+  EXPECT_EQ(CHILDID_SELF, V_I4(focus.ptr()));
+}
+
+IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
+                       FocusEventOnFocusedIframeAddedAndRemoved) {
+  LoadInitialAccessibilityTreeFromHtml(R"HTML(
+      <button autofocus>Outer button</button>
+      )HTML");
+
+  Microsoft::WRL::ComPtr<IAccessible> document(GetRendererAccessible());
+  ASSERT_TRUE(document);
+
+  {
+    AccessibilityNotificationWaiter iframe_waiter(
+        shell()->web_contents(), ui::kAXModeComplete, ax::mojom::Event::kFocus);
+    ExecuteScript(
+        L"let iframe = document.createElement('iframe');"
+        L"iframe.srcdoc = '<button autofocus>Inner button</button>';"
+        L"document.body.appendChild(iframe);");
+    WaitForAccessibilityFocusChange();
+    iframe_waiter.WaitForNotification();
+
+    const BrowserAccessibility* inner_button =
+        FindNode(ax::mojom::Role::kButton, "Inner button");
+    ASSERT_NE(nullptr, inner_button);
+    const auto* inner_button_win =
+        ToBrowserAccessibilityWin(inner_button)->GetCOM();
+    ASSERT_NE(nullptr, inner_button_win);
+
+    base::win::ScopedVariant focus;
+    base::win::ScopedVariant childid_self(CHILDID_SELF);
+    ASSERT_HRESULT_SUCCEEDED(document->get_accFocus(focus.Receive()));
+    EXPECT_EQ(VT_DISPATCH, focus.type());
+    EXPECT_EQ(inner_button_win, V_DISPATCH(focus.ptr()));
+  }
+
+  {
+    AccessibilityNotificationWaiter iframe_waiter(
+        shell()->web_contents(), ui::kAXModeComplete,
+        ax::mojom::Event::kLayoutComplete);
+    ExecuteScript(L"document.body.removeChild(iframe);");
+    WaitForAccessibilityFocusChange();
+    iframe_waiter.WaitForNotification();
+
+    base::win::ScopedVariant focus;
+    base::win::ScopedVariant childid_self(CHILDID_SELF);
+    ASSERT_HRESULT_SUCCEEDED(document->get_accFocus(focus.Receive()));
+    EXPECT_EQ(VT_I4, focus.type());
+    EXPECT_EQ(CHILDID_SELF, V_I4(focus.ptr()));
+  }
+}
+
+IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
+                       NoFocusEventOnIframeAddedAndRemoved) {
+  LoadInitialAccessibilityTreeFromHtml(R"HTML(
+      <button autofocus>Outer button</button>
+      )HTML");
+
+  Microsoft::WRL::ComPtr<IAccessible> document(GetRendererAccessible());
+  ASSERT_TRUE(document);
+
+  const BrowserAccessibility* outer_button =
+      FindNode(ax::mojom::Role::kButton, "Outer button");
+  ASSERT_NE(nullptr, outer_button);
+  const auto* outer_button_win =
+      ToBrowserAccessibilityWin(outer_button)->GetCOM();
+  ASSERT_NE(nullptr, outer_button_win);
+
+  {
+    AccessibilityNotificationWaiter waiter(shell()->web_contents(),
+                                           ui::kAXModeComplete,
+                                           ax::mojom::Event::kLayoutComplete);
+    ExecuteScript(
+        L"let iframe = document.createElement('iframe');"
+        L"iframe.srcdoc = '<button>Inner button</button>';"
+        L"document.body.appendChild(iframe);");
+    waiter.WaitForNotification();
+
+    base::win::ScopedVariant focus;
+    base::win::ScopedVariant childid_self(CHILDID_SELF);
+    ASSERT_HRESULT_SUCCEEDED(document->get_accFocus(focus.Receive()));
+    EXPECT_EQ(VT_DISPATCH, focus.type());
+    EXPECT_EQ(outer_button_win, V_DISPATCH(focus.ptr()));
+  }
+
+  {
+    AccessibilityNotificationWaiter waiter(shell()->web_contents(),
+                                           ui::kAXModeComplete,
+                                           ax::mojom::Event::kLayoutComplete);
+    ExecuteScript(L"document.body.removeChild(iframe);");
+    waiter.WaitForNotification();
+
+    base::win::ScopedVariant focus;
+    base::win::ScopedVariant childid_self(CHILDID_SELF);
+    ASSERT_HRESULT_SUCCEEDED(document->get_accFocus(focus.Receive()));
+    EXPECT_EQ(VT_DISPATCH, focus.type());
+    EXPECT_EQ(outer_button_win, V_DISPATCH(focus.ptr()));
+  }
+}
+
 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
                        TestNotificationValueChanged) {
   LoadInitialAccessibilityTreeFromHtml(
diff --git a/content/browser/accessibility/aom_browsertest.cc b/content/browser/accessibility/aom_browsertest.cc
index 0a614f8..4b9ddac 100644
--- a/content/browser/accessibility/aom_browsertest.cc
+++ b/content/browser/accessibility/aom_browsertest.cc
@@ -91,7 +91,8 @@
   waiter2.WaitForNotification();
 
   BrowserAccessibility* focus = GetManager()->GetFocus();
-  EXPECT_EQ(focus->GetId(), button->GetId());
+  ASSERT_NE(nullptr, focus);
+  EXPECT_EQ(button->GetId(), focus->GetId());
 }
 
 }  // namespace content
diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc
index 398fda3..b76651f5 100644
--- a/content/browser/accessibility/browser_accessibility.cc
+++ b/content/browser/accessibility/browser_accessibility.cc
@@ -1368,13 +1368,13 @@
 }
 
 gfx::NativeViewAccessible BrowserAccessibility::GetParent() {
-  auto* parent = PlatformGetParent();
+  if (!instance_active())
+    return nullptr;
+
+  BrowserAccessibility* parent = PlatformGetParent();
   if (parent)
     return parent->GetNativeViewAccessible();
 
-  if (!manager_)
-    return nullptr;
-
   BrowserAccessibilityDelegate* delegate =
       manager_->GetDelegateFromRootManager();
   if (!delegate)
@@ -1404,7 +1404,7 @@
 }
 
 gfx::NativeViewAccessible BrowserAccessibility::GetFocus() {
-  auto* focused = manager()->GetFocus();
+  BrowserAccessibility* focused = manager()->GetFocus();
   if (!focused)
     return nullptr;
 
@@ -1596,7 +1596,7 @@
 
 base::string16 BrowserAccessibility::GetLocalizedStringForImageAnnotationStatus(
     ax::mojom::ImageAnnotationStatus status) const {
-  const ContentClient* content_client = content::GetContentClient();
+  ContentClient* content_client = content::GetContentClient();
 
   int message_id = 0;
   switch (status) {
@@ -1628,13 +1628,13 @@
 
 base::string16
 BrowserAccessibility::GetLocalizedRoleDescriptionForUnlabeledImage() const {
-  const ContentClient* content_client = content::GetContentClient();
+  ContentClient* content_client = content::GetContentClient();
   return content_client->GetLocalizedString(
       IDS_AX_UNLABELED_IMAGE_ROLE_DESCRIPTION);
 }
 
 base::string16 BrowserAccessibility::GetLocalizedStringForLandmarkType() const {
-  const ContentClient* content_client = content::GetContentClient();
+  ContentClient* content_client = content::GetContentClient();
   const ui::AXNodeData& data = GetData();
 
   switch (data.role) {
@@ -1663,7 +1663,7 @@
   const BrowserAccessibility* current_node = this;
   while (current_node) {
     if (current_node->GetData().role == ax::mojom::Role::kMark) {
-      const ContentClient* content_client = content::GetContentClient();
+      ContentClient* content_client = content::GetContentClient();
       return content_client->GetLocalizedString(IDS_AX_ROLE_MARK);
     }
     current_node = current_node->PlatformGetParent();
diff --git a/content/browser/accessibility/browser_accessibility_auralinux.cc b/content/browser/accessibility/browser_accessibility_auralinux.cc
index 537d760..0738544 100644
--- a/content/browser/accessibility/browser_accessibility_auralinux.cc
+++ b/content/browser/accessibility/browser_accessibility_auralinux.cc
@@ -40,6 +40,10 @@
   return node_->GetNativeViewAccessible();
 }
 
+void BrowserAccessibilityAuraLinux::UpdatePlatformAttributes() {
+  GetNode()->UpdateHypertext();
+}
+
 void BrowserAccessibilityAuraLinux::OnDataChanged() {
   BrowserAccessibility::OnDataChanged();
 
@@ -47,10 +51,6 @@
   node_->DataChanged();
 }
 
-void BrowserAccessibilityAuraLinux::UpdatePlatformAttributes() {
-  GetNode()->UpdateHypertext();
-}
-
 bool BrowserAccessibilityAuraLinux::IsNative() const {
   return true;
 }
diff --git a/content/browser/accessibility/browser_accessibility_cocoa.mm b/content/browser/accessibility/browser_accessibility_cocoa.mm
index d3f1fa83..981ee74 100644
--- a/content/browser/accessibility/browser_accessibility_cocoa.mm
+++ b/content/browser/accessibility/browser_accessibility_cocoa.mm
@@ -876,9 +876,11 @@
     }
   } else {
     // Otherwise this is a cell, return the column headers for this cell.
-    int column = *owner_->GetTableCellColIndex();
+    base::Optional<int> column = owner_->GetTableCellColIndex();
+    if (!column)
+      return nil;
 
-    std::vector<int32_t> colHeaderIds = table->GetColHeaderNodeIds(column);
+    std::vector<int32_t> colHeaderIds = table->GetColHeaderNodeIds(*column);
     for (int32_t id : colHeaderIds) {
       BrowserAccessibility* cell = owner_->manager()->GetFromID(id);
       if (cell)
@@ -892,13 +894,11 @@
 - (NSValue*)columnIndexRange {
   if (![self instanceActive])
     return nil;
-  if (!ui::IsCellOrTableHeader(owner_->GetRole()))
-    return nil;
 
-  int column = *owner_->node()->GetTableCellColIndex();
-  int colspan = *owner_->node()->GetTableCellColSpan();
-  if (column >= 0 && colspan >= 1)
-    return [NSValue valueWithRange:NSMakeRange(column, colspan)];
+  base::Optional<int> column = owner_->node()->GetTableCellColIndex();
+  base::Optional<int> colspan = owner_->node()->GetTableCellColSpan();
+  if (column && colspan)
+    return [NSValue valueWithRange:NSMakeRange(*column, *colspan)];
   return nil;
 }
 
@@ -1881,13 +1881,11 @@
 - (NSValue*)rowIndexRange {
   if (![self instanceActive])
     return nil;
-  if (!ui::IsCellOrTableHeader(owner_->GetRole()))
-    return nil;
 
-  int row = *owner_->node()->GetTableCellRowIndex();
-  int rowspan = *owner_->node()->GetTableCellRowSpan();
-  if (row >= 0 && rowspan >= 1)
-    return [NSValue valueWithRange:NSMakeRange(row, rowspan)];
+  base::Optional<int> row = owner_->node()->GetTableCellRowIndex();
+  base::Optional<int> rowspan = owner_->node()->GetTableCellRowSpan();
+  if (row && rowspan)
+    return [NSValue valueWithRange:NSMakeRange(*row, *rowspan)];
   return nil;
 }
 
@@ -1928,7 +1926,7 @@
   NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease];
   BrowserAccessibilityManager* manager = owner_->manager();
   BrowserAccessibility* focusedChild = manager->GetFocus();
-  if (!focusedChild->IsDescendantOf(owner_))
+  if (focusedChild && !focusedChild->IsDescendantOf(owner_))
     focusedChild = nullptr;
 
   // If it's not multiselectable, try to skip iterating over the
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc
index 2ea0b2e..ef6bf09 100644
--- a/content/browser/accessibility/browser_accessibility_manager.cc
+++ b/content/browser/accessibility/browser_accessibility_manager.cc
@@ -181,6 +181,10 @@
 }
 
 BrowserAccessibilityManager::~BrowserAccessibilityManager() {
+  if (last_focused_node_tree_id_ &&
+      ax_tree_id_ == *last_focused_node_tree_id_) {
+    SetLastFocusedNode(nullptr);
+  }
   tree_.reset(nullptr);
   event_generator_.ReleaseTree();
   ui::AXTreeManagerMap::GetInstance().RemoveTreeManager(ax_tree_id_);
@@ -228,37 +232,46 @@
 
 void BrowserAccessibilityManager::FireFocusEventsIfNeeded() {
   BrowserAccessibility* focus = GetFocus();
+  // If |focus| is nullptr it means that we have no way of knowing where the
+  // focus is.
+  //
+  // One case when this would happen is when the current tree hasn't connected
+  // to its parent tree yet. That would mean that we have no way of getting to
+  // the top document which holds global focus information for the whole page.
+  //
+  // Note that if there is nothing focused on the page, then the focus should
+  // not be nullptr. The rootnode of the top document should be focused instead.
+  if (!focus)
+    return;
 
+  DCHECK(focus->instance_active());
   // Don't fire focus events if the window itself doesn't have focus.
   // Bypass this check for some tests.
   if (!never_suppress_or_delay_events_for_testing_ &&
       !g_focus_change_callback_for_testing.Get()) {
     if (delegate_ && !delegate_->AccessibilityViewHasFocus())
-      focus = nullptr;
-
+      return;
     if (!CanFireEvents())
-      focus = nullptr;
+      return;
   }
 
-  // Don't allow the document to be focused if it has no children and
-  // hasn't finished loading yet. Wait for at least a tiny bit of content,
-  // or for the document to actually finish loading.
-  if (focus && focus == focus->manager()->GetRoot() &&
+  // Don't allow the top document to be focused if it has no children and hasn't
+  // finished loading yet. Wait for at least a tiny bit of content, or for the
+  // document to actually finish loading.
+  if (focus == focus->manager()->GetRoot() &&
       focus->PlatformChildCount() == 0 &&
       !focus->GetBoolAttribute(ax::mojom::BoolAttribute::kBusy) &&
       !focus->manager()->GetTreeData().loaded) {
-    focus = nullptr;
+    return;
   }
 
   BrowserAccessibility* last_focused_node = GetLastFocusedNode();
-  if (focus != last_focused_node) {
-    if (focus)
-      FireFocusEvent(focus);
-  }
+  if (focus != last_focused_node)
+    FireFocusEvent(focus);
   SetLastFocusedNode(focus);
 }
 
-bool BrowserAccessibilityManager::CanFireEvents() {
+bool BrowserAccessibilityManager::CanFireEvents() const {
   return true;
 }
 
@@ -276,7 +289,7 @@
   }
 }
 
-BrowserAccessibility* BrowserAccessibilityManager::GetRoot() {
+BrowserAccessibility* BrowserAccessibilityManager::GetRoot() const {
   ui::AXNode* root = GetRootAsAXNode();
   return root ? GetFromAXNode(root) : nullptr;
 }
@@ -296,8 +309,8 @@
   return nullptr;
 }
 
-BrowserAccessibility*
-BrowserAccessibilityManager::GetParentNodeFromParentTree() {
+BrowserAccessibility* BrowserAccessibilityManager::GetParentNodeFromParentTree()
+    const {
   ui::AXNode* parent = GetParentNodeFromParentTreeAsAXNode();
   ui::AXTreeID parent_tree_id = GetParentTreeID();
   BrowserAccessibilityManager* parent_manager =
@@ -374,7 +387,7 @@
 
   // If this page is hidden by an interstitial, suppress all events.
   BrowserAccessibilityManager* root_manager = GetRootManager();
-  if (root_manager->hidden_by_interstitial_page()) {
+  if (root_manager && root_manager->hidden_by_interstitial_page()) {
     event_generator_.ClearEvents();
     return true;
   }
@@ -397,7 +410,7 @@
   // Screen readers might not do the right thing if they're not aware of what
   // has focus, so always try that first. Nothing will be fired if the window
   // itself isn't focused or if focus hasn't changed.
-  root_manager->FireFocusEventsIfNeeded();
+  FireFocusEventsIfNeeded();
 
   // Fire any events related to changes to the tree.
   for (auto targeted_event : event_generator_) {
@@ -428,7 +441,7 @@
     if (!event_target || !event_target->CanFireEvents())
       continue;
 
-    if (event.event_type == ax::mojom::Event::kHover)
+    if (root_manager && event.event_type == ax::mojom::Event::kHover)
       root_manager->CacheHitTestResult(event_target);
 
     FireBlinkEvent(event.event_type, event_target);
@@ -499,7 +512,7 @@
 }
 
 BrowserAccessibility* BrowserAccessibilityManager::GetActiveDescendant(
-    BrowserAccessibility* focus) {
+    BrowserAccessibility* focus) const {
   if (!focus)
     return nullptr;
 
@@ -536,40 +549,50 @@
   return focus;
 }
 
-bool BrowserAccessibilityManager::NativeViewHasFocus() {
+bool BrowserAccessibilityManager::NativeViewHasFocus() const {
   BrowserAccessibilityDelegate* delegate = GetDelegateFromRootManager();
   return delegate && delegate->AccessibilityViewHasFocus();
 }
 
-BrowserAccessibility* BrowserAccessibilityManager::GetFocus() {
+BrowserAccessibility* BrowserAccessibilityManager::GetFocus() const {
   BrowserAccessibilityManager* root_manager = GetRootManager();
-  if (!root_manager)
-    root_manager = this;
-  ui::AXTreeID focused_tree_id = root_manager->GetTreeData().focused_tree_id;
+  if (!root_manager) {
+    // We can't retrieved the globally focused object since we don't have access
+    // to the top document. If we return the focus in the current or a
+    // descendent tree, it might be wrong, since the top document might have
+    // another frame as the tree with the focus.
+    return nullptr;
+  }
 
+  ui::AXTreeID focused_tree_id = root_manager->GetTreeData().focused_tree_id;
   BrowserAccessibilityManager* focused_manager = nullptr;
   if (focused_tree_id != ui::AXTreeIDUnknown())
     focused_manager = BrowserAccessibilityManager::FromID(focused_tree_id);
 
-  // BrowserAccessibilityManager::FromID(focused_tree_id) may return nullptr
-  // if the tree is not created or has been destroyed.
+  // BrowserAccessibilityManager::FromID(focused_tree_id) may return nullptr if
+  // the tree is not created or has been destroyed. In this case, we don't
+  // really know where the focus is, so we should return nullptr. However, due
+  // to a bug in RenderFrameHostImpl this is currently not possible.
+  //
+  // TODO(nektar): Fix All the issues identified in crbug.com/956748
   if (!focused_manager)
-    focused_manager = root_manager;
+    return GetFocusFromThisOrDescendantFrame();
 
   return focused_manager->GetFocusFromThisOrDescendantFrame();
 }
 
 BrowserAccessibility*
-BrowserAccessibilityManager::GetFocusFromThisOrDescendantFrame() {
+BrowserAccessibilityManager::GetFocusFromThisOrDescendantFrame() const {
   int32_t focus_id = GetTreeData().focus_id;
   BrowserAccessibility* obj = GetFromID(focus_id);
+  // If nothing is focused, then the top document has the focus.
   if (!obj)
     return GetRoot();
 
   if (obj->HasStringAttribute(ax::mojom::StringAttribute::kChildTreeId)) {
     AXTreeID child_tree_id = AXTreeID::FromString(
         obj->GetStringAttribute(ax::mojom::StringAttribute::kChildTreeId));
-    BrowserAccessibilityManager* child_manager =
+    const BrowserAccessibilityManager* child_manager =
         BrowserAccessibilityManager::FromID(child_tree_id);
     if (child_manager)
       return child_manager->GetFocusFromThisOrDescendantFrame();
@@ -1194,27 +1217,26 @@
     ui::AXTree* tree,
     bool root_changed,
     const std::vector<ui::AXTreeObserver::Change>& changes) {
-  // When the root changes and this is the root manager, we may need to
-  // fire a new focus event.
-  if (root_changed && last_focused_node_tree_id_ &&
-      ax_tree_id_ == last_focused_node_tree_id_.value())
+  const bool ax_tree_id_changed =
+      GetTreeData().tree_id != ui::AXTreeIDUnknown() &&
+      GetTreeData().tree_id != ax_tree_id_;
+  // When the tree that contains the focus is destroyed and re-created, we
+  // should fire a new focus event. Also, whenever the tree ID or the root of
+  // this tree changes we may need to fire an event on our parent node in the
+  // parent tree to ensure that we're properly connected.
+  if (ax_tree_id_changed && last_focused_node_tree_id_ &&
+      ax_tree_id_ == *last_focused_node_tree_id_) {
     SetLastFocusedNode(nullptr);
+  }
+  if (ax_tree_id_changed || root_changed)
+    connected_to_parent_tree_node_ = false;
 
-  bool ax_tree_id_changed = false;
-  if (GetTreeData().tree_id != ui::AXTreeIDUnknown() &&
-      GetTreeData().tree_id != ax_tree_id_) {
+  if (ax_tree_id_changed) {
     ui::AXTreeManagerMap::GetInstance().RemoveTreeManager(ax_tree_id_);
     ax_tree_id_ = GetTreeData().tree_id;
     ui::AXTreeManagerMap::GetInstance().AddTreeManager(ax_tree_id_, this);
-    ax_tree_id_changed = true;
   }
 
-  // Whenever the tree ID or the root of this tree changes we may need to
-  // fire an event on our parent node in the parent tree to ensure that
-  // we're properly connected.
-  if (ax_tree_id_changed || root_changed)
-    connected_to_parent_tree_node_ = false;
-
   // Calls OnDataChanged on newly created or reparented nodes.
   for (const auto change : changes) {
     ui::AXNode* node = change.node;
@@ -1322,24 +1344,34 @@
   return manager->GetRoot();
 }
 
-BrowserAccessibilityManager* BrowserAccessibilityManager::GetRootManager() {
+BrowserAccessibilityManager* BrowserAccessibilityManager::GetRootManager()
+    const {
   BrowserAccessibility* parent = GetParentNodeFromParentTree();
-  if (!parent)
-    return this;
+  if (parent) {
+    DCHECK(parent->instance_active())
+        << "The BrowserAccessibility object in the parent tree that is hosting "
+           "this tree should not have been destroyed before its child tree.";
+    return parent->manager() ? parent->manager()->GetRootManager() : nullptr;
+  }
 
-  return parent->manager()->GetRootManager();
+  if (IsRootTree())
+    return const_cast<BrowserAccessibilityManager*>(this);
+
+  // The current tree is disconnected from its parent, so we can't retrieve the
+  // root manager yet.
+  return nullptr;
 }
 
 BrowserAccessibilityDelegate*
-BrowserAccessibilityManager::GetDelegateFromRootManager() {
+BrowserAccessibilityManager::GetDelegateFromRootManager() const {
   BrowserAccessibilityManager* root_manager = GetRootManager();
   if (root_manager)
     return root_manager->delegate();
   return nullptr;
 }
 
-bool BrowserAccessibilityManager::IsRootTree() {
-  return delegate()->AccessibilityIsMainFrame() &&
+bool BrowserAccessibilityManager::IsRootTree() const {
+  return delegate_ && delegate_->AccessibilityIsMainFrame() &&
          GetTreeData().parent_tree_id == ui::AXTreeIDUnknown();
 }
 
@@ -1395,7 +1427,7 @@
   if (root_manager && root_manager != this)
     return root_manager->CachingAsyncHitTest(scaled_point);
 
-  if (delegate()) {
+  if (delegate_) {
     // This triggers an asynchronous request to compute the true object that's
     // under |scaled_point|.
     HitTest(scaled_point - GetViewBounds().OffsetFromOrigin());
diff --git a/content/browser/accessibility/browser_accessibility_manager.h b/content/browser/accessibility/browser_accessibility_manager.h
index 5c3fc29..b6e1dd38 100644
--- a/content/browser/accessibility/browser_accessibility_manager.h
+++ b/content/browser/accessibility/browser_accessibility_manager.h
@@ -91,7 +91,7 @@
 
   // Returns true if this delegate represents the main (topmost) frame in a
   // tree of frames.
-  virtual bool AccessibilityIsMainFrame() = 0;
+  virtual bool AccessibilityIsMainFrame() const = 0;
 };
 
 class CONTENT_EXPORT BrowserAccessibilityFactory {
@@ -161,10 +161,10 @@
   void FireFocusEventsIfNeeded();
 
   // Return whether or not we are currently able to fire events.
-  virtual bool CanFireEvents();
+  virtual bool CanFireEvents() const;
 
   // Return a pointer to the root of the tree.
-  BrowserAccessibility* GetRoot();
+  BrowserAccessibility* GetRoot() const;
 
   // Returns a pointer to the BrowserAccessibility object for a given AXNode.
   BrowserAccessibility* GetFromAXNode(const ui::AXNode* node) const;
@@ -174,7 +174,7 @@
   BrowserAccessibility* GetFromID(int32_t id) const;
 
   // If this tree has a parent tree, return the parent node in that tree.
-  BrowserAccessibility* GetParentNodeFromParentTree();
+  BrowserAccessibility* GetParentNodeFromParentTree() const;
 
   // Get the AXTreeData for this frame.
   const ui::AXTreeData& GetTreeData() const;
@@ -305,19 +305,20 @@
   BrowserAccessibilityManagerMac* ToBrowserAccessibilityManagerMac();
 #endif
 
-  // Return the object that has focus, starting at the top of the frame tree.
-  virtual BrowserAccessibility* GetFocus();
+  // Returns the object that has focus, starting at the top of the frame tree,
+  // or returns nullptr if this manager doesn't have access to the top document.
+  virtual BrowserAccessibility* GetFocus() const;
 
   // Return the object that has focus, only considering this frame and
   // descendants.
-  BrowserAccessibility* GetFocusFromThisOrDescendantFrame();
+  BrowserAccessibility* GetFocusFromThisOrDescendantFrame() const;
 
   // Given a focused node |focus|, returns a descendant of that node if it
   // has an active descendant, otherwise returns |focus|.
-  BrowserAccessibility* GetActiveDescendant(BrowserAccessibility* focus);
+  BrowserAccessibility* GetActiveDescendant(BrowserAccessibility* focus) const;
 
   // Returns true if native focus is anywhere in this WebContents or not.
-  bool NativeViewHasFocus();
+  bool NativeViewHasFocus() const;
 
   // True by default, but some platforms want to treat the root
   // scroll offsets separately.
@@ -405,15 +406,18 @@
   BrowserAccessibilityDelegate* delegate() const { return delegate_; }
 
   // If this BrowserAccessibilityManager is a child frame or guest frame,
-  // return the BrowserAccessibilityManager from the highest ancestor frame
-  // in the frame tree.
-  BrowserAccessibilityManager* GetRootManager();
+  // returns the BrowserAccessibilityManager from the top document in the frame
+  // tree. If the current frame is not connected to its parent frame yet, or if
+  // it got disconnected after being reparented, return nullptr to indicate that
+  // we don't have access to the root manager yet.
+  BrowserAccessibilityManager* GetRootManager() const;
 
-  // Returns the BrowserAccessibilityDelegate from |GetRootManager|, above.
-  BrowserAccessibilityDelegate* GetDelegateFromRootManager();
+  // Returns the BrowserAccessibilityDelegate from |GetRootManager| above, or
+  // returns nullptr in case we don't have access to the root manager yet.
+  BrowserAccessibilityDelegate* GetDelegateFromRootManager() const;
 
   // Returns whether this is the top document.
-  bool IsRootTree();
+  bool IsRootTree() const;
 
   // Get a snapshot of the current tree as an AXTreeUpdate.
   ui::AXTreeUpdate SnapshotAXTreeForTesting();
@@ -448,7 +452,6 @@
   static void SetLastFocusedNode(BrowserAccessibility* node);
   static BrowserAccessibility* GetLastFocusedNode();
 
- protected:
   // The object that can perform actions on our behalf.
   BrowserAccessibilityDelegate* delegate_;
 
@@ -459,7 +462,7 @@
   std::unique_ptr<ui::AXSerializableTree> tree_;
 
   // A mapping from a node id to its wrapper of type BrowserAccessibility.
-  std::unordered_map<int32_t, BrowserAccessibility*> id_wrapper_map_;
+  std::map<int32_t, BrowserAccessibility*> id_wrapper_map_;
 
   // True if the user has initiated a navigation to another page.
   bool user_is_navigating_away_;
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.cc b/content/browser/accessibility/browser_accessibility_manager_android.cc
index 74da28ea6..1e8f80c 100644
--- a/content/browser/accessibility/browser_accessibility_manager_android.cc
+++ b/content/browser/accessibility/browser_accessibility_manager_android.cc
@@ -63,9 +63,9 @@
   return wcax ? wcax->ShouldExposePasswordText() : false;
 }
 
-BrowserAccessibility* BrowserAccessibilityManagerAndroid::GetFocus() {
+BrowserAccessibility* BrowserAccessibilityManagerAndroid::GetFocus() const {
   BrowserAccessibility* focus = BrowserAccessibilityManager::GetFocus();
-  if (!focus->IsPlainTextField())
+  if (focus && !focus->IsPlainTextField())
     return GetActiveDescendant(focus);
   return focus;
 }
@@ -160,7 +160,8 @@
       if (node->manager() == GetRootManager()) {
         auto* android_focused =
             static_cast<BrowserAccessibilityAndroid*>(GetFocus());
-        wcax->HandlePageLoaded(android_focused->unique_id());
+        if (android_focused)
+          wcax->HandlePageLoaded(android_focused->unique_id());
       }
       break;
     case ui::AXEventGenerator::Event::CHECKED_STATE_CHANGED:
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.h b/content/browser/accessibility/browser_accessibility_manager_android.h
index 9a55289f..33a098c 100644
--- a/content/browser/accessibility/browser_accessibility_manager_android.h
+++ b/content/browser/accessibility/browser_accessibility_manager_android.h
@@ -70,7 +70,7 @@
   bool OnHoverEvent(const ui::MotionEventAndroid& event);
 
   // BrowserAccessibilityManager overrides.
-  BrowserAccessibility* GetFocus() override;
+  BrowserAccessibility* GetFocus() const override;
   void SendLocationChangeEvents(
       const std::vector<AccessibilityHostMsg_LocationChangeParams>& params)
       override;
diff --git a/content/browser/accessibility/browser_accessibility_manager_mac.h b/content/browser/accessibility/browser_accessibility_manager_mac.h
index b156543d..1848092 100644
--- a/content/browser/accessibility/browser_accessibility_manager_mac.h
+++ b/content/browser/accessibility/browser_accessibility_manager_mac.h
@@ -31,7 +31,7 @@
 
   static ui::AXTreeUpdate GetEmptyDocument();
 
-  BrowserAccessibility* GetFocus() override;
+  BrowserAccessibility* GetFocus() const override;
 
   // Implementation of BrowserAccessibilityManager.
   void FireFocusEvent(BrowserAccessibility* node) override;
diff --git a/content/browser/accessibility/browser_accessibility_manager_mac.mm b/content/browser/accessibility/browser_accessibility_manager_mac.mm
index e02f5f9..0c9de0c 100644
--- a/content/browser/accessibility/browser_accessibility_manager_mac.mm
+++ b/content/browser/accessibility/browser_accessibility_manager_mac.mm
@@ -140,7 +140,7 @@
   return update;
 }
 
-BrowserAccessibility* BrowserAccessibilityManagerMac::GetFocus() {
+BrowserAccessibility* BrowserAccessibilityManagerMac::GetFocus() const {
   BrowserAccessibility* focus = BrowserAccessibilityManager::GetFocus();
 
   // For editable combo boxes, focus should stay on the combo box so the user
diff --git a/content/browser/accessibility/browser_accessibility_manager_unittest.cc b/content/browser/accessibility/browser_accessibility_manager_unittest.cc
index d9bf1e1..d7219496 100644
--- a/content/browser/accessibility/browser_accessibility_manager_unittest.cc
+++ b/content/browser/accessibility/browser_accessibility_manager_unittest.cc
@@ -1589,8 +1589,9 @@
           initial_state, test_browser_accessibility_delegate_.get(),
           new CountedBrowserAccessibilityFactory()));
 
-  ASSERT_EQ(1, manager->GetRoot()->GetId());
-  ASSERT_EQ(2, manager->GetFocus()->GetId());
+  EXPECT_EQ(1, manager->GetRoot()->GetId());
+  ASSERT_NE(nullptr, manager->GetFocus());
+  EXPECT_EQ(2, manager->GetFocus()->GetId());
 
   // Now replace the tree with a new tree consisting of a single root.
   ui::AXNodeData root2;
@@ -1604,8 +1605,9 @@
 
   // Make sure that the focused node was updated to the new root and
   // that this doesn't crash.
-  ASSERT_EQ(3, manager->GetRoot()->GetId());
-  ASSERT_EQ(3, manager->GetFocus()->GetId());
+  EXPECT_EQ(3, manager->GetRoot()->GetId());
+  ASSERT_NE(nullptr, manager->GetFocus());
+  EXPECT_EQ(3, manager->GetFocus()->GetId());
 }
 
 TEST_F(BrowserAccessibilityManagerTest, DeletingFocusedNodeDoesNotCrash2) {
@@ -1634,8 +1636,9 @@
           initial_state, test_browser_accessibility_delegate_.get(),
           new CountedBrowserAccessibilityFactory()));
 
-  ASSERT_EQ(1, manager->GetRoot()->GetId());
-  ASSERT_EQ(2, manager->GetFocus()->GetId());
+  EXPECT_EQ(1, manager->GetRoot()->GetId());
+  ASSERT_NE(nullptr, manager->GetFocus());
+  EXPECT_EQ(2, manager->GetFocus()->GetId());
 
   // Now replace the tree with a new tree consisting of a single root.
   ui::AXNodeData root2;
@@ -1651,8 +1654,9 @@
 
   // Make sure that the focused node was updated to the new root and
   // that this doesn't crash.
-  ASSERT_EQ(3, manager->GetRoot()->GetId());
-  ASSERT_EQ(3, manager->GetFocus()->GetId());
+  EXPECT_EQ(3, manager->GetRoot()->GetId());
+  ASSERT_NE(nullptr, manager->GetFocus());
+  EXPECT_EQ(3, manager->GetFocus()->GetId());
 }
 
 TEST_F(BrowserAccessibilityManagerTest, TreeUpdatesAreMergedWhenPossible) {
diff --git a/content/browser/accessibility/browser_accessibility_manager_win.cc b/content/browser/accessibility/browser_accessibility_manager_win.cc
index 2afe87ea..9aaec711 100644
--- a/content/browser/accessibility/browser_accessibility_manager_win.cc
+++ b/content/browser/accessibility/browser_accessibility_manager_win.cc
@@ -93,7 +93,7 @@
     FireWinAccessibilityEvent(IA2_EVENT_DOCUMENT_RELOAD, GetRoot());
 }
 
-BrowserAccessibility* BrowserAccessibilityManagerWin::GetFocus() {
+BrowserAccessibility* BrowserAccessibilityManagerWin::GetFocus() const {
   BrowserAccessibility* focus = BrowserAccessibilityManager::GetFocus();
   return GetActiveDescendant(focus);
 }
@@ -102,7 +102,6 @@
     BrowserAccessibility* node) {
   BrowserAccessibilityManager::FireFocusEvent(node);
   DCHECK(node);
-
   FireWinAccessibilityEvent(EVENT_OBJECT_FOCUS, node);
   FireUiaAccessibilityEvent(UIA_AutomationFocusChangedEventId, node);
 }
@@ -499,7 +498,7 @@
   }
 }
 
-bool BrowserAccessibilityManagerWin::CanFireEvents() {
+bool BrowserAccessibilityManagerWin::CanFireEvents() const {
   if (!BrowserAccessibilityManager::CanFireEvents())
     return false;
   BrowserAccessibilityDelegate* root_delegate = GetDelegateFromRootManager();
@@ -619,7 +618,7 @@
 }
 
 bool BrowserAccessibilityManagerWin::ShouldFireEventForNode(
-    BrowserAccessibility* node) {
+    BrowserAccessibility* node) const {
   if (!node || !node->CanFireEvents())
     return false;
 
diff --git a/content/browser/accessibility/browser_accessibility_manager_win.h b/content/browser/accessibility/browser_accessibility_manager_win.h
index 74e818b..1edd0095e 100644
--- a/content/browser/accessibility/browser_accessibility_manager_win.h
+++ b/content/browser/accessibility/browser_accessibility_manager_win.h
@@ -48,8 +48,8 @@
 
   // BrowserAccessibilityManager methods
   void UserIsReloading() override;
-  BrowserAccessibility* GetFocus() override;
-  bool CanFireEvents() override;
+  BrowserAccessibility* GetFocus() const override;
+  bool CanFireEvents() const override;
   gfx::Rect GetViewBounds() override;
 
   void FireFocusEvent(BrowserAccessibility* node) override;
@@ -84,7 +84,7 @@
       bool root_changed,
       const std::vector<ui::AXTreeObserver::Change>& changes) override;
 
-  bool ShouldFireEventForNode(BrowserAccessibility* node);
+  bool ShouldFireEventForNode(BrowserAccessibility* node) const;
 
  private:
   void HandleSelectedStateChanged(BrowserAccessibility* node);
diff --git a/content/browser/accessibility/test_browser_accessibility_delegate.cc b/content/browser/accessibility/test_browser_accessibility_delegate.cc
index 1540e0c..eabb8180 100644
--- a/content/browser/accessibility/test_browser_accessibility_delegate.cc
+++ b/content/browser/accessibility/test_browser_accessibility_delegate.cc
@@ -46,7 +46,7 @@
   return nullptr;
 }
 
-bool TestBrowserAccessibilityDelegate::AccessibilityIsMainFrame() {
+bool TestBrowserAccessibilityDelegate::AccessibilityIsMainFrame() const {
   return is_root_frame_;
 }
 
diff --git a/content/browser/accessibility/test_browser_accessibility_delegate.h b/content/browser/accessibility/test_browser_accessibility_delegate.h
index 86fb3e9..10dca8b 100644
--- a/content/browser/accessibility/test_browser_accessibility_delegate.h
+++ b/content/browser/accessibility/test_browser_accessibility_delegate.h
@@ -22,7 +22,7 @@
   gfx::NativeViewAccessible AccessibilityGetNativeViewAccessible() override;
   gfx::NativeViewAccessible AccessibilityGetNativeViewAccessibleForWindow()
       override;
-  bool AccessibilityIsMainFrame() override;
+  bool AccessibilityIsMainFrame() const override;
 
   bool got_fatal_error() const;
   void reset_got_fatal_error();
diff --git a/content/browser/background_sync/background_sync_manager.cc b/content/browser/background_sync/background_sync_manager.cc
index a093620..0dcae47 100644
--- a/content/browser/background_sync/background_sync_manager.cc
+++ b/content/browser/background_sync/background_sync_manager.cc
@@ -330,12 +330,8 @@
     return;
   }
 
-  if (options.min_interval < 0 &&
-      options.min_interval != kMinIntervalForOneShotSync) {
-    RecordFailureAndPostError(BACKGROUND_SYNC_STATUS_NOT_ALLOWED,
-                              std::move(callback));
-    return;
-  }
+  DCHECK(options.min_interval >= 0 ||
+         options.min_interval == kMinIntervalForOneShotSync);
 
   if (GetBackgroundSyncType(options) == BackgroundSyncType::ONE_SHOT) {
     op_scheduler_.ScheduleOperation(
@@ -747,64 +743,68 @@
   }
 
   if (existing_registration) {
-    DCHECK(existing_registration->options()->Equals(options));
+    DCHECK_EQ(existing_registration->options()->tag, options.tag);
+    if (existing_registration->options()->Equals(options)) {
+      BackgroundSyncMetrics::RegistrationCouldFire registration_could_fire =
+          AreOptionConditionsMet()
+              ? BackgroundSyncMetrics::REGISTRATION_COULD_FIRE
+              : BackgroundSyncMetrics::REGISTRATION_COULD_NOT_FIRE;
+      BackgroundSyncMetrics::CountRegisterSuccess(
+          registration_could_fire,
+          BackgroundSyncMetrics::REGISTRATION_IS_DUPLICATE);
 
-    BackgroundSyncMetrics::RegistrationCouldFire registration_could_fire =
-        AreOptionConditionsMet()
-            ? BackgroundSyncMetrics::REGISTRATION_COULD_FIRE
-            : BackgroundSyncMetrics::REGISTRATION_COULD_NOT_FIRE;
-    BackgroundSyncMetrics::CountRegisterSuccess(
-        registration_could_fire,
-        BackgroundSyncMetrics::REGISTRATION_IS_DUPLICATE);
+      if (existing_registration->IsFiring()) {
+        existing_registration->set_sync_state(
+            blink::mojom::BackgroundSyncState::REREGISTERED_WHILE_FIRING);
+      }
 
-    if (existing_registration->IsFiring()) {
-      existing_registration->set_sync_state(
-          blink::mojom::BackgroundSyncState::REREGISTERED_WHILE_FIRING);
+      base::ThreadTaskRunnerHandle::Get()->PostTask(
+          FROM_HERE,
+          base::BindOnce(std::move(callback), BACKGROUND_SYNC_STATUS_OK,
+                         std::make_unique<BackgroundSyncRegistration>(
+                             *existing_registration)));
+      return;
     }
-
-    base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE,
-        base::BindOnce(std::move(callback), BACKGROUND_SYNC_STATUS_OK,
-                       std::make_unique<BackgroundSyncRegistration>(
-                           *existing_registration)));
-    return;
   }
 
-  BackgroundSyncRegistration new_registration;
+  BackgroundSyncRegistration registration;
 
-  *new_registration.options() = std::move(options);
-  new_registration.set_max_attempts(
+  *registration.options() = std::move(options);
+
+  // TODO(crbug.com/963487): This section below is really confusing. Add a
+  // comment explaining what's going on here, or annotate permission_statuses.
+  registration.set_max_attempts(
       permission_statuses.second == PermissionStatus::GRANTED
           ? parameters_->max_sync_attempts_with_notification_permission
           : parameters_->max_sync_attempts);
 
-  if (new_registration.sync_type() == BackgroundSyncType::PERIODIC) {
+  if (registration.sync_type() == BackgroundSyncType::PERIODIC) {
     base::PostTaskWithTraitsAndReplyWithResult(
         FROM_HERE, {BrowserThread::UI},
         base::BindOnce(
-            &GetNextEventDelay, service_worker_context_, new_registration,
-            origin, std::make_unique<BackgroundSyncParameters>(*parameters_)),
+            &GetNextEventDelay, service_worker_context_, registration, origin,
+            std::make_unique<BackgroundSyncParameters>(*parameters_)),
         base::BindOnce(&BackgroundSyncManager::RegisterDidGetDelay,
                        weak_ptr_factory_.GetWeakPtr(), sw_registration_id,
-                       new_registration, std::move(callback)));
+                       registration, std::move(callback)));
     return;
   }
 
-  RegisterDidGetDelay(sw_registration_id, new_registration, std::move(callback),
+  RegisterDidGetDelay(sw_registration_id, registration, std::move(callback),
                       base::TimeDelta());
 }
 
 void BackgroundSyncManager::RegisterDidGetDelay(
     int64_t sw_registration_id,
-    BackgroundSyncRegistration new_registration,
+    BackgroundSyncRegistration registration,
     StatusAndRegistrationCallback callback,
     base::TimeDelta delay) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
   // For one-shot registrations, we let the delay_until be in the past, so that
   // an event is fired at the soonest opportune moment.
-  if (new_registration.sync_type() == BackgroundSyncType::PERIODIC) {
-    new_registration.set_delay_until(clock_->Now() + delay);
+  if (registration.sync_type() == BackgroundSyncType::PERIODIC) {
+    registration.set_delay_until(clock_->Now() + delay);
   }
 
   ServiceWorkerRegistration* sw_registration =
@@ -816,16 +816,15 @@
     return;
   }
 
-  AddActiveRegistration(
+  AddOrUpdateActiveRegistration(
       sw_registration_id,
-      url::Origin::Create(sw_registration->scope().GetOrigin()),
-      new_registration);
+      url::Origin::Create(sw_registration->scope().GetOrigin()), registration);
 
   StoreRegistrations(
       sw_registration_id,
       base::BindOnce(&BackgroundSyncManager::RegisterDidStore,
                      weak_ptr_factory_.GetWeakPtr(), sw_registration_id,
-                     new_registration, std::move(callback)));
+                     registration, std::move(callback)));
 }
 
 void BackgroundSyncManager::UnregisterPeriodicSyncImpl(
@@ -982,7 +981,7 @@
 
 void BackgroundSyncManager::RegisterDidStore(
     int64_t sw_registration_id,
-    const BackgroundSyncRegistration& new_registration,
+    const BackgroundSyncRegistration& registration,
     StatusAndRegistrationCallback callback,
     blink::ServiceWorkerStatusCode status) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -1011,12 +1010,15 @@
       registration_could_fire,
       BackgroundSyncMetrics::REGISTRATION_IS_NOT_DUPLICATE);
 
+  // TODO(crbug.com/925297): Schedule or update a wake up task for periodic
+  // Background Sync registrations.
+
   // Tell the client that the registration is ready. We won't fire it until the
   // client has resolved the registration event.
   base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::BindOnce(std::move(callback), BACKGROUND_SYNC_STATUS_OK,
                                 std::make_unique<BackgroundSyncRegistration>(
-                                    new_registration)));
+                                    registration)));
 }
 
 void BackgroundSyncManager::DidResolveRegistrationImpl(
@@ -1064,7 +1066,7 @@
       {registration_info.tag, registration_info.sync_type});
 }
 
-void BackgroundSyncManager::AddActiveRegistration(
+void BackgroundSyncManager::AddOrUpdateActiveRegistration(
     int64_t sw_registration_id,
     const url::Origin& origin,
     const BackgroundSyncRegistration& sync_registration) {
diff --git a/content/browser/background_sync/background_sync_manager.h b/content/browser/background_sync/background_sync_manager.h
index edc3ecd..3f9d06d 100644
--- a/content/browser/background_sync/background_sync_manager.h
+++ b/content/browser/background_sync/background_sync_manager.h
@@ -227,7 +227,7 @@
   void RemoveActiveRegistration(
       const blink::mojom::BackgroundSyncRegistrationInfo& registration_info);
 
-  void AddActiveRegistration(
+  void AddOrUpdateActiveRegistration(
       int64_t sw_registration_id,
       const url::Origin& origin,
       const BackgroundSyncRegistration& sync_registration);
diff --git a/content/browser/background_sync/background_sync_manager_unittest.cc b/content/browser/background_sync/background_sync_manager_unittest.cc
index a91f43f..7daddc0 100644
--- a/content/browser/background_sync/background_sync_manager_unittest.cc
+++ b/content/browser/background_sync/background_sync_manager_unittest.cc
@@ -254,13 +254,11 @@
                void(bool, devtools::proto::BackgroundService));
 
   void CreateBackgroundSyncManager() {
-    background_sync_manager_ = std::make_unique<TestBackgroundSyncManager>(
+    test_background_sync_manager_ = std::make_unique<TestBackgroundSyncManager>(
         helper_->context_wrapper(),
         storage_partition_impl_->GetDevToolsBackgroundServicesContext());
-    test_background_sync_manager_ =
-        static_cast<TestBackgroundSyncManager*>(background_sync_manager_.get());
 
-    background_sync_manager_->set_clock(&test_clock_);
+    test_background_sync_manager_->set_clock(&test_clock_);
 
     // Many tests do not expect the sync event to fire immediately after
     // register (and cleanup up the sync registrations).  Tests can control when
@@ -293,7 +291,6 @@
   }
 
   void DeleteBackgroundSyncManager() {
-    background_sync_manager_.reset();
     test_background_sync_manager_ = nullptr;
   }
 
@@ -314,14 +311,14 @@
     BackgroundSyncStatus* callback_status;
     if (GetBackgroundSyncType(options) ==
         blink::mojom::BackgroundSyncType::ONE_SHOT) {
-      background_sync_manager_->Register(
+      test_background_sync_manager_->Register(
           sw_registration_id, std::move(options),
           base::BindOnce(&BackgroundSyncManagerTest::
                              StatusAndOneShotSyncRegistrationCallback,
                          base::Unretained(this), &was_called));
       callback_status = &one_shot_sync_callback_status_;
     } else {
-      background_sync_manager_->Register(
+      test_background_sync_manager_->Register(
           sw_registration_id, std::move(options),
           base::BindOnce(&BackgroundSyncManagerTest::
                              StatusAndPeriodicSyncRegistrationCallback,
@@ -335,7 +332,7 @@
     // Mock the client receiving the response and calling
     // DidResolveRegistration.
     if (*callback_status == BACKGROUND_SYNC_STATUS_OK) {
-      background_sync_manager_->DidResolveRegistration(
+      test_background_sync_manager_->DidResolveRegistration(
           blink::mojom::BackgroundSyncRegistrationInfo::New(
               sw_registration_id, options.tag, GetBackgroundSyncType(options)));
       base::RunLoop().RunUntilIdle();
@@ -354,7 +351,7 @@
     }
 
     bool was_called = false;
-    background_sync_manager_->UnregisterPeriodicSync(
+    test_background_sync_manager_->UnregisterPeriodicSync(
         sw_registration_id, options.tag,
         base::BindOnce(&BackgroundSyncManagerTest::StatusCallback,
                        base::Unretained(this), &was_called));
@@ -385,7 +382,7 @@
       blink::mojom::SyncRegistrationOptions registration_options) {
     bool was_called = false;
 
-    background_sync_manager_->GetOneShotSyncRegistrations(
+    test_background_sync_manager_->GetOneShotSyncRegistrations(
         sw_registration_id,
         base::BindOnce(&BackgroundSyncManagerTest::
                            StatusAndOneShotSyncRegistrationsCallback,
@@ -417,7 +414,7 @@
       blink::mojom::SyncRegistrationOptions registration_options) {
     bool was_called = false;
 
-    background_sync_manager_->GetPeriodicSyncRegistrations(
+    test_background_sync_manager_->GetPeriodicSyncRegistrations(
         sw_registration_id,
         base::BindOnce(&BackgroundSyncManagerTest::
                            StatusAndPeriodicSyncRegistrationsCallback,
@@ -446,7 +443,7 @@
 
   bool GetOneShotSyncRegistrations() {
     bool was_called = false;
-    background_sync_manager_->GetOneShotSyncRegistrations(
+    test_background_sync_manager_->GetOneShotSyncRegistrations(
         sw_registration_id_1_,
         base::BindOnce(&BackgroundSyncManagerTest::
                            StatusAndOneShotSyncRegistrationsCallback,
@@ -459,7 +456,7 @@
 
   bool GetPeriodicSyncRegistrations() {
     bool was_called = false;
-    background_sync_manager_->GetPeriodicSyncRegistrations(
+    test_background_sync_manager_->GetPeriodicSyncRegistrations(
         sw_registration_id_1_,
         base::BindOnce(&BackgroundSyncManagerTest::
                            StatusAndPeriodicSyncRegistrationsCallback,
@@ -585,17 +582,17 @@
     SetupBackgroundSyncManager();
   }
 
-  void FireReadyEvents() { background_sync_manager_->OnNetworkChanged(); }
+  void FireReadyEvents() { test_background_sync_manager_->OnNetworkChanged(); }
 
   bool AreOptionConditionsMet() {
-    return background_sync_manager_->AreOptionConditionsMet();
+    return test_background_sync_manager_->AreOptionConditionsMet();
   }
 
   TestBrowserThreadBundle browser_thread_bundle_;
   std::unique_ptr<EmbeddedWorkerTestHelper> helper_;
-  std::unique_ptr<BackgroundSyncManager> background_sync_manager_;
   std::unique_ptr<StoragePartitionImpl> storage_partition_impl_;
-  TestBackgroundSyncManager* test_background_sync_manager_ = nullptr;
+  std::unique_ptr<TestBackgroundSyncManager> test_background_sync_manager_ =
+      nullptr;
   base::SimpleTestClock test_clock_;
 
   int64_t sw_registration_id_1_;
@@ -631,11 +628,6 @@
   EXPECT_TRUE(Register(sync_options_1_));
 }
 
-TEST_F(BackgroundSyncManagerTest, FailToRegisterWithInvalidOptions) {
-  sync_options_1_.min_interval = -2000;
-  EXPECT_FALSE(Register(sync_options_1_));
-}
-
 TEST_F(BackgroundSyncManagerTest, Unregister) {
   // Not supported for One-shot syncs.
   EXPECT_TRUE(Register(sync_options_1_));
@@ -688,7 +680,7 @@
 TEST_F(BackgroundSyncManagerTest, RegisterAndWaitToFireUntilResolved) {
   InitSyncEventTest();
   bool was_called = false;
-  background_sync_manager_->Register(
+  test_background_sync_manager_->Register(
       sw_registration_id_1_, sync_options_1_,
       base::BindOnce(
           &BackgroundSyncManagerTest::StatusAndOneShotSyncRegistrationCallback,
@@ -700,7 +692,7 @@
   // client to acknowledge with DidResolveRegistration.
   EXPECT_EQ(0, sync_events_called_);
 
-  background_sync_manager_->DidResolveRegistration(
+  test_background_sync_manager_->DidResolveRegistration(
       blink::mojom::BackgroundSyncRegistrationInfo::New(
           sw_registration_id_1_, sync_options_1_.tag,
           GetBackgroundSyncType(sync_options_1_)));
@@ -711,7 +703,7 @@
 TEST_F(BackgroundSyncManagerTest, ResolveInvalidRegistration) {
   InitSyncEventTest();
   bool was_called = false;
-  background_sync_manager_->Register(
+  test_background_sync_manager_->Register(
       sw_registration_id_1_, sync_options_1_,
       base::BindOnce(
           &BackgroundSyncManagerTest::StatusAndOneShotSyncRegistrationCallback,
@@ -724,7 +716,7 @@
   EXPECT_EQ(0, sync_events_called_);
 
   // Resolve a non-existing registration.
-  background_sync_manager_->DidResolveRegistration(
+  test_background_sync_manager_->DidResolveRegistration(
       blink::mojom::BackgroundSyncRegistrationInfo::New(
           sw_registration_id_1_, "unknown_tag",
           GetBackgroundSyncType(sync_options_1_)));
@@ -918,6 +910,19 @@
   EXPECT_TRUE(Register(sync_options_2_));
 }
 
+TEST_F(BackgroundSyncManagerTest, ReregisterPeriodicSync) {
+  sync_options_1_.tag = sync_options_2_.tag;
+  sync_options_1_.min_interval = 1000;
+  sync_options_2_.min_interval = 2000;
+
+  EXPECT_TRUE(Register(sync_options_1_));
+  EXPECT_TRUE(GetRegistration(sync_options_1_));
+
+  EXPECT_TRUE(Register(sync_options_2_));
+  EXPECT_TRUE(GetRegistration(sync_options_2_));
+  EXPECT_FALSE(GetRegistration(sync_options_1_));
+}
+
 TEST_F(BackgroundSyncManagerTest, RegisterMaxTagLength) {
   sync_options_1_.tag = std::string(MaxTagLength(), 'a');
   EXPECT_TRUE(Register(sync_options_1_));
@@ -1754,14 +1759,14 @@
 TEST_F(BackgroundSyncManagerTest, EmulateOfflineSingleClient) {
   InitSyncEventTest();
 
-  background_sync_manager_->EmulateServiceWorkerOffline(sw_registration_id_1_,
-                                                        true);
+  test_background_sync_manager_->EmulateServiceWorkerOffline(
+      sw_registration_id_1_, true);
   EXPECT_TRUE(Register(sync_options_1_));
   EXPECT_EQ(0, sync_events_called_);
   EXPECT_TRUE(GetRegistration(sync_options_1_));
 
-  background_sync_manager_->EmulateServiceWorkerOffline(sw_registration_id_1_,
-                                                        false);
+  test_background_sync_manager_->EmulateServiceWorkerOffline(
+      sw_registration_id_1_, false);
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(1, sync_events_called_);
   EXPECT_FALSE(GetRegistration(sync_options_1_));
@@ -1774,28 +1779,28 @@
 TEST_F(BackgroundSyncManagerTest, EmulateOfflineMultipleClients) {
   InitSyncEventTest();
 
-  background_sync_manager_->EmulateServiceWorkerOffline(sw_registration_id_1_,
-                                                        true);
+  test_background_sync_manager_->EmulateServiceWorkerOffline(
+      sw_registration_id_1_, true);
   EXPECT_TRUE(Register(sync_options_1_));
   EXPECT_EQ(0, sync_events_called_);
   EXPECT_TRUE(GetRegistration(sync_options_1_));
 
-  background_sync_manager_->EmulateServiceWorkerOffline(sw_registration_id_1_,
-                                                        true);
+  test_background_sync_manager_->EmulateServiceWorkerOffline(
+      sw_registration_id_1_, true);
 
   EXPECT_TRUE(Register(sync_options_2_));
   EXPECT_EQ(0, sync_events_called_);
   EXPECT_TRUE(GetRegistration(sync_options_2_));
 
-  background_sync_manager_->EmulateServiceWorkerOffline(sw_registration_id_1_,
-                                                        false);
+  test_background_sync_manager_->EmulateServiceWorkerOffline(
+      sw_registration_id_1_, false);
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(0, sync_events_called_);
   EXPECT_TRUE(GetRegistration(sync_options_1_));
   EXPECT_TRUE(GetRegistration(sync_options_2_));
 
-  background_sync_manager_->EmulateServiceWorkerOffline(sw_registration_id_1_,
-                                                        false);
+  test_background_sync_manager_->EmulateServiceWorkerOffline(
+      sw_registration_id_1_, false);
   base::RunLoop().RunUntilIdle();
 
   EXPECT_EQ(2, sync_events_called_);
@@ -1816,7 +1821,7 @@
   bool was_called = false;
   blink::ServiceWorkerStatusCode code =
       blink::ServiceWorkerStatusCode::kErrorEventWaitUntilRejected;
-  background_sync_manager_->EmulateDispatchSyncEvent(
+  test_background_sync_manager_->EmulateDispatchSyncEvent(
       "emulated_tag", sw_registration_1_->active_version(), false,
       base::BindOnce(EmulateDispatchSyncEventCallback, &was_called, &code));
   base::RunLoop().RunUntilIdle();
@@ -1825,24 +1830,24 @@
 
   EXPECT_EQ(1, sync_events_called_);
 
-  background_sync_manager_->EmulateServiceWorkerOffline(sw_registration_id_1_,
-                                                        true);
+  test_background_sync_manager_->EmulateServiceWorkerOffline(
+      sw_registration_id_1_, true);
 
   was_called = false;
-  background_sync_manager_->EmulateDispatchSyncEvent(
+  test_background_sync_manager_->EmulateDispatchSyncEvent(
       "emulated_tag", sw_registration_1_->active_version(), false,
       base::BindOnce(EmulateDispatchSyncEventCallback, &was_called, &code));
   base::RunLoop().RunUntilIdle();
   EXPECT_TRUE(was_called);
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kErrorEventWaitUntilRejected, code);
 
-  background_sync_manager_->EmulateServiceWorkerOffline(sw_registration_id_1_,
-                                                        false);
+  test_background_sync_manager_->EmulateServiceWorkerOffline(
+      sw_registration_id_1_, false);
 
   SetNetwork(network::mojom::ConnectionType::CONNECTION_NONE);
   was_called = false;
   code = blink::ServiceWorkerStatusCode::kOk;
-  background_sync_manager_->EmulateDispatchSyncEvent(
+  test_background_sync_manager_->EmulateDispatchSyncEvent(
       "emulated_tag", sw_registration_1_->active_version(), false,
       base::BindOnce(EmulateDispatchSyncEventCallback, &was_called, &code));
   base::RunLoop().RunUntilIdle();
@@ -1851,7 +1856,7 @@
 
   SetNetwork(network::mojom::ConnectionType::CONNECTION_WIFI);
   was_called = false;
-  background_sync_manager_->EmulateDispatchSyncEvent(
+  test_background_sync_manager_->EmulateDispatchSyncEvent(
       "emulated_tag", sw_registration_1_->active_version(), false,
       base::BindOnce(EmulateDispatchSyncEventCallback, &was_called, &code));
   base::RunLoop().RunUntilIdle();
diff --git a/content/browser/background_sync/background_sync_network_observer.cc b/content/browser/background_sync/background_sync_network_observer.cc
index 662b3138..e155d23 100644
--- a/content/browser/background_sync/background_sync_network_observer.cc
+++ b/content/browser/background_sync/background_sync_network_observer.cc
@@ -30,6 +30,7 @@
       connection_changed_callback_(connection_changed_callback),
       weak_ptr_factory_(this) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  DCHECK(connection_changed_callback_);
 
   base::PostTaskWithTraitsAndReplyWithResult(
       FROM_HERE, {BrowserThread::UI},
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc
index 3a0d53c..2c3bbaf1 100644
--- a/content/browser/browser_main_loop.cc
+++ b/content/browser/browser_main_loop.cc
@@ -893,12 +893,7 @@
   startup_task_runner_->AddTask(std::move(pre_main_message_loop_run));
 
 #if defined(OS_ANDROID)
-  if (parameters_.ui_task) {
-    // Running inside browser tests, which relies on synchronous start.
-    startup_task_runner_->RunAllTasksNow();
-  } else {
-    startup_task_runner_->StartRunningTasksAsync();
-  }
+  startup_task_runner_->StartRunningTasksAsync();
 #else
   startup_task_runner_->RunAllTasksNow();
 #endif
diff --git a/content/browser/devtools/devtools_instrumentation.cc b/content/browser/devtools/devtools_instrumentation.cc
index 11de8de..80447202 100644
--- a/content/browser/devtools/devtools_instrumentation.cc
+++ b/content/browser/devtools/devtools_instrumentation.cc
@@ -162,7 +162,9 @@
   }
   FrameTreeNode* parent = frame_tree_node->parent();
   if (!parent) {
-    if (WebContentsImpl::FromFrameTreeNode(frame_tree_node)->IsPortal()) {
+    if (WebContentsImpl::FromFrameTreeNode(frame_tree_node)->IsPortal() &&
+        WebContentsImpl::FromFrameTreeNode(frame_tree_node)
+            ->GetOuterWebContents()) {
       parent = WebContentsImpl::FromFrameTreeNode(frame_tree_node)
                    ->GetOuterWebContents()
                    ->GetFrameTree()
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc
index 89024db0..3b9d0cf 100644
--- a/content/browser/download/download_manager_impl.cc
+++ b/content/browser/download/download_manager_impl.cc
@@ -551,6 +551,7 @@
           RenderFrameHost::GetFrameTreeNodeIdForRoutingId(
               info.render_process_id, info.render_frame_id);
       params.from_download_cross_origin_redirect = true;
+      params.initiator_origin = info.request_initiator;
       web_contents->GetController().LoadURLWithParams(params);
     }
     if (info.request_handle)
@@ -917,6 +918,8 @@
 
   const GURL& url = resource_request->url;
   const std::string& method = resource_request->method;
+  base::Optional<url::Origin> request_initiator =
+      resource_request->request_initiator;
 
   ResourceRequestInfo::WebContentsGetter web_contents_getter =
       base::BindRepeating(WebContents::FromFrameTreeNodeId, frame_tree_node_id);
@@ -930,6 +933,7 @@
           std::move(url_loader_client_endpoints));
 
   delegate_->CheckDownloadAllowed(std::move(web_contents_getter), url, method,
+                                  std::move(request_initiator),
                                   std::move(on_download_checks_done));
 }
 
@@ -1454,6 +1458,7 @@
       if (delegate_) {
         delegate_->CheckDownloadAllowed(std::move(web_contents_getter), url,
                                         method,
+                                        base::nullopt /*request_initiator*/,
                                         std::move(on_can_download_checks_done));
         return;
       }
diff --git a/content/browser/frame_host/navigation_controller_impl.cc b/content/browser/frame_host/navigation_controller_impl.cc
index 433274e..818e8e4 100644
--- a/content/browser/frame_host/navigation_controller_impl.cc
+++ b/content/browser/frame_host/navigation_controller_impl.cc
@@ -523,8 +523,7 @@
       is_initial_navigation_(true),
       in_navigate_to_pending_entry_(false),
       pending_reload_(ReloadType::NONE),
-      get_timestamp_callback_(base::Bind(&base::Time::Now)),
-      last_committed_reload_type_(ReloadType::NONE) {
+      get_timestamp_callback_(base::Bind(&base::Time::Now)) {
   DCHECK(browser_context_);
 }
 
@@ -605,26 +604,7 @@
   if (!entry)
     return;
 
-  // Check if previous navigation was a reload to track consecutive reload
-  // operations.
-  if (last_committed_reload_type_ != ReloadType::NONE) {
-    DCHECK(!last_committed_reload_time_.is_null());
-    base::Time now =
-        time_smoother_.GetSmoothedTime(get_timestamp_callback_.Run());
-    DCHECK_GT(now, last_committed_reload_time_);
-    if (!last_committed_reload_time_.is_null() &&
-        now > last_committed_reload_time_) {
-      base::TimeDelta delta = now - last_committed_reload_time_;
-      UMA_HISTOGRAM_MEDIUM_TIMES("Navigation.Reload.ReloadToReloadDuration",
-                                 delta);
-      if (last_committed_reload_type_ == ReloadType::NORMAL) {
-        UMA_HISTOGRAM_MEDIUM_TIMES(
-            "Navigation.Reload.ReloadMainResourceToReloadDuration", delta);
-      }
-    }
-  }
-
-  // Set ReloadType for |entry| in order to check it at commit time.
+  // Set ReloadType for |entry|.
   entry->set_reload_type(reload_type);
 
   if (g_check_for_repost && check_for_repost &&
@@ -1056,28 +1036,13 @@
   // is_same_document must be computed before the entry gets committed.
   details->is_same_document = is_same_document_navigation;
 
-  // Save reload type and timestamp for a reload navigation to detect
-  // consecutive reloads when the next reload is requested.
-  NavigationHandleImpl* navigation_handle =
-      navigation_request->navigation_handle();
-  DCHECK(navigation_handle);
-  if (PendingEntryMatchesHandle(navigation_handle)) {
-    if (pending_entry_->reload_type() != ReloadType::NONE) {
-      last_committed_reload_type_ = pending_entry_->reload_type();
-      last_committed_reload_time_ =
-          time_smoother_.GetSmoothedTime(get_timestamp_callback_.Run());
-    } else if (!pending_entry_->is_renderer_initiated() ||
-               params.gesture == NavigationGestureUser) {
-      last_committed_reload_type_ = ReloadType::NONE;
-      last_committed_reload_time_ = base::Time();
-    }
-  }
-
   // Make sure we do not discard the pending entry for a different ongoing
   // navigation when a same document commit comes in unexpectedly from the
   // renderer.  Limit this to a very narrow set of conditions to avoid risks to
   // other navigation types. See https://crbug.com/900036.
   // TODO(crbug.com/926009): Handle history.pushState() as well.
+  NavigationHandleImpl* navigation_handle =
+      navigation_request->navigation_handle();
   bool keep_pending_entry = is_same_document_navigation &&
                             details->type == NAVIGATION_TYPE_EXISTING_PAGE &&
                             pending_entry_ &&
diff --git a/content/browser/frame_host/navigation_controller_impl.h b/content/browser/frame_host/navigation_controller_impl.h
index 94917441..48796303 100644
--- a/content/browser/frame_host/navigation_controller_impl.h
+++ b/content/browser/frame_host/navigation_controller_impl.h
@@ -582,13 +582,6 @@
   // the wrong order in the history view.
   TimeSmoother time_smoother_;
 
-  // Used for tracking consecutive reload requests.  If the last user-initiated
-  // navigation (either browser-initiated or renderer-initiated with a user
-  // gesture) was a reload, these hold the ReloadType and timestamp.  Otherwise
-  // these are ReloadType::NONE and a null timestamp, respectively.
-  ReloadType last_committed_reload_type_;
-  base::Time last_committed_reload_time_;
-
   // BackForwardCache:
   //
   // Stores frozen RenderFrameHost. Restores them on history navigation.
diff --git a/content/browser/frame_host/navigation_controller_impl_browsertest.cc b/content/browser/frame_host/navigation_controller_impl_browsertest.cc
index c25849f..d1c1ce1 100644
--- a/content/browser/frame_host/navigation_controller_impl_browsertest.cc
+++ b/content/browser/frame_host/navigation_controller_impl_browsertest.cc
@@ -20,7 +20,6 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/post_task.h"
-#include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread_restrictions.h"
@@ -7319,121 +7318,6 @@
   // test will fail.
 }
 
-namespace {
-
-// Execute JavaScript without the user gesture flag set, and wait for the
-// triggered load finished.
-void ExecuteJavaScriptAndWaitForLoadStop(WebContents* web_contents,
-                                         const std::string script) {
-  // WaitForLoadStop() does not work to wait for loading that is triggered by
-  // JavaScript asynchronously.
-  TestNavigationObserver observer(web_contents);
-
-  // ExecJs() sets a user gesture flag internally for testing, but we
-  // want to run JavaScript without the flag.  Call ExecuteJavaScriptForTests
-  // directly.
-  static_cast<WebContentsImpl*>(web_contents)
-      ->GetMainFrame()
-      ->ExecuteJavaScriptForTests(base::UTF8ToUTF16(script),
-                                  base::NullCallback());
-
-  observer.Wait();
-}
-
-}  // namespace
-
-// Check if consecutive reloads can be correctly captured by metrics.
-IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
-                       ConsecutiveReloadMetrics) {
-  base::HistogramTester histogram;
-
-  const char kReloadToReloadMetricName[] =
-      "Navigation.Reload.ReloadToReloadDuration";
-  const char kReloadMainResourceToReloadMetricName[] =
-      "Navigation.Reload.ReloadMainResourceToReloadDuration";
-
-  // Navigate to a page, and check if metrics are initialized correctly.
-  EXPECT_TRUE(NavigateToURL(
-      shell(), embedded_test_server()->GetURL(
-                   "/navigation_controller/page_with_links.html")));
-  histogram.ExpectTotalCount(kReloadToReloadMetricName, 0);
-  histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 0);
-
-  NavigationControllerImpl& controller = static_cast<NavigationControllerImpl&>(
-      shell()->web_contents()->GetController());
-
-  // Reload triggers a reload of ReloadType::NORMAL.  The first reload should
-  // not be counted.
-  controller.Reload(ReloadType::NORMAL, false);
-  EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
-  histogram.ExpectTotalCount(kReloadToReloadMetricName, 0);
-  histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 0);
-
-  // Reload with ReloadType::BYPASSING_CACHE.  Both metrics should count the
-  // consecutive reloads.
-  controller.Reload(ReloadType::BYPASSING_CACHE, false);
-  EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
-  histogram.ExpectTotalCount(kReloadToReloadMetricName, 1);
-  histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 1);
-
-  // Triggers another reload with ReloadType::BYPASSING_CACHE.
-  // ReloadMainResourceToReload should not be counted here.
-  controller.Reload(ReloadType::BYPASSING_CACHE, false);
-  EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
-  histogram.ExpectTotalCount(kReloadToReloadMetricName, 2);
-  histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 1);
-
-  // A browser-initiated navigation should reset the reload tracking
-  // information.
-  EXPECT_TRUE(
-      NavigateToURL(shell(), embedded_test_server()->GetURL(
-                                 "/navigation_controller/simple_page_1.html")));
-  histogram.ExpectTotalCount(kReloadToReloadMetricName, 2);
-  histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 1);
-
-  // Then, the next reload should be assumed as the first reload.  Metrics
-  // should not be changed for the first reload.
-  controller.Reload(ReloadType::NORMAL, false);
-  EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
-  histogram.ExpectTotalCount(kReloadToReloadMetricName, 2);
-  histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 1);
-
-  // Another reload of ReloadType::NORMAL should be counted by both metrics
-  // again.
-  controller.Reload(ReloadType::NORMAL, false);
-  EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
-  histogram.ExpectTotalCount(kReloadToReloadMetricName, 3);
-  histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 2);
-
-  // A renderer-initiated navigations with no user gesture don't reset reload
-  // tracking information, and the following reload will be counted by metrics.
-  ExecuteJavaScriptAndWaitForLoadStop(
-      shell()->web_contents(),
-      "history.pushState({}, 'page 1', 'simple_page_1.html')");
-  histogram.ExpectTotalCount(kReloadToReloadMetricName, 3);
-  histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 2);
-  ExecuteJavaScriptAndWaitForLoadStop(shell()->web_contents(),
-                                      "location.href='simple_page_2.html'");
-  histogram.ExpectTotalCount(kReloadToReloadMetricName, 3);
-  histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 2);
-
-  controller.Reload(ReloadType::NORMAL, false);
-  EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
-  histogram.ExpectTotalCount(kReloadToReloadMetricName, 4);
-  histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 3);
-
-  // Go back to the first page. Reload tracking information should be reset.
-  shell()->web_contents()->GetController().GoBack();
-  EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
-  histogram.ExpectTotalCount(kReloadToReloadMetricName, 4);
-  histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 3);
-
-  controller.Reload(ReloadType::NORMAL, false);
-  EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
-  histogram.ExpectTotalCount(kReloadToReloadMetricName, 4);
-  histogram.ExpectTotalCount(kReloadMainResourceToReloadMetricName, 3);
-}
-
 // Check that the referrer is stored inside FrameNavigationEntry for subframes.
 IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
                        RefererStoredForSubFrame) {
diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc
index 0c4d563..bcc66e4 100644
--- a/content/browser/frame_host/navigation_request.cc
+++ b/content/browser/frame_host/navigation_request.cc
@@ -1757,7 +1757,7 @@
   begin_params_->headers = headers.ToString();
 
   loader_ = NavigationURLLoader::Create(
-      browser_context->GetResourceContext(), partition,
+      browser_context, browser_context->GetResourceContext(), partition,
       std::make_unique<NavigationRequestInfo>(
           common_params_, begin_params_.Clone(), site_for_cookies,
           top_frame_origin, frame_tree_node_->IsMainFrame(),
@@ -2207,11 +2207,13 @@
   FrameTreeNode* parent_ftn = frame_tree_node()->parent();
   RenderFrameHostImpl* parent =
       parent_ftn ? parent_ftn->current_frame_host() : nullptr;
-  if (!parent && frame_tree_node()
-                     ->current_frame_host()
-                     ->GetRenderViewHost()
-                     ->GetDelegate()
-                     ->IsPortal()) {
+  if (!parent &&
+      frame_tree_node()
+          ->current_frame_host()
+          ->GetRenderViewHost()
+          ->GetDelegate()
+          ->IsPortal() &&
+      frame_tree_node()->render_manager()->GetOuterDelegateNode()) {
     parent = frame_tree_node()
                  ->render_manager()
                  ->GetOuterDelegateNode()
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 0f1ea54..3f37130f 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -1633,7 +1633,7 @@
   return nullptr;
 }
 
-bool RenderFrameHostImpl::AccessibilityIsMainFrame() {
+bool RenderFrameHostImpl::AccessibilityIsMainFrame() const {
   return frame_tree_node()->IsMainFrame();
 }
 
@@ -4217,8 +4217,8 @@
     registry_->AddInterface(
         base::BindRepeating(&RenderFrameHostImpl::BindSerialServiceRequest,
                             base::Unretained(this)));
-    registry_->AddInterface(base::BindRepeating(
-        &RenderFrameHostImpl::BindHidServiceRequest, base::Unretained(this)));
+    registry_->AddInterface(
+        base::BindRepeating(&HidService::Create, base::Unretained(this)));
   }
 #endif  // !defined(OS_ANDROID)
 
@@ -6039,14 +6039,6 @@
   serial_service_->Bind(std::move(request));
 }
 
-void RenderFrameHostImpl::BindHidServiceRequest(
-    blink::mojom::HidServiceRequest request) {
-  if (!hid_service_)
-    hid_service_ = std::make_unique<HidService>();
-
-  hid_service_->Bind(std::move(request));
-}
-
 void RenderFrameHostImpl::BindAuthenticatorRequest(
     blink::mojom::AuthenticatorRequest request) {
   if (!authenticator_impl_)
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h
index 7feb38c..8c861f9 100644
--- a/content/browser/frame_host/render_frame_host_impl.h
+++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -99,7 +99,6 @@
 #if defined(OS_ANDROID)
 #include "services/device/public/mojom/nfc.mojom.h"
 #else
-#include "third_party/blink/public/mojom/hid/hid.mojom.h"
 #include "third_party/blink/public/mojom/serial/serial.mojom.h"
 #endif
 
@@ -141,7 +140,6 @@
 class FrameTree;
 class FrameTreeNode;
 class GeolocationServiceImpl;
-class HidService;
 class KeepAliveHandleFactory;
 class MediaInterfaceProxy;
 class NavigationEntryImpl;
@@ -310,7 +308,7 @@
   gfx::NativeViewAccessible AccessibilityGetNativeViewAccessible() override;
   gfx::NativeViewAccessible AccessibilityGetNativeViewAccessibleForWindow()
       override;
-  bool AccessibilityIsMainFrame() override;
+  bool AccessibilityIsMainFrame() const override;
 
   // RenderProcessHostObserver implementation.
   void RenderProcessExited(RenderProcessHost* host,
@@ -402,7 +400,7 @@
 
   RenderViewHostImpl* render_view_host() { return render_view_host_; }
   RenderFrameHostDelegate* delegate() { return delegate_; }
-  FrameTreeNode* frame_tree_node() { return frame_tree_node_; }
+  FrameTreeNode* frame_tree_node() const { return frame_tree_node_; }
 
   // Methods to add/remove/reset/query child FrameTreeNodes of this frame.
   // See class-level comment for FrameTreeNode for how the frame tree is
@@ -1393,8 +1391,6 @@
   // Callback for connection error on the media::mojom::InterfaceFactory client.
   void OnMediaInterfaceFactoryConnectionError();
 
-  void BindWakeLockRequest(device::mojom::WakeLockRequest request);
-
 #if defined(OS_ANDROID)
   void BindNFCRequest(device::mojom::NFCRequest request);
 #endif
@@ -1402,7 +1398,6 @@
 #if !defined(OS_ANDROID)
   void BindSerialServiceRequest(blink::mojom::SerialServiceRequest request);
   void BindAuthenticatorRequest(blink::mojom::AuthenticatorRequest request);
-  void BindHidServiceRequest(blink::mojom::HidServiceRequest request);
 #endif
 
   void BindPresentationServiceRequest(
@@ -1990,9 +1985,6 @@
 #if !defined(OS_ANDROID)
   // Hosts blink::mojom::SerialService for the RenderFrame.
   std::unique_ptr<SerialService> serial_service_;
-
-  // Hosts blink::mojom::HidService for the RenderFrame.
-  std::unique_ptr<HidService> hid_service_;
 #endif
 
   // Hosts blink::mojom::PresentationService for the RenderFrame.
diff --git a/content/browser/hid/hid_service.cc b/content/browser/hid/hid_service.cc
index be3c79f..b34be266 100644
--- a/content/browser/hid/hid_service.cc
+++ b/content/browser/hid/hid_service.cc
@@ -6,14 +6,115 @@
 
 #include <utility>
 
+#include "base/bind.h"
+#include "base/callback.h"
+#include "content/public/browser/content_browser_client.h"
+#include "content/public/browser/hid_chooser.h"
+#include "content/public/browser/hid_delegate.h"
+#include "content/public/browser/render_frame_host.h"
+#include "mojo/public/cpp/bindings/interface_request.h"
+#include "mojo/public/cpp/bindings/message.h"
+#include "third_party/blink/public/mojom/feature_policy/feature_policy.mojom.h"
+
 namespace content {
 
-HidService::HidService() = default;
+HidService::HidService(RenderFrameHost* render_frame_host,
+                       blink::mojom::HidServiceRequest request)
+    : FrameServiceBase(render_frame_host, std::move(request)) {}
 
 HidService::~HidService() = default;
 
-void HidService::Bind(blink::mojom::HidServiceRequest request) {
-  bindings_.AddBinding(this, std::move(request));
+// static
+void HidService::Create(RenderFrameHost* render_frame_host,
+                        blink::mojom::HidServiceRequest request) {
+  DCHECK(render_frame_host);
+
+  if (!render_frame_host->IsFeatureEnabled(
+          blink::mojom::FeaturePolicyFeature::kHid)) {
+    mojo::ReportBadMessage("Feature policy blocks access to HID.");
+    return;
+  }
+
+  // Avoid creating the HidService if there is no HID delegate to provide the
+  // implementation.
+  if (!GetContentClient()->browser()->GetHidDelegate())
+    return;
+
+  // HidService owns itself. It will self-destruct when a mojo interface error
+  // occurs, the render frame host is deleted, or the render frame host
+  // navigates to a new document.
+  new HidService(render_frame_host, std::move(request));
+}
+
+void HidService::GetDevices(GetDevicesCallback callback) {
+  GetContentClient()
+      ->browser()
+      ->GetHidDelegate()
+      ->GetHidManager(web_contents())
+      ->GetDevices(base::BindOnce(&HidService::FinishGetDevices,
+                                  weak_factory_.GetWeakPtr(),
+                                  std::move(callback)));
+}
+
+void HidService::RequestDevice(
+    std::vector<blink::mojom::HidDeviceFilterPtr> filters,
+    RequestDeviceCallback callback) {
+  HidDelegate* delegate = GetContentClient()->browser()->GetHidDelegate();
+  if (!delegate->CanRequestDevicePermission(web_contents(), origin())) {
+    std::move(callback).Run(nullptr);
+    return;
+  }
+
+  chooser_ = delegate->RunChooser(
+      render_frame_host(), std::move(filters),
+      base::BindOnce(&HidService::FinishRequestDevice,
+                     weak_factory_.GetWeakPtr(), std::move(callback)));
+}
+
+void HidService::Connect(const std::string& device_guid,
+                         device::mojom::HidConnectionClientPtr client,
+                         ConnectCallback callback) {
+  GetContentClient()
+      ->browser()
+      ->GetHidDelegate()
+      ->GetHidManager(web_contents())
+      ->Connect(
+          device_guid, std::move(client),
+          base::BindOnce(&HidService::FinishConnect, weak_factory_.GetWeakPtr(),
+                         std::move(callback)));
+}
+
+void HidService::FinishGetDevices(
+    GetDevicesCallback callback,
+    std::vector<device::mojom::HidDeviceInfoPtr> devices) {
+  std::vector<device::mojom::HidDeviceInfoPtr> result;
+  HidDelegate* delegate = GetContentClient()->browser()->GetHidDelegate();
+  for (auto& device : devices) {
+    if (delegate->HasDevicePermission(web_contents(), origin(), *device))
+      result.push_back(std::move(device));
+  }
+
+  std::move(callback).Run(std::move(result));
+}
+
+void HidService::FinishRequestDevice(RequestDeviceCallback callback,
+                                     device::mojom::HidDeviceInfoPtr device) {
+  if (!device) {
+    std::move(callback).Run(nullptr);
+    return;
+  }
+
+  std::move(callback).Run(std::move(device));
+}
+
+void HidService::FinishConnect(ConnectCallback callback,
+                               device::mojom::HidConnectionPtr connection) {
+  if (!connection) {
+    std::move(callback).Run(nullptr);
+    return;
+  }
+
+  std::move(callback).Run(std::move(connection));
 }
 
 }  // namespace content
diff --git a/content/browser/hid/hid_service.h b/content/browser/hid/hid_service.h
index 067e795..1572fdc 100644
--- a/content/browser/hid/hid_service.h
+++ b/content/browser/hid/hid_service.h
@@ -5,27 +5,51 @@
 #ifndef CONTENT_BROWSER_HID_HID_SERVICE_H_
 #define CONTENT_BROWSER_HID_HID_SERVICE_H_
 
+#include <memory>
 #include <string>
 #include <vector>
 
 #include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "content/public/browser/frame_service_base.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "services/device/public/mojom/hid.mojom.h"
 #include "third_party/blink/public/mojom/hid/hid.mojom.h"
 
 namespace content {
 
+class HidChooser;
+class RenderFrameHost;
+
 // HidService provides an implementation of the HidService mojom interface. This
 // interface is used by Blink to implement the WebHID API.
-class HidService : public blink::mojom::HidService {
+class HidService : public content::FrameServiceBase<blink::mojom::HidService> {
  public:
-  explicit HidService();
-  ~HidService() override;
+  static void Create(RenderFrameHost*, blink::mojom::HidServiceRequest);
 
-  void Bind(blink::mojom::HidServiceRequest request);
+  // blink::mojom::HidService:
+  void GetDevices(GetDevicesCallback callback) override;
+  void RequestDevice(std::vector<blink::mojom::HidDeviceFilterPtr> filters,
+                     RequestDeviceCallback callback) override;
+  void Connect(const std::string& device_guid,
+               device::mojom::HidConnectionClientPtr client,
+               ConnectCallback callback) override;
 
  private:
-  mojo::BindingSet<blink::mojom::HidService> bindings_;
+  HidService(RenderFrameHost*, blink::mojom::HidServiceRequest);
+  ~HidService() override;
+
+  void FinishGetDevices(GetDevicesCallback callback,
+                        std::vector<device::mojom::HidDeviceInfoPtr> devices);
+  void FinishRequestDevice(RequestDeviceCallback callback,
+                           device::mojom::HidDeviceInfoPtr device);
+  void FinishConnect(ConnectCallback callback,
+                     device::mojom::HidConnectionPtr connection);
+
+  // The last shown HID chooser UI.
+  std::unique_ptr<HidChooser> chooser_;
+
+  base::WeakPtrFactory<HidService> weak_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(HidService);
 };
diff --git a/content/browser/hid/hid_service_unittest.cc b/content/browser/hid/hid_service_unittest.cc
new file mode 100644
index 0000000..27b4843
--- /dev/null
+++ b/content/browser/hid/hid_service_unittest.cc
@@ -0,0 +1,236 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/command_line.h"
+#include "base/test/bind_test_util.h"
+#include "content/public/browser/content_browser_client.h"
+#include "content/public/browser/hid_delegate.h"
+#include "content/public/common/content_client.h"
+#include "content/public/common/content_switches.h"
+#include "content/test/test_render_view_host.h"
+#include "content/test/test_web_contents.h"
+#include "services/device/public/cpp/hid/fake_hid_manager.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/mojom/hid/hid.mojom.h"
+
+namespace content {
+
+namespace {
+
+const char kTestUrl[] = "https://www.google.com";
+const char kTestGuid[] = "test-guid";
+
+class MockHidDelegate : public HidDelegate {
+ public:
+  MockHidDelegate() = default;
+  ~MockHidDelegate() override = default;
+
+  std::unique_ptr<HidChooser> RunChooser(
+      RenderFrameHost* frame,
+      std::vector<blink::mojom::HidDeviceFilterPtr> filters,
+      HidChooser::Callback callback) override {
+    std::move(callback).Run(RunChooserInternal());
+    return nullptr;
+  }
+
+  MOCK_METHOD0(RunChooserInternal, device::mojom::HidDeviceInfoPtr());
+  MOCK_METHOD2(CanRequestDevicePermission,
+               bool(content::WebContents* web_contents,
+                    const url::Origin& requesting_origin));
+  MOCK_METHOD3(HasDevicePermission,
+               bool(content::WebContents* web_contents,
+                    const url::Origin& requesting_origin,
+                    const device::mojom::HidDeviceInfo& device));
+  MOCK_METHOD1(GetHidManager,
+               device::mojom::HidManager*(content::WebContents* web_contents));
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(MockHidDelegate);
+};
+
+class HidTestContentBrowserClient : public ContentBrowserClient {
+ public:
+  HidTestContentBrowserClient() = default;
+  ~HidTestContentBrowserClient() override = default;
+
+  MockHidDelegate& delegate() { return delegate_; }
+
+  // ContentBrowserClient:
+  HidDelegate* GetHidDelegate() override { return &delegate_; }
+
+ private:
+  MockHidDelegate delegate_;
+
+  DISALLOW_COPY_AND_ASSIGN(HidTestContentBrowserClient);
+};
+
+class FakeHidConnectionClient : public device::mojom::HidConnectionClient {
+ public:
+  FakeHidConnectionClient() : binding_(this) {}
+
+  void Bind(device::mojom::HidConnectionClientRequest request) {
+    binding_.Bind(std::move(request));
+  }
+
+  // mojom::HidConnectionClient:
+  void OnInputReport(uint8_t report_id,
+                     const std::vector<uint8_t>& buffer) override {}
+
+ private:
+  mojo::Binding<device::mojom::HidConnectionClient> binding_;
+
+  DISALLOW_COPY_AND_ASSIGN(FakeHidConnectionClient);
+};
+
+class HidServiceTest : public RenderViewHostImplTestHarness {
+ public:
+  HidServiceTest() {
+    ON_CALL(hid_delegate(), GetHidManager)
+        .WillByDefault(testing::Return(&hid_manager_));
+  }
+
+  ~HidServiceTest() override = default;
+
+  void SetUp() override {
+    base::CommandLine::ForCurrentProcess()->AppendSwitch(
+        switches::kEnableExperimentalWebPlatformFeatures);
+    original_client_ = SetBrowserClientForTesting(&test_client_);
+    RenderViewHostTestHarness::SetUp();
+  }
+
+  void TearDown() override {
+    RenderViewHostTestHarness::TearDown();
+    if (original_client_)
+      SetBrowserClientForTesting(original_client_);
+  }
+
+  MockHidDelegate& hid_delegate() { return test_client_.delegate(); }
+  device::FakeHidManager* hid_manager() { return &hid_manager_; }
+  FakeHidConnectionClient* connection_client() { return &connection_client_; }
+
+ private:
+  HidTestContentBrowserClient test_client_;
+  ContentBrowserClient* original_client_ = nullptr;
+  device::FakeHidManager hid_manager_;
+  FakeHidConnectionClient connection_client_;
+
+  DISALLOW_COPY_AND_ASSIGN(HidServiceTest);
+};
+
+}  // namespace
+
+TEST_F(HidServiceTest, GetDevicesWithPermission) {
+  NavigateAndCommit(GURL(kTestUrl));
+
+  blink::mojom::HidServicePtr service;
+  contents()->GetMainFrame()->BinderRegistryForTesting().BindInterface(
+      blink::mojom::HidService::Name_,
+      mojo::MakeRequest(&service).PassMessagePipe());
+
+  auto device_info = device::mojom::HidDeviceInfo::New();
+  device_info->guid = kTestGuid;
+  hid_manager()->AddDevice(std::move(device_info));
+
+  EXPECT_CALL(hid_delegate(), HasDevicePermission)
+      .WillOnce(testing::Return(true));
+
+  base::RunLoop run_loop;
+  std::vector<device::mojom::HidDeviceInfoPtr> devices;
+  service->GetDevices(base::BindLambdaForTesting(
+      [&run_loop, &devices](std::vector<device::mojom::HidDeviceInfoPtr> d) {
+        devices = std::move(d);
+        run_loop.Quit();
+      }));
+  run_loop.Run();
+  EXPECT_EQ(1u, devices.size());
+}
+
+TEST_F(HidServiceTest, GetDevicesWithoutPermission) {
+  NavigateAndCommit(GURL(kTestUrl));
+
+  blink::mojom::HidServicePtr service;
+  contents()->GetMainFrame()->BinderRegistryForTesting().BindInterface(
+      blink::mojom::HidService::Name_,
+      mojo::MakeRequest(&service).PassMessagePipe());
+
+  auto device_info = device::mojom::HidDeviceInfo::New();
+  device_info->guid = kTestGuid;
+  hid_manager()->AddDevice(std::move(device_info));
+
+  EXPECT_CALL(hid_delegate(), HasDevicePermission)
+      .WillOnce(testing::Return(false));
+
+  base::RunLoop run_loop;
+  std::vector<device::mojom::HidDeviceInfoPtr> devices;
+  service->GetDevices(base::BindLambdaForTesting(
+      [&run_loop, &devices](std::vector<device::mojom::HidDeviceInfoPtr> d) {
+        devices = std::move(d);
+        run_loop.Quit();
+      }));
+  run_loop.Run();
+  EXPECT_EQ(0u, devices.size());
+}
+
+TEST_F(HidServiceTest, RequestDevice) {
+  NavigateAndCommit(GURL(kTestUrl));
+
+  blink::mojom::HidServicePtr service;
+  contents()->GetMainFrame()->BinderRegistryForTesting().BindInterface(
+      blink::mojom::HidService::Name_,
+      mojo::MakeRequest(&service).PassMessagePipe());
+
+  auto device_info = device::mojom::HidDeviceInfo::New();
+  device_info->guid = kTestGuid;
+  hid_manager()->AddDevice(device_info.Clone());
+
+  EXPECT_CALL(hid_delegate(), CanRequestDevicePermission)
+      .WillOnce(testing::Return(true));
+  EXPECT_CALL(hid_delegate(), RunChooserInternal)
+      .WillOnce(testing::Return(testing::ByMove(std::move(device_info))));
+
+  base::RunLoop run_loop;
+  device::mojom::HidDeviceInfoPtr chosen_device;
+  service->RequestDevice(
+      std::vector<blink::mojom::HidDeviceFilterPtr>(),
+      base::BindLambdaForTesting(
+          [&run_loop, &chosen_device](device::mojom::HidDeviceInfoPtr d) {
+            chosen_device = std::move(d);
+            run_loop.Quit();
+          }));
+  run_loop.Run();
+  EXPECT_TRUE(chosen_device);
+}
+
+TEST_F(HidServiceTest, OpenAndCloseHidConnection) {
+  NavigateAndCommit(GURL(kTestUrl));
+
+  blink::mojom::HidServicePtr service;
+  contents()->GetMainFrame()->BinderRegistryForTesting().BindInterface(
+      blink::mojom::HidService::Name_,
+      mojo::MakeRequest(&service).PassMessagePipe());
+
+  auto device_info = device::mojom::HidDeviceInfo::New();
+  device_info->guid = kTestGuid;
+  hid_manager()->AddDevice(std::move(device_info));
+
+  device::mojom::HidConnectionClientPtr hid_connection_client;
+  connection_client()->Bind(mojo::MakeRequest(&hid_connection_client));
+
+  base::RunLoop run_loop;
+  device::mojom::HidConnectionPtr connection;
+  service->Connect(
+      kTestGuid, std::move(hid_connection_client),
+      base::BindLambdaForTesting(
+          [&run_loop, &connection](device::mojom::HidConnectionPtr c) {
+            connection = std::move(c);
+            run_loop.Quit();
+          }));
+  run_loop.Run();
+  EXPECT_TRUE(connection);
+
+  connection.reset();
+}
+
+}  // namespace content
diff --git a/content/browser/loader/cors_file_origin_browsertest.cc b/content/browser/loader/cors_file_origin_browsertest.cc
index 8914a859..ca890e3 100644
--- a/content/browser/loader/cors_file_origin_browsertest.cc
+++ b/content/browser/loader/cors_file_origin_browsertest.cc
@@ -117,7 +117,7 @@
   }
 
  private:
-  bool AllowFileAccessFromFiles() const override { return false; }
+  bool AllowFileAccessFromFiles() override { return false; }
   virtual bool IsWebSecurityEnabled() const { return true; }
 
   void SetUpCommandLine(base::CommandLine* command_line) override {
@@ -200,7 +200,7 @@
 class CorsFileOriginBrowserTestWithAllowFileAccessFromFiles
     : public CorsFileOriginBrowserTest {
  private:
-  bool AllowFileAccessFromFiles() const override { return true; }
+  bool AllowFileAccessFromFiles() override { return true; }
 };
 
 // Tests end to end Origin header and CORS check behaviors with
@@ -208,7 +208,7 @@
 class CorsFileOriginBrowserTestWithDisableWebSecurity
     : public CorsFileOriginBrowserTest {
  private:
-  bool AllowFileAccessFromFiles() const override { return false; }
+  bool AllowFileAccessFromFiles() override { return false; }
   bool IsWebSecurityEnabled() const override { return false; }
 };
 
diff --git a/content/browser/loader/loader_browsertest.cc b/content/browser/loader/loader_browsertest.cc
index f40618fe..13819a5 100644
--- a/content/browser/loader/loader_browsertest.cc
+++ b/content/browser/loader/loader_browsertest.cc
@@ -1200,7 +1200,7 @@
   ~ThrottleContentBrowserClient() override {}
 
   // ContentBrowserClient overrides:
-  std::vector<std::unique_ptr<URLLoaderThrottle>> CreateURLLoaderThrottles(
+  std::vector<std::unique_ptr<URLLoaderThrottle>> CreateURLLoaderThrottlesOnIO(
       const network::ResourceRequest& request,
       ResourceContext* resource_context,
       const base::RepeatingCallback<WebContents*()>& wc_getter,
@@ -1212,6 +1212,15 @@
     throttles.push_back(std::move(throttle));
     return throttles;
   }
+  std::vector<std::unique_ptr<URLLoaderThrottle>> CreateURLLoaderThrottles(
+      const network::ResourceRequest& request,
+      BrowserContext* browser_context,
+      const base::RepeatingCallback<WebContents*()>& wc_getter,
+      NavigationUIData* navigation_ui_data,
+      int frame_tree_node_id) override {
+    return CreateURLLoaderThrottlesOnIO(request, nullptr, wc_getter,
+                                        navigation_ui_data, frame_tree_node_id);
+  }
 
  private:
   bool modify_start_;
diff --git a/content/browser/loader/navigation_url_loader.cc b/content/browser/loader/navigation_url_loader.cc
index 921a101..3f3714f4b 100644
--- a/content/browser/loader/navigation_url_loader.cc
+++ b/content/browser/loader/navigation_url_loader.cc
@@ -20,6 +20,7 @@
 static NavigationURLLoaderFactory* g_loader_factory = nullptr;
 
 std::unique_ptr<NavigationURLLoader> NavigationURLLoader::Create(
+    BrowserContext* browser_context,
     ResourceContext* resource_context,
     StoragePartition* storage_partition,
     std::unique_ptr<NavigationRequestInfo> request_info,
@@ -35,8 +36,9 @@
         std::move(navigation_ui_data), service_worker_handle, delegate);
   }
   return std::make_unique<NavigationURLLoaderImpl>(
-      resource_context, storage_partition, std::move(request_info),
-      std::move(navigation_ui_data), service_worker_handle, appcache_handle,
+      browser_context, resource_context, storage_partition,
+      std::move(request_info), std::move(navigation_ui_data),
+      service_worker_handle, appcache_handle,
       std::move(prefetched_signed_exchange_cache), delegate,
       std::vector<std::unique_ptr<NavigationLoaderInterceptor>>());
 }
diff --git a/content/browser/loader/navigation_url_loader.h b/content/browser/loader/navigation_url_loader.h
index 2cc2e00d..160f5de 100644
--- a/content/browser/loader/navigation_url_loader.h
+++ b/content/browser/loader/navigation_url_loader.h
@@ -21,6 +21,7 @@
 namespace content {
 
 class AppCacheNavigationHandle;
+class BrowserContext;
 class NavigationUIData;
 class NavigationURLLoaderDelegate;
 class NavigationURLLoaderFactory;
@@ -45,6 +46,7 @@
   // structure. Information like has_user_gesture and
   // should_replace_current_entry shouldn't be needed at this layer.
   static std::unique_ptr<NavigationURLLoader> Create(
+      BrowserContext* browser_context,
       ResourceContext* resource_context,
       StoragePartition* storage_partition,
       std::unique_ptr<NavigationRequestInfo> request_info,
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc
index d9d6c73..d4b734f 100644
--- a/content/browser/loader/navigation_url_loader_impl.cc
+++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -99,6 +99,14 @@
 
 namespace {
 
+// Returns the BrowserThread::ID that the URLLoaderRequestController will be
+// running on.
+BrowserThread::ID GetLoaderRequestControllerThreadID() {
+  return NavigationURLLoaderImpl::IsNavigationLoaderOnUIEnabled()
+             ? BrowserThread::UI
+             : BrowserThread::IO;
+}
+
 class NavigationLoaderInterceptorBrowserContainer
     : public NavigationLoaderInterceptor {
  public:
@@ -292,10 +300,29 @@
 // Determines whether it is safe to redirect from |from_url| to |to_url|.
 bool IsRedirectSafe(const GURL& from_url,
                     const GURL& to_url,
+                    BrowserContext* browser_context,
                     ResourceContext* resource_context) {
+  if (NavigationURLLoaderImpl::IsNavigationLoaderOnUIEnabled()) {
+    return IsSafeRedirectTarget(from_url, to_url) &&
+           GetContentClient()->browser()->IsSafeRedirectTarget(to_url,
+                                                               browser_context);
+  }
   return IsSafeRedirectTarget(from_url, to_url) &&
-         GetContentClient()->browser()->IsSafeRedirectTarget(to_url,
-                                                             resource_context);
+         GetContentClient()->browser()->IsSafeRedirectTargetOnIO(
+             to_url, resource_context);
+}
+
+// Runs |task| on the thread specified by |thread_id| if already on that thread,
+// otherwise posts a task to that thread.
+void RunOrPostTaskIfNecessary(const base::Location& from_here,
+                              BrowserThread::ID thread_id,
+                              base::OnceClosure task) {
+  if (BrowserThread::CurrentlyOn(thread_id)) {
+    std::move(task).Run();
+    return;
+  }
+
+  base::PostTaskWithTraits(from_here, {thread_id}, std::move(task));
 }
 
 }  // namespace
@@ -314,6 +341,7 @@
       std::vector<std::unique_ptr<NavigationLoaderInterceptor>>
           initial_interceptors,
       std::unique_ptr<network::ResourceRequest> resource_request,
+      BrowserContext* browser_context,
       ResourceContext* resource_context,
       const GURL& url,
       bool is_main_frame,
@@ -332,10 +360,11 @@
         proxied_factory_info_(std::move(proxied_factory_info)),
         known_schemes_(std::move(known_schemes)),
         bypass_redirect_checks_(bypass_redirect_checks),
+        browser_context_(browser_context),
         weak_factory_(this) {}
 
   ~URLLoaderRequestController() override {
-    DCHECK_CURRENTLY_ON(BrowserThread::IO);
+    DCHECK_CURRENTLY_ON(GetLoaderRequestControllerThreadID());
 
     // If neither OnCompleted nor OnReceivedResponse has been invoked, the
     // request was canceled before receiving a response, so log a cancellation.
@@ -380,7 +409,7 @@
       storage::FileSystemContext* upload_file_system_context,
       AppCacheNavigationHandleCore* appcache_handle_core,
       bool was_request_intercepted) const {
-    DCHECK_CURRENTLY_ON(BrowserThread::IO);
+    DCHECK_CURRENTLY_ON(GetLoaderRequestControllerThreadID());
     DCHECK(!base::FeatureList::IsEnabled(network::features::kNetworkService));
     DCHECK(started_);
 
@@ -405,7 +434,7 @@
     // |resource_request| is unused here. We don't propagate the fields to
     // |request_info_| here because the request will usually go to
     // ResourceDispatcherHost which does its own request modifications.
-    DCHECK_CURRENTLY_ON(BrowserThread::IO);
+    DCHECK_CURRENTLY_ON(GetLoaderRequestControllerThreadID());
     DCHECK(!base::FeatureList::IsEnabled(network::features::kNetworkService));
     DCHECK(started_);
 
@@ -464,7 +493,7 @@
       std::unique_ptr<NavigationRequestInfo> request_info,
       std::unique_ptr<NavigationUIData> navigation_ui_data,
       std::string accept_langs) {
-    DCHECK_CURRENTLY_ON(BrowserThread::IO);
+    DCHECK_CURRENTLY_ON(GetLoaderRequestControllerThreadID());
     DCHECK(!base::FeatureList::IsEnabled(network::features::kNetworkService));
     DCHECK(!started_);
     started_ = true;
@@ -511,7 +540,7 @@
       bool needs_loader_factory_interceptor,
       base::Time ui_post_time,
       std::string accept_langs) {
-    DCHECK_CURRENTLY_ON(BrowserThread::IO);
+    DCHECK_CURRENTLY_ON(GetLoaderRequestControllerThreadID());
     DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService));
     DCHECK(!started_);
     ui_to_io_time_ += (base::Time::Now() - ui_post_time);
@@ -541,7 +570,9 @@
               std::move(factory));
     }
 
-    if (resource_request_->request_body) {
+    // TODO(http://crbug.com/824840): Find out if this is necessary with network
+    // service, and make it work on UI thread if so.
+    if (resource_request_->request_body && !IsNavigationLoaderOnUIEnabled()) {
       GetBodyBlobDataHandles(resource_request_->request_body.get(),
                              resource_context_, &blob_handles_);
     }
@@ -574,9 +605,12 @@
       net::URLRequestContextGetter* url_request_context_getter,
       std::string accept_langs) {
     std::string accept_value = network::kFrameAcceptHeader;
-    if (signed_exchange_utils::IsSignedExchangeHandlingEnabled(
-            resource_context_)) {
-      accept_value.append(kAcceptHeaderSignedExchangeSuffix);
+    // TODO(http://crbug.com/824840): Make this work on UI thread.
+    if (!IsNavigationLoaderOnUIEnabled()) {
+      if (signed_exchange_utils::IsSignedExchangeHandlingEnabled(
+              resource_context_)) {
+        accept_value.append(kAcceptHeaderSignedExchangeSuffix);
+      }
     }
     resource_request_->headers.SetHeader(network::kAcceptHeader, accept_value);
 
@@ -609,6 +643,46 @@
       return;
     }
 
+    if (!IsNavigationLoaderOnUIEnabled()) {
+      // TODO(http://crbug.com/824840): Support interceptors on UI thread.
+      CreateInterceptorsForIO(
+          request_info, service_worker_navigation_handle_core,
+          appcache_handle_core, prefetched_signed_exchange_cache,
+          signed_exchange_prefetch_metric_recorder, url_request_context_getter,
+          accept_langs);
+    }
+
+    // Non-NetworkService cases only.
+    // If an interceptor is not created, we no longer have to go through the
+    // rest of the network service code.
+    if (!base::FeatureList::IsEnabled(network::features::kNetworkService) &&
+        interceptors_.empty()) {
+      DCHECK(default_request_handler_factory_);
+      url_loader_ = ThrottlingURLLoader::CreateLoaderAndStart(
+          base::MakeRefCounted<SingleRequestURLLoaderFactory>(
+              default_request_handler_factory_.Run(
+                  false /* was_request_intercepted */)),
+          CreateURLLoaderThrottles(), -1 /* routing_id */, 0 /* request_id */,
+          network::mojom::kURLLoadOptionNone, resource_request_.get(),
+          this /* client */, kNavigationUrlLoaderTrafficAnnotation,
+          base::ThreadTaskRunnerHandle::Get());
+      return;
+    }
+
+    Restart();
+  }
+
+  void CreateInterceptorsForIO(
+      NavigationRequestInfo* request_info,
+      ServiceWorkerNavigationHandleCore* service_worker_navigation_handle_core,
+      AppCacheNavigationHandleCore* appcache_handle_core,
+      scoped_refptr<PrefetchedSignedExchangeCache>
+          prefetched_signed_exchange_cache,
+      scoped_refptr<SignedExchangePrefetchMetricRecorder>
+          signed_exchange_prefetch_metric_recorder,
+      net::URLRequestContextGetter* url_request_context_getter,
+      std::string accept_langs) {
+    DCHECK(!IsNavigationLoaderOnUIEnabled());
     if (prefetched_signed_exchange_cache) {
       DCHECK(base::FeatureList::IsEnabled(
                  features::kSignedExchangeSubresourcePrefetch) ||
@@ -631,8 +705,8 @@
               resource_request_->url, resource_context_,
               service_worker_navigation_handle_core, *request_info,
               &service_worker_provider_host_);
-      // The interceptor for service worker may not be created for some reasons
-      // (e.g. the origin is not secure).
+      // The interceptor for service worker may not be created for some
+      // reasons (e.g. the origin is not secure).
       if (service_worker_interceptor)
         interceptors_.push_back(std::move(service_worker_interceptor));
     }
@@ -682,25 +756,6 @@
                 std::move(browser_interceptor)));
       }
     }
-
-    // Non-NetworkService cases only.
-    // If an interceptor is not created, we no longer have to go through the
-    // rest of the network service code.
-    if (!base::FeatureList::IsEnabled(network::features::kNetworkService) &&
-        interceptors_.empty()) {
-      DCHECK(default_request_handler_factory_);
-      url_loader_ = ThrottlingURLLoader::CreateLoaderAndStart(
-          base::MakeRefCounted<SingleRequestURLLoaderFactory>(
-              default_request_handler_factory_.Run(
-                  false /* was_request_intercepted */)),
-          CreateURLLoaderThrottles(), -1 /* routing_id */, 0 /* request_id */,
-          network::mojom::kURLLoadOptionNone, resource_request_.get(),
-          this /* client */, kNavigationUrlLoaderTrafficAnnotation,
-          base::ThreadTaskRunnerHandle::Get());
-      return;
-    }
-
-    Restart();
   }
 
   // This could be called multiple times to follow a chain of redirects.
@@ -732,7 +787,7 @@
   void MaybeStartLoader(
       NavigationLoaderInterceptor* interceptor,
       SingleRequestURLLoaderFactory::RequestHandler single_request_handler) {
-    DCHECK_CURRENTLY_ON(BrowserThread::IO);
+    DCHECK_CURRENTLY_ON(GetLoaderRequestControllerThreadID());
     DCHECK(started_);
 
     if (single_request_handler) {
@@ -918,8 +973,8 @@
         network::mojom::URLLoaderFactoryPtr& non_network_factory =
             non_network_url_loader_factories_[resource_request_->url.scheme()];
         if (!non_network_factory.is_bound()) {
-          base::PostTaskWithTraits(
-              FROM_HERE, {BrowserThread::UI},
+          RunOrPostTaskIfNecessary(
+              FROM_HERE, BrowserThread::UI,
               base::BindOnce(&NavigationURLLoaderImpl ::
                                  BindNonNetworkURLLoaderFactoryRequest,
                              owner_, frame_tree_node_id_,
@@ -968,7 +1023,7 @@
                       const net::HttpRequestHeaders& modified_headers,
                       PreviewsState new_previews_state,
                       base::Time ui_post_time) {
-    DCHECK_CURRENTLY_ON(BrowserThread::IO);
+    DCHECK_CURRENTLY_ON(GetLoaderRequestControllerThreadID());
     DCHECK(!redirect_info_.new_url.is_empty());
     ui_to_io_time_ += (base::Time::Now() - ui_post_time);
     if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) {
@@ -1074,10 +1129,15 @@
     if (!head.intercepted_by_plugin && !must_download && !known_mime_type) {
       // No plugin throttles intercepted the response. Ask if the plugin
       // registered to PluginService wants to handle the request.
-      CheckPluginAndContinueOnReceiveResponse(
-          head, std::move(url_loader_client_endpoints),
-          true /* is_download_if_not_handled_by_plugin */,
-          std::vector<WebPluginInfo>());
+      // TODO(http://crbug.com/824840): Convert PluginService to run on UI.
+      RunOrPostTaskIfNecessary(
+          FROM_HERE, BrowserThread::IO,
+          base::BindOnce(&URLLoaderRequestController::
+                             CheckPluginAndContinueOnReceiveResponse,
+                         weak_factory_.GetWeakPtr(), head,
+                         std::move(url_loader_client_endpoints),
+                         true /* is_download_if_not_handled_by_plugin */,
+                         std::vector<WebPluginInfo>()));
       return;
     }
 #endif
@@ -1177,7 +1237,8 @@
                          const network::ResourceResponseHead& head) override {
     if (base::FeatureList::IsEnabled(network::features::kNetworkService) &&
         !bypass_redirect_checks_ &&
-        !IsRedirectSafe(url_, redirect_info.new_url, resource_context_)) {
+        !IsRedirectSafe(url_, redirect_info.new_url, browser_context_,
+                        resource_context_)) {
       // Call CancelWithError instead of OnComplete so that if there is an
       // intercepting URLLoaderFactory (created through the embedder's
       // ContentBrowserClient::WillCreateURLLoaderFactory) it gets notified.
@@ -1310,7 +1371,12 @@
   }
 
   std::vector<std::unique_ptr<URLLoaderThrottle>> CreateURLLoaderThrottles() {
-    return GetContentClient()->browser()->CreateURLLoaderThrottles(
+    if (IsNavigationLoaderOnUIEnabled()) {
+      return GetContentClient()->browser()->CreateURLLoaderThrottles(
+          *resource_request_, browser_context_, web_contents_getter_,
+          navigation_ui_data_.get(), frame_tree_node_id_);
+    }
+    return GetContentClient()->browser()->CreateURLLoaderThrottlesOnIO(
         *resource_request_, resource_context_, web_contents_getter_,
         navigation_ui_data_.get(), frame_tree_node_id_);
   }
@@ -1438,6 +1504,9 @@
   // Counts the time overhead of all the hops from the UI to the IO threads.
   base::TimeDelta ui_to_io_time_;
 
+  // Only used when NavigationLoaderOnUI is enabled:
+  BrowserContext* browser_context_;
+
   mutable base::WeakPtrFactory<URLLoaderRequestController> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(URLLoaderRequestController);
@@ -1446,6 +1515,7 @@
 // TODO(https://crbug.com/790734): pass |navigation_ui_data| along with the
 // request so that it could be modified.
 NavigationURLLoaderImpl::NavigationURLLoaderImpl(
+    BrowserContext* browser_context,
     ResourceContext* resource_context,
     StoragePartition* storage_partition,
     std::unique_ptr<NavigationRequestInfo> request_info,
@@ -1490,11 +1560,12 @@
       partition->browser_context());
 
   if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) {
+    DCHECK(!IsNavigationLoaderOnUIEnabled());
     DCHECK(!request_controller_);
     request_controller_ = std::make_unique<URLLoaderRequestController>(
         /* initial_interceptors = */
         std::vector<std::unique_ptr<NavigationLoaderInterceptor>>(),
-        std::move(new_request), resource_context,
+        std::move(new_request), browser_context, resource_context,
         request_info->common_params.url, request_info->is_main_frame,
         /* proxied_url_loader_factory_request */ nullptr,
         /* proxied_url_loader_factory_info */ nullptr, std::set<std::string>(),
@@ -1609,7 +1680,9 @@
 
   bool needs_loader_factory_interceptor = false;
   std::unique_ptr<network::SharedURLLoaderFactoryInfo> network_factory_info =
-      partition->url_loader_factory_getter()->GetNetworkFactoryInfo();
+      IsNavigationLoaderOnUIEnabled()
+          ? partition->GetURLLoaderFactoryForBrowserProcess()->Clone()
+          : partition->url_loader_factory_getter()->GetNetworkFactoryInfo();
   if (header_client) {
     needs_loader_factory_interceptor = true;
     network::mojom::URLLoaderFactoryPtrInfo factory_info;
@@ -1622,13 +1695,13 @@
 
   DCHECK(!request_controller_);
   request_controller_ = std::make_unique<URLLoaderRequestController>(
-      std::move(initial_interceptors), std::move(new_request), resource_context,
-      request_info->common_params.url, request_info->is_main_frame,
-      std::move(proxied_factory_request), std::move(proxied_factory_info),
-      std::move(known_schemes), bypass_redirect_checks,
-      weak_factory_.GetWeakPtr());
-  base::PostTaskWithTraits(
-      FROM_HERE, {BrowserThread::IO},
+      std::move(initial_interceptors), std::move(new_request), browser_context,
+      resource_context, request_info->common_params.url,
+      request_info->is_main_frame, std::move(proxied_factory_request),
+      std::move(proxied_factory_info), std::move(known_schemes),
+      bypass_redirect_checks, weak_factory_.GetWeakPtr());
+  RunOrPostTaskIfNecessary(
+      FROM_HERE, GetLoaderRequestControllerThreadID(),
       base::BindOnce(&URLLoaderRequestController::Start,
                      base::Unretained(request_controller_.get()),
                      std::move(network_factory_info),
@@ -1643,16 +1716,18 @@
 }
 
 NavigationURLLoaderImpl::~NavigationURLLoaderImpl() {
-  BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE,
-                            request_controller_.release());
+  if (!IsNavigationLoaderOnUIEnabled()) {
+    BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE,
+                              request_controller_.release());
+  }
 }
 
 void NavigationURLLoaderImpl::FollowRedirect(
     const std::vector<std::string>& removed_headers,
     const net::HttpRequestHeaders& modified_headers,
     PreviewsState new_previews_state) {
-  base::PostTaskWithTraits(
-      FROM_HERE, {BrowserThread::IO},
+  RunOrPostTaskIfNecessary(
+      FROM_HERE, GetLoaderRequestControllerThreadID(),
       base::BindOnce(&URLLoaderRequestController::FollowRedirect,
                      base::Unretained(request_controller_.get()),
                      removed_headers, modified_headers, new_previews_state,
@@ -1718,8 +1793,9 @@
 // static
 void NavigationURLLoaderImpl::SetURLLoaderFactoryInterceptorForTesting(
     const URLLoaderFactoryInterceptor& interceptor) {
-  DCHECK(!BrowserThread::IsThreadInitialized(BrowserThread::IO) ||
-         BrowserThread::CurrentlyOn(BrowserThread::IO));
+  DCHECK(!BrowserThread::IsThreadInitialized(
+             GetLoaderRequestControllerThreadID()) ||
+         BrowserThread::CurrentlyOn(GetLoaderRequestControllerThreadID()));
   DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService));
   g_loader_factory_interceptor.Get() = interceptor;
 }
@@ -1745,12 +1821,17 @@
 
 // static
 GlobalRequestID NavigationURLLoaderImpl::MakeGlobalRequestID() {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
   // Start at -2 on the same lines as ResourceDispatcherHostImpl.
-  static int s_next_request_id = -2;
+  static std::atomic_int s_next_request_id{-2};
   return GlobalRequestID(-1, s_next_request_id--);
 }
 
+// static
+bool NavigationURLLoaderImpl::IsNavigationLoaderOnUIEnabled() {
+  return base::FeatureList::IsEnabled(network::features::kNetworkService) &&
+         base::FeatureList::IsEnabled(features::kNavigationLoaderOnUI);
+}
+
 void NavigationURLLoaderImpl::OnRequestStarted(base::TimeTicks timestamp) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   delegate_->OnRequestStarted(timestamp);
diff --git a/content/browser/loader/navigation_url_loader_impl.h b/content/browser/loader/navigation_url_loader_impl.h
index 63b715e..d434b1f 100644
--- a/content/browser/loader/navigation_url_loader_impl.h
+++ b/content/browser/loader/navigation_url_loader_impl.h
@@ -23,6 +23,7 @@
 
 namespace content {
 
+class BrowserContext;
 class NavigationLoaderInterceptor;
 class PrefetchedSignedExchangeCache;
 class ResourceContext;
@@ -35,6 +36,7 @@
   // The caller is responsible for ensuring that |delegate| outlives the loader.
   // Note |initial_interceptors| is there for test purposes only.
   NavigationURLLoaderImpl(
+      BrowserContext* browser_context,
       ResourceContext* resource_context,
       StoragePartition* storage_partition,
       std::unique_ptr<NavigationRequestInfo> request_info,
@@ -104,6 +106,9 @@
   // the IO thread.
   static GlobalRequestID MakeGlobalRequestID();
 
+  // Returns true if URLLoaderRequestController will be run on the UI thread.
+  static bool IsNavigationLoaderOnUIEnabled();
+
  private:
   class URLLoaderRequestController;
   void OnRequestStarted(base::TimeTicks timestamp);
diff --git a/content/browser/loader/navigation_url_loader_impl_unittest.cc b/content/browser/loader/navigation_url_loader_impl_unittest.cc
index 67e23f2..aa31b443 100644
--- a/content/browser/loader/navigation_url_loader_impl_unittest.cc
+++ b/content/browser/loader/navigation_url_loader_impl_unittest.cc
@@ -196,7 +196,7 @@
         &most_recent_resource_request_));
 
     return std::make_unique<NavigationURLLoaderImpl>(
-        browser_context_->GetResourceContext(),
+        browser_context_.get(), browser_context_->GetResourceContext(),
         BrowserContext::GetDefaultStoragePartition(browser_context_.get()),
         std::move(request_info), nullptr /* navigation_ui_data */,
         nullptr /* service_worker_handle */, nullptr /* appcache_handle */,
diff --git a/content/browser/loader/navigation_url_loader_unittest.cc b/content/browser/loader/navigation_url_loader_unittest.cc
index 567eab4..24640725 100644
--- a/content/browser/loader/navigation_url_loader_unittest.cc
+++ b/content/browser/loader/navigation_url_loader_unittest.cc
@@ -106,7 +106,7 @@
                                   base::UnguessableToken::Create(),
                                   base::UnguessableToken::Create()));
     return NavigationURLLoader::Create(
-        browser_context_->GetResourceContext(),
+        browser_context_.get(), browser_context_->GetResourceContext(),
         BrowserContext::GetDefaultStoragePartition(browser_context_.get()),
         std::move(request_info), nullptr, nullptr, nullptr, nullptr, delegate);
   }
diff --git a/content/browser/loader/prefetch_url_loader_service.cc b/content/browser/loader/prefetch_url_loader_service.cc
index 6167581..6c41f5b 100644
--- a/content/browser/loader/prefetch_url_loader_service.cc
+++ b/content/browser/loader/prefetch_url_loader_service.cc
@@ -181,7 +181,7 @@
       !request_context_getter_->GetURLRequestContext())
     return std::vector<std::unique_ptr<content::URLLoaderThrottle>>();
   int frame_tree_node_id = frame_tree_node_id_getter.Run();
-  return GetContentClient()->browser()->CreateURLLoaderThrottles(
+  return GetContentClient()->browser()->CreateURLLoaderThrottlesOnIO(
       request, resource_context_,
       base::BindRepeating(&WebContents::FromFrameTreeNodeId,
                           frame_tree_node_id),
diff --git a/content/browser/loader/resource_dispatcher_host_unittest.cc b/content/browser/loader/resource_dispatcher_host_unittest.cc
index ad80ccc8..2f0ccb59 100644
--- a/content/browser/loader/resource_dispatcher_host_unittest.cc
+++ b/content/browser/loader/resource_dispatcher_host_unittest.cc
@@ -846,7 +846,7 @@
                                   base::UnguessableToken::Create()));
     std::unique_ptr<NavigationURLLoader> test_loader =
         NavigationURLLoader::Create(
-            browser_context_->GetResourceContext(),
+            browser_context_.get(), browser_context_->GetResourceContext(),
             BrowserContext::GetDefaultStoragePartition(browser_context_.get()),
             std::move(request_info), nullptr, nullptr, nullptr, nullptr,
             &delegate);
diff --git a/content/browser/media/android/browser_gpu_video_accelerator_factories.cc b/content/browser/media/android/browser_gpu_video_accelerator_factories.cc
index fc9c720..7f178d2 100644
--- a/content/browser/media/android/browser_gpu_video_accelerator_factories.cc
+++ b/content/browser/media/android/browser_gpu_video_accelerator_factories.cc
@@ -117,10 +117,6 @@
   return nullptr;
 }
 
-void BrowserGpuVideoAcceleratorFactories::SignalSyncToken(
-    const gpu::SyncToken& sync_token,
-    base::OnceClosure callback) {}
-
 std::unique_ptr<gfx::GpuMemoryBuffer>
 BrowserGpuVideoAcceleratorFactories::CreateGpuMemoryBuffer(
     const gfx::Size& size,
diff --git a/content/browser/media/android/browser_gpu_video_accelerator_factories.h b/content/browser/media/android/browser_gpu_video_accelerator_factories.h
index 984df2e..bc5120e 100644
--- a/content/browser/media/android/browser_gpu_video_accelerator_factories.h
+++ b/content/browser/media/android/browser_gpu_video_accelerator_factories.h
@@ -33,8 +33,6 @@
       const media::RequestOverlayInfoCB& request_overlay_info_cb) override;
   std::unique_ptr<media::VideoEncodeAccelerator> CreateVideoEncodeAccelerator()
       override;
-  void SignalSyncToken(const gpu::SyncToken& sync_token,
-                       base::OnceClosure callback) override;
   std::unique_ptr<gfx::GpuMemoryBuffer> CreateGpuMemoryBuffer(
       const gfx::Size& size,
       gfx::BufferFormat format,
diff --git a/content/browser/media/audio_input_stream_broker.cc b/content/browser/media/audio_input_stream_broker.cc
index 31d686ff..03c6d5f 100644
--- a/content/browser/media/audio_input_stream_broker.cc
+++ b/content/browser/media/audio_input_stream_broker.cc
@@ -131,9 +131,6 @@
   TRACE_EVENT_NESTABLE_ASYNC_END1("audio", "AudioInputStreamBroker", this,
                                   "disconnect reason",
                                   static_cast<uint32_t>(disconnect_reason_));
-
-  UMA_HISTOGRAM_ENUMERATION("Media.Audio.Capture.StreamBrokerDisconnectReason",
-                            disconnect_reason_);
 }
 
 void AudioInputStreamBroker::CreateStream(
diff --git a/content/browser/media/capture/desktop_capture_device.cc b/content/browser/media/capture/desktop_capture_device.cc
index 78988c0..e351d04e 100644
--- a/content/browser/media/capture/desktop_capture_device.cc
+++ b/content/browser/media/capture/desktop_capture_device.cc
@@ -441,7 +441,8 @@
       media::VideoCaptureFormat(
           gfx::Size(output_size.width(), output_size.height()),
           requested_frame_rate_, media::PIXEL_FORMAT_ARGB),
-      frame_color_space, 0, now, now - first_ref_time_);
+      frame_color_space, 0 /* clockwise_rotation */, false /* flip_y */, now,
+      now - first_ref_time_);
 }
 
 void DesktopCaptureDevice::Core::OnCaptureTimer() {
diff --git a/content/browser/media/capture/desktop_capture_device_unittest.cc b/content/browser/media/capture/desktop_capture_device_unittest.cc
index 9c31de7..d476356e 100644
--- a/content/browser/media/capture/desktop_capture_device_unittest.cc
+++ b/content/browser/media/capture/desktop_capture_device_unittest.cc
@@ -219,10 +219,11 @@
                  int size,
                  const media::VideoCaptureFormat&,
                  const gfx::ColorSpace&,
-                 int,
-                 base::TimeTicks,
-                 base::TimeDelta,
-                 int) {
+                 int /* clockwise_rotation */,
+                 bool /* flip_y */,
+                 base::TimeTicks /* reference_time */,
+                 base::TimeDelta /* timestamp */,
+                 int /* frame_feedback_id */) {
     ASSERT_TRUE(output_frame_);
     ASSERT_EQ(output_frame_->stride() * output_frame_->size().height(), size);
     memcpy(output_frame_->data(), frame, size);
@@ -270,7 +271,7 @@
       CreateMockVideoCaptureDeviceClient());
   EXPECT_CALL(*client, OnError(_, _, _)).Times(0);
   EXPECT_CALL(*client, OnStarted());
-  EXPECT_CALL(*client, OnIncomingCapturedData(_, _, _, _, _, _, _, _))
+  EXPECT_CALL(*client, OnIncomingCapturedData(_, _, _, _, _, _, _, _, _))
       .WillRepeatedly(
           DoAll(SaveArg<1>(&frame_size), SaveArg<2>(&format),
                 InvokeWithoutArgs(&done_event, &base::WaitableEvent::Signal)));
@@ -309,7 +310,7 @@
       CreateMockVideoCaptureDeviceClient());
   EXPECT_CALL(*client, OnError(_, _, _)).Times(0);
   EXPECT_CALL(*client, OnStarted());
-  EXPECT_CALL(*client, OnIncomingCapturedData(_, _, _, _, _, _, _, _))
+  EXPECT_CALL(*client, OnIncomingCapturedData(_, _, _, _, _, _, _, _, _))
       .WillRepeatedly(
           DoAll(WithArg<2>(Invoke(&format_checker,
                                   &FormatChecker::ExpectAcceptableSize)),
@@ -355,7 +356,7 @@
       CreateMockVideoCaptureDeviceClient());
   EXPECT_CALL(*client, OnError(_, _, _)).Times(0);
   EXPECT_CALL(*client, OnStarted());
-  EXPECT_CALL(*client, OnIncomingCapturedData(_, _, _, _, _, _, _, _))
+  EXPECT_CALL(*client, OnIncomingCapturedData(_, _, _, _, _, _, _, _, _))
       .WillRepeatedly(
           DoAll(WithArg<2>(Invoke(&format_checker,
                                   &FormatChecker::ExpectAcceptableSize)),
@@ -405,7 +406,7 @@
       CreateMockVideoCaptureDeviceClient());
   EXPECT_CALL(*client, OnError(_, _, _)).Times(0);
   EXPECT_CALL(*client, OnStarted());
-  EXPECT_CALL(*client, OnIncomingCapturedData(_, _, _, _, _, _, _, _))
+  EXPECT_CALL(*client, OnIncomingCapturedData(_, _, _, _, _, _, _, _, _))
       .WillRepeatedly(
           DoAll(WithArg<2>(Invoke(&format_checker,
                                   &FormatChecker::ExpectAcceptableSize)),
@@ -457,7 +458,7 @@
       CreateMockVideoCaptureDeviceClient());
   EXPECT_CALL(*client, OnError(_, _, _)).Times(0);
   EXPECT_CALL(*client, OnStarted());
-  EXPECT_CALL(*client, OnIncomingCapturedData(_, _, _, _, _, _, _, _))
+  EXPECT_CALL(*client, OnIncomingCapturedData(_, _, _, _, _, _, _, _, _))
       .WillRepeatedly(
           DoAll(Invoke(this, &DesktopCaptureDeviceTest::CopyFrame),
                 SaveArg<1>(&frame_size),
@@ -506,7 +507,7 @@
       CreateMockVideoCaptureDeviceClient());
   EXPECT_CALL(*client, OnError(_, _, _)).Times(0);
   EXPECT_CALL(*client, OnStarted());
-  EXPECT_CALL(*client, OnIncomingCapturedData(_, _, _, _, _, _, _, _))
+  EXPECT_CALL(*client, OnIncomingCapturedData(_, _, _, _, _, _, _, _, _))
       .WillRepeatedly(
           DoAll(Invoke(this, &DesktopCaptureDeviceTest::CopyFrame),
                 SaveArg<1>(&frame_size),
@@ -572,11 +573,11 @@
               task_runner, task_runner->GetMockTickClock());
         }));
 
-    EXPECT_CALL(*client, OnIncomingCapturedData(_, _, _, _, _, _, _, _))
+    EXPECT_CALL(*client, OnIncomingCapturedData(_, _, _, _, _, _, _, _, _))
         .WillRepeatedly(DoAll(
             WithArg<2>(
                 Invoke(&format_checker, &FormatChecker::ExpectAcceptableSize)),
-            WithArg<6>(Invoke([&done_event, &nb_frames,
+            WithArg<7>(Invoke([&done_event, &nb_frames,
                                &task_runner](base::TimeDelta timestamp) {
               ++nb_frames;
 
diff --git a/content/browser/media/capture/screen_capture_device_android_unittest.cc b/content/browser/media/capture/screen_capture_device_android_unittest.cc
index 30c5fe70..5690ef1c 100644
--- a/content/browser/media/capture/screen_capture_device_android_unittest.cc
+++ b/content/browser/media/capture/screen_capture_device_android_unittest.cc
@@ -17,12 +17,13 @@
 
 class MockDeviceClient : public media::VideoCaptureDevice::Client {
  public:
-  MOCK_METHOD8(OnIncomingCapturedData,
+  MOCK_METHOD9(OnIncomingCapturedData,
                void(const uint8_t* data,
                     int length,
                     const media::VideoCaptureFormat& frame_format,
                     const gfx::ColorSpace& color_space,
                     int rotation,
+                    bool flip_y,
                     base::TimeTicks reference_time,
                     base::TimeDelta tiemstamp,
                     int frame_feedback_id));
diff --git a/content/browser/media/session/media_session_impl.cc b/content/browser/media/session/media_session_impl.cc
index 090375c37..81b9002 100644
--- a/content/browser/media/session/media_session_impl.cc
+++ b/content/browser/media/session/media_session_impl.cc
@@ -1198,7 +1198,7 @@
   if (metadata.title.empty())
     metadata.title = SanitizeMediaTitle(web_contents()->GetTitle());
 
-  const ContentClient* content_client = content::GetContentClient();
+  ContentClient* content_client = content::GetContentClient();
   const GURL& url = web_contents()->GetLastCommittedURL();
 
   // If the url is a file then we should display a placeholder.
diff --git a/content/browser/native_file_system/native_file_system_file_handle_impl.cc b/content/browser/native_file_system/native_file_system_file_handle_impl.cc
index d4e78dc6..eab8434 100644
--- a/content/browser/native_file_system/native_file_system_file_handle_impl.cc
+++ b/content/browser/native_file_system/native_file_system_file_handle_impl.cc
@@ -21,11 +21,6 @@
 
 namespace content {
 
-struct NativeFileSystemFileHandleImpl::WriteState {
-  WriteCallback callback;
-  uint64_t bytes_written = 0;
-};
-
 NativeFileSystemFileHandleImpl::NativeFileSystemFileHandleImpl(
     NativeFileSystemManagerImpl* manager,
     const BindingContext& context,
@@ -80,53 +75,6 @@
       std::move(callback));
 }
 
-void NativeFileSystemFileHandleImpl::Write(uint64_t offset,
-                                           blink::mojom::BlobPtr data,
-                                           WriteCallback callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  RunWithWritePermission(
-      base::BindOnce(&NativeFileSystemFileHandleImpl::WriteImpl,
-                     weak_factory_.GetWeakPtr(), offset, std::move(data)),
-      base::BindOnce([](WriteCallback callback) {
-        std::move(callback).Run(
-            NativeFileSystemError::New(base::File::FILE_ERROR_ACCESS_DENIED),
-            0);
-      }),
-      std::move(callback));
-}
-
-void NativeFileSystemFileHandleImpl::WriteStream(
-    uint64_t offset,
-    mojo::ScopedDataPipeConsumerHandle stream,
-    WriteStreamCallback callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  RunWithWritePermission(
-      base::BindOnce(&NativeFileSystemFileHandleImpl::WriteStreamImpl,
-                     weak_factory_.GetWeakPtr(), offset, std::move(stream)),
-      base::BindOnce([](WriteStreamCallback callback) {
-        std::move(callback).Run(
-            NativeFileSystemError::New(base::File::FILE_ERROR_ACCESS_DENIED),
-            0);
-      }),
-      std::move(callback));
-}
-
-void NativeFileSystemFileHandleImpl::Truncate(uint64_t length,
-                                              TruncateCallback callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  RunWithWritePermission(
-      base::BindOnce(&NativeFileSystemFileHandleImpl::TruncateImpl,
-                     weak_factory_.GetWeakPtr(), length),
-      base::BindOnce([](TruncateCallback callback) {
-        std::move(callback).Run(
-            NativeFileSystemError::New(base::File::FILE_ERROR_ACCESS_DENIED));
-      }),
-      std::move(callback));
-}
-
 void NativeFileSystemFileHandleImpl::CreateFileWriter(
     CreateFileWriterCallback callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -186,6 +134,7 @@
       blink::mojom::SerializedBlob::New(uuid, "application/octet-stream",
                                         info.size, blob_ptr.PassInterface()));
 }
+
 void NativeFileSystemFileHandleImpl::RemoveImpl(RemoveCallback callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   DCHECK_EQ(GetWritePermissionStatus(),
@@ -199,82 +148,6 @@
                  std::move(callback)));
 }
 
-void NativeFileSystemFileHandleImpl::WriteImpl(uint64_t offset,
-                                               blink::mojom::BlobPtr data,
-                                               WriteCallback callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  DCHECK_EQ(GetWritePermissionStatus(),
-            blink::mojom::PermissionStatus::GRANTED);
-
-  blob_context()->GetBlobDataFromBlobPtr(
-      std::move(data),
-      base::BindOnce(&NativeFileSystemFileHandleImpl::DoWriteBlob,
-                     weak_factory_.GetWeakPtr(), std::move(callback), offset));
-}
-
-void NativeFileSystemFileHandleImpl::DoWriteBlob(
-    WriteCallback callback,
-    uint64_t position,
-    std::unique_ptr<BlobDataHandle> blob) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  if (!blob) {
-    std::move(callback).Run(
-        NativeFileSystemError::New(base::File::FILE_ERROR_FAILED), 0);
-    return;
-  }
-
-  operation_runner()->Write(
-      url(), std::move(blob), position,
-      base::BindRepeating(&NativeFileSystemFileHandleImpl::DidWrite,
-                          weak_factory_.GetWeakPtr(),
-                          base::Owned(new WriteState{std::move(callback)})));
-}
-
-void NativeFileSystemFileHandleImpl::WriteStreamImpl(
-    uint64_t offset,
-    mojo::ScopedDataPipeConsumerHandle stream,
-    WriteStreamCallback callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  DCHECK_EQ(GetWritePermissionStatus(),
-            blink::mojom::PermissionStatus::GRANTED);
-
-  operation_runner()->Write(
-      url(), std::move(stream), offset,
-      base::BindRepeating(&NativeFileSystemFileHandleImpl::DidWrite,
-                          weak_factory_.GetWeakPtr(),
-                          base::Owned(new WriteState{std::move(callback)})));
-}
-
-void NativeFileSystemFileHandleImpl::DidWrite(WriteState* state,
-                                              base::File::Error result,
-                                              int64_t bytes,
-                                              bool complete) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  DCHECK(state);
-  state->bytes_written += bytes;
-  if (complete) {
-    std::move(state->callback)
-        .Run(NativeFileSystemError::New(result), state->bytes_written);
-  }
-}
-
-void NativeFileSystemFileHandleImpl::TruncateImpl(uint64_t length,
-                                                  TruncateCallback callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  DCHECK_EQ(GetWritePermissionStatus(),
-            blink::mojom::PermissionStatus::GRANTED);
-
-  operation_runner()->Truncate(
-      url(), length,
-      base::BindOnce(
-          [](TruncateCallback callback, base::File::Error result) {
-            std::move(callback).Run(NativeFileSystemError::New(result));
-          },
-          std::move(callback)));
-}
-
 void NativeFileSystemFileHandleImpl::CreateFileWriterImpl(
     CreateFileWriterCallback callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
diff --git a/content/browser/native_file_system/native_file_system_file_handle_impl.h b/content/browser/native_file_system/native_file_system_file_handle_impl.h
index a16ab53..607c2933 100644
--- a/content/browser/native_file_system/native_file_system_file_handle_impl.h
+++ b/content/browser/native_file_system/native_file_system_file_handle_impl.h
@@ -13,10 +13,6 @@
 #include "storage/browser/fileapi/file_system_url.h"
 #include "third_party/blink/public/mojom/native_file_system/native_file_system_file_handle.mojom.h"
 
-namespace storage {
-class BlobDataHandle;
-}  // namespace storage
-
 namespace content {
 
 // This is the browser side implementation of the
@@ -48,43 +44,16 @@
                          RequestPermissionCallback callback) override;
   void AsBlob(AsBlobCallback callback) override;
   void Remove(RemoveCallback callback) override;
-  void Write(uint64_t offset,
-             blink::mojom::BlobPtr data,
-             WriteCallback callback) override;
-  void WriteStream(uint64_t offset,
-                   mojo::ScopedDataPipeConsumerHandle stream,
-                   WriteStreamCallback callback) override;
-  void Truncate(uint64_t length, TruncateCallback callback) override;
   void CreateFileWriter(CreateFileWriterCallback callback) override;
   void Transfer(
       blink::mojom::NativeFileSystemTransferTokenRequest token) override;
 
  private:
-  // State that is kept for the duration of a write operation, to keep track of
-  // progress until the write completes.
-  struct WriteState;
-
   void DidGetMetaDataForBlob(AsBlobCallback callback,
                              base::File::Error result,
                              const base::File::Info& info);
 
   void RemoveImpl(RemoveCallback callback);
-
-  void WriteImpl(uint64_t offset,
-                 blink::mojom::BlobPtr data,
-                 WriteCallback callback);
-  void DoWriteBlob(WriteCallback callback,
-                   uint64_t position,
-                   std::unique_ptr<storage::BlobDataHandle> blob);
-  void WriteStreamImpl(uint64_t offset,
-                       mojo::ScopedDataPipeConsumerHandle stream,
-                       WriteStreamCallback callback);
-  void DidWrite(WriteState* state,
-                base::File::Error result,
-                int64_t bytes,
-                bool complete);
-
-  void TruncateImpl(uint64_t length, TruncateCallback callback);
   void CreateFileWriterImpl(CreateFileWriterCallback callback);
 
   base::WeakPtr<NativeFileSystemHandleBase> AsWeakPtr() override;
diff --git a/content/browser/native_file_system/native_file_system_file_handle_impl_unittest.cc b/content/browser/native_file_system/native_file_system_file_handle_impl_unittest.cc
deleted file mode 100644
index 0192416..0000000
--- a/content/browser/native_file_system/native_file_system_file_handle_impl_unittest.cc
+++ /dev/null
@@ -1,301 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/browser/native_file_system/native_file_system_file_handle_impl.h"
-
-#include <limits>
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/guid.h"
-#include "base/test/bind_test_util.h"
-#include "base/test/scoped_feature_list.h"
-#include "base/test/scoped_task_environment.h"
-#include "content/browser/native_file_system/fixed_native_file_system_permission_grant.h"
-#include "content/public/test/test_browser_thread_bundle.h"
-#include "mojo/public/cpp/system/string_data_pipe_producer.h"
-#include "net/base/io_buffer.h"
-#include "net/base/net_errors.h"
-#include "net/base/test_completion_callback.h"
-#include "storage/browser/blob/blob_data_builder.h"
-#include "storage/browser/blob/blob_impl.h"
-#include "storage/browser/blob/blob_storage_context.h"
-#include "storage/browser/fileapi/file_stream_reader.h"
-#include "storage/browser/test/async_file_test_helper.h"
-#include "storage/browser/test/test_file_system_context.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/common/features.h"
-
-using storage::FileSystemURL;
-
-namespace content {
-
-class NativeFileSystemFileHandleImplTest : public testing::Test {
- public:
-  NativeFileSystemFileHandleImplTest()
-      : scoped_task_environment_(
-            base::test::ScopedTaskEnvironment::MainThreadType::IO) {
-    scoped_feature_list_.InitAndEnableFeature(
-        blink::features::kNativeFileSystemAPI);
-  }
-
-  void SetUp() override {
-    ASSERT_TRUE(dir_.CreateUniqueTempDir());
-    file_system_context_ = CreateFileSystemContextForTesting(
-        /*quota_manager_proxy=*/nullptr, dir_.GetPath());
-
-    test_url_ = file_system_context_->CreateCrackedFileSystemURL(
-        GURL("http://example.com"), storage::kFileSystemTypeTest,
-        base::FilePath::FromUTF8Unsafe("test"));
-
-    ASSERT_EQ(base::File::FILE_OK, AsyncFileTestHelper::CreateFile(
-                                       file_system_context_.get(), test_url_));
-
-    chrome_blob_context_ = base::MakeRefCounted<ChromeBlobStorageContext>();
-    chrome_blob_context_->InitializeOnIOThread(base::FilePath(), nullptr);
-    blob_context_ = chrome_blob_context_->context();
-
-    manager_ = base::MakeRefCounted<NativeFileSystemManagerImpl>(
-        file_system_context_, chrome_blob_context_,
-        /*permission_context=*/nullptr);
-
-    handle_ = std::make_unique<NativeFileSystemFileHandleImpl>(
-        manager_.get(),
-        NativeFileSystemManagerImpl::BindingContext(
-            test_url_.origin(), /*process_id=*/1,
-            /*frame_id=*/MSG_ROUTING_NONE),
-        test_url_,
-        NativeFileSystemManagerImpl::SharedHandleState(
-            permission_grant_, permission_grant_, /*file_system=*/{}));
-  }
-
-  blink::mojom::BlobPtr CreateBlob(const std::string& contents) {
-    auto builder =
-        std::make_unique<storage::BlobDataBuilder>(base::GenerateGUID());
-    builder->AppendData(contents);
-    auto handle = blob_context_->AddFinishedBlob(std::move(builder));
-    blink::mojom::BlobPtr result;
-    storage::BlobImpl::Create(std::move(handle), MakeRequest(&result));
-    return result;
-  }
-
-  mojo::ScopedDataPipeConsumerHandle CreateStream(const std::string& contents) {
-    // Test with a relatively low capacity pipe to make sure it isn't all
-    // written/read in one go.
-    mojo::ScopedDataPipeProducerHandle producer_handle;
-    mojo::ScopedDataPipeConsumerHandle consumer_handle;
-    MojoCreateDataPipeOptions options;
-    options.struct_size = sizeof(MojoCreateDataPipeOptions);
-    options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE;
-    options.element_num_bytes = 1;
-    options.capacity_num_bytes = 16;
-    mojo::CreateDataPipe(&options, &producer_handle, &consumer_handle);
-    CHECK(producer_handle.is_valid());
-    auto producer = std::make_unique<mojo::StringDataPipeProducer>(
-        std::move(producer_handle));
-    auto* producer_raw = producer.get();
-    producer_raw->Write(
-        contents,
-        mojo::StringDataPipeProducer::AsyncWritingMode::
-            STRING_MAY_BE_INVALIDATED_BEFORE_COMPLETION,
-        base::BindOnce(
-            base::DoNothing::Once<std::unique_ptr<mojo::StringDataPipeProducer>,
-                                  MojoResult>(),
-            std::move(producer)));
-    return consumer_handle;
-  }
-
-  std::string ReadFile(const FileSystemURL& url) {
-    std::unique_ptr<storage::FileStreamReader> reader =
-        file_system_context_->CreateFileStreamReader(
-            url, 0, std::numeric_limits<int64_t>::max(), base::Time());
-    std::string result;
-    while (true) {
-      auto buf = base::MakeRefCounted<net::IOBufferWithSize>(4096);
-      net::TestCompletionCallback callback;
-      int rv = reader->Read(buf.get(), buf->size(), callback.callback());
-      if (rv == net::ERR_IO_PENDING)
-        rv = callback.WaitForResult();
-      EXPECT_GE(rv, 0);
-      if (rv < 0)
-        return "(read failure)";
-      if (rv == 0)
-        return result;
-      result.append(buf->data(), rv);
-    }
-  }
-
-  base::File::Error WriteBlobSync(uint64_t position,
-                                  blink::mojom::BlobPtr blob,
-                                  uint64_t* bytes_written_out) {
-    base::RunLoop loop;
-    base::File::Error result_out;
-    handle_->Write(position, std::move(blob),
-                   base::BindLambdaForTesting(
-                       [&](blink::mojom::NativeFileSystemErrorPtr result,
-                           uint64_t bytes_written) {
-                         result_out = result->error_code;
-                         *bytes_written_out = bytes_written;
-                         loop.Quit();
-                       }));
-    loop.Run();
-    return result_out;
-  }
-
-  base::File::Error WriteStreamSync(
-      uint64_t position,
-      mojo::ScopedDataPipeConsumerHandle data_pipe,
-      uint64_t* bytes_written_out) {
-    base::RunLoop loop;
-    base::File::Error result_out;
-    handle_->WriteStream(position, std::move(data_pipe),
-                         base::BindLambdaForTesting(
-                             [&](blink::mojom::NativeFileSystemErrorPtr result,
-                                 uint64_t bytes_written) {
-                               result_out = result->error_code;
-                               *bytes_written_out = bytes_written;
-                               loop.Quit();
-                             }));
-    loop.Run();
-    return result_out;
-  }
-
-  base::File::Error TruncateSync(uint64_t length) {
-    base::RunLoop loop;
-    base::File::Error result_out;
-    handle_->Truncate(length,
-                      base::BindLambdaForTesting(
-                          [&](blink::mojom::NativeFileSystemErrorPtr result) {
-                            result_out = result->error_code;
-                            loop.Quit();
-                          }));
-    loop.Run();
-    return result_out;
-  }
-
-  virtual bool WriteUsingBlobs() { return true; }
-
-  base::File::Error WriteSync(uint64_t position,
-                              const std::string& contents,
-                              uint64_t* bytes_written_out) {
-    if (WriteUsingBlobs())
-      return WriteBlobSync(position, CreateBlob(contents), bytes_written_out);
-    return WriteStreamSync(position, CreateStream(contents), bytes_written_out);
-  }
-
- protected:
-  base::test::ScopedFeatureList scoped_feature_list_;
-  TestBrowserThreadBundle scoped_task_environment_;
-
-  base::ScopedTempDir dir_;
-  scoped_refptr<storage::FileSystemContext> file_system_context_;
-  scoped_refptr<ChromeBlobStorageContext> chrome_blob_context_;
-  storage::BlobStorageContext* blob_context_;
-  scoped_refptr<NativeFileSystemManagerImpl> manager_;
-
-  FileSystemURL test_url_;
-
-  scoped_refptr<FixedNativeFileSystemPermissionGrant> permission_grant_ =
-      base::MakeRefCounted<FixedNativeFileSystemPermissionGrant>(
-          FixedNativeFileSystemPermissionGrant::PermissionStatus::GRANTED);
-  std::unique_ptr<NativeFileSystemFileHandleImpl> handle_;
-};
-
-class NativeFileSystemFileHandleImplWriteTest
-    : public NativeFileSystemFileHandleImplTest,
-      public testing::WithParamInterface<bool> {
- public:
-  bool WriteUsingBlobs() override { return GetParam(); }
-};
-
-INSTANTIATE_TEST_SUITE_P(NativeFileSystemFileHandleImplTest,
-                         NativeFileSystemFileHandleImplWriteTest,
-                         ::testing::Bool());
-
-TEST_F(NativeFileSystemFileHandleImplTest, WriteInvalidBlob) {
-  blink::mojom::BlobPtr blob;
-  MakeRequest(&blob);
-
-  uint64_t bytes_written;
-  base::File::Error result = WriteBlobSync(0, std::move(blob), &bytes_written);
-  EXPECT_EQ(result, base::File::FILE_ERROR_FAILED);
-  EXPECT_EQ(bytes_written, 0u);
-
-  EXPECT_EQ("", ReadFile(test_url_));
-}
-
-TEST_P(NativeFileSystemFileHandleImplWriteTest, WriteValidEmptyString) {
-  uint64_t bytes_written;
-  base::File::Error result = WriteSync(0, "", &bytes_written);
-  EXPECT_EQ(result, base::File::FILE_OK);
-  EXPECT_EQ(bytes_written, 0u);
-
-  EXPECT_EQ("", ReadFile(test_url_));
-}
-
-TEST_P(NativeFileSystemFileHandleImplWriteTest, WriteValidNonEmpty) {
-  std::string test_data("abcdefghijklmnopqrstuvwxyz");
-  uint64_t bytes_written;
-  base::File::Error result = WriteSync(0, test_data, &bytes_written);
-  EXPECT_EQ(result, base::File::FILE_OK);
-  EXPECT_EQ(bytes_written, test_data.size());
-
-  EXPECT_EQ(test_data, ReadFile(test_url_));
-}
-
-TEST_P(NativeFileSystemFileHandleImplWriteTest, WriteWithOffsetInFile) {
-  uint64_t bytes_written;
-  base::File::Error result;
-
-  result = WriteSync(0, "1234567890", &bytes_written);
-  EXPECT_EQ(result, base::File::FILE_OK);
-  EXPECT_EQ(bytes_written, 10u);
-
-  result = WriteSync(4, "abc", &bytes_written);
-  EXPECT_EQ(result, base::File::FILE_OK);
-  EXPECT_EQ(bytes_written, 3u);
-
-  EXPECT_EQ("1234abc890", ReadFile(test_url_));
-}
-
-TEST_P(NativeFileSystemFileHandleImplWriteTest, WriteWithOffsetPastFile) {
-  uint64_t bytes_written;
-  base::File::Error result = WriteSync(4, "abc", &bytes_written);
-  EXPECT_EQ(result, base::File::FILE_ERROR_FAILED);
-  EXPECT_EQ(bytes_written, 0u);
-
-  EXPECT_EQ("", ReadFile(test_url_));
-}
-
-TEST_F(NativeFileSystemFileHandleImplTest, TruncateShrink) {
-  uint64_t bytes_written;
-  base::File::Error result;
-
-  result = WriteSync(0, "1234567890", &bytes_written);
-  EXPECT_EQ(result, base::File::FILE_OK);
-  EXPECT_EQ(bytes_written, 10u);
-
-  result = TruncateSync(5);
-  EXPECT_EQ(result, base::File::FILE_OK);
-
-  EXPECT_EQ("12345", ReadFile(test_url_));
-}
-
-TEST_F(NativeFileSystemFileHandleImplTest, TruncateGrow) {
-  uint64_t bytes_written;
-  base::File::Error result;
-
-  result = WriteSync(0, "abc", &bytes_written);
-  EXPECT_EQ(result, base::File::FILE_OK);
-  EXPECT_EQ(bytes_written, 3u);
-
-  result = TruncateSync(5);
-  EXPECT_EQ(result, base::File::FILE_OK);
-
-  EXPECT_EQ(std::string("abc\0\0", 5), ReadFile(test_url_));
-}
-
-// TODO(mek): More tests, particularly for error conditions.
-
-}  // namespace content
diff --git a/content/browser/native_file_system/native_file_system_file_writer_impl.cc b/content/browser/native_file_system/native_file_system_file_writer_impl.cc
index d4422fe..f3f33fa 100644
--- a/content/browser/native_file_system/native_file_system_file_writer_impl.cc
+++ b/content/browser/native_file_system/native_file_system_file_writer_impl.cc
@@ -4,11 +4,22 @@
 
 #include "content/browser/native_file_system/native_file_system_file_writer_impl.h"
 #include "content/browser/native_file_system/native_file_system_manager_impl.h"
+#include "storage/browser/blob/blob_storage_context.h"
+#include "storage/browser/fileapi/file_system_operation_runner.h"
+#include "third_party/blink/public/mojom/blob/blob.mojom.h"
+#include "third_party/blink/public/mojom/native_file_system/native_file_system_error.mojom.h"
 
 using blink::mojom::NativeFileSystemError;
+using storage::BlobDataHandle;
+using storage::FileSystemOperation;
 
 namespace content {
 
+struct NativeFileSystemFileWriterImpl::WriteState {
+  WriteCallback callback;
+  uint64_t bytes_written = 0;
+};
+
 NativeFileSystemFileWriterImpl::NativeFileSystemFileWriterImpl(
     NativeFileSystemManagerImpl* manager,
     const BindingContext& context,
@@ -18,6 +29,53 @@
 
 NativeFileSystemFileWriterImpl::~NativeFileSystemFileWriterImpl() = default;
 
+void NativeFileSystemFileWriterImpl::Write(uint64_t offset,
+                                           blink::mojom::BlobPtr data,
+                                           WriteCallback callback) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+  RunWithWritePermission(
+      base::BindOnce(&NativeFileSystemFileWriterImpl::WriteImpl,
+                     weak_factory_.GetWeakPtr(), offset, std::move(data)),
+      base::BindOnce([](WriteCallback callback) {
+        std::move(callback).Run(
+            NativeFileSystemError::New(base::File::FILE_ERROR_ACCESS_DENIED),
+            0);
+      }),
+      std::move(callback));
+}
+
+void NativeFileSystemFileWriterImpl::WriteStream(
+    uint64_t offset,
+    mojo::ScopedDataPipeConsumerHandle stream,
+    WriteStreamCallback callback) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+  RunWithWritePermission(
+      base::BindOnce(&NativeFileSystemFileWriterImpl::WriteStreamImpl,
+                     weak_factory_.GetWeakPtr(), offset, std::move(stream)),
+      base::BindOnce([](WriteStreamCallback callback) {
+        std::move(callback).Run(
+            NativeFileSystemError::New(base::File::FILE_ERROR_ACCESS_DENIED),
+            0);
+      }),
+      std::move(callback));
+}
+
+void NativeFileSystemFileWriterImpl::Truncate(uint64_t length,
+                                              TruncateCallback callback) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+  RunWithWritePermission(
+      base::BindOnce(&NativeFileSystemFileWriterImpl::TruncateImpl,
+                     weak_factory_.GetWeakPtr(), length),
+      base::BindOnce([](TruncateCallback callback) {
+        std::move(callback).Run(
+            NativeFileSystemError::New(base::File::FILE_ERROR_ACCESS_DENIED));
+      }),
+      std::move(callback));
+}
+
 void NativeFileSystemFileWriterImpl::Close(CloseCallback callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
@@ -31,6 +89,82 @@
       std::move(callback));
 }
 
+void NativeFileSystemFileWriterImpl::WriteImpl(uint64_t offset,
+                                               blink::mojom::BlobPtr data,
+                                               WriteCallback callback) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  DCHECK_EQ(GetWritePermissionStatus(),
+            blink::mojom::PermissionStatus::GRANTED);
+
+  blob_context()->GetBlobDataFromBlobPtr(
+      std::move(data),
+      base::BindOnce(&NativeFileSystemFileWriterImpl::DoWriteBlob,
+                     weak_factory_.GetWeakPtr(), std::move(callback), offset));
+}
+
+void NativeFileSystemFileWriterImpl::DoWriteBlob(
+    WriteCallback callback,
+    uint64_t position,
+    std::unique_ptr<BlobDataHandle> blob) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+  if (!blob) {
+    std::move(callback).Run(
+        NativeFileSystemError::New(base::File::FILE_ERROR_FAILED), 0);
+    return;
+  }
+
+  operation_runner()->Write(
+      url(), std::move(blob), position,
+      base::BindRepeating(&NativeFileSystemFileWriterImpl::DidWrite,
+                          weak_factory_.GetWeakPtr(),
+                          base::Owned(new WriteState{std::move(callback)})));
+}
+
+void NativeFileSystemFileWriterImpl::WriteStreamImpl(
+    uint64_t offset,
+    mojo::ScopedDataPipeConsumerHandle stream,
+    WriteStreamCallback callback) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  DCHECK_EQ(GetWritePermissionStatus(),
+            blink::mojom::PermissionStatus::GRANTED);
+
+  operation_runner()->Write(
+      url(), std::move(stream), offset,
+      base::BindRepeating(&NativeFileSystemFileWriterImpl::DidWrite,
+                          weak_factory_.GetWeakPtr(),
+                          base::Owned(new WriteState{std::move(callback)})));
+}
+
+void NativeFileSystemFileWriterImpl::DidWrite(WriteState* state,
+                                              base::File::Error result,
+                                              int64_t bytes,
+                                              bool complete) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+  DCHECK(state);
+  state->bytes_written += bytes;
+  if (complete) {
+    std::move(state->callback)
+        .Run(NativeFileSystemError::New(result), state->bytes_written);
+  }
+}
+
+void NativeFileSystemFileWriterImpl::TruncateImpl(uint64_t length,
+                                                  TruncateCallback callback) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  DCHECK_EQ(GetWritePermissionStatus(),
+            blink::mojom::PermissionStatus::GRANTED);
+
+  operation_runner()->Truncate(
+      url(), length,
+      base::BindOnce(
+          [](TruncateCallback callback, base::File::Error result) {
+            std::move(callback).Run(NativeFileSystemError::New(result));
+          },
+          std::move(callback)));
+}
+
 void NativeFileSystemFileWriterImpl::CloseImpl(CloseCallback callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   DCHECK_EQ(GetWritePermissionStatus(),
diff --git a/content/browser/native_file_system/native_file_system_file_writer_impl.h b/content/browser/native_file_system/native_file_system_file_writer_impl.h
index d06c9e6..0de6996 100644
--- a/content/browser/native_file_system/native_file_system_file_writer_impl.h
+++ b/content/browser/native_file_system/native_file_system_file_writer_impl.h
@@ -36,10 +36,35 @@
                                  const storage::FileSystemURL& url,
                                  const SharedHandleState& handle_state);
   ~NativeFileSystemFileWriterImpl() override;
+  void Write(uint64_t offset,
+             blink::mojom::BlobPtr data,
+             WriteCallback callback) override;
+  void WriteStream(uint64_t offset,
+                   mojo::ScopedDataPipeConsumerHandle stream,
+                   WriteStreamCallback callback) override;
 
+  void Truncate(uint64_t length, TruncateCallback callback) override;
   void Close(CloseCallback callback) override;
 
  private:
+  // State that is kept for the duration of a write operation, to keep track of
+  // progress until the write completes.
+  struct WriteState;
+
+  void WriteImpl(uint64_t offset,
+                 blink::mojom::BlobPtr data,
+                 WriteCallback callback);
+  void DoWriteBlob(WriteCallback callback,
+                   uint64_t position,
+                   std::unique_ptr<storage::BlobDataHandle> blob);
+  void WriteStreamImpl(uint64_t offset,
+                       mojo::ScopedDataPipeConsumerHandle stream,
+                       WriteStreamCallback callback);
+  void DidWrite(WriteState* state,
+                base::File::Error result,
+                int64_t bytes,
+                bool complete);
+  void TruncateImpl(uint64_t length, TruncateCallback callback);
   void CloseImpl(CloseCallback callback);
 
   base::WeakPtr<NativeFileSystemHandleBase> AsWeakPtr() override;
diff --git a/content/browser/native_file_system/native_file_system_file_writer_impl_unittest.cc b/content/browser/native_file_system/native_file_system_file_writer_impl_unittest.cc
new file mode 100644
index 0000000..da714b4
--- /dev/null
+++ b/content/browser/native_file_system/native_file_system_file_writer_impl_unittest.cc
@@ -0,0 +1,324 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/native_file_system/native_file_system_file_writer_impl.h"
+
+#include <limits>
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/files/scoped_temp_dir.h"
+#include "base/guid.h"
+#include "base/test/bind_test_util.h"
+#include "base/test/scoped_feature_list.h"
+#include "base/test/scoped_task_environment.h"
+#include "content/browser/native_file_system/fixed_native_file_system_permission_grant.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "mojo/public/cpp/system/string_data_pipe_producer.h"
+#include "net/base/io_buffer.h"
+#include "net/base/net_errors.h"
+#include "net/base/test_completion_callback.h"
+#include "storage/browser/blob/blob_data_builder.h"
+#include "storage/browser/blob/blob_impl.h"
+#include "storage/browser/blob/blob_storage_context.h"
+#include "storage/browser/fileapi/file_stream_reader.h"
+#include "storage/browser/test/async_file_test_helper.h"
+#include "storage/browser/test/test_file_system_context.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/features.h"
+
+using storage::FileSystemURL;
+
+namespace content {
+
+class NativeFileSystemFileWriterImplTest : public testing::Test {
+ public:
+  NativeFileSystemFileWriterImplTest()
+      : scoped_task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::IO) {
+    scoped_feature_list_.InitAndEnableFeature(
+        blink::features::kNativeFileSystemAPI);
+  }
+
+  void SetUp() override {
+    ASSERT_TRUE(dir_.CreateUniqueTempDir());
+    file_system_context_ = CreateFileSystemContextForTesting(
+        /*quota_manager_proxy=*/nullptr, dir_.GetPath());
+
+    test_url_ = file_system_context_->CreateCrackedFileSystemURL(
+        GURL("http://example.com"), storage::kFileSystemTypeTest,
+        base::FilePath::FromUTF8Unsafe("test"));
+
+    ASSERT_EQ(base::File::FILE_OK, AsyncFileTestHelper::CreateFile(
+                                       file_system_context_.get(), test_url_));
+
+    chrome_blob_context_ = base::MakeRefCounted<ChromeBlobStorageContext>();
+    chrome_blob_context_->InitializeOnIOThread(base::FilePath(), nullptr);
+    blob_context_ = chrome_blob_context_->context();
+
+    manager_ = base::MakeRefCounted<NativeFileSystemManagerImpl>(
+        file_system_context_, chrome_blob_context_,
+        /*permission_context=*/nullptr);
+
+    handle_ = std::make_unique<NativeFileSystemFileWriterImpl>(
+        manager_.get(),
+        NativeFileSystemManagerImpl::BindingContext(
+            test_url_.origin(), /*process_id=*/1,
+            /*frame_id=*/MSG_ROUTING_NONE),
+        test_url_,
+        NativeFileSystemManagerImpl::SharedHandleState(
+            permission_grant_, permission_grant_, /*file_system=*/{}));
+  }
+
+  blink::mojom::BlobPtr CreateBlob(const std::string& contents) {
+    auto builder =
+        std::make_unique<storage::BlobDataBuilder>(base::GenerateGUID());
+    builder->AppendData(contents);
+    auto handle = blob_context_->AddFinishedBlob(std::move(builder));
+    blink::mojom::BlobPtr result;
+    storage::BlobImpl::Create(std::move(handle), MakeRequest(&result));
+    return result;
+  }
+
+  mojo::ScopedDataPipeConsumerHandle CreateStream(const std::string& contents) {
+    // Test with a relatively low capacity pipe to make sure it isn't all
+    // written/read in one go.
+    mojo::ScopedDataPipeProducerHandle producer_handle;
+    mojo::ScopedDataPipeConsumerHandle consumer_handle;
+    MojoCreateDataPipeOptions options;
+    options.struct_size = sizeof(MojoCreateDataPipeOptions);
+    options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE;
+    options.element_num_bytes = 1;
+    options.capacity_num_bytes = 16;
+    mojo::CreateDataPipe(&options, &producer_handle, &consumer_handle);
+    CHECK(producer_handle.is_valid());
+    auto producer = std::make_unique<mojo::StringDataPipeProducer>(
+        std::move(producer_handle));
+    auto* producer_raw = producer.get();
+    producer_raw->Write(
+        contents,
+        mojo::StringDataPipeProducer::AsyncWritingMode::
+            STRING_MAY_BE_INVALIDATED_BEFORE_COMPLETION,
+        base::BindOnce(
+            base::DoNothing::Once<std::unique_ptr<mojo::StringDataPipeProducer>,
+                                  MojoResult>(),
+            std::move(producer)));
+    return consumer_handle;
+  }
+
+  std::string ReadFile(const FileSystemURL& url) {
+    std::unique_ptr<storage::FileStreamReader> reader =
+        file_system_context_->CreateFileStreamReader(
+            url, 0, std::numeric_limits<int64_t>::max(), base::Time());
+    std::string result;
+    while (true) {
+      auto buf = base::MakeRefCounted<net::IOBufferWithSize>(4096);
+      net::TestCompletionCallback callback;
+      int rv = reader->Read(buf.get(), buf->size(), callback.callback());
+      if (rv == net::ERR_IO_PENDING)
+        rv = callback.WaitForResult();
+      EXPECT_GE(rv, 0);
+      if (rv < 0)
+        return "(read failure)";
+      if (rv == 0)
+        return result;
+      result.append(buf->data(), rv);
+    }
+  }
+
+  base::File::Error WriteBlobSync(uint64_t position,
+                                  blink::mojom::BlobPtr blob,
+                                  uint64_t* bytes_written_out) {
+    base::RunLoop loop;
+    base::File::Error result_out;
+    handle_->Write(position, std::move(blob),
+                   base::BindLambdaForTesting(
+                       [&](blink::mojom::NativeFileSystemErrorPtr result,
+                           uint64_t bytes_written) {
+                         result_out = result->error_code;
+                         *bytes_written_out = bytes_written;
+                         loop.Quit();
+                       }));
+    loop.Run();
+    return result_out;
+  }
+
+  base::File::Error WriteStreamSync(
+      uint64_t position,
+      mojo::ScopedDataPipeConsumerHandle data_pipe,
+      uint64_t* bytes_written_out) {
+    base::RunLoop loop;
+    base::File::Error result_out;
+    handle_->WriteStream(position, std::move(data_pipe),
+                         base::BindLambdaForTesting(
+                             [&](blink::mojom::NativeFileSystemErrorPtr result,
+                                 uint64_t bytes_written) {
+                               result_out = result->error_code;
+                               *bytes_written_out = bytes_written;
+                               loop.Quit();
+                             }));
+    loop.Run();
+    return result_out;
+  }
+
+  base::File::Error TruncateSync(uint64_t length) {
+    base::RunLoop loop;
+    base::File::Error result_out;
+    handle_->Truncate(length,
+                      base::BindLambdaForTesting(
+                          [&](blink::mojom::NativeFileSystemErrorPtr result) {
+                            result_out = result->error_code;
+                            loop.Quit();
+                          }));
+    loop.Run();
+    return result_out;
+  }
+
+  base::File::Error CloseSync() {
+    base::RunLoop loop;
+    base::File::Error result_out;
+    handle_->Close(base::BindLambdaForTesting(
+        [&](blink::mojom::NativeFileSystemErrorPtr result) {
+          result_out = result->error_code;
+          loop.Quit();
+        }));
+    loop.Run();
+    return result_out;
+  }
+
+  virtual bool WriteUsingBlobs() { return true; }
+
+  base::File::Error WriteSync(uint64_t position,
+                              const std::string& contents,
+                              uint64_t* bytes_written_out) {
+    if (WriteUsingBlobs())
+      return WriteBlobSync(position, CreateBlob(contents), bytes_written_out);
+    return WriteStreamSync(position, CreateStream(contents), bytes_written_out);
+  }
+
+ protected:
+  base::test::ScopedFeatureList scoped_feature_list_;
+  TestBrowserThreadBundle scoped_task_environment_;
+
+  base::ScopedTempDir dir_;
+  scoped_refptr<storage::FileSystemContext> file_system_context_;
+  scoped_refptr<ChromeBlobStorageContext> chrome_blob_context_;
+  storage::BlobStorageContext* blob_context_;
+  scoped_refptr<NativeFileSystemManagerImpl> manager_;
+
+  FileSystemURL test_url_;
+
+  scoped_refptr<FixedNativeFileSystemPermissionGrant> permission_grant_ =
+      base::MakeRefCounted<FixedNativeFileSystemPermissionGrant>(
+          FixedNativeFileSystemPermissionGrant::PermissionStatus::GRANTED);
+  std::unique_ptr<NativeFileSystemFileWriterImpl> handle_;
+};
+
+class NativeFileSystemFileWriterImplWriteTest
+    : public NativeFileSystemFileWriterImplTest,
+      public testing::WithParamInterface<bool> {
+ public:
+  bool WriteUsingBlobs() override { return GetParam(); }
+};
+
+INSTANTIATE_TEST_SUITE_P(NativeFileSystemFileWriterImplTest,
+                         NativeFileSystemFileWriterImplWriteTest,
+                         ::testing::Bool());
+
+TEST_F(NativeFileSystemFileWriterImplTest, WriteInvalidBlob) {
+  blink::mojom::BlobPtr blob;
+  MakeRequest(&blob);
+
+  uint64_t bytes_written;
+  base::File::Error result = WriteBlobSync(0, std::move(blob), &bytes_written);
+  EXPECT_EQ(result, base::File::FILE_ERROR_FAILED);
+  EXPECT_EQ(bytes_written, 0u);
+
+  EXPECT_EQ("", ReadFile(test_url_));
+}
+
+TEST_P(NativeFileSystemFileWriterImplWriteTest, WriteValidEmptyString) {
+  uint64_t bytes_written;
+  base::File::Error result = WriteSync(0, "", &bytes_written);
+  EXPECT_EQ(result, base::File::FILE_OK);
+  EXPECT_EQ(bytes_written, 0u);
+
+  EXPECT_EQ("", ReadFile(test_url_));
+}
+
+TEST_P(NativeFileSystemFileWriterImplWriteTest, WriteValidNonEmpty) {
+  std::string test_data("abcdefghijklmnopqrstuvwxyz");
+  uint64_t bytes_written;
+  base::File::Error result = WriteSync(0, test_data, &bytes_written);
+  EXPECT_EQ(result, base::File::FILE_OK);
+  EXPECT_EQ(bytes_written, test_data.size());
+
+  EXPECT_EQ(test_data, ReadFile(test_url_));
+}
+
+TEST_P(NativeFileSystemFileWriterImplWriteTest, WriteWithOffsetInFile) {
+  uint64_t bytes_written;
+  base::File::Error result;
+
+  result = WriteSync(0, "1234567890", &bytes_written);
+  EXPECT_EQ(result, base::File::FILE_OK);
+  EXPECT_EQ(bytes_written, 10u);
+
+  result = WriteSync(4, "abc", &bytes_written);
+  EXPECT_EQ(result, base::File::FILE_OK);
+  EXPECT_EQ(bytes_written, 3u);
+
+  EXPECT_EQ("1234abc890", ReadFile(test_url_));
+}
+
+TEST_P(NativeFileSystemFileWriterImplWriteTest, WriteWithOffsetPastFile) {
+  uint64_t bytes_written;
+  base::File::Error result = WriteSync(4, "abc", &bytes_written);
+  EXPECT_EQ(result, base::File::FILE_ERROR_FAILED);
+  EXPECT_EQ(bytes_written, 0u);
+
+  EXPECT_EQ("", ReadFile(test_url_));
+}
+
+TEST_F(NativeFileSystemFileWriterImplTest, CloseOK) {
+  uint64_t bytes_written;
+  base::File::Error result = WriteSync(0, "abc", &bytes_written);
+  EXPECT_EQ(result, base::File::FILE_OK);
+  EXPECT_EQ(bytes_written, 3u);
+  result = CloseSync();
+  EXPECT_EQ(result, base::File::FILE_OK);
+
+  EXPECT_EQ("abc", ReadFile(test_url_));
+}
+
+TEST_F(NativeFileSystemFileWriterImplTest, TruncateShrink) {
+  uint64_t bytes_written;
+  base::File::Error result;
+
+  result = WriteSync(0, "1234567890", &bytes_written);
+  EXPECT_EQ(result, base::File::FILE_OK);
+  EXPECT_EQ(bytes_written, 10u);
+
+  result = TruncateSync(5);
+  EXPECT_EQ(result, base::File::FILE_OK);
+
+  EXPECT_EQ("12345", ReadFile(test_url_));
+}
+
+TEST_F(NativeFileSystemFileWriterImplTest, TruncateGrow) {
+  uint64_t bytes_written;
+  base::File::Error result;
+
+  result = WriteSync(0, "abc", &bytes_written);
+  EXPECT_EQ(result, base::File::FILE_OK);
+  EXPECT_EQ(bytes_written, 3u);
+
+  result = TruncateSync(5);
+  EXPECT_EQ(result, base::File::FILE_OK);
+
+  EXPECT_EQ(std::string("abc\0\0", 5), ReadFile(test_url_));
+}
+
+// TODO(mek): More tests, particularly for error conditions.
+
+}  // namespace content
diff --git a/content/browser/portal/portal_browsertest.cc b/content/browser/portal/portal_browsertest.cc
index 78011f6..e4c126d 100644
--- a/content/browser/portal/portal_browsertest.cc
+++ b/content/browser/portal/portal_browsertest.cc
@@ -161,11 +161,14 @@
  public:
   explicit PortalCreatedObserver(RenderFrameHostImpl* render_frame_host_impl)
       : render_frame_host_impl_(render_frame_host_impl) {
-    render_frame_host_impl_->frame_host_binding_for_testing()
-        .SwapImplForTesting(this);
+    old_impl_ = render_frame_host_impl_->frame_host_binding_for_testing()
+                    .SwapImplForTesting(this);
   }
 
-  ~PortalCreatedObserver() override {}
+  ~PortalCreatedObserver() override {
+    render_frame_host_impl_->frame_host_binding_for_testing()
+        .SwapImplForTesting(old_impl_);
+  }
 
   FrameHost* GetForwardingInterface() override {
     return render_frame_host_impl_;
@@ -222,6 +225,7 @@
 
  private:
   RenderFrameHostImpl* render_frame_host_impl_;
+  mojom::FrameHost* old_impl_;
   base::RunLoop* run_loop_ = nullptr;
   Portal* portal_ = nullptr;
 };
@@ -811,6 +815,47 @@
   EXPECT_TRUE(ExecJs(main_frame, "div.remove();"));
 }
 
+// Tests that a portal can navigate while orphaned.
+IN_PROC_BROWSER_TEST_F(PortalBrowserTest, OrphanedNavigation) {
+  EXPECT_TRUE(NavigateToURL(
+      shell(), embedded_test_server()->GetURL("portal.test", "/title1.html")));
+  WebContentsImpl* web_contents_impl =
+      static_cast<WebContentsImpl*>(shell()->web_contents());
+  RenderFrameHostImpl* main_frame = web_contents_impl->GetMainFrame();
+
+  Portal* portal = nullptr;
+  {
+    PortalCreatedObserver portal_created_observer(main_frame);
+    GURL a_url(embedded_test_server()->GetURL("a.com", "/title1.html"));
+    EXPECT_TRUE(ExecJs(
+        main_frame, JsReplace("var portal = document.createElement('portal');"
+                              "portal.src = $1;"
+                              "document.body.appendChild(portal);",
+                              a_url)));
+    portal = portal_created_observer.WaitUntilPortalCreated();
+  }
+  PortalInterceptorForTesting* portal_interceptor =
+      PortalInterceptorForTesting::From(portal);
+  WebContentsImpl* portal_contents = portal->GetPortalContents();
+
+  // The portal should not have navigated yet; wait for the first navigation.
+  TestNavigationObserver navigation_observer(portal_contents);
+  navigation_observer.Wait();
+
+  // Block the activate callback so that the predecessor portal stays orphaned.
+  EXPECT_TRUE(ExecJs(portal_contents->GetMainFrame(),
+                     "window.onportalactivate = e => { while(true) {} };"));
+
+  // Acticate the portal and navigate the predecessor.
+  TestNavigationObserver main_frame_navigation_observer(web_contents_impl);
+  GURL a_url(embedded_test_server()->GetURL("a.com", "/title1.html"));
+  ExecuteScriptAsync(main_frame,
+                     "document.querySelector('portal').activate();"
+                     "window.location.reload()");
+  portal_interceptor->WaitForActivate();
+  main_frame_navigation_observer.Wait();
+}
+
 class PortalOOPIFBrowserTest : public PortalBrowserTest {
  protected:
   PortalOOPIFBrowserTest() {}
diff --git a/content/browser/renderer_host/media/video_capture_controller_unittest.cc b/content/browser/renderer_host/media/video_capture_controller_unittest.cc
index bf83866..69bf647 100644
--- a/content/browser/renderer_host/media/video_capture_controller_unittest.cc
+++ b/content/browser/renderer_host/media/video_capture_controller_unittest.cc
@@ -195,8 +195,8 @@
         stub_frame->data(0),
         media::VideoFrame::AllocationSize(stub_frame->format(),
                                           stub_frame->coded_size()),
-        format, color_space, rotation, base::TimeTicks(), base::TimeDelta(),
-        frame_feedback_id);
+        format, color_space, rotation, false /* flip_y */, base::TimeTicks(),
+        base::TimeDelta(), frame_feedback_id);
   }
 
   TestBrowserThreadBundle bundle_;
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc
index adad382..02cd39d9 100644
--- a/content/browser/service_worker/service_worker_browsertest.cc
+++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -3702,7 +3702,7 @@
   ~ThrottlingContentBrowserClient() override {}
 
   // ContentBrowserClient overrides:
-  std::vector<std::unique_ptr<URLLoaderThrottle>> CreateURLLoaderThrottles(
+  std::vector<std::unique_ptr<URLLoaderThrottle>> CreateURLLoaderThrottlesOnIO(
       const network::ResourceRequest& request,
       ResourceContext* resource_context,
       const base::RepeatingCallback<WebContents*()>& wc_getter,
diff --git a/content/browser/webui/web_ui_data_source_unittest.cc b/content/browser/webui/web_ui_data_source_unittest.cc
index 6b6fde8..246e4bcb 100644
--- a/content/browser/webui/web_ui_data_source_unittest.cc
+++ b/content/browser/webui/web_ui_data_source_unittest.cc
@@ -27,14 +27,13 @@
   TestClient() : is_gzipped_(false) {}
   ~TestClient() override {}
 
-  base::string16 GetLocalizedString(int message_id) const override {
+  base::string16 GetLocalizedString(int message_id) override {
     if (message_id == kDummyStringId)
       return base::UTF8ToUTF16(kDummyString);
     return base::string16();
   }
 
-  base::RefCountedMemory* GetDataResourceBytes(
-      int resource_id) const override {
+  base::RefCountedMemory* GetDataResourceBytes(int resource_id) override {
     base::RefCountedStaticMemory* bytes = nullptr;
     if (resource_id == kDummyDefaultResourceId) {
       bytes = new base::RefCountedStaticMemory(
@@ -46,9 +45,7 @@
     return bytes;
   }
 
-  bool IsDataResourceGzipped(int resource_id) const override {
-    return is_gzipped_;
-  }
+  bool IsDataResourceGzipped(int resource_id) override { return is_gzipped_; }
 
   // Sets the response for |IsDataResourceGzipped()|.
   void SetIsDataResourceGzipped(bool is_gzipped) { is_gzipped_ = is_gzipped; }
diff --git a/content/browser/worker_host/worker_script_fetch_initiator.cc b/content/browser/worker_host/worker_script_fetch_initiator.cc
index b834b67..01dadb8 100644
--- a/content/browser/worker_host/worker_script_fetch_initiator.cc
+++ b/content/browser/worker_host/worker_script_fetch_initiator.cc
@@ -367,7 +367,7 @@
     base::RepeatingCallback<WebContents*()> wc_getter =
         base::BindRepeating([]() -> WebContents* { return nullptr; });
     std::vector<std::unique_ptr<URLLoaderThrottle>> throttles =
-        GetContentClient()->browser()->CreateURLLoaderThrottles(
+        GetContentClient()->browser()->CreateURLLoaderThrottlesOnIO(
             *resource_request, resource_context, wc_getter,
             nullptr /* navigation_ui_data */, -1 /* frame_tree_node_id */);
 
diff --git a/content/public/android/java/src/org/chromium/content/browser/BrowserStartupControllerImpl.java b/content/public/android/java/src/org/chromium/content/browser/BrowserStartupControllerImpl.java
index 7a219cb..c0fc4d1 100644
--- a/content/public/android/java/src/org/chromium/content/browser/BrowserStartupControllerImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/BrowserStartupControllerImpl.java
@@ -463,25 +463,6 @@
         ServicificationStartupUma.getInstance().commit();
     }
 
-    /**
-     * Initialization needed for tests. Mainly used by content browsertests.
-     */
-    @Override
-    public void initChromiumBrowserProcessForTests() {
-        ResourceExtractor resourceExtractor = ResourceExtractor.get();
-        resourceExtractor.setResultTraits(UiThreadTaskTraits.BOOTSTRAP);
-        resourceExtractor.startExtractingResources("en");
-        resourceExtractor.waitForCompletion();
-        nativeSetCommandLineFlags(false);
-
-        mFullBrowserStartupDone = true;
-        mStartupSuccess = true;
-        for (StartupCallback asyncStartupCallback : mAsyncStartupCallbacks) {
-            asyncStartupCallback.onSuccess();
-        }
-        mAsyncStartupCallbacks.clear();
-    }
-
     private static native void nativeSetCommandLineFlags(boolean singleProcess);
 
     // Is this an official build of Chrome? Only native code knows for sure. Official build
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/BrowserStartupController.java b/content/public/android/java/src/org/chromium/content_public/browser/BrowserStartupController.java
index be2bc04..1b130af 100644
--- a/content/public/android/java/src/org/chromium/content_public/browser/BrowserStartupController.java
+++ b/content/public/android/java/src/org/chromium/content_public/browser/BrowserStartupController.java
@@ -83,11 +83,6 @@
     void addStartupCompletedObserver(StartupCallback callback);
 
     /**
-     * Initialization needed for tests. Mainly used by browsertests.
-     */
-    void initChromiumBrowserProcessForTests();
-
-    /**
      * Set a callback that will be run in place of calling ContentMain(). For tests to
      * define their own way of initializing the C++ system.
      */
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc
index 440244ed..2ff5541 100644
--- a/content/public/browser/content_browser_client.cc
+++ b/content/public/browser/content_browser_client.cc
@@ -719,7 +719,7 @@
 }
 
 std::vector<std::unique_ptr<URLLoaderThrottle>>
-ContentBrowserClient::CreateURLLoaderThrottles(
+ContentBrowserClient::CreateURLLoaderThrottlesOnIO(
     const network::ResourceRequest& request,
     ResourceContext* resource_context,
     const base::RepeatingCallback<WebContents*()>& wc_getter,
@@ -728,6 +728,16 @@
   return std::vector<std::unique_ptr<URLLoaderThrottle>>();
 }
 
+std::vector<std::unique_ptr<URLLoaderThrottle>>
+ContentBrowserClient::CreateURLLoaderThrottles(
+    const network::ResourceRequest& request,
+    BrowserContext* browser_context,
+    const base::RepeatingCallback<WebContents*()>& wc_getter,
+    NavigationUIData* navigation_ui_data,
+    int frame_tree_node_id) {
+  return std::vector<std::unique_ptr<URLLoaderThrottle>>();
+}
+
 void ContentBrowserClient::RegisterNonNetworkNavigationURLLoaderFactories(
     int frame_tree_node_id,
     NonNetworkURLLoaderFactoryMap* factories) {}
@@ -901,8 +911,13 @@
   return nullptr;
 }
 
+bool ContentBrowserClient::IsSafeRedirectTargetOnIO(const GURL& url,
+                                                    ResourceContext* context) {
+  return true;
+}
+
 bool ContentBrowserClient::IsSafeRedirectTarget(const GURL& url,
-                                                ResourceContext* context) {
+                                                BrowserContext* context) {
   return true;
 }
 
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h
index 46eed09..56f0da1 100644
--- a/content/public/browser/content_browser_client.h
+++ b/content/public/browser/content_browser_client.h
@@ -1174,12 +1174,20 @@
   // This is called both when the network service is enabled and disabled.
   // This is called on the IO thread.
   virtual std::vector<std::unique_ptr<URLLoaderThrottle>>
-  CreateURLLoaderThrottles(
+  CreateURLLoaderThrottlesOnIO(
       const network::ResourceRequest& request,
       ResourceContext* resource_context,
       const base::RepeatingCallback<WebContents*()>& wc_getter,
       NavigationUIData* navigation_ui_data,
       int frame_tree_node_id);
+  // Same as above but called on UI thread.
+  virtual std::vector<std::unique_ptr<URLLoaderThrottle>>
+  CreateURLLoaderThrottles(
+      const network::ResourceRequest& request,
+      BrowserContext* browser_context,
+      const base::RepeatingCallback<WebContents*()>& wc_getter,
+      NavigationUIData* navigation_ui_data,
+      int frame_tree_node_id);
 
   // Allows the embedder to register per-scheme URLLoaderFactory implementations
   // to handle navigation URL requests for schemes not handled by the Network
@@ -1483,7 +1491,10 @@
 
   // Returns true if it is safe to redirect to |url|, otherwise returns false.
   // This is called on the IO thread.
-  virtual bool IsSafeRedirectTarget(const GURL& url, ResourceContext* context);
+  virtual bool IsSafeRedirectTargetOnIO(const GURL& url,
+                                        ResourceContext* context);
+  // Same as above but called on UI thread.
+  virtual bool IsSafeRedirectTarget(const GURL& url, BrowserContext* context);
 
   // Registers the watcher to observe updates in RendererPreferences.
   virtual void RegisterRendererPreferenceWatcher(
diff --git a/content/public/browser/download_manager_delegate.cc b/content/public/browser/download_manager_delegate.cc
index 17a484b5..6e2dbdd0 100644
--- a/content/public/browser/download_manager_delegate.cc
+++ b/content/public/browser/download_manager_delegate.cc
@@ -61,6 +61,7 @@
     const ResourceRequestInfo::WebContentsGetter& web_contents_getter,
     const GURL& url,
     const std::string& request_method,
+    base::Optional<url::Origin> request_initiator,
     CheckDownloadAllowedCallback check_download_allowed_cb) {
   base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::BindOnce(std::move(check_download_allowed_cb), true));
diff --git a/content/public/browser/download_manager_delegate.h b/content/public/browser/download_manager_delegate.h
index fb283bb..4d94346 100644
--- a/content/public/browser/download_manager_delegate.h
+++ b/content/public/browser/download_manager_delegate.h
@@ -10,13 +10,14 @@
 #include "base/callback.h"
 #include "base/files/file_path.h"
 #include "base/logging.h"
+#include "base/optional.h"
 #include "base/time/time.h"
 #include "components/download/public/common/download_danger_type.h"
 #include "components/download/public/common/download_item.h"
 #include "content/common/content_export.h"
 #include "content/public/browser/resource_request_info.h"
 #include "content/public/browser/save_page_type.h"
-
+#include "url/origin.h"
 
 namespace content {
 
@@ -189,6 +190,7 @@
       const ResourceRequestInfo::WebContentsGetter& web_contents_getter,
       const GURL& url,
       const std::string& request_method,
+      base::Optional<url::Origin> request_initiator,
       CheckDownloadAllowedCallback check_download_allowed_cb);
 
  protected:
diff --git a/content/public/browser/frame_service_base.h b/content/public/browser/frame_service_base.h
index 4646b56..31cc869 100644
--- a/content/public/browser/frame_service_base.h
+++ b/content/public/browser/frame_service_base.h
@@ -53,6 +53,9 @@
   // trying to get it from the RenderFrameHost pointer directly.
   const url::Origin& origin() const { return origin_; }
 
+  // Returns the RenderFrameHost held by this object.
+  RenderFrameHost* render_frame_host() const { return render_frame_host_; }
+
   // Subclasses can use this to check thread safety.
   // For example: DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   THREAD_CHECKER(thread_checker_);
diff --git a/content/public/browser/hid_delegate.h b/content/public/browser/hid_delegate.h
index 03ff946..e4cc290 100644
--- a/content/public/browser/hid_delegate.h
+++ b/content/public/browser/hid_delegate.h
@@ -13,9 +13,14 @@
 #include "services/device/public/mojom/hid.mojom-forward.h"
 #include "third_party/blink/public/mojom/hid/hid.mojom-forward.h"
 
+namespace url {
+class Origin;
+}  // namespace url
+
 namespace content {
 
 class RenderFrameHost;
+class WebContents;
 
 class CONTENT_EXPORT HidDelegate {
  public:
@@ -29,22 +34,30 @@
       std::vector<blink::mojom::HidDeviceFilterPtr> filters,
       HidChooser::Callback callback) = 0;
 
-  // Returns whether |frame| has permission to request access to a device.
-  virtual bool CanRequestDevicePermission(RenderFrameHost* frame) = 0;
+  // Returns whether the main frame owned by |web_contents| has permission to
+  // request access to a device. |requesting_origin| is the origin of the
+  // frame that would make the request.
+  virtual bool CanRequestDevicePermission(
+      WebContents* web_contents,
+      const url::Origin& requesting_origin) = 0;
 
-  // Returns whether |frame| has permission to access |device|.
+  // Returns whether the main frame owned by |web_contents| has permission to
+  // access |device|. |requesting_origin| is the origin of the frame making
+  // the request.
   virtual bool HasDevicePermission(
-      RenderFrameHost* frame,
+      WebContents* web_contents,
+      const url::Origin& requesting_origin,
       const device::mojom::HidDeviceInfo& device) = 0;
 
   // Returns an open connection to the HidManager interface owned by the
-  // embedder and being used to serve requests from |frame|.
+  // embedder and being used to serve requests from |web_contents|.
   //
   // Content and the embedder must use the same connection so that the embedder
   // can process connect/disconnect events for permissions management purposes
   // before they are delivered to content. Otherwise race conditions are
   // possible.
-  virtual device::mojom::HidManager* GetHidManager(RenderFrameHost* frame) = 0;
+  virtual device::mojom::HidManager* GetHidManager(
+      WebContents* web_contents) = 0;
 };
 
 }  // namespace content
diff --git a/content/public/common/content_client.cc b/content/public/common/content_client.cc
index 338ec48..fb44bda5 100644
--- a/content/public/common/content_client.cc
+++ b/content/public/common/content_client.cc
@@ -71,32 +71,30 @@
   return false;
 }
 
-base::string16 ContentClient::GetLocalizedString(int message_id) const {
+base::string16 ContentClient::GetLocalizedString(int message_id) {
   return base::string16();
 }
 
 base::string16 ContentClient::GetLocalizedString(
     int message_id,
-    const base::string16& replacement) const {
+    const base::string16& replacement) {
   return base::string16();
 }
 
-base::StringPiece ContentClient::GetDataResource(
-    int resource_id,
-    ui::ScaleFactor scale_factor) const {
+base::StringPiece ContentClient::GetDataResource(int resource_id,
+                                                 ui::ScaleFactor scale_factor) {
   return base::StringPiece();
 }
 
-base::RefCountedMemory* ContentClient::GetDataResourceBytes(
-    int resource_id) const {
+base::RefCountedMemory* ContentClient::GetDataResourceBytes(int resource_id) {
   return nullptr;
 }
 
-bool ContentClient::IsDataResourceGzipped(int resource_id) const {
+bool ContentClient::IsDataResourceGzipped(int resource_id) {
   return false;
 }
 
-gfx::Image& ContentClient::GetNativeImageNamed(int resource_id) const {
+gfx::Image& ContentClient::GetNativeImageNamed(int resource_id) {
   static base::NoDestructor<gfx::Image> kEmptyImage;
   return *kEmptyImage;
 }
@@ -106,7 +104,7 @@
   return std::string();
 }
 
-base::DictionaryValue ContentClient::GetNetLogConstants() const {
+base::DictionaryValue ContentClient::GetNetLogConstants() {
   return base::DictionaryValue();
 }
 
diff --git a/content/public/common/content_client.h b/content/public/common/content_client.h
index d5aa585..59656ba 100644
--- a/content/public/common/content_client.h
+++ b/content/public/common/content_client.h
@@ -151,28 +151,25 @@
   virtual bool CanSendWhileSwappedOut(const IPC::Message* message);
 
   // Returns a string resource given its id.
-  virtual base::string16 GetLocalizedString(int message_id) const;
+  virtual base::string16 GetLocalizedString(int message_id);
 
   // Returns a string resource given its id and replace $1 with the given
   // replacement.
-  virtual base::string16 GetLocalizedString(
-      int message_id,
-      const base::string16& replacement) const;
+  virtual base::string16 GetLocalizedString(int message_id,
+                                            const base::string16& replacement);
 
   // Return the contents of a resource in a StringPiece given the resource id.
-  virtual base::StringPiece GetDataResource(
-      int resource_id,
-      ui::ScaleFactor scale_factor) const;
+  virtual base::StringPiece GetDataResource(int resource_id,
+                                            ui::ScaleFactor scale_factor);
 
   // Returns the raw bytes of a scale independent data resource.
-  virtual base::RefCountedMemory* GetDataResourceBytes(
-      int resource_id) const;
+  virtual base::RefCountedMemory* GetDataResourceBytes(int resource_id);
 
   // Returns whether the contents of a resource are compressed (with gzip).
-  virtual bool IsDataResourceGzipped(int resource_id) const;
+  virtual bool IsDataResourceGzipped(int resource_id);
 
   // Returns a native image given its id.
-  virtual gfx::Image& GetNativeImageNamed(int resource_id) const;
+  virtual gfx::Image& GetNativeImageNamed(int resource_id);
 
   // Called by content::GetProcessTypeNameInEnglish for process types that it
   // doesn't know about because they're from the embedder.
@@ -184,7 +181,7 @@
   // |GetNetConstants()| and passed to FileNetLogObserver - see documentation
   // of |FileNetLogObserver::CreateBounded()| for more information.  The
   // convention is to put new constants under a subdict at the key "clientInfo".
-  virtual base::DictionaryValue GetNetLogConstants() const;
+  virtual base::DictionaryValue GetNetLogConstants();
 
   // Returns whether or not V8 script extensions should be allowed for a
   // service worker.
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index 1f02c6e3c..0a57d1e7 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -289,6 +289,10 @@
 const base::Feature kMouseSubframeNoImplicitCapture{
     "MouseSubframeNoImplicitCapture", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// If enabled, the URLLoaderRequestController lives on the UI thread.
+const base::Feature kNavigationLoaderOnUI{"NavigationLoaderOnUI",
+                                          base::FEATURE_DISABLED_BY_DEFAULT};
+
 // If the network service is enabled, runs it in process.
 const base::Feature kNetworkServiceInProcess {
   "NetworkServiceInProcess",
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index 3657df1..7ba0d0d 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -69,6 +69,7 @@
 CONTENT_EXPORT extern const base::Feature kMojoVideoCapture;
 CONTENT_EXPORT extern const base::Feature kMojoVideoCaptureSecondary;
 CONTENT_EXPORT extern const base::Feature kMouseSubframeNoImplicitCapture;
+CONTENT_EXPORT extern const base::Feature kNavigationLoaderOnUI;
 CONTENT_EXPORT extern const base::Feature kNetworkQualityEstimatorWebHoldback;
 CONTENT_EXPORT extern const base::Feature kNetworkServiceInProcess;
 CONTENT_EXPORT extern const base::Feature kNotificationContentImage;
diff --git a/content/public/common/url_loader_throttle.cc b/content/public/common/url_loader_throttle.cc
index 6c8489a..4c40dbe 100644
--- a/content/public/common/url_loader_throttle.cc
+++ b/content/public/common/url_loader_throttle.cc
@@ -60,7 +60,7 @@
     const network::URLLoaderCompletionStatus& status,
     bool* defer) {}
 
-bool URLLoaderThrottle::makes_unsafe_redirect() const {
+bool URLLoaderThrottle::makes_unsafe_redirect() {
   return false;
 }
 
diff --git a/content/public/common/url_loader_throttle.h b/content/public/common/url_loader_throttle.h
index f6a7094..03d15f2 100644
--- a/content/public/common/url_loader_throttle.h
+++ b/content/public/common/url_loader_throttle.h
@@ -169,7 +169,7 @@
   // Must return true if the throttle may make cross-scheme redirects
   // (which is usually considered unsafe, so allowed only if the setting
   // is made very explicitly).
-  virtual bool makes_unsafe_redirect() const;
+  virtual bool makes_unsafe_redirect();
 
   void set_delegate(Delegate* delegate) { delegate_ = delegate; }
 
diff --git a/content/public/test/browser_test_base.cc b/content/public/test/browser_test_base.cc
index bd932fc..da8cc87 100644
--- a/content/public/test/browser_test_base.cc
+++ b/content/public/test/browser_test_base.cc
@@ -483,7 +483,7 @@
 #endif
 }
 
-bool BrowserTestBase::AllowFileAccessFromFiles() const {
+bool BrowserTestBase::AllowFileAccessFromFiles() {
   return true;
 }
 
diff --git a/content/public/test/browser_test_base.h b/content/public/test/browser_test_base.h
index 4f6790f..fa44d7e7 100644
--- a/content/public/test/browser_test_base.h
+++ b/content/public/test/browser_test_base.h
@@ -52,7 +52,7 @@
   virtual void SetUpCommandLine(base::CommandLine* command_line) {}
 
   // Override this to disallow accesses to be production-compatible.
-  virtual bool AllowFileAccessFromFiles() const;
+  virtual bool AllowFileAccessFromFiles();
 
   // Crash the Network Service process. Should only be called when
   // out-of-process Network Service is enabled. Re-applies any added host
diff --git a/content/public/test/navigation_simulator.h b/content/public/test/navigation_simulator.h
index 9315dae7..e3c9688 100644
--- a/content/public/test/navigation_simulator.h
+++ b/content/public/test/navigation_simulator.h
@@ -302,13 +302,13 @@
   // Returns the NavigationHandle associated with the navigation being
   // simulated. It is an error to call this before Start() or after the
   // navigation has finished (successfully or not).
-  virtual NavigationHandle* GetNavigationHandle() const = 0;
+  virtual NavigationHandle* GetNavigationHandle() = 0;
 
   // Returns the GlobalRequestID for the simulated navigation request. Can be
   // invoked after the navigation has completed. It is an error to call this
   // before the simulated navigation has completed its WillProcessResponse
   // callback.
-  virtual GlobalRequestID GetGlobalRequestID() const = 0;
+  virtual GlobalRequestID GetGlobalRequestID() = 0;
 
  private:
   // This interface should only be implemented inside content.
diff --git a/content/public/test/test_web_ui_data_source.cc b/content/public/test/test_web_ui_data_source.cc
index dd23163..d0ca2658 100644
--- a/content/public/test/test_web_ui_data_source.cc
+++ b/content/public/test/test_web_ui_data_source.cc
@@ -36,11 +36,11 @@
 
   ~TestWebUIDataSourceImpl() override {}
 
-  const base::DictionaryValue* GetLocalizedStrings() const override {
+  const base::DictionaryValue* GetLocalizedStrings() override {
     return source_->GetLocalizedStrings();
   }
 
-  const ui::TemplateReplacements* GetReplacements() const override {
+  const ui::TemplateReplacements* GetReplacements() override {
     return source_->GetReplacements();
   }
 
diff --git a/content/public/test/test_web_ui_data_source.h b/content/public/test/test_web_ui_data_source.h
index 51cd1737..8874545 100644
--- a/content/public/test/test_web_ui_data_source.h
+++ b/content/public/test/test_web_ui_data_source.h
@@ -26,9 +26,9 @@
 
   virtual ~TestWebUIDataSource() = default;
 
-  virtual const base::DictionaryValue* GetLocalizedStrings() const = 0;
+  virtual const base::DictionaryValue* GetLocalizedStrings() = 0;
 
-  virtual const ui::TemplateReplacements* GetReplacements() const = 0;
+  virtual const ui::TemplateReplacements* GetReplacements() = 0;
 
   virtual WebUIDataSource* GetWebUIDataSource() = 0;
 };
diff --git a/content/public/test/url_loader_interceptor.cc b/content/public/test/url_loader_interceptor.cc
index c40bc0a..9de8415 100644
--- a/content/public/test/url_loader_interceptor.cc
+++ b/content/public/test/url_loader_interceptor.cc
@@ -76,8 +76,10 @@
     if (base::FeatureList::IsEnabled(network::features::kNetworkService)) {
       URLLoaderFactoryGetter::SetGetNetworkFactoryCallbackForTesting(
           URLLoaderFactoryGetter::GetNetworkFactoryCallback());
-      NavigationURLLoaderImpl::SetURLLoaderFactoryInterceptorForTesting(
-          NavigationURLLoaderImpl::URLLoaderFactoryInterceptor());
+      if (!NavigationURLLoaderImpl::IsNavigationLoaderOnUIEnabled()) {
+        NavigationURLLoaderImpl::SetURLLoaderFactoryInterceptorForTesting(
+            NavigationURLLoaderImpl::URLLoaderFactoryInterceptor());
+      }
     } else {
       NavigationURLLoaderImpl::SetBeginNavigationInterceptorForTesting(
           NavigationURLLoaderImpl::BeginNavigationInterceptor());
@@ -403,6 +405,13 @@
               &URLLoaderInterceptor::GetURLLoaderFactoryForBrowserProcess,
               base::Unretained(this)));
 
+  if (NavigationURLLoaderImpl::IsNavigationLoaderOnUIEnabled()) {
+    NavigationURLLoaderImpl::SetURLLoaderFactoryInterceptorForTesting(
+        base::BindRepeating(
+            &URLLoaderInterceptor::InterceptNavigationRequestCallback,
+            base::Unretained(this)));
+  }
+
   if (BrowserThread::IsThreadInitialized(BrowserThread::IO)) {
     if (use_runloop_) {
       base::RunLoop run_loop;
@@ -444,6 +453,11 @@
       SetGetURLLoaderFactoryForBrowserProcessCallbackForTesting(
           StoragePartitionImpl::CreateNetworkFactoryCallback());
 
+  if (NavigationURLLoaderImpl::IsNavigationLoaderOnUIEnabled()) {
+    NavigationURLLoaderImpl::SetURLLoaderFactoryInterceptorForTesting(
+        NavigationURLLoaderImpl::URLLoaderFactoryInterceptor());
+  }
+
   if (use_runloop_) {
     base::RunLoop run_loop;
     base::PostTaskWithTraits(
@@ -553,6 +567,20 @@
   return loader_factory;
 }
 
+void URLLoaderInterceptor::InterceptNavigationRequestCallback(
+    network::mojom::URLLoaderFactoryRequest* request) {
+  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+  auto proxied_request = std::move(*request);
+  network::mojom::URLLoaderFactoryPtr target_factory;
+  *request = mojo::MakeRequest(&target_factory);
+
+  navigation_wrappers_.emplace(
+      std::make_unique<URLLoaderFactoryNavigationWrapper>(
+          std::move(proxied_request), std::move(target_factory),
+          io_thread_.get()));
+}
+
 bool URLLoaderInterceptor::Intercept(RequestParams* params) {
   if (callback_.Run(params))
     return true;
@@ -589,10 +617,12 @@
             &URLLoaderInterceptor::IOState::GetNetworkFactoryCallback,
             base::Unretained(this)));
 
-    NavigationURLLoaderImpl::SetURLLoaderFactoryInterceptorForTesting(
-        base::BindRepeating(
-            &URLLoaderInterceptor::IOState::InterceptNavigationRequestCallback,
-            base::Unretained(this)));
+    if (!NavigationURLLoaderImpl::IsNavigationLoaderOnUIEnabled()) {
+      NavigationURLLoaderImpl::SetURLLoaderFactoryInterceptorForTesting(
+          base::BindRepeating(&URLLoaderInterceptor::IOState::
+                                  InterceptNavigationRequestCallback,
+                              base::Unretained(this)));
+    }
   } else {
     NavigationURLLoaderImpl::SetBeginNavigationInterceptorForTesting(
         base::BindRepeating(
diff --git a/content/public/test/url_loader_interceptor.h b/content/public/test/url_loader_interceptor.h
index 5091743..eab5cef 100644
--- a/content/public/test/url_loader_interceptor.h
+++ b/content/public/test/url_loader_interceptor.h
@@ -158,6 +158,12 @@
       network::mojom::URLLoaderClientPtr* client,
       const net::MutableNetworkTrafficAnnotationTag& traffic_annotation);
 
+  // Callback on UI thread whenever NavigationURLLoaderImpl needs a
+  // URLLoaderFactory with a network::mojom::TrustedURLLoaderHeaderClient or
+  // for a non-network-service scheme.
+  void InterceptNavigationRequestCallback(
+      network::mojom::URLLoaderFactoryRequest* request);
+
   // Attempts to intercept the given request, returning true if it was
   // intercepted.
   bool Intercept(RequestParams* params);
@@ -174,6 +180,9 @@
   std::set<std::unique_ptr<BrowserProcessWrapper>>
       browser_process_interceptors_;
 
+  std::set<std::unique_ptr<URLLoaderFactoryNavigationWrapper>>
+      navigation_wrappers_;
+
   DISALLOW_COPY_AND_ASSIGN(URLLoaderInterceptor);
 };
 
diff --git a/content/public/test/web_contents_tester.h b/content/public/test/web_contents_tester.h
index 411e9188..60f5472 100644
--- a/content/public/test/web_contents_tester.h
+++ b/content/public/test/web_contents_tester.h
@@ -122,10 +122,10 @@
 
   // Returns headers that were passed in the previous SaveFrameWithHeaders(...)
   // call.
-  virtual const std::string& GetSaveFrameHeaders() const = 0;
+  virtual const std::string& GetSaveFrameHeaders() = 0;
 
   // Returns the suggested file name passed in the SaveFrameWithHeaders call.
-  virtual const base::string16& GetSuggestedFileName() const = 0;
+  virtual const base::string16& GetSuggestedFileName() = 0;
 
   // Returns whether a download request triggered via DownloadImage() is in
   // progress for |url|.
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn
index a420b10..295b0bd2 100644
--- a/content/renderer/BUILD.gn
+++ b/content/renderer/BUILD.gn
@@ -220,8 +220,6 @@
     "media/stream/media_stream_renderer_factory_impl.h",
     "media/stream/processed_local_audio_source.cc",
     "media/stream/processed_local_audio_source.h",
-    "media/stream/remote_media_stream_track_adapter.cc",
-    "media/stream/remote_media_stream_track_adapter.h",
     "media/stream/track_audio_renderer.cc",
     "media/stream/track_audio_renderer.h",
     "media/stream/user_media_client_impl.cc",
diff --git a/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.cc b/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.cc
index dd1cbcf5..a25e8cb1 100644
--- a/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.cc
+++ b/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.cc
@@ -258,17 +258,6 @@
                               .video_encode_accelerator_supported_profiles));
 }
 
-void GpuVideoAcceleratorFactoriesImpl::SignalSyncToken(
-    const gpu::SyncToken& sync_token,
-    base::OnceClosure callback) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  if (CheckContextLost())
-    return;
-
-  context_provider_->ContextSupport()->SignalSyncToken(sync_token,
-                                                       std::move(callback));
-}
-
 std::unique_ptr<gfx::GpuMemoryBuffer>
 GpuVideoAcceleratorFactoriesImpl::CreateGpuMemoryBuffer(
     const gfx::Size& size,
diff --git a/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.h b/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.h
index 0168d66..82b83db 100644
--- a/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.h
+++ b/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.h
@@ -79,8 +79,6 @@
       const media::VideoDecoderConfig& config) override;
   std::unique_ptr<media::VideoEncodeAccelerator> CreateVideoEncodeAccelerator()
       override;
-  void SignalSyncToken(const gpu::SyncToken& sync_token,
-                       base::OnceClosure callback) override;
 
   std::unique_ptr<gfx::GpuMemoryBuffer> CreateGpuMemoryBuffer(
       const gfx::Size& size,
diff --git a/content/renderer/media/stream/media_stream_center.cc b/content/renderer/media/stream/media_stream_center.cc
index cb9673a..d7a8670 100644
--- a/content/renderer/media/stream/media_stream_center.cc
+++ b/content/renderer/media/stream/media_stream_center.cc
@@ -9,18 +9,12 @@
 #include <string>
 #include <vector>
 
-#include "base/command_line.h"
 #include "base/logging.h"
-#include "content/public/common/content_switches.h"
-#include "content/public/renderer/render_thread.h"
 #include "content/renderer/media/stream/processed_local_audio_source.h"
 #include "media/base/sample_format.h"
 #include "third_party/blink/public/platform/modules/mediastream/media_stream_audio_track.h"
-#include "third_party/blink/public/platform/modules/mediastream/web_media_stream_audio_sink.h"
 #include "third_party/blink/public/platform/modules/mediastream/web_platform_media_stream_source.h"
 #include "third_party/blink/public/platform/modules/mediastream/webaudio_media_stream_source.h"
-#include "third_party/blink/public/platform/web_media_constraints.h"
-#include "third_party/blink/public/platform/web_media_stream.h"
 #include "third_party/blink/public/platform/web_media_stream_source.h"
 #include "third_party/blink/public/platform/web_media_stream_track.h"
 #include "third_party/blink/public/platform/web_vector.h"
diff --git a/content/renderer/media/stream/media_stream_center.h b/content/renderer/media/stream/media_stream_center.h
index c83a5cd..7dd59df 100644
--- a/content/renderer/media/stream/media_stream_center.h
+++ b/content/renderer/media/stream/media_stream_center.h
@@ -5,11 +5,11 @@
 #ifndef CONTENT_RENDERER_MEDIA_STREAM_MEDIA_STREAM_CENTER_H_
 #define CONTENT_RENDERER_MEDIA_STREAM_MEDIA_STREAM_CENTER_H_
 
+#include "third_party/blink/public/platform/web_media_stream_center.h"
+
 #include "base/macros.h"
 #include "base/single_thread_task_runner.h"
 #include "content/common/content_export.h"
-#include "third_party/blink/public/platform/web_media_stream.h"
-#include "third_party/blink/public/platform/web_media_stream_center.h"
 #include "third_party/blink/public/platform/web_media_stream_track.h"
 
 namespace blink {
diff --git a/content/renderer/media/stream/remote_media_stream_track_adapter.cc b/content/renderer/media/stream/remote_media_stream_track_adapter.cc
deleted file mode 100644
index 48f2070..0000000
--- a/content/renderer/media/stream/remote_media_stream_track_adapter.cc
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright (c) 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/media/stream/remote_media_stream_track_adapter.h"
-
-#include "media/base/limits.h"
-#include "third_party/blink/public/platform/modules/mediastream/media_stream_audio_source.h"
-#include "third_party/blink/public/platform/modules/webrtc/peer_connection_remote_audio_source.h"
-#include "third_party/blink/public/platform/modules/webrtc/track_observer.h"
-#include "third_party/blink/public/web/modules/mediastream/media_stream_video_track.h"
-#include "third_party/blink/public/web/modules/peerconnection/media_stream_remote_video_source.h"
-
-namespace content {
-
-RemoteVideoTrackAdapter::RemoteVideoTrackAdapter(
-    const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
-    webrtc::VideoTrackInterface* webrtc_track)
-    : RemoteMediaStreamTrackAdapter(main_thread, webrtc_track) {
-  std::unique_ptr<blink::TrackObserver> observer(
-      new blink::TrackObserver(main_thread, observed_track().get()));
-  // Here, we use base::Unretained() to avoid a circular reference.
-  web_initialize_ = base::Bind(
-      &RemoteVideoTrackAdapter::InitializeWebVideoTrack, base::Unretained(this),
-      base::Passed(&observer), observed_track()->enabled());
-}
-
-RemoteVideoTrackAdapter::~RemoteVideoTrackAdapter() {
-  DCHECK(main_thread_->BelongsToCurrentThread());
-  if (initialized()) {
-    static_cast<blink::MediaStreamRemoteVideoSource*>(
-        web_track()->Source().GetPlatformSource())
-        ->OnSourceTerminated();
-  }
-}
-
-void RemoteVideoTrackAdapter::InitializeWebVideoTrack(
-    std::unique_ptr<blink::TrackObserver> observer,
-    bool enabled) {
-  DCHECK(main_thread_->BelongsToCurrentThread());
-  auto video_source_ptr = std::make_unique<blink::MediaStreamRemoteVideoSource>(
-      std::move(observer));
-  blink::MediaStreamRemoteVideoSource* video_source = video_source_ptr.get();
-  InitializeWebTrack(blink::WebMediaStreamSource::kTypeVideo);
-  web_track()->Source().SetPlatformSource(std::move(video_source_ptr));
-
-  blink::WebMediaStreamSource::Capabilities capabilities;
-  capabilities.device_id = blink::WebString::FromUTF8(id());
-  web_track()->Source().SetCapabilities(capabilities);
-
-  web_track()->SetPlatformTrack(std::make_unique<blink::MediaStreamVideoTrack>(
-      video_source, blink::MediaStreamVideoSource::ConstraintsCallback(),
-      enabled));
-}
-
-RemoteAudioTrackAdapter::RemoteAudioTrackAdapter(
-    const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
-    webrtc::AudioTrackInterface* webrtc_track)
-    : RemoteMediaStreamTrackAdapter(main_thread, webrtc_track),
-#if DCHECK_IS_ON()
-      unregistered_(false),
-#endif
-      state_(observed_track()->state()) {
-  // TODO(tommi): Use blink::TrackObserver instead.
-  observed_track()->RegisterObserver(this);
-  // Here, we use base::Unretained() to avoid a circular reference.
-  web_initialize_ =
-      base::Bind(&RemoteAudioTrackAdapter::InitializeWebAudioTrack,
-                 base::Unretained(this), main_thread);
-}
-
-RemoteAudioTrackAdapter::~RemoteAudioTrackAdapter() {
-#if DCHECK_IS_ON()
-  DCHECK(unregistered_);
-#endif
-}
-
-void RemoteAudioTrackAdapter::Unregister() {
-#if DCHECK_IS_ON()
-  DCHECK(!unregistered_);
-  unregistered_ = true;
-#endif
-  observed_track()->UnregisterObserver(this);
-}
-
-void RemoteAudioTrackAdapter::InitializeWebAudioTrack(
-    const scoped_refptr<base::SingleThreadTaskRunner>& main_thread) {
-  InitializeWebTrack(blink::WebMediaStreamSource::kTypeAudio);
-
-  blink::MediaStreamAudioSource* const source =
-      new blink::PeerConnectionRemoteAudioSource(observed_track().get(),
-                                                 main_thread);
-  web_track()->Source().SetPlatformSource(
-      base::WrapUnique(source));  // Takes ownership.
-
-  blink::WebMediaStreamSource::Capabilities capabilities;
-  capabilities.device_id = blink::WebString::FromUTF8(id());
-  capabilities.echo_cancellation = std::vector<bool>({false});
-  capabilities.auto_gain_control = std::vector<bool>({false});
-  capabilities.noise_suppression = std::vector<bool>({false});
-  capabilities.sample_size = {
-      media::SampleFormatToBitsPerChannel(media::kSampleFormatS16),  // min
-      media::SampleFormatToBitsPerChannel(media::kSampleFormatS16)   // max
-  };
-  web_track()->Source().SetCapabilities(capabilities);
-
-  source->ConnectToTrack(*(web_track()));
-}
-
-void RemoteAudioTrackAdapter::OnChanged() {
-  main_thread_->PostTask(
-      FROM_HERE, base::BindOnce(&RemoteAudioTrackAdapter::OnChangedOnMainThread,
-                                this, observed_track()->state()));
-}
-
-void RemoteAudioTrackAdapter::OnChangedOnMainThread(
-    webrtc::MediaStreamTrackInterface::TrackState state) {
-  DCHECK(main_thread_->BelongsToCurrentThread());
-
-  if (state == state_ || !initialized())
-    return;
-
-  state_ = state;
-
-  switch (state) {
-    case webrtc::MediaStreamTrackInterface::kLive:
-      web_track()->Source().SetReadyState(
-          blink::WebMediaStreamSource::kReadyStateLive);
-      break;
-    case webrtc::MediaStreamTrackInterface::kEnded:
-      web_track()->Source().SetReadyState(
-          blink::WebMediaStreamSource::kReadyStateEnded);
-      break;
-    default:
-      NOTREACHED();
-      break;
-  }
-}
-
-}  // namespace content
diff --git a/content/renderer/media/stream/remote_media_stream_track_adapter.h b/content/renderer/media/stream/remote_media_stream_track_adapter.h
deleted file mode 100644
index 1328ff5..0000000
--- a/content/renderer/media/stream/remote_media_stream_track_adapter.h
+++ /dev/null
@@ -1,155 +0,0 @@
-// Copyright (c) 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_MEDIA_STREAM_REMOTE_MEDIA_STREAM_TRACK_ADAPTER_H_
-#define CONTENT_RENDERER_MEDIA_STREAM_REMOTE_MEDIA_STREAM_TRACK_ADAPTER_H_
-
-#include <string>
-
-#include "base/bind.h"
-#include "base/callback_forward.h"
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/single_thread_task_runner.h"
-#include "third_party/blink/public/platform/web_media_stream_source.h"
-#include "third_party/blink/public/platform/web_media_stream_track.h"
-#include "third_party/webrtc/api/media_stream_interface.h"
-
-namespace blink {
-class TrackObserver;
-}
-
-namespace content {
-
-// Base class used for mapping between webrtc and blink MediaStream tracks.
-// RemoteMediaStreamImpl has a RemoteMediaStreamTrackAdapter per remote audio
-// (RemoteAudioTrackAdapter) and video (RemoteVideoTrackAdapter) track.
-template <typename WebRtcMediaStreamTrackType>
-class RemoteMediaStreamTrackAdapter
-    : public base::RefCountedThreadSafe<
-          RemoteMediaStreamTrackAdapter<WebRtcMediaStreamTrackType>> {
- public:
-  RemoteMediaStreamTrackAdapter(
-      const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
-      WebRtcMediaStreamTrackType* webrtc_track)
-      : main_thread_(main_thread),
-        webrtc_track_(webrtc_track),
-        id_(webrtc_track->id()) {}
-
-  const scoped_refptr<WebRtcMediaStreamTrackType>& observed_track() {
-    return webrtc_track_;
-  }
-
-  blink::WebMediaStreamTrack* web_track() {
-    DCHECK(main_thread_->BelongsToCurrentThread());
-    DCHECK(!web_track_.IsNull());
-    return &web_track_;
-  }
-
-  const std::string& id() const { return id_; }
-
-  bool initialized() const {
-    DCHECK(main_thread_->BelongsToCurrentThread());
-    return !web_track_.IsNull();
-  }
-
-  void Initialize() {
-    DCHECK(main_thread_->BelongsToCurrentThread());
-    DCHECK(!initialized());
-    web_initialize_.Run();
-    web_initialize_.Reset();
-    DCHECK(initialized());
-  }
-
- protected:
-  friend class base::RefCountedThreadSafe<
-      RemoteMediaStreamTrackAdapter<WebRtcMediaStreamTrackType>>;
-
-  virtual ~RemoteMediaStreamTrackAdapter() {
-    DCHECK(main_thread_->BelongsToCurrentThread());
-  }
-
-  void InitializeWebTrack(blink::WebMediaStreamSource::Type type) {
-    DCHECK(main_thread_->BelongsToCurrentThread());
-    DCHECK(web_track_.IsNull());
-
-    blink::WebString web_track_id(blink::WebString::FromUTF8(id_));
-    blink::WebMediaStreamSource web_source;
-    web_source.Initialize(web_track_id, type, web_track_id, true /* remote */);
-    web_track_.Initialize(web_track_id, web_source);
-    DCHECK(!web_track_.IsNull());
-  }
-
-  const scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
-  // This callback will be run when Initialize() is called and then freed.
-  // The callback is used by derived classes to bind objects that need to be
-  // instantiated and initialized on the signaling thread but then moved to
-  // and used on the main thread when initializing the web object(s).
-  base::Callback<void()> web_initialize_;
-
- private:
-  const scoped_refptr<WebRtcMediaStreamTrackType> webrtc_track_;
-  blink::WebMediaStreamTrack web_track_;
-  // const copy of the webrtc track id that allows us to check it from both the
-  // main and signaling threads without incurring a synchronous thread hop.
-  const std::string id_;
-
-  DISALLOW_COPY_AND_ASSIGN(RemoteMediaStreamTrackAdapter);
-};
-
-class RemoteVideoTrackAdapter
-    : public RemoteMediaStreamTrackAdapter<webrtc::VideoTrackInterface> {
- public:
-  // Called on the signaling thread.
-  RemoteVideoTrackAdapter(
-      const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
-      webrtc::VideoTrackInterface* webrtc_track);
-
- protected:
-  ~RemoteVideoTrackAdapter() override;
-
- private:
-  void InitializeWebVideoTrack(std::unique_ptr<blink::TrackObserver> observer,
-                               bool enabled);
-};
-
-// RemoteAudioTrackAdapter is responsible for listening on state
-// change notifications on a remote webrtc audio MediaStreamTracks and notify
-// Blink.
-class RemoteAudioTrackAdapter
-    : public RemoteMediaStreamTrackAdapter<webrtc::AudioTrackInterface>,
-      public webrtc::ObserverInterface {
- public:
-  // Called on the signaling thread.
-  RemoteAudioTrackAdapter(
-      const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
-      webrtc::AudioTrackInterface* webrtc_track);
-
-  void Unregister();
-
- protected:
-  ~RemoteAudioTrackAdapter() override;
-
- private:
-  void InitializeWebAudioTrack(
-      const scoped_refptr<base::SingleThreadTaskRunner>& main_thread);
-
-  // webrtc::ObserverInterface implementation.
-  void OnChanged() override;
-
-  void OnChangedOnMainThread(
-      webrtc::MediaStreamTrackInterface::TrackState state);
-
-#if DCHECK_IS_ON()
-  bool unregistered_;
-#endif
-
-  webrtc::MediaStreamTrackInterface::TrackState state_;
-
-  DISALLOW_COPY_AND_ASSIGN(RemoteAudioTrackAdapter);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_MEDIA_STREAM_REMOTE_MEDIA_STREAM_TRACK_ADAPTER_H_
diff --git a/content/renderer/media/webrtc/webrtc_media_stream_track_adapter.cc b/content/renderer/media/webrtc/webrtc_media_stream_track_adapter.cc
index 6858792..38905cc 100644
--- a/content/renderer/media/webrtc/webrtc_media_stream_track_adapter.cc
+++ b/content/renderer/media/webrtc/webrtc_media_stream_track_adapter.cc
@@ -209,7 +209,8 @@
   DCHECK_EQ(webrtc_audio_track->kind(),
             webrtc::MediaStreamTrackInterface::kAudioKind);
   remote_audio_track_adapter_ =
-      new RemoteAudioTrackAdapter(main_thread_, webrtc_audio_track.get());
+      base::MakeRefCounted<blink::RemoteAudioTrackAdapter>(
+          main_thread_, webrtc_audio_track.get());
   webrtc_track_ = webrtc_audio_track;
   // Set the initial volume to zero. When the track is put in an audio tag for
   // playout, its volume is set to that of the tag. Without this, we could end
@@ -231,7 +232,8 @@
   DCHECK_EQ(webrtc_video_track->kind(),
             webrtc::MediaStreamTrackInterface::kVideoKind);
   remote_video_track_adapter_ =
-      new RemoteVideoTrackAdapter(main_thread_, webrtc_video_track.get());
+      base::MakeRefCounted<blink::RemoteVideoTrackAdapter>(
+          main_thread_, webrtc_video_track.get());
   webrtc_track_ = webrtc_video_track;
   remote_track_can_complete_initialization_.Signal();
   main_thread_->PostTask(
diff --git a/content/renderer/media/webrtc/webrtc_media_stream_track_adapter.h b/content/renderer/media/webrtc/webrtc_media_stream_track_adapter.h
index cd8a9c8..361a1811 100644
--- a/content/renderer/media/webrtc/webrtc_media_stream_track_adapter.h
+++ b/content/renderer/media/webrtc/webrtc_media_stream_track_adapter.h
@@ -10,12 +10,12 @@
 #include "base/memory/ref_counted.h"
 #include "base/synchronization/waitable_event.h"
 #include "content/common/content_export.h"
-#include "content/renderer/media/stream/remote_media_stream_track_adapter.h"
 #include "content/renderer/media/webrtc/media_stream_video_webrtc_sink.h"
 #include "content/renderer/media/webrtc/webrtc_audio_sink.h"
 #include "content/renderer/media/webrtc/webrtc_media_stream_track_adapter.h"
 #include "third_party/blink/public/platform/web_media_stream.h"
 #include "third_party/blink/public/platform/web_media_stream_track.h"
+#include "third_party/blink/public/web/modules/mediastream/remote_media_stream_track_adapter.h"
 #include "third_party/webrtc/api/media_stream_interface.h"
 
 namespace content {
@@ -70,10 +70,10 @@
   MediaStreamVideoWebRtcSink* GetLocalTrackVideoSinkForTesting() {
     return local_track_video_sink_.get();
   }
-  RemoteAudioTrackAdapter* GetRemoteAudioTrackAdapterForTesting() {
+  blink::RemoteAudioTrackAdapter* GetRemoteAudioTrackAdapterForTesting() {
     return remote_audio_track_adapter_.get();
   }
-  RemoteVideoTrackAdapter* GetRemoteVideoTrackAdapterForTesting() {
+  blink::RemoteVideoTrackAdapter* GetRemoteVideoTrackAdapterForTesting() {
     return remote_video_track_adapter_.get();
   }
 
@@ -130,8 +130,8 @@
   std::unique_ptr<MediaStreamVideoWebRtcSink> local_track_video_sink_;
   // If the track is remote, an adapter is used that listens to notifications on
   // the remote webrtc track and notifies Blink.
-  scoped_refptr<RemoteAudioTrackAdapter> remote_audio_track_adapter_;
-  scoped_refptr<RemoteVideoTrackAdapter> remote_video_track_adapter_;
+  scoped_refptr<blink::RemoteAudioTrackAdapter> remote_audio_track_adapter_;
+  scoped_refptr<blink::RemoteVideoTrackAdapter> remote_video_track_adapter_;
 
   DISALLOW_COPY_AND_ASSIGN(WebRtcMediaStreamTrackAdapter);
 };
diff --git a/content/shell/BUILD.gn b/content/shell/BUILD.gn
index 6849432..f89f506 100644
--- a/content/shell/BUILD.gn
+++ b/content/shell/BUILD.gn
@@ -7,6 +7,7 @@
 import("//build/config/ui.gni")
 import("//build/config/win/console_app.gni")
 import("//build/config/win/manifest.gni")
+import("//gpu/vulkan/features.gni")
 import("//media/media_options.gni")
 import("//mojo/public/tools/bindings/mojom.gni")
 import("//ppapi/buildflags/buildflags.gni")
@@ -377,6 +378,12 @@
       "//ppapi/shared_impl",
     ]
   }
+  if (enable_vulkan) {
+    deps += [
+      "//gpu/vulkan:test_support",
+      "//gpu/vulkan/init",
+    ]
+  }
   if (mojo_media_host == "browser") {
     deps += [
       "//media/mojo/interfaces:constants",
diff --git a/content/shell/android/linker_test_apk/src/org/chromium/chromium_linker_test_apk/ChromiumLinkerTestActivity.java b/content/shell/android/linker_test_apk/src/org/chromium/chromium_linker_test_apk/ChromiumLinkerTestActivity.java
index c4ace554..76bd136 100644
--- a/content/shell/android/linker_test_apk/src/org/chromium/chromium_linker_test_apk/ChromiumLinkerTestActivity.java
+++ b/content/shell/android/linker_test_apk/src/org/chromium/chromium_linker_test_apk/ChromiumLinkerTestActivity.java
@@ -94,9 +94,6 @@
         // Now, start a new renderer process by creating a new view.
         // This will run the test runner in the renderer process.
 
-        BrowserStartupController.get(LibraryProcessType.PROCESS_BROWSER)
-                .initChromiumBrowserProcessForTests();
-
         LayoutInflater inflater =
                 (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         View view = inflater.inflate(R.layout.test_activity, null);
diff --git a/content/shell/common/shell_content_client.cc b/content/shell/common/shell_content_client.cc
index 013978e..05fa780 100644
--- a/content/shell/common/shell_content_client.cc
+++ b/content/shell/common/shell_content_client.cc
@@ -24,7 +24,7 @@
 
 ShellContentClient::~ShellContentClient() {}
 
-base::string16 ShellContentClient::GetLocalizedString(int message_id) const {
+base::string16 ShellContentClient::GetLocalizedString(int message_id) {
   if (switches::IsRunWebTestsSwitchPresent()) {
     switch (message_id) {
       case IDS_FORM_OTHER_DATE_LABEL:
@@ -48,7 +48,7 @@
 
 base::StringPiece ShellContentClient::GetDataResource(
     int resource_id,
-    ui::ScaleFactor scale_factor) const {
+    ui::ScaleFactor scale_factor) {
   if (switches::IsRunWebTestsSwitchPresent()) {
     switch (resource_id) {
       case IDR_BROKENIMAGE:
@@ -65,21 +65,21 @@
 }
 
 base::RefCountedMemory* ShellContentClient::GetDataResourceBytes(
-    int resource_id) const {
+    int resource_id) {
   return ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytes(
       resource_id);
 }
 
-bool ShellContentClient::IsDataResourceGzipped(int resource_id) const {
+bool ShellContentClient::IsDataResourceGzipped(int resource_id) {
   return ui::ResourceBundle::GetSharedInstance().IsGzipped(resource_id);
 }
 
-gfx::Image& ShellContentClient::GetNativeImageNamed(int resource_id) const {
+gfx::Image& ShellContentClient::GetNativeImageNamed(int resource_id) {
   return ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed(
       resource_id);
 }
 
-base::DictionaryValue ShellContentClient::GetNetLogConstants() const {
+base::DictionaryValue ShellContentClient::GetNetLogConstants() {
   base::DictionaryValue client_constants;
   client_constants.SetString("name", "content_shell");
   client_constants.SetString(
diff --git a/content/shell/common/shell_content_client.h b/content/shell/common/shell_content_client.h
index f56224a5..49c58c1 100644
--- a/content/shell/common/shell_content_client.h
+++ b/content/shell/common/shell_content_client.h
@@ -19,15 +19,13 @@
   ShellContentClient();
   ~ShellContentClient() override;
 
-  base::string16 GetLocalizedString(int message_id) const override;
-  base::StringPiece GetDataResource(
-      int resource_id,
-      ui::ScaleFactor scale_factor) const override;
-  base::RefCountedMemory* GetDataResourceBytes(
-      int resource_id) const override;
-  bool IsDataResourceGzipped(int resource_id) const override;
-  gfx::Image& GetNativeImageNamed(int resource_id) const override;
-  base::DictionaryValue GetNetLogConstants() const override;
+  base::string16 GetLocalizedString(int message_id) override;
+  base::StringPiece GetDataResource(int resource_id,
+                                    ui::ScaleFactor scale_factor) override;
+  base::RefCountedMemory* GetDataResourceBytes(int resource_id) override;
+  bool IsDataResourceGzipped(int resource_id) override;
+  gfx::Image& GetNativeImageNamed(int resource_id) override;
+  base::DictionaryValue GetNetLogConstants() override;
   blink::OriginTrialPolicy* GetOriginTrialPolicy() override;
 
  private:
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 55f2afe3..1d0744d 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -1626,7 +1626,7 @@
     "../browser/memory/test_memory_monitor.cc",
     "../browser/memory/test_memory_monitor.h",
     "../browser/native_file_system/file_system_chooser_unittest.cc",
-    "../browser/native_file_system/native_file_system_file_handle_impl_unittest.cc",
+    "../browser/native_file_system/native_file_system_file_writer_impl_unittest.cc",
     "../browser/native_file_system/native_file_system_handle_base_unittest.cc",
     "../browser/native_file_system/native_file_system_manager_impl_unittest.cc",
     "../browser/net/network_quality_observer_impl_unittest.cc",
@@ -2246,6 +2246,7 @@
   is_linux_without_udev = is_linux && !use_udev
   if (!is_linux_without_udev && !is_android) {
     sources += [
+      "../browser/hid/hid_service_unittest.cc",
       "../browser/webauth/authenticator_impl_unittest.cc",
       "../browser/webauth/authenticator_mojom_traits_unittest.cc",
     ]
@@ -2255,6 +2256,7 @@
       "//device/fido",
       "//device/fido:mocks",
       "//device/fido:test_support",
+      "//services/device/public/cpp/hid:test_support",
     ]
   }
 
diff --git a/content/test/gpu/gpu_tests/test_expectations/screenshot_sync_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/screenshot_sync_expectations.txt
index 0ca4369..8256297 100644
--- a/content/test/gpu/gpu_tests/test_expectations/screenshot_sync_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/screenshot_sync_expectations.txt
@@ -6,6 +6,8 @@
 crbug.com/599776 [ mac intel ] ScreenshotSync_GPURasterWithCanvas [ RetryOnFailure ]
 crbug.com/599776 [ mac intel ] ScreenshotSync_GPURasterWithDivs [ RetryOnFailure ]
 crbug.com/639489 [ win amd-0x6613 ] ScreenshotSync_GPURasterWithDivs [ Failure ]
+crbug.com/978492 [ mac amd ] ScreenshotSync_GPURasterWithDivs [ RetryOnFailure ]
+crbug.com/978492 [ mac amd ] ScreenshotSync_SWRasterWithCanvas [ RetryOnFailure ]
 
 # TODO(kbr): flakily timing out on this configuration.
 crbug.com/648369 [ linux debug intel ] * [ RetryOnFailure ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt
index be0a6a19..b0d53c3 100644
--- a/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt
@@ -1,9 +1,10 @@
 # tags: [ android chromeos linux mac win win10 win7 ]
 # tags: [ debug ]
-# tags: [ intel nvidia qualcomm-adreno-(tm)-418 ]
+# tags: [ intel nvidia qualcomm-adreno-(tm)-418 nvidia-0x1cb3]
 
  # TODO(kbr): flakily timing out on this configuration.
 crbug.com/648369 [ linux debug intel ] TraceTest_* [ RetryOnFailure ]
+crbug.com/978516 [ win10 nvidia-0x1cb3 ] TraceTest_* [ RetryOnFailure ]
 
 # Device traces are not supported on all machines.
 DeviceTraceTest_* [ Skip ]
diff --git a/content/test/navigation_simulator_impl.cc b/content/test/navigation_simulator_impl.cc
index 44e5f00..e45554c 100644
--- a/content/test/navigation_simulator_impl.cc
+++ b/content/test/navigation_simulator_impl.cc
@@ -914,12 +914,12 @@
   return last_throttle_check_result_.value();
 }
 
-NavigationHandleImpl* NavigationSimulatorImpl::GetNavigationHandle() const {
+NavigationHandleImpl* NavigationSimulatorImpl::GetNavigationHandle() {
   CHECK_GE(state_, STARTED);
   return request_->navigation_handle();
 }
 
-content::GlobalRequestID NavigationSimulatorImpl::GetGlobalRequestID() const {
+content::GlobalRequestID NavigationSimulatorImpl::GetGlobalRequestID() {
   CHECK_GT(state_, STARTED) << "The GlobalRequestID is not available until "
                                "after the navigation has completed "
                                "WillProcessResponse";
diff --git a/content/test/navigation_simulator_impl.h b/content/test/navigation_simulator_impl.h
index 2a23e12..e38f9fb 100644
--- a/content/test/navigation_simulator_impl.h
+++ b/content/test/navigation_simulator_impl.h
@@ -97,8 +97,8 @@
   void SetSSLInfo(const net::SSLInfo& ssl_info) override;
 
   NavigationThrottle::ThrottleCheckResult GetLastThrottleCheckResult() override;
-  NavigationHandleImpl* GetNavigationHandle() const override;
-  content::GlobalRequestID GetGlobalRequestID() const override;
+  NavigationHandleImpl* GetNavigationHandle() override;
+  content::GlobalRequestID GetGlobalRequestID() override;
 
   // Additional utilites usable only inside content/.
 
diff --git a/content/test/test_content_client.cc b/content/test/test_content_client.cc
index a266ce2..3b378fe 100644
--- a/content/test/test_content_client.cc
+++ b/content/test/test_content_client.cc
@@ -59,7 +59,7 @@
 
 base::StringPiece TestContentClient::GetDataResource(
     int resource_id,
-    ui::ScaleFactor scale_factor) const {
+    ui::ScaleFactor scale_factor) {
   return ui::ResourceBundle::GetSharedInstance().GetRawDataResourceForScale(
       resource_id, scale_factor);
 }
diff --git a/content/test/test_content_client.h b/content/test/test_content_client.h
index e9c7b870..357bf77c 100644
--- a/content/test/test_content_client.h
+++ b/content/test/test_content_client.h
@@ -20,9 +20,8 @@
   ~TestContentClient() override;
 
   // ContentClient:
-  base::StringPiece GetDataResource(
-      int resource_id,
-      ui::ScaleFactor scale_factor) const override;
+  base::StringPiece GetDataResource(int resource_id,
+                                    ui::ScaleFactor scale_factor) override;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(TestContentClient);
diff --git a/content/test/test_web_contents.cc b/content/test/test_web_contents.cc
index 020ea03e4..c3c728f 100644
--- a/content/test/test_web_contents.cc
+++ b/content/test/test_web_contents.cc
@@ -190,11 +190,11 @@
   rfh->SendNavigateWithParams(&params, was_within_same_document);
 }
 
-const std::string& TestWebContents::GetSaveFrameHeaders() const {
+const std::string& TestWebContents::GetSaveFrameHeaders() {
   return save_frame_headers_;
 }
 
-const base::string16& TestWebContents::GetSuggestedFileName() const {
+const base::string16& TestWebContents::GetSuggestedFileName() {
   return suggested_filename_;
 }
 
diff --git a/content/test/test_web_contents.h b/content/test/test_web_contents.h
index dbc195a8..94270aa 100644
--- a/content/test/test_web_contents.h
+++ b/content/test/test_web_contents.h
@@ -95,8 +95,8 @@
       NavigationHandle* navigation_handle,
       scoped_refptr<net::HttpResponseHeaders> response_headers) override;
   void SetOpener(WebContents* opener) override;
-  const std::string& GetSaveFrameHeaders() const override;
-  const base::string16& GetSuggestedFileName() const override;
+  const std::string& GetSaveFrameHeaders() override;
+  const base::string16& GetSuggestedFileName() override;
   bool HasPendingDownloadImage(const GURL& url) override;
   bool TestDidDownloadImage(
       const GURL& url,
diff --git a/device/fido/bio/enrollment.cc b/device/fido/bio/enrollment.cc
index ccd6803..d749dce 100644
--- a/device/fido/bio/enrollment.cc
+++ b/device/fido/bio/enrollment.cc
@@ -96,7 +96,10 @@
   request.params = cbor::Value::MapValue();
   request.params->emplace(
       static_cast<int>(BioEnrollmentSubCommandParam::kTemplateId),
-      cbor::Value(std::move(id)));
+      std::move(id));
+  request.params->emplace(
+      static_cast<int>(BioEnrollmentSubCommandParam::kTemplateFriendlyName),
+      std::move(name));
   SetPinAuth(&request, token);
   return request;
 }
@@ -122,16 +125,6 @@
 BioEnrollmentRequest::BioEnrollmentRequest(Version v) : version(v) {}
 BioEnrollmentRequest::~BioEnrollmentRequest() = default;
 
-template <typename T>
-static base::Optional<T> ToBioEnrollmentEnum(uint8_t v) {
-  // Check if enum-class is in range...
-  if (v < static_cast<int>(T::kMin) || v > static_cast<int>(T::kMax)) {
-    // ...to avoid UB.
-    return base::nullopt;
-  }
-  return static_cast<T>(v);
-}
-
 // static
 base::Optional<BioEnrollmentResponse> BioEnrollmentResponse::Parse(
     const base::Optional<cbor::Value>& cbor_response) {
@@ -224,7 +217,7 @@
       return base::nullopt;
     }
 
-    std::vector<std::pair<std::vector<uint8_t>, std::string>> enumerated_ids;
+    std::vector<std::pair<std::vector<uint8_t>, std::string>> template_infos;
     for (const auto& bio_template : it->second.GetArray()) {
       if (!bio_template.is_map()) {
         return base::nullopt;
@@ -250,9 +243,9 @@
         }
         name = template_it->second.GetString();
       }
-      enumerated_ids.push_back(std::make_pair(std::move(id), std::move(name)));
+      template_infos.push_back(std::make_pair(std::move(id), std::move(name)));
     }
-    response.enumerated_ids = std::move(enumerated_ids);
+    response.template_infos = std::move(template_infos);
   }
 
   return response;
@@ -267,7 +260,7 @@
          max_samples_for_enroll == r.max_samples_for_enroll &&
          template_id == r.template_id && last_status == r.last_status &&
          remaining_samples == r.remaining_samples &&
-         enumerated_ids == r.enumerated_ids;
+         template_infos == r.template_infos;
 }
 
 std::pair<CtapRequestCommand, base::Optional<cbor::Value>>
diff --git a/device/fido/bio/enrollment.h b/device/fido/bio/enrollment.h
index 9f4160bf..d9a18bc 100644
--- a/device/fido/bio/enrollment.h
+++ b/device/fido/bio/enrollment.h
@@ -96,6 +96,16 @@
   kMax = kNoUserPresenceTransition
 };
 
+template <typename T>
+static base::Optional<T> ToBioEnrollmentEnum(uint8_t v) {
+  // Check if enum-class is in range...
+  if (v < static_cast<int>(T::kMin) || v > static_cast<int>(T::kMax)) {
+    // ...to avoid possible undefined behavior (casting from int to enum).
+    return base::nullopt;
+  }
+  return static_cast<T>(v);
+}
+
 struct BioEnrollmentRequest {
   enum Version {
     kDefault,
@@ -156,7 +166,7 @@
   base::Optional<BioEnrollmentSampleStatus> last_status;
   base::Optional<uint8_t> remaining_samples;
   base::Optional<std::vector<std::pair<std::vector<uint8_t>, std::string>>>
-      enumerated_ids;
+      template_infos;
 };
 
 COMPONENT_EXPORT(DEVICE_FIDO)
diff --git a/device/fido/bio/enrollment_handler.cc b/device/fido/bio/enrollment_handler.cc
index 97f9b4b..46d4531 100644
--- a/device/fido/bio/enrollment_handler.cc
+++ b/device/fido/bio/enrollment_handler.cc
@@ -245,8 +245,8 @@
     std::move(callback).Run(code, base::nullopt);
     return;
   }
-  if (!response || !response->enumerated_ids) {
-    // Response must have enumerated_ids.
+  if (!response || !response->template_infos) {
+    // Response must have template_infos.
     std::move(callback).Run(CtapDeviceResponseCode::kCtap2ErrOther,
                             base::nullopt);
     return;
diff --git a/device/fido/bio/enrollment_handler_unittest.cc b/device/fido/bio/enrollment_handler_unittest.cc
index 7522235..add0c03 100644
--- a/device/fido/bio/enrollment_handler_unittest.cc
+++ b/device/fido/bio/enrollment_handler_unittest.cc
@@ -68,17 +68,12 @@
   cb.WaitForCallback();
 
   // Operation was successful.
-  auto result = cb.TakeResult();
-  EXPECT_EQ(std::get<0>(result), CtapDeviceResponseCode::kSuccess);
-
-  // Result is valid.
-  auto v = std::move(std::get<1>(result));
-  EXPECT_TRUE(v);
+  EXPECT_EQ(cb.status(), CtapDeviceResponseCode::kSuccess);
 
   // Result is correct.
   BioEnrollmentResponse expected;
   expected.modality = BioEnrollmentModality::kFingerprint;
-  EXPECT_EQ(v, expected);
+  EXPECT_EQ(cb.value(), expected);
 }
 
 // Tests getting authenticator modality without pin auth.
@@ -98,17 +93,28 @@
   handler->GetSensorInfo(cb.callback());
   cb.WaitForCallback();
 
-  auto result = cb.TakeResult();
-  EXPECT_EQ(std::get<0>(result), CtapDeviceResponseCode::kSuccess);
-
-  auto v = std::move(std::get<1>(result));
-  EXPECT_TRUE(v);
+  EXPECT_EQ(cb.status(), CtapDeviceResponseCode::kSuccess);
 
   BioEnrollmentResponse expected;
   expected.modality = BioEnrollmentModality::kFingerprint;
   expected.fingerprint_kind = BioEnrollmentFingerprintKind::kTouch;
-  expected.max_samples_for_enroll = 7;
-  EXPECT_EQ(v, expected);
+  expected.max_samples_for_enroll = 4;
+  EXPECT_EQ(cb.value(), expected);
+}
+
+// Tests enrollment handler PIN soft block.
+TEST_F(BioEnrollmentHandlerTest, SoftPINBlock) {
+  VirtualCtap2Device::Config config;
+  config.pin_support = true;
+  config.bio_enrollment_preview_support = true;
+
+  virtual_device_factory_.mutable_state()->pin = "1234";
+  virtual_device_factory_.SetCtap2Config(config);
+
+  auto handler = MakeHandler();
+  error_callback_.WaitForCallback();
+
+  EXPECT_EQ(error_callback_.value(), FidoReturnCode::kSoftPINBlock);
 }
 
 // Tests bio enrollment commands against an authenticator lacking support.
@@ -143,13 +149,77 @@
   cb.WaitForCallback();
   EXPECT_EQ(cb.status(), CtapDeviceResponseCode::kSuccess);
 
-  auto v = std::move(std::get<1>(cb.TakeResult()));
-  EXPECT_TRUE(v);
-
   BioEnrollmentResponse expected;
   expected.last_status = BioEnrollmentSampleStatus::kGood;
   expected.remaining_samples = 0;
-  EXPECT_EQ(v, expected);
+  EXPECT_EQ(cb.value(), expected);
+}
+
+// Tests enrolling multiple fingerprints.
+TEST_F(BioEnrollmentHandlerTest, EnrollMultiple) {
+  VirtualCtap2Device::Config config;
+  config.pin_support = true;
+  config.bio_enrollment_preview_support = true;
+
+  virtual_device_factory_.SetCtap2Config(config);
+
+  auto handler = MakeHandler();
+  ready_callback_.WaitForCallback();
+
+  // Multiple enrollments
+  for (auto i = 0; i < 4; i++) {
+    test::StatusAndValueCallbackReceiver<CtapDeviceResponseCode,
+                                         base::Optional<BioEnrollmentResponse>>
+        cb;
+    handler->EnrollTemplate(cb.callback());
+
+    cb.WaitForCallback();
+    EXPECT_EQ(cb.status(), CtapDeviceResponseCode::kSuccess);
+  }
+
+  // Enumerate to check enrollments.
+  test::StatusAndValueCallbackReceiver<CtapDeviceResponseCode,
+                                       base::Optional<BioEnrollmentResponse>>
+      cb;
+  handler->EnumerateTemplates(cb.callback());
+
+  cb.WaitForCallback();
+  EXPECT_EQ(cb.status(), CtapDeviceResponseCode::kSuccess);
+
+  BioEnrollmentResponse expected;
+  expected.template_infos =
+      std::vector<std::pair<std::vector<uint8_t>, std::string>>{
+          {{1}, "Template1"},
+          {{2}, "Template2"},
+          {{3}, "Template3"},
+          {{4}, "Template4"}};
+  EXPECT_EQ(cb.value(), expected);
+}
+
+// Tests enrolling beyond maximum capacity.
+TEST_F(BioEnrollmentHandlerTest, EnrollMax) {
+  VirtualCtap2Device::Config config;
+  config.pin_support = true;
+  config.bio_enrollment_preview_support = true;
+
+  virtual_device_factory_.SetCtap2Config(config);
+
+  auto handler = MakeHandler();
+  ready_callback_.WaitForCallback();
+
+  // Enroll until full.
+  auto status = CtapDeviceResponseCode::kSuccess;
+  while (status == CtapDeviceResponseCode::kSuccess) {
+    test::StatusAndValueCallbackReceiver<CtapDeviceResponseCode,
+                                         base::Optional<BioEnrollmentResponse>>
+        cb;
+    handler->EnrollTemplate(cb.callback());
+
+    cb.WaitForCallback();
+    status = cb.status();
+  }
+
+  EXPECT_EQ(status, CtapDeviceResponseCode::kCtap2ErrKeyStoreFull);
 }
 
 // Tests cancelling fingerprint without an ongoing enrollment.
@@ -170,8 +240,8 @@
   EXPECT_EQ(cb.value(), CtapDeviceResponseCode::kSuccess);
 }
 
-// Tests enumerating enrollments expecting a list of size 1.
-TEST_F(BioEnrollmentHandlerTest, Enumerate) {
+// Tests enumerating with no enrollments.
+TEST_F(BioEnrollmentHandlerTest, EnumerateNone) {
   VirtualCtap2Device::Config config;
   config.pin_support = true;
   config.bio_enrollment_preview_support = true;
@@ -187,16 +257,43 @@
   handler->EnumerateTemplates(cb.callback());
 
   cb.WaitForCallback();
-  EXPECT_EQ(cb.status(), CtapDeviceResponseCode::kSuccess);
+  EXPECT_EQ(cb.status(), CtapDeviceResponseCode::kCtap2ErrInvalidOption);
+}
 
-  auto v = std::move(std::get<1>(cb.TakeResult()));
-  EXPECT_TRUE(v);
+// Tests enumerating with one enrollment.
+TEST_F(BioEnrollmentHandlerTest, EnumerateOne) {
+  VirtualCtap2Device::Config config;
+  config.pin_support = true;
+  config.bio_enrollment_preview_support = true;
+
+  virtual_device_factory_.SetCtap2Config(config);
+
+  auto handler = MakeHandler();
+  ready_callback_.WaitForCallback();
+
+  // Enroll - skip response validation
+  test::StatusAndValueCallbackReceiver<CtapDeviceResponseCode,
+                                       base::Optional<BioEnrollmentResponse>>
+      cb0;
+  handler->EnrollTemplate(cb0.callback());
+
+  cb0.WaitForCallback();
+  EXPECT_EQ(cb0.status(), CtapDeviceResponseCode::kSuccess);
+
+  // Enumerate
+  test::StatusAndValueCallbackReceiver<CtapDeviceResponseCode,
+                                       base::Optional<BioEnrollmentResponse>>
+      cb1;
+  handler->EnumerateTemplates(cb1.callback());
+
+  cb1.WaitForCallback();
+  EXPECT_EQ(cb1.status(), CtapDeviceResponseCode::kSuccess);
 
   BioEnrollmentResponse expected;
-  expected.enumerated_ids =
+  expected.template_infos =
       std::vector<std::pair<std::vector<uint8_t>, std::string>>{
-          {{0, 0, 0, 1}, "Template0001"}};
-  EXPECT_EQ(v, expected);
+          {{1}, "Template1"}};
+  EXPECT_EQ(cb1.value(), expected);
 }
 
 // Tests renaming an enrollment (success and failure).
@@ -210,19 +307,43 @@
   auto handler = MakeHandler();
   ready_callback_.WaitForCallback();
 
-  // Rename existing enrollment.
+  // Rename non-existent enrollment.
   test::ValueCallbackReceiver<CtapDeviceResponseCode> cb0;
-  handler->RenameTemplate({0, 0, 0, 1}, "OtherFingerprint1", cb0.callback());
+  handler->RenameTemplate({1}, "OtherFingerprint1", cb0.callback());
 
   cb0.WaitForCallback();
-  EXPECT_EQ(cb0.value(), CtapDeviceResponseCode::kSuccess);
+  EXPECT_EQ(cb0.value(), CtapDeviceResponseCode::kCtap2ErrInvalidOption);
 
-  // Rename non-existent enrollment.
-  test::ValueCallbackReceiver<CtapDeviceResponseCode> cb1;
-  handler->RenameTemplate({0, 0, 0, 2}, "OtherFingerprint2", cb1.callback());
+  // Enroll - skip response validation.
+  test::StatusAndValueCallbackReceiver<CtapDeviceResponseCode,
+                                       base::Optional<BioEnrollmentResponse>>
+      cb1;
+  handler->EnrollTemplate(cb1.callback());
 
   cb1.WaitForCallback();
-  EXPECT_EQ(cb1.value(), CtapDeviceResponseCode::kCtap2ErrInvalidOption);
+  EXPECT_EQ(cb1.status(), CtapDeviceResponseCode::kSuccess);
+
+  // Rename non-existent enrollment.
+  test::ValueCallbackReceiver<CtapDeviceResponseCode> cb2;
+  handler->RenameTemplate({1}, "OtherFingerprint1", cb2.callback());
+
+  cb2.WaitForCallback();
+  EXPECT_EQ(cb2.value(), CtapDeviceResponseCode::kSuccess);
+
+  // Enumerate to validate renaming.
+  test::StatusAndValueCallbackReceiver<CtapDeviceResponseCode,
+                                       base::Optional<BioEnrollmentResponse>>
+      cb3;
+  handler->EnumerateTemplates(cb3.callback());
+
+  cb3.WaitForCallback();
+  EXPECT_EQ(cb3.status(), CtapDeviceResponseCode::kSuccess);
+
+  BioEnrollmentResponse expected;
+  expected.template_infos =
+      std::vector<std::pair<std::vector<uint8_t>, std::string>>{
+          {{1}, "OtherFingerprint1"}};
+  EXPECT_EQ(cb3.value(), expected);
 }
 
 // Tests deleting an enrollment (success and failure).
@@ -236,19 +357,35 @@
   auto handler = MakeHandler();
   ready_callback_.WaitForCallback();
 
-  // Delete existing enrollment.
+  // Delete non-existent enrollment.
   test::ValueCallbackReceiver<CtapDeviceResponseCode> cb0;
-  handler->DeleteTemplate({0, 0, 0, 1}, cb0.callback());
+  handler->DeleteTemplate({1}, cb0.callback());
 
   cb0.WaitForCallback();
-  EXPECT_EQ(cb0.value(), CtapDeviceResponseCode::kSuccess);
+  EXPECT_EQ(cb0.value(), CtapDeviceResponseCode::kCtap2ErrInvalidOption);
 
-  // Delete non-existent enrollment.
-  test::ValueCallbackReceiver<CtapDeviceResponseCode> cb1;
-  handler->DeleteTemplate({0, 0, 0, 2}, cb1.callback());
+  // Enroll - skip response validation.
+  test::StatusAndValueCallbackReceiver<CtapDeviceResponseCode,
+                                       base::Optional<BioEnrollmentResponse>>
+      cb1;
+  handler->EnrollTemplate(cb1.callback());
 
   cb1.WaitForCallback();
-  EXPECT_EQ(cb1.value(), CtapDeviceResponseCode::kCtap2ErrInvalidOption);
+  EXPECT_EQ(cb1.status(), CtapDeviceResponseCode::kSuccess);
+
+  // Delete existing enrollment.
+  test::ValueCallbackReceiver<CtapDeviceResponseCode> cb2;
+  handler->DeleteTemplate({1}, cb2.callback());
+
+  cb2.WaitForCallback();
+  EXPECT_EQ(cb2.value(), CtapDeviceResponseCode::kSuccess);
+
+  // Attempt to delete again to prove enrollment is gone.
+  test::ValueCallbackReceiver<CtapDeviceResponseCode> cb3;
+  handler->DeleteTemplate({1}, cb3.callback());
+
+  cb3.WaitForCallback();
+  EXPECT_EQ(cb3.value(), CtapDeviceResponseCode::kCtap2ErrInvalidOption);
 }
 
 // Test cancelling using the non-preview command.
diff --git a/device/fido/credential_management.cc b/device/fido/credential_management.cc
index ed56dc12..87d7877 100644
--- a/device/fido/credential_management.cc
+++ b/device/fido/credential_management.cc
@@ -114,11 +114,11 @@
 CredentialManagementRequest CredentialManagementRequest::ForDeleteCredential(
     Version version,
     base::span<const uint8_t> pin_token,
-    std::vector<uint8_t> credential_id) {
+    const PublicKeyCredentialDescriptor& credential_id) {
   cbor::Value::MapValue params_map;
   params_map.emplace(
       static_cast<int>(CredentialManagementRequestParamKey::kCredentialID),
-      std::move(credential_id));
+      AsCBOR(credential_id));
   base::Optional<std::vector<uint8_t>> pin_auth_bytes =
       cbor::Writer::Write(cbor::Value(params_map));
   DCHECK(pin_auth_bytes);
@@ -313,7 +313,9 @@
     size_t credential_count_)
     : user(std::move(user_)),
       credential_id(std::move(credential_id_)),
-      credential_count(credential_count_) {}
+      credential_count(credential_count_) {
+  credential_id_cbor_bytes = *cbor::Writer::Write(AsCBOR(credential_id));
+}
 
 AggregatedEnumerateCredentialsResponse::AggregatedEnumerateCredentialsResponse(
     PublicKeyCredentialRpEntity rp_)
diff --git a/device/fido/credential_management.h b/device/fido/credential_management.h
index 7649e40..beaa193 100644
--- a/device/fido/credential_management.h
+++ b/device/fido/credential_management.h
@@ -110,7 +110,7 @@
   static CredentialManagementRequest ForDeleteCredential(
       Version version,
       base::span<const uint8_t> pin_token,
-      std::vector<uint8_t> credential_id);
+      const PublicKeyCredentialDescriptor& credential_id);
 
   CredentialManagementRequest(CredentialManagementRequest&&);
   CredentialManagementRequest& operator=(CredentialManagementRequest&&);
@@ -176,6 +176,10 @@
 
   PublicKeyCredentialUserEntity user;
   PublicKeyCredentialDescriptor credential_id;
+  // For convenience, also return the serialized |credential_id| so that the UI
+  // doesn't have to do CBOR serialization. (It only cares about the opaque byte
+  // string.)
+  std::vector<uint8_t> credential_id_cbor_bytes;
   size_t credential_count;
 
  private:
@@ -196,7 +200,7 @@
   ~AggregatedEnumerateCredentialsResponse();
 
   PublicKeyCredentialRpEntity rp;
-  std::list<EnumerateCredentialsResponse> credentials;
+  std::vector<EnumerateCredentialsResponse> credentials;
 
  private:
   AggregatedEnumerateCredentialsResponse(
diff --git a/device/fido/credential_management_handler.cc b/device/fido/credential_management_handler.cc
index 8a90965..06d85b7 100644
--- a/device/fido/credential_management_handler.cc
+++ b/device/fido/credential_management_handler.cc
@@ -8,11 +8,13 @@
 
 #include "base/bind.h"
 #include "base/logging.h"
+#include "components/cbor/reader.h"
 #include "components/cbor/values.h"
 #include "components/cbor/writer.h"
 #include "device/fido/fido_authenticator.h"
 #include "device/fido/fido_constants.h"
 #include "device/fido/pin.h"
+#include "device/fido/public_key_credential_descriptor.h"
 
 namespace device {
 
@@ -40,7 +42,9 @@
 void CredentialManagementHandler::DispatchRequest(
     FidoAuthenticator* authenticator) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK_EQ(state_, State::kWaitingForTouch);
+  if (state_ != State::kWaitingForTouch) {
+    return;
+  }
   authenticator->GetTouch(base::BindOnce(&CredentialManagementHandler::OnTouch,
                                          weak_factory_.GetWeakPtr(),
                                          authenticator));
@@ -107,7 +111,6 @@
 void CredentialManagementHandler::OnHavePIN(std::string pin) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK_EQ(State::kWaitingForPIN, state_);
-  DCHECK(pin::IsValid(pin));
 
   if (authenticator_ == nullptr) {
     // Authenticator was detached. The request will already have been canceled
@@ -157,7 +160,6 @@
   }
 
   if (status != CtapDeviceResponseCode::kSuccess) {
-    state_ = State::kFinished;
     FidoReturnCode error;
     switch (status) {
       case CtapDeviceResponseCode::kCtap2ErrPinAuthBlocked:
@@ -170,6 +172,7 @@
         error = FidoReturnCode::kAuthenticatorResponseInvalid;
         break;
     }
+    state_ = State::kFinished;
     std::move(finished_callback_).Run(error);
     return;
   }
@@ -204,7 +207,7 @@
 }
 
 void CredentialManagementHandler::DeleteCredential(
-    base::span<const uint8_t> credential_id,
+    const PublicKeyCredentialDescriptor& credential_id,
     DeleteCredentialCallback callback) {
   DCHECK(state_ == State::kReady && !get_credentials_callback_);
   if (!authenticator_) {
@@ -219,6 +222,61 @@
       base::BindOnce(&OnDeleteCredential, std::move(callback)));
 }
 
+void CredentialManagementHandler::OnDeleteCredentials(
+    std::vector<std::vector<uint8_t>> remaining_credential_ids,
+    CredentialManagementHandler::DeleteCredentialCallback callback,
+    CtapDeviceResponseCode status,
+    base::Optional<DeleteCredentialResponse> response) {
+  if (status != CtapDeviceResponseCode::kSuccess ||
+      remaining_credential_ids.empty()) {
+    std::move(callback).Run(status);
+    return;
+  }
+
+  if (!authenticator_) {
+    // |authenticator_| could have been removed during a bulk deletion.  The
+    // observer would have already gotten an AuthenticatorRemoved() call, so no
+    // need to resolve |callback|.
+    return;
+  }
+
+  auto credential_id = *PublicKeyCredentialDescriptor::CreateFromCBORValue(
+      *cbor::Reader::Read(remaining_credential_ids.back()));
+  remaining_credential_ids.pop_back();
+  authenticator_->DeleteCredential(
+      *pin_token_, credential_id,
+      base::BindOnce(&CredentialManagementHandler::OnDeleteCredentials,
+                     weak_factory_.GetWeakPtr(),
+                     std::move(remaining_credential_ids), std::move(callback)));
+}
+
+void CredentialManagementHandler::DeleteCredentials(
+    std::vector<std::vector<uint8_t>> credential_ids,
+    DeleteCredentialCallback callback) {
+  DCHECK(state_ == State::kReady && !get_credentials_callback_);
+  if (!authenticator_) {
+    // AuthenticatorRemoved() may have been called, but the observer would have
+    // seen a FidoAuthenticatorRemoved() call.
+    NOTREACHED();
+    return;
+  }
+  DCHECK(pin_token_);
+
+  if (credential_ids.empty()) {
+    std::move(callback).Run(CtapDeviceResponseCode::kSuccess);
+    return;
+  }
+
+  auto credential_id = *PublicKeyCredentialDescriptor::CreateFromCBORValue(
+      *cbor::Reader::Read(credential_ids.back()));
+  credential_ids.pop_back();
+  authenticator_->DeleteCredential(
+      *pin_token_, credential_id,
+      base::BindOnce(&CredentialManagementHandler::OnDeleteCredentials,
+                     weak_factory_.GetWeakPtr(), std::move(credential_ids),
+                     std::move(callback)));
+}
+
 void CredentialManagementHandler::OnCredentialsMetadata(
     CtapDeviceResponseCode status,
     base::Optional<CredentialsMetadataResponse> response) {
@@ -245,6 +303,24 @@
         .Run(status, base::nullopt, base::nullopt);
     return;
   }
+
+  // Sort credentials by (RP ID, username, user) ascending.
+  for (auto& response : *responses) {
+    std::sort(response.credentials.begin(), response.credentials.end(),
+              [](const EnumerateCredentialsResponse& a,
+                 const EnumerateCredentialsResponse& b) {
+                if (a.user.name == b.user.name) {
+                  return a.user.id < b.user.id;
+                }
+                return a.user.name < b.user.name;
+              });
+  }
+  std::sort(responses->begin(), responses->end(),
+            [](const AggregatedEnumerateCredentialsResponse& a,
+               const AggregatedEnumerateCredentialsResponse& b) {
+              return a.rp.id < b.rp.id;
+            });
+
   state_ = State::kReady;
   std::move(get_credentials_callback_)
       .Run(status, std::move(responses),
@@ -256,21 +332,13 @@
     FidoAuthenticator* authenticator) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   FidoRequestHandlerBase::AuthenticatorRemoved(discovery, authenticator);
-  if (authenticator != authenticator_) {
+  if (authenticator != authenticator_ || state_ == State::kFinished) {
     return;
   }
 
   authenticator_ = nullptr;
-  if (state_ == State::kWaitingForPIN) {
-    state_ = State::kFinished;
-    std::move(finished_callback_)
-        .Run(FidoReturnCode::kAuthenticatorRemovedDuringPINEntry);
-    return;
-  }
-  if (state_ == State::kReady) {
-    std::move(finished_callback_).Run(FidoReturnCode::kSuccess);
-    return;
-  }
+  state_ = State::kFinished;
+  std::move(finished_callback_).Run(FidoReturnCode::kSuccess);
 }
 
 }  // namespace device
diff --git a/device/fido/credential_management_handler.h b/device/fido/credential_management_handler.h
index a204549..f67532b8 100644
--- a/device/fido/credential_management_handler.h
+++ b/device/fido/credential_management_handler.h
@@ -6,6 +6,7 @@
 #define DEVICE_FIDO_CREDENTIAL_MANAGEMENT_HANDLER_H_
 
 #include <memory>
+#include <vector>
 
 #include "base/callback.h"
 #include "base/component_export.h"
@@ -40,7 +41,7 @@
       base::OnceCallback<void(CtapDeviceResponseCode)>;
   using FinishedCallback = base::OnceCallback<void(FidoReturnCode)>;
   using GetCredentialsCallback = base::OnceCallback<void(
-      CtapDeviceResponseCode status,
+      CtapDeviceResponseCode,
       base::Optional<std::vector<AggregatedEnumerateCredentialsResponse>>,
       base::Optional<size_t>)>;
   using GetPINCallback =
@@ -61,10 +62,25 @@
   // on the device. The supplied callback receives the status returned by the
   // device and, if successful, the resident credentials stored and remaining
   // capacity left on the chosen authenticator.
+  //
+  // The returned AggregatedEnumerateCredentialsResponses will be sorted in
+  // ascending order by their RP ID. The |credentials| vector of each response
+  // will be sorted in ascending order by user name.
   void GetCredentials(GetCredentialsCallback callback);
-  void DeleteCredential(base::span<const uint8_t> credential_id,
+
+  // DeleteCredential attempts to delete the credential with the given
+  // |credential_id|.
+  void DeleteCredential(const PublicKeyCredentialDescriptor& credential_id,
                         DeleteCredentialCallback callback);
 
+  // DeleteCredentials deletes a list of credentials. Each entry in
+  // |credential_ids| must be a CBOR-serialized PublicKeyCredentialDescriptor.
+  // If any individual deletion fails, |callback| is invoked with the
+  // respective error, and deletion of the remaining credentials will be
+  // aborted (but others may have been deleted successfully already).
+  void DeleteCredentials(std::vector<std::vector<uint8_t>> credential_ids,
+                         DeleteCredentialCallback callback);
+
  private:
   enum class State {
     kWaitingForTouch,
@@ -101,6 +117,11 @@
       CtapDeviceResponseCode status,
       base::Optional<std::vector<AggregatedEnumerateCredentialsResponse>>
           responses);
+  void OnDeleteCredentials(
+      std::vector<std::vector<uint8_t>> remaining_credential_ids,
+      CredentialManagementHandler::DeleteCredentialCallback callback,
+      CtapDeviceResponseCode status,
+      base::Optional<DeleteCredentialResponse> response);
 
   SEQUENCE_CHECKER(sequence_checker_);
 
diff --git a/device/fido/credential_management_handler_unittest.cc b/device/fido/credential_management_handler_unittest.cc
index c3b8710..85b40589 100644
--- a/device/fido/credential_management_handler_unittest.cc
+++ b/device/fido/credential_management_handler_unittest.cc
@@ -88,7 +88,7 @@
   EXPECT_EQ(*num_remaining, 99u);
 
   handler->DeleteCredential(
-      opt_response->front().credentials.front().credential_id.id(),
+      opt_response->front().credentials.front().credential_id,
       delete_callback_.callback());
 
   delete_callback_.WaitForCallback();
diff --git a/device/fido/features.cc b/device/fido/features.cc
index e44eabb..0917ce3 100644
--- a/device/fido/features.cc
+++ b/device/fido/features.cc
@@ -25,4 +25,7 @@
 extern const base::Feature kWebAuthBiometricEnrollment{
     "WebAuthenticationBiometricEnrollment", base::FEATURE_DISABLED_BY_DEFAULT};
 
+extern const base::Feature kWebAuthCredentialManagement{
+    "WebAuthenticationCredentialManagement", base::FEATURE_DISABLED_BY_DEFAULT};
+
 }  // namespace device
diff --git a/device/fido/features.h b/device/fido/features.h
index e564d42..56d45e9 100644
--- a/device/fido/features.h
+++ b/device/fido/features.h
@@ -27,6 +27,10 @@
 // Enable biometric enrollment in the security keys settings UI.
 COMPONENT_EXPORT(DEVICE_FIDO)
 extern const base::Feature kWebAuthBiometricEnrollment;
+//
+// Enable credential management in the security keys settings UI.
+COMPONENT_EXPORT(DEVICE_FIDO)
+extern const base::Feature kWebAuthCredentialManagement;
 
 }  // namespace device
 
diff --git a/device/fido/fido_authenticator.cc b/device/fido/fido_authenticator.cc
index 1f5acb88..9894c44 100644
--- a/device/fido/fido_authenticator.cc
+++ b/device/fido/fido_authenticator.cc
@@ -78,7 +78,7 @@
 
 void FidoAuthenticator::DeleteCredential(
     base::span<const uint8_t> pin_token,
-    base::span<const uint8_t> credential_id,
+    const PublicKeyCredentialDescriptor& credential_id,
     DeleteCredentialCallback callback) {
   NOTREACHED();
 }
diff --git a/device/fido/fido_authenticator.h b/device/fido/fido_authenticator.h
index 446d779..d91d873 100644
--- a/device/fido/fido_authenticator.h
+++ b/device/fido/fido_authenticator.h
@@ -164,9 +164,10 @@
                                       GetCredentialsMetadataCallback callback);
   virtual void EnumerateCredentials(base::span<const uint8_t> pin_token,
                                     EnumerateCredentialsCallback callback);
-  virtual void DeleteCredential(base::span<const uint8_t> pin_token,
-                                base::span<const uint8_t> credential_id,
-                                DeleteCredentialCallback callback);
+  virtual void DeleteCredential(
+      base::span<const uint8_t> pin_token,
+      const PublicKeyCredentialDescriptor& credential_id,
+      DeleteCredentialCallback callback);
 
   // Biometric enrollment commands.
   virtual void GetModality(BioEnrollmentCallback callback);
diff --git a/device/fido/fido_device_authenticator.cc b/device/fido/fido_device_authenticator.cc
index 25009de..a15be8e 100644
--- a/device/fido/fido_device_authenticator.cc
+++ b/device/fido/fido_device_authenticator.cc
@@ -477,7 +477,7 @@
 
 void FidoDeviceAuthenticator::DeleteCredential(
     base::span<const uint8_t> pin_token,
-    base::span<const uint8_t> credential_id,
+    const PublicKeyCredentialDescriptor& credential_id,
     DeleteCredentialCallback callback) {
   DCHECK(Options()->supports_credential_management ||
          Options()->supports_credential_management_preview);
@@ -487,7 +487,7 @@
           Options()->supports_credential_management
               ? CredentialManagementRequest::kDefault
               : CredentialManagementRequest::kPreview,
-          pin_token, fido_parsing_utils::Materialize(credential_id)),
+          pin_token, credential_id),
       std::move(callback), base::BindOnce(&DeleteCredentialResponse::Parse),
       /*string_fixup_predicate=*/nullptr);
 }
diff --git a/device/fido/fido_device_authenticator.h b/device/fido/fido_device_authenticator.h
index 1660294..6e54bdc8 100644
--- a/device/fido/fido_device_authenticator.h
+++ b/device/fido/fido_device_authenticator.h
@@ -76,7 +76,7 @@
   void EnumerateCredentials(base::span<const uint8_t> pin_token,
                             EnumerateCredentialsCallback callback) override;
   void DeleteCredential(base::span<const uint8_t> pin_token,
-                        base::span<const uint8_t> credential_id,
+                        const PublicKeyCredentialDescriptor& credential_id,
                         DeleteCredentialCallback callback) override;
 
   void GetModality(BioEnrollmentCallback callback) override;
diff --git a/device/fido/virtual_ctap2_device.cc b/device/fido/virtual_ctap2_device.cc
index f1580673..fa6fca1 100644
--- a/device/fido/virtual_ctap2_device.cc
+++ b/device/fido/virtual_ctap2_device.cc
@@ -13,6 +13,8 @@
 #include "base/containers/span.h"
 #include "base/logging.h"
 #include "base/numerics/safe_conversions.h"
+#include "base/strings/strcat.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/cbor/reader.h"
 #include "components/cbor/writer.h"
@@ -1336,15 +1338,19 @@
       const auto credential_id_it = params.find(cbor::Value(static_cast<int>(
           CredentialManagementRequestParamKey::kCredentialID)));
       if (credential_id_it == params.end() ||
-          !credential_id_it->second.is_bytestring()) {
+          !credential_id_it->second.is_map()) {
         return CtapDeviceResponseCode::kCtap2ErrCBORUnexpectedType;
       }
-      const std::vector<uint8_t>& credential_id =
-          credential_id_it->second.GetBytestring();
-      if (!base::Contains(mutable_state()->registrations, credential_id)) {
+      auto credential_id = PublicKeyCredentialDescriptor::CreateFromCBORValue(
+          cbor::Value(credential_id_it->second.GetMap()));
+      if (!credential_id) {
+        return CtapDeviceResponseCode::kCtap2ErrCBORUnexpectedType;
+      }
+      if (!base::Contains(mutable_state()->registrations,
+                          credential_id->id())) {
         return CtapDeviceResponseCode::kCtap2ErrNoCredentials;
       }
-      mutable_state()->registrations.erase(credential_id);
+      mutable_state()->registrations.erase(credential_id->id());
       *response = {};
       return CtapDeviceResponseCode::kSuccess;
     }
@@ -1394,8 +1400,6 @@
   }
 
   // Check for subcommands.
-  using SubCmd = BioEnrollmentSubCommand;
-
   it = request_map.find(
       cbor::Value(static_cast<int>(BioEnrollmentRequestKey::kSubCommand)));
   if (it == request_map.end()) {
@@ -1408,34 +1412,45 @@
     return CtapDeviceResponseCode::kCtap2ErrCBORUnexpectedType;
   }
 
-  // List of enrollments currently on test key.
-  cbor::Value::MapValue id0;
-  id0.emplace(cbor::Value(static_cast<int>(
-                  BioEnrollmentTemplateInfoParam::kTemplateId)),
-              cbor::Value::BinaryValue{0, 0, 0, 1});
-  id0.emplace(cbor::Value(static_cast<int>(
-                  BioEnrollmentTemplateInfoParam::kTemplateFriendlyName)),
-              cbor::Value("Template0001"));
-
-  cbor::Value::ArrayValue enumerated_ids;
-  enumerated_ids.emplace_back(id0);
-
   // Template id from subcommand parameters, if it exists.
-  base::Optional<std::vector<uint8_t>> template_id;
-
+  base::Optional<uint8_t> template_id;
+  base::Optional<std::string> name;
   auto params_it = request_map.find(cbor::Value(
       static_cast<int>(BioEnrollmentRequestKey::kSubCommandParams)));
   if (params_it != request_map.end()) {
     const auto& params = params_it->second.GetMap();
     auto template_it = params.find(cbor::Value(
         static_cast<int>(BioEnrollmentSubCommandParam::kTemplateId)));
-    if (template_it != params.end() && template_it->second.is_bytestring()) {
-      template_id = template_it->second.GetBytestring();
+    if (template_it != params.end()) {
+      if (!template_it->second.is_bytestring()) {
+        NOTREACHED() << "Template ID parameter must be a CBOR bytestring.";
+        return CtapDeviceResponseCode::kCtap2ErrCBORUnexpectedType;
+      }
+      // Simplification: for unit tests, enforce one byte template IDs
+      DCHECK_EQ(template_it->second.GetBytestring().size(), 1u);
+      template_id = template_it->second.GetBytestring()[0];
+    }
+    auto name_it = params.find(cbor::Value(
+        static_cast<int>(BioEnrollmentSubCommandParam::kTemplateFriendlyName)));
+    if (name_it != params.end()) {
+      if (!name_it->second.is_string()) {
+        NOTREACHED() << "Name parameter must be a CBOR string.";
+        return CtapDeviceResponseCode::kCtap2ErrCBORUnexpectedType;
+      }
+      name = name_it->second.GetString();
     }
   }
 
-  switch (it->second.GetUnsigned()) {
-    case static_cast<int>(SubCmd::kGetFingerprintSensorInfo):
+  auto cmd =
+      ToBioEnrollmentEnum<BioEnrollmentSubCommand>(it->second.GetUnsigned());
+  if (!cmd) {
+    // Invalid command is unsupported.
+    return CtapDeviceResponseCode::kCtap2ErrUnsupportedOption;
+  }
+
+  using SubCmd = BioEnrollmentSubCommand;
+  switch (*cmd) {
+    case SubCmd::kGetFingerprintSensorInfo:
       response_map.emplace(
           static_cast<int>(BioEnrollmentResponseKey::kModality),
           static_cast<int>(BioEnrollmentModality::kFingerprint));
@@ -1445,37 +1460,105 @@
       response_map.emplace(
           static_cast<int>(
               BioEnrollmentResponseKey::kMaxCaptureSamplesRequiredForEnroll),
-          7);
+          config_.bio_enrollment_samples_required);
       break;
-    case static_cast<int>(SubCmd::kEnrollBegin):
+    case SubCmd::kEnrollBegin:
+      if (mutable_state()->bio_templates.size() ==
+          config_.bio_enrollment_capacity) {
+        return CtapDeviceResponseCode::kCtap2ErrKeyStoreFull;
+      }
+      mutable_state()->bio_current_template_id = 0;
+      while (mutable_state()->bio_templates.find(
+                 ++(*mutable_state()->bio_current_template_id)) !=
+             mutable_state()->bio_templates.end()) {
+        // Check for integer overflow (indicates full)
+        DCHECK(*mutable_state()->bio_current_template_id < 255);
+      }
+      mutable_state()->bio_remaining_samples =
+          config_.bio_enrollment_samples_required;
       response_map.emplace(
           static_cast<int>(BioEnrollmentResponseKey::kTemplateId),
-          std::vector<uint8_t>{0, 0, 0, 1});
+          std::vector<uint8_t>{*mutable_state()->bio_current_template_id});
       response_map.emplace(
           static_cast<int>(BioEnrollmentResponseKey::kLastEnrollSampleStatus),
           static_cast<int>(BioEnrollmentSampleStatus::kGood));
       response_map.emplace(
-          static_cast<int>(BioEnrollmentResponseKey::kRemainingSamples), 1);
+          static_cast<int>(BioEnrollmentResponseKey::kRemainingSamples),
+          --mutable_state()->bio_remaining_samples);
       break;
-    case static_cast<int>(SubCmd::kEnrollCaptureNextSample):
+    case SubCmd::kEnrollCaptureNextSample:
+      if (!mutable_state()->bio_current_template_id ||
+          mutable_state()->bio_current_template_id != *template_id) {
+        NOTREACHED() << "Invalid current enrollment or template id parameter.";
+        return CtapDeviceResponseCode::kCtap2ErrInvalidCBOR;
+      }
       response_map.emplace(
           static_cast<int>(BioEnrollmentResponseKey::kLastEnrollSampleStatus),
           static_cast<int>(BioEnrollmentSampleStatus::kGood));
       response_map.emplace(
-          static_cast<int>(BioEnrollmentResponseKey::kRemainingSamples), 0);
+          static_cast<int>(BioEnrollmentResponseKey::kRemainingSamples),
+          --mutable_state()->bio_remaining_samples);
+
+      if (mutable_state()->bio_remaining_samples == 0) {
+        mutable_state()
+            ->bio_templates[*mutable_state()->bio_current_template_id] =
+            base::StrCat(
+                {"Template", base::NumberToString(
+                                 *mutable_state()->bio_current_template_id)});
+        mutable_state()->bio_current_template_id = base::nullopt;
+      }
       break;
-    case static_cast<int>(SubCmd::kEnumerateEnrollments):
-      response_map.emplace(
-          static_cast<int>(BioEnrollmentResponseKey::kTemplateInfos),
-          enumerated_ids);
-      break;
-    case static_cast<int>(SubCmd::kSetFriendlyName):
-    case static_cast<int>(SubCmd::kRemoveEnrollment):
-      if (template_id && *template_id == std::vector<uint8_t>{0, 0, 0, 2}) {
+    case SubCmd::kEnumerateEnrollments: {
+      if (mutable_state()->bio_templates.empty()) {
         return CtapDeviceResponseCode::kCtap2ErrInvalidOption;
       }
-      [[fallthrough]];
-    case static_cast<int>(SubCmd::kCancelCurrentEnrollment):
+      cbor::Value::ArrayValue template_infos;
+      for (const auto& enroll : mutable_state()->bio_templates) {
+        cbor::Value::MapValue template_info;
+        template_info.emplace(cbor::Value(static_cast<int>(
+                                  BioEnrollmentTemplateInfoParam::kTemplateId)),
+                              std::vector<uint8_t>{enroll.first});
+        template_info.emplace(
+            cbor::Value(static_cast<int>(
+                BioEnrollmentTemplateInfoParam::kTemplateFriendlyName)),
+            cbor::Value(enroll.second));
+        template_infos.emplace_back(std::move(template_info));
+      }
+      response_map.emplace(
+          static_cast<int>(BioEnrollmentResponseKey::kTemplateInfos),
+          std::move(template_infos));
+      break;
+    }
+    case SubCmd::kSetFriendlyName:
+      if (!template_id || !name) {
+        NOTREACHED() << "Could not parse template_id or name from parameters.";
+        return CtapDeviceResponseCode::kCtap2ErrInvalidCBOR;
+      }
+
+      // Template ID from parameter does not exist, cannot rename.
+      if (mutable_state()->bio_templates.find(*template_id) ==
+          mutable_state()->bio_templates.end()) {
+        return CtapDeviceResponseCode::kCtap2ErrInvalidOption;
+      }
+
+      mutable_state()->bio_templates[*template_id] = *name;
+      return CtapDeviceResponseCode::kSuccess;
+    case SubCmd::kRemoveEnrollment:
+      if (!template_id) {
+        NOTREACHED() << "Could not parse template_id or name from parameters.";
+        return CtapDeviceResponseCode::kCtap2ErrInvalidCBOR;
+      }
+
+      // Template ID from parameter does not exist, cannot remove.
+      if (mutable_state()->bio_templates.find(*template_id) ==
+          mutable_state()->bio_templates.end()) {
+        return CtapDeviceResponseCode::kCtap2ErrInvalidOption;
+      }
+
+      mutable_state()->bio_templates.erase(*template_id);
+      return CtapDeviceResponseCode::kSuccess;
+    case SubCmd::kCancelCurrentEnrollment:
+      mutable_state()->bio_current_template_id = base::nullopt;
       return CtapDeviceResponseCode::kSuccess;
     default:
       // Handle all other commands as if they were unsupported (will change
diff --git a/device/fido/virtual_ctap2_device.h b/device/fido/virtual_ctap2_device.h
index cb0c21b..9ce5f66 100644
--- a/device/fido/virtual_ctap2_device.h
+++ b/device/fido/virtual_ctap2_device.h
@@ -46,6 +46,8 @@
     bool credential_management_support = false;
     bool bio_enrollment_support = false;
     bool bio_enrollment_preview_support = false;
+    uint8_t bio_enrollment_capacity = 10;
+    uint8_t bio_enrollment_samples_required = 4;
     bool cred_protect_support = false;
     // resident_credential_storage is the number of resident credentials that
     // the device will store before returning KEY_STORE_FULL.
diff --git a/device/fido/virtual_fido_device.h b/device/fido/virtual_fido_device.h
index 397f0b2c..bb2f98c 100644
--- a/device/fido/virtual_fido_device.h
+++ b/device/fido/virtual_fido_device.h
@@ -125,6 +125,12 @@
 
     // Whether a device with bio enrollment support has been provisioned.
     bool bio_enrollment_provisioned = false;
+    // Current template ID being enrolled, if any.
+    base::Optional<uint8_t> bio_current_template_id;
+    // Number of remaining samples in current enrollment.
+    uint8_t bio_remaining_samples = 4;
+    // Backing storage for enrollments and their friendly names.
+    std::map<uint8_t, std::string> bio_templates;
 
     // pending_assertions contains the second and subsequent assertions
     // resulting from a GetAssertion call. These values are awaiting a
diff --git a/docs/speed/apk_size_regressions.md b/docs/speed/apk_size_regressions.md
index dfe231a..f417c72 100644
--- a/docs/speed/apk_size_regressions.md
+++ b/docs/speed/apk_size_regressions.md
@@ -184,16 +184,6 @@
 
 ## Step 2: Check Alerts Regularly
 
- * **IMPORTANT: Check the [perf bot page](https://ci.chromium.org/buildbot/chromium.perf/Android%20Builder%20Perf/)
- several times a day to make sure it isn't broken (and ping/file a bug if it is).**
-   * At the very least you need to check this once in the morning and once in
-   the afternoon.
-   * If you don't and the builder is broken either you or the next sheriff will
-   have to manually build and diff the broken range (via. `diagnose_bloat.py`)
-   to see if we missed any regressions.
-   * This is necessary even if the next passing build doesn't create an alert
-   because the range could contain a large regression with multiple offsetting
-   decreases.
  * Check [alert page](https://chromeperf.appspot.com/alerts?sheriff=Binary%20Size%20Sheriff) regularly for new alerts.
  * Join [g/chrome-binary-size-alerts](https://goto.google.com/chrome-binary-size-alerts).
  * Deal with alerts as outlined above.
\ No newline at end of file
diff --git a/docs/ui/android/night_mode.md b/docs/ui/android/night_mode.md
new file mode 100644
index 0000000..d6693be
--- /dev/null
+++ b/docs/ui/android/night_mode.md
@@ -0,0 +1,160 @@
+# Night Mode (aka Dark Theme) on Chrome Android
+
+Night mode (aka Dark Theme) enables users to experience UI surfaces, rendered as Android views, in dark colors. All existing or new user-facing features on Chrome Android should implement a night mode variant of the relevant UI surfaces on Milestone M75+.
+
+[TOC]
+
+## Implement night mode UI for new features
+###Colors
+Colors defined in **color_palette.xml** are independent of night mode (i.e. will not change in night mode), and are used for color references defined in **values/colors.xml** and **values-night/colors.xml**.
+
+Color references in values/colors.xml will be used for day mode (aka light theme), and also for night mode if the particular color reference is not defined in values-night/colors.xml. Color references in values-night/colors.xml will be used for night mode.
+
+**Example**  
+In most cases, you should make use of the color references that are already defined in [//src/ui/android/java/res/values/color_palette.xml](https://cs.chromium.org/chromium/src/ui/android/java/res/values/color_palette.xml?q=color_palette.xml&sq=package:chromium&dr) and [//src/ui/android/java/res/values/colors.xml](https://cs.chromium.org/chromium/src/ui/android/java/res/values/colors.xml?sq=package:chromium&dr&g=0) for your new feature.
+
+However as an example, suppose you got approval from snowflake-team@chromium.org to add a new background color.
+
+In [//src/ui/android/java/res/values/color_palette.xml](https://cs.chromium.org/chromium/src/ui/android/java/res/values/color_palette.xml?q=color_palette.xml&sq=package:chromium&dr), add
+```xml
+<color name="new_bg_color_light">some light background color</color>
+<color name="new_bg_color_dark">some dark background color</color>
+```
+
+In [//src/ui/android/java/res/values/colors.xml](https://cs.chromium.org/chromium/src/ui/android/java/res/values/colors.xml?sq=package:chromium&dr&g=0), add
+```xml
+<color name="new_bg_color">@color/new_bg_color_light</color>
+```
+
+In [//src/ui/android/java/res_night/values-night/colors.xml](https://cs.chromium.org/chromium/src/ui/android/java/res_night/values-night/colors.xml), add
+```xml
+<color name="new_bg_color">@color/new_bg_color_dark</color>
+```
+
+An example to use this color in XML:
+```xml
+<View
+	...
+	android:background="new_bg_color" />
+```
+
+An example to use this color in Java:
+```java
+mView.setBackgroundResource(R.color.new_bg_color);
+mView.setBackgroundColor(
+    ApiCompatibilityUtils.getColor(mView.getResources(), R.color.new_bg_color));
+```
+
+Optionally, if the color is used exclusively for your feature, or if you want to easily update this color for your feature in the future, in the values/colors.xml that contains colors specifically for your feature, add
+```xml
+<color name="my_shiny_new_feature_bg_color">@color/new_bg_color</color>
+```
+
+If your feature needs colors that don't change based on day/night mode (e.g incognito mode UI), in the values/colors.xml that contains colors specifically for your feature, reference the colors defined in color_palette.xml. There is no need to define the color reference in values-night/colors.xml.
+```xml
+<!-- Dark background color for my shiny new feature regardless of day/night mode. -->
+<color name="my_shiny_new_feature_bg_color_dark">@color/new_bg_color_dark</color>
+```
+
+###Styles
+Colors used in styles can be either adaptcive or independent of night mode. When using existing or adding new styles, make sure the colors used in the styles fit your need.
+
+**Best practice of naming styles**
+
+* If the color adapts for night mode, avoid mentioning a specific color in the style name since it may not be accurate in night mode.
+```xml
+<!-- OK -->
+<style name="TextAppearance.Headline">
+  <!-- default_text_color is dark grey in day mode, and white in night mode. -->
+  <item name="android:textColor">@color/default_text_color</item>
+  ...
+</style>
+
+<!-- NOT OK -->
+<style name="TextAppearance.DarkGreyHeadline">
+  <!-- default_text_color is dark grey in day mode, and white in night mode. -->
+  <item name="android:textColor">@color/default_text_color</item>
+  ...
+</style>
+
+<!-- OK -->
+<style name="TextAppearance.ButtonText.Blue">
+  <!-- some_blue_color is dark blue in day mode, and light blue in night mode. -->
+  <item name="android:textColor">@color/some_blue_color</item>
+</style>
+```
+* If independent of night mode, mention a specific color or where it is generally used.
+```xml
+<!-- OK -->
+<style name="TextAppearance.Headline.White">
+  <item name="android:textColor">@android:color/white</item>
+  ...
+</style>
+
+<!-- OK -->
+<style name="TextAppearance.Body.Incognito">
+  <item name="android:textColor">@android:color/white</item>
+  ...
+</style>
+```
+
+###Themes
+If adding a new theme, make sure the parent (or any indirect ancestor) theme of the new theme is one of the AppCompat DayNight themes (prefixed with `Theme.AppCompat.DayNight`), or alternatively, define the same theme in values-night/ with the desired parent theme for night mode. See [dark theme](https://developer.android.com/preview/features/darktheme) in Android developer guide for more details.
+
+###Troubleshooting
+* Make sure `View` is inflated from `Activity` context instead of `Application` context
+  * `RemoteView` is an exception. See [RemoteViewsWithNightModeInflater.java](https://cs.chromium.org/chromium/src/chrome/android/java/src/org/chromium/chrome/browser/night_mode/RemoteViewsWithNightModeInflater.java?) for details.
+* Make sure color resources are accessed from `Activity` or `View` context instead of `Application` context
+* Check whether `Configuration.uiMode & UI_MODE_NIGHT_MASK` gives the correct UI night mode
+  * If uiMode is not correct, it could be a support library issue or an Android framework issue. You can contact chrome-android-app@chromium.org for help.
+
+## Test new features in night mode
+### Automatic Testing
+Render tests are the recommended way to verify the appearance of night mode UI. If you are not familiar with render tests, please take a look at [render test instructions](https://github.com/endlessm/chromium-browser/blob/master/chrome/test/android/javatests/src/org/chromium/chrome/test/util/RENDER_TESTS.md) to learn about how to write a new render test and upload golden images.
+
+**For tests using DummyUiActivity:**
+
+* Put all the render tests into a separate test suite
+* Use class parameter [`NightModeTestUtils.NightModeParams.class`](https://cs.chromium.org/chromium/src/chrome/android/javatests/src/org/chromium/chrome/browser/night_mode/NightModeTestUtils.java?type=cs&q=NightModeTestUtils.NightModeParams)
+* Pass in a boolean parameter that indicates night mode state in constructor
+* Set up night mode in constructor by calling [`NightModeTestUtils#setUpNightModeForDummyUiActivity()`](https://cs.chromium.org/chromium/src/chrome/android/javatests/src/org/chromium/chrome/browser/night_mode/NightModeTestUtils.java?type=cs&q=setUpNightModeForDummyUiActivity&sq=package:chromium) and [`RenderTestRule#setNightModeEnabled()`](https://cs.chromium.org/chromium/src/chrome/test/android/javatests/src/org/chromium/chrome/test/util/RenderTestRule.java?type=cs&q=setNightModeEnabled)
+* During [`tearDownTest()`](https://cs.chromium.org/chromium/src/chrome/android/javatests/src/org/chromium/chrome/test/ui/DummyUiActivityTestCase.java?type=cs&q=tearDownTest), reset night mode state by calling [`NightModeTestUtils#tearDownNightModeForDummyUiActivity()`](https://cs.chromium.org/chromium/src/chrome/android/javatests/src/org/chromium/chrome/browser/night_mode/NightModeTestUtils.java?type=cs&q=tearDownNightModeForDummyUiActivity)
+
+See [this CL](https://chromium-review.googlesource.com/c/chromium/src/+/1613883) as an example
+
+**For tests using ChromeActivityTestRule:**
+
+* In the method annotated with `@BeforeClass`, initialize states by calling [`NightModeTestUtils.setUpNightModeBeforeChromeActivityLaunched()`](https://cs.chromium.org/chromium/src/chrome/android/javatests/src/org/chromium/chrome/browser/night_mode/NightModeTestUtils.java?type=cs&q=setUpNightModeBeforeChromeActivityLaunched)
+* Add method `setupNightMode()` with annotation `@ParameterAnnotations.UseMethodParameterBefore(NightModeTestUtils.NightModeParams.class)`
+* In method `setupNightMode()`, set up night mode state by calling [`NightModeTestUtils#setUpNightModeForChromeActivity()`](https://cs.chromium.org/chromium/src/chrome/android/javatests/src/org/chromium/chrome/browser/night_mode/NightModeTestUtils.java?type=cs&q=setUpNightModeForChromeActivity) and [`RenderTestRule#setNightModeEnabled()`](https://cs.chromium.org/chromium/src/chrome/test/android/javatests/src/org/chromium/chrome/test/util/RenderTestRule.java?type=cs&q=setNightModeEnabled)
+* In the method annotated with `@AfterClass`, reset night mode state by calling [`tearDownNightModeAfterChromeActivityDestroyed`](https://cs.chromium.org/chromium/src/chrome/android/javatests/src/org/chromium/chrome/browser/night_mode/NightModeTestUtils.java?type=cs&q=tearDownNightModeAfterChromeActivityDestroyed)
+
+See [this CL](https://chromium-review.googlesource.com/c/chromium/src/+/1656668) as an example
+
+###Manual Testing
+Different ways to turn on night mode:
+
+* Go to Chrome **Settings -> Themes** on Android L+
+* Turn on power save mode (aka **battery saver**) on Android L+
+* Go to **Android Settings -> Developer options -> Night mode** on Android P
+* Go to **Android Settings -> Display -> Theme** on Android Q
+
+Ways to turn on night mode on **custom tab**:
+
+* Turn on power save mode (aka **battery saver**) on Android P+
+* Go to **Android Settings -> Developer options -> Night mode** on Android P
+* Go to **Android Settings -> Display -> Theme** on Android Q
+* [Set color scheme](https://cs.chromium.org/chromium/src/third_party/custom_tabs_client/src/customtabs/src/android/support/customtabs/CustomTabsIntent.java?) to `COLOR_SCHEME_DARK` on creating a `CustomTabsIntent.Builder`
+
+Some tips:
+
+* If building **chrome\_apk**, add `compress_resources = false` in gn args to disable Lemon compression. See [Issue 957286](https://crbug.com/957286) for details.
+* Night mode is only available on L+
+* Animation is turned off when in power save mode on Andoird L-O
+
+## Optional: Add independent night mode control to an Activity
+Most of the features will follow the app-wise night mode control, but some features might require introduction of an independent night mode control. For example, custom tab will not follow the app-wise night mode control, but instead, will respect the night mode settings from the host app. In such cases, you can
+
+1. Create your own implementation of [`NightModeStateProvider`](https://cs.chromium.org/chromium/src/chrome/android/java/src/org/chromium/chrome/browser/night_mode/NightModeStateProvider.java)
+2. Override [`ChromeBaseAppCompatActivity#createNightModeStateProvier()`](https://cs.chromium.org/chromium/src/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java?type=cs&q=createNightModeStateProvider)
+3. Use [`AppCompatDelegate#setLocalNightMode()`](https://developer.android.com/reference/android/support/v7/app/AppCompatDelegate.html#setLocalNightMode(int)) to update night mode in the `Configuration` of the `Activity`
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h
index 551372d..9ab2f23c 100644
--- a/extensions/browser/extension_function_histogram_value.h
+++ b/extensions/browser/extension_function_histogram_value.h
@@ -1410,6 +1410,7 @@
   LOGIN_EXITCURRENTSESSION = 1347,
   LOGIN_ISRUNNINGINLOGINPROFILE = 1348,
   LOGIN_FETCHDATAFORNEXTLOGINATTEMPT = 1349,
+  ACTION_SETICON = 1350,
   // Last entry: Add new entries above, then run:
   // python tools/metrics/histograms/update_extension_histograms.py
   ENUM_BOUNDARY
diff --git a/extensions/shell/common/shell_content_client.cc b/extensions/shell/common/shell_content_client.cc
index 2b671933..b61f09f 100644
--- a/extensions/shell/common/shell_content_client.cc
+++ b/extensions/shell/common/shell_content_client.cc
@@ -82,24 +82,24 @@
   schemes->csp_bypassing_schemes.push_back(kExtensionScheme);
 }
 
-base::string16 ShellContentClient::GetLocalizedString(int message_id) const {
+base::string16 ShellContentClient::GetLocalizedString(int message_id) {
   return l10n_util::GetStringUTF16(message_id);
 }
 
 base::StringPiece ShellContentClient::GetDataResource(
     int resource_id,
-    ui::ScaleFactor scale_factor) const {
+    ui::ScaleFactor scale_factor) {
   return ui::ResourceBundle::GetSharedInstance().GetRawDataResourceForScale(
       resource_id, scale_factor);
 }
 
 base::RefCountedMemory* ShellContentClient::GetDataResourceBytes(
-    int resource_id) const {
+    int resource_id) {
   return ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytes(
       resource_id);
 }
 
-gfx::Image& ShellContentClient::GetNativeImageNamed(int resource_id) const {
+gfx::Image& ShellContentClient::GetNativeImageNamed(int resource_id) {
   return ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed(
       resource_id);
 }
diff --git a/extensions/shell/common/shell_content_client.h b/extensions/shell/common/shell_content_client.h
index 02b95a6..5edc1b26 100644
--- a/extensions/shell/common/shell_content_client.h
+++ b/extensions/shell/common/shell_content_client.h
@@ -20,13 +20,11 @@
   void AddPepperPlugins(
       std::vector<content::PepperPluginInfo>* plugins) override;
   void AddAdditionalSchemes(Schemes* schemes) override;
-  base::string16 GetLocalizedString(int message_id) const override;
-  base::StringPiece GetDataResource(
-      int resource_id,
-      ui::ScaleFactor scale_factor) const override;
-  base::RefCountedMemory* GetDataResourceBytes(
-      int resource_id) const override;
-  gfx::Image& GetNativeImageNamed(int resource_id) const override;
+  base::string16 GetLocalizedString(int message_id) override;
+  base::StringPiece GetDataResource(int resource_id,
+                                    ui::ScaleFactor scale_factor) override;
+  base::RefCountedMemory* GetDataResourceBytes(int resource_id) override;
+  gfx::Image& GetNativeImageNamed(int resource_id) override;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(ShellContentClient);
diff --git a/fuchsia/engine/web_engine_content_client.cc b/fuchsia/engine/web_engine_content_client.cc
index b929d730..f8caada0 100644
--- a/fuchsia/engine/web_engine_content_client.cc
+++ b/fuchsia/engine/web_engine_content_client.cc
@@ -9,25 +9,24 @@
 WebEngineContentClient::WebEngineContentClient() = default;
 WebEngineContentClient::~WebEngineContentClient() = default;
 
-base::string16 WebEngineContentClient::GetLocalizedString(
-    int message_id) const {
+base::string16 WebEngineContentClient::GetLocalizedString(int message_id) {
   return l10n_util::GetStringUTF16(message_id);
 }
 
 base::StringPiece WebEngineContentClient::GetDataResource(
     int resource_id,
-    ui::ScaleFactor scale_factor) const {
+    ui::ScaleFactor scale_factor) {
   return ui::ResourceBundle::GetSharedInstance().GetRawDataResourceForScale(
       resource_id, scale_factor);
 }
 
 base::RefCountedMemory* WebEngineContentClient::GetDataResourceBytes(
-    int resource_id) const {
+    int resource_id) {
   return ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytes(
       resource_id);
 }
 
-gfx::Image& WebEngineContentClient::GetNativeImageNamed(int resource_id) const {
+gfx::Image& WebEngineContentClient::GetNativeImageNamed(int resource_id) {
   return ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed(
       resource_id);
 }
diff --git a/fuchsia/engine/web_engine_content_client.h b/fuchsia/engine/web_engine_content_client.h
index 58fef83..820d2ce 100644
--- a/fuchsia/engine/web_engine_content_client.h
+++ b/fuchsia/engine/web_engine_content_client.h
@@ -14,12 +14,11 @@
   ~WebEngineContentClient() override;
 
   // content::ContentClient implementation.
-  base::string16 GetLocalizedString(int message_id) const override;
-  base::StringPiece GetDataResource(
-      int resource_id,
-      ui::ScaleFactor scale_factor) const override;
-  base::RefCountedMemory* GetDataResourceBytes(int resource_id) const override;
-  gfx::Image& GetNativeImageNamed(int resource_id) const override;
+  base::string16 GetLocalizedString(int message_id) override;
+  base::StringPiece GetDataResource(int resource_id,
+                                    ui::ScaleFactor scale_factor) override;
+  base::RefCountedMemory* GetDataResourceBytes(int resource_id) override;
+  gfx::Image& GetNativeImageNamed(int resource_id) override;
   blink::OriginTrialPolicy* GetOriginTrialPolicy() override;
 
  private:
diff --git a/gpu/ipc/service/gles2_command_buffer_stub.cc b/gpu/ipc/service/gles2_command_buffer_stub.cc
index 92cf96b..28cc844 100644
--- a/gpu/ipc/service/gles2_command_buffer_stub.cc
+++ b/gpu/ipc/service/gles2_command_buffer_stub.cc
@@ -329,7 +329,11 @@
     return gpu::ContextResult::kTransientFailure;
   }
 
-  if (!context->GetGLStateRestorer()) {
+  // The GLStateRestorer is not used with the passthrough command decoder
+  // because not all state is tracked in the decoder. Virtualized contexts are
+  // also not used.
+  if (!context->GetGLStateRestorer() &&
+      !context_group_->use_passthrough_cmd_decoder()) {
     context->SetGLStateRestorer(
         new GLStateRestorerImpl(gles2_decoder_->AsWeakPtr()));
   }
diff --git a/gpu/vulkan/vulkan_swap_chain.cc b/gpu/vulkan/vulkan_swap_chain.cc
index 1018527..552d892 100644
--- a/gpu/vulkan/vulkan_swap_chain.cc
+++ b/gpu/vulkan/vulkan_swap_chain.cc
@@ -106,6 +106,8 @@
   end_write_semaphore_ = VK_NULL_HANDLE;
 
   VkSemaphore vk_semaphore = CreateSemaphore(device);
+  DCHECK(vk_semaphore != VK_NULL_HANDLE);
+
   uint32_t next_image = 0;
   // Acquire then next image.
   result = vkAcquireNextImageKHR(device, swap_chain_, UINT64_MAX, vk_semaphore,
@@ -151,11 +153,6 @@
   VkSwapchainKHR new_swap_chain = VK_NULL_HANDLE;
   result = vkCreateSwapchainKHR(device, &swap_chain_create_info, nullptr,
                                 &new_swap_chain);
-  if (VK_SUCCESS != result) {
-    DLOG(ERROR) << "vkCreateSwapchainKHR() failed: " << result;
-    result = vkCreateSwapchainKHR(device, &swap_chain_create_info, nullptr,
-                                  &new_swap_chain);
-  }
 
   if (old_swap_chain) {
     auto* fence_helper = device_queue_->GetFenceHelper();
@@ -163,6 +160,11 @@
         std::move(old_swap_chain));
   }
 
+  if (VK_SUCCESS != result) {
+    DLOG(ERROR) << "vkCreateSwapchainKHR() failed: " << result;
+    return false;
+  }
+
   swap_chain_ = new_swap_chain;
   size_ = gfx::Size(swap_chain_create_info.imageExtent.width,
                     swap_chain_create_info.imageExtent.height);
@@ -212,6 +214,8 @@
   }
 
   VkSemaphore vk_semaphore = CreateSemaphore(device);
+  DCHECK(vk_semaphore != VK_NULL_HANDLE);
+
   // Acquire the initial buffer.
   result = vkAcquireNextImageKHR(device, swap_chain_, UINT64_MAX, vk_semaphore,
                                  VK_NULL_HANDLE, &current_image_);
diff --git a/headless/lib/headless_content_client.cc b/headless/lib/headless_content_client.cc
index efeb7205..30472dc 100644
--- a/headless/lib/headless_content_client.cc
+++ b/headless/lib/headless_content_client.cc
@@ -13,24 +13,24 @@
 
 HeadlessContentClient::~HeadlessContentClient() = default;
 
-base::string16 HeadlessContentClient::GetLocalizedString(int message_id) const {
+base::string16 HeadlessContentClient::GetLocalizedString(int message_id) {
   return l10n_util::GetStringUTF16(message_id);
 }
 
 base::StringPiece HeadlessContentClient::GetDataResource(
     int resource_id,
-    ui::ScaleFactor scale_factor) const {
+    ui::ScaleFactor scale_factor) {
   return ui::ResourceBundle::GetSharedInstance().GetRawDataResourceForScale(
       resource_id, scale_factor);
 }
 
 base::RefCountedMemory* HeadlessContentClient::GetDataResourceBytes(
-    int resource_id) const {
+    int resource_id) {
   return ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytes(
       resource_id);
 }
 
-gfx::Image& HeadlessContentClient::GetNativeImageNamed(int resource_id) const {
+gfx::Image& HeadlessContentClient::GetNativeImageNamed(int resource_id) {
   return ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed(
       resource_id);
 }
diff --git a/headless/lib/headless_content_client.h b/headless/lib/headless_content_client.h
index eadac27d..5f9c268 100644
--- a/headless/lib/headless_content_client.h
+++ b/headless/lib/headless_content_client.h
@@ -16,13 +16,11 @@
   ~HeadlessContentClient() override;
 
   // content::ContentClient implementation:
-  base::string16 GetLocalizedString(int message_id) const override;
-  base::StringPiece GetDataResource(
-      int resource_id,
-      ui::ScaleFactor scale_factor) const override;
-  base::RefCountedMemory* GetDataResourceBytes(
-      int resource_id) const override;
-  gfx::Image& GetNativeImageNamed(int resource_id) const override;
+  base::string16 GetLocalizedString(int message_id) override;
+  base::StringPiece GetDataResource(int resource_id,
+                                    ui::ScaleFactor scale_factor) override;
+  base::RefCountedMemory* GetDataResourceBytes(int resource_id) override;
+  gfx::Image& GetNativeImageNamed(int resource_id) override;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(HeadlessContentClient);
diff --git a/ios/chrome/browser/autofill/automation/automation_egtest.mm b/ios/chrome/browser/autofill/automation/automation_egtest.mm
index 5344226..3e0cd3f 100644
--- a/ios/chrome/browser/autofill/automation/automation_egtest.mm
+++ b/ios/chrome/browser/autofill/automation/automation_egtest.mm
@@ -22,7 +22,6 @@
 #import "ios/chrome/browser/autofill/form_suggestion_label.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
-#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "ios/web/public/js_messaging/web_frame_util.h"
 #import "ios/web/public/js_messaging/web_frames_manager.h"
diff --git a/ios/chrome/browser/payments/payment_request.h b/ios/chrome/browser/payments/payment_request.h
index c6427a9..62eaba8 100644
--- a/ios/chrome/browser/payments/payment_request.h
+++ b/ios/chrome/browser/payments/payment_request.h
@@ -114,7 +114,6 @@
   autofill::PersonalDataManager* GetPersonalDataManager() override;
   const std::string& GetApplicationLocale() const override;
   bool IsIncognito() const override;
-  bool IsSslCertificateValid() override;
   const GURL& GetLastCommittedURL() const override;
   void DoFullCardRequest(
       const autofill::CreditCard& credit_card,
diff --git a/ios/chrome/browser/payments/payment_request.mm b/ios/chrome/browser/payments/payment_request.mm
index fcd292aa..ff623e01 100644
--- a/ios/chrome/browser/payments/payment_request.mm
+++ b/ios/chrome/browser/payments/payment_request.mm
@@ -147,11 +147,6 @@
   return browser_state_->IsOffTheRecord();
 }
 
-bool PaymentRequest::IsSslCertificateValid() {
-  NOTREACHED() << "Implementation is never used";
-  return false;
-}
-
 const GURL& PaymentRequest::GetLastCommittedURL() const {
   return web_state_->GetLastCommittedURL();
 }
diff --git a/ios/chrome/browser/tabs/tab_unittest.mm b/ios/chrome/browser/tabs/tab_unittest.mm
index 0eadafe6..f0964b9 100644
--- a/ios/chrome/browser/tabs/tab_unittest.mm
+++ b/ios/chrome/browser/tabs/tab_unittest.mm
@@ -235,6 +235,7 @@
     if (GetParam() == NavigationManagerChoice::WK_BASED) {
       [fake_wk_list_
           setCurrentURL:base::SysUTF8ToNSString(redirect_url.spec())];
+      OCMStub([mock_web_view_ URL]).andReturn(fake_wk_list_.currentItem.URL);
     }
     web_state_impl_->GetNavigationManagerImpl().CommitPendingItem();
 
diff --git a/ios/chrome/browser/ui/settings/password/passwords_settings_egtest.mm b/ios/chrome/browser/ui/settings/password/passwords_settings_egtest.mm
index 9e5fbac..902cdad4 100644
--- a/ios/chrome/browser/ui/settings/password/passwords_settings_egtest.mm
+++ b/ios/chrome/browser/ui/settings/password/passwords_settings_egtest.mm
@@ -35,7 +35,6 @@
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
-#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/third_party/material_components_ios/src/components/Snackbar/src/MaterialSnackbar.h"
diff --git a/ios/chrome/browser/ui/signin_interaction/signin_interaction_controller_egtest_util.mm b/ios/chrome/browser/ui/signin_interaction/signin_interaction_controller_egtest_util.mm
index b16300c0..92037e39 100644
--- a/ios/chrome/browser/ui/signin_interaction/signin_interaction_controller_egtest_util.mm
+++ b/ios/chrome/browser/ui/signin_interaction/signin_interaction_controller_egtest_util.mm
@@ -9,7 +9,6 @@
 #import "ios/chrome/browser/ui/authentication/signin_earlgrey_utils.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
-#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #
diff --git a/ios/chrome/browser/web/page_placeholder_tab_helper.mm b/ios/chrome/browser/web/page_placeholder_tab_helper.mm
index 9da95c5..2a74cc0 100644
--- a/ios/chrome/browser/web/page_placeholder_tab_helper.mm
+++ b/ios/chrome/browser/web/page_placeholder_tab_helper.mm
@@ -124,8 +124,15 @@
   UIView* web_state_view = web_state_->GetView();
   NamedGuide* guide = [NamedGuide guideWithName:kContentAreaGuide
                                            view:web_state_view];
-  DCHECK(guide) << "The ContentArea named guide must be in the WebState view's "
-                   "hierarchy to properly position the page placeholder.";
+
+  // TODO(crbug.com/971364): It is a known issue that the guide may be nil,
+  // causing a crash when attempting to display the placeholder. Choose to not
+  // display the placeholder rather than crashing, since the placeholder is not
+  // critical to the user experience.
+  if (!guide) {
+    displaying_placeholder_ = false;
+    return;
+  }
   placeholder_view_.image = snapshot;
   [web_state_view addSubview:placeholder_view_];
   AddSameConstraints(guide, placeholder_view_);
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn
index a42c3dc..53868f6f6 100644
--- a/ios/chrome/test/earl_grey/BUILD.gn
+++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -211,7 +211,6 @@
     "chrome_earl_grey_app_interface.mm",
     "chrome_earl_grey_ui.h",
     "chrome_earl_grey_ui.mm",
-    "chrome_error_util.h",
     "chrome_matchers.h",
     "chrome_matchers.mm",
     "chrome_matchers_app_interface.h",
@@ -389,7 +388,6 @@
     "chrome_earl_grey_ui.mm",
     "chrome_egtest_bundle_main.h",
     "chrome_egtest_bundle_main.mm",
-    "chrome_error_util.h",
     "chrome_matchers.h",
     "chrome_matchers.mm",
     "chrome_matchers_app_interface.h",
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.mm b/ios/chrome/test/earl_grey/chrome_earl_grey.mm
index 28ddc7e..4c446155 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey.mm
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey.mm
@@ -11,7 +11,6 @@
 #include "base/strings/sys_string_conversions.h"
 #import "base/test/ios/wait_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h"
-#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/testing/earl_grey/earl_grey_test.h"
 #import "ios/testing/nserror_util.h"
 #include "ios/web/public/test/element_selector.h"
diff --git a/ios/chrome/test/earl_grey/chrome_error_util.h b/ios/chrome/test/earl_grey/chrome_error_util.h
deleted file mode 100644
index 53b65e80..0000000
--- a/ios/chrome/test/earl_grey/chrome_error_util.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_TEST_EARL_GREY_CHROME_ERROR_UTIL_H_
-#define IOS_CHROME_TEST_EARL_GREY_CHROME_ERROR_UTIL_H_
-
-// Wraps an expression that returns an NSError*, asserting if an error is
-// returned. Used in EG test code to assert if app helpers fail. For example:
-//  CHROME_EG_ASSERT_NO_ERROR(helperReturningNSError());
-//  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey helperReturningNSError]);
-#define CHROME_EG_ASSERT_NO_ERROR(expression)                           \
-  {                                                                     \
-    NSError* error = expression;                                        \
-    GREYAssert(error == nil || [error isKindOfClass:[NSError class]],   \
-               @"Expression did not return an object of type NSError"); \
-    GREYAssertNil(error, error.localizedDescription);                   \
-  }
-
-#endif  // IOS_CHROME_TEST_EARL_GREY_CHROME_ERROR_UTIL_H_
diff --git a/ios/chrome/test/earl_grey/chrome_test_case.mm b/ios/chrome/test/earl_grey/chrome_test_case.mm
index 9acca1e..310fa31 100644
--- a/ios/chrome/test/earl_grey/chrome_test_case.mm
+++ b/ios/chrome/test/earl_grey/chrome_test_case.mm
@@ -11,7 +11,6 @@
 #include "base/command_line.h"
 #include "base/strings/sys_string_conversions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
-#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case_app_interface.h"
 #import "ios/testing/earl_grey/coverage_utils.h"
 #import "ios/testing/earl_grey/earl_grey_test.h"
diff --git a/ios/chrome/test/earl_grey2/smoke_egtest.mm b/ios/chrome/test/earl_grey2/smoke_egtest.mm
index 7817dbd..ad27d01b 100644
--- a/ios/chrome/test/earl_grey2/smoke_egtest.mm
+++ b/ios/chrome/test/earl_grey2/smoke_egtest.mm
@@ -9,7 +9,6 @@
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
-#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/chrome/test/earl_grey2/chrome_earl_grey_edo.h"
diff --git a/ios/web/navigation/navigation_item_impl.h b/ios/web/navigation/navigation_item_impl.h
index b0d10d25..5565a94b 100644
--- a/ios/web/navigation/navigation_item_impl.h
+++ b/ios/web/navigation/navigation_item_impl.h
@@ -118,6 +118,12 @@
   // doesn't specify a title.
   static base::string16 GetDisplayTitleForURL(const GURL& url);
 
+  // Used only by WKBasedNavigationManager.  SetUntrusted() is only used for
+  // Visible or LastCommitted NavigationItems where the |url_| may be incorrect
+  // due to timining problems or bugs in WKWebView.
+  void SetUntrusted();
+  bool IsUntrusted();
+
 #ifndef NDEBUG
   // Returns a human-readable description of the state for debugging purposes.
   NSString* GetDescription() const;
@@ -155,8 +161,10 @@
   // |ResetForCommit| and not persisted.
   web::NavigationInitiationType navigation_initiation_type_;
 
-  // Whether the navigation contains unsafe resources.
-  bool is_unsafe_;
+  // Used only by WKBasedNavigationManager.  |is_untrusted_| is only |true| for
+  // Visible or LastCommitted NavigationItems where the |url_| may be incorrect
+  // due to timining problems or bugs in WKWebView.
+  bool is_untrusted_;
 
   // This is a cached version of the result of GetTitleForDisplay. When the URL,
   // virtual URL, or title is set, this should be cleared to force a refresh.
diff --git a/ios/web/navigation/navigation_item_impl.mm b/ios/web/navigation/navigation_item_impl.mm
index 0722101..e0445550 100644
--- a/ios/web/navigation/navigation_item_impl.mm
+++ b/ios/web/navigation/navigation_item_impl.mm
@@ -49,7 +49,7 @@
       is_created_from_hash_change_(false),
       should_skip_repost_form_confirmation_(false),
       navigation_initiation_type_(web::NavigationInitiationType::NONE),
-      is_unsafe_(false) {}
+      is_untrusted_(false) {}
 
 NavigationItemImpl::~NavigationItemImpl() {
 }
@@ -77,7 +77,7 @@
       post_data_([item.post_data_ copy]),
       error_retry_state_machine_(item.error_retry_state_machine_),
       navigation_initiation_type_(item.navigation_initiation_type_),
-      is_unsafe_(item.is_unsafe_),
+      is_untrusted_(item.is_untrusted_),
       cached_display_title_(item.cached_display_title_) {}
 
 int NavigationItemImpl::GetUniqueID() const {
@@ -194,6 +194,14 @@
             user_agent_type_ == UserAgentType::NONE);
 }
 
+void NavigationItemImpl::SetUntrusted() {
+  is_untrusted_ = true;
+}
+
+bool NavigationItemImpl::IsUntrusted() {
+  return is_untrusted_;
+}
+
 UserAgentType NavigationItemImpl::GetUserAgentType() const {
   return user_agent_type_;
 }
diff --git a/ios/web/navigation/wk_based_navigation_manager_impl.h b/ios/web/navigation/wk_based_navigation_manager_impl.h
index b791106..31631ad 100644
--- a/ios/web/navigation/wk_based_navigation_manager_impl.h
+++ b/ios/web/navigation/wk_based_navigation_manager_impl.h
@@ -236,16 +236,16 @@
                      std::vector<std::unique_ptr<NavigationItem>> items);
 
   // Returns true if |last_committed_item| matches WKWebView.URL when expected.
-  // WKWebView is more aggressive than Chromium is in updating the visible URL,
-  // and there are cases where, even though WKWebView's URL has updated,
+  // WKWebView is more aggressive than Chromium is in updating the committed
+  // URL, and there are cases where, even though WKWebView's URL has updated,
   // Chromium still wants to display last committed.  Normally this is managed
   // by WKBasedNavigationManagerImpl last committed, but there are short periods
   // during fast navigations where WKWebView.URL has updated and ios/web can't
   // validate what should be shown for the visible item.  More importantly,
   // there are bugs in WkWebView where WKWebView's URL and
   // backForwardList.currentItem can fall out of sync.  In these situations,
-  // return false as a safeguard so visible item is always trusted.
-  bool CanTrustLastCommittedItemForVisibleItem(
+  // return false as a safeguard so committed item is always trusted.
+  bool CanTrustLastCommittedItem(
       const NavigationItem* last_committed_item) const;
 
   // The pending main frame navigation item. This is nullptr if there is no
@@ -276,10 +276,10 @@
   // The transient item in main frame.
   std::unique_ptr<NavigationItemImpl> transient_item_;
 
-  // A placeholder item used when CanTrustLastCommittedItemForVisibleItem
+  // A placeholder item used when CanTrustLastCommittedItem
   // returns false.  The navigation item returned uses crw_web_controller's
   // documentURL as the URL.
-  mutable std::unique_ptr<NavigationItemImpl> visible_web_view_item_;
+  mutable std::unique_ptr<NavigationItemImpl> last_committed_web_view_item_;
 
   // Time smoother for navigation item timestamps. See comment in
   // navigation_controller_impl.h.
diff --git a/ios/web/navigation/wk_based_navigation_manager_impl.mm b/ios/web/navigation/wk_based_navigation_manager_impl.mm
index b275c27..e5e9a33 100644
--- a/ios/web/navigation/wk_based_navigation_manager_impl.mm
+++ b/ios/web/navigation/wk_based_navigation_manager_impl.mm
@@ -397,7 +397,7 @@
   return delegate_->GetWebState();
 }
 
-bool WKBasedNavigationManagerImpl::CanTrustLastCommittedItemForVisibleItem(
+bool WKBasedNavigationManagerImpl::CanTrustLastCommittedItem(
     const NavigationItem* last_committed_item) const {
   DCHECK(last_committed_item);
   if (!web_view_cache_.IsAttachedToWebView())
@@ -414,7 +414,7 @@
   // Fast back-forward navigations can be performed synchronously, with the
   // WKWebView.URL updated before enough callbacks occur to update the
   // last committed item.  As a result, any calls to
-  // -CanTrustLastCommittedItemForVisibleItem during a call to WKWebView
+  // -CanTrustLastCommittedItem during a call to WKWebView
   // -goToBackForwardListItem are wrapped in the
   // |going_to_back_forward_list_item_| flag. This flag is set and immediately
   // unset because the the mismatch between URL and last_committed_item is
@@ -459,26 +459,7 @@
 
   NavigationItem* last_committed_item = GetLastCommittedItem();
   if (last_committed_item) {
-    if (CanTrustLastCommittedItemForVisibleItem(last_committed_item)) {
-      return last_committed_item;
-    } else {
-      auto trust_level = web::URLVerificationTrustLevel::kNone;
-      // Don't check trust level here, as at this point it's expected
-      // the _documentURL and the last_commited_item URL have an origin
-      // mismatch.
-      GURL document_url = delegate_->GetWebState()->GetCurrentURL(&trust_level);
-      if (!visible_web_view_item_) {
-        visible_web_view_item_ = CreateNavigationItemWithRewriters(
-            GURL::EmptyGURL(), Referrer(),
-            ui::PageTransition::PAGE_TRANSITION_LINK,
-            NavigationInitiationType::RENDERER_INITIATED, GURL::EmptyGURL(),
-            nullptr /* use default rewriters only */);
-      }
-      visible_web_view_item_->SetURL(document_url);
-      visible_web_view_item_->SetTimestamp(
-          time_smoother_.GetSmoothedTime(base::Time::Now()));
-      return visible_web_view_item_.get();
-    }
+    return last_committed_item;
   }
 
   // While an -IsRestoreSessionUrl URL can not be a committed page, it is
@@ -782,7 +763,29 @@
     DCHECK_EQ(0, GetItemCount());
     return nullptr;
   }
-  return GetNavigationItemImplAtIndex(static_cast<size_t>(index));
+  NavigationItemImpl* last_committed_item =
+      GetNavigationItemImplAtIndex(static_cast<size_t>(index));
+  if (last_committed_item && GetWebState() &&
+      !CanTrustLastCommittedItem(last_committed_item)) {
+    // Don't check trust level here, as at this point it's expected
+    // the _documentURL and the last_commited_item URL have an origin
+    // mismatch.
+    GURL document_url = GetWebState()->GetCurrentURL(/*trust_level=*/nullptr);
+    if (!last_committed_web_view_item_) {
+      last_committed_web_view_item_ = CreateNavigationItemWithRewriters(
+          /*url=*/GURL::EmptyGURL(), Referrer(),
+          ui::PageTransition::PAGE_TRANSITION_LINK,
+          NavigationInitiationType::RENDERER_INITIATED,
+          /*previous_url=*/GURL::EmptyGURL(),
+          nullptr /* use default rewriters only */);
+      last_committed_web_view_item_->SetUntrusted();
+    }
+    last_committed_web_view_item_->SetURL(document_url);
+    last_committed_web_view_item_->SetTimestamp(
+        time_smoother_.GetSmoothedTime(base::Time::Now()));
+    return last_committed_web_view_item_.get();
+  }
+  return last_committed_item;
 }
 
 int WKBasedNavigationManagerImpl::
diff --git a/ios/web/navigation/wk_based_navigation_manager_impl_unittest.mm b/ios/web/navigation/wk_based_navigation_manager_impl_unittest.mm
index ab59ad0..88bd281 100644
--- a/ios/web/navigation/wk_based_navigation_manager_impl_unittest.mm
+++ b/ios/web/navigation/wk_based_navigation_manager_impl_unittest.mm
@@ -296,9 +296,8 @@
   mock_wk_list_.currentItem = wk_item0;
   mock_wk_list_.backList = nil;
   mock_wk_list_.forwardList = @[ wk_item1 ];
-  OCMExpect([mock_web_view_ URL])
+  OCMStub([mock_web_view_ URL])
       .andReturn([[NSURL alloc] initWithString:@"http://www.0.com"]);
-
   manager_->AddPendingItem(
       GURL("http://www.0.com"), Referrer(), ui::PAGE_TRANSITION_TYPED,
       web::NavigationInitiationType::BROWSER_INITIATED,
diff --git a/ios/web/public/thread/OWNERS b/ios/web/public/thread/OWNERS
new file mode 100644
index 0000000..341fa6d
--- /dev/null
+++ b/ios/web/public/thread/OWNERS
@@ -0,0 +1,5 @@
+rohitrao@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
+# COMPONENT: Mobile>iOSWeb
diff --git a/ios/web/public/web_state/web_state.h b/ios/web/public/web_state/web_state.h
index 80abee30..a47fc043 100644
--- a/ios/web/public/web_state/web_state.h
+++ b/ios/web/public/web_state/web_state.h
@@ -237,7 +237,7 @@
   // Returns the WebState view of the current URL. Moreover, this method
   // will set the trustLevel enum to the appropriate level from a security point
   // of view. The caller has to handle the case where |trust_level| is not
-  // appropriate.
+  // appropriate.  Passing |null| will skip the trust check.
   // TODO(stuartmorgan): Figure out a clean API for this.
   // See http://crbug.com/457679
   virtual GURL GetCurrentURL(URLVerificationTrustLevel* trust_level) const = 0;
diff --git a/ios/web/thread/OWNERS b/ios/web/thread/OWNERS
new file mode 100644
index 0000000..341fa6d
--- /dev/null
+++ b/ios/web/thread/OWNERS
@@ -0,0 +1,5 @@
+rohitrao@chromium.org
+
+# TEAM: ios-directory-owners@chromium.org
+# OS: iOS
+# COMPONENT: Mobile>iOSWeb
diff --git a/ios/web/web_state/web_state_impl.mm b/ios/web/web_state/web_state_impl.mm
index 5df9a85..9a6eccf 100644
--- a/ios/web/web_state/web_state_impl.mm
+++ b/ios/web/web_state/web_state_impl.mm
@@ -702,6 +702,10 @@
 }
 
 GURL WebStateImpl::GetCurrentURL(URLVerificationTrustLevel* trust_level) const {
+  if (web::GetWebClient()->IsSlimNavigationManagerEnabled() && !trust_level) {
+    auto ignore_trust = URLVerificationTrustLevel::kNone;
+    return [web_controller_ currentURLWithTrustLevel:&ignore_trust];
+  }
   GURL result = [web_controller_ currentURLWithTrustLevel:trust_level];
 
   web::NavigationItemImpl* item =
@@ -735,7 +739,8 @@
                        << " Last committed: " << lastCommittedURL.spec();
   UMA_HISTOGRAM_BOOLEAN("Web.CurrentOriginEqualsLastCommittedOrigin",
                         equalOrigins);
-  if (web::GetWebClient()->IsSlimNavigationManagerEnabled() && !equalOrigins) {
+  if (web::GetWebClient()->IsSlimNavigationManagerEnabled() &&
+      (!equalOrigins || (item && item->IsUntrusted()))) {
     *trust_level = web::URLVerificationTrustLevel::kMixed;
   }
   return result;
diff --git a/media/audio/mac/audio_auhal_mac.h b/media/audio/mac/audio_auhal_mac.h
index 5cbbc246..ae56542 100644
--- a/media/audio/mac/audio_auhal_mac.h
+++ b/media/audio/mac/audio_auhal_mac.h
@@ -22,6 +22,7 @@
 #include <stddef.h>
 #include <stdint.h>
 
+#include <atomic>
 #include <memory>
 
 #include "base/cancelable_callback.h"
@@ -159,7 +160,7 @@
   std::unique_ptr<ScopedAudioUnit> audio_unit_;
 
   // Volume level from 0 to 1.
-  float volume_;
+  std::atomic<float> volume_;
 
   // Fixed playout hardware latency.
   base::TimeDelta hardware_latency_;
diff --git a/media/capture/video/android/video_capture_device_android.cc b/media/capture/video/android/video_capture_device_android.cc
index 000cb36..c2c7640 100644
--- a/media/capture/video/android/video_capture_device_android.cc
+++ b/media/capture/video/android/video_capture_device_android.cc
@@ -629,9 +629,9 @@
   base::AutoLock lock(lock_);
   if (!client_)
     return;
-  client_->OnIncomingCapturedData(data, length, capture_format_,
-                                  capture_color_space_, rotation,
-                                  reference_time, timestamp);
+  client_->OnIncomingCapturedData(
+      data, length, capture_format_, capture_color_space_, rotation,
+      false /* flip_y */, reference_time, timestamp);
 }
 
 VideoPixelFormat VideoCaptureDeviceAndroid::GetColorspace() {
diff --git a/media/capture/video/chromeos/mock_video_capture_client.cc b/media/capture/video/chromeos/mock_video_capture_client.cc
index 23feb6e1..5b2015a 100644
--- a/media/capture/video/chromeos/mock_video_capture_client.cc
+++ b/media/capture/video/chromeos/mock_video_capture_client.cc
@@ -44,14 +44,14 @@
     const VideoCaptureFormat& format,
     const gfx::ColorSpace& color_space,
     int rotation,
+    bool flip_y,
     base::TimeTicks reference_time,
     base::TimeDelta timestamp,
     int frame_feedback_id) {
   ASSERT_GT(length, 0);
   ASSERT_TRUE(data);
-  if (frame_cb_) {
+  if (frame_cb_)
     std::move(frame_cb_).Run();
-  }
 }
 
 void MockVideoCaptureClient::OnIncomingCapturedGfxBuffer(
@@ -63,9 +63,8 @@
     int frame_feedback_id) {
   ASSERT_TRUE(buffer);
   ASSERT_GT(buffer->GetSize().width() * buffer->GetSize().height(), 0);
-  if (frame_cb_) {
+  if (frame_cb_)
     std::move(frame_cb_).Run();
-  }
 }
 
 // Trampoline methods to workaround GMOCK problems with std::unique_ptr<>.
diff --git a/media/capture/video/chromeos/mock_video_capture_client.h b/media/capture/video/chromeos/mock_video_capture_client.h
index e23c17c..555234c 100644
--- a/media/capture/video/chromeos/mock_video_capture_client.h
+++ b/media/capture/video/chromeos/mock_video_capture_client.h
@@ -44,6 +44,7 @@
                               const VideoCaptureFormat& format,
                               const gfx::ColorSpace& color_space,
                               int rotation,
+                              bool flip_y,
                               base::TimeTicks reference_time,
                               base::TimeDelta timestamp,
                               int frame_feedback_id) override;
diff --git a/media/capture/video/fake_video_capture_device.cc b/media/capture/video/fake_video_capture_device.cc
index 300f836e..efcc40a 100644
--- a/media/capture/video/fake_video_capture_device.cc
+++ b/media/capture/video/fake_video_capture_device.cc
@@ -633,7 +633,8 @@
   client()->OnIncomingCapturedData(
       buffer_.get(), frame_size, device_state()->format,
       GetDefaultColorSpace(device_state()->format.pixel_format),
-      0 /* rotation */, now, CalculateTimeSinceFirstInvocation(now));
+      0 /* rotation */, false /* flip_y */, now,
+      CalculateTimeSinceFirstInvocation(now));
 }
 
 ClientBufferFrameDeliverer::ClientBufferFrameDeliverer(
@@ -706,7 +707,7 @@
   base::TimeTicks now = base::TimeTicks::Now();
   client()->OnIncomingCapturedData(
       &jpeg_buffer_[0], frame_size, device_state()->format,
-      gfx::ColorSpace::CreateJpeg(), 0 /* rotation */, now,
+      gfx::ColorSpace::CreateJpeg(), 0 /* rotation */, false /* flip_y */, now,
       CalculateTimeSinceFirstInvocation(now));
 }
 
diff --git a/media/capture/video/fake_video_capture_device_unittest.cc b/media/capture/video/fake_video_capture_device_unittest.cc
index c187e8c42..62fac640 100644
--- a/media/capture/video/fake_video_capture_device_unittest.cc
+++ b/media/capture/video/fake_video_capture_device_unittest.cc
@@ -157,11 +157,11 @@
               *buffer = CreateStubBuffer(0, frame_format.ImageAllocationSize());
               return VideoCaptureDevice::Client::ReserveResult::kSucceeded;
             }));
-    ON_CALL(*result, OnIncomingCapturedData(_, _, _, _, _, _, _, _))
+    ON_CALL(*result, OnIncomingCapturedData(_, _, _, _, _, _, _, _, _))
         .WillByDefault(Invoke(
             [this](const uint8_t*, int,
                    const media::VideoCaptureFormat& frame_format,
-                   const gfx::ColorSpace&, int, base::TimeTicks,
+                   const gfx::ColorSpace&, int, bool, base::TimeTicks,
                    base::TimeDelta, int) { OnFrameCaptured(frame_format); }));
     ON_CALL(*result, OnIncomingCapturedGfxBuffer(_, _, _, _, _, _))
         .WillByDefault(
diff --git a/media/capture/video/file_video_capture_device.cc b/media/capture/video/file_video_capture_device.cc
index 18d506a..6797f83 100644
--- a/media/capture/video/file_video_capture_device.cc
+++ b/media/capture/video/file_video_capture_device.cc
@@ -434,7 +434,8 @@
   // Leave the color space unset for compatibility purposes but this
   // information should be retrieved from the container when possible.
   client_->OnIncomingCapturedData(frame_ptr, frame_size, capture_format_,
-                                  gfx::ColorSpace(), 0, current_time,
+                                  gfx::ColorSpace(), 0 /* clockwise_rotation */,
+                                  false /* flip_y */, current_time,
                                   current_time - first_ref_time_);
 
   // Process waiting photo callbacks
diff --git a/media/capture/video/linux/v4l2_capture_delegate.cc b/media/capture/video/linux/v4l2_capture_delegate.cc
index 839165ba..0d1a0cd 100644
--- a/media/capture/video/linux/v4l2_capture_delegate.cc
+++ b/media/capture/video/linux/v4l2_capture_delegate.cc
@@ -899,7 +899,8 @@
       // See http://crbug.com/959919.
       client_->OnIncomingCapturedData(
           buffer_tracker->start(), buffer_tracker->payload_size(),
-          capture_format_, gfx::ColorSpace(), rotation_, now, timestamp);
+          capture_format_, gfx::ColorSpace(), rotation_, false /* flip_y */,
+          now, timestamp);
     }
 
     while (!take_photo_callbacks_.empty()) {
diff --git a/media/capture/video/linux/v4l2_capture_delegate_unittest.cc b/media/capture/video/linux/v4l2_capture_delegate_unittest.cc
index c186e14..23ad2c0 100644
--- a/media/capture/video/linux/v4l2_capture_delegate_unittest.cc
+++ b/media/capture/video/linux/v4l2_capture_delegate_unittest.cc
@@ -234,7 +234,7 @@
 
     base::RunLoop run_loop;
     base::Closure quit_closure = run_loop.QuitClosure();
-    EXPECT_CALL(*client_ptr, OnIncomingCapturedData(_, _, _, _, _, _, _, _))
+    EXPECT_CALL(*client_ptr, OnIncomingCapturedData(_, _, _, _, _, _, _, _, _))
         .Times(1)
         .WillOnce(RunClosure(quit_closure));
     run_loop.Run();
diff --git a/media/capture/video/linux/video_capture_device_factory_linux_unittest.cc b/media/capture/video/linux/video_capture_device_factory_linux_unittest.cc
index 7224c51..eecb165c 100644
--- a/media/capture/video/linux/video_capture_device_factory_linux_unittest.cc
+++ b/media/capture/video/linux/video_capture_device_factory_linux_unittest.cc
@@ -128,7 +128,7 @@
 
   base::RunLoop wait_loop;
   static const int kFrameToReceive = 3;
-  EXPECT_CALL(*client_ptr, OnIncomingCapturedData(_, _, _, _, _, _, _, _))
+  EXPECT_CALL(*client_ptr, OnIncomingCapturedData(_, _, _, _, _, _, _, _, _))
       .WillRepeatedly(InvokeWithoutArgs([&wait_loop]() {
         static int received_frame_count = 0;
         received_frame_count++;
diff --git a/media/capture/video/mac/video_capture_device_decklink_mac.h b/media/capture/video/mac/video_capture_device_decklink_mac.h
index 98bc8fd2..26de059 100644
--- a/media/capture/video/mac/video_capture_device_decklink_mac.h
+++ b/media/capture/video/mac/video_capture_device_decklink_mac.h
@@ -59,6 +59,7 @@
                               const VideoCaptureFormat& frame_format,
                               const gfx::ColorSpace& color_space,
                               int rotation,  // Clockwise.
+                              bool flip_y,
                               base::TimeTicks reference_time,
                               base::TimeDelta timestamp);
 
diff --git a/media/capture/video/mac/video_capture_device_decklink_mac.mm b/media/capture/video/mac/video_capture_device_decklink_mac.mm
index f49981c..a237819 100644
--- a/media/capture/video/mac/video_capture_device_decklink_mac.mm
+++ b/media/capture/video/mac/video_capture_device_decklink_mac.mm
@@ -298,7 +298,8 @@
     frame_receiver_->OnIncomingCapturedData(
         video_data, video_frame->GetRowBytes() * video_frame->GetHeight(),
         capture_format, gfx::ColorSpace(),
-        0,  // Rotation.
+        0,      // Rotation.
+        false,  // Vertical flip.
         now, timestamp);
   }
   return S_OK;
@@ -491,13 +492,14 @@
     const VideoCaptureFormat& frame_format,
     const gfx::ColorSpace& color_space,
     int rotation,  // Clockwise.
+    bool flip_y,
     base::TimeTicks reference_time,
     base::TimeDelta timestamp) {
   base::AutoLock lock(lock_);
-  if (client_) {
-    client_->OnIncomingCapturedData(data, length, frame_format, color_space,
-                                    rotation, reference_time, timestamp);
-  }
+  if (!client_)
+    return;
+  client_->OnIncomingCapturedData(data, length, frame_format, color_space,
+                                  rotation, flip_y, reference_time, timestamp);
 }
 
 void VideoCaptureDeviceDeckLinkMac::SendErrorString(
diff --git a/media/capture/video/mac/video_capture_device_mac.mm b/media/capture/video/mac/video_capture_device_mac.mm
index 097485312..87994db 100644
--- a/media/capture/video/mac/video_capture_device_mac.mm
+++ b/media/capture/video/mac/video_capture_device_mac.mm
@@ -455,7 +455,8 @@
   }
 
   client_->OnIncomingCapturedData(video_frame, video_frame_length, frame_format,
-                                  color_space, 0, base::TimeTicks::Now(),
+                                  color_space, 0 /* clockwise_rotation */,
+                                  false /* flip_y */, base::TimeTicks::Now(),
                                   timestamp);
 }
 
diff --git a/media/capture/video/mock_device.cc b/media/capture/video/mock_device.cc
index 833cde00..58628eba 100644
--- a/media/capture/video/mock_device.cc
+++ b/media/capture/video/mock_device.cc
@@ -21,8 +21,8 @@
       stub_frame->data(0),
       static_cast<int>(media::VideoFrame::AllocationSize(
           stub_frame->format(), stub_frame->coded_size())),
-      format, gfx::ColorSpace(), rotation, base::TimeTicks(), base::TimeDelta(),
-      frame_feedback_id);
+      format, gfx::ColorSpace(), rotation, false /* flip_y */,
+      base::TimeTicks(), base::TimeDelta(), frame_feedback_id);
 }
 
 void MockDevice::SendOnStarted() {
diff --git a/media/capture/video/mock_video_capture_device_client.h b/media/capture/video/mock_video_capture_device_client.h
index 383df0ef..d096673e 100644
--- a/media/capture/video/mock_video_capture_device_client.h
+++ b/media/capture/video/mock_video_capture_device_client.h
@@ -15,12 +15,13 @@
   MockVideoCaptureDeviceClient();
   ~MockVideoCaptureDeviceClient() override;
 
-  MOCK_METHOD8(OnIncomingCapturedData,
+  MOCK_METHOD9(OnIncomingCapturedData,
                void(const uint8_t* data,
                     int length,
                     const media::VideoCaptureFormat& frame_format,
                     const gfx::ColorSpace& color_space,
                     int rotation,
+                    bool flip_y,
                     base::TimeTicks reference_time,
                     base::TimeDelta timestamp,
                     int frame_feedback_id));
diff --git a/media/capture/video/video_capture_device.h b/media/capture/video/video_capture_device.h
index 7255cf9b..1b374c2 100644
--- a/media/capture/video/video_capture_device.h
+++ b/media/capture/video/video_capture_device.h
@@ -144,11 +144,13 @@
     // OnConsumerReportingUtilization(). This identifier is needed because
     // frames are consumed asynchronously and multiple frames can be "in flight"
     // at the same time.
+    // TODO(crbug.com/978143): remove |frame_feedback_id| default value.
     virtual void OnIncomingCapturedData(const uint8_t* data,
                                         int length,
                                         const VideoCaptureFormat& frame_format,
                                         const gfx::ColorSpace& color_space,
                                         int clockwise_rotation,
+                                        bool flip_y,
                                         base::TimeTicks reference_time,
                                         base::TimeDelta timestamp,
                                         int frame_feedback_id = 0) = 0;
@@ -161,6 +163,7 @@
     // |buffer| when creating the content of the output buffer.
     // |clockwise_rotation|, |reference_time|, |timestamp|, and
     // |frame_feedback_id| serve the same purposes as in OnIncomingCapturedData.
+    // TODO(crbug.com/978143): remove |frame_feedback_id| default value.
     virtual void OnIncomingCapturedGfxBuffer(
         gfx::GpuMemoryBuffer* buffer,
         const VideoCaptureFormat& frame_format,
diff --git a/media/capture/video/video_capture_device_client.cc b/media/capture/video/video_capture_device_client.cc
index daf7901..96b06d2c 100644
--- a/media/capture/video/video_capture_device_client.cc
+++ b/media/capture/video/video_capture_device_client.cc
@@ -194,6 +194,7 @@
     const VideoCaptureFormat& format,
     const gfx::ColorSpace& data_color_space,
     int rotation,
+    bool flip_y,
     base::TimeTicks reference_time,
     base::TimeDelta timestamp,
     int frame_feedback_id) {
@@ -313,14 +314,11 @@
       flip = true;
 #endif
       break;
+    // TODO(crbug.com/953128): Deprecate PIXEL_FORMAT_RGB32
     case PIXEL_FORMAT_RGB32:
-// Fallback to PIXEL_FORMAT_ARGB setting |flip| in Windows
-// platforms.
-#if defined(OS_WIN)
-      flip = true;
-      FALLTHROUGH;
-#endif
     case PIXEL_FORMAT_ARGB:
+      // Windows platforms e.g. send the data vertically flipped sometimes.
+      flip = flip_y;
       fourcc_format = libyuv::FOURCC_ARGB;
       break;
     case PIXEL_FORMAT_MJPEG:
diff --git a/media/capture/video/video_capture_device_client.h b/media/capture/video/video_capture_device_client.h
index 05fd66a..82f3a617 100644
--- a/media/capture/video/video_capture_device_client.h
+++ b/media/capture/video/video_capture_device_client.h
@@ -62,14 +62,17 @@
       int frame_feedback_id);
 
   // VideoCaptureDevice::Client implementation.
+  // TODO(crbug.com/978143): remove |frame_feedback_id| default value.
   void OnIncomingCapturedData(const uint8_t* data,
                               int length,
                               const VideoCaptureFormat& frame_format,
                               const gfx::ColorSpace& color_space,
                               int clockwise_rotation,
+                              bool flip_y,
                               base::TimeTicks reference_time,
                               base::TimeDelta timestamp,
                               int frame_feedback_id = 0) override;
+  // TODO(crbug.com/978143): remove |frame_feedback_id| default value.
   void OnIncomingCapturedGfxBuffer(gfx::GpuMemoryBuffer* buffer,
                                    const VideoCaptureFormat& frame_format,
                                    int clockwise_rotation,
diff --git a/media/capture/video/video_capture_device_client_unittest.cc b/media/capture/video/video_capture_device_client_unittest.cc
index a8f3368..31e84a6b 100644
--- a/media/capture/video/video_capture_device_client_unittest.cc
+++ b/media/capture/video/video_capture_device_client_unittest.cc
@@ -100,7 +100,8 @@
   }
   device_client_->OnIncomingCapturedData(
       data, kScratchpadSizeInBytes, kFrameFormat, kColorSpace,
-      0 /*clockwise rotation*/, base::TimeTicks(), base::TimeDelta());
+      0 /* clockwise rotation */, false /* flip_y */, base::TimeTicks(),
+      base::TimeDelta());
 
   const gfx::Size kBufferDimensions(10, 10);
   const VideoCaptureFormat kFrameFormatNV12(
@@ -139,7 +140,8 @@
   EXPECT_CALL(*receiver_, MockOnFrameReadyInBuffer(_, _, _)).Times(0);
   device_client_->OnIncomingCapturedData(
       data, kScratchpadSizeInBytes, kFrameFormat, kColorSpace,
-      0 /*clockwise rotation*/, base::TimeTicks(), base::TimeDelta());
+      0 /* clockwise rotation */, false /* flip_y */, base::TimeTicks(),
+      base::TimeDelta());
 
   const gfx::Size kBufferDimensions(10, 10);
   const VideoCaptureFormat kFrameFormatNV12(
@@ -185,13 +187,16 @@
   // Pass three frames. The third will be dropped.
   device_client_->OnIncomingCapturedData(
       data, kScratchpadSizeInBytes, kFrameFormat, kColorSpace,
-      0 /*clockwise rotation*/, base::TimeTicks(), base::TimeDelta());
+      0 /* clockwise rotation */, false /* flip_y */, base::TimeTicks(),
+      base::TimeDelta());
   device_client_->OnIncomingCapturedData(
       data, kScratchpadSizeInBytes, kFrameFormat, kColorSpace,
-      0 /*clockwise rotation*/, base::TimeTicks(), base::TimeDelta());
+      0 /* clockwise rotation */, false /* flip_y */, base::TimeTicks(),
+      base::TimeDelta());
   device_client_->OnIncomingCapturedData(
       data, kScratchpadSizeInBytes, kFrameFormat, kColorSpace,
-      0 /*clockwise rotation*/, base::TimeTicks(), base::TimeDelta());
+      0 /* clockwise rotation */, false /* flip_y */, base::TimeTicks(),
+      base::TimeDelta());
   Mock::VerifyAndClearExpectations(receiver_);
 }
 
@@ -237,7 +242,7 @@
     device_client_->OnIncomingCapturedData(
         data, params.requested_format.ImageAllocationSize(),
         params.requested_format, kColorSpace, 0 /* clockwise_rotation */,
-        base::TimeTicks(), base::TimeDelta());
+        false /* flip_y */, base::TimeTicks(), base::TimeDelta());
     Mock::VerifyAndClearExpectations(receiver_);
   }
 }
@@ -277,7 +282,7 @@
     device_client_->OnIncomingCapturedData(
         data, params.requested_format.ImageAllocationSize(),
         params.requested_format, gfx::ColorSpace(), size_and_rotation.rotation,
-        base::TimeTicks(), base::TimeDelta());
+        false /* flip_y */, base::TimeTicks(), base::TimeDelta());
 
     EXPECT_EQ(coded_size.width(), size_and_rotation.output_resolution.width());
     EXPECT_EQ(coded_size.height(),
diff --git a/media/capture/video/video_capture_device_unittest.cc b/media/capture/video/video_capture_device_unittest.cc
index 506163b..69d5174 100644
--- a/media/capture/video/video_capture_device_unittest.cc
+++ b/media/capture/video/video_capture_device_unittest.cc
@@ -307,11 +307,11 @@
     EXPECT_CALL(*result, DoOnIncomingCapturedBuffer(_, _, _, _)).Times(0);
     EXPECT_CALL(*result, DoOnIncomingCapturedBufferExt(_, _, _, _, _, _, _))
         .Times(0);
-    ON_CALL(*result, OnIncomingCapturedData(_, _, _, _, _, _, _, _))
+    ON_CALL(*result, OnIncomingCapturedData(_, _, _, _, _, _, _, _, _))
         .WillByDefault(
             Invoke([this](const uint8_t* data, int length,
                           const media::VideoCaptureFormat& frame_format,
-                          const gfx::ColorSpace&, int, base::TimeTicks,
+                          const gfx::ColorSpace&, int, bool, base::TimeTicks,
                           base::TimeDelta, int) {
               ASSERT_GT(length, 0);
               ASSERT_TRUE(data);
diff --git a/media/capture/video/win/sink_filter_observer_win.h b/media/capture/video/win/sink_filter_observer_win.h
index 1b3dc1c..646c443e7 100644
--- a/media/capture/video/win/sink_filter_observer_win.h
+++ b/media/capture/video/win/sink_filter_observer_win.h
@@ -20,7 +20,8 @@
   virtual void FrameReceived(const uint8_t* buffer,
                              int length,
                              const VideoCaptureFormat& format,
-                             base::TimeDelta timestamp) = 0;
+                             base::TimeDelta timestamp,
+                             bool flip_y) = 0;
 
   virtual void FrameDropped(VideoCaptureFrameDropReason reason) = 0;
 
diff --git a/media/capture/video/win/sink_input_pin_win.cc b/media/capture/video/win/sink_input_pin_win.cc
index 92ae610..8c3f69e 100644
--- a/media/capture/video/win/sink_input_pin_win.cc
+++ b/media/capture/video/win/sink_input_pin_win.cc
@@ -25,8 +25,10 @@
 }
 
 SinkInputPin::SinkInputPin(IBaseFilter* filter, SinkFilterObserver* observer)
-    : PinBase(filter), requested_frame_rate_(0), observer_(observer) {
-}
+    : PinBase(filter),
+      requested_frame_rate_(0),
+      flip_y_(false),
+      observer_(observer) {}
 
 void SinkInputPin::SetRequestedMediaFormat(
     VideoPixelFormat pixel_format,
@@ -93,7 +95,8 @@
   }
   if (sub_type == MEDIASUBTYPE_RGB32 &&
       pvi->bmiHeader.biCompression == BI_RGB) {
-    resulting_format_.pixel_format = PIXEL_FORMAT_RGB32;
+    resulting_format_.pixel_format = PIXEL_FORMAT_ARGB;
+    flip_y_ = true;
     return true;
   }
   if (sub_type == kMediaSubTypeY16 &&
@@ -229,7 +232,8 @@
     timestamp = base::TimeDelta::FromMicroseconds(start_time / 10);
   }
 
-  observer_->FrameReceived(buffer, length, resulting_format_, timestamp);
+  observer_->FrameReceived(buffer, length, resulting_format_, timestamp,
+                           flip_y_);
   return S_OK;
 }
 
diff --git a/media/capture/video/win/sink_input_pin_win.h b/media/capture/video/win/sink_input_pin_win.h
index add0beb..5e32cb46 100644
--- a/media/capture/video/win/sink_input_pin_win.h
+++ b/media/capture/video/win/sink_input_pin_win.h
@@ -41,6 +41,7 @@
   float requested_frame_rate_;
   BITMAPINFOHEADER requested_info_header_;
   VideoCaptureFormat resulting_format_;
+  bool flip_y_;
   SinkFilterObserver* observer_;
 
   DISALLOW_IMPLICIT_CONSTRUCTORS(SinkInputPin);
diff --git a/media/capture/video/win/video_capture_device_mf_win.cc b/media/capture/video/win/video_capture_device_mf_win.cc
index 86f096bc..d5f15c6 100644
--- a/media/capture/video/win/video_capture_device_mf_win.cc
+++ b/media/capture/video/win/video_capture_device_mf_win.cc
@@ -1008,8 +1008,8 @@
     // build a gfx::ColorSpace. See http://crbug.com/959988.
     client_->OnIncomingCapturedData(
         data, length, selected_video_capability_->supported_format,
-        gfx::ColorSpace(), GetCameraRotation(facing_mode_), reference_time,
-        timestamp);
+        gfx::ColorSpace(), GetCameraRotation(facing_mode_), false /* flip_y */,
+        reference_time, timestamp);
   }
 
   while (!video_stream_take_photo_callbacks_.empty()) {
diff --git a/media/capture/video/win/video_capture_device_mf_win_unittest.cc b/media/capture/video/win/video_capture_device_mf_win_unittest.cc
index 6c96763..000a5a6 100644
--- a/media/capture/video/win/video_capture_device_mf_win_unittest.cc
+++ b/media/capture/video/win/video_capture_device_mf_win_unittest.cc
@@ -32,6 +32,7 @@
                               const VideoCaptureFormat& frame_format,
                               const gfx::ColorSpace& color_space,
                               int clockwise_rotation,
+                              bool flip_y,
                               base::TimeTicks reference_time,
                               base::TimeDelta timestamp,
                               int frame_feedback_id = 0) override {}
diff --git a/media/capture/video/win/video_capture_device_win.cc b/media/capture/video/win/video_capture_device_win.cc
index 9f59899..f03d8c2 100644
--- a/media/capture/video/win/video_capture_device_win.cc
+++ b/media/capture/video/win/video_capture_device_win.cc
@@ -917,7 +917,8 @@
 void VideoCaptureDeviceWin::FrameReceived(const uint8_t* buffer,
                                           int length,
                                           const VideoCaptureFormat& format,
-                                          base::TimeDelta timestamp) {
+                                          base::TimeDelta timestamp,
+                                          bool flip_y) {
   if (first_ref_time_.is_null())
     first_ref_time_ = base::TimeTicks::Now();
 
@@ -934,7 +935,7 @@
   // DXVA_NominalRangeto build a gfx::ColorSpace. See http://crbug.com/959992.
   client_->OnIncomingCapturedData(buffer, length, format, gfx::ColorSpace(),
                                   GetCameraRotation(device_descriptor_.facing),
-                                  base::TimeTicks::Now(), timestamp);
+                                  flip_y, base::TimeTicks::Now(), timestamp);
 
   while (!take_photo_callbacks_.empty()) {
     TakePhotoCallback cb = std::move(take_photo_callbacks_.front());
diff --git a/media/capture/video/win/video_capture_device_win.h b/media/capture/video/win/video_capture_device_win.h
index cae1391..120ca00 100644
--- a/media/capture/video/win/video_capture_device_win.h
+++ b/media/capture/video/win/video_capture_device_win.h
@@ -104,7 +104,8 @@
   void FrameReceived(const uint8_t* buffer,
                      int length,
                      const VideoCaptureFormat& format,
-                     base::TimeDelta timestamp) override;
+                     base::TimeDelta timestamp,
+                     bool flip_y) override;
   void FrameDropped(VideoCaptureFrameDropReason reason) override;
 
   bool CreateCapabilityMap();
diff --git a/media/video/gpu_memory_buffer_video_frame_pool.cc b/media/video/gpu_memory_buffer_video_frame_pool.cc
index e9e7777..666953f 100644
--- a/media/video/gpu_memory_buffer_video_frame_pool.cc
+++ b/media/video/gpu_memory_buffer_video_frame_pool.cc
@@ -118,6 +118,10 @@
 
     const gfx::Size size;
     PlaneResource plane_resources[VideoFrame::kMaxPlanes];
+    // The sync token used to recycle or destroy the resources. It is set when
+    // the resources are returned from the VideoFrame (via
+    // MailboxHoldersReleased).
+    gpu::SyncToken sync_token;
 
    private:
     bool is_used_ = true;
@@ -184,11 +188,6 @@
   void MailboxHoldersReleased(FrameResources* frame_resources,
                               const gpu::SyncToken& sync_token);
 
-  // Callback called when a VideoFrame generated with GetFrameResources has
-  // outlived its release SyncToken.
-  // This must be called on the thread where |media_task_runner_| is current.
-  void MailboxHoldersWaited(FrameResources* frame_resources);
-
   // Delete resources. This has to be called on the thread where |task_runner|
   // is current.
   static void DeleteFrameResources(
@@ -934,8 +933,8 @@
                                  gpu_factories_->GpuMemoryBufferManager(),
                                  video_frame->ColorSpace(), usage);
     } else if (!plane_resource.mailbox.IsZero()) {
-      // The sync token was waited on the client side before reuse.
-      sii->UpdateSharedImage(gpu::SyncToken(), plane_resource.mailbox);
+      sii->UpdateSharedImage(frame_resources->sync_token,
+                             plane_resource.mailbox);
     }
     mailbox_holders[i] = gpu::MailboxHolder(plane_resource.mailbox,
                                             gpu::SyncToken(), texture_target);
@@ -959,7 +958,7 @@
 
   if (!frame) {
     frame_resources->MarkUnused(tick_clock_->NowTicks());
-    MailboxHoldersReleased(frame_resources, gpu::SyncToken());
+    MailboxHoldersReleased(frame_resources, sync_token);
     CompleteCopyRequestAndMaybeStartNextCopy(std::move(video_frame));
     return;
   }
@@ -1110,9 +1109,8 @@
 
   for (PlaneResource& plane_resource : frame_resources->plane_resources) {
     if (!plane_resource.mailbox.IsZero()) {
-      // The sync token was already waited on the client side in
-      // MailboxHoldersReleased.
-      sii->DestroySharedImage(gpu::SyncToken(), plane_resource.mailbox);
+      sii->DestroySharedImage(frame_resources->sync_token,
+                              plane_resource.mailbox);
     }
   }
 }
@@ -1128,27 +1126,7 @@
                                   frame_resources, release_sync_token));
     return;
   }
-
-  // TODO(sandersd): Remove once https://crbug.com/819914 is fixed. Correct
-  // clients must wait for READ_LOCK_FENCES_ENABLED frames to be read before
-  // returning the frame, so waiting on the sync token should be a no-op.
-  //
-  // If the context is lost, SignalSyncToken() drops its callbacks. Using a
-  // ScopedClosureRunner ensures MailboxHoldersWaited() is called if that
-  // happens.
-  std::unique_ptr<base::ScopedClosureRunner> waited_cb =
-      std::make_unique<base::ScopedClosureRunner>(base::BindOnce(
-          &GpuMemoryBufferVideoFramePool::PoolImpl::MailboxHoldersWaited, this,
-          frame_resources));
-  gpu_factories_->SignalSyncToken(
-      release_sync_token,
-      base::BindOnce(&base::ScopedClosureRunner::RunAndReset,
-                     std::move(waited_cb)));
-}
-
-void GpuMemoryBufferVideoFramePool::PoolImpl::MailboxHoldersWaited(
-    FrameResources* frame_resources) {
-  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  frame_resources->sync_token = release_sync_token;
 
   if (in_shutdown_) {
     DeleteFrameResources(gpu_factories_, frame_resources);
diff --git a/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc b/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc
index 7ab1e93..ce68d79 100644
--- a/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc
+++ b/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc
@@ -35,8 +35,6 @@
     media_task_runner_handle_.reset(
         new base::ThreadTaskRunnerHandle(media_task_runner_));
     mock_gpu_factories_.reset(new MockGpuVideoAcceleratorFactories(sii_.get()));
-    EXPECT_CALL(*mock_gpu_factories_.get(), SignalSyncToken(_, _))
-        .Times(AtLeast(0));
     gpu_memory_buffer_pool_.reset(new GpuMemoryBufferVideoFramePool(
         media_task_runner_, copy_task_runner_.get(),
         mock_gpu_factories_.get()));
diff --git a/media/video/gpu_video_accelerator_factories.h b/media/video/gpu_video_accelerator_factories.h
index ead732da..36eed90 100644
--- a/media/video/gpu_video_accelerator_factories.h
+++ b/media/video/gpu_video_accelerator_factories.h
@@ -37,7 +37,6 @@
 namespace gpu {
 class GpuMemoryBufferManager;
 class SharedImageInterface;
-struct SyncToken;
 }
 
 namespace viz {
@@ -98,9 +97,6 @@
   virtual std::unique_ptr<VideoEncodeAccelerator>
   CreateVideoEncodeAccelerator() = 0;
 
-  virtual void SignalSyncToken(const gpu::SyncToken& sync_token,
-                               base::OnceClosure callback) = 0;
-
   virtual std::unique_ptr<gfx::GpuMemoryBuffer> CreateGpuMemoryBuffer(
       const gfx::Size& size,
       gfx::BufferFormat format,
diff --git a/media/video/mock_gpu_video_accelerator_factories.h b/media/video/mock_gpu_video_accelerator_factories.h
index 85176ed..e971131 100644
--- a/media/video/mock_gpu_video_accelerator_factories.h
+++ b/media/video/mock_gpu_video_accelerator_factories.h
@@ -47,9 +47,6 @@
   // framework does not want. Trampoline it.
   MOCK_METHOD0(DoCreateVideoEncodeAccelerator, VideoEncodeAccelerator*());
 
-  MOCK_METHOD2(SignalSyncToken,
-               void(const gpu::SyncToken& sync_token,
-                    base::OnceClosure callback));
   MOCK_METHOD0(GetTaskRunner, scoped_refptr<base::SingleThreadTaskRunner>());
   MOCK_METHOD0(GetVideoEncodeAcceleratorSupportedProfiles,
                VideoEncodeAccelerator::SupportedProfiles());
diff --git a/mojo/public/cpp/base/BUILD.gn b/mojo/public/cpp/base/BUILD.gn
index 934bb510..907613a 100644
--- a/mojo/public/cpp/base/BUILD.gn
+++ b/mojo/public/cpp/base/BUILD.gn
@@ -38,6 +38,8 @@
     "file_mojom_traits.h",
     "file_path_mojom_traits.cc",
     "file_path_mojom_traits.h",
+    "generic_pending_receiver_mojom_traits.cc",
+    "generic_pending_receiver_mojom_traits.h",
     "shared_memory_mojom_traits.cc",
     "shared_memory_mojom_traits.h",
     "time_mojom_traits.cc",
diff --git a/mojo/public/cpp/base/generic_pending_receiver.typemap b/mojo/public/cpp/base/generic_pending_receiver.typemap
new file mode 100644
index 0000000..bb60f15
--- /dev/null
+++ b/mojo/public/cpp/base/generic_pending_receiver.typemap
@@ -0,0 +1,15 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+mojom = "//mojo/public/mojom/base/generic_pending_receiver.mojom"
+public_headers = [ "//mojo/public/cpp/bindings/generic_pending_receiver.h" ]
+traits_headers =
+    [ "//mojo/public/cpp/base/generic_pending_receiver_mojom_traits.h" ]
+public_deps = [
+  "//mojo/public/cpp/bindings",
+]
+deps = [
+  "//mojo/public/cpp/base:shared_typemap_traits",
+]
+type_mappings = [ "mojo_base.mojom.GenericPendingReceiver=::mojo::GenericPendingReceiver[move_only]" ]
diff --git a/mojo/public/cpp/base/generic_pending_receiver_mojom_traits.cc b/mojo/public/cpp/base/generic_pending_receiver_mojom_traits.cc
new file mode 100644
index 0000000..fb6137df
--- /dev/null
+++ b/mojo/public/cpp/base/generic_pending_receiver_mojom_traits.cc
@@ -0,0 +1,22 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "mojo/public/cpp/base/generic_pending_receiver_mojom_traits.h"
+
+namespace mojo {
+
+// static
+bool StructTraits<mojo_base::mojom::GenericPendingReceiverDataView,
+                  GenericPendingReceiver>::
+    Read(mojo_base::mojom::GenericPendingReceiverDataView data,
+         GenericPendingReceiver* out) {
+  base::StringPiece interface_name;
+  if (!data.ReadInterfaceName(&interface_name))
+    return false;
+  *out = GenericPendingReceiver(interface_name.as_string(),
+                                data.TakeReceivingPipe());
+  return true;
+}
+
+}  // namespace mojo
diff --git a/mojo/public/cpp/base/generic_pending_receiver_mojom_traits.h b/mojo/public/cpp/base/generic_pending_receiver_mojom_traits.h
new file mode 100644
index 0000000..ad6e284d
--- /dev/null
+++ b/mojo/public/cpp/base/generic_pending_receiver_mojom_traits.h
@@ -0,0 +1,37 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MOJO_PUBLIC_CPP_BASE_GENERIC_PENDING_RECEIVER_MOJOM_TRAITS_H_
+#define MOJO_PUBLIC_CPP_BASE_GENERIC_PENDING_RECEIVER_MOJOM_TRAITS_H_
+
+#include "base/component_export.h"
+#include "base/strings/string_piece.h"
+#include "mojo/public/cpp/bindings/generic_pending_receiver.h"
+#include "mojo/public/cpp/bindings/struct_traits.h"
+#include "mojo/public/mojom/base/generic_pending_receiver.mojom-shared.h"
+
+namespace mojo {
+
+template <>
+struct COMPONENT_EXPORT(MOJO_BASE_SHARED_TRAITS)
+    StructTraits<mojo_base::mojom::GenericPendingReceiverDataView,
+                 GenericPendingReceiver> {
+  static base::StringPiece interface_name(
+      const GenericPendingReceiver& receiver) {
+    DCHECK(receiver.interface_name().has_value());
+    return receiver.interface_name().value();
+  }
+
+  static mojo::ScopedMessagePipeHandle receiving_pipe(
+      GenericPendingReceiver& receiver) {
+    return receiver.PassPipe();
+  }
+
+  static bool Read(mojo_base::mojom::GenericPendingReceiverDataView data,
+                   GenericPendingReceiver* out);
+};
+
+}  // namespace mojo
+
+#endif  // MOJO_PUBLIC_CPP_BASE_GENERIC_PENDING_RECEIVER_MOJOM_TRAITS_H_
diff --git a/mojo/public/cpp/base/typemaps.gni b/mojo/public/cpp/base/typemaps.gni
index 874e8c9..49a7cd1 100644
--- a/mojo/public/cpp/base/typemaps.gni
+++ b/mojo/public/cpp/base/typemaps.gni
@@ -10,6 +10,7 @@
   "//mojo/public/cpp/base/file_info.typemap",
   "//mojo/public/cpp/base/file_path.typemap",
   "//mojo/public/cpp/base/file.typemap",
+  "//mojo/public/cpp/base/generic_pending_receiver.typemap",
   "//mojo/public/cpp/base/read_only_buffer.typemap",
   "//mojo/public/cpp/base/memory_allocator_dump_cross_process_uid.typemap",
   "//mojo/public/cpp/base/memory_pressure_level.typemap",
diff --git a/mojo/public/cpp/bindings/BUILD.gn b/mojo/public/cpp/bindings/BUILD.gn
index 7f9c724..43b3638 100644
--- a/mojo/public/cpp/bindings/BUILD.gn
+++ b/mojo/public/cpp/bindings/BUILD.gn
@@ -127,6 +127,8 @@
     "connection_error_callback.h",
     "connector.h",
     "filter_chain.h",
+    "generic_pending_receiver.cc",
+    "generic_pending_receiver.h",
     "interface_endpoint_client.h",
     "interface_endpoint_controller.h",
     "interface_ptr.h",
diff --git a/mojo/public/cpp/bindings/generic_pending_receiver.cc b/mojo/public/cpp/bindings/generic_pending_receiver.cc
new file mode 100644
index 0000000..1fb70944d
--- /dev/null
+++ b/mojo/public/cpp/bindings/generic_pending_receiver.cc
@@ -0,0 +1,39 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "mojo/public/cpp/bindings/generic_pending_receiver.h"
+
+namespace mojo {
+
+GenericPendingReceiver::GenericPendingReceiver() = default;
+
+GenericPendingReceiver::GenericPendingReceiver(
+    base::StringPiece interface_name,
+    mojo::ScopedMessagePipeHandle receiving_pipe)
+    : interface_name_(interface_name.as_string()),
+      pipe_(std::move(receiving_pipe)) {}
+
+GenericPendingReceiver::GenericPendingReceiver(GenericPendingReceiver&&) =
+    default;
+
+GenericPendingReceiver::~GenericPendingReceiver() = default;
+
+GenericPendingReceiver& GenericPendingReceiver::operator=(
+    GenericPendingReceiver&&) = default;
+
+mojo::ScopedMessagePipeHandle GenericPendingReceiver::PassPipe() {
+  DCHECK(is_valid());
+  interface_name_.reset();
+  return std::move(pipe_);
+}
+
+mojo::ScopedMessagePipeHandle GenericPendingReceiver::PassPipeIfNameIs(
+    const char* interface_name) {
+  DCHECK(is_valid());
+  if (interface_name_ == interface_name)
+    return PassPipe();
+  return mojo::ScopedMessagePipeHandle();
+}
+
+}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/generic_pending_receiver.h b/mojo/public/cpp/bindings/generic_pending_receiver.h
new file mode 100644
index 0000000..8a0a71a
--- /dev/null
+++ b/mojo/public/cpp/bindings/generic_pending_receiver.h
@@ -0,0 +1,72 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MOJO_PUBLIC_CPP_BINDINGS_GENERIC_PENDING_RECEIVER_H_
+#define MOJO_PUBLIC_CPP_BINDINGS_GENERIC_PENDING_RECEIVER_H_
+
+#include <string>
+
+#include "base/component_export.h"
+#include "base/macros.h"
+#include "base/optional.h"
+#include "base/strings/string_piece.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/system/message_pipe.h"
+
+namespace mojo {
+
+// GenericPendingReceiver encapsulates a pairing of a receiving pipe endpoint
+// with the name of the mojom interface assumed by the corresponding remote
+// endpoint.
+//
+// This is used by mojom C++ bindings to represent
+// |mojo_base.mojom.GenericPendingReceiver|, and it serves as a semi-safe
+// wrapper for transporting arbitrary interface receivers in a generic object.
+class COMPONENT_EXPORT(MOJO_CPP_BINDINGS) GenericPendingReceiver {
+ public:
+  GenericPendingReceiver();
+  GenericPendingReceiver(base::StringPiece interface_name,
+                         mojo::ScopedMessagePipeHandle receiving_pipe);
+
+  template <typename Interface>
+  GenericPendingReceiver(mojo::PendingReceiver<Interface> receiver)
+      : GenericPendingReceiver(Interface::Name_, receiver.PassPipe()) {}
+
+  GenericPendingReceiver(GenericPendingReceiver&&);
+  ~GenericPendingReceiver();
+
+  GenericPendingReceiver& operator=(GenericPendingReceiver&&);
+
+  bool is_valid() const { return pipe_.is_valid(); }
+  explicit operator bool() const { return is_valid(); }
+
+  const base::Optional<std::string>& interface_name() const {
+    return interface_name_;
+  }
+
+  mojo::MessagePipeHandle pipe() const { return pipe_.get(); }
+
+  // Takes ownership of the receiving pipe, invalidating this
+  // GenericPendingReceiver.
+  mojo::ScopedMessagePipeHandle PassPipe();
+
+  // Takes ownership of the pipe, strongly typed as an |Interface| receiver, if
+  // and only if that interface's name matches the stored interface name.
+  template <typename Interface>
+  mojo::PendingReceiver<Interface> As() {
+    return mojo::PendingReceiver<Interface>(PassPipeIfNameIs(Interface::Name_));
+  }
+
+ private:
+  mojo::ScopedMessagePipeHandle PassPipeIfNameIs(const char* interface_name);
+
+  base::Optional<std::string> interface_name_;
+  mojo::ScopedMessagePipeHandle pipe_;
+
+  DISALLOW_COPY_AND_ASSIGN(GenericPendingReceiver);
+};
+
+}  // namespace mojo
+
+#endif  // MOJO_PUBLIC_CPP_BINDINGS_GENERIC_PENDING_RECEIVER_H_
diff --git a/mojo/public/cpp/bindings/tests/receiver_unittest.cc b/mojo/public/cpp/bindings/tests/receiver_unittest.cc
index d49efe8..aa9cd71 100644
--- a/mojo/public/cpp/bindings/tests/receiver_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/receiver_unittest.cc
@@ -550,6 +550,25 @@
   EXPECT_FALSE(null_pending);
 }
 
+TEST_P(ReceiverTest, GenericPendingReceiver) {
+  Remote<sample::Service> remote;
+  GenericPendingReceiver receiver;
+  EXPECT_FALSE(receiver.is_valid());
+  EXPECT_FALSE(receiver.interface_name().has_value());
+
+  receiver = GenericPendingReceiver(remote.BindNewPipeAndPassReceiver());
+  ASSERT_TRUE(receiver.is_valid());
+  EXPECT_EQ(sample::Service::Name_, receiver.interface_name());
+
+  auto ping_receiver = receiver.As<test::PingService>();
+  EXPECT_FALSE(ping_receiver.is_valid());
+  EXPECT_TRUE(receiver.is_valid());
+
+  auto sample_receiver = receiver.As<sample::Service>();
+  EXPECT_TRUE(sample_receiver.is_valid());
+  EXPECT_FALSE(receiver.is_valid());
+}
+
 using StrongBindingTest = BindingsTestBase;
 
 TEST_P(StrongBindingTest, CloseDestroysImplAndPipe) {
diff --git a/mojo/public/cpp/platform/features.cc b/mojo/public/cpp/platform/features.cc
index 79bdd62..80f3be9c 100644
--- a/mojo/public/cpp/platform/features.cc
+++ b/mojo/public/cpp/platform/features.cc
@@ -12,7 +12,7 @@
 // transport mechanism for PlatformChannel. Otherwise, macOS defaults to using
 // ChannelPosix.
 const base::Feature kMojoChannelMac{"MojoChannelMac",
-                                    base::FEATURE_DISABLED_BY_DEFAULT};
+                                    base::FEATURE_ENABLED_BY_DEFAULT};
 #endif
 
 }  // namespace features
diff --git a/mojo/public/interfaces/bindings/tests/BUILD.gn b/mojo/public/interfaces/bindings/tests/BUILD.gn
index a5efd42..97f241a7 100644
--- a/mojo/public/interfaces/bindings/tests/BUILD.gn
+++ b/mojo/public/interfaces/bindings/tests/BUILD.gn
@@ -301,6 +301,7 @@
     ":echo",
     ":test_mojom_import",
     ":test_mojom_import2",
+    "//mojo/public/mojom/base",
   ]
 
   support_lazy_serialization = true
diff --git a/mojo/public/interfaces/bindings/tests/sample_interfaces.mojom b/mojo/public/interfaces/bindings/tests/sample_interfaces.mojom
index 5960d75..1bcd7502 100644
--- a/mojo/public/interfaces/bindings/tests/sample_interfaces.mojom
+++ b/mojo/public/interfaces/bindings/tests/sample_interfaces.mojom
@@ -7,6 +7,8 @@
  Foo = "hello world"]
 module sample;
 
+import "mojo/public/mojom/base/generic_pending_receiver.mojom";
+
 const uint64 kLong = 4405;
 
 enum Enum {
@@ -30,3 +32,7 @@
   [MinVersion=1]
   SetInteger(int64 data, [MinVersion=3] Enum type);
 };
+
+interface InterfaceFactory {
+  BindInterface(mojo_base.mojom.GenericPendingReceiver receiver);
+};
diff --git a/mojo/public/mojom/base/BUILD.gn b/mojo/public/mojom/base/BUILD.gn
index e6c8e1a7..0a8418ce 100644
--- a/mojo/public/mojom/base/BUILD.gn
+++ b/mojo/public/mojom/base/BUILD.gn
@@ -13,6 +13,7 @@
     "file_error.mojom",
     "file_info.mojom",
     "file_path.mojom",
+    "generic_pending_receiver.mojom",
     "memory_allocator_dump_cross_process_uid.mojom",
     "memory_pressure_level.mojom",
     "process_id.mojom",
diff --git a/mojo/public/mojom/base/generic_pending_receiver.mojom b/mojo/public/mojom/base/generic_pending_receiver.mojom
new file mode 100644
index 0000000..67dda27
--- /dev/null
+++ b/mojo/public/mojom/base/generic_pending_receiver.mojom
@@ -0,0 +1,16 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module mojo_base.mojom;
+
+// Convenience helper to wrap the pairing of a receiving pipe endpoint and the
+// name of the interface expected by the remote endpoint.
+//
+// This should be used sparingly, in cases where APIs need to dynamically pass
+// different types of receivers that cannot or should not be known at compile
+// time.
+struct GenericPendingReceiver {
+  string interface_name;
+  handle<message_pipe> receiving_pipe;
+};
diff --git a/net/BUILD.gn b/net/BUILD.gn
index bc07121..29a237d 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -3731,6 +3731,11 @@
     "data/crl_unittest/bad_fake_critical_extension.pem",
     "data/crl_unittest/bad_idp_contains_wrong_uri.pem",
     "data/crl_unittest/bad_idp_indirectcrl.pem",
+    "data/crl_unittest/bad_idp_onlycontainscacerts.pem",
+    "data/crl_unittest/bad_idp_onlycontainscacerts_no_basic_constraints.pem",
+    "data/crl_unittest/bad_idp_onlycontainsusercerts.pem",
+    "data/crl_unittest/bad_idp_uri_and_onlycontainscacerts.pem",
+    "data/crl_unittest/bad_idp_uri_and_onlycontainsusercerts.pem",
     "data/crl_unittest/bad_key_rollover_signature.pem",
     "data/crl_unittest/bad_nextupdate_too_old.pem",
     "data/crl_unittest/bad_signature.pem",
@@ -3742,6 +3747,11 @@
     "data/crl_unittest/good_fake_extension_no_nextupdate.pem",
     "data/crl_unittest/good_generalizedtime.pem",
     "data/crl_unittest/good_idp_contains_uri.pem",
+    "data/crl_unittest/good_idp_onlycontainscacerts.pem",
+    "data/crl_unittest/good_idp_onlycontainsusercerts.pem",
+    "data/crl_unittest/good_idp_onlycontainsusercerts_no_basic_constraints.pem",
+    "data/crl_unittest/good_idp_uri_and_onlycontainscacerts.pem",
+    "data/crl_unittest/good_idp_uri_and_onlycontainsusercerts.pem",
     "data/crl_unittest/good_issuer_name_normalization.pem",
     "data/crl_unittest/good_issuer_no_keyusage.pem",
     "data/crl_unittest/good_key_rollover.pem",
@@ -3767,6 +3777,8 @@
     "data/crl_unittest/invalid_garbage_version.pem",
     "data/crl_unittest/invalid_idp_dpname_choice_extra_data.pem",
     "data/crl_unittest/invalid_idp_empty_sequence.pem",
+    "data/crl_unittest/invalid_idp_onlycontains_user_and_ca_certs.pem",
+    "data/crl_unittest/invalid_idp_onlycontainsusercerts_v1_leaf.pem",
     "data/crl_unittest/invalid_issuer_keyusage_no_crlsign.pem",
     "data/crl_unittest/invalid_key_rollover_issuer_keyusage_no_crlsign.pem",
     "data/crl_unittest/invalid_mismatched_signature_algorithm.pem",
diff --git a/net/base/net_error_list.h b/net/base/net_error_list.h
index 38cdde8..6fc8c5e 100644
--- a/net/base/net_error_list.h
+++ b/net/base/net_error_list.h
@@ -625,8 +625,8 @@
 // There are no supported proxies in the provided list.
 NET_ERROR(NO_SUPPORTED_PROXIES, -336)
 
-// There is a SPDY protocol error.
-NET_ERROR(SPDY_PROTOCOL_ERROR, -337)
+// There is an HTTP/2 protocol error.
+NET_ERROR(HTTP2_PROTOCOL_ERROR, -337)
 
 // Credentials could not be established during HTTP Authentication.
 NET_ERROR(INVALID_AUTH_CREDENTIALS, -338)
@@ -657,9 +657,9 @@
 // The HTTP response contained multiple distinct Content-Length headers.
 NET_ERROR(RESPONSE_HEADERS_MULTIPLE_CONTENT_LENGTH, -346)
 
-// SPDY Headers have been received, but not all of them - status or version
+// HTTP/2 headers have been received, but not all of them - status or version
 // headers are missing, so we're expecting additional frames to complete them.
-NET_ERROR(INCOMPLETE_SPDY_HEADERS, -347)
+NET_ERROR(INCOMPLETE_HTTP2_HEADERS, -347)
 
 // No PAC URL configuration could be retrieved from DHCP. This can indicate
 // either a failure to retrieve the DHCP configuration, or that there was no
@@ -677,10 +677,10 @@
 // stream id corresponding to the request indicating that this request has not
 // been processed yet, or a RST_STREAM frame with error code REFUSED_STREAM.
 // Client MAY retry (on a different connection).  See RFC7540 Section 8.1.4.
-NET_ERROR(SPDY_SERVER_REFUSED_STREAM, -351)
+NET_ERROR(HTTP2_SERVER_REFUSED_STREAM, -351)
 
-// SPDY server didn't respond to the PING message.
-NET_ERROR(SPDY_PING_FAILED, -352)
+// HTTP/2 server didn't respond to the PING message.
+NET_ERROR(HTTP2_PING_FAILED, -352)
 
 // Obsolete.  Kept here to avoid reuse, as the old error can still appear on
 // histograms.
@@ -708,17 +708,17 @@
 // histograms.
 // NET_ERROR(REQUEST_FOR_SECURE_RESOURCE_OVER_INSECURE_QUIC, -359)
 
-// Transport security is inadequate for the SPDY version.
-NET_ERROR(SPDY_INADEQUATE_TRANSPORT_SECURITY, -360)
+// Transport security is inadequate for the HTTP/2 version.
+NET_ERROR(HTTP2_INADEQUATE_TRANSPORT_SECURITY, -360)
 
-// The peer violated SPDY flow control.
-NET_ERROR(SPDY_FLOW_CONTROL_ERROR, -361)
+// The peer violated HTTP/2 flow control.
+NET_ERROR(HTTP2_FLOW_CONTROL_ERROR, -361)
 
-// The peer sent an improperly sized SPDY frame.
-NET_ERROR(SPDY_FRAME_SIZE_ERROR, -362)
+// The peer sent an improperly sized HTTP/2 frame.
+NET_ERROR(HTTP2_FRAME_SIZE_ERROR, -362)
 
-// Decoding or encoding of compressed SPDY headers failed.
-NET_ERROR(SPDY_COMPRESSION_ERROR, -363)
+// Decoding or encoding of compressed HTTP/2 headers failed.
+NET_ERROR(HTTP2_COMPRESSION_ERROR, -363)
 
 // Proxy Auth Requested without a valid Client Socket Handle.
 NET_ERROR(PROXY_AUTH_REQUESTED_WITH_NO_CONNECTION, -364)
@@ -747,14 +747,14 @@
 // Received HTTP/2 RST_STREAM frame with NO_ERROR error code.  This error should
 // be handled internally by HTTP/2 code, and should not make it above the
 // SpdyStream layer.
-NET_ERROR(SPDY_RST_STREAM_NO_ERROR_RECEIVED, -372)
+NET_ERROR(HTTP2_RST_STREAM_NO_ERROR_RECEIVED, -372)
 
 // The pushed stream claimed by the request is no longer available.
-NET_ERROR(SPDY_PUSHED_STREAM_NOT_AVAILABLE, -373)
+NET_ERROR(HTTP2_PUSHED_STREAM_NOT_AVAILABLE, -373)
 
 // A pushed stream was claimed and later reset by the server. When this happens,
 // the request should be retried.
-NET_ERROR(SPDY_CLAIMED_PUSHED_STREAM_RESET_BY_SERVER, -374)
+NET_ERROR(HTTP2_CLAIMED_PUSHED_STREAM_RESET_BY_SERVER, -374)
 
 // An HTTP transaction was retried too many times due for authentication or
 // invalid certificates. This may be due to a bug in the net stack that would
@@ -763,14 +763,14 @@
 NET_ERROR(TOO_MANY_RETRIES, -375)
 
 // Received an HTTP/2 frame on a closed stream.
-NET_ERROR(SPDY_STREAM_CLOSED, -376)
+NET_ERROR(HTTP2_STREAM_CLOSED, -376)
 
 // Client is refusing an HTTP/2 stream.
-NET_ERROR(SPDY_CLIENT_REFUSED_STREAM, -377)
+NET_ERROR(HTTP2_CLIENT_REFUSED_STREAM, -377)
 
 // A pushed HTTP/2 stream was claimed by a request based on matching URL and
 // request headers, but the pushed response headers do not match the request.
-NET_ERROR(SPDY_PUSHED_RESPONSE_DOES_NOT_MATCH, -378)
+NET_ERROR(HTTP2_PUSHED_RESPONSE_DOES_NOT_MATCH, -378)
 
 // The cache does not have the requested entry.
 NET_ERROR(CACHE_MISS, -400)
diff --git a/net/cert/cert_verify_proc_ios.cc b/net/cert/cert_verify_proc_ios.cc
index 1ff9410..d8045b9 100644
--- a/net/cert/cert_verify_proc_ios.cc
+++ b/net/cert/cert_verify_proc_ios.cc
@@ -7,6 +7,7 @@
 #include <CommonCrypto/CommonDigest.h>
 
 #include "base/logging.h"
+#include "base/mac/foundation_util.h"
 #include "base/mac/scoped_cftyperef.h"
 #include "crypto/sha2.h"
 #include "net/base/net_errors.h"
@@ -162,12 +163,6 @@
     HashValue sha256(HASH_VALUE_SHA256);
     CC_SHA256(spki_bytes.data(), spki_bytes.size(), sha256.data());
     verify_result->public_key_hashes.push_back(sha256);
-
-    // Ignore the signature algorithm for the trust anchor.
-    if ((verify_result->cert_status & CERT_STATUS_AUTHORITY_INVALID) == 0 &&
-        i == count - 1) {
-      continue;
-    }
   }
   if (!verified_cert) {
     NOTREACHED();
@@ -262,6 +257,7 @@
     } else if (CFEqual(error, root_certificate_error)) {
       reason |= CERT_STATUS_AUTHORITY_INVALID;
     } else {
+      LOG(ERROR) << "Unrecognized error: " << error;
       reason |= CERT_STATUS_INVALID;
     }
   }
diff --git a/net/cert/cert_verify_proc_unittest.cc b/net/cert/cert_verify_proc_unittest.cc
index 2f39a05..254961d 100644
--- a/net/cert/cert_verify_proc_unittest.cc
+++ b/net/cert/cert_verify_proc_unittest.cc
@@ -66,6 +66,7 @@
 #include "base/android/build_info.h"
 #include "net/cert/cert_verify_proc_android.h"
 #elif defined(OS_IOS)
+#include "base/ios/ios_util.h"
 #include "net/cert/cert_verify_proc_ios.h"
 #elif defined(OS_MACOSX)
 #include "base/mac/mac_util.h"
@@ -859,7 +860,14 @@
   }
 
   bool WeakKeysAreInvalid() const {
-#if defined(OS_MACOSX) && !defined(OS_IOS)
+#if defined(OS_IOS)
+    // Starting with iOS 13, certs with weak keys are treated as (recoverable)
+    // invalid certificate errors.
+    if (verify_proc_type() == CERT_VERIFY_PROC_IOS &&
+        base::ios::IsRunningOnIOS13OrLater()) {
+      return true;
+    }
+#elif defined(OS_MACOSX)
     // Starting with Mac OS 10.12, certs with weak keys are treated as
     // (recoverable) invalid certificate errors.
     if (verify_proc_type() == CERT_VERIFY_PROC_MAC &&
@@ -1202,6 +1210,22 @@
   EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_DATE_INVALID);
 }
 
+static int GetMinimumRsaDsaKeySize() {
+#if defined(OS_IOS)
+  // Beginning with iOS 13, the minimum key size for RSA/DSA algorithms is
+  // 2048 bits. See https://support.apple.com/en-us/HT210176
+  if (base::ios::IsRunningOnIOS13OrLater())
+    return 2048;
+#elif defined(OS_MACOSX)
+  // Beginning with macOS 10.15, the minimum key size for RSA/DSA algorithms
+  // is 2048 bits. See https://support.apple.com/en-us/HT210176
+  if (base::mac::IsAtLeastOS10_15())
+    return 2048;
+#endif
+
+  return 1024;
+}
+
 // Currently, only RSA and DSA keys are checked for weakness, and our example
 // weak size is 768. These could change in the future.
 //
@@ -1209,11 +1233,15 @@
 // algorithms and which are weak will pass this test.
 static bool IsWeakKeyType(const std::string& key_type) {
   size_t pos = key_type.find("-");
-  std::string size = key_type.substr(0, pos);
+  std::string size_str = key_type.substr(0, pos);
   std::string type = key_type.substr(pos + 1);
+  int size = 0;
+
+  if (!base::StringToInt(size_str, &size))
+    return false;
 
   if (type == "rsa" || type == "dsa")
-    return size == "768";
+    return size < GetMinimumRsaDsaKeySize();
 
   return false;
 }
@@ -1269,10 +1297,15 @@
 
       if (IsWeakKeyType(*ee_type) || IsWeakKeyType(*signer_type)) {
         EXPECT_NE(OK, error);
-        EXPECT_EQ(CERT_STATUS_WEAK_KEY,
-                  verify_result.cert_status & CERT_STATUS_WEAK_KEY);
-        EXPECT_EQ(WeakKeysAreInvalid() ? CERT_STATUS_INVALID : 0,
-                  verify_result.cert_status & CERT_STATUS_INVALID);
+        if (WeakKeysAreInvalid()) {
+          EXPECT_EQ(CERT_STATUS_INVALID,
+                    verify_result.cert_status & CERT_STATUS_INVALID);
+
+        } else {
+          EXPECT_EQ(CERT_STATUS_WEAK_KEY,
+                    verify_result.cert_status & CERT_STATUS_WEAK_KEY);
+          EXPECT_EQ(0u, verify_result.cert_status & CERT_STATUS_INVALID);
+        }
       } else {
         EXPECT_THAT(error, IsOk());
         EXPECT_EQ(0U, verify_result.cert_status & CERT_STATUS_WEAK_KEY);
@@ -1964,12 +1997,12 @@
 
   if (AreSHA1IntermediatesAllowed()) {
     EXPECT_THAT(error, IsOk());
-    EXPECT_EQ(CERT_STATUS_SHA1_SIGNATURE_PRESENT, verify_result.cert_status);
+    EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_SHA1_SIGNATURE_PRESENT);
   } else {
-    EXPECT_THAT(error, IsError(ERR_CERT_WEAK_SIGNATURE_ALGORITHM));
-    EXPECT_EQ(CERT_STATUS_WEAK_SIGNATURE_ALGORITHM |
-                  CERT_STATUS_SHA1_SIGNATURE_PRESENT,
-              verify_result.cert_status);
+    EXPECT_NE(error, OK);
+    EXPECT_TRUE(verify_result.cert_status &
+                CERT_STATUS_WEAK_SIGNATURE_ALGORITHM);
+    EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_SHA1_SIGNATURE_PRESENT);
   }
 }
 
@@ -2380,10 +2413,6 @@
 // Test verification with a leaf that does not contain embedded SCTs, and which
 // has a notBefore date after 2018/10/15, and with no |sct_list|.
 // On recent macOS and iOS versions this should fail to verify.
-// The iOS simulator has different verifier behavior than a real device, and
-// verification succeeds on all currently available versions. If this test
-// fails on iossim in the future, disable the test on TARGET_IPHONE_SIMULATOR
-// and file a bug against mattm.
 TEST_P(CertVerifyProcInternalTest, LeafNewerThan20181015NoScts) {
   scoped_refptr<X509Certificate> chain = CreateCertificateChainFromFile(
       GetTestCertsDirectory(), "treadclimber.pem",
@@ -2405,7 +2434,7 @@
 
 #if defined(OS_IOS) && !TARGET_IPHONE_SIMULATOR
   if (verify_proc_type() == CERT_VERIFY_PROC_IOS) {
-    if (__builtin_available(iOS 12.2, *)) {
+    if (base::ios::IsRunningOnOrLater(12, 2, 0)) {
       // TODO(mattm): Check if this can this be mapped to some better error.
       EXPECT_THAT(error, IsError(ERR_CERT_INVALID));
       EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_INVALID);
@@ -2413,8 +2442,9 @@
     }
   }
 #elif defined(OS_MACOSX)
-  if (verify_proc_type() == CERT_VERIFY_PROC_MAC) {
-    if (__builtin_available(macOS 10.14.2, *)) {
+  if (verify_proc_type() == CERT_VERIFY_PROC_MAC ||
+      verify_proc_type() == CERT_VERIFY_PROC_IOS) {
+    if (__builtin_available(macOS 10.14.2, iOS 13, *)) {
       // TODO(mattm): SecTrustEvaluate just gives a generic
       // CSSMERR_TP_VERIFY_ACTION_FAILED error. Not sure there's much that
       // could be done about that.
@@ -3513,12 +3543,19 @@
     // This seemed to be working on Windows when !AreSHA1IntermediatesAllowed()
     // from previous testing, but then failed on the Windows 10 bot.
     if (error != OK) {
+      EXPECT_TRUE(verify_result.cert_status &
+                  CERT_STATUS_WEAK_SIGNATURE_ALGORITHM);
+      EXPECT_TRUE(verify_result.cert_status &
+                  CERT_STATUS_SHA1_SIGNATURE_PRESENT);
       EXPECT_TRUE(verify_result.has_sha1);
       EXPECT_THAT(error, IsError(ERR_CERT_WEAK_SIGNATURE_ALGORITHM));
     }
   } else {
+    EXPECT_NE(OK, error);
+    EXPECT_TRUE(verify_result.cert_status &
+                CERT_STATUS_WEAK_SIGNATURE_ALGORITHM);
+    EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_SHA1_SIGNATURE_PRESENT);
     EXPECT_TRUE(verify_result.has_sha1);
-    EXPECT_THAT(error, IsError(ERR_CERT_WEAK_SIGNATURE_ALGORITHM));
   }
 }
 
diff --git a/net/cert/internal/crl.cc b/net/cert/internal/crl.cc
index 9563484..8948f9ac 100644
--- a/net/cert/internal/crl.cc
+++ b/net/cert/internal/crl.cc
@@ -175,7 +175,8 @@
 
 bool ParseIssuingDistributionPoint(
     const der::Input& extension_value,
-    std::unique_ptr<GeneralNames>* out_distribution_point_names) {
+    std::unique_ptr<GeneralNames>* out_distribution_point_names,
+    ContainedCertsType* out_only_contains_cert_type) {
   der::Parser idp_extension_value_parser(extension_value);
   // IssuingDistributionPoint ::= SEQUENCE {
   der::Parser idp_parser;
@@ -223,14 +224,48 @@
     }
   }
 
+  *out_only_contains_cert_type = ContainedCertsType::ANY_CERTS;
+
   //  onlyContainsUserCerts      [1] BOOLEAN DEFAULT FALSE,
+  base::Optional<der::Input> only_contains_user_certs;
+  if (!idp_parser.ReadOptionalTag(der::kTagContextSpecific | 1,
+                                  &only_contains_user_certs)) {
+    return false;
+  }
+  if (only_contains_user_certs.has_value()) {
+    bool bool_value;
+    if (!der::ParseBool(*only_contains_user_certs, &bool_value))
+      return false;
+    if (!bool_value)
+      return false;  // DER-encoding requires DEFAULT values be omitted.
+    *out_only_contains_cert_type = ContainedCertsType::USER_CERTS;
+  }
+
   //  onlyContainsCACerts        [2] BOOLEAN DEFAULT FALSE,
+  base::Optional<der::Input> only_contains_ca_certs;
+  if (!idp_parser.ReadOptionalTag(der::kTagContextSpecific | 2,
+                                  &only_contains_ca_certs)) {
+    return false;
+  }
+  if (only_contains_ca_certs.has_value()) {
+    bool bool_value;
+    if (!der::ParseBool(*only_contains_ca_certs, &bool_value))
+      return false;
+    if (!bool_value)
+      return false;  // DER-encoding requires DEFAULT values be omitted.
+    if (*out_only_contains_cert_type != ContainedCertsType::ANY_CERTS) {
+      // 5.2.5.  at most one of onlyContainsUserCerts, onlyContainsCACerts,
+      //         and onlyContainsAttributeCerts may be set to TRUE.
+      return false;
+    }
+    *out_only_contains_cert_type = ContainedCertsType::CA_CERTS;
+  }
+
   //  onlySomeReasons            [3] ReasonFlags OPTIONAL,
   //  indirectCRL                [4] BOOLEAN DEFAULT FALSE,
   //  onlyContainsAttributeCerts [5] BOOLEAN DEFAULT FALSE }
-  // onlyContainsUserCerts, onlyContainsCACerts, onlySomeReasons, indirectCRL,
-  // and onlyContainsAttributeCerts are not supported, fail parsing if they are
-  // present.
+  // onlySomeReasons, indirectCRL, and onlyContainsAttributeCerts are not
+  // supported, fail parsing if they are present.
   if (idp_parser.HasMore())
     return false;
 
@@ -426,8 +461,10 @@
     if (ConsumeExtension(IssuingDistributionPointOid(), &extensions,
                          &idp_extension)) {
       std::unique_ptr<GeneralNames> distribution_point_names;
+      ContainedCertsType only_contains_cert_type;
       if (!ParseIssuingDistributionPoint(idp_extension.value,
-                                         &distribution_point_names)) {
+                                         &distribution_point_names,
+                                         &only_contains_cert_type)) {
         return CRLRevocationStatus::UNKNOWN;
       }
 
@@ -465,11 +502,45 @@
         // ParseIssuingDistributionPoint would already have failed.
       }
 
-      // 6.3.3. (b) (2) (ii - iiii): onlyContainsUserCerts,
-      // onlyContainsCACerts, onlyContainsAttributeCerts not supported.
-      // TODO(https://crbug.com/749276): handle onlyContainsUserCerts &
-      // onlyContainsCACerts. Some random sampling of public CRLs found a few
-      // that use those and it should be easy enough to implement.
+      switch (only_contains_cert_type) {
+        case ContainedCertsType::USER_CERTS:
+          // 6.3.3. (b) (2) (ii)  If the onlyContainsUserCerts boolean is
+          //                      asserted in the IDP CRL extension, verify
+          //                      that the certificate does not include the
+          //                      basic constraints extension with the cA
+          //                      boolean asserted.
+          // 5.2.5.  If either onlyContainsUserCerts or onlyContainsCACerts is
+          //         set to TRUE, then the scope of the CRL MUST NOT include any
+          //         version 1 or version 2 certificates.
+          if ((target_cert->has_basic_constraints() &&
+               target_cert->basic_constraints().is_ca) ||
+              target_cert->tbs().version == CertificateVersion::V1 ||
+              target_cert->tbs().version == CertificateVersion::V2) {
+            return CRLRevocationStatus::UNKNOWN;
+          }
+          break;
+
+        case ContainedCertsType::CA_CERTS:
+          // 6.3.3. (b) (2) (iii) If the onlyContainsCACerts boolean is asserted
+          //                      in the IDP CRL extension, verify that the
+          //                      certificate includes the basic constraints
+          //                      extension with the cA boolean asserted.
+          // The version check is not done here, as the basicConstraints
+          // extension is required, and could not be present unless it is a V3
+          // certificate.
+          if (!target_cert->has_basic_constraints() ||
+              !target_cert->basic_constraints().is_ca) {
+            return CRLRevocationStatus::UNKNOWN;
+          }
+          break;
+
+        case ContainedCertsType::ANY_CERTS:
+          //                (iv)  Verify that the onlyContainsAttributeCerts
+          //                      boolean is not asserted.
+          // If onlyContainsAttributeCerts was present,
+          // ParseIssuingDistributionPoint would already have failed.
+          break;
+      }
     }
 
     for (const auto& ext : extensions) {
diff --git a/net/cert/internal/crl.h b/net/cert/internal/crl.h
index a2e93df2..ee603b3 100644
--- a/net/cert/internal/crl.h
+++ b/net/cert/internal/crl.h
@@ -146,22 +146,33 @@
   base::Optional<der::Input> crl_extensions_tlv;
 };
 
+// Represents the IssuingDistributionPoint certificate type constraints:
+enum class ContainedCertsType {
+  // Neither onlyContainsUserCerts or onlyContainsCACerts was present.
+  ANY_CERTS,
+  // onlyContainsUserCerts      [1] BOOLEAN DEFAULT FALSE,
+  USER_CERTS,
+  // onlyContainsCACerts        [2] BOOLEAN DEFAULT FALSE,
+  CA_CERTS,
+};
+
 // Parses a DER-encoded IssuingDistributionPoint extension value.
-// Returns true on success and sets the results in the
-// |out_distribution_point_names| parameter.
+// Returns true on success and sets the results in the |out_*| parameters.
 //
 // If the IssuingDistributionPoint contains a distributionPoint fullName field,
 // |out_distribution_point_names| will contain the parsed representation.
 // If the distributionPoint type is nameRelativeToCRLIssuer, parsing will fail.
 //
-// onlyContainsUserCerts, onlyContainsCACerts, indirectCRL and
-// onlyContainsAttributeCerts are not supported and parsing will fail if they
-// are present.
+// |out_only_contains_cert_type| will contain the logical representation of the
+// onlyContainsUserCerts and onlyContainsCACerts fields (or their absence).
+//
+// indirectCRL and onlyContainsAttributeCerts are not supported and parsing will
+// fail if they are present.
 //
 // Note that on success |out_distribution_point_names| aliases data from the
 // input |extension_value|.
 //
-// On failure |out_distribution_point_names| has undefined state.
+// On failure the |out_*| parameters have undefined state.
 //
 // IssuingDistributionPoint ::= SEQUENCE {
 //     distributionPoint          [0] DistributionPointName OPTIONAL,
@@ -172,8 +183,8 @@
 //     onlyContainsAttributeCerts [5] BOOLEAN DEFAULT FALSE }
 NET_EXPORT_PRIVATE bool ParseIssuingDistributionPoint(
     const der::Input& extension_value,
-    std::unique_ptr<GeneralNames>* out_distribution_point_names)
-    WARN_UNUSED_RESULT;
+    std::unique_ptr<GeneralNames>* out_distribution_point_names,
+    ContainedCertsType* out_only_contains_cert_type) WARN_UNUSED_RESULT;
 
 NET_EXPORT_PRIVATE CRLRevocationStatus
 GetCRLStatusForCert(const der::Input& cert_serial,
diff --git a/net/cert/internal/crl_parse_issuing_distribution_point_fuzzer.cc b/net/cert/internal/crl_parse_issuing_distribution_point_fuzzer.cc
index 3a7cd455..24bce98 100644
--- a/net/cert/internal/crl_parse_issuing_distribution_point_fuzzer.cc
+++ b/net/cert/internal/crl_parse_issuing_distribution_point_fuzzer.cc
@@ -12,11 +12,14 @@
   net::der::Input idp_der(data, size);
 
   std::unique_ptr<net::GeneralNames> distribution_point_names;
+  net::ContainedCertsType only_contains_cert_type;
 
-  if (net::ParseIssuingDistributionPoint(idp_der, &distribution_point_names)) {
+  if (net::ParseIssuingDistributionPoint(idp_der, &distribution_point_names,
+                                         &only_contains_cert_type)) {
     CHECK((distribution_point_names &&
            distribution_point_names->present_name_types !=
-               net::GENERAL_NAME_NONE));
+               net::GENERAL_NAME_NONE) ||
+          only_contains_cert_type != net::ContainedCertsType::ANY_CERTS);
   }
   return 0;
 }
diff --git a/net/cert/internal/crl_unittest.cc b/net/cert/internal/crl_unittest.cc
index 6ecc5bc..52e57bc 100644
--- a/net/cert/internal/crl_unittest.cc
+++ b/net/cert/internal/crl_unittest.cc
@@ -48,6 +48,11 @@
     "good_no_crldp.pem",
     "good_key_rollover.pem",
     "good_idp_contains_uri.pem",
+    "good_idp_onlycontainsusercerts.pem",
+    "good_idp_onlycontainsusercerts_no_basic_constraints.pem",
+    "good_idp_onlycontainscacerts.pem",
+    "good_idp_uri_and_onlycontainsusercerts.pem",
+    "good_idp_uri_and_onlycontainscacerts.pem",
     "revoked.pem",
     "revoked_no_nextupdate.pem",
     "revoked_fake_crlentryextension.pem",
@@ -64,6 +69,11 @@
     "bad_key_rollover_signature.pem",
     "bad_idp_contains_wrong_uri.pem",
     "bad_idp_indirectcrl.pem",
+    "bad_idp_onlycontainsusercerts.pem",
+    "bad_idp_onlycontainscacerts.pem",
+    "bad_idp_onlycontainscacerts_no_basic_constraints.pem",
+    "bad_idp_uri_and_onlycontainsusercerts.pem",
+    "bad_idp_uri_and_onlycontainscacerts.pem",
     "invalid_mismatched_signature_algorithm.pem",
     "invalid_revoked_empty_sequence.pem",
     "invalid_v1_with_extension.pem",
@@ -91,6 +101,8 @@
     "invalid_garbage_crlentry.pem",
     "invalid_idp_dpname_choice_extra_data.pem",
     "invalid_idp_empty_sequence.pem",
+    "invalid_idp_onlycontains_user_and_ca_certs.pem",
+    "invalid_idp_onlycontainsusercerts_v1_leaf.pem",
 };
 
 struct PrintTestName {
diff --git a/net/data/crl_unittest/bad_idp_onlycontainscacerts.pem b/net/data/crl_unittest/bad_idp_onlycontainscacerts.pem
new file mode 100644
index 0000000..9ba123f7
--- /dev/null
+++ b/net/data/crl_unittest/bad_idp_onlycontainscacerts.pem
@@ -0,0 +1,239 @@
+Generated by generate_crl_test_data.py. Do not edit.
+
+Leaf not covered by CRLs because IDP has onlyContainsCACerts
+
+SEQUENCE {
+  SEQUENCE {
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    UTCTime { "170302001122Z" }
+    UTCTime { "170602001122Z" }
+    [0] {
+      SEQUENCE {
+        SEQUENCE {
+          # issuingDistributionPoint
+          OBJECT_IDENTIFIER { 2.5.29.28 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              [2 PRIMITIVE] { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `0091251c86c4252190f1148b40d9993cd075c8c797edd81f8cc14ce322368f3a47434f21d819231ae3c56fcb7a796b669a6a4fcc4980f112c1b5dcf6036cef1e77494d48cf8f16a85aa5dc05e17bd01217d67f52bbdd81ab70385d1800d755d2f4b878adbae521fc9b7c4386aef0b787d0beff34a3975933ce5191153f056c31cc` }
+}
+-----BEGIN CRL-----
+MIH7MGYCAQEwDQYJKoZIhvcNAQELBQAwHzEdMBsGA1UEAwwUVGVzdCBJbnRlcm1l
+ZGlhdGUgQ0EXDTE3MDMwMjAwMTEyMloXDTE3MDYwMjAwMTEyMlqgEzARMA8GA1Ud
+HAEB/wQFMAOCAf8wDQYJKoZIhvcNAQELBQADgYEAkSUchsQlIZDxFItA2Zk80HXI
+x5ft2B+MwUzjIjaPOkdDTyHYGSMa48Vvy3p5a2aaak/MSYDxEsG13PYDbO8ed0lN
+SM+PFqhapdwF4XvQEhfWf1K73YGrcDhdGADXVdL0uHituuUh/Jt8Q4au8LeH0L7/
+NKOXWTPOUZEVPwVsMcw=
+-----END CRL-----
+
+SEQUENCE {
+  SEQUENCE {
+    [0] {
+      INTEGER { 2 }
+    }
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00f60f4a066d9dc05562f5c879444163b73be0b3d5e32dd7eff091af5d3c70bf3860067236894d085f581c70a1a8753d5b8882b263733e89a47b9989c36ce438b3b96ac16b1ca8878f2d51383055a17df6936c82b4f50729eb2f08f0f46f4106fa5975ec83c06f7d1135468354e01478e78474c56b6aca4d8a3e86ff7e494e6407` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+    [3] {
+      SEQUENCE {
+        SEQUENCE {
+          # keyUsage
+          OBJECT_IDENTIFIER { 2.5.29.15 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            BIT_STRING { `0106` }
+          }
+        }
+        SEQUENCE {
+          # basicConstraints
+          OBJECT_IDENTIFIER { 2.5.29.19 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              BOOLEAN { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `00209bf64b888cbd58493d8898b215ed640ddb04e329e43e3db45a20782ab7acc22dca7cbb11b4fbdb08b8acf163d116948db57b044773d51b8bdf09b1a6465268d60388fee8740aa4167e9d44f19027b075802438c909b9afd0f298027bf0b56e6dd1e92ea5d393e2b422c49bb324433bce95a828149db3e5491d1572b11be5f4` }
+}
+-----BEGIN CA CERTIFICATE-----
+MIIBzjCCATegAwIBAgIBATANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdUZXN0
+IENBMCIYDzIwMTcwMTAxMDAwMDAwWhgPMjAxODAxMDEwMDAwMDBaMB8xHTAbBgNV
+BAMMFFRlc3QgSW50ZXJtZWRpYXRlIENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
+iQKBgQD2D0oGbZ3AVWL1yHlEQWO3O+Cz1eMt1+/wka9dPHC/OGAGcjaJTQhfWBxw
+oah1PVuIgrJjcz6JpHuZicNs5DizuWrBaxyoh48tUTgwVaF99pNsgrT1BynrLwjw
+9G9BBvpZdeyDwG99ETVGg1TgFHjnhHTFa2rKTYo+hv9+SU5kBwIDAQABoyMwITAO
+BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOB
+gQAgm/ZLiIy9WEk9iJiyFe1kDdsE4ynkPj20WiB4Kreswi3KfLsRtPvbCLis8WPR
+FpSNtXsER3PVG4vfCbGmRlJo1gOI/uh0CqQWfp1E8ZAnsHWAJDjJCbmv0PKYAnvw
+tW5t0ekupdOT4rQixJuzJEM7zpWoKBSds+VJHRVysRvl9A==
+-----END CA CERTIFICATE-----
+
+SEQUENCE {
+  SEQUENCE {
+    [0] {
+      INTEGER { 2 }
+    }
+    INTEGER { 5 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Cert" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00b86043a5c55800fd75606bd07e94c08c4bbd7c2ed4bcb6f8caac436213ab24587377a0107678abcca31c31fd84b78636034a6ea4853d62bd86d8a5e4c8f741b6efdf1008696e8eed8f30db3fdc78ca13d39d6cca9bc1563111e0bace35ffca03ab146bf07bb4636f6b38cf8b2feb1336e3f209ff30aad4283468a997e8215329` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+    [3] {
+      SEQUENCE {
+        SEQUENCE {
+          # cRLDistributionPoints
+          OBJECT_IDENTIFIER { 2.5.29.31 }
+          OCTET_STRING {
+            SEQUENCE {
+              SEQUENCE {
+                [0] {
+                  [0] {
+                    [6 PRIMITIVE] { "http://example.com/foo.crl" }
+                  }
+                }
+              }
+            }
+          }
+        }
+        SEQUENCE {
+          # basicConstraints
+          OBJECT_IDENTIFIER { 2.5.29.19 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {}
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `00af35a49085f242c33eaad6efba5c2906f7c0ebf5caa66ab2f5ed0a663287da5665963048df790ffb1f223b93a8a40c9a8d26a0d9f0a41dd3d706754a59bfb2579464f984aa7686de56b441759c42b7aeb50b5960eaa27cb469beaeaf2460c1b6d8246dc78d6fce2a05a26f7723f6a1b96c0faf912b4aa67ceaeb432a552e1cb4` }
+}
+-----BEGIN CERTIFICATE-----
+MIIB6jCCAVOgAwIBAgIBBTANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDDBRUZXN0
+IEludGVybWVkaWF0ZSBDQTAiGA8yMDE3MDEwMTAwMDAwMFoYDzIwMTgwMTAxMDAw
+MDAwWjAUMRIwEAYDVQQDDAlUZXN0IENlcnQwgZ8wDQYJKoZIhvcNAQEBBQADgY0A
+MIGJAoGBALhgQ6XFWAD9dWBr0H6UwIxLvXwu1Ly2+MqsQ2ITqyRYc3egEHZ4q8yj
+HDH9hLeGNgNKbqSFPWK9htil5Mj3Qbbv3xAIaW6O7Y8w2z/ceMoT051sypvBVjER
+4LrONf/KA6sUa/B7tGNvazjPiy/rEzbj8gn/MKrUKDRoqZfoIVMpAgMBAAGjPTA7
+MCsGA1UdHwQkMCIwIKAeoByGGmh0dHA6Ly9leGFtcGxlLmNvbS9mb28uY3JsMAwG
+A1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADgYEArzWkkIXyQsM+qtbvulwpBvfA
+6/XKpmqy9e0KZjKH2lZlljBI33kP+x8iO5OopAyajSag2fCkHdPXBnVKWb+yV5Rk
++YSqdobeVrRBdZxCt661C1lg6qJ8tGm+rq8kYMG22CRtx41vzioFom93I/ahuWwP
+r5ErSqZ86utDKlUuHLQ=
+-----END CERTIFICATE-----
\ No newline at end of file
diff --git a/net/data/crl_unittest/bad_idp_onlycontainscacerts_no_basic_constraints.pem b/net/data/crl_unittest/bad_idp_onlycontainscacerts_no_basic_constraints.pem
new file mode 100644
index 0000000..1ba7b09
--- /dev/null
+++ b/net/data/crl_unittest/bad_idp_onlycontainscacerts_no_basic_constraints.pem
@@ -0,0 +1,230 @@
+Generated by generate_crl_test_data.py. Do not edit.
+
+Leaf not covered by CRLs because IDP has onlyContainsCACerts, leaf has no basicConstraints
+
+SEQUENCE {
+  SEQUENCE {
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    UTCTime { "170302001122Z" }
+    UTCTime { "170602001122Z" }
+    [0] {
+      SEQUENCE {
+        SEQUENCE {
+          # issuingDistributionPoint
+          OBJECT_IDENTIFIER { 2.5.29.28 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              [2 PRIMITIVE] { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `0091251c86c4252190f1148b40d9993cd075c8c797edd81f8cc14ce322368f3a47434f21d819231ae3c56fcb7a796b669a6a4fcc4980f112c1b5dcf6036cef1e77494d48cf8f16a85aa5dc05e17bd01217d67f52bbdd81ab70385d1800d755d2f4b878adbae521fc9b7c4386aef0b787d0beff34a3975933ce5191153f056c31cc` }
+}
+-----BEGIN CRL-----
+MIH7MGYCAQEwDQYJKoZIhvcNAQELBQAwHzEdMBsGA1UEAwwUVGVzdCBJbnRlcm1l
+ZGlhdGUgQ0EXDTE3MDMwMjAwMTEyMloXDTE3MDYwMjAwMTEyMlqgEzARMA8GA1Ud
+HAEB/wQFMAOCAf8wDQYJKoZIhvcNAQELBQADgYEAkSUchsQlIZDxFItA2Zk80HXI
+x5ft2B+MwUzjIjaPOkdDTyHYGSMa48Vvy3p5a2aaak/MSYDxEsG13PYDbO8ed0lN
+SM+PFqhapdwF4XvQEhfWf1K73YGrcDhdGADXVdL0uHituuUh/Jt8Q4au8LeH0L7/
+NKOXWTPOUZEVPwVsMcw=
+-----END CRL-----
+
+SEQUENCE {
+  SEQUENCE {
+    [0] {
+      INTEGER { 2 }
+    }
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00f60f4a066d9dc05562f5c879444163b73be0b3d5e32dd7eff091af5d3c70bf3860067236894d085f581c70a1a8753d5b8882b263733e89a47b9989c36ce438b3b96ac16b1ca8878f2d51383055a17df6936c82b4f50729eb2f08f0f46f4106fa5975ec83c06f7d1135468354e01478e78474c56b6aca4d8a3e86ff7e494e6407` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+    [3] {
+      SEQUENCE {
+        SEQUENCE {
+          # keyUsage
+          OBJECT_IDENTIFIER { 2.5.29.15 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            BIT_STRING { `0106` }
+          }
+        }
+        SEQUENCE {
+          # basicConstraints
+          OBJECT_IDENTIFIER { 2.5.29.19 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              BOOLEAN { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `00209bf64b888cbd58493d8898b215ed640ddb04e329e43e3db45a20782ab7acc22dca7cbb11b4fbdb08b8acf163d116948db57b044773d51b8bdf09b1a6465268d60388fee8740aa4167e9d44f19027b075802438c909b9afd0f298027bf0b56e6dd1e92ea5d393e2b422c49bb324433bce95a828149db3e5491d1572b11be5f4` }
+}
+-----BEGIN CA CERTIFICATE-----
+MIIBzjCCATegAwIBAgIBATANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdUZXN0
+IENBMCIYDzIwMTcwMTAxMDAwMDAwWhgPMjAxODAxMDEwMDAwMDBaMB8xHTAbBgNV
+BAMMFFRlc3QgSW50ZXJtZWRpYXRlIENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
+iQKBgQD2D0oGbZ3AVWL1yHlEQWO3O+Cz1eMt1+/wka9dPHC/OGAGcjaJTQhfWBxw
+oah1PVuIgrJjcz6JpHuZicNs5DizuWrBaxyoh48tUTgwVaF99pNsgrT1BynrLwjw
+9G9BBvpZdeyDwG99ETVGg1TgFHjnhHTFa2rKTYo+hv9+SU5kBwIDAQABoyMwITAO
+BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOB
+gQAgm/ZLiIy9WEk9iJiyFe1kDdsE4ynkPj20WiB4Kreswi3KfLsRtPvbCLis8WPR
+FpSNtXsER3PVG4vfCbGmRlJo1gOI/uh0CqQWfp1E8ZAnsHWAJDjJCbmv0PKYAnvw
+tW5t0ekupdOT4rQixJuzJEM7zpWoKBSds+VJHRVysRvl9A==
+-----END CA CERTIFICATE-----
+
+SEQUENCE {
+  SEQUENCE {
+    [0] {
+      INTEGER { 2 }
+    }
+    INTEGER { 6 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Cert" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00d19aa4fda893774bdad672e2be8ecc8d8e7c5b8348d67b663cd297e4f068b5ed78be1aa7dd8f7bd871faaa052007b40fb2468fc455f5a691774b55cae696c32d0d0e9f9545118d528fcd8932a9682e50f1aae0b5a88bcbc43308c1f5a230d1dacf8e3c229327784f6f9a6c5b12c9c575e9003f10e38527f94782a424b164a86f` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+    [3] {
+      SEQUENCE {
+        SEQUENCE {
+          # cRLDistributionPoints
+          OBJECT_IDENTIFIER { 2.5.29.31 }
+          OCTET_STRING {
+            SEQUENCE {
+              SEQUENCE {
+                [0] {
+                  [0] {
+                    [6 PRIMITIVE] { "http://example.com/foo.crl" }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `00e14d6cad7fe998eba094e9e36701bc7dfecf3cbf4eebae9d3a5b5e977de9a557633ed93ab642baa637631e131dd162f069d6430e0198914004c1a4876f621ed56c9fe4d4613f93d7d2ed5eca1b7dd0434aeb89e1e1caa57e686312ea38ff791db53409c1dfb3178a1e11e819c030063f1e16f487abc57dfe1ec1bf2c9e4934db` }
+}
+-----BEGIN CERTIFICATE-----
+MIIB3DCCAUWgAwIBAgIBBjANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDDBRUZXN0
+IEludGVybWVkaWF0ZSBDQTAiGA8yMDE3MDEwMTAwMDAwMFoYDzIwMTgwMTAxMDAw
+MDAwWjAUMRIwEAYDVQQDDAlUZXN0IENlcnQwgZ8wDQYJKoZIhvcNAQEBBQADgY0A
+MIGJAoGBANGapP2ok3dL2tZy4r6OzI2OfFuDSNZ7ZjzSl+TwaLXteL4ap92Pe9hx
++qoFIAe0D7JGj8RV9aaRd0tVyuaWwy0NDp+VRRGNUo/NiTKpaC5Q8argtaiLy8Qz
+CMH1ojDR2s+OPCKTJ3hPb5psWxLJxXXpAD8Q44Un+UeCpCSxZKhvAgMBAAGjLzAt
+MCsGA1UdHwQkMCIwIKAeoByGGmh0dHA6Ly9leGFtcGxlLmNvbS9mb28uY3JsMA0G
+CSqGSIb3DQEBCwUAA4GBAOFNbK1/6ZjroJTp42cBvH3+zzy/TuuunTpbXpd96aVX
+Yz7ZOrZCuqY3Yx4THdFi8GnWQw4BmJFABMGkh29iHtVsn+TUYT+T19LtXsobfdBD
+SuuJ4eHKpX5oYxLqOP95HbU0CcHfsxeKHhHoGcAwBj8eFvSHq8V9/h7BvyyeSTTb
+-----END CERTIFICATE-----
\ No newline at end of file
diff --git a/net/data/crl_unittest/bad_idp_onlycontainsusercerts.pem b/net/data/crl_unittest/bad_idp_onlycontainsusercerts.pem
new file mode 100644
index 0000000..e915d20
--- /dev/null
+++ b/net/data/crl_unittest/bad_idp_onlycontainsusercerts.pem
@@ -0,0 +1,249 @@
+Generated by generate_crl_test_data.py. Do not edit.
+
+CA_NEW_BY_OLD not covered by CRLs because IDP has onlyContainsUserCerts
+
+SEQUENCE {
+  SEQUENCE {
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    UTCTime { "170302001122Z" }
+    UTCTime { "170602001122Z" }
+    [0] {
+      SEQUENCE {
+        SEQUENCE {
+          # issuingDistributionPoint
+          OBJECT_IDENTIFIER { 2.5.29.28 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              [1 PRIMITIVE] { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `002f2deff3f117300df880570eebe5789244d45c0fc6db66e0f90d740c55e2344278c301d237579ae2ae73d507b7e60efb244b49461b5c44aa708bc192a4040e1d58b7c22036c36f39acab389f363c50e97a8b62d051f7e94d08a2b465cf95fd04e500c16ea5f1e74b00c6b738abcbfda713bab4a1139ad54f412e70199a255658` }
+}
+-----BEGIN CRL-----
+MIH7MGYCAQEwDQYJKoZIhvcNAQELBQAwHzEdMBsGA1UEAwwUVGVzdCBJbnRlcm1l
+ZGlhdGUgQ0EXDTE3MDMwMjAwMTEyMloXDTE3MDYwMjAwMTEyMlqgEzARMA8GA1Ud
+HAEB/wQFMAOBAf8wDQYJKoZIhvcNAQELBQADgYEALy3v8/EXMA34gFcO6+V4kkTU
+XA/G22bg+Q10DFXiNEJ4wwHSN1ea4q5z1Qe35g77JEtJRhtcRKpwi8GSpAQOHVi3
+wiA2w285rKs4nzY8UOl6i2LQUffpTQiitGXPlf0E5QDBbqXx50sAxrc4q8v9pxO6
+tKETmtVPQS5wGZolVlg=
+-----END CRL-----
+
+SEQUENCE {
+  SEQUENCE {
+    [0] {
+      INTEGER { 2 }
+    }
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00f60f4a066d9dc05562f5c879444163b73be0b3d5e32dd7eff091af5d3c70bf3860067236894d085f581c70a1a8753d5b8882b263733e89a47b9989c36ce438b3b96ac16b1ca8878f2d51383055a17df6936c82b4f50729eb2f08f0f46f4106fa5975ec83c06f7d1135468354e01478e78474c56b6aca4d8a3e86ff7e494e6407` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+    [3] {
+      SEQUENCE {
+        SEQUENCE {
+          # keyUsage
+          OBJECT_IDENTIFIER { 2.5.29.15 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            BIT_STRING { `0106` }
+          }
+        }
+        SEQUENCE {
+          # basicConstraints
+          OBJECT_IDENTIFIER { 2.5.29.19 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              BOOLEAN { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `00209bf64b888cbd58493d8898b215ed640ddb04e329e43e3db45a20782ab7acc22dca7cbb11b4fbdb08b8acf163d116948db57b044773d51b8bdf09b1a6465268d60388fee8740aa4167e9d44f19027b075802438c909b9afd0f298027bf0b56e6dd1e92ea5d393e2b422c49bb324433bce95a828149db3e5491d1572b11be5f4` }
+}
+-----BEGIN CA CERTIFICATE-----
+MIIBzjCCATegAwIBAgIBATANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdUZXN0
+IENBMCIYDzIwMTcwMTAxMDAwMDAwWhgPMjAxODAxMDEwMDAwMDBaMB8xHTAbBgNV
+BAMMFFRlc3QgSW50ZXJtZWRpYXRlIENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
+iQKBgQD2D0oGbZ3AVWL1yHlEQWO3O+Cz1eMt1+/wka9dPHC/OGAGcjaJTQhfWBxw
+oah1PVuIgrJjcz6JpHuZicNs5DizuWrBaxyoh48tUTgwVaF99pNsgrT1BynrLwjw
+9G9BBvpZdeyDwG99ETVGg1TgFHjnhHTFa2rKTYo+hv9+SU5kBwIDAQABoyMwITAO
+BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOB
+gQAgm/ZLiIy9WEk9iJiyFe1kDdsE4ynkPj20WiB4Kreswi3KfLsRtPvbCLis8WPR
+FpSNtXsER3PVG4vfCbGmRlJo1gOI/uh0CqQWfp1E8ZAnsHWAJDjJCbmv0PKYAnvw
+tW5t0ekupdOT4rQixJuzJEM7zpWoKBSds+VJHRVysRvl9A==
+-----END CA CERTIFICATE-----
+
+SEQUENCE {
+  SEQUENCE {
+    [0] {
+      INTEGER { 2 }
+    }
+    INTEGER { 9 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00bbe351f22cd50acab58fb3db3fac3bbcf03a15c3dbaf83c06e36957f301d04819a1353f87978b81c8104a50438806564bfd8c22a80e3d0973da5b8701d26d925961579b5e86dbf490e78270436a3c92739e6a99f839ad31dddd1365044491028efefeebd14d233cb1cf84ad62fb3ac3c4e5a08ac43a4d69482a5fe8d57e05ec9` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+    [3] {
+      SEQUENCE {
+        SEQUENCE {
+          # cRLDistributionPoints
+          OBJECT_IDENTIFIER { 2.5.29.31 }
+          OCTET_STRING {
+            SEQUENCE {
+              SEQUENCE {
+                [0] {
+                  [0] {
+                    [6 PRIMITIVE] { "http://example.com/foo.crl" }
+                  }
+                }
+              }
+            }
+          }
+        }
+        SEQUENCE {
+          # keyUsage
+          OBJECT_IDENTIFIER { 2.5.29.15 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            BIT_STRING { `0106` }
+          }
+        }
+        SEQUENCE {
+          # basicConstraints
+          OBJECT_IDENTIFIER { 2.5.29.19 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              BOOLEAN { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `0016ca2c0303547045178664c36b2b44c129a9a61c109c58b8d38854607e20b400b878d7732c95404925da7068f0a5d3f456055b0fa79d0ad0cb136ef6653fd3d1c7331ff47e256c9a60bfc01e0493ad731172659ed9478bb4b2148ae24060f266aeb455df86be037d4b3580ca727058e4af641f299060243a8ab8c8ebb8ee0972` }
+}
+-----BEGIN CERTIFICATE-----
+MIICCDCCAXGgAwIBAgIBCTANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDDBRUZXN0
+IEludGVybWVkaWF0ZSBDQTAiGA8yMDE3MDEwMTAwMDAwMFoYDzIwMTgwMTAxMDAw
+MDAwWjAfMR0wGwYDVQQDDBRUZXN0IEludGVybWVkaWF0ZSBDQTCBnzANBgkqhkiG
+9w0BAQEFAAOBjQAwgYkCgYEAu+NR8izVCsq1j7PbP6w7vPA6FcPbr4PAbjaVfzAd
+BIGaE1P4eXi4HIEEpQQ4gGVkv9jCKoDj0Jc9pbhwHSbZJZYVebXobb9JDngnBDaj
+ySc55qmfg5rTHd3RNlBESRAo7+/uvRTSM8sc+ErWL7OsPE5aCKxDpNaUgqX+jVfg
+XskCAwEAAaNQME4wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL2V4YW1wbGUuY29t
+L2Zvby5jcmwwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
+hvcNAQELBQADgYEAFsosAwNUcEUXhmTDaytEwSmpphwQnFi404hUYH4gtAC4eNdz
+LJVASSXacGjwpdP0VgVbD6edCtDLE272ZT/T0cczH/R+JWyaYL/AHgSTrXMRcmWe
+2UeLtLIUiuJAYPJmrrRV34a+A31LNYDKcnBY5K9kHymQYCQ6irjI67juCXI=
+-----END CERTIFICATE-----
\ No newline at end of file
diff --git a/net/data/crl_unittest/bad_idp_uri_and_onlycontainscacerts.pem b/net/data/crl_unittest/bad_idp_uri_and_onlycontainscacerts.pem
new file mode 100644
index 0000000..1714a94
--- /dev/null
+++ b/net/data/crl_unittest/bad_idp_uri_and_onlycontainscacerts.pem
@@ -0,0 +1,244 @@
+Generated by generate_crl_test_data.py. Do not edit.
+
+Leaf not covered by CRLs because IDP has onlyContainsCACerts (and URI, but the URI matches)
+
+SEQUENCE {
+  SEQUENCE {
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    UTCTime { "170302001122Z" }
+    UTCTime { "170602001122Z" }
+    [0] {
+      SEQUENCE {
+        SEQUENCE {
+          # issuingDistributionPoint
+          OBJECT_IDENTIFIER { 2.5.29.28 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              [0] {
+                [0] {
+                  [6 PRIMITIVE] { "http://example.com/foo.crl" }
+                }
+              }
+              [2 PRIMITIVE] { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `0009165fe23325882cfc40ada100d2b69d5bd42cf1be641b616c7217d03e24d897c7fab6b4edb210d31715bd4d1ff5c70ac34ec6367d00bf46b3b9a5a911ffbe486073ec4fea7080de6463bc644e0ac51f602761a0c8fdbb96b0d390474660075a0949969b90a6efc78813f27922b96388e6f9f9cd74551d47731e5bc705b8d21d` }
+}
+-----BEGIN CRL-----
+MIIBHDCBhgIBATANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDDBRUZXN0IEludGVy
+bWVkaWF0ZSBDQRcNMTcwMzAyMDAxMTIyWhcNMTcwNjAyMDAxMTIyWqAzMDEwLwYD
+VR0cAQH/BCUwI6AeoByGGmh0dHA6Ly9leGFtcGxlLmNvbS9mb28uY3JsggH/MA0G
+CSqGSIb3DQEBCwUAA4GBAAkWX+IzJYgs/ECtoQDStp1b1CzxvmQbYWxyF9A+JNiX
+x/q2tO2yENMXFb1NH/XHCsNOxjZ9AL9Gs7mlqRH/vkhgc+xP6nCA3mRjvGROCsUf
+YCdhoMj9u5aw05BHRmAHWglJlpuQpu/HiBPyeSK5Y4jm+fnNdFUdR3MeW8cFuNId
+-----END CRL-----
+
+SEQUENCE {
+  SEQUENCE {
+    [0] {
+      INTEGER { 2 }
+    }
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00e79fb3855fb417ea2314409a8dc820f1dbc9c33ce7602402caa9a42e0713786bfc6601e50b799cc564e8ee22126eff408d2f3c06a78002e4a4d3430d6514c63eab3be74f221b91c424d030b36cd1a42eca57e93c0e381c158371e35fbc7d08ae51ca312aa2647887fabb0d6d7378497466fb052a0aa3bc69cc0def4bbf19563b` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+    [3] {
+      SEQUENCE {
+        SEQUENCE {
+          # keyUsage
+          OBJECT_IDENTIFIER { 2.5.29.15 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            BIT_STRING { `0106` }
+          }
+        }
+        SEQUENCE {
+          # basicConstraints
+          OBJECT_IDENTIFIER { 2.5.29.19 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              BOOLEAN { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `00264e1bb2a4887c61168dce49c2b6bfd3b4d1050855b24b05325ea8f10673ccae042aa88912a8ee203ba3283467d6a9234329d9a1a9b60dd281f947c5adcd1b3e97aca3d83d75cbb4709b2f086de9beee39ffea8f500e1a0ba2338e8a0499436d43a024cc97480d511dd51298e952f14ada84b1115b6bf1f29923704cdd917ff2` }
+}
+-----BEGIN CA CERTIFICATE-----
+MIIBzjCCATegAwIBAgIBATANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdUZXN0
+IENBMCIYDzIwMTcwMTAxMDAwMDAwWhgPMjAxODAxMDEwMDAwMDBaMB8xHTAbBgNV
+BAMMFFRlc3QgSW50ZXJtZWRpYXRlIENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
+iQKBgQDnn7OFX7QX6iMUQJqNyCDx28nDPOdgJALKqaQuBxN4a/xmAeULeZzFZOju
+IhJu/0CNLzwGp4AC5KTTQw1lFMY+qzvnTyIbkcQk0DCzbNGkLspX6TwOOBwVg3Hj
+X7x9CK5RyjEqomR4h/q7DW1zeEl0ZvsFKgqjvGnMDe9LvxlWOwIDAQABoyMwITAO
+BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOB
+gQAmThuypIh8YRaNzknCtr/TtNEFCFWySwUyXqjxBnPMrgQqqIkSqO4gO6MoNGfW
+qSNDKdmhqbYN0oH5R8WtzRs+l6yj2D11y7Rwmy8Ibem+7jn/6o9QDhoLojOOigSZ
+Q21DoCTMl0gNUR3VEpjpUvFK2oSxEVtr8fKZI3BM3ZF/8g==
+-----END CA CERTIFICATE-----
+
+SEQUENCE {
+  SEQUENCE {
+    [0] {
+      INTEGER { 2 }
+    }
+    INTEGER { 5 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Cert" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00c4162472b586a8e3ee4c879d7882a74272c293cd57033e21e4236773678b49c271330f605f13d01c7c65f2652e789074c370c5550a3871a56fd0f2760316490c7b3bd1a3aa005c4adb7a495450b643c9cc29b8f63db229f9ac0ce75feb66bd085a4a98e0fc7292784d17b952111f50c065be34dd711a53bab534351e8ef748f7` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+    [3] {
+      SEQUENCE {
+        SEQUENCE {
+          # cRLDistributionPoints
+          OBJECT_IDENTIFIER { 2.5.29.31 }
+          OCTET_STRING {
+            SEQUENCE {
+              SEQUENCE {
+                [0] {
+                  [0] {
+                    [6 PRIMITIVE] { "http://example.com/foo.crl" }
+                  }
+                }
+              }
+            }
+          }
+        }
+        SEQUENCE {
+          # basicConstraints
+          OBJECT_IDENTIFIER { 2.5.29.19 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {}
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `005002948c5ce09db4860b6ba54da3d1d37e2ef9f5e6dbb8845271d689327645b7052bfe9d8b3f5f7ceaa9f46840f73f666a850d9cad556ccd21520776cf9bd2150c0f1f888c7765bd9a10e4d0bd66e7a7fb4af1d02f002fd9583e2de267182188ab319378eb9950c08262e308d1ef9b17c802d1d711a88c04d2dc9758e8d80d3a` }
+}
+-----BEGIN CERTIFICATE-----
+MIIB6jCCAVOgAwIBAgIBBTANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDDBRUZXN0
+IEludGVybWVkaWF0ZSBDQTAiGA8yMDE3MDEwMTAwMDAwMFoYDzIwMTgwMTAxMDAw
+MDAwWjAUMRIwEAYDVQQDDAlUZXN0IENlcnQwgZ8wDQYJKoZIhvcNAQEBBQADgY0A
+MIGJAoGBAMQWJHK1hqjj7kyHnXiCp0JywpPNVwM+IeQjZ3Nni0nCcTMPYF8T0Bx8
+ZfJlLniQdMNwxVUKOHGlb9DydgMWSQx7O9GjqgBcStt6SVRQtkPJzCm49j2yKfms
+DOdf62a9CFpKmOD8cpJ4TRe5UhEfUMBlvjTdcRpTurU0NR6O90j3AgMBAAGjPTA7
+MCsGA1UdHwQkMCIwIKAeoByGGmh0dHA6Ly9leGFtcGxlLmNvbS9mb28uY3JsMAwG
+A1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADgYEAUAKUjFzgnbSGC2ulTaPR034u
++fXm27iEUnHWiTJ2RbcFK/6diz9ffOqp9GhA9z9maoUNnK1VbM0hUgd2z5vSFQwP
+H4iMd2W9mhDk0L1m56f7SvHQLwAv2Vg+LeJnGCGIqzGTeOuZUMCCYuMI0e+bF8gC
+0dcRqIwE0tyXWOjYDTo=
+-----END CERTIFICATE-----
\ No newline at end of file
diff --git a/net/data/crl_unittest/bad_idp_uri_and_onlycontainsusercerts.pem b/net/data/crl_unittest/bad_idp_uri_and_onlycontainsusercerts.pem
new file mode 100644
index 0000000..2a73a32
--- /dev/null
+++ b/net/data/crl_unittest/bad_idp_uri_and_onlycontainsusercerts.pem
@@ -0,0 +1,254 @@
+Generated by generate_crl_test_data.py. Do not edit.
+
+CA_NEW_BY_OLD not covered by CRLs because IDP has onlyContainsUserCerts (and URI, but the URI matches)
+
+SEQUENCE {
+  SEQUENCE {
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    UTCTime { "170302001122Z" }
+    UTCTime { "170602001122Z" }
+    [0] {
+      SEQUENCE {
+        SEQUENCE {
+          # issuingDistributionPoint
+          OBJECT_IDENTIFIER { 2.5.29.28 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              [0] {
+                [0] {
+                  [6 PRIMITIVE] { "http://example.com/foo.crl" }
+                }
+              }
+              [1 PRIMITIVE] { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `0096ba398dce85f87ed5eb6c6d0b759e476877e403d39c8a1ac480da9eda2db258ed7f7c5b78bd889657d54398461d58e4170b66ae5e389ea99d8aed81669c29cff95dd41c06f3e7233a07a8c5a9cd14094345a27ba826635da2ae4e1c1f2794afb3814a4c543979be9cbdb24e159c89f51d022b54e64ec8680e6a0c6deea06066` }
+}
+-----BEGIN CRL-----
+MIIBHDCBhgIBATANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDDBRUZXN0IEludGVy
+bWVkaWF0ZSBDQRcNMTcwMzAyMDAxMTIyWhcNMTcwNjAyMDAxMTIyWqAzMDEwLwYD
+VR0cAQH/BCUwI6AeoByGGmh0dHA6Ly9leGFtcGxlLmNvbS9mb28uY3JsgQH/MA0G
+CSqGSIb3DQEBCwUAA4GBAJa6OY3Ohfh+1etsbQt1nkdod+QD05yKGsSA2p7aLbJY
+7X98W3i9iJZX1UOYRh1Y5BcLZq5eOJ6pnYrtgWacKc/5XdQcBvPnIzoHqMWpzRQJ
+Q0Wie6gmY12irk4cHyeUr7OBSkxUOXm+nL2yThWcifUdAitU5k7IaA5qDG3uoGBm
+-----END CRL-----
+
+SEQUENCE {
+  SEQUENCE {
+    [0] {
+      INTEGER { 2 }
+    }
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00e79fb3855fb417ea2314409a8dc820f1dbc9c33ce7602402caa9a42e0713786bfc6601e50b799cc564e8ee22126eff408d2f3c06a78002e4a4d3430d6514c63eab3be74f221b91c424d030b36cd1a42eca57e93c0e381c158371e35fbc7d08ae51ca312aa2647887fabb0d6d7378497466fb052a0aa3bc69cc0def4bbf19563b` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+    [3] {
+      SEQUENCE {
+        SEQUENCE {
+          # keyUsage
+          OBJECT_IDENTIFIER { 2.5.29.15 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            BIT_STRING { `0106` }
+          }
+        }
+        SEQUENCE {
+          # basicConstraints
+          OBJECT_IDENTIFIER { 2.5.29.19 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              BOOLEAN { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `00264e1bb2a4887c61168dce49c2b6bfd3b4d1050855b24b05325ea8f10673ccae042aa88912a8ee203ba3283467d6a9234329d9a1a9b60dd281f947c5adcd1b3e97aca3d83d75cbb4709b2f086de9beee39ffea8f500e1a0ba2338e8a0499436d43a024cc97480d511dd51298e952f14ada84b1115b6bf1f29923704cdd917ff2` }
+}
+-----BEGIN CA CERTIFICATE-----
+MIIBzjCCATegAwIBAgIBATANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdUZXN0
+IENBMCIYDzIwMTcwMTAxMDAwMDAwWhgPMjAxODAxMDEwMDAwMDBaMB8xHTAbBgNV
+BAMMFFRlc3QgSW50ZXJtZWRpYXRlIENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
+iQKBgQDnn7OFX7QX6iMUQJqNyCDx28nDPOdgJALKqaQuBxN4a/xmAeULeZzFZOju
+IhJu/0CNLzwGp4AC5KTTQw1lFMY+qzvnTyIbkcQk0DCzbNGkLspX6TwOOBwVg3Hj
+X7x9CK5RyjEqomR4h/q7DW1zeEl0ZvsFKgqjvGnMDe9LvxlWOwIDAQABoyMwITAO
+BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOB
+gQAmThuypIh8YRaNzknCtr/TtNEFCFWySwUyXqjxBnPMrgQqqIkSqO4gO6MoNGfW
+qSNDKdmhqbYN0oH5R8WtzRs+l6yj2D11y7Rwmy8Ibem+7jn/6o9QDhoLojOOigSZ
+Q21DoCTMl0gNUR3VEpjpUvFK2oSxEVtr8fKZI3BM3ZF/8g==
+-----END CA CERTIFICATE-----
+
+SEQUENCE {
+  SEQUENCE {
+    [0] {
+      INTEGER { 2 }
+    }
+    INTEGER { 9 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00fb0ab8bad8a1cd08f6695198a2aa9ab4001d4aba6506d77dc882496cb2ebac00ed6bb2ca0635a3e62436d4037ed0d0ad2777b48f6311e6dcd8d0311b07e7a3bc54a13d9c1abf37bdd94b9a32b9626e4df5b8fbff46f1142b8b3d513d4922941ac3818cea5fb70e508903799ade9de8dd45462a3fceea995e46c407c78ef429ab` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+    [3] {
+      SEQUENCE {
+        SEQUENCE {
+          # cRLDistributionPoints
+          OBJECT_IDENTIFIER { 2.5.29.31 }
+          OCTET_STRING {
+            SEQUENCE {
+              SEQUENCE {
+                [0] {
+                  [0] {
+                    [6 PRIMITIVE] { "http://example.com/foo.crl" }
+                  }
+                }
+              }
+            }
+          }
+        }
+        SEQUENCE {
+          # keyUsage
+          OBJECT_IDENTIFIER { 2.5.29.15 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            BIT_STRING { `0106` }
+          }
+        }
+        SEQUENCE {
+          # basicConstraints
+          OBJECT_IDENTIFIER { 2.5.29.19 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              BOOLEAN { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `00cd414248339c9c017d5d2c4a10ac6b18b57b4e9acc8838794645d8e78678428b0eb15b96f23ae4ebea51db258108534dc620d60b12fdc465815acc6544b5eb2f0f93064f23127801a82a1d59683b5aacad4f7c42e34f9b8836f15769c360d962c50804fe37155a7f864f89f0dd677fdae8450cfc92ed0c3673111822b0c8f1a7` }
+}
+-----BEGIN CERTIFICATE-----
+MIICCDCCAXGgAwIBAgIBCTANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDDBRUZXN0
+IEludGVybWVkaWF0ZSBDQTAiGA8yMDE3MDEwMTAwMDAwMFoYDzIwMTgwMTAxMDAw
+MDAwWjAfMR0wGwYDVQQDDBRUZXN0IEludGVybWVkaWF0ZSBDQTCBnzANBgkqhkiG
+9w0BAQEFAAOBjQAwgYkCgYEA+wq4utihzQj2aVGYoqqatAAdSrplBtd9yIJJbLLr
+rADta7LKBjWj5iQ21AN+0NCtJ3e0j2MR5tzY0DEbB+ejvFShPZwavze92UuaMrli
+bk31uPv/RvEUK4s9UT1JIpQaw4GM6l+3DlCJA3ma3p3o3UVGKj/O6pleRsQHx470
+KasCAwEAAaNQME4wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL2V4YW1wbGUuY29t
+L2Zvby5jcmwwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
+hvcNAQELBQADgYEAzUFCSDOcnAF9XSxKEKxrGLV7TprMiDh5RkXY54Z4QosOsVuW
+8jrk6+pR2yWBCFNNxiDWCxL9xGWBWsxlRLXrLw+TBk8jEngBqCodWWg7WqytT3xC
+40+biDbxV2nDYNlixQgE/jcVWn+GT4nw3Wd/2uhFDPyS7Qw2cxEYIrDI8ac=
+-----END CERTIFICATE-----
\ No newline at end of file
diff --git a/net/data/crl_unittest/generate_crl_test_data.py b/net/data/crl_unittest/generate_crl_test_data.py
index 254728f..fee511b 100755
--- a/net/data/crl_unittest/generate_crl_test_data.py
+++ b/net/data/crl_unittest/generate_crl_test_data.py
@@ -64,25 +64,31 @@
   return 'DER:' + ''.join(['%02X' % ord(b) for b in der])
 
 
-def CreateCert(name, signer, pkey=None, crl_dp=None, key_usage=None):
+def CreateCert(name, signer, pkey=None, crl_dp=None, key_usage=None,
+               is_ca=True, version=2):
   global NEXT_SERIAL
   if pkey is None:
     pkey = crypto.PKey()
     pkey.generate_key(crypto.TYPE_RSA, 1024)
   cert = crypto.X509()
-  cert.set_version(2)
+  cert.set_version(version)
   cert.get_subject().CN = name
   cert.set_pubkey(pkey)
   cert.set_serial_number(NEXT_SERIAL)
   NEXT_SERIAL += 1
   cert.set_notBefore(CERT_DATE.strftime('%Y%m%d%H%M%SZ'))
   cert.set_notAfter(CERT_EXPIRE.strftime('%Y%m%d%H%M%SZ'))
-  if crl_dp:
-    cert.add_extensions(
-        [crypto.X509Extension('crlDistributionPoints', False, crl_dp)])
-  if key_usage:
-    cert.add_extensions(
-        [crypto.X509Extension('keyUsage', False, key_usage)])
+  if version == 2:
+    if crl_dp:
+      cert.add_extensions(
+          [crypto.X509Extension('crlDistributionPoints', False, crl_dp)])
+    if key_usage:
+      cert.add_extensions(
+          [crypto.X509Extension('keyUsage', False, key_usage)])
+    if is_ca is not None:
+      cert.add_extensions(
+          [crypto.X509Extension('basicConstraints', True,
+                                'CA:%s' % ('TRUE' if is_ca else 'FALSE'))])
   if signer:
     cert.set_issuer(signer['cert'].get_subject())
     cert.sign(signer['pkey'], 'sha256')
@@ -113,14 +119,20 @@
 
 # The target cert, with a simple crlDistributionPoints pointing to an arbitrary
 # URL, other crlDistributionPoints fields not set.
-LEAF = CreateCert('Test Cert', CA, crl_dp='URI:http://example.com/foo.crl')
+LEAF = CreateCert('Test Cert', CA, crl_dp='URI:http://example.com/foo.crl', is_ca=False)
+
+# The target cert, with no basicConstraints.
+LEAF_NO_BASIC_CONSTRAINTS = CreateCert('Test Cert', CA, crl_dp='URI:http://example.com/foo.crl', is_ca=None)
 
 # The target cert, no crlDistributionPoints.
-LEAF_NO_CRLDP = CreateCert('Test Cert', CA)
+LEAF_NO_CRLDP = CreateCert('Test Cert', CA, is_ca=False)
+
+# V1 target cert
+LEAF_V1 = CreateCert('Test Cert', CA, version=0, is_ca=None)
 
 # The target cert, crlDistributionPoints with crlIssuer and
 # crlDistributionPoints set.
-LEAF_CRLDP_CRLISSUER = CreateCert('Test Cert', CA,
+LEAF_CRLDP_CRLISSUER = CreateCert('Test Cert', CA, is_ca=False,
     # It doesn't seem like you can set crlIssuers through the one-line openssl
     # interface, so just do it manually.
     crl_dp=Ascii2OpensslDer('''
@@ -150,7 +162,8 @@
 
 # Self-issued intermediate with a new key signed by the |CA| key.
 CA_NEW_BY_OLD = CreateCert('Test Intermediate CA', CA,
-                           key_usage='critical, keyCertSign, cRLSign')
+                           key_usage='critical, keyCertSign, cRLSign',
+                           crl_dp='URI:http://example.com/foo.crl')
 
 # Target cert signed by |CA_NEW_BY_OLD|'s key.
 LEAF_BY_NEW = CreateCert(
@@ -406,6 +419,63 @@
      }
   ''',
 
+  'issuingDistributionPoint_with_onlyContainsUserCerts': '''
+     SEQUENCE {
+       OBJECT_IDENTIFIER { 2.5.29.28 }
+       BOOLEAN { `ff` }
+       OCTET_STRING {
+         SEQUENCE {
+           [1 PRIMITIVE] { `ff` }
+         }
+       }
+     }
+  ''',
+
+  'issuingDistributionPoint_with_uri_and_onlyContainsUserCerts': '''
+     SEQUENCE {
+       OBJECT_IDENTIFIER { 2.5.29.28 }
+       BOOLEAN { `ff` }
+       OCTET_STRING {
+         SEQUENCE {
+           [0] {
+             [0] {
+               [6 PRIMITIVE] { "http://example.com/foo.crl" }
+             }
+           }
+           [1 PRIMITIVE] { `ff` }
+         }
+       }
+     }
+  ''',
+
+  'issuingDistributionPoint_with_uri_and_onlyContainsCACerts': '''
+     SEQUENCE {
+       OBJECT_IDENTIFIER { 2.5.29.28 }
+       BOOLEAN { `ff` }
+       OCTET_STRING {
+         SEQUENCE {
+           [0] {
+             [0] {
+               [6 PRIMITIVE] { "http://example.com/foo.crl" }
+             }
+           }
+           [2 PRIMITIVE] { `ff` }
+         }
+       }
+     }
+  ''',
+
+  'issuingDistributionPoint_with_onlyContainsCACerts': '''
+     SEQUENCE {
+       OBJECT_IDENTIFIER { 2.5.29.28 }
+       BOOLEAN { `ff` }
+       OCTET_STRING {
+         SEQUENCE {
+           [2 PRIMITIVE] { `ff` }
+         }
+       }
+     }
+  ''',
 }
 
 
@@ -569,6 +639,106 @@
 
 
 Store(
+    'good_idp_onlycontainsusercerts',
+    'Leaf covered by CRLs and not revoked, CRL has IDP with '
+    'onlyContainsUserCerts',
+    LEAF, CA,
+    SignAsciiCRL('''
+  INTEGER { 1 }
+  %(sha256WithRSAEncryption)s
+  %(CA_name)s
+  %(thisUpdate)s
+  %(nextUpdate)s
+  # no revoked certs list
+  [0] {
+    SEQUENCE {
+      %(issuingDistributionPoint_with_onlyContainsUserCerts)s
+    }
+  }
+''' % crl_strings))
+
+
+Store(
+    'good_idp_onlycontainsusercerts_no_basic_constraints',
+    'Leaf covered by CRLs and not revoked, CRL has IDP with '
+    'onlyContainsUserCerts, leaf has no basicConstraints',
+    LEAF_NO_BASIC_CONSTRAINTS, CA,
+    SignAsciiCRL('''
+  INTEGER { 1 }
+  %(sha256WithRSAEncryption)s
+  %(CA_name)s
+  %(thisUpdate)s
+  %(nextUpdate)s
+  # no revoked certs list
+  [0] {
+    SEQUENCE {
+      %(issuingDistributionPoint_with_onlyContainsUserCerts)s
+    }
+  }
+''' % crl_strings))
+
+
+Store(
+    'good_idp_onlycontainscacerts',
+    'CA_NEW_BY_OLD covered by CRLs and not revoked, CRL has IDP with '
+    'onlyContainsCaCerts',
+    CA_NEW_BY_OLD, CA,
+    SignAsciiCRL('''
+  INTEGER { 1 }
+  %(sha256WithRSAEncryption)s
+  %(CA_name)s
+  %(thisUpdate)s
+  %(nextUpdate)s
+  # no revoked certs list
+  [0] {
+    SEQUENCE {
+      %(issuingDistributionPoint_with_onlyContainsCACerts)s
+    }
+  }
+''' % crl_strings))
+
+
+Store(
+    'good_idp_uri_and_onlycontainsusercerts',
+    'Leaf covered by CRLs and not revoked, CRL has IDP with URI and '
+    'onlyContainsUserCerts',
+    LEAF, CA,
+    SignAsciiCRL('''
+  INTEGER { 1 }
+  %(sha256WithRSAEncryption)s
+  %(CA_name)s
+  %(thisUpdate)s
+  %(nextUpdate)s
+  # no revoked certs list
+  [0] {
+    SEQUENCE {
+      %(issuingDistributionPoint_with_uri_and_onlyContainsUserCerts)s
+    }
+  }
+''' % crl_strings))
+
+
+Store(
+    'good_idp_uri_and_onlycontainscacerts',
+    'CA_NEW_BY_OLD covered by CRLs and not revoked, CRL has IDP with URI and '
+    'onlyContainsCACerts',
+    CA_NEW_BY_OLD, CA,
+    SignAsciiCRL('''
+  INTEGER { 1 }
+  %(sha256WithRSAEncryption)s
+  %(CA_name)s
+  %(thisUpdate)s
+  %(nextUpdate)s
+  # no revoked certs list
+  [0] {
+    SEQUENCE {
+      %(issuingDistributionPoint_with_uri_and_onlyContainsCACerts)s
+    }
+  }
+''' % crl_strings))
+
+
+Store(
     'good_no_crldp',
     'Leaf covered by CRLs and not revoked, leaf has no crlDistributionPoints',
     LEAF_NO_CRLDP, CA,
@@ -871,6 +1041,105 @@
 
 
 Store(
+    'bad_idp_onlycontainscacerts',
+    'Leaf not covered by CRLs because IDP has onlyContainsCACerts',
+    LEAF, CA,
+    SignAsciiCRL('''
+  INTEGER { 1 }
+  %(sha256WithRSAEncryption)s
+  %(CA_name)s
+  %(thisUpdate)s
+  %(nextUpdate)s
+  # no revoked certs list
+  [0] {
+    SEQUENCE {
+      %(issuingDistributionPoint_with_onlyContainsCACerts)s
+    }
+  }
+''' % crl_strings))
+
+
+Store(
+    'bad_idp_onlycontainscacerts_no_basic_constraints',
+    'Leaf not covered by CRLs because IDP has onlyContainsCACerts, '
+    'leaf has no basicConstraints',
+    LEAF_NO_BASIC_CONSTRAINTS, CA,
+    SignAsciiCRL('''
+  INTEGER { 1 }
+  %(sha256WithRSAEncryption)s
+  %(CA_name)s
+  %(thisUpdate)s
+  %(nextUpdate)s
+  # no revoked certs list
+  [0] {
+    SEQUENCE {
+      %(issuingDistributionPoint_with_onlyContainsCACerts)s
+    }
+  }
+''' % crl_strings))
+
+
+Store(
+    'bad_idp_onlycontainsusercerts',
+    'CA_NEW_BY_OLD not covered by CRLs because IDP has '
+    'onlyContainsUserCerts',
+    CA_NEW_BY_OLD, CA,
+    SignAsciiCRL('''
+  INTEGER { 1 }
+  %(sha256WithRSAEncryption)s
+  %(CA_name)s
+  %(thisUpdate)s
+  %(nextUpdate)s
+  # no revoked certs list
+  [0] {
+    SEQUENCE {
+      %(issuingDistributionPoint_with_onlyContainsUserCerts)s
+    }
+  }
+''' % crl_strings))
+
+
+Store(
+    'bad_idp_uri_and_onlycontainsusercerts',
+    'CA_NEW_BY_OLD not covered by CRLs because IDP has '
+    'onlyContainsUserCerts (and URI, but the URI matches)',
+    CA_NEW_BY_OLD, CA,
+    SignAsciiCRL('''
+  INTEGER { 1 }
+  %(sha256WithRSAEncryption)s
+  %(CA_name)s
+  %(thisUpdate)s
+  %(nextUpdate)s
+  # no revoked certs list
+  [0] {
+    SEQUENCE {
+      %(issuingDistributionPoint_with_uri_and_onlyContainsUserCerts)s
+    }
+  }
+''' % crl_strings))
+
+
+Store(
+    'bad_idp_uri_and_onlycontainscacerts',
+    'Leaf not covered by CRLs because IDP has '
+    'onlyContainsCACerts (and URI, but the URI matches)',
+    LEAF, CA,
+    SignAsciiCRL('''
+  INTEGER { 1 }
+  %(sha256WithRSAEncryption)s
+  %(CA_name)s
+  %(thisUpdate)s
+  %(nextUpdate)s
+  # no revoked certs list
+  [0] {
+    SEQUENCE {
+      %(issuingDistributionPoint_with_uri_and_onlyContainsCACerts)s
+    }
+  }
+''' % crl_strings))
+
+
+Store(
     'invalid_mismatched_signature_algorithm',
     'Leaf covered by CRLs and not revoked, but signatureAlgorithm in '
     'CertificateList does not match the one in TBSCertList.',
@@ -1404,3 +1673,51 @@
     }
   }
 ''' % crl_strings))
+
+
+Store(
+    'invalid_idp_onlycontains_user_and_ca_certs',
+    'IssuingDistributionPoint extension is invalid, cannot specify more than '
+    'one of onlyContainsUserCerts and onlyContainsCACerts',
+    LEAF, CA,
+    SignAsciiCRL('''
+  INTEGER { 1 }
+  %(sha256WithRSAEncryption)s
+  %(CA_name)s
+  %(thisUpdate)s
+  %(nextUpdate)s
+  # no revoked certs list
+  [0] {
+    SEQUENCE {
+      SEQUENCE {
+        OBJECT_IDENTIFIER { 2.5.29.28 }
+        BOOLEAN { `ff` }
+        OCTET_STRING {
+          SEQUENCE {
+           [1 PRIMITIVE] { `ff` }
+           [2 PRIMITIVE] { `ff` }
+          }
+        }
+      }
+    }
+  }
+''' % crl_strings))
+
+
+Store(
+    'invalid_idp_onlycontainsusercerts_v1_leaf',
+    'v1 leaf is covered by CRL with onlyContainsUserCerts, which is invalid',
+    LEAF_V1, CA,
+    SignAsciiCRL('''
+  INTEGER { 1 }
+  %(sha256WithRSAEncryption)s
+  %(CA_name)s
+  %(thisUpdate)s
+  %(nextUpdate)s
+  # no revoked certs list
+  [0] {
+    SEQUENCE {
+      %(issuingDistributionPoint_with_onlyContainsUserCerts)s
+    }
+  }
+''' % crl_strings))
diff --git a/net/data/crl_unittest/good_idp_onlycontainscacerts.pem b/net/data/crl_unittest/good_idp_onlycontainscacerts.pem
new file mode 100644
index 0000000..71d2724e
--- /dev/null
+++ b/net/data/crl_unittest/good_idp_onlycontainscacerts.pem
@@ -0,0 +1,249 @@
+Generated by generate_crl_test_data.py. Do not edit.
+
+CA_NEW_BY_OLD covered by CRLs and not revoked, CRL has IDP with onlyContainsCaCerts
+
+SEQUENCE {
+  SEQUENCE {
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    UTCTime { "170302001122Z" }
+    UTCTime { "170602001122Z" }
+    [0] {
+      SEQUENCE {
+        SEQUENCE {
+          # issuingDistributionPoint
+          OBJECT_IDENTIFIER { 2.5.29.28 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              [2 PRIMITIVE] { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `0091251c86c4252190f1148b40d9993cd075c8c797edd81f8cc14ce322368f3a47434f21d819231ae3c56fcb7a796b669a6a4fcc4980f112c1b5dcf6036cef1e77494d48cf8f16a85aa5dc05e17bd01217d67f52bbdd81ab70385d1800d755d2f4b878adbae521fc9b7c4386aef0b787d0beff34a3975933ce5191153f056c31cc` }
+}
+-----BEGIN CRL-----
+MIH7MGYCAQEwDQYJKoZIhvcNAQELBQAwHzEdMBsGA1UEAwwUVGVzdCBJbnRlcm1l
+ZGlhdGUgQ0EXDTE3MDMwMjAwMTEyMloXDTE3MDYwMjAwMTEyMlqgEzARMA8GA1Ud
+HAEB/wQFMAOCAf8wDQYJKoZIhvcNAQELBQADgYEAkSUchsQlIZDxFItA2Zk80HXI
+x5ft2B+MwUzjIjaPOkdDTyHYGSMa48Vvy3p5a2aaak/MSYDxEsG13PYDbO8ed0lN
+SM+PFqhapdwF4XvQEhfWf1K73YGrcDhdGADXVdL0uHituuUh/Jt8Q4au8LeH0L7/
+NKOXWTPOUZEVPwVsMcw=
+-----END CRL-----
+
+SEQUENCE {
+  SEQUENCE {
+    [0] {
+      INTEGER { 2 }
+    }
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00f60f4a066d9dc05562f5c879444163b73be0b3d5e32dd7eff091af5d3c70bf3860067236894d085f581c70a1a8753d5b8882b263733e89a47b9989c36ce438b3b96ac16b1ca8878f2d51383055a17df6936c82b4f50729eb2f08f0f46f4106fa5975ec83c06f7d1135468354e01478e78474c56b6aca4d8a3e86ff7e494e6407` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+    [3] {
+      SEQUENCE {
+        SEQUENCE {
+          # keyUsage
+          OBJECT_IDENTIFIER { 2.5.29.15 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            BIT_STRING { `0106` }
+          }
+        }
+        SEQUENCE {
+          # basicConstraints
+          OBJECT_IDENTIFIER { 2.5.29.19 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              BOOLEAN { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `00209bf64b888cbd58493d8898b215ed640ddb04e329e43e3db45a20782ab7acc22dca7cbb11b4fbdb08b8acf163d116948db57b044773d51b8bdf09b1a6465268d60388fee8740aa4167e9d44f19027b075802438c909b9afd0f298027bf0b56e6dd1e92ea5d393e2b422c49bb324433bce95a828149db3e5491d1572b11be5f4` }
+}
+-----BEGIN CA CERTIFICATE-----
+MIIBzjCCATegAwIBAgIBATANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdUZXN0
+IENBMCIYDzIwMTcwMTAxMDAwMDAwWhgPMjAxODAxMDEwMDAwMDBaMB8xHTAbBgNV
+BAMMFFRlc3QgSW50ZXJtZWRpYXRlIENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
+iQKBgQD2D0oGbZ3AVWL1yHlEQWO3O+Cz1eMt1+/wka9dPHC/OGAGcjaJTQhfWBxw
+oah1PVuIgrJjcz6JpHuZicNs5DizuWrBaxyoh48tUTgwVaF99pNsgrT1BynrLwjw
+9G9BBvpZdeyDwG99ETVGg1TgFHjnhHTFa2rKTYo+hv9+SU5kBwIDAQABoyMwITAO
+BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOB
+gQAgm/ZLiIy9WEk9iJiyFe1kDdsE4ynkPj20WiB4Kreswi3KfLsRtPvbCLis8WPR
+FpSNtXsER3PVG4vfCbGmRlJo1gOI/uh0CqQWfp1E8ZAnsHWAJDjJCbmv0PKYAnvw
+tW5t0ekupdOT4rQixJuzJEM7zpWoKBSds+VJHRVysRvl9A==
+-----END CA CERTIFICATE-----
+
+SEQUENCE {
+  SEQUENCE {
+    [0] {
+      INTEGER { 2 }
+    }
+    INTEGER { 9 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00bbe351f22cd50acab58fb3db3fac3bbcf03a15c3dbaf83c06e36957f301d04819a1353f87978b81c8104a50438806564bfd8c22a80e3d0973da5b8701d26d925961579b5e86dbf490e78270436a3c92739e6a99f839ad31dddd1365044491028efefeebd14d233cb1cf84ad62fb3ac3c4e5a08ac43a4d69482a5fe8d57e05ec9` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+    [3] {
+      SEQUENCE {
+        SEQUENCE {
+          # cRLDistributionPoints
+          OBJECT_IDENTIFIER { 2.5.29.31 }
+          OCTET_STRING {
+            SEQUENCE {
+              SEQUENCE {
+                [0] {
+                  [0] {
+                    [6 PRIMITIVE] { "http://example.com/foo.crl" }
+                  }
+                }
+              }
+            }
+          }
+        }
+        SEQUENCE {
+          # keyUsage
+          OBJECT_IDENTIFIER { 2.5.29.15 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            BIT_STRING { `0106` }
+          }
+        }
+        SEQUENCE {
+          # basicConstraints
+          OBJECT_IDENTIFIER { 2.5.29.19 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              BOOLEAN { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `0016ca2c0303547045178664c36b2b44c129a9a61c109c58b8d38854607e20b400b878d7732c95404925da7068f0a5d3f456055b0fa79d0ad0cb136ef6653fd3d1c7331ff47e256c9a60bfc01e0493ad731172659ed9478bb4b2148ae24060f266aeb455df86be037d4b3580ca727058e4af641f299060243a8ab8c8ebb8ee0972` }
+}
+-----BEGIN CERTIFICATE-----
+MIICCDCCAXGgAwIBAgIBCTANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDDBRUZXN0
+IEludGVybWVkaWF0ZSBDQTAiGA8yMDE3MDEwMTAwMDAwMFoYDzIwMTgwMTAxMDAw
+MDAwWjAfMR0wGwYDVQQDDBRUZXN0IEludGVybWVkaWF0ZSBDQTCBnzANBgkqhkiG
+9w0BAQEFAAOBjQAwgYkCgYEAu+NR8izVCsq1j7PbP6w7vPA6FcPbr4PAbjaVfzAd
+BIGaE1P4eXi4HIEEpQQ4gGVkv9jCKoDj0Jc9pbhwHSbZJZYVebXobb9JDngnBDaj
+ySc55qmfg5rTHd3RNlBESRAo7+/uvRTSM8sc+ErWL7OsPE5aCKxDpNaUgqX+jVfg
+XskCAwEAAaNQME4wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL2V4YW1wbGUuY29t
+L2Zvby5jcmwwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
+hvcNAQELBQADgYEAFsosAwNUcEUXhmTDaytEwSmpphwQnFi404hUYH4gtAC4eNdz
+LJVASSXacGjwpdP0VgVbD6edCtDLE272ZT/T0cczH/R+JWyaYL/AHgSTrXMRcmWe
+2UeLtLIUiuJAYPJmrrRV34a+A31LNYDKcnBY5K9kHymQYCQ6irjI67juCXI=
+-----END CERTIFICATE-----
\ No newline at end of file
diff --git a/net/data/crl_unittest/good_idp_onlycontainsusercerts.pem b/net/data/crl_unittest/good_idp_onlycontainsusercerts.pem
new file mode 100644
index 0000000..dcd9ab84
--- /dev/null
+++ b/net/data/crl_unittest/good_idp_onlycontainsusercerts.pem
@@ -0,0 +1,239 @@
+Generated by generate_crl_test_data.py. Do not edit.
+
+Leaf covered by CRLs and not revoked, CRL has IDP with onlyContainsUserCerts
+
+SEQUENCE {
+  SEQUENCE {
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    UTCTime { "170302001122Z" }
+    UTCTime { "170602001122Z" }
+    [0] {
+      SEQUENCE {
+        SEQUENCE {
+          # issuingDistributionPoint
+          OBJECT_IDENTIFIER { 2.5.29.28 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              [1 PRIMITIVE] { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `002f2deff3f117300df880570eebe5789244d45c0fc6db66e0f90d740c55e2344278c301d237579ae2ae73d507b7e60efb244b49461b5c44aa708bc192a4040e1d58b7c22036c36f39acab389f363c50e97a8b62d051f7e94d08a2b465cf95fd04e500c16ea5f1e74b00c6b738abcbfda713bab4a1139ad54f412e70199a255658` }
+}
+-----BEGIN CRL-----
+MIH7MGYCAQEwDQYJKoZIhvcNAQELBQAwHzEdMBsGA1UEAwwUVGVzdCBJbnRlcm1l
+ZGlhdGUgQ0EXDTE3MDMwMjAwMTEyMloXDTE3MDYwMjAwMTEyMlqgEzARMA8GA1Ud
+HAEB/wQFMAOBAf8wDQYJKoZIhvcNAQELBQADgYEALy3v8/EXMA34gFcO6+V4kkTU
+XA/G22bg+Q10DFXiNEJ4wwHSN1ea4q5z1Qe35g77JEtJRhtcRKpwi8GSpAQOHVi3
+wiA2w285rKs4nzY8UOl6i2LQUffpTQiitGXPlf0E5QDBbqXx50sAxrc4q8v9pxO6
+tKETmtVPQS5wGZolVlg=
+-----END CRL-----
+
+SEQUENCE {
+  SEQUENCE {
+    [0] {
+      INTEGER { 2 }
+    }
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00f60f4a066d9dc05562f5c879444163b73be0b3d5e32dd7eff091af5d3c70bf3860067236894d085f581c70a1a8753d5b8882b263733e89a47b9989c36ce438b3b96ac16b1ca8878f2d51383055a17df6936c82b4f50729eb2f08f0f46f4106fa5975ec83c06f7d1135468354e01478e78474c56b6aca4d8a3e86ff7e494e6407` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+    [3] {
+      SEQUENCE {
+        SEQUENCE {
+          # keyUsage
+          OBJECT_IDENTIFIER { 2.5.29.15 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            BIT_STRING { `0106` }
+          }
+        }
+        SEQUENCE {
+          # basicConstraints
+          OBJECT_IDENTIFIER { 2.5.29.19 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              BOOLEAN { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `00209bf64b888cbd58493d8898b215ed640ddb04e329e43e3db45a20782ab7acc22dca7cbb11b4fbdb08b8acf163d116948db57b044773d51b8bdf09b1a6465268d60388fee8740aa4167e9d44f19027b075802438c909b9afd0f298027bf0b56e6dd1e92ea5d393e2b422c49bb324433bce95a828149db3e5491d1572b11be5f4` }
+}
+-----BEGIN CA CERTIFICATE-----
+MIIBzjCCATegAwIBAgIBATANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdUZXN0
+IENBMCIYDzIwMTcwMTAxMDAwMDAwWhgPMjAxODAxMDEwMDAwMDBaMB8xHTAbBgNV
+BAMMFFRlc3QgSW50ZXJtZWRpYXRlIENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
+iQKBgQD2D0oGbZ3AVWL1yHlEQWO3O+Cz1eMt1+/wka9dPHC/OGAGcjaJTQhfWBxw
+oah1PVuIgrJjcz6JpHuZicNs5DizuWrBaxyoh48tUTgwVaF99pNsgrT1BynrLwjw
+9G9BBvpZdeyDwG99ETVGg1TgFHjnhHTFa2rKTYo+hv9+SU5kBwIDAQABoyMwITAO
+BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOB
+gQAgm/ZLiIy9WEk9iJiyFe1kDdsE4ynkPj20WiB4Kreswi3KfLsRtPvbCLis8WPR
+FpSNtXsER3PVG4vfCbGmRlJo1gOI/uh0CqQWfp1E8ZAnsHWAJDjJCbmv0PKYAnvw
+tW5t0ekupdOT4rQixJuzJEM7zpWoKBSds+VJHRVysRvl9A==
+-----END CA CERTIFICATE-----
+
+SEQUENCE {
+  SEQUENCE {
+    [0] {
+      INTEGER { 2 }
+    }
+    INTEGER { 5 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Cert" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00b86043a5c55800fd75606bd07e94c08c4bbd7c2ed4bcb6f8caac436213ab24587377a0107678abcca31c31fd84b78636034a6ea4853d62bd86d8a5e4c8f741b6efdf1008696e8eed8f30db3fdc78ca13d39d6cca9bc1563111e0bace35ffca03ab146bf07bb4636f6b38cf8b2feb1336e3f209ff30aad4283468a997e8215329` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+    [3] {
+      SEQUENCE {
+        SEQUENCE {
+          # cRLDistributionPoints
+          OBJECT_IDENTIFIER { 2.5.29.31 }
+          OCTET_STRING {
+            SEQUENCE {
+              SEQUENCE {
+                [0] {
+                  [0] {
+                    [6 PRIMITIVE] { "http://example.com/foo.crl" }
+                  }
+                }
+              }
+            }
+          }
+        }
+        SEQUENCE {
+          # basicConstraints
+          OBJECT_IDENTIFIER { 2.5.29.19 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {}
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `00af35a49085f242c33eaad6efba5c2906f7c0ebf5caa66ab2f5ed0a663287da5665963048df790ffb1f223b93a8a40c9a8d26a0d9f0a41dd3d706754a59bfb2579464f984aa7686de56b441759c42b7aeb50b5960eaa27cb469beaeaf2460c1b6d8246dc78d6fce2a05a26f7723f6a1b96c0faf912b4aa67ceaeb432a552e1cb4` }
+}
+-----BEGIN CERTIFICATE-----
+MIIB6jCCAVOgAwIBAgIBBTANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDDBRUZXN0
+IEludGVybWVkaWF0ZSBDQTAiGA8yMDE3MDEwMTAwMDAwMFoYDzIwMTgwMTAxMDAw
+MDAwWjAUMRIwEAYDVQQDDAlUZXN0IENlcnQwgZ8wDQYJKoZIhvcNAQEBBQADgY0A
+MIGJAoGBALhgQ6XFWAD9dWBr0H6UwIxLvXwu1Ly2+MqsQ2ITqyRYc3egEHZ4q8yj
+HDH9hLeGNgNKbqSFPWK9htil5Mj3Qbbv3xAIaW6O7Y8w2z/ceMoT051sypvBVjER
+4LrONf/KA6sUa/B7tGNvazjPiy/rEzbj8gn/MKrUKDRoqZfoIVMpAgMBAAGjPTA7
+MCsGA1UdHwQkMCIwIKAeoByGGmh0dHA6Ly9leGFtcGxlLmNvbS9mb28uY3JsMAwG
+A1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADgYEArzWkkIXyQsM+qtbvulwpBvfA
+6/XKpmqy9e0KZjKH2lZlljBI33kP+x8iO5OopAyajSag2fCkHdPXBnVKWb+yV5Rk
++YSqdobeVrRBdZxCt661C1lg6qJ8tGm+rq8kYMG22CRtx41vzioFom93I/ahuWwP
+r5ErSqZ86utDKlUuHLQ=
+-----END CERTIFICATE-----
\ No newline at end of file
diff --git a/net/data/crl_unittest/good_idp_onlycontainsusercerts_no_basic_constraints.pem b/net/data/crl_unittest/good_idp_onlycontainsusercerts_no_basic_constraints.pem
new file mode 100644
index 0000000..e04556b
--- /dev/null
+++ b/net/data/crl_unittest/good_idp_onlycontainsusercerts_no_basic_constraints.pem
@@ -0,0 +1,230 @@
+Generated by generate_crl_test_data.py. Do not edit.
+
+Leaf covered by CRLs and not revoked, CRL has IDP with onlyContainsUserCerts, leaf has no basicConstraints
+
+SEQUENCE {
+  SEQUENCE {
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    UTCTime { "170302001122Z" }
+    UTCTime { "170602001122Z" }
+    [0] {
+      SEQUENCE {
+        SEQUENCE {
+          # issuingDistributionPoint
+          OBJECT_IDENTIFIER { 2.5.29.28 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              [1 PRIMITIVE] { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `002f2deff3f117300df880570eebe5789244d45c0fc6db66e0f90d740c55e2344278c301d237579ae2ae73d507b7e60efb244b49461b5c44aa708bc192a4040e1d58b7c22036c36f39acab389f363c50e97a8b62d051f7e94d08a2b465cf95fd04e500c16ea5f1e74b00c6b738abcbfda713bab4a1139ad54f412e70199a255658` }
+}
+-----BEGIN CRL-----
+MIH7MGYCAQEwDQYJKoZIhvcNAQELBQAwHzEdMBsGA1UEAwwUVGVzdCBJbnRlcm1l
+ZGlhdGUgQ0EXDTE3MDMwMjAwMTEyMloXDTE3MDYwMjAwMTEyMlqgEzARMA8GA1Ud
+HAEB/wQFMAOBAf8wDQYJKoZIhvcNAQELBQADgYEALy3v8/EXMA34gFcO6+V4kkTU
+XA/G22bg+Q10DFXiNEJ4wwHSN1ea4q5z1Qe35g77JEtJRhtcRKpwi8GSpAQOHVi3
+wiA2w285rKs4nzY8UOl6i2LQUffpTQiitGXPlf0E5QDBbqXx50sAxrc4q8v9pxO6
+tKETmtVPQS5wGZolVlg=
+-----END CRL-----
+
+SEQUENCE {
+  SEQUENCE {
+    [0] {
+      INTEGER { 2 }
+    }
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00f60f4a066d9dc05562f5c879444163b73be0b3d5e32dd7eff091af5d3c70bf3860067236894d085f581c70a1a8753d5b8882b263733e89a47b9989c36ce438b3b96ac16b1ca8878f2d51383055a17df6936c82b4f50729eb2f08f0f46f4106fa5975ec83c06f7d1135468354e01478e78474c56b6aca4d8a3e86ff7e494e6407` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+    [3] {
+      SEQUENCE {
+        SEQUENCE {
+          # keyUsage
+          OBJECT_IDENTIFIER { 2.5.29.15 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            BIT_STRING { `0106` }
+          }
+        }
+        SEQUENCE {
+          # basicConstraints
+          OBJECT_IDENTIFIER { 2.5.29.19 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              BOOLEAN { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `00209bf64b888cbd58493d8898b215ed640ddb04e329e43e3db45a20782ab7acc22dca7cbb11b4fbdb08b8acf163d116948db57b044773d51b8bdf09b1a6465268d60388fee8740aa4167e9d44f19027b075802438c909b9afd0f298027bf0b56e6dd1e92ea5d393e2b422c49bb324433bce95a828149db3e5491d1572b11be5f4` }
+}
+-----BEGIN CA CERTIFICATE-----
+MIIBzjCCATegAwIBAgIBATANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdUZXN0
+IENBMCIYDzIwMTcwMTAxMDAwMDAwWhgPMjAxODAxMDEwMDAwMDBaMB8xHTAbBgNV
+BAMMFFRlc3QgSW50ZXJtZWRpYXRlIENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
+iQKBgQD2D0oGbZ3AVWL1yHlEQWO3O+Cz1eMt1+/wka9dPHC/OGAGcjaJTQhfWBxw
+oah1PVuIgrJjcz6JpHuZicNs5DizuWrBaxyoh48tUTgwVaF99pNsgrT1BynrLwjw
+9G9BBvpZdeyDwG99ETVGg1TgFHjnhHTFa2rKTYo+hv9+SU5kBwIDAQABoyMwITAO
+BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOB
+gQAgm/ZLiIy9WEk9iJiyFe1kDdsE4ynkPj20WiB4Kreswi3KfLsRtPvbCLis8WPR
+FpSNtXsER3PVG4vfCbGmRlJo1gOI/uh0CqQWfp1E8ZAnsHWAJDjJCbmv0PKYAnvw
+tW5t0ekupdOT4rQixJuzJEM7zpWoKBSds+VJHRVysRvl9A==
+-----END CA CERTIFICATE-----
+
+SEQUENCE {
+  SEQUENCE {
+    [0] {
+      INTEGER { 2 }
+    }
+    INTEGER { 6 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Cert" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00d19aa4fda893774bdad672e2be8ecc8d8e7c5b8348d67b663cd297e4f068b5ed78be1aa7dd8f7bd871faaa052007b40fb2468fc455f5a691774b55cae696c32d0d0e9f9545118d528fcd8932a9682e50f1aae0b5a88bcbc43308c1f5a230d1dacf8e3c229327784f6f9a6c5b12c9c575e9003f10e38527f94782a424b164a86f` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+    [3] {
+      SEQUENCE {
+        SEQUENCE {
+          # cRLDistributionPoints
+          OBJECT_IDENTIFIER { 2.5.29.31 }
+          OCTET_STRING {
+            SEQUENCE {
+              SEQUENCE {
+                [0] {
+                  [0] {
+                    [6 PRIMITIVE] { "http://example.com/foo.crl" }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `00e14d6cad7fe998eba094e9e36701bc7dfecf3cbf4eebae9d3a5b5e977de9a557633ed93ab642baa637631e131dd162f069d6430e0198914004c1a4876f621ed56c9fe4d4613f93d7d2ed5eca1b7dd0434aeb89e1e1caa57e686312ea38ff791db53409c1dfb3178a1e11e819c030063f1e16f487abc57dfe1ec1bf2c9e4934db` }
+}
+-----BEGIN CERTIFICATE-----
+MIIB3DCCAUWgAwIBAgIBBjANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDDBRUZXN0
+IEludGVybWVkaWF0ZSBDQTAiGA8yMDE3MDEwMTAwMDAwMFoYDzIwMTgwMTAxMDAw
+MDAwWjAUMRIwEAYDVQQDDAlUZXN0IENlcnQwgZ8wDQYJKoZIhvcNAQEBBQADgY0A
+MIGJAoGBANGapP2ok3dL2tZy4r6OzI2OfFuDSNZ7ZjzSl+TwaLXteL4ap92Pe9hx
++qoFIAe0D7JGj8RV9aaRd0tVyuaWwy0NDp+VRRGNUo/NiTKpaC5Q8argtaiLy8Qz
+CMH1ojDR2s+OPCKTJ3hPb5psWxLJxXXpAD8Q44Un+UeCpCSxZKhvAgMBAAGjLzAt
+MCsGA1UdHwQkMCIwIKAeoByGGmh0dHA6Ly9leGFtcGxlLmNvbS9mb28uY3JsMA0G
+CSqGSIb3DQEBCwUAA4GBAOFNbK1/6ZjroJTp42cBvH3+zzy/TuuunTpbXpd96aVX
+Yz7ZOrZCuqY3Yx4THdFi8GnWQw4BmJFABMGkh29iHtVsn+TUYT+T19LtXsobfdBD
+SuuJ4eHKpX5oYxLqOP95HbU0CcHfsxeKHhHoGcAwBj8eFvSHq8V9/h7BvyyeSTTb
+-----END CERTIFICATE-----
\ No newline at end of file
diff --git a/net/data/crl_unittest/good_idp_uri_and_onlycontainscacerts.pem b/net/data/crl_unittest/good_idp_uri_and_onlycontainscacerts.pem
new file mode 100644
index 0000000..5784f097
--- /dev/null
+++ b/net/data/crl_unittest/good_idp_uri_and_onlycontainscacerts.pem
@@ -0,0 +1,254 @@
+Generated by generate_crl_test_data.py. Do not edit.
+
+CA_NEW_BY_OLD covered by CRLs and not revoked, CRL has IDP with onlyContainsCACerts
+
+SEQUENCE {
+  SEQUENCE {
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    UTCTime { "170302001122Z" }
+    UTCTime { "170602001122Z" }
+    [0] {
+      SEQUENCE {
+        SEQUENCE {
+          # issuingDistributionPoint
+          OBJECT_IDENTIFIER { 2.5.29.28 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              [0] {
+                [0] {
+                  [6 PRIMITIVE] { "http://example.com/foo.crl" }
+                }
+              }
+              [2 PRIMITIVE] { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `00c178b9f518f750b1af57ac18f4f2b2655073da220f27ab188badbb12ef009b2db63452a4517be6482862798e73eacd7cbd4d7ffc3ee10720cbed3e40c773dbc16f8697929f0e4806ba0a6462e423835777ad71b76bdf36dcf1e27774ea737fc2789d3454a681204f01660304472bf924cfb1ee4f0f0803b08d8038f00ae1dae9` }
+}
+-----BEGIN CRL-----
+MIIBHDCBhgIBATANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDDBRUZXN0IEludGVy
+bWVkaWF0ZSBDQRcNMTcwMzAyMDAxMTIyWhcNMTcwNjAyMDAxMTIyWqAzMDEwLwYD
+VR0cAQH/BCUwI6AeoByGGmh0dHA6Ly9leGFtcGxlLmNvbS9mb28uY3JsggH/MA0G
+CSqGSIb3DQEBCwUAA4GBAMF4ufUY91Cxr1esGPTysmVQc9oiDyerGIutuxLvAJst
+tjRSpFF75kgoYnmOc+rNfL1Nf/w+4Qcgy+0+QMdz28FvhpeSnw5IBroKZGLkI4NX
+d61xt2vfNtzx4nd06nN/wnidNFSmgSBPAWYDBEcr+STPse5PDwgDsI2AOPAK4drp
+-----END CRL-----
+
+SEQUENCE {
+  SEQUENCE {
+    [0] {
+      INTEGER { 2 }
+    }
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00f60f4a066d9dc05562f5c879444163b73be0b3d5e32dd7eff091af5d3c70bf3860067236894d085f581c70a1a8753d5b8882b263733e89a47b9989c36ce438b3b96ac16b1ca8878f2d51383055a17df6936c82b4f50729eb2f08f0f46f4106fa5975ec83c06f7d1135468354e01478e78474c56b6aca4d8a3e86ff7e494e6407` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+    [3] {
+      SEQUENCE {
+        SEQUENCE {
+          # keyUsage
+          OBJECT_IDENTIFIER { 2.5.29.15 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            BIT_STRING { `0106` }
+          }
+        }
+        SEQUENCE {
+          # basicConstraints
+          OBJECT_IDENTIFIER { 2.5.29.19 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              BOOLEAN { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `00209bf64b888cbd58493d8898b215ed640ddb04e329e43e3db45a20782ab7acc22dca7cbb11b4fbdb08b8acf163d116948db57b044773d51b8bdf09b1a6465268d60388fee8740aa4167e9d44f19027b075802438c909b9afd0f298027bf0b56e6dd1e92ea5d393e2b422c49bb324433bce95a828149db3e5491d1572b11be5f4` }
+}
+-----BEGIN CA CERTIFICATE-----
+MIIBzjCCATegAwIBAgIBATANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdUZXN0
+IENBMCIYDzIwMTcwMTAxMDAwMDAwWhgPMjAxODAxMDEwMDAwMDBaMB8xHTAbBgNV
+BAMMFFRlc3QgSW50ZXJtZWRpYXRlIENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
+iQKBgQD2D0oGbZ3AVWL1yHlEQWO3O+Cz1eMt1+/wka9dPHC/OGAGcjaJTQhfWBxw
+oah1PVuIgrJjcz6JpHuZicNs5DizuWrBaxyoh48tUTgwVaF99pNsgrT1BynrLwjw
+9G9BBvpZdeyDwG99ETVGg1TgFHjnhHTFa2rKTYo+hv9+SU5kBwIDAQABoyMwITAO
+BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOB
+gQAgm/ZLiIy9WEk9iJiyFe1kDdsE4ynkPj20WiB4Kreswi3KfLsRtPvbCLis8WPR
+FpSNtXsER3PVG4vfCbGmRlJo1gOI/uh0CqQWfp1E8ZAnsHWAJDjJCbmv0PKYAnvw
+tW5t0ekupdOT4rQixJuzJEM7zpWoKBSds+VJHRVysRvl9A==
+-----END CA CERTIFICATE-----
+
+SEQUENCE {
+  SEQUENCE {
+    [0] {
+      INTEGER { 2 }
+    }
+    INTEGER { 9 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00bbe351f22cd50acab58fb3db3fac3bbcf03a15c3dbaf83c06e36957f301d04819a1353f87978b81c8104a50438806564bfd8c22a80e3d0973da5b8701d26d925961579b5e86dbf490e78270436a3c92739e6a99f839ad31dddd1365044491028efefeebd14d233cb1cf84ad62fb3ac3c4e5a08ac43a4d69482a5fe8d57e05ec9` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+    [3] {
+      SEQUENCE {
+        SEQUENCE {
+          # cRLDistributionPoints
+          OBJECT_IDENTIFIER { 2.5.29.31 }
+          OCTET_STRING {
+            SEQUENCE {
+              SEQUENCE {
+                [0] {
+                  [0] {
+                    [6 PRIMITIVE] { "http://example.com/foo.crl" }
+                  }
+                }
+              }
+            }
+          }
+        }
+        SEQUENCE {
+          # keyUsage
+          OBJECT_IDENTIFIER { 2.5.29.15 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            BIT_STRING { `0106` }
+          }
+        }
+        SEQUENCE {
+          # basicConstraints
+          OBJECT_IDENTIFIER { 2.5.29.19 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              BOOLEAN { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `0016ca2c0303547045178664c36b2b44c129a9a61c109c58b8d38854607e20b400b878d7732c95404925da7068f0a5d3f456055b0fa79d0ad0cb136ef6653fd3d1c7331ff47e256c9a60bfc01e0493ad731172659ed9478bb4b2148ae24060f266aeb455df86be037d4b3580ca727058e4af641f299060243a8ab8c8ebb8ee0972` }
+}
+-----BEGIN CERTIFICATE-----
+MIICCDCCAXGgAwIBAgIBCTANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDDBRUZXN0
+IEludGVybWVkaWF0ZSBDQTAiGA8yMDE3MDEwMTAwMDAwMFoYDzIwMTgwMTAxMDAw
+MDAwWjAfMR0wGwYDVQQDDBRUZXN0IEludGVybWVkaWF0ZSBDQTCBnzANBgkqhkiG
+9w0BAQEFAAOBjQAwgYkCgYEAu+NR8izVCsq1j7PbP6w7vPA6FcPbr4PAbjaVfzAd
+BIGaE1P4eXi4HIEEpQQ4gGVkv9jCKoDj0Jc9pbhwHSbZJZYVebXobb9JDngnBDaj
+ySc55qmfg5rTHd3RNlBESRAo7+/uvRTSM8sc+ErWL7OsPE5aCKxDpNaUgqX+jVfg
+XskCAwEAAaNQME4wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL2V4YW1wbGUuY29t
+L2Zvby5jcmwwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
+hvcNAQELBQADgYEAFsosAwNUcEUXhmTDaytEwSmpphwQnFi404hUYH4gtAC4eNdz
+LJVASSXacGjwpdP0VgVbD6edCtDLE272ZT/T0cczH/R+JWyaYL/AHgSTrXMRcmWe
+2UeLtLIUiuJAYPJmrrRV34a+A31LNYDKcnBY5K9kHymQYCQ6irjI67juCXI=
+-----END CERTIFICATE-----
\ No newline at end of file
diff --git a/net/data/crl_unittest/good_idp_uri_and_onlycontainsusercerts.pem b/net/data/crl_unittest/good_idp_uri_and_onlycontainsusercerts.pem
new file mode 100644
index 0000000..8f5d364
--- /dev/null
+++ b/net/data/crl_unittest/good_idp_uri_and_onlycontainsusercerts.pem
@@ -0,0 +1,244 @@
+Generated by generate_crl_test_data.py. Do not edit.
+
+Leaf covered by CRLs and not revoked, CRL has IDP with onlyContainsUserCerts
+
+SEQUENCE {
+  SEQUENCE {
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    UTCTime { "170302001122Z" }
+    UTCTime { "170602001122Z" }
+    [0] {
+      SEQUENCE {
+        SEQUENCE {
+          # issuingDistributionPoint
+          OBJECT_IDENTIFIER { 2.5.29.28 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              [0] {
+                [0] {
+                  [6 PRIMITIVE] { "http://example.com/foo.crl" }
+                }
+              }
+              [1 PRIMITIVE] { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `009a41c69e30a49b28b57ffbd85a35856d0eb161a02e00c55e68dac36b826bbae72197b3fea075d03f7f033eaaf8b75f0e47a8975509b3160425f7744c0a81bccbbb7f3fc109aab610ffb960aede74364952e7ba5a620bacbf51483e47061eb2346cac99285230e9bd06d82a06bfa7dee48766677de1f9eb3a5199a2ee750380c7` }
+}
+-----BEGIN CRL-----
+MIIBHDCBhgIBATANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDDBRUZXN0IEludGVy
+bWVkaWF0ZSBDQRcNMTcwMzAyMDAxMTIyWhcNMTcwNjAyMDAxMTIyWqAzMDEwLwYD
+VR0cAQH/BCUwI6AeoByGGmh0dHA6Ly9leGFtcGxlLmNvbS9mb28uY3JsgQH/MA0G
+CSqGSIb3DQEBCwUAA4GBAJpBxp4wpJsotX/72Fo1hW0OsWGgLgDFXmjaw2uCa7rn
+IZez/qB10D9/Az6q+LdfDkeol1UJsxYEJfd0TAqBvMu7fz/BCaq2EP+5YK7edDZJ
+Uue6WmILrL9RSD5HBh6yNGysmShSMOm9BtgqBr+n3uSHZmd94fnrOlGZou51A4DH
+-----END CRL-----
+
+SEQUENCE {
+  SEQUENCE {
+    [0] {
+      INTEGER { 2 }
+    }
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00f60f4a066d9dc05562f5c879444163b73be0b3d5e32dd7eff091af5d3c70bf3860067236894d085f581c70a1a8753d5b8882b263733e89a47b9989c36ce438b3b96ac16b1ca8878f2d51383055a17df6936c82b4f50729eb2f08f0f46f4106fa5975ec83c06f7d1135468354e01478e78474c56b6aca4d8a3e86ff7e494e6407` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+    [3] {
+      SEQUENCE {
+        SEQUENCE {
+          # keyUsage
+          OBJECT_IDENTIFIER { 2.5.29.15 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            BIT_STRING { `0106` }
+          }
+        }
+        SEQUENCE {
+          # basicConstraints
+          OBJECT_IDENTIFIER { 2.5.29.19 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              BOOLEAN { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `00209bf64b888cbd58493d8898b215ed640ddb04e329e43e3db45a20782ab7acc22dca7cbb11b4fbdb08b8acf163d116948db57b044773d51b8bdf09b1a6465268d60388fee8740aa4167e9d44f19027b075802438c909b9afd0f298027bf0b56e6dd1e92ea5d393e2b422c49bb324433bce95a828149db3e5491d1572b11be5f4` }
+}
+-----BEGIN CA CERTIFICATE-----
+MIIBzjCCATegAwIBAgIBATANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdUZXN0
+IENBMCIYDzIwMTcwMTAxMDAwMDAwWhgPMjAxODAxMDEwMDAwMDBaMB8xHTAbBgNV
+BAMMFFRlc3QgSW50ZXJtZWRpYXRlIENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
+iQKBgQD2D0oGbZ3AVWL1yHlEQWO3O+Cz1eMt1+/wka9dPHC/OGAGcjaJTQhfWBxw
+oah1PVuIgrJjcz6JpHuZicNs5DizuWrBaxyoh48tUTgwVaF99pNsgrT1BynrLwjw
+9G9BBvpZdeyDwG99ETVGg1TgFHjnhHTFa2rKTYo+hv9+SU5kBwIDAQABoyMwITAO
+BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOB
+gQAgm/ZLiIy9WEk9iJiyFe1kDdsE4ynkPj20WiB4Kreswi3KfLsRtPvbCLis8WPR
+FpSNtXsER3PVG4vfCbGmRlJo1gOI/uh0CqQWfp1E8ZAnsHWAJDjJCbmv0PKYAnvw
+tW5t0ekupdOT4rQixJuzJEM7zpWoKBSds+VJHRVysRvl9A==
+-----END CA CERTIFICATE-----
+
+SEQUENCE {
+  SEQUENCE {
+    [0] {
+      INTEGER { 2 }
+    }
+    INTEGER { 5 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Cert" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00b86043a5c55800fd75606bd07e94c08c4bbd7c2ed4bcb6f8caac436213ab24587377a0107678abcca31c31fd84b78636034a6ea4853d62bd86d8a5e4c8f741b6efdf1008696e8eed8f30db3fdc78ca13d39d6cca9bc1563111e0bace35ffca03ab146bf07bb4636f6b38cf8b2feb1336e3f209ff30aad4283468a997e8215329` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+    [3] {
+      SEQUENCE {
+        SEQUENCE {
+          # cRLDistributionPoints
+          OBJECT_IDENTIFIER { 2.5.29.31 }
+          OCTET_STRING {
+            SEQUENCE {
+              SEQUENCE {
+                [0] {
+                  [0] {
+                    [6 PRIMITIVE] { "http://example.com/foo.crl" }
+                  }
+                }
+              }
+            }
+          }
+        }
+        SEQUENCE {
+          # basicConstraints
+          OBJECT_IDENTIFIER { 2.5.29.19 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {}
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `00af35a49085f242c33eaad6efba5c2906f7c0ebf5caa66ab2f5ed0a663287da5665963048df790ffb1f223b93a8a40c9a8d26a0d9f0a41dd3d706754a59bfb2579464f984aa7686de56b441759c42b7aeb50b5960eaa27cb469beaeaf2460c1b6d8246dc78d6fce2a05a26f7723f6a1b96c0faf912b4aa67ceaeb432a552e1cb4` }
+}
+-----BEGIN CERTIFICATE-----
+MIIB6jCCAVOgAwIBAgIBBTANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDDBRUZXN0
+IEludGVybWVkaWF0ZSBDQTAiGA8yMDE3MDEwMTAwMDAwMFoYDzIwMTgwMTAxMDAw
+MDAwWjAUMRIwEAYDVQQDDAlUZXN0IENlcnQwgZ8wDQYJKoZIhvcNAQEBBQADgY0A
+MIGJAoGBALhgQ6XFWAD9dWBr0H6UwIxLvXwu1Ly2+MqsQ2ITqyRYc3egEHZ4q8yj
+HDH9hLeGNgNKbqSFPWK9htil5Mj3Qbbv3xAIaW6O7Y8w2z/ceMoT051sypvBVjER
+4LrONf/KA6sUa/B7tGNvazjPiy/rEzbj8gn/MKrUKDRoqZfoIVMpAgMBAAGjPTA7
+MCsGA1UdHwQkMCIwIKAeoByGGmh0dHA6Ly9leGFtcGxlLmNvbS9mb28uY3JsMAwG
+A1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADgYEArzWkkIXyQsM+qtbvulwpBvfA
+6/XKpmqy9e0KZjKH2lZlljBI33kP+x8iO5OopAyajSag2fCkHdPXBnVKWb+yV5Rk
++YSqdobeVrRBdZxCt661C1lg6qJ8tGm+rq8kYMG22CRtx41vzioFom93I/ahuWwP
+r5ErSqZ86utDKlUuHLQ=
+-----END CERTIFICATE-----
\ No newline at end of file
diff --git a/net/data/crl_unittest/invalid_idp_onlycontains_user_and_ca_certs.pem b/net/data/crl_unittest/invalid_idp_onlycontains_user_and_ca_certs.pem
new file mode 100644
index 0000000..8fea270
--- /dev/null
+++ b/net/data/crl_unittest/invalid_idp_onlycontains_user_and_ca_certs.pem
@@ -0,0 +1,240 @@
+Generated by generate_crl_test_data.py. Do not edit.
+
+IssuingDistributionPoint extension is invalid, cannot specify more than one of onlyContainsUserCerts and onlyContainsCACerts
+
+SEQUENCE {
+  SEQUENCE {
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    UTCTime { "170302001122Z" }
+    UTCTime { "170602001122Z" }
+    [0] {
+      SEQUENCE {
+        SEQUENCE {
+          # issuingDistributionPoint
+          OBJECT_IDENTIFIER { 2.5.29.28 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              [1 PRIMITIVE] { `ff` }
+              [2 PRIMITIVE] { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `00732914c46fddaa6b366d24adc1c5b88697be036387013016f43cc63ea67b9714faa195dfaadf33d6a0bd56bb1b47adeb3b68aa8c7819af7325fe6e9371b5a38fea52e9f709902423f925b1da9f221c85e29d0e143af1603f8634f59db32ae3e88a831df27b38134669be032953a75318fb7f910421ab0e400a2f63299f9d0ada` }
+}
+-----BEGIN CRL-----
+MIH+MGkCAQEwDQYJKoZIhvcNAQELBQAwHzEdMBsGA1UEAwwUVGVzdCBJbnRlcm1l
+ZGlhdGUgQ0EXDTE3MDMwMjAwMTEyMloXDTE3MDYwMjAwMTEyMlqgFjAUMBIGA1Ud
+HAEB/wQIMAaBAf+CAf8wDQYJKoZIhvcNAQELBQADgYEAcykUxG/dqms2bSStwcW4
+hpe+A2OHATAW9DzGPqZ7lxT6oZXfqt8z1qC9VrsbR63rO2iqjHgZr3Ml/m6TcbWj
+j+pS6fcJkCQj+SWx2p8iHIXinQ4UOvFgP4Y09Z2zKuPoioMd8ns4E0ZpvgMpU6dT
+GPt/kQQhqw5ACi9jKZ+dCto=
+-----END CRL-----
+
+SEQUENCE {
+  SEQUENCE {
+    [0] {
+      INTEGER { 2 }
+    }
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00f60f4a066d9dc05562f5c879444163b73be0b3d5e32dd7eff091af5d3c70bf3860067236894d085f581c70a1a8753d5b8882b263733e89a47b9989c36ce438b3b96ac16b1ca8878f2d51383055a17df6936c82b4f50729eb2f08f0f46f4106fa5975ec83c06f7d1135468354e01478e78474c56b6aca4d8a3e86ff7e494e6407` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+    [3] {
+      SEQUENCE {
+        SEQUENCE {
+          # keyUsage
+          OBJECT_IDENTIFIER { 2.5.29.15 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            BIT_STRING { `0106` }
+          }
+        }
+        SEQUENCE {
+          # basicConstraints
+          OBJECT_IDENTIFIER { 2.5.29.19 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              BOOLEAN { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `00209bf64b888cbd58493d8898b215ed640ddb04e329e43e3db45a20782ab7acc22dca7cbb11b4fbdb08b8acf163d116948db57b044773d51b8bdf09b1a6465268d60388fee8740aa4167e9d44f19027b075802438c909b9afd0f298027bf0b56e6dd1e92ea5d393e2b422c49bb324433bce95a828149db3e5491d1572b11be5f4` }
+}
+-----BEGIN CA CERTIFICATE-----
+MIIBzjCCATegAwIBAgIBATANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdUZXN0
+IENBMCIYDzIwMTcwMTAxMDAwMDAwWhgPMjAxODAxMDEwMDAwMDBaMB8xHTAbBgNV
+BAMMFFRlc3QgSW50ZXJtZWRpYXRlIENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
+iQKBgQD2D0oGbZ3AVWL1yHlEQWO3O+Cz1eMt1+/wka9dPHC/OGAGcjaJTQhfWBxw
+oah1PVuIgrJjcz6JpHuZicNs5DizuWrBaxyoh48tUTgwVaF99pNsgrT1BynrLwjw
+9G9BBvpZdeyDwG99ETVGg1TgFHjnhHTFa2rKTYo+hv9+SU5kBwIDAQABoyMwITAO
+BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOB
+gQAgm/ZLiIy9WEk9iJiyFe1kDdsE4ynkPj20WiB4Kreswi3KfLsRtPvbCLis8WPR
+FpSNtXsER3PVG4vfCbGmRlJo1gOI/uh0CqQWfp1E8ZAnsHWAJDjJCbmv0PKYAnvw
+tW5t0ekupdOT4rQixJuzJEM7zpWoKBSds+VJHRVysRvl9A==
+-----END CA CERTIFICATE-----
+
+SEQUENCE {
+  SEQUENCE {
+    [0] {
+      INTEGER { 2 }
+    }
+    INTEGER { 5 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Cert" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00b86043a5c55800fd75606bd07e94c08c4bbd7c2ed4bcb6f8caac436213ab24587377a0107678abcca31c31fd84b78636034a6ea4853d62bd86d8a5e4c8f741b6efdf1008696e8eed8f30db3fdc78ca13d39d6cca9bc1563111e0bace35ffca03ab146bf07bb4636f6b38cf8b2feb1336e3f209ff30aad4283468a997e8215329` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+    [3] {
+      SEQUENCE {
+        SEQUENCE {
+          # cRLDistributionPoints
+          OBJECT_IDENTIFIER { 2.5.29.31 }
+          OCTET_STRING {
+            SEQUENCE {
+              SEQUENCE {
+                [0] {
+                  [0] {
+                    [6 PRIMITIVE] { "http://example.com/foo.crl" }
+                  }
+                }
+              }
+            }
+          }
+        }
+        SEQUENCE {
+          # basicConstraints
+          OBJECT_IDENTIFIER { 2.5.29.19 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {}
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `00af35a49085f242c33eaad6efba5c2906f7c0ebf5caa66ab2f5ed0a663287da5665963048df790ffb1f223b93a8a40c9a8d26a0d9f0a41dd3d706754a59bfb2579464f984aa7686de56b441759c42b7aeb50b5960eaa27cb469beaeaf2460c1b6d8246dc78d6fce2a05a26f7723f6a1b96c0faf912b4aa67ceaeb432a552e1cb4` }
+}
+-----BEGIN CERTIFICATE-----
+MIIB6jCCAVOgAwIBAgIBBTANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDDBRUZXN0
+IEludGVybWVkaWF0ZSBDQTAiGA8yMDE3MDEwMTAwMDAwMFoYDzIwMTgwMTAxMDAw
+MDAwWjAUMRIwEAYDVQQDDAlUZXN0IENlcnQwgZ8wDQYJKoZIhvcNAQEBBQADgY0A
+MIGJAoGBALhgQ6XFWAD9dWBr0H6UwIxLvXwu1Ly2+MqsQ2ITqyRYc3egEHZ4q8yj
+HDH9hLeGNgNKbqSFPWK9htil5Mj3Qbbv3xAIaW6O7Y8w2z/ceMoT051sypvBVjER
+4LrONf/KA6sUa/B7tGNvazjPiy/rEzbj8gn/MKrUKDRoqZfoIVMpAgMBAAGjPTA7
+MCsGA1UdHwQkMCIwIKAeoByGGmh0dHA6Ly9leGFtcGxlLmNvbS9mb28uY3JsMAwG
+A1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADgYEArzWkkIXyQsM+qtbvulwpBvfA
+6/XKpmqy9e0KZjKH2lZlljBI33kP+x8iO5OopAyajSag2fCkHdPXBnVKWb+yV5Rk
++YSqdobeVrRBdZxCt661C1lg6qJ8tGm+rq8kYMG22CRtx41vzioFom93I/ahuWwP
+r5ErSqZ86utDKlUuHLQ=
+-----END CERTIFICATE-----
\ No newline at end of file
diff --git a/net/data/crl_unittest/invalid_idp_onlycontainsusercerts_v1_leaf.pem b/net/data/crl_unittest/invalid_idp_onlycontainsusercerts_v1_leaf.pem
new file mode 100644
index 0000000..5cc264e
--- /dev/null
+++ b/net/data/crl_unittest/invalid_idp_onlycontainsusercerts_v1_leaf.pem
@@ -0,0 +1,207 @@
+Generated by generate_crl_test_data.py. Do not edit.
+
+v1 leaf is covered by CRL with onlyContainsUserCerts, which is invalid
+
+SEQUENCE {
+  SEQUENCE {
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    UTCTime { "170302001122Z" }
+    UTCTime { "170602001122Z" }
+    [0] {
+      SEQUENCE {
+        SEQUENCE {
+          # issuingDistributionPoint
+          OBJECT_IDENTIFIER { 2.5.29.28 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              [1 PRIMITIVE] { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `00a0622aaa13d75795b643f7bde4794f8a9cc5f4c45080929e8db6b5516d897a91cbeff8d2196407f4fd453aeb903c256da07a13063096edfc3577d7931df5a8a449b8990375fdb07dd6257c6a2df8aaecd8d9c1581906a93f8c951dce6d8974399ea6c060a303877891815fc0fd8df9fe55e35997246c368b9a0d2150f6f50fcd` }
+}
+-----BEGIN CRL-----
+MIH7MGYCAQEwDQYJKoZIhvcNAQELBQAwHzEdMBsGA1UEAwwUVGVzdCBJbnRlcm1l
+ZGlhdGUgQ0EXDTE3MDMwMjAwMTEyMloXDTE3MDYwMjAwMTEyMlqgEzARMA8GA1Ud
+HAEB/wQFMAOBAf8wDQYJKoZIhvcNAQELBQADgYEAoGIqqhPXV5W2Q/e95HlPipzF
+9MRQgJKejba1UW2JepHL7/jSGWQH9P1FOuuQPCVtoHoTBjCW7fw1d9eTHfWopEm4
+mQN1/bB91iV8ai34quzY2cFYGQapP4yVHc5tiXQ5nqbAYKMDh3iRgV/A/Y35/lXj
+WZckbDaLmg0hUPb1D80=
+-----END CRL-----
+
+SEQUENCE {
+  SEQUENCE {
+    [0] {
+      INTEGER { 2 }
+    }
+    INTEGER { 1 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00bc0c9b8bfb43c66a78d796d2727ecfebd8701881296df17c64948844be617a7b0a2f6ca398eddb11bbc7a2aae8479cebd5c1763fd719fb5b33e661b7b401c501bfa8889074d133bfce2a4d2753b4d2fc4f58185bb6711536b5f8333bda853b8abd68f22b4f2403ad740a56a3f66eaedeb216ce3f02ffc869fc40f38bd91b038b` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+    [3] {
+      SEQUENCE {
+        SEQUENCE {
+          # keyUsage
+          OBJECT_IDENTIFIER { 2.5.29.15 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            BIT_STRING { `0106` }
+          }
+        }
+        SEQUENCE {
+          # basicConstraints
+          OBJECT_IDENTIFIER { 2.5.29.19 }
+          BOOLEAN { `ff` }
+          OCTET_STRING {
+            SEQUENCE {
+              BOOLEAN { `ff` }
+            }
+          }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `0080c61fa7019fe41df7eed8ef6301a8fd8519fbd75060ccffc8519dac9d7a3a933de781b8fd857f4c5aed87abbd044b545ff61428a2ba061c615b24fe70dacb4a3942996df651aadb16905595f55e345981f46025d99cfb714ac338693809dc2210c68a548da50ed5d118026efa6f28839b50f471d9e7ce5a4c24d6136548dba9` }
+}
+-----BEGIN CA CERTIFICATE-----
+MIIBzjCCATegAwIBAgIBATANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdUZXN0
+IENBMCIYDzIwMTcwMTAxMDAwMDAwWhgPMjAxODAxMDEwMDAwMDBaMB8xHTAbBgNV
+BAMMFFRlc3QgSW50ZXJtZWRpYXRlIENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
+iQKBgQC8DJuL+0PGanjXltJyfs/r2HAYgSlt8XxklIhEvmF6ewovbKOY7dsRu8ei
+quhHnOvVwXY/1xn7WzPmYbe0AcUBv6iIkHTRM7/OKk0nU7TS/E9YGFu2cRU2tfgz
+O9qFO4q9aPIrTyQDrXQKVqP2bq7eshbOPwL/yGn8QPOL2RsDiwIDAQABoyMwITAO
+BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOB
+gQCAxh+nAZ/kHffu2O9jAaj9hRn711BgzP/IUZ2snXo6kz3ngbj9hX9MWu2Hq70E
+S1Rf9hQooroGHGFbJP5w2stKOUKZbfZRqtsWkFWV9V40WYH0YCXZnPtxSsM4aTgJ
+3CIQxopUjaUO1dEYAm76byiDm1D0cdnnzlpMJNYTZUjbqQ==
+-----END CA CERTIFICATE-----
+
+SEQUENCE {
+  SEQUENCE {
+    INTEGER { 8 }
+    SEQUENCE {
+      # sha256WithRSAEncryption
+      OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+      NULL {}
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Intermediate CA" }
+        }
+      }
+    }
+    SEQUENCE {
+      GeneralizedTime { "20170101000000Z" }
+      GeneralizedTime { "20180101000000Z" }
+    }
+    SEQUENCE {
+      SET {
+        SEQUENCE {
+          # commonName
+          OBJECT_IDENTIFIER { 2.5.4.3 }
+          UTF8String { "Test Cert" }
+        }
+      }
+    }
+    SEQUENCE {
+      SEQUENCE {
+        # rsaEncryption
+        OBJECT_IDENTIFIER { 1.2.840.113549.1.1.1 }
+        NULL {}
+      }
+      BIT_STRING {
+        `00`
+        SEQUENCE {
+          INTEGER { `00ae0e3777c64af43b4c326717f5f6a090f63e374c946fe7e41dc3d50260844a059b9d2aad7cccfb5b75cb925e029ab60a107ad197caecee0f1868275ff34eec0ed2dee741d24bb3cf780eb2b5d6e470c7bc722140a95db43491a09581f696cbf3eeb7134467e36a206739124da49134b9a148d10c5f0e94f89f78800b1d677f03` }
+          INTEGER { 65537 }
+        }
+      }
+    }
+  }
+  SEQUENCE {
+    # sha256WithRSAEncryption
+    OBJECT_IDENTIFIER { 1.2.840.113549.1.1.11 }
+    NULL {}
+  }
+  BIT_STRING { `0030d3ac4b944003e8f9e605c349bad290ae2a6ba9563dc64cd9adf91d689c5faafa45d8f5cebbca975f005ab87b6981b822ce0a107cbb21a39c29890c0d10f045833f8624e80adf73e5e8588911579f12a42310765791dac4a329b77089e3c12c0e6a9ca2eed870b8abcd4ce5e809a31a592bb968e29e0b22c4093ef20b9cc152` }
+}
+-----BEGIN CERTIFICATE-----
+MIIBpjCCAQ8CAQgwDQYJKoZIhvcNAQELBQAwHzEdMBsGA1UEAwwUVGVzdCBJbnRl
+cm1lZGlhdGUgQ0EwIhgPMjAxNzAxMDEwMDAwMDBaGA8yMDE4MDEwMTAwMDAwMFow
+FDESMBAGA1UEAwwJVGVzdCBDZXJ0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
+gQCuDjd3xkr0O0wyZxf19qCQ9j43TJRv5+Qdw9UCYIRKBZudKq18zPtbdcuSXgKa
+tgoQetGXyuzuDxhoJ1/zTuwO0t7nQdJLs894DrK11uRwx7xyIUCpXbQ0kaCVgfaW
+y/PutxNEZ+NqIGc5Ek2kkTS5oUjRDF8OlPifeIALHWd/AwIDAQABMA0GCSqGSIb3
+DQEBCwUAA4GBADDTrEuUQAPo+eYFw0m60pCuKmupVj3GTNmt+R1onF+q+kXY9c67
+ypdfAFq4e2mBuCLOChB8uyGjnCmJDA0Q8EWDP4Yk6Arfc+XoWIkRV58SpCMQdleR
+2sSjKbdwiePBLA5qnKLu2HC4q81M5egJoxpZK7lo4p4LIsQJPvILnMFS
+-----END CERTIFICATE-----
\ No newline at end of file
diff --git a/net/dns/BUILD.gn b/net/dns/BUILD.gn
index 472bbf3..cbd40da 100644
--- a/net/dns/BUILD.gn
+++ b/net/dns/BUILD.gn
@@ -73,6 +73,8 @@
       "record_rdata.cc",
       "serial_worker.cc",
       "serial_worker.h",
+      "system_dns_config_change_notifier.cc",
+      "system_dns_config_change_notifier.h",
     ]
 
     if (is_fuchsia) {
@@ -386,6 +388,7 @@
     "record_parsed_unittest.cc",
     "record_rdata_unittest.cc",
     "serial_worker_unittest.cc",
+    "system_dns_config_change_notifier_unittest.cc",
   ]
 
   if (is_posix) {
@@ -420,10 +423,12 @@
   sources = [
     "dns_test_util.cc",
     "mock_host_resolver.cc",
+    "test_dns_config_service.cc",
   ]
   public = [
     "dns_test_util.h",
     "mock_host_resolver.h",
+    "test_dns_config_service.h",
   ]
 
   if (enable_mdns) {
diff --git a/net/dns/dns_config.cc b/net/dns/dns_config.cc
index 8853d5b5..71e912f 100644
--- a/net/dns/dns_config.cc
+++ b/net/dns/dns_config.cc
@@ -12,8 +12,15 @@
 
 // Default values are taken from glibc resolv.h except timeout which is set to
 // |kDnsDefaultTimeoutMs|.
-DnsConfig::DnsConfig()
-    : unhandled_options(false),
+DnsConfig::DnsConfig() : DnsConfig(std::vector<IPEndPoint>()) {}
+
+DnsConfig::DnsConfig(const DnsConfig& other) = default;
+
+DnsConfig::DnsConfig(DnsConfig&& other) = default;
+
+DnsConfig::DnsConfig(std::vector<IPEndPoint> nameservers)
+    : nameservers(std::move(nameservers)),
+      unhandled_options(false),
       append_to_multi_label_name(true),
       randomize_ports(false),
       ndots(1),
@@ -23,10 +30,6 @@
       use_local_ipv6(false),
       secure_dns_mode(SecureDnsMode::OFF) {}
 
-DnsConfig::DnsConfig(const DnsConfig& other) = default;
-
-DnsConfig::DnsConfig(DnsConfig&& other) = default;
-
 DnsConfig::~DnsConfig() = default;
 
 DnsConfig& DnsConfig::operator=(const DnsConfig& other) = default;
@@ -37,6 +40,10 @@
   return EqualsIgnoreHosts(d) && (hosts == d.hosts);
 }
 
+bool DnsConfig::operator==(const DnsConfig& d) const {
+  return Equals(d);
+}
+
 bool DnsConfig::EqualsIgnoreHosts(const DnsConfig& d) const {
   return (nameservers == d.nameservers) && (search == d.search) &&
          (unhandled_options == d.unhandled_options) &&
diff --git a/net/dns/dns_config.h b/net/dns/dns_config.h
index 3f2a85ce..a8dbf81 100644
--- a/net/dns/dns_config.h
+++ b/net/dns/dns_config.h
@@ -28,12 +28,14 @@
   DnsConfig();
   DnsConfig(const DnsConfig& other);
   DnsConfig(DnsConfig&& other);
+  explicit DnsConfig(std::vector<IPEndPoint> nameservers);
   ~DnsConfig();
 
   DnsConfig& operator=(const DnsConfig& other);
   DnsConfig& operator=(DnsConfig&& other);
 
   bool Equals(const DnsConfig& d) const;
+  bool operator==(const DnsConfig& d) const;
 
   bool EqualsIgnoreHosts(const DnsConfig& d) const;
 
diff --git a/net/dns/dns_config_service.cc b/net/dns/dns_config_service.cc
index 25060e6..2778a89 100644
--- a/net/dns/dns_config_service.cc
+++ b/net/dns/dns_config_service.cc
@@ -16,7 +16,9 @@
       have_config_(false),
       have_hosts_(false),
       need_update_(false),
-      last_sent_empty_(true) {}
+      last_sent_empty_(true) {
+  DETACH_FROM_SEQUENCE(sequence_checker_);
+}
 
 DnsConfigService::~DnsConfigService() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/net/dns/dns_config_service_unittest.cc b/net/dns/dns_config_service_unittest.cc
index 2fff6160..39c63de 100644
--- a/net/dns/dns_config_service_unittest.cc
+++ b/net/dns/dns_config_service_unittest.cc
@@ -15,6 +15,7 @@
 #include "base/test/test_timeouts.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "net/dns/public/dns_protocol.h"
+#include "net/dns/test_dns_config_service.h"
 #include "net/test/test_with_scoped_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -31,33 +32,6 @@
   }
 
  protected:
-  class TestDnsConfigService : public DnsConfigService {
-   public:
-    void ReadNow() override {}
-    bool StartWatching() override { return true; }
-
-    // Expose the protected methods to this test suite.
-    void InvalidateConfig() {
-      DnsConfigService::InvalidateConfig();
-    }
-
-    void InvalidateHosts() {
-      DnsConfigService::InvalidateHosts();
-    }
-
-    void OnConfigRead(const DnsConfig& config) {
-      DnsConfigService::OnConfigRead(config);
-    }
-
-    void OnHostsRead(const DnsHosts& hosts) {
-      DnsConfigService::OnHostsRead(hosts);
-    }
-
-    void set_watch_failed(bool value) {
-      DnsConfigService::set_watch_failed(value);
-    }
-  };
-
   void WaitForConfig(base::TimeDelta timeout) {
     base::RunLoop run_loop;
     base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
diff --git a/net/dns/system_dns_config_change_notifier.cc b/net/dns/system_dns_config_change_notifier.cc
new file mode 100644
index 0000000..f827573
--- /dev/null
+++ b/net/dns/system_dns_config_change_notifier.cc
@@ -0,0 +1,188 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/dns/system_dns_config_change_notifier.h"
+
+#include <map>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/location.h"
+#include "base/logging.h"
+#include "base/memory/weak_ptr.h"
+#include "base/sequence_checker.h"
+#include "base/sequenced_task_runner.h"
+#include "base/synchronization/lock.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
+#include "base/threading/sequenced_task_runner_handle.h"
+#include "net/dns/dns_config_service.h"
+
+namespace net {
+
+namespace {
+
+// Internal information and handling for a registered Observer. Handles
+// posting to and DCHECKing the correct sequence for the Observer.
+class WrappedObserver {
+ public:
+  explicit WrappedObserver(SystemDnsConfigChangeNotifier::Observer* observer)
+      : task_runner_(base::SequencedTaskRunnerHandle::Get()),
+        observer_(observer),
+        weak_ptr_factory_(this) {}
+
+  ~WrappedObserver() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); }
+
+  void OnNotifyThreadsafe(base::Optional<DnsConfig> config) {
+    task_runner_->PostTask(
+        FROM_HERE,
+        base::BindOnce(&WrappedObserver::OnNotify,
+                       weak_ptr_factory_.GetWeakPtr(), std::move(config)));
+  }
+
+  void OnNotify(base::Optional<DnsConfig> config) {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    DCHECK(!config || config.value().IsValid());
+
+    observer_->OnSystemDnsConfigChanged(std::move(config));
+  }
+
+ private:
+  scoped_refptr<base::SequencedTaskRunner> task_runner_;
+  SystemDnsConfigChangeNotifier::Observer* const observer_;
+
+  SEQUENCE_CHECKER(sequence_checker_);
+  base::WeakPtrFactory<WrappedObserver> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(WrappedObserver);
+};
+
+}  // namespace
+
+// Internal core to be destroyed via base::OnTaskRunnerDeleter to ensure
+// sequence safety.
+class SystemDnsConfigChangeNotifier::Core {
+ public:
+  Core(scoped_refptr<base::SequencedTaskRunner> task_runner,
+       std::unique_ptr<DnsConfigService> dns_config_service)
+      : task_runner_(std::move(task_runner)),
+        dns_config_service_(std::move(dns_config_service)),
+        weak_ptr_factory_(this) {
+    DCHECK(task_runner_);
+    DCHECK(dns_config_service_);
+
+    DETACH_FROM_SEQUENCE(sequence_checker_);
+
+    task_runner_->PostTask(
+        FROM_HERE,
+        base::BindOnce(&Core::StartWatching, weak_ptr_factory_.GetWeakPtr()));
+  }
+
+  ~Core() {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    DCHECK(wrapped_observers_.empty());
+  }
+
+  void AddObserver(Observer* observer) {
+    // Create wrapped observer outside locking in case construction requires
+    // complex side effects.
+    auto wrapped_observer = std::make_unique<WrappedObserver>(observer);
+
+    {
+      base::AutoLock lock(lock_);
+
+      if (config_) {
+        // Even though this is the same sequence as the observer, use the
+        // threadsafe OnNotify to post the notification for both lock and
+        // reentrancy safety.
+        wrapped_observer->OnNotifyThreadsafe(config_);
+      }
+
+      DCHECK_EQ(0u, wrapped_observers_.count(observer));
+      wrapped_observers_.emplace(observer, std::move(wrapped_observer));
+    }
+  }
+
+  void RemoveObserver(Observer* observer) {
+    // Destroy wrapped observer outside locking in case destruction requires
+    // complex side effects.
+    std::unique_ptr<WrappedObserver> removed_wrapped_observer;
+
+    {
+      base::AutoLock lock(lock_);
+      auto it = wrapped_observers_.find(observer);
+      DCHECK(it != wrapped_observers_.end());
+      removed_wrapped_observer = std::move(it->second);
+      wrapped_observers_.erase(it);
+    }
+  }
+
+ private:
+  void StartWatching() {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+    dns_config_service_->WatchConfig(base::BindRepeating(
+        &Core::OnConfigChanged, weak_ptr_factory_.GetWeakPtr()));
+  }
+
+  void OnConfigChanged(const DnsConfig& config) {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    base::AutoLock lock(lock_);
+
+    // |config_| is |base::nullopt| if most recent config was invalid (or no
+    // valid config has yet been read), so convert |config| to a similar form
+    // before comparing for change.
+    base::Optional<DnsConfig> new_config;
+    if (config.IsValid())
+      new_config = config;
+
+    if (config_ == new_config)
+      return;
+
+    config_ = std::move(new_config);
+
+    for (auto& wrapped_observer : wrapped_observers_) {
+      wrapped_observer.second->OnNotifyThreadsafe(config_);
+    }
+  }
+
+  // Fields that may be accessed from any sequence. Must protect access using
+  // |lock_|.
+  mutable base::Lock lock_;
+  // Only stores valid configs. |base::nullopt| if most recent config was
+  // invalid (or no valid config has yet been read).
+  base::Optional<DnsConfig> config_;
+  std::map<Observer*, std::unique_ptr<WrappedObserver>> wrapped_observers_;
+
+  // Fields valid only on |task_runner_|.
+  scoped_refptr<base::SequencedTaskRunner> task_runner_;
+  SEQUENCE_CHECKER(sequence_checker_);
+  std::unique_ptr<DnsConfigService> dns_config_service_;
+  base::WeakPtrFactory<Core> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(Core);
+};
+
+SystemDnsConfigChangeNotifier::SystemDnsConfigChangeNotifier()
+    : SystemDnsConfigChangeNotifier(
+          base::CreateSequencedTaskRunnerWithTraits({base::MayBlock()}),
+          DnsConfigService::CreateSystemService()) {}
+
+SystemDnsConfigChangeNotifier::SystemDnsConfigChangeNotifier(
+    scoped_refptr<base::SequencedTaskRunner> task_runner,
+    std::unique_ptr<DnsConfigService> dns_config_service)
+    : core_(new Core(task_runner, std::move(dns_config_service)),
+            base::OnTaskRunnerDeleter(task_runner)) {}
+
+SystemDnsConfigChangeNotifier::~SystemDnsConfigChangeNotifier() = default;
+
+void SystemDnsConfigChangeNotifier::AddObserver(Observer* observer) {
+  core_->AddObserver(observer);
+}
+
+void SystemDnsConfigChangeNotifier::RemoveObserver(Observer* observer) {
+  core_->RemoveObserver(observer);
+}
+
+}  // namespace net
diff --git a/net/dns/system_dns_config_change_notifier.h b/net/dns/system_dns_config_change_notifier.h
new file mode 100644
index 0000000..01f3d70
--- /dev/null
+++ b/net/dns/system_dns_config_change_notifier.h
@@ -0,0 +1,75 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NET_DNS_SYSTEM_DNS_CONFIG_CHANGE_NOTIFIER_H_
+#define NET_DNS_SYSTEM_DNS_CONFIG_CHANGE_NOTIFIER_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/optional.h"
+#include "base/sequenced_task_runner.h"
+#include "net/base/net_export.h"
+#include "net/dns/dns_config.h"
+
+namespace net {
+
+class DnsConfigService;
+
+// Notifier that can be subscribed to to listen for changes to system DNS
+// configuration. Expected to only be used internally to HostResolverManager and
+// NetworkChangeNotifier. Other classes are expected to subscribe to
+// NetworkChangeNotifier::AddDNSObserver() to subscribe to listen to both system
+// config changes and configuration applied on top by Chrome.
+//
+// This class is thread and sequence safe except that RemoveObserver() must be
+// called on the same sequence as the matched AddObserver() call.
+//
+// TODO(crbug.com/971411): Use this class in HostResolverManager and
+// NetworkChangeNotifier.
+class NET_EXPORT_PRIVATE SystemDnsConfigChangeNotifier {
+ public:
+  class Observer {
+   public:
+    // Called on loading new config, including the initial read once the first
+    // valid config has been read. If a config read encounters errors or an
+    // invalid config is read, will be invoked with |base::nullopt|. Only
+    // invoked when |config| changes.
+    virtual void OnSystemDnsConfigChanged(base::Optional<DnsConfig> config) = 0;
+  };
+
+  SystemDnsConfigChangeNotifier();
+  // Alternate constructor allowing specifying the underlying DnsConfigService.
+  // |dns_config_service| will only be interacted with and destroyed using
+  // |task_runner|. As required by DnsConfigService, blocking I/O may be
+  // performed on |task_runner|, so it must support blocking (i.e.
+  // base::MayBlock).
+  SystemDnsConfigChangeNotifier(
+      scoped_refptr<base::SequencedTaskRunner> task_runner,
+      std::unique_ptr<DnsConfigService> dns_config_service);
+  ~SystemDnsConfigChangeNotifier();
+
+  // An added Observer will receive notifications on the sequence where
+  // AddObserver() was called. If the config has been successfully read before
+  // calling this method, a notification will be sent for that current config
+  // before any other notifications.
+  void AddObserver(Observer* observer);
+
+  // In order to ensure notifications immediately stop on calling
+  // RemoveObserver(), must be called on the same sequence where the associated
+  // AddObserver() was called.
+  void RemoveObserver(Observer* observer);
+
+ private:
+  class Core;
+
+  std::unique_ptr<Core, base::OnTaskRunnerDeleter> core_;
+
+  DISALLOW_COPY_AND_ASSIGN(SystemDnsConfigChangeNotifier);
+};
+
+}  // namespace net
+
+#endif  // NET_DNS_SYSTEM_DNS_CONFIG_CHANGE_NOTIFIER_H_
diff --git a/net/dns/system_dns_config_change_notifier_unittest.cc b/net/dns/system_dns_config_change_notifier_unittest.cc
new file mode 100644
index 0000000..e94007a
--- /dev/null
+++ b/net/dns/system_dns_config_change_notifier_unittest.cc
@@ -0,0 +1,311 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/dns/system_dns_config_change_notifier.h"
+
+#include <utility>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/run_loop.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
+#include "net/base/ip_address.h"
+#include "net/base/ip_endpoint.h"
+#include "net/dns/dns_hosts.h"
+#include "net/dns/test_dns_config_service.h"
+#include "net/test/test_with_scoped_task_environment.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace net {
+
+namespace {
+const std::vector<IPEndPoint> kNameservers = {
+    IPEndPoint(IPAddress(1, 2, 3, 4), 95)};
+const std::vector<IPEndPoint> kNameservers2 = {
+    IPEndPoint(IPAddress(2, 3, 4, 5), 195)};
+const DnsConfig kConfig(kNameservers);
+const DnsConfig kConfig2(kNameservers2);
+}  // namespace
+
+class SystemDnsConfigChangeNotifierTest : public TestWithScopedTaskEnvironment {
+ public:
+  // Set up a change notifier, owned on a dedicated blockable task runner, with
+  // a faked underlying DnsConfigService.
+  SystemDnsConfigChangeNotifierTest()
+      : notifier_task_runner_(
+            base::CreateSequencedTaskRunnerWithTraits({base::MayBlock()})) {
+    auto test_service = std::make_unique<TestDnsConfigService>();
+    notifier_task_runner_->PostTask(
+        FROM_HERE,
+        base::BindOnce(&TestDnsConfigService::OnHostsRead,
+                       base::Unretained(test_service.get()), DnsHosts()));
+    test_config_service_ = test_service.get();
+
+    notifier_ = std::make_unique<SystemDnsConfigChangeNotifier>(
+        notifier_task_runner_, std::move(test_service));
+  }
+
+ protected:
+  // Test observer implementation that records all notifications received in a
+  // vector, and also validates that all notifications are received on the
+  // expected sequence.
+  class TestObserver : public SystemDnsConfigChangeNotifier::Observer {
+   public:
+    void OnSystemDnsConfigChanged(base::Optional<DnsConfig> config) override {
+      DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+      configs_received_.push_back(std::move(config));
+
+      DCHECK_GT(notifications_remaining_, 0);
+      if (--notifications_remaining_ == 0)
+        run_loop_->Quit();
+    }
+
+    void WaitForNotification() { WaitForNotifications(1); }
+    void WaitForNotifications(int num_notifications) {
+      DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+      notifications_remaining_ = num_notifications;
+      run_loop_->Run();
+      run_loop_ = std::make_unique<base::RunLoop>();
+    }
+
+    void ExpectNoMoreNotifications() {
+      DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+      configs_received_.clear();
+      base::RunLoop().RunUntilIdle();
+      EXPECT_TRUE(configs_received_.empty());
+    }
+
+    std::vector<base::Optional<DnsConfig>>& configs_received() {
+      return configs_received_;
+    }
+
+   private:
+    int notifications_remaining_ = 0;
+    std::unique_ptr<base::RunLoop> run_loop_ =
+        std::make_unique<base::RunLoop>();
+    std::vector<base::Optional<DnsConfig>> configs_received_;
+    SEQUENCE_CHECKER(sequence_checker_);
+  };
+
+  // Load a config and wait for it to be received by the notifier.
+  void LoadConfig(const DnsConfig& config, bool already_loaded = false) {
+    TestObserver observer;
+    notifier_->AddObserver(&observer);
+
+    // If |notifier_| already has a config loaded, |observer| will first get a
+    // notification for that initial config.
+    if (already_loaded)
+      observer.WaitForNotification();
+
+    notifier_task_runner_->PostTask(
+        FROM_HERE,
+        base::BindOnce(&TestDnsConfigService::OnConfigRead,
+                       base::Unretained(test_config_service_), config));
+    observer.WaitForNotification();
+
+    notifier_->RemoveObserver(&observer);
+  }
+
+  scoped_refptr<base::SequencedTaskRunner> notifier_task_runner_;
+  std::unique_ptr<SystemDnsConfigChangeNotifier> notifier_;
+  // Owned by |notifier_|.
+  TestDnsConfigService* test_config_service_;
+};
+
+TEST_F(SystemDnsConfigChangeNotifierTest, ReceiveNotification) {
+  TestObserver observer;
+
+  notifier_->AddObserver(&observer);
+  notifier_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&TestDnsConfigService::OnConfigRead,
+                     base::Unretained(test_config_service_), kConfig));
+  observer.WaitForNotification();
+
+  EXPECT_THAT(observer.configs_received(),
+              testing::ElementsAre(testing::Optional(kConfig)));
+  observer.ExpectNoMoreNotifications();
+
+  notifier_->RemoveObserver(&observer);
+}
+
+TEST_F(SystemDnsConfigChangeNotifierTest, ReceiveNotification_Multiple) {
+  TestObserver observer;
+
+  notifier_->AddObserver(&observer);
+  notifier_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&TestDnsConfigService::OnConfigRead,
+                     base::Unretained(test_config_service_), kConfig));
+  notifier_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&TestDnsConfigService::OnConfigRead,
+                     base::Unretained(test_config_service_), kConfig2));
+  observer.WaitForNotifications(2);
+
+  EXPECT_THAT(observer.configs_received(),
+              testing::ElementsAre(testing::Optional(kConfig),
+                                   testing::Optional(kConfig2)));
+  observer.ExpectNoMoreNotifications();
+
+  notifier_->RemoveObserver(&observer);
+}
+
+// If the notifier already has a config loaded, a new observer should receive an
+// initial notification for that config.
+TEST_F(SystemDnsConfigChangeNotifierTest, ReceiveInitialNotification) {
+  LoadConfig(kConfig);
+
+  TestObserver observer;
+  notifier_->AddObserver(&observer);
+  observer.WaitForNotification();
+
+  EXPECT_THAT(observer.configs_received(),
+              testing::ElementsAre(testing::Optional(kConfig)));
+  observer.ExpectNoMoreNotifications();
+
+  notifier_->RemoveObserver(&observer);
+}
+
+// If multiple configs have been read before adding an Observer, should notify
+// it only of the most recent.
+TEST_F(SystemDnsConfigChangeNotifierTest, ReceiveInitialNotification_Multiple) {
+  LoadConfig(kConfig);
+  LoadConfig(kConfig2, true /* already_loaded */);
+
+  TestObserver observer;
+  notifier_->AddObserver(&observer);
+  observer.WaitForNotification();
+
+  EXPECT_THAT(observer.configs_received(),
+              testing::ElementsAre(testing::Optional(kConfig2)));
+  observer.ExpectNoMoreNotifications();
+
+  notifier_->RemoveObserver(&observer);
+}
+
+TEST_F(SystemDnsConfigChangeNotifierTest, NotificationsStopAfterRemoval) {
+  TestObserver observer;
+  notifier_->AddObserver(&observer);
+  notifier_->RemoveObserver(&observer);
+
+  LoadConfig(kConfig);
+  LoadConfig(kConfig2, true /* already_loaded */);
+
+  EXPECT_TRUE(observer.configs_received().empty());
+  observer.ExpectNoMoreNotifications();
+}
+
+TEST_F(SystemDnsConfigChangeNotifierTest, UnchangedConfigs) {
+  LoadConfig(kConfig);
+
+  TestObserver observer;
+  notifier_->AddObserver(&observer);
+  observer.WaitForNotification();
+
+  // Expect no notifications from duplicate configs.
+  notifier_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&TestDnsConfigService::OnConfigRead,
+                     base::Unretained(test_config_service_), kConfig));
+  notifier_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&TestDnsConfigService::OnConfigRead,
+                     base::Unretained(test_config_service_), kConfig));
+  observer.ExpectNoMoreNotifications();
+
+  // Notification on new config.
+  notifier_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&TestDnsConfigService::OnConfigRead,
+                     base::Unretained(test_config_service_), kConfig2));
+  observer.WaitForNotification();
+  EXPECT_THAT(observer.configs_received(),
+              testing::ElementsAre(testing::Optional(kConfig2)));
+  observer.ExpectNoMoreNotifications();
+
+  notifier_->RemoveObserver(&observer);
+}
+
+TEST_F(SystemDnsConfigChangeNotifierTest, UnloadedConfig) {
+  LoadConfig(kConfig);
+
+  TestObserver observer;
+  notifier_->AddObserver(&observer);
+  // Initial config.
+  observer.WaitForNotification();
+
+  notifier_task_runner_->PostTask(
+      FROM_HERE, base::BindOnce(&TestDnsConfigService::InvalidateConfig,
+                                base::Unretained(test_config_service_)));
+  observer.WaitForNotification();
+
+  EXPECT_THAT(observer.configs_received(),
+              testing::ElementsAre(testing::Optional(kConfig), base::nullopt));
+  observer.ExpectNoMoreNotifications();
+
+  notifier_->RemoveObserver(&observer);
+}
+
+// All invalid configs are considered the same for notifications, so only expect
+// a single notification on multiple config invalidations.
+TEST_F(SystemDnsConfigChangeNotifierTest, UnloadedConfig_Multiple) {
+  LoadConfig(kConfig);
+
+  TestObserver observer;
+  notifier_->AddObserver(&observer);
+  // Initial config.
+  observer.WaitForNotification();
+
+  notifier_task_runner_->PostTask(
+      FROM_HERE, base::BindOnce(&TestDnsConfigService::InvalidateConfig,
+                                base::Unretained(test_config_service_)));
+  notifier_task_runner_->PostTask(
+      FROM_HERE, base::BindOnce(&TestDnsConfigService::InvalidateConfig,
+                                base::Unretained(test_config_service_)));
+  observer.WaitForNotification();  // Only 1 notification expected.
+
+  EXPECT_THAT(observer.configs_received(),
+              testing::ElementsAre(testing::Optional(kConfig), base::nullopt));
+  observer.ExpectNoMoreNotifications();
+
+  notifier_->RemoveObserver(&observer);
+}
+
+TEST_F(SystemDnsConfigChangeNotifierTest, InitialConfigInvalid) {
+  // Add and invalidate a config (using an extra observer to wait for
+  // invalidation to complete).
+  LoadConfig(kConfig);
+  TestObserver setup_observer;
+  notifier_->AddObserver(&setup_observer);
+  setup_observer.WaitForNotification();
+  notifier_task_runner_->PostTask(
+      FROM_HERE, base::BindOnce(&TestDnsConfigService::InvalidateConfig,
+                                base::Unretained(test_config_service_)));
+  setup_observer.WaitForNotification();
+  notifier_->RemoveObserver(&setup_observer);
+
+  TestObserver observer;
+  notifier_->AddObserver(&observer);
+
+  // No notification expected until first valid config.
+  observer.ExpectNoMoreNotifications();
+
+  // Notification on new config.
+  notifier_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&TestDnsConfigService::OnConfigRead,
+                     base::Unretained(test_config_service_), kConfig));
+  observer.WaitForNotification();
+  EXPECT_THAT(observer.configs_received(),
+              testing::ElementsAre(testing::Optional(kConfig)));
+  observer.ExpectNoMoreNotifications();
+
+  notifier_->RemoveObserver(&observer);
+}
+
+}  // namespace net
diff --git a/net/dns/test_dns_config_service.cc b/net/dns/test_dns_config_service.cc
new file mode 100644
index 0000000..1f3e3d6b
--- /dev/null
+++ b/net/dns/test_dns_config_service.cc
@@ -0,0 +1,13 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/dns/test_dns_config_service.h"
+
+namespace net {
+
+bool TestDnsConfigService::StartWatching() {
+  return true;
+}
+
+}  // namespace net
diff --git a/net/dns/test_dns_config_service.h b/net/dns/test_dns_config_service.h
new file mode 100644
index 0000000..4f4d32c
--- /dev/null
+++ b/net/dns/test_dns_config_service.h
@@ -0,0 +1,39 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/dns/dns_config_service.h"
+
+#ifndef NET_DNS_TEST_DNS_CONFIG_SERVICE_H_
+#define NET_DNS_TEST_DNS_CONFIG_SERVICE_H_
+
+namespace net {
+
+// Simple test implementation of DnsConfigService that will trigger
+// notifications only on explicitly calling On...() methods.
+class TestDnsConfigService : public DnsConfigService {
+ public:
+  void ReadNow() override {}
+  bool StartWatching() override;
+
+  // Expose the protected methods to this test suite.
+  void InvalidateConfig() { DnsConfigService::InvalidateConfig(); }
+
+  void InvalidateHosts() { DnsConfigService::InvalidateHosts(); }
+
+  void OnConfigRead(const DnsConfig& config) {
+    DnsConfigService::OnConfigRead(config);
+  }
+
+  void OnHostsRead(const DnsHosts& hosts) {
+    DnsConfigService::OnHostsRead(hosts);
+  }
+
+  void set_watch_failed(bool value) {
+    DnsConfigService::set_watch_failed(value);
+  }
+};
+
+}  // namespace net
+
+#endif  // NET_DNS_TEST_DNS_CONFIG_SERVICE_H_
diff --git a/net/http/bidirectional_stream_unittest.cc b/net/http/bidirectional_stream_unittest.cc
index 7f6387d7..7c9e1d32 100644
--- a/net/http/bidirectional_stream_unittest.cc
+++ b/net/http/bidirectional_stream_unittest.cc
@@ -1464,7 +1464,7 @@
   delegate->Start(std::move(request_info), http_session_.get());
 
   base::RunLoop().RunUntilIdle();
-  EXPECT_THAT(delegate->error(), IsError(ERR_SPDY_PROTOCOL_ERROR));
+  EXPECT_THAT(delegate->error(), IsError(ERR_HTTP2_PROTOCOL_ERROR));
   EXPECT_EQ(delegate->response_headers().end(),
             delegate->response_headers().find(":status"));
   EXPECT_EQ(0, delegate->on_data_read_count());
@@ -1494,7 +1494,7 @@
   entry = entries[index];
   int net_error = OK;
   EXPECT_TRUE(entry.params->GetInteger("net_error", &net_error));
-  EXPECT_THAT(net_error, IsError(ERR_SPDY_PROTOCOL_ERROR));
+  EXPECT_THAT(net_error, IsError(ERR_HTTP2_PROTOCOL_ERROR));
 }
 
 TEST_F(BidirectionalStreamTest, DeleteStreamDuringOnHeadersReceived) {
@@ -1704,7 +1704,7 @@
             delegate->response_headers().find(":status"));
   EXPECT_EQ(0, delegate->on_data_sent_count());
   EXPECT_EQ(0, delegate->on_data_read_count());
-  EXPECT_THAT(delegate->error(), IsError(ERR_SPDY_PROTOCOL_ERROR));
+  EXPECT_THAT(delegate->error(), IsError(ERR_HTTP2_PROTOCOL_ERROR));
 
   EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol());
   // Bytes sent excludes the RST frame.
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc
index 6bd8a6b..e83171a 100644
--- a/net/http/http_network_transaction.cc
+++ b/net/http/http_network_transaction.cc
@@ -1626,11 +1626,11 @@
       ResetConnectionAndRequestForResend();
       error = OK;
       break;
-    case ERR_SPDY_PING_FAILED:
-    case ERR_SPDY_SERVER_REFUSED_STREAM:
-    case ERR_SPDY_PUSHED_STREAM_NOT_AVAILABLE:
-    case ERR_SPDY_CLAIMED_PUSHED_STREAM_RESET_BY_SERVER:
-    case ERR_SPDY_PUSHED_RESPONSE_DOES_NOT_MATCH:
+    case ERR_HTTP2_PING_FAILED:
+    case ERR_HTTP2_SERVER_REFUSED_STREAM:
+    case ERR_HTTP2_PUSHED_STREAM_NOT_AVAILABLE:
+    case ERR_HTTP2_CLAIMED_PUSHED_STREAM_RESET_BY_SERVER:
+    case ERR_HTTP2_PUSHED_RESPONSE_DOES_NOT_MATCH:
     case ERR_QUIC_HANDSHAKE_FAILED:
       if (HasExceededMaxRetries())
         break;
diff --git a/net/http/http_network_transaction.h b/net/http/http_network_transaction.h
index 8677554..fbb7bf6 100644
--- a/net/http/http_network_transaction.h
+++ b/net/http/http_network_transaction.h
@@ -422,8 +422,8 @@
   // Network error details for this transaction.
   NetErrorDetails net_error_details_;
 
-  // Number of retries made for network errors like ERR_SPDY_PING_FAILED,
-  // ERR_SPDY_SERVER_REFUSED_STREAM, ERR_QUIC_HANDSHAKE_FAILED and
+  // Number of retries made for network errors like ERR_HTTP2_PING_FAILED,
+  // ERR_HTTP2_SERVER_REFUSED_STREAM, ERR_QUIC_HANDSHAKE_FAILED and
   // ERR_QUIC_PROTOCOL_ERROR. Currently we stop after 3 tries
   // (including the initial request) and fail the request.
   // This count excludes retries on reused sockets since a well
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc
index 510b0e8..7de86957 100644
--- a/net/http/http_network_transaction_unittest.cc
+++ b/net/http/http_network_transaction_unittest.cc
@@ -1884,7 +1884,7 @@
 }
 
 // Test that we do not retry indefinitely when a server sends an error like
-// ERR_SPDY_PING_FAILED, ERR_SPDY_SERVER_REFUSED_STREAM,
+// ERR_HTTP2_PING_FAILED, ERR_HTTP2_SERVER_REFUSED_STREAM,
 // ERR_QUIC_HANDSHAKE_FAILED or ERR_QUIC_PROTOCOL_ERROR.
 TEST_F(HttpNetworkTransactionTest, FiniteRetriesOnIOError) {
   HttpRequestInfo request;
@@ -1923,7 +1923,7 @@
   EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
 
   rv = callback.WaitForResult();
-  EXPECT_THAT(rv, IsError(ERR_SPDY_SERVER_REFUSED_STREAM));
+  EXPECT_THAT(rv, IsError(ERR_HTTP2_SERVER_REFUSED_STREAM));
 }
 
 TEST_F(HttpNetworkTransactionTest, RetryTwiceOnIOError) {
@@ -21109,4 +21109,130 @@
   }
 }
 
+// Preconnect two sockets with different NetworkIsolationKeys when
+// features::kPartitionConnectionsByNetworkIsolationKey is enabled. Then issue a
+// request and make sure the correct socket is used. Loops three times,
+// expecting to use the first preconnect, second preconnect, and neither.
+TEST_F(HttpNetworkTransactionTest, NetworkIsolationPreconnect) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(
+      features::kPartitionConnectionsByNetworkIsolationKey);
+
+  enum class TestCase {
+    kUseFirstPreconnect,
+    kUseSecondPreconnect,
+    kDontUsePreconnect,
+  };
+
+  NetworkIsolationKey preconnect1_isolation_key(
+      url::Origin::Create(GURL("http://origin1/")));
+  NetworkIsolationKey preconnect2_isolation_key(
+      url::Origin::Create(GURL("http://origin2/")));
+  NetworkIsolationKey not_preconnected_isolation_key(
+      url::Origin::Create(GURL("http://origin3/")));
+
+  // Test that only preconnects with
+  for (TestCase test_case :
+       {TestCase::kUseFirstPreconnect, TestCase::kUseSecondPreconnect,
+        TestCase::kDontUsePreconnect}) {
+    SpdySessionDependencies session_deps;
+    // Make DNS lookups completely synchronously, so preconnects complete
+    // immediately.
+    session_deps.host_resolver->set_synchronous_mode(true);
+
+    const MockWrite kMockWrites[] = {
+        MockWrite(ASYNC, 0,
+                  "GET / HTTP/1.1\r\n"
+                  "Host: www.foo.com\r\n"
+                  "Connection: keep-alive\r\n\r\n"),
+    };
+
+    const MockRead kMockReads[] = {
+        MockRead(ASYNC, 1,
+                 "HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"
+                 "hello"),
+    };
+
+    // Used for the socket that will actually be used, which may or may not be
+    // one of the preconnects
+    SequencedSocketData used_socket_data(MockConnect(SYNCHRONOUS, OK),
+                                         kMockReads, kMockWrites);
+
+    // Used for the preconnects that won't actually be used.
+    SequencedSocketData preconnect1_data(MockConnect(SYNCHRONOUS, OK),
+                                         base::span<const MockRead>(),
+                                         base::span<const MockWrite>());
+    SequencedSocketData preconnect2_data(MockConnect(SYNCHRONOUS, OK),
+                                         base::span<const MockRead>(),
+                                         base::span<const MockWrite>());
+
+    NetworkIsolationKey network_isolation_key_for_request;
+
+    switch (test_case) {
+      case TestCase::kUseFirstPreconnect:
+        session_deps.socket_factory->AddSocketDataProvider(&used_socket_data);
+        session_deps.socket_factory->AddSocketDataProvider(&preconnect2_data);
+        network_isolation_key_for_request = preconnect1_isolation_key;
+        break;
+      case TestCase::kUseSecondPreconnect:
+        session_deps.socket_factory->AddSocketDataProvider(&preconnect1_data);
+        session_deps.socket_factory->AddSocketDataProvider(&used_socket_data);
+        network_isolation_key_for_request = preconnect2_isolation_key;
+        break;
+      case TestCase::kDontUsePreconnect:
+        session_deps.socket_factory->AddSocketDataProvider(&preconnect1_data);
+        session_deps.socket_factory->AddSocketDataProvider(&preconnect2_data);
+        session_deps.socket_factory->AddSocketDataProvider(&used_socket_data);
+        network_isolation_key_for_request = not_preconnected_isolation_key;
+        break;
+    }
+
+    std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps));
+
+    // Preconnect sockets.
+    HttpRequestInfo request;
+    request.method = "GET";
+    request.url = GURL("http://www.foo.com/");
+    request.traffic_annotation =
+        net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
+
+    request.network_isolation_key = preconnect1_isolation_key;
+    session->http_stream_factory()->PreconnectStreams(1, request);
+
+    request.network_isolation_key = preconnect2_isolation_key;
+    session->http_stream_factory()->PreconnectStreams(1, request);
+
+    request.network_isolation_key = network_isolation_key_for_request;
+
+    EXPECT_EQ(2, GetIdleSocketCountInTransportSocketPool(session.get()));
+
+    // Make the request.
+    TestCompletionCallback callback;
+
+    HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get());
+
+    int rv = trans.Start(&request, callback.callback(), NetLogWithSource());
+    EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
+
+    rv = callback.WaitForResult();
+    EXPECT_THAT(rv, IsOk());
+
+    const HttpResponseInfo* response = trans.GetResponseInfo();
+    ASSERT_TRUE(response);
+    ASSERT_TRUE(response->headers);
+    EXPECT_EQ(200, response->headers->response_code());
+
+    std::string response_data;
+    rv = ReadTransaction(&trans, &response_data);
+    EXPECT_THAT(rv, IsOk());
+    EXPECT_EQ("hello", response_data);
+
+    if (test_case != TestCase::kDontUsePreconnect) {
+      EXPECT_EQ(2, GetIdleSocketCountInTransportSocketPool(session.get()));
+    } else {
+      EXPECT_EQ(3, GetIdleSocketCountInTransportSocketPool(session.get()));
+    }
+  }
+}
+
 }  // namespace net
diff --git a/net/http/http_stream_factory_job.cc b/net/http/http_stream_factory_job.cc
index 567a3271..7b32a4934 100644
--- a/net/http/http_stream_factory_job.cc
+++ b/net/http/http_stream_factory_job.cc
@@ -1154,9 +1154,9 @@
           net_log_);
 
   if (!spdy_session->HasAcceptableTransportSecurity()) {
-    spdy_session->CloseSessionOnError(ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY,
+    spdy_session->CloseSessionOnError(ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY,
                                       "");
-    return ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY;
+    return ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY;
   }
 
   url::SchemeHostPort scheme_host_port(
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json
index d8738a4..51508cef 100644
--- a/net/http/transport_security_state_static.json
+++ b/net/http/transport_security_state_static.json
@@ -6307,7 +6307,6 @@
     { "name": "samifar.in", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "samwu.tw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sanglierhurlant.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "sarakas.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sash.pw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "satrent.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "saturne.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -7392,7 +7391,6 @@
     { "name": "adderall.space", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "agwa.name", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "alanlee.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "anoncom.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "antocom.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "atletika.hu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "auto-anleitung.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -7720,7 +7718,6 @@
     { "name": "kriegt.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "krizek.cc", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kum.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "kuponrazzi.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kynastonwedding.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lacentral.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ldarby.me.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -7790,7 +7787,6 @@
     { "name": "olafnorge.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "onmarketbookbuilds.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ononpay.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "oost.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "openvz.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "optumrxhealthstore.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "orcamoney.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -8990,7 +8986,6 @@
     { "name": "gamingmedia.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "gamingreinvented.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ganhonet.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "gar-nich.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "gasbarkenora.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "gatapro.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "gateworld.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -9079,7 +9074,6 @@
     { "name": "hansen.hn", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hansvaneijsden.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hanu.la", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "haomwei.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "happyandrelaxeddogs.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "harmoney.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hartie95.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -10017,7 +10011,6 @@
     { "name": "serverpedia.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "servious.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sesha.co.za", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "setphaserstostun.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "setuid.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sevenmatches.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "shadowsocks.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -11967,7 +11960,6 @@
     { "name": "howtocuremysciatica.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hpbn.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hsts-preload-test.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "iftrue.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ime.moe", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "imitza.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "immunicity.date", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -14673,7 +14665,6 @@
     { "name": "heiland.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "glitzmirror.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hanimalis.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "hillcity.org.nz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hokieprivacy.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "gyu-raku.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hans-natur.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -15975,7 +15966,6 @@
     { "name": "bandiga.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "chxdf.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "breckle.com.ua", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "cnwage.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bmros.com.ar", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "clickclock.cc", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "christensenplace.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -16184,7 +16174,6 @@
     { "name": "f1minute.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "factbytefactbox.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ewuchuan.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "favorit.club", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "eve0s.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "defi-metiers.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "f1bigpicture.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -16262,7 +16251,6 @@
     { "name": "glasfaser-im-hanseviertel.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "greger.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "fwww7.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "gzitech.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "espanova.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "getsecure.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "grupopgn.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -17605,7 +17593,6 @@
     { "name": "cranems.com.ua", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "david-pearce.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cube-cloud.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "danwillenberg.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cornishcamels.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cubecart-demo.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cuni-cuni-club.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -18923,7 +18910,6 @@
     { "name": "shang-yu.cn", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "shiftdevices.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "snekchat.moe", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "smartwelve.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "seobot.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "smartcheck.gov", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "salmonvision.com.tw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -22197,7 +22183,6 @@
     { "name": "chat40.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "chatfacile.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "chatt-gratis.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "cherrett.digital", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "chiaseeds24.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "chorkley.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "chorkley.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -22342,7 +22327,6 @@
     { "name": "feastr.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "feedstringer.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "felixkauer.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "feng.si", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ferdies.co.za", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ffprofile.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "figura.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -26776,7 +26760,6 @@
     { "name": "wiredcut.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wireframesoftware.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wiseflat.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "withlocals.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wkennington.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wmustore.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wodboss.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -29548,7 +29531,6 @@
     { "name": "packagingproject.management", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "quaggan.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "raryosu.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "queroreceitasoberana.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "rationalcreation.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pulsedursley.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "prestigesigns.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -31110,7 +31092,6 @@
     { "name": "dengode.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "deped.blog", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dataformers.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "derrickemery.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "criadorespet.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cvl.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "decalquai.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -31715,7 +31696,6 @@
     { "name": "liehuojun.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "logymedia.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kyusyu.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "lesecuadors.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "linkmauve.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "legjobblogo.hu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ledecologie.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -33450,7 +33430,6 @@
     { "name": "bititrain.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bizpare.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bkhpilates.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "blogpentrusuflet.ro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bluemeda.web.id", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bobstronomie.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bodymusclejournal.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -34268,7 +34247,6 @@
     { "name": "antoinebetas.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "aomberg.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "appt.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "aprefix.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "araxis.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "area3.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "arethsu.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -39397,7 +39375,6 @@
     { "name": "bran.soy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brandweertrainingen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bravehearts.org.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bridgevest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brokervalues.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bsdunix.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "buy-thing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -40344,7 +40321,6 @@
     { "name": "checkspf.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cheladmin.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chemicalcrux.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "chemiphys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cherie-belle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cherylsoleway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chiboard.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -40762,7 +40738,6 @@
     { "name": "getteamninja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gfms.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gfw.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ghid-pitesti.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "giethoorn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gigime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ginza-luce.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -42445,7 +42420,6 @@
     { "name": "padberx-marketing-consultants.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "paintball-shop.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "paketo.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "paleotraining.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "panaxis.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "panaxis.li", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "panpa.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -42948,7 +42922,6 @@
     { "name": "craftsmandruggets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cretica.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "croceverdevb.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "crosslifenutrition.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crownchessclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "csi.lk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "customdissertation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -43029,7 +43002,6 @@
     { "name": "expoort.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "exporo.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fackovec.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "fai.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fansided.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "faxvorlagen-druckvorlagen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fdn.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -43532,7 +43504,6 @@
     { "name": "wafelland.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "warekit.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wasserburg.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "wdol.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "web-dl.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "webcreation.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wedotrains.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -45533,7 +45504,6 @@
     { "name": "meraseo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mes-bouquins.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "metanodo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mijnetz.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "moc.ac", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "modalrakyat.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "molokai.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -46950,7 +46920,6 @@
     { "name": "golfpark-bostalsee.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "guoke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gut8er.com.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "h404bi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hackreone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hahay.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hajekj.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -47104,7 +47073,6 @@
     { "name": "wakandasun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "walshbanks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "warofelements.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "websec.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wenchieh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wine-tapa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wisal.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -48513,7 +48481,6 @@
     { "name": "ssmca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ssready.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ssuc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "st-antonius-kuenzell.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "staticline.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stationatbuckscounty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stationatlyndhurst.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -48858,7 +48825,6 @@
     { "name": "divari.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "divorciosmurcia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dk-kromeriz.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "domainwatch.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dowellconsulting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dozecloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dpi-design.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -53622,7 +53588,6 @@
     { "name": "mchel.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mcon.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mds-paris.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mebanesteakhouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "meditel.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medmarkt24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medvedikorenka.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -54092,7 +54057,6 @@
     { "name": "gfwno.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gimme.money", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grandcapital.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "grippe-impftermin.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hagiati.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hatpakha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "healthcultureexpo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -54524,7 +54488,6 @@
     { "name": "chabik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chang-feng.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chbk.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "checkmyip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chilimathwords.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chovancova.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ciiex.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -55611,7 +55574,6 @@
     { "name": "docusearch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "doge.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "doge.town", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "doki.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dorpshuis-dwarsgracht.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dr-it.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "drump-truck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -57780,7 +57742,6 @@
     { "name": "indie.dog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "indigotreeservice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inframint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "inno.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "innotas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "insidesolutions.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inspiredrealtyinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -57920,7 +57881,6 @@
     { "name": "modern-family.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "moderncommercialrealestate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "moeclue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "monsterx.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "montanteaesthetics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "moreniche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "morgansjewelerspv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -58582,7 +58542,6 @@
     { "name": "bavartec.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "baykatre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bayportbotswana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bayportfinance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bayportghana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bayporttanzania.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bayportuganda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -58994,7 +58953,6 @@
     { "name": "geluk.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "genevachauffeur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "geocar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "geoinstinct.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "geomonkeys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gesundheitszentrum-am-reischberg.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ghettonetflix.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -59328,7 +59286,6 @@
     { "name": "mediabogen.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mediapath.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medikalakademi.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "megafilmesplay.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "megamp3.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "meia.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "meimeistartup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -59888,7 +59845,6 @@
     { "name": "timbrado.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tittelbach.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tjcuk.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tnd.net.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tobi-server.goip.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tobi-videos.goip.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "toddmath.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -60666,7 +60622,6 @@
     { "name": "desertmedaesthetics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "devswag.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dexonrest.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dexonsoftware.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dhbr.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dia.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "diccionarqui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -61680,7 +61635,6 @@
     { "name": "decor-live.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "deep-labs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "deepinnov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "degrasboom.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dein-trueffel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dejting-sidor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "deleenheir.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -61840,15 +61794,6 @@
     { "name": "gostargazing.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goufaan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "graandco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "grasboomamersfoort.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "grasboombinnendoor.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "grasboomclophaemer.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "grasboomderoos.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "grasboomleusden.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "grasboommax.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "grasboommeerbalans.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "grasboomveenendaal.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "grasboomvondellaan.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grenlandkiropraktor.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grupodatco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gtn-pravda.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -62788,7 +62733,6 @@
     { "name": "climaticarus.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cloudsec.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cognixia.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "collage.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "compitak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "conraid.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cookingperfected.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -62836,7 +62780,6 @@
     { "name": "fakeemergency.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "familienportal.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "faradrive.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "farizizhan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "farleymetals.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "farmaciacorvi.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fishlanestudios.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -62941,7 +62884,6 @@
     { "name": "movestub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "multimediapc.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "museclef.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mybakkupakku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ncarmine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ndime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nerdrockshop.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -63668,7 +63610,6 @@
     { "name": "murphycraftbeerfest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mvbug.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mycreditunion.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mypt3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nailsart.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nan.ge", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "napkins-wholesale.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -63931,8 +63872,6 @@
     { "name": "diethood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "distinctdesign2009.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "diysec.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dizzie.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dizzieforums.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dnastatic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "doc.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "doeren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -64209,7 +64148,6 @@
     { "name": "ypfr.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yunsoupian.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yuucchi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zeit.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zstgmnachod.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "intercom.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "06804.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -64556,7 +64494,6 @@
     { "name": "startablog.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "startmail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stavnager.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "stdemianabookstore.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "studiodentisticomasi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "surefleet.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "swi.sytes.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65283,7 +65220,6 @@
     { "name": "madpsy.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "madridagency.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maikoloc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "malacat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "martinbaileyphotography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mcblain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medeurope.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65380,7 +65316,6 @@
     { "name": "sexedrescue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shadowsocks.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sheaspire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "siwyd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sketch.jpn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "skorovsud.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "skylarker.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65852,7 +65787,6 @@
     { "name": "xn--anyd-7na.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--int-ru8ea.xn--6qq986b3xl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--kkcon-fwab.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "xn--l8jydta9i239uzq6aqz9a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xtremeperformance.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xtri.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ys6888.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -66644,7 +66578,6 @@
     { "name": "alexglover.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "allerstorfer.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "altco.group", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "alvin.cool", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ankaraevdenevenakliyat.name.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "antoineelizabe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aqarategypt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -66750,7 +66683,6 @@
     { "name": "empatico.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "enersolelectrical.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "entropy.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "equiac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eringmaguire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "estintori.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "etni-cidade.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -67125,10 +67057,8 @@
     { "name": "aei-asc.edu.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aero.parts", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ag88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ageragrosirdistro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agilicus.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agilicus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ahmedknowmadic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ai00.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aisin.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ajgroup-me.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -67670,7 +67600,6 @@
     { "name": "limsia.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "limsia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "linge-ma.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "linuxhub.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "linuxno.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "litebit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "littlenlargeevents.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -68006,7 +67935,6 @@
     { "name": "shopunilever.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shsh.host", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shunliandongli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sieuthigomviet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "siggi.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sik-it.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "silverblog.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -68481,7 +68409,6 @@
     { "name": "ivocopro.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ivocotec.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jeancafe.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jms8.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jmsjms.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jmsjms.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jmsjms.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -68522,7 +68449,6 @@
     { "name": "lvtrafficticketguy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lycetre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "magicroom.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "makariza.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "malenaamatomd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maniaiti.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mantachiepharmacy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -69744,7 +69670,6 @@
     { "name": "bb9721.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bb9728.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beardboys.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bernama.com.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bernbrucher.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bernbrucher.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blideobames.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -69755,7 +69680,6 @@
     { "name": "brandonlui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brandweerbarboek.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "briansemrau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "broerict.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bsaft.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "business-creators.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "c5197.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -70054,7 +69978,6 @@
     { "name": "o9728.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oasiristorantebagno.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "octavus.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "offtopic.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "okazoo.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "olmik.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "omerefe.av.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -70171,7 +70094,6 @@
     { "name": "sicurled.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sidi-smotri.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "skulblaka.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "skyparlourfilms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "solarloon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sondebase.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "spilnu.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -70425,7 +70347,6 @@
     { "name": "adrian.web.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "affairefacile.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aguarani.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "akuseorangtraveler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alamowellnessalliance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ambulari.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "apachezone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -70488,7 +70409,6 @@
     { "name": "brooklynentdoc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bsmn.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "buscasimple.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "businesscircle.com.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "caiben.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "californiawomensmedicalclinic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "campgesher.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -70521,7 +70441,6 @@
     { "name": "cristianrasch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crux.camp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "csd-slovenije.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "curatedtaste.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cureatr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cyclonebikes.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cyphar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -70683,7 +70602,6 @@
     { "name": "lorenzocompeticion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lsiq.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "luckystorevn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mac101hq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "madsstorm.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "manicuradegel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "manicuradegel.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71283,7 +71201,6 @@
     { "name": "567666365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "616f88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "618btt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "618btt.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "666365app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "666365ios.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "666365iosapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71454,7 +71371,6 @@
     { "name": "6957s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "6957ss.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "6957ss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "6957sx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "6957t.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "6957t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "6957tt.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71518,14 +71434,11 @@
     { "name": "918btty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "918bttz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "918ca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "918caa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "918cch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "918ch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "918cr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "918cx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "918dc04.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "918dc16.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "918dc20.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "918dp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "918ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "918ej.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71624,7 +71537,6 @@
     { "name": "boran.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bphostels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bruckmuehler-kanu-club.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "brunetderochebrune.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bta00.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bta55.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "btt-39.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71635,7 +71547,6 @@
     { "name": "btt2020.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "btt2121.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "btt213.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "btt217.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "btt219.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "btt225.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "btt256.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71643,7 +71554,6 @@
     { "name": "btt381g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "btt529g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "btt686.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "btt776.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "btt8.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "btt88.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "btt88818.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71651,9 +71561,7 @@
     { "name": "btt8989a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "btt907.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "btt9090.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "btt918.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "btt945g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "btt9797.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "btt9898.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "btta13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "btta15.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71907,7 +71815,6 @@
     { "name": "madwarlock.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maesinox.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "magdeburg.directory", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "maltarea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mariasbonitas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "marktguru.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "marktguru.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72046,7 +71953,6 @@
     { "name": "shibbydex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "siikaflix.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sjamaan.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sjp.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "skolnilogin.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "skolniweby.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sldlcdn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72618,7 +72524,6 @@
     { "name": "quintenbraakman.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rabotayes.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "radicalepil-haguenau.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ragtimeinrandall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "raiffeisenleasing-kosovo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rambedjeans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rayadventure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73203,7 +73108,6 @@
     { "name": "livv168.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "livv88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "locksmithsinsanantoniotx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "logatix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lombri-agro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "long788.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lonny.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73340,7 +73244,6 @@
     { "name": "visualproyectos.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vonkuenheim.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w3punkt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "w6616.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w66161.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w6619.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w6648.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73372,7 +73275,6 @@
     { "name": "010kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "010ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "143918.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "178btt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "2030411.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3040519.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "35898a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73444,7 +73346,6 @@
     { "name": "australianstrongmanalliance.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "axin888.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ayvalikgezgini.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "azzouzi.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "baeckerei-wohlgemuth.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bank-tour.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "barca-movie.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74014,13 +73915,11 @@
     { "name": "highpressuretech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "holtackersleather.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "horsky.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hospitalitylinked.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "housemates.uk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "humanit.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "humaniza.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hwxvip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hyncice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "idouying.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ilemonrain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "infosexual.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ingwaz.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74116,7 +74015,6 @@
     { "name": "msafiri.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "my-news-portal.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myhealthyday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "myinstapy.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mynewsspot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "neighborshop.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nekomio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74267,6 +74165,548 @@
     { "name": "ystream.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yuzzamatuzz.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zeckenhilfe.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0-24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0-24.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "067310.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "067313.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "067360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "067361.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "070136.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "070167.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "070183.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "077810.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "077863.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "08817a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "08817c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "08817d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "08817e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "08817f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "08817g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "08817h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "08817j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "08817k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "08817m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "08817w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "08817y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "08817z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "24onlinereview.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "35898f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "44-k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "513x.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "activefootandankle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "adeon.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aesthetikpiercing.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ahj.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aiat.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airy.host", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alkusin.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amigucrochet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amirasyraf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anarkhe.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "animehf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apuyou.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ariyaoil.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arizana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "assaabloygaragedoors.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asticon.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asyikbelanja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "augehost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aurbrowser.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "austinchase.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "avi12.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "axa.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b-tree.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "banfor.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "banguilacoquette.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "barbe-n-blues.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "basebyte.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bbcomcdn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bestcarscyprus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bestproductsaudit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bfas237blog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bhyn.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blackrose-garden.herokuapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blijfbij.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blijfbij.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blomberg.name", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bluestarroofing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bohan.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "boresmail.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bpvr.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "breezeairportparking.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buddy-acceptance-authentication-frontend.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buddy-acceptance-backoffice-frontend.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buddy-acceptance-web-frontend.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buddy-development-backoffice-webapp.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buffashe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bundito.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buttgun-tattoo.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "butz.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bvsa.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "c-3.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "calibra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cannabislegality.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "capitaoalden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carontetouristisoleminori.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cga.best", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "charlenew.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chaturbates.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ciudadanosbo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cliqz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "comparemymobile.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "confrerie-rp.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "connectium.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "copan.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cosentus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crossnet.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cultureshift.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cumnock.name", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cyberweightloss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "d3dev.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dadycandoit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dandia.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "datatruckers.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "datatruckers.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "decipe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deepblue-web.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deltav.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "diegogonzalez.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dolcesalatoweb.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "doubleglazingmasters.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "doyleshamrock.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dphipartner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dposit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dposit.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dposit.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dposit.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dposit.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dr.mg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "drakoacademy.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dranktoomuchlastnight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "drivetonortheast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dtbw.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dtbw.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dtbw.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dtmbx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dtmbx.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dtmbx.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dtmbx.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dtmbx.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dtmbx.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eclypsium.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eddy.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "educativetech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "edwardsgrounds.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "edyou.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elitebasementsohio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ender.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enter.eco", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ergonova.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "erodvd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "est-keyman.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "etaxigraz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eternalparking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eternalparking.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eternalparking.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eternalparking.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eth1.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "exeye.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f00f.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f5la.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fenixportal.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "festivaldimouamaroussiou.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fieggen.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fieggen.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "filmcrewdb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "financecontrol.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "floridawaterapparel.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fmm-creative.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "forsaleinedmonton.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fossdaily.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freelancemw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "friseur-foerder.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fsavc.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fundingrainbows.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fyroeo.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gatewayclub.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gb-repair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gesunddurchenergie.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gigs.guide", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gipelpsb.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gisauto.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "go2people-websites.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "golden-kamuy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "googlerecetas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gopostore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gourgouli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gymnastikfitness.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hackintosh.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haindlmuehle.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hanying55.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hanying9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hbgshop.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "heartfelttokens.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hiddout.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "himalaya-masala.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "homecareinterio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "homedatacenter.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hopeofmyheart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "howtutu.click", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "howtutu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "howtutu.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "howtutu.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "howtutu.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "howtutu.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "howtutu.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "howtutu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "httpstest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "httpstest.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "httpstest.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "httpswatch.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "httpswatch.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "humdingersnj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hwsw.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ibestproduct.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iccorporateinteriors.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iedcommunications.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iexpert99.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ig.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iitowns.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iloveherb.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "immedia.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inclusion.tn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "incosi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "indasun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "individualizedwellness.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inf0sec.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "infobot.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "infobot.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "infobot.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "infra-se.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "innovomuebles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ipcyb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iternalnetworks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itgm-consultants.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itisyourmoney.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j9511.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jaylineko.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jjjj003.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jobs.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jpm-inc.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "js0204.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kadro.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaitori-goods.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kanootours.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "karo.pc.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "karopc.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "karopc.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kativa.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kb3939.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kcire.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kennethandersen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "khohangmadeinvietnam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kiomara.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kirklandtriallawyer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kleinhelena.dynv6.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kmnsk.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kotonozaka.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks0816.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ks2020.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "labavn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "labibikids.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "landassessmentservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lassovideos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "law-iku.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lazerengravingpros.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "learncrypto.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "learncrypto.show", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lenovovietnam.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lesgitesdefranca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lightning-wallet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lilai6616.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "line.red", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "little-brother.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "losingweight.coach", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "louremedi.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lucasdamasceno.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lucentioluo.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lyax.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "machine.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "makermiles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "makermiles.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "makermiles.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maritimeseafoods.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "masha.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "masterton.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mawrex.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "megh.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "megh.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meow.plus", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meralda.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meralda.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meralda.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meraldamulder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meraldamulder.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meraldamulder.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meraldamulder.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meys.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mikecameronyyc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "missfuli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mladamoda.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mondzorgaanzee.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moow.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moowcraft.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moowdesign.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "murmashi.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myexams.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mylifeinsurancechoices.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myplaystation.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nanshy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "natcheflife.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "naturalbijou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "navroopsahdev.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nerofox.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netdiode.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netdiode.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netdiode.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netdiode.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nethui.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "networkdiode.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "networkdiode.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "networkdiode.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "networkdiode.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newhamyoungbloods.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newlifehempoil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newsdiff.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newsdiff.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newsdiffs.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nfltshirt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ngmx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ngmx.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ngmx.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nickserv.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nickserve.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nickserve.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nickserve.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nickserve.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "niyen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "niyen.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "niyen.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "niyen.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nycfilmcrew.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ocnjapartment.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "okasurfbali.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oliverah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "orebolt.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "orged.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ostechnix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "otoma.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oxygenit.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pactandoconlamoda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "panoramichq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "patriciaandpaul.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "patrikzk.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pcprkolo.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pentechealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phive.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "physiobiggerawaters.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "physiobroadbeach.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "picka.gift", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pinheirofrio.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pipeuro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pkdhungthinh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "plaintextpledge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "plasticstare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "plexbpvr.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pozitive.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "poznajrynek.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "premierrange.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prestigesoundandlight.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "products88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "productsblockbuster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "productsbrandleader.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "productscastle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "productsmansion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "projectionpictures.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "proteh.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "psychopersonnalite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "q8igh228tq.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "que-debo-regalar.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "queenmargaret.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quentinaurat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quichante.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quickbookssupportphonenumber.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quitsmoking.coach", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qybot.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "railto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "raketenwolke.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rbt.sx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redion.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rednumberone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reroboto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reroboto.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reroboto.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reroboto.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "resqdesk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "resumeshoppe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "retro-game.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reviveplumbingmelbourne.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "roalogic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rosalindgreenllc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rosecrance.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "royalkitchensandfurniture.co.ug", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rrbt.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rrbt.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rsec.kr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "safetynetwork.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sagenesykkel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sainikbiswas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "salesblackbelt.coach", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saluddecalidad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sam-cousins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sampleappservice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sduconnect.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sellmymobile.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "semiotical.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sender.services", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simplycateringequipment.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sindarina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sindarina.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sindarina.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slow.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slowsocial.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slowsocial.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slowsocial.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slowsocial.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "socialsecurityhelpcenters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "softwaregeek.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "soniadoras.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sony-psvita.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sparkar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sparklesdelivery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sphardy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "srsforward.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "srsfwd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "srsfwd.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "srsfwd.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "srsfwd.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "srsfwd.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "startachim.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "statusboard.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "staycurrent.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "staycurrent.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stb-timmler.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stealthmodel.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "steelpoint.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sterlingleads.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stmosesbookstore.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "streamspouredout.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sumatphoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suplments.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suplments.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suplments.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suplments.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suplments.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "swhw.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "swj.red", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "szurgot.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "technistan.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "telford.codes", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "terabyte-computing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "terminalhrd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tested.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "testmx.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "testmx.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "testmx.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tetr.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "textonly.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thailandlongtime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thaqfni.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "theapplewiki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thedinnerdetective.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thepillclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thermalflowtech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "therworth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "therworth.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "therworth.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "therworth.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thesecurityvault.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thirtysixseventy.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tinlook.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tobias-bauer.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tobias-bauer.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tobias-bauer.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tomashouzvicka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tomashouzvicka.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topcarehvac.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topproductidea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topproductsanalysis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trance.im", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trancehost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trancetronic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trilon.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "troyhuntstress.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trufflepig-forensics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trustnet.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tubepro.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tuingresoonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ubstudygroups.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ubstudygroups.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uglycat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uglycat.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uglycat.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uglycat.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unadonna.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unipart.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unityvox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "upbeatrobot.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "upbeatrobot.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "upbeatrobot.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "upbeatrobot.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "urantiabookstudygroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "urantiabookstudygroup.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "urantiabookstudygroups.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "urantiabookstudygroups.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "urantiastudygroup.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "urantiastudygroups.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "urantiastudygroups.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "urcentral.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vbestproduct.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vbestseller.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "velvetia.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "videot.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "videozv.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vmconnected.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "voodoocomedy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vreviewbestseller.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vtbs.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vthebest9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vuasinhly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w-architectes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wallpapereg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wanekat.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webcaptive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webtex.limited", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whta.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wirekeep.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wit.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "workplace.tools", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wpcdn.bid", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wsbhvac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xinqinhai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--80aihgal0apt.xn--p1ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--ikketenkpdet-1cb.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--j8se.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xwf.fyi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yh12366.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yomi.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "your28days.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yumiandryan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yunhu365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuzulia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zalaxx.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zerocash.msk.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zl2020.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     // END OF 1-YEAR BULK HSTS ENTRIES
 
     // Only eTLD+1 domains can be submitted automatically to hstspreload.org,
diff --git a/net/network_error_logging/network_error_logging_service.cc b/net/network_error_logging/network_error_logging_service.cc
index 43c699c..cf75fb6 100644
--- a/net/network_error_logging/network_error_logging_service.cc
+++ b/net/network_error_logging/network_error_logging_service.cc
@@ -109,8 +109,8 @@
      "tls.unrecognized_name_alert"},
     // tls.failed?
 
-    {ERR_SPDY_PING_FAILED, kApplicationPhase, "h2.ping_failed"},
-    {ERR_SPDY_PROTOCOL_ERROR, kConnectionPhase, "h2.protocol.error"},
+    {ERR_HTTP2_PING_FAILED, kApplicationPhase, "h2.ping_failed"},
+    {ERR_HTTP2_PROTOCOL_ERROR, kConnectionPhase, "h2.protocol.error"},
 
     {ERR_QUIC_PROTOCOL_ERROR, kConnectionPhase, "h3.protocol.error"},
 
diff --git a/net/quic/quic_chromium_client_session.cc b/net/quic/quic_chromium_client_session.cc
index fee046c6..a4a7b34c 100644
--- a/net/quic/quic_chromium_client_session.cc
+++ b/net/quic/quic_chromium_client_session.cc
@@ -1591,9 +1591,11 @@
     const quic::QuicConnectionCloseFrame& frame,
     quic::ConnectionCloseSource source) {
   DCHECK(!connection()->connected());
+
+  logger_->OnConnectionClosed(frame, source);
+
   const quic::QuicErrorCode error = frame.quic_error_code;
   const std::string& error_details = frame.error_details;
-  logger_->OnConnectionClosed(error, error_details, source);
 
   RecordConnectionCloseErrorCode(error, source, session_key_.host(),
                                  IsCryptoHandshakeConfirmed());
diff --git a/net/quic/quic_connection_logger.cc b/net/quic/quic_connection_logger.cc
index 0e6cf422..cc23b8f 100644
--- a/net/quic/quic_connection_logger.cc
+++ b/net/quic/quic_connection_logger.cc
@@ -768,6 +768,16 @@
           "Net.QuicSession.ConnectionTypeFromPeer",
           GetRealAddressFamily(local_address_from_shlo_.address()),
           ADDRESS_FAMILY_LAST);
+
+      int sample = GetAddressMismatch(local_address_from_shlo_,
+                                      local_address_from_self_);
+      // We are seemingly talking to an older server that does not support the
+      // feature, so we can't report the results in the histogram.
+      if (sample >= 0) {
+        UMA_HISTOGRAM_ENUMERATION("Net.QuicSession.SelfShloAddressMismatch",
+                                  static_cast<QuicAddressMismatch>(sample),
+                                  QUIC_ADDRESS_MISMATCH_MAX);
+      }
     }
   }
   if (!net_log_is_capturing_)
@@ -787,14 +797,14 @@
 }
 
 void QuicConnectionLogger::OnConnectionClosed(
-    quic::QuicErrorCode error,
-    const string& error_details,
+    const quic::QuicConnectionCloseFrame& frame,
     quic::ConnectionCloseSource source) {
   if (!net_log_is_capturing_)
     return;
-  net_log_.AddEvent(NetLogEventType::QUIC_SESSION_CLOSED,
-                    base::Bind(&NetLogQuicOnConnectionClosedCallback, error,
-                               error_details, source));
+  net_log_.AddEvent(
+      NetLogEventType::QUIC_SESSION_CLOSED,
+      base::Bind(&NetLogQuicOnConnectionClosedCallback, frame.quic_error_code,
+                 frame.error_details, source));
 }
 
 void QuicConnectionLogger::OnSuccessfulVersionNegotiation(
diff --git a/net/quic/quic_connection_logger.h b/net/quic/quic_connection_logger.h
index ac18e3b..edc4823 100644
--- a/net/quic/quic_connection_logger.h
+++ b/net/quic/quic_connection_logger.h
@@ -82,8 +82,7 @@
   void OnPublicResetPacket(const quic::QuicPublicResetPacket& packet) override;
   void OnVersionNegotiationPacket(
       const quic::QuicVersionNegotiationPacket& packet) override;
-  void OnConnectionClosed(quic::QuicErrorCode error,
-                          const std::string& error_details,
+  void OnConnectionClosed(const quic::QuicConnectionCloseFrame& frame,
                           quic::ConnectionCloseSource source) override;
   void OnSuccessfulVersionNegotiation(
       const quic::ParsedQuicVersion& version) override;
diff --git a/net/quic/quic_flags_list.h b/net/quic/quic_flags_list.h
index 5512dd6..09d6475 100644
--- a/net/quic/quic_flags_list.h
+++ b/net/quic/quic_flags_list.h
@@ -205,10 +205,6 @@
 // If true, disable QUIC version 39.
 QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_disable_version_39, false)
 
-// In QUIC, do not close connection if received an in-order ACK with decreased
-// largest_acked.
-QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_tolerate_reneging, true)
-
 // If true and using Leto for QUIC shared-key calculations, GFE will react to a
 // failure to contact Leto by sending a REJ containing a fallback ServerConfig,
 // allowing the client to continue the handshake.
@@ -223,11 +219,6 @@
           FLAGS_quic_restart_flag_dont_fetch_quic_private_keys_from_leto,
           false)
 
-// If true, terminate Google QUIC connections similary as IETF QUIC.
-QUIC_FLAG(bool,
-          FLAGS_quic_reloadable_flag_quic_terminate_gquic_connection_as_ietf,
-          true)
-
 // In v44 and above, where STOP_WAITING is never sent, close the connection if
 // it's received.
 QUIC_FLAG(bool,
@@ -275,7 +266,7 @@
           false)
 
 // If true, disable QUIC version 44.
-QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_disable_version_44, false)
+QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_disable_version_44, true)
 
 // If true, ignore TLPR if there is no pending stream data.
 QUIC_FLAG(bool,
@@ -283,7 +274,7 @@
           true)
 // If true, when detecting losses, use packets_acked of corresponding packet
 // number space.
-QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_fix_packets_acked, false)
+QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_fix_packets_acked, true)
 
 // QUIC version 99 will use this stream ID for the headers stream.
 QUIC_FLAG(int64_t, FLAGS_quic_headers_stream_id_in_v99, 0)
diff --git a/net/spdy/bidirectional_stream_spdy_impl_unittest.cc b/net/spdy/bidirectional_stream_spdy_impl_unittest.cc
index 1a31466..5373ba3 100644
--- a/net/spdy/bidirectional_stream_spdy_impl_unittest.cc
+++ b/net/spdy/bidirectional_stream_spdy_impl_unittest.cc
@@ -432,7 +432,7 @@
   delegate->SendData(buf.get(), buf->size(), false);
   base::RunLoop().RunUntilIdle();
 
-  EXPECT_THAT(delegate->error(), IsError(ERR_SPDY_PROTOCOL_ERROR));
+  EXPECT_THAT(delegate->error(), IsError(ERR_HTTP2_PROTOCOL_ERROR));
   EXPECT_EQ(0, delegate->on_data_read_count());
   EXPECT_EQ(0, delegate->on_data_sent_count());
   EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol());
diff --git a/net/spdy/spdy_http_stream.cc b/net/spdy/spdy_http_stream.cc
index 3a8865e..e451588 100644
--- a/net/spdy/spdy_http_stream.cc
+++ b/net/spdy/spdy_http_stream.cc
@@ -399,7 +399,7 @@
                              response_headers, *response_info_)) {
     // Cancel will call OnClose, which might call callbacks and might destroy
     // |this|.
-    stream_->Cancel(ERR_SPDY_PUSHED_RESPONSE_DOES_NOT_MATCH);
+    stream_->Cancel(ERR_HTTP2_PUSHED_RESPONSE_DOES_NOT_MATCH);
 
     return;
   }
diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc
index 444861f..cfd450f2 100644
--- a/net/spdy/spdy_network_transaction_unittest.cc
+++ b/net/spdy/spdy_network_transaction_unittest.cc
@@ -2117,7 +2117,7 @@
   NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
   helper.RunToCompletion(&data);
   TransactionHelperResult out = helper.output();
-  EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR));
+  EXPECT_THAT(out.rv, IsError(ERR_HTTP2_PROTOCOL_ERROR));
 }
 
 // Test that the transaction doesn't crash when we get two replies on the same
@@ -2161,7 +2161,7 @@
   EXPECT_TRUE(response->was_fetched_via_spdy);
   std::string response_data;
   rv = ReadTransaction(trans, &response_data);
-  EXPECT_THAT(rv, IsError(ERR_SPDY_PROTOCOL_ERROR));
+  EXPECT_THAT(rv, IsError(ERR_HTTP2_PROTOCOL_ERROR));
 
   helper.VerifyDataConsumed();
 }
@@ -2191,7 +2191,7 @@
   NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
   helper.RunToCompletion(&data);
   TransactionHelperResult out = helper.output();
-  EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR));
+  EXPECT_THAT(out.rv, IsError(ERR_HTTP2_PROTOCOL_ERROR));
 
   helper.session()->spdy_session_pool()->CloseAllSessions();
   helper.VerifyDataConsumed();
@@ -4540,7 +4540,7 @@
                                        nullptr);
     helper.RunToCompletion(&data);
     TransactionHelperResult out = helper.output();
-    EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR));
+    EXPECT_THAT(out.rv, IsError(ERR_HTTP2_PROTOCOL_ERROR));
   }
 }
 
@@ -4568,7 +4568,7 @@
   NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
   helper.RunToCompletion(&data);
   TransactionHelperResult out = helper.output();
-  EXPECT_THAT(out.rv, IsError(ERR_SPDY_COMPRESSION_ERROR));
+  EXPECT_THAT(out.rv, IsError(ERR_HTTP2_COMPRESSION_ERROR));
 }
 
 TEST_F(SpdyNetworkTransactionTest, GoAwayOnDecompressionFailure) {
@@ -4589,7 +4589,7 @@
   NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
   helper.RunToCompletion(&data);
   TransactionHelperResult out = helper.output();
-  EXPECT_THAT(out.rv, IsError(ERR_SPDY_COMPRESSION_ERROR));
+  EXPECT_THAT(out.rv, IsError(ERR_HTTP2_COMPRESSION_ERROR));
 }
 
 TEST_F(SpdyNetworkTransactionTest, GoAwayOnFrameSizeError) {
@@ -4610,7 +4610,7 @@
   NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
   helper.RunToCompletion(&data);
   TransactionHelperResult out = helper.output();
-  EXPECT_THAT(out.rv, IsError(ERR_SPDY_FRAME_SIZE_ERROR));
+  EXPECT_THAT(out.rv, IsError(ERR_HTTP2_FRAME_SIZE_ERROR));
 }
 
 // Test that we shutdown correctly on write errors.
@@ -6106,11 +6106,11 @@
   NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
   helper.RunToCompletion(&data);
   TransactionHelperResult out = helper.output();
-  EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR));
+  EXPECT_THAT(out.rv, IsError(ERR_HTTP2_PROTOCOL_ERROR));
 }
 
 // Tests that receiving HEADERS, DATA, HEADERS, and DATA in that sequence will
-// trigger a ERR_SPDY_PROTOCOL_ERROR because trailing HEADERS must not be
+// trigger a ERR_HTTP2_PROTOCOL_ERROR because trailing HEADERS must not be
 // followed by any DATA frames.
 TEST_F(SpdyNetworkTransactionTest, SyncReplyDataAfterTrailers) {
   spdy::SpdySerializedFrame req(
@@ -6143,7 +6143,7 @@
   NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
   helper.RunToCompletion(&data);
   TransactionHelperResult out = helper.output();
-  EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR));
+  EXPECT_THAT(out.rv, IsError(ERR_HTTP2_PROTOCOL_ERROR));
 }
 
 struct PushUrlTestParams {
@@ -7040,7 +7040,7 @@
 
   base::RunLoop().RunUntilIdle();
   ASSERT_TRUE(callback.have_result());
-  EXPECT_THAT(callback.WaitForResult(), IsError(ERR_SPDY_FLOW_CONTROL_ERROR));
+  EXPECT_THAT(callback.WaitForResult(), IsError(ERR_HTTP2_FLOW_CONTROL_ERROR));
   helper.VerifyDataConsumed();
 }
 
@@ -7074,7 +7074,7 @@
   NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
   helper.RunToCompletion(&data);
   TransactionHelperResult out = helper.output();
-  EXPECT_THAT(out.rv, IsError(ERR_SPDY_FLOW_CONTROL_ERROR));
+  EXPECT_THAT(out.rv, IsError(ERR_HTTP2_FLOW_CONTROL_ERROR));
 }
 
 // Test that after hitting a send window size of 0, the write process
@@ -7585,7 +7585,7 @@
   NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
   helper.RunToCompletion(&data);
   TransactionHelperResult out = helper.output();
-  EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR));
+  EXPECT_THAT(out.rv, IsError(ERR_HTTP2_PROTOCOL_ERROR));
 
   histogram_tester.ExpectBucketCount(
       "Net.SpdyPushedStreamFate",
@@ -7624,7 +7624,7 @@
   NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
   helper.RunToCompletion(&data);
   TransactionHelperResult out = helper.output();
-  EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR));
+  EXPECT_THAT(out.rv, IsError(ERR_HTTP2_PROTOCOL_ERROR));
 
   histogram_tester.ExpectBucketCount(
       "Net.SpdyPushedStreamFate",
@@ -7723,7 +7723,7 @@
   helper.RunToCompletion(&data);
   TransactionHelperResult out = helper.output();
 
-  EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR));
+  EXPECT_THAT(out.rv, IsError(ERR_HTTP2_PROTOCOL_ERROR));
 }
 
 // Regression test for https://crbug.com/603182.
@@ -7742,7 +7742,7 @@
   NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr);
   helper.RunToCompletion(&data);
   TransactionHelperResult out = helper.output();
-  EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR));
+  EXPECT_THAT(out.rv, IsError(ERR_HTTP2_PROTOCOL_ERROR));
 }
 
 // Regression test for https://crbug.com/603182.
@@ -7801,7 +7801,7 @@
 // has not been sent and received."  (RFC7540 Section 8.1)
 // Regression test for https://crbug.com/606990.  Server responds before POST
 // data are sent and closes connection: this must result in
-// ERR_CONNECTION_CLOSED (as opposed to ERR_SPDY_PROTOCOL_ERROR).
+// ERR_CONNECTION_CLOSED (as opposed to ERR_HTTP2_PROTOCOL_ERROR).
 TEST_F(SpdyNetworkTransactionTest, ResponseBeforePostDataSent) {
   spdy::SpdySerializedFrame req(
       spdy_util_.ConstructChunkedSpdyPost(nullptr, 0));
@@ -7910,7 +7910,7 @@
                                        nullptr);
     helper.RunToCompletionWithSSLData(&data, std::move(ssl_provider));
     TransactionHelperResult out = helper.output();
-    EXPECT_THAT(out.rv, IsError(ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY));
+    EXPECT_THAT(out.rv, IsError(ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY));
   }
 };
 
@@ -7956,7 +7956,7 @@
 
   helper.RunToCompletionWithSSLData(&data, std::move(ssl_provider));
   TransactionHelperResult out = helper.output();
-  EXPECT_THAT(out.rv, IsError(ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY));
+  EXPECT_THAT(out.rv, IsError(ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY));
 }
 
 TEST_F(SpdyNetworkTransactionTest, RequestHeadersCallback) {
diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc
index e04bb62..db133a9 100644
--- a/net/spdy/spdy_session.cc
+++ b/net/spdy/spdy_session.cc
@@ -553,42 +553,42 @@
     case http2::Http2DecoderAdapter::SPDY_NO_ERROR:
       return OK;
     case http2::Http2DecoderAdapter::SPDY_INVALID_CONTROL_FRAME:
-      return ERR_SPDY_PROTOCOL_ERROR;
+      return ERR_HTTP2_PROTOCOL_ERROR;
     case http2::Http2DecoderAdapter::SPDY_CONTROL_PAYLOAD_TOO_LARGE:
-      return ERR_SPDY_FRAME_SIZE_ERROR;
+      return ERR_HTTP2_FRAME_SIZE_ERROR;
     case http2::Http2DecoderAdapter::SPDY_ZLIB_INIT_FAILURE:
-      return ERR_SPDY_COMPRESSION_ERROR;
+      return ERR_HTTP2_COMPRESSION_ERROR;
     case http2::Http2DecoderAdapter::SPDY_UNSUPPORTED_VERSION:
-      return ERR_SPDY_PROTOCOL_ERROR;
+      return ERR_HTTP2_PROTOCOL_ERROR;
     case http2::Http2DecoderAdapter::SPDY_DECOMPRESS_FAILURE:
-      return ERR_SPDY_COMPRESSION_ERROR;
+      return ERR_HTTP2_COMPRESSION_ERROR;
     case http2::Http2DecoderAdapter::SPDY_COMPRESS_FAILURE:
-      return ERR_SPDY_COMPRESSION_ERROR;
+      return ERR_HTTP2_COMPRESSION_ERROR;
     case http2::Http2DecoderAdapter::SPDY_GOAWAY_FRAME_CORRUPT:
-      return ERR_SPDY_PROTOCOL_ERROR;
+      return ERR_HTTP2_PROTOCOL_ERROR;
     case http2::Http2DecoderAdapter::SPDY_RST_STREAM_FRAME_CORRUPT:
-      return ERR_SPDY_PROTOCOL_ERROR;
+      return ERR_HTTP2_PROTOCOL_ERROR;
     case http2::Http2DecoderAdapter::SPDY_INVALID_PADDING:
-      return ERR_SPDY_PROTOCOL_ERROR;
+      return ERR_HTTP2_PROTOCOL_ERROR;
     case http2::Http2DecoderAdapter::SPDY_INVALID_DATA_FRAME_FLAGS:
-      return ERR_SPDY_PROTOCOL_ERROR;
+      return ERR_HTTP2_PROTOCOL_ERROR;
     case http2::Http2DecoderAdapter::SPDY_INVALID_CONTROL_FRAME_FLAGS:
-      return ERR_SPDY_PROTOCOL_ERROR;
+      return ERR_HTTP2_PROTOCOL_ERROR;
     case http2::Http2DecoderAdapter::SPDY_UNEXPECTED_FRAME:
-      return ERR_SPDY_PROTOCOL_ERROR;
+      return ERR_HTTP2_PROTOCOL_ERROR;
     case http2::Http2DecoderAdapter::SPDY_INTERNAL_FRAMER_ERROR:
-      return ERR_SPDY_PROTOCOL_ERROR;
+      return ERR_HTTP2_PROTOCOL_ERROR;
     case http2::Http2DecoderAdapter::SPDY_INVALID_CONTROL_FRAME_SIZE:
-      return ERR_SPDY_FRAME_SIZE_ERROR;
+      return ERR_HTTP2_FRAME_SIZE_ERROR;
     case http2::Http2DecoderAdapter::SPDY_INVALID_STREAM_ID:
-      return ERR_SPDY_PROTOCOL_ERROR;
+      return ERR_HTTP2_PROTOCOL_ERROR;
     case http2::Http2DecoderAdapter::SPDY_OVERSIZED_PAYLOAD:
-      return ERR_SPDY_FRAME_SIZE_ERROR;
+      return ERR_HTTP2_FRAME_SIZE_ERROR;
     case http2::Http2DecoderAdapter::LAST_ERROR:
       NOTREACHED();
   }
   NOTREACHED();
-  return ERR_SPDY_PROTOCOL_ERROR;
+  return ERR_HTTP2_PROTOCOL_ERROR;
 }
 
 SpdyProtocolErrorDetails MapRstStreamStatusToProtocolError(
@@ -631,15 +631,15 @@
   switch (err) {
     case OK:
       return spdy::ERROR_CODE_NO_ERROR;
-    case ERR_SPDY_PROTOCOL_ERROR:
+    case ERR_HTTP2_PROTOCOL_ERROR:
       return spdy::ERROR_CODE_PROTOCOL_ERROR;
-    case ERR_SPDY_FLOW_CONTROL_ERROR:
+    case ERR_HTTP2_FLOW_CONTROL_ERROR:
       return spdy::ERROR_CODE_FLOW_CONTROL_ERROR;
-    case ERR_SPDY_FRAME_SIZE_ERROR:
+    case ERR_HTTP2_FRAME_SIZE_ERROR:
       return spdy::ERROR_CODE_FRAME_SIZE_ERROR;
-    case ERR_SPDY_COMPRESSION_ERROR:
+    case ERR_HTTP2_COMPRESSION_ERROR:
       return spdy::ERROR_CODE_COMPRESSION_ERROR;
-    case ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY:
+    case ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY:
       return spdy::ERROR_CODE_INADEQUATE_SECURITY;
     default:
       return spdy::ERROR_CODE_PROTOCOL_ERROR;
@@ -1008,7 +1008,7 @@
   if (active_it == active_streams_.end()) {
     // A previously claimed pushed stream might not be available, for example,
     // if the server has reset it in the meanwhile.
-    return ERR_SPDY_PUSHED_STREAM_NOT_AVAILABLE;
+    return ERR_HTTP2_PUSHED_STREAM_NOT_AVAILABLE;
   }
 
   net_log_.AddEvent(
@@ -1862,7 +1862,7 @@
     LOG(WARNING) << description;
     RecordSpdyPushedStreamFateHistogram(
         SpdyPushedStreamFate::kPromisedStreamIdParityError);
-    CloseSessionOnError(ERR_SPDY_PROTOCOL_ERROR, description);
+    CloseSessionOnError(ERR_HTTP2_PROTOCOL_ERROR, description);
     return;
   }
 
@@ -1873,7 +1873,7 @@
     LOG(WARNING) << description;
     RecordSpdyPushedStreamFateHistogram(
         SpdyPushedStreamFate::kAssociatedStreamIdParityError);
-    CloseSessionOnError(ERR_SPDY_PROTOCOL_ERROR, description);
+    CloseSessionOnError(ERR_HTTP2_PROTOCOL_ERROR, description);
     return;
   }
 
@@ -1884,7 +1884,7 @@
     LOG(WARNING) << description;
     RecordSpdyPushedStreamFateHistogram(
         SpdyPushedStreamFate::kStreamIdOutOfOrder);
-    CloseSessionOnError(ERR_SPDY_PROTOCOL_ERROR, description);
+    CloseSessionOnError(ERR_HTTP2_PROTOCOL_ERROR, description);
     return;
   }
 
@@ -2110,14 +2110,14 @@
   if (error == ERR_FAILED) {
     error_code = spdy::ERROR_CODE_INTERNAL_ERROR;
   } else if (error == ERR_ABORTED ||
-             error == ERR_SPDY_PUSHED_RESPONSE_DOES_NOT_MATCH) {
+             error == ERR_HTTP2_PUSHED_RESPONSE_DOES_NOT_MATCH) {
     error_code = spdy::ERROR_CODE_CANCEL;
-  } else if (error == ERR_SPDY_FLOW_CONTROL_ERROR) {
+  } else if (error == ERR_HTTP2_FLOW_CONTROL_ERROR) {
     error_code = spdy::ERROR_CODE_FLOW_CONTROL_ERROR;
   } else if (error == ERR_TIMED_OUT ||
-             error == ERR_SPDY_CLIENT_REFUSED_STREAM) {
+             error == ERR_HTTP2_CLIENT_REFUSED_STREAM) {
     error_code = spdy::ERROR_CODE_REFUSED_STREAM;
-  } else if (error == ERR_SPDY_STREAM_CLOSED) {
+  } else if (error == ERR_HTTP2_STREAM_CLOSED) {
     error_code = spdy::ERROR_CODE_STREAM_CLOSED;
   }
   spdy::SpdyStreamId stream_id = it->first;
@@ -2584,7 +2584,7 @@
     case spdy::SETTINGS_ENABLE_CONNECT_PROTOCOL:
       if ((value != 0 && value != 1) || (support_websocket_ && value == 0)) {
         DoDrainSession(
-            ERR_SPDY_PROTOCOL_ERROR,
+            ERR_HTTP2_PROTOCOL_ERROR,
             "Invalid value for spdy::SETTINGS_ENABLE_CONNECT_PROTOCOL.");
         return;
       }
@@ -2599,7 +2599,7 @@
   for (const auto& value : active_streams_) {
     if (!value.second->AdjustSendWindowSize(delta_window_size)) {
       DoDrainSession(
-          ERR_SPDY_FLOW_CONTROL_ERROR,
+          ERR_HTTP2_FLOW_CONTROL_ERROR,
           base::StringPrintf(
               "New spdy::SETTINGS_INITIAL_WINDOW_SIZE value overflows "
               "flow control window of stream %d.",
@@ -2611,7 +2611,7 @@
   for (auto* const stream : created_streams_) {
     if (!stream->AdjustSendWindowSize(delta_window_size)) {
       DoDrainSession(
-          ERR_SPDY_FLOW_CONTROL_ERROR,
+          ERR_HTTP2_FLOW_CONTROL_ERROR,
           base::StringPrintf(
               "New spdy::SETTINGS_INITIAL_WINDOW_SIZE value overflows "
               "flow control window of stream %d.",
@@ -2702,7 +2702,7 @@
   if (now > last_read_time_ + hung_interval_ ||
       last_read_time_ < last_check_time) {
     check_ping_status_pending_ = false;
-    DoDrainSession(ERR_SPDY_PING_FAILED, "Failed ping.");
+    DoDrainSession(ERR_HTTP2_PING_FAILED, "Failed ping.");
     return;
   }
 
@@ -2999,7 +2999,7 @@
     return;
   }
 
-  ResetStreamIterator(it, ERR_SPDY_PROTOCOL_ERROR, description);
+  ResetStreamIterator(it, ERR_HTTP2_PROTOCOL_ERROR, description);
 }
 
 void SpdySession::OnPing(spdy::SpdyPingId unique_id, bool is_ack) {
@@ -3017,7 +3017,7 @@
 
   if (!ping_in_flight_) {
     RecordProtocolErrorHistogram(PROTOCOL_ERROR_UNEXPECTED_PING);
-    DoDrainSession(ERR_SPDY_PROTOCOL_ERROR, "Unexpected PING ACK.");
+    DoDrainSession(ERR_HTTP2_PROTOCOL_ERROR, "Unexpected PING ACK.");
     return;
   }
 
@@ -3052,11 +3052,11 @@
 
   if (it->second->ShouldRetryRSTPushStream()) {
     CloseActiveStreamIterator(it,
-                              ERR_SPDY_CLAIMED_PUSHED_STREAM_RESET_BY_SERVER);
+                              ERR_HTTP2_CLAIMED_PUSHED_STREAM_RESET_BY_SERVER);
   } else if (error_code == spdy::ERROR_CODE_NO_ERROR) {
-    CloseActiveStreamIterator(it, ERR_SPDY_RST_STREAM_NO_ERROR_RECEIVED);
+    CloseActiveStreamIterator(it, ERR_HTTP2_RST_STREAM_NO_ERROR_RECEIVED);
   } else if (error_code == spdy::ERROR_CODE_REFUSED_STREAM) {
-    CloseActiveStreamIterator(it, ERR_SPDY_SERVER_REFUSED_STREAM);
+    CloseActiveStreamIterator(it, ERR_HTTP2_SERVER_REFUSED_STREAM);
   } else if (error_code == spdy::ERROR_CODE_HTTP_1_1_REQUIRED) {
     // TODO(bnc): Record histogram with number of open streams capped at 50.
     if (net_log().IsCapturing()) {
@@ -3069,12 +3069,12 @@
     RecordProtocolErrorHistogram(
         PROTOCOL_ERROR_RST_STREAM_FOR_NON_ACTIVE_STREAM);
     if (net_log().IsCapturing()) {
-      it->second->LogStreamError(ERR_SPDY_PROTOCOL_ERROR,
+      it->second->LogStreamError(ERR_HTTP2_PROTOCOL_ERROR,
                                  "Server reset stream.");
     }
     // TODO(mbelshe): Map from Spdy-protocol errors to something sensical.
     //                For now, it doesn't matter much - it is a protocol error.
-    CloseActiveStreamIterator(it, ERR_SPDY_PROTOCOL_ERROR);
+    CloseActiveStreamIterator(it, ERR_HTTP2_PROTOCOL_ERROR);
   }
 }
 
@@ -3096,7 +3096,7 @@
     // TODO(bnc): Record histogram with number of open streams capped at 50.
     DoDrainSession(ERR_HTTP_1_1_REQUIRED, "HTTP_1_1_REQUIRED for stream.");
   } else if (error_code == spdy::ERROR_CODE_NO_ERROR) {
-    StartGoingAway(last_accepted_stream_id, ERR_SPDY_SERVER_REFUSED_STREAM);
+    StartGoingAway(last_accepted_stream_id, ERR_HTTP2_SERVER_REFUSED_STREAM);
   } else {
     StartGoingAway(last_accepted_stream_id, ERR_ABORTED);
   }
@@ -3247,7 +3247,7 @@
     if (delta_window_size < 1) {
       RecordProtocolErrorHistogram(PROTOCOL_ERROR_INVALID_WINDOW_UPDATE_SIZE);
       DoDrainSession(
-          ERR_SPDY_PROTOCOL_ERROR,
+          ERR_HTTP2_PROTOCOL_ERROR,
           "Received WINDOW_UPDATE with an invalid delta_window_size " +
               base::NumberToString(delta_window_size));
       return;
@@ -3269,7 +3269,7 @@
 
     if (delta_window_size < 1) {
       ResetStreamIterator(
-          it, ERR_SPDY_FLOW_CONTROL_ERROR,
+          it, ERR_HTTP2_FLOW_CONTROL_ERROR,
           "Received WINDOW_UPDATE with an invalid delta_window_size.");
       return;
     }
@@ -3331,7 +3331,7 @@
         num_active_pushed_streams_ >= max_concurrent_pushed_streams_) {
       RecordSpdyPushedStreamFateHistogram(
           SpdyPushedStreamFate::kTooManyPushedStreams);
-      ResetStream(stream_id, ERR_SPDY_CLIENT_REFUSED_STREAM,
+      ResetStream(stream_id, ERR_HTTP2_CLIENT_REFUSED_STREAM,
                   "Stream concurrency limit reached.");
       return;
     }
@@ -3486,7 +3486,7 @@
   if (delta_window_size > max_delta_window_size) {
     RecordProtocolErrorHistogram(PROTOCOL_ERROR_INVALID_WINDOW_UPDATE_SIZE);
     DoDrainSession(
-        ERR_SPDY_PROTOCOL_ERROR,
+        ERR_HTTP2_PROTOCOL_ERROR,
         "Received WINDOW_UPDATE [delta: " +
             base::NumberToString(delta_window_size) +
             "] for session overflows session_send_window_size_ [current: " +
@@ -3566,7 +3566,7 @@
       session_recv_window_size_ - session_unacked_recv_window_bytes_) {
     RecordProtocolErrorHistogram(PROTOCOL_ERROR_RECEIVE_WINDOW_VIOLATION);
     DoDrainSession(
-        ERR_SPDY_FLOW_CONTROL_ERROR,
+        ERR_HTTP2_FLOW_CONTROL_ERROR,
         "delta_window_size is " + base::NumberToString(delta_window_size) +
             " in DecreaseRecvWindowSize, which is larger than the receive " +
             "window size of " +
diff --git a/net/spdy/spdy_session.h b/net/spdy/spdy_session.h
index 4a1a740..f936200 100644
--- a/net/spdy/spdy_session.h
+++ b/net/spdy/spdy_session.h
@@ -346,7 +346,7 @@
   // |pushed_stream_id| must not be kNoPushedStreamFound.
   //
   // Returns ERR_CONNECTION_CLOSED if the connection is being closed.
-  // Returns ERR_SPDY_PUSHED_STREAM_NOT_AVAILABLE if the pushed stream is not
+  // Returns ERR_HTTP2_PUSHED_STREAM_NOT_AVAILABLE if the pushed stream is not
   //   available any longer, for example, if the server has reset it.
   // Returns OK if the stream is still available, and returns the stream in
   //   |*spdy_stream|.  If the stream is still open, updates its priority to
diff --git a/net/spdy/spdy_session_pool_unittest.cc b/net/spdy/spdy_session_pool_unittest.cc
index a2808fb..f70ce3d 100644
--- a/net/spdy/spdy_session_pool_unittest.cc
+++ b/net/spdy/spdy_session_pool_unittest.cc
@@ -892,7 +892,7 @@
   base::WeakPtr<SpdySession> sessionC =
       CreateSpdySession(http_session_.get(), keyC, NetLogWithSource());
 
-  sessionC->CloseSessionOnError(ERR_SPDY_PROTOCOL_ERROR, "Error!");
+  sessionC->CloseSessionOnError(ERR_HTTP2_PROTOCOL_ERROR, "Error!");
   EXPECT_TRUE(sessionC->IsDraining());
 
   spdy_session_pool_->OnIPAddressChanged();
diff --git a/net/spdy/spdy_session_unittest.cc b/net/spdy/spdy_session_unittest.cc
index baabba7..fb5fd6a 100644
--- a/net/spdy/spdy_session_unittest.cc
+++ b/net/spdy/spdy_session_unittest.cc
@@ -2718,7 +2718,7 @@
   ~SessionClosingDelegate() override = default;
 
   void OnClose(int status) override {
-    session_to_close_->CloseSessionOnError(ERR_SPDY_PROTOCOL_ERROR, "Error");
+    session_to_close_->CloseSessionOnError(ERR_HTTP2_PROTOCOL_ERROR, "Error");
   }
 
  private:
@@ -5187,7 +5187,7 @@
   data.Resume();
   base::RunLoop().RunUntilIdle();
 
-  EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_FLOW_CONTROL_ERROR));
+  EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_HTTP2_FLOW_CONTROL_ERROR));
   EXPECT_FALSE(session_);
 }
 
@@ -5814,7 +5814,7 @@
   SpdyStream* pushed_stream;
   int rv = session_->GetPushedStream(pushed_url, 2 /* pushed_stream_id */, IDLE,
                                      &pushed_stream);
-  EXPECT_THAT(rv, IsError(ERR_SPDY_PUSHED_STREAM_NOT_AVAILABLE));
+  EXPECT_THAT(rv, IsError(ERR_HTTP2_PUSHED_STREAM_NOT_AVAILABLE));
 
   // Read PUSH_PROMISE.
   data.Resume();
@@ -5845,7 +5845,7 @@
   // stream with ID |pushed_stream_id|.
   rv = session_->GetPushedStream(pushed_url, 4 /* pushed_stream_id */, IDLE,
                                  &pushed_stream);
-  EXPECT_THAT(rv, IsError(ERR_SPDY_PUSHED_STREAM_NOT_AVAILABLE));
+  EXPECT_THAT(rv, IsError(ERR_HTTP2_PUSHED_STREAM_NOT_AVAILABLE));
 
   // GetPushedStream() should return OK and return the pushed stream in
   // |pushed_stream| outparam if |pushed_stream_id| matches.
@@ -6597,19 +6597,19 @@
 }
 
 TEST(MapFramerErrorToNetError, MapsValue) {
-  CHECK_EQ(ERR_SPDY_PROTOCOL_ERROR,
+  CHECK_EQ(ERR_HTTP2_PROTOCOL_ERROR,
            MapFramerErrorToNetError(
                http2::Http2DecoderAdapter::SPDY_INVALID_CONTROL_FRAME));
-  CHECK_EQ(ERR_SPDY_COMPRESSION_ERROR,
+  CHECK_EQ(ERR_HTTP2_COMPRESSION_ERROR,
            MapFramerErrorToNetError(
                http2::Http2DecoderAdapter::SPDY_COMPRESS_FAILURE));
-  CHECK_EQ(ERR_SPDY_COMPRESSION_ERROR,
+  CHECK_EQ(ERR_HTTP2_COMPRESSION_ERROR,
            MapFramerErrorToNetError(
                http2::Http2DecoderAdapter::SPDY_DECOMPRESS_FAILURE));
-  CHECK_EQ(ERR_SPDY_FRAME_SIZE_ERROR,
+  CHECK_EQ(ERR_HTTP2_FRAME_SIZE_ERROR,
            MapFramerErrorToNetError(
                http2::Http2DecoderAdapter::SPDY_CONTROL_PAYLOAD_TOO_LARGE));
-  CHECK_EQ(ERR_SPDY_FRAME_SIZE_ERROR,
+  CHECK_EQ(ERR_HTTP2_FRAME_SIZE_ERROR,
            MapFramerErrorToNetError(
                http2::Http2DecoderAdapter::SPDY_OVERSIZED_PAYLOAD));
 }
@@ -6633,15 +6633,15 @@
 
 TEST(MapNetErrorToGoAwayStatus, MapsValue) {
   CHECK_EQ(spdy::ERROR_CODE_INADEQUATE_SECURITY,
-           MapNetErrorToGoAwayStatus(ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY));
+           MapNetErrorToGoAwayStatus(ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY));
   CHECK_EQ(spdy::ERROR_CODE_FLOW_CONTROL_ERROR,
-           MapNetErrorToGoAwayStatus(ERR_SPDY_FLOW_CONTROL_ERROR));
+           MapNetErrorToGoAwayStatus(ERR_HTTP2_FLOW_CONTROL_ERROR));
   CHECK_EQ(spdy::ERROR_CODE_PROTOCOL_ERROR,
-           MapNetErrorToGoAwayStatus(ERR_SPDY_PROTOCOL_ERROR));
+           MapNetErrorToGoAwayStatus(ERR_HTTP2_PROTOCOL_ERROR));
   CHECK_EQ(spdy::ERROR_CODE_COMPRESSION_ERROR,
-           MapNetErrorToGoAwayStatus(ERR_SPDY_COMPRESSION_ERROR));
+           MapNetErrorToGoAwayStatus(ERR_HTTP2_COMPRESSION_ERROR));
   CHECK_EQ(spdy::ERROR_CODE_FRAME_SIZE_ERROR,
-           MapNetErrorToGoAwayStatus(ERR_SPDY_FRAME_SIZE_ERROR));
+           MapNetErrorToGoAwayStatus(ERR_HTTP2_FRAME_SIZE_ERROR));
   CHECK_EQ(spdy::ERROR_CODE_PROTOCOL_ERROR,
            MapNetErrorToGoAwayStatus(ERR_UNEXPECTED));
 }
diff --git a/net/spdy/spdy_stream.cc b/net/spdy/spdy_stream.cc
index 785de06..0580256 100644
--- a/net/spdy/spdy_stream.cc
+++ b/net/spdy/spdy_stream.cc
@@ -272,7 +272,7 @@
         "Received WINDOW_UPDATE [delta: %d] for stream %d overflows "
         "send_window_size_ [current: %d]",
         delta_window_size, stream_id_, send_window_size_);
-    session_->ResetStream(stream_id_, ERR_SPDY_FLOW_CONTROL_ERROR, desc);
+    session_->ResetStream(stream_id_, ERR_HTTP2_FLOW_CONTROL_ERROR, desc);
   }
 }
 
@@ -342,7 +342,7 @@
   // the peer, that means that the receive window is not being respected.
   if (delta_window_size > recv_window_size_ - unacked_recv_window_bytes_) {
     session_->ResetStream(
-        stream_id_, ERR_SPDY_FLOW_CONTROL_ERROR,
+        stream_id_, ERR_HTTP2_FLOW_CONTROL_ERROR,
         "delta_window_size is " + base::NumberToString(delta_window_size) +
             " in DecreaseRecvWindowSize, which is larger than the receive " +
             "window size of " + base::NumberToString(recv_window_size_));
@@ -389,16 +389,16 @@
           response_headers.find(spdy::kHttp2StatusHeader);
       if (it == response_headers.end()) {
         const std::string error("Response headers do not include :status.");
-        LogStreamError(ERR_SPDY_PROTOCOL_ERROR, error);
-        session_->ResetStream(stream_id_, ERR_SPDY_PROTOCOL_ERROR, error);
+        LogStreamError(ERR_HTTP2_PROTOCOL_ERROR, error);
+        session_->ResetStream(stream_id_, ERR_HTTP2_PROTOCOL_ERROR, error);
         return;
       }
 
       int status;
       if (!StringToInt(it->second, &status)) {
         const std::string error("Cannot parse :status.");
-        LogStreamError(ERR_SPDY_PROTOCOL_ERROR, error);
-        session_->ResetStream(stream_id_, ERR_SPDY_PROTOCOL_ERROR, error);
+        LogStreamError(ERR_HTTP2_PROTOCOL_ERROR, error);
+        session_->ResetStream(stream_id_, ERR_HTTP2_PROTOCOL_ERROR, error);
         return;
       }
 
@@ -428,8 +428,8 @@
           // the response headers only after request headers are sent.
           if (io_state_ == STATE_IDLE) {
             const std::string error("Response received before request sent.");
-            LogStreamError(ERR_SPDY_PROTOCOL_ERROR, error);
-            session_->ResetStream(stream_id_, ERR_SPDY_PROTOCOL_ERROR, error);
+            LogStreamError(ERR_HTTP2_PROTOCOL_ERROR, error);
+            session_->ResetStream(stream_id_, ERR_HTTP2_PROTOCOL_ERROR, error);
             return;
           }
           break;
@@ -458,8 +458,8 @@
       // Second header block is trailers.
       if (type_ == SPDY_PUSH_STREAM) {
         const std::string error("Trailers not supported for push stream.");
-        LogStreamError(ERR_SPDY_PROTOCOL_ERROR, error);
-        session_->ResetStream(stream_id_, ERR_SPDY_PROTOCOL_ERROR, error);
+        LogStreamError(ERR_HTTP2_PROTOCOL_ERROR, error);
+        session_->ResetStream(stream_id_, ERR_HTTP2_PROTOCOL_ERROR, error);
         return;
       }
 
@@ -470,8 +470,8 @@
     case TRAILERS_RECEIVED:
       // No further header blocks are allowed after trailers.
       const std::string error("Header block received after trailers.");
-      LogStreamError(ERR_SPDY_PROTOCOL_ERROR, error);
-      session_->ResetStream(stream_id_, ERR_SPDY_PROTOCOL_ERROR, error);
+      LogStreamError(ERR_HTTP2_PROTOCOL_ERROR, error);
+      session_->ResetStream(stream_id_, ERR_HTTP2_PROTOCOL_ERROR, error);
       break;
   }
 }
@@ -499,22 +499,22 @@
 
   if (response_state_ == READY_FOR_HEADERS) {
     const std::string error("DATA received before headers.");
-    LogStreamError(ERR_SPDY_PROTOCOL_ERROR, error);
-    session_->ResetStream(stream_id_, ERR_SPDY_PROTOCOL_ERROR, error);
+    LogStreamError(ERR_HTTP2_PROTOCOL_ERROR, error);
+    session_->ResetStream(stream_id_, ERR_HTTP2_PROTOCOL_ERROR, error);
     return;
   }
 
   if (response_state_ == TRAILERS_RECEIVED && buffer) {
     const std::string error("DATA received after trailers.");
-    LogStreamError(ERR_SPDY_PROTOCOL_ERROR, error);
-    session_->ResetStream(stream_id_, ERR_SPDY_PROTOCOL_ERROR, error);
+    LogStreamError(ERR_HTTP2_PROTOCOL_ERROR, error);
+    session_->ResetStream(stream_id_, ERR_HTTP2_PROTOCOL_ERROR, error);
     return;
   }
 
   if (io_state_ == STATE_HALF_CLOSED_REMOTE) {
     const std::string error("DATA received on half-closed (remove) stream.");
-    LogStreamError(ERR_SPDY_STREAM_CLOSED, error);
-    session_->ResetStream(stream_id_, ERR_SPDY_STREAM_CLOSED, error);
+    LogStreamError(ERR_HTTP2_STREAM_CLOSED, error);
+    session_->ResetStream(stream_id_, ERR_HTTP2_STREAM_CLOSED, error);
     return;
   }
 
@@ -674,9 +674,9 @@
   // In most cases, the stream should already be CLOSED. The exception is when a
   // SpdySession is shutting down while the stream is in an intermediate state.
   io_state_ = STATE_CLOSED;
-  if (status == ERR_SPDY_RST_STREAM_NO_ERROR_RECEIVED) {
+  if (status == ERR_HTTP2_RST_STREAM_NO_ERROR_RECEIVED) {
     if (response_state_ == READY_FOR_HEADERS) {
-      status = ERR_SPDY_PROTOCOL_ERROR;
+      status = ERR_HTTP2_PROTOCOL_ERROR;
     } else {
       status = OK;
     }
@@ -881,7 +881,7 @@
     int status) {
   DCHECK(response_headers_.empty());
   if (response_headers.find("transfer-encoding") != response_headers.end()) {
-    session_->ResetStream(stream_id_, ERR_SPDY_PROTOCOL_ERROR,
+    session_->ResetStream(stream_id_, ERR_HTTP2_PROTOCOL_ERROR,
                           "Received transfer-encoding header");
     return;
   }
@@ -897,7 +897,7 @@
       (status / 100 != 2 && status / 100 != 3 && status != 416)) {
     SpdySession::RecordSpdyPushedStreamFateHistogram(
         SpdyPushedStreamFate::kUnsupportedStatusCode);
-    session_->ResetStream(stream_id_, ERR_SPDY_CLIENT_REFUSED_STREAM,
+    session_->ResetStream(stream_id_, ERR_HTTP2_CLIENT_REFUSED_STREAM,
                           "Unsupported status code for pushed stream.");
     return;
   }
diff --git a/net/spdy/spdy_stream_unittest.cc b/net/spdy/spdy_stream_unittest.cc
index e0dc4d7..801396b 100644
--- a/net/spdy/spdy_stream_unittest.cc
+++ b/net/spdy/spdy_stream_unittest.cc
@@ -605,7 +605,7 @@
       stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND),
       IsError(ERR_IO_PENDING));
 
-  EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR));
+  EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_HTTP2_PROTOCOL_ERROR));
 
   // Finish async network reads and writes.
   base::RunLoop().RunUntilIdle();
@@ -720,7 +720,7 @@
   EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers),
                                                        NO_MORE_DATA_TO_SEND));
 
-  EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR));
+  EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_HTTP2_PROTOCOL_ERROR));
 
   // Finish async network reads and writes.
   base::RunLoop().RunUntilIdle();
@@ -839,7 +839,7 @@
   EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers),
                                                        NO_MORE_DATA_TO_SEND));
 
-  EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR));
+  EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_HTTP2_PROTOCOL_ERROR));
 }
 
 TEST_F(SpdyStreamTest, HeadersMustPreceedDataOnPushedStream) {
@@ -962,7 +962,7 @@
   EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers),
                                                        NO_MORE_DATA_TO_SEND));
 
-  EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR));
+  EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_HTTP2_PROTOCOL_ERROR));
 
   // Finish async network reads and writes.
   base::RunLoop().RunUntilIdle();
@@ -1021,7 +1021,7 @@
   EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers),
                                                        NO_MORE_DATA_TO_SEND));
 
-  EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR));
+  EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_HTTP2_PROTOCOL_ERROR));
 
   // Finish async network reads and writes.
   base::RunLoop().RunUntilIdle();
@@ -1125,7 +1125,7 @@
   EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers),
                                                        NO_MORE_DATA_TO_SEND));
 
-  EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR));
+  EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_HTTP2_PROTOCOL_ERROR));
 
   // Finish async network reads and writes.
   base::RunLoop().RunUntilIdle();
@@ -1178,7 +1178,7 @@
   EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers),
                                                        NO_MORE_DATA_TO_SEND));
 
-  EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR));
+  EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_HTTP2_PROTOCOL_ERROR));
 
   // Finish async network reads and writes.
   base::RunLoop().RunUntilIdle();
@@ -1229,7 +1229,7 @@
   EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers),
                                                        NO_MORE_DATA_TO_SEND));
 
-  EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR));
+  EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_HTTP2_PROTOCOL_ERROR));
 
   // Finish async network reads and writes.
   base::RunLoop().RunUntilIdle();
@@ -1291,7 +1291,7 @@
   data.Resume();
   base::RunLoop().RunUntilIdle();
 
-  EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_FLOW_CONTROL_ERROR));
+  EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_HTTP2_FLOW_CONTROL_ERROR));
 }
 
 // Functions used with
@@ -1590,7 +1590,7 @@
   EXPECT_THAT(stream->SendRequestHeaders(std::move(headers), MORE_DATA_TO_SEND),
               IsError(ERR_IO_PENDING));
 
-  EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_STREAM_CLOSED));
+  EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_HTTP2_STREAM_CLOSED));
 
   base::RunLoop().RunUntilIdle();
 
diff --git a/net/websockets/websocket_stream_test.cc b/net/websockets/websocket_stream_test.cc
index 13d350c..66e30b5 100644
--- a/net/websockets/websocket_stream_test.cc
+++ b/net/websockets/websocket_stream_test.cc
@@ -1613,7 +1613,7 @@
     stream_request_.reset();
 
     EXPECT_TRUE(has_failed());
-    EXPECT_EQ("Stream closed with error: net::ERR_SPDY_PROTOCOL_ERROR",
+    EXPECT_EQ("Stream closed with error: net::ERR_HTTP2_PROTOCOL_ERROR",
               failure_message());
 
     auto samples = histogram_tester.GetHistogramSamplesSinceCreation(
diff --git a/printing/BUILD.gn b/printing/BUILD.gn
index 48a5884..5fe480f5 100644
--- a/printing/BUILD.gn
+++ b/printing/BUILD.gn
@@ -22,6 +22,14 @@
              "set enable_pdf=true.")
 }
 
+# Several targets want to include this header file. We separate it out
+# here so multiple targets can depend on it.
+source_set("printing_export") {
+  sources = [
+    "printing_export.h",
+  ]
+}
+
 component("printing") {
   sources = [
     "backend/print_backend.cc",
@@ -67,9 +75,6 @@
     "printed_document_win.cc",
     "printing_context.cc",
     "printing_context.h",
-    "printing_export.h",
-    "printing_features.cc",
-    "printing_features.h",
     "printing_utils.cc",
     "printing_utils.h",
     "pwg_raster_settings.h",
@@ -84,6 +89,7 @@
     "//printing/buildflags",
   ]
   deps = [
+    ":printing_export",
     "//base",
     "//base:i18n",
     "//base/third_party/dynamic_annotations",
diff --git a/printing/common/BUILD.gn b/printing/common/BUILD.gn
index c40a79c..4143ca72 100644
--- a/printing/common/BUILD.gn
+++ b/printing/common/BUILD.gn
@@ -6,10 +6,15 @@
   sources = [
     "metafile_utils.cc",
     "metafile_utils.h",
+    "printing_features.cc",
+    "printing_features.h",
   ]
 
   deps = [
     "//base",
+    "//printing:printing_export",
     "//skia",
   ]
+
+  defines = [ "PRINTING_IMPLEMENTATION" ]
 }
diff --git a/printing/common/metafile_utils.cc b/printing/common/metafile_utils.cc
index 1dcae3a..eae01fb 100644
--- a/printing/common/metafile_utils.cc
+++ b/printing/common/metafile_utils.cc
@@ -5,6 +5,7 @@
 #include "printing/common/metafile_utils.h"
 
 #include "base/time/time.h"
+#include "printing/common/printing_features.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "third_party/skia/include/core/SkPicture.h"
 #include "third_party/skia/include/core/SkPictureRecorder.h"
@@ -51,6 +52,10 @@
                           ? SkString("Chromium")
                           : SkString(creator.c_str(), creator.size());
   metadata.fRasterDPI = 300.0f;
+  metadata.fSubsetter =
+      base::FeatureList::IsEnabled(printing::features::kHarfBuzzPDFSubsetter)
+          ? SkPDF::Metadata::kHarfbuzz_Subsetter
+          : SkPDF::Metadata::kSfntly_Subsetter;
   return SkPDF::MakeDocument(stream, metadata);
 }
 
diff --git a/printing/common/printing_features.cc b/printing/common/printing_features.cc
new file mode 100644
index 0000000..41b37e0
--- /dev/null
+++ b/printing/common/printing_features.cc
@@ -0,0 +1,14 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "printing/common/printing_features.h"
+
+namespace printing {
+namespace features {
+
+const base::Feature kHarfBuzzPDFSubsetter{"HarfBuzzPDFSubsetter",
+                                          base::FEATURE_DISABLED_BY_DEFAULT};
+
+}  // namespace features
+}  // namespace printing
diff --git a/printing/common/printing_features.h b/printing/common/printing_features.h
new file mode 100644
index 0000000..22c6295
--- /dev/null
+++ b/printing/common/printing_features.h
@@ -0,0 +1,19 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef PRINTING_COMMON_PRINTING_FEATURES_H_
+#define PRINTING_COMMON_PRINTING_FEATURES_H_
+
+#include "base/feature_list.h"
+#include "printing/printing_export.h"
+
+namespace printing {
+namespace features {
+
+PRINTING_EXPORT extern const base::Feature kHarfBuzzPDFSubsetter;
+
+}  // namespace features
+}  // namespace printing
+
+#endif  // PRINTING_COMMON_PRINTING_FEATURES_H_
diff --git a/printing/printing_features.cc b/printing/printing_features.cc
deleted file mode 100644
index 9e8f542..0000000
--- a/printing/printing_features.cc
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "printing/printing_features.h"
-
-namespace printing {
-namespace features {
-
-const base::Feature kHarfBuzzPDFSubsetter{"HarfBuzzPDFSubsetter",
-                                          base::FEATURE_DISABLED_BY_DEFAULT};
-
-}  // namespace features
-}  // namespace printing
diff --git a/printing/printing_features.h b/printing/printing_features.h
deleted file mode 100644
index 5be47e9..0000000
--- a/printing/printing_features.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PRINTING_PRINTING_FEATURES_H_
-#define PRINTING_PRINTING_FEATURES_H_
-
-#include "base/feature_list.h"
-#include "printing/printing_export.h"
-
-namespace printing {
-namespace features {
-
-PRINTING_EXPORT extern const base::Feature kHarfBuzzPDFSubsetter;
-
-}  // namespace features
-}  // namespace printing
-
-#endif  // PRINTING_PRINTING_FEATURES_H_
diff --git a/remoting/client/chromoting_client.cc b/remoting/client/chromoting_client.cc
index 0674e729..3088f00 100644
--- a/remoting/client/chromoting_client.cc
+++ b/remoting/client/chromoting_client.cc
@@ -129,6 +129,11 @@
   }
 }
 
+void ChromotingClient::Close() {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  connection_->Disconnect(protocol::OK);
+}
+
 void ChromotingClient::SetCapabilities(
     const protocol::Capabilities& capabilities) {
   DCHECK(thread_checker_.CalledOnValidThread());
diff --git a/remoting/client/chromoting_client.h b/remoting/client/chromoting_client.h
index 35c93732..a1acca62 100644
--- a/remoting/client/chromoting_client.h
+++ b/remoting/client/chromoting_client.h
@@ -72,6 +72,9 @@
              const std::string& host_jid,
              const std::string& capabilities);
 
+  // Closes the client and notifies the host of the closure.
+  void Close();
+
   protocol::ConnectionToHost::State connection_state() const {
     return connection_->state();
   }
diff --git a/remoting/client/chromoting_session.cc b/remoting/client/chromoting_session.cc
index c6c961a5..1a71939 100644
--- a/remoting/client/chromoting_session.cc
+++ b/remoting/client/chromoting_session.cc
@@ -347,6 +347,9 @@
                                    ChromotingEvent::ConnectionError::NONE);
     session_state_ = protocol::ConnectionToHost::CLOSED;
 
+    // Make sure we send a session-terminate to the host.
+    client_->Close();
+
     Invalidate();
   }
 }
diff --git a/remoting/protocol/connection_to_host.h b/remoting/protocol/connection_to_host.h
index 8ab29f33..ebf39fd 100644
--- a/remoting/protocol/connection_to_host.h
+++ b/remoting/protocol/connection_to_host.h
@@ -90,6 +90,9 @@
                        scoped_refptr<TransportContext> transport_context,
                        HostEventCallback* event_callback) = 0;
 
+  // Disconnects the host connection.
+  virtual void Disconnect(ErrorCode error) = 0;
+
   // Returns the session configuration that was negotiated with the host.
   virtual const SessionConfig& config() = 0;
 
diff --git a/remoting/protocol/fake_connection_to_host.cc b/remoting/protocol/fake_connection_to_host.cc
index e004aa91..b63b038 100644
--- a/remoting/protocol/fake_connection_to_host.cc
+++ b/remoting/protocol/fake_connection_to_host.cc
@@ -37,6 +37,8 @@
   SetState(CONNECTING, protocol::OK);
 }
 
+void FakeConnectionToHost::Disconnect(protocol::ErrorCode error) {}
+
 void FakeConnectionToHost::SignalStateChange(protocol::Session::State state,
                                              protocol::ErrorCode error) {
   DCHECK(event_callback_);
diff --git a/remoting/protocol/fake_connection_to_host.h b/remoting/protocol/fake_connection_to_host.h
index 747892ac..74f8d91 100644
--- a/remoting/protocol/fake_connection_to_host.h
+++ b/remoting/protocol/fake_connection_to_host.h
@@ -30,6 +30,7 @@
   void Connect(std::unique_ptr<protocol::Session> session,
                scoped_refptr<protocol::TransportContext> transport_context,
                HostEventCallback* event_callback) override;
+  void Disconnect(protocol::ErrorCode error) override;
   const protocol::SessionConfig& config() override;
   protocol::ClipboardStub* clipboard_forwarder() override;
   protocol::HostStub* host_stub() override;
diff --git a/remoting/protocol/ice_connection_to_host.cc b/remoting/protocol/ice_connection_to_host.cc
index a0bfe6ad..522b9995 100644
--- a/remoting/protocol/ice_connection_to_host.cc
+++ b/remoting/protocol/ice_connection_to_host.cc
@@ -53,6 +53,10 @@
   SetState(CONNECTING, OK);
 }
 
+void IceConnectionToHost::Disconnect(ErrorCode error) {
+  session_->Close(error);
+}
+
 const SessionConfig& IceConnectionToHost::config() {
   return session_->config();
 }
diff --git a/remoting/protocol/ice_connection_to_host.h b/remoting/protocol/ice_connection_to_host.h
index 487eb42..701f404 100644
--- a/remoting/protocol/ice_connection_to_host.h
+++ b/remoting/protocol/ice_connection_to_host.h
@@ -52,6 +52,7 @@
   void Connect(std::unique_ptr<Session> session,
                scoped_refptr<TransportContext> transport_context,
                HostEventCallback* event_callback) override;
+  void Disconnect(ErrorCode error) override;
   const SessionConfig& config() override;
   ClipboardStub* clipboard_forwarder() override;
   HostStub* host_stub() override;
diff --git a/remoting/protocol/webrtc_connection_to_host.cc b/remoting/protocol/webrtc_connection_to_host.cc
index 37c795e0..6758dc05 100644
--- a/remoting/protocol/webrtc_connection_to_host.cc
+++ b/remoting/protocol/webrtc_connection_to_host.cc
@@ -49,6 +49,10 @@
   SetState(CONNECTING, OK);
 }
 
+void WebrtcConnectionToHost::Disconnect(ErrorCode error) {
+  session_->Close(error);
+}
+
 const SessionConfig& WebrtcConnectionToHost::config() {
   return session_->config();
 }
diff --git a/remoting/protocol/webrtc_connection_to_host.h b/remoting/protocol/webrtc_connection_to_host.h
index 2dbfec66..b2f5202 100644
--- a/remoting/protocol/webrtc_connection_to_host.h
+++ b/remoting/protocol/webrtc_connection_to_host.h
@@ -45,6 +45,7 @@
   void Connect(std::unique_ptr<Session> session,
                scoped_refptr<TransportContext> transport_context,
                HostEventCallback* event_callback) override;
+  void Disconnect(ErrorCode error) override;
   const SessionConfig& config() override;
   ClipboardStub* clipboard_forwarder() override;
   HostStub* host_stub() override;
diff --git a/remoting/resources/BUILD.gn b/remoting/resources/BUILD.gn
index ba277c5..bbe591f 100644
--- a/remoting/resources/BUILD.gn
+++ b/remoting/resources/BUILD.gn
@@ -33,7 +33,6 @@
     "../host/win/version.rc.jinja2",
     "../resources/play_store_resources.cc",
     "../webapp/crd/js/background.js",
-    "../webapp/crd/js/butter_bar.js",
     "../webapp/base/js/error.js",
     "../webapp/crd/js/host_list.js",
     "../webapp/crd/js/host_setup_dialog.js",
diff --git a/remoting/webapp/crd/html/butter_bar.html b/remoting/webapp/crd/html/butter_bar.html
index 637114c9..6de0eea 100644
--- a/remoting/webapp/crd/html/butter_bar.html
+++ b/remoting/webapp/crd/html/butter_bar.html
@@ -5,6 +5,9 @@
 -->
 <div data-ui-mode="home">
   <div id="butter-bar">
-    <p id="butter-bar-message"></p>
+    <p id="butter-bar-message"
+       i18n-content="WEBSITE_INVITE_DEPRECATION"
+       i18n-value-1="<a href=&quot;https://remotedesktop.google.com&quot; target=&quot;_blank&quot;>"
+       i18n-value-2="</a>"></p>
   </div>
 </div>
diff --git a/remoting/webapp/crd/js/butter_bar.js b/remoting/webapp/crd/js/butter_bar.js
deleted file mode 100644
index dfdda2a1..0000000
--- a/remoting/webapp/crd/js/butter_bar.js
+++ /dev/null
@@ -1,270 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview
- * ButterBar class that is used to show a butter bar with deprecation messages.
- * Each message is displayed for at most one week.
- */
-
-/** @suppress {duplicate} */
-var remoting = remoting || {};
-
-(function() {
-
-'use strict';
-
-/**
- * @param {function(!remoting.ChromotingEvent)} writeLogFunction Callback for
- *    reporting telemetry events to the backend.
- * @constructor
- */
-remoting.ButterBar = function(writeLogFunction) {
-  /** @private @const */
-  this.messages_ = [
-    {id: /*i18n-content*/'WEBSITE_INVITE_BETA', dismissable: true},
-    {id: /*i18n-content*/'WEBSITE_INVITE_STABLE', dismissable: true},
-    {id: /*i18n-content*/'WEBSITE_INVITE_FILE_TRANSFER', dismissable: true},
-    {id: /*i18n-content*/'WEBSITE_INVITE_MULTI_MONITOR', dismissable: true},
-    {id: /*i18n-content*/'WEBSITE_INVITE_DEPRECATION', dismissable: false},
-  ];
-  // TODO(jamiewalch): Read the message index using metricsPrivate.
-  this.currentMessage_ = -1;
-  /** @private {!Element} */
-  this.root_ = document.getElementById(remoting.ButterBar.kId_);
-  /** @private {!Element} */
-  this.message_ = document.getElementById(remoting.ButterBar.kMessageId_);
-  /** @private {!Element} */
-  this.dismiss_ = document.getElementById(remoting.ButterBar.kDismissId_);
-  /** @private {function(!remoting.ChromotingEvent)} */
-  this.writeLogFunction_ = writeLogFunction;
-}
-
-/** @return {!remoting.ButterBar} */
-remoting.ButterBar.create  = function() {
-  return new remoting.ButterBar(remoting.TelemetryEventWriter.Client.write);
-};
-
-remoting.ButterBar.prototype.init = function() {
-  var result = new base.Deferred();
-  var xhr = new remoting.Xhr({
-    method: 'GET',
-    url: remoting.ButterBar.kMessageIndexUrl_,
-    acceptJson: true,
-    headers: { 'Content-Type': 'text/plain' },
-  });
-  var promises = [
-    xhr.start(),
-    remoting.identity.getEmail(),
-  ];
-  Promise.all(promises).then(function (results) {
-    try {
-      /** @type {!remoting.Xhr.Response} */
-      var response = results[0];
-      var responseObj = response.getJson();
-      /** @type {string} */
-      var email = results[1];
-      /** @type {number} The index of the message to display. */
-      var index = base.assertNumber(responseObj.index);
-      /** @type {string} The URL of the website. */
-      var url = base.escapeHTML(base.assertString(responseObj.url));
-      /** @type {number} The percentage of users to whom to show the message. */
-      var percent = base.assertNumber(responseObj.percent);
-      if (isFinite(index)) {
-        var hash = remoting.ButterBar.hash_(email);
-        if (100 * hash / 127 <= percent) {
-          this.currentMessage_ =
-              Math.min(Number(index), this.messages_.length - 1);
-        }
-      }
-      if (this.currentMessage_ > -1) {
-        chrome.storage.sync.get(
-            [remoting.ButterBar.kStorageKey_],
-            (syncValues) => {
-              this.onStateLoaded_(syncValues, String(url));
-              result.resolve();
-            });
-      } else {
-        result.resolve();
-      }
-    } catch (err) {
-      console.error('Error parsing JSON:', response.getText(), err);
-      result.resolve();
-    }
-  }.bind(this));
-  return result.promise();
-}
-
-/**
- * Shows butter bar with the current message.
- *
- * @param {string} url
- * @private
- */
-remoting.ButterBar.prototype.show_ = function(url) {
-  var MigrationEvent = remoting.ChromotingEvent.ChromotingDotComMigration.Event;
-  this.reportTelemetry_(MigrationEvent.DEPRECATION_NOTICE_IMPRESSION);
-
-  var messageId = this.messages_[this.currentMessage_].id;
-  var substitutions = [`<a href="${url}" target="_blank">`, '</a>'];
-  var dismissable = this.messages_[this.currentMessage_].dismissable;
-  l10n.localizeElementFromTag(this.message_, messageId, substitutions, true);
-
-  var anchorTags = this.message_.getElementsByTagName('a');
-  if (anchorTags.length == 1) {
-    anchorTags[0].addEventListener(
-        'click', this.onLinkClicked_.bind(this), false);
-  }
-  this.root_.hidden = false;
-}
-
-/**
- * @param {remoting.ChromotingEvent.ChromotingDotComMigration.Event} eventType
- * @private
- */
-remoting.ButterBar.prototype.reportTelemetry_ = function(eventType) {
-  var event =
-      new remoting.ChromotingEvent(
-          remoting.ChromotingEvent.Type.CHROMOTING_DOT_COM_MIGRATION);
-  event.chromoting_dot_com_migration =
-      new remoting.ChromotingEvent.ChromotingDotComMigration(
-          eventType, this.getMigrationPhase_());
-  event.role = remoting.ChromotingEvent.Role.CLIENT;
-  this.writeLogFunction_(event);
-};
-
-/**
- * @return {remoting.ChromotingEvent.ChromotingDotComMigration.Phase}
- * @private
- */
-remoting.ButterBar.prototype.getMigrationPhase_ = function() {
-  var Phase = remoting.ChromotingEvent.ChromotingDotComMigration.Phase
-  switch (this.currentMessage_) {
-    case 0:
-      return Phase.BETA;
-    case 1:
-      return Phase.STABLE;
-    case 2:
-    case 3:
-      return Phase.DEPRECATION_1;
-    case 4:
-      return Phase.DEPRECATION_2;
-    default:
-      return Phase.UNSPECIFIED_PHASE;
-  }
-};
-
-/**
- * @param {Object} syncValues
- * @param {string} url The website URL.
- * @private
- */
-remoting.ButterBar.prototype.onStateLoaded_ = function(syncValues, url) {
-  /** @type {!Object|undefined} */
-  var messageState = syncValues[remoting.ButterBar.kStorageKey_];
-  if (!messageState) {
-    messageState = {
-      index: -1,
-      timestamp: remoting.ButterBar.now_(),
-      hidden: false,
-    }
-  }
-
-  // Show the current message unless it was explicitly dismissed or if it was
-  // first shown more than a week ago. If it is marked as not dismissable, show
-  // it unconditionally.
-  var elapsed = remoting.ButterBar.now_() - messageState.timestamp;
-  var show =
-      this.currentMessage_ != messageState.index ||
-      !this.messages_[this.currentMessage_].dismissable ||
-      (!messageState.hidden && elapsed <= remoting.ButterBar.kTimeout_);
-
-  if (show) {
-    this.show_(url);
-    // If this is the first time this message is being displayed, update the
-    // saved state.
-    if (this.currentMessage_ > messageState.index) {
-      var value = {};
-      value[remoting.ButterBar.kStorageKey_] = {
-        index: this.currentMessage_,
-        timestamp: remoting.ButterBar.now_(),
-        hidden: false
-      };
-      chrome.storage.sync.set(value);
-    }
-  }
-};
-
-/**
- * Click handler of the migration link.
- *
- * @param {Event} e
- * @private
- */
-remoting.ButterBar.prototype.onLinkClicked_ = function(e) {
-  var MigrationEvent = remoting.ChromotingEvent.ChromotingDotComMigration.Event;
-  this.reportTelemetry_(MigrationEvent.DEPRECATION_NOTICE_CLICKED);
-};
-
-/**
- * Hide the butter bar request and record the message that was being displayed.
- */
-remoting.ButterBar.prototype.dismiss = function() {
-  var MigrationEvent = remoting.ChromotingEvent.ChromotingDotComMigration.Event;
-  this.reportTelemetry_(MigrationEvent.DEPRECATION_NOTICE_DISMISSAL);
-  var value = {};
-  value[remoting.ButterBar.kStorageKey_] = {
-    index: this.currentMessage_,
-    timestamp: remoting.ButterBar.now_(),
-    hidden: true
-  };
-  chrome.storage.sync.set(value);
-
-  this.root_.hidden = true;
-};
-
-/**
- * Get current time for testing. Note that this is called in the then() clause
- * of a Promise, which Sinon doesn't handle correctly.
- *
- * @return {number} The current time in milliseconds since the epoch.
- * @private
- */
-remoting.ButterBar.now_ = function() {
-  return Date.now();
-};
-
-/**
- * @param {string} str
- * @return {number} a simple hash of the |str| in the range [0, 127]
- * @private
- */
-remoting.ButterBar.hash_ = function(str) {
-  var hash = 0;
-  for (var i = 0; i < str.length; i++) {
-    var chr = str.charCodeAt(i);
-    hash ^= chr;
-  }
-  return hash & 0x7f;
-};
-
-/** @const @private */
-remoting.ButterBar.kId_ = 'butter-bar';
-
-/** @const @private */
-remoting.ButterBar.kMessageId_ = 'butter-bar-message';
-/** @const @private */
-remoting.ButterBar.kDismissId_ = 'butter-bar-dismiss';
-
-/** @const @private */
-remoting.ButterBar.kStorageKey_ = 'message-state';
-
-/** @const @private */
-remoting.ButterBar.kMessageIndexUrl_ =
-    'https://www.gstatic.com/chromoting/website_invite_message_index.json';
-
-/** @const @private */
-remoting.ButterBar.kTimeout_ = 7 * 24 * 60 * 60 * 1000;   // 1 week
-
-})();
diff --git a/remoting/webapp/crd/js/butter_bar_unittest.js b/remoting/webapp/crd/js/butter_bar_unittest.js
deleted file mode 100644
index 9b1b6dfc..0000000
--- a/remoting/webapp/crd/js/butter_bar_unittest.js
+++ /dev/null
@@ -1,239 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-(function() {
-
-'use strict';
-
-var logWriterSpy;
-
-function verifyLog(assert, index, expectedEvent, expectedPhase) {
-  var actual = logWriterSpy.getCall(index).args[0];
-  assert.equal(
-      actual.type, remoting.ChromotingEvent.Type.CHROMOTING_DOT_COM_MIGRATION,
-      'ChromotingEvent.type == CHROMOTING_DOT_COM_MIGRATION');
-  assert.equal(
-      actual.chromoting_dot_com_migration.event_type, expectedEvent,
-      'ChromotingEvent.chromoting_dot_com_migration.event matched.');
-  assert.equal(
-      actual.chromoting_dot_com_migration.phase, expectedPhase,
-      'ChromotingEvent.chromoting_dot_com_migration.phase matched');
-}
-
-QUnit.module('ButterBar', {
-  beforeEach: function() {
-    var fixture = document.getElementById('qunit-fixture');
-    fixture.innerHTML =
-        '<div id="butter-bar" hidden>' +
-        '  <p>' +
-        '    <span id="butter-bar-message"></span>' +
-        '    <a id="butter-bar-dismiss" href="#" tabindex="0">' +
-        '      <img src="icon_cross.webp" class="close-icon">' +
-        '    </a>' +
-        '  </p>' +
-        '</div>';
-    logWriterSpy = sinon.spy();
-    this.butterBar = new remoting.ButterBar(logWriterSpy);
-    chrome.storage = {
-      sync: {
-        get: sinon.stub(),
-        set: sinon.stub(),
-      }
-    };
-    this.currentMessage = -1;
-    this.percent = 100;
-    this.hash = 0;
-    this.url = 'https://www.example.com';
-    this.email = 'user@domain.com';
-    this.includeGooglers = undefined;
-
-    this.fakeSinonXhr = sinon.useFakeXMLHttpRequest();
-    this.fakeSinonXhr.onCreate =
-        function(/** sinon.FakeXhr */ xhr) {
-          Promise.resolve().then(function() {
-            if (this.currentMessage === undefined) {
-              xhr.respond(500, {}, 'Internal server error');
-            } else {
-              var result = {
-                "index": this.currentMessage,
-                "url": this.url,
-                "percent": this.percent,
-              };
-              if (this.includeGooglers !== undefined) {
-                result["includeGooglers"] = this.includeGooglers;
-              }
-              xhr.respond(200, {}, JSON.stringify(result));
-            }
-          }.bind(this));
-        }.bind(this);
-
-    this.now = 0;
-    sinon.stub(remoting.ButterBar, 'now_', () => this.now);
-    sinon.stub(remoting.ButterBar, 'hash_', () => this.hash);
-    sinon.stub(remoting.Identity.prototype, 'getEmail', () => {
-      return Promise.resolve(this.email);
-    });
-    sinon.stub(l10n, 'localizeElementFromTag', (element, id, substitutions) => {
-      element.innerHTML = substitutions[0] + 'link' + substitutions[1];
-    });
-    remoting.identity = new remoting.Identity();
-  },
-  afterEach: function() {
-    remoting.ButterBar.now_.restore();
-    remoting.ButterBar.hash_.restore();
-    this.fakeSinonXhr.restore();
-    remoting.identity.getEmail.restore();
-    l10n.localizeElementFromTag.restore();
-  }
-});
-
-QUnit.test('should be shown for google.com addresses when enabled',
-           function(assert) {
-  this.currentMessage = 0;
-  this.percent = 100;
-  this.email = 'uSeR@gOoGlE.cOm';
-  this.includeGooglers = true;
-  chrome.storage.sync.get.callsArgWith(1, {});
-  return this.butterBar.init().then(() => {
-    assert.ok(this.butterBar.root_.hidden == false);
-  });
-});
-
-QUnit.test('should update storage when shown', function(assert) {
-  this.currentMessage = 0;
-  this.now = 123;
-  chrome.storage.sync.get.callsArgWith(1, {});
-  return this.butterBar.init().then(() => {
-    assert.deepEqual(chrome.storage.sync.set.firstCall.args,
-                     [{
-                       "message-state": {
-                         "hidden": false,
-                         "index": 0,
-                         "timestamp": 123,
-                       }
-                     }]);
-  });
-});
-
-QUnit.test('should show the correct URL', function(assert) {
-  this.currentMessage = 0;
-  chrome.storage.sync.get.callsArgWith(1, {});
-  return this.butterBar.init().then(() => {
-    assert.ok(this.butterBar.root_.innerHTML.indexOf(this.url) != -1);
-  });
-});
-
-QUnit.test('should escape dangerous URLs', function(assert) {
-  this.currentMessage = 0;
-  this.url = '<script>evil()</script>';
-  chrome.storage.sync.get.callsArgWith(1, {});
-  return this.butterBar.init().then(() => {
-    assert.ok(this.butterBar.root_.innerHTML.indexOf(this.url) == -1);
-    assert.ok(this.butterBar.root_.innerHTML.indexOf(
-        '&lt;script&gt;evil()&lt;/script&gt;') != -1);
-  });
-});
-
-QUnit.test(
-    'should be shown and should not update local storage if it has already ' +
-    'shown, the timeout has not elapsed and it has not been dismissed',
-    function(assert) {
-  var MigrationPhase = remoting.ChromotingEvent.ChromotingDotComMigration.Phase;
-  var MigrationEvent = remoting.ChromotingEvent.ChromotingDotComMigration.Event;
-  this.currentMessage = 0;
-  chrome.storage.sync.get.callsArgWith(1, {
-    "message-state": {
-      "hidden": false,
-      "index": 0,
-      "timestamp": 0,
-    }
-  });
-  this.now = remoting.ButterBar.kTimeout_;
-  return this.butterBar.init().then(() => {
-    assert.ok(this.butterBar.root_.hidden == false);
-    assert.ok(!chrome.storage.sync.set.called);
-    verifyLog(
-        assert, 0, MigrationEvent.DEPRECATION_NOTICE_IMPRESSION,
-        MigrationPhase.BETA)
-  });
-});
-
-QUnit.test('should be shown if the index has increased', function(assert) {
-  var MigrationPhase = remoting.ChromotingEvent.ChromotingDotComMigration.Phase;
-  var MigrationEvent = remoting.ChromotingEvent.ChromotingDotComMigration.Event;
-  this.currentMessage = 1;
-  chrome.storage.sync.get.callsArgWith(1, {
-    "message-state": {
-      "hidden": true,
-      "index": 0,
-      "timestamp": 0,
-    }
-  });
-  this.now = remoting.ButterBar.kTimeout_ + 1;
-  return this.butterBar.init().then(() => {
-    assert.ok(this.butterBar.root_.hidden == false);
-    verifyLog(
-        assert, 0, MigrationEvent.DEPRECATION_NOTICE_IMPRESSION,
-        MigrationPhase.STABLE)
-  });
-});
-
-
-QUnit.test('should be shown if the index has decreased', function(assert) {
-  var MigrationPhase = remoting.ChromotingEvent.ChromotingDotComMigration.Phase;
-  var MigrationEvent = remoting.ChromotingEvent.ChromotingDotComMigration.Event;
-  this.currentMessage = 0;
-  chrome.storage.sync.get.callsArgWith(1, {
-    "message-state": {
-      "hidden": true,
-      "index": 1,
-      "timestamp": 0,
-    }
-  });
-  this.now = remoting.ButterBar.kTimeout_ + 1;
-  return this.butterBar.init().then(() => {
-    assert.ok(this.butterBar.root_.hidden == false);
-    verifyLog(
-        assert, 0, MigrationEvent.DEPRECATION_NOTICE_IMPRESSION,
-        MigrationPhase.BETA)
-  });
-});
-
-
-QUnit.test('should be red and not dismissable for the final message',
-           function(assert) {
-  var MigrationPhase = remoting.ChromotingEvent.ChromotingDotComMigration.Phase;
-  var MigrationEvent = remoting.ChromotingEvent.ChromotingDotComMigration.Event;
-
-  this.currentMessage = 4;
-  chrome.storage.sync.get.callsArgWith(1, {});
-  return this.butterBar.init().then(() => {
-    assert.ok(this.butterBar.root_.hidden == false);
-    assert.ok(this.butterBar.dismiss_.hidden == true);
-    assert.ok(this.butterBar.root_.classList.contains('red'));
-    verifyLog(
-        assert, 0, MigrationEvent.DEPRECATION_NOTICE_IMPRESSION,
-        MigrationPhase.DEPRECATION_2)
-  });
-});
-
-QUnit.test('clicks on upsell URL are reported', function(assert) {
-  var MigrationPhase = remoting.ChromotingEvent.ChromotingDotComMigration.Phase;
-  var MigrationEvent = remoting.ChromotingEvent.ChromotingDotComMigration.Event;
-
-  this.currentMessage = 2;
-  chrome.storage.sync.get.callsArgWith(1, {});
-  return this.butterBar.init().then(() => {
-    // Invoke the link.
-    this.butterBar.root_.getElementsByTagName('a')[0].click();
-    verifyLog(
-        assert, 0, MigrationEvent.DEPRECATION_NOTICE_IMPRESSION,
-        MigrationPhase.DEPRECATION_1)
-    verifyLog(
-        assert, 1, MigrationEvent.DEPRECATION_NOTICE_CLICKED,
-        MigrationPhase.DEPRECATION_1)
-  });
-});
-
-}());
diff --git a/remoting/webapp/crd/js/crd_main.js b/remoting/webapp/crd/js/crd_main.js
index 9c2c784..6cdb80d 100644
--- a/remoting/webapp/crd/js/crd_main.js
+++ b/remoting/webapp/crd/js/crd_main.js
@@ -82,9 +82,6 @@
   // Display the cached host list, then asynchronously update and re-display it.
   remoting.updateLocalHostState();
   remoting.hostList.refresh().then(remoting.updateLocalHostState);
-
-  remoting.butterBar = remoting.ButterBar.create();
-  remoting.butterBar.init();
 };
 
 /**
diff --git a/remoting/webapp/files.gni b/remoting/webapp/files.gni
index 72fd672..1dd5e78 100644
--- a/remoting/webapp/files.gni
+++ b/remoting/webapp/files.gni
@@ -97,7 +97,6 @@
   "base/js/xmpp_login_handler_unittest.js",
   "base/js/xmpp_stream_parser_unittest.js",
   "crd/js/apps_v2_migration_unittest.js",
-  "crd/js/butter_bar_unittest.js",
   "crd/js/combined_host_list_api_unittest.js",
   "crd/js/gcd_client_unittest.js",
   "crd/js/gcd_client_with_mock_xhr_unittest.js",
@@ -297,7 +296,6 @@
 # The CRD-specific JavaScript files required by main.html.
 remoting_webapp_crd_js_ui_files = [
   "crd/js/bump_scroller.js",
-  "crd/js/butter_bar.js",
   "crd/js/crd_auth_dialog.js",
   "crd/js/crd_event_handlers.js",
   "crd/js/crd_experimental.js",
diff --git a/sandbox/win/src/process_mitigations.cc b/sandbox/win/src/process_mitigations.cc
index 35280fec..08a9c894 100644
--- a/sandbox/win/src/process_mitigations.cc
+++ b/sandbox/win/src/process_mitigations.cc
@@ -5,12 +5,15 @@
 #include "sandbox/win/src/process_mitigations.h"
 
 #include <stddef.h>
+#include <windows.h>
+#include <wow64apiset.h>
 
 #include <algorithm>
 
 #include "base/files/file_path.h"
 #include "base/scoped_native_library.h"
 #include "base/win/windows_version.h"
+#include "build/build_config.h"
 #include "sandbox/win/src/nt_internals.h"
 #include "sandbox/win/src/restricted_token_utils.h"
 #include "sandbox/win/src/sandbox_rand.h"
@@ -59,6 +62,33 @@
   return &mitigations[0];
 }
 
+// Returns true if this is 32-bit Chrome running on ARM64 with emulation.
+// Needed because ACG does not work with emulated code.
+// See
+// https://docs.microsoft.com/en-us/windows/uwp/porting/apps-on-arm-troubleshooting-x86.
+// See https://crbug.com/977723.
+// TODO(wfh): Move this code into base. See https://crbug.com/978257.
+bool IsRunning32bitEmulatedOnArm64() {
+#if defined(ARCH_CPU_X86)
+  using IsWow64Process2Function = decltype(&IsWow64Process2);
+
+  IsWow64Process2Function is_wow64_process2 =
+      reinterpret_cast<IsWow64Process2Function>(::GetProcAddress(
+          ::GetModuleHandleA("kernel32.dll"), "IsWow64Process2"));
+  if (!is_wow64_process2)
+    return false;
+  USHORT process_machine;
+  USHORT native_machine;
+  bool retval = is_wow64_process2(::GetCurrentProcess(), &process_machine,
+                                  &native_machine);
+  if (!retval)
+    return false;
+  if (native_machine == IMAGE_FILE_MACHINE_ARM64)
+    return true;
+#endif  // defined(ARCH_CPU_X86)
+  return false;
+}
+
 }  // namespace
 
 namespace sandbox {
@@ -194,8 +224,9 @@
     return true;
 
   // Enable dynamic code policies.
-  if (flags & MITIGATION_DYNAMIC_CODE_DISABLE ||
-      flags & MITIGATION_DYNAMIC_CODE_DISABLE_WITH_OPT_OUT) {
+  if (!IsRunning32bitEmulatedOnArm64() &&
+      (flags & MITIGATION_DYNAMIC_CODE_DISABLE ||
+       flags & MITIGATION_DYNAMIC_CODE_DISABLE_WITH_OPT_OUT)) {
     PROCESS_MITIGATION_DYNAMIC_CODE_POLICY policy = {};
     policy.ProhibitDynamicCode = true;
 
diff --git a/services/device/generic_sensor/README.md b/services/device/generic_sensor/README.md
index a61c56f7..606bbbd 100644
--- a/services/device/generic_sensor/README.md
+++ b/services/device/generic_sensor/README.md
@@ -64,15 +64,15 @@
 
 | SensorType                        | Android                   | Linux                                 | macOS                                 | Windows                                   |
 | --------------------------------- | ------------------------- | ------------------------------------- | ------------------------------------- | ----------------------------------------- |
-| AMBIENT_LIGHT                     | TYPE_LIGHT                | in_illuminance                        | AppleLMUController                    | SENSOR_TYPE_AMBIENT_LIGHT                 |
+| AMBIENT_LIGHT                     | TYPE_LIGHT                | in_illuminance                        | AppleLMUController                    | Yes                                       |
 | PROXIMITY                         |                           |                                       |                                       |                                           |
-| ACCELEROMETER                     | TYPE_ACCELEROMETER        | in_accel                              | SMCMotionSensor                       | SENSOR_TYPE_ACCELEROMETER_3D              |
+| ACCELEROMETER                     | TYPE_ACCELEROMETER        | in_accel                              | SMCMotionSensor                       | Yes                                       |
 | LINEAR_ACCELEROMETER              | See below                 | ACCELEROMETER (*)                     |                                       | ACCELEROMETER (*)                         |
-| GYROSCOPE                         | TYPE_GYROSCOPE            | in_anglvel                            |                                       | SENSOR_TYPE_GYROMETER_3D                  |
-| MAGNETOMETER                      | TYPE_MAGNETIC_FIELD       | in_magn                               |                                       | SENSOR_TYPE_COMPASS_3D                    |
+| GYROSCOPE                         | TYPE_GYROSCOPE            | in_anglvel                            |                                       | Yes                                       |
+| MAGNETOMETER                      | TYPE_MAGNETIC_FIELD       | in_magn                               |                                       | Yes                                       |
 | PRESSURE                          |                           |                                       |                                       |                                           |
-| ABSOLUTE_ORIENTATION_EULER_ANGLES | See below                 | ACCELEROMETER and MAGNETOMETER (*)    |                                       | SENSOR_TYPE_INCLINOMETER_3D               |
-| ABSOLUTE_ORIENTATION_QUATERNION   | See below                 | ABSOLUTE_ORIENTATION_EULER_ANGLES (*) |                                       | SENSOR_TYPE_AGGREGATED_DEVICE_ORIENTATION |
+| ABSOLUTE_ORIENTATION_EULER_ANGLES | See below                 | ACCELEROMETER and MAGNETOMETER (*)    |                                       | Yes                                       |
+| ABSOLUTE_ORIENTATION_QUATERNION   | See below                 | ABSOLUTE_ORIENTATION_EULER_ANGLES (*) |                                       | Yes                                       |
 | RELATIVE_ORIENTATION_EULER_ANGLES | See below                 | ACCELEROMETER and GYROSCOPE (*)       | ACCELEROMETER (*)                     |                                           |
 |                                   |                           | or ACCELEROMETER (*)                  |                                       |                                           |
 | RELATIVE_ORIENTATION_QUATERNION   | TYPE_GAME_ROTATION_VECTOR | RELATIVE_ORIENTATION_EULER_ANGLES (*) | RELATIVE_ORIENTATION_EULER_ANGLES (*) |                                           |
@@ -132,13 +132,7 @@
 
 ### Windows
 
-Sensors are implemented by passing through values provided by the
-[Sensor API](https://msdn.microsoft.com/en-us/library/windows/desktop/dd318953(v=vs.85).aspx).
-The values in the "Windows" column of the table above correspond to the names of
-the sensor type GUIDs used to provide data for a SensorType. The
-LINEAR_ACCELEROMETER sensor type is provided by implementing a low-pass-filter
-over the values returned by the ACCELEROMETER in order to remove the
-contribution of the gravitational force.
+Please refer to this [document](windows/README.md).
 
 ## Testing
 
@@ -150,7 +144,6 @@
 
 Sensors browser tests are located in `content/test/data/generic_sensor`.
 
-
 ## Design Documents
 
 Please refer to the [design documentation](https://docs.google.com/document/d/1Ml65ZdW5AgIsZTszk4mD_ohr40pcrdVFOIf0ZtWxDv0)
diff --git a/services/device/generic_sensor/windows/README.md b/services/device/generic_sensor/windows/README.md
new file mode 100644
index 0000000..9207450
--- /dev/null
+++ b/services/device/generic_sensor/windows/README.md
@@ -0,0 +1,943 @@
+# Chromium Sensor Backend Modernization on Windows
+
+## 1. Summary
+
+Windows has two sets of sensor APIs:
+
+- [ISensor API](https://docs.microsoft.com/en-us/windows/desktop/sensorsapi/about-the-sensor-api): The COM sensor API on Windows, which is now deprecated.
+- [Windows.Devices.Sensors WinRT API](https://docs.microsoft.com/en-us/uwp/api/windows.devices.sensors): The WinRT sensor API on Windows.
+
+This document outlines the current ISensor based Chromium sensor backend on
+Windows and the newly proposed Windows.Devices.Sensors based
+implementation. It is laid out as follows:
+
+1. Summary
+2. General Chromium Sensor Backend Model
+3. Current ISensor Chromium Sensor Backend Model on Windows
+4. Proposed Windows.Devices.Sensors Chromium Sensor Backend Model on Windows
+5. Chromium Feature Flag
+6. Metrics
+7. Incremental Change Plan
+8. Appendix
+
+Note: This document has sections that read like a future looking document,
+(e.g. "will do this..." and "proposed design...") as the
+Windows.Devices.Sensors parts have not been implemented. Once they are
+implemented, those sections will be updated to present tense and have the
+corresponding sample code removed.
+
+## 2. General Chromium Sensor Backend Model
+
+For context, the Chromium sensor backend is abstracted into these
+interfaces:
+
+- SensorProvider – Sensor factory class responsible for discovering
+  sensors on system, querying capabilities, and creating new sensor
+  instances.
+- Sensor – Sensor device wrapper class used to control the sensor.
+- SensorClient – Event class that observes sensor reading changes
+  and error conditions.
+
+These interfaces are ultimately what the
+[W3C sensor interface](https://www.w3.org/TR/generic-sensor/)
+communicates with - each platform has its own implementation.
+
+## 3. Current ISensor Chromium Sensor Backend Model on Windows
+
+The following diagram shows the ISensor based Chromium backend
+implementation on Windows:
+
+![Current Chromium Sensor Backend](chromium_sensor_backend_windows_isensor.png)
+
+The implementation contains three main classes:
+
+- PlatformSensorProviderWin
+  - Windows implementation of the SensorProvider interface. It
+    is responsible for the creation of PlatformSensorWin and
+    PlatformSensorReaderWin. It also manages ISensorManager
+    (overall manager for the ISensor API) and the sensor thread where
+    all COM objects are created.
+- PlatformSensorWin
+  - Windows implementation of the Sensor and SensorClient
+  interface, manages the state of PlatformSensorReaderWin.
+- PlatformSensorReaderWin
+  - Wrapper class around an ISensor instance.
+
+The following diagram shows the typical usage flow:
+
+![Current Chromium Sensor Backend Flow](chromium_sensor_backend_windows_isensor_flow.png)
+
+Support for the SensorTypes defined by the Mojo interface
+on Windows is summarized below:
+
+| SensorType                        | Sensor GUID                               |
+| --------------------------------- | ----------------------------------------- |
+| AMBIENT_LIGHT                     | SENSOR_TYPE_AMBIENT_LIGHT                 |
+| ACCELEROMETER                     | SENSOR_TYPE_ACCELEROMETER_3D              |
+| LINEAR_ACCELEROMETER              | *                                         |
+| GYROSCOPE                         | SENSOR_TYPE_GYROMETER_3D                  |
+| MAGNETOMETER                      | SENSOR_TYPE_COMPASS_3D                    |
+| ABSOLUTE_ORIENTATION_EULER_ANGLES | SENSOR_TYPE_INCLINOMETER_3D               |
+| ABSOLUTE_ORIENTATION_QUATERNION   | SENSOR_TYPE_AGGREGATED_DEVICE_ORIENTATION |
+
+*The LINEAR_ACCELEROMETER sensor type is provided by
+implementing a low-pass-filter over the values returned by the
+ACCELEROMETER in order to remove the contribution of the gravitational
+force.
+
+The "Sensor GUID" column specifies the names of the sensor type GUIDs
+used to provide data for a SensorType. Any SensorType not mentioned by
+this table are not supported on Windows.
+
+## 4. Proposed Windows.Devices.Sensors Chromium Sensor Backend Model on Windows
+
+The overall sensor backend design on Windows will remain the same
+(as detailed in section 3). The classes which take a direct dependency
+on the ISensor API will have their interfaces abstracted out and
+reimplemented with Windows.Devices.Sensors:
+
+- The PlatformSensorProviderWin class:
+  - platform_sensor_provider_win.h
+  - platform_sensor_provider_win.cc
+- The PlatformSensorReaderWin class:
+  - platform_sensor_reader_win.h
+  - platform_sensor_reader_win.cc
+
+This allows the other classes, which are agnostic to the underlying API,
+to interchangeability use the ISensor vs. Windows.Devices.Sensors
+implementation. This is advantageous as the two implementations will need
+to live side by side.
+
+The Windows.Devices.Sensors APIs do not currently support thresholding,
+but is coming in a future release of Windows. This means a (slight)
+performance degredation will occur if the Windows.Devices.Sensors APIs are
+used as is since the ISensor implementation is utilizing thresholding while
+Windows.Devices.Sensors can only support streaming. So the Chromium backend
+will switch to use the ISensor implementation on versions of Windows that
+do not have WinRT thresholding support and will use the Windows.Devices.Sensors
+implementation for those that do.
+
+This section is split into two main parts:
+
+- Modifying the Chromium sensor backend on Windows to support adapting
+  between the ISensor and Windows.Devices.Sensors path.
+- Outlining the new Windows.Devices.Sensors implementation.
+
+### 4.1 Support For Adapting Between ISensor and Windows.Devices.Sensors Sensor Implementations
+
+The `PlatformSensorProvider::GetInstance()` function decides which
+PlatformSensorProvider implementation to use. A new branch will be
+added for the Windows.Devices.Sensors path:
+
+```cpp
+PlatformSensorProvider* PlatformSensorProvider::GetInstance() {
+  if (g_provider_for_testing)
+    return g_provider_for_testing;
+#if defined(OS_MACOSX)
+  return PlatformSensorProviderMac::GetInstance();
+#elif defined(OS_ANDROID)
+  return PlatformSensorProviderAndroid::GetInstance();
+#elif defined(OS_WIN)
+  if (PlatformSensorProvider::UseWindowsWinrt()) {
+    // Windows.Devices.Sensors Windows implementation
+    return PlatformSensorProviderWinrt::GetInstance(); 
+  } else {
+    // ISensor Windows implementation
+    return PlatformSensorProviderWin::GetInstance(); 
+  }
+#elif defined(OS_LINUX) && defined(USE_UDEV)
+  return PlatformSensorProviderLinux::GetInstance();
+#else
+  return nullptr;
+#endif
+}
+```
+
+With `PlatformSensorProvider::UseWindowsWinrt()` being:
+
+```cpp
+bool PlatformSensorProvider::UseWindowsWinrt() {
+  return base::FeatureList::IsEnabled(kWinrtSensorsImplementation) &&
+      (base::win::GetVersion() >= base::win::Version::WIN10);
+}
+```
+
+The Windows.Devices.Sensors path is also decided on the
+`kWinrtSensorsImplementation` feature flag, which is explained further in
+section 5 below.
+
+### 4.2 Proposed Windows.Devices.Sensors Sensor Implementation
+
+The overall Windows.Devices.Sensors design is the same as the current design
+detailed in section 3 except the classes that take a dependency on the ISensor
+API will be reimplemented with these new classes:
+
+- PlatformSensorProviderWinrt
+  - Windows.Devices.Sensors based implementation of PlatformSensorProvider,
+    functional equivalent of PlatformSensorProviderWin.
+- PlatformSensorReaderWinrt
+  - Wrapper class around the actual Windows.Devices.Sensors APIs, functional
+    equivalent of PlatformSensorReaderWin.
+
+#### 4.2.1 PlatformSensorProviderWinrt
+
+Similar to PlatformSensorProviderWin, but with the ISensorManager
+references removed. This is the header for the class:
+
+```cpp
+class PlatformSensorProviderWinrt final : public PlatformSensorProvider {
+ public:
+  static PlatformSensorProviderWinrt* GetInstance();
+
+  void SetSensorReaderCreatorForTesting(
+      std::unique_ptr<SensorReaderCreator> sensor_reader_creator);
+
+ protected:
+  ~PlatformSensorProviderWinrt() override;
+
+  // Base class calls this function to create sensor instances.
+  void CreateSensorInternal(mojom::SensorType type,
+                            SensorReadingSharedBuffer* reading_buffer,
+                            const CreateSensorCallback& callback) override;
+
+ private:
+  friend struct base::DefaultSingletonTraits<PlatformSensorProviderWinrt>;
+
+  PlatformSensorProviderWinrt();
+
+  std::unique_ptr<PlatformSensorReaderWin> CreateSensorReader(
+      mojom::SensorType type);
+  void SensorReaderCreated(
+      mojom::SensorType type,
+      SensorReadingSharedBuffer* reading_buffer,
+      const CreateSensorCallback& callback,
+      std::unique_ptr<PlatformSensorReaderWin> sensor_reader);
+
+  scoped_refptr<base::SingleThreadTaskRunner> com_sta_task_runner_;
+
+  std::unique_ptr<SensorReaderCreator> sensor_reader_creator_;
+
+  DISALLOW_COPY_AND_ASSIGN(PlatformSensorProviderWinrt);
+};
+```
+
+The `SensorReaderCreator` interface is simply a wrapper around the
+`PlatformSensorReaderWinrt::Create(type)` call and allows unit tests
+to mock it out.
+
+For brevity, the implementation has been deferred to section 8.1 in
+the appendix.
+
+Required mocks for unit testing:
+
+- Create a mock PlatformSensorReaderWinrt class.
+- Mock `PlatformSensorReaderWinrt::Create()` by injecting a
+  `MockSensorReaderCreator` so when PlatformSensorProviderWinrt
+  attempts to create a sensor reader, it returns a mocked instance
+  instead of one that calls into the Windows.Devices.Sensors APIs.
+
+Unit test cases for this class are detailed in section 7.
+
+#### 4.2.2 PlatformSensorReaderWinrt
+
+The existing PlatformSensorReaderWin class will be pulled out into
+its own interface:
+
+```cpp
+class PlatformSensorReaderWinBase {
+ public:
+  static std::unique_ptr<PlatformSensorReaderWin> Create(
+      mojom::SensorType type);
+
+  // Following methods are thread safe.
+  virtual void SetClient(Client* client) = 0;
+  virtual unsigned long GetMinimalReportingIntervalMs() const = 0;
+  virtual bool StartSensor(const PlatformSensorConfiguration& configuration) = 0;
+  virtual void StopSensor() = 0;
+
+  // Must be destructed on the same thread that was used during construction.
+  virtual ~PlatformSensorReaderWin() = default;
+}
+```
+
+The existing (ISensor) PlatformSensorReaderWin class and new
+(Windows.Devices.Sensors) PlatformSensorReaderWinrt class will inherit from
+this interface so both classes can be interchangeably used with the
+ISensor/Windows.Devices.Sensors agnostic PlatformSensorWin, which simply
+consumes the PlatformSensorReaderWinBase interface.
+
+Since there are several Windows.Devices.Sensors sensor functions which are
+identical between the different sensor types, an abstract class will
+encapsulate the common functionality.
+
+`platform_sensor_reader_winrt.h`:
+
+```cpp
+
+// Base class for PlatformSensorReaderWinrt*, contains common helper
+// functions used between all WinRT sensors. Derived classes will
+// specialize into a specific sensor and are expected to pass in
+// the correct WinRT interfaces into the template.
+//
+// See PlatformSensorReaderWinrtLightSensor as an example for
+// what WinRT interfaces should be passed in.
+template <wchar_t const* runtime_class_id,
+          class ISensorWinrtStatics,
+          class ISensorWinrtClass,
+          class ISensorReadingChangedHandler,
+          class ISensorReadingChangedEventArgs>
+class PlatformSensorReaderWinrtBase : public PlatformSensorReaderWin {
+ public:
+  bool Initialize();
+
+  // Sets the client to notify changes about.
+  void SetClient(Client* client) override;
+
+  // Allows tests to specify their own implementation of the underlying sensor.
+  void InitForTests(Microsoft::WRL::ComPtr<ISensorWinrtClass> sensor) {
+    sensor_ = sensor;
+
+    sensor_->get_MinimumReportInterval(&minimum_report_interval_);
+  }
+
+  bool StartSensor(const PlatformSensorConfiguration& configuration) override;
+  unsigned long GetMinimalReportingIntervalMs() const override;
+  void StopSensor() override;
+
+ protected:
+  virtual HRESULT OnReadingChangedCallback(
+      ISensorWinrtClass* sensor,
+      ISensorReadingChangedEventArgs* reading_changed_args) = 0;
+
+  // Helper function which converts the DateTime format the WinRT API
+  // uses to second time ticks the client expects.
+  HRESULT ConvertSensorReadingTimeStamp(
+      ABI::Windows::Foundation::DateTime date_time_to_convert,
+      double* time_ticks_seconds);
+
+  // Following class members are protected by lock, because SetClient,
+  // StartSensor and StopSensor are called from another thread by
+  // PlatformSensorWin that can modify internal state of the object.
+  base::Lock lock_;
+  // Null if there is no client to notify, non-null otherwise.
+  Client* client_;
+  // base::nullopt if the sensor has not been started, non-empty otherwise.
+  base::Optional<EventRegistrationToken> reading_callback_token_;
+
+  UINT32 minimum_report_interval_{};
+  Microsoft::WRL::ComPtr<ISensorWinrtClass> sensor_;
+};
+```
+
+Each sensor type will derive from the PlatformSensorReaderWinrtBase
+abstract class. Below is an example for the light sensor:
+
+`platform_sensor_reader_winrt.h`:
+
+```cpp
+class PlatformSensorReaderWinrtLightSensor final
+    : public PlatformSensorReaderWinrtBase<
+          RuntimeClass_Windows_Devices_Sensors_LightSensor,
+          ABI::Windows::Devices::Sensors::ILightSensorStatics,
+          ABI::Windows::Devices::Sensors::ILightSensor,
+          Microsoft::WRL::Implements<
+              Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::ClassicCom>,
+              ABI::Windows::Foundation::ITypedEventHandler<
+                  ABI::Windows::Devices::Sensors::LightSensor*,
+                  ABI::Windows::Devices::Sensors::
+                      LightSensorReadingChangedEventArgs*>,
+              Microsoft::WRL::FtmBase>,
+          ABI::Windows::Devices::Sensors::ILightSensorReadingChangedEventArgs> {
+ public:
+  static std::unique_ptr<PlatformSensorReaderWin> Create();
+
+  PlatformSensorReaderWinrtLightSensor();
+
+ protected:
+  HRESULT OnReadingChangedCallback(
+      ABI::Windows::Devices::Sensors::ILightSensor* sensor,
+      ABI::Windows::Devices::Sensors::ILightSensorReadingChangedEventArgs*
+          reading_changed_args) override;
+
+ private:
+  float last_reported_lux_{};
+
+  DISALLOW_COPY_AND_ASSIGN(PlatformSensorReaderWinrtLightSensor);
+};
+```
+
+The implementation for PlatformSensorReaderWinrtBase and
+PlatformSensorReaderWinrtLightSensor have been deferred to section 8.2
+and 8.3 of the appendix for brevity.
+
+Lastly, PlatformSensorReaderWinrt::Create will choose which derived
+PlatformSensorReaderWin class to instantiate based on the requested
+sensor type:
+
+```cpp
+std::unique_ptr<PlatformSensorReaderWin> PlatformSensorReaderWinrt::Create(
+    mojom::SensorType type) {
+    case mojom::SensorType::AMBIENT_LIGHT:
+      return PlatformSensorReaderWinrtLightSensor::Create();
+    case mojom::SensorType::ACCELEROMETER:
+      return PlatformSensorReaderWinrtAccelerometer::Create();
+    ...
+    default:
+      NOTIMPLEMENTED();
+      return nullptr;
+  }
+}
+```
+
+Required mocks for unit testing:
+
+- Implement the mock Windows.Devices.Sensors interface classes.
+- At the start of the unit test, inject the mock Windows.Devices.Sensors class
+  to use via `InitForTests()`.
+
+Unit test cases for this class are detailed in section 7.
+
+## 5. Chromium Feature Flag
+
+The new Windows.Devices.Sensors sensor implementation will be hidden under a new
+[Chromium feature flag](https://www.chromium.org/developers/how-tos/run-chromium-with-flags).
+If this flag is enabled and the system meets the Windows version, then
+the Windows.Devices.Sensors path will be used for sensors. Otherwise, the
+ISensor path will be used.
+
+While the modernization changes are being made, this flag will be kept
+as `base::FEATURE_DISABLED_BY_DEFAULT`. Afterwards, experimentation will
+be used to enable this flag by default for a subset of the population.
+Once we have confidence the new implementation is reliable, then the
+flag will be moved to `base::FEATURE_ENABLED_BY_DEFAULT` for everyone.
+
+## 6. Metrics
+
+Below are the two main areas where reliability issues may occur, metrics
+will be put in place to measure them:
+
+- Measure sensor creation failures:
+  - Captures HRESULTs thrown from Windows.Devices.Sensors sensor creation
+    failure: `GetDefault()`.
+  - Metric will come in form of a [sparse histogram](https://chromium.googlesource.com/chromium/src.git/+/HEAD/tools/metrics/histograms/README.md#When-To-Use-Sparse-Histograms)
+    where the labels are the HRESULT error and the values are the number of
+    times the label has been hit.
+- Measure sensor start failures:
+  - Captures HRESULTs thrown from Windows.Devices.Sensors sensor start
+    failure: `add_ReadingChanged()`.
+  - Metric will come in form of a [sparse histogram](https://chromium.googlesource.com/chromium/src.git/+/HEAD/tools/metrics/histograms/README.md#When-To-Use-Sparse-Histograms)
+    where the labels are the HRESULT error and the values are the number
+    of times the label has been hit.
+
+This metric will be compared with the existing ISensor failure rate to define
+the measure for success.
+
+No performance metrics will be put in Chromium. The reason is twofold:
+
+- Potential changes in CPU usage from the Windows sensor stack is not
+  measured.
+- The Windows sensor team has recorded the end to end performance
+  (sensor stack + Chromium) of these two implementations using Windows
+  Performance Analyzer:
+  - Current ISensor implementation.
+  - The new Windows.Devices.Sensors implementation, but with the Chromium
+    backend applying thresholding (since the Windows.Devices.Sensors APIs
+    don't currently support builtin thresholding).
+
+The performance delta of the Windows.Devices.Sensors implementation was a
++0.47% total system CPU increase. This should drop to a zero or negative delta
+with the real Windows.Devices.Sensors implementation that supports builtin
+thresholding.
+
+## 7. Incremental Change Plan
+
+The modernization changes will be broken down into several incremental
+changes to keep change lists to a reviewable size:
+
+#### Change list 1: Define the interface for PlatformSensorProviderWinrt and consume it
+
+- Feature Work:
+  - Create the PlatformSensorProviderWinrt header as defined in
+    Section 8.1.
+  - Create the Chromium feature flag as defined in Section 5 following
+    these [steps](https://chromium.googlesource.com/chromium/src/+/HEAD/docs/how_to_add_your_feature_flag.md).
+  - Modify `PlatformSensorProvider::GetInstance()` to conditionally
+    create PlatformSensorProviderWinrt as defined in section 4.1.
+- Testing:
+  - Add a simple test to validate that PlatformSensorProviderWinrt
+    can be instantiated without errors.
+  - Run feature flag unit test as defined
+    [here](https://chromium.googlesource.com/chromium/src/+/HEAD/docs/how_to_add_your_feature_flag.md).
+
+#### Change list 2: Implement PlatformSensorProviderWinrt
+
+- Feature Work:
+  - Fill in the implementation for PlatformSensorProviderWinrt as
+    defined in section 8.1.
+- Testing:
+  - Add unit tests for PlatformSensorProviderWinrt:
+    - Validate `CreateSensorCallback()` is given null if the sensor
+      type does not exist on system. This involves mocking
+      `PlatformSensorReaderWinrt::Create()` so it returns null.
+    - Validate `CreateSensorCallback()` is given non-null if the
+      sensor does exist on system. This involves mocking
+      `PlatformSensorReaderWinrt::Create()` so it returns a non-null
+      PlatformSensorReaderWinrt.
+    - Validate `CreateSensorCallback()` is given null if the sensor
+      type is not supported (e.g. SensorType::PRESSURE). This involves
+      mocking `PlatformSensorReaderWinrt::Create()` so it returns null.
+
+#### Change list 3: Define the interface for PlatformSensorReaderWinBase and implement PlatformSensorReaderWinrtBase
+
+- Feature Work:
+  - Extract the PlatformSensorReaderWin interface into its own file as
+    defined in section 4.2.2.
+  - Create and implement PlatformSensorReaderWinrtBase as defined in
+    section 8.2.
+- Testing:
+  - Add unit tests for PlatformSensorReaderWinrtBase:
+    - Validate `ConvertSensorReadingTimeStamp()` correctly converts
+      Windows.Devices.Sensors DateTime to base::TimeTick.
+    - Validate `GetMinimalReportingIntervalMs()` returns the correct
+      minimum report interval.
+    - Validate `StartSensor()` and `StopSensor()` registers and
+      unregisters for Windows.Devices.Sensors reading change notifications.
+    - Validate a client notification occurs when a new sample is
+      reported.
+
+#### Change list 4: Implement PlatformSensorReaderWinrtLightSensor
+
+- Feature Work:
+  - Create and implement PlatformSensorReaderWinrtLightSensor as
+    defined in section 8.3.
+- Testing
+  - Add unit tests for PlatformSensorReaderWinrtLightSensor:
+    - Create a mock ILightSensor class.
+    - Validate PlatformSensorReaderWinrtLightSensor correctly
+      parses new Windows.Devices.Sensors samples and the client
+      receives the expected lux level.
+
+#### Change list 5-8: Implement the rest of the sensors
+
+- Feature Work:
+  - Same as CL 4 but implementing the accelerometer, gyroscope,
+    magnetometer, and absolute orientation classes.
+- Testing
+  - Same as CL 4 but implementing unit tests for the accelerometer,
+    gyroscope, magnetometer, and absolute orientation classes.
+
+Each sensor class will have its own corresponding CL, so this
+section actually represents four separate CLs.
+
+#### Change list 9: Add metrics
+
+- Feature Work:
+  - Add metrics as defined in section 6 following these
+    [steps](https://chromium.googlesource.com/chromium/src.git/+/HEAD/tools/metrics/histograms/README.md#Enum-Histograms).
+- Testing
+  - Create unit tests for new histograms, see [HistogramTester](https://cs.chromium.org/chromium/src/base/test/metrics/histogram_tester.h?q=HistogramTester&sq=package:chromium&dr=CSs&l=25)
+    as an example.
+  - Run histogram tests as defined [here](https://chromium.googlesource.com/chromium/src.git/+/HEAD/tools/metrics/histograms/README.md#Testing).
+
+#### Change list 10: Roll out new Windows.Devices.Sensors implementation to users
+
+- Feature Work:
+  - Use experimentation process to roll out the new implementation
+    (e.g. only enable for 5% of canary population). *Will need guidance from Chromium on how this process is done.*
+- Testing
+  - Build Chromium and manually verify the reported samples are the
+    expected values.
+
+#### Change list 11: Enable Windows.Devices.Sensors implementation by default
+
+- Feature Work:
+  - Change the feature flag to enabled by default so it is enabled for
+    all users.
+
+## 8. Appendix
+
+### 8.1 PlatformSensorProviderWinrt Implementation
+
+`platform_sensor_provider_winrt.h`
+
+Located in section 4.2.1 above.
+
+`platform_sensor_provider_winrt.cc`
+
+```cpp
+std::unique_ptr<PlatformSensorReaderWin>
+SensorReaderCreator::CreateSensorReader(mojom::SensorType type) {
+  return PlatformSensorReaderWinrt::Create(type);
+}
+
+// static
+PlatformSensorProviderWinrt* PlatformSensorProviderWinrt::GetInstance() {
+  return base::Singleton<
+      PlatformSensorProviderWinrt,
+      base::LeakySingletonTraits<PlatformSensorProviderWinrt>>::get();
+}
+
+PlatformSensorProviderWinrt::PlatformSensorProviderWinrt()
+    : com_sta_task_runner_(base::CreateCOMSTATaskRunnerWithTraits(
+          base::TaskPriority::USER_VISIBLE)),
+      sensor_reader_creator_(std::make_unique<SensorReaderCreator>()) {}
+
+PlatformSensorProviderWinrt::~PlatformSensorProviderWinrt() = default;
+
+void PlatformSensorProviderWinrt::SetSensorReaderCreatorForTesting(
+    std::unique_ptr<SensorReaderCreator> sensor_reader_creator) {
+  sensor_reader_creator_ = std::move(sensor_reader_creator);
+}
+
+void PlatformSensorProviderWinrt::CreateSensorInternal(
+    mojom::SensorType type,
+    SensorReadingSharedBuffer* reading_buffer,
+    const CreateSensorCallback& callback) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+  switch (type) {
+    // Fusion sensor.
+    case mojom::SensorType::LINEAR_ACCELERATION: {
+      auto linear_acceleration_fusion_algorithm = std::make_unique<
+          LinearAccelerationFusionAlgorithmUsingAccelerometer>();
+      // If this PlatformSensorFusion object is successfully initialized,
+      // |callback| will be run with a reference to this object.
+      PlatformSensorFusion::Create(
+          reading_buffer, this, std::move(linear_acceleration_fusion_algorithm),
+          callback);
+      break;
+    }
+
+    // Try to create low-level sensors by default.
+    default: {
+      base::PostTaskAndReplyWithResult(
+          com_sta_task_runner_.get(), FROM_HERE,
+          base::Bind(&PlatformSensorProviderWinrt::CreateSensorReader,
+                     base::Unretained(this), type),
+          base::Bind(&PlatformSensorProviderWinrt::SensorReaderCreated,
+                     base::Unretained(this), type, reading_buffer, callback));
+      break;
+    }
+  }
+}
+
+void PlatformSensorProviderWinrt::SensorReaderCreated(
+    mojom::SensorType type,
+    SensorReadingSharedBuffer* reading_buffer,
+    const CreateSensorCallback& callback,
+    std::unique_ptr<PlatformSensorReaderWin> sensor_reader) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  if (!sensor_reader) {
+    // Fallback options for sensors that can be implemented using sensor
+    // fusion. Note that it is important not to generate a cycle by adding a
+    // fallback here that depends on one of the other fallbacks provided.
+    switch (type) {
+      case mojom::SensorType::ABSOLUTE_ORIENTATION_EULER_ANGLES: {
+        auto algorithm = std::make_unique<
+            OrientationEulerAnglesFusionAlgorithmUsingQuaternion>(
+            true /* absolute */);
+        PlatformSensorFusion::Create(reading_buffer, this, std::move(algorithm),
+                                     std::move(callback));
+        return;
+      }
+      default:
+        callback.Run(nullptr);
+        return;
+    }
+  }
+
+  scoped_refptr<PlatformSensor> sensor =
+      new PlatformSensorWin(type, reading_buffer, this, com_sta_task_runner_,
+                            std::move(sensor_reader));
+  callback.Run(sensor);
+}
+
+std::unique_ptr<PlatformSensorReaderWin>
+PlatformSensorProviderWinrt::CreateSensorReader(mojom::SensorType type) {
+  DCHECK(com_sta_task_runner_->RunsTasksInCurrentSequence());
+
+  return sensor_reader_creator_->CreateSensorReader(type);
+}
+```
+
+### 8.2 PlatformSensorReaderWinrtBase Implementation
+
+`platform_sensor_reader_winrt.h`:
+
+Located in section 4.2.2 above.
+
+`platform_sensor_reader_winrt.cpp`:
+
+```cpp
+
+template <wchar_t const* runtime_class_id,
+          class ISensorWinrtStatics,
+          class ISensorWinrtClass,
+          class ISensorReadingChangedHandler,
+          class ISensorReadingChangedEventArgs>
+void PlatformSensorReaderWinrtBase<
+    runtime_class_id,
+    ISensorWinrtStatics,
+    ISensorWinrtClass,
+    ISensorReadingChangedHandler,
+    ISensorReadingChangedEventArgs>::SetClient(Client* client) {
+  base::AutoLock autolock(lock_);
+
+  client_ = client;
+}
+
+template <wchar_t const* runtime_class_id,
+          class ISensorWinrtStatics,
+          class ISensorWinrtClass,
+          class ISensorReadingChangedHandler,
+          class ISensorReadingChangedEventArgs>
+HRESULT PlatformSensorReaderWinrtBase<runtime_class_id,
+                                      ISensorWinrtStatics,
+                                      ISensorWinrtClass,
+                                      ISensorReadingChangedHandler,
+                                      ISensorReadingChangedEventArgs>::
+    ConvertSensorReadingTimeStamp(
+        ABI::Windows::Foundation::DateTime date_time_to_convert,
+        double* time_ticks_seconds) {
+  // Convert the DateTime into SYSTEMTIME through a series of
+  // intermediary conversions.
+  ULARGE_INTEGER date_time_converted{};
+  date_time_converted.QuadPart = date_time_to_convert.UniversalTime;
+
+  FILETIME file_time{};
+  file_time.dwHighDateTime = date_time_converted.HighPart;
+  file_time.dwLowDateTime = date_time_converted.LowPart;
+
+  SYSTEMTIME system_time{};
+  if (!FileTimeToSystemTime(&file_time, &system_time)) {
+    return HRESULT_FROM_WIN32(GetLastError());
+  }
+
+  // Convert the SYSTEMTIME into base::Time
+  base::Time::Exploded exploded{};
+  exploded.year = system_time.wYear;
+  exploded.month = system_time.wMonth;
+  exploded.day_of_week = system_time.wDayOfWeek;
+  exploded.day_of_month = system_time.wDay;
+  exploded.hour = system_time.wHour;
+  exploded.minute = system_time.wMinute;
+  exploded.second = system_time.wSecond;
+  exploded.millisecond = system_time.wMilliseconds;
+
+  base::Time converted_time{};
+  if (!base::Time::FromUTCExploded(exploded, &converted_time)) {
+    return E_FAIL;
+  }
+
+  // Lastly, convert the base::Time into base::TimeTicks()
+  base::TimeTicks ticks_now = base::TimeTicks::Now();
+  base::Time time_now = base::Time::NowFromSystemTime();
+  base::TimeDelta delta = time_now - converted_time;
+
+  *time_ticks_seconds = ((ticks_now - delta) - base::TimeTicks()).InSecondsF();
+
+  return S_OK;
+}
+
+template <wchar_t const* runtime_class_id,
+          class ISensorWinrtStatics,
+          class ISensorWinrtClass,
+          class ISensorReadingChangedHandler,
+          class ISensorReadingChangedEventArgs>
+bool PlatformSensorReaderWinrtBase<
+    runtime_class_id,
+    ISensorWinrtStatics,
+    ISensorWinrtClass,
+    ISensorReadingChangedHandler,
+    ISensorReadingChangedEventArgs>::Initialize() {
+  ComPtr<ISensorWinrtStatics> sensor_statics;
+  HRESULT hr =
+      base::win::GetActivationFactory<ISensorWinrtStatics, runtime_class_id>(
+          &sensor_statics);
+
+  if (FAILED(hr))
+    return false;
+
+  if (FAILED(sensor_statics->GetDefault(&sensor_)))
+    return false;
+
+  // GetDefault() returns null if the sensor does not exist
+  if (!sensor_)
+    return false;
+
+  // OK if this fails, sensor will fallback to 0 which the consumer
+  // handles gracefully
+  hr = sensor_->get_MinimumReportInterval(&minimum_report_interval_);
+  if (FAILED(hr)) {
+    LOG(WARNING) << "Failed to query sensor minimum report interval: "
+                 << logging::SystemErrorCodeToString(hr);
+  }
+
+  return true;
+}
+
+template <wchar_t const* runtime_class_id,
+          class ISensorWinrtStatics,
+          class ISensorWinrtClass,
+          class ISensorReadingChangedHandler,
+          class ISensorReadingChangedEventArgs>
+unsigned long PlatformSensorReaderWinrtBase<
+    runtime_class_id,
+    ISensorWinrtStatics,
+    ISensorWinrtClass,
+    ISensorReadingChangedHandler,
+    ISensorReadingChangedEventArgs>::GetMinimalReportingIntervalMs() const {
+  return minimum_report_interval_;
+}
+
+template <wchar_t const* runtime_class_id,
+          class ISensorWinrtStatics,
+          class ISensorWinrtClass,
+          class ISensorReadingChangedHandler,
+          class ISensorReadingChangedEventArgs>
+bool PlatformSensorReaderWinrtBase<runtime_class_id,
+                                   ISensorWinrtStatics,
+                                   ISensorWinrtClass,
+                                   ISensorReadingChangedHandler,
+                                   ISensorReadingChangedEventArgs>::
+    StartSensor(const PlatformSensorConfiguration& configuration) {
+  base::AutoLock autolock(lock_);
+
+  if (!reading_callback_token_) {
+    EventRegistrationToken event_token;
+
+    unsigned int interval =
+        (1 / configuration.frequency()) * base::Time::kMillisecondsPerSecond;
+
+    auto hr = sensor_->put_ReportInterval(interval);
+
+    if (FAILED(hr)) {
+      LOG(ERROR) << "Failed to set report interval: "
+                 << logging::SystemErrorCodeToString(hr);
+
+      return false;
+    }
+
+    auto reading_changed_handler = Callback<ISensorReadingChangedHandler>(
+        this, &PlatformSensorReaderWinrtBase::OnReadingChangedCallback);
+
+    hr = sensor_->add_ReadingChanged(reading_changed_handler.Get(),
+                                     &event_token);
+
+    if (FAILED(hr)) {
+      LOG(ERROR) << "Failed to add reading callback handler: "
+                 << logging::SystemErrorCodeToString(hr);
+
+      return false;
+    }
+
+    reading_callback_token_ =
+        base::make_optional<EventRegistrationToken>(event_token);
+  }
+
+  return true;
+}
+
+template <wchar_t const* runtime_class_id,
+          class ISensorWinrtStatics,
+          class ISensorWinrtClass,
+          class ISensorReadingChangedHandler,
+          class ISensorReadingChangedEventArgs>
+void PlatformSensorReaderWinrtBase<
+    runtime_class_id,
+    ISensorWinrtStatics,
+    ISensorWinrtClass,
+    ISensorReadingChangedHandler,
+    ISensorReadingChangedEventArgs>::StopSensor() {
+  base::AutoLock autolock(lock_);
+
+  if (reading_callback_token_) {
+    HRESULT hr =
+        sensor_->remove_ReadingChanged(reading_callback_token_.value());
+
+    if (FAILED(hr)) {
+      LOG(ERROR) << "Failed to remove ALS reading callback handler: "
+                 << logging::SystemErrorCodeToString(hr);
+    }
+
+    reading_callback_token_ = base::nullopt;
+  }
+}
+```
+
+### 8.3 PlatformSensorReaderWinrtLightSensor Implementation
+
+`platform_sensor_reader_winrt.h`:
+
+Located in section 4.2.2 above.
+
+`platform_sensor_reader_winrt.cpp`:
+
+```cpp
+// static
+std::unique_ptr<PlatformSensorReaderWin>
+PlatformSensorReaderWinrtLightSensor::Create() {
+  auto light_sensor = std::make_unique<PlatformSensorReaderWinrtLightSensor>();
+  if (!light_sensor->Initialize())
+    return nullptr;
+
+  return light_sensor;
+}
+
+PlatformSensorReaderWinrtLightSensor::PlatformSensorReaderWinrtLightSensor() { }
+
+HRESULT PlatformSensorReaderWinrtLightSensor::OnReadingChangedCallback(
+    ILightSensor* light_sensor,
+    ILightSensorReadingChangedEventArgs* reading_changed_args) {
+  SensorReading reading;
+  ComPtr<ILightSensorReading> light_sensor_reading;
+
+  HRESULT hr = reading_changed_args->get_Reading(&light_sensor_reading);
+
+  if (FAILED(hr)) {
+    LOG(ERROR) << "Failed to get the sensor reading: "
+               << logging::SystemErrorCodeToString(hr);
+    return hr;
+  }
+
+  float lux{};
+  hr = light_sensor_reading->get_IlluminanceInLux(&lux);
+
+  if (FAILED(hr)) {
+    LOG(ERROR) << "Failed to get the lux level: "
+               << logging::SystemErrorCodeToString(hr);
+    return hr;
+  }
+
+  DateTime timestamp{};
+  hr = light_sensor_reading->get_Timestamp(&timestamp);
+
+  if (FAILED(hr)) {
+    LOG(ERROR) << "Failed to get the sensor reading timestamp: "
+               << logging::SystemErrorCodeToString(hr);
+    return hr;
+  }
+
+  double time_ticks_seconds{};
+  hr = ConvertSensorReadingTimeStamp(timestamp, &time_ticks_seconds);
+  if (FAILED(hr)) {
+    LOG(ERROR) << "Failed to convert sensor reading timestamp format: "
+               << logging::SystemErrorCodeToString(hr);
+    return hr;
+  }
+
+  reading.als.value = lux;
+  reading.als.timestamp = time_ticks_seconds;
+
+  // The WinRT API currently only supports streaming so it is possible
+  // to get sequential sensor readings with identical lux values. In
+  // this case, the client should not be notified of a reading change.
+  if ((lux != last_reported_lux_) && client_) {
+    client_->OnReadingUpdated(reading);
+
+    last_reported_lux_ = lux;
+  }
+
+  return S_OK;
+}
+```
diff --git a/services/device/generic_sensor/windows/chromium_sensor_backend_windows_isensor.png b/services/device/generic_sensor/windows/chromium_sensor_backend_windows_isensor.png
new file mode 100644
index 0000000..3d9fabdc
--- /dev/null
+++ b/services/device/generic_sensor/windows/chromium_sensor_backend_windows_isensor.png
Binary files differ
diff --git a/services/device/generic_sensor/windows/chromium_sensor_backend_windows_isensor_flow.png b/services/device/generic_sensor/windows/chromium_sensor_backend_windows_isensor_flow.png
new file mode 100644
index 0000000..98436fa6
--- /dev/null
+++ b/services/device/generic_sensor/windows/chromium_sensor_backend_windows_isensor_flow.png
Binary files differ
diff --git a/services/network/cors/cors_url_loader_factory.h b/services/network/cors/cors_url_loader_factory.h
index 5fe64e8..89616115 100644
--- a/services/network/cors/cors_url_loader_factory.h
+++ b/services/network/cors/cors_url_loader_factory.h
@@ -54,8 +54,6 @@
   // URLLoaders.
   void ClearBindings();
 
-  size_t GetActiveLoaderCount() const { return loaders_.size(); }
-
  private:
   // Implements mojom::URLLoaderFactory.
   void CreateLoaderAndStart(mojom::URLLoaderRequest request,
diff --git a/services/network/cors/preflight_controller.cc b/services/network/cors/preflight_controller.cc
index 19b2a19..9c3dc5a 100644
--- a/services/network/cors/preflight_controller.cc
+++ b/services/network/cors/preflight_controller.cc
@@ -350,10 +350,6 @@
   (*emplaced_pair.first)->Request(loader_factory);
 }
 
-PreflightCache::Metrics PreflightController::ReportAndGatherCacheSizeMetric() {
-  return cache_.ReportAndGatherSizeMetric();
-}
-
 void PreflightController::RemoveLoader(PreflightLoader* loader) {
   auto it = loaders_.find(loader);
   DCHECK(it != loaders_.end());
diff --git a/services/network/cors/preflight_controller.h b/services/network/cors/preflight_controller.h
index 52aecdc..c58251a 100644
--- a/services/network/cors/preflight_controller.h
+++ b/services/network/cors/preflight_controller.h
@@ -64,9 +64,6 @@
       const net::NetworkTrafficAnnotationTag& traffic_annotation,
       mojom::URLLoaderFactory* loader_factory);
 
-  // Reports and gather CORS preflight cache size metric.
-  PreflightCache::Metrics ReportAndGatherCacheSizeMetric();
-
  private:
   class PreflightLoader;
 
diff --git a/services/network/network_context.cc b/services/network/network_context.cc
index f0a4f13..f71067d 100644
--- a/services/network/network_context.cc
+++ b/services/network/network_context.cc
@@ -764,18 +764,6 @@
   return params_ && params_->skip_reporting_send_permission_check;
 }
 
-cors::PreflightCache::Metrics
-NetworkContext::ReportAndGatherCorsPreflightCacheSizeMetric() {
-  return cors_preflight_controller_.ReportAndGatherCacheSizeMetric();
-}
-
-size_t NetworkContext::GatherActiveLoaderCount() {
-  size_t count = 0;
-  for (const auto& factory : url_loader_factories_)
-    count += factory->GetActiveLoaderCount();
-  return count;
-}
-
 void NetworkContext::ClearNetworkingHistorySince(
     base::Time time,
     base::OnceClosure completion_callback) {
diff --git a/services/network/network_context.h b/services/network/network_context.h
index 225c3e5e..c6e9cf4 100644
--- a/services/network/network_context.h
+++ b/services/network/network_context.h
@@ -402,12 +402,6 @@
   // consulting NetworkContextClient.OnCanSendReportingReports()
   bool SkipReportingPermissionCheck() const;
 
-  // Reports and gather CORS preflight cache size metric.
-  cors::PreflightCache::Metrics ReportAndGatherCorsPreflightCacheSizeMetric();
-
-  // Gather active URLLoader count.
-  size_t GatherActiveLoaderCount();
-
   // Creates a new url loader factory bound to this network context. For use
   // inside the network service.
   mojom::URLLoaderFactoryPtr CreateUrlLoaderFactoryForNetworkService();
diff --git a/services/network/network_service.cc b/services/network/network_service.cc
index e86fd8f..09bec24 100644
--- a/services/network/network_service.cc
+++ b/services/network/network_service.cc
@@ -226,9 +226,6 @@
   DCHECK(!g_network_service);
   g_network_service = this;
 
-  metrics_trigger_timer_.Start(FROM_HERE, base::TimeDelta::FromMinutes(5), this,
-                               &NetworkService::ReportMetrics);
-
   // In testing environments, |service_request| may not be provided.
   if (service_request.is_pending())
     service_binding_.Bind(std::move(service_request));
@@ -819,23 +816,6 @@
   MaybeStartUpdateLoadInfoTimer();
 }
 
-void NetworkService::ReportMetrics() {
-  size_t cache_size = 0;
-  size_t memory_pressure_in_bytes = 0;
-  size_t loader_count = 0;
-  for (auto* context : network_contexts_) {
-    cors::PreflightCache::Metrics metrics =
-        context->ReportAndGatherCorsPreflightCacheSizeMetric();
-    cache_size += metrics.num_entries;
-    memory_pressure_in_bytes += metrics.memory_pressure_in_bytes;
-    loader_count += context->GatherActiveLoaderCount();
-  }
-  UMA_HISTOGRAM_COUNTS_10000("Net.Cors.PreflightCacheTotalEntries", cache_size);
-  UMA_HISTOGRAM_COUNTS_10M("Net.Cors.PreflightCacheTotalMemoryPressureInBytes",
-                           memory_pressure_in_bytes);
-  UMA_HISTOGRAM_COUNTS_1000("Net.Cors.ActiveLoaderCount", loader_count);
-}
-
 void NetworkService::Bind(mojom::NetworkServiceRequest request) {
   DCHECK(!binding_.is_bound());
   binding_.Bind(std::move(request));
diff --git a/services/network/network_service.h b/services/network/network_service.h
index 629871b..cb22420c 100644
--- a/services/network/network_service.h
+++ b/services/network/network_service.h
@@ -251,9 +251,6 @@
   // Starts timer call UpdateLoadInfo() again, if needed.
   void AckUpdateLoadInfo();
 
-  // Reports metrics on a periodically triggered repeating timer.
-  void ReportMetrics();
-
   service_manager::ServiceBinding service_binding_{this};
 
   bool initialized_ = false;
diff --git a/services/network/public/cpp/cors/preflight_cache.cc b/services/network/public/cpp/cors/preflight_cache.cc
index 208c25f..2fff068 100644
--- a/services/network/public/cpp/cors/preflight_cache.cc
+++ b/services/network/public/cpp/cors/preflight_cache.cc
@@ -21,21 +21,6 @@
 constexpr size_t kMaxKeyLength = 512u;
 constexpr size_t kPurgeUnit = 10u;
 
-// These values are persisted to logs. Entries should not be renumbered and
-// numeric values should never be reused.
-enum class CacheMetric {
-  kHitAndPass = 0,
-  kHitAndFail = 1,
-  kMiss = 2,
-  kStale = 3,
-
-  kMaxValue = kStale,
-};
-
-void ReportCacheMetric(CacheMetric metric) {
-  UMA_HISTOGRAM_ENUMERATION("Net.Cors.PreflightCacheResult", metric);
-}
-
 }  // namespace
 
 PreflightCache::PreflightCache() = default;
@@ -54,25 +39,13 @@
 
   auto key = std::make_pair(origin, url_spec);
   const auto existing_entry = cache_.find(key);
-  if (existing_entry != cache_.end()) {
-    // If the new request comes with a cache disabling flag, |cache_| may
-    // already contain an entry for the |key|.
-    estimated_memory_pressure_in_bytes_ -=
-        origin.length() + url_spec.length() +
-        existing_entry->second->EstimateMemoryPressureInBytes();
-  } else {
+  if (existing_entry == cache_.end()) {
     // Since one new entry is always added below, let's purge one cache entry
     // if cache size is larger than kMaxCacheEntries - 1 so that the size to be
     // kMaxCacheEntries at maximum.
     MayPurge(kMaxCacheEntries - 1, kPurgeUnit);
   }
 
-  UMA_HISTOGRAM_COUNTS_1000("Net.Cors.PreflightCacheKeySize",
-                            url_spec.length());
-  const size_t value_size = preflight_result->EstimateMemoryPressureInBytes();
-  UMA_HISTOGRAM_COUNTS_10000("Net.Cors.PreflightCacheValueSize", value_size);
-  estimated_memory_pressure_in_bytes_ +=
-      origin.length() + url_spec.length() + value_size;
   cache_[key] = std::move(preflight_result);
 }
 
@@ -86,43 +59,25 @@
   // Check if the entry exists in the cache.
   auto key = std::make_pair(origin, url.spec());
   auto cache_entry = cache_.find(key);
-  if (cache_entry == cache_.end()) {
-    ReportCacheMetric(CacheMetric::kMiss);
+  if (cache_entry == cache_.end())
     return false;
-  }
 
   // Check if the entry is still valid.
-  if (cache_entry->second->IsExpired()) {
-    ReportCacheMetric(CacheMetric::kStale);
-  } else {
+  if (!cache_entry->second->IsExpired()) {
     // Both |origin| and |url| are in cache. Check if the entry is sufficient to
     // skip CORS-preflight.
     if (cache_entry->second->EnsureAllowedRequest(
             credentials_mode, method, request_headers, is_revalidating)) {
-      ReportCacheMetric(CacheMetric::kHitAndPass);
       return true;
     }
-    ReportCacheMetric(CacheMetric::kHitAndFail);
   }
 
   // The cache entry is either stale or not sufficient. Remove the item from the
   // cache.
-  estimated_memory_pressure_in_bytes_ -=
-      origin.length() + url.spec().length() +
-      cache_entry->second->EstimateMemoryPressureInBytes();
   cache_.erase(cache_entry);
   return false;
 }
 
-PreflightCache::Metrics PreflightCache::ReportAndGatherSizeMetric() {
-  Metrics metrics;
-  metrics.num_entries = cache_.size();
-  metrics.memory_pressure_in_bytes = estimated_memory_pressure_in_bytes_;
-  UMA_HISTOGRAM_COUNTS_10000("Net.Cors.PreflightCacheEntries",
-                             metrics.num_entries);
-  return metrics;
-}
-
 size_t PreflightCache::CountEntriesForTesting() const {
   return cache_.size();
 }
@@ -139,11 +94,6 @@
   std::advance(purge_begin_entry, base::RandInt(0, cache_.size() - purge_unit));
   auto purge_end_entry = purge_begin_entry;
   std::advance(purge_end_entry, purge_unit);
-  for (auto i = purge_begin_entry; i != purge_end_entry; ++i) {
-    estimated_memory_pressure_in_bytes_ -=
-        i->first.first.length() + i->first.second.length() +
-        i->second->EstimateMemoryPressureInBytes();
-  }
   cache_.erase(purge_begin_entry, purge_end_entry);
 }
 
diff --git a/services/network/public/cpp/cors/preflight_cache.h b/services/network/public/cpp/cors/preflight_cache.h
index 29e1494a..e13f4d5 100644
--- a/services/network/public/cpp/cors/preflight_cache.h
+++ b/services/network/public/cpp/cors/preflight_cache.h
@@ -27,10 +27,6 @@
 // network configuration is changed.
 class COMPONENT_EXPORT(NETWORK_CPP) PreflightCache final {
  public:
-  struct Metrics {
-    size_t num_entries = 0;
-    size_t memory_pressure_in_bytes = 0;
-  };
   PreflightCache();
   ~PreflightCache();
 
@@ -49,9 +45,6 @@
                                       const net::HttpRequestHeaders& headers,
                                       bool is_revalidating);
 
-  // Reports and gather CORS preflight cache size metric.
-  Metrics ReportAndGatherSizeMetric();
-
   // Counts cached entries for testing.
   size_t CountEntriesForTesting() const;
 
@@ -68,9 +61,6 @@
            std::unique_ptr<PreflightResult>>
       cache_;
 
-  // Estimated memory pressure of |cache_| in bytes.
-  size_t estimated_memory_pressure_in_bytes_ = 0;
-
   DISALLOW_COPY_AND_ASSIGN(PreflightCache);
 };
 
diff --git a/services/network/public/cpp/cors/preflight_cache_unittest.cc b/services/network/public/cpp/cors/preflight_cache_unittest.cc
index 6fc53d7..b61dfdd2 100644
--- a/services/network/public/cpp/cors/preflight_cache_unittest.cc
+++ b/services/network/public/cpp/cors/preflight_cache_unittest.cc
@@ -48,11 +48,6 @@
     clock_.Advance(base::TimeDelta::FromSeconds(seconds));
   }
 
-  size_t EstimateMemoryPressure() {
-    PreflightCache::Metrics metrics = cache_.ReportAndGatherSizeMetric();
-    return metrics.memory_pressure_in_bytes;
-  }
-
  private:
   // testing::Test implementation.
   void SetUp() override { PreflightResult::SetTickClockForTesting(&clock_); }
@@ -129,44 +124,6 @@
   EXPECT_EQ(0u, CountEntries());
 }
 
-TEST_F(PreflightCacheTest, EstimateMemoryPressure) {
-  const std::string origin1("origin1");
-  const std::string origin2("origin2");
-  const size_t entry_size = CreateEntry()->EstimateMemoryPressureInBytes();
-  const GURL url1("http://www.test.com/pulstar");
-  const GURL url2("http://www.test.com/blazingstar");
-
-  EXPECT_EQ(0u, CountEntries());
-  size_t expected_pressure = 0u;
-  EXPECT_EQ(expected_pressure, EstimateMemoryPressure());
-
-  AppendEntry(origin1, url1);
-  expected_pressure += origin1.length() + url1.spec().length() + entry_size;
-  EXPECT_EQ(expected_pressure, EstimateMemoryPressure());
-
-  // Overwriting does not change the pressure.
-  AppendEntry(origin1, url1);
-  EXPECT_EQ(expected_pressure, EstimateMemoryPressure());
-
-  // Add another entry.
-  AppendEntry(origin1, url2);
-  expected_pressure += origin1.length() + url2.spec().length() + entry_size;
-  EXPECT_EQ(expected_pressure, EstimateMemoryPressure());
-
-  // Expiring the cache entry should result in updating the memory pressure.
-  Advance(10);
-  EXPECT_FALSE(CheckEntryAndRefreshCache(origin1, url1));
-  expected_pressure = origin1.length() + url2.spec().length() + entry_size;
-  EXPECT_EQ(expected_pressure, EstimateMemoryPressure());
-
-  // Add another entry that have the same memory pressure, then purge one.
-  ASSERT_EQ(origin1.length(), origin2.length());
-  AppendEntry(origin2, url2);
-  EXPECT_EQ(expected_pressure * 2u, EstimateMemoryPressure());
-  MayPurge(1u, 1u);
-  EXPECT_EQ(expected_pressure, EstimateMemoryPressure());
-}
-
 }  // namespace
 
 }  // namespace cors
diff --git a/services/network/public/cpp/cors/preflight_result.cc b/services/network/public/cpp/cors/preflight_result.cc
index 22d7a67..6f595ca 100644
--- a/services/network/public/cpp/cors/preflight_result.cc
+++ b/services/network/public/cpp/cors/preflight_result.cc
@@ -124,15 +124,6 @@
                          method);
 }
 
-size_t PreflightResult::EstimateMemoryPressureInBytes() const {
-  size_t bytes = 0;
-  for (const auto& method : methods_)
-    bytes += method.size();
-  for (const auto& header : headers_)
-    bytes += header.size();
-  return bytes;
-}
-
 base::Optional<CorsErrorStatus>
 PreflightResult::EnsureAllowedCrossOriginHeaders(
     const net::HttpRequestHeaders& headers,
diff --git a/services/network/public/cpp/cors/preflight_result.h b/services/network/public/cpp/cors/preflight_result.h
index b87f0e79..49ef199 100644
--- a/services/network/public/cpp/cors/preflight_result.h
+++ b/services/network/public/cpp/cors/preflight_result.h
@@ -71,9 +71,6 @@
                             const net::HttpRequestHeaders& headers,
                             bool is_revalidating) const;
 
-  // Estimates rough memory pressures in bytes caused by this instance.
-  size_t EstimateMemoryPressureInBytes() const;
-
   // Refers the cache expiry time.
   base::TimeTicks absolute_expiry_time() const { return absolute_expiry_time_; }
 
diff --git a/services/tracing/perfetto/consumer_host_unittest.cc b/services/tracing/perfetto/consumer_host_unittest.cc
index e686f2f..d2c40dd 100644
--- a/services/tracing/perfetto/consumer_host_unittest.cc
+++ b/services/tracing/perfetto/consumer_host_unittest.cc
@@ -75,6 +75,17 @@
 
     {
       base::RunLoop wait_for_destruction;
+      task_runner_->PostTaskAndReply(
+          FROM_HERE,
+          base::BindOnce(
+              [](std::unique_ptr<PerfettoService> service) { service.reset(); },
+              std::move(perfetto_service_)),
+          wait_for_destruction.QuitClosure());
+      wait_for_destruction.Run();
+    }
+
+    {
+      base::RunLoop wait_for_destruction;
       PerfettoTracedProcess::GetTaskRunner()
           ->GetOrCreateTaskRunner()
           ->PostTaskAndReply(FROM_HERE, base::DoNothing(),
diff --git a/services/tracing/perfetto/test_utils.cc b/services/tracing/perfetto/test_utils.cc
index 15a9b1f..d4d76e9 100644
--- a/services/tracing/perfetto/test_utils.cc
+++ b/services/tracing/perfetto/test_utils.cc
@@ -258,10 +258,19 @@
                            base::OnceClosure on_datasource_registered,
                            base::OnceClosure on_tracing_started,
                            size_t num_packets) {
-  data_source_ =
-      std::make_unique<TestDataSource>(data_source_name, num_packets);
+  // Construct MockProducerClient before TestDataSource to avoid a race.
+  //
+  // TestDataSource calls AddDataSource on the global PerfettoTracedProcess,
+  // which PostTasks to the threadpool in the task it will access the
+  // |producer_client_| pointer that the PerfettoTracedProcess owns. However in
+  // the constructor for MockProducerClient we will set the |producer_client_|
+  // from the real client to the mock, however this is done on a different
+  // sequence and thus we have a race. By setting the pointer before we
+  // construct the data source the TestDataSource can not race.
   producer_client_ = std::make_unique<MockProducerClient>(
       /* num_data_sources = */ 1, std::move(on_tracing_started));
+  data_source_ =
+      std::make_unique<TestDataSource>(data_source_name, num_packets);
 
   producer_host_ = std::make_unique<MockProducerHost>(
       producer_name, data_source_name, service, producer_client_.get(),
diff --git a/services/tracing/public/cpp/perfetto/task_runner.cc b/services/tracing/public/cpp/perfetto/task_runner.cc
index 1eecec0..68e40036 100644
--- a/services/tracing/public/cpp/perfetto/task_runner.cc
+++ b/services/tracing/public/cpp/perfetto/task_runner.cc
@@ -9,6 +9,7 @@
 
 #include "base/bind.h"
 #include "base/no_destructor.h"
+#include "base/stl_util.h"
 #include "base/task/common/checked_lock_impl.h"
 #include "base/task/common/scoped_defer_task_posting.h"
 #include "base/task/post_task.h"
@@ -24,7 +25,12 @@
     scoped_refptr<base::SequencedTaskRunner> task_runner)
     : task_runner_(std::move(task_runner)) {}
 
-PerfettoTaskRunner::~PerfettoTaskRunner() = default;
+PerfettoTaskRunner::~PerfettoTaskRunner() {
+  DCHECK(GetOrCreateTaskRunner()->RunsTasksInCurrentSequence());
+#if defined(OS_ANDROID)
+  fd_controllers_.clear();
+#endif  // defined(OS_ANDROID)
+}
 
 void PerfettoTaskRunner::PostTask(std::function<void()> task) {
   base::ScopedDeferTaskPosting::PostOrDefer(
@@ -70,12 +76,29 @@
   return task_runner_->RunsTasksInCurrentSequence();
 }
 
-void PerfettoTaskRunner::AddFileDescriptorWatch(int fd, std::function<void()>) {
+void PerfettoTaskRunner::AddFileDescriptorWatch(
+    int fd,
+    std::function<void()> callback) {
+#if !defined(OS_ANDROID)
   NOTREACHED();
+#else
+  DCHECK(GetOrCreateTaskRunner()->RunsTasksInCurrentSequence());
+  DCHECK(!base::Contains(fd_controllers_, fd));
+  fd_controllers_[fd] = base::FileDescriptorWatcher::WatchReadable(
+      fd,
+      base::BindRepeating([](std::function<void()> callback) { callback(); },
+                          std::move(callback)));
+#endif  // !defined(OS_ANDROID)
 }
 
 void PerfettoTaskRunner::RemoveFileDescriptorWatch(int fd) {
+#if !defined(OS_ANDROID)
   NOTREACHED();
+#else
+  DCHECK(GetOrCreateTaskRunner()->RunsTasksInCurrentSequence());
+  DCHECK(base::Contains(fd_controllers_, fd));
+  fd_controllers_.erase(fd);
+#endif  // !defined(OS_ANDROID)
 }
 
 void PerfettoTaskRunner::ResetTaskRunnerForTesting(
diff --git a/services/tracing/public/cpp/perfetto/task_runner.h b/services/tracing/public/cpp/perfetto/task_runner.h
index 1221bc6..a5fa194 100644
--- a/services/tracing/public/cpp/perfetto/task_runner.h
+++ b/services/tracing/public/cpp/perfetto/task_runner.h
@@ -12,9 +12,17 @@
 #include "base/sequenced_task_runner.h"
 #include "base/synchronization/lock.h"
 #include "base/timer/timer.h"
+#include "build/build_config.h"
 #include "services/tracing/public/mojom/perfetto_service.mojom.h"
 #include "third_party/perfetto/include/perfetto/base/task_runner.h"
 
+#if defined(OS_ANDROID)
+#include <map>
+// Needed for base::FileDescriptorWatcher::Controller and for implementing
+// AddFileDescriptorWatch & RemoveFileDescriptorWatch on Android.
+#include "base/files/file_descriptor_watcher_posix.h"
+#endif  // defined(OS_ANDROID)
+
 namespace tracing {
 
 // This wraps a base::TaskRunner implementation to be able
@@ -40,7 +48,7 @@
   scoped_refptr<base::SequencedTaskRunner> GetOrCreateTaskRunner();
   bool HasTaskRunner() const { return !!task_runner_; }
 
-  // Not used in Chrome.
+  // These are only used on Android when talking to the system Perfetto service.
   void AddFileDescriptorWatch(int fd, std::function<void()>) override;
   void RemoveFileDescriptorWatch(int fd) override;
 
@@ -54,6 +62,10 @@
   void OnDeferredTasksDrainTimer();
 
   scoped_refptr<base::SequencedTaskRunner> task_runner_;
+#if defined(OS_ANDROID)
+  std::map<int, std::unique_ptr<base::FileDescriptorWatcher::Controller>>
+      fd_controllers_;
+#endif  // defined(OS_ANDROID)
 
   DISALLOW_COPY_AND_ASSIGN(PerfettoTaskRunner);
 };
diff --git a/services/tracing/public/cpp/perfetto/task_runner_unittest.cc b/services/tracing/public/cpp/perfetto/task_runner_unittest.cc
index d0af6fe..e26c458 100644
--- a/services/tracing/public/cpp/perfetto/task_runner_unittest.cc
+++ b/services/tracing/public/cpp/perfetto/task_runner_unittest.cc
@@ -91,7 +91,8 @@
 class PerfettoTaskRunnerTest : public testing::Test {
  public:
   void SetUp() override {
-    task_runner_ = std::make_unique<PerfettoTaskRunner>(CreateNewTaskrunner());
+    sequenced_task_runner_ = CreateNewTaskrunner();
+    task_runner_ = std::make_unique<PerfettoTaskRunner>(sequenced_task_runner_);
   }
 
   scoped_refptr<base::SequencedTaskRunner> CreateNewTaskrunner() {
@@ -105,15 +106,18 @@
         number_of_sequences, expected_tasks, std::move(on_complete));
   }
 
-  void TearDown() override {}
+  void TearDown() override {
+    sequenced_task_runner_->DeleteSoon(FROM_HERE, std::move(task_runner_));
+  }
 
   PerfettoTaskRunner* task_runner() { return task_runner_.get(); }
   TaskDestination* destination() { return task_destination_.get(); }
 
  private:
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
+  scoped_refptr<base::SequencedTaskRunner> sequenced_task_runner_;
   std::unique_ptr<PerfettoTaskRunner> task_runner_;
   std::unique_ptr<TaskDestination> task_destination_;
-  base::test::ScopedTaskEnvironment scoped_task_environment_;
 };
 
 TEST_F(PerfettoTaskRunnerTest, SequentialTasks) {
diff --git a/skia/BUILD.gn b/skia/BUILD.gn
index 91e90bf..31aae1e 100644
--- a/skia/BUILD.gn
+++ b/skia/BUILD.gn
@@ -536,6 +536,7 @@
 
   if (skia_support_pdf) {
     deps += [
+      "//third_party:freetype_harfbuzz",
       "//third_party/sfntly",
       "//third_party/sfntly:sfntly_chromium",
       "//third_party/zlib",
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h
index c2c2605..648c7a3e 100644
--- a/skia/config/SkUserConfig.h
+++ b/skia/config/SkUserConfig.h
@@ -132,6 +132,7 @@
 /*  Define this to provide font subsetter for font subsetting when generating
     PDF documents.
  */
+#define SK_PDF_USE_HARFBUZZ_SUBSET
 #define SK_PDF_USE_SFNTLY
 
 // Chromium does not use these fonts.  This define causes type1 fonts to be
diff --git a/testing/buildbot/chromium.chrome.json b/testing/buildbot/chromium.chrome.json
index be68841..81fceb6 100644
--- a/testing/buildbot/chromium.chrome.json
+++ b/testing/buildbot/chromium.chrome.json
@@ -2147,7 +2147,6 @@
     ],
     "isolated_scripts": [
       {
-        "experiment_percentage": 100,
         "isolate_name": "chrome_sizes",
         "merge": {
           "script": "//tools/perf/process_perf_results.py"
@@ -2170,7 +2169,6 @@
     ],
     "isolated_scripts": [
       {
-        "experiment_percentage": 100,
         "isolate_name": "chrome_sizes",
         "merge": {
           "script": "//tools/perf/process_perf_results.py"
@@ -2207,7 +2205,6 @@
     ],
     "isolated_scripts": [
       {
-        "experiment_percentage": 100,
         "isolate_name": "chrome_sizes",
         "merge": {
           "script": "//tools/perf/process_perf_results.py"
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index ec6aad2..bff85f6 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -1227,7 +1227,7 @@
     "gtest_tests": [
       {
         "args": [
-          "--enable-blink-features=LayoutNG"
+          "--disable-blink-features=LayoutNG"
         ],
         "merge": {
           "args": [],
@@ -1250,7 +1250,7 @@
       {
         "args": [
           "--num-retries=3",
-          "--additional-driver-flag=--enable-blink-features=LayoutNG"
+          "--additional-driver-flag=--disable-blink-features=LayoutNG"
         ],
         "isolate_name": "blink_web_tests_exparchive",
         "merge": {
@@ -19993,18 +19993,6 @@
       },
       {
         "isolate_coverage_data": true,
-        "isolate_name": "password_manager_form_parser_generic_fuzzer",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "password_manager_form_parser_generic_fuzzer",
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        }
-      },
-      {
-        "isolate_coverage_data": true,
         "isolate_name": "password_manager_form_parser_proto_fuzzer",
         "merge": {
           "args": [],
@@ -20017,18 +20005,6 @@
       },
       {
         "isolate_coverage_data": true,
-        "isolate_name": "password_manager_form_parser_proto_generic_fuzzer",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "password_manager_form_parser_proto_generic_fuzzer",
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        }
-      },
-      {
-        "isolate_coverage_data": true,
         "isolate_name": "payment_method_manifest_fuzzer",
         "merge": {
           "args": [],
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index 15355dc..d8c9aa8 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -11439,6 +11439,7 @@
           "--additional-driver-flag=--enable-features=VizDisplayCompositor,UseSkiaRenderer",
           "--additional-driver-flag=--use-gl=swiftshader",
           "--fuzzy-diff",
+          "--skipped=always",
           "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter",
           "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer"
         ],
@@ -11460,8 +11461,7 @@
               "os": "Ubuntu-14.04",
               "pool": "Chrome-GPU"
             }
-          ],
-          "shards": 2
+          ]
         }
       },
       {
@@ -11516,6 +11516,43 @@
           "idempotent": false,
           "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com"
         }
+      },
+      {
+        "args": [
+          "--num-retries=3",
+          "--additional-driver-flag=--enable-features=VizDisplayCompositor,UseSkiaRenderer",
+          "--additional-driver-flag=--use-gl=swiftshader",
+          "--additional-driver-flag=--enable-gpu-rasterization",
+          "--additional-driver-flag=--force-gpu-rasterization",
+          "--additional-driver-flag=--enable-oop-rasterization",
+          "--additional-driver-flag=--disable-software-compositing-fallback",
+          "--additional-driver-flag=--use-vulkan=swiftshader",
+          "--additional-driver-flag=--disable-vulkan-fallback-to-gl-for-testing",
+          "--fuzzy-diff",
+          "--skipped=always",
+          "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter",
+          "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader"
+        ],
+        "isolate_name": "blink_web_tests_exparchive",
+        "merge": {
+          "args": [
+            "--verbose"
+          ],
+          "script": "//third_party/blink/tools/merge_web_test_results.py"
+        },
+        "name": "vulkan_swift_shader_blink_web_tests",
+        "results_handler": "layout tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "nvidia-quadro-p400-ubuntu-stable",
+              "os": "Ubuntu-14.04",
+              "pool": "Chrome-GPU"
+            }
+          ]
+        }
       }
     ]
   },
diff --git a/testing/buildbot/client.v8.fyi.json b/testing/buildbot/client.v8.fyi.json
index 7cd38cb5..d1beb34 100644
--- a/testing/buildbot/client.v8.fyi.json
+++ b/testing/buildbot/client.v8.fyi.json
@@ -1462,7 +1462,7 @@
     "gtest_tests": [
       {
         "args": [
-          "--enable-blink-features=LayoutNG"
+          "--disable-blink-features=LayoutNG"
         ],
         "merge": {
           "args": [],
diff --git a/testing/buildbot/filters/chromeos.browser_tests.filter b/testing/buildbot/filters/chromeos.browser_tests.filter
index b869b1e5..f5c30da 100644
--- a/testing/buildbot/filters/chromeos.browser_tests.filter
+++ b/testing/buildbot/filters/chromeos.browser_tests.filter
@@ -1,9 +1,6 @@
 # TODO(crbug.com/977736): Enable this.
 -ActiveDirectoryWebUILoginTest.PasswordChange_ReopenClearErrors
 
-# TODO(crbug.com/977737): Enable this.
--AppListClientImplBrowserTest.OpenSearchResult
-
 # TODO(crbug.com/977738): Enable this.
 -ChromePluginTest.InstalledPlugins
 
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index 224234c..5502f32 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -2042,18 +2042,10 @@
     "label": "//components/password_manager/core/browser/form_parsing/fuzzer:password_manager_form_parser_fuzzer",
     "type": "fuzzer",
   },
-  "password_manager_form_parser_generic_fuzzer": {
-    "label": "//components/password_manager/core/browser/form_parsing/fuzzer:password_manager_form_parser_generic_fuzzer",
-    "type": "fuzzer",
-  },
   "password_manager_form_parser_proto_fuzzer": {
     "label": "//components/password_manager/core/browser/form_parsing/fuzzer:password_manager_form_parser_proto_fuzzer",
     "type": "fuzzer",
   },
-  "password_manager_form_parser_proto_generic_fuzzer": {
-    "label": "//components/password_manager/core/browser/form_parsing/fuzzer:password_manager_form_parser_proto_generic_fuzzer",
-    "type": "fuzzer",
-  },
   "payment_method_manifest_fuzzer": {
     "label": "//components/payments/content/utility:payment_method_manifest_fuzzer",
     "type": "fuzzer",
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 42cdf980..9b979f09d 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -1753,7 +1753,7 @@
       },
       'WebKit Linux layout_ng Dummy Builder': {
         'args': [
-          '--additional-driver-flag=--enable-blink-features=LayoutNG',
+          '--additional-driver-flag=--disable-blink-features=LayoutNG',
         ],
       },
       'WebKit Linux root_layer_scrolls Dummy Builder': {
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index 1f9e20b0..47680eb 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -208,9 +208,6 @@
         'merge': {
           'script': '//tools/perf/process_perf_results.py',
         },
-        # TODO(crbug.com/961548): Promote these out of experiment if/when they
-        # pass.
-        'experiment_percentage': 100,
       },
     },
 
@@ -1543,21 +1540,11 @@
           'can_use_on_swarming_builders': False,
         },
       },
-      'password_manager_form_parser_generic_fuzzer': {
-        'swarming': {
-          'can_use_on_swarming_builders': False,
-        },
-      },
       'password_manager_form_parser_proto_fuzzer': {
         'swarming': {
           'can_use_on_swarming_builders': False,
         },
       },
-      'password_manager_form_parser_proto_generic_fuzzer': {
-        'swarming': {
-          'can_use_on_swarming_builders': False,
-        },
-      },
       'payment_method_manifest_fuzzer': {
         'swarming': {
           'can_use_on_swarming_builders': False,
@@ -3127,6 +3114,7 @@
           '--additional-driver-flag=--enable-features=VizDisplayCompositor,UseSkiaRenderer',
           '--additional-driver-flag=--use-gl=swiftshader',
           '--fuzzy-diff',
+          '--skipped=always',
           '--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter',
           '--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer',
         ],
@@ -3138,9 +3126,34 @@
           'script': '//third_party/blink/tools/merge_web_test_results.py',
         },
         'results_handler': 'layout tests',
-        'swarming': {
-          'shards': 2,
-        }
+      },
+      'vulkan_swift_shader_blink_web_tests': {
+        # layout test failures are retried 3 times when '--test-list' is not
+        # passed, but 0 times when '--test-list' is passed. We want to always
+        # retry 3 times, so we explicitly specify it.
+        'args': [
+          '--num-retries=3',
+          '--additional-driver-flag=--enable-features=VizDisplayCompositor,UseSkiaRenderer',
+          '--additional-driver-flag=--use-gl=swiftshader',
+          '--additional-driver-flag=--enable-gpu-rasterization',
+          '--additional-driver-flag=--force-gpu-rasterization',
+          '--additional-driver-flag=--enable-oop-rasterization',
+          '--additional-driver-flag=--disable-software-compositing-fallback',
+          '--additional-driver-flag=--use-vulkan=swiftshader',
+          '--additional-driver-flag=--disable-vulkan-fallback-to-gl-for-testing',
+          '--fuzzy-diff',
+          '--skipped=always',
+          '--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter',
+          '--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader',
+        ],
+        'isolate_name': 'blink_web_tests_exparchive',
+        'merge': {
+          'args': [
+            '--verbose',
+          ],
+          'script': '//third_party/blink/tools/merge_web_test_results.py',
+        },
+        'results_handler': 'layout tests',
       },
     },
 
@@ -3804,7 +3817,7 @@
     'layout_ng_gtests': {
       'webkit_unit_tests_ng': {
         'args': [
-          '--enable-blink-features=LayoutNG'
+          '--disable-blink-features=LayoutNG'
         ],
         'test': 'blink_unittests',
       },
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index d13c0fb8..b22eebe 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -595,6 +595,21 @@
             ]
         }
     ],
+    "AutoFetchOnNetErrorPage": [
+        {
+            "platforms": [
+                "android"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "AutoFetchOnNetErrorPage"
+                    ]
+                }
+            ]
+        }
+    ],
     "AutofillDoNotMigrateUnsupportedLocalCards": [
         {
             "platforms": [
@@ -3358,24 +3373,6 @@
             ]
         }
     ],
-    "OfflineContentOnDinoPage": [
-        {
-            "platforms": [
-                "android"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled_AutoFetch",
-                    "enable_features": [
-                        "AutoFetchOnNetErrorPage"
-                    ],
-                    "disable_features": [
-                        "NewNetErrorPageUI"
-                    ]
-                }
-            ]
-        }
-    ],
     "OfflineIndicator": [
         {
             "platforms": [
@@ -4145,24 +4142,6 @@
             ]
         }
     ],
-    "PreviewsSlowPageTriggering": [
-        {
-            "platforms": [
-                "android"
-            ],
-            "experiments": [
-                {
-                    "name": "SlowPageTriggeringFor4G_20190312",
-                    "params": {
-                        "session_max_ect_trigger": "4G"
-                    },
-                    "enable_features": [
-                        "PreviewsSlowPageTriggering"
-                    ]
-                }
-            ]
-        }
-    ],
     "PrioritizedSimpleCacheTasks": [
         {
             "platforms": [
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn
index 8b488778..825d7f0 100644
--- a/third_party/blink/public/BUILD.gn
+++ b/third_party/blink/public/BUILD.gn
@@ -374,6 +374,7 @@
     "web/modules/mediastream/media_stream_video_sink.h",
     "web/modules/mediastream/media_stream_video_source.h",
     "web/modules/mediastream/media_stream_video_track.h",
+    "web/modules/mediastream/remote_media_stream_track_adapter.h",
     "web/modules/mediastream/video_track_adapter_settings.h",
     "web/modules/mediastream/web_media_stream_utils.h",
     "web/modules/mediastream/webaudio_media_stream_audio_sink.h",
diff --git a/third_party/blink/public/mojom/hid/hid.mojom b/third_party/blink/public/mojom/hid/hid.mojom
index e47522a..5756d06 100644
--- a/third_party/blink/public/mojom/hid/hid.mojom
+++ b/third_party/blink/public/mojom/hid/hid.mojom
@@ -68,4 +68,23 @@
 // peripherals from the render process. The implementation is responsible for
 // checking device access permissions and should not return information about a
 // device unless permission to access that device has already been granted.
-interface HidService {};
+interface HidService {
+  // Retrieves information about all devices that this client has permission to
+  // access.
+  GetDevices() => (array<device.mojom.HidDeviceInfo> devices);
+
+  // Requests access to a device. A chooser dialog is displayed with a list of
+  // connected devices. If |filters| is non-empty, only devices that match one
+  // or more of the filters will be included in the chooser list. If |filters|
+  // is empty, all connected devices are included. |device| contains the chosen
+  // device, or nullptr if the chooser dialog was canceled.
+  RequestDevice(array<HidDeviceFilter> filters)
+      => (device.mojom.HidDeviceInfo? device);
+
+  // Opens a connection to the device with GUID matching |device_guid|. |client|
+  // will be notified when an input report is received from the device.
+  // |connection| contains the opened connection, or nullptr if the device could
+  // not be opened.
+  Connect(string device_guid, device.mojom.HidConnectionClient client)
+      => (device.mojom.HidConnection? connection);
+};
diff --git a/third_party/blink/public/mojom/native_file_system/native_file_system_file_handle.mojom b/third_party/blink/public/mojom/native_file_system/native_file_system_file_handle.mojom
index e7e78ac2..a32eabe 100644
--- a/third_party/blink/public/mojom/native_file_system/native_file_system_file_handle.mojom
+++ b/third_party/blink/public/mojom/native_file_system/native_file_system_file_handle.mojom
@@ -28,30 +28,6 @@
   // TODO(oyiptong): Remove this method. It isn't part of the spec anymore.
   Remove() => (NativeFileSystemError result);
 
-  // Write data from |data| to the given |position| in the file being written
-  // to. Returns whether the operation succeeded and if so how many bytes were
-  // written.
-  // TODO(mek): This might need some way of reporting progress events back to
-  // the renderer.
-  // TODO(oyiptong): Refactor into NFSFileWriter.
-  Write(uint64 offset, Blob data) => (NativeFileSystemError result,
-                                      uint64 bytes_written);
-
-  // Write data from |stream| to the given |position| in the file being written
-  // to. Returns whether the operation succeeded and if so how many bytes were
-  // written.
-  // TODO(mek): This might need some way of reporting progress events back to
-  // the renderer.
-  // TODO(oyiptong): Refactor into NFSFileWriter.
-  WriteStream(uint64 offset, handle<data_pipe_consumer> stream) =>
-      (NativeFileSystemError result, uint64 bytes_written);
-
-  // Changes the length of the file to be |length|. If |length| is larger than
-  // the current size of the file, the file will be extended, and the extended
-  // part is filled with null bytes.
-  // TODO(oyiptong): Refactor into NFSFileWriter.
-  Truncate(uint64 length) => (NativeFileSystemError result);
-
   // Returns a FileWriter object. The FileWriter provides write operations on a file.
   CreateFileWriter() => (NativeFileSystemError result, NativeFileSystemFileWriter? writer);
 
diff --git a/third_party/blink/public/mojom/native_file_system/native_file_system_file_writer.mojom b/third_party/blink/public/mojom/native_file_system/native_file_system_file_writer.mojom
index 9ade7e5..39edbcab 100644
--- a/third_party/blink/public/mojom/native_file_system/native_file_system_file_writer.mojom
+++ b/third_party/blink/public/mojom/native_file_system/native_file_system_file_writer.mojom
@@ -4,10 +4,32 @@
 
 module blink.mojom;
 
+import "third_party/blink/public/mojom/blob/blob.mojom";
 import "third_party/blink/public/mojom/native_file_system/native_file_system_error.mojom";
 
 // Represents an object to modify a file.
 interface NativeFileSystemFileWriter {
+  // Write data from |data| to the given |position| in the file being written
+  // to. Returns whether the operation succeeded and if so how many bytes were
+  // written.
+  // TODO(mek): This might need some way of reporting progress events back to
+  // the renderer.
+  Write(uint64 offset, Blob data) => (NativeFileSystemError result,
+                                      uint64 bytes_written);
+
+  // Write data from |stream| to the given |position| in the file being written
+  // to. Returns whether the operation succeeded and if so how many bytes were
+  // written.
+  // TODO(mek): This might need some way of reporting progress events back to
+  // the renderer.
+  WriteStream(uint64 offset, handle<data_pipe_consumer> stream) =>
+      (NativeFileSystemError result, uint64 bytes_written);
+
+  // Changes the length of the file to be |length|. If |length| is larger than
+  // the current size of the file, the file will be extended, and the extended
+  // part is filled with null bytes.
+  Truncate(uint64 length) => (NativeFileSystemError result);
+
   // Closes the file writer. This will materialize the writes operations on the
   // intended file target in the case of atomic writes.
   // Close() will close the mojo pipe after completion.
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/web_feature/web_feature.mojom
index 4cd7b3d..223f596 100644
--- a/third_party/blink/public/mojom/web_feature/web_feature.mojom
+++ b/third_party/blink/public/mojom/web_feature/web_feature.mojom
@@ -2323,6 +2323,8 @@
   kLazyLoadImageLoadingAttributeEager = 2934,
   kLazyLoadImageLoadingAttributeLazy = 2935,
   kLazyLoadImageMissingDimensionsForLazy = 2936,
+  kPeriodicBackgroundSyncGetTags = 2937,
+  kPeriodicBackgroundSyncUnregister = 2938,
 
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/public/web/modules/mediastream/remote_media_stream_track_adapter.h b/third_party/blink/public/web/modules/mediastream/remote_media_stream_track_adapter.h
new file mode 100644
index 0000000..9bfd778
--- /dev/null
+++ b/third_party/blink/public/web/modules/mediastream/remote_media_stream_track_adapter.h
@@ -0,0 +1,156 @@
+// Copyright (c) 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_PUBLIC_WEB_MODULES_MEDIASTREAM_REMOTE_MEDIA_STREAM_TRACK_ADAPTER_H_
+#define THIRD_PARTY_BLINK_PUBLIC_WEB_MODULES_MEDIASTREAM_REMOTE_MEDIA_STREAM_TRACK_ADAPTER_H_
+
+#include "base/callback.h"
+#include "base/logging.h"
+#include "base/memory/ref_counted.h"
+#include "third_party/blink/public/platform/web_common.h"
+#include "third_party/blink/public/platform/web_media_stream_source.h"
+#include "third_party/blink/public/platform/web_media_stream_track.h"
+#include "third_party/blink/public/platform/web_string.h"
+#include "third_party/webrtc/api/media_stream_interface.h"
+
+namespace base {
+class SingleThreadTaskRunner;
+}
+
+namespace blink {
+
+class TrackObserver;
+
+// Base class used for mapping between webrtc and blink MediaStream tracks.
+// RemoteMediaStreamImpl has a RemoteMediaStreamTrackAdapter per remote audio
+// (RemoteAudioTrackAdapter) and video (RemoteVideoTrackAdapter) track.
+//
+// TODO(crbug.com/704136): Move these classes out of the Blink exposed API
+// when all users of it have been Onion souped.
+template <typename WebRtcMediaStreamTrackType>
+class BLINK_MODULES_EXPORT RemoteMediaStreamTrackAdapter
+    : public base::RefCountedThreadSafe<
+          RemoteMediaStreamTrackAdapter<WebRtcMediaStreamTrackType>> {
+ public:
+  RemoteMediaStreamTrackAdapter(
+      const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
+      WebRtcMediaStreamTrackType* webrtc_track)
+      : main_thread_(main_thread),
+        webrtc_track_(webrtc_track),
+        id_(WebString::FromUTF8(webrtc_track->id())) {}
+
+  const scoped_refptr<WebRtcMediaStreamTrackType>& observed_track() {
+    return webrtc_track_;
+  }
+
+  WebMediaStreamTrack* web_track() {
+    DCHECK(main_thread_->BelongsToCurrentThread());
+    DCHECK(!web_track_.IsNull());
+    return &web_track_;
+  }
+
+  WebString id() const { return id_; }
+
+  bool initialized() const {
+    DCHECK(main_thread_->BelongsToCurrentThread());
+    return !web_track_.IsNull();
+  }
+
+  void Initialize() {
+    DCHECK(main_thread_->BelongsToCurrentThread());
+    DCHECK(!initialized());
+    std::move(web_initialize_).Run();
+    DCHECK(initialized());
+  }
+
+ protected:
+  friend class base::RefCountedThreadSafe<
+      RemoteMediaStreamTrackAdapter<WebRtcMediaStreamTrackType>>;
+
+  virtual ~RemoteMediaStreamTrackAdapter() {
+    DCHECK(main_thread_->BelongsToCurrentThread());
+  }
+
+  void InitializeWebTrack(WebMediaStreamSource::Type type) {
+    DCHECK(main_thread_->BelongsToCurrentThread());
+    DCHECK(web_track_.IsNull());
+
+    WebMediaStreamSource web_source;
+    web_source.Initialize(id_, type, id_, true /* remote */);
+    web_track_.Initialize(id_, web_source);
+    DCHECK(!web_track_.IsNull());
+  }
+
+  const scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
+  // This callback will be run when Initialize() is called and then freed.
+  // The callback is used by derived classes to bind objects that need to be
+  // instantiated and initialized on the signaling thread but then moved to
+  // and used on the main thread when initializing the web object(s).
+  base::OnceClosure web_initialize_;
+
+ private:
+  const scoped_refptr<WebRtcMediaStreamTrackType> webrtc_track_;
+  WebMediaStreamTrack web_track_;
+  // const copy of the webrtc track id that allows us to check it from both the
+  // main and signaling threads without incurring a synchronous thread hop.
+  const WebString id_;
+
+  DISALLOW_COPY_AND_ASSIGN(RemoteMediaStreamTrackAdapter);
+};
+
+class BLINK_MODULES_EXPORT RemoteVideoTrackAdapter
+    : public RemoteMediaStreamTrackAdapter<webrtc::VideoTrackInterface> {
+ public:
+  // Called on the signaling thread.
+  RemoteVideoTrackAdapter(
+      const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
+      webrtc::VideoTrackInterface* webrtc_track);
+
+ protected:
+  ~RemoteVideoTrackAdapter() override;
+
+ private:
+  void InitializeWebVideoTrack(std::unique_ptr<TrackObserver> observer,
+                               bool enabled);
+};
+
+// RemoteAudioTrackAdapter is responsible for listening on state
+// change notifications on a remote webrtc audio MediaStreamTracks and notify
+// Blink.
+class BLINK_MODULES_EXPORT RemoteAudioTrackAdapter
+    : public RemoteMediaStreamTrackAdapter<webrtc::AudioTrackInterface>,
+      public webrtc::ObserverInterface {
+ public:
+  // Called on the signaling thread.
+  RemoteAudioTrackAdapter(
+      const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
+      webrtc::AudioTrackInterface* webrtc_track);
+
+  void Unregister();
+
+ protected:
+  ~RemoteAudioTrackAdapter() override;
+
+ private:
+  void InitializeWebAudioTrack(
+      const scoped_refptr<base::SingleThreadTaskRunner>& main_thread);
+
+  // webrtc::ObserverInterface implementation.
+  void OnChanged() override;
+
+  void OnChangedOnMainThread(
+      webrtc::MediaStreamTrackInterface::TrackState state);
+
+#if DCHECK_IS_ON()
+  bool unregistered_;
+#endif
+
+  webrtc::MediaStreamTrackInterface::TrackState state_;
+
+  DISALLOW_COPY_AND_ASSIGN(RemoteAudioTrackAdapter);
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_PUBLIC_WEB_MODULES_MEDIASTREAM_REMOTE_MEDIA_STREAM_TRACK_ADAPTER_H_
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc b/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc
index 69c8f6b..1c0e9559 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc
@@ -10,6 +10,7 @@
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/bindings/wrapper_type_info.h"
+#include "third_party/blink/renderer/platform/heap/unified_heap_controller.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
 
@@ -402,10 +403,9 @@
 
 void V8EmbedderGraphBuilder::BuildEmbedderGraph() {
   isolate_->VisitHandlesWithClassIds(this);
-  v8::EmbedderHeapTracer* tracer =
-      V8PerIsolateData::From(isolate_)->GetEmbedderHeapTracer();
-  if (tracer)
-    tracer->IterateTracedGlobalHandles(this);
+  v8::EmbedderHeapTracer* const tracer = static_cast<v8::EmbedderHeapTracer*>(
+      ThreadState::Current()->unified_heap_controller());
+  tracer->IterateTracedGlobalHandles(this);
 // At this point we collected ScriptWrappables in three groups:
 // attached, detached, and unknown.
 #if DCHECK_IS_ON()
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc b/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc
index cd974e3..452eb39 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc
@@ -48,6 +48,7 @@
 #include "third_party/blink/renderer/core/inspector/inspector_trace_events.h"
 #include "third_party/blink/renderer/platform/bindings/wrapper_type_info.h"
 #include "third_party/blink/renderer/platform/heap/heap_stats_collector.h"
+#include "third_party/blink/renderer/platform/heap/unified_heap_controller.h"
 #include "third_party/blink/renderer/platform/histogram.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
@@ -228,12 +229,10 @@
   constexpr unsigned kNumberOfGCs = 5;
 
   if (stack_state != v8::EmbedderHeapTracer::EmbedderStackState::kUnknown) {
-    V8PerIsolateData* data = V8PerIsolateData::From(isolate);
-    v8::EmbedderHeapTracer* tracer =
-        static_cast<v8::EmbedderHeapTracer*>(data->GetUnifiedHeapController());
+    v8::EmbedderHeapTracer* const tracer = static_cast<v8::EmbedderHeapTracer*>(
+        ThreadState::Current()->unified_heap_controller());
     // Passing a stack state is only supported when either wrapper tracing or
     // unified heap is enabled.
-    CHECK(tracer);
     for (unsigned i = 0; i < kNumberOfGCs; i++)
       tracer->GarbageCollectionForTesting(stack_state);
     return;
@@ -293,12 +292,9 @@
                                       Visitor* parent_visitor) {
   DOMWrapperForwardingVisitor visitor(parent_visitor);
   isolate->VisitHandlesWithClassIds(&visitor);
-  v8::EmbedderHeapTracer* tracer =
-      V8PerIsolateData::From(isolate)->GetEmbedderHeapTracer();
-  // There may be no tracer during tear down garbage collections.
-  // Not all threads have a tracer attached.
-  if (tracer)
-    tracer->IterateTracedGlobalHandles(&visitor);
+  v8::EmbedderHeapTracer* const tracer = static_cast<v8::EmbedderHeapTracer*>(
+      ThreadState::Current()->unified_heap_controller());
+  tracer->IterateTracedGlobalHandles(&visitor);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc b/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc
index 9ed1767..82bfcb5 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc
@@ -548,8 +548,6 @@
 static void InitializeV8Common(v8::Isolate* isolate) {
   isolate->AddGCPrologueCallback(V8GCController::GcPrologue);
   isolate->AddGCEpilogueCallback(V8GCController::GcEpilogue);
-  isolate->SetEmbedderHeapTracer(static_cast<v8::EmbedderHeapTracer*>(
-      V8PerIsolateData::From(isolate)->GetUnifiedHeapController()));
   isolate->SetMicrotasksPolicy(v8::MicrotasksPolicy::kScoped);
   isolate->SetUseCounterCallback(&UseCounterCallback);
   isolate->SetWasmModuleCallback(WasmModuleOverride);
@@ -562,6 +560,10 @@
   V8ContextSnapshot::EnsureInterfaceTemplates(isolate);
 
   WasmResponseExtensions::Initialize(isolate);
+
+  ThreadState::Current()->AttachToIsolate(
+      isolate, V8GCController::TraceDOMWrappers,
+      EmbedderGraphBuilder::BuildEmbedderGraphCallback);
 }
 
 namespace {
@@ -633,8 +635,6 @@
   // over to Blink.
   DCHECK(ThreadState::MainThreadState());
 
-  ThreadState::MainThreadState()->RegisterTraceDOMWrappers(
-      isolate, V8GCController::TraceDOMWrappers);
   InitializeV8Common(isolate);
 
   isolate->SetOOMErrorHandler(ReportOOMErrorInMainThread);
@@ -658,11 +658,6 @@
 
   isolate->SetPromiseRejectCallback(PromiseRejectHandlerInMainThread);
 
-  if (v8::HeapProfiler* profiler = isolate->GetHeapProfiler()) {
-    profiler->AddBuildEmbedderGraphCallback(
-        &EmbedderGraphBuilder::BuildEmbedderGraphCallback, nullptr);
-  }
-
   V8PerIsolateData::From(isolate)->SetThreadDebugger(
       std::make_unique<MainThreadDebugger>(isolate));
 }
@@ -680,8 +675,6 @@
 static const int kWorkerMaxStackSize = 500 * 1024;
 
 void V8Initializer::InitializeWorker(v8::Isolate* isolate) {
-  ThreadState::Current()->RegisterTraceDOMWrappers(
-      isolate, V8GCController::TraceDOMWrappers);
   InitializeV8Common(isolate);
 
   isolate->AddMessageListenerWithErrorLevel(
diff --git a/third_party/blink/renderer/core/css/resolver/font_style_resolver.cc b/third_party/blink/renderer/core/css/resolver/font_style_resolver.cc
index 648a478..8419172 100644
--- a/third_party/blink/renderer/core/css/resolver/font_style_resolver.cc
+++ b/third_party/blink/renderer/core/css/resolver/font_style_resolver.cc
@@ -20,7 +20,7 @@
   FontDescription fontDescription;
   Font font(fontDescription);
   font.Update(font_selector);
-  CSSToLengthConversionData::FontSizes fontSizes(16, 16, &font);
+  CSSToLengthConversionData::FontSizes fontSizes(10, 10, &font);
   CSSToLengthConversionData::ViewportSize viewportSize(0, 0);
   CSSToLengthConversionData conversionData(nullptr, fontSizes, viewportSize, 1);
 
diff --git a/third_party/blink/renderer/core/css/resolver/font_style_resolver_test.cc b/third_party/blink/renderer/core/css/resolver/font_style_resolver_test.cc
index 6ffe71cc..4db2749 100644
--- a/third_party/blink/renderer/core/css/resolver/font_style_resolver_test.cc
+++ b/third_party/blink/renderer/core/css/resolver/font_style_resolver_test.cc
@@ -72,8 +72,8 @@
   FontDescription desc = FontStyleResolver::ComputeFont(*style, nullptr);
 
   EXPECT_EQ(desc.Family().Family(), "Ahem");
-  EXPECT_EQ(desc.SpecifiedSize(), 16);
-  EXPECT_EQ(desc.ComputedSize(), 16);
+  EXPECT_EQ(desc.SpecifiedSize(), 10);
+  EXPECT_EQ(desc.ComputedSize(), 10);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
index 85f7089..42a9312 100644
--- a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
+++ b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
@@ -337,6 +337,8 @@
 }
 
 TEST_F(DisplayLockContextTest, FindInPageWithChangedContent) {
+  if (!RuntimeEnabledFeatures::LayoutNGEnabled())
+    return;
   ResizeAndFocus();
   SetHtmlInnerHTML(R"HTML(
     <style>
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.h b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.h
index f6487a8..2c6d9af 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.h
@@ -106,7 +106,7 @@
 // 2) Performs layout when the positin/size of a box was computed.
 // 3) Cache common values for a box.
 class CORE_EXPORT NGInlineLayoutStateStack {
-  STACK_ALLOCATED();
+  DISALLOW_NEW();
 
  public:
   // The box state for the line box.
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_child_layout_context.h b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_child_layout_context.h
index 0597761..5992007f 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_child_layout_context.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_child_layout_context.h
@@ -18,7 +18,7 @@
 // Because this context is in initial state for when fragmentation occurs and
 // some other cases, do not add things that are too expensive to rebuild.
 class NGInlineChildLayoutContext {
-  STACK_ALLOCATED();
+  DISALLOW_NEW();
 
  public:
   // Returns the NGInlineLayoutStateStack in this context.
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h b/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h
index efc330a..df07f3ae 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h
@@ -24,7 +24,7 @@
 
 class CORE_EXPORT NGLineBoxFragmentBuilder final
     : public NGContainerFragmentBuilder {
-  STACK_ALLOCATED();
+  DISALLOW_NEW();
 
  public:
   NGLineBoxFragmentBuilder(NGInlineNode node,
@@ -173,7 +173,7 @@
   // Unlike the fragment builder, chlidren are mutable.
   // Callers can add to the fragment builder in a batch once finalized.
   class ChildList {
-    STACK_ALLOCATED();
+    DISALLOW_NEW();
 
    public:
     ChildList() = default;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
index 10efe80..0c87e9b 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
@@ -66,8 +66,8 @@
 template <typename Algorithm, typename Callback>
 NOINLINE void CreateAlgorithmAndRun(const NGLayoutAlgorithmParams& params,
                                     const Callback& callback) {
-  Algorithm algorithm(params);
-  callback(&algorithm);
+  std::unique_ptr<Algorithm> algorithm = std::make_unique<Algorithm>(params);
+  callback(algorithm.get());
 }
 
 template <typename Callback>
diff --git a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h
index d0b428d..fd4bacd 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h
@@ -28,7 +28,7 @@
 class NGPhysicalFragment;
 
 class CORE_EXPORT NGContainerFragmentBuilder : public NGFragmentBuilder {
-  STACK_ALLOCATED();
+  DISALLOW_NEW();
 
  public:
   struct ChildWithOffset {
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.h b/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.h
index 714610ff..077aa67 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.h
@@ -20,7 +20,7 @@
 class LayoutObject;
 
 class CORE_EXPORT NGFragmentBuilder {
-  STACK_ALLOCATED();
+  DISALLOW_NEW();
 
  public:
   const ComputedStyle& Style() const {
diff --git a/third_party/blink/renderer/core/layout/ng/ng_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/ng_layout_algorithm.h
index 972af29..aa0a8cc1 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_layout_algorithm.h
@@ -63,7 +63,8 @@
           typename NGBoxFragmentBuilderType,
           typename NGBreakTokenType>
 class CORE_EXPORT NGLayoutAlgorithm : public NGLayoutAlgorithmOperations {
-  STACK_ALLOCATED();
+  USING_FAST_MALLOC(NGLayoutAlgorithm);
+
  public:
   NGLayoutAlgorithm(NGInputNodeType node,
                     scoped_refptr<const ComputedStyle> style,
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
index 374f33a0..a84abe3f 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
@@ -367,7 +367,15 @@
         DCHECK(layout_object_.IsBox());
       }
       if (IsColumnBox()) {
-        // TODO(kojii): Column box can fail following checks, needs review.
+        // Column fragments are associated with the same layout object as their
+        // multicol container. The fragments themselves are regular in-flow
+        // block container fragments for most purposes.
+        DCHECK(layout_object_.IsLayoutBlockFlow());
+        DCHECK(IsBox());
+        DCHECK(!IsFloating());
+        DCHECK(!IsOutOfFlowPositioned());
+        DCHECK(!IsAtomicInline());
+        DCHECK(!IsBlockFormattingContextRoot());
         break;
       }
       if (layout_object_.IsLayoutNGListMarker()) {
diff --git a/third_party/blink/renderer/core/paint/DEPS b/third_party/blink/renderer/core/paint/DEPS
index 2e6dc926..25664f0 100644
--- a/third_party/blink/renderer/core/paint/DEPS
+++ b/third_party/blink/renderer/core/paint/DEPS
@@ -10,5 +10,8 @@
   "(theme_painter|fallback_theme)\.cc": [
     "+ui/native_theme/native_theme.h",
     "+ui/native_theme/native_theme_base.h",
+  ],
+  ".*test\.cc": [
+    "+base/test/trace_event_analyzer.h",
   ]
 }
diff --git a/third_party/blink/renderer/core/paint/image_paint_timing_detector.cc b/third_party/blink/renderer/core/paint/image_paint_timing_detector.cc
index e9f2597..fcbf385 100644
--- a/third_party/blink/renderer/core/paint/image_paint_timing_detector.cc
+++ b/third_party/blink/renderer/core/paint/image_paint_timing_detector.cc
@@ -91,6 +91,8 @@
 
 void ImagePaintTimingDetector::ReportCandidateToTrace(
     ImageRecord& largest_image_record) {
+  if (!PaintTimingDetector::IsTracing())
+    return;
   DCHECK(!largest_image_record.paint_time.is_null());
   auto value = std::make_unique<TracedValue>();
   PopulateTraceValue(*value, largest_image_record);
@@ -101,6 +103,8 @@
 }
 
 void ImagePaintTimingDetector::ReportNoCandidateToTrace() {
+  if (!PaintTimingDetector::IsTracing())
+    return;
   auto value = std::make_unique<TracedValue>();
   value->SetInteger("candidateIndex", ++count_candidates_);
   value->SetBoolean("isMainFrame", frame_view_->GetFrame().IsMainFrame());
@@ -123,7 +127,7 @@
   bool changed = detector.NotifyIfChangedLargestImagePaint(time, size);
   if (!changed)
     return;
-  if (largest_image_record && !largest_image_record->paint_time.is_null()) {
+  if (!time.is_null()) {
     if (auto* lcp_calculator = detector.GetLargestContentfulPaintCalculator())
       lcp_calculator->OnLargestImageUpdated(largest_image_record);
     // If an image has paint time, it must have been loaded.
diff --git a/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc b/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc
index b957e3bc..15478c4 100644
--- a/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc
+++ b/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc
@@ -6,6 +6,7 @@
 
 #include "base/bind.h"
 #include "base/test/test_mock_time_task_runner.h"
+#include "base/test/trace_event_analyzer.h"
 #include "build/build_config.h"
 #include "third_party/blink/public/platform/web_url_loader_mock_factory.h"
 #include "third_party/blink/public/web/web_performance.h"
@@ -231,6 +232,97 @@
   EXPECT_TRUE(record->loaded);
 }
 
+TEST_F(ImagePaintTimingDetectorTest, LargestImagePaint_TraceEvent_Candidate) {
+  using trace_analyzer::Query;
+  trace_analyzer::Start("loading");
+  {
+    SetBodyInnerHTML(R"HTML(
+      <img id="target"></img>
+    )HTML");
+    SetImageAndPaint("target", 5, 5);
+    UpdateAllLifecyclePhasesAndInvokeCallbackIfAny();
+  }
+  auto analyzer = trace_analyzer::Stop();
+  trace_analyzer::TraceEventVector events;
+  Query q = Query::EventNameIs("LargestImagePaint::Candidate");
+  analyzer->FindEvents(q, &events);
+  EXPECT_EQ(1u, events.size());
+  EXPECT_EQ("loading", events[0]->category);
+
+  EXPECT_TRUE(events[0]->HasArg("frame"));
+
+  EXPECT_TRUE(events[0]->HasArg("data"));
+  std::unique_ptr<base::Value> arg;
+  EXPECT_TRUE(events[0]->GetArgAsValue("data", &arg));
+  base::DictionaryValue* arg_dict;
+  EXPECT_TRUE(arg->GetAsDictionary(&arg_dict));
+  DOMNodeId node_id;
+  EXPECT_TRUE(arg_dict->GetInteger("DOMNodeId", &node_id));
+  EXPECT_GT(node_id, 0);
+  int size;
+  EXPECT_TRUE(arg_dict->GetInteger("size", &size));
+  EXPECT_GT(size, 0);
+  DOMNodeId candidate_index;
+  EXPECT_TRUE(arg_dict->GetInteger("candidateIndex", &candidate_index));
+  EXPECT_EQ(candidate_index, 2);
+  bool isMainFrame;
+  EXPECT_TRUE(arg_dict->GetBoolean("isMainFrame", &isMainFrame));
+  EXPECT_EQ(true, isMainFrame);
+  bool isOOPIF;
+  EXPECT_TRUE(arg_dict->GetBoolean("isOOPIF", &isOOPIF));
+  EXPECT_EQ(false, isOOPIF);
+}
+
+TEST_F(ImagePaintTimingDetectorTest, LargestImagePaint_TraceEvent_NoCandidate) {
+  using trace_analyzer::Query;
+  trace_analyzer::Start("*");
+  {
+    SetBodyInnerHTML(R"HTML(
+      <img id="target"></img>
+    )HTML");
+    SetImageAndPaint("target", 5, 5);
+    UpdateAllLifecyclePhasesAndInvokeCallbackIfAny();
+    GetDocument().getElementById("target")->remove();
+    UpdateAllLifecyclePhasesForTest();
+  }
+  auto analyzer = trace_analyzer::Stop();
+  trace_analyzer::TraceEventVector events;
+  Query q = Query::EventNameIs("LargestImagePaint::NoCandidate");
+  analyzer->FindEvents(q, &events);
+  EXPECT_EQ(2u, events.size());
+
+  {
+    EXPECT_EQ("loading", events[0]->category);
+    EXPECT_TRUE(events[0]->HasArg("frame"));
+    EXPECT_TRUE(events[0]->HasArg("data"));
+    std::unique_ptr<base::Value> arg;
+    EXPECT_TRUE(events[0]->GetArgAsValue("data", &arg));
+    base::DictionaryValue* arg_dict;
+    EXPECT_TRUE(arg->GetAsDictionary(&arg_dict));
+    DOMNodeId candidate_index;
+    EXPECT_TRUE(arg_dict->GetInteger("candidateIndex", &candidate_index));
+    EXPECT_EQ(candidate_index, 1);
+    bool is_main_frame;
+    EXPECT_TRUE(arg_dict->GetBoolean("isMainFrame", &is_main_frame));
+    EXPECT_EQ(true, is_main_frame);
+    bool is_oopif;
+    EXPECT_TRUE(arg_dict->GetBoolean("isOOPIF", &is_oopif));
+    EXPECT_EQ(false, is_oopif);
+  }
+
+  // Use block to reuse the temp variable names.
+  {
+    EXPECT_TRUE(events[1]->HasArg("data"));
+    std::unique_ptr<base::Value> arg;
+    EXPECT_TRUE(events[1]->GetArgAsValue("data", &arg));
+    base::DictionaryValue* arg_dict;
+    EXPECT_TRUE(arg->GetAsDictionary(&arg_dict));
+    DOMNodeId candidate_index;
+    EXPECT_TRUE(arg_dict->GetInteger("candidateIndex", &candidate_index));
+    EXPECT_EQ(candidate_index, 3);
+  }
+}
+
 TEST_F(ImagePaintTimingDetectorTest, UpdatePerformanceTiming) {
   const PerformanceTiming& performance_timing = GetPerformanceTiming();
   EXPECT_EQ(performance_timing.LargestImagePaintSize(), 0u);
diff --git a/third_party/blink/renderer/core/paint/paint_timing_detector.h b/third_party/blink/renderer/core/paint/paint_timing_detector.h
index 0335fe3..19639a3 100644
--- a/third_party/blink/renderer/core/paint/paint_timing_detector.h
+++ b/third_party/blink/renderer/core/paint/paint_timing_detector.h
@@ -62,6 +62,12 @@
 
   void DidChangePerformanceTiming();
 
+  inline static bool IsTracing() {
+    bool tracing_enabled;
+    TRACE_EVENT_CATEGORY_GROUP_ENABLED("loading", &tracing_enabled);
+    return tracing_enabled;
+  }
+
   FloatRect CalculateVisualRect(const IntRect& visual_rect,
                                 const PropertyTreeState&) const;
 
diff --git a/third_party/blink/renderer/core/paint/text_paint_timing_detector.cc b/third_party/blink/renderer/core/paint/text_paint_timing_detector.cc
index d5306ed..967a94d4 100644
--- a/third_party/blink/renderer/core/paint/text_paint_timing_detector.cc
+++ b/third_party/blink/renderer/core/paint/text_paint_timing_detector.cc
@@ -62,10 +62,10 @@
 
 void LargestTextPaintManager::ReportCandidateToTrace(
     const TextRecord& largest_text_record) {
+  if (!PaintTimingDetector::IsTracing())
+    return;
   auto value = std::make_unique<TracedValue>();
   PopulateTraceValue(*value, largest_text_record);
-  // TODO(crbug.com/976894): Check if the event is needed before preparing the
-  // trace value.
   TRACE_EVENT_MARK_WITH_TIMESTAMP2("loading", "LargestTextPaint::Candidate",
                                    largest_text_record.paint_time, "data",
                                    std::move(value), "frame",
@@ -73,6 +73,8 @@
 }
 
 void LargestTextPaintManager::ReportNoCandidateToTrace() {
+  if (!PaintTimingDetector::IsTracing())
+    return;
   auto value = std::make_unique<TracedValue>();
   value->SetInteger("candidateIndex", ++count_candidates_);
   value->SetBoolean("isMainFrame", frame_view_->GetFrame().IsMainFrame());
@@ -95,7 +97,7 @@
   if (!changed)
     return;
 
-  if (largest_text_record && !largest_text_record->paint_time.is_null()) {
+  if (!time.is_null()) {
     if (auto* lcp_calculator =
             paint_timing_detector_->GetLargestContentfulPaintCalculator())
       lcp_calculator->OnLargestTextUpdated(largest_text_record);
diff --git a/third_party/blink/renderer/core/paint/text_paint_timing_detector_test.cc b/third_party/blink/renderer/core/paint/text_paint_timing_detector_test.cc
index 51d1c86..8cf8e34 100644
--- a/third_party/blink/renderer/core/paint/text_paint_timing_detector_test.cc
+++ b/third_party/blink/renderer/core/paint/text_paint_timing_detector_test.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/core/paint/text_paint_timing_detector.h"
 
 #include "base/test/test_mock_time_task_runner.h"
+#include "base/test/trace_event_analyzer.h"
 #include "third_party/blink/renderer/core/paint/paint_timing_detector.h"
 #include "third_party/blink/renderer/core/svg/svg_text_content_element.h"
 #include "third_party/blink/renderer/core/testing/core_unit_test_helper.h"
@@ -172,6 +173,82 @@
             DOMNodeIds::ExistingIdForNode(only_text));
 }
 
+TEST_F(TextPaintTimingDetectorTest, LargestTextPaint_TraceEvent_Candidate) {
+  using trace_analyzer::Query;
+  trace_analyzer::Start("*");
+  {
+    SetBodyInnerHTML(R"HTML(
+      )HTML");
+    AppendDivElementToBody("The only text");
+    UpdateAllLifecyclePhasesAndSimulateSwapTime();
+  }
+  auto analyzer = trace_analyzer::Stop();
+  trace_analyzer::TraceEventVector events;
+  Query q = Query::EventNameIs("LargestTextPaint::Candidate");
+  analyzer->FindEvents(q, &events);
+  EXPECT_EQ(1u, events.size());
+  EXPECT_EQ("loading", events[0]->category);
+
+  EXPECT_TRUE(events[0]->HasArg("frame"));
+
+  EXPECT_TRUE(events[0]->HasArg("data"));
+  std::unique_ptr<base::Value> arg;
+  EXPECT_TRUE(events[0]->GetArgAsValue("data", &arg));
+  base::DictionaryValue* arg_dict;
+  EXPECT_TRUE(arg->GetAsDictionary(&arg_dict));
+  DOMNodeId node_id;
+  EXPECT_TRUE(arg_dict->GetInteger("DOMNodeId", &node_id));
+  EXPECT_GT(node_id, 0);
+  int size;
+  EXPECT_TRUE(arg_dict->GetInteger("size", &size));
+  EXPECT_GT(size, 0);
+  DOMNodeId candidate_index;
+  EXPECT_TRUE(arg_dict->GetInteger("candidateIndex", &candidate_index));
+  EXPECT_EQ(candidate_index, 1);
+  bool is_main_frame;
+  EXPECT_TRUE(arg_dict->GetBoolean("isMainFrame", &is_main_frame));
+  EXPECT_EQ(true, is_main_frame);
+  bool is_oopif;
+  EXPECT_TRUE(arg_dict->GetBoolean("isOOPIF", &is_oopif));
+  EXPECT_EQ(false, is_oopif);
+}
+
+TEST_F(TextPaintTimingDetectorTest, LargestTextPaint_TraceEvent_NoCandidate) {
+  using trace_analyzer::Query;
+  trace_analyzer::Start("*");
+  {
+    SetBodyInnerHTML(R"HTML(
+      )HTML");
+    Element* element = AppendDivElementToBody("text");
+    UpdateAllLifecyclePhasesAndSimulateSwapTime();
+    RemoveElement(element);
+    UpdateAllLifecyclePhasesForTest();
+  }
+  auto analyzer = trace_analyzer::Stop();
+  trace_analyzer::TraceEventVector events;
+  Query q = Query::EventNameIs("LargestTextPaint::NoCandidate");
+  analyzer->FindEvents(q, &events);
+  EXPECT_EQ(1u, events.size());
+  EXPECT_EQ("loading", events[0]->category);
+
+  EXPECT_TRUE(events[0]->HasArg("frame"));
+
+  EXPECT_TRUE(events[0]->HasArg("data"));
+  std::unique_ptr<base::Value> arg;
+  EXPECT_TRUE(events[0]->GetArgAsValue("data", &arg));
+  base::DictionaryValue* arg_dict;
+  EXPECT_TRUE(arg->GetAsDictionary(&arg_dict));
+  DOMNodeId candidate_index;
+  EXPECT_TRUE(arg_dict->GetInteger("candidateIndex", &candidate_index));
+  EXPECT_EQ(candidate_index, 2);
+  bool is_main_frame;
+  EXPECT_TRUE(arg_dict->GetBoolean("isMainFrame", &is_main_frame));
+  EXPECT_EQ(true, is_main_frame);
+  bool is_oopif;
+  EXPECT_TRUE(arg_dict->GetBoolean("isOOPIF", &is_oopif));
+  EXPECT_EQ(false, is_oopif);
+}
+
 TEST_F(TextPaintTimingDetectorTest, AggregationBySelfPaintingInlineElement) {
   SetBodyInnerHTML(R"HTML(
     <div style="background: yellow">
diff --git a/third_party/blink/renderer/devtools/BUILD.gn b/third_party/blink/renderer/devtools/BUILD.gn
index 94af9a4..94562c49 100644
--- a/third_party/blink/renderer/devtools/BUILD.gn
+++ b/third_party/blink/renderer/devtools/BUILD.gn
@@ -53,6 +53,8 @@
   "front_end/audits/RadioSetting.js",
   "front_end/audits/lighthouse/report.css",
   "front_end/audits/lighthouse/report.js",
+  "front_end/audits/lighthouse/report-generator.js",
+  "front_end/audits/lighthouse/template.html",
   "front_end/audits/lighthouse/templates.html",
   "front_end/audits/module.json",
   "front_end/audits_test_runner/AuditsTestRunner.js",
diff --git a/third_party/blink/renderer/devtools/front_end/Runtime.js b/third_party/blink/renderer/devtools/front_end/Runtime.js
index 2b8ac78..3e6552b 100644
--- a/third_party/blink/renderer/devtools/front_end/Runtime.js
+++ b/third_party/blink/renderer/devtools/front_end/Runtime.js
@@ -741,7 +741,8 @@
     const promises = [];
     for (let i = 0; i < resources.length; ++i) {
       const url = this._modularizeURL(resources[i]);
-      promises.push(Runtime._loadResourceIntoCache(url, true));
+      const isHtml = url.endsWith('.html');
+      promises.push(Runtime._loadResourceIntoCache(url, !isHtml /* appendSourceURL */));
     }
     return Promise.all(promises).then(undefined);
   }
diff --git a/third_party/blink/renderer/devtools/front_end/audits/AuditsPanel.js b/third_party/blink/renderer/devtools/front_end/audits/AuditsPanel.js
index a799ddf..c99e6ed3 100644
--- a/third_party/blink/renderer/devtools/front_end/audits/AuditsPanel.js
+++ b/third_party/blink/renderer/devtools/front_end/audits/AuditsPanel.js
@@ -52,7 +52,6 @@
   }
 
   _refreshToolbarUI() {
-    this._downloadButton.setEnabled(this._reportSelector.hasCurrentSelection());
     this._clearButton.setEnabled(this._reportSelector.hasItems());
   }
 
@@ -62,10 +61,6 @@
     this._refreshToolbarUI();
   }
 
-  _downloadSelected() {
-    this._reportSelector.downloadSelected();
-  }
-
   _renderToolbar() {
     const toolbar = new UI.Toolbar('', this.element);
 
@@ -73,10 +68,6 @@
     toolbar.appendToolbarItem(this._newButton);
     this._newButton.addEventListener(UI.ToolbarButton.Events.Click, this._renderStartView.bind(this));
 
-    this._downloadButton = new UI.ToolbarButton(Common.UIString('Download report'), 'largeicon-download');
-    toolbar.appendToolbarItem(this._downloadButton);
-    this._downloadButton.addEventListener(UI.ToolbarButton.Events.Click, this._downloadSelected.bind(this));
-
     toolbar.appendSeparator();
 
     this._reportSelector = new Audits.ReportSelector(() => this._renderStartView());
@@ -147,16 +138,27 @@
     renderer.setTemplateContext(templatesDOM);
     const el = renderer.renderReport(lighthouseResult, reportContainer);
     Audits.ReportRenderer.addViewTraceButton(el, artifacts);
-    Audits.ReportRenderer.linkifyNodeDetails(el);
+    // Linkifying requires the target be loaded. Do not block the report
+    // from rendering, as this is just an embellishment and the main target
+    // could take awhile to load.
+    this._waitForMainTargetLoad().then(() => {
+      Audits.ReportRenderer.linkifyNodeDetails(el);
+    });
     Audits.ReportRenderer.handleDarkMode(el);
 
-    const features = new ReportUIFeatures(dom);
+    const features = new Audits.ReportUIFeatures(dom);
     features.setTemplateContext(templatesDOM);
     features.initFeatures(lighthouseResult);
 
     this._cachedRenderedReports.set(lighthouseResult, reportContainer);
   }
 
+  _waitForMainTargetLoad() {
+    const mainTarget = SDK.targetManager.mainTarget();
+    const resourceTreeModel = mainTarget.model(SDK.ResourceTreeModel);
+    return resourceTreeModel.once(SDK.ResourceTreeModel.Events.Load);
+  }
+
   /**
    * @param {!ReportRenderer.ReportJSON} lighthouseResult
    * @param {!ReportRenderer.RunnerResultArtifacts=} artifacts
diff --git a/third_party/blink/renderer/devtools/front_end/audits/AuditsReportRenderer.js b/third_party/blink/renderer/devtools/front_end/audits/AuditsReportRenderer.js
index b4609ec..794be32 100644
--- a/third_party/blink/renderer/devtools/front_end/audits/AuditsReportRenderer.js
+++ b/third_party/blink/renderer/devtools/front_end/audits/AuditsReportRenderer.js
@@ -31,9 +31,6 @@
    */
   static async linkifyNodeDetails(el) {
     const mainTarget = SDK.targetManager.mainTarget();
-    const resourceTreeModel = mainTarget.model(SDK.ResourceTreeModel);
-    await resourceTreeModel.once(SDK.ResourceTreeModel.Events.Load);
-
     const domModel = mainTarget.model(SDK.DOMModel);
 
     for (const origElement of el.getElementsByClassName('lh-node')) {
@@ -66,3 +63,62 @@
       el.classList.add('dark');
   }
 };
+
+/**
+ * @override
+ */
+Audits.ReportUIFeatures = class extends ReportUIFeatures {
+  /**
+   * Returns the html that recreates this report.
+   * @return {string}
+   * @protected
+   */
+  getReportHtml() {
+    this.resetUIState();
+    return Lighthouse.ReportGenerator.generateReportHtml(this.json);
+  }
+
+  /**
+   * Downloads a file (blob) using the system dialog prompt.
+   * @param {!Blob|!File} blob The file to save.
+   */
+  async _saveFile(blob) {
+    const domain = new Common.ParsedURL(this.json.finalUrl).domain();
+    const sanitizedDomain = domain.replace(/[^a-z0-9.-]+/gi, '_');
+    const timestamp = new Date(this.json.fetchTime).toISO8601Compact();
+    const ext = blob.type.match('json') ? '.json' : '.html';
+    const basename = `${sanitizedDomain}-${timestamp}${ext}`;
+    const text = await blob.text();
+    Workspace.fileManager.save(basename, text, true /* forceSaveAs */);
+  }
+
+  async _print() {
+    const document = this.getDocument();
+    const clonedReport = document.querySelector('.lh-root').cloneNode(true /* deep */);
+    const printWindow = window.open('', '_blank', 'channelmode=1,status=1,resizable=1');
+    const style = printWindow.document.createElement('style');
+    style.textContent = Runtime.cachedResources['audits/lighthouse/report.css'];
+    printWindow.document.head.appendChild(style);
+    printWindow.document.body.replaceWith(clonedReport);
+    // Linkified nodes are shadow elements, which aren't exposed via `cloneNode`.
+    await Audits.ReportRenderer.linkifyNodeDetails(clonedReport);
+    printWindow.focus();
+    printWindow.print();
+    printWindow.close();
+  }
+
+  /**
+   * @suppress {visibility}
+   * @return {!Document}
+   */
+  getDocument() {
+    return this._document;
+  }
+
+  /**
+   * @suppress {visibility}
+   */
+  resetUIState() {
+    this._resetUIState();
+  }
+};
diff --git a/third_party/blink/renderer/devtools/front_end/audits/AuditsReportSelector.js b/third_party/blink/renderer/devtools/front_end/audits/AuditsReportSelector.js
index cffa676..43f959a7b 100644
--- a/third_party/blink/renderer/devtools/front_end/audits/AuditsReportSelector.js
+++ b/third_party/blink/renderer/devtools/front_end/audits/AuditsReportSelector.js
@@ -90,12 +90,6 @@
     this._setEmptyState();
   }
 
-  downloadSelected() {
-    const item = this._selectedItem();
-    if (item)
-      item.download();
-  }
-
   selectNewAudit() {
     this._comboBox.select(this._newAuditItem);
   }
@@ -134,12 +128,4 @@
       this._element.remove();
     this._showLandingCallback();
   }
-
-  download() {
-    const domain = new Common.ParsedURL(this._lighthouseResult.finalUrl).domain();
-    const sanitizedDomain = domain.replace(/[^a-z0-9.-]+/gi, '_');
-    const timestamp = this._lighthouseResult.fetchTime;
-    const fileName = `${sanitizedDomain}-${new Date(timestamp).toISO8601Compact()}.json`;
-    Workspace.fileManager.save(fileName, JSON.stringify(this._lighthouseResult), true);
-  }
 };
diff --git a/third_party/blink/renderer/devtools/front_end/audits/auditsPanel.css b/third_party/blink/renderer/devtools/front_end/audits/auditsPanel.css
index e069c4e..bba66cff 100644
--- a/third_party/blink/renderer/devtools/front_end/audits/auditsPanel.css
+++ b/third_party/blink/renderer/devtools/front_end/audits/auditsPanel.css
@@ -25,3 +25,9 @@
 .audits-results-container {
     position: relative;
 }
+
+/** `window.opener` is null for windows opened from DevTools. This breaks
+    the LH viewer app, so disable this feature. */
+.lh-export--viewer {
+  display: none !important;
+}
diff --git a/third_party/blink/renderer/devtools/front_end/audits/audits_strings.grdp b/third_party/blink/renderer/devtools/front_end/audits/audits_strings.grdp
index 8202dda..41e6503 100644
--- a/third_party/blink/renderer/devtools/front_end/audits/audits_strings.grdp
+++ b/third_party/blink/renderer/devtools/front_end/audits/audits_strings.grdp
@@ -78,9 +78,6 @@
   <message name="IDS_DEVTOOLS_6565973a762b83f476e9a76a0015b539" desc="">
     At least one category must be selected.
   </message>
-  <message name="IDS_DEVTOOLS_671b3beee69d9180412202b6528ec8f7" desc="">
-    Download report
-  </message>
   <message name="IDS_DEVTOOLS_67aa731132e0e7bbabb1b3d3c363e7d6" desc="">
     Multiple tabs are being controlled by the same service worker. Close your other tabs on the same origin to audit this page.
   </message>
diff --git a/third_party/blink/renderer/devtools/front_end/audits/lighthouse/report-generator.js b/third_party/blink/renderer/devtools/front_end/audits/lighthouse/report-generator.js
index 14781c6c..01257be 100644
--- a/third_party/blink/renderer/devtools/front_end/audits/lighthouse/report-generator.js
+++ b/third_party/blink/renderer/devtools/front_end/audits/lighthouse/report-generator.js
@@ -1,4 +1,4 @@
-(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}(g.Lighthouse || (g.Lighthouse = {})).ReportGenerator = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({"./html/html-report-assets":[function(require,module,exports){
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}(g.Lighthouse || (g.Lighthouse = {})).ReportGenerator = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({"./html/html-report-assets.js":[function(require,module,exports){
 /**
  * @license Copyright 2019 Google Inc. All Rights Reserved.
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
@@ -32,7 +32,7 @@
  */
 'use strict';
 
-const htmlReportAssets = require('./html/html-report-assets');
+const htmlReportAssets = require('./html/html-report-assets.js');
 
 class ReportGenerator {
   /**
@@ -84,14 +84,14 @@
    *  - the score value of the audit
    *
    * @param {LH.Result} lhr
-   * @returns {string}
+   * @return {string}
    */
   static generateReportCSV(lhr) {
     // To keep things "official" we follow the CSV specification (RFC4180)
     // The document describes how to deal with escaping commas and quotes etc.
     const CRLF = '\r\n';
     const separator = ',';
-    /** @param {string} value @returns {string} */
+    /** @param {string} value @return {string} */
     const escape = value => `"${value.replace(/"/g, '""')}"`;
 
     // Possible TODO: tightly couple headers and row values
@@ -144,5 +144,5 @@
 
 module.exports = ReportGenerator;
 
-},{"./html/html-report-assets":"./html/html-report-assets"}]},{},[1])(1)
+},{"./html/html-report-assets.js":"./html/html-report-assets.js"}]},{},[1])(1)
 });
diff --git a/third_party/blink/renderer/devtools/front_end/audits/lighthouse/report.css b/third_party/blink/renderer/devtools/front_end/audits/lighthouse/report.css
index 8a0d5e4..be8152e 100644
--- a/third_party/blink/renderer/devtools/front_end/audits/lighthouse/report.css
+++ b/third_party/blink/renderer/devtools/front_end/audits/lighthouse/report.css
@@ -292,6 +292,11 @@
   overflow-y: scroll;
   height: calc(100% - var(--topbar-height));
 }
+@media print {
+  .lh-devtools .lh-container {
+    overflow: unset;
+  }
+}
 .lh-devtools .lh-sticky-header {
   /* Is normally the height of the topbar. */
   top: 0;
diff --git a/third_party/blink/renderer/devtools/front_end/audits/lighthouse/report.js b/third_party/blink/renderer/devtools/front_end/audits/lighthouse/report.js
index e4c2465..17c4ec3d 100644
--- a/third_party/blink/renderer/devtools/front_end/audits/lighthouse/report.js
+++ b/third_party/blink/renderer/devtools/front_end/audits/lighthouse/report.js
@@ -2565,12 +2565,12 @@
       case 'print-summary':
         this.collapseAllDetails();
         this.closeExportDropdown();
-        self.print();
+        this._print();
         break;
       case 'print-expanded':
         this.expandAllDetails();
         this.closeExportDropdown();
-        self.print();
+        this._print();
         break;
       case 'save-json': {
         const jsonStr = JSON.stringify(this.json, null, 2);
@@ -2607,6 +2607,10 @@
     this._document.removeEventListener('keydown', this.onKeyDown);
   }
 
+  _print() {
+    self.print();
+  }
+
   /**
    * Keydown handler for the document.
    * @param {KeyboardEvent} e
diff --git a/third_party/blink/renderer/devtools/front_end/audits/lighthouse/template.html b/third_party/blink/renderer/devtools/front_end/audits/lighthouse/template.html
index 52373ac..491925c6 100644
--- a/third_party/blink/renderer/devtools/front_end/audits/lighthouse/template.html
+++ b/third_party/blink/renderer/devtools/front_end/audits/lighthouse/template.html
@@ -36,7 +36,7 @@
   </script>
   <script>window.__LIGHTHOUSE_JSON__ = %%LIGHTHOUSE_JSON%%;</script>
   <script>
-    window.addEventListener('DOMContentLoaded', _ => {
+    function __initLighthouseReport__() {
       const dom = new DOM(document);
       const renderer = new ReportRenderer(dom);
 
@@ -47,7 +47,8 @@
       // is in the document.
       const features = new ReportUIFeatures(dom);
       features.initFeatures(window.__LIGHTHOUSE_JSON__);
-    });
+    }
+    window.addEventListener('DOMContentLoaded', __initLighthouseReport__);
 
     document.addEventListener('lh-analytics', e => {
       if (window.ga) {
diff --git a/third_party/blink/renderer/devtools/front_end/audits/lighthouse/templates.html b/third_party/blink/renderer/devtools/front_end/audits/lighthouse/templates.html
index ee4b388c..f11f2431 100644
--- a/third_party/blink/renderer/devtools/front_end/audits/lighthouse/templates.html
+++ b/third_party/blink/renderer/devtools/front_end/audits/lighthouse/templates.html
@@ -263,15 +263,6 @@
       cursor: pointer;
       margin-right: 5px;
     }
-    /*
-      Some features in the top right drop down menu don't work in the DevTools
-      client. They could with some tweaks, but currently they don't. For example:
-      Saving as HTML/JSON - does not bring up a file dialog, as one would expect in DevTools.
-                            also, it saves the AuditsPanel HTML, which is funky.
-    */
-    .lh-devtools .lh-export__button {
-      display: none;
-    }
     .lh-export__button svg {
       fill: var(--lh-export-icon-color);
     }
diff --git a/third_party/blink/renderer/devtools/front_end/audits/module.json b/third_party/blink/renderer/devtools/front_end/audits/module.json
index 7293f94..f58b5e8 100644
--- a/third_party/blink/renderer/devtools/front_end/audits/module.json
+++ b/third_party/blink/renderer/devtools/front_end/audits/module.json
@@ -21,6 +21,7 @@
     ],
     "scripts": [
         "lighthouse/report.js",
+        "lighthouse/report-generator.js",
         "RadioSetting.js",
         "AuditsPanel.js",
         "AuditsController.js",
@@ -34,11 +35,14 @@
         "auditsDialog.css",
         "auditsPanel.css",
         "auditsStartView.css",
+        "lighthouse/template.html",
         "lighthouse/templates.html",
         "lighthouse/report.css",
+        "lighthouse/report-generator.js",
         "lighthouse/report.js"
     ],
     "skip_compilation": [
-      "lighthouse/report.js"
+      "lighthouse/report.js",
+      "lighthouse/report-generator.js"
   ]
 }
diff --git a/third_party/blink/renderer/devtools/front_end/audits_worker/lighthouse/lighthouse-dt-bundle.js b/third_party/blink/renderer/devtools/front_end/audits_worker/lighthouse/lighthouse-dt-bundle.js
index 445954a..5baeebaa 100644
--- a/third_party/blink/renderer/devtools/front_end/audits_worker/lighthouse/lighthouse-dt-bundle.js
+++ b/third_party/blink/renderer/devtools/front_end/audits_worker/lighthouse/lighthouse-dt-bundle.js
@@ -1,4 +1,4 @@
-// lighthouse, browserified. 5.1.0 (c10ea6e3bd0399174b3110a67c21be293e11baa7)
+// lighthouse, browserified. 5.1.0 (911ddc854a5c2a07eff9f4a802120909ea7241bf)
 require=function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a;}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r);},p,p.exports,r,e,n,t);}return n[i].exports;}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o;}return r;}()({"../audits/accessibility/accesskeys":[function(require,module,exports){
 (function(__filename){
 
diff --git a/third_party/blink/renderer/devtools/front_end/devtools_compatibility.js b/third_party/blink/renderer/devtools/front_end/devtools_compatibility.js
index 3607966d..a1a84d4d 100644
--- a/third_party/blink/renderer/devtools/front_end/devtools_compatibility.js
+++ b/third_party/blink/renderer/devtools/front_end/devtools_compatibility.js
@@ -20,6 +20,16 @@
        * @type {!Object.<number, function(?Object)>}
        */
       this._callbacks = {};
+
+      /**
+       * @type {!Array.<!ExtensionDescriptor>}
+       */
+      this._pendingExtensionDescriptors = [];
+
+      /**
+       * @type {?function(!ExtensionDescriptor)}
+       */
+      this._addExtensionCallback = null;
     }
 
     /**
@@ -66,11 +76,14 @@
       // Support for legacy front-ends (<M41).
       if (window['WebInspector'] && window['WebInspector']['addExtensions']) {
         window['WebInspector']['addExtensions'](extensions);
-      } else if (window['InspectorFrontendAPI']) {
+      } else {
         // The addExtensions command is sent as the onload event happens for
-        // DevTools front-end. In case of hosted mode, this
-        // happens before the InspectorFrontendAPI is initialized.
-        this._dispatchOnInspectorFrontendAPI('addExtensions', [extensions]);
+        // DevTools front-end. We should buffer this command until the frontend
+        // is ready for it.
+        if (this._addExtensionCallback)
+          extensions.forEach(this._addExtensionCallback);
+        else
+          this._pendingExtensionDescriptors.pushAll(extensions);
       }
     }
 
@@ -226,6 +239,17 @@
     }
 
     /**
+     * @param {function(!ExtensionDescriptor)} callback
+     */
+    setAddExtensionCallback(callback) {
+      this._addExtensionCallback = callback;
+      if (this._pendingExtensionDescriptors.length) {
+        this._pendingExtensionDescriptors.forEach(this._addExtensionCallback);
+        this._pendingExtensionDescriptors = [];
+      }
+    }
+
+    /**
      * @param {boolean} hard
      */
     reloadInspectedPage(hard) {
@@ -777,6 +801,14 @@
       return DevToolsHost.isHostedMode();
     }
 
+    /**
+     * @override
+     * @param {function(!ExtensionDescriptor)} callback
+     */
+    setAddExtensionCallback(callback) {
+      DevToolsAPI.setAddExtensionCallback(callback);
+    }
+
     // Backward-compatible methods below this line --------------------------------------------
 
     /**
diff --git a/third_party/blink/renderer/devtools/front_end/extensions/ExtensionServer.js b/third_party/blink/renderer/devtools/front_end/extensions/ExtensionServer.js
index 666471a..290f1256 100644
--- a/third_party/blink/renderer/devtools/front_end/extensions/ExtensionServer.js
+++ b/third_party/blink/renderer/devtools/front_end/extensions/ExtensionServer.js
@@ -83,19 +83,13 @@
     window.addEventListener('message', this._onWindowMessage.bind(this), false);  // Only for main window.
 
     InspectorFrontendHost.events.addEventListener(
-        InspectorFrontendHostAPI.Events.AddExtensions, this._addExtensions, this);
-    InspectorFrontendHost.events.addEventListener(
         InspectorFrontendHostAPI.Events.SetInspectedTabId, this._setInspectedTabId, this);
 
     this._initExtensions();
   }
 
   initializeExtensions() {
-    this._initializeCommandIssued = true;
-    if (this._pendingExtensionInfos) {
-      this._pendingExtensionInfos.forEach(this._addExtension, this);
-      delete this._pendingExtensionInfos;
-    }
+    InspectorFrontendHost.setAddExtensionCallback(this._addExtension.bind(this));
   }
 
   /**
@@ -661,20 +655,6 @@
   /**
    * @param {!Common.Event} event
    */
-  _addExtensions(event) {
-    if (Extensions.extensionServer._overridePlatformExtensionAPIForTest)
-      window.buildPlatformExtensionAPI = Extensions.extensionServer._overridePlatformExtensionAPIForTest;
-
-    const extensionInfos = /** @type {!Array.<!ExtensionDescriptor>} */ (event.data);
-    if (this._initializeCommandIssued)
-      extensionInfos.forEach(this._addExtension, this);
-    else
-      this._pendingExtensionInfos = extensionInfos;
-  }
-
-  /**
-   * @param {!Common.Event} event
-   */
   _setInspectedTabId(event) {
     this._inspectedTabId = /** @type {string} */ (event.data);
   }
diff --git a/third_party/blink/renderer/devtools/front_end/extensions_test_runner/ExtensionsTestRunner.js b/third_party/blink/renderer/devtools/front_end/extensions_test_runner/ExtensionsTestRunner.js
index 0daa82d..f900a8eb8 100644
--- a/third_party/blink/renderer/devtools/front_end/extensions_test_runner/ExtensionsTestRunner.js
+++ b/third_party/blink/renderer/devtools/front_end/extensions_test_runner/ExtensionsTestRunner.js
@@ -57,10 +57,8 @@
   let extensionURL = pageURL.replace(/^(https?:\/\/[^\/]*\/).*$/, '$1') + 'devtools/resources/extension-main.html';
   extensionURL = extensionURL.replace('127.0.0.1', extensionsHost);
 
-  InspectorFrontendAPI.addExtensions(
-      [{startPage: extensionURL, name: 'test extension', exposeWebInspectorNamespace: true}]);
-
-  Extensions.extensionServer.initializeExtensions();
+  Extensions.extensionServer._addExtension(
+      {startPage: extensionURL, name: 'test extension', exposeWebInspectorNamespace: true});
 };
 
 (function disableLogging() {
diff --git a/third_party/blink/renderer/devtools/front_end/externs.js b/third_party/blink/renderer/devtools/front_end/externs.js
index ace7420..0d8299b 100644
--- a/third_party/blink/renderer/devtools/front_end/externs.js
+++ b/third_party/blink/renderer/devtools/front_end/externs.js
@@ -909,7 +909,13 @@
  * @constructor
  * @param {!DOM} dom
  */
-const ReportUIFeatures = function(dom) {};
+const ReportUIFeatures = function(dom) {
+  /** @type {!ReportRenderer.ReportJSON} */
+  this.json;
+
+  /** @type {!Document} */
+  this._document;
+};
 
 ReportUIFeatures.prototype = {
   /**
@@ -921,6 +927,8 @@
    * @param {!ReportRenderer.ReportJSON} report
    */
   initFeatures: function(report) {},
+
+  _resetUIState: function() {},
 };
 
 /**
diff --git a/third_party/blink/renderer/devtools/front_end/host/InspectorFrontendHost.js b/third_party/blink/renderer/devtools/front_end/host/InspectorFrontendHost.js
index bcd0d2c..af2b1633 100644
--- a/third_party/blink/renderer/devtools/front_end/host/InspectorFrontendHost.js
+++ b/third_party/blink/renderer/devtools/front_end/host/InspectorFrontendHost.js
@@ -478,6 +478,14 @@
   isHostedMode() {
     return true;
   }
+
+  /**
+   * @override
+   * @param {function(!ExtensionDescriptor)} callback
+   */
+  setAddExtensionCallback(callback) {
+    // Extensions are not supported in hosted mode.
+  }
 };
 
 /**
diff --git a/third_party/blink/renderer/devtools/front_end/host/InspectorFrontendHostAPI.js b/third_party/blink/renderer/devtools/front_end/host/InspectorFrontendHostAPI.js
index 6bbe4f6..f148630 100644
--- a/third_party/blink/renderer/devtools/front_end/host/InspectorFrontendHostAPI.js
+++ b/third_party/blink/renderer/devtools/front_end/host/InspectorFrontendHostAPI.js
@@ -25,7 +25,6 @@
 
 /** @enum {symbol} */
 InspectorFrontendHostAPI.Events = {
-  AddExtensions: Symbol('addExtensions'),
   AppendedToURL: Symbol('appendedToURL'),
   CanceledSaveURL: Symbol('canceledSaveURL'),
   ContextMenuCleared: Symbol('contextMenuCleared'),
@@ -56,7 +55,6 @@
 };
 
 InspectorFrontendHostAPI.EventDescriptors = [
-  [InspectorFrontendHostAPI.Events.AddExtensions, 'addExtensions', ['extensions']],
   [InspectorFrontendHostAPI.Events.AppendedToURL, 'appendedToURL', ['url']],
   [InspectorFrontendHostAPI.Events.CanceledSaveURL, 'canceledSaveURL', ['url']],
   [InspectorFrontendHostAPI.Events.ContextMenuCleared, 'contextMenuCleared', []],
@@ -328,5 +326,10 @@
   /**
    * @return {boolean}
    */
-  isHostedMode() {}
+  isHostedMode() {},
+
+  /**
+   * @param {function(!ExtensionDescriptor)} callback
+   */
+  setAddExtensionCallback(callback) {}
 };
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
index ece20fa..3f1131a 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -2876,7 +2876,9 @@
       name_sources->back().native_source = kAXTextFromNativeHTMLLabel;
     }
 
-    LabelsNodeList* labels = html_element->labels();
+    LabelsNodeList* labels = nullptr;
+    if (AXObjectCache().MayHaveHTMLLabel(*html_element))
+      labels = html_element->labels();
     if (labels && labels->length() > 0) {
       HeapVector<Member<Element>> label_elements;
       for (unsigned label_index = 0; label_index < labels->length();
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
index 27b114f..193cc9e 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -1017,6 +1017,19 @@
   relation_cache_->UpdateAriaOwns(owner, id_vector, owned_children);
 }
 
+bool AXObjectCacheImpl::MayHaveHTMLLabel(const HTMLElement& elem) {
+  // Return false if this type of element will not accept a <label for> label.
+  if (!elem.IsLabelable())
+    return false;
+
+  // Return true if a <label for> pointed to this element at some point.
+  if (relation_cache_->MayHaveHTMLLabelViaForAttribute(elem))
+    return true;
+
+  // Return true if any amcestor is a label, as in <label><input></label>.
+  return Traversal<HTMLLabelElement>::FirstAncestor(elem);
+}
+
 void AXObjectCacheImpl::CheckedStateChanged(Node* node) {
   PostNotification(node, ax::mojom::Event::kCheckedStateChanged);
 }
@@ -1388,7 +1401,8 @@
 }
 
 void AXObjectCacheImpl::LabelChangedWithCleanLayout(Element* element) {
-  TextChangedWithCleanLayout(ToHTMLLabelElement(element)->control());
+  // Will call back to TextChanged() when done updating relation cache.
+  relation_cache_->LabelChanged(element);
 }
 
 void AXObjectCacheImpl::InlineTextBoxesUpdated(
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
index e4f7886..b5fb09e 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
@@ -233,6 +233,8 @@
                       const Vector<String>& id_vector,
                       HeapVector<Member<AXObject>>& owned_children);
 
+  bool MayHaveHTMLLabel(const HTMLElement& elem);
+
   // Synchronously returns whether or not we currently have permission to
   // call AOM event listeners.
   bool CanCallAOMEventListeners() const;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc b/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc
index 895d5e2..30f0d383 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc
@@ -9,6 +9,8 @@
 
 namespace blink {
 
+using namespace html_names;
+
 AXRelationCache::AXRelationCache(AXObjectCacheImpl* object_cache)
     : object_cache_(object_cache) {}
 
@@ -167,6 +169,14 @@
                                       validated_owned_child_axids);
 }
 
+bool AXRelationCache::MayHaveHTMLLabelViaForAttribute(
+    const HTMLElement& labelable) {
+  const AtomicString& id = labelable.GetIdAttribute();
+  if (id.IsEmpty())
+    return false;
+  return all_previously_seen_label_target_ids_.Contains(id);
+}
+
 // Fill source_objects with AXObjects for relations pointing to target.
 void AXRelationCache::GetReverseRelated(
     Node* target,
@@ -260,8 +270,12 @@
 }
 
 void AXRelationCache::LabelChanged(Node* node) {
-  if (HTMLElement* control = ToHTMLLabelElement(node)->control())
-    TextChanged(Get(control));
+  const AtomicString& id = ToHTMLElement(node)->FastGetAttribute(kForAttr);
+  if (!id.IsEmpty()) {
+    all_previously_seen_label_target_ids_.insert(id);
+    if (HTMLElement* control = ToHTMLLabelElement(node)->control())
+      TextChanged(Get(control));
+  }
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/accessibility/ax_relation_cache.h b/third_party/blink/renderer/modules/accessibility/ax_relation_cache.h
index ab482f4f..a96097f 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_relation_cache.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_relation_cache.h
@@ -38,6 +38,9 @@
                       const Vector<String>& id_vector,
                       HeapVector<Member<AXObject>>& owned_children);
 
+  // Return true if any label ever pointed to the element via the for attribute.
+  bool MayHaveHTMLLabelViaForAttribute(const HTMLElement&);
+
   // Given an element in the DOM tree that was either just added or whose id
   // just changed, check to see if another object wants to be its parent due to
   // aria-owns. If so, update the tree by calling childrenChanged() on the
@@ -54,6 +57,8 @@
   void UpdateReverseRelations(const AXObject* relation_source,
                               const Vector<String>& target_ids);
 
+  void LabelChanged(Node*);
+
  private:
   // If any object is related to this object via <label for>, aria-owns,
   // aria-describedby or aria-labeledby, update the text for the related object.
@@ -90,13 +95,19 @@
   //   and fire the appropriate change events.
   HashMap<String, HashSet<AXID>> id_attr_to_related_mapping_;
 
+  // HTML id attributes that at one time havehad a <label for> pointing to it.
+  // IDs are not necessarily removed from this set. It is not necessary to
+  // remove IDs as false positives are ok. Being able to determine that a
+  // labelable element has never had an associated label allows the accessible
+  // name calculation to be optimized.
+  HashSet<AtomicString> all_previously_seen_label_target_ids_;
+
   // Helpers that call back into object cache
   AXObject* ObjectFromAXID(AXID) const;
   AXObject* GetOrCreate(Node*);
   AXObject* Get(Node*);
   void ChildrenChanged(AXObject*);
   void TextChanged(AXObject*);
-  void LabelChanged(Node*);
 
   DISALLOW_COPY_AND_ASSIGN(AXRelationCache);
 };
diff --git a/third_party/blink/renderer/modules/background_sync/periodic_sync_manager.cc b/third_party/blink/renderer/modules/background_sync/periodic_sync_manager.cc
index 7799d56..92344aff 100644
--- a/third_party/blink/renderer/modules/background_sync/periodic_sync_manager.cc
+++ b/third_party/blink/renderer/modules/background_sync/periodic_sync_manager.cc
@@ -47,6 +47,47 @@
   return promise;
 }
 
+ScriptPromise PeriodicSyncManager::getTags(ScriptState* script_state) {
+  auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
+  ScriptPromise promise = resolver->Promise();
+
+  // Creating a Periodic Background Sync registration requires an activated
+  // service worker, so if |registration_| has not been activated yet, we can
+  // skip the Mojo roundtrip.
+  if (!registration_->active()) {
+    return ScriptPromise::Cast(script_state,
+                               v8::Array::New(script_state->GetIsolate()));
+  }
+
+  // TODO(crbug.com/932591): Optimize this to only get the tags from the browser
+  // process instead of the registrations themselves.
+  GetBackgroundSyncServicePtr()->GetRegistrations(
+      registration_->RegistrationId(),
+      WTF::Bind(&PeriodicSyncManager::GetRegistrationsCallback,
+                WrapPersistent(this), WrapPersistent(resolver)));
+
+  return promise;
+}
+
+ScriptPromise PeriodicSyncManager::unregister(ScriptState* script_state,
+                                              const String& tag) {
+  if (!registration_->active()) {
+    return ScriptPromise::RejectWithDOMException(
+        script_state, MakeGarbageCollected<DOMException>(
+                          DOMExceptionCode::kInvalidStateError,
+                          "Unregister failed - no active Service Worker"));
+  }
+
+  auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
+  ScriptPromise promise = resolver->Promise();
+
+  GetBackgroundSyncServicePtr()->Unregister(
+      registration_->RegistrationId(), tag,
+      WTF::Bind(&PeriodicSyncManager::UnregisterCallback, WrapPersistent(this),
+                WrapPersistent(resolver)));
+  return promise;
+}
+
 const mojom::blink::PeriodicBackgroundSyncServicePtr&
 PeriodicSyncManager::GetBackgroundSyncServicePtr() {
   if (!background_sync_service_.get()) {
@@ -69,8 +110,7 @@
       break;
     case mojom::blink::BackgroundSyncError::STORAGE:
       resolver->Reject(MakeGarbageCollected<DOMException>(
-          DOMExceptionCode::kUnknownError,
-          "Periodic Background Sync is disabled."));
+          DOMExceptionCode::kUnknownError, "Unknown error."));
       break;
     case mojom::blink::BackgroundSyncError::NOT_ALLOWED:
       resolver->Reject(MakeGarbageCollected<DOMException>(
@@ -89,6 +129,59 @@
   }
 }
 
+void PeriodicSyncManager::GetRegistrationsCallback(
+    ScriptPromiseResolver* resolver,
+    mojom::blink::BackgroundSyncError error,
+    WTF::Vector<mojom::blink::SyncRegistrationOptionsPtr> registrations) {
+  switch (error) {
+    case mojom::blink::BackgroundSyncError::NONE: {
+      Vector<String> tags;
+      for (const auto& registration : registrations)
+        tags.push_back(registration->tag);
+      resolver->Resolve(tags);
+      break;
+    }
+    case mojom::blink::BackgroundSyncError::NOT_FOUND:
+    case mojom::blink::BackgroundSyncError::NOT_ALLOWED:
+    case mojom::blink::BackgroundSyncError::PERMISSION_DENIED:
+      // These errors should never be returned from
+      // BackgroundSyncManager::GetPeriodicSyncRegistrations
+      NOTREACHED();
+      break;
+    case mojom::blink::BackgroundSyncError::STORAGE:
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kUnknownError, "Unknown error."));
+      break;
+    case mojom::blink::BackgroundSyncError::NO_SERVICE_WORKER:
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kUnknownError, "No service worker is active."));
+      break;
+  }
+}
+
+void PeriodicSyncManager::UnregisterCallback(
+    ScriptPromiseResolver* resolver,
+    mojom::blink::BackgroundSyncError error) {
+  switch (error) {
+    case mojom::blink::BackgroundSyncError::NONE:
+      resolver->Resolve();
+      break;
+    case mojom::blink::BackgroundSyncError::NO_SERVICE_WORKER:
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kUnknownError, "No service worker is active."));
+      break;
+    case mojom::blink::BackgroundSyncError::STORAGE:
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kUnknownError, "Unknown error."));
+      break;
+    case mojom::blink::BackgroundSyncError::NOT_FOUND:
+    case mojom::blink::BackgroundSyncError::NOT_ALLOWED:
+    case mojom::BackgroundSyncError::PERMISSION_DENIED:
+      NOTREACHED();
+      break;
+  }
+}
+
 void PeriodicSyncManager::Trace(blink::Visitor* visitor) {
   visitor->Trace(registration_);
   ScriptWrappable::Trace(visitor);
diff --git a/third_party/blink/renderer/modules/background_sync/periodic_sync_manager.h b/third_party/blink/renderer/modules/background_sync/periodic_sync_manager.h
index a61fc8c5..efafaef 100644
--- a/third_party/blink/renderer/modules/background_sync/periodic_sync_manager.h
+++ b/third_party/blink/renderer/modules/background_sync/periodic_sync_manager.h
@@ -37,6 +37,8 @@
   ScriptPromise registerPeriodicSync(ScriptState* script_state,
                                      const String& tag,
                                      const BackgroundSyncOptions* options);
+  ScriptPromise getTags(ScriptState* script_state);
+  ScriptPromise unregister(ScriptState* script_state, const String& tag);
 
   void Trace(blink::Visitor* visitor) override;
 
@@ -51,6 +53,12 @@
   void RegisterCallback(ScriptPromiseResolver* resolver,
                         mojom::blink::BackgroundSyncError error,
                         mojom::blink::SyncRegistrationOptionsPtr options);
+  void GetRegistrationsCallback(
+      ScriptPromiseResolver* resolver,
+      mojom::blink::BackgroundSyncError error,
+      WTF::Vector<mojom::blink::SyncRegistrationOptionsPtr> registrations);
+  void UnregisterCallback(ScriptPromiseResolver* resolver,
+                          mojom::blink::BackgroundSyncError error);
 
   Member<ServiceWorkerRegistration> registration_;
   scoped_refptr<base::SequencedTaskRunner> task_runner_;
diff --git a/third_party/blink/renderer/modules/background_sync/periodic_sync_manager.idl b/third_party/blink/renderer/modules/background_sync/periodic_sync_manager.idl
index 2937412f..153c4c53 100644
--- a/third_party/blink/renderer/modules/background_sync/periodic_sync_manager.idl
+++ b/third_party/blink/renderer/modules/background_sync/periodic_sync_manager.idl
@@ -10,4 +10,6 @@
     RuntimeEnabled=PeriodicBackgroundSync
 ] interface PeriodicSyncManager {
     [MeasureAs=PeriodicBackgroundSyncRegister,CallWith=ScriptState,ImplementedAs=registerPeriodicSync] Promise<void> register(DOMString tag, optional BackgroundSyncOptions options);
+    [MeasureAs=PeriodicBackgroundSyncGetTags, CallWith=ScriptState] Promise<sequence<DOMString>> getTags();
+    [MeasureAs=PeriodicBackgroundSyncUnregister,CallWith=ScriptState] Promise<void> unregister(DOMString tag);
 };
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
index bd866bb..e672efd 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
@@ -705,6 +705,14 @@
   float fwidth = clampTo<float>(width);
   float fheight = clampTo<float>(height);
 
+  // We are assuming that if the pattern is not accelerated and the current
+  // canvas is accelerated, we will not be able to hold the pattern into the
+  // canvas, probably because it does not fit. That's why we disable the
+  // acceleration to be sure that it will work
+  if (IsAccelerated() && GetState().HasPattern() &&
+      !GetState().PatternIsAccelerated())
+    DisableAcceleration();
+
   SkRect rect = SkRect::MakeXYWH(fx, fy, fwidth, fheight);
   Draw([&rect](cc::PaintCanvas* c, const PaintFlags* flags)  // draw lambda
        { c->drawRect(rect, *flags); },
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_state.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_state.cc
index 03258447..874ad140 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_state.cc
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_state.cc
@@ -612,4 +612,15 @@
   return flags;
 }
 
+bool CanvasRenderingContext2DState::HasPattern() const {
+  return FillStyle() && FillStyle()->GetCanvasPattern() &&
+         FillStyle()->GetCanvasPattern()->GetPattern();
+}
+
+// Only to be used if the CanvasRenderingContext2dState has Pattern
+bool CanvasRenderingContext2DState::PatternIsAccelerated() const {
+  DCHECK(HasPattern());
+  return FillStyle()->GetCanvasPattern()->GetPattern()->IsTextureBacked();
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_state.h b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_state.h
index ed803ee..f793feb 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_state.h
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_state.h
@@ -115,6 +115,11 @@
   void SetFillStyle(CanvasStyle*);
   CanvasStyle* FillStyle() const { return fill_style_.Get(); }
 
+  bool HasPattern() const;
+
+  // Only to be used if the CanvasRenderingContext2dState has Pattern
+  bool PatternIsAccelerated() const;
+
   CanvasStyle* Style(PaintType) const;
 
   enum Direction { kDirectionInherit, kDirectionRTL, kDirectionLTR };
diff --git a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc
index c3b2561..4bf926ee 100644
--- a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc
+++ b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc
@@ -352,7 +352,7 @@
     // the "inherit", "initial" and "unset" values must be ignored.
     const CSSValue* font_value =
         style->GetPropertyCSSValue(CSSPropertyID::kFontSize);
-    if (font_value && font_value->IsCSSWideKeyword())
+    if (!font_value || font_value->IsCSSWideKeyword())
       return;
 
     FontDescription desc =
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_index.h b/third_party/blink/renderer/modules/indexeddb/idb_index.h
index 221839a1..0c09700a 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_index.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_index.h
@@ -58,6 +58,13 @@
   void setName(const String& name, ExceptionState&);
   IDBObjectStore* objectStore() const { return object_store_.Get(); }
   ScriptValue keyPath(ScriptState*) const;
+
+  // Per spec prose, keyPath attribute should return the same object each time
+  // (if it is not just a primitive type). The IDL cannot use [SameObject]
+  // because the key path may not be an 'object'. So use [CachedAttribute],
+  // but never dirty the cache.
+  bool IsKeyPathDirty() const { return false; }
+
   bool unique() const { return Metadata().unique; }
   bool multiEntry() const { return Metadata().multi_entry; }
 
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_index.idl b/third_party/blink/renderer/modules/indexeddb/idb_index.idl
index cc8becb..ebd480e4 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_index.idl
+++ b/third_party/blink/renderer/modules/indexeddb/idb_index.idl
@@ -30,7 +30,7 @@
 ] interface IDBIndex {
     [RaisesException=Setter] attribute DOMString name;
     [SameObject] readonly attribute IDBObjectStore objectStore;
-    [CallWith=ScriptState] readonly attribute any keyPath;
+    [CallWith=ScriptState, CachedAttribute=IsKeyPathDirty] readonly attribute any keyPath;
     readonly attribute boolean multiEntry;
     readonly attribute boolean unique;
 
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_object_store.h b/third_party/blink/renderer/modules/indexeddb/idb_object_store.h
index 8581ce9..c742dbd 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_object_store.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_object_store.h
@@ -59,6 +59,12 @@
   const IDBObjectStoreMetadata& Metadata() const { return *metadata_; }
   const IDBKeyPath& IdbKeyPath() const { return Metadata().key_path; }
 
+  // Per spec prose, keyPath attribute should return the same object each time
+  // (if it is not just a primitive type). The IDL cannot use [SameObject]
+  // because the key path may not be an 'object'. So use [CachedAttribute],
+  // but never dirty the cache.
+  bool IsKeyPathDirty() const { return false; }
+
   // Implement the IDBObjectStore IDL
   int64_t Id() const { return Metadata().id; }
   const String& name() const { return Metadata().name; }
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_object_store.idl b/third_party/blink/renderer/modules/indexeddb/idb_object_store.idl
index c113f5f..481feda3 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_object_store.idl
+++ b/third_party/blink/renderer/modules/indexeddb/idb_object_store.idl
@@ -29,7 +29,7 @@
     Exposed=(Window,Worker)
 ] interface IDBObjectStore {
     [RaisesException=Setter] attribute DOMString name;
-    [CallWith=ScriptState] readonly attribute any keyPath;
+    [CallWith=ScriptState, CachedAttribute=IsKeyPathDirty] readonly attribute any keyPath;
     readonly attribute DOMStringList indexNames;
     [SameObject] readonly attribute IDBTransaction transaction;
     readonly attribute boolean autoIncrement;
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_text_track_list_element.h b/third_party/blink/renderer/modules/media_controls/elements/media_control_text_track_list_element.h
index 49b7e7e..a0ee0ce7 100644
--- a/third_party/blink/renderer/modules/media_controls/elements/media_control_text_track_list_element.h
+++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_text_track_list_element.h
@@ -32,7 +32,7 @@
   // the "Off" item when the parameter is null.
   Element* CreateTextTrackListItem(TextTrack*);
 
-  // Creates the header element of the text track list (modern only).
+  // Creates the header element of the text track list.
   Element* CreateTextTrackHeaderItem();
 };
 
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc b/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc
index c5d14af0..993c52a9 100644
--- a/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc
+++ b/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc
@@ -99,11 +99,9 @@
 
 namespace {
 
-// TODO(steimel): When modern media controls launches, remove above constants
-// and rename below constants.
 // (2px left border + 6px left padding + 56px button + 6px right padding + 2px
 // right border) = 72px.
-constexpr int kModernMinWidthForOverlayPlayButton = 72;
+constexpr int kMinWidthForOverlayPlayButton = 72;
 
 constexpr int kMinScrubbingMessageWidth = 300;
 
@@ -119,8 +117,8 @@
 };
 
 // The padding in pixels inside the button panel.
-constexpr int kModernControlsAudioButtonPadding = 20;
-constexpr int kModernControlsVideoButtonPadding = 26;
+constexpr int kAudioButtonPadding = 20;
+constexpr int kVideoButtonPadding = 26;
 
 const char kShowDefaultPosterCSSClass[] = "use-default-poster";
 const char kActAsAudioControlsCSSClass[] = "audio-only";
@@ -186,12 +184,11 @@
 
 // If you change this value, then also update the corresponding value in
 // web_tests/media/media-controls.js.
-constexpr base::TimeDelta
-    kModernTimeWithoutMouseMovementBeforeHidingMediaControls =
-        base::TimeDelta::FromSecondsD(2.5);
+constexpr base::TimeDelta kTimeWithoutMouseMovementBeforeHidingMediaControls =
+    base::TimeDelta::FromSecondsD(2.5);
 
 base::TimeDelta GetTimeWithoutMouseMovementBeforeHidingMediaControls() {
-  return kModernTimeWithoutMouseMovementBeforeHidingMediaControls;
+  return kTimeWithoutMouseMovementBeforeHidingMediaControls;
 }
 
 }  // namespace
@@ -424,39 +421,33 @@
 //     (-webkit-media-controls)
 // +-MediaControlLoadingPanelElement
 // |    (-internal-media-controls-loading-panel)
-// |    {if ModernMediaControlsEnabled}
 // +-MediaControlOverlayEnclosureElement
 // |    (-webkit-media-controls-overlay-enclosure)
-// | +-MediaControlOverlayPlayButtonElement
-// | |    (-webkit-media-controls-overlay-play-button)
-// | | {if mediaControlsOverlayPlayButtonEnabled}
 // | \-MediaControlCastButtonElement
 // |     (-internal-media-controls-overlay-cast-button)
 // \-MediaControlPanelEnclosureElement
 //   |    (-webkit-media-controls-enclosure)
 //   \-MediaControlPanelElement
 //     |    (-webkit-media-controls-panel)
-//     |  {if ModernMediaControlsEnabled and is video element and is Android}
 //     +-MediaControlScrubbingMessageElement
 //     |  (-internal-media-controls-scrubbing-message)
-//     |  {if ModernMediaControlsEnabled, otherwise
-//     |   contents are directly attached to parent.
+//     |  {if is video element}
 //     +-MediaControlOverlayPlayButtonElement
 //     |  (-webkit-media-controls-overlay-play-button)
-//     |  {if ModernMediaControlsEnabled}
+//     |  {if mediaControlsOverlayPlayButtonEnabled}
 //     +-MediaControlButtonPanelElement
 //     |  |  (-internal-media-controls-button-panel)
 //     |  |  <video> only, otherwise children are directly attached to parent
 //     |  +-MediaControlPlayButtonElement
 //     |  |    (-webkit-media-controls-play-button)
-//     |  |    {only present if audio only or ModernMediaControls is disabled}
+//     |  |    {if !mediaControlsOverlayPlayButtonEnabled}
 //     |  +-MediaControlCurrentTimeDisplayElement
 //     |  |    (-webkit-media-controls-current-time-display)
 //     |  +-MediaControlRemainingTimeDisplayElement
 //     |  |    (-webkit-media-controls-time-remaining-display)
 //     |  +-HTMLDivElement
 //     |  |    (-internal-media-controls-button-spacer)
-//     |  |    {if ModernMediaControls is enabled and is video element}
+//     |  |    {if is video element}
 //     |  +-MediaControlVolumeControlContainerElement
 //     |  |  |  (-webkit-media-controls-volume-control-container)
 //     |  |  +-HTMLDivElement
@@ -465,20 +456,10 @@
 //     |  |  |    (-webkit-media-controls-mute-button)
 //     |  |  +-MediaControlVolumeSliderElement
 //     |  |       (-webkit-media-controls-volume-slider)
-//     |  |       {if not ModernMediaControlsEnabled}
 //     |  +-MediaControlPictureInPictureButtonElement
 //     |  |    (-webkit-media-controls-picture-in-picture-button)
 //     |  +-MediaControlFullscreenButtonElement
 //     |  |    (-webkit-media-controls-fullscreen-button)
-//     |  +-MediaControlDownloadButtonElement
-//     |  |    (-internal-media-controls-download-button)
-//     |  |    {on the overflow menu if ModernMediaControls is enabled}
-//     |  +-MediaControlToggleClosedCaptionsButtonElement
-//     |  |    (-webkit-media-controls-toggle-closed-captions-button)
-//     |  |    {on the overflow menu if ModernMediaControls is enabled}
-//     |  +-MediaControlCastButtonElement
-//     |       (-internal-media-controls-cast-button)
-//     |       {on the overflow menu if ModernMediaControls is enabled}
 //     \-MediaControlTimelineElement
 //          (-webkit-media-controls-timeline)
 // +-MediaControlTextTrackListElement
@@ -521,8 +502,8 @@
 
   panel_ = MakeGarbageCollected<MediaControlPanelElement>(*this);
 
-  // If using the modern media controls, the buttons should belong to a
-  // seperate button panel. This is because they are displayed in two lines.
+  // On the video controls, the buttons belong to a separate button panel. This
+  // is because they are displayed in two lines.
   if (ShouldShowVideoControls()) {
     media_button_panel_ =
         MakeGarbageCollected<MediaControlButtonPanelElement>(*this);
@@ -1255,7 +1236,7 @@
       WebSize overlay_play_button_size =
           overlay_play_button_->GetSizeOrDefault();
       if (controls_size.height >= overlay_play_button_size.height &&
-          controls_size.width >= kModernMinWidthForOverlayPlayButton) {
+          controls_size.width >= kMinWidthForOverlayPlayButton) {
         overlay_play_button_->SetDoesFit(true);
         controls_size.height -= overlay_play_button_size.height;
       } else {
@@ -1263,7 +1244,7 @@
       }
     }
 
-    controls_size.width -= kModernControlsVideoButtonPadding;
+    controls_size.width -= kVideoButtonPadding;
 
     // Allocate vertical room for the column elements.
     for (MediaControlElementBase* element : column_elements) {
@@ -1280,7 +1261,7 @@
     play_button_->SetIsWanted(!overlay_play_button_ ||
                               !overlay_play_button_->DoesFit());
   } else {
-    controls_size.width -= kModernControlsAudioButtonPadding;
+    controls_size.width -= kAudioButtonPadding;
 
     // Undo any IsWanted/DoesFit changes made in the above block if we're
     // switching to act as audio controls.
@@ -1740,9 +1721,9 @@
       html_names::kDisabledAttr,
       MediaElement().HasAudio() ? AtomicString() : AtomicString(""));
 
-  // On modern media controls, if the volume slider is being used we don't want
-  // to update controls visibility, since this can shift the position of the
-  // volume slider and make it unusable.
+  // If the volume slider is being used we don't want to update controls
+  // visibility, since this can shift the position of the volume slider and make
+  // it unusable.
   if (!volume_slider_ || !volume_slider_->IsHovered())
     BatchedControlUpdate batch(this);
 }
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_resource_loader.cc b/third_party/blink/renderer/modules/media_controls/media_controls_resource_loader.cc
index 211a270a..6120df8 100644
--- a/third_party/blink/renderer/modules/media_controls/media_controls_resource_loader.cc
+++ b/third_party/blink/renderer/modules/media_controls/media_controls_resource_loader.cc
@@ -31,51 +31,49 @@
 MediaControlsResourceLoader::~MediaControlsResourceLoader() = default;
 
 String MediaControlsResourceLoader::GetMediaControlsCSS() const {
-  return UncompressResourceAsString(IDR_UASTYLE_MODERN_MEDIA_CONTROLS_CSS);
+  return UncompressResourceAsString(IDR_UASTYLE_MEDIA_CONTROLS_CSS);
 }
 
 String MediaControlsResourceLoader::GetMediaControlsAndroidCSS() const {
-  return UncompressResourceAsString(
-      IDR_UASTYLE_MODERN_MEDIA_CONTROLS_ANDROID_CSS);
+  return UncompressResourceAsString(IDR_UASTYLE_MEDIA_CONTROLS_ANDROID_CSS);
 }
 
 // static
 String MediaControlsResourceLoader::GetShadowTimelineStyleSheet() {
   return UncompressResourceAsString(
-      IDR_SHADOWSTYLE_MODERN_MEDIA_CONTROLS_TIMELINE_CSS);
+      IDR_SHADOWSTYLE_MEDIA_CONTROLS_TIMELINE_CSS);
 }
 
 // static
 String MediaControlsResourceLoader::GetShadowLoadingStyleSheet() {
-  return UncompressResourceAsString(
-      IDR_SHADOWSTYLE_MODERN_MEDIA_CONTROLS_LOADING_CSS);
+  return UncompressResourceAsString(IDR_SHADOWSTYLE_MEDIA_CONTROLS_LOADING_CSS);
 }
 
 // static
 String MediaControlsResourceLoader::GetJumpSVGImage() {
-  return UncompressResourceAsString(IDR_MODERN_MEDIA_CONTROLS_JUMP_SVG);
+  return UncompressResourceAsString(IDR_MEDIA_CONTROLS_JUMP_SVG);
 }
 
 // static
 String MediaControlsResourceLoader::GetArrowRightSVGImage() {
-  return UncompressResourceAsString(IDR_MODERN_MEDIA_CONTROLS_ARROW_RIGHT_SVG);
+  return UncompressResourceAsString(IDR_MEDIA_CONTROLS_ARROW_RIGHT_SVG);
 }
 
 // static
 String MediaControlsResourceLoader::GetArrowLeftSVGImage() {
-  return UncompressResourceAsString(IDR_MODERN_MEDIA_CONTROLS_ARROW_LEFT_SVG);
+  return UncompressResourceAsString(IDR_MEDIA_CONTROLS_ARROW_LEFT_SVG);
 }
 
 // static
 String MediaControlsResourceLoader::GetScrubbingMessageStyleSheet() {
   return UncompressResourceAsString(
-      IDR_SHADOWSTYLE_MODERN_MEDIA_CONTROLS_SCRUBBING_MESSAGE_CSS);
+      IDR_SHADOWSTYLE_MEDIA_CONTROLS_SCRUBBING_MESSAGE_CSS);
 }
 
 // static
 String MediaControlsResourceLoader::GetAnimatedArrowStyleSheet() {
   return UncompressResourceAsString(
-      IDR_SHADOWSTYLE_MODERN_MEDIA_CONTROLS_ANIMATED_ARROW_CSS);
+      IDR_SHADOWSTYLE_MEDIA_CONTROLS_ANIMATED_ARROW_CSS);
 }
 
 // static
diff --git a/third_party/blink/renderer/modules/media_controls/resources/default_100_percent/modern/gradient_bg.png b/third_party/blink/renderer/modules/media_controls/resources/default_100_percent/gradient_bg.png
similarity index 100%
rename from third_party/blink/renderer/modules/media_controls/resources/default_100_percent/modern/gradient_bg.png
rename to third_party/blink/renderer/modules/media_controls/resources/default_100_percent/gradient_bg.png
Binary files differ
diff --git a/third_party/blink/renderer/modules/media_controls/resources/default_100_percent/modern/loading_mask_1.svg b/third_party/blink/renderer/modules/media_controls/resources/default_100_percent/loading_mask_1.svg
similarity index 100%
rename from third_party/blink/renderer/modules/media_controls/resources/default_100_percent/modern/loading_mask_1.svg
rename to third_party/blink/renderer/modules/media_controls/resources/default_100_percent/loading_mask_1.svg
diff --git a/third_party/blink/renderer/modules/media_controls/resources/default_100_percent/modern/loading_mask_2.svg b/third_party/blink/renderer/modules/media_controls/resources/default_100_percent/loading_mask_2.svg
similarity index 100%
rename from third_party/blink/renderer/modules/media_controls/resources/default_100_percent/modern/loading_mask_2.svg
rename to third_party/blink/renderer/modules/media_controls/resources/default_100_percent/loading_mask_2.svg
diff --git a/third_party/blink/renderer/modules/media_controls/resources/default_100_percent/modern/loading_mask_overlay.svg b/third_party/blink/renderer/modules/media_controls/resources/default_100_percent/loading_mask_overlay.svg
similarity index 100%
rename from third_party/blink/renderer/modules/media_controls/resources/default_100_percent/modern/loading_mask_overlay.svg
rename to third_party/blink/renderer/modules/media_controls/resources/default_100_percent/loading_mask_overlay.svg
diff --git a/third_party/blink/renderer/modules/media_controls/resources/default_100_percent/modern/mediaplayer_overlay_cast_off.png b/third_party/blink/renderer/modules/media_controls/resources/default_100_percent/mediaplayer_overlay_cast_off.png
similarity index 100%
rename from third_party/blink/renderer/modules/media_controls/resources/default_100_percent/modern/mediaplayer_overlay_cast_off.png
rename to third_party/blink/renderer/modules/media_controls/resources/default_100_percent/mediaplayer_overlay_cast_off.png
Binary files differ
diff --git a/third_party/blink/renderer/modules/media_controls/resources/default_100_percent/modern/mediaplayer_overlay_cast_on.png b/third_party/blink/renderer/modules/media_controls/resources/default_100_percent/mediaplayer_overlay_cast_on.png
similarity index 100%
rename from third_party/blink/renderer/modules/media_controls/resources/default_100_percent/modern/mediaplayer_overlay_cast_on.png
rename to third_party/blink/renderer/modules/media_controls/resources/default_100_percent/mediaplayer_overlay_cast_on.png
Binary files differ
diff --git a/third_party/blink/renderer/modules/media_controls/resources/default_100_percent/modern/mediaremoting_cast.png b/third_party/blink/renderer/modules/media_controls/resources/default_100_percent/mediaremoting_cast.png
similarity index 100%
rename from third_party/blink/renderer/modules/media_controls/resources/default_100_percent/modern/mediaremoting_cast.png
rename to third_party/blink/renderer/modules/media_controls/resources/default_100_percent/mediaremoting_cast.png
Binary files differ
diff --git a/third_party/blink/renderer/modules/media_controls/resources/default_100_percent/modern/top_gradient_bg.png b/third_party/blink/renderer/modules/media_controls/resources/default_100_percent/top_gradient_bg.png
similarity index 100%
rename from third_party/blink/renderer/modules/media_controls/resources/default_100_percent/modern/top_gradient_bg.png
rename to third_party/blink/renderer/modules/media_controls/resources/default_100_percent/top_gradient_bg.png
Binary files differ
diff --git a/third_party/blink/renderer/modules/media_controls/resources/default_100_percent/modern/vr_gradient_bg.png b/third_party/blink/renderer/modules/media_controls/resources/default_100_percent/vr_gradient_bg.png
similarity index 100%
rename from third_party/blink/renderer/modules/media_controls/resources/default_100_percent/modern/vr_gradient_bg.png
rename to third_party/blink/renderer/modules/media_controls/resources/default_100_percent/vr_gradient_bg.png
Binary files differ
diff --git a/third_party/blink/renderer/modules/media_controls/resources/default_200_percent/modern/mediaremoting_cast.png b/third_party/blink/renderer/modules/media_controls/resources/default_200_percent/mediaremoting_cast.png
similarity index 100%
rename from third_party/blink/renderer/modules/media_controls/resources/default_200_percent/modern/mediaremoting_cast.png
rename to third_party/blink/renderer/modules/media_controls/resources/default_200_percent/mediaremoting_cast.png
Binary files differ
diff --git a/third_party/blink/renderer/modules/media_controls/resources/default_200_percent/modern/vr_gradient_bg.png b/third_party/blink/renderer/modules/media_controls/resources/default_200_percent/vr_gradient_bg.png
similarity index 100%
rename from third_party/blink/renderer/modules/media_controls/resources/default_200_percent/modern/vr_gradient_bg.png
rename to third_party/blink/renderer/modules/media_controls/resources/default_200_percent/vr_gradient_bg.png
Binary files differ
diff --git a/third_party/blink/renderer/modules/media_controls/resources/mediaControls.css b/third_party/blink/renderer/modules/media_controls/resources/mediaControls.css
new file mode 100644
index 0000000..01a5fbe
--- /dev/null
+++ b/third_party/blink/renderer/modules/media_controls/resources/mediaControls.css
@@ -0,0 +1,1433 @@
+/* Copyright (c) 2017 The Chromium Authors. All rights reserved.
+   Use of this source code is governed by a BSD-style license that can be
+   found in the LICENSE file.*/
+
+/**
+ * Used in MediaDocument only.
+ * TODO: Move those outside of this file.
+ */
+
+video:-webkit-full-page-media {
+    margin: auto;
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    max-height: 100%;
+    max-width: 100%;
+}
+
+/**
+ * Panel Structure
+ */
+
+audio::-webkit-media-controls,
+video::-webkit-media-controls {
+  writing-mode: horizontal-tb;
+  width: inherit;
+  height: inherit;
+  position: relative;
+  direction: ltr;
+  display: flex;
+  flex-direction: column;
+  font-family: 'Roboto', 'Noto', sans-serif;
+  color: #000;
+  justify-content: flex-end;
+  align-items: center;
+  font-size: 14px;
+
+  margin-top: env(safe-area-inset-top);
+  margin-left: env(safe-area-inset-left);
+  margin-right: env(safe-area-inset-right);
+  margin-bottom: env(safe-area-inset-bottom);
+}
+
+audio::-webkit-media-controls-enclosure,
+video::-webkit-media-controls-enclosure {
+  bottom: 0;
+  text-indent: 0;
+  padding: 0;
+  margin: 0;
+  box-sizing: border-box;
+
+  display: flex;
+  justify-content: flex-end;
+  flex: 1;
+  width: 100%;
+}
+
+audio::-webkit-media-controls-panel,
+video::-webkit-media-controls-panel {
+  -webkit-appearance: -internal-media-control;
+
+  display: flex;
+  flex-direction: column;
+  justify-content: flex-end;
+  -webkit-user-select: none;
+  z-index: 0;
+  overflow: hidden;
+  bottom: auto;
+
+  min-width: 48px;
+  flex: 1;
+
+  font-size: 12px;
+  font-weight: normal;  /* Make sure that we don't inherit non-defaults. */
+  font-style: normal;
+
+  opacity: 1;
+  transition: opacity 0.25s cubic-bezier(0.25, 0.1, 0.25, 1);
+}
+
+audio::-webkit-media-controls-panel.transparent,
+video::-webkit-media-controls-panel.transparent {
+  opacity: 0;
+  transition: opacity 1s cubic-bezier(0.25, 0.1, 0.25, 1);
+}
+
+video::-webkit-media-controls:not(.audio-only) div[pseudo="-webkit-media-controls-panel" i] {
+  background:
+    -webkit-image-set(url('default_100_percent/gradient_bg.png') 1x)
+    repeat-x bottom left;
+}
+
+video::-webkit-media-controls.sizing-small div[pseudo="-webkit-media-controls-panel" i] {
+  background-size: auto 92px;
+}
+
+video::-webkit-media-controls.sizing-large div[pseudo="-webkit-media-controls-panel" i] {
+  background-size: auto 200px;
+}
+
+/* Need dark gradient at the top of the video when the scrubbing message is
+ * shown */
+video::-webkit-media-controls:not(.audio-only) div[pseudo="-webkit-media-controls-panel" i].scrubbing-message {
+  background:
+    -webkit-image-set(url('default_100_percent/top_gradient_bg.png') 1x)
+    repeat-x top left,
+    -webkit-image-set(url('default_100_percent/gradient_bg.png') 1x)
+    repeat-x bottom left;
+}
+
+video::-webkit-media-controls.sizing-small div[pseudo="-webkit-media-controls-panel" i].scrubbing-message {
+  background-size: auto 120px, auto 92px;
+}
+
+video::-webkit-media-controls.sizing-large div[pseudo="-webkit-media-controls-panel" i].scrubbing-message {
+  background-size: auto 120px, auto 200px;
+}
+
+audio::-internal-media-controls-button-panel,
+video::-internal-media-controls-button-panel {
+  -webkit-appearance: -internal-media-control;
+
+  flex-direction: row;
+  align-items: flex-end;
+  display: flex;
+
+  /* We use flex-start here to ensure that the play button is visible even
+   * if we are too small to show all controls.
+   */
+  justify-content: flex-start;
+  -webkit-user-select: none;
+  position: relative;
+  width: 100%;
+  z-index: 0;
+  overflow: hidden;
+  text-align: right;
+  bottom: auto;
+  height: 48px;
+  min-width: 48px;
+  line-height: 48px;
+  padding: 0 10px 0 16px;
+  box-sizing: border-box;
+}
+
+video::-internal-media-controls-button-spacer {
+  flex: 1;
+}
+
+audio::-internal-media-controls-button-spacer,
+video::-webkit-media-controls.audio-only [pseudo="-internal-media-controls-button-spacer"] {
+  display: none;
+}
+
+audio::-internal-media-controls-button-panel,
+video::-internal-media-controls-button-panel,
+audio::-webkit-media-controls-timeline,
+video::-webkit-media-controls-timeline {
+  opacity: 1;
+  transition: opacity 0.5s cubic-bezier(0.25, 0.1, 0.25, 1);
+}
+
+.transparent div[pseudo="-internal-media-controls-button-panel"],
+.transparent input[pseudo="-webkit-media-controls-timeline"] {
+  opacity: 0;
+  transition: opacity 0.75s cubic-bezier(0.25, 0.1, 0.25, 1);
+}
+
+/**
+ * Media Buttons
+ */
+audio::-webkit-media-controls-play-button,
+video::-webkit-media-controls-play-button,
+audio::-webkit-media-controls-mute-button,
+video::-webkit-media-controls-mute-button,
+video::-internal-media-controls-cast-icon,
+video::-webkit-media-controls-fullscreen-button,
+audio::-webkit-media-controls-fullscreen-button,
+video::-internal-media-controls-display-cutout-fullscreen-button,
+video::-internal-media-controls-cast-button,
+audio::-internal-media-controls-cast-button,
+video::-internal-media-controls-overflow-button,
+audio::-internal-media-controls-overflow-button,
+video::-webkit-media-controls-toggle-closed-captions-button,
+audio::-internal-media-controls-download-button,
+video::-internal-media-controls-download-button,
+video::-internal-media-controls-picture-in-picture-button {
+  -webkit-appearance: -internal-media-control;
+  background-size: 20px;
+  background-repeat: no-repeat;
+  background-position: center center;
+
+  /*
+   * Width should change to 48px when we have new audio
+   * control specs. Button tap target in audio and video
+   * controls should be same.
+   */
+  width: 32px;
+  height: 48px;
+  min-width: 32px;
+  padding: 0;
+  border-width: 0;
+  background-color: initial;
+  color: inherit;
+  cursor: pointer;
+
+  /* Cursor: pointer will cause a highlight when touch on it, this will disable it */
+  -webkit-tap-highlight-color: transparent;
+}
+
+/*
+ * Each hover background div's positioning rules
+ * are relative to their parent.
+ */
+video::-webkit-media-controls-play-button,
+audio::-webkit-media-controls-play-button,
+video::-webkit-media-controls-fullscreen-button,
+audio::-webkit-media-controls-fullscreen-button,
+video::-internal-media-controls-overflow-button,
+audio::-internal-media-controls-overflow-button {
+  position: relative;
+}
+
+video::-webkit-media-controls input[pseudo="-webkit-media-controls-play-button" i]::-internal-media-controls-button-hover-background,
+audio::-webkit-media-controls input[pseudo="-webkit-media-controls-play-button" i]::-internal-media-controls-button-hover-background,
+video::-webkit-media-controls input[pseudo="-webkit-media-controls-fullscreen-button" i]::-internal-media-controls-button-hover-background,
+audio::-webkit-media-controls input[pseudo="-webkit-media-controls-fullscreen-button" i]::-internal-media-controls-button-hover-background,
+video::-webkit-media-controls input[pseudo="-internal-media-controls-overflow-button" i]::-internal-media-controls-button-hover-background,
+audio::-webkit-media-controls input[pseudo="-internal-media-controls-overflow-button" i]::-internal-media-controls-button-hover-background {
+  background-color: rgba(32, 33, 36, 0);
+  background-size: 24px;
+  background-repeat: no-repeat;
+  background-position: center center;
+  position: absolute;
+  width: 36px;
+  height: 36px;
+  border-radius: 18px;
+  left: 6px;
+  top: 6px;
+  transition: background-color .25s;
+  pointer-events: none;
+  z-index: -1;
+}
+
+/*
+ * Audio control hover circle size should be same as video controls'. Due to increase of audio control tap target
+ * will break the layout when width is 300. We'll shrink the hover circle here. Should remove this rule once the new
+ * audio control layout specs are out
+ */
+video::-webkit-media-controls.audio-only input[pseudo="-webkit-media-controls-play-button" i]::-internal-media-controls-button-hover-background,
+video::-webkit-media-controls.audio-only input[pseudo="-webkit-media-controls-fullscreen-button" i]::-internal-media-controls-button-hover-background,
+video::-webkit-media-controls.audio-only input[pseudo="-internal-media-controls-overflow-button" i]::-internal-media-controls-button-hover-background,
+audio::-webkit-media-controls input[pseudo="-webkit-media-controls-play-button" i]::-internal-media-controls-button-hover-background,
+audio::-webkit-media-controls input[pseudo="-webkit-media-controls-fullscreen-button" i]::-internal-media-controls-button-hover-background,
+audio::-webkit-media-controls input[pseudo="-internal-media-controls-overflow-button" i]::-internal-media-controls-button-hover-background {
+  width: 32px;
+  height: 32px;
+  left: 0;
+  top: 8px;
+  border-radius: 16px;
+}
+
+video::-webkit-media-controls input[pseudo="-webkit-media-controls-play-button" i]:enabled:hover::-internal-media-controls-button-hover-background,
+video::-webkit-media-controls input[pseudo="-webkit-media-controls-play-button" i]:enabled:focus::-internal-media-controls-button-hover-background,
+video::-webkit-media-controls input[pseudo="-webkit-media-controls-fullscreen-button" i]:enabled:hover::-internal-media-controls-button-hover-background,
+video::-webkit-media-controls input[pseudo="-webkit-media-controls-fullscreen-button" i]:enabled:focus::-internal-media-controls-button-hover-background,
+video::-webkit-media-controls input[pseudo="-internal-media-controls-overflow-button" i]:enabled:hover::-internal-media-controls-button-hover-background,
+video::-webkit-media-controls input[pseudo="-internal-media-controls-overflow-button" i]:enabled:focus::-internal-media-controls-button-hover-background {
+  background-color: rgba(32, 33, 36, 0.71);
+}
+
+video::-webkit-media-controls.audio-only input[pseudo="-webkit-media-controls-play-button" i]:enabled:hover::-internal-media-controls-button-hover-background,
+video::-webkit-media-controls.audio-only input[pseudo="-webkit-media-controls-play-button" i]:enabled:focus::-internal-media-controls-button-hover-background,
+video::-webkit-media-controls.audio-only input[pseudo="-webkit-media-controls-fullscreen-button" i]:enabled:hover::-internal-media-controls-button-hover-background,
+video::-webkit-media-controls.audio-only input[pseudo="-webkit-media-controls-fullscreen-button" i]:enabled:focus::-internal-media-controls-button-hover-background,
+video::-webkit-media-controls.audio-only input[pseudo="-internal-media-controls-overflow-button" i]:enabled:hover::-internal-media-controls-button-hover-background,
+video::-webkit-media-controls.audio-only input[pseudo="-internal-media-controls-overflow-button" i]:enabled:focus::-internal-media-controls-button-hover-background,
+audio::-webkit-media-controls input[pseudo="-webkit-media-controls-play-button" i]:enabled:hover::-internal-media-controls-button-hover-background,
+audio::-webkit-media-controls input[pseudo="-webkit-media-controls-play-button" i]:enabled:focus::-internal-media-controls-button-hover-background,
+audio::-webkit-media-controls input[pseudo="-webkit-media-controls-fullscreen-button" i]:enabled:hover::-internal-media-controls-button-hover-background,
+audio::-webkit-media-controls input[pseudo="-webkit-media-controls-fullscreen-button" i]:enabled:focus::-internal-media-controls-button-hover-background,
+audio::-webkit-media-controls input[pseudo="-internal-media-controls-overflow-button" i]:enabled:hover::-internal-media-controls-button-hover-background,
+audio::-webkit-media-controls input[pseudo="-internal-media-controls-overflow-button" i]:enabled:focus::-internal-media-controls-button-hover-background {
+  background-color: rgba(32, 33, 36, 0.06);
+}
+
+video::-webkit-media-controls.sizing-large input[pseudo="-webkit-media-controls-play-button" i]::-internal-media-controls-button-hover-background,
+video::-webkit-media-controls.sizing-large input[pseudo="-webkit-media-controls-fullscreen-button" i]::-internal-media-controls-button-hover-background,
+video::-webkit-media-controls.sizing-large input[pseudo="-internal-media-controls-overflow-button" i]::-internal-media-controls-button-hover-background {
+  background-size: 32px;
+  width: 44px;
+  height: 44px;
+  border-radius: 22px;
+  left: 10px;
+  top: 10px;
+}
+
+video::-webkit-media-controls.sizing-small input[pseudo="-webkit-media-controls-play-button" i],
+video::-webkit-media-controls.sizing-small input[pseudo="-webkit-media-controls-mute-button" i],
+video::-webkit-media-controls.sizing-small input[pseudo="-webkit-media-controls-fullscreen-button" i],
+video::-webkit-media-controls.sizing-small input[pseudo="-internal-media-controls-display-cutout-fullscreen-button" i],
+video::-webkit-media-controls.sizing-small input[pseudo="-internal-media-controls-overflow-button" i] {
+  width: 48px;
+  height: 48px;
+  min-width: 48px;
+}
+
+video::-webkit-media-controls.sizing-large input[pseudo="-webkit-media-controls-play-button" i],
+video::-webkit-media-controls.sizing-large input[pseudo="-webkit-media-controls-mute-button" i],
+video::-webkit-media-controls.sizing-large input[pseudo="-webkit-media-controls-fullscreen-button" i],
+video::-webkit-media-controls.sizing-large input[pseudo="-internal-media-controls-display-cutout-fullscreen-button" i],
+video::-webkit-media-controls.sizing-large input[pseudo="-internal-media-controls-overflow-button" i] {
+  width: 64px;
+  height: 64px;
+  min-width: 64px;
+  background-size: 32px;
+}
+
+video::-webkit-media-controls.sizing-small div[pseudo="-internal-media-controls-button-panel" i] {
+  height: 48px;
+  line-height: 48px;
+  padding: 0 0 0 16px;
+}
+
+video::-webkit-media-controls.sizing-large div[pseudo="-internal-media-controls-button-panel" i] {
+  height: 64px;
+  line-height: 64px;
+  padding: 0 16px 0 32px;
+}
+
+audio::-webkit-media-controls-play-button,
+video::-webkit-media-controls-play-button {
+  background-image: -webkit-image-set(url(ic_play_arrow.svg) 1x);
+}
+video::-webkit-media-controls:not(.audio-only) [pseudo="-webkit-media-controls-panel"] [pseudo="-webkit-media-controls-play-button"] {
+  background-image: -webkit-image-set(url(ic_play_arrow_white.svg) 1x);
+}
+
+audio::-webkit-media-controls-mute-button,
+video::-webkit-media-controls-mute-button {
+  background-image: -webkit-image-set(url(ic_volume_up.svg) 1x);
+}
+video::-webkit-media-controls:not(.audio-only) [pseudo="-webkit-media-controls-panel"] [pseudo="-webkit-media-controls-mute-button"] {
+  background-image: -webkit-image-set(url(ic_volume_up_white.svg) 1x);
+}
+
+audio::-webkit-media-controls-mute-button.muted,
+video::-webkit-media-controls-mute-button.muted {
+  background-image: -webkit-image-set(url(ic_volume_off.svg) 1x);
+}
+video::-webkit-media-controls:not(.audio-only) [pseudo="-webkit-media-controls-panel"] [pseudo="-webkit-media-controls-mute-button"].muted {
+  background-image: -webkit-image-set(url(ic_volume_off_white.svg) 1x);
+}
+
+video::-internal-media-controls-display-cutout-fullscreen-button {
+  background-image: -webkit-image-set(url(ic_display_cutout_fullscreen.svg) 1x);
+  position: absolute;
+  top: 4px;
+  right: 4px;
+  z-index: 1;
+}
+
+audio::-webkit-media-controls-fullscreen-button,
+video::-webkit-media-controls-fullscreen-button {
+  background-image: -webkit-image-set(url(ic_fullscreen.svg) 1x);
+}
+video::-webkit-media-controls:not(.audio-only) [pseudo="-webkit-media-controls-panel"] [pseudo="-webkit-media-controls-fullscreen-button"] {
+  background-image: -webkit-image-set(url(ic_fullscreen_white.svg) 1x);
+}
+
+audio::-webkit-media-controls-fullscreen-button.fullscreen,
+video::-webkit-media-controls-fullscreen-button.fullscreen {
+  background-image: -webkit-image-set(url(ic_fullscreen_exit.svg) 1x);
+}
+video::-webkit-media-controls:not(.audio-only) [pseudo="-webkit-media-controls-panel"] [pseudo="-webkit-media-controls-fullscreen-button"].fullscreen {
+  background-image: -webkit-image-set(url(ic_fullscreen_exit_white.svg) 1x);
+}
+
+audio::-webkit-media-controls-mute-button:disabled,
+audio::-webkit-media-controls-play-button:disabled,
+video::-internal-media-controls-overflow-button:disabled,
+video::-webkit-media-controls-mute-button:disabled,
+video::-webkit-media-controls-play-button:disabled,
+video::-webkit-media-controls-fullscreen-button:disabled {
+  background-color: initial;
+  opacity: 0.3;
+}
+
+audio::-internal-media-controls-cast-button,
+video::-internal-media-controls-cast-button {
+  background-image: -webkit-image-set(url(ic_cast_off.svg) 1x);
+}
+
+audio::-internal-media-controls-cast-button.on,
+video::-internal-media-controls-cast-button.on {
+  background-image: -webkit-image-set(url(ic_cast_on.svg) 1x);
+}
+
+audio::-webkit-media-controls-toggle-closed-captions-button {
+  display: none;
+}
+
+video::-webkit-media-controls-toggle-closed-captions-button {
+  background-image: -webkit-image-set(url(ic_subtitles.svg) 1x);
+}
+
+video::-webkit-media-controls-toggle-closed-captions-button.closed-captions {
+  background-image: -webkit-image-set(url(ic_closed_caption.svg) 1x);
+}
+
+video::-internal-media-controls-download-button,
+audio::-internal-media-controls-download-button {
+  background-image: -webkit-image-set(url(ic_download.svg) 1x);
+}
+
+video::-internal-media-controls-overflow-button,
+audio::-internal-media-controls-overflow-button {
+  background-image: -webkit-image-set(url(ic_menu.svg) 1x);
+}
+
+video::-internal-media-controls-picture-in-picture-button {
+  background-image: -webkit-image-set(
+    url(ic_picture_in_picture.svg) 1x);
+}
+
+video::-internal-media-controls-picture-in-picture-button.on {
+  background-image: -webkit-image-set(
+    url(ic_picture_in_picture_exit.svg) 1x);
+}
+
+video::-webkit-media-controls:not(.audio-only) [pseudo="-webkit-media-controls-panel"] [pseudo="-internal-media-controls-overflow-button"] {
+  background-image: -webkit-image-set(url(ic_menu_white.svg) 1x);
+}
+
+video::-webkit-media-controls-overlay-play-button {
+  -webkit-appearance: -internal-media-control;
+  position: absolute;
+  left: 50%;
+  top: 50%;
+  margin-left: -56px /* (72px play button width / -2) - 20px padding */;
+  margin-top: -68px /* ((72px play button width + 24px timeline height + padding-bottom) / -2) - 20px padding */;
+  min-height: 0;
+  width: fit-content;
+  overflow: hidden;
+  background: transparent;
+  opacity: 1;
+  transition: opacity 0.25s cubic-bezier(0.25, 0.1, 0.25, 1);
+  padding: 20px;
+  border: 0;
+}
+
+/*
+ * Volume control container
+ */
+audio::-webkit-media-controls-volume-control-container,
+video::-webkit-media-controls-volume-control-container {
+  display: flex;
+  justify-content: flex-end;
+  position: relative;
+  height: 48px;
+
+  /* 48(Mute button) + 52(Slider) + 16(Left padding) */
+  min-width: 116px;
+  transition: min-width .3s;
+}
+
+audio::-webkit-media-controls-volume-control-container.closed,
+video::-webkit-media-controls-volume-control-container.closed {
+  min-width: 48px;
+}
+
+/*
+ * Audio control hover container size should be same as video controls'. Due to increase of audio control tap target
+ * will break the layout when width is 300. We'll shrink the hover container here. Should remove the min-width rule
+ * once the new audio control layout specs are out.
+ */
+video::-webkit-media-controls.audio-only div[pseudo="-webkit-media-controls-volume-control-container" i],
+audio::-webkit-media-controls-volume-control-container {
+  min-width: 100px;
+}
+
+video::-webkit-media-controls.audio-only div[pseudo="-webkit-media-controls-volume-control-container" i].closed,
+audio::-webkit-media-controls-volume-control-container.closed {
+  min-width: 32px;
+}
+
+audio::-webkit-media-controls-volume-control-hover-background,
+video::-webkit-media-controls-volume-control-hover-background {
+  position: absolute;
+  z-index: -1;
+  background-color: #202124;
+  opacity: .71;
+  height: 36px;
+  width: 112px;
+  border-radius: 18px;
+  top: 6px;
+  right: 4px;
+  transition: width .3s ease, opacity .25s ease;
+}
+
+/*
+ * Audio control hover size should be same as video controls'. Due to increase of audio control tap target
+ * will break the layout when width is 300. We'll shrink the hover size here. Should remove this rule once the new
+ * audio control layout specs are out. (Don't remove the opacity rule)
+ */
+video::-webkit-media-controls.audio-only div[pseudo="-webkit-media-controls-volume-control-hover-background" i],
+audio::-webkit-media-controls-volume-control-hover-background {
+  height: 32px;
+  width: 100px;
+  border-radius: 16px;
+  top: 8px;
+  right: 0;
+  opacity: .06;
+}
+
+audio::-webkit-media-controls [pseudo="-webkit-media-controls-volume-control-container"].closed [pseudo="-webkit-media-controls-volume-control-hover-background"],
+video::-webkit-media-controls [pseudo="-webkit-media-controls-volume-control-container"].closed [pseudo="-webkit-media-controls-volume-control-hover-background"] {
+  width: 36px;
+  opacity: 0;
+}
+
+video::-webkit-media-controls.sizing-large div[pseudo="-webkit-media-controls-volume-control-container" i] {
+  height: 64px;
+  min-width: 132px;
+}
+
+video::-webkit-media-controls.sizing-large div[pseudo="-webkit-media-controls-volume-control-container" i].closed {
+  min-width: 64px;
+}
+
+video::-webkit-media-controls.sizing-large div[pseudo="-webkit-media-controls-volume-control-hover-background" i] {
+  height: 44px;
+  width: 124px;
+  border-radius: 22px;
+  top: 10px;
+  right: 8px;
+}
+
+video::-webkit-media-controls.sizing-medum [pseudo="-webkit-media-controls-volume-control-container"].closed [pseudo="-webkit-media-controls-volume-control-hover-background"] {
+  width: 44px;
+}
+
+/**
+ * The overlay-play-button is disabled if the video element is loaded via
+ * MHTML, and a ruleset for input[type=button]:disabled in win.css has
+ * higher priority than the above ruleset.
+ */
+video::-webkit-media-controls-overlay-play-button:disabled {
+  background: transparent;
+}
+
+video::-webkit-media-controls-overlay-play-button.hidden {
+  opacity: 0;
+  transition: opacity 0.75s cubic-bezier(0.25, 0.1, 0.25, 1);
+}
+
+input[pseudo="-webkit-media-controls-overlay-play-button" i]::-internal-media-controls-overlay-play-button-internal {
+  width: 72px;
+  height: 72px;
+  border-radius: 50%;
+
+  background-size: 50%;
+  background-repeat: no-repeat;
+  background-position: center center;
+  background-image: -webkit-image-set(url(ic_play_arrow.svg) 1x);
+  background-color: rgba(255, 255, 255, .9);
+  box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.10);
+
+  transition: opacity cubic-bezier(0.4, 0.0, 0.6, 1) 600ms;
+}
+
+.phase-pre-ready input[pseudo="-webkit-media-controls-overlay-play-button" i]::-internal-media-controls-overlay-play-button-internal {
+  transition: none;
+}
+
+audio::-webkit-media-controls.state-playing input[pseudo="-webkit-media-controls-play-button" i],
+video::-webkit-media-controls.state-playing input[pseudo="-webkit-media-controls-play-button" i],
+video::-webkit-media-controls.state-playing input[pseudo="-webkit-media-controls-overlay-play-button" i]::-internal-media-controls-overlay-play-button-internal,
+audio::-webkit-media-controls.state-loading-metadata-playing input[pseudo="-webkit-media-controls-play-button" i],
+video::-webkit-media-controls.state-loading-metadata-playing input[pseudo="-webkit-media-controls-play-button" i],
+video::-webkit-media-controls.state-loading-metadata-playing input[pseudo="-webkit-media-controls-overlay-play-button" i]::-internal-media-controls-overlay-play-button-internal,
+audio::-webkit-media-controls.state-buffering input[pseudo="-webkit-media-controls-play-button" i],
+video::-webkit-media-controls.state-buffering input[pseudo="-webkit-media-controls-play-button" i],
+video::-webkit-media-controls.state-buffering input[pseudo="-webkit-media-controls-overlay-play-button" i]::-internal-media-controls-overlay-play-button-internal {
+  background-image: -webkit-image-set(url(ic_pause.svg) 1x);
+}
+
+/* For the play button inside the button panel, we want to use a white icon
+ * instead. */
+video::-webkit-media-controls.state-buffering [pseudo="-internal-media-controls-button-panel"] input[pseudo="-webkit-media-controls-play-button" i],
+video::-webkit-media-controls.state-loading-metadata-playing [pseudo="-internal-media-controls-button-panel"] input[pseudo="-webkit-media-controls-play-button" i],
+video::-webkit-media-controls.state-playing [pseudo="-internal-media-controls-button-panel"] input[pseudo="-webkit-media-controls-play-button" i] {
+  background-image: -webkit-image-set(url(ic_pause_white.svg) 1x);
+}
+
+video::-webkit-media-controls:not(.audio-only) input[pseudo="-webkit-media-controls-play-button"] {
+  /* Undo the extra 16px of left padding on the button panel. We only want that
+   * extra padding when the current time is the leftmost item, and not when the
+   * play button is leftmost. */
+  margin-left: -16px;
+}
+
+/**
+ * Timeline
+ */
+
+audio::-webkit-media-controls-timeline,
+video::-webkit-media-controls-timeline {
+  -webkit-appearance: -internal-media-control;
+
+  height: 4px;
+  padding-left: 16px;
+  padding-right: 16px;
+  margin: 0;
+  background: transparent;
+  cursor: pointer;
+
+  /* Cursor: pointer will cause a highlight when touch on it, this will disable it */
+  -webkit-tap-highlight-color: transparent;
+
+  /* This prevents layout issues in quirks mode */
+  box-sizing: unset !important;
+}
+
+audio::-webkit-media-controls-timeline,
+video::-webkit-media-controls.audio-only [pseudo="-webkit-media-controls-timeline"] {
+  padding-top: 26px;
+  padding-bottom: 26px;
+}
+
+video::-webkit-media-controls-timeline {
+  z-index: 0;
+}
+
+video::-webkit-media-controls.sizing-small input[pseudo="-webkit-media-controls-timeline" i] {
+  padding: 0 16px 20px 16px;
+}
+
+video::-webkit-media-controls.sizing-large input[pseudo="-webkit-media-controls-timeline" i] {
+  padding: 0 32px 20px 32px;
+}
+
+input[pseudo="-webkit-media-controls-timeline" i],
+input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-before,
+input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-after,
+input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-background,
+input[pseudo="-webkit-media-controls-volume-slider" i],
+input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-track-segment-highlight-before,
+input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-track-segment-highlight-after,
+input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-track-segment-background {
+  height: 4px;
+}
+
+video::-webkit-media-controls input[pseudo="-webkit-media-controls-timeline" i]::-webkit-slider-thumb,
+audio::-webkit-media-controls input[pseudo="-webkit-media-controls-timeline" i]::-webkit-slider-thumb,
+video::-webkit-media-controls input[pseudo="-webkit-media-controls-volume-slider" i]::-webkit-slider-thumb,
+audio::-webkit-media-controls input[pseudo="-webkit-media-controls-volume-slider" i]::-webkit-slider-thumb {
+  transition: opacity 0.3s;
+  opacity: 0;
+  width: 12px;
+  height: 12px;
+  margin-top: -4px;
+}
+
+video::-webkit-media-controls input[pseudo="-webkit-media-controls-timeline" i]:hover::-webkit-slider-thumb,
+video::-webkit-media-controls input[pseudo="-webkit-media-controls-timeline" i]:focus::-webkit-slider-thumb,
+audio::-webkit-media-controls input[pseudo="-webkit-media-controls-timeline" i]:hover::-webkit-slider-thumb,
+audio::-webkit-media-controls input[pseudo="-webkit-media-controls-timeline" i]:focus::-webkit-slider-thumb,
+video::-webkit-media-controls input[pseudo="-webkit-media-controls-volume-slider" i]:hover::-webkit-slider-thumb,
+video::-webkit-media-controls input[pseudo="-webkit-media-controls-volume-slider" i]:focus::-webkit-slider-thumb,
+audio::-webkit-media-controls input[pseudo="-webkit-media-controls-volume-slider" i]:hover::-webkit-slider-thumb,
+audio::-webkit-media-controls input[pseudo="-webkit-media-controls-volume-slider" i]:focus::-webkit-slider-thumb {
+  opacity: 1;
+}
+
+input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-after,
+input[pseudo="-webkit-media-controls-timeline" i]::-internal-media-controls-segmented-track,
+input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-track-segment-highlight-after,
+input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-media-controls-segmented-track {
+  border-radius: 2px;
+}
+
+video::-webkit-media-controls div[pseudo="-internal-media-controls-loading-panel" i]::-internal-media-controls-loading-panel-spinner-frame {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  overflow: hidden;
+
+  height: 72px /* overlay play button height */;
+  width: 72px /* overlay play button width */;
+  margin-left: -36px /* (72px overlay play button width / -2) */;
+  margin-top: -48px /* (72px overlay play button height + 24px timeline height + padding-bottom) / -2) */;
+}
+
+div[pseudo="-internal-media-controls-loading-panel" i]::-internal-media-controls-loading-panel-spinner-mask-1-background {
+  left: 0;
+  background-image: -webkit-image-set(
+    url(default_100_percent/loading_mask_1.svg) 1x);
+  background-position: center left;
+}
+
+div[pseudo="-internal-media-controls-loading-panel" i]::-internal-media-controls-loading-panel-spinner-mask-2-background {
+  left: -100%;
+  background-image: -webkit-image-set(
+    url(default_100_percent/loading_mask_2.svg) 1x);
+  background-position: center right;
+}
+
+input[pseudo="-webkit-media-controls-timeline" i]::-internal-media-controls-segmented-track,
+input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-media-controls-segmented-track {
+  -webkit-appearance: -internal-media-control;
+
+  flex: 1;
+  background: rgba(0, 0, 0, .2);
+  border-radius: 2px;
+  position: relative;
+}
+video::-webkit-media-controls:not(.audio-only) input[pseudo="-webkit-media-controls-timeline" i]::-internal-media-controls-segmented-track,
+video::-webkit-media-controls:not(.audio-only) input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-media-controls-segmented-track {
+  background: rgba(255, 255, 255, .3);
+  box-shadow: 0 2px 10px 0 rgba(0,0,0,0.5);
+}
+
+input[pseudo="-webkit-media-controls-timeline" i]::-webkit-slider-thumb,
+input[pseudo="-webkit-media-controls-volume-slider" i]::-webkit-slider-thumb {
+  -webkit-appearance: -internal-media-control;
+  background: rgba(0, 0, 0, .87);
+  box-shadow: 0 0 10px 0 #fff;
+
+  width: 12px;
+  height: 12px;
+  border-radius: 50%;
+  margin-top: -4px;
+  flex: 0 0 0;
+}
+
+video::-webkit-media-controls:not(.audio-only) input[pseudo="-webkit-media-controls-timeline" i]::-webkit-slider-thumb,
+video::-webkit-media-controls:not(.audio-only) input[pseudo="-webkit-media-controls-volume-slider" i]::-webkit-slider-thumb {
+  background: #FFFFFF;
+  box-shadow: unset;
+}
+
+.state-no-source input[pseudo="-webkit-media-controls-timeline" i]::-webkit-slider-thumb {
+  display: none;
+}
+
+input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-background,
+input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-track-segment-background {
+  position: absolute;
+  width: 100%;
+  top: 0;
+  height: 4px;
+  overflow: hidden;
+}
+
+input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-before,
+input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-after,
+input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-track-segment-highlight-before,
+input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-track-segment-highlight-after {
+  position: absolute;
+  height: 4px;
+}
+
+input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-before,
+input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-track-segment-highlight-before {
+  background: rgba(0, 0, 0, .87);
+  border-radius: 100px;
+}
+video::-webkit-media-controls:not(.audio-only) input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-before,
+video::-webkit-media-controls:not(.audio-only) input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-track-segment-highlight-before {
+  background: rgba(255, 255, 255, 1);
+}
+
+input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-after,
+input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-track-segment-highlight-after {
+  background: rgba(0, 0, 0, .54);
+  border-radius: 2px;
+}
+video::-webkit-media-controls:not(.audio-only) input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-after,
+video::-webkit-media-controls:not(.audio-only) input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-track-segment-highlight-after {
+  background: rgba(255, 255, 255, .54);
+}
+
+audio::-webkit-media-controls-volume-slider,
+video::-webkit-media-controls-volume-slider {
+  -webkit-appearance: -internal-media-control;
+
+  height: 4px;
+  width: 52px;
+  transition: width 0.3s;
+  margin: 0;
+  padding: 22px 0; /* (48px button panel height - 4px slider height) / 2  */
+  background: transparent;
+  cursor: pointer;
+
+  /* Cursor: pointer will cause a highlight when touch on it, this will disable it */
+  -webkit-tap-highlight-color: transparent;
+
+  /* This prevents layout issues in quirks mode. */
+  box-sizing: unset !important;
+}
+
+audio::-webkit-media-controls-volume-slider.closed,
+video::-webkit-media-controls-volume-slider.closed {
+  width: 0;
+  opacity: 0;
+  pointer-events: none;
+  transition: width 0.3s ease, opacity 0.28s step-end;
+}
+
+video::-webkit-media-controls.sizing-large input[pseudo="-webkit-media-controls-volume-slider" i] {
+  padding: 30px 0; /* (64px button panel height - 4px slider height) / 2  */
+}
+
+/**
+ * Time Display
+ */
+
+audio::-webkit-media-controls-time-remaining-display,
+video::-webkit-media-controls-time-remaining-display {
+  text-align: left;
+  margin-left: 4px;
+}
+
+audio::-webkit-media-controls-current-time-display,
+video::-webkit-media-controls-current-time-display,
+audio::-webkit-media-controls-time-remaining-display,
+video::-webkit-media-controls-time-remaining-display {
+  opacity: 0.87;
+  font-family: Roboto-Regular, Roboto, sans-serif;
+  font-size: 14px;
+  color: #000000;
+  letter-spacing: 0;
+  text-shadow: 0 0 10px #FFFFFF;
+}
+video::-webkit-media-controls:not(.audio-only) [pseudo="-webkit-media-controls-current-time-display"],
+video::-webkit-media-controls:not(.audio-only) [pseudo="-webkit-media-controls-time-remaining-display"] {
+  color: #FFFFFF;
+  text-shadow: unset;
+  opacity: unset;
+}
+
+/**
+ * Overflow Menu
+ */
+
+audio::-internal-media-controls-text-track-list,
+video::-internal-media-controls-text-track-list,
+audio::-internal-media-controls-overflow-menu-list,
+video::-internal-media-controls-overflow-menu-list {
+  position: fixed;
+  z-index: 2; /* Keep the menus above the loading animation at z-index 1. */
+  max-height: 250px;
+  width: 200px;
+  overflow-x: hidden;
+  overflow-y: auto;
+  white-space: nowrap;
+  font-size: 12px;
+  background: #FFFFFF;
+  box-shadow: 0 1px 9px 0 rgba(0,0,0,0.40);
+  border-radius: 2px;
+  transition: transform .3s ease-out, opacity .2s linear;
+  transform-origin: bottom right;
+}
+
+audio::-internal-media-controls-overflow-menu-list:focus,
+video::-internal-media-controls-overflow-menu-list:focus {
+  outline: none;
+}
+
+audio::-internal-media-controls-overflow-menu-list.closed,
+video::-internal-media-controls-overflow-menu-list.closed {
+  transform: scale(0);
+  opacity: 0;
+}
+
+audio::-internal-media-controls-text-track-list-header,
+video::-internal-media-controls-text-track-list-header,
+audio::-internal-media-controls-text-track-list-item,
+video::-internal-media-controls-text-track-list-item,
+audio::-internal-media-controls-overflow-menu-list-item,
+video::-internal-media-controls-overflow-menu-list-item {
+  display: flex;
+  align-items: center;
+  justify-content: flex-start;
+
+  font-family: Roboto-Regular, Roboto, sans-serif;
+  font-size: 12px;
+  color: rgba(0,0,0,0.87);
+  letter-spacing: 0;
+
+  line-height: 48px;
+  padding-left: 16px;
+  padding-right: 16px;
+  cursor: pointer;
+  /* Cursor: pointer will cause a highlight when touch on it, this will disable it */
+  -webkit-tap-highlight-color: transparent;
+
+  /*
+   * Avoid slight text movement after item transition ends.
+   * By setting translateZ, we are using hardware acceleration,
+   * which allows a smoother transition.
+   */
+  transform: translateZ(0);
+}
+
+video::-webkit-media-controls.sizing-small label[pseudo="-internal-media-controls-overflow-menu-list-item" i] input,
+video::-webkit-media-controls.sizing-large label[pseudo="-internal-media-controls-overflow-menu-list-item" i] input {
+  margin-left: 0;
+  margin-right: 16px;
+  width: 24px;
+  height: 24px;
+  min-width: 24px;
+  background-size: 24px;
+}
+
+label[pseudo="-internal-media-controls-overflow-menu-list-item"] input {
+  margin-left: -9px;
+  margin-right: 6px;
+  pointer-events: none;
+}
+
+label[pseudo="-internal-media-controls-overflow-menu-list-item"] div {
+  display: inline-grid;
+  margin: 16px 0 16px 0;
+  overflow: hidden;
+}
+
+label[pseudo="-internal-media-controls-overflow-menu-list-item"] div.with-subtitle {
+  margin: 8px 0 8px 0;
+}
+
+label[pseudo="-internal-media-controls-overflow-menu-list-item"] div span {
+  line-height: normal;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+label[pseudo="-internal-media-controls-text-track-list-item"] span {
+  line-height: normal;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  /*
+   * We need to make sure the blue tick has enough space to render. The blue tick needs at least 18px
+   * so the max width the span can go is 200(text-track-list) - 58(left-padding of list-item)
+   * - 16(right-padding of list-item) -30(left and right margin of the checkbox) - 18(blue tick) = 78px
+   */
+  max-width: 78px;
+}
+
+label[pseudo="-internal-media-controls-overflow-menu-list-item"] div span.subtitle {
+  color: rgba(0,0,0,0.54);
+}
+
+/*
+ * Overflow menu list item animation
+ */
+audio::-webkit-media-controls div[pseudo="-internal-media-controls-overflow-menu-list" i].closed > label,
+video::-webkit-media-controls div[pseudo="-internal-media-controls-overflow-menu-list" i].closed > label {
+  transform: translate(0px, 15px);
+  opacity: 0;
+}
+
+audio::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i],
+video::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i] {
+  transition: transform .2s, opacity .4s;
+}
+
+audio::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-0,
+video::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-0 {
+  transition: opacity .4s .1s ease-in;
+}
+
+audio::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-1,
+video::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-1 {
+  transition-delay: .15s;
+}
+
+audio::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-2,
+video::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-2 {
+  transition-delay: .2s;
+}
+
+audio::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-3,
+video::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-3 {
+  transition-delay: .25s;
+}
+
+audio::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-4,
+video::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-4 {
+  transition-delay: .3s;
+}
+
+audio::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-5,
+video::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-5 {
+  transition-delay: .35s
+}
+
+audio::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-6,
+video::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-6 {
+  transition-delay: .4s
+}
+
+audio::-internal-media-controls-text-track-list-header:focus,
+video::-internal-media-controls-text-track-list-header:focus,
+audio::-internal-media-controls-overflow-menu-list-item:focus,
+video::-internal-media-controls-overflow-menu-list-item:focus,
+audio::-internal-media-controls-text-track-list-item:focus,
+video::-internal-media-controls-text-track-list-item:focus {
+  background-color: #e0e0e0;
+  outline: none;
+}
+
+audio::-internal-media-controls-text-track-list-header,
+video::-internal-media-controls-text-track-list-header,
+audio::-internal-media-controls-text-track-list-item,
+video::-internal-media-controls-text-track-list-item {
+  padding-left: 58px;
+  justify-content: space-between;
+}
+
+audio::-internal-media-controls-text-track-list-header,
+video::-internal-media-controls-text-track-list-header {
+  background-size: 18px;
+  background-position: 20px center;
+  background-repeat: no-repeat;
+  background-image: -webkit-image-set(url(ic_arrow_back.svg) 1x);
+}
+
+label[pseudo="-internal-media-controls-text-track-list-item"] input {
+  -webkit-appearance: none;
+  width: 18px;
+  height: 18px;
+  margin: 15px;
+  float: right;
+  pointer-events: none;
+}
+
+label[pseudo="-internal-media-controls-text-track-list-item"] input:checked {
+  background: -webkit-image-set(url(ic_check_blue.svg) 1x) no-repeat center center;
+}
+
+video::-webkit-media-controls-overlay-enclosure {
+  position: absolute;
+  width: 100%;
+  height: 100%;
+}
+
+/**
+ * Audio Controls
+ */
+
+audio:not([controls]) {
+  display: none !important;
+}
+
+audio {
+  width: 300px;
+  height: 54px;
+}
+
+audio::-webkit-media-controls-overlay-enclosure,
+video::-webkit-media-controls.audio-only [pseudo="-webkit-media-controls-overlay-enclosure"] {
+  display: none;
+}
+
+audio::-webkit-media-controls-enclosure,
+video::-webkit-media-controls.audio-only [pseudo="-webkit-media-controls-enclosure"] {
+  max-height: 54px;
+  flex-direction: row;
+  background: #F1F3F4;
+  border-radius: 100px;
+  overflow: hidden;
+}
+
+audio::-webkit-media-controls-panel,
+video::-webkit-media-controls.audio-only [pseudo="-webkit-media-controls-panel"] {
+  flex-direction: row;
+  background: none;
+  padding: 0 10px;
+  align-items: center;
+  justify-content: flex-start;
+}
+
+audio::-internal-media-controls-play-button,
+video::-webkit-media-controls.audio-only [pseudo="-internal-media-controls-play-button"] {
+  display: none;
+}
+
+audio::-webkit-media-controls-current-time-display,
+video::-webkit-media-controls.audio-only [pseudo="-webkit-media-controls-current-time-display"] {
+  text-align: right;
+  margin-left: 5px;
+}
+
+audio::-webkit-media-controls-current-time-display,
+video::-webkit-media-controls.audio-only [pseudo="-webkit-media-controls-current-time-display"],
+audio::-webkit-media-controls-time-remaining-display,
+video::-webkit-media-controls.audio-only [pseudo="-webkit-media-controls-time-remaining-display"] {
+  min-width: auto;
+  flex: 0;
+  white-space: nowrap;
+}
+
+audio::-webkit-media-controls-timeline,
+video::-webkit-media-controls.audio-only [pseudo="-webkit-media-controls-timeline"] {
+  flex: 1 0 0px;
+  width: 0;
+}
+
+audio::-webkit-media-controls-play-button,
+video::-webkit-media-controls.audio-only [pseudo="-webkit-media-controls-play-button"],
+audio::-webkit-media-controls-mute-button,
+video::-webkit-media-controls.audio-only [pseudo="-webkit-media-controls-mute-button"],
+audio::-internal-media-controls-overflow-button,
+video::-webkit-media-controls.audio-only [pseudo="-internal-media-controls-overflow-button"] {
+  flex: 0 0 32px;
+}
+
+/**
+ * Preload state
+ */
+
+.use-default-poster {
+  background: #333;
+}
+
+.state-no-source input[pseudo="-webkit-media-controls-overlay-play-button" i]::-internal-media-controls-overlay-play-button-internal {
+  opacity: .3;
+  background-image: -webkit-image-set(url(ic_no_source.svg) 1x);
+}
+
+/**
+ * Loading spinner
+ */
+
+video::-internal-media-controls-loading-panel {
+  position: absolute;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  overflow: hidden;
+  z-index: 1;
+  pointer-events: none;
+}
+
+audio::-internal-media-controls-loading-panel,
+video::-webkit-media-controls.audio-only [pseudo="-internal-media-controls-loading-panel"] {
+  display: none;
+}
+
+/**
+ * Animated Arrow Container
+ */
+
+video::-internal-media-controls-animated-arrow-container {
+  position: absolute;
+  display: flex;
+  align-items: center;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  overflow: hidden;
+  z-index: 1;
+  pointer-events: none;
+}
+
+audio::-internal-media-controls-animated-arrow-container,
+video::-webkit-media-controls.audio-only [pseudo="-internal-media-controls-animated-arrow-container"] {
+  display: none;
+}
+
+/**
+ * Text Tracks
+ */
+video::-webkit-media-text-track-container {
+    position: relative;
+    width: inherit;
+    height: inherit;
+    overflow: hidden;
+
+    font: 22px sans-serif;
+    text-align: center;
+    color: rgba(255, 255, 255, 1);
+
+    letter-spacing: normal;
+    word-spacing: normal;
+    text-transform: none;
+    text-indent: 0;
+    text-decoration: none;
+    pointer-events: none;
+    -webkit-user-select: none;
+    word-break: break-word;
+}
+
+video::cue {
+    display: inline;
+
+    background-color: rgba(0, 0, 0, 0.8);
+    padding: 2px 2px;
+}
+
+video::-webkit-media-text-track-region {
+    position: absolute;
+    line-height: 5.33vh;
+    writing-mode: horizontal-tb;
+    background: rgba(0, 0, 0, 0.8);
+    color: rgba(255, 255, 255, 1);
+    word-wrap: break-word;
+    overflow-wrap: break-word;
+    overflow: hidden;
+}
+
+video::-webkit-media-text-track-region-container {
+    position: relative;
+
+    display: flex;
+    flex-flow: column;
+    flex-direction: column;
+}
+
+video::-webkit-media-text-track-region-container.scrolling {
+    transition: top 433ms linear;
+}
+
+
+video::-webkit-media-text-track-display {
+    position: absolute;
+    overflow: hidden;
+    white-space: pre-wrap;
+    -webkit-box-sizing: border-box;
+    flex: 0 0 auto;
+}
+
+video::cue(:future) {
+    color: gray;
+}
+
+video::cue(b) {
+    font-weight: bold;
+}
+
+video::cue(u) {
+    text-decoration: underline;
+}
+
+video::cue(i) {
+    font-style: italic;
+}
+
+/**
+ * Overlay cast button
+ */
+
+video::-internal-media-controls-overlay-cast-button {
+    -webkit-appearance: none;
+    background-image: -webkit-image-set(
+      url(default_100_percent/mediaplayer_overlay_cast_off.png) 1x);
+    background-size: cover;
+    background-repeat: no-repeat;
+    background-position: center center;
+    display: flex;
+    position: absolute;
+    top: 8px;
+    left: 8px;
+    margin-left: 0px;
+    margin-top: 0px;
+    border-width: 0px;
+    background-color: transparent;
+    width: 48px;
+    height: 48px;
+    padding: 0;
+    transition: opacity 0.3s;
+}
+
+video::-internal-media-controls-overlay-cast-button.on {
+    background-image: -webkit-image-set(
+      url(default_100_percent/mediaplayer_overlay_cast_on.png) 1x);
+}
+
+/**
+ * Scrubbing
+ */
+
+video::-internal-media-controls-scrubbing-message {
+  position: absolute;
+  top: 12px;
+  text-align: center;
+  width: 100%;
+  color: #FFFFFF;
+}
+
+.state-scrubbing input[pseudo="-webkit-media-controls-overlay-play-button" i] {
+  display: none;
+}
+
+/**
+ * VR styling.
+ */
+video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-timeline" i],
+video::-webkit-media-controls.immersive-mode div[pseudo="-internal-media-controls-button-panel" i] {
+  padding-left: 32px;
+  padding-right: 32px;
+}
+
+/* Timeline sizing does not include padding in max width. */
+video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-timeline" i] {
+  max-width: 471px;
+  height: 5px;
+  margin-bottom: 20px;
+  padding-top: 19px;
+  padding-bottom: 19px;
+}
+
+/* Button panel sizing does include padding in max width. */
+video::-webkit-media-controls.immersive-mode div[pseudo="-internal-media-controls-button-panel" i] {
+  max-width: 535px; /* 471px + 64px padding. */
+}
+
+video::-webkit-media-controls.immersive-mode div[pseudo="-webkit-media-controls-panel" i] {
+  /* Centering the button panel and timeline within the controls. */
+  text-align: -webkit-center;
+
+  /* Taller scrim. */
+  background:
+    -webkit-image-set(url('default_100_percent/vr_gradient_bg.png') 1x)
+    repeat-x bottom left;
+}
+
+video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-before,
+video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-after,
+video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-background {
+  height: 5px;
+}
+
+video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-timeline" i]::-webkit-slider-thumb {
+  width: 16px;
+  height: 16px;
+  border-radius: 8px;
+  margin-top: -5px;
+}
+
+video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-overlay-play-button" i] {
+  margin-left: -52px /* (play button width / 2) + 20px Padding */;
+  margin-top: -64px /* (play button width + timeline height + padding-bottom) / 2 + padding */
+}
+
+video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-overlay-play-button" i]::-internal-media-controls-overlay-play-button-internal {
+  width: 64px;
+  height: 64px;
+  border-radius: 32px;
+  background-size: 36px;
+}
+
+video::-webkit-media-controls.immersive-mode div[pseudo="-internal-media-controls-loading-panel" i]::-internal-media-controls-loading-panel-spinner-frame {
+  width: 64px; /* play button width */
+  height: 64px; /* play button width */
+  margin-top: -44px; /* (play button width + timeline height + padding-bottom) / -2 */
+  margin-left: -32px; /* play button width / -2 */
+}
+
+video::-webkit-media-controls.immersive-mode div[pseudo="-webkit-media-controls-volume-control-container" i],
+video::-webkit-media-controls.immersive-mode div[pseudo="-webkit-media-controls-volume-control-container" i] {
+  height: 43px;
+}
+
+video::-webkit-media-controls.immersive-mode div[pseudo="-webkit-media-controls-volume-control-container" i].closed,
+video::-webkit-media-controls.immersive-mode div[pseudo="-webkit-media-controls-volume-control-container" i].closed {
+  min-width: 43px;
+}
+
+video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-mute-button" i],
+video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-fullscreen-button" i],
+video::-webkit-media-controls.immersive-mode input[pseudo="-internal-media-controls-overflow-button" i] {
+  width: 43px;
+  height: 43px;
+  min-width: 43px;
+  margin-left: 5px;
+  background-size: 24px;
+}
+
+video::-webkit-media-controls.immersive-mode div[pseudo="-internal-media-controls-button-panel" i] {
+  height: 43px;
+  line-height: 43px;
+}
+
+video::-webkit-media-controls.immersive-mode div[pseudo="-webkit-media-controls-current-time-display" i],
+video::-webkit-media-controls.immersive-mode div[pseudo="-webkit-media-controls-time-remaining-display" i] {
+  font-size: 16px;
+}
+
+/* Hover highlighting. */
+video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-mute-button" i]:hover,
+video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-fullscreen-button" i]:hover,
+video::-webkit-media-controls.immersive-mode input[pseudo="-internal-media-controls-overflow-button" i]:hover {
+  background-color: rgba(255, 255, 255, 0.2);
+  border-radius: 4px;
+}
+
+/* Hide hover background */
+video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-play-button" i]::-internal-media-controls-button-hover-background,
+video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-fullscreen-button" i]::-internal-media-controls-button-hover-background,
+video::-webkit-media-controls.immersive-mode input[pseudo="-internal-media-controls-overflow-button" i]::-internal-media-controls-button-hover-background {
+  display: none;
+}
+
+@media (-webkit-min-device-pixel-ratio: 2) {
+  video::-webkit-media-controls.immersive-mode div[pseudo="-webkit-media-controls-panel" i] {
+    background:
+      -webkit-image-set(url('default_200_percent/vr_gradient_bg.png') 1x)
+      repeat-x bottom left auto 198px;
+  }
+}
+
+/**
+ * Test mode styles to remove animations/transitions to make web tests
+ * simpler.
+ */
+/* Hide the loading panel. */
+video::-webkit-media-controls.test-mode div[pseudo="-internal-media-controls-loading-panel" i] {
+  display: none !important;
+}
+/* Prevent transitions. */
+audio::-webkit-media-controls.test-mode *,
+video::-webkit-media-controls.test-mode *,
+video::-webkit-media-controls.test-mode input[pseudo="-webkit-media-controls-timeline" i]::-webkit-slider-thumb,
+audio::-webkit-media-controls.test-mode input[pseudo="-webkit-media-controls-timeline" i]::-webkit-slider-thumb,
+video::-webkit-media-controls.test-mode input[pseudo="-webkit-media-controls-overlay-play-button" i]::-internal-media-controls-overlay-play-button-internal {
+  transition: none !important;
+}
diff --git a/third_party/blink/renderer/modules/media_controls/resources/modernMediaControls_Android.css b/third_party/blink/renderer/modules/media_controls/resources/mediaControls_Android.css
similarity index 100%
rename from third_party/blink/renderer/modules/media_controls/resources/modernMediaControls_Android.css
rename to third_party/blink/renderer/modules/media_controls/resources/mediaControls_Android.css
diff --git a/third_party/blink/renderer/modules/media_controls/resources/modernMediaControls_animated_arrow.css b/third_party/blink/renderer/modules/media_controls/resources/mediaControls_animated_arrow.css
similarity index 100%
rename from third_party/blink/renderer/modules/media_controls/resources/modernMediaControls_animated_arrow.css
rename to third_party/blink/renderer/modules/media_controls/resources/mediaControls_animated_arrow.css
diff --git a/third_party/blink/renderer/modules/media_controls/resources/modernMediaControls_loading.css b/third_party/blink/renderer/modules/media_controls/resources/mediaControls_loading.css
similarity index 100%
rename from third_party/blink/renderer/modules/media_controls/resources/modernMediaControls_loading.css
rename to third_party/blink/renderer/modules/media_controls/resources/mediaControls_loading.css
diff --git a/third_party/blink/renderer/modules/media_controls/resources/modernMediaControls_scrubbing_message.css b/third_party/blink/renderer/modules/media_controls/resources/mediaControls_scrubbing_message.css
similarity index 100%
rename from third_party/blink/renderer/modules/media_controls/resources/modernMediaControls_scrubbing_message.css
rename to third_party/blink/renderer/modules/media_controls/resources/mediaControls_scrubbing_message.css
diff --git a/third_party/blink/renderer/modules/media_controls/resources/modernMediaControls_timeline.css b/third_party/blink/renderer/modules/media_controls/resources/mediaControls_timeline.css
similarity index 100%
rename from third_party/blink/renderer/modules/media_controls/resources/modernMediaControls_timeline.css
rename to third_party/blink/renderer/modules/media_controls/resources/mediaControls_timeline.css
diff --git a/third_party/blink/renderer/modules/media_controls/resources/mediaInterstitials.css b/third_party/blink/renderer/modules/media_controls/resources/mediaInterstitials.css
index 1178b810..7d68832 100644
--- a/third_party/blink/renderer/modules/media_controls/resources/mediaInterstitials.css
+++ b/third_party/blink/renderer/modules/media_controls/resources/mediaInterstitials.css
@@ -108,8 +108,8 @@
 
 video::-internal-media-remoting-cast-icon {
     background-image: -webkit-image-set(
-      url(default_100_percent/modern/mediaremoting_cast.png) 1x,
-      url(default_200_percent/modern/mediaremoting_cast.png) 2x);
+      url(default_100_percent/mediaremoting_cast.png) 1x,
+      url(default_200_percent/mediaremoting_cast.png) 2x);
 }
 
 video::-internal-picture-in-picture-interstitial-message.sizing-medium {
diff --git a/third_party/blink/renderer/modules/media_controls/resources/media_controls_resources.grd b/third_party/blink/renderer/modules/media_controls/resources/media_controls_resources.grd
index a04daa1..37c1511d 100644
--- a/third_party/blink/renderer/modules/media_controls/resources/media_controls_resources.grd
+++ b/third_party/blink/renderer/modules/media_controls/resources/media_controls_resources.grd
@@ -9,18 +9,18 @@
   </outputs>
   <release seq="1">
     <structures fallback_to_low_resolution="true">
-      <structure type="chrome_html" name="IDR_UASTYLE_MODERN_MEDIA_CONTROLS_CSS" file="modernMediaControls.css" flattenhtml="true" compress="gzip" />
+      <structure type="chrome_html" name="IDR_UASTYLE_MEDIA_CONTROLS_CSS" file="mediaControls.css" flattenhtml="true" compress="gzip" />
       <structure type="chrome_html" name="IDR_UASTYLE_MEDIA_INTERSTITIALS_CSS" file="mediaInterstitials.css" flattenhtml="true" compress="gzip" />
-      <structure type="chrome_html" name="IDR_SHADOWSTYLE_MODERN_MEDIA_CONTROLS_LOADING_CSS" file="modernMediaControls_loading.css" flattenhtml="true" compress="gzip" />
+      <structure type="chrome_html" name="IDR_SHADOWSTYLE_MEDIA_CONTROLS_LOADING_CSS" file="mediaControls_loading.css" flattenhtml="true" compress="gzip" />
     </structures>
     <includes>
-      <include name="IDR_UASTYLE_MODERN_MEDIA_CONTROLS_ANDROID_CSS" file="modernMediaControls_Android.css" type="BINDATA" compress="gzip" />
-      <include name="IDR_SHADOWSTYLE_MODERN_MEDIA_CONTROLS_TIMELINE_CSS" file="modernMediaControls_timeline.css" type="BINDATA" compress="gzip" />
-      <include name="IDR_SHADOWSTYLE_MODERN_MEDIA_CONTROLS_ANIMATED_ARROW_CSS" file="modernMediaControls_animated_arrow.css" type="BINDATA" compress="gzip" />
-      <include name="IDR_SHADOWSTYLE_MODERN_MEDIA_CONTROLS_SCRUBBING_MESSAGE_CSS" file="modernMediaControls_scrubbing_message.css" type="BINDATA" compress="gzip" />
-      <include name="IDR_MODERN_MEDIA_CONTROLS_JUMP_SVG" file="jump_image.svg" type="BINDATA" compress="gzip" />
-      <include name="IDR_MODERN_MEDIA_CONTROLS_ARROW_RIGHT_SVG" file="ic_arrow_right.svg" type="BINDATA" compress="gzip" />
-      <include name="IDR_MODERN_MEDIA_CONTROLS_ARROW_LEFT_SVG" file="ic_arrow_left.svg" type="BINDATA" compress="gzip" />
+      <include name="IDR_UASTYLE_MEDIA_CONTROLS_ANDROID_CSS" file="mediaControls_Android.css" type="BINDATA" compress="gzip" />
+      <include name="IDR_SHADOWSTYLE_MEDIA_CONTROLS_TIMELINE_CSS" file="mediaControls_timeline.css" type="BINDATA" compress="gzip" />
+      <include name="IDR_SHADOWSTYLE_MEDIA_CONTROLS_ANIMATED_ARROW_CSS" file="mediaControls_animated_arrow.css" type="BINDATA" compress="gzip" />
+      <include name="IDR_SHADOWSTYLE_MEDIA_CONTROLS_SCRUBBING_MESSAGE_CSS" file="mediaControls_scrubbing_message.css" type="BINDATA" compress="gzip" />
+      <include name="IDR_MEDIA_CONTROLS_JUMP_SVG" file="jump_image.svg" type="BINDATA" compress="gzip" />
+      <include name="IDR_MEDIA_CONTROLS_ARROW_RIGHT_SVG" file="ic_arrow_right.svg" type="BINDATA" compress="gzip" />
+      <include name="IDR_MEDIA_CONTROLS_ARROW_LEFT_SVG" file="ic_arrow_left.svg" type="BINDATA" compress="gzip" />
     </includes>
   </release>
 </grit>
diff --git a/third_party/blink/renderer/modules/media_controls/resources/modernMediaControls.css b/third_party/blink/renderer/modules/media_controls/resources/modernMediaControls.css
deleted file mode 100644
index c0bc85f..0000000
--- a/third_party/blink/renderer/modules/media_controls/resources/modernMediaControls.css
+++ /dev/null
@@ -1,1433 +0,0 @@
-/* Copyright (c) 2017 The Chromium Authors. All rights reserved.
-   Use of this source code is governed by a BSD-style license that can be
-   found in the LICENSE file.*/
-
-/**
- * Used in MediaDocument only.
- * TODO: Move those outside of this file.
- */
-
-video:-webkit-full-page-media {
-    margin: auto;
-    position: absolute;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    left: 0;
-    max-height: 100%;
-    max-width: 100%;
-}
-
-/**
- * Panel Structure
- */
-
-audio::-webkit-media-controls,
-video::-webkit-media-controls {
-  writing-mode: horizontal-tb;
-  width: inherit;
-  height: inherit;
-  position: relative;
-  direction: ltr;
-  display: flex;
-  flex-direction: column;
-  font-family: 'Roboto', 'Noto', sans-serif;
-  color: #000;
-  justify-content: flex-end;
-  align-items: center;
-  font-size: 14px;
-
-  margin-top: env(safe-area-inset-top);
-  margin-left: env(safe-area-inset-left);
-  margin-right: env(safe-area-inset-right);
-  margin-bottom: env(safe-area-inset-bottom);
-}
-
-audio::-webkit-media-controls-enclosure,
-video::-webkit-media-controls-enclosure {
-  bottom: 0;
-  text-indent: 0;
-  padding: 0;
-  margin: 0;
-  box-sizing: border-box;
-
-  display: flex;
-  justify-content: flex-end;
-  flex: 1;
-  width: 100%;
-}
-
-audio::-webkit-media-controls-panel,
-video::-webkit-media-controls-panel {
-  -webkit-appearance: -internal-media-control;
-
-  display: flex;
-  flex-direction: column;
-  justify-content: flex-end;
-  -webkit-user-select: none;
-  z-index: 0;
-  overflow: hidden;
-  bottom: auto;
-
-  min-width: 48px;
-  flex: 1;
-
-  font-size: 12px;
-  font-weight: normal;  /* Make sure that we don't inherit non-defaults. */
-  font-style: normal;
-
-  opacity: 1;
-  transition: opacity 0.25s cubic-bezier(0.25, 0.1, 0.25, 1);
-}
-
-audio::-webkit-media-controls-panel.transparent,
-video::-webkit-media-controls-panel.transparent {
-  opacity: 0;
-  transition: opacity 1s cubic-bezier(0.25, 0.1, 0.25, 1);
-}
-
-video::-webkit-media-controls:not(.audio-only) div[pseudo="-webkit-media-controls-panel" i] {
-  background:
-    -webkit-image-set(url('default_100_percent/modern/gradient_bg.png') 1x)
-    repeat-x bottom left;
-}
-
-video::-webkit-media-controls.sizing-small div[pseudo="-webkit-media-controls-panel" i] {
-  background-size: auto 92px;
-}
-
-video::-webkit-media-controls.sizing-large div[pseudo="-webkit-media-controls-panel" i] {
-  background-size: auto 200px;
-}
-
-/* Need dark gradient at the top of the video when the scrubbing message is
- * shown */
-video::-webkit-media-controls:not(.audio-only) div[pseudo="-webkit-media-controls-panel" i].scrubbing-message {
-  background:
-    -webkit-image-set(url('default_100_percent/modern/top_gradient_bg.png') 1x)
-    repeat-x top left,
-    -webkit-image-set(url('default_100_percent/modern/gradient_bg.png') 1x)
-    repeat-x bottom left;
-}
-
-video::-webkit-media-controls.sizing-small div[pseudo="-webkit-media-controls-panel" i].scrubbing-message {
-  background-size: auto 120px, auto 92px;
-}
-
-video::-webkit-media-controls.sizing-large div[pseudo="-webkit-media-controls-panel" i].scrubbing-message {
-  background-size: auto 120px, auto 200px;
-}
-
-audio::-internal-media-controls-button-panel,
-video::-internal-media-controls-button-panel {
-  -webkit-appearance: -internal-media-control;
-
-  flex-direction: row;
-  align-items: flex-end;
-  display: flex;
-
-  /* We use flex-start here to ensure that the play button is visible even
-   * if we are too small to show all controls.
-   */
-  justify-content: flex-start;
-  -webkit-user-select: none;
-  position: relative;
-  width: 100%;
-  z-index: 0;
-  overflow: hidden;
-  text-align: right;
-  bottom: auto;
-  height: 48px;
-  min-width: 48px;
-  line-height: 48px;
-  padding: 0 10px 0 16px;
-  box-sizing: border-box;
-}
-
-video::-internal-media-controls-button-spacer {
-  flex: 1;
-}
-
-audio::-internal-media-controls-button-spacer,
-video::-webkit-media-controls.audio-only [pseudo="-internal-media-controls-button-spacer"] {
-  display: none;
-}
-
-audio::-internal-media-controls-button-panel,
-video::-internal-media-controls-button-panel,
-audio::-webkit-media-controls-timeline,
-video::-webkit-media-controls-timeline {
-  opacity: 1;
-  transition: opacity 0.5s cubic-bezier(0.25, 0.1, 0.25, 1);
-}
-
-.transparent div[pseudo="-internal-media-controls-button-panel"],
-.transparent input[pseudo="-webkit-media-controls-timeline"] {
-  opacity: 0;
-  transition: opacity 0.75s cubic-bezier(0.25, 0.1, 0.25, 1);
-}
-
-/**
- * Media Buttons
- */
-audio::-webkit-media-controls-play-button,
-video::-webkit-media-controls-play-button,
-audio::-webkit-media-controls-mute-button,
-video::-webkit-media-controls-mute-button,
-video::-internal-media-controls-cast-icon,
-video::-webkit-media-controls-fullscreen-button,
-audio::-webkit-media-controls-fullscreen-button,
-video::-internal-media-controls-display-cutout-fullscreen-button,
-video::-internal-media-controls-cast-button,
-audio::-internal-media-controls-cast-button,
-video::-internal-media-controls-overflow-button,
-audio::-internal-media-controls-overflow-button,
-video::-webkit-media-controls-toggle-closed-captions-button,
-audio::-internal-media-controls-download-button,
-video::-internal-media-controls-download-button,
-video::-internal-media-controls-picture-in-picture-button {
-  -webkit-appearance: -internal-media-control;
-  background-size: 20px;
-  background-repeat: no-repeat;
-  background-position: center center;
-
-  /*
-   * Width should change to 48px when we have new audio
-   * control specs. Button tap target in audio and video
-   * controls should be same.
-   */
-  width: 32px;
-  height: 48px;
-  min-width: 32px;
-  padding: 0;
-  border-width: 0;
-  background-color: initial;
-  color: inherit;
-  cursor: pointer;
-
-  /* Cursor: pointer will cause a highlight when touch on it, this will disable it */
-  -webkit-tap-highlight-color: transparent;
-}
-
-/*
- * Each hover background div's positioning rules
- * are relative to their parent.
- */
-video::-webkit-media-controls-play-button,
-audio::-webkit-media-controls-play-button,
-video::-webkit-media-controls-fullscreen-button,
-audio::-webkit-media-controls-fullscreen-button,
-video::-internal-media-controls-overflow-button,
-audio::-internal-media-controls-overflow-button {
-  position: relative;
-}
-
-video::-webkit-media-controls input[pseudo="-webkit-media-controls-play-button" i]::-internal-media-controls-button-hover-background,
-audio::-webkit-media-controls input[pseudo="-webkit-media-controls-play-button" i]::-internal-media-controls-button-hover-background,
-video::-webkit-media-controls input[pseudo="-webkit-media-controls-fullscreen-button" i]::-internal-media-controls-button-hover-background,
-audio::-webkit-media-controls input[pseudo="-webkit-media-controls-fullscreen-button" i]::-internal-media-controls-button-hover-background,
-video::-webkit-media-controls input[pseudo="-internal-media-controls-overflow-button" i]::-internal-media-controls-button-hover-background,
-audio::-webkit-media-controls input[pseudo="-internal-media-controls-overflow-button" i]::-internal-media-controls-button-hover-background {
-  background-color: rgba(32, 33, 36, 0);
-  background-size: 24px;
-  background-repeat: no-repeat;
-  background-position: center center;
-  position: absolute;
-  width: 36px;
-  height: 36px;
-  border-radius: 18px;
-  left: 6px;
-  top: 6px;
-  transition: background-color .25s;
-  pointer-events: none;
-  z-index: -1;
-}
-
-/*
- * Audio control hover circle size should be same as video controls'. Due to increase of audio control tap target
- * will break the layout when width is 300. We'll shrink the hover circle here. Should remove this rule once the new
- * audio control layout specs are out
- */
-video::-webkit-media-controls.audio-only input[pseudo="-webkit-media-controls-play-button" i]::-internal-media-controls-button-hover-background,
-video::-webkit-media-controls.audio-only input[pseudo="-webkit-media-controls-fullscreen-button" i]::-internal-media-controls-button-hover-background,
-video::-webkit-media-controls.audio-only input[pseudo="-internal-media-controls-overflow-button" i]::-internal-media-controls-button-hover-background,
-audio::-webkit-media-controls input[pseudo="-webkit-media-controls-play-button" i]::-internal-media-controls-button-hover-background,
-audio::-webkit-media-controls input[pseudo="-webkit-media-controls-fullscreen-button" i]::-internal-media-controls-button-hover-background,
-audio::-webkit-media-controls input[pseudo="-internal-media-controls-overflow-button" i]::-internal-media-controls-button-hover-background {
-  width: 32px;
-  height: 32px;
-  left: 0;
-  top: 8px;
-  border-radius: 16px;
-}
-
-video::-webkit-media-controls input[pseudo="-webkit-media-controls-play-button" i]:enabled:hover::-internal-media-controls-button-hover-background,
-video::-webkit-media-controls input[pseudo="-webkit-media-controls-play-button" i]:enabled:focus::-internal-media-controls-button-hover-background,
-video::-webkit-media-controls input[pseudo="-webkit-media-controls-fullscreen-button" i]:enabled:hover::-internal-media-controls-button-hover-background,
-video::-webkit-media-controls input[pseudo="-webkit-media-controls-fullscreen-button" i]:enabled:focus::-internal-media-controls-button-hover-background,
-video::-webkit-media-controls input[pseudo="-internal-media-controls-overflow-button" i]:enabled:hover::-internal-media-controls-button-hover-background,
-video::-webkit-media-controls input[pseudo="-internal-media-controls-overflow-button" i]:enabled:focus::-internal-media-controls-button-hover-background {
-  background-color: rgba(32, 33, 36, 0.71);
-}
-
-video::-webkit-media-controls.audio-only input[pseudo="-webkit-media-controls-play-button" i]:enabled:hover::-internal-media-controls-button-hover-background,
-video::-webkit-media-controls.audio-only input[pseudo="-webkit-media-controls-play-button" i]:enabled:focus::-internal-media-controls-button-hover-background,
-video::-webkit-media-controls.audio-only input[pseudo="-webkit-media-controls-fullscreen-button" i]:enabled:hover::-internal-media-controls-button-hover-background,
-video::-webkit-media-controls.audio-only input[pseudo="-webkit-media-controls-fullscreen-button" i]:enabled:focus::-internal-media-controls-button-hover-background,
-video::-webkit-media-controls.audio-only input[pseudo="-internal-media-controls-overflow-button" i]:enabled:hover::-internal-media-controls-button-hover-background,
-video::-webkit-media-controls.audio-only input[pseudo="-internal-media-controls-overflow-button" i]:enabled:focus::-internal-media-controls-button-hover-background,
-audio::-webkit-media-controls input[pseudo="-webkit-media-controls-play-button" i]:enabled:hover::-internal-media-controls-button-hover-background,
-audio::-webkit-media-controls input[pseudo="-webkit-media-controls-play-button" i]:enabled:focus::-internal-media-controls-button-hover-background,
-audio::-webkit-media-controls input[pseudo="-webkit-media-controls-fullscreen-button" i]:enabled:hover::-internal-media-controls-button-hover-background,
-audio::-webkit-media-controls input[pseudo="-webkit-media-controls-fullscreen-button" i]:enabled:focus::-internal-media-controls-button-hover-background,
-audio::-webkit-media-controls input[pseudo="-internal-media-controls-overflow-button" i]:enabled:hover::-internal-media-controls-button-hover-background,
-audio::-webkit-media-controls input[pseudo="-internal-media-controls-overflow-button" i]:enabled:focus::-internal-media-controls-button-hover-background {
-  background-color: rgba(32, 33, 36, 0.06);
-}
-
-video::-webkit-media-controls.sizing-large input[pseudo="-webkit-media-controls-play-button" i]::-internal-media-controls-button-hover-background,
-video::-webkit-media-controls.sizing-large input[pseudo="-webkit-media-controls-fullscreen-button" i]::-internal-media-controls-button-hover-background,
-video::-webkit-media-controls.sizing-large input[pseudo="-internal-media-controls-overflow-button" i]::-internal-media-controls-button-hover-background {
-  background-size: 32px;
-  width: 44px;
-  height: 44px;
-  border-radius: 22px;
-  left: 10px;
-  top: 10px;
-}
-
-video::-webkit-media-controls.sizing-small input[pseudo="-webkit-media-controls-play-button" i],
-video::-webkit-media-controls.sizing-small input[pseudo="-webkit-media-controls-mute-button" i],
-video::-webkit-media-controls.sizing-small input[pseudo="-webkit-media-controls-fullscreen-button" i],
-video::-webkit-media-controls.sizing-small input[pseudo="-internal-media-controls-display-cutout-fullscreen-button" i],
-video::-webkit-media-controls.sizing-small input[pseudo="-internal-media-controls-overflow-button" i] {
-  width: 48px;
-  height: 48px;
-  min-width: 48px;
-}
-
-video::-webkit-media-controls.sizing-large input[pseudo="-webkit-media-controls-play-button" i],
-video::-webkit-media-controls.sizing-large input[pseudo="-webkit-media-controls-mute-button" i],
-video::-webkit-media-controls.sizing-large input[pseudo="-webkit-media-controls-fullscreen-button" i],
-video::-webkit-media-controls.sizing-large input[pseudo="-internal-media-controls-display-cutout-fullscreen-button" i],
-video::-webkit-media-controls.sizing-large input[pseudo="-internal-media-controls-overflow-button" i] {
-  width: 64px;
-  height: 64px;
-  min-width: 64px;
-  background-size: 32px;
-}
-
-video::-webkit-media-controls.sizing-small div[pseudo="-internal-media-controls-button-panel" i] {
-  height: 48px;
-  line-height: 48px;
-  padding: 0 0 0 16px;
-}
-
-video::-webkit-media-controls.sizing-large div[pseudo="-internal-media-controls-button-panel" i] {
-  height: 64px;
-  line-height: 64px;
-  padding: 0 16px 0 32px;
-}
-
-audio::-webkit-media-controls-play-button,
-video::-webkit-media-controls-play-button {
-  background-image: -webkit-image-set(url(ic_play_arrow.svg) 1x);
-}
-video::-webkit-media-controls:not(.audio-only) [pseudo="-webkit-media-controls-panel"] [pseudo="-webkit-media-controls-play-button"] {
-  background-image: -webkit-image-set(url(ic_play_arrow_white.svg) 1x);
-}
-
-audio::-webkit-media-controls-mute-button,
-video::-webkit-media-controls-mute-button {
-  background-image: -webkit-image-set(url(ic_volume_up.svg) 1x);
-}
-video::-webkit-media-controls:not(.audio-only) [pseudo="-webkit-media-controls-panel"] [pseudo="-webkit-media-controls-mute-button"] {
-  background-image: -webkit-image-set(url(ic_volume_up_white.svg) 1x);
-}
-
-audio::-webkit-media-controls-mute-button.muted,
-video::-webkit-media-controls-mute-button.muted {
-  background-image: -webkit-image-set(url(ic_volume_off.svg) 1x);
-}
-video::-webkit-media-controls:not(.audio-only) [pseudo="-webkit-media-controls-panel"] [pseudo="-webkit-media-controls-mute-button"].muted {
-  background-image: -webkit-image-set(url(ic_volume_off_white.svg) 1x);
-}
-
-video::-internal-media-controls-display-cutout-fullscreen-button {
-  background-image: -webkit-image-set(url(ic_display_cutout_fullscreen.svg) 1x);
-  position: absolute;
-  top: 4px;
-  right: 4px;
-  z-index: 1;
-}
-
-audio::-webkit-media-controls-fullscreen-button,
-video::-webkit-media-controls-fullscreen-button {
-  background-image: -webkit-image-set(url(ic_fullscreen.svg) 1x);
-}
-video::-webkit-media-controls:not(.audio-only) [pseudo="-webkit-media-controls-panel"] [pseudo="-webkit-media-controls-fullscreen-button"] {
-  background-image: -webkit-image-set(url(ic_fullscreen_white.svg) 1x);
-}
-
-audio::-webkit-media-controls-fullscreen-button.fullscreen,
-video::-webkit-media-controls-fullscreen-button.fullscreen {
-  background-image: -webkit-image-set(url(ic_fullscreen_exit.svg) 1x);
-}
-video::-webkit-media-controls:not(.audio-only) [pseudo="-webkit-media-controls-panel"] [pseudo="-webkit-media-controls-fullscreen-button"].fullscreen {
-  background-image: -webkit-image-set(url(ic_fullscreen_exit_white.svg) 1x);
-}
-
-audio::-webkit-media-controls-mute-button:disabled,
-audio::-webkit-media-controls-play-button:disabled,
-video::-internal-media-controls-overflow-button:disabled,
-video::-webkit-media-controls-mute-button:disabled,
-video::-webkit-media-controls-play-button:disabled,
-video::-webkit-media-controls-fullscreen-button:disabled {
-  background-color: initial;
-  opacity: 0.3;
-}
-
-audio::-internal-media-controls-cast-button,
-video::-internal-media-controls-cast-button {
-  background-image: -webkit-image-set(url(ic_cast_off.svg) 1x);
-}
-
-audio::-internal-media-controls-cast-button.on,
-video::-internal-media-controls-cast-button.on {
-  background-image: -webkit-image-set(url(ic_cast_on.svg) 1x);
-}
-
-audio::-webkit-media-controls-toggle-closed-captions-button {
-  display: none;
-}
-
-video::-webkit-media-controls-toggle-closed-captions-button {
-  background-image: -webkit-image-set(url(ic_subtitles.svg) 1x);
-}
-
-video::-webkit-media-controls-toggle-closed-captions-button.closed-captions {
-  background-image: -webkit-image-set(url(ic_closed_caption.svg) 1x);
-}
-
-video::-internal-media-controls-download-button,
-audio::-internal-media-controls-download-button {
-  background-image: -webkit-image-set(url(ic_download.svg) 1x);
-}
-
-video::-internal-media-controls-overflow-button,
-audio::-internal-media-controls-overflow-button {
-  background-image: -webkit-image-set(url(ic_menu.svg) 1x);
-}
-
-video::-internal-media-controls-picture-in-picture-button {
-  background-image: -webkit-image-set(
-    url(ic_picture_in_picture.svg) 1x);
-}
-
-video::-internal-media-controls-picture-in-picture-button.on {
-  background-image: -webkit-image-set(
-    url(ic_picture_in_picture_exit.svg) 1x);
-}
-
-video::-webkit-media-controls:not(.audio-only) [pseudo="-webkit-media-controls-panel"] [pseudo="-internal-media-controls-overflow-button"] {
-  background-image: -webkit-image-set(url(ic_menu_white.svg) 1x);
-}
-
-video::-webkit-media-controls-overlay-play-button {
-  -webkit-appearance: -internal-media-control;
-  position: absolute;
-  left: 50%;
-  top: 50%;
-  margin-left: -56px /* (72px play button width / -2) - 20px padding */;
-  margin-top: -68px /* ((72px play button width + 24px timeline height + padding-bottom) / -2) - 20px padding */;
-  min-height: 0;
-  width: fit-content;
-  overflow: hidden;
-  background: transparent;
-  opacity: 1;
-  transition: opacity 0.25s cubic-bezier(0.25, 0.1, 0.25, 1);
-  padding: 20px;
-  border: 0;
-}
-
-/*
- * Volume control container
- */
-audio::-webkit-media-controls-volume-control-container,
-video::-webkit-media-controls-volume-control-container {
-  display: flex;
-  justify-content: flex-end;
-  position: relative;
-  height: 48px;
-
-  /* 48(Mute button) + 52(Slider) + 16(Left padding) */
-  min-width: 116px;
-  transition: min-width .3s;
-}
-
-audio::-webkit-media-controls-volume-control-container.closed,
-video::-webkit-media-controls-volume-control-container.closed {
-  min-width: 48px;
-}
-
-/*
- * Audio control hover container size should be same as video controls'. Due to increase of audio control tap target
- * will break the layout when width is 300. We'll shrink the hover container here. Should remove the min-width rule
- * once the new audio control layout specs are out.
- */
-video::-webkit-media-controls.audio-only div[pseudo="-webkit-media-controls-volume-control-container" i],
-audio::-webkit-media-controls-volume-control-container {
-  min-width: 100px;
-}
-
-video::-webkit-media-controls.audio-only div[pseudo="-webkit-media-controls-volume-control-container" i].closed,
-audio::-webkit-media-controls-volume-control-container.closed {
-  min-width: 32px;
-}
-
-audio::-webkit-media-controls-volume-control-hover-background,
-video::-webkit-media-controls-volume-control-hover-background {
-  position: absolute;
-  z-index: -1;
-  background-color: #202124;
-  opacity: .71;
-  height: 36px;
-  width: 112px;
-  border-radius: 18px;
-  top: 6px;
-  right: 4px;
-  transition: width .3s ease, opacity .25s ease;
-}
-
-/*
- * Audio control hover size should be same as video controls'. Due to increase of audio control tap target
- * will break the layout when width is 300. We'll shrink the hover size here. Should remove this rule once the new
- * audio control layout specs are out. (Don't remove the opacity rule)
- */
-video::-webkit-media-controls.audio-only div[pseudo="-webkit-media-controls-volume-control-hover-background" i],
-audio::-webkit-media-controls-volume-control-hover-background {
-  height: 32px;
-  width: 100px;
-  border-radius: 16px;
-  top: 8px;
-  right: 0;
-  opacity: .06;
-}
-
-audio::-webkit-media-controls [pseudo="-webkit-media-controls-volume-control-container"].closed [pseudo="-webkit-media-controls-volume-control-hover-background"],
-video::-webkit-media-controls [pseudo="-webkit-media-controls-volume-control-container"].closed [pseudo="-webkit-media-controls-volume-control-hover-background"] {
-  width: 36px;
-  opacity: 0;
-}
-
-video::-webkit-media-controls.sizing-large div[pseudo="-webkit-media-controls-volume-control-container" i] {
-  height: 64px;
-  min-width: 132px;
-}
-
-video::-webkit-media-controls.sizing-large div[pseudo="-webkit-media-controls-volume-control-container" i].closed {
-  min-width: 64px;
-}
-
-video::-webkit-media-controls.sizing-large div[pseudo="-webkit-media-controls-volume-control-hover-background" i] {
-  height: 44px;
-  width: 124px;
-  border-radius: 22px;
-  top: 10px;
-  right: 8px;
-}
-
-video::-webkit-media-controls.sizing-medum [pseudo="-webkit-media-controls-volume-control-container"].closed [pseudo="-webkit-media-controls-volume-control-hover-background"] {
-  width: 44px;
-}
-
-/**
- * The overlay-play-button is disabled if the video element is loaded via
- * MHTML, and a ruleset for input[type=button]:disabled in win.css has
- * higher priority than the above ruleset.
- */
-video::-webkit-media-controls-overlay-play-button:disabled {
-  background: transparent;
-}
-
-video::-webkit-media-controls-overlay-play-button.hidden {
-  opacity: 0;
-  transition: opacity 0.75s cubic-bezier(0.25, 0.1, 0.25, 1);
-}
-
-input[pseudo="-webkit-media-controls-overlay-play-button" i]::-internal-media-controls-overlay-play-button-internal {
-  width: 72px;
-  height: 72px;
-  border-radius: 50%;
-
-  background-size: 50%;
-  background-repeat: no-repeat;
-  background-position: center center;
-  background-image: -webkit-image-set(url(ic_play_arrow.svg) 1x);
-  background-color: rgba(255, 255, 255, .9);
-  box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.10);
-
-  transition: opacity cubic-bezier(0.4, 0.0, 0.6, 1) 600ms;
-}
-
-.phase-pre-ready input[pseudo="-webkit-media-controls-overlay-play-button" i]::-internal-media-controls-overlay-play-button-internal {
-  transition: none;
-}
-
-audio::-webkit-media-controls.state-playing input[pseudo="-webkit-media-controls-play-button" i],
-video::-webkit-media-controls.state-playing input[pseudo="-webkit-media-controls-play-button" i],
-video::-webkit-media-controls.state-playing input[pseudo="-webkit-media-controls-overlay-play-button" i]::-internal-media-controls-overlay-play-button-internal,
-audio::-webkit-media-controls.state-loading-metadata-playing input[pseudo="-webkit-media-controls-play-button" i],
-video::-webkit-media-controls.state-loading-metadata-playing input[pseudo="-webkit-media-controls-play-button" i],
-video::-webkit-media-controls.state-loading-metadata-playing input[pseudo="-webkit-media-controls-overlay-play-button" i]::-internal-media-controls-overlay-play-button-internal,
-audio::-webkit-media-controls.state-buffering input[pseudo="-webkit-media-controls-play-button" i],
-video::-webkit-media-controls.state-buffering input[pseudo="-webkit-media-controls-play-button" i],
-video::-webkit-media-controls.state-buffering input[pseudo="-webkit-media-controls-overlay-play-button" i]::-internal-media-controls-overlay-play-button-internal {
-  background-image: -webkit-image-set(url(ic_pause.svg) 1x);
-}
-
-/* For the play button inside the button panel, we want to use a white icon
- * instead. */
-video::-webkit-media-controls.state-buffering [pseudo="-internal-media-controls-button-panel"] input[pseudo="-webkit-media-controls-play-button" i],
-video::-webkit-media-controls.state-loading-metadata-playing [pseudo="-internal-media-controls-button-panel"] input[pseudo="-webkit-media-controls-play-button" i],
-video::-webkit-media-controls.state-playing [pseudo="-internal-media-controls-button-panel"] input[pseudo="-webkit-media-controls-play-button" i] {
-  background-image: -webkit-image-set(url(ic_pause_white.svg) 1x);
-}
-
-video::-webkit-media-controls:not(.audio-only) input[pseudo="-webkit-media-controls-play-button"] {
-  /* Undo the extra 16px of left padding on the button panel. We only want that
-   * extra padding when the current time is the leftmost item, and not when the
-   * play button is leftmost. */
-  margin-left: -16px;
-}
-
-/**
- * Timeline
- */
-
-audio::-webkit-media-controls-timeline,
-video::-webkit-media-controls-timeline {
-  -webkit-appearance: -internal-media-control;
-
-  height: 4px;
-  padding-left: 16px;
-  padding-right: 16px;
-  margin: 0;
-  background: transparent;
-  cursor: pointer;
-
-  /* Cursor: pointer will cause a highlight when touch on it, this will disable it */
-  -webkit-tap-highlight-color: transparent;
-
-  /* This prevents layout issues in quirks mode */
-  box-sizing: unset !important;
-}
-
-audio::-webkit-media-controls-timeline,
-video::-webkit-media-controls.audio-only [pseudo="-webkit-media-controls-timeline"] {
-  padding-top: 26px;
-  padding-bottom: 26px;
-}
-
-video::-webkit-media-controls-timeline {
-  z-index: 0;
-}
-
-video::-webkit-media-controls.sizing-small input[pseudo="-webkit-media-controls-timeline" i] {
-  padding: 0 16px 20px 16px;
-}
-
-video::-webkit-media-controls.sizing-large input[pseudo="-webkit-media-controls-timeline" i] {
-  padding: 0 32px 20px 32px;
-}
-
-input[pseudo="-webkit-media-controls-timeline" i],
-input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-before,
-input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-after,
-input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-background,
-input[pseudo="-webkit-media-controls-volume-slider" i],
-input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-track-segment-highlight-before,
-input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-track-segment-highlight-after,
-input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-track-segment-background {
-  height: 4px;
-}
-
-video::-webkit-media-controls input[pseudo="-webkit-media-controls-timeline" i]::-webkit-slider-thumb,
-audio::-webkit-media-controls input[pseudo="-webkit-media-controls-timeline" i]::-webkit-slider-thumb,
-video::-webkit-media-controls input[pseudo="-webkit-media-controls-volume-slider" i]::-webkit-slider-thumb,
-audio::-webkit-media-controls input[pseudo="-webkit-media-controls-volume-slider" i]::-webkit-slider-thumb {
-  transition: opacity 0.3s;
-  opacity: 0;
-  width: 12px;
-  height: 12px;
-  margin-top: -4px;
-}
-
-video::-webkit-media-controls input[pseudo="-webkit-media-controls-timeline" i]:hover::-webkit-slider-thumb,
-video::-webkit-media-controls input[pseudo="-webkit-media-controls-timeline" i]:focus::-webkit-slider-thumb,
-audio::-webkit-media-controls input[pseudo="-webkit-media-controls-timeline" i]:hover::-webkit-slider-thumb,
-audio::-webkit-media-controls input[pseudo="-webkit-media-controls-timeline" i]:focus::-webkit-slider-thumb,
-video::-webkit-media-controls input[pseudo="-webkit-media-controls-volume-slider" i]:hover::-webkit-slider-thumb,
-video::-webkit-media-controls input[pseudo="-webkit-media-controls-volume-slider" i]:focus::-webkit-slider-thumb,
-audio::-webkit-media-controls input[pseudo="-webkit-media-controls-volume-slider" i]:hover::-webkit-slider-thumb,
-audio::-webkit-media-controls input[pseudo="-webkit-media-controls-volume-slider" i]:focus::-webkit-slider-thumb {
-  opacity: 1;
-}
-
-input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-after,
-input[pseudo="-webkit-media-controls-timeline" i]::-internal-media-controls-segmented-track,
-input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-track-segment-highlight-after,
-input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-media-controls-segmented-track {
-  border-radius: 2px;
-}
-
-video::-webkit-media-controls div[pseudo="-internal-media-controls-loading-panel" i]::-internal-media-controls-loading-panel-spinner-frame {
-  position: absolute;
-  top: 50%;
-  left: 50%;
-  overflow: hidden;
-
-  height: 72px /* overlay play button height */;
-  width: 72px /* overlay play button width */;
-  margin-left: -36px /* (72px overlay play button width / -2) */;
-  margin-top: -48px /* (72px overlay play button height + 24px timeline height + padding-bottom) / -2) */;
-}
-
-div[pseudo="-internal-media-controls-loading-panel" i]::-internal-media-controls-loading-panel-spinner-mask-1-background {
-  left: 0;
-  background-image: -webkit-image-set(
-    url(default_100_percent/modern/loading_mask_1.svg) 1x);
-  background-position: center left;
-}
-
-div[pseudo="-internal-media-controls-loading-panel" i]::-internal-media-controls-loading-panel-spinner-mask-2-background {
-  left: -100%;
-  background-image: -webkit-image-set(
-    url(default_100_percent/modern/loading_mask_2.svg) 1x);
-  background-position: center right;
-}
-
-input[pseudo="-webkit-media-controls-timeline" i]::-internal-media-controls-segmented-track,
-input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-media-controls-segmented-track {
-  -webkit-appearance: -internal-media-control;
-
-  flex: 1;
-  background: rgba(0, 0, 0, .2);
-  border-radius: 2px;
-  position: relative;
-}
-video::-webkit-media-controls:not(.audio-only) input[pseudo="-webkit-media-controls-timeline" i]::-internal-media-controls-segmented-track,
-video::-webkit-media-controls:not(.audio-only) input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-media-controls-segmented-track {
-  background: rgba(255, 255, 255, .3);
-  box-shadow: 0 2px 10px 0 rgba(0,0,0,0.5);
-}
-
-input[pseudo="-webkit-media-controls-timeline" i]::-webkit-slider-thumb,
-input[pseudo="-webkit-media-controls-volume-slider" i]::-webkit-slider-thumb {
-  -webkit-appearance: -internal-media-control;
-  background: rgba(0, 0, 0, .87);
-  box-shadow: 0 0 10px 0 #fff;
-
-  width: 12px;
-  height: 12px;
-  border-radius: 50%;
-  margin-top: -4px;
-  flex: 0 0 0;
-}
-
-video::-webkit-media-controls:not(.audio-only) input[pseudo="-webkit-media-controls-timeline" i]::-webkit-slider-thumb,
-video::-webkit-media-controls:not(.audio-only) input[pseudo="-webkit-media-controls-volume-slider" i]::-webkit-slider-thumb {
-  background: #FFFFFF;
-  box-shadow: unset;
-}
-
-.state-no-source input[pseudo="-webkit-media-controls-timeline" i]::-webkit-slider-thumb {
-  display: none;
-}
-
-input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-background,
-input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-track-segment-background {
-  position: absolute;
-  width: 100%;
-  top: 0;
-  height: 4px;
-  overflow: hidden;
-}
-
-input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-before,
-input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-after,
-input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-track-segment-highlight-before,
-input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-track-segment-highlight-after {
-  position: absolute;
-  height: 4px;
-}
-
-input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-before,
-input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-track-segment-highlight-before {
-  background: rgba(0, 0, 0, .87);
-  border-radius: 100px;
-}
-video::-webkit-media-controls:not(.audio-only) input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-before,
-video::-webkit-media-controls:not(.audio-only) input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-track-segment-highlight-before {
-  background: rgba(255, 255, 255, 1);
-}
-
-input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-after,
-input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-track-segment-highlight-after {
-  background: rgba(0, 0, 0, .54);
-  border-radius: 2px;
-}
-video::-webkit-media-controls:not(.audio-only) input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-after,
-video::-webkit-media-controls:not(.audio-only) input[pseudo="-webkit-media-controls-volume-slider" i]::-internal-track-segment-highlight-after {
-  background: rgba(255, 255, 255, .54);
-}
-
-audio::-webkit-media-controls-volume-slider,
-video::-webkit-media-controls-volume-slider {
-  -webkit-appearance: -internal-media-control;
-
-  height: 4px;
-  width: 52px;
-  transition: width 0.3s;
-  margin: 0;
-  padding: 22px 0; /* (48px button panel height - 4px slider height) / 2  */
-  background: transparent;
-  cursor: pointer;
-
-  /* Cursor: pointer will cause a highlight when touch on it, this will disable it */
-  -webkit-tap-highlight-color: transparent;
-
-  /* This prevents layout issues in quirks mode. */
-  box-sizing: unset !important;
-}
-
-audio::-webkit-media-controls-volume-slider.closed,
-video::-webkit-media-controls-volume-slider.closed {
-  width: 0;
-  opacity: 0;
-  pointer-events: none;
-  transition: width 0.3s ease, opacity 0.28s step-end;
-}
-
-video::-webkit-media-controls.sizing-large input[pseudo="-webkit-media-controls-volume-slider" i] {
-  padding: 30px 0; /* (64px button panel height - 4px slider height) / 2  */
-}
-
-/**
- * Time Display
- */
-
-audio::-webkit-media-controls-time-remaining-display,
-video::-webkit-media-controls-time-remaining-display {
-  text-align: left;
-  margin-left: 4px;
-}
-
-audio::-webkit-media-controls-current-time-display,
-video::-webkit-media-controls-current-time-display,
-audio::-webkit-media-controls-time-remaining-display,
-video::-webkit-media-controls-time-remaining-display {
-  opacity: 0.87;
-  font-family: Roboto-Regular, Roboto, sans-serif;
-  font-size: 14px;
-  color: #000000;
-  letter-spacing: 0;
-  text-shadow: 0 0 10px #FFFFFF;
-}
-video::-webkit-media-controls:not(.audio-only) [pseudo="-webkit-media-controls-current-time-display"],
-video::-webkit-media-controls:not(.audio-only) [pseudo="-webkit-media-controls-time-remaining-display"] {
-  color: #FFFFFF;
-  text-shadow: unset;
-  opacity: unset;
-}
-
-/**
- * Overflow Menu
- */
-
-audio::-internal-media-controls-text-track-list,
-video::-internal-media-controls-text-track-list,
-audio::-internal-media-controls-overflow-menu-list,
-video::-internal-media-controls-overflow-menu-list {
-  position: fixed;
-  z-index: 2; /* Keep the menus above the loading animation at z-index 1. */
-  max-height: 250px;
-  width: 200px;
-  overflow-x: hidden;
-  overflow-y: auto;
-  white-space: nowrap;
-  font-size: 12px;
-  background: #FFFFFF;
-  box-shadow: 0 1px 9px 0 rgba(0,0,0,0.40);
-  border-radius: 2px;
-  transition: transform .3s ease-out, opacity .2s linear;
-  transform-origin: bottom right;
-}
-
-audio::-internal-media-controls-overflow-menu-list:focus,
-video::-internal-media-controls-overflow-menu-list:focus {
-  outline: none;
-}
-
-audio::-internal-media-controls-overflow-menu-list.closed,
-video::-internal-media-controls-overflow-menu-list.closed {
-  transform: scale(0);
-  opacity: 0;
-}
-
-audio::-internal-media-controls-text-track-list-header,
-video::-internal-media-controls-text-track-list-header,
-audio::-internal-media-controls-text-track-list-item,
-video::-internal-media-controls-text-track-list-item,
-audio::-internal-media-controls-overflow-menu-list-item,
-video::-internal-media-controls-overflow-menu-list-item {
-  display: flex;
-  align-items: center;
-  justify-content: flex-start;
-
-  font-family: Roboto-Regular, Roboto, sans-serif;
-  font-size: 12px;
-  color: rgba(0,0,0,0.87);
-  letter-spacing: 0;
-
-  line-height: 48px;
-  padding-left: 16px;
-  padding-right: 16px;
-  cursor: pointer;
-  /* Cursor: pointer will cause a highlight when touch on it, this will disable it */
-  -webkit-tap-highlight-color: transparent;
-
-  /*
-   * Avoid slight text movement after item transition ends.
-   * By setting translateZ, we are using hardware acceleration,
-   * which allows a smoother transition.
-   */
-  transform: translateZ(0);
-}
-
-video::-webkit-media-controls.sizing-small label[pseudo="-internal-media-controls-overflow-menu-list-item" i] input,
-video::-webkit-media-controls.sizing-large label[pseudo="-internal-media-controls-overflow-menu-list-item" i] input {
-  margin-left: 0;
-  margin-right: 16px;
-  width: 24px;
-  height: 24px;
-  min-width: 24px;
-  background-size: 24px;
-}
-
-label[pseudo="-internal-media-controls-overflow-menu-list-item"] input {
-  margin-left: -9px;
-  margin-right: 6px;
-  pointer-events: none;
-}
-
-label[pseudo="-internal-media-controls-overflow-menu-list-item"] div {
-  display: inline-grid;
-  margin: 16px 0 16px 0;
-  overflow: hidden;
-}
-
-label[pseudo="-internal-media-controls-overflow-menu-list-item"] div.with-subtitle {
-  margin: 8px 0 8px 0;
-}
-
-label[pseudo="-internal-media-controls-overflow-menu-list-item"] div span {
-  line-height: normal;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-label[pseudo="-internal-media-controls-text-track-list-item"] span {
-  line-height: normal;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  /*
-   * We need to make sure the blue tick has enough space to render. The blue tick needs at least 18px
-   * so the max width the span can go is 200(text-track-list) - 58(left-padding of list-item)
-   * - 16(right-padding of list-item) -30(left and right margin of the checkbox) - 18(blue tick) = 78px
-   */
-  max-width: 78px;
-}
-
-label[pseudo="-internal-media-controls-overflow-menu-list-item"] div span.subtitle {
-  color: rgba(0,0,0,0.54);
-}
-
-/*
- * Overflow menu list item animation
- */
-audio::-webkit-media-controls div[pseudo="-internal-media-controls-overflow-menu-list" i].closed > label,
-video::-webkit-media-controls div[pseudo="-internal-media-controls-overflow-menu-list" i].closed > label {
-  transform: translate(0px, 15px);
-  opacity: 0;
-}
-
-audio::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i],
-video::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i] {
-  transition: transform .2s, opacity .4s;
-}
-
-audio::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-0,
-video::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-0 {
-  transition: opacity .4s .1s ease-in;
-}
-
-audio::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-1,
-video::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-1 {
-  transition-delay: .15s;
-}
-
-audio::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-2,
-video::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-2 {
-  transition-delay: .2s;
-}
-
-audio::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-3,
-video::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-3 {
-  transition-delay: .25s;
-}
-
-audio::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-4,
-video::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-4 {
-  transition-delay: .3s;
-}
-
-audio::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-5,
-video::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-5 {
-  transition-delay: .35s
-}
-
-audio::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-6,
-video::-webkit-media-controls label[pseudo="-internal-media-controls-overflow-menu-list-item" i].animated-6 {
-  transition-delay: .4s
-}
-
-audio::-internal-media-controls-text-track-list-header:focus,
-video::-internal-media-controls-text-track-list-header:focus,
-audio::-internal-media-controls-overflow-menu-list-item:focus,
-video::-internal-media-controls-overflow-menu-list-item:focus,
-audio::-internal-media-controls-text-track-list-item:focus,
-video::-internal-media-controls-text-track-list-item:focus {
-  background-color: #e0e0e0;
-  outline: none;
-}
-
-audio::-internal-media-controls-text-track-list-header,
-video::-internal-media-controls-text-track-list-header,
-audio::-internal-media-controls-text-track-list-item,
-video::-internal-media-controls-text-track-list-item {
-  padding-left: 58px;
-  justify-content: space-between;
-}
-
-audio::-internal-media-controls-text-track-list-header,
-video::-internal-media-controls-text-track-list-header {
-  background-size: 18px;
-  background-position: 20px center;
-  background-repeat: no-repeat;
-  background-image: -webkit-image-set(url(ic_arrow_back.svg) 1x);
-}
-
-label[pseudo="-internal-media-controls-text-track-list-item"] input {
-  -webkit-appearance: none;
-  width: 18px;
-  height: 18px;
-  margin: 15px;
-  float: right;
-  pointer-events: none;
-}
-
-label[pseudo="-internal-media-controls-text-track-list-item"] input:checked {
-  background: -webkit-image-set(url(ic_check_blue.svg) 1x) no-repeat center center;
-}
-
-video::-webkit-media-controls-overlay-enclosure {
-  position: absolute;
-  width: 100%;
-  height: 100%;
-}
-
-/**
- * Audio Controls
- */
-
-audio:not([controls]) {
-  display: none !important;
-}
-
-audio {
-  width: 300px;
-  height: 54px;
-}
-
-audio::-webkit-media-controls-overlay-enclosure,
-video::-webkit-media-controls.audio-only [pseudo="-webkit-media-controls-overlay-enclosure"] {
-  display: none;
-}
-
-audio::-webkit-media-controls-enclosure,
-video::-webkit-media-controls.audio-only [pseudo="-webkit-media-controls-enclosure"] {
-  max-height: 54px;
-  flex-direction: row;
-  background: #F1F3F4;
-  border-radius: 100px;
-  overflow: hidden;
-}
-
-audio::-webkit-media-controls-panel,
-video::-webkit-media-controls.audio-only [pseudo="-webkit-media-controls-panel"] {
-  flex-direction: row;
-  background: none;
-  padding: 0 10px;
-  align-items: center;
-  justify-content: flex-start;
-}
-
-audio::-internal-media-controls-play-button,
-video::-webkit-media-controls.audio-only [pseudo="-internal-media-controls-play-button"] {
-  display: none;
-}
-
-audio::-webkit-media-controls-current-time-display,
-video::-webkit-media-controls.audio-only [pseudo="-webkit-media-controls-current-time-display"] {
-  text-align: right;
-  margin-left: 5px;
-}
-
-audio::-webkit-media-controls-current-time-display,
-video::-webkit-media-controls.audio-only [pseudo="-webkit-media-controls-current-time-display"],
-audio::-webkit-media-controls-time-remaining-display,
-video::-webkit-media-controls.audio-only [pseudo="-webkit-media-controls-time-remaining-display"] {
-  min-width: auto;
-  flex: 0;
-  white-space: nowrap;
-}
-
-audio::-webkit-media-controls-timeline,
-video::-webkit-media-controls.audio-only [pseudo="-webkit-media-controls-timeline"] {
-  flex: 1 0 0px;
-  width: 0;
-}
-
-audio::-webkit-media-controls-play-button,
-video::-webkit-media-controls.audio-only [pseudo="-webkit-media-controls-play-button"],
-audio::-webkit-media-controls-mute-button,
-video::-webkit-media-controls.audio-only [pseudo="-webkit-media-controls-mute-button"],
-audio::-internal-media-controls-overflow-button,
-video::-webkit-media-controls.audio-only [pseudo="-internal-media-controls-overflow-button"] {
-  flex: 0 0 32px;
-}
-
-/**
- * Preload state
- */
-
-.use-default-poster {
-  background: #333;
-}
-
-.state-no-source input[pseudo="-webkit-media-controls-overlay-play-button" i]::-internal-media-controls-overlay-play-button-internal {
-  opacity: .3;
-  background-image: -webkit-image-set(url(ic_no_source.svg) 1x);
-}
-
-/**
- * Loading spinner
- */
-
-video::-internal-media-controls-loading-panel {
-  position: absolute;
-  left: 0;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  overflow: hidden;
-  z-index: 1;
-  pointer-events: none;
-}
-
-audio::-internal-media-controls-loading-panel,
-video::-webkit-media-controls.audio-only [pseudo="-internal-media-controls-loading-panel"] {
-  display: none;
-}
-
-/**
- * Animated Arrow Container
- */
-
-video::-internal-media-controls-animated-arrow-container {
-  position: absolute;
-  display: flex;
-  align-items: center;
-  left: 0;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  overflow: hidden;
-  z-index: 1;
-  pointer-events: none;
-}
-
-audio::-internal-media-controls-animated-arrow-container,
-video::-webkit-media-controls.audio-only [pseudo="-internal-media-controls-animated-arrow-container"] {
-  display: none;
-}
-
-/**
- * Text Tracks
- */
-video::-webkit-media-text-track-container {
-    position: relative;
-    width: inherit;
-    height: inherit;
-    overflow: hidden;
-
-    font: 22px sans-serif;
-    text-align: center;
-    color: rgba(255, 255, 255, 1);
-
-    letter-spacing: normal;
-    word-spacing: normal;
-    text-transform: none;
-    text-indent: 0;
-    text-decoration: none;
-    pointer-events: none;
-    -webkit-user-select: none;
-    word-break: break-word;
-}
-
-video::cue {
-    display: inline;
-
-    background-color: rgba(0, 0, 0, 0.8);
-    padding: 2px 2px;
-}
-
-video::-webkit-media-text-track-region {
-    position: absolute;
-    line-height: 5.33vh;
-    writing-mode: horizontal-tb;
-    background: rgba(0, 0, 0, 0.8);
-    color: rgba(255, 255, 255, 1);
-    word-wrap: break-word;
-    overflow-wrap: break-word;
-    overflow: hidden;
-}
-
-video::-webkit-media-text-track-region-container {
-    position: relative;
-
-    display: flex;
-    flex-flow: column;
-    flex-direction: column;
-}
-
-video::-webkit-media-text-track-region-container.scrolling {
-    transition: top 433ms linear;
-}
-
-
-video::-webkit-media-text-track-display {
-    position: absolute;
-    overflow: hidden;
-    white-space: pre-wrap;
-    -webkit-box-sizing: border-box;
-    flex: 0 0 auto;
-}
-
-video::cue(:future) {
-    color: gray;
-}
-
-video::cue(b) {
-    font-weight: bold;
-}
-
-video::cue(u) {
-    text-decoration: underline;
-}
-
-video::cue(i) {
-    font-style: italic;
-}
-
-/**
- * Overlay cast button
- */
-
-video::-internal-media-controls-overlay-cast-button {
-    -webkit-appearance: none;
-    background-image: -webkit-image-set(
-      url(default_100_percent/modern/mediaplayer_overlay_cast_off.png) 1x);
-    background-size: cover;
-    background-repeat: no-repeat;
-    background-position: center center;
-    display: flex;
-    position: absolute;
-    top: 8px;
-    left: 8px;
-    margin-left: 0px;
-    margin-top: 0px;
-    border-width: 0px;
-    background-color: transparent;
-    width: 48px;
-    height: 48px;
-    padding: 0;
-    transition: opacity 0.3s;
-}
-
-video::-internal-media-controls-overlay-cast-button.on {
-    background-image: -webkit-image-set(
-      url(default_100_percent/modern/mediaplayer_overlay_cast_on.png) 1x);
-}
-
-/**
- * Scrubbing
- */
-
-video::-internal-media-controls-scrubbing-message {
-  position: absolute;
-  top: 12px;
-  text-align: center;
-  width: 100%;
-  color: #FFFFFF;
-}
-
-.state-scrubbing input[pseudo="-webkit-media-controls-overlay-play-button" i] {
-  display: none;
-}
-
-/**
- * VR styling.
- */
-video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-timeline" i],
-video::-webkit-media-controls.immersive-mode div[pseudo="-internal-media-controls-button-panel" i] {
-  padding-left: 32px;
-  padding-right: 32px;
-}
-
-/* Timeline sizing does not include padding in max width. */
-video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-timeline" i] {
-  max-width: 471px;
-  height: 5px;
-  margin-bottom: 20px;
-  padding-top: 19px;
-  padding-bottom: 19px;
-}
-
-/* Button panel sizing does include padding in max width. */
-video::-webkit-media-controls.immersive-mode div[pseudo="-internal-media-controls-button-panel" i] {
-  max-width: 535px; /* 471px + 64px padding. */
-}
-
-video::-webkit-media-controls.immersive-mode div[pseudo="-webkit-media-controls-panel" i] {
-  /* Centering the button panel and timeline within the controls. */
-  text-align: -webkit-center;
-
-  /* Taller scrim. */
-  background:
-    -webkit-image-set(url('default_100_percent/modern/vr_gradient_bg.png') 1x)
-    repeat-x bottom left;
-}
-
-video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-before,
-video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-highlight-after,
-video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-timeline" i]::-internal-track-segment-background {
-  height: 5px;
-}
-
-video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-timeline" i]::-webkit-slider-thumb {
-  width: 16px;
-  height: 16px;
-  border-radius: 8px;
-  margin-top: -5px;
-}
-
-video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-overlay-play-button" i] {
-  margin-left: -52px /* (play button width / 2) + 20px Padding */;
-  margin-top: -64px /* (play button width + timeline height + padding-bottom) / 2 + padding */
-}
-
-video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-overlay-play-button" i]::-internal-media-controls-overlay-play-button-internal {
-  width: 64px;
-  height: 64px;
-  border-radius: 32px;
-  background-size: 36px;
-}
-
-video::-webkit-media-controls.immersive-mode div[pseudo="-internal-media-controls-loading-panel" i]::-internal-media-controls-loading-panel-spinner-frame {
-  width: 64px; /* play button width */
-  height: 64px; /* play button width */
-  margin-top: -44px; /* (play button width + timeline height + padding-bottom) / -2 */
-  margin-left: -32px; /* play button width / -2 */
-}
-
-video::-webkit-media-controls.immersive-mode div[pseudo="-webkit-media-controls-volume-control-container" i],
-video::-webkit-media-controls.immersive-mode div[pseudo="-webkit-media-controls-volume-control-container" i] {
-  height: 43px;
-}
-
-video::-webkit-media-controls.immersive-mode div[pseudo="-webkit-media-controls-volume-control-container" i].closed,
-video::-webkit-media-controls.immersive-mode div[pseudo="-webkit-media-controls-volume-control-container" i].closed {
-  min-width: 43px;
-}
-
-video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-mute-button" i],
-video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-fullscreen-button" i],
-video::-webkit-media-controls.immersive-mode input[pseudo="-internal-media-controls-overflow-button" i] {
-  width: 43px;
-  height: 43px;
-  min-width: 43px;
-  margin-left: 5px;
-  background-size: 24px;
-}
-
-video::-webkit-media-controls.immersive-mode div[pseudo="-internal-media-controls-button-panel" i] {
-  height: 43px;
-  line-height: 43px;
-}
-
-video::-webkit-media-controls.immersive-mode div[pseudo="-webkit-media-controls-current-time-display" i],
-video::-webkit-media-controls.immersive-mode div[pseudo="-webkit-media-controls-time-remaining-display" i] {
-  font-size: 16px;
-}
-
-/* Hover highlighting. */
-video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-mute-button" i]:hover,
-video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-fullscreen-button" i]:hover,
-video::-webkit-media-controls.immersive-mode input[pseudo="-internal-media-controls-overflow-button" i]:hover {
-  background-color: rgba(255, 255, 255, 0.2);
-  border-radius: 4px;
-}
-
-/* Hide modern hover background */
-video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-play-button" i]::-internal-media-controls-button-hover-background,
-video::-webkit-media-controls.immersive-mode input[pseudo="-webkit-media-controls-fullscreen-button" i]::-internal-media-controls-button-hover-background,
-video::-webkit-media-controls.immersive-mode input[pseudo="-internal-media-controls-overflow-button" i]::-internal-media-controls-button-hover-background {
-  display: none;
-}
-
-@media (-webkit-min-device-pixel-ratio: 2) {
-  video::-webkit-media-controls.immersive-mode div[pseudo="-webkit-media-controls-panel" i] {
-    background:
-      -webkit-image-set(url('default_200_percent/modern/vr_gradient_bg.png') 1x)
-      repeat-x bottom left auto 198px;
-  }
-}
-
-/**
- * Test mode styles to remove animations/transitions to make web tests
- * simpler.
- */
-/* Hide the loading panel. */
-video::-webkit-media-controls.test-mode div[pseudo="-internal-media-controls-loading-panel" i] {
-  display: none !important;
-}
-/* Prevent transitions. */
-audio::-webkit-media-controls.test-mode *,
-video::-webkit-media-controls.test-mode *,
-video::-webkit-media-controls.test-mode input[pseudo="-webkit-media-controls-timeline" i]::-webkit-slider-thumb,
-audio::-webkit-media-controls.test-mode input[pseudo="-webkit-media-controls-timeline" i]::-webkit-slider-thumb,
-video::-webkit-media-controls.test-mode input[pseudo="-webkit-media-controls-overlay-play-button" i]::-internal-media-controls-overlay-play-button-internal {
-  transition: none !important;
-}
diff --git a/third_party/blink/renderer/modules/mediastream/BUILD.gn b/third_party/blink/renderer/modules/mediastream/BUILD.gn
index dfe8c79..2a7136f 100644
--- a/third_party/blink/renderer/modules/mediastream/BUILD.gn
+++ b/third_party/blink/renderer/modules/mediastream/BUILD.gn
@@ -44,6 +44,7 @@
     "navigator_user_media.h",
     "overconstrained_error.cc",
     "overconstrained_error.h",
+    "remote_media_stream_track_adapter.cc",
     "user_media_client.cc",
     "user_media_client.h",
     "user_media_controller.cc",
diff --git a/third_party/blink/renderer/modules/mediastream/remote_media_stream_track_adapter.cc b/third_party/blink/renderer/modules/mediastream/remote_media_stream_track_adapter.cc
new file mode 100644
index 0000000..5219365
--- /dev/null
+++ b/third_party/blink/renderer/modules/mediastream/remote_media_stream_track_adapter.cc
@@ -0,0 +1,157 @@
+// Copyright (c) 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/public/web/modules/mediastream/remote_media_stream_track_adapter.h"
+
+#include "base/single_thread_task_runner.h"
+#include "media/base/limits.h"
+#include "third_party/blink/public/platform/modules/mediastream/media_stream_audio_source.h"
+#include "third_party/blink/public/platform/modules/webrtc/peer_connection_remote_audio_source.h"
+#include "third_party/blink/public/platform/modules/webrtc/track_observer.h"
+#include "third_party/blink/public/web/modules/mediastream/media_stream_video_track.h"
+#include "third_party/blink/public/web/modules/peerconnection/media_stream_remote_video_source.h"
+#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
+#include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
+#include "third_party/blink/renderer/platform/wtf/functional.h"
+
+namespace blink {
+
+RemoteVideoTrackAdapter::RemoteVideoTrackAdapter(
+    const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
+    webrtc::VideoTrackInterface* webrtc_track)
+    : RemoteMediaStreamTrackAdapter(main_thread, webrtc_track) {
+  std::unique_ptr<TrackObserver> observer(
+      new TrackObserver(main_thread, observed_track().get()));
+  // Here, we use CrossThreadUnretained() to avoid a circular reference.
+  //
+  // TODO(crbug.com/963574): Remove the use of ConvertToBaseOnceCallback here
+  // once the file that includes remote_media_stream_track_adapter.h (namely
+  // webrtc_media_stream_track_adapter.h) is Onion souped.
+  web_initialize_ = ConvertToBaseOnceCallback(
+      CrossThreadBindOnce(&RemoteVideoTrackAdapter::InitializeWebVideoTrack,
+                          CrossThreadUnretained(this), std::move(observer),
+                          observed_track()->enabled()));
+}
+
+RemoteVideoTrackAdapter::~RemoteVideoTrackAdapter() {
+  DCHECK(main_thread_->BelongsToCurrentThread());
+  if (initialized()) {
+    // TODO(crbug.com/704136): When moving RemoteVideoTrackAdapter out of the
+    // public API, make this managed by Oilpan. Note that, the destructor will
+    // not allowed to touch other on-heap objects like web_track().
+    static_cast<MediaStreamRemoteVideoSource*>(
+        web_track()->Source().GetPlatformSource())
+        ->OnSourceTerminated();
+  }
+}
+
+void RemoteVideoTrackAdapter::InitializeWebVideoTrack(
+    std::unique_ptr<TrackObserver> observer,
+    bool enabled) {
+  DCHECK(main_thread_->BelongsToCurrentThread());
+  auto video_source_ptr =
+      std::make_unique<MediaStreamRemoteVideoSource>(std::move(observer));
+  MediaStreamRemoteVideoSource* video_source = video_source_ptr.get();
+  InitializeWebTrack(WebMediaStreamSource::kTypeVideo);
+  web_track()->Source().SetPlatformSource(std::move(video_source_ptr));
+
+  WebMediaStreamSource::Capabilities capabilities;
+  capabilities.device_id = id();
+  web_track()->Source().SetCapabilities(capabilities);
+
+  web_track()->SetPlatformTrack(std::make_unique<MediaStreamVideoTrack>(
+      video_source, MediaStreamVideoSource::ConstraintsCallback(), enabled));
+}
+
+RemoteAudioTrackAdapter::RemoteAudioTrackAdapter(
+    const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
+    webrtc::AudioTrackInterface* webrtc_track)
+    : RemoteMediaStreamTrackAdapter(main_thread, webrtc_track),
+#if DCHECK_IS_ON()
+      unregistered_(false),
+#endif
+      state_(observed_track()->state()) {
+  // TODO(tommi): Use TrackObserver instead.
+  observed_track()->RegisterObserver(this);
+  // Here, we use CrossThreadUnretained() to avoid a circular reference.
+  //
+  // TODO(crbug.com/963574): Remove the use of ConvertToBaseOnceCallback here
+  // once the file that includes remote_media_stream_track_adapter.h (namely
+  // webrtc_media_stream_track_adapter.h) is Onion souped.
+  web_initialize_ = ConvertToBaseOnceCallback(
+      CrossThreadBindOnce(&RemoteAudioTrackAdapter::InitializeWebAudioTrack,
+                          CrossThreadUnretained(this), main_thread));
+}
+
+RemoteAudioTrackAdapter::~RemoteAudioTrackAdapter() {
+#if DCHECK_IS_ON()
+  DCHECK(unregistered_);
+#endif
+}
+
+void RemoteAudioTrackAdapter::Unregister() {
+#if DCHECK_IS_ON()
+  DCHECK(!unregistered_);
+  unregistered_ = true;
+#endif
+  observed_track()->UnregisterObserver(this);
+}
+
+void RemoteAudioTrackAdapter::InitializeWebAudioTrack(
+    const scoped_refptr<base::SingleThreadTaskRunner>& main_thread) {
+  InitializeWebTrack(WebMediaStreamSource::kTypeAudio);
+
+  auto source = std::make_unique<PeerConnectionRemoteAudioSource>(
+      observed_track().get(), main_thread);
+  auto* source_ptr = source.get();
+  web_track()->Source().SetPlatformSource(
+      std::move(source));  // Takes ownership.
+
+  WebMediaStreamSource::Capabilities capabilities;
+  capabilities.device_id = id();
+  bool values[] = {false};
+  capabilities.echo_cancellation = WebVector<bool>(values, 1u);
+  capabilities.auto_gain_control = WebVector<bool>(values, 1u);
+  capabilities.noise_suppression = WebVector<bool>(values, 1u);
+  capabilities.sample_size = {
+      media::SampleFormatToBitsPerChannel(media::kSampleFormatS16),  // min
+      media::SampleFormatToBitsPerChannel(media::kSampleFormatS16)   // max
+  };
+  web_track()->Source().SetCapabilities(capabilities);
+
+  source_ptr->ConnectToTrack(*(web_track()));
+}
+
+void RemoteAudioTrackAdapter::OnChanged() {
+  PostCrossThreadTask(
+      *main_thread_, FROM_HERE,
+      CrossThreadBindOnce(&RemoteAudioTrackAdapter::OnChangedOnMainThread,
+                          WrapRefCounted(this), observed_track()->state()));
+}
+
+void RemoteAudioTrackAdapter::OnChangedOnMainThread(
+    webrtc::MediaStreamTrackInterface::TrackState state) {
+  DCHECK(main_thread_->BelongsToCurrentThread());
+
+  if (state == state_ || !initialized())
+    return;
+
+  state_ = state;
+
+  switch (state) {
+    case webrtc::MediaStreamTrackInterface::kLive:
+      web_track()->Source().SetReadyState(
+          WebMediaStreamSource::kReadyStateLive);
+      break;
+    case webrtc::MediaStreamTrackInterface::kEnded:
+      web_track()->Source().SetReadyState(
+          WebMediaStreamSource::kReadyStateEnded);
+      break;
+    default:
+      NOTREACHED();
+      break;
+  }
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/modules/native_file_system/native_file_system_file_handle.cc b/third_party/blink/renderer/modules/native_file_system/native_file_system_file_handle.cc
index a0a03b9..4644a34 100644
--- a/third_party/blink/renderer/modules/native_file_system/native_file_system_file_handle.cc
+++ b/third_party/blink/renderer/modules/native_file_system/native_file_system_file_handle.cc
@@ -32,17 +32,17 @@
   ScriptPromise result = resolver->Promise();
 
   mojo_ptr_->CreateFileWriter(WTF::Bind(
-      [](ScriptPromiseResolver* resolver, NativeFileSystemFileHandle* handle,
+      [](ScriptPromiseResolver* resolver,
          mojom::blink::NativeFileSystemErrorPtr result,
          mojom::blink::NativeFileSystemFileWriterPtr writer) {
         if (result->error_code == base::File::FILE_OK) {
-          resolver->Resolve(MakeGarbageCollected<NativeFileSystemWriter>(
-              handle, std::move(writer)));
+          resolver->Resolve(
+              MakeGarbageCollected<NativeFileSystemWriter>(std::move(writer)));
         } else {
           resolver->Reject(file_error::CreateDOMException(result->error_code));
         }
       },
-      WrapPersistent(resolver), WrapPersistent(this)));
+      WrapPersistent(resolver)));
 
   return result;
 }
@@ -52,8 +52,19 @@
   auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
   ScriptPromise result = resolver->Promise();
 
-  resolver->Resolve(
-      MakeGarbageCollected<NativeFileSystemWritableFileStream>(this));
+  mojo_ptr_->CreateFileWriter(WTF::Bind(
+      [](ScriptPromiseResolver* resolver,
+         mojom::blink::NativeFileSystemErrorPtr result,
+         mojom::blink::NativeFileSystemFileWriterPtr writer) {
+        if (result->error_code == base::File::FILE_OK) {
+          resolver->Resolve(
+              MakeGarbageCollected<NativeFileSystemWritableFileStream>(
+                  std::move(writer)));
+        } else {
+          resolver->Reject(file_error::CreateDOMException(result->error_code));
+        }
+      },
+      WrapPersistent(resolver)));
   return result;
 }
 
diff --git a/third_party/blink/renderer/modules/native_file_system/native_file_system_handle.h b/third_party/blink/renderer/modules/native_file_system/native_file_system_handle.h
index 94413e7..2422b03 100644
--- a/third_party/blink/renderer/modules/native_file_system/native_file_system_handle.h
+++ b/third_party/blink/renderer/modules/native_file_system/native_file_system_handle.h
@@ -16,7 +16,6 @@
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
 namespace blink {
-class NativeFileSystemDirectoryHandle;
 class FileSystemHandlePermissionDescriptor;
 
 class NativeFileSystemHandle : public ScriptWrappable {
@@ -31,14 +30,7 @@
   virtual bool isDirectory() const { return false; }
   const String& name() const { return name_; }
 
-  ScriptPromise moveTo(ScriptState*,
-                       NativeFileSystemDirectoryHandle* parent,
-                       const String& new_name = String());
-  ScriptPromise copyTo(ScriptState*,
-                       NativeFileSystemDirectoryHandle* parent,
-                       const String& new_name = String());
   ScriptPromise remove(ScriptState*);
-
   ScriptPromise queryPermission(ScriptState*,
                                 const FileSystemHandlePermissionDescriptor*);
   ScriptPromise requestPermission(ScriptState*,
diff --git a/third_party/blink/renderer/modules/native_file_system/native_file_system_writable_file_stream.cc b/third_party/blink/renderer/modules/native_file_system/native_file_system_writable_file_stream.cc
index 5229397..a8cc8cd8 100644
--- a/third_party/blink/renderer/modules/native_file_system/native_file_system_writable_file_stream.cc
+++ b/third_party/blink/renderer/modules/native_file_system/native_file_system_writable_file_stream.cc
@@ -17,9 +17,9 @@
 namespace blink {
 
 NativeFileSystemWritableFileStream::NativeFileSystemWritableFileStream(
-    NativeFileSystemFileHandle* file)
-    : file_(file) {
-  DCHECK(file_);
+    mojom::blink::NativeFileSystemFileWriterPtr mojo_ptr)
+    : mojo_ptr_(std::move(mojo_ptr)) {
+  DCHECK(mojo_ptr_);
 }
 
 ScriptPromise NativeFileSystemWritableFileStream::write(
@@ -57,7 +57,7 @@
 ScriptPromise NativeFileSystemWritableFileStream::truncate(
     ScriptState* script_state,
     uint64_t size) {
-  if (!file_ || pending_operation_) {
+  if (!mojo_ptr_ || pending_operation_) {
     return ScriptPromise::RejectWithDOMException(
         script_state, MakeGarbageCollected<DOMException>(
                           DOMExceptionCode::kInvalidStateError));
@@ -65,7 +65,7 @@
   pending_operation_ =
       MakeGarbageCollected<ScriptPromiseResolver>(script_state);
   ScriptPromise result = pending_operation_->Promise();
-  file_->MojoHandle()->Truncate(
+  mojo_ptr_->Truncate(
       size, WTF::Bind(&NativeFileSystemWritableFileStream::TruncateComplete,
                       WrapPersistent(this)));
   return result;
@@ -100,7 +100,7 @@
     ScriptState* script_state,
     uint64_t position,
     Blob* blob) {
-  if (!file_ || pending_operation_) {
+  if (!mojo_ptr_ || pending_operation_) {
     return ScriptPromise::RejectWithDOMException(
         script_state, MakeGarbageCollected<DOMException>(
                           DOMExceptionCode::kInvalidStateError));
@@ -108,10 +108,9 @@
   pending_operation_ =
       MakeGarbageCollected<ScriptPromiseResolver>(script_state);
   ScriptPromise result = pending_operation_->Promise();
-  file_->MojoHandle()->Write(
-      position, blob->AsMojoBlob(),
-      WTF::Bind(&NativeFileSystemWritableFileStream::WriteComplete,
-                WrapPersistent(this)));
+  mojo_ptr_->Write(position, blob->AsMojoBlob(),
+                   WTF::Bind(&NativeFileSystemWritableFileStream::WriteComplete,
+                             WrapPersistent(this)));
   return result;
 }
 
@@ -170,7 +169,6 @@
 
 void NativeFileSystemWritableFileStream::Trace(Visitor* visitor) {
   ScriptWrappable::Trace(visitor);
-  visitor->Trace(file_);
   visitor->Trace(pending_operation_);
 }
 
diff --git a/third_party/blink/renderer/modules/native_file_system/native_file_system_writable_file_stream.h b/third_party/blink/renderer/modules/native_file_system/native_file_system_writable_file_stream.h
index ef4f8712..9a17156 100644
--- a/third_party/blink/renderer/modules/native_file_system/native_file_system_writable_file_stream.h
+++ b/third_party/blink/renderer/modules/native_file_system/native_file_system_writable_file_stream.h
@@ -6,6 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_NATIVE_FILE_SYSTEM_NATIVE_FILE_SYSTEM_WRITABLE_FILE_STREAM_H_
 
 #include "third_party/blink/public/mojom/native_file_system/native_file_system_error.mojom-blink.h"
+#include "third_party/blink/public/mojom/native_file_system/native_file_system_file_writer.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/array_buffer_or_array_buffer_view_or_blob_or_usv_string.h"
 #include "third_party/blink/renderer/core/streams/writable_stream.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
@@ -17,13 +18,13 @@
 class ScriptPromise;
 class ScriptPromiseResolver;
 class ScriptState;
-class NativeFileSystemFileHandle;
 
 class NativeFileSystemWritableFileStream final : public WritableStream {
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  explicit NativeFileSystemWritableFileStream(NativeFileSystemFileHandle*);
+  explicit NativeFileSystemWritableFileStream(
+      mojom::blink::NativeFileSystemFileWriterPtr);
 
   void Trace(Visitor* visitor) override;
 
@@ -51,7 +52,7 @@
                      uint64_t bytes_written);
   void TruncateComplete(mojom::blink::NativeFileSystemErrorPtr result);
 
-  Member<NativeFileSystemFileHandle> file_;
+  mojom::blink::NativeFileSystemFileWriterPtr mojo_ptr_;
 
   Member<ScriptPromiseResolver> pending_operation_;
 };
diff --git a/third_party/blink/renderer/modules/native_file_system/native_file_system_writer.cc b/third_party/blink/renderer/modules/native_file_system/native_file_system_writer.cc
index 89d4d67..297b541 100644
--- a/third_party/blink/renderer/modules/native_file_system/native_file_system_writer.cc
+++ b/third_party/blink/renderer/modules/native_file_system/native_file_system_writer.cc
@@ -25,10 +25,8 @@
 namespace blink {
 
 NativeFileSystemWriter::NativeFileSystemWriter(
-    NativeFileSystemFileHandle* file,
     mojom::blink::NativeFileSystemFileWriterPtr mojo_ptr)
-    : mojo_ptr_(std::move(mojo_ptr)), file_(file) {
-  DCHECK(file_);
+    : mojo_ptr_(std::move(mojo_ptr)) {
   DCHECK(mojo_ptr_);
 }
 
@@ -67,7 +65,7 @@
 ScriptPromise NativeFileSystemWriter::WriteBlob(ScriptState* script_state,
                                                 uint64_t position,
                                                 Blob* blob) {
-  if (!file_ || pending_operation_) {
+  if (!mojo_ptr_ || pending_operation_) {
     return ScriptPromise::RejectWithDOMException(
         script_state, MakeGarbageCollected<DOMException>(
                           DOMExceptionCode::kInvalidStateError));
@@ -75,7 +73,7 @@
   pending_operation_ =
       MakeGarbageCollected<ScriptPromiseResolver>(script_state);
   ScriptPromise result = pending_operation_->Promise();
-  file_->MojoHandle()->Write(
+  mojo_ptr_->Write(
       position, blob->AsMojoBlob(),
       WTF::Bind(&NativeFileSystemWriter::WriteComplete, WrapPersistent(this)));
   return result;
@@ -173,7 +171,7 @@
     uint64_t position,
     ReadableStream* stream,
     ExceptionState& exception_state) {
-  if (!file_ || pending_operation_) {
+  if (!mojo_ptr_ || pending_operation_) {
     return ScriptPromise::RejectWithDOMException(
         script_state, MakeGarbageCollected<DOMException>(
                           DOMExceptionCode::kInvalidStateError));
@@ -193,7 +191,7 @@
   ScriptPromise result = pending_operation_->Promise();
   auto* client = MakeGarbageCollected<StreamWriterClient>(this);
   stream_loader_->Start(consumer, client);
-  file_->MojoHandle()->WriteStream(
+  mojo_ptr_->WriteStream(
       position, client->TakeDataPipe(),
       WTF::Bind(&StreamWriterClient::WriteComplete, WrapPersistent(client)));
   return result;
@@ -201,7 +199,7 @@
 
 ScriptPromise NativeFileSystemWriter::truncate(ScriptState* script_state,
                                                uint64_t size) {
-  if (!file_ || pending_operation_) {
+  if (!mojo_ptr_ || pending_operation_) {
     return ScriptPromise::RejectWithDOMException(
         script_state, MakeGarbageCollected<DOMException>(
                           DOMExceptionCode::kInvalidStateError));
@@ -209,14 +207,13 @@
   pending_operation_ =
       MakeGarbageCollected<ScriptPromiseResolver>(script_state);
   ScriptPromise result = pending_operation_->Promise();
-  file_->MojoHandle()->Truncate(
-      size, WTF::Bind(&NativeFileSystemWriter::TruncateComplete,
-                      WrapPersistent(this)));
+  mojo_ptr_->Truncate(size, WTF::Bind(&NativeFileSystemWriter::TruncateComplete,
+                                      WrapPersistent(this)));
   return result;
 }
 
 ScriptPromise NativeFileSystemWriter::close(ScriptState* script_state) {
-  if (!file_ || pending_operation_) {
+  if (!mojo_ptr_ || pending_operation_) {
     return ScriptPromise::RejectWithDOMException(
         script_state, MakeGarbageCollected<DOMException>(
                           DOMExceptionCode::kInvalidStateError));
diff --git a/third_party/blink/renderer/modules/native_file_system/native_file_system_writer.h b/third_party/blink/renderer/modules/native_file_system/native_file_system_writer.h
index 70d2601..43a6ec2 100644
--- a/third_party/blink/renderer/modules/native_file_system/native_file_system_writer.h
+++ b/third_party/blink/renderer/modules/native_file_system/native_file_system_writer.h
@@ -25,8 +25,7 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  explicit NativeFileSystemWriter(NativeFileSystemFileHandle*,
-                                  mojom::blink::NativeFileSystemFileWriterPtr);
+  explicit NativeFileSystemWriter(mojom::blink::NativeFileSystemFileWriterPtr);
 
   ScriptPromise write(ScriptState*,
                       uint64_t position,
diff --git a/third_party/blink/renderer/platform/bindings/dom_wrapper_world.cc b/third_party/blink/renderer/platform/bindings/dom_wrapper_world.cc
index 7b69bb13..a388d2b1 100644
--- a/third_party/blink/renderer/platform/bindings/dom_wrapper_world.cc
+++ b/third_party/blink/renderer/platform/bindings/dom_wrapper_world.cc
@@ -113,7 +113,6 @@
 void DOMWrapperWorld::Trace(const ScriptWrappable* script_wrappable,
                             Visitor* visitor) {
   // Marking for worlds other than the main world.
-  DCHECK(ThreadState::Current()->GetIsolate());
   for (DOMWrapperWorld* world : GetWorldMap().Values()) {
     DOMDataStore& data_store = world->DomDataStore();
     if (data_store.ContainsWrapper(script_wrappable))
diff --git a/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.cc b/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.cc
index ed44886..f77d0dccd 100644
--- a/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.cc
+++ b/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.cc
@@ -42,7 +42,6 @@
 #include "third_party/blink/renderer/platform/bindings/v8_private_property.h"
 #include "third_party/blink/renderer/platform/bindings/v8_value_cache.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/heap/unified_heap_controller.h"
 #include "third_party/blink/renderer/platform/scheduler/public/thread.h"
 #include "third_party/blink/renderer/platform/wtf/leak_annotations.h"
 #include "v8/include/v8.h"
@@ -90,8 +89,6 @@
       use_counter_disabled_(false),
       is_handling_recursion_level_error_(false),
       is_reporting_exception_(false),
-      unified_heap_controller_(
-          new UnifiedHeapController(ThreadState::Current())),
       runtime_call_stats_(base::DefaultTickClock::GetInstance()) {
   // FIXME: Remove once all v8::Isolate::GetCurrent() calls are gone.
   GetIsolate()->Enter();
@@ -173,11 +170,11 @@
   // Detach V8's garbage collector.
   // Need to finalize an already running garbage collection as otherwise
   // callbacks are missing and state gets out of sync.
-  ThreadState::Current()->FinishIncrementalMarkingIfRunning(
+  ThreadState* const thread_state = ThreadState::Current();
+  thread_state->FinishIncrementalMarkingIfRunning(
       BlinkGC::kHeapPointersOnStack, BlinkGC::kAtomicMarking,
       BlinkGC::kEagerSweeping, BlinkGC::GCReason::kThreadTerminationGC);
-  isolate->SetEmbedderHeapTracer(nullptr);
-  data->unified_heap_controller_.reset();
+  thread_state->DetachFromIsolate();
 }
 
 // destroy() clear things that should be cleared after ThreadState::detach()
diff --git a/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h b/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h
index 9c67ba4..9b4f14f 100644
--- a/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h
+++ b/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h
@@ -37,7 +37,6 @@
 #include "third_party/blink/renderer/platform/bindings/v8_global_value_map.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
-#include "third_party/blink/renderer/platform/heap/unified_heap_controller.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 #include "third_party/blink/renderer/platform/wtf/forward.h"
 #include "third_party/blink/renderer/platform/wtf/hash_map.h"
@@ -217,14 +216,6 @@
     return active_script_wrappables_.Get();
   }
 
-  UnifiedHeapController* GetUnifiedHeapController() const {
-    return unified_heap_controller_.get();
-  }
-
-  v8::EmbedderHeapTracer* GetEmbedderHeapTracer() const {
-    return static_cast<v8::EmbedderHeapTracer*>(GetUnifiedHeapController());
-  }
-
  private:
   V8PerIsolateData(scoped_refptr<base::SingleThreadTaskRunner>,
                    V8ContextSnapshotMode);
@@ -293,7 +284,6 @@
   Persistent<GarbageCollectedData> profiler_group_;
 
   Persistent<ActiveScriptWrappableSet> active_script_wrappables_;
-  std::unique_ptr<UnifiedHeapController> unified_heap_controller_;
 
   RuntimeCallStats runtime_call_stats_;
 
diff --git a/third_party/blink/renderer/platform/heap/run_all_tests.cc b/third_party/blink/renderer/platform/heap/run_all_tests.cc
index 47429a8..d820990 100644
--- a/third_party/blink/renderer/platform/heap/run_all_tests.cc
+++ b/third_party/blink/renderer/platform/heap/run_all_tests.cc
@@ -43,7 +43,7 @@
   void Initialize() override {
     base::TestSuite::Initialize();
     content::SetUpBlinkTestEnvironment();
-    blink::ThreadState::Current()->RegisterTraceDOMWrappers(nullptr, nullptr);
+    blink::ThreadState::Current()->DetachFromIsolate();
   }
   void Shutdown() override {
     blink::ThreadState::Current()->CollectAllGarbageForTesting();
diff --git a/third_party/blink/renderer/platform/heap/thread_state.cc b/third_party/blink/renderer/platform/heap/thread_state.cc
index eb0747518..0f53bbd 100644
--- a/third_party/blink/renderer/platform/heap/thread_state.cc
+++ b/third_party/blink/renderer/platform/heap/thread_state.cc
@@ -55,6 +55,7 @@
 #include "third_party/blink/renderer/platform/heap/page_pool.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
 #include "third_party/blink/renderer/platform/heap/thread_state_scopes.h"
+#include "third_party/blink/renderer/platform/heap/unified_heap_controller.h"
 #include "third_party/blink/renderer/platform/heap/unified_heap_marking_visitor.h"
 #include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/blink/renderer/platform/histogram.h"
@@ -67,6 +68,7 @@
 #include "third_party/blink/renderer/platform/wtf/stack_util.h"
 #include "third_party/blink/renderer/platform/wtf/threading_primitives.h"
 #include "third_party/blink/renderer/platform/wtf/time.h"
+#include "v8/include/v8-profiler.h"
 #include "v8/include/v8.h"
 
 #if defined(OS_WIN)
@@ -171,6 +173,35 @@
   delete state;
 }
 
+void ThreadState::AttachToIsolate(
+    v8::Isolate* isolate,
+    V8TraceRootsCallback v8_trace_roots,
+    V8BuildEmbedderGraphCallback v8_build_embedder_graph) {
+  DCHECK(isolate);
+  isolate_ = isolate;
+  v8_trace_roots_ = v8_trace_roots;
+  v8_build_embedder_graph_ = v8_build_embedder_graph;
+  unified_heap_controller_.reset(new UnifiedHeapController(this));
+  isolate_->SetEmbedderHeapTracer(unified_heap_controller_.get());
+  if (v8::HeapProfiler* profiler = isolate->GetHeapProfiler()) {
+    profiler->AddBuildEmbedderGraphCallback(v8_build_embedder_graph, nullptr);
+  }
+}
+
+void ThreadState::DetachFromIsolate() {
+  if (isolate_) {
+    isolate_->SetEmbedderHeapTracer(nullptr);
+    if (v8::HeapProfiler* profiler = isolate_->GetHeapProfiler()) {
+      profiler->RemoveBuildEmbedderGraphCallback(v8_build_embedder_graph_,
+                                                 nullptr);
+    }
+  }
+  isolate_ = nullptr;
+  v8_trace_roots_ = nullptr;
+  v8_build_embedder_graph_ = nullptr;
+  unified_heap_controller_.reset();
+}
+
 void ThreadState::RunTerminationGC() {
   DCHECK(!IsMainThread());
   DCHECK(CheckThread());
@@ -287,10 +318,10 @@
 }
 
 void ThreadState::VisitDOMWrappers(Visitor* visitor) {
-  if (trace_dom_wrappers_) {
+  if (v8_trace_roots_) {
     ThreadHeapStatsCollector::Scope stats_scope(
         Heap().stats_collector(), ThreadHeapStatsCollector::kVisitDOMWrappers);
-    trace_dom_wrappers_(isolate_, visitor);
+    v8_trace_roots_(isolate_, visitor);
   }
 }
 
@@ -1359,9 +1390,7 @@
     // finalization of V8 upon Oilpan GCs during a unified GC. Alternative
     // include either breaking up the GCs or avoiding the call in first place.
     if (IsUnifiedGCMarkingInProgress()) {
-      V8PerIsolateData::From(isolate_)
-          ->GetUnifiedHeapController()
-          ->FinalizeTracing();
+      unified_heap_controller()->FinalizeTracing();
     } else {
       RunAtomicPause(stack_state, marking_type, sweeping_type, reason);
     }
diff --git a/third_party/blink/renderer/platform/heap/thread_state.h b/third_party/blink/renderer/platform/heap/thread_state.h
index 4e7490f..237f07f9 100644
--- a/third_party/blink/renderer/platform/heap/thread_state.h
+++ b/third_party/blink/renderer/platform/heap/thread_state.h
@@ -52,6 +52,7 @@
 #include "third_party/blink/renderer/platform/wtf/time.h"
 
 namespace v8 {
+class EmbedderGraph;
 class Isolate;
 }
 
@@ -67,6 +68,7 @@
 class PersistentRegion;
 class ThreadHeap;
 class ThreadState;
+class UnifiedHeapController;
 class Visitor;
 
 template <ThreadAffinity affinity>
@@ -173,6 +175,11 @@
   class ObjectResurrectionForbiddenScope;
   class SweepForbiddenScope;
 
+  using V8TraceRootsCallback = void (*)(v8::Isolate*, Visitor*);
+  using V8BuildEmbedderGraphCallback = void (*)(v8::Isolate*,
+                                                v8::EmbedderGraph*,
+                                                void*);
+
   // Returns true if some thread (possibly the current thread) may be doing
   // incremental marking. If false is returned, the *current* thread is
   // definitely not doing incremental marking. See atomic_entry_flag.h for
@@ -208,6 +215,22 @@
   ThreadHeap& Heap() const { return *heap_; }
   base::PlatformThreadId ThreadId() const { return thread_; }
 
+  // Associates |ThreadState| with a given |v8::Isolate|, essentially tying
+  // there garbage collectors together.
+  void AttachToIsolate(v8::Isolate*,
+                       V8TraceRootsCallback,
+                       V8BuildEmbedderGraphCallback);
+
+  // Removes the association from a potentially attached |v8::Isolate|.
+  void DetachFromIsolate();
+
+  // Returns an |UnifiedHeapController| if ThreadState is attached to a V8
+  // isolate (see |AttachToIsolate|), nullptr otherwise.
+  UnifiedHeapController* unified_heap_controller() const {
+    DCHECK(isolate_);
+    return unified_heap_controller_.get();
+  }
+
   // When ThreadState is detaching from non-main thread its
   // heap is expected to be empty (because it is going away).
   // Perform registered cleanup tasks and garbage collection
@@ -354,14 +377,6 @@
     Vector<size_t> dead_size;
   };
 
-  void RegisterTraceDOMWrappers(v8::Isolate* isolate,
-                                void (*trace_dom_wrappers)(v8::Isolate*,
-                                                           Visitor*)) {
-    isolate_ = isolate;
-    DCHECK(!isolate_ || trace_dom_wrappers);
-    trace_dom_wrappers_ = trace_dom_wrappers;
-  }
-
   void FreePersistentNode(PersistentRegion*, PersistentNode*);
 
   using PersistentClearCallback = void (*)(void*);
@@ -560,7 +575,9 @@
   LinkedHashSet<PreFinalizer> ordered_pre_finalizers_;
 
   v8::Isolate* isolate_ = nullptr;
-  void (*trace_dom_wrappers_)(v8::Isolate*, Visitor*) = nullptr;
+  V8TraceRootsCallback v8_trace_roots_ = nullptr;
+  V8BuildEmbedderGraphCallback v8_build_embedder_graph_ = nullptr;
+  std::unique_ptr<UnifiedHeapController> unified_heap_controller_;
 
 #if defined(ADDRESS_SANITIZER)
   void* asan_fake_stack_;
diff --git a/third_party/blink/renderer/platform/heap/unified_heap_marking_visitor.cc b/third_party/blink/renderer/platform/heap/unified_heap_marking_visitor.cc
index c1dc921..f0094deb 100644
--- a/third_party/blink/renderer/platform/heap/unified_heap_marking_visitor.cc
+++ b/third_party/blink/renderer/platform/heap/unified_heap_marking_visitor.cc
@@ -7,6 +7,7 @@
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h"
 #include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h"
+#include "third_party/blink/renderer/platform/heap/thread_state.h"
 #include "third_party/blink/renderer/platform/heap/unified_heap_controller.h"
 
 namespace blink {
@@ -17,7 +18,7 @@
     v8::Isolate* isolate)
     : MarkingVisitor(thread_state, mode),
       isolate_(isolate),
-      controller_(V8PerIsolateData::From(isolate)->GetUnifiedHeapController()) {
+      controller_(thread_state->unified_heap_controller()) {
   DCHECK(controller_);
 }
 
diff --git a/third_party/blink/renderer/platform/testing/testing_platform_support.cc b/third_party/blink/renderer/platform/testing/testing_platform_support.cc
index 6843b76068..17f6773 100644
--- a/third_party/blink/renderer/platform/testing/testing_platform_support.cc
+++ b/third_party/blink/renderer/platform/testing/testing_platform_support.cc
@@ -180,7 +180,7 @@
 
   ProcessHeap::Init();
   ThreadState::AttachMainThread();
-  ThreadState::Current()->RegisterTraceDOMWrappers(nullptr, nullptr);
+  blink::ThreadState::Current()->DetachFromIsolate();
   http_names::Init();
   fetch_initiator_type_names::Init();
 
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
index b8e22867..62ff8a6 100755
--- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
+++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -620,6 +620,9 @@
         'allowed': [
             'media::.+',
             'base::AutoLock',
+            'webrtc::AudioTrackInterface',
+            'webrtc::VideoTrackInterface',
+            'webrtc::MediaStreamTrackInterface',
         ]
     },
     {
diff --git a/third_party/blink/web_tests/FlagExpectations/README.txt b/third_party/blink/web_tests/FlagExpectations/README.txt
index aa9621c78..859a5e3 100644
--- a/third_party/blink/web_tests/FlagExpectations/README.txt
+++ b/third_party/blink/web_tests/FlagExpectations/README.txt
@@ -16,3 +16,12 @@
   --additional-expectations=path/to/FlagExpectations/name-of-flag
 
 which will override the main TestExpectations file.
+
+When passing a set of tests via the command line, such as using --test-list,
+the SKIP expectation is not respected by default. The option --skipped=always
+can be added in order to actually skip those tests.
+
+To run a subset of all tests, with custom expectations, and to properly skip:
+  run_web_tests.py --additional-driver-flag=--name-of-flag
+  --additional-expectations=path/to/FlagExpectations/name-of-flag
+  --test-list=path/to/test-list-file --skipped=always
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-blink-features=LayoutNG b/third_party/blink/web_tests/FlagExpectations/disable-blink-features=LayoutNG
new file mode 100644
index 0000000..b042f560
--- /dev/null
+++ b/third_party/blink/web_tests/FlagExpectations/disable-blink-features=LayoutNG
@@ -0,0 +1,287 @@
+# Tests that fail in legacy but pass in NG
+
+### editing/selection/mouse/
+crbug.com/591099 editing/selection/mouse/drag_over_text_transform.html [ Crash ]
+
+### external/wpt/css/CSS2/floats/
+crbug.com/591099 external/wpt/css/CSS2/floats/float-nowrap-3.html [ Failure ]
+crbug.com/591099 external/wpt/css/CSS2/floats/floats-line-wrap-shifted-001.html [ Failure ]
+crbug.com/591099 external/wpt/css/CSS2/floats/overhanging-float-paint-order.html [ Failure ]
+
+### external/wpt/css/CSS2/floats-clear/
+crbug.com/591099 external/wpt/css/CSS2/floats-clear/no-clearance-adjoining-opposite-float.html [ Failure ]
+crbug.com/591099 external/wpt/css/CSS2/floats-clear/no-clearance-due-to-large-margin-after-left-right.html [ Failure ]
+
+### external/wpt/css/CSS2/linebox/
+crbug.com/591099 external/wpt/css/CSS2/linebox/anonymous-inline-inherit-001.html [ Failure ]
+
+### external/wpt/css/CSS2/normal-flow/
+crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-empty-001.xht [ Failure ]
+crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-empty-004.xht [ Failure ]
+crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-001e.xht [ Failure ]
+crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-001h.xht [ Failure ]
+crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-002e.xht [ Failure ]
+crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-nested-002.xht [ Failure ]
+crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-remove-006.xht [ Failure ]
+crbug.com/591099 external/wpt/css/CSS2/normal-flow/max-height-separates-margin.html [ Failure ]
+crbug.com/591099 external/wpt/css/CSS2/normal-flow/min-height-separates-margin.html [ Failure ]
+
+### external/wpt/css/CSS2/text/
+crbug.com/591099 external/wpt/css/CSS2/text/white-space-mixed-003.xht [ Failure ]
+
+### external/wpt/css/css-fonts/
+crbug.com/591099 external/wpt/css/css-fonts/font-features-across-space-1.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-fonts/font-features-across-space-3.html [ Failure ]
+
+### external/wpt/css/css-grid/grid-items/
+crbug.com/591099 external/wpt/css/css-grid/grid-items/grid-item-percentage-sizes-003.html [ Failure ]
+
+### external/wpt/css/css-multicol/
+crbug.com/591099 external/wpt/css/css-multicol/multicol-span-all-list-item-002.html [ Failure ]
+
+### external/wpt/css/css-position/
+crbug.com/591099 external/wpt/css/css-position/position-absolute-crash-chrome-006.html [ Crash ]
+crbug.com/591099 external/wpt/css/css-position/position-absolute-dynamic-overflow-002.html [ Failure ]
+
+### external/wpt/css/css-position/static-position/
+crbug.com/591099 external/wpt/css/css-position/static-position/htb-ltr-rtl.tentative.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-position/static-position/htb-rtl-ltr.tentative.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-position/static-position/htb-rtl-rtl.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-position/static-position/vlr-ltr-rtl.tentative.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-position/static-position/vlr-rtl-ltr.tentative.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-position/static-position/vlr-rtl-rtl.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-position/static-position/vrl-ltr-rtl.tentative.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-position/static-position/vrl-rtl-ltr.tentative.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-position/static-position/vrl-rtl-rtl.html [ Failure ]
+
+### external/wpt/css/css-shapes/shape-outside/supported-shapes/polygon/
+crbug.com/591099 external/wpt/css/css-shapes/shape-outside/supported-shapes/polygon/shape-outside-polygon-017.html [ Failure ]
+
+### external/wpt/css/css-sizing/
+crbug.com/591099 external/wpt/css/css-sizing/clone-nowrap-intrinsic-size-bidi.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-sizing/intrinsic-percent-non-replaced-004.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-sizing/intrinsic-percent-non-replaced-005.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-sizing/whitespace-and-break.html [ Failure ]
+
+### external/wpt/css/css-text/boundary-shaping/
+crbug.com/591099 external/wpt/css/css-text/boundary-shaping/boundary-shaping-001.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/boundary-shaping/boundary-shaping-003.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/boundary-shaping/boundary-shaping-004.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/boundary-shaping/boundary-shaping-005.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/boundary-shaping/boundary-shaping-010.html [ Failure ]
+
+### external/wpt/css/css-text/hyphens/
+crbug.com/591099 external/wpt/css/css-text/hyphens/hyphens-shaping-001.html [ Failure ]
+
+### external/wpt/css/css-text/line-break/
+crbug.com/591099 external/wpt/css/css-text/line-break/line-break-shaping-001.html [ Failure ]
+
+### external/wpt/css/css-text/line-breaking/
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-009.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-011.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-015.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-atomic-003.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-atomic-004.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-atomic-005.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-atomic-006.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-ic-002.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-ic-003.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-replaced-002.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-replaced-003.html [ Failure ]
+
+### external/wpt/css/css-text/overflow-wrap/
+crbug.com/591099 external/wpt/css/css-text/overflow-wrap/overflow-wrap-shaping-001.html [ Failure ]
+
+### external/wpt/css/css-text/shaping/
+crbug.com/591099 external/wpt/css/css-text/shaping/shaping-000.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/shaping/shaping-001.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/shaping/shaping-002.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/shaping/shaping-003.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/shaping/shaping-004.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/shaping/shaping-005.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/shaping/shaping-006.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/shaping/shaping-007.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/shaping/shaping-008.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/shaping/shaping-014.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/shaping/shaping-016.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/shaping/shaping-017.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/shaping/shaping-018.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/shaping/shaping-020.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/shaping/shaping-021.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/shaping/shaping-022.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/shaping/shaping-023.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/shaping/shaping_lig-000.html [ Failure ]
+
+### external/wpt/css/css-text/text-encoding/
+crbug.com/591099 external/wpt/css/css-text/text-encoding/shaping-join-003.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/text-encoding/shaping-tatweel-003.html [ Failure ]
+
+### external/wpt/css/css-text/text-transform/
+crbug.com/591099 external/wpt/css/css-text/text-transform/text-transform-shaping-001.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/text-transform/text-transform-shaping-002.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/text-transform/text-transform-shaping-003.html [ Failure ]
+
+### external/wpt/css/css-text/white-space/
+crbug.com/591099 external/wpt/css/css-text/white-space/control-chars-00C.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/white-space/line-edge-white-space-collapse-001.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/white-space/line-edge-white-space-collapse-002.html [ Failure ]
+
+### external/wpt/css/css-text/word-break/
+crbug.com/591099 external/wpt/css/css-text/word-break/word-break-break-all-004.html [ Failure ]
+
+### external/wpt/css/css-ui/
+crbug.com/591099 external/wpt/css/css-ui/text-overflow-010.html [ Failure ]
+
+### external/wpt/css/css-writing-modes/
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-003.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-005.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-011.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-013.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-033.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-002.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-004.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-006.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-008.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-010.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-012.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-014.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-016.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-018.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-020.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-030.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-005.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-017.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-029.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-041.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-053.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-065.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-077.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-089.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-095.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-105.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-109.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-121.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-125.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-137.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-141.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-153.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-157.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-169.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-173.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-185.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-189.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-201.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-205.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-217.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-221.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-225.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-229.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-004.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-010.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-016.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-028.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-034.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-040.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-052.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-064.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-076.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-088.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-104.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-108.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-112.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-116.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-124.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-128.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-136.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-140.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-144.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-148.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-156.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-160.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-172.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-176.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-188.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-192.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-204.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-208.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-220.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-224.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/available-size-002.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/available-size-010.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/available-size-017.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/baseline-with-orthogonal-flow-001.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/block-flow-direction-vrl-009.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/inline-box-border-vlr-001.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/line-box-direction-vrl-009.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/line-box-height-vlr-021.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/line-box-height-vlr-023.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/ortho-htb-alongside-vrl-floats-006.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/ortho-htb-alongside-vrl-floats-014.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vlr-001.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vlr-004.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-prct-htb-in-vlr-001.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-prct-htb-in-vlr-002.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-prct-htb-in-vrl-001.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-prct-htb-in-vrl-002.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-prct-vlr-in-htb-001.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-prct-vlr-in-htb-002.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-prct-vrl-in-htb-001.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-prct-vrl-in-htb-002.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-vlr-in-htb-001.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-vlr-in-htb-004.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-vrl-in-htb-001.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-vrl-in-htb-004.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/two-levels-of-orthogonal-flows-percentage.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/vertical-alignment-003.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes/vertical-alignment-009.xht [ Failure ]
+
+### external/wpt/css/filter-effects/
+crbug.com/591099 external/wpt/css/filter-effects/filtered-inline-applies-to-float.html [ Failure ]
+
+### external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-002.xhtml [ Failure ]
+
+### external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/emptyspan-1.html [ Failure ]
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/emptyspan-4.html [ Failure ]
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/remove-from-split-inline-6.html [ Failure ]
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/split-inner-inline-2.html [ Failure ]
+
+### external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-003.html [ Failure ]
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-004.html [ Failure ]
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-042.html [ Failure ]
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-044.html [ Failure ]
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-050.html [ Failure ]
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-055.html [ Failure ]
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-content-box-border-radius-002.html [ Failure ]
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-038.html [ Failure ]
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-039.html [ Failure ]
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-024.html [ Failure ]
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-003.html [ Failure ]
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-004.html [ Failure ]
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-008.html [ Failure ]
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-padding-box-border-radius-002.html [ Failure ]
+
+### external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/sizing/
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/sizing/block-size-with-min-or-max-content-1a.html [ Failure ]
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/sizing/vert-block-size-small-or-larger-than-container-with-min-or-max-content-2a.html [ Failure ]
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/sizing/hori-block-size-small-or-larger-than-container-with-min-or-max-content-2b.html [ Failure ]
+
+### external/wpt/quirks/
+crbug.com/591099 external/wpt/quirks/line-height-trailing-collapsable-whitespace.html [ Failure ]
+
+### fast/css/
+crbug.com/591099 fast/css/absolute-inline-alignment-2.html [ Failure ]
+
+### http/tests/credentialmanager/
+crbug.com/874695 http/tests/credentialmanager/credentialscontainer-create-with-virtual-authenticator.html [ Failure ]
+
+### virtual/blink-cors/external/wpt/service-workers/service-worker/
+crbug.com/591099 virtual/blink-cors/external/wpt/service-workers/service-worker/registration-updateviacache.https.html [ Failure ]
+
+### virtual/not-omt-sw-fetch/external/wpt/service-workers/service-worker/
+crbug.com/591099 virtual/not-omt-sw-fetch/external/wpt/service-workers/service-worker/registration-schedule-job.https.html [ Failure ]
+
+### virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/
+crbug.com/591099 virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/registration-updateviacache.https.html [ Failure ]
diff --git a/third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader b/third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader
new file mode 100644
index 0000000..3d4f400c
--- /dev/null
+++ b/third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader
@@ -0,0 +1,207 @@
+# Opacity Filters need rebaseline.
+crbug.com/935580 compositing/masks/mask-with-added-filters.html [ Skip ]
+crbug.com/935580 compositing/masks/mask-with-removed-filters.html [ Skip ]
+
+# Flaky BlinkTestController::OnPixelDumpCaptured Crash. We want to still run to
+# detect failures other than the crash.
+crbug.com/963542 animations/svg/animated-filter-svg-element.html [ Failure Pass ]
+crbug.com/963542 compositing/background-color/background-color-outside-document.html [ Failure Pass ]
+crbug.com/963542 compositing/color-matching/image-color-matching.html [ Failure Pass ]
+crbug.com/963542 compositing/culling/filter-occlusion-blur.html [ Failure Pass ]
+crbug.com/963542 compositing/geometry/bounds-ignores-hidden-dynamic.html [ Failure Pass ]
+crbug.com/963542 compositing/geometry/horizontal-scroll-composited.html [ Failure Pass ]
+crbug.com/963542 compositing/opacity-with-mask.html [ Failure Pass ]
+crbug.com/963542 compositing/overflow/border-radius-on-parent-composited-grandchild.html [ Failure Pass ]
+crbug.com/963542 compositing/overflow/nested-border-radius-clipping.html [ Failure Pass ]
+crbug.com/963542 compositing/overflow/scrolling-content-layer-should-not-be-clipped.html [ Failure Pass ]
+crbug.com/963542 compositing/overlap-blending/reflection-opacity-huge.html [ Failure Pass ]
+crbug.com/963542 compositing/squashing/squash-onto-nephew-subpixel-3.html [ Failure Pass ]
+crbug.com/963542 compositing/squashing/squash-with-ancestor-mask.html [ Failure Pass ]
+crbug.com/963542 compositing/squashing/squash-with-ancestor-reflection.html [ Failure Pass ]
+crbug.com/963542 css3/blending/svg-blend-multiply.html [ Failure Pass ]
+crbug.com/963542 css3/filters/backdrop-filter-basic-blur.html [ Failure Pass ]
+crbug.com/963542 css3/flexbox/button.html [ Failure Pass ]
+crbug.com/963542 css3/flexbox/columns-center-with-margins-and-wrap.html [ Failure Pass ]
+crbug.com/963542 images/color-profile-border-radius.html [ Failure Pass ]
+crbug.com/963542 images/feature-policy-oversized-images-forced-layout.html [ Failure Pass ]
+crbug.com/963542 media/alpha-video-playback.html [ Skip ]
+crbug.com/963542 media/video-layer-crash.html [ Skip ]
+
+# Flaky VkImage::Copy Asset Crash
+crbug.com/972087 compositing/layer-creation/overlap-negative-z-index-multiple.html [ Failure Pass ]
+
+# SwiftShader Unimplemented Blend Mode
+crbug.com/972096 compositing/reflections/animation-inside-reflection.html [ Skip ]
+crbug.com/972096 compositing/reflections/nested-reflection-anchor-point.html [ Skip ]
+crbug.com/972096 compositing/reflections/nested-reflection-animated.html [ Skip ]
+crbug.com/972096 compositing/reflections/nested-reflection-on-overflow.html [ Skip ]
+crbug.com/972096 compositing/reflections/nested-reflection-opacity.html [ Skip ]
+crbug.com/972096 compositing/reflections/nested-reflection-transformed.html [ Skip ]
+crbug.com/972096 compositing/reflections/nested-reflection-transformed2.html [ Skip ]
+crbug.com/972096 compositing/reflections/nested-reflection.html [ Skip ]
+crbug.com/972096 compositing/reflections/transform-inside-reflection.html [ Skip ]
+crbug.com/972096 css3/filters/composited-reflected.html [ Skip ]
+crbug.com/972096 media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Skip ]
+
+# Flaky SwiftShader Invalid VkFormat
+crbug.com/972109 css3/flexbox/auto-height-column-with-border-and-padding.html [ Failure Pass ]
+
+# Incorrect Blurring
+crbug.com/972621 compositing/culling/filter-occlusion-blur-large.html [ Skip ]
+crbug.com/972621 compositing/culling/scrolled-within-boxshadow.html [ Skip ]
+crbug.com/972621 compositing/culling/translated-boxshadow.html [ Skip ]
+crbug.com/972621 compositing/culling/unscrolled-within-boxshadow.html [ Skip ]
+crbug.com/972621 compositing/fixed-background-after-style-recalc.html [ Skip ]
+crbug.com/972621 compositing/geometry/clipping-foreground.html [ Skip ]
+crbug.com/972621 compositing/geometry/foreground-layer.html [ Skip ]
+crbug.com/972621 compositing/geometry/vertical-scroll-composited.html [ Skip ]
+crbug.com/972621 compositing/iframes/composited-iframe-alignment.html [ Skip ]
+crbug.com/972621 compositing/lots-of-img-layers.html [ Skip ]
+crbug.com/972621 compositing/overflow/border-radius-above-composited-subframe.html [ Skip ]
+crbug.com/972621 compositing/overflow/border-radius-composited-subframe.html [ Skip ]
+crbug.com/972621 compositing/overflow/mask-with-filter.html [ Skip ]
+crbug.com/972621 compositing/overflow/scrollbar-layer-placement-negative-z-index-child-positioned.html [ Skip ]
+crbug.com/972621 compositing/overflow/scrollbar-layer-placement.html [ Skip ]
+crbug.com/972621 compositing/shadows/shadow-drawing.html [ Skip ]
+crbug.com/972621 css2.1/t090501-c414-flt-02-d-g.html [ Skip ]
+crbug.com/972621 css2.1/t090501-c414-flt-03-b-g.html [ Skip ]
+crbug.com/972621 css2.1/t100304-c43-rpl-bbx-00-d-g.html [ Skip ]
+crbug.com/972621 css2.1/t100304-c43-rpl-bbx-01-d-g.html [ Skip ]
+crbug.com/972621 css3/background/background-repeat-round-auto1.html [ Skip ]
+crbug.com/972621 css3/background/background-repeat-round-border.html [ Skip ]
+crbug.com/972621 css3/background/background-repeat-round-content.html [ Skip ]
+crbug.com/972621 css3/background/background-repeat-round-padding.html [ Skip ]
+crbug.com/972621 css3/filters/blur-filter-page-scroll-parents.html [ Skip ]
+crbug.com/972621 css3/filters/blur-filter-page-scroll.html [ Skip ]
+crbug.com/972621 css3/filters/effect-blur-hw.html [ Skip ]
+crbug.com/972621 css3/filters/effect-combined-hw.html [ Skip ]
+crbug.com/972621 css3/filters/effect-drop-shadow-hw.html [ Skip ]
+crbug.com/972621 css3/filters/effect-drop-shadow.html [ Skip ]
+crbug.com/972621 css3/filters/effect-grayscale-hw.html [ Skip ]
+crbug.com/972621 css3/filters/effect-reference-colorspace.html [ Skip ]
+crbug.com/972621 css3/filters/filter-change-repaint-composited.html [ Skip ]
+crbug.com/972621 css3/filters/filter-change-repaint.html [ Skip ]
+crbug.com/972621 css3/filters/filter-repaint-blur.html [ Skip ]
+crbug.com/972621 css3/filters/filter-repaint-child-layers.html [ Skip ]
+crbug.com/972621 css3/filters/filter-repaint-composited-fallback-crash.html [ Skip ]
+crbug.com/972621 css3/filters/filter-repaint-shadow.html [ Skip ]
+crbug.com/972621 css3/filters/filter-repaint.html [ Skip ]
+crbug.com/972621 css3/filters/regions-expanding.html [ Skip ]
+crbug.com/972621 css3/masking/mask-luminance-png.html [ Skip ]
+crbug.com/972621 css3/masking/mask-repeat-round-auto1.html [ Skip ]
+crbug.com/972621 css3/masking/mask-repeat-round-border.html [ Skip ]
+crbug.com/972621 css3/masking/mask-repeat-round-content.html [ Skip ]
+crbug.com/972621 css3/masking/mask-repeat-round-padding.html [ Skip ]
+crbug.com/972621 media/controls/paint-controls-webkit-appearance-none-custom-bg.html [ Skip ]
+crbug.com/972621 media/controls/paint-controls-webkit-appearance-none.html [ Skip ]
+crbug.com/972621 media/video-no-audio.html [ Skip ]
+crbug.com/972621 transforms/3d/point-mapping/3d-point-mapping-deep.html [ Skip ]
+crbug.com/972621 transforms/shadows.html [ Skip ]
+crbug.com/972621 transforms/svg-vs-css.xhtml [ Skip ]
+crbug.com/972621 transforms/transformed-document-element.html [ Skip ]
+
+# Blurring - Needs Rebaseline for GPU Rasterization
+crbug.com/972637 css3/blending/background-blend-mode-crossfade-image-gradient.html [ Skip ]
+crbug.com/972637 css3/blending/background-blend-mode-default-value.html [ Skip ]
+crbug.com/972637 css3/blending/background-blend-mode-gradient-gradient.html [ Skip ]
+crbug.com/972637 css3/blending/background-blend-mode-gradient-image.html [ Skip ]
+crbug.com/972637 css3/blending/background-blend-mode-image-color.html [ Skip ]
+crbug.com/972637 css3/blending/background-blend-mode-image-image.html [ Skip ]
+crbug.com/972637 css3/blending/background-blend-mode-image-svg.html [ Skip ]
+crbug.com/972637 css3/blending/background-blend-mode-multiple-background-layers.html [ Skip ]
+crbug.com/972637 css3/blending/background-blend-mode-single-layer-no-blending.html [ Skip ]
+crbug.com/972637 css3/blending/background-blend-mode-svg-color.html [ Skip ]
+crbug.com/972637 css3/blending/background-blend-mode-tiled-gradient.html [ Skip ]
+crbug.com/972637 css3/blending/mix-blend-mode-isolated-group-1.html [ Skip ]
+crbug.com/972637 css3/blending/mix-blend-mode-isolated-group-2.html [ Skip ]
+crbug.com/972637 css3/blending/mix-blend-mode-isolated-group-3.html [ Skip ]
+crbug.com/972637 images/rgb-png-with-cmyk-color-profile.html [ Skip ]
+crbug.com/972637 images/ycbcr-with-cmyk-color-profile.html [ Skip ]
+crbug.com/972637 media/video-poster-scale.html [ Skip ]
+
+# Gradients - Needs Rebaseline for GPU Rasterization
+crbug.com/972684 css3/blending/effect-background-blend-mode-stacking.html [ Skip ]
+crbug.com/972684 css3/blending/effect-background-blend-mode-tiled.html [ Skip ]
+crbug.com/972684 css3/blending/effect-background-blend-mode.html [ Skip ]
+crbug.com/972684 css3/filters/crash-filter-change.html [ Skip ]
+crbug.com/972684 css3/filters/effect-blur.html [ Skip ]
+crbug.com/972684 css3/filters/effect-brightness-clamping.html [ Skip ]
+crbug.com/972684 css3/filters/effect-combined.html [ Skip ]
+crbug.com/972684 css3/masking/mask-repeat-space-border.html [ Skip ]
+crbug.com/972684 images/color-profile-animate-rotate.html [ Skip ]
+crbug.com/972684 images/color-profile-animate.html [ Skip ]
+crbug.com/972684 images/color-profile-background-image-cover.html [ Skip ]
+crbug.com/972684 images/color-profile-background-image-cross-fade-png.html [ Skip ]
+crbug.com/972684 images/color-profile-background-image-cross-fade.html [ Skip ]
+crbug.com/972684 images/color-profile-background-image-repeat.html [ Skip ]
+crbug.com/972684 images/color-profile-background-image-space.html [ Skip ]
+crbug.com/972684 images/color-profile-border-fade.html [ Skip ]
+crbug.com/972684 images/color-profile-border-image.html [ Skip ]
+crbug.com/972684 images/color-profile-filter.html [ Skip ]
+crbug.com/972684 images/color-profile-group.html [ Skip ]
+crbug.com/972684 images/color-profile-image-canvas-pattern.html [ Skip ]
+crbug.com/972684 images/color-profile-image-canvas.html [ Skip ]
+crbug.com/972684 images/color-profile-image-filter-all.html [ Skip ]
+crbug.com/972684 images/color-profile-image-profile-match.html [ Skip ]
+crbug.com/972684 images/color-profile-image.html [ Skip ]
+crbug.com/972684 images/color-profile-layer-filter.html [ Skip ]
+crbug.com/972684 images/color-profile-mask-image-svg.html [ Skip ]
+crbug.com/972684 images/color-profile-object.html [ Skip ]
+crbug.com/972684 images/color-profile-svg-fill-text.html [ Skip ]
+crbug.com/972684 images/color-profile-svg.html [ Skip ]
+crbug.com/972684 images/optimize-contrast-canvas.html [ Skip ]
+crbug.com/972684 images/optimize-contrast-image.html [ Skip ]
+crbug.com/972684 images/webp-color-profile-lossy.html [ Skip ]
+crbug.com/972684 media/color-profile-video-poster-image.html [ Skip ]
+
+# Exhibited two of the above crashes: crbug.com/963542 and crbug.com/972083
+crbug.com/963542 compositing/geometry/video-fixed-scrolling.html [ Skip ]
+crbug.com/963542 compositing/geometry/video-opacity-overlay.html [ Skip ]
+crbug.com/963542 compositing/layers-inside-overflow-scroll.html [ Skip ]
+crbug.com/963542 compositing/overflow/scroll-ancestor-update.html [ Skip ]
+crbug.com/963542 compositing/plugins/webplugin-alpha.html [ Skip ]
+crbug.com/963542 compositing/plugins/webplugin-reflection.html [ Skip ]
+crbug.com/963542 compositing/video/video-reflection.html [ Skip ]
+crbug.com/963542 compositing/visibility/visibility-simple-video-layer.html [ Skip ]
+crbug.com/963542 media/controls-after-reload.html [ Skip ]
+crbug.com/963542 media/controls/video-overlay-cast-light-rendering.html [ Skip ]
+crbug.com/963542 media/track/track-cue-rendering-horizontal.html [ Skip ]
+crbug.com/963542 media/video-frame-accurate-seek.html [ Skip ]
+
+# Flaky GPU process crashes with no stack trace. They may be crbug.com/963542
+# We will run them to detect failures other than crashes.
+Bug(none) compositing/gestures/gesture-tapHighlight-2-overflow-div-composited-outer-scroll-outer.html [ Failure Pass ]
+Bug(none) compositing/masks/masked-ancestor.html [ Failure Pass ]
+Bug(none) css3/filters/filter-repaint-shadow-layer-child.html [ Failure Pass ]
+Bug(none) css3/motion-path/offset-anchor-rotation.html [ Failure Pass ]
+Bug(none) media/media-captions-no-controls.html [ Failure Pass ]
+Bug(none) media/media-fragments/TC0014.html [ Failure Pass ]
+Bug(none) media/track/media-element-enqueue-event-crash.html [ Failure Pass ]
+Bug(none) media/video-controls-overflow-menu-fullscreen-button.html [ Failure Pass ]
+Bug(none) media/video-move-to-new-document-srcobject.html [ Failure Pass ]
+Bug(none) transforms/3d/point-mapping/3d-point-mapping-origins.html [ Failure Pass ]
+
+# Test consistently hitting default timeout.
+Bug(none) css3/filters/effect-reference-subregion.html [ Skip ]
+
+# Reflection needs rebaselining.
+crbug.com/977289 compositing/overflow/reflected-overlay-scrollbars-should-appear-without-compositing.html [ Skip ]
+crbug.com/977289 compositing/reflections/compositing-change-inside-reflection.html [ Skip ]
+crbug.com/977289 compositing/reflections/deeply-nested-reflections.html [ Skip ]
+crbug.com/977289 compositing/reflections/load-video-in-reflection.html [ Skip ]
+crbug.com/977289 compositing/reflections/masked-reflection-on-composited.html [ Skip ]
+crbug.com/977289 compositing/reflections/nested-reflection-size-change.html [ Skip ]
+crbug.com/977289 compositing/reflections/nested-reflection-transition.html [ Skip ]
+crbug.com/977289 compositing/reflections/reflection-opacity.html [ Skip ]
+crbug.com/977289 compositing/reflections/reflection-ordering.html [ Skip ]
+crbug.com/977289 compositing/reflections/reflection-positioning.html [ Skip ]
+crbug.com/977289 compositing/reflections/reflection-positioning2.html [ Skip ]
+crbug.com/977289 compositing/reflections/remove-add-reflection.html [ Skip ]
+crbug.com/977289 compositing/reflections/simple-composited-reflections.html [ Skip ]
+crbug.com/977289 compositing/squashing/squashing-reflection-disallowed.html [ Skip ]
+crbug.com/977289 compositing/webgl/webgl-reflection.html [ Skip ]
+crbug.com/977289 css3/blending/mix-blend-mode-with-masking.html [ Skip ]
+crbug.com/977289 css3/filters/blur-filter-page-scroll-self.html [ Skip ]
+crbug.com/977289 css3/filters/effect-reference-add-hw.html [ Skip ]
+crbug.com/977289 css3/filters/effect-reference-source-alpha-hw.html [ Skip ]
+crbug.com/977289 css3/filters/effect-reference-subregion-hidpi-hw.html [ Skip ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index c72f9be..e432035 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -197,6 +197,8 @@
 crbug.com/974720 [ Mac10.13 ] virtual/fractional_scrolling/fast/scrolling/unscrollable-layer-subpixel-size-with-negative-overflow.html [ Pass Failure ]
 crbug.com/974720 [ Mac10.13 ] virtual/scroll_customization/fast/scrolling/unscrollable-layer-subpixel-size-with-negative-overflow.html [ Pass Failure ]
 
+crbug.com/978436 external/wpt/svg/coordinate-systems/viewBox-scaling-text-001.html [ Failure ]
+
 # Flakily timing out or failing.
 # TODO(ccameron): Investigate this.
 crbug.com/730267 virtual/gpu-rasterization/images/color-profile-group.html [ Pass Timeout Failure ]
@@ -728,7 +730,6 @@
 crbug.com/591099 fast/events/touch/compositor-touch-hit-rects-list-translate.html [ Failure ]
 crbug.com/591099 fast/events/touch/compositor-touch-hit-rects.html [ Failure ]
 crbug.com/889721 fast/inline/outline-continuations.html [ Failure ]
-crbug.com/591099 fast/text/emoji-vertical-origin-visual.html [ Failure ]
 crbug.com/591099 fast/text/font-format-support-color-cff2-vertical.html [ Failure ]
 crbug.com/591099 fast/text/whitespace/018.html [ Failure ]
 crbug.com/591099 fast/writing-mode/auto-sizing-orthogonal-flows.html [ Failure ]
@@ -745,18 +746,8 @@
 crbug.com/591099 virtual/paint-timing/external/wpt/paint-timing/sibling-painting-first-image.html [ Failure ]
 crbug.com/591099 virtual/scalefactor200/css3/filters/composited-layer-child-bounds-after-composited-to-sw-shadow-change.html [ Failure ]
 
-# LayoutNG failures that needs to be triaged
-crbug.com/591099 fast/text/selection/selection-rect-line-height-too-small.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-rhythm/line-height-step-basic-001.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-rhythm/line-height-step-boundary-001.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-rhythm/line-height-step-valign-001.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-rhythm/line-height-step-writing-mode-vrl-001.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-text/hyphens/hyphens-out-of-flow-002.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/img-intrinsic-size-contribution-002.html [ Failure ]
-crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-vertical.html [ Failure ]
-crbug.com/591099 fast/css-intrinsic-dimensions/width-avoid-floats.html [ Failure ]
+# LayoutNG ref-tests that need to be updated (cannot be rebaselined).
 crbug.com/591099 fast/multicol/newmulticol/hide-box-vertical-lr.html [ Failure ]
-crbug.com/591099 fast/multicol/span/overflow-on-multicol.html [ Failure ]
 crbug.com/591099 fast/multicol/span/vertical-lr.html [ Failure ]
 crbug.com/591099 fast/multicol/vertical-lr/abspos-auto-position-on-line.html [ Failure ]
 crbug.com/591099 fast/multicol/vertical-lr/column-break-with-balancing.html [ Failure ]
@@ -770,10 +761,22 @@
 crbug.com/591099 fast/multicol/vertical-lr/float-paginate.html [ Failure ]
 crbug.com/591099 fast/multicol/vertical-lr/nested-columns.html [ Failure ]
 crbug.com/591099 fast/multicol/vertical-lr/unsplittable-inline-block.html [ Failure ]
+crbug.com/591099 fast/text/ellipsis-with-self-painting-layer.html [ Failure ]
+crbug.com/591099 virtual/fractional_scrolling_threaded/fast/scrolling/unscrollable-layer-subpixel-size-with-negative-overflow.html [ Failure ]
+
+# LayoutNG failures that needs to be triaged
+crbug.com/591099 fast/text/selection/selection-rect-line-height-too-small.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-rhythm/line-height-step-basic-001.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-rhythm/line-height-step-boundary-001.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-rhythm/line-height-step-valign-001.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-rhythm/line-height-step-writing-mode-vrl-001.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/hyphens/hyphens-out-of-flow-002.html [ Failure ]
+crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-vertical.html [ Failure ]
+crbug.com/591099 fast/css-intrinsic-dimensions/width-avoid-floats.html [ Failure ]
+crbug.com/591099 fast/multicol/span/overflow-on-multicol.html [ Failure ]
 crbug.com/591099 fast/selectors/shadow-host-div-with-span.html [ Failure ]
 crbug.com/591099 fast/selectors/shadow-host-div-with-text.html [ Failure ]
 crbug.com/591099 fast/text/selection/inline-block-in-selection-root.html [ Failure ]
-crbug.com/591099 http/tests/credentialmanager/credentialscontainer-get-with-virtual-authenticator.html [ Failure ]
 crbug.com/591099 paint/invalidation/media-audio-no-spurious-repaints.html [ Failure Timeout ]
 crbug.com/591099 paint/invalidation/text-match-document-change.html [ Failure ]
 crbug.com/591099 paint/invalidation/compositing/composited-float-under-composited-inline-individual.html [ Failure ]
@@ -796,12 +799,9 @@
 crbug.com/591099 external/wpt/dom/ranges/Range-compareBoundaryPoints.html [ Timeout Failure Pass ]
 crbug.com/591099 external/wpt/dom/ranges/Range-set.html [ Failure Timeout ]
 crbug.com/591099 external/wpt/encoding/legacy-mb-korean/euc-kr/euckr-decode-ksc_5601.html [ Timeout Failure Pass ]
-crbug.com/591099 fast/text/ellipsis-with-self-painting-layer.html [ Failure ]
 crbug.com/591099 fast/text/international/shape-across-elements-simple.html [ Failure ]
 crbug.com/591099 fast/text/word-space-monospace.html [ Failure ]
-crbug.com/591099 virtual/threaded/fast/scrolling/unscrollable-layer-subpixel-size-with-negative-overflow.html [ Failure ]
 crbug.com/591099 http/tests/devtools/network/network-worker-fetch-blocked.js [ Failure ]
-crbug.com/591099 virtual/fractional_scrolling_threaded/fast/scrolling/unscrollable-layer-subpixel-size-with-negative-overflow.html [ Failure ]
 crbug.com/591099 fast/text/soft-hyphen-simple-text.html [ Failure ]
 crbug.com/591099 [ Fuchsia ] editing/selection/4402375.html [ Failure ]
 crbug.com/591099 [ Fuchsia ] fast/block/float/centered-float-avoidance-complexity.html [ Failure Timeout ]
@@ -862,16 +862,10 @@
 crbug.com/591099 [ Mac ] fast/text/hyphens/hyphens-auto-mock.html [ Failure ]
 crbug.com/591099 [ Mac ] fast/text/hyphens/midword-break-priority.html [ Failure ]
 crbug.com/591099 [ Mac ] paint/invalidation/box/hover-pseudo-borders.html [ Failure ]
-crbug.com/591099 [ Mac ] paint/invalidation/svg/relative-sized-use-on-symbol.xhtml [ Failure ]
-crbug.com/591099 [ Mac ] paint/invalidation/svg/remove-background-property-on-root.html [ Failure ]
 crbug.com/591099 [ Mac ] paint/invalidation/text-match-transparent-text.html [ Failure ]
 crbug.com/591099 [ Mac ] paint/text/text-match-highlights-big-line-height.html [ Failure ]
-crbug.com/591099 [ Mac ] virtual/exotic-color-space/images/icon-decoding.html [ Failure ]
 crbug.com/591099 [ Mac ] fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-auto.html [ Failure ]
-crbug.com/591099 [ Mac ] fast/dynamic/011.html [ Failure ]
-crbug.com/591099 [ Mac ] fast/dynamic/anonymous-block-orphaned-lines.html [ Failure ]
 crbug.com/591099 [ Mac ] paint/invalidation/flexbox/remove-inline-block-descendant-of-flex.html [ Failure ]
-crbug.com/591099 [ Mac ] css3/masking/clip-path-inset-large-radii.html [ Failure ]
 crbug.com/591099 [ Mac ] fast/replaced/input-radio-height-inside-auto-container.html [ Failure ]
 crbug.com/591099 http/tests/devtools/sources/debugger-frameworks/frameworks-jquery.js [ Failure ]
 crbug.com/591099 [ Mac ] images/feature-policy-oversized-images-resize.html [ Failure ]
@@ -1347,7 +1341,6 @@
 crbug.com/591099 [ Mac10.13 ] virtual/gpu-rasterization/images/imagemap-focus-ring-zoom.html [ Failure ]
 crbug.com/591099 [ Mac10.13 ] virtual/gpu-rasterization/images/imagemap-overflowing-circle-focus-ring.html [ Failure ]
 crbug.com/591099 [ Mac ] virtual/mouseevent_fractional/fast/events/before-unload-return-value-from-listener.html [ Crash Timeout ]
-crbug.com/591099 [ Mac10.13 ] virtual/scalefactor200/fast/hidpi/static/popup-menu-appearance.html [ Failure ]
 crbug.com/591099 [ Mac10.13 ] virtual/scroll_customization/fast/events/touch/compositor-touch-hit-rects-continuation.html [ Failure ]
 
 crbug.com/974725 [ Win7 ] fast/events/before-unload-return-value-from-listener.html [ Pass Crash ]
@@ -1387,6 +1380,7 @@
 crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-breaking-001.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-breaking-002.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-breaking-003.html [ Failure ]
+crbug.com/481431 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-breaking-004.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-breaking-nobackground-000.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-breaking-nobackground-001.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-breaking-nobackground-002.html [ Failure ]
@@ -1495,6 +1489,8 @@
 crbug.com/963109 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-span-all-button-002.html [ Failure ]
 crbug.com/963109 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-span-all-button-003.html [ Failure ]
 crbug.com/829028 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-span-all-children-height-001.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-span-all-children-height-002.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-span-all-children-height-003.html [ Failure ]
 crbug.com/924142 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-span-all-dynamic-add-010.html [ Crash Pass ]
 crbug.com/829028 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-span-all-dynamic-add-012.html [ Failure Crash ]
 crbug.com/874051 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-span-all-fieldset-001.html [ Failure ]
@@ -3210,8 +3206,6 @@
 crbug.com/626703 [ Retina ] virtual/blink-cors/external/wpt/referrer-policy/no-referrer/http-rp/same-origin/http-http/script-tag/keep-origin-redirect/generic.http.html [ Timeout ]
 crbug.com/626703 [ Retina ] virtual/blink-cors/external/wpt/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/script-tag/swap-origin-redirect/insecure-protocol.http.html [ Timeout ]
 crbug.com/626703 [ Retina ] virtual/blink-cors/external/wpt/fetch/api/basic/header-value-combining.any.sharedworker.html [ Timeout ]
-crbug.com/626703 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-breaking-004.html [ Failure ]
-crbug.com/626703 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-span-all-children-height-002.html [ Failure ]
 crbug.com/626703 [ Retina ] virtual/blink-cors/external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/same-origin/http-https/iframe-tag/keep-origin-redirect/upgrade-protocol.http.html [ Timeout ]
 crbug.com/626703 [ Retina ] virtual/blink-cors/external/wpt/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/iframe-tag/no-redirect/same-origin-insecure.http.html [ Timeout ]
 crbug.com/626703 [ Retina ] virtual/blink-cors/external/wpt/referrer-policy/no-referrer-when-downgrade/meta-referrer/cross-origin/http-http/img-tag/swap-origin-redirect/insecure-protocol.http.html [ Timeout ]
@@ -3225,7 +3219,6 @@
 crbug.com/626703 [ Retina ] virtual/blink-cors/external/wpt/fetch/sec-metadata/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html [ Timeout ]
 crbug.com/626703 [ Retina ] virtual/blink-cors/external/wpt/fetch/api/response/response-stream-disturbed-1.html [ Timeout ]
 crbug.com/626703 [ Retina ] virtual/blink-cors/external/wpt/fetch/nosniff/importscripts.html [ Timeout ]
-crbug.com/626703 external/wpt/css/css-multicol/multicol-breaking-004.html [ Failure ]
 crbug.com/626703 [ Retina ] virtual/blink-cors/external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/script-tag/swap-origin-redirect/upgrade-protocol.http.html [ Timeout ]
 crbug.com/626703 [ Retina ] virtual/blink-cors/external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/img-tag/keep-origin-redirect/cross-origin.http.html [ Timeout ]
 crbug.com/626703 [ Retina ] virtual/blink-cors/external/wpt/referrer-policy/no-referrer/meta-referrer/cross-origin/http-http/iframe-tag/swap-origin-redirect/generic.http.html [ Timeout ]
@@ -3252,7 +3245,6 @@
 crbug.com/626703 [ Retina ] virtual/blink-cors/external/wpt/fetch/api/basic/request-headers-case.any.worker.html [ Timeout ]
 crbug.com/626703 [ Retina ] virtual/blink-cors/external/wpt/referrer-policy/no-referrer/http-rp/cross-origin/http-https/iframe-tag/swap-origin-redirect/generic.http.html [ Timeout ]
 crbug.com/626703 [ Retina ] virtual/blink-cors/external/wpt/referrer-policy/no-referrer/meta-referrer/same-origin/http-https/script-tag/swap-origin-redirect/generic.http.html [ Timeout ]
-crbug.com/626703 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-span-all-children-height-003.html [ Failure ]
 crbug.com/626703 [ Retina ] virtual/blink-cors/external/wpt/referrer-policy/origin-when-cross-origin/meta-referrer/cross-origin/http-http/xhr-request/no-redirect/cross-origin.http.html [ Timeout ]
 crbug.com/626703 [ Retina ] virtual/blink-cors/external/wpt/referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/img-tag/keep-origin-redirect/cross-origin.http.html [ Timeout ]
 crbug.com/626703 [ Retina ] virtual/blink-cors/external/wpt/fetch/data-urls/base64.any.worker.html [ Timeout ]
@@ -4467,6 +4459,7 @@
 
 crbug.com/967329 external/wpt/css/css-multicol/columnfill-auto-max-height-001.html [ Failure ]
 crbug.com/967329 external/wpt/css/css-multicol/columnfill-auto-max-height-002.html [ Failure ]
+crbug.com/481431 external/wpt/css/css-multicol/multicol-breaking-004.html [ Failure ]
 crbug.com/792435 external/wpt/css/css-multicol/multicol-rule-004.xht [ Failure ]
 crbug.com/792437 external/wpt/css/css-multicol/multicol-rule-inset-000.xht [ Failure ]
 crbug.com/792437 external/wpt/css/css-multicol/multicol-rule-outset-000.xht [ Failure ]
@@ -6207,7 +6200,6 @@
 crbug.com/976045 [ Win ] fast/scrolling/unscrollable-layer-subpixel-size-with-negative-overflow.html [ Pass Failure ]
 crbug.com/976045 [ Win ] virtual/scroll_customization/fast/scrolling/unscrollable-layer-subpixel-size-with-negative-overflow.html [ Pass Failure ]
 crbug.com/976045 [ Win ] virtual/fractional_scrolling/fast/scrolling/unscrollable-layer-subpixel-size-with-negative-overflow.html [ Pass Failure ]
-crbug.com/976157 inspector-protocol/runtime/runtime-console-basic-functions.js [ Pass Failure ]
 crbug.com/977379 [ Mac10.10 ] fast/events/before-unload-return-value-from-listener.html [ Pass Timeout Failure ]
 
 crbug.com/974710 [ Win7 ] http/tests/security/isolatedWorld/bypass-main-world-csp-iframes.html [ Pass Failure ]
@@ -6220,3 +6212,6 @@
 crbug.com/946700 [ Win ] http/tests/devtools/coverage/decorations-after-script-formatter.js [ Pass Timeout ]
 crbug.com/978254 [ Win ] http/tests/devtools/elements/edit/edit-dom-actions-4.js [ Pass Timeout ]
 crbug.com/977015 [ Win ] http/tests/devtools/elements/shadow/shadow-distribution.js [ Pass Timeout ]
+
+# Sheriff 2019-06-25
+crbug.com/978304 http/tests/devtools/elements/styles-4/undo-add-property.js [ Pass Timeout ]
diff --git a/third_party/blink/web_tests/accessibility/name-calc-inputs.html b/third_party/blink/web_tests/accessibility/name-calc-inputs.html
index 80b9ce3e..c251c069 100644
--- a/third_party/blink/web_tests/accessibility/name-calc-inputs.html
+++ b/third_party/blink/web_tests/accessibility/name-calc-inputs.html
@@ -79,7 +79,9 @@
 
 <div class="container">
     <label>label-wrapping-text7
-        <input id="text7" type="text" title="text7-title">
+        <span>   <!-- Also testing ancestor label that is not direct parent -->
+            <input id="text7" type="text" title="text7-title">
+        </span>
     </label>
 </div>
 
diff --git a/third_party/blink/web_tests/css3/filters/backdrop-filter-browser-zoom.html b/third_party/blink/web_tests/css3/filters/backdrop-filter-browser-zoom.html
index 6d1810f..9cb33ebd 100644
--- a/third_party/blink/web_tests/css3/filters/backdrop-filter-browser-zoom.html
+++ b/third_party/blink/web_tests/css3/filters/backdrop-filter-browser-zoom.html
@@ -7,13 +7,9 @@
   <div class="menu2"></div>
 </div>
 
-<!-- See [1] for an implementation of this test in WPT format. It requires the
-    WPT Fuzzy Matching [2] feature to be implemented, due to AA on the border
-    radii.
-
-    [1] https://chromium-review.googlesource.com/c/chromium/src/+/1542677/4
-    [2] https://github.com/web-platform-tests/wpt/blob/1f570a686843ca10f151a79956ee16110f4a4d42/docs/_writing-tests/reftests.md#fuzzy-matching
-  -->
+<!-- TODO(978481): Convert this back to WPT test. See crbug.com/978481 for
+  an implementation in WPT that is waiting for the WPT Fuzzy Matching feature.
+-->
 <style>
 div {
   position: absolute;
diff --git a/third_party/blink/web_tests/css3/filters/backdrop-filter-clip-rect-zoom.html b/third_party/blink/web_tests/css3/filters/backdrop-filter-clip-rect-zoom.html
index 1058c8f8..645198b 100644
--- a/third_party/blink/web_tests/css3/filters/backdrop-filter-clip-rect-zoom.html
+++ b/third_party/blink/web_tests/css3/filters/backdrop-filter-clip-rect-zoom.html
@@ -6,12 +6,8 @@
 <link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty">
 <link rel="match"  href="backdrop-filter-clip-rect-zoom-ref.html">
 
-<!-- See [1] for an implementation of this test in WPT format. It requires the
-  WPT Fuzzy Matching [2] feature to be implemented, due to AA on the border
-  radii.
-
-  [1] https://cs.chromium.org/chromium/src/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-clip-rect-zoom-ref.html?rcl=04f3fcde0d60b908e7c452b4956b693144cdfdd5&l=1
-  [2] https://github.com/web-platform-tests/wpt/blob/1f570a686843ca10f151a79956ee16110f4a4d42/docs/_writing-tests/reftests.md#fuzzy-matching
+<!-- TODO(978481): Convert this back to WPT test. See crbug.com/978481 for
+  an implementation in WPT that is waiting for the WPT Fuzzy Matching feature.
 -->
 
 <div class="box"></div>
diff --git a/third_party/blink/web_tests/css3/filters/backdrop-filter-transform.html b/third_party/blink/web_tests/css3/filters/backdrop-filter-transform.html
index ce43e8f..472d0ae 100644
--- a/third_party/blink/web_tests/css3/filters/backdrop-filter-transform.html
+++ b/third_party/blink/web_tests/css3/filters/backdrop-filter-transform.html
@@ -7,12 +7,8 @@
 <div class="colorbox"></div>
 <div class="filterbox"></div>
 
-<!-- See [1] for an implementation of this test in WPT format. It requires the
-  WPT Fuzzy Matching [2] feature to be implemented, due to AA on the border
-  radii.
-
-  [1] https://chromium-review.googlesource.com/c/chromium/src/+/1521959/15
-  [2] https://github.com/web-platform-tests/wpt/blob/1f570a686843ca10f151a79956ee16110f4a4d42/docs/_writing-tests/reftests.md#fuzzy-matching
+<!-- TODO(978481): Convert this back to WPT test. See crbug.com/978481 for
+  an implementation in WPT that is waiting for the WPT Fuzzy Matching feature.
 -->
 
 <style>
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
index 7dc0cc7..7141387 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -114519,6 +114519,78 @@
      {}
     ]
    ],
+   "mathml/presentation-markup/fractions/frac-parameters-gap-001.html": [
+    [
+     "mathml/presentation-markup/fractions/frac-parameters-gap-001.html",
+     [
+      [
+       "/mathml/presentation-markup/fractions/frac-parameters-gap-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "mathml/presentation-markup/fractions/frac-parameters-gap-002.html": [
+    [
+     "mathml/presentation-markup/fractions/frac-parameters-gap-002.html",
+     [
+      [
+       "/mathml/presentation-markup/fractions/frac-parameters-gap-002-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "mathml/presentation-markup/fractions/frac-parameters-gap-003.html": [
+    [
+     "mathml/presentation-markup/fractions/frac-parameters-gap-003.html",
+     [
+      [
+       "/mathml/presentation-markup/fractions/frac-parameters-gap-003-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "mathml/presentation-markup/fractions/frac-parameters-gap-004.html": [
+    [
+     "mathml/presentation-markup/fractions/frac-parameters-gap-004.html",
+     [
+      [
+       "/mathml/presentation-markup/fractions/frac-parameters-gap-004-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "mathml/presentation-markup/fractions/frac-parameters-gap-005.html": [
+    [
+     "mathml/presentation-markup/fractions/frac-parameters-gap-005.html",
+     [
+      [
+       "/mathml/presentation-markup/fractions/frac-parameters-gap-005-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "mathml/presentation-markup/fractions/frac-parameters-gap-006.html": [
+    [
+     "mathml/presentation-markup/fractions/frac-parameters-gap-006.html",
+     [
+      [
+       "/mathml/presentation-markup/fractions/frac-parameters-gap-006-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "mathml/presentation-markup/fractions/frac-visibility-001.html": [
     [
      "mathml/presentation-markup/fractions/frac-visibility-001.html",
@@ -115323,6 +115395,18 @@
      {}
     ]
    ],
+   "svg/coordinate-systems/viewBox-scaling-text-001.html": [
+    [
+     "svg/coordinate-systems/viewBox-scaling-text-001.html",
+     [
+      [
+       "/svg/coordinate-systems/support/viewBox-scaling-text-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "svg/embedded/image-embedding-svg-viewref-with-viewbox.svg": [
     [
      "svg/embedded/image-embedding-svg-viewref-with-viewbox.svg",
@@ -151337,6 +151421,9 @@
    "fonts/math/lineheight5000-typolineheight2300.woff": [
     []
    ],
+   "fonts/math/math-text.woff": [
+    []
+   ],
    "fonts/math/mathvariant-bold-fraktur.woff": [
     []
    ],
@@ -159929,6 +160016,24 @@
    "mathml/presentation-markup/fractions/frac-numalign-denomalign-001-ref.html": [
     []
    ],
+   "mathml/presentation-markup/fractions/frac-parameters-gap-001-ref.html": [
+    []
+   ],
+   "mathml/presentation-markup/fractions/frac-parameters-gap-002-ref.html": [
+    []
+   ],
+   "mathml/presentation-markup/fractions/frac-parameters-gap-003-ref.html": [
+    []
+   ],
+   "mathml/presentation-markup/fractions/frac-parameters-gap-004-ref.html": [
+    []
+   ],
+   "mathml/presentation-markup/fractions/frac-parameters-gap-005-ref.html": [
+    []
+   ],
+   "mathml/presentation-markup/fractions/frac-parameters-gap-006-ref.html": [
+    []
+   ],
    "mathml/presentation-markup/fractions/frac-visibility-001-ref.html": [
     []
    ],
@@ -160085,6 +160190,9 @@
    "mathml/tools/limits.py": [
     []
    ],
+   "mathml/tools/math-text.py": [
+    []
+   ],
    "mathml/tools/mathvariant-transforms.py": [
     []
    ],
@@ -166889,6 +166997,9 @@
    "svg/coordinate-systems/support/simple.svg": [
     []
    ],
+   "svg/coordinate-systems/support/viewBox-scaling-text-001-ref.html": [
+    []
+   ],
    "svg/embedded/reference/green-rect-100x100.svg": [
     []
    ],
@@ -413852,6 +413963,10 @@
    "09076604c3a1989956adb083108d2878bfb32c4b",
    "support"
   ],
+  "fonts/math/math-text.woff": [
+   "afe4057f6eefc6a758abb91a8ab3af6949be930b",
+   "support"
+  ],
   "fonts/math/mathvariant-bold-fraktur.woff": [
    "20cd8e3b49e18b9bc900cf13b2ce9664c5ed4864",
    "support"
@@ -437088,6 +437203,54 @@
    "b1ee502ccdae6cf96d2f104d7daf1c2dbba390f7",
    "testharness"
   ],
+  "mathml/presentation-markup/fractions/frac-parameters-gap-001-ref.html": [
+   "69be003195a82d28031de06156629a68457bfbcf",
+   "support"
+  ],
+  "mathml/presentation-markup/fractions/frac-parameters-gap-001.html": [
+   "f577682ad92631bb721354e2c3d6fb1f59db94b3",
+   "reftest"
+  ],
+  "mathml/presentation-markup/fractions/frac-parameters-gap-002-ref.html": [
+   "9169bb999c3096a886ee804a828ade453ef7abd1",
+   "support"
+  ],
+  "mathml/presentation-markup/fractions/frac-parameters-gap-002.html": [
+   "2c0a9a1a668307b2b7e90774fd118d89628dc6c6",
+   "reftest"
+  ],
+  "mathml/presentation-markup/fractions/frac-parameters-gap-003-ref.html": [
+   "3fe86faf9f36ef4ef4d4d2993eb8685c3fb70fa7",
+   "support"
+  ],
+  "mathml/presentation-markup/fractions/frac-parameters-gap-003.html": [
+   "826eecd55c4da13fafdbe08457ecb5cda260b46b",
+   "reftest"
+  ],
+  "mathml/presentation-markup/fractions/frac-parameters-gap-004-ref.html": [
+   "10d0415304e8839ca0a4da38085df6dc69ca5aa5",
+   "support"
+  ],
+  "mathml/presentation-markup/fractions/frac-parameters-gap-004.html": [
+   "359176228d7c543d5efa7b448c777e575df184ac",
+   "reftest"
+  ],
+  "mathml/presentation-markup/fractions/frac-parameters-gap-005-ref.html": [
+   "9bfd7653d1d38a8e4b130eaf7bee00d0a39c9cc0",
+   "support"
+  ],
+  "mathml/presentation-markup/fractions/frac-parameters-gap-005.html": [
+   "60295f7ddd20c1a9b55d4c3b800c8a78f324c7fe",
+   "reftest"
+  ],
+  "mathml/presentation-markup/fractions/frac-parameters-gap-006-ref.html": [
+   "2abba28f0a34e42b0b0ced64af4499bb3b33fe0e",
+   "support"
+  ],
+  "mathml/presentation-markup/fractions/frac-parameters-gap-006.html": [
+   "7895052d4fd5b02e11e03872ab3d6de574781db2",
+   "reftest"
+  ],
   "mathml/presentation-markup/fractions/frac-visibility-001-ref.html": [
    "41a262d511197edebb913cb68eb688eddf763ff2",
    "support"
@@ -437576,6 +437739,10 @@
    "840a76ffb1a6ac199ff9c655e72262f8955012a2",
    "support"
   ],
+  "mathml/tools/math-text.py": [
+   "45b182c571999fc85892311367087fdc0608facd",
+   "support"
+  ],
   "mathml/tools/mathvariant-transforms.py": [
    "ba99b595f0aa6338ba7a752801c4a32dbbefc9ef",
    "support"
@@ -466928,6 +467095,14 @@
    "e0af766e8ff5de780818b9d0712714dd5638e882",
    "support"
   ],
+  "svg/coordinate-systems/support/viewBox-scaling-text-001-ref.html": [
+   "09321909954d4c9a73d47671e64f4f6555b59087",
+   "support"
+  ],
+  "svg/coordinate-systems/viewBox-scaling-text-001.html": [
+   "f04613d019dc5acb742558fddcf5c1e01d2b2d51",
+   "reftest"
+  ],
   "svg/embedded/image-embedding-svg-viewref-with-viewbox.svg": [
    "6340c19d2a0e7c72faec83e2fb990ed9abe487f8",
    "reftest"
@@ -473461,7 +473636,7 @@
    "support"
   ],
   "tools/wptrunner/wptrunner/environment.py": [
-   "e7a9e4b1e771bc37f458284a454f443216e28bb4",
+   "2493f1fa4407a39aad3ac3c2a724322b75b0944a",
    "support"
   ],
   "tools/wptrunner/wptrunner/executors/__init__.py": [
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/text-styles/2d.text.font.relative_size.html b/third_party/blink/web_tests/external/wpt/2dcontext/text-styles/2d.text.font.relative_size.html
new file mode 100644
index 0000000..1c0f7bc2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/2dcontext/text-styles/2d.text.font.relative_size.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.text.font.relative_size</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.text.font.relative_size</h1>
+<p class="desc"></p>
+
+
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+var canvas2 = document.createElement('canvas');
+var ctx2 = canvas2.getContext('2d');
+ctx2.font = '1em sans-serif';
+_assertSame(ctx2.font, '10px sans-serif', "ctx2.font", "'10px sans-serif'");
+
+
+});
+</script>
+
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/tools/tests2dtext.yaml b/third_party/blink/web_tests/external/wpt/2dcontext/tools/tests2dtext.yaml
index 0ee476d7..c57caee 100644
--- a/third_party/blink/web_tests/external/wpt/2dcontext/tools/tests2dtext.yaml
+++ b/third_party/blink/web_tests/external/wpt/2dcontext/tools/tests2dtext.yaml
@@ -112,7 +112,14 @@
   code: |
     @assert ctx.font === '10px sans-serif';
 
-
+- name: 2d.text.font.relative_size
+  testing:
+    - 2d.text.font.relative_size
+  code: |
+    var canvas2 = document.createElement('canvas');
+    var ctx2 = canvas2.getContext('2d');
+    ctx2.font = '1em sans-serif';
+    @assert ctx2.font === '10px sans-serif';
 
 - name: 2d.text.align.valid
   testing:
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex_keyPath.any.js b/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex_keyPath.any.js
new file mode 100644
index 0000000..19cf231
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/IndexedDB/idbindex_keyPath.any.js
@@ -0,0 +1,30 @@
+// META: title=IndexedDB: IDBIndex keyPath attribute - same object
+// META: script=support.js
+
+indexeddb_test(
+  (t, db) => {
+    const store = db.createObjectStore('store', {keyPath: ['a', 'b']});
+    store.createIndex('index', ['a', 'b']);
+  },
+  (t, db) => {
+    const tx = db.transaction('store');
+    const store = tx.objectStore('store');
+    const index = store.index('index');
+    assert_equals(typeof index.keyPath, 'object', 'keyPath is an object');
+    assert_true(Array.isArray(index.keyPath), 'keyPath is an array');
+
+    assert_equals(
+      index.keyPath, index.keyPath,
+      'Same object instance is returned each time keyPath is inspected');
+
+    const tx2 = db.transaction('store');
+    const store2 = tx2.objectStore('store');
+    const index2 = store2.index('index');
+
+    assert_not_equals(
+      index.keyPath, index2.keyPath,
+      'Different instances are returned from different index instances.');
+
+    t.done();
+  },
+  `IDBIndex's keyPath attribute returns the same object.`);
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbobjectstore_keyPath.any.js b/third_party/blink/web_tests/external/wpt/IndexedDB/idbobjectstore_keyPath.any.js
new file mode 100644
index 0000000..91c3674c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/IndexedDB/idbobjectstore_keyPath.any.js
@@ -0,0 +1,27 @@
+// META: title=IndexedDB: IDBObjectStore keyPath attribute - same object
+// META: script=support.js
+
+indexeddb_test(
+  (t, db) => {
+    db.createObjectStore('store', {keyPath: ['a', 'b']});
+  },
+  (t, db) => {
+    const tx = db.transaction('store');
+    const store = tx.objectStore('store');
+    assert_equals(typeof store.keyPath, 'object', 'keyPath is an object');
+    assert_true(Array.isArray(store.keyPath), 'keyPath is an array');
+
+    assert_equals(
+      store.keyPath, store.keyPath,
+      'Same object instance is returned each time keyPath is inspected');
+
+    const tx2 = db.transaction('store');
+    const store2 = tx2.objectStore('store');
+
+    assert_not_equals(
+      store.keyPath, store2.keyPath,
+      'Different instances are returned from different store instances.');
+
+    t.done();
+  },
+  `IDBObjectStore's keyPath attribute returns the same object.`);
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/reference/pass_if_box_ahem.html b/third_party/blink/web_tests/external/wpt/css/CSS2/reference/pass_if_box_ahem.html
index c94e036..dad2c8f4 100644
--- a/third_party/blink/web_tests/external/wpt/css/CSS2/reference/pass_if_box_ahem.html
+++ b/third_party/blink/web_tests/external/wpt/css/CSS2/reference/pass_if_box_ahem.html
@@ -1,6 +1,7 @@
 <!DOCTYPE html>
 <title>Reference rendering - black box (Ahem)</title>
 <link rel="author" title="Opera Software" href="https://opera.com">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style type="text/css">
 div
 {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-size-breaks-001.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-size-breaks-001.html
index 453d5607..e859b9c9 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-size-breaks-001.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-size-breaks-001.html
@@ -9,6 +9,7 @@
   <link rel=help href="https://drafts.csswg.org/css-contain-1/#containment-size">
   <link rel=help href="https://drafts.csswg.org/css-break-3/#monolithic">
 
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style>
 article {
   height: 2.5em;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-size-breaks-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-size-breaks-001-ref.html
index 6fa1e47a..b807ea5 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-size-breaks-001-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-size-breaks-001-ref.html
@@ -5,6 +5,7 @@
   <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
   <meta name=flags content="ahem">
 
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style>
 article {
   height: 2.5em;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox_columns-flexitems-2-ref.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox_columns-flexitems-2-ref.html
index 6d7f2304..2acfa00 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox_columns-flexitems-2-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox_columns-flexitems-2-ref.html
@@ -1,6 +1,7 @@
 <!DOCTYPE html>
 <title>flexbox | multicol on flexbox items</title>
 <link rel="author" href="http://opera.com" title="Opera Software">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style>
 div {background: blue;}
 p {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox_columns-flexitems-2.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox_columns-flexitems-2.html
index 13b98d1..b6ca52f2 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox_columns-flexitems-2.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox_columns-flexitems-2.html
@@ -5,6 +5,7 @@
 	href="http://www.w3.org/TR/css-flexbox-1/#flex-containers">
 <link rel="match" href="flexbox_columns-flexitems-2-ref.html">
 <link rel="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style>
 div {
 	background: blue;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox_flex-natural-mixed-basis-auto-ref.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox_flex-natural-mixed-basis-auto-ref.html
index 785eeab..ecf4304a 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox_flex-natural-mixed-basis-auto-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox_flex-natural-mixed-basis-auto-ref.html
@@ -1,6 +1,7 @@
 <!DOCTYPE html>
 <title>flexbox | flex: larger integer, mixed basis, auto</title>
 <link rel="author" href="http://opera.com" title="Opera Software">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style>
 div {
 	font-family: ahem;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox_flex-natural-mixed-basis-auto.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox_flex-natural-mixed-basis-auto.html
index c3a00cf..5cac508f9a 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox_flex-natural-mixed-basis-auto.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox_flex-natural-mixed-basis-auto.html
@@ -5,6 +5,7 @@
 	href="http://www.w3.org/TR/css-flexbox-1/#flex-basis-property">
 <link rel="match" href="flexbox_flex-natural-mixed-basis-auto-ref.html">
 <link rel="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style>
 div {
 	font-family: ahem;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-002.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-002.tentative.html
index d5982b9..b3f56fe 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-002.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-002.tentative.html
@@ -7,6 +7,7 @@
     <meta name="assert" content="Verify effect of math-script-level auto | add(<integer>) | <integer>, starting from different values of math-script-level.">
     <script src="/resources/testharness.js"></script>
     <script src="/resources/testharnessreport.js"></script>
+    <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
     <style>
       .container {
           /* Ahem font does not have a MATH table so the font-size scale factor
@@ -20,51 +21,53 @@
       }
       setup({ explicit_done: true });
       window.addEventListener("load", function() {
-          test(function() {
-              assert_equals(fontSize("autoDisplay"), 200);
-              assert_equals(fontSize("autoInline"), 355);
-          }, "auto");
-          test(function() {
-              assert_equals(fontSize("autoDisplayFrom7"), 200);
-              assert_equals(fontSize("autoInlineFrom7"), 355);
-          }, "auto ; starting from level 7");
-          test(function() {
-              assert_equals(fontSize("add0"), 200);
-              assert_equals(fontSize("add-1"), 100);
-              assert_equals(fontSize("add1"), 355);
-              assert_approx_equals(fontSize("add-2"), 397, 1);
-              assert_approx_equals(fontSize("add2"), 504, 1);
-              assert_approx_equals(fontSize("add-9"), 654, 1);
-              assert_approx_equals(fontSize("add9"), 92, 1);
-          }, "add(<integer>)");
-          test(function() {
-              assert_equals(fontSize("add0from3"), 200);
-              assert_equals(fontSize("add-1from3"), 100);
-              assert_equals(fontSize("add1from3"), 355);
-              assert_approx_equals(fontSize("add-2from3"), 397, 1);
-              assert_approx_equals(fontSize("add2from3"), 504, 1);
-              assert_approx_equals(fontSize("add-9from3"), 654, 1);
-              assert_approx_equals(fontSize("add9from3"), 92, 1);
-          }, "add(<integer>) ; starting from level 3");
-          test(function() {
-              assert_equals(fontSize("set0"), 200);
-              assert_equals(fontSize("set-1"), 100);
-              assert_equals(fontSize("set1"), 355);
-              assert_approx_equals(fontSize("set-2"), 397, 1);
-              assert_approx_equals(fontSize("set2"), 504, 1);
-              assert_approx_equals(fontSize("set-9"), 654, 1);
-              assert_approx_equals(fontSize("set9"), 92, 1);
-          }, "<integer>");
-          test(function() {
-              assert_equals(fontSize("set50"), 200);
-              assert_equals(fontSize("set49"), 100);
-              assert_equals(fontSize("set51"), 355);
-              assert_approx_equals(fontSize("set48"), 397, 1);
-              assert_approx_equals(fontSize("set52"), 504, 1);
-              assert_approx_equals(fontSize("set41"), 654, 1);
-              assert_approx_equals(fontSize("set59"), 92, 1);
-          }, "<integer> ; starting from level 50");
-          done();
+          document.fonts.ready.then(function() {
+              test(function() {
+                  assert_equals(fontSize("autoDisplay"), 200);
+                  assert_equals(fontSize("autoInline"), 355);
+              }, "auto");
+              test(function() {
+                  assert_equals(fontSize("autoDisplayFrom7"), 200);
+                  assert_equals(fontSize("autoInlineFrom7"), 355);
+              }, "auto ; starting from level 7");
+              test(function() {
+                  assert_equals(fontSize("add0"), 200);
+                  assert_equals(fontSize("add-1"), 100);
+                  assert_equals(fontSize("add1"), 355);
+                  assert_approx_equals(fontSize("add-2"), 397, 1);
+                  assert_approx_equals(fontSize("add2"), 504, 1);
+                  assert_approx_equals(fontSize("add-9"), 654, 1);
+                  assert_approx_equals(fontSize("add9"), 92, 1);
+              }, "add(<integer>)");
+              test(function() {
+                  assert_equals(fontSize("add0from3"), 200);
+                  assert_equals(fontSize("add-1from3"), 100);
+                  assert_equals(fontSize("add1from3"), 355);
+                  assert_approx_equals(fontSize("add-2from3"), 397, 1);
+                  assert_approx_equals(fontSize("add2from3"), 504, 1);
+                  assert_approx_equals(fontSize("add-9from3"), 654, 1);
+                  assert_approx_equals(fontSize("add9from3"), 92, 1);
+              }, "add(<integer>) ; starting from level 3");
+              test(function() {
+                  assert_equals(fontSize("set0"), 200);
+                  assert_equals(fontSize("set-1"), 100);
+                  assert_equals(fontSize("set1"), 355);
+                  assert_approx_equals(fontSize("set-2"), 397, 1);
+                  assert_approx_equals(fontSize("set2"), 504, 1);
+                  assert_approx_equals(fontSize("set-9"), 654, 1);
+                  assert_approx_equals(fontSize("set9"), 92, 1);
+              }, "<integer>");
+              test(function() {
+                  assert_equals(fontSize("set50"), 200);
+                  assert_equals(fontSize("set49"), 100);
+                  assert_equals(fontSize("set51"), 355);
+                  assert_approx_equals(fontSize("set48"), 397, 1);
+                  assert_approx_equals(fontSize("set52"), 504, 1);
+                  assert_approx_equals(fontSize("set41"), 654, 1);
+                  assert_approx_equals(fontSize("set59"), 92, 1);
+              }, "<integer> ; starting from level 50");
+              done();
+          });
       });
     </script>
   </head>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-003.tentative-ref.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-003.tentative-ref.html
index c29f6e1..5fd8d7f 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-003.tentative-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-003.tentative-ref.html
@@ -3,6 +3,7 @@
   <head>
     <title>math-script-level</title>
     <meta charset="utf-8">
+    <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
     <style>
       .container {
           /* Ahem font does not have a MATH table so the font-size scale factor
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-003.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-003.tentative.html
index 1eb1c020..50100124 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-003.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-003.tentative.html
@@ -6,6 +6,7 @@
     <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3746">
     <meta name="assert" content="If font-size is specified or if the specified value of math-script-level is initial then math-script-level does not affect the computed value of font-size.">
     <link rel="match" href="math-script-level-003.tentative-ref.html">
+    <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
     <style>
       .container {
           /* Ahem font does not have a MATH table so the font-size scale factor
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-004.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-004.tentative.html
index 496c0210..084e181 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-004.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-004.tentative.html
@@ -7,6 +7,7 @@
     <meta name="assert" content="Check the resolved value of math-script-level">
     <script src="/resources/testharness.js"></script>
     <script src="/resources/testharnessreport.js"></script>
+    <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
     <style>
       @font-face {
         font-family: scriptpercentscaledown80-scriptscriptpercentscaledown40;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-001.tentative-ref.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-001.tentative-ref.html
index 8b09510..8540de41 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-001.tentative-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-001.tentative-ref.html
@@ -3,6 +3,7 @@
   <head>
     <title>math-script-level: auto and math-style (reference)</title>
     <meta charset="utf-8">
+    <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
     <style>
       .container {
           /* Ahem font does not have a MATH table so the font-size scale factor
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-001.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-001.tentative.html
index 7af9056..0765630f 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-001.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-001.tentative.html
@@ -6,6 +6,7 @@
     <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3746">
     <meta name="assert" content="If math-script-level is 'auto' and the inherited value of math-style is 'display' then the computed value of math-script-level is the inherited value.">
     <link rel="match" href="math-script-level-auto-and-math-style-001.tentative-ref.html">
+    <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
     <style>
       .container {
           /* Ahem font does not have a MATH table so the font-size scale factor
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative-ref.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative-ref.html
index 6f8786f9..f3ddde4 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative-ref.html
@@ -3,6 +3,7 @@
   <head>
     <title>math-script-level: auto and math-style (reference)</title>
     <meta charset="utf-8">
+    <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
     <style>
       .container {
           /* Ahem font does not have a MATH table so the font-size scale factor
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative.html
index 443c0a74..baff728 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative.html
@@ -6,6 +6,7 @@
     <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3746">
     <meta name="assert" content="If math-script-level is 'auto' and the inherited value of math-style is 'inline' then the computed value of math-script-level is the inherited value plus one.">
     <link rel="match" href="math-script-level-auto-and-math-style-002.tentative-ref.html">
+    <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
     <style>
       .container {
           /* Ahem font does not have a MATH table so the font-size scale factor
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-003.tentative-ref.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-003.tentative-ref.html
index 6f8786f9..f3ddde4 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-003.tentative-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-003.tentative-ref.html
@@ -3,6 +3,7 @@
   <head>
     <title>math-script-level: auto and math-style (reference)</title>
     <meta charset="utf-8">
+    <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
     <style>
       .container {
           /* Ahem font does not have a MATH table so the font-size scale factor
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-003.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-003.tentative.html
index 6722cb36..827dbd4 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-003.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-003.tentative.html
@@ -6,6 +6,7 @@
     <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3746">
     <meta name="assert" content="Initial value of math-style is 'inline'">
     <link rel="match" href="math-script-level-auto-and-math-style-003.tentative-ref.html">
+    <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
     <style>
       .container {
           /* Ahem font does not have a MATH table so the font-size scale factor
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-004.tentative-ref.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-004.tentative-ref.html
index e98e7c6d..63bfe209 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-004.tentative-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-004.tentative-ref.html
@@ -3,6 +3,7 @@
   <head>
     <title>math-script-level: auto and math-style (reference)</title>
     <meta charset="utf-8">
+    <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
     <style>
       .container {
           /* Ahem font does not have a MATH table so the font-size scale factor
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-004.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-004.tentative.html
index 7d34116..8917d68 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-004.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-004.tentative.html
@@ -6,6 +6,7 @@
     <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3746">
     <meta name="assert" content="Initial value of math-style is 'inline'">
     <link rel="match" href="math-script-level-auto-and-math-style-004.tentative-ref.html">
+    <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
     <style>
       .container {
           /* Ahem font does not have a MATH table so the font-size scale factor
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-005.tentative-ref.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-005.tentative-ref.html
index ef5d4c0..3f1641e 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-005.tentative-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-005.tentative-ref.html
@@ -3,6 +3,7 @@
   <head>
     <title>math-script-level: auto and math-style (reference)</title>
     <meta charset="utf-8">
+    <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
     <style>
       .container {
           /* Ahem font does not have a MATH table so the font-size scale factor
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-005.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-005.tentative.html
index ce49664..90c09d5 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-005.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-005.tentative.html
@@ -6,6 +6,7 @@
     <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3746">
     <meta name="assert" content="math-style is inherited">
     <link rel="match" href="math-script-level-auto-and-math-style-005.tentative-ref.html">
+    <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
     <style>
       .container {
           /* Ahem font does not have a MATH table so the font-size scale factor
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative-ref.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative-ref.html
index f98f3ee3..cb5326ad 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative-ref.html
@@ -3,6 +3,7 @@
   <head>
     <title>math-script-level (reference)</title>
     <meta charset="utf-8">
+    <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
     <style>
       .container {
           /* Ahem font does not have a MATH table so the font-size scale factor
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative.html
index 951bc84..6a70cf3 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-font-size-clamping-001.tentative.html
@@ -6,6 +6,7 @@
     <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/3739">
     <meta name="assert" content="Clamping due to browser's min font size only affects the used size.">
     <link rel="match" href="math-script-level-font-size-clamping-001.tentative-ref.html">
+    <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
     <style>
       .container {
           /* Ahem font does not have a MATH table so the font-size scale factor
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-001.html
index 856b8013..57ac05a 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-001.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-001.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned orthogonal elements inside grid items are properly placed and sized when they have a static position (left/rigth and top/bottom are 'auto').">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-002.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-002.html
index 4a039c9..d12482d 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-002.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-002.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned orthogonal elements inside grid items are properly placed and sized when they have a specific 'left' offset and a static block position (top/bottom are 'auto').">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-003.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-003.html
index 6482248..7c4e8bd 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-003.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-003.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned orthogonal elements inside grid items are properly placed and sized when they have a specific 'top' offset and a static inline position (left/right are 'auto').">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-004.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-004.html
index 054892b..a2d1c00 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-004.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-004.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned orthogonal elements inside grid items are properly placed and sized when they have specific 'right' offset and a static block position (top/bottom are 'auto').">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-005.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-005.html
index 41ff194..2c57cda55 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-005.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-005.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned orthogonal elements inside grid items are properly placed and sized when they have specific 'bottom' offset and a static inline position (left/right are 'auto').">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-006.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-006.html
index c6772be..81a03a2 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-006.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-006.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned orthogonal elements inside grid items are properly placed and sized when they have specific 'left' and 'top' offsets.">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-007.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-007.html
index 97851879..e600c31 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-007.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-007.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned orthogonal elements inside grid items are properly placed and sized when they have specific 'left' and 'right' offsets and a static block position (top/bottom are 'auto').">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-008.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-008.html
index 965e87d9..d30ce60 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-008.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-008.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned orthogonal elements inside grid items are properly placed and sized when they have specific 'left' and 'bottom' offsets.">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-009.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-009.html
index beb259a9..a212f34 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-009.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-009.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned orthogonal elements inside grid items are properly placed and sized when they have specific 'top' and 'right' offsets.">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-010.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-010.html
index f94bcca..dbc9fe1 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-010.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-010.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned orthogonal elements inside grid items are properly placed and sized when they have specific 'top' and 'bottom' offsets and a static inline position (left/right are 'auto').">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-011.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-011.html
index bcab0b9..81c6bc9 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-011.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-011.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned orthogonal elements inside grid items are properly placed and sized when they have specific 'right' and 'bottom' offsets.">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-012.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-012.html
index 1ac153a4..3ae22ba 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-012.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-012.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned orthogonal elements inside grid items are properly placed and sized when they have specific 'left', 'top' and 'right' offsets.">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-013.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-013.html
index 99400e6..2c6ea3c 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-013.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-013.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned orthogonal elements inside grid items are properly placed and sized when they have specific 'left', 'top' and 'bottom' offsets.">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-014.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-014.html
index a9c5408..e3b8618 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-014.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-014.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned orthogonal elements inside grid items are properly placed and sized when they have specific 'left', 'right' and 'bottom' offsets.">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-015.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-015.html
index d75664d..986ad02 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-015.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-015.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned orthogonal elements inside grid items are properly placed and sized when they have specific 'top', 'right' and 'bottom' offsets.">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-016.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-016.html
index a2ce6b9..e06113bf 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-016.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-016.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned orthogonal elements inside grid items are properly placed and sized when they have specific 'left, 'top', 'right' and 'bottom' offsets.">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-001.html
index fddb5d8..8583f34 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-001.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-001.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned elements inside grid items are properly placed and sized when they have a static position (left/rigth and top/bottom are 'auto').">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-002.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-002.html
index 987bd46..7e6f65db 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-002.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-002.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned elements inside grid items are properly placed and sized when they have a specific 'left' offset and a static block position (top/bottom are 'auto').">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-003.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-003.html
index ca3653959..f0c6d4e3 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-003.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-003.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned elements inside grid items are properly placed and sized when they have a specific 'top' offset and a static inline position (left/right are 'auto').">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-004.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-004.html
index 17107815..2abfe22 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-004.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-004.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned elements inside grid items are properly placed and sized when they have specific 'right' offset and a static block position (top/bottom are 'auto').">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-005.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-005.html
index 00d1299..ad19acbf 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-005.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-005.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned elements inside grid items are properly placed and sized when they have specific 'bottom' offset and a static inline position (left/right are 'auto').">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-006.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-006.html
index 6c856cc..f59ec88 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-006.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-006.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned elements inside grid items are properly placed and sized when they have specific 'left' and 'top' offsets.">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-007.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-007.html
index 97c489cd..46e12d4 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-007.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-007.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned elements inside grid items are properly placed and sized when they have specific 'left' and 'right' offsets and a static block position (top/bottom are 'auto').">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-008.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-008.html
index 3abcd7b..a8187cdb 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-008.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-008.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned elements inside grid items are properly placed and sized when they have specific 'left' and 'bottom' offsets.">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-009.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-009.html
index 09fb58e..abc7c95 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-009.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-009.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned elements inside grid items are properly placed and sized when they have specific 'top' and 'right' offsets.">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-010.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-010.html
index 04cd3e9..1a56fbe8 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-010.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-010.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned elements inside grid items are properly placed and sized when they have specific 'top' and 'bottom' offsets and a static inline position (left/right are 'auto').">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-011.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-011.html
index e7274e5..759db2b3 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-011.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-011.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned elements inside grid items are properly placed and sized when they have specific 'right' and 'bottom' offsets.">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-012.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-012.html
index 45e6a12..35329ca7 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-012.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-012.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned elements inside grid items are properly placed and sized when they have specific 'left', 'top' and 'right' offsets.">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-013.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-013.html
index 29e83c3..5af4078b 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-013.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-013.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned elements inside grid items are properly placed and sized when they have specific 'left', 'top' and 'bottom' offsets.">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-014.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-014.html
index 567b309..07883438 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-014.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-014.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned elements inside grid items are properly placed and sized when they have specific 'left', 'right' and 'bottom' offsets.">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-015.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-015.html
index c3c5d411..08a261a 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-015.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-015.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned elements inside grid items are properly placed and sized when they have specific 'top', 'right' and 'bottom' offsets.">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-016.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-016.html
index dfa34eb..f691816 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-016.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/positioned-grid-descendants-016.html
@@ -5,6 +5,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos" title="9. Absolute Positioning">
 <meta name="assert" content="Checks that absolutely positioned elements inside grid items are properly placed and sized when they have specific 'left, 'top', 'right' and 'bottom' offsets.">
 
+<link rel="stylesheet" href="/fonts/ahem.css">
 <link rel="stylesheet" href="support/positioned-grid-descendants.css" />
 
 <script src="/resources/testharness.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/support/positioned-grid-descendants.js b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/support/positioned-grid-descendants.js
index d8fc60be..d45df4b 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/support/positioned-grid-descendants.js
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/support/positioned-grid-descendants.js
@@ -66,5 +66,8 @@
     }
     document.body.appendChild(grid);
   }
-  checkLayout(".grid");
+
+  document.fonts.ready.then(() => {
+    checkLayout(".grid");
+  });
 }
diff --git a/third_party/blink/web_tests/external/wpt/css/css-rhythm/tools/generators/snap-width.ejs b/third_party/blink/web_tests/external/wpt/css/css-rhythm/tools/generators/snap-width.ejs
index d8d5e828..53198ceb 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-rhythm/tools/generators/snap-width.ejs
+++ b/third_party/blink/web_tests/external/wpt/css/css-rhythm/tools/generators/snap-width.ejs
@@ -59,6 +59,7 @@
     console.assert(false, "Unknown contentType:", contentType);
   }
 }
+%><link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 %><style>
 .container {
   font-family: Ahem;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-above-left-001-ref.xht b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-above-left-001-ref.xht
index 07fcd3f..ae8bb47 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-above-left-001-ref.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-above-left-001-ref.xht
@@ -4,6 +4,7 @@
 	<head>
 		<title>CSS Test: text-emphasis-position - above left - basic cases Reftest Reference</title>
 		<link rel="author" title="Makoto Kikuchi" href="mailto:kikuchi@est.co.jp" />
+		<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 		<style type="text/css"><![CDATA[
 			.common
 			{
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-above-left-002-ref.xht b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-above-left-002-ref.xht
index 6be87d7..35643e1 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-above-left-002-ref.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-above-left-002-ref.xht
@@ -4,6 +4,7 @@
 	<head>
 		<title>CSS Test: text-emphasis-position - above left - basic cases Reftest Reference</title>
 		<link rel="author" title="Makoto Kikuchi" href="mailto:kikuchi@est.co.jp" />
+		<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 		<style type="text/css"><![CDATA[
 			.common
 			{
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-above-right-001-ref.xht b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-above-right-001-ref.xht
index ca243a0e..ea9d277 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-above-right-001-ref.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-above-right-001-ref.xht
@@ -4,6 +4,7 @@
 	<head>
 		<title>CSS Test: text-emphasis-position - above right - basic cases Reftest Reference</title>
 		<link rel="author" title="Makoto Kikuchi" href="mailto:kikuchi@est.co.jp" />
+		<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 		<style type="text/css"><![CDATA[
 			.common
 			{
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-above-right-002-ref.xht b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-above-right-002-ref.xht
index c99186b2..6ffeea5 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-above-right-002-ref.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-above-right-002-ref.xht
@@ -4,6 +4,7 @@
 	<head>
 		<title>CSS Test: text-emphasis-position - above right - basic cases Reftest Reference</title>
 		<link rel="author" title="Makoto Kikuchi" href="mailto:kikuchi@est.co.jp" />
+		<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 		<style type="text/css"><![CDATA[
 			.common
 			{
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-below-left-001-ref.xht b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-below-left-001-ref.xht
index 1a00f01..b25d1c7 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-below-left-001-ref.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-below-left-001-ref.xht
@@ -4,6 +4,7 @@
 	<head>
 		<title>CSS Test: text-emphasis-position - below left - basic cases Reftest Reference</title>
 		<link rel="author" title="Makoto Kikuchi" href="mailto:kikuchi@est.co.jp" />
+		<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 		<style type="text/css"><![CDATA[
 			.common
 			{
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-below-left-002-ref.xht b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-below-left-002-ref.xht
index 1102ed66..f6d63083 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-below-left-002-ref.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-below-left-002-ref.xht
@@ -4,6 +4,7 @@
 	<head>
 		<title>CSS Test: text-emphasis-position - below left - basic cases Reftest Reference</title>
 		<link rel="author" title="Makoto Kikuchi" href="mailto:kikuchi@est.co.jp" />
+		<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 		<style type="text/css"><![CDATA[
 			.common
 			{
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-below-right-001-ref.xht b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-below-right-001-ref.xht
index f94c4ff..dea8ccd 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-below-right-001-ref.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-below-right-001-ref.xht
@@ -4,6 +4,7 @@
 	<head>
 		<title>CSS Test: text-emphasis-position - below right - basic cases Reftest Reference</title>
 		<link rel="author" title="Makoto Kikuchi" href="mailto:kikuchi@est.co.jp" />
+		<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 		<style type="text/css"><![CDATA[
 			.common
 			{
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-below-right-002-ref.xht b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-below-right-002-ref.xht
index 307201c..32bceb2 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-below-right-002-ref.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/reference/text-emphasis-position-below-right-002-ref.xht
@@ -4,6 +4,7 @@
 	<head>
 		<title>CSS Test: text-emphasis-position - below right - basic cases Reftest Reference</title>
 		<link rel="author" title="Makoto Kikuchi" href="mailto:kikuchi@est.co.jp" />
+		<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 		<style type="text/css"><![CDATA[
 			.common
 			{
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-above-left-001.xht b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-above-left-001.xht
index a12dd50..c663f5f 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-above-left-001.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-above-left-001.xht
@@ -8,6 +8,7 @@
 		<link rel="match" href="reference/text-emphasis-position-above-left-001-ref.xht"/>
 		<meta name="flags" content="ahem" />
 		<meta name="assert" content="This property describes where emphasis marks are drawn at." />
+		<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 		<style type="text/css"><![CDATA[
 			.test
 			{
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-above-left-002.xht b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-above-left-002.xht
index bab532b..2464e21 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-above-left-002.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-above-left-002.xht
@@ -8,6 +8,7 @@
 		<link rel="match" href="reference/text-emphasis-position-above-left-002-ref.xht"/>
 		<meta name="flags" content="ahem" />
 		<meta name="assert" content="This property describes where emphasis marks are drawn at." />
+		<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 		<style type="text/css"><![CDATA[
 			.test
 			{
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-above-right-001.xht b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-above-right-001.xht
index 92ca9482..3068f10 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-above-right-001.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-above-right-001.xht
@@ -8,6 +8,7 @@
 		<link rel="match" href="reference/text-emphasis-position-above-right-001-ref.xht"/>
 		<meta name="flags" content="ahem" />
 		<meta name="assert" content="This property describes where emphasis marks are drawn at." />
+		<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 		<style type="text/css"><![CDATA[
 			.test
 			{
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-above-right-002.xht b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-above-right-002.xht
index 42cb2aab..beb4c945 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-above-right-002.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-above-right-002.xht
@@ -8,6 +8,7 @@
 		<link rel="match" href="reference/text-emphasis-position-above-right-002-ref.xht"/>
 		<meta name="flags" content="ahem" />
 		<meta name="assert" content="This property describes where emphasis marks are drawn at." />
+		<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 		<style type="text/css"><![CDATA[
 			.test
 			{
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-below-left-001.xht b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-below-left-001.xht
index c178fa4e..a675d56 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-below-left-001.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-below-left-001.xht
@@ -8,6 +8,7 @@
 		<link rel="match" href="reference/text-emphasis-position-below-left-001-ref.xht"/>
 		<meta name="flags" content="ahem" />
 		<meta name="assert" content="This property describes where emphasis marks are drawn at." />
+		<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 		<style type="text/css"><![CDATA[
 			.test
 			{
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-below-left-002.xht b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-below-left-002.xht
index cb89abf..15cfdef 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-below-left-002.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-below-left-002.xht
@@ -8,6 +8,7 @@
 		<link rel="match" href="reference/text-emphasis-position-below-left-002-ref.xht"/>
 		<meta name="flags" content="ahem" />
 		<meta name="assert" content="This property describes where emphasis marks are drawn at." />
+		<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 		<style type="text/css"><![CDATA[
 			.test
 			{
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-below-right-001.xht b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-below-right-001.xht
index 06d519e..e680441 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-below-right-001.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-below-right-001.xht
@@ -8,6 +8,7 @@
 		<link rel="match" href="reference/text-emphasis-position-below-right-001-ref.xht"/>
 		<meta name="flags" content="ahem" />
 		<meta name="assert" content="This property describes where emphasis marks are drawn at." />
+		<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 		<style type="text/css"><![CDATA[
 			.test
 			{
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-below-right-002.xht b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-below-right-002.xht
index d832123..993fa7f 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-below-right-002.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/text-emphasis-position-below-right-002.xht
@@ -8,6 +8,7 @@
 		<link rel="match" href="reference/text-emphasis-position-below-right-002-ref.xht"/>
 		<meta name="flags" content="ahem" />
 		<meta name="assert" content="This property describes where emphasis marks are drawn at." />
+		<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 		<style type="text/css"><![CDATA[
 			.test
 			{
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-005.html b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-005.html
index 7c9c617..47f675eda 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-005.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/line-break/line-break-anywhere-005.html
@@ -10,6 +10,7 @@
 <meta name="assert" content="line-break: anywhere + break-spaces do allow a break
 between the last character of a word and the first space of a sequence of preserved
 spaces even if there is a previous breaking opportunity">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style>
 div {
   font: 25px/1 Ahem;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-transitions/transition-property-022.html b/third_party/blink/web_tests/external/wpt/css/css-transitions/transition-property-022.html
index eb29b11..f369549 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-transitions/transition-property-022.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-transitions/transition-property-022.html
@@ -6,6 +6,7 @@
 <link rel="help" title="7.1. Properties from CSS" href="http://www.w3.org/TR/css3-transitions/#animatable-css">
 <meta name="flags" content="ahem interact">
 <meta name="assert" content="Test checks that the 'letter-spacing' property is animatable.">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style>
   #test {
     font-family: ahem;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-transitions/transition-property-044.html b/third_party/blink/web_tests/external/wpt/css/css-transitions/transition-property-044.html
index 13279a3..f1d584f 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-transitions/transition-property-044.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-transitions/transition-property-044.html
@@ -6,6 +6,7 @@
 <link rel="help" title="7.1. Properties from CSS" href="http://www.w3.org/TR/css3-transitions/#animatable-css">
 <meta name="flags" content="ahem interact">
 <meta name="assert" content="Test checks that the 'word-spacing' property is animatable.">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style>
   #test {
     font-family: ahem;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/outline-022.html b/third_party/blink/web_tests/external/wpt/css/css-ui/outline-022.html
index 84cb516..e800f90 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-ui/outline-022.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-ui/outline-022.html
@@ -4,6 +4,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-ui/#outline-props">
 <link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
 <meta name="flags" content="">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style>
 body {
   --outline-width: 10px;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/reference/table-cell-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/reference/table-cell-001-ref.html
index acbd759..a58eac85 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/reference/table-cell-001-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/reference/table-cell-001-ref.html
@@ -5,6 +5,7 @@
 <link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
 <meta flags="ahem">
 
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style>
 div {
   font: 20px/20px ahem;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/reference/table-cell-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/reference/table-cell-002-ref.html
index d3e82d1..e5b895a 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/reference/table-cell-002-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/reference/table-cell-002-ref.html
@@ -5,6 +5,7 @@
 <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/">
 <meta flags="ahem">
 
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style>
 div {
   font: 50px / 50px ahem;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/test-plan/req-tcu-font.html b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/test-plan/req-tcu-font.html
index d33d297..d329eea0 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/test-plan/req-tcu-font.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/test-plan/req-tcu-font.html
@@ -11,6 +11,7 @@
   publishDate:  "2015-01-28",
 };
 </script>
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style>
 /*****************************************************************
  * ReSpec 3 CSS
@@ -48,6 +49,7 @@
 
 @media print { .removeOnSave { display: none; } }
 </style>
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style>/* --- ISSUES/NOTES --- */
 div.issue-title, div.note-title { padding-right: 1em; min-width: 7.5em; color: #b9ab2d; }
 div.issue-title { color: #e05252; }
@@ -61,6 +63,7 @@
 .issue { border-color: #e05252; background: #fbe9e9; }
 .note { border-color: #52e052; background: #e9fbe9; }
 </style>
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style>/* HIGHLIGHTS */
 code.prettyprint { color: inherit; }
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-alphabetic-001.xht b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-alphabetic-001.xht
index 637927d..48a8aa1 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-alphabetic-001.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-alphabetic-001.xht
@@ -6,6 +6,7 @@
 		<link rel="help" title="2.6. Text Underline Position" href="http://www.w3.org/TR/css-text-decor-3/#text-underline-position-property" />
 		<meta name="flags" content="ahem" />
 		<meta name="assert" content="This tests checks that there is underline in a position to cross the descenders." />
+		<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 		<style type="text/css"><![CDATA[
 
 			span#ahem_text
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-auto-001.xht b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-auto-001.xht
index f90c9295..40fd5bf 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-auto-001.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-auto-001.xht
@@ -6,6 +6,7 @@
 		<link rel="help" title="2.6. Text Underline Position" href="http://www.w3.org/TR/css-text-decor-3/#text-underline-position-property" />
 		<meta name="flags" content="ahem" />
 		<meta name="assert" content="This tests checks that there is underline under the baseline." />
+		<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 		<style type="text/css"><![CDATA[
 
 			span#ahem_text
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-left-001.xht b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-left-001.xht
index e6475a5..e9168a1 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-left-001.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-left-001.xht
@@ -6,6 +6,7 @@
 		<link rel="help" title="2.6. Text Underline Position" href="http://www.w3.org/TR/css-text-decor-3/#text-underline-position-property" />
 		<meta name="flags" content="ahem" />
 		<meta name="assert" content="This tests checks that there is underline in a position under the descenders." />
+		<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 		<style type="text/css"><![CDATA[
 
 			span#ahem_text
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-left-002.xht b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-left-002.xht
index efef80d..8284aae 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-left-002.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-left-002.xht
@@ -6,6 +6,7 @@
 		<link rel="help" title="2.6. Text Underline Position" href="http://www.w3.org/TR/css-text-decor-3/#text-underline-position-property" />
 		<meta name="flags" content="ahem" />
 		<meta name="assert" content="This tests checks that there is underline to the left of the text in vertical writing mode." />
+		<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 		<style type="text/css"><![CDATA[
 
 			div
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-right-001.xht b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-right-001.xht
index 4f002f6..2ccea903 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-right-001.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-right-001.xht
@@ -6,6 +6,7 @@
 		<link rel="help" title="2.6. Text Underline Position" href="http://www.w3.org/TR/css-text-decor-3/#text-underline-position-property" />
 		<meta name="flags" content="ahem" />
 		<meta name="assert" content="This tests checks that there is underline in a position under the descenders." />
+		<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 		<style type="text/css"><![CDATA[
 
 			span#ahem_text
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-right-002.xht b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-right-002.xht
index 5e929f97..343f1453 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-right-002.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-right-002.xht
@@ -6,6 +6,7 @@
 		<link rel="help" title="2.6. Text Underline Position" href="http://www.w3.org/TR/css-text-decor-3/#text-underline-position-property" />
 		<meta name="flags" content="ahem" />
 		<meta name="assert" content="This tests checks that there is underline to the right of the text in vertical writing mode." />
+		<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 		<style type="text/css"><![CDATA[
 
 			div
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-under-001.xht b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-under-001.xht
index 583236a..a18f415 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-under-001.xht
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/text-underline-position-under-001.xht
@@ -6,6 +6,7 @@
 		<link rel="help" title="2.6. Text Underline Position" href="http://www.w3.org/TR/css-text-decor-3/#text-underline-position-property" />
 		<meta name="flags" content="ahem" />
 		<meta name="assert" content="This tests checks that there is underline in a position under the descenders." />
+		<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 		<style type="text/css"><![CDATA[
 
 			span#ahem_text
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/tools/generators/orthogonal-parent-shrink-to-fit.ejs b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/tools/generators/orthogonal-parent-shrink-to-fit.ejs
index b395a7c9..043cbaf 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/tools/generators/orthogonal-parent-shrink-to-fit.ejs
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/tools/generators/orthogonal-parent-shrink-to-fit.ejs
@@ -47,6 +47,7 @@
 <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/"> <!-- 2015-12-23 -->
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style>
 .test {
     border:thin solid;
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-brightness-ref.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-brightness-ref.html
new file mode 100644
index 0000000..cb6ea67
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-brightness-ref.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>CSS Backdrop Filters Animation: Brightness</title>
+<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
+
+
+<style>
+    .square {
+        position: absolute;
+        width: 100px;
+        height: 100px;
+        top: 100px;
+        left: 100px;
+        background: blue;
+        filter: brightness(50%);
+    }
+    .filt {
+        position: absolute;
+        width: 200px;
+        height: 200px;
+        top: 50px;
+        left: 50px;
+        background: white;
+        filter: brightness(50%);
+    }
+    .greenbox {
+        position: absolute;
+        width: 50px;
+        height: 50px;
+        top: 125px;
+        left: 125px;
+        background: green;
+    }
+</style>
+<p>You should see a dark blue rectangle with a green box. Neither black nor blue.</p>
+<div class="filt"></div>
+<div class="square"></div>
+<div class="greenbox"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-brightness.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-brightness.html
new file mode 100644
index 0000000..1cc63ed
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-brightness.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<title>CSS Backdrop Filters Animation: Brightness</title>
+<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty">
+<link rel="match" href="backdrop-filters-brightness-ref.html">
+<style>
+    .square {
+        position: absolute;
+        width: 100px;
+        height: 100px;
+        top: 100px;
+        left: 100px;
+        background: blue;
+    }
+    .filt {
+        backdrop-filter: brightness(50%);
+        position: absolute;
+        width: 200px;
+        height: 200px;
+        top: 50px;
+        left: 50px;
+    }
+    .greenbox {
+        position: absolute;
+        width: 50px;
+        height: 50px;
+        top: 75px;
+        left: 75px;
+        background: green;
+    }
+</style>
+<p>You should see a dark blue rectangle with a green box. Neither black nor blue.</p>
+<div class="square"></div>
+<div class="filt">
+    <div class="greenbox"></div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-contrast-ref.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-contrast-ref.html
new file mode 100644
index 0000000..7978fec
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-contrast-ref.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>CSS Backdrop Filters Animation: Contrast</title>
+<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
+
+
+<style>
+    .square {
+        position: absolute;
+        width: 100px;
+        height: 100px;
+        top: 100px;
+        left: 100px;
+        background: black;
+        filter: contrast(50%);
+    }
+    .filt {
+        position: absolute;
+        width: 200px;
+        height: 200px;
+        top: 50px;
+        left: 50px;
+        background: white;
+        filter: contrast(50%);
+    }
+    .greenbox {
+        position: absolute;
+        width: 50px;
+        height: 50px;
+        top: 125px;
+        left: 125px;
+        background: green;
+    }
+</style>
+<p>You should see a gray rectangle with a green box. Neither black nor white.</p>
+<div class="filt"></div>
+<div class="square"></div>
+<div class="greenbox"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-contrast.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-contrast.html
new file mode 100644
index 0000000..15c97a9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-contrast.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<title>CSS Backdrop Filters Animation: Contrast</title>
+<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty">
+<link rel="match" href="backdrop-filters-contrast-ref.html">
+<style>
+    .square {
+        position: absolute;
+        width: 100px;
+        height: 100px;
+        top: 100px;
+        left: 100px;
+        background: black;
+    }
+    .filt {
+        backdrop-filter: contrast(50%);
+        position: absolute;
+        width: 200px;
+        height: 200px;
+        top: 50px;
+        left: 50px;
+    }
+    .greenbox {
+        position: absolute;
+        width: 50px;
+        height: 50px;
+        top: 75px;
+        left: 75px;
+        background: green;
+    }
+</style>
+<p>You should see a gray rectangle with a green box. Neither black nor white.</p>
+<div class="square"></div>
+<div class="filt">
+    <div class="greenbox"></div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-grayscale-ref.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-grayscale-ref.html
new file mode 100644
index 0000000..eb403f16
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-grayscale-ref.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>CSS Backdrop Filters Animation: Grayscale</title>
+<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
+
+
+<style>
+    .square {
+        position: absolute;
+        width: 100px;
+        height: 100px;
+        top: 100px;
+        left: 100px;
+        background: blue;
+        filter: grayscale(50%);
+    }
+    .filt {
+        position: absolute;
+        width: 200px;
+        height: 200px;
+        top: 50px;
+        left: 50px;
+        background: white;
+        filter: grayscale(50%);
+    }
+    .greenbox {
+        position: absolute;
+        width: 50px;
+        height: 50px;
+        top: 125px;
+        left: 125px;
+        background: green;
+    }
+</style>
+<p>You should see a dark blue rectangle with a green box.</p>
+<div class="filt"></div>
+<div class="square"></div>
+<div class="greenbox"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-grayscale.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-grayscale.html
new file mode 100644
index 0000000..925c83cd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-grayscale.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<title>CSS Backdrop Filters Animation: Grayscale</title>
+<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty">
+<link rel="match" href="backdrop-filters-grayscale-ref.html">
+<style>
+    .square {
+        position: absolute;
+        width: 100px;
+        height: 100px;
+        top: 100px;
+        left: 100px;
+        background: blue;
+    }
+    .filt {
+        backdrop-filter: grayscale(50%);
+        position: absolute;
+        width: 200px;
+        height: 200px;
+        top: 50px;
+        left: 50px;
+    }
+    .greenbox {
+        position: absolute;
+        width: 50px;
+        height: 50px;
+        top: 75px;
+        left: 75px;
+        background: green;
+    }
+</style>
+<p>You should see a dark blue rectangle with a green box.</p>
+<div class="square"></div>
+<div class="filt">
+    <div class="greenbox"></div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-hue-rotate-ref.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-hue-rotate-ref.html
new file mode 100644
index 0000000..c70f6bc
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-hue-rotate-ref.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>CSS Backdrop Filters Animation: Hue Rotate</title>
+<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
+
+
+<style>
+    .square {
+        position: absolute;
+        width: 100px;
+        height: 100px;
+        top: 100px;
+        left: 100px;
+        background: blue;
+        filter: hue-rotate(45deg);
+    }
+    .filt {
+        position: absolute;
+        width: 200px;
+        height: 200px;
+        top: 50px;
+        left: 50px;
+        background: white;
+        filter: hue-rotate(45deg);
+    }
+    .greenbox {
+        position: absolute;
+        width: 50px;
+        height: 50px;
+        top: 125px;
+        left: 125px;
+        background: green;
+    }
+</style>
+<p>You should see a violet rectangle with a green box. Neither red nor blue.</p>
+<div class="filt"></div>
+<div class="square"></div>
+<div class="greenbox"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-hue-rotate.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-hue-rotate.html
new file mode 100644
index 0000000..17d2a3c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-hue-rotate.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<title>CSS Backdrop Filters Animation: Hue-rotate</title>
+<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty">
+<link rel="match" href="backdrop-filters-hue-rotate-ref.html">
+<style>
+    .square {
+        position: absolute;
+        width: 100px;
+        height: 100px;
+        top: 100px;
+        left: 100px;
+        background: blue;
+    }
+    .filt {
+        backdrop-filter: hue-rotate(45deg);
+        position: absolute;
+        width: 200px;
+        height: 200px;
+        top: 50px;
+        left: 50px;
+    }
+    .greenbox {
+        position: absolute;
+        width: 50px;
+        height: 50px;
+        top: 75px;
+        left: 75px;
+        background: green;
+    }
+</style>
+<p>You should see a violet rectangle with a green box. Neither red nor blue.</p>
+<div class="square"></div>
+<div class="filt">
+    <div class="greenbox"></div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-invert-ref.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-invert-ref.html
new file mode 100644
index 0000000..ed3da42
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-invert-ref.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>CSS Backdrop Filters Animation: Invert</title>
+<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
+
+
+<style>
+    .square {
+        position: absolute;
+        width: 100px;
+        height: 100px;
+        top: 100px;
+        left: 100px;
+        background: black;
+        filter: invert(50%);
+    }
+    .filt {
+        position: absolute;
+        width: 200px;
+        height: 200px;
+        top: 50px;
+        left: 50px;
+        background: white;
+        filter: invert(50%);
+    }
+    .greenbox {
+        position: absolute;
+        width: 50px;
+        height: 50px;
+        top: 125px;
+        left: 125px;
+        background: green;
+    }
+</style>
+<p>You should see a gray rectangle with a green box. Neither black nor white.</p>
+<div class="filt"></div>
+<div class="square"></div>
+<div class="greenbox"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-invert.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-invert.html
new file mode 100644
index 0000000..59ec599
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-invert.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<title>CSS Backdrop Filters Animation: Invert</title>
+<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty">
+<link rel="match" href="backdrop-filters-invert-ref.html">
+<style>
+    .square {
+        position: absolute;
+        width: 100px;
+        height: 100px;
+        top: 100px;
+        left: 100px;
+        background: black;
+    }
+    .filt {
+        backdrop-filter: invert(50%);
+        position: absolute;
+        width: 200px;
+        height: 200px;
+        top: 50px;
+        left: 50px;
+    }
+    .greenbox {
+        position: absolute;
+        width: 50px;
+        height: 50px;
+        top: 75px;
+        left: 75px;
+        background: green;
+    }
+</style>
+<p>You should see a gray rectangle with a green box. Neither black nor white.</p>
+<div class="square"></div>
+<div class="filt">
+    <div class="greenbox"></div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-opacity-ref.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-opacity-ref.html
new file mode 100644
index 0000000..fef130ea
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-opacity-ref.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<title>CSS Backdrop Filters Animation: Opacity</title>
+<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
+
+
+<style>
+    .square {
+        position: absolute;
+        width: 100px;
+        height: 100px;
+        top: 100px;
+        left: 100px;
+        background: blue;
+    }
+    .greenbox {
+        position: absolute;
+        width: 50px;
+        height: 50px;
+        top: 125px;
+        left: 125px;
+        background: green;
+    }
+</style>
+<p>You should see a blue square with a green box inside.</p>
+<div class="square"></div>
+<div class="greenbox"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-opacity.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-opacity.html
new file mode 100644
index 0000000..850c41d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-opacity.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<title>CSS Backdrop Filters Animation: Opacity</title>
+<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty">
+<link rel="match" href="backdrop-filters-opacity-ref.html">
+<style>
+    /* Note that per the spec, the backdrop image is read back, filters
+       are applied, any additional content is drawn, and then the resulting
+       image is composited back into the parent (over the top of the
+       existing backdrop image) using source-over compositing. In this case,
+       the only backdrop filter is opacity, so the backdrop image will be
+       filtered by opacity 50%, the green box (100% opacity) is drawn over
+       that at 100% opacity, and then the entire thing is composited into
+       the backdrop, which already contains the 100% opacity blue square.
+       So the blue square stays 100% blue. */
+    .square {
+        position: absolute;
+        width: 100px;
+        height: 100px;
+        top: 100px;
+        left: 100px;
+        background: blue;
+    }
+    .filt {
+        backdrop-filter: opacity(50%);
+        position: absolute;
+        width: 200px;
+        height: 200px;
+        top: 50px;
+        left: 50px;
+    }
+    .greenbox {
+        position: absolute;
+        width: 50px;
+        height: 50px;
+        top: 75px;
+        left: 75px;
+        background: green;
+    }
+</style>
+<p>You should see a blue square with a green box inside.</p>
+<div class="square"></div>
+<div class="filt">
+    <div class="greenbox"></div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-saturate-ref.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-saturate-ref.html
new file mode 100644
index 0000000..d8b7234
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-saturate-ref.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>CSS Backdrop Filters Animation: Saturate</title>
+<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
+
+
+<style>
+    .square {
+        position: absolute;
+        width: 100px;
+        height: 100px;
+        top: 100px;
+        left: 100px;
+        background: #f4fbff;
+        filter: saturate(2500%);
+    }
+    .filt {
+        position: absolute;
+        width: 200px;
+        height: 200px;
+        top: 50px;
+        left: 50px;
+        background: white;
+        filter: saturate(2500%);
+    }
+    .greenbox {
+        position: absolute;
+        width: 50px;
+        height: 50px;
+        top: 125px;
+        left: 125px;
+        background: green;
+    }
+</style>
+<p>You should see a light-blue rectangle with a green box. Neither cyan nor white.</p>
+<div class="filt"></div>
+<div class="square"></div>
+<div class="greenbox"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-saturate.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-saturate.html
new file mode 100644
index 0000000..f131641
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-saturate.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<title>CSS Backdrop Filters Animation: Saturate</title>
+<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty">
+<link rel="match" href="backdrop-filters-saturate-ref.html">
+<style>
+    .square {
+        position: absolute;
+        width: 100px;
+        height: 100px;
+        top: 100px;
+        left: 100px;
+        background: #f4fbff;
+    }
+    .filt {
+        backdrop-filter: saturate(2500%);
+        position: absolute;
+        width: 200px;
+        height: 200px;
+        top: 50px;
+        left: 50px;
+    }
+    .greenbox {
+        position: absolute;
+        width: 50px;
+        height: 50px;
+        top: 75px;
+        left: 75px;
+        background: green;
+    }
+</style>
+<p>You should see a light-blue rectangle with a green box. Neither cyan nor white.</p>
+<div class="square"></div>
+<div class="filt">
+    <div class="greenbox"></div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-sepia-ref.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-sepia-ref.html
new file mode 100644
index 0000000..624fb87
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-sepia-ref.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>CSS Backdrop Filters Animation: Sepia</title>
+<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
+
+
+<style>
+    .square {
+        position: absolute;
+        width: 100px;
+        height: 100px;
+        top: 100px;
+        left: 100px;
+        background: blue;
+        filter: sepia(50%);
+    }
+    .filt {
+        position: absolute;
+        width: 200px;
+        height: 200px;
+        top: 50px;
+        left: 50px;
+        background: white;
+        filter: sepia(50%);
+    }
+    .greenbox {
+        position: absolute;
+        width: 50px;
+        height: 50px;
+        top: 125px;
+        left: 125px;
+        background: green;
+    }
+</style>
+<p>You should see a dark blue rectangle with a green box.</p>
+<div class="filt"></div>
+<div class="square"></div>
+<div class="greenbox"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-sepia.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-sepia.html
new file mode 100644
index 0000000..bcfae3d2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filters-sepia.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<title>CSS Backdrop Filters Animation: Sepia</title>
+<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty">
+<link rel="match" href="backdrop-filters-sepia-ref.html">
+<style>
+    .square {
+        position: absolute;
+        width: 100px;
+        height: 100px;
+        top: 100px;
+        left: 100px;
+        background: blue;
+    }
+    .filt {
+        backdrop-filter: sepia(50%);
+        position: absolute;
+        width: 200px;
+        height: 200px;
+        top: 50px;
+        left: 50px;
+    }
+    .greenbox {
+        position: absolute;
+        width: 50px;
+        height: 50px;
+        top: 75px;
+        left: 75px;
+        background: green;
+    }
+</style>
+<p>You should see a dark blue rectangle with a green box.</p>
+<div class="square"></div>
+<div class="filt">
+    <div class="greenbox"></div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/css-backdrop-filters-animation-opacity-ref.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/css-backdrop-filters-animation-opacity-ref.html
index fd92dba5..c9253d28 100644
--- a/third_party/blink/web_tests/external/wpt/css/filter-effects/css-backdrop-filters-animation-opacity-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/css-backdrop-filters-animation-opacity-ref.html
@@ -27,7 +27,7 @@
         background: green;
     }
 </style>
-<p>You should see a gray rectangle with a green box. Neither black nor white.</p>
+<p>You should see a blue square with a green box inside.</p>
 <div class="square"></div>
 <div class="filt">
     <div class="greenbox"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/css-backdrop-filters-animation-opacity.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/css-backdrop-filters-animation-opacity.html
index d6c6d35..72078e7c 100644
--- a/third_party/blink/web_tests/external/wpt/css/filter-effects/css-backdrop-filters-animation-opacity.html
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/css-backdrop-filters-animation-opacity.html
@@ -4,6 +4,15 @@
 <link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty">
 <link rel="match" href="css-backdrop-filters-animation-opacity-ref.html">
 <style>
+    /* Note that per the spec, the backdrop image is read back, filters
+       are applied, any additional content is drawn, and then the resulting
+       image is composited back into the parent (over the top of the
+       existing backdrop image) using source-over compositing. In this case,
+       the only backdrop filter is opacity, so the backdrop image will be
+       filtered by opacity 50%, the green box (100% opacity) is drawn over
+       that at 100% opacity, and then the entire thing is composited into
+       the backdrop, which already contains the 100% opacity blue square.
+       So the blue square stays 100% blue. */
     @keyframes animate {
         0% {
             backdrop-filter: opacity(0%);
@@ -41,7 +50,7 @@
         background: green;
     }
 </style>
-<p>You should see a gray rectangle with a green box. Neither black nor white.</p>
+<p>You should see a blue square with a green box inside.</p>
 <div class="square"></div>
 <div class="filt">
     <div class="greenbox"></div>
diff --git a/third_party/blink/web_tests/external/wpt/fonts/math/math-text.woff b/third_party/blink/web_tests/external/wpt/fonts/math/math-text.woff
new file mode 100644
index 0000000..afe4057f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fonts/math/math-text.woff
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/html/user-activation/activation-api-iframe.tenative.html b/third_party/blink/web_tests/external/wpt/html/user-activation/activation-api-iframe.tenative.html
index 2202048..16b0ba6 100644
--- a/third_party/blink/web_tests/external/wpt/html/user-activation/activation-api-iframe.tenative.html
+++ b/third_party/blink/web_tests/external/wpt/html/user-activation/activation-api-iframe.tenative.html
@@ -14,7 +14,7 @@
 <body>
   <h1>Clicking in iframe has activation state in child</h1>
   <ol id="instructions">
-    <li>Click inside the red area.
+    <li>Click inside the light-grey area.
   </ol>
   <iframe id="child" width="200" height="200"></iframe>
   <script>
diff --git a/third_party/blink/web_tests/external/wpt/html/user-activation/activation-transfer-cross-origin-with-click-two-child-frames.sub.tentative.html b/third_party/blink/web_tests/external/wpt/html/user-activation/activation-transfer-cross-origin-with-click-two-child-frames.sub.tentative.html
index edaad26..777cb5b 100644
--- a/third_party/blink/web_tests/external/wpt/html/user-activation/activation-transfer-cross-origin-with-click-two-child-frames.sub.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/user-activation/activation-transfer-cross-origin-with-click-two-child-frames.sub.tentative.html
@@ -24,12 +24,12 @@
       var child1 = document.getElementById("child1");
       var child2 = document.getElementById("child2");
       var is_child_four_loaded = false;
-      var is_child_five_loaded = false;
+      var is_child_two_loaded = false;
       assert_false(navigator.userActivation.isActive);
       assert_false(navigator.userActivation.hasBeenActive);
 
       function tryClickInstructions() {
-        if (is_child_four_loaded && is_child_five_loaded)
+        if (is_child_four_loaded && is_child_two_loaded)
           test_driver.click(document.getElementById('instructions'));
       }
 
@@ -52,15 +52,15 @@
           assert_false(navigator.userActivation.hasBeenActive);
 
           child2.contentWindow.postMessage('report', '*');
-        } else if (msg.type == 'child-five-loaded') {
+        } else if (msg.type == 'child-two-loaded') {
           // state should be false after load
           assert_false(msg.isActive);
           assert_false(msg.hasBeenActive);
 
           // click in parent document after both child frames load
-          is_child_five_loaded = true;
+          is_child_two_loaded = true;
           tryClickInstructions();
-        } else if (msg.type == 'child-five-report') {
+        } else if (msg.type == 'child-two-report') {
           assert_false(msg.isActive);
           assert_false(msg.hasBeenActive);
 
@@ -75,7 +75,7 @@
           assert_true(navigator.userActivation.hasBeenActive);
 
           // transfer user activation to the child frame
-          child1.contentWindow.postMessage("transfer_user_activation",
+          child1.contentWindow.postMessage("report",
               {targetOrigin: "*", transferUserActivation: true});
 
           // sender's activation state is updated synchronously
@@ -83,7 +83,7 @@
           assert_false(navigator.userActivation.hasBeenActive);
       }));
       child1.src = "http://{{domains[www]}}:{{ports[http][0]}}/html/user-activation/resources/child-four.html";
-      child2.src = "http://{{domains[www1]}}:{{ports[http][0]}}/html/user-activation/resources/child-five.html";
+      child2.src = "http://{{domains[www1]}}:{{ports[http][0]}}/html/user-activation/resources/child-two.html";
     }, "Cross-origin user activation transfer through postMessages");
   </script>
 </body>
diff --git a/third_party/blink/web_tests/external/wpt/html/user-activation/activation-transfer-cross-origin-with-click.sub.tentative.html b/third_party/blink/web_tests/external/wpt/html/user-activation/activation-transfer-cross-origin-with-click.sub.tentative.html
index e7d98c3b1..ef1602a8 100644
--- a/third_party/blink/web_tests/external/wpt/html/user-activation/activation-transfer-cross-origin-with-click.sub.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/user-activation/activation-transfer-cross-origin-with-click.sub.tentative.html
@@ -48,7 +48,7 @@
           assert_true(navigator.userActivation.hasBeenActive);
 
           // transfer user activation to the child frame
-          child.contentWindow.postMessage("transfer_user_activation",
+          child.contentWindow.postMessage("report",
               {targetOrigin: "*", transferUserActivation: true});
 
           // sender's activation state is updated synchronously
diff --git a/third_party/blink/web_tests/external/wpt/html/user-activation/activation-transfer-with-click.tentative.html b/third_party/blink/web_tests/external/wpt/html/user-activation/activation-transfer-with-click.tentative.html
index 6b7a2b72..040d36c 100644
--- a/third_party/blink/web_tests/external/wpt/html/user-activation/activation-transfer-with-click.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/user-activation/activation-transfer-with-click.tentative.html
@@ -48,7 +48,7 @@
           assert_true(navigator.userActivation.hasBeenActive);
 
           // transfer user activation to the child frame
-          child.contentWindow.postMessage("transfer_user_activation",
+          child.contentWindow.postMessage("report",
               {transferUserActivation: true});
 
           // sender's activation state is updated synchronously
diff --git a/third_party/blink/web_tests/external/wpt/html/user-activation/activation-transfer-without-click.tentative.html b/third_party/blink/web_tests/external/wpt/html/user-activation/activation-transfer-without-click.tentative.html
index 50cce1f..a12d434 100644
--- a/third_party/blink/web_tests/external/wpt/html/user-activation/activation-transfer-without-click.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/user-activation/activation-transfer-without-click.tentative.html
@@ -22,7 +22,7 @@
 
       function tryPostMessaging() {
         if (is_page_loaded && is_child_four_loaded)
-          child.contentWindow.postMessage("transfer_user_activation", {transferUserActivation: true});
+          child.contentWindow.postMessage("report", {transferUserActivation: true});
       }
 
       window.addEventListener("message", t.step_func(event => {
diff --git a/third_party/blink/web_tests/external/wpt/html/user-activation/resources/child-five.html b/third_party/blink/web_tests/external/wpt/html/user-activation/resources/child-five.html
deleted file mode 100644
index 9260a300..0000000
--- a/third_party/blink/web_tests/external/wpt/html/user-activation/resources/child-five.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<!DOCTYPE html>
-<body style="background: red;">
-<script>
-    window.parent.postMessage(JSON.stringify({"type": "child-five-loaded", "isActive": navigator.userActivation.isActive,
-                                              "hasBeenActive": navigator.userActivation.hasBeenActive}), "*");
-
-    window.addEventListener("message", event => {
-        if (event.source === window.parent && event.data == "report") {
-            window.parent.postMessage(JSON.stringify({"type": "child-five-report", "isActive": navigator.userActivation.isActive,
-                                                      "hasBeenActive": navigator.userActivation.hasBeenActive}), "*");
-        }
-    });
-
-</script>
-</body>
diff --git a/third_party/blink/web_tests/external/wpt/html/user-activation/resources/child-four.html b/third_party/blink/web_tests/external/wpt/html/user-activation/resources/child-four.html
index 4811edb..65d17f27 100644
--- a/third_party/blink/web_tests/external/wpt/html/user-activation/resources/child-four.html
+++ b/third_party/blink/web_tests/external/wpt/html/user-activation/resources/child-four.html
@@ -5,7 +5,7 @@
                                               "hasBeenActive": navigator.userActivation.hasBeenActive}), "*");
 
     window.addEventListener("message", event => {
-        if (event.source === window.parent && event.data == "transfer_user_activation") {
+        if (event.source === window.parent && event.data == "report") {
             window.parent.postMessage(JSON.stringify({"type": "child-four-report", "isActive": navigator.userActivation.isActive,
                                                       "hasBeenActive": navigator.userActivation.hasBeenActive}), "*");
         }
diff --git a/third_party/blink/web_tests/external/wpt/html/user-activation/resources/child-two.html b/third_party/blink/web_tests/external/wpt/html/user-activation/resources/child-two.html
index 7d48789..1fa8343 100644
--- a/third_party/blink/web_tests/external/wpt/html/user-activation/resources/child-two.html
+++ b/third_party/blink/web_tests/external/wpt/html/user-activation/resources/child-two.html
@@ -1,7 +1,15 @@
 <!DOCTYPE html>
-<body style="background: red;">
+<body style="background: lightgrey;">
 <script>
-  window.parent.postMessage(JSON.stringify({"type": "child-two-loaded", "isActive": navigator.userActivation.isActive,
-                                            "hasBeenActive": navigator.userActivation.hasBeenActive}), "*");
+    window.parent.postMessage(JSON.stringify({"type": "child-two-loaded", "isActive": navigator.userActivation.isActive,
+                                              "hasBeenActive": navigator.userActivation.hasBeenActive}), "*");
+
+    window.addEventListener("message", event => {
+        if (event.source === window.parent && event.data == "report") {
+            window.parent.postMessage(JSON.stringify({"type": "child-two-report", "isActive": navigator.userActivation.isActive,
+                                                      "hasBeenActive": navigator.userActivation.hasBeenActive}), "*");
+        }
+    });
+
 </script>
 </body>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-001-ref.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-001-ref.html
new file mode 100644
index 0000000..69be003
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-001-ref.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+<meta charset="utf-8">
+<title>Fraction parameters</title>
+<style>
+  math, mspace {
+    font-size: 20px;
+  }
+  @font-face {
+    font-family: denominatordisplaystylegapmin5000-rulethickness1000;
+    src: url("/fonts/math/fraction-denominatordisplaystylegapmin5000-rulethickness1000.woff");
+  }
+  #reference {
+    background: green;
+  }
+  #frame {
+    position: absolute;
+    border-top: 4px solid black;
+    border-bottom: 4px solid black;
+    width: 100%;
+  }
+</style>
+<script>
+  function runTests() {
+    var div = document.getElementById("frame");
+    var refBox = document.getElementById("reference").getBoundingClientRect();
+    div.style.top = `${refBox.top-2}px`;
+    div.style.height = `${refBox.height-4}px`;
+    document.documentElement.classList.remove('reftest-wait');
+  }
+  window.addEventListener("load", function() {
+    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
+    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
+  });
+</script>
+</head>
+<body>
+  <p>
+    This test passes if the blue squares are aligned:
+  </p>
+  <p>
+    <math display="block" style="font-family: denominatordisplaystylegapmin5000-rulethickness1000;">
+      <mspace height="2em" depth="20em"/>
+      <mfrac>
+        <mspace width="3em"/>
+        <mspace id="reference" width="3em" height=".5em" depth=".5em"/>
+      </mfrac>
+      <mfrac>
+        <mspace width="3em"/>
+        <mspace width="1em" height=".5em" depth=".5em" style="background: blue"/>
+      </mfrac>
+      <mfrac>
+        <mspace width="3em"/>
+        <mspace width="1em" height="1em" style="background: blue"/>
+      </mfrac>
+      <mfrac>
+        <mspace width="3em"/>
+        <mspace width="1em" depth="1em" style="background: blue"/>
+      </mfrac>
+    </math>
+  </p>
+  <div id="frame"></div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-001.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-001.html
new file mode 100644
index 0000000..f577682
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-001.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+<meta charset="utf-8">
+<title>Fraction parameters (display gap between bar and denominator)</title>
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#fractions-mfrac">
+<link rel="match" href="frac-parameters-gap-001-ref.html"/>
+<meta name="assert" content="Element mfrac correctly uses the FractionDenomDisplayStyleGapMin parameter from the MATH table when denominator contains text.">
+<style>
+  math, mspace, mtext {
+    font-size: 20px;
+  }
+  mtext {
+    font-family: math-text;
+    color: blue;
+  }
+  @font-face {
+    font-family: denominatordisplaystylegapmin5000-rulethickness1000;
+    src: url("/fonts/math/fraction-denominatordisplaystylegapmin5000-rulethickness1000.woff");
+  }
+  @font-face {
+    /*
+      math-text has the following properties:
+      - typo/hhea/win metrics: 2.5em ascent and 2.5em descent.
+      - glyph A: .5em ascent and .5em descent.
+      - glyph B: 1em ascent and 0em descent.
+      - glyph C: 0em ascent and 1em descent.
+     */
+    font-family: math-text;
+    src: url("/fonts/math/math-text.woff");
+  }
+  #reference {
+    background: green;
+  }
+  #frame {
+    position: absolute;
+    border-top: 4px solid black;
+    border-bottom: 4px solid black;
+    width: 100%;
+  }
+</style>
+<script>
+  function runTests() {
+    var div = document.getElementById("frame");
+    var refBox = document.getElementById("reference").getBoundingClientRect();
+    div.style.top = `${refBox.top-2}px`;
+    div.style.height = `${refBox.height-4}px`;
+    document.documentElement.classList.remove('reftest-wait');
+  }
+  window.addEventListener("load", function() {
+    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
+    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
+  });
+</script>
+</head>
+<body>
+  <p>
+    This test passes if the blue squares are aligned:
+  </p>
+  <p>
+    <math display="block" style="font-family: denominatordisplaystylegapmin5000-rulethickness1000;">
+      <!-- This is a dummy mspace element to ensure that the font ascent/descent does not affect the size of the math element. -->
+      <mspace height="2em" depth="20em"/>
+      <!--
+           All the fraction bars must be aligned.
+           The gap between the denominators and bar must be FractionDenomDisplayStyleGapMin.
+           The gap should be calculated using the exact bounding box of the glyphs.
+           Hence glyphs A, B, C should be rendered at the same vertical position, even if they have different ascent/descent.
+        -->
+      <mfrac>
+        <mspace width="3em"/>
+        <mspace id="reference" width="3em" height=".5em" depth=".5em"/>
+      </mfrac>
+      <mfrac>
+        <mspace width="3em"/>
+        <mtext>A</mtext>
+      </mfrac>
+      <mfrac>
+        <mspace width="3em"/>
+        <mtext>B</mtext>
+      </mfrac>
+      <mfrac>
+        <mspace width="3em"/>
+        <mtext>C</mtext>
+      </mfrac>
+    </math>
+  </p>
+  <div id="frame"></div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-002-ref.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-002-ref.html
new file mode 100644
index 0000000..9169bb99
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-002-ref.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+<meta charset="utf-8">
+<title>Fraction parameters</title>
+<style>
+  math, mspace {
+    font-size: 20px;
+  }
+  @font-face {
+    font-family: denominatorgapmin4000-rulethickness1000;
+    src: url("/fonts/math/fraction-denominatorgapmin4000-rulethickness1000.woff");
+  }
+  #reference {
+    background: green;
+  }
+  #frame {
+    position: absolute;
+    border-top: 4px solid black;
+    border-bottom: 4px solid black;
+    width: 100%;
+  }
+</style>
+<script>
+  function runTests() {
+    var div = document.getElementById("frame");
+    var refBox = document.getElementById("reference").getBoundingClientRect();
+    div.style.top = `${refBox.top-2}px`;
+    div.style.height = `${refBox.height-4}px`;
+    document.documentElement.classList.remove('reftest-wait');
+  }
+  window.addEventListener("load", function() {
+    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
+    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
+  });
+</script>
+</head>
+<body>
+  <p>
+    This test passes if the blue squares are aligned:
+  </p>
+  <p>
+    <math style="font-family: denominatorgapmin4000-rulethickness1000;">
+      <mspace height="2em" depth="20em"/>
+      <mfrac>
+        <mspace width="3em"/>
+        <mspace id="reference" width="3em" height=".5em" depth=".5em"/>
+      </mfrac>
+      <mfrac>
+        <mspace width="3em"/>
+        <mspace width="1em" height=".5em" depth=".5em" style="background: blue"/>
+      </mfrac>
+      <mfrac>
+        <mspace width="3em"/>
+        <mspace width="1em" height="1em" style="background: blue"/>
+      </mfrac>
+      <mfrac>
+        <mspace width="3em"/>
+        <mspace width="1em" depth="1em" style="background: blue"/>
+      </mfrac>
+    </math>
+  </p>
+  <div id="frame"></div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-002.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-002.html
new file mode 100644
index 0000000..2c0a9a1a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-002.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+<meta charset="utf-8">
+<title>Fraction parameters (inline gap between bar and denominator)</title>
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#fractions-mfrac">
+<link rel="match" href="frac-parameters-gap-002-ref.html"/>
+<meta name="assert" content="Element mfrac correctly uses the FractionDenominatorGapMin parameter from the MATH table when denominator contains text.">
+<style>
+  math, mspace, mtext {
+    font-size: 20px;
+  }
+  mtext {
+    font-family: math-text;
+    color: blue;
+  }
+  @font-face {
+    font-family: denominatorgapmin4000-rulethickness1000;
+    src: url("/fonts/math/fraction-denominatorgapmin4000-rulethickness1000.woff");
+  }
+  @font-face {
+    /*
+      math-text has the following properties:
+      - typo/hhea/win metrics: 2.5em ascent and 2.5em descent.
+      - glyph A: .5em ascent and .5em descent.
+      - glyph B: 1em ascent and 0em descent.
+      - glyph C: 0em ascent and 1em descent.
+     */
+    font-family: math-text;
+    src: url("/fonts/math/math-text.woff");
+  }
+  #reference {
+    background: green;
+  }
+  #frame {
+    position: absolute;
+    border-top: 4px solid black;
+    border-bottom: 4px solid black;
+    width: 100%;
+  }
+</style>
+<script>
+  function runTests() {
+    var div = document.getElementById("frame");
+    var refBox = document.getElementById("reference").getBoundingClientRect();
+    div.style.top = `${refBox.top-2}px`;
+    div.style.height = `${refBox.height-4}px`;
+    document.documentElement.classList.remove('reftest-wait');
+  }
+  window.addEventListener("load", function() {
+    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
+    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
+  });
+</script>
+</head>
+<body>
+  <p>
+    This test passes if the blue squares are aligned:
+  </p>
+  <p>
+    <math style="font-family: denominatorgapmin4000-rulethickness1000;">
+      <!-- This is a dummy mspace element to ensure that the font ascent/descent does not affect the size of the math element. -->
+      <mspace height="2em" depth="20em"/>
+      <!--
+           All the fraction bars must be aligned.
+           The gap between the denominators and bar must be FractionDenominatorGapMin.
+           The gap should be calculated using the exact bounding box of the glyphs.
+           Hence glyphs A, B, C should be rendered at the same vertical position, even if they have different ascent/descent.
+        -->
+      <mfrac>
+        <mspace width="3em"/>
+        <mspace id="reference" width="3em" height=".5em" depth=".5em"/>
+      </mfrac>
+      <mfrac>
+        <mspace width="3em"/>
+        <mtext>A</mtext>
+      </mfrac>
+      <mfrac>
+        <mspace width="3em"/>
+        <mtext>B</mtext>
+      </mfrac>
+      <mfrac>
+        <mspace width="3em"/>
+        <mtext>C</mtext>
+      </mfrac>
+    </math>
+  </p>
+  <div id="frame"></div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-003-ref.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-003-ref.html
new file mode 100644
index 0000000..3fe86fa
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-003-ref.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+<meta charset="utf-8">
+<title>Fraction parameters</title>
+<style>
+  math, mspace {
+    font-size: 20px;
+  }
+  @font-face {
+    font-family: numeratordisplaystylegapmin8000-rulethickness1000;
+    src: url("/fonts/math/fraction-numeratordisplaystylegapmin8000-rulethickness1000.woff");
+  }
+  #reference {
+    background: green;
+  }
+  #frame {
+    position: absolute;
+    border-top: 4px solid black;
+    border-bottom: 4px solid black;
+    width: 100%;
+  }
+</style>
+<script>
+  function runTests() {
+    var div = document.getElementById("frame");
+    var refBox = document.getElementById("reference").getBoundingClientRect();
+    div.style.top = `${refBox.top-2}px`;
+    div.style.height = `${refBox.height-4}px`;
+    document.documentElement.classList.remove('reftest-wait');
+  }
+  window.addEventListener("load", function() {
+    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
+    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
+  });
+</script>
+</head>
+<body>
+  <p>
+    This test passes if the blue squares are aligned:
+  </p>
+  <p>
+    <math display="block" style="font-family: numeratordisplaystylegapmin8000-rulethickness1000;">
+      <mspace height="20em" depth="2em"/>
+      <mfrac>
+        <mspace id="reference" width="3em" height=".5em" depth=".5em"/>
+        <mspace width="3em"/>
+      </mfrac>
+      <mfrac>
+        <mspace width="1em" depth=".5em" height=".5em" style="background: blue"/>
+        <mspace width="3em"/>
+      </mfrac>
+      <mfrac>
+        <mspace width="1em" height="1em" style="background: blue"/>
+        <mspace width="3em"/>
+      </mfrac>
+      <mfrac>
+        <mspace width="1em" depth="1em" style="background: blue"/>
+        <mspace width="3em"/>
+      </mfrac>
+    </math>
+  </p>
+  <div id="frame"></div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-003.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-003.html
new file mode 100644
index 0000000..826eecd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-003.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+<meta charset="utf-8">
+<title>Fraction parameters (display gap between bar and numerator)</title>
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#fractions-mfrac">
+<link rel="match" href="frac-parameters-gap-003-ref.html"/>
+<meta name="assert" content="Element mfrac correctly uses the FractionNumDisplayStyleGapMin parameter from the MATH table when numerator contains text.">
+<style>
+  math, mspace, mtext {
+    font-size: 20px;
+  }
+  mtext {
+    font-family: math-text;
+    color: blue;
+  }
+  @font-face {
+    font-family: numeratordisplaystylegapmin8000-rulethickness1000;
+    src: url("/fonts/math/fraction-numeratordisplaystylegapmin8000-rulethickness1000.woff");
+  }
+  @font-face {
+    /*
+      math-text has the following properties:
+      - typo/hhea/win metrics: 2.5em ascent and 2.5em descent.
+      - glyph A: .5em ascent and .5em descent.
+      - glyph B: 1em ascent and 0em descent.
+      - glyph C: 0em ascent and 1em descent.
+     */
+    font-family: math-text;
+    src: url("/fonts/math/math-text.woff");
+  }
+  #reference {
+    background: green;
+  }
+  #frame {
+    position: absolute;
+    border-top: 4px solid black;
+    border-bottom: 4px solid black;
+    width: 100%;
+  }
+</style>
+<script>
+  function runTests() {
+    var div = document.getElementById("frame");
+    var refBox = document.getElementById("reference").getBoundingClientRect();
+    div.style.top = `${refBox.top-2}px`;
+    div.style.height = `${refBox.height-4}px`;
+    document.documentElement.classList.remove('reftest-wait');
+  }
+  window.addEventListener("load", function() {
+    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
+    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
+  });
+</script>
+</head>
+<body>
+  <p>
+    This test passes if the blue squares are aligned:
+  </p>
+  <p>
+    <math display="block" style="font-family: numeratordisplaystylegapmin8000-rulethickness1000;">
+      <!-- This is a dummy mspace element to ensure that the font ascent/descent does not affect the size of the math element. -->
+      <mspace height="20em" depth="2em"/>
+      <!--
+           All the fraction bars must be aligned.
+           The gap between the numerators and bar must be FractionNumDisplayStyleGapMin.
+           The gap should be calculated using the exact bounding box of the glyphs.
+           Hence glyphs A, B, C should be rendered at the same vertical position, even if they have different ascent/descent.
+        -->
+      <mfrac>
+        <mspace id="reference" width="3em" height=".5em" depth=".5em"/>
+        <mspace width="3em"/>
+      </mfrac>
+      <mfrac>
+        <mtext>A</mtext>
+        <mspace width="3em"/>
+      </mfrac>
+      <mfrac>
+        <mtext>B</mtext>
+        <mspace width="3em"/>
+      </mfrac>
+      <mfrac>
+        <mtext>C</mtext>
+        <mspace width="3em"/>
+      </mfrac>
+    </math>
+  </p>
+  <div id="frame"></div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-004-ref.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-004-ref.html
new file mode 100644
index 0000000..10d0415
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-004-ref.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+<meta charset="utf-8">
+<title>Fraction parameters</title>
+<style>
+  math, mspace {
+    font-size: 20px;
+  }
+  @font-face {
+    font-family: numeratorgapmin9000-rulethickness1000;
+    src: url("/fonts/math/fraction-numeratorgapmin9000-rulethickness1000.woff");
+  }
+  #reference {
+    background: green;
+  }
+  #frame {
+    position: absolute;
+    border-top: 4px solid black;
+    border-bottom: 4px solid black;
+    width: 100%;
+  }
+</style>
+<script>
+  function runTests() {
+    var div = document.getElementById("frame");
+    var refBox = document.getElementById("reference").getBoundingClientRect();
+    div.style.top = `${refBox.top-2}px`;
+    div.style.height = `${refBox.height-4}px`;
+    document.documentElement.classList.remove('reftest-wait');
+  }
+  window.addEventListener("load", function() {
+    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
+    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
+  });
+</script>
+</head>
+<body>
+  <p>
+    This test passes if the blue squares are aligned:
+  </p>
+  <p>
+    <math style="font-family: numeratorgapmin9000-rulethickness1000;">
+      <mspace height="20em" depth="2em"/>
+      <mfrac>
+        <mspace id="reference" width="3em" height=".5em" depth=".5em"/>
+        <mspace width="3em"/>
+      </mfrac>
+      <mfrac>
+        <mspace width="1em" height=".5em" depth=".5em" style="background: blue"/>
+        <mspace width="3em"/>
+      </mfrac>
+      <mfrac>
+        <mspace width="1em" height="1em" style="background: blue"/>
+        <mspace width="3em"/>
+      </mfrac>
+      <mfrac>
+        <mspace width="1em" depth="1em" style="background: blue"/>
+        <mspace width="3em"/>
+      </mfrac>
+    </math>
+  </p>
+  <div id="frame"></div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-004.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-004.html
new file mode 100644
index 0000000..3591762
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-004.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+<meta charset="utf-8">
+<title>Fraction parameters (inline gap between bar and numerator)</title>
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#fractions-mfrac">
+<link rel="match" href="frac-parameters-gap-004-ref.html"/>
+<meta name="assert" content="Element mfrac correctly uses the FractionNumeratorGapMin parameter from the MATH table when numerator contains text.">
+<style>
+  math, mspace, mtext {
+    font-size: 20px;
+  }
+  mtext {
+    font-family: math-text;
+    color: blue;
+  }
+  @font-face {
+    font-family: numeratorgapmin9000-rulethickness1000;
+    src: url("/fonts/math/fraction-numeratorgapmin9000-rulethickness1000.woff");
+  }
+  @font-face {
+    /*
+      math-text has the following properties:
+      - typo/hhea/win metrics: 2.5em ascent and 2.5em descent.
+      - glyph A: .5em ascent and .5em descent.
+      - glyph B: 1em ascent and 0em descent.
+      - glyph C: 0em ascent and 1em descent.
+     */
+    font-family: math-text;
+    src: url("/fonts/math/math-text.woff");
+  }
+  #reference {
+    background: green;
+  }
+  #frame {
+    position: absolute;
+    border-top: 4px solid black;
+    border-bottom: 4px solid black;
+    width: 100%;
+  }
+</style>
+<script>
+  function runTests() {
+    var div = document.getElementById("frame");
+    var refBox = document.getElementById("reference").getBoundingClientRect();
+    div.style.top = `${refBox.top-2}px`;
+    div.style.height = `${refBox.height-4}px`;
+    document.documentElement.classList.remove('reftest-wait');
+  }
+  window.addEventListener("load", function() {
+    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
+    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
+  });
+</script>
+</head>
+<body>
+  <p>
+    This test passes if the blue squares are aligned:
+  </p>
+  <p>
+    <math style="font-family: numeratorgapmin9000-rulethickness1000;">
+      <!-- This is a dummy mspace element to ensure that the font ascent/descent does not affect the size of the math element. -->
+      <mspace height="20em" depth="2em"/>
+      <!--
+           All the fraction bars must be aligned.
+           The gap between the numerators and bar must be FractionNumeratorGapMin.
+           The gap should be calculated using the exact bounding box of the glyphs.
+           Hence glyphs A, B, C should be rendered at the same vertical position, even if they have different ascent/descent.
+        -->
+      <mfrac>
+        <mspace id="reference" width="3em" height=".5em" depth=".5em"/>
+        <mspace width="3em"/>
+      </mfrac>
+      <mfrac>
+        <mtext>A</mtext>
+        <mspace width="3em"/>
+      </mfrac>
+      <mfrac>
+        <mtext>B</mtext>
+        <mspace width="3em"/>
+      </mfrac>
+      <mfrac>
+        <mtext>C</mtext>
+        <mspace width="3em"/>
+      </mfrac>
+    </math>
+  </p>
+  <div id="frame"></div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-005-ref.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-005-ref.html
new file mode 100644
index 0000000..9bfd765
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-005-ref.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+<meta charset="utf-8">
+<title>Fraction parameters</title>
+<style>
+  math, mspace {
+    font-size: 20px;
+  }
+  @font-face {
+    font-family: displaystylegapmin4000;
+    src: url("/fonts/math/stack-displaystylegapmin4000.woff");
+  }
+  #reference {
+    background: green;
+  }
+  #frame {
+    position: absolute;
+    border-top: 4px solid black;
+    border-bottom: 4px solid black;
+    width: 100%;
+  }
+</style>
+<script>
+  function runTests() {
+    var div = document.getElementById("frame");
+    var refBox = document.getElementById("reference").getBoundingClientRect();
+    div.style.top = `${refBox.top-2}px`;
+    div.style.height = `${refBox.height-4}px`;
+    document.documentElement.classList.remove('reftest-wait');
+  }
+  window.addEventListener("load", function() {
+    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
+    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
+  });
+</script>
+</head>
+<body>
+  <p>
+    This test passes if the blue squares are aligned:
+  </p>
+  <p>
+    <math display="block" style="font-family: displaystylegapmin4000">
+      <mspace height="10em" depth="10em"/>
+      <mfrac linethickness="0px">
+        <mspace width="3em" depth="1em"/>
+        <mspace id="reference" width="3em" height=".5em" depth=".5em"/>
+      </mfrac>
+      <mfrac linethickness="0px">
+        <mspace width="3em" depth="1em"/>
+        <mspace width="1em" height=".5em" depth=".5em" style="background: blue"/>
+      </mfrac>
+      <mfrac linethickness="0px">
+        <mspace width="3em" depth="1.5em"/>
+        <mspace width="1em" height="1em" style="background: blue"/>
+      </mfrac>
+      <mfrac linethickness="0px">
+        <mspace width="3em" depth=".5em"/>
+        <mspace width="1em" depth="1em" style="background: blue"/>
+      </mfrac>
+    </math>
+  </p>
+  <div id="frame"></div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-005.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-005.html
new file mode 100644
index 0000000..60295f7d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-005.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+<meta charset="utf-8">
+<title>Stack parameters (display gap between numerator and denominator)</title>
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#fractions-mfrac">
+<link rel="match" href="frac-parameters-gap-005-ref.html"/>
+<meta name="assert" content="Element mfrac with zero linethickness correctly uses the StackDisplayStyleGapMin parameter from the MATH table when denominator contains text.">
+<style>
+  math, mspace, mtext {
+    font-size: 20px;
+  }
+  mtext {
+    font-family: math-text;
+    color: blue;
+  }
+  @font-face {
+    font-family: displaystylegapmin4000;
+    src: url("/fonts/math/stack-displaystylegapmin4000.woff");
+  }
+  @font-face {
+    /*
+      math-text has the following properties:
+      - typo/hhea/win metrics: 2.5em ascent and 2.5em descent.
+      - glyph A: .5em ascent and .5em descent.
+      - glyph B: 1em ascent and 0em descent.
+      - glyph C: 0em ascent and 1em descent.
+     */
+    font-family: math-text;
+    src: url("/fonts/math/math-text.woff");
+  }
+  #reference {
+    background: green;
+  }
+  #frame {
+    position: absolute;
+    border-top: 4px solid black;
+    border-bottom: 4px solid black;
+    width: 100%;
+  }
+</style>
+<script>
+  function runTests() {
+    var div = document.getElementById("frame");
+    var refBox = document.getElementById("reference").getBoundingClientRect();
+    div.style.top = `${refBox.top-2}px`;
+    div.style.height = `${refBox.height-4}px`;
+    document.documentElement.classList.remove('reftest-wait');
+  }
+  window.addEventListener("load", function() {
+    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
+    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
+  });
+</script>
+</head>
+<body>
+  <p>
+    This test passes if the blue squares are aligned:
+  </p>
+  <p>
+    <math display="block" style="font-family: displaystylegapmin4000">
+      <!-- This is a dummy mspace element to ensure that the font ascent/descent does not affect the size of the math element. -->
+      <mspace height="10em" depth="10em"/>
+      <!--
+           The gap between the numerators/denominators and the math axis must StackDisplayStyleGapMin / 2.
+           The gap should be calculated using the exact bounding box of the glyphs.
+           The numerator descent is .5em + the denominator ascent.
+           Hence glyphs A, B, C should be rendered at the same vertical position, even if they have different ascent/descent.
+        -->
+      <mfrac linethickness="0px">
+        <mspace width="3em" depth="1em"/>
+        <mspace id="reference" width="3em" height=".5em" depth=".5em"/>
+      </mfrac>
+      <mfrac linethickness="0px">
+        <mspace width="3em" depth="1em"/>
+        <mtext>A</mtext>
+      </mfrac>
+      <mfrac linethickness="0px">
+        <mspace width="3em" depth="1.5em"/>
+        <mtext>B</mtext>
+      </mfrac>
+      <mfrac linethickness="0px">
+        <mspace width="3em" depth=".5em"/>
+        <mtext>C</mtext>
+      </mfrac>
+    </math>
+  </p>
+  <div id="frame"></div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-006-ref.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-006-ref.html
new file mode 100644
index 0000000..2abba28f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-006-ref.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+<meta charset="utf-8">
+<title>Fraction parameters</title>
+<style>
+  math, mspace {
+    font-size: 20px;
+  }
+  @font-face {
+    font-family: gapmin8000;
+    src: url("/fonts/math/stack-gapmin8000.woff");
+  }
+  #reference {
+    background: green;
+  }
+  #frame {
+    position: absolute;
+    border-top: 4px solid black;
+    border-bottom: 4px solid black;
+    width: 100%;
+  }
+</style>
+<script>
+  function runTests() {
+    var div = document.getElementById("frame");
+    var refBox = document.getElementById("reference").getBoundingClientRect();
+    div.style.top = `${refBox.top-2}px`;
+    div.style.height = `${refBox.height-4}px`;
+    document.documentElement.classList.remove('reftest-wait');
+  }
+  window.addEventListener("load", function() {
+    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
+    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
+  });
+</script>
+</head>
+<body>
+  <p>
+    This test passes if the blue squares are aligned:
+  </p>
+  <p>
+    <math style="font-family: gapmin8000">
+      <mspace height="10em" depth="10em"/>
+      <mfrac linethickness="0px">
+        <mspace width="3em" depth="1em"/>
+        <mspace id="reference" width="3em" height=".5em" depth=".5em"/>
+      </mfrac>
+      <mfrac linethickness="0px">
+        <mspace width="3em" depth="1em"/>
+        <mspace width="1em" height=".5em" depth=".5em" style="background: blue"/>
+      </mfrac>
+      <mfrac linethickness="0px">
+        <mspace width="3em" depth="1.5em"/>
+        <mspace width="1em" height="1em" style="background: blue"/>
+      </mfrac>
+      <mfrac linethickness="0px">
+        <mspace width="3em" depth=".5em"/>
+        <mspace width="1em" depth="1em" style="background: blue"/>
+      </mfrac>
+    </math>
+  </p>
+  <div id="frame"></div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-006.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-006.html
new file mode 100644
index 0000000..7895052
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-006.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+<meta charset="utf-8">
+<title>Stack parameters (display gap between numerator and denominator)</title>
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#fractions-mfrac">
+<link rel="match" href="frac-parameters-gap-006-ref.html"/>
+<meta name="assert" content="Element mfrac with zero linethickness correctly uses the StackGapMin parameter from the MATH table when denominator contains text.">
+<style>
+  math, mspace, mtext {
+    font-size: 20px;
+  }
+  mtext {
+    font-family: math-text;
+    color: blue;
+  }
+  @font-face {
+    font-family: gapmin8000;
+    src: url("/fonts/math/stack-gapmin8000.woff");
+  }
+  @font-face {
+    /*
+      math-text has the following properties:
+      - typo/hhea/win metrics: 2.5em ascent and 2.5em descent.
+      - glyph A: .5em ascent and .5em descent.
+      - glyph B: 1em ascent and 0em descent.
+      - glyph C: 0em ascent and 1em descent.
+     */
+    font-family: math-text;
+    src: url("/fonts/math/math-text.woff");
+  }
+  #reference {
+    background: green;
+  }
+  #frame {
+    position: absolute;
+    border-top: 4px solid black;
+    border-bottom: 4px solid black;
+    width: 100%;
+  }
+</style>
+<script>
+  function runTests() {
+    var div = document.getElementById("frame");
+    var refBox = document.getElementById("reference").getBoundingClientRect();
+    div.style.top = `${refBox.top-2}px`;
+    div.style.height = `${refBox.height-4}px`;
+    document.documentElement.classList.remove('reftest-wait');
+  }
+  window.addEventListener("load", function() {
+    // Delay the check to workaround WebKit's bug https://webkit.org/b/174030.
+    requestAnimationFrame(() => { document.fonts.ready.then(runTests); });
+  });
+</script>
+</head>
+<body>
+  <p>
+    This test passes if the blue squares are aligned:
+  </p>
+  <p>
+    <math style="font-family: gapmin8000">
+      <!-- This is a dummy mspace element to ensure that the font ascent/descent does not affect the size of the math element. -->
+      <mspace height="10em" depth="10em"/>
+      <!--
+           The gap between the numerators/denominators and the math axis must StackGapMin / 2.
+           The gap should be calculated using the exact bounding box of the glyphs.
+           The numerator descent is .5em + the denominator ascent.
+           Hence glyphs A, B, C should be rendered at the same vertical position, even if they have different ascent/descent.
+        -->
+      <mfrac linethickness="0px">
+        <mspace width="3em" depth="1em"/>
+        <mspace id="reference" width="3em" height=".5em" depth=".5em"/>
+      </mfrac>
+      <mfrac linethickness="0px">
+        <mspace width="3em" depth="1em"/>
+        <mtext>A</mtext>
+      </mfrac>
+      <mfrac linethickness="0px">
+        <mspace width="3em" depth="1.5em"/>
+        <mtext>B</mtext>
+      </mfrac>
+      <mfrac linethickness="0px">
+        <mspace width="3em" depth=".5em"/>
+        <mtext>C</mtext>
+      </mfrac>
+    </math>
+  </p>
+  <div id="frame"></div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/tools/math-text.py b/third_party/blink/web_tests/external/wpt/mathml/tools/math-text.py
new file mode 100755
index 0000000..45b182c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mathml/tools/math-text.py
@@ -0,0 +1,65 @@
+#!/usr/bin/python
+
+from __future__ import print_function
+import fontforge
+
+font = fontforge.font()
+font.em = 1000
+lineHeight = 5000
+name = "math-text"
+font.fontname = name
+font.familyname = name
+font.fullname = name
+font.copyright = "Copyright (c) 2019 Igalia"
+
+glyph = font.createChar(ord(" "), "space")
+glyph.width = 1000
+glyph = font.createChar(ord("A"))
+pen = glyph.glyphPen()
+pen.moveTo(0, -500)
+pen.lineTo(0, 500)
+pen.lineTo(1000, 500)
+pen.lineTo(1000, -500)
+pen.closePath();
+
+glyph = font.createChar(ord("B"))
+pen = glyph.glyphPen()
+pen.moveTo(0, 0)
+pen.lineTo(0, 1000)
+pen.lineTo(1000, 1000)
+pen.lineTo(1000, 0)
+pen.closePath();
+
+glyph = font.createChar(ord("C"))
+pen = glyph.glyphPen()
+pen.moveTo(0, -1000)
+pen.lineTo(0, 0)
+pen.lineTo(1000, 0)
+pen.lineTo(1000, -1000)
+pen.closePath();
+
+font.os2_typoascent_add = False
+font.os2_typoascent = lineHeight / 2
+font.os2_typodescent_add = False
+font.os2_typodescent = -lineHeight / 2
+font.os2_typolinegap = 0
+font.hhea_ascent = lineHeight / 2
+font.hhea_ascent_add = False
+font.hhea_descent = -lineHeight / 2
+font.hhea_descent_add = False
+font.hhea_linegap = 0
+font.os2_winascent = lineHeight / 2
+font.os2_winascent_add = False
+font.os2_windescent = lineHeight / 2
+font.os2_windescent_add = False
+
+font.os2_use_typo_metrics = True
+
+path = "../../fonts/math/math-text.woff"
+print("Generating %s..." % path, end="")
+font.generate(path)
+if font.validate() == 0:
+    print(" done.")
+else:
+    print(" validation error!")
+    exit(1)
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.font.relative_size.html b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.font.relative_size.html
new file mode 100644
index 0000000..75ce105
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.font.relative_size.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>OffscreenCanvas test: 2d.text.font.relative_size</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+
+<h1>2d.text.font.relative_size</h1>
+<p class="desc"></p>
+
+
+<script>
+var t = async_test("");
+t.step(function() {
+
+var offscreenCanvas = new OffscreenCanvas(100, 50);
+var ctx = offscreenCanvas.getContext('2d');
+
+ctx.font = '1em sans-serif';
+_assertSame(ctx.font, '10px sans-serif', "ctx.font", "'10px sans-serif'");
+
+t.done();
+
+});
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.font.relative_size.worker.js b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.font.relative_size.worker.js
new file mode 100644
index 0000000..34836a1c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/text/2d.text.font.relative_size.worker.js
@@ -0,0 +1,21 @@
+// DO NOT EDIT! This test has been generated by tools/gentest.py.
+// OffscreenCanvas test in a worker:2d.text.font.relative_size
+// Description:
+// Note:
+
+importScripts("/resources/testharness.js");
+importScripts("/common/canvas-tests.js");
+
+var t = async_test("");
+t.step(function() {
+
+var offscreenCanvas = new OffscreenCanvas(100, 50);
+var ctx = offscreenCanvas.getContext('2d');
+
+ctx.font = '1em sans-serif';
+_assertSame(ctx.font, '10px sans-serif', "ctx.font", "'10px sans-serif'");
+
+t.done();
+
+});
+done();
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/tools/tests2d.yaml b/third_party/blink/web_tests/external/wpt/offscreen-canvas/tools/tests2d.yaml
index 0aaad783..4bdf32db 100644
--- a/third_party/blink/web_tests/external/wpt/offscreen-canvas/tools/tests2d.yaml
+++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/tools/tests2d.yaml
@@ -9338,7 +9338,12 @@
   code: |
     @assert ctx.font === '10px sans-serif';
 
-
+- name: 2d.text.font.relative_size
+  testing:
+    - 2d.text.font.relative_size
+  code: |
+    ctx.font = '1em sans-serif';
+    @assert ctx.font === '10px sans-serif';
 
 - name: 2d.text.align.valid
   testing:
diff --git a/third_party/blink/web_tests/external/wpt/svg/coordinate-systems/support/viewBox-scaling-text-001-ref.html b/third_party/blink/web_tests/external/wpt/svg/coordinate-systems/support/viewBox-scaling-text-001-ref.html
new file mode 100644
index 0000000..09321909
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/coordinate-systems/support/viewBox-scaling-text-001-ref.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<head>
+  <meta charset="utf-8">
+  <title>Reference case for text scaled via SVG viewBox</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    body { margin: 0; }
+    svg {
+      width: 100px;
+      height: 100px;
+      background: red;
+    }
+    rect {
+      fill: lime;
+    }
+  </style>
+</head>
+<body>
+  <svg>
+    <rect height="100%" width="100%"></rect>
+  </svg>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/svg/coordinate-systems/viewBox-scaling-text-001.html b/third_party/blink/web_tests/external/wpt/svg/coordinate-systems/viewBox-scaling-text-001.html
new file mode 100644
index 0000000..4250e4a2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/coordinate-systems/viewBox-scaling-text-001.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<head>
+  <meta charset="utf-8">
+  <title>Testcase for text scaled via SVG viewBox</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute">
+  <link rel="match" href="support/viewBox-scaling-text-001-ref.html">
+  <link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
+  <style>
+    body { margin: 0; }
+    svg {
+      width: 100px;
+      height: 100px;
+      background: red;
+    }
+    text {
+      fill: lime;
+      font: 1px/1 Ahem;
+    }
+  </style>
+</head>
+<body>
+  <!-- We position the <text> at y=0.8px, which is the alphabetic baseline for
+       the Ahem font. This puts the bottom of the rendered square glyph at
+       y=1px, i.e. the bottom of the SVG viewport. With that, the 1px-tall Ahem
+       square 'X' character should fully fill the SVG viewport (which is then
+       scaled up from 1x1 to 100x100). -->
+  <svg viewBox="0 0 1 1">
+    <text x="0" y="0.8">X̂̂̂̂̂̂</text>
+  </svg>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/tools/requirements_mypy.txt b/third_party/blink/web_tests/external/wpt/tools/requirements_mypy.txt
index 0e1568f1..8f1d67cd 100644
--- a/third_party/blink/web_tests/external/wpt/tools/requirements_mypy.txt
+++ b/third_party/blink/web_tests/external/wpt/tools/requirements_mypy.txt
@@ -1,3 +1,3 @@
-mypy==0.710
+mypy==0.711
 mypy-extensions==0.4.1
 typed-ast==1.4.0
diff --git a/third_party/blink/web_tests/fast/canvas/canvas-large-pattern-expected.html b/third_party/blink/web_tests/fast/canvas/canvas-large-pattern-expected.html
new file mode 100644
index 0000000..b426b69
--- /dev/null
+++ b/third_party/blink/web_tests/fast/canvas/canvas-large-pattern-expected.html
@@ -0,0 +1,17 @@
+<html><body>
+</body>
+<script>
+    var canvas = document.createElement('canvas');
+    canvas.width = 400;
+    var context = canvas.getContext('2d');
+    context.fillStyle = '#0f0';
+    context.fillRect(0, 0, 10, 10);
+
+    var dstCanvas = document.createElement('canvas');
+    var dstContext = dstCanvas.getContext('2d');
+    var pattern = dstContext.createPattern(canvas, 'repeat');
+    dstContext.fillStyle = pattern;
+    dstContext.fillRect(0, 0, dstCanvas.width, dstCanvas.height);
+    document.body.appendChild(dstCanvas);
+</script>
+</html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/canvas/canvas-large-pattern.html b/third_party/blink/web_tests/fast/canvas/canvas-large-pattern.html
index 3c78f4c..ae29801 100644
--- a/third_party/blink/web_tests/fast/canvas/canvas-large-pattern.html
+++ b/third_party/blink/web_tests/fast/canvas/canvas-large-pattern.html
@@ -1,24 +1,17 @@
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
+<html><body>
+</body>
 <script>
-
-test(function(t) {
     var canvas = document.createElement('canvas');
     canvas.width = 40000;
     var context = canvas.getContext('2d');
     context.fillStyle = '#0f0';
-    context.fillRect(0, 0, 1, 1);
+    context.fillRect(0, 0, 10, 10);
 
     var dstCanvas = document.createElement('canvas');
     var dstContext = dstCanvas.getContext('2d');
     var pattern = dstContext.createPattern(canvas, 'repeat');
     dstContext.fillStyle = pattern;
     dstContext.fillRect(0, 0, dstCanvas.width, dstCanvas.height);
-
-    assert_array_equals(dstContext.getImageData(0, 0, 1, 1).data, [0, 255, 0, 255]);
-
-    assert_array_equals(dstContext.getImageData(1, 0, 1, 1).data, [0, 0, 0, 0]);
-    assert_array_equals(dstContext.getImageData(0, 1, 1, 1).data, [0, 0, 0, 0]);
-
-}, 'Tests createPattern using a source image that is a canvas 40k pixels wide.');
+    document.body.appendChild(dstCanvas);
 </script>
+</html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/animations/rotate-transform-equivalent-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/animations/rotate-transform-equivalent-expected.png
new file mode 100644
index 0000000..a2b52d3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/animations/rotate-transform-equivalent-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/geometry/root-layer-update-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/geometry/root-layer-update-expected.png
new file mode 100644
index 0000000..cbd6684
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/geometry/root-layer-update-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/geometry/transfrom-origin-on-zero-size-layer-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/geometry/transfrom-origin-on-zero-size-layer-expected.png
new file mode 100644
index 0000000..e186ea19
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/geometry/transfrom-origin-on-zero-size-layer-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/reflections/compositing-change-inside-reflection-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/reflections/compositing-change-inside-reflection-expected.png
new file mode 100644
index 0000000..5cc9aa2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/reflections/compositing-change-inside-reflection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/reflections/reflection-positioning-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/reflections/reflection-positioning-expected.png
new file mode 100644
index 0000000..ca05e6a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/reflections/reflection-positioning-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/reflections/reflection-positioning2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/reflections/reflection-positioning2-expected.png
new file mode 100644
index 0000000..ede9a990
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/reflections/reflection-positioning2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/reflections/transform-inside-reflection-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/reflections/transform-inside-reflection-expected.png
new file mode 100644
index 0000000..a51968c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/reflections/transform-inside-reflection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/squashing/selection-repaint-with-gaps-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/squashing/selection-repaint-with-gaps-expected.png
new file mode 100644
index 0000000..a56b709
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/squashing/selection-repaint-with-gaps-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/squashing/selection-repaint-with-gaps-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/squashing/selection-repaint-with-gaps-expected.txt
new file mode 100644
index 0000000..05556e5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/squashing/selection-repaint-with-gaps-expected.txt
@@ -0,0 +1,131 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Squashing Containment Layer",
+      "drawsContent": false
+    },
+    {
+      "name": "LayoutBlockFlow DIV class='overlap'",
+      "bounds": [300, 500],
+      "drawsContent": false,
+      "transform": 1
+    },
+    {
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV class='item')",
+      "position": [15, 35],
+      "bounds": [100, 210],
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'ipsum'",
+          "rect": [0, 80, 40, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'lorem'",
+          "rect": [0, 80, 40, 39],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [8, 8, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Squashing Containment Layer",
+      "drawsContent": false
+    },
+    {
+      "name": "LayoutBlockFlow DIV class='overlap'",
+      "bounds": [300, 500],
+      "drawsContent": false,
+      "transform": 1
+    },
+    {
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV class='item')",
+      "position": [15, 35],
+      "bounds": [100, 210],
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'ipsum'",
+          "rect": [0, 80, 42, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'lorem'",
+          "rect": [0, 80, 42, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'ipsum'",
+          "rect": [0, 160, 40, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'lorem'",
+          "rect": [0, 160, 40, 39],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [8, 8, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/squashing/squash-transform-repainting-child-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/squashing/squash-transform-repainting-child-expected.txt
new file mode 100644
index 0000000..de990efa
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/squashing/squash-transform-repainting-child-expected.txt
@@ -0,0 +1,172 @@
+CASE 1, original layer tree
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Squashing Containment Layer",
+      "drawsContent": false
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV class='composited box behind'",
+      "bounds": [100, 100],
+      "contentsOpaque": true,
+      "backgroundColor": "#0000FF",
+      "transform": 1
+    },
+    {
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV class='box middle')",
+      "position": [-1, -1],
+      "bounds": [281, 281]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [100, 100, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
+CASE 2, hovering over the outer div
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Squashing Containment Layer",
+      "drawsContent": false
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV class='composited box behind'",
+      "bounds": [100, 100],
+      "contentsOpaque": true,
+      "backgroundColor": "#0000FF",
+      "transform": 1
+    },
+    {
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV class='box middle')",
+      "position": [-1, -1],
+      "bounds": [281, 281],
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV class='box middle'",
+          "rect": [0, 0, 142, 142],
+          "reason": "background"
+        }
+      ]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [100, 100, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
+CASE 3, hovering over the inner div
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Squashing Containment Layer",
+      "drawsContent": false
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV class='composited box behind'",
+      "bounds": [100, 100],
+      "contentsOpaque": true,
+      "backgroundColor": "#0000FF",
+      "transform": 1
+    },
+    {
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV class='box middle')",
+      "position": [-1, -1],
+      "bounds": [281, 281],
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV class='box middle'",
+          "rect": [0, 0, 142, 142],
+          "reason": "background"
+        },
+        {
+          "object": "LayoutBlockFlow (positioned) DIV class='smallbox'",
+          "rect": [32, 32, 71, 71],
+          "reason": "background"
+        }
+      ]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [100, 100, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/squashing/squash-transform-repainting-transformed-child-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/squashing/squash-transform-repainting-transformed-child-expected.txt
new file mode 100644
index 0000000..d5d4c994
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/compositing/squashing/squash-transform-repainting-transformed-child-expected.txt
@@ -0,0 +1,172 @@
+CASE 1, original layer tree
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Squashing Containment Layer",
+      "drawsContent": false
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV class='composited box behind'",
+      "bounds": [100, 100],
+      "contentsOpaque": true,
+      "backgroundColor": "#0000FF",
+      "transform": 1
+    },
+    {
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV class='box middle')",
+      "position": [4, 4],
+      "bounds": [276, 276]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [100, 100, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
+CASE 2, hovering over the outer div
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Squashing Containment Layer",
+      "drawsContent": false
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV class='composited box behind'",
+      "bounds": [100, 100],
+      "contentsOpaque": true,
+      "backgroundColor": "#0000FF",
+      "transform": 1
+    },
+    {
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV class='box middle')",
+      "position": [4, 4],
+      "bounds": [276, 276],
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV class='box middle'",
+          "rect": [0, 0, 132, 132],
+          "reason": "background"
+        }
+      ]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [100, 100, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
+CASE 3, hovering over the inner div
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Squashing Containment Layer",
+      "drawsContent": false
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV class='composited box behind'",
+      "bounds": [100, 100],
+      "contentsOpaque": true,
+      "backgroundColor": "#0000FF",
+      "transform": 1
+    },
+    {
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV class='box middle')",
+      "position": [4, 4],
+      "bounds": [276, 276],
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV class='box middle'",
+          "rect": [0, 0, 132, 132],
+          "reason": "background"
+        },
+        {
+          "object": "LayoutBlockFlow (positioned) DIV class='smallbox'",
+          "rect": [26, 28, 71, 72],
+          "reason": "background"
+        }
+      ]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [100, 100, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/box_properties/acid_test-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/box_properties/acid_test-expected.png
new file mode 100644
index 0000000..9bc8487
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/box_properties/acid_test-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/box_properties/float_elements_in_series-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/box_properties/float_elements_in_series-expected.png
new file mode 100644
index 0000000..e84b1759
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/box_properties/float_elements_in_series-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/box_properties/float_on_text_elements-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/box_properties/float_on_text_elements-expected.png
new file mode 100644
index 0000000..f5c4c2d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/box_properties/float_on_text_elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/classification/display-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/classification/display-expected.png
new file mode 100644
index 0000000..24b9ad0b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/classification/display-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/classification/list_style-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/classification/list_style-expected.png
new file mode 100644
index 0000000..f146b31
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/classification/list_style-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/color_and_background/background_attachment-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/color_and_background/background_attachment-expected.png
new file mode 100644
index 0000000..c8d34d8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/color_and_background/background_attachment-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/formatting_model/canvas-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/formatting_model/canvas-expected.png
new file mode 100644
index 0000000..7d3112854
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/formatting_model/canvas-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/formatting_model/height_of_lines-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/formatting_model/height_of_lines-expected.png
new file mode 100644
index 0000000..6217520
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/formatting_model/height_of_lines-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/formatting_model/inline_elements-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/formatting_model/inline_elements-expected.png
new file mode 100644
index 0000000..8e461861
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/formatting_model/inline_elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/pseudo/anchor-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/pseudo/anchor-expected.png
new file mode 100644
index 0000000..f823756
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/pseudo/anchor-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/text_properties/text_transform-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/text_properties/text_transform-expected.png
new file mode 100644
index 0000000..5f0b0a7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/text_properties/text_transform-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/units/urls-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/units/urls-expected.png
new file mode 100644
index 0000000..ee5b67f1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css1/units/urls-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/20110323/c543-txt-decor-000-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/20110323/c543-txt-decor-000-expected.png
new file mode 100644
index 0000000..ade9309e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/20110323/c543-txt-decor-000-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/20110323/table-height-algorithm-023-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/20110323/table-height-algorithm-023-expected.png
new file mode 100644
index 0000000..162ec53e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/20110323/table-height-algorithm-023-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/20110323/table-height-algorithm-024-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/20110323/table-height-algorithm-024-expected.png
new file mode 100644
index 0000000..162ec53e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/20110323/table-height-algorithm-024-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t051103-dom-hover-01-c-io-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t051103-dom-hover-01-c-io-expected.png
new file mode 100644
index 0000000..1d8298f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t051103-dom-hover-01-c-io-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t051103-dom-hover-02-c-io-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t051103-dom-hover-02-c-io-expected.png
new file mode 100644
index 0000000..e4a15d0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t051103-dom-hover-02-c-io-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0805-c5516-brdr-c-00-a-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0805-c5516-brdr-c-00-a-expected.png
new file mode 100644
index 0000000..74ec001
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0805-c5516-brdr-c-00-a-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0805-c5516-ibrdr-c-00-a-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0805-c5516-ibrdr-c-00-a-expected.png
new file mode 100644
index 0000000..2d29e77
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0805-c5516-ibrdr-c-00-a-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t09-c5526c-display-00-e-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t09-c5526c-display-00-e-expected.png
new file mode 100644
index 0000000..560313df
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t09-c5526c-display-00-e-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0905-c414-flt-02-c-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0905-c414-flt-02-c-expected.png
new file mode 100644
index 0000000..89469e1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0905-c414-flt-02-c-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0905-c414-flt-03-c-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0905-c414-flt-03-c-expected.png
new file mode 100644
index 0000000..db6237e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0905-c414-flt-03-c-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0905-c414-flt-04-c-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0905-c414-flt-04-c-expected.png
new file mode 100644
index 0000000..025bad1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0905-c414-flt-04-c-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0905-c414-flt-wrap-01-d-g-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0905-c414-flt-wrap-01-d-g-expected.png
new file mode 100644
index 0000000..9507f7677
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0905-c414-flt-wrap-01-d-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0905-c5525-fltcont-00-d-g-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0905-c5525-fltcont-00-d-g-expected.png
new file mode 100644
index 0000000..2fb8e3bc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0905-c5525-fltcont-00-d-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0905-c5525-fltwidth-00-c-g-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0905-c5525-fltwidth-00-c-g-expected.png
new file mode 100644
index 0000000..5a323eae
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0905-c5525-fltwidth-00-c-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0905-c5525-fltwrap-00-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0905-c5525-fltwrap-00-b-expected.png
new file mode 100644
index 0000000..f5bd522e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t0905-c5525-fltwrap-00-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t100801-c544-valgn-00-a-ag-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t100801-c544-valgn-00-a-ag-expected.png
new file mode 100644
index 0000000..f872046
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t100801-c544-valgn-00-a-ag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t100801-c544-valgn-03-d-agi-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t100801-c544-valgn-03-d-agi-expected.png
new file mode 100644
index 0000000..cfd03cdbd
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t100801-c544-valgn-03-d-agi-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1202-counter-08-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1202-counter-08-b-expected.png
new file mode 100644
index 0000000..0ef2d45
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1202-counter-08-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1202-counter-13-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1202-counter-13-b-expected.png
new file mode 100644
index 0000000..37dc7f7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1202-counter-13-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1202-counter-14-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1202-counter-14-b-expected.png
new file mode 100644
index 0000000..37dc7f7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1202-counter-14-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1202-counters-08-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1202-counters-08-b-expected.png
new file mode 100644
index 0000000..875c9822
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1202-counters-08-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1202-counters-13-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1202-counters-13-b-expected.png
new file mode 100644
index 0000000..e2c1fc7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1202-counters-13-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1202-counters-14-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1202-counters-14-b-expected.png
new file mode 100644
index 0000000..e2c1fc7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1202-counters-14-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1204-order-01-d-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1204-order-01-d-expected.png
new file mode 100644
index 0000000..35daf02
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1204-order-01-d-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t120401-scope-00-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t120401-scope-00-b-expected.png
new file mode 100644
index 0000000..496ca3a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t120401-scope-00-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1402-c45-bg-canvas-00-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1402-c45-bg-canvas-00-b-expected.png
new file mode 100644
index 0000000..55a0681f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1402-c45-bg-canvas-00-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t140201-c535-bg-fixd-00-b-g-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t140201-c535-bg-fixd-00-b-g-expected.png
new file mode 100644
index 0000000..c7b14427
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t140201-c535-bg-fixd-00-b-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t140201-c537-bgfxps-00-c-ag-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t140201-c537-bgfxps-00-c-ag-expected.png
new file mode 100644
index 0000000..e54cf2f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t140201-c537-bgfxps-00-c-ag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1602-c546-txt-align-00-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1602-c546-txt-align-00-b-expected.png
new file mode 100644
index 0000000..4cd901ee
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css2.1/t1602-c546-txt-align-00-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/flexbox/flexbox-baseline-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/flexbox/flexbox-baseline-expected.png
new file mode 100644
index 0000000..1877957
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/flexbox/flexbox-baseline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/masking/clip-path-inset-corners-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/masking/clip-path-inset-corners-expected.png
new file mode 100644
index 0000000..0d0df664
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/masking/clip-path-inset-corners-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-41-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-41-expected.png
new file mode 100644
index 0000000..761e3a3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-41-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-41a-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-41a-expected.png
new file mode 100644
index 0000000..761e3a3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/html/css3-modsel-41a-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-3-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-3-expected.png
new file mode 100644
index 0000000..930bbdb
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-41-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-41-expected.png
new file mode 100644
index 0000000..761e3a3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-41-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-41a-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-41a-expected.png
new file mode 100644
index 0000000..761e3a3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/xhtml/css3-modsel-41a-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-3-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-3-expected.png
new file mode 100644
index 0000000..3fa7bf6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-41-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-41-expected.png
new file mode 100644
index 0000000..d6cba76
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-41-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-41a-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-41a-expected.png
new file mode 100644
index 0000000..d6cba76
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/css3/selectors3/xml/css3-modsel-41a-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/execCommand/findString-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/execCommand/findString-2-expected.png
new file mode 100644
index 0000000..2bfa92e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/execCommand/findString-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/input/linux_rtl_composition_underline-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/input/linux_rtl_composition_underline-expected.png
new file mode 100644
index 0000000..ad93b28
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/input/linux_rtl_composition_underline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/pasteboard/copy-paste-white-space-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/pasteboard/copy-paste-white-space-expected.txt
new file mode 100644
index 0000000..5c68294
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/pasteboard/copy-paste-white-space-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+PASS pre
+PASS pre-wrap
+PASS normal
+PASS nowrap
+FAIL pre-line assert_equals: expected "\nTesting\nCSS white-space property\n" but got "\nTesting \nCSS white-space property\n"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/4402375-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/4402375-expected.png
new file mode 100644
index 0000000..05255e8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/4402375-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/4402375-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/4402375-expected.txt
new file mode 100644
index 0000000..25fb92f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/4402375-expected.txt
@@ -0,0 +1,28 @@
+EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  LayoutBlockFlow {HTML} at (0,0) size 800x600
+    LayoutBlockFlow {BODY} at (8,8) size 784x584
+      LayoutBlockFlow {P} at (0,0) size 784x40
+        LayoutText {#text} at (0,0) size 131x19
+          text run at (0,0) width 131: "This is a testcase for "
+        LayoutInline {A} at (131,0) size 149x19 [color=#0000EE]
+          LayoutText {#text} at (131,0) size 149x19
+            text run at (131,0) width 149: "rdar://problem/4402375"
+        LayoutText {#text} at (0,0) size 761x39
+          text run at (280,0) width 481: " \"REGRESSION (417.8-TOT): finding text sometimes also selects previous"
+          text run at (0,20) width 137: "image (5127) (6451)\""
+      LayoutBlockFlow {P} at (0,74) size 784x40
+        LayoutText {#text} at (0,0) size 743x39
+          text run at (0,0) width 413: "This test uses a right aligned image next to some left aligned text. "
+          text run at (413,0) width 330: "The image should not be selected, and should not be"
+          text run at (0,20) width 598: "included in the selection rect (you won't see the selection rect when you run this test manually)."
+      LayoutBlockFlow {DIV} at (0,130) size 784x20
+        LayoutImage (floating) {IMG} at (708,0) size 76x103
+        LayoutText {#text} at (0,0) size 178x19
+          text run at (0,0) width 178: "This text should be selected."
+layer at (8,64) size 784x2 clip at (0,0) size 0x0
+  LayoutBlockFlow {HR} at (0,56) size 784x2 [border: (1px inset #EEEEEE)]
+selection start: position 0 of child 1 {#text} of child 6 {DIV} of body
+selection end:   position 29 of child 1 {#text} of child 6 {DIV} of body
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/display-table-text-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/display-table-text-expected.png
new file mode 100644
index 0000000..f020fc8f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/display-table-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-expected.png
new file mode 100644
index 0000000..209ec80
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png
new file mode 100644
index 0000000..3f570f6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-expected.png
new file mode 100644
index 0000000..3cc87e0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-mixed-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-mixed-expected.png
new file mode 100644
index 0000000..f5d61516
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-mixed-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/drag-to-contenteditable-iframe-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/drag-to-contenteditable-iframe-expected.txt
new file mode 100644
index 0000000..55f7a55
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/drag-to-contenteditable-iframe-expected.txt
@@ -0,0 +1,27 @@
+EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
+EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
+EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  LayoutBlockFlow {HTML} at (0,0) size 800x600
+    LayoutBlockFlow {BODY} at (0,0) size 800x584
+      LayoutBlockFlow (anonymous) at (0,0) size 800x213
+        LayoutText {#text} at (208,193) size 4x19
+          text run at (208,193) width 4: " "
+        LayoutImage {IMG} at (212,105) size 76x103
+        LayoutText {#text} at (0,0) size 0x0
+      LayoutBlockFlow {UL} at (0,229) size 800x20
+        LayoutListItem {LI} at (40,0) size 760x20
+          LayoutListMarker (anonymous) at (-18,0) size 7x19: bullet
+          LayoutText {#text} at (0,0) size 288x19
+            text run at (0,0) width 288: "Abe should be outside the frame and inside it."
+layer at (0,0) size 208x208
+  LayoutIFrame {IFRAME} at (0,0) size 208x208 [border: (4px solid #000000)]
+    layer at (0,0) size 200x200
+      LayoutView at (0,0) size 200x200
+    layer at (0,0) size 200x200
+      LayoutBlockFlow {HTML} at (0,0) size 200x200
+        LayoutBlockFlow {BODY} at (8,8) size 184x184 [bgcolor=#FFFFE0]
+          LayoutImage {IMG} at (0,0) size 76x103
+          LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/inline-closest-leaf-child-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/inline-closest-leaf-child-expected.png
new file mode 100644
index 0000000..6066b60b9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/inline-closest-leaf-child-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/japanese-lr-selection-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/japanese-lr-selection-expected.png
new file mode 100644
index 0000000..5e42adbd6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/japanese-lr-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/japanese-rl-selection-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/japanese-rl-selection-expected.png
new file mode 100644
index 0000000..9490ba5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/japanese-rl-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/line-wrap-1-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/line-wrap-1-expected.png
new file mode 100644
index 0000000..128f8b1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/line-wrap-1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/line-wrap-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/line-wrap-2-expected.png
new file mode 100644
index 0000000..e942d4b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/line-wrap-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/linux_selection_color-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/linux_selection_color-expected.png
new file mode 100644
index 0000000..be4c159b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/linux_selection_color-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/range-between-block-and-inline-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/range-between-block-and-inline-expected.png
new file mode 100644
index 0000000..d5da289
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/range-between-block-and-inline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/select-text-overflow-ellipsis-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/select-text-overflow-ellipsis-expected.png
new file mode 100644
index 0000000..a974a9b7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/select-text-overflow-ellipsis-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-2-expected.png
new file mode 100644
index 0000000..cebec406
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-expected.png
new file mode 100644
index 0000000..c59d0e1f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/select-text-overflow-ellipsis-mixed-in-ltr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-2-expected.png
new file mode 100644
index 0000000..aae7d4a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png
new file mode 100644
index 0000000..189102ba
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/selectNode-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/selectNode-expected.txt
new file mode 100644
index 0000000..c957e32
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/selectNode-expected.txt
@@ -0,0 +1,25 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  LayoutBlockFlow {HTML} at (0,0) size 800x600
+    LayoutBlockFlow {BODY} at (8,8) size 784x576
+      LayoutBlockFlow {P} at (0,0) size 784x20
+        LayoutText {#text} at (0,0) size 336x19
+          text run at (0,0) width 336: "This tests Range.selectNode() of a text node and a br."
+      LayoutBlockFlow {DIV} at (0,36) size 784x20
+        LayoutText {#text} at (0,0) size 23x19
+          text run at (0,0) width 23: "one"
+      LayoutBlockFlow {DIV} at (0,56) size 784x40
+        LayoutText {#text} at (0,0) size 24x19
+          text run at (0,0) width 24: "two"
+        LayoutBR {BR} at (24,15) size 0x0
+        LayoutText {#text} at (0,20) size 31x19
+          text run at (0,20) width 31: "three"
+      LayoutBlockFlow {DIV} at (0,96) size 784x20
+        LayoutText {#text} at (0,0) size 26x19
+          text run at (0,0) width 26: "four"
+      LayoutBlockFlow {UL} at (0,132) size 784x20
+        LayoutListItem {LI} at (40,0) size 744x20
+          LayoutListMarker (anonymous) at (-18,0) size 7x19: bullet
+          LayoutText {#text} at (0,0) size 54x19
+            text run at (0,0) width 54: "Success."
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/selectNodeContents-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/selectNodeContents-expected.txt
new file mode 100644
index 0000000..4c130f0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/selectNodeContents-expected.txt
@@ -0,0 +1,25 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  LayoutBlockFlow {HTML} at (0,0) size 800x600
+    LayoutBlockFlow {BODY} at (8,8) size 784x576
+      LayoutBlockFlow {P} at (0,0) size 784x20
+        LayoutText {#text} at (0,0) size 392x19
+          text run at (0,0) width 392: "This tests Range.selectNodeContents() of a text node and a br."
+      LayoutBlockFlow {DIV} at (0,36) size 784x20
+        LayoutText {#text} at (0,0) size 23x19
+          text run at (0,0) width 23: "one"
+      LayoutBlockFlow {DIV} at (0,56) size 784x40
+        LayoutText {#text} at (0,0) size 24x19
+          text run at (0,0) width 24: "two"
+        LayoutBR {BR} at (24,15) size 0x0
+        LayoutText {#text} at (0,20) size 31x19
+          text run at (0,20) width 31: "three"
+      LayoutBlockFlow {DIV} at (0,96) size 784x20
+        LayoutText {#text} at (0,0) size 26x19
+          text run at (0,0) width 26: "four"
+      LayoutBlockFlow {UL} at (0,132) size 784x20
+        LayoutListItem {LI} at (40,0) size 744x20
+          LayoutListMarker (anonymous) at (-18,0) size 7x19: bullet
+          LayoutText {#text} at (0,0) size 54x19
+            text run at (0,0) width 54: "Success."
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/selection-background-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/selection-background-expected.png
new file mode 100644
index 0000000..89db1987
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/selection-background-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/selection-button-text-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/selection-button-text-expected.png
new file mode 100644
index 0000000..0f6b61a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/selection-button-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/transformed-selection-rects-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/transformed-selection-rects-expected.png
new file mode 100644
index 0000000..5d9d71c8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/transformed-selection-rects-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/vertical-lr-replaced-selection-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/vertical-lr-replaced-selection-expected.png
new file mode 100644
index 0000000..9ee8d4d9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/vertical-lr-replaced-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/vertical-rl-replaced-selection-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/vertical-rl-replaced-selection-expected.png
new file mode 100644
index 0000000..300266f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/editing/selection/vertical-rl-replaced-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/floats-clear/no-clearance-adjoining-opposite-float-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/floats-clear/no-clearance-adjoining-opposite-float-expected.png
new file mode 100644
index 0000000..5269d946
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/floats-clear/no-clearance-adjoining-opposite-float-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/floats-clear/no-clearance-due-to-large-margin-after-left-right-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/floats-clear/no-clearance-due-to-large-margin-after-left-right-expected.png
new file mode 100644
index 0000000..62750f9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/floats-clear/no-clearance-due-to-large-margin-after-left-right-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/floats/float-nowrap-3-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/floats/float-nowrap-3-expected.png
new file mode 100644
index 0000000..ac55025
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/floats/float-nowrap-3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/floats/floats-line-wrap-shifted-001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/floats/floats-line-wrap-shifted-001-expected.png
new file mode 100644
index 0000000..fe67e21
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/floats/floats-line-wrap-shifted-001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/floats/overhanging-float-paint-order-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/floats/overhanging-float-paint-order-expected.png
new file mode 100644
index 0000000..5fd2e2b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/floats/overhanging-float-paint-order-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/linebox/anonymous-inline-inherit-001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/linebox/anonymous-inline-inherit-001-expected.png
new file mode 100644
index 0000000..df3c1b5d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/linebox/anonymous-inline-inherit-001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/block-in-inline-empty-001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/block-in-inline-empty-001-expected.png
new file mode 100644
index 0000000..c70cd3d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/block-in-inline-empty-001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/block-in-inline-empty-004-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/block-in-inline-empty-004-expected.png
new file mode 100644
index 0000000..e24e9ccb
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/block-in-inline-empty-004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/block-in-inline-insert-001e-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/block-in-inline-insert-001e-expected.png
new file mode 100644
index 0000000..6be377de
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/block-in-inline-insert-001e-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/block-in-inline-insert-001h-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/block-in-inline-insert-001h-expected.png
new file mode 100644
index 0000000..3aabcbc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/block-in-inline-insert-001h-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/block-in-inline-insert-002e-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/block-in-inline-insert-002e-expected.png
new file mode 100644
index 0000000..93407ad
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/block-in-inline-insert-002e-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/block-in-inline-nested-002-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/block-in-inline-nested-002-expected.png
new file mode 100644
index 0000000..b8cd592
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/block-in-inline-nested-002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/block-in-inline-remove-006-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/block-in-inline-remove-006-expected.png
new file mode 100644
index 0000000..a9ed8b77
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/block-in-inline-remove-006-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/max-height-separates-margin-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/max-height-separates-margin-expected.png
new file mode 100644
index 0000000..89f5e2e8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/max-height-separates-margin-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/min-height-separates-margin-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/min-height-separates-margin-expected.png
new file mode 100644
index 0000000..e3fc6b59
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/normal-flow/min-height-separates-margin-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/text/white-space-mixed-003-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/text/white-space-mixed-003-expected.png
new file mode 100644
index 0000000..58f3e37
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/CSS2/text/white-space-mixed-003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-break/hit-test-inline-fragmentation-with-border-radius-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-break/hit-test-inline-fragmentation-with-border-radius-expected.txt
new file mode 100644
index 0000000..88899d5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-break/hit-test-inline-fragmentation-with-border-radius-expected.txt
@@ -0,0 +1,52 @@
+This is a testharness.js-based test.
+PASS Horizontal line 1, hit test outside top-left rounded corner
+PASS Horizontal line 1, hit test inside top-left rounded corner
+PASS Horizontal line 1, hit test outside bottom-left rounded corner
+PASS Horizontal line 1, hit test inside bottom-left rounded corner
+PASS Horizontal line 1, hit test inside top-right right-angled corner
+PASS Horizontal line 1, hit test inside bottom-right right-angled corner
+PASS Horizontal line 2, hit test outside top-right rounded corner
+PASS Horizontal line 2, hit test inside top-right rounded corner
+PASS Horizontal line 2, hit test outside bottom-right rounded corner
+PASS Horizontal line 2, hit test inside bottom-right rounded corner
+PASS Horizontal line 2, hit test inside top-left right-angled corner
+PASS Horizontal line 2, hit test inside bottom-left right-angled corner
+PASS Vertical LR line 1, hit test outside top-left rounded corner
+PASS Vertical LR line 1, hit test inside top-left rounded corner
+PASS Vertical LR line 1, hit test outside top-right rounded corner
+PASS Vertical LR line 1, hit test inside top-right rounded corner
+FAIL Vertical LR line 1, hit test inside bottom-left right-angled corner assert_equals: expected Element node <span id="vertical-lr" class="round">FOO<br>BAR</span> but got Element node <div style="writing-mode:vertical-lr">
+<span id="vertical...
+FAIL Vertical LR line 1, hit test inside bottom-right right-angled corner assert_equals: expected Element node <span id="vertical-lr" class="round">FOO<br>BAR</span> but got Element node <div style="writing-mode:vertical-lr">
+<span id="vertical...
+PASS Vertical LR line 2, hit test outside bottom-left rounded corner
+FAIL Vertical LR line 2, hit test inside bottom-left rounded corner assert_equals: expected Element node <span id="vertical-lr" class="round">FOO<br>BAR</span> but got Element node <div style="writing-mode:vertical-lr">
+<span id="vertical...
+PASS Vertical LR line 2, hit test outside bottom-right rounded corner
+FAIL Vertical LR line 2, hit test inside bottom-right rounded corner assert_equals: expected Element node <span id="vertical-lr" class="round">FOO<br>BAR</span> but got Element node <div style="writing-mode:vertical-lr">
+<span id="vertical...
+FAIL Vertical LR line 2, hit test inside top-left right-angled corner assert_equals: expected Element node <span id="vertical-lr" class="round">FOO<br>BAR</span> but got Element node <div style="writing-mode:vertical-lr">
+<span id="vertical...
+FAIL Vertical LR line 2, hit test inside top-right right-angled corner assert_equals: expected Element node <span id="vertical-lr" class="round">FOO<br>BAR</span> but got Element node <div style="writing-mode:vertical-lr">
+<span id="vertical...
+PASS Vertical RL line 1, hit test outside top-left rounded corner
+PASS Vertical RL line 1, hit test inside top-left rounded corner
+PASS Vertical RL line 1, hit test outside top-right rounded corner
+FAIL Vertical RL line 1, hit test inside top-right rounded corner assert_equals: expected Element node <span id="vertical-rl" class="round">FOO<br>BAR</span> but got Element node <div style="writing-mode:vertical-rl">
+<span id="vertical...
+FAIL Vertical RL line 1, hit test inside bottom-left right-angled corner assert_equals: expected Element node <span id="vertical-rl" class="round">FOO<br>BAR</span> but got Element node <div style="writing-mode:vertical-rl">
+<span id="vertical...
+FAIL Vertical RL line 1, hit test inside bottom-right right-angled corner assert_equals: expected Element node <span id="vertical-rl" class="round">FOO<br>BAR</span> but got Element node <div style="writing-mode:vertical-rl">
+<span id="vertical...
+PASS Vertical RL line 2, hit test outside bottom-left rounded corner
+FAIL Vertical RL line 2, hit test inside bottom-left rounded corner assert_equals: expected Element node <span id="vertical-rl" class="round">FOO<br>BAR</span> but got Element node <div style="writing-mode:vertical-rl">
+<span id="vertical...
+PASS Vertical RL line 2, hit test outside bottom-right rounded corner
+FAIL Vertical RL line 2, hit test inside bottom-right rounded corner assert_equals: expected Element node <span id="vertical-rl" class="round">FOO<br>BAR</span> but got Element node <div style="writing-mode:vertical-rl">
+<span id="vertical...
+FAIL Vertical RL line 2, hit test inside top-left right-angled corner assert_equals: expected Element node <span id="vertical-rl" class="round">FOO<br>BAR</span> but got Element node <div style="writing-mode:vertical-rl">
+<span id="vertical...
+FAIL Vertical RL line 2, hit test inside top-right right-angled corner assert_equals: expected Element node <span id="vertical-rl" class="round">FOO<br>BAR</span> but got Element node <div style="writing-mode:vertical-rl">
+<span id="vertical...
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-fonts/font-features-across-space-1-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-fonts/font-features-across-space-1-expected.png
new file mode 100644
index 0000000..dc34109
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-fonts/font-features-across-space-1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-fonts/font-features-across-space-3-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-fonts/font-features-across-space-3-expected.png
new file mode 100644
index 0000000..dc34109
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-fonts/font-features-across-space-3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-001-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-001-expected.txt
new file mode 100644
index 0000000..2694dc2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-001-expected.txt
@@ -0,0 +1,304 @@
+This is a testharness.js-based test.
+Found 100 tests; 0 PASS, 100 FAIL, 0 TIMEOUT, 0 NOTRUN.
+FAIL .grid 1 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / auto / 1 / 1; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / auto / 1 / 1; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 2 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / auto / 2 / 1; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / auto / 2 / 1; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 3 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / auto / 3 / 1; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / auto / 3 / 1; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 4 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / auto / auto / 1; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / auto / auto / 1; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 5 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / auto / 2 / 1; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / auto / 2 / 1; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 6 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / auto / 3 / 1; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / auto / 3 / 1; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 7 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / auto / auto / 1; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / auto / auto / 1; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 8 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 2 / auto / 3 / 1; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 2 / auto / 3 / 1; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 9 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 2 / auto / auto / 1; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 2 / auto / auto / 1; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 10 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 3 / auto / auto / 1; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 3 / auto / auto / 1; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 11 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / auto / 1 / 2; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / auto / 1 / 2; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 12 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / auto / 2 / 2; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / auto / 2 / 2; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 13 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / auto / 3 / 2; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / auto / 3 / 2; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 14 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / auto / auto / 2; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / auto / auto / 2; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 15 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / auto / 2 / 2; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / auto / 2 / 2; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 16 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / auto / 3 / 2; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / auto / 3 / 2; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 17 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / auto / auto / 2; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / auto / auto / 2; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 18 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 2 / auto / 3 / 2; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 2 / auto / 3 / 2; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 19 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 2 / auto / auto / 2; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 2 / auto / auto / 2; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 20 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 3 / auto / auto / 2; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 3 / auto / auto / 2; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 21 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / auto / 1 / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / auto / 1 / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 22 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / auto / 2 / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / auto / 2 / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 23 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / auto / 3 / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / auto / 3 / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 24 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / auto / auto / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / auto / auto / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 25 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / auto / 2 / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / auto / 2 / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 26 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / auto / 3 / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / auto / 3 / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 27 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / auto / auto / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / auto / auto / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 28 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 2 / auto / 3 / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 2 / auto / 3 / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 29 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 2 / auto / auto / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 2 / auto / auto / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 30 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 3 / auto / auto / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 3 / auto / auto / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 31 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / auto / 1 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / auto / 1 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 32 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / auto / 2 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / auto / 2 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 33 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / auto / 3 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / auto / 3 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 34 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / auto / auto / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / auto / auto / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 35 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / auto / 2 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / auto / 2 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 36 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / auto / 3 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / auto / 3 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 37 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / auto / auto / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / auto / auto / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 38 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 2 / auto / 3 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 2 / auto / 3 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 39 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 2 / auto / auto / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 2 / auto / auto / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 40 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 3 / auto / auto / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 3 / auto / auto / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 41 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 1 / 1 / 2; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 1 / 1 / 2; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 42 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 1 / 2 / 2; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 1 / 2 / 2; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 43 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 1 / 3 / 2; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 1 / 3 / 2; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 44 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 1 / auto / 2; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 1 / auto / 2; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 45 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / 1 / 2 / 2; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / 1 / 2 / 2; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 46 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / 1 / 3 / 2; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / 1 / 3 / 2; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 47 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / 1 / auto / 2; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / 1 / auto / 2; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 48 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 2 / 1 / 3 / 2; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 2 / 1 / 3 / 2; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 49 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 2 / 1 / auto / 2; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 2 / 1 / auto / 2; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 50 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 3 / 1 / auto / 2; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 3 / 1 / auto / 2; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 51 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 1 / 1 / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 1 / 1 / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 52 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 1 / 2 / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 1 / 2 / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 53 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 1 / 3 / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 1 / 3 / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 54 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 1 / auto / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 1 / auto / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 55 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / 1 / 2 / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / 1 / 2 / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 56 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / 1 / 3 / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / 1 / 3 / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 57 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / 1 / auto / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / 1 / auto / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 58 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 2 / 1 / 3 / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 2 / 1 / 3 / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 59 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 2 / 1 / auto / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 2 / 1 / auto / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 60 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 3 / 1 / auto / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 3 / 1 / auto / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 61 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 1 / 1 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 1 / 1 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 62 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 1 / 2 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 1 / 2 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 63 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 1 / 3 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 1 / 3 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 64 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 1 / auto / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 1 / auto / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 65 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / 1 / 2 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / 1 / 2 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 66 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / 1 / 3 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / 1 / 3 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 67 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / 1 / auto / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / 1 / auto / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 68 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 2 / 1 / 3 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 2 / 1 / 3 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 69 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 2 / 1 / auto / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 2 / 1 / auto / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 70 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 3 / 1 / auto / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 3 / 1 / auto / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 71 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 2 / 1 / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 2 / 1 / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 72 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 2 / 2 / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 2 / 2 / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 73 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 2 / 3 / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 2 / 3 / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 74 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 2 / auto / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 2 / auto / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 75 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / 2 / 2 / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / 2 / 2 / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 76 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / 2 / 3 / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / 2 / 3 / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 77 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / 2 / auto / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / 2 / auto / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 78 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 2 / 2 / 3 / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 2 / 2 / 3 / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 79 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 2 / 2 / auto / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 2 / 2 / auto / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 80 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 3 / 2 / auto / 3; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 3 / 2 / auto / 3; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 81 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 2 / 1 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 2 / 1 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 82 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 2 / 2 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 2 / 2 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 83 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 2 / 3 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 2 / 3 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 84 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 2 / auto / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 2 / auto / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 85 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / 2 / 2 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / 2 / 2 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 86 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / 2 / 3 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / 2 / 3 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 87 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / 2 / auto / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / 2 / auto / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 88 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 2 / 2 / 3 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 2 / 2 / 3 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 89 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 2 / 2 / auto / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 2 / 2 / auto / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 90 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 3 / 2 / auto / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 3 / 2 / auto / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 91 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 3 / 1 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 3 / 1 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 92 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 3 / 2 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 3 / 2 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 93 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 3 / 3 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 3 / 3 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 94 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: auto / 3 / auto / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: auto / 3 / auto / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 95 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / 3 / 2 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / 3 / 2 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 96 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / 3 / 3 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / 3 / 3 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 97 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 1 / 3 / auto / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 1 / 3 / auto / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 98 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 2 / 3 / 3 / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 2 / 3 / 3 / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 99 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 2 / 3 / auto / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 2 / 3 / auto / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 100 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="45" style="grid-area: 3 / 3 / auto / auto; inset: auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="195" style="grid-area: 3 / 3 / auto / auto; inset: auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-002-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-002-expected.txt
new file mode 100644
index 0000000..890cd94
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-002-expected.txt
@@ -0,0 +1,304 @@
+This is a testharness.js-based test.
+Found 100 tests; 0 PASS, 100 FAIL, 0 TIMEOUT, 0 NOTRUN.
+FAIL .grid 1 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 1 / 1; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 1 / 1; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 2 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 2 / 1; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 2 / 1; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 3 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 3 / 1; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 3 / 1; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 4 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / auto / 1; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / auto / 1; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 5 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / 2 / 1; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / 2 / 1; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 6 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / 3 / 1; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / 3 / 1; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 7 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / auto / 1; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / auto / 1; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 8 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 2 / auto / 3 / 1; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 2 / auto / 3 / 1; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 9 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 2 / auto / auto / 1; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 2 / auto / auto / 1; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 10 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 3 / auto / auto / 1; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 3 / auto / auto / 1; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 11 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 1 / 2; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 1 / 2; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 12 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 2 / 2; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 2 / 2; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 13 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 3 / 2; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 3 / 2; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 14 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / auto / 2; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / auto / 2; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 15 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / 2 / 2; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / 2 / 2; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 16 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / 3 / 2; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / 3 / 2; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 17 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / auto / 2; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / auto / 2; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 18 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 2 / auto / 3 / 2; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 2 / auto / 3 / 2; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 19 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 2 / auto / auto / 2; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 2 / auto / auto / 2; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 20 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 3 / auto / auto / 2; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 3 / auto / auto / 2; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 21 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 1 / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 1 / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 22 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 2 / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 2 / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 23 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 3 / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 3 / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 24 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / auto / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / auto / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 25 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / 2 / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / 2 / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 26 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / 3 / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / 3 / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 27 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / auto / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / auto / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 28 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 2 / auto / 3 / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 2 / auto / 3 / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 29 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 2 / auto / auto / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 2 / auto / auto / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 30 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 3 / auto / auto / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 3 / auto / auto / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 31 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 1 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 1 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 32 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 2 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 2 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 33 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 3 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 3 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 34 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / auto / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / auto / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 35 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / 2 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / 2 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 36 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / 3 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / 3 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 37 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / auto / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / auto / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 38 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 2 / auto / 3 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 2 / auto / 3 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 39 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 2 / auto / auto / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 2 / auto / auto / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 40 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 3 / auto / auto / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 3 / auto / auto / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 41 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / 1 / 2; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / 1 / 2; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 42 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / 2 / 2; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / 2 / 2; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 43 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / 3 / 2; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / 3 / 2; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 44 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / auto / 2; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / auto / 2; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 45 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 1 / 1 / 2 / 2; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 1 / 1 / 2 / 2; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 46 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 1 / 1 / 3 / 2; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 1 / 1 / 3 / 2; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 47 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 1 / 1 / auto / 2; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 1 / 1 / auto / 2; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 48 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 2 / 1 / 3 / 2; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 2 / 1 / 3 / 2; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 49 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 2 / 1 / auto / 2; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 2 / 1 / auto / 2; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 50 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 3 / 1 / auto / 2; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 3 / 1 / auto / 2; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 51 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / 1 / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / 1 / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 52 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / 2 / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / 2 / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 53 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / 3 / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / 3 / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 54 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / auto / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / auto / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 55 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 1 / 1 / 2 / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 1 / 1 / 2 / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 56 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 1 / 1 / 3 / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 1 / 1 / 3 / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 57 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 1 / 1 / auto / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 1 / 1 / auto / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 58 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 2 / 1 / 3 / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 2 / 1 / 3 / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 59 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 2 / 1 / auto / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 2 / 1 / auto / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 60 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 3 / 1 / auto / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 3 / 1 / auto / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 61 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / 1 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / 1 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 62 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / 2 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / 2 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 63 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / 3 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / 3 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 64 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / auto / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / auto / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 65 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 1 / 1 / 2 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 1 / 1 / 2 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 66 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 1 / 1 / 3 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 1 / 1 / 3 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 67 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 1 / 1 / auto / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 1 / 1 / auto / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 68 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 2 / 1 / 3 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 2 / 1 / 3 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 69 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 2 / 1 / auto / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 2 / 1 / auto / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 70 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 3 / 1 / auto / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 3 / 1 / auto / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 71 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: auto / 2 / 1 / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: auto / 2 / 1 / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 72 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: auto / 2 / 2 / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: auto / 2 / 2 / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 73 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: auto / 2 / 3 / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: auto / 2 / 3 / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 74 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: auto / 2 / auto / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: auto / 2 / auto / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 75 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 1 / 2 / 2 / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 1 / 2 / 2 / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 76 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 1 / 2 / 3 / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 1 / 2 / 3 / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 77 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 1 / 2 / auto / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 1 / 2 / auto / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 78 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 2 / 2 / 3 / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 2 / 2 / 3 / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 79 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 2 / 2 / auto / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 2 / 2 / auto / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 80 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 3 / 2 / auto / 3; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 3 / 2 / auto / 3; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 81 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: auto / 2 / 1 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: auto / 2 / 1 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 82 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: auto / 2 / 2 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: auto / 2 / 2 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 83 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: auto / 2 / 3 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: auto / 2 / 3 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 84 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: auto / 2 / auto / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: auto / 2 / auto / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 85 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 1 / 2 / 2 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 1 / 2 / 2 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 86 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 1 / 2 / 3 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 1 / 2 / 3 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 87 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 1 / 2 / auto / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 1 / 2 / auto / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 88 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 2 / 2 / 3 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 2 / 2 / 3 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 89 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 2 / 2 / auto / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 2 / 2 / auto / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 90 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 3 / 2 / auto / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 3 / 2 / auto / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 91 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="530" data-offset-y="45" style="grid-area: auto / 3 / 1 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="530" data-offset-y="195" style="grid-area: auto / 3 / 1 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 92 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="530" data-offset-y="45" style="grid-area: auto / 3 / 2 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="530" data-offset-y="195" style="grid-area: auto / 3 / 2 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 93 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="530" data-offset-y="45" style="grid-area: auto / 3 / 3 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="530" data-offset-y="195" style="grid-area: auto / 3 / 3 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 94 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="530" data-offset-y="45" style="grid-area: auto / 3 / auto / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="530" data-offset-y="195" style="grid-area: auto / 3 / auto / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 95 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="530" data-offset-y="45" style="grid-area: 1 / 3 / 2 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="530" data-offset-y="195" style="grid-area: 1 / 3 / 2 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 96 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="530" data-offset-y="45" style="grid-area: 1 / 3 / 3 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="530" data-offset-y="195" style="grid-area: 1 / 3 / 3 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 97 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="530" data-offset-y="45" style="grid-area: 1 / 3 / auto / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="530" data-offset-y="195" style="grid-area: 1 / 3 / auto / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 98 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="530" data-offset-y="45" style="grid-area: 2 / 3 / 3 / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="530" data-offset-y="195" style="grid-area: 2 / 3 / 3 / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 99 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="530" data-offset-y="45" style="grid-area: 2 / 3 / auto / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="530" data-offset-y="195" style="grid-area: 2 / 3 / auto / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 100 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="530" data-offset-y="45" style="grid-area: 3 / 3 / auto / auto; inset: auto auto auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="530" data-offset-y="195" style="grid-area: 3 / 3 / auto / auto; inset: auto auto auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-003-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-003-expected.txt
new file mode 100644
index 0000000..aff2274
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-003-expected.txt
@@ -0,0 +1,304 @@
+This is a testharness.js-based test.
+Found 100 tests; 0 PASS, 100 FAIL, 0 TIMEOUT, 0 NOTRUN.
+FAIL .grid 1 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 1 / 1; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 1 / 1; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 2 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 2 / 1; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 2 / 1; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 3 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 3 / 1; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 3 / 1; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 4 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / auto / 1; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / auto / 1; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 5 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / 2 / 1; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / 2 / 1; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 6 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / 3 / 1; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / 3 / 1; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 7 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / auto / 1; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / auto / 1; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 8 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / auto / 3 / 1; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / auto / 3 / 1; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 9 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / auto / auto / 1; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / auto / auto / 1; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 10 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="300" style="grid-area: 3 / auto / auto / 1; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="300" style="grid-area: 3 / auto / auto / 1; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 11 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 1 / 2; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 1 / 2; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 12 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 2 / 2; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 2 / 2; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 13 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 3 / 2; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 3 / 2; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 14 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / auto / 2; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / auto / 2; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 15 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / 2 / 2; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / 2 / 2; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 16 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / 3 / 2; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / 3 / 2; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 17 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / auto / 2; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / auto / 2; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 18 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / auto / 3 / 2; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / auto / 3 / 2; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 19 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / auto / auto / 2; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / auto / auto / 2; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 20 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="300" style="grid-area: 3 / auto / auto / 2; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="300" style="grid-area: 3 / auto / auto / 2; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 21 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 1 / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 1 / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 22 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 2 / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 2 / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 23 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 3 / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 3 / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 24 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / auto / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / auto / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 25 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / 2 / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / 2 / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 26 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / 3 / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / 3 / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 27 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / auto / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / auto / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 28 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / auto / 3 / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / auto / 3 / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 29 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / auto / auto / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / auto / auto / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 30 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="300" style="grid-area: 3 / auto / auto / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="300" style="grid-area: 3 / auto / auto / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 31 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 1 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 1 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 32 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 2 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 2 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 33 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 3 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 3 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 34 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / auto / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / auto / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 35 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / 2 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / 2 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 36 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / 3 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / 3 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 37 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / auto / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / auto / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 38 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / auto / 3 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / auto / 3 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 39 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / auto / auto / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / auto / auto / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 40 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="300" style="grid-area: 3 / auto / auto / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="300" style="grid-area: 3 / auto / auto / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 41 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / 1 / 2; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / 1 / 2; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 42 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / 2 / 2; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / 2 / 2; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 43 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / 3 / 2; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / 3 / 2; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 44 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / auto / 2; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / auto / 2; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 45 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 1 / 2 / 2; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 1 / 2 / 2; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 46 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 1 / 3 / 2; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 1 / 3 / 2; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 47 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 1 / auto / 2; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 1 / auto / 2; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 48 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 1 / 3 / 2; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 1 / 3 / 2; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 49 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 1 / auto / 2; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 1 / auto / 2; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 50 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="300" style="grid-area: 3 / 1 / auto / 2; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="300" style="grid-area: 3 / 1 / auto / 2; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 51 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / 1 / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / 1 / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 52 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / 2 / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / 2 / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 53 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / 3 / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / 3 / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 54 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / auto / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / auto / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 55 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 1 / 2 / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 1 / 2 / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 56 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 1 / 3 / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 1 / 3 / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 57 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 1 / auto / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 1 / auto / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 58 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 1 / 3 / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 1 / 3 / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 59 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 1 / auto / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 1 / auto / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 60 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="300" style="grid-area: 3 / 1 / auto / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="300" style="grid-area: 3 / 1 / auto / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 61 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / 1 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / 1 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 62 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / 2 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / 2 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 63 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / 3 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / 3 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 64 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / auto / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / auto / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 65 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 1 / 2 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 1 / 2 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 66 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 1 / 3 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 1 / 3 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 67 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 1 / auto / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 1 / auto / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 68 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 1 / 3 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 1 / 3 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 69 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 1 / auto / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 1 / auto / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 70 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="300" style="grid-area: 3 / 1 / auto / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="300" style="grid-area: 3 / 1 / auto / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 71 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 2 / 1 / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 2 / 1 / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 72 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 2 / 2 / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 2 / 2 / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 73 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 2 / 3 / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 2 / 3 / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 74 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 2 / auto / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 2 / auto / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 75 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 2 / 2 / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 2 / 2 / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 76 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 2 / 3 / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 2 / 3 / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 77 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 2 / auto / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 2 / auto / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 78 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 2 / 3 / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 2 / 3 / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 79 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 2 / auto / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 2 / auto / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 80 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="300" style="grid-area: 3 / 2 / auto / 3; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="300" style="grid-area: 3 / 2 / auto / 3; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 81 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 2 / 1 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 2 / 1 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 82 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 2 / 2 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 2 / 2 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 83 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 2 / 3 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 2 / 3 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 84 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 2 / auto / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 2 / auto / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 85 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 2 / 2 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 2 / 2 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 86 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 2 / 3 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 2 / 3 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 87 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 2 / auto / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 2 / auto / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 88 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 2 / 3 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 2 / 3 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 89 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 2 / auto / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 2 / auto / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 90 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="300" style="grid-area: 3 / 2 / auto / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="300" style="grid-area: 3 / 2 / auto / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 91 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 3 / 1 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 3 / 1 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 92 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 3 / 2 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 3 / 2 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 93 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 3 / 3 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 3 / 3 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 94 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 3 / auto / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 3 / auto / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 95 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 3 / 2 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 3 / 2 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 96 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 3 / 3 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 3 / 3 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 97 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 3 / auto / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 3 / auto / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 98 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 3 / 3 / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 3 / 3 / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 99 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 3 / auto / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 3 / auto / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 100 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="300" style="grid-area: 3 / 3 / auto / auto; inset: 30px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="300" style="grid-area: 3 / 3 / auto / auto; inset: 30px auto auto;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-004-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-004-expected.txt
new file mode 100644
index 0000000..577ed6c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-004-expected.txt
@@ -0,0 +1,304 @@
+This is a testharness.js-based test.
+Found 100 tests; 0 PASS, 100 FAIL, 0 TIMEOUT, 0 NOTRUN.
+FAIL .grid 1 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="-55" data-offset-y="45" style="grid-area: auto / auto / 1 / 1; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="-55" data-offset-y="195" style="grid-area: auto / auto / 1 / 1; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 2 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="-55" data-offset-y="45" style="grid-area: auto / auto / 2 / 1; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="-55" data-offset-y="195" style="grid-area: auto / auto / 2 / 1; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 3 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="-55" data-offset-y="45" style="grid-area: auto / auto / 3 / 1; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="-55" data-offset-y="195" style="grid-area: auto / auto / 3 / 1; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 4 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="-55" data-offset-y="45" style="grid-area: auto / auto / auto / 1; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="-55" data-offset-y="195" style="grid-area: auto / auto / auto / 1; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 5 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="-55" data-offset-y="45" style="grid-area: 1 / auto / 2 / 1; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="-55" data-offset-y="195" style="grid-area: 1 / auto / 2 / 1; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 6 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="-55" data-offset-y="45" style="grid-area: 1 / auto / 3 / 1; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="-55" data-offset-y="195" style="grid-area: 1 / auto / 3 / 1; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 7 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="-55" data-offset-y="45" style="grid-area: 1 / auto / auto / 1; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="-55" data-offset-y="195" style="grid-area: 1 / auto / auto / 1; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 8 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="-55" data-offset-y="45" style="grid-area: 2 / auto / 3 / 1; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="-55" data-offset-y="195" style="grid-area: 2 / auto / 3 / 1; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 9 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="-55" data-offset-y="45" style="grid-area: 2 / auto / auto / 1; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="-55" data-offset-y="195" style="grid-area: 2 / auto / auto / 1; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 10 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="-55" data-offset-y="45" style="grid-area: 3 / auto / auto / 1; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="-55" data-offset-y="195" style="grid-area: 3 / auto / auto / 1; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 11 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="45" style="grid-area: auto / auto / 1 / 2; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="195" style="grid-area: auto / auto / 1 / 2; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 12 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="45" style="grid-area: auto / auto / 2 / 2; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="195" style="grid-area: auto / auto / 2 / 2; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 13 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="45" style="grid-area: auto / auto / 3 / 2; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="195" style="grid-area: auto / auto / 3 / 2; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 14 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="45" style="grid-area: auto / auto / auto / 2; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="195" style="grid-area: auto / auto / auto / 2; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 15 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="45" style="grid-area: 1 / auto / 2 / 2; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="195" style="grid-area: 1 / auto / 2 / 2; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 16 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="45" style="grid-area: 1 / auto / 3 / 2; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="195" style="grid-area: 1 / auto / 3 / 2; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 17 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="45" style="grid-area: 1 / auto / auto / 2; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="195" style="grid-area: 1 / auto / auto / 2; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 18 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="45" style="grid-area: 2 / auto / 3 / 2; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="195" style="grid-area: 2 / auto / 3 / 2; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 19 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="45" style="grid-area: 2 / auto / auto / 2; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="195" style="grid-area: 2 / auto / auto / 2; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 20 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="45" style="grid-area: 3 / auto / auto / 2; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="195" style="grid-area: 3 / auto / auto / 2; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 21 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: auto / auto / 1 / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: auto / auto / 1 / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 22 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: auto / auto / 2 / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: auto / auto / 2 / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 23 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: auto / auto / 3 / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: auto / auto / 3 / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 24 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: auto / auto / auto / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: auto / auto / auto / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 25 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: 1 / auto / 2 / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: 1 / auto / 2 / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 26 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: 1 / auto / 3 / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: 1 / auto / 3 / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 27 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: 1 / auto / auto / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: 1 / auto / auto / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 28 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: 2 / auto / 3 / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: 2 / auto / 3 / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 29 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: 2 / auto / auto / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: 2 / auto / auto / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 30 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: 3 / auto / auto / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: 3 / auto / auto / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 31 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: auto / auto / 1 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: auto / auto / 1 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 32 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: auto / auto / 2 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: auto / auto / 2 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 33 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: auto / auto / 3 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: auto / auto / 3 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 34 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: auto / auto / auto / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: auto / auto / auto / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 35 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 1 / auto / 2 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 1 / auto / 2 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 36 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 1 / auto / 3 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 1 / auto / 3 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 37 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 1 / auto / auto / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 1 / auto / auto / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 38 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 2 / auto / 3 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 2 / auto / 3 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 39 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 2 / auto / auto / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 2 / auto / auto / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 40 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 3 / auto / auto / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 3 / auto / auto / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 41 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="45" style="grid-area: auto / 1 / 1 / 2; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="195" style="grid-area: auto / 1 / 1 / 2; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 42 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="45" style="grid-area: auto / 1 / 2 / 2; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="195" style="grid-area: auto / 1 / 2 / 2; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 43 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="45" style="grid-area: auto / 1 / 3 / 2; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="195" style="grid-area: auto / 1 / 3 / 2; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 44 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="45" style="grid-area: auto / 1 / auto / 2; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="195" style="grid-area: auto / 1 / auto / 2; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 45 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="45" style="grid-area: 1 / 1 / 2 / 2; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="195" style="grid-area: 1 / 1 / 2 / 2; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 46 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="45" style="grid-area: 1 / 1 / 3 / 2; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="195" style="grid-area: 1 / 1 / 3 / 2; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 47 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="45" style="grid-area: 1 / 1 / auto / 2; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="195" style="grid-area: 1 / 1 / auto / 2; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 48 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="45" style="grid-area: 2 / 1 / 3 / 2; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="195" style="grid-area: 2 / 1 / 3 / 2; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 49 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="45" style="grid-area: 2 / 1 / auto / 2; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="195" style="grid-area: 2 / 1 / auto / 2; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 50 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="45" style="grid-area: 3 / 1 / auto / 2; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="145" data-offset-y="195" style="grid-area: 3 / 1 / auto / 2; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 51 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: auto / 1 / 1 / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: auto / 1 / 1 / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 52 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: auto / 1 / 2 / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: auto / 1 / 2 / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 53 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: auto / 1 / 3 / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: auto / 1 / 3 / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 54 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: auto / 1 / auto / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: auto / 1 / auto / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 55 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: 1 / 1 / 2 / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: 1 / 1 / 2 / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 56 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: 1 / 1 / 3 / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: 1 / 1 / 3 / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 57 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: 1 / 1 / auto / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: 1 / 1 / auto / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 58 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: 2 / 1 / 3 / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: 2 / 1 / 3 / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 59 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: 2 / 1 / auto / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: 2 / 1 / auto / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 60 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: 3 / 1 / auto / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: 3 / 1 / auto / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 61 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: auto / 1 / 1 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: auto / 1 / 1 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 62 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: auto / 1 / 2 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: auto / 1 / 2 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 63 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: auto / 1 / 3 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: auto / 1 / 3 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 64 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: auto / 1 / auto / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: auto / 1 / auto / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 65 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 1 / 1 / 2 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 1 / 1 / 2 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 66 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 1 / 1 / 3 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 1 / 1 / 3 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 67 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 1 / 1 / auto / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 1 / 1 / auto / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 68 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 2 / 1 / 3 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 2 / 1 / 3 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 69 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 2 / 1 / auto / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 2 / 1 / auto / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 70 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 3 / 1 / auto / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 3 / 1 / auto / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 71 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: auto / 2 / 1 / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: auto / 2 / 1 / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 72 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: auto / 2 / 2 / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: auto / 2 / 2 / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 73 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: auto / 2 / 3 / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: auto / 2 / 3 / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 74 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: auto / 2 / auto / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: auto / 2 / auto / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 75 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: 1 / 2 / 2 / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: 1 / 2 / 2 / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 76 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: 1 / 2 / 3 / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: 1 / 2 / 3 / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 77 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: 1 / 2 / auto / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: 1 / 2 / auto / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 78 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: 2 / 2 / 3 / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: 2 / 2 / 3 / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 79 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: 2 / 2 / auto / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: 2 / 2 / auto / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 80 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="45" style="grid-area: 3 / 2 / auto / 3; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="445" data-offset-y="195" style="grid-area: 3 / 2 / auto / 3; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 81 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: auto / 2 / 1 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: auto / 2 / 1 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 82 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: auto / 2 / 2 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: auto / 2 / 2 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 83 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: auto / 2 / 3 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: auto / 2 / 3 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 84 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: auto / 2 / auto / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: auto / 2 / auto / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 85 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 1 / 2 / 2 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 1 / 2 / 2 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 86 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 1 / 2 / 3 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 1 / 2 / 3 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 87 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 1 / 2 / auto / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 1 / 2 / auto / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 88 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 2 / 2 / 3 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 2 / 2 / 3 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 89 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 2 / 2 / auto / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 2 / 2 / auto / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 90 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 3 / 2 / auto / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 3 / 2 / auto / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 91 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: auto / 3 / 1 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: auto / 3 / 1 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 92 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: auto / 3 / 2 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: auto / 3 / 2 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 93 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: auto / 3 / 3 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: auto / 3 / 3 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 94 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: auto / 3 / auto / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: auto / 3 / auto / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 95 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 1 / 3 / 2 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 1 / 3 / 2 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 96 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 1 / 3 / 3 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 1 / 3 / 3 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 97 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 1 / 3 / auto / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 1 / 3 / auto / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 98 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 2 / 3 / 3 / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 2 / 3 / 3 / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 99 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 2 / 3 / auto / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 2 / 3 / auto / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 100 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="45" style="grid-area: 3 / 3 / auto / auto; inset: auto 35px auto auto;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="510" data-offset-y="195" style="grid-area: 3 / 3 / auto / auto; inset: auto 35px auto auto;">XX</div></div></div>
+offsetTop expected 45 but got 55
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-005-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-005-expected.txt
new file mode 100644
index 0000000..bf6a2afb
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-005-expected.txt
@@ -0,0 +1,304 @@
+This is a testharness.js-based test.
+Found 100 tests; 0 PASS, 100 FAIL, 0 TIMEOUT, 0 NOTRUN.
+FAIL .grid 1 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="-70" style="grid-area: auto / auto / 1 / 1; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="-70" style="grid-area: auto / auto / 1 / 1; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 2 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="80" style="grid-area: auto / auto / 2 / 1; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="80" style="grid-area: auto / auto / 2 / 1; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 3 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: auto / auto / 3 / 1; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: auto / auto / 3 / 1; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 4 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: auto / auto / auto / 1; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: auto / auto / auto / 1; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 5 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="80" style="grid-area: 1 / auto / 2 / 1; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="80" style="grid-area: 1 / auto / 2 / 1; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 6 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: 1 / auto / 3 / 1; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: 1 / auto / 3 / 1; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 7 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 1 / auto / auto / 1; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 1 / auto / auto / 1; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 8 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: 2 / auto / 3 / 1; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: 2 / auto / 3 / 1; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 9 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 2 / auto / auto / 1; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 2 / auto / auto / 1; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 10 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 3 / auto / auto / 1; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 3 / auto / auto / 1; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 11 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="-70" style="grid-area: auto / auto / 1 / 2; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="-70" style="grid-area: auto / auto / 1 / 2; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 12 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="80" style="grid-area: auto / auto / 2 / 2; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="80" style="grid-area: auto / auto / 2 / 2; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 13 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: auto / auto / 3 / 2; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: auto / auto / 3 / 2; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 14 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: auto / auto / auto / 2; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: auto / auto / auto / 2; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 15 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="80" style="grid-area: 1 / auto / 2 / 2; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="80" style="grid-area: 1 / auto / 2 / 2; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 16 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: 1 / auto / 3 / 2; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: 1 / auto / 3 / 2; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 17 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 1 / auto / auto / 2; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 1 / auto / auto / 2; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 18 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: 2 / auto / 3 / 2; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: 2 / auto / 3 / 2; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 19 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 2 / auto / auto / 2; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 2 / auto / auto / 2; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 20 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 3 / auto / auto / 2; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 3 / auto / auto / 2; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 21 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="-70" style="grid-area: auto / auto / 1 / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="-70" style="grid-area: auto / auto / 1 / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 22 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="80" style="grid-area: auto / auto / 2 / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="80" style="grid-area: auto / auto / 2 / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 23 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: auto / auto / 3 / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: auto / auto / 3 / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 24 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: auto / auto / auto / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: auto / auto / auto / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 25 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="80" style="grid-area: 1 / auto / 2 / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="80" style="grid-area: 1 / auto / 2 / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 26 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: 1 / auto / 3 / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: 1 / auto / 3 / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 27 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 1 / auto / auto / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 1 / auto / auto / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 28 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: 2 / auto / 3 / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: 2 / auto / 3 / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 29 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 2 / auto / auto / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 2 / auto / auto / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 30 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 3 / auto / auto / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 3 / auto / auto / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 31 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="-70" style="grid-area: auto / auto / 1 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="-70" style="grid-area: auto / auto / 1 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 32 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="80" style="grid-area: auto / auto / 2 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="80" style="grid-area: auto / auto / 2 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 33 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: auto / auto / 3 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: auto / auto / 3 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 34 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: auto / auto / auto / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: auto / auto / auto / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 35 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="80" style="grid-area: 1 / auto / 2 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="80" style="grid-area: 1 / auto / 2 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 36 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: 1 / auto / 3 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: 1 / auto / 3 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 37 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 1 / auto / auto / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 1 / auto / auto / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 38 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: 2 / auto / 3 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: 2 / auto / 3 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 39 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 2 / auto / auto / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 2 / auto / auto / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 40 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 3 / auto / auto / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 3 / auto / auto / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 41 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="-70" style="grid-area: auto / 1 / 1 / 2; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="-70" style="grid-area: auto / 1 / 1 / 2; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 42 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="80" style="grid-area: auto / 1 / 2 / 2; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="80" style="grid-area: auto / 1 / 2 / 2; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 43 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: auto / 1 / 3 / 2; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: auto / 1 / 3 / 2; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 44 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: auto / 1 / auto / 2; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: auto / 1 / auto / 2; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 45 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="80" style="grid-area: 1 / 1 / 2 / 2; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="80" style="grid-area: 1 / 1 / 2 / 2; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 46 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: 1 / 1 / 3 / 2; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: 1 / 1 / 3 / 2; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 47 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 1 / 1 / auto / 2; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 1 / 1 / auto / 2; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 48 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: 2 / 1 / 3 / 2; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: 2 / 1 / 3 / 2; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 49 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 2 / 1 / auto / 2; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 2 / 1 / auto / 2; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 50 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 3 / 1 / auto / 2; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 3 / 1 / auto / 2; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 51 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="-70" style="grid-area: auto / 1 / 1 / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="-70" style="grid-area: auto / 1 / 1 / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 52 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="80" style="grid-area: auto / 1 / 2 / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="80" style="grid-area: auto / 1 / 2 / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 53 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: auto / 1 / 3 / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: auto / 1 / 3 / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 54 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: auto / 1 / auto / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: auto / 1 / auto / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 55 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="80" style="grid-area: 1 / 1 / 2 / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="80" style="grid-area: 1 / 1 / 2 / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 56 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: 1 / 1 / 3 / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: 1 / 1 / 3 / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 57 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 1 / 1 / auto / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 1 / 1 / auto / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 58 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: 2 / 1 / 3 / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: 2 / 1 / 3 / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 59 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 2 / 1 / auto / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 2 / 1 / auto / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 60 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 3 / 1 / auto / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 3 / 1 / auto / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 61 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="-70" style="grid-area: auto / 1 / 1 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="-70" style="grid-area: auto / 1 / 1 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 62 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="80" style="grid-area: auto / 1 / 2 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="80" style="grid-area: auto / 1 / 2 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 63 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: auto / 1 / 3 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: auto / 1 / 3 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 64 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: auto / 1 / auto / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: auto / 1 / auto / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 65 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="80" style="grid-area: 1 / 1 / 2 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="80" style="grid-area: 1 / 1 / 2 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 66 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: 1 / 1 / 3 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: 1 / 1 / 3 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 67 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 1 / 1 / auto / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 1 / 1 / auto / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 68 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: 2 / 1 / 3 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: 2 / 1 / 3 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 69 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 2 / 1 / auto / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 2 / 1 / auto / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 70 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 3 / 1 / auto / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 3 / 1 / auto / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 71 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="-70" style="grid-area: auto / 2 / 1 / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="-70" style="grid-area: auto / 2 / 1 / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 72 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="80" style="grid-area: auto / 2 / 2 / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="80" style="grid-area: auto / 2 / 2 / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 73 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: auto / 2 / 3 / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: auto / 2 / 3 / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 74 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: auto / 2 / auto / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: auto / 2 / auto / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 75 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="80" style="grid-area: 1 / 2 / 2 / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="80" style="grid-area: 1 / 2 / 2 / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 76 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: 1 / 2 / 3 / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: 1 / 2 / 3 / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 77 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 1 / 2 / auto / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 1 / 2 / auto / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 78 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: 2 / 2 / 3 / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: 2 / 2 / 3 / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 79 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 2 / 2 / auto / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 2 / 2 / auto / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 80 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 3 / 2 / auto / 3; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 3 / 2 / auto / 3; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 81 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="-70" style="grid-area: auto / 2 / 1 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="-70" style="grid-area: auto / 2 / 1 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 82 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="80" style="grid-area: auto / 2 / 2 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="80" style="grid-area: auto / 2 / 2 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 83 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: auto / 2 / 3 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: auto / 2 / 3 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 84 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: auto / 2 / auto / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: auto / 2 / auto / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 85 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="80" style="grid-area: 1 / 2 / 2 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="80" style="grid-area: 1 / 2 / 2 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 86 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: 1 / 2 / 3 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: 1 / 2 / 3 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 87 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 1 / 2 / auto / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 1 / 2 / auto / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 88 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: 2 / 2 / 3 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: 2 / 2 / 3 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 89 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 2 / 2 / auto / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 2 / 2 / auto / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 90 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 3 / 2 / auto / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 3 / 2 / auto / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 91 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="-70" style="grid-area: auto / 3 / 1 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="-70" style="grid-area: auto / 3 / 1 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 92 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="80" style="grid-area: auto / 3 / 2 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="80" style="grid-area: auto / 3 / 2 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 93 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: auto / 3 / 3 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: auto / 3 / 3 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 94 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: auto / 3 / auto / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: auto / 3 / auto / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 95 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="80" style="grid-area: 1 / 3 / 2 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="80" style="grid-area: 1 / 3 / 2 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 96 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: 1 / 3 / 3 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: 1 / 3 / 3 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 97 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 1 / 3 / auto / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 1 / 3 / auto / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 98 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="180" style="grid-area: 2 / 3 / 3 / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="180" style="grid-area: 2 / 3 / 3 / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 99 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 2 / 3 / auto / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 2 / 3 / auto / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 100 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="55" data-offset-y="340" style="grid-area: 3 / 3 / auto / auto; inset: auto auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="50" data-offset-x="255" data-offset-y="340" style="grid-area: 3 / 3 / auto / auto; inset: auto auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-007-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-007-expected.txt
new file mode 100644
index 0000000..96172b1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-007-expected.txt
@@ -0,0 +1,304 @@
+This is a testharness.js-based test.
+Found 100 tests; 0 PASS, 100 FAIL, 0 TIMEOUT, 0 NOTRUN.
+FAIL .grid 1 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="0" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 1 / 1; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="0" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 1 / 1; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 2 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="0" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 2 / 1; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="0" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 2 / 1; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 3 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="0" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 3 / 1; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="0" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 3 / 1; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 4 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="0" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / auto / 1; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="0" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / auto / 1; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 5 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="0" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / 2 / 1; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="0" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / 2 / 1; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 6 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="0" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / 3 / 1; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="0" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / 3 / 1; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 7 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="0" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / auto / 1; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="0" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / auto / 1; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 8 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="0" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 2 / auto / 3 / 1; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="0" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 2 / auto / 3 / 1; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 9 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="0" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 2 / auto / auto / 1; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="0" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 2 / auto / auto / 1; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 10 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="0" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 3 / auto / auto / 1; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="0" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 3 / auto / auto / 1; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 11 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="145" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 1 / 2; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="145" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 1 / 2; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 12 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="145" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 2 / 2; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="145" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 2 / 2; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 13 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="145" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 3 / 2; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="145" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 3 / 2; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 14 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="145" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / auto / 2; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="145" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / auto / 2; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 15 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="145" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / 2 / 2; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="145" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / 2 / 2; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 16 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="145" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / 3 / 2; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="145" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / 3 / 2; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 17 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="145" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / auto / 2; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="145" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / auto / 2; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 18 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="145" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 2 / auto / 3 / 2; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="145" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 2 / auto / 3 / 2; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 19 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="145" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 2 / auto / auto / 2; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="145" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 2 / auto / auto / 2; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 20 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="145" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 3 / auto / auto / 2; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="145" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 3 / auto / auto / 2; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 21 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="445" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 1 / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="445" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 1 / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 22 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="445" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 2 / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="445" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 2 / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 23 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="445" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 3 / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="445" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 3 / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 24 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="445" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / auto / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="445" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / auto / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 25 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="445" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / 2 / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="445" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / 2 / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 26 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="445" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / 3 / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="445" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / 3 / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 27 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="445" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / auto / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="445" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / auto / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 28 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="445" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 2 / auto / 3 / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="445" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 2 / auto / 3 / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 29 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="445" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 2 / auto / auto / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="445" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 2 / auto / auto / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 30 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="445" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 3 / auto / auto / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="445" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 3 / auto / auto / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 31 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="510" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 1 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="510" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 1 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 32 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="510" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 2 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="510" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 2 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 33 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="510" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / 3 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="510" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / 3 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 34 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="510" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: auto / auto / auto / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="510" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: auto / auto / auto / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 35 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="510" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / 2 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="510" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / 2 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 36 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="510" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / 3 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="510" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / 3 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 37 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="510" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 1 / auto / auto / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="510" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 1 / auto / auto / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 38 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="510" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 2 / auto / 3 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="510" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 2 / auto / 3 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 39 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="510" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 2 / auto / auto / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="510" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 2 / auto / auto / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 40 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="510" data-expected-height="50" data-offset-x="25" data-offset-y="45" style="grid-area: 3 / auto / auto / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="510" data-expected-height="50" data-offset-x="25" data-offset-y="195" style="grid-area: 3 / auto / auto / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 41 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="140" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / 1 / 2; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="140" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / 1 / 2; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 42 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="140" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / 2 / 2; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="140" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / 2 / 2; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 43 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="140" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / 3 / 2; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="140" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / 3 / 2; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 44 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="140" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / auto / 2; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="140" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / auto / 2; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 45 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="140" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 1 / 1 / 2 / 2; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="140" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 1 / 1 / 2 / 2; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 46 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="140" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 1 / 1 / 3 / 2; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="140" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 1 / 1 / 3 / 2; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 47 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="140" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 1 / 1 / auto / 2; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="140" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 1 / 1 / auto / 2; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 48 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="140" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 2 / 1 / 3 / 2; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="140" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 2 / 1 / 3 / 2; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 49 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="140" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 2 / 1 / auto / 2; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="140" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 2 / 1 / auto / 2; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 50 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="140" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 3 / 1 / auto / 2; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="140" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 3 / 1 / auto / 2; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 51 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="440" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / 1 / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="440" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / 1 / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 52 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="440" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / 2 / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="440" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / 2 / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 53 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="440" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / 3 / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="440" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / 3 / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 54 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="440" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / auto / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="440" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / auto / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 55 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="440" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 1 / 1 / 2 / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="440" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 1 / 1 / 2 / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 56 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="440" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 1 / 1 / 3 / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="440" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 1 / 1 / 3 / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 57 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="440" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 1 / 1 / auto / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="440" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 1 / 1 / auto / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 58 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="440" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 2 / 1 / 3 / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="440" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 2 / 1 / 3 / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 59 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="440" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 2 / 1 / auto / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="440" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 2 / 1 / auto / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 60 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="440" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 3 / 1 / auto / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="440" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 3 / 1 / auto / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 61 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="505" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / 1 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="505" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / 1 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 62 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="505" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / 2 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="505" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / 2 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 63 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="505" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / 3 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="505" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / 3 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 64 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="505" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: auto / 1 / auto / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="505" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: auto / 1 / auto / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 65 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="505" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 1 / 1 / 2 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="505" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 1 / 1 / 2 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 66 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="505" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 1 / 1 / 3 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="505" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 1 / 1 / 3 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 67 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="505" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 1 / 1 / auto / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="505" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 1 / 1 / auto / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 68 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="505" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 2 / 1 / 3 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="505" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 2 / 1 / 3 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 69 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="505" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 2 / 1 / auto / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="505" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 2 / 1 / auto / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 70 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="505" data-expected-height="50" data-offset-x="30" data-offset-y="45" style="grid-area: 3 / 1 / auto / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="505" data-expected-height="50" data-offset-x="30" data-offset-y="195" style="grid-area: 3 / 1 / auto / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 71 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="240" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: auto / 2 / 1 / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="240" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: auto / 2 / 1 / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 72 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="240" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: auto / 2 / 2 / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="240" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: auto / 2 / 2 / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 73 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="240" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: auto / 2 / 3 / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="240" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: auto / 2 / 3 / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 74 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="240" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: auto / 2 / auto / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="240" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: auto / 2 / auto / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 75 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="240" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 1 / 2 / 2 / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="240" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 1 / 2 / 2 / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 76 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="240" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 1 / 2 / 3 / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="240" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 1 / 2 / 3 / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 77 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="240" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 1 / 2 / auto / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="240" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 1 / 2 / auto / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 78 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="240" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 2 / 2 / 3 / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="240" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 2 / 2 / 3 / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 79 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="240" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 2 / 2 / auto / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="240" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 2 / 2 / auto / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 80 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="240" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 3 / 2 / auto / 3; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="240" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 3 / 2 / auto / 3; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 81 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="305" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: auto / 2 / 1 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="305" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: auto / 2 / 1 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 82 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="305" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: auto / 2 / 2 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="305" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: auto / 2 / 2 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 83 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="305" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: auto / 2 / 3 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="305" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: auto / 2 / 3 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 84 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="305" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: auto / 2 / auto / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="305" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: auto / 2 / auto / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 85 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="305" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 1 / 2 / 2 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="305" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 1 / 2 / 2 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 86 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="305" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 1 / 2 / 3 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="305" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 1 / 2 / 3 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 87 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="305" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 1 / 2 / auto / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="305" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 1 / 2 / auto / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 88 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="305" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 2 / 2 / 3 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="305" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 2 / 2 / 3 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 89 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="305" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 2 / 2 / auto / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="305" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 2 / 2 / auto / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 90 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="305" data-expected-height="50" data-offset-x="230" data-offset-y="45" style="grid-area: 3 / 2 / auto / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="305" data-expected-height="50" data-offset-x="230" data-offset-y="195" style="grid-area: 3 / 2 / auto / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 91 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="5" data-expected-height="50" data-offset-x="530" data-offset-y="45" style="grid-area: auto / 3 / 1 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="5" data-expected-height="50" data-offset-x="530" data-offset-y="195" style="grid-area: auto / 3 / 1 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 92 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="5" data-expected-height="50" data-offset-x="530" data-offset-y="45" style="grid-area: auto / 3 / 2 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="5" data-expected-height="50" data-offset-x="530" data-offset-y="195" style="grid-area: auto / 3 / 2 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 93 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="5" data-expected-height="50" data-offset-x="530" data-offset-y="45" style="grid-area: auto / 3 / 3 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="5" data-expected-height="50" data-offset-x="530" data-offset-y="195" style="grid-area: auto / 3 / 3 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 94 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="5" data-expected-height="50" data-offset-x="530" data-offset-y="45" style="grid-area: auto / 3 / auto / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="5" data-expected-height="50" data-offset-x="530" data-offset-y="195" style="grid-area: auto / 3 / auto / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 95 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="5" data-expected-height="50" data-offset-x="530" data-offset-y="45" style="grid-area: 1 / 3 / 2 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="5" data-expected-height="50" data-offset-x="530" data-offset-y="195" style="grid-area: 1 / 3 / 2 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 96 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="5" data-expected-height="50" data-offset-x="530" data-offset-y="45" style="grid-area: 1 / 3 / 3 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="5" data-expected-height="50" data-offset-x="530" data-offset-y="195" style="grid-area: 1 / 3 / 3 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 97 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="5" data-expected-height="50" data-offset-x="530" data-offset-y="45" style="grid-area: 1 / 3 / auto / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="5" data-expected-height="50" data-offset-x="530" data-offset-y="195" style="grid-area: 1 / 3 / auto / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 98 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="5" data-expected-height="50" data-offset-x="530" data-offset-y="45" style="grid-area: 2 / 3 / 3 / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="5" data-expected-height="50" data-offset-x="530" data-offset-y="195" style="grid-area: 2 / 3 / 3 / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 99 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="5" data-expected-height="50" data-offset-x="530" data-offset-y="45" style="grid-area: 2 / 3 / auto / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="5" data-expected-height="50" data-offset-x="530" data-offset-y="195" style="grid-area: 2 / 3 / auto / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+FAIL .grid 100 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="5" data-expected-height="50" data-offset-x="530" data-offset-y="45" style="grid-area: 3 / 3 / auto / auto; inset: auto 35px auto 25px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="5" data-expected-height="50" data-offset-x="530" data-offset-y="195" style="grid-area: 3 / 3 / auto / auto; inset: auto 35px auto 25px;">XX</div></div></div>
+offsetTop expected 45 but got 55
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-010-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-010-expected.txt
new file mode 100644
index 0000000..10fd929
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-descendants-010-expected.txt
@@ -0,0 +1,304 @@
+This is a testharness.js-based test.
+Found 100 tests; 0 PASS, 100 FAIL, 0 TIMEOUT, 0 NOTRUN.
+FAIL .grid 1 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="0" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 1 / 1; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="0" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 1 / 1; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 2 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="100" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 2 / 1; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="100" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 2 / 1; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 3 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="200" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 3 / 1; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="200" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 3 / 1; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 4 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="360" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / auto / 1; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="360" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / auto / 1; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 5 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="80" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / 2 / 1; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="80" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / 2 / 1; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 6 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="180" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / 3 / 1; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="180" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / 3 / 1; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 7 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="340" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / auto / 1; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="340" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / auto / 1; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 8 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="30" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / auto / 3 / 1; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="30" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / auto / 3 / 1; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 9 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="190" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / auto / auto / 1; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="190" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / auto / auto / 1; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 10 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="90" data-offset-x="55" data-offset-y="300" style="grid-area: 3 / auto / auto / 1; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="90" data-offset-x="255" data-offset-y="300" style="grid-area: 3 / auto / auto / 1; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 11 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="0" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 1 / 2; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="0" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 1 / 2; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 12 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="100" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 2 / 2; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="100" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 2 / 2; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 13 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="200" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 3 / 2; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="200" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 3 / 2; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 14 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="360" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / auto / 2; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="360" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / auto / 2; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 15 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="80" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / 2 / 2; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="80" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / 2 / 2; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 16 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="180" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / 3 / 2; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="180" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / 3 / 2; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 17 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="340" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / auto / 2; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="340" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / auto / 2; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 18 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="30" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / auto / 3 / 2; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="30" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / auto / 3 / 2; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 19 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="190" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / auto / auto / 2; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="190" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / auto / auto / 2; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 20 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="90" data-offset-x="55" data-offset-y="300" style="grid-area: 3 / auto / auto / 2; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="90" data-offset-x="255" data-offset-y="300" style="grid-area: 3 / auto / auto / 2; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 21 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="0" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 1 / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="0" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 1 / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 22 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="100" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 2 / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="100" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 2 / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 23 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="200" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 3 / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="200" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 3 / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 24 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="360" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / auto / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="360" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / auto / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 25 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="80" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / 2 / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="80" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / 2 / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 26 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="180" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / 3 / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="180" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / 3 / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 27 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="340" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / auto / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="340" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / auto / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 28 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="30" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / auto / 3 / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="30" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / auto / 3 / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 29 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="190" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / auto / auto / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="190" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / auto / auto / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 30 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="90" data-offset-x="55" data-offset-y="300" style="grid-area: 3 / auto / auto / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="90" data-offset-x="255" data-offset-y="300" style="grid-area: 3 / auto / auto / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 31 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="0" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 1 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="0" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 1 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 32 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="100" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 2 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="100" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 2 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 33 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="200" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / 3 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="200" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / 3 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 34 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="360" data-offset-x="55" data-offset-y="30" style="grid-area: auto / auto / auto / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="360" data-offset-x="255" data-offset-y="30" style="grid-area: auto / auto / auto / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 35 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="80" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / 2 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="80" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / 2 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 36 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="180" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / 3 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="180" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / 3 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 37 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="340" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / auto / auto / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="340" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / auto / auto / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 38 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="30" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / auto / 3 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="30" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / auto / 3 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 39 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="190" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / auto / auto / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="190" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / auto / auto / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 40 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="90" data-offset-x="55" data-offset-y="300" style="grid-area: 3 / auto / auto / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="90" data-offset-x="255" data-offset-y="300" style="grid-area: 3 / auto / auto / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 41 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="0" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / 1 / 2; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="0" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / 1 / 2; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 42 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="100" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / 2 / 2; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="100" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / 2 / 2; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 43 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="200" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / 3 / 2; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="200" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / 3 / 2; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 44 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="360" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / auto / 2; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="360" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / auto / 2; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 45 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="80" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 1 / 2 / 2; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="80" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 1 / 2 / 2; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 46 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="180" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 1 / 3 / 2; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="180" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 1 / 3 / 2; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 47 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="340" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 1 / auto / 2; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="340" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 1 / auto / 2; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 48 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="30" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 1 / 3 / 2; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="30" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 1 / 3 / 2; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 49 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="190" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 1 / auto / 2; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="190" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 1 / auto / 2; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 50 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="90" data-offset-x="55" data-offset-y="300" style="grid-area: 3 / 1 / auto / 2; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="90" data-offset-x="255" data-offset-y="300" style="grid-area: 3 / 1 / auto / 2; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 51 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="0" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / 1 / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="0" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / 1 / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 52 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="100" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / 2 / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="100" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / 2 / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 53 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="200" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / 3 / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="200" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / 3 / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 54 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="360" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / auto / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="360" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / auto / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 55 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="80" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 1 / 2 / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="80" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 1 / 2 / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 56 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="180" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 1 / 3 / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="180" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 1 / 3 / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 57 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="340" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 1 / auto / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="340" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 1 / auto / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 58 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="30" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 1 / 3 / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="30" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 1 / 3 / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 59 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="190" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 1 / auto / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="190" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 1 / auto / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 60 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="90" data-offset-x="55" data-offset-y="300" style="grid-area: 3 / 1 / auto / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="90" data-offset-x="255" data-offset-y="300" style="grid-area: 3 / 1 / auto / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 61 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="0" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / 1 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="0" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / 1 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 62 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="100" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / 2 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="100" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / 2 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 63 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="200" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / 3 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="200" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / 3 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 64 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="360" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 1 / auto / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="360" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 1 / auto / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 65 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="80" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 1 / 2 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="80" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 1 / 2 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 66 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="180" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 1 / 3 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="180" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 1 / 3 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 67 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="340" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 1 / auto / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="340" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 1 / auto / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 68 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="30" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 1 / 3 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="30" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 1 / 3 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 69 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="190" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 1 / auto / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="190" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 1 / auto / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 70 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="90" data-offset-x="55" data-offset-y="300" style="grid-area: 3 / 1 / auto / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="90" data-offset-x="255" data-offset-y="300" style="grid-area: 3 / 1 / auto / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 71 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="0" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 2 / 1 / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="0" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 2 / 1 / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 72 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="100" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 2 / 2 / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="100" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 2 / 2 / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 73 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="200" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 2 / 3 / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="200" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 2 / 3 / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 74 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="360" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 2 / auto / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="360" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 2 / auto / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 75 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="80" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 2 / 2 / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="80" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 2 / 2 / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 76 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="180" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 2 / 3 / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="180" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 2 / 3 / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 77 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="340" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 2 / auto / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="340" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 2 / auto / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 78 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="30" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 2 / 3 / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="30" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 2 / 3 / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 79 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="190" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 2 / auto / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="190" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 2 / auto / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 80 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="90" data-offset-x="55" data-offset-y="300" style="grid-area: 3 / 2 / auto / 3; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="90" data-offset-x="255" data-offset-y="300" style="grid-area: 3 / 2 / auto / 3; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 81 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="0" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 2 / 1 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="0" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 2 / 1 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 82 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="100" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 2 / 2 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="100" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 2 / 2 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 83 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="200" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 2 / 3 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="200" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 2 / 3 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 84 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="360" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 2 / auto / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="360" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 2 / auto / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 85 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="80" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 2 / 2 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="80" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 2 / 2 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 86 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="180" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 2 / 3 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="180" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 2 / 3 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 87 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="340" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 2 / auto / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="340" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 2 / auto / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 88 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="30" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 2 / 3 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="30" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 2 / 3 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 89 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="190" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 2 / auto / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="190" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 2 / auto / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 90 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="90" data-offset-x="55" data-offset-y="300" style="grid-area: 3 / 2 / auto / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="90" data-offset-x="255" data-offset-y="300" style="grid-area: 3 / 2 / auto / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 91 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="0" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 3 / 1 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="0" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 3 / 1 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 92 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="100" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 3 / 2 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="100" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 3 / 2 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 93 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="200" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 3 / 3 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="200" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 3 / 3 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 94 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="360" data-offset-x="55" data-offset-y="30" style="grid-area: auto / 3 / auto / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="360" data-offset-x="255" data-offset-y="30" style="grid-area: auto / 3 / auto / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 95 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="80" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 3 / 2 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="80" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 3 / 2 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 96 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="180" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 3 / 3 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="180" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 3 / 3 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 97 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="340" data-offset-x="55" data-offset-y="50" style="grid-area: 1 / 3 / auto / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="340" data-offset-x="255" data-offset-y="50" style="grid-area: 1 / 3 / auto / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 98 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="30" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 3 / 3 / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="30" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 3 / 3 / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 99 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="190" data-offset-x="55" data-offset-y="200" style="grid-area: 2 / 3 / auto / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="190" data-offset-x="255" data-offset-y="200" style="grid-area: 2 / 3 / auto / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+FAIL .grid 100 assert_equals: 
+<div class="grid"><div style="grid-area: 1 / 1 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="90" data-offset-x="55" data-offset-y="300" style="grid-area: 3 / 3 / auto / auto; inset: 30px auto 40px;">XX</div></div><div style="grid-area: 2 / 2 / auto / auto;">X<br>XX<div class="abspos orthogonal" data-expected-width="25" data-expected-height="90" data-offset-x="255" data-offset-y="300" style="grid-area: 3 / 3 / auto / auto; inset: 30px auto 40px;">XX</div></div></div>
+offsetLeft expected 55 but got 45
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt
new file mode 100644
index 0000000..1b32cf43
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt
@@ -0,0 +1,28 @@
+This is a testharness.js-based test.
+FAIL .grid 1 assert_equals: 
+<div class="grid">
+  <div data-offset-x="5" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div>
+  <div data-offset-x="180" data-offset-y="60" data-expected-width="60" data-expected-height="90" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div>
+  <div data-offset-x="0" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn RTL">X XX X</div>
+  <div data-offset-x="105" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+offsetLeft expected 180 but got 210
+FAIL .grid 2 assert_equals: 
+<div class="grid RTL">
+  <div data-offset-x="155" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div>
+  <div data-offset-x="80" data-offset-y="60" data-expected-width="60" data-expected-height="90" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div>
+  <div data-offset-x="160" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn LTR">X XX X</div>
+  <div data-offset-x="35" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+offsetLeft expected 80 but got 110
+PASS .grid 3
+FAIL .grid 4 assert_equals: 
+<div class="grid verticalRL">
+  <div data-offset-x="105" data-offset-y="70" data-expected-width="90" data-expected-height="30" class="firstRowFirstColumn horizontal">X XX X</div>
+  <div data-offset-x="140" data-offset-y="150" data-expected-width="100" data-expected-height="50" class="firstRowSecondColumn horizontal">XX X<br>X XXX X<br>XX XXX</div>
+  <div data-offset-x="5" data-offset-y="10" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn horizontal RTL">X XX X</div>
+  <div data-offset-x="5" data-offset-y="115" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+offsetLeft expected 105 but got 75
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt
new file mode 100644
index 0000000..1b32cf43
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt
@@ -0,0 +1,28 @@
+This is a testharness.js-based test.
+FAIL .grid 1 assert_equals: 
+<div class="grid">
+  <div data-offset-x="5" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div>
+  <div data-offset-x="180" data-offset-y="60" data-expected-width="60" data-expected-height="90" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div>
+  <div data-offset-x="0" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn RTL">X XX X</div>
+  <div data-offset-x="105" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+offsetLeft expected 180 but got 210
+FAIL .grid 2 assert_equals: 
+<div class="grid RTL">
+  <div data-offset-x="155" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div>
+  <div data-offset-x="80" data-offset-y="60" data-expected-width="60" data-expected-height="90" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div>
+  <div data-offset-x="160" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn LTR">X XX X</div>
+  <div data-offset-x="35" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+offsetLeft expected 80 but got 110
+PASS .grid 3
+FAIL .grid 4 assert_equals: 
+<div class="grid verticalRL">
+  <div data-offset-x="105" data-offset-y="70" data-expected-width="90" data-expected-height="30" class="firstRowFirstColumn horizontal">X XX X</div>
+  <div data-offset-x="140" data-offset-y="150" data-expected-width="100" data-expected-height="50" class="firstRowSecondColumn horizontal">XX X<br>X XXX X<br>XX XXX</div>
+  <div data-offset-x="5" data-offset-y="10" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn horizontal RTL">X XX X</div>
+  <div data-offset-x="5" data-offset-y="115" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+offsetLeft expected 105 but got 75
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-011-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-011-expected.txt
new file mode 100644
index 0000000..dcdaf1f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-011-expected.txt
@@ -0,0 +1,35 @@
+This is a testharness.js-based test.
+FAIL .grid 1 assert_equals: 
+<div class="grid">
+  <div data-offset-x="13" data-offset-y="2" data-expected-width="26" data-expected-height="70" class="firstRowFirstColumn verticalLR">X XX X</div>
+  <div data-offset-x="180" data-offset-y="60" data-expected-width="46" data-expected-height="80" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div>
+  <div data-offset-x="0" data-offset-y="160" data-expected-width="76" data-expected-height="20" class="secondRowFirstColumn RTL">X XX X</div>
+  <div data-offset-x="105" data-offset-y="160" data-expected-width="56" data-expected-height="70" class="secondRowSecondColumn verticalLR RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+offsetLeft expected 180 but got 210
+FAIL .grid 2 assert_equals: 
+<div class="grid RTL">
+  <div data-offset-x="155" data-offset-y="0" data-expected-width="26" data-expected-height="70" class="firstRowFirstColumn verticalLR">X XX X</div>
+  <div data-offset-x="80" data-offset-y="60" data-expected-width="46" data-expected-height="80" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div>
+  <div data-offset-x="160" data-offset-y="160" data-expected-width="76" data-expected-height="20" class="secondRowFirstColumn LTR">X XX X</div>
+  <div data-offset-x="35" data-offset-y="160" data-expected-width="56" data-expected-height="70" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+offsetLeft expected 155 but got 163
+FAIL .grid 3 assert_equals: 
+<div class="grid verticalLR">
+  <div data-offset-x="5" data-offset-y="70" data-expected-width="76" data-expected-height="20" class="firstRowFirstColumn horizontal">X XX X</div>
+  <div data-offset-x="40" data-offset-y="150" data-expected-width="86" data-expected-height="40" class="firstRowSecondColumn horizontal">XX X<br>X XXX X<br>XX XXX</div>
+  <div data-offset-x="180" data-offset-y="10" data-expected-width="26" data-expected-height="20" class="secondRowFirstColumn verticalRL">X XX X</div>
+  <div data-offset-x="155" data-offset-y="110" data-expected-width="76" data-expected-height="50" class="secondRowSecondColumn horizontal RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+offsetLeft expected 5 but got 13
+FAIL .grid 4 assert_equals: 
+<div class="grid verticalRL">
+  <div data-offset-x="105" data-offset-y="70" data-expected-width="76" data-expected-height="20" class="firstRowFirstColumn horizontal">X XX X</div>
+  <div data-offset-x="140" data-offset-y="150" data-expected-width="86" data-expected-height="40" class="firstRowSecondColumn horizontal">XX X<br>X XXX X<br>XX XXX</div>
+  <div data-offset-x="5" data-offset-y="10" data-expected-width="76" data-expected-height="20" class="secondRowFirstColumn horizontal RTL">X XX X</div>
+  <div data-offset-x="5" data-offset-y="115" data-expected-width="56" data-expected-height="70" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+offsetLeft expected 105 but got 101
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/grid-items/grid-item-percentage-sizes-003-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/grid-items/grid-item-percentage-sizes-003-expected.png
new file mode 100644
index 0000000..4c97903a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-grid/grid-items/grid-item-percentage-sizes-003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-multicol/multicol-span-all-list-item-002-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-multicol/multicol-span-all-list-item-002-expected.png
new file mode 100644
index 0000000..85a5121
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-multicol/multicol-span-all-list-item-002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/position-absolute-container-dynamic-002-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/position-absolute-container-dynamic-002-expected.txt
new file mode 100644
index 0000000..e4cff77
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/position-absolute-container-dynamic-002-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL #target static position responded to parent relayout assert_equals: expected 100 but got 200
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/position-absolute-dynamic-overflow-002-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/position-absolute-dynamic-overflow-002-expected.png
new file mode 100644
index 0000000..8d3bc14
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/position-absolute-dynamic-overflow-002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/position-absolute-in-inline-001-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/position-absolute-in-inline-001-expected.txt
new file mode 100644
index 0000000..d1e16e3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/position-absolute-in-inline-001-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL absolute inside inline container location should be correct. assert_equals: expected 0 but got 100
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/position-absolute-in-inline-002-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/position-absolute-in-inline-002-expected.txt
new file mode 100644
index 0000000..d6f13b88
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/position-absolute-in-inline-002-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL absolute inside inline container location should be correct. assert_equals: left matches container expected 69 but got 0
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/position-absolute-replaced-minmax-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/position-absolute-replaced-minmax-expected.txt
new file mode 100644
index 0000000..0487968
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/position-absolute-replaced-minmax-expected.txt
@@ -0,0 +1,40 @@
+This is a testharness.js-based test.
+PASS minmax replaced IFRAME 1
+PASS minmax replaced IFRAME 2
+PASS minmax replaced IFRAME 3
+PASS minmax replaced IFRAME 4
+PASS minmax replaced IFRAME 5
+PASS minmax replaced IFRAME 6
+PASS minmax replaced IFRAME 7
+PASS minmax replaced IFRAME 8
+PASS minmax replaced IFRAME 9
+PASS minmax replaced IFRAME 10
+PASS minmax replaced IFRAME 11
+PASS minmax replaced IMG 12
+PASS minmax replaced IMG 13
+PASS minmax replaced IMG 14
+PASS minmax replaced IMG 15
+PASS minmax replaced IMG 16
+PASS minmax replaced IMG 17
+PASS minmax replaced IMG 18
+PASS minmax replaced IMG 19
+PASS minmax replaced IMG 20
+PASS minmax replaced IMG 21
+PASS minmax replaced IMG 22
+PASS minmax replaced IMG svg 23
+PASS minmax replaced IMG svg 24
+PASS minmax replaced IMG svg 25
+PASS minmax replaced IMG svg 26
+PASS minmax replaced IMG svg 27
+PASS minmax replaced IMG svg 28
+PASS minmax replaced IMG svg 29
+PASS minmax replaced IMG svg 30
+PASS minmax replaced IMG svg 31
+PASS minmax replaced IMG svg 32
+PASS minmax replaced IMG svg 33
+PASS minmax replaced IMG 34
+FAIL minmax replaced IMG 35 assert_equals: incorrect offsetWidth expected "400" but got "438"
+PASS minmax replaced IMG 36
+PASS minmax replaced IMG 37
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/htb-ltr-rtl.tentative-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/htb-ltr-rtl.tentative-expected.png
new file mode 100644
index 0000000..09a7a23
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/htb-ltr-rtl.tentative-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/htb-rtl-ltr.tentative-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/htb-rtl-ltr.tentative-expected.png
new file mode 100644
index 0000000..6a6777a9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/htb-rtl-ltr.tentative-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/htb-rtl-rtl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/htb-rtl-rtl-expected.png
new file mode 100644
index 0000000..85d76f7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/htb-rtl-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/vlr-ltr-rtl.tentative-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/vlr-ltr-rtl.tentative-expected.png
new file mode 100644
index 0000000..dba91da0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/vlr-ltr-rtl.tentative-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/vlr-rtl-ltr.tentative-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/vlr-rtl-ltr.tentative-expected.png
new file mode 100644
index 0000000..67d04c27
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/vlr-rtl-ltr.tentative-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/vlr-rtl-rtl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/vlr-rtl-rtl-expected.png
new file mode 100644
index 0000000..cbe34cfb
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/vlr-rtl-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/vrl-ltr-rtl.tentative-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/vrl-ltr-rtl.tentative-expected.png
new file mode 100644
index 0000000..7b2e448
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/vrl-ltr-rtl.tentative-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/vrl-rtl-ltr.tentative-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/vrl-rtl-ltr.tentative-expected.png
new file mode 100644
index 0000000..be12c70
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/vrl-rtl-ltr.tentative-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/vrl-rtl-rtl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/vrl-rtl-rtl-expected.png
new file mode 100644
index 0000000..af779163
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-position/static-position/vrl-rtl-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-rhythm/line-height-step-dynamic-001-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-rhythm/line-height-step-dynamic-001-expected.txt
new file mode 100644
index 0000000..5952b13e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-rhythm/line-height-step-dynamic-001-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+PASS Height must change when line-height-step changes
+PASS Height must not change after relayout
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-shapes/shape-outside/supported-shapes/polygon/shape-outside-polygon-017-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-shapes/shape-outside/supported-shapes/polygon/shape-outside-polygon-017-expected.png
new file mode 100644
index 0000000..922e4b4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-shapes/shape-outside/supported-shapes/polygon/shape-outside-polygon-017-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-shapes/spec-examples/shape-outside-018-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-shapes/spec-examples/shape-outside-018-expected.txt
new file mode 100644
index 0000000..50c5fb4c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-shapes/spec-examples/shape-outside-018-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL CSS Test: shape-margin offset from a polygonal shape-outside assert_approx_equals: Line 0 is positioned properly expected 48 +/- 2 but got 180
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-sizing/clone-nowrap-intrinsic-size-bidi-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-sizing/clone-nowrap-intrinsic-size-bidi-expected.png
new file mode 100644
index 0000000..277af99f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-sizing/clone-nowrap-intrinsic-size-bidi-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-sizing/intrinsic-percent-non-replaced-004-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-sizing/intrinsic-percent-non-replaced-004-expected.png
new file mode 100644
index 0000000..9c0a4d18
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-sizing/intrinsic-percent-non-replaced-004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-sizing/intrinsic-percent-non-replaced-005-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-sizing/intrinsic-percent-non-replaced-005-expected.png
new file mode 100644
index 0000000..5dda91a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-sizing/intrinsic-percent-non-replaced-005-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-sizing/whitespace-and-break-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-sizing/whitespace-and-break-expected.png
new file mode 100644
index 0000000..63aaec9d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-sizing/whitespace-and-break-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/boundary-shaping/boundary-shaping-001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/boundary-shaping/boundary-shaping-001-expected.png
new file mode 100644
index 0000000..a034a626
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/boundary-shaping/boundary-shaping-001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/boundary-shaping/boundary-shaping-003-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/boundary-shaping/boundary-shaping-003-expected.png
new file mode 100644
index 0000000..4f643c92
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/boundary-shaping/boundary-shaping-003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/boundary-shaping/boundary-shaping-004-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/boundary-shaping/boundary-shaping-004-expected.png
new file mode 100644
index 0000000..099254c1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/boundary-shaping/boundary-shaping-004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/boundary-shaping/boundary-shaping-005-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/boundary-shaping/boundary-shaping-005-expected.png
new file mode 100644
index 0000000..099254c1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/boundary-shaping/boundary-shaping-005-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/boundary-shaping/boundary-shaping-010-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/boundary-shaping/boundary-shaping-010-expected.png
new file mode 100644
index 0000000..9fadc299
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/boundary-shaping/boundary-shaping-010-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/hyphens/hyphens-shaping-001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/hyphens/hyphens-shaping-001-expected.png
new file mode 100644
index 0000000..518e4bd5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/hyphens/hyphens-shaping-001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-break/line-break-shaping-001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-break/line-break-shaping-001-expected.png
new file mode 100644
index 0000000..bd68ee13
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-break/line-break-shaping-001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-009-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-009-expected.png
new file mode 100644
index 0000000..2968bae
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-009-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-011-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-011-expected.png
new file mode 100644
index 0000000..2968bae
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-011-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-015-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-015-expected.png
new file mode 100644
index 0000000..9ea102e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-015-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-atomic-003-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-atomic-003-expected.png
new file mode 100644
index 0000000..f14acbb8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-atomic-003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-atomic-004-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-atomic-004-expected.png
new file mode 100644
index 0000000..9a6d6f3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-atomic-004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-atomic-005-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-atomic-005-expected.png
new file mode 100644
index 0000000..222231f7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-atomic-005-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-atomic-006-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-atomic-006-expected.png
new file mode 100644
index 0000000..222231f7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-atomic-006-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-ic-002-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-ic-002-expected.png
new file mode 100644
index 0000000..91330ef
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-ic-002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-ic-003-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-ic-003-expected.png
new file mode 100644
index 0000000..91330ef
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-ic-003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-replaced-002-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-replaced-002-expected.png
new file mode 100644
index 0000000..142bc86
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-replaced-002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-replaced-003-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-replaced-003-expected.png
new file mode 100644
index 0000000..01cfe12
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/line-breaking/line-breaking-replaced-003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/overflow-wrap/overflow-wrap-shaping-001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/overflow-wrap/overflow-wrap-shaping-001-expected.png
new file mode 100644
index 0000000..bd68ee13
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/overflow-wrap/overflow-wrap-shaping-001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-000-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-000-expected.png
new file mode 100644
index 0000000..af616b36
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-000-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-001-expected.png
new file mode 100644
index 0000000..59a2bafd
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-002-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-002-expected.png
new file mode 100644
index 0000000..05064fe
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-003-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-003-expected.png
new file mode 100644
index 0000000..6c3caa7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-004-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-004-expected.png
new file mode 100644
index 0000000..af616b36
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-005-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-005-expected.png
new file mode 100644
index 0000000..af616b36
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-005-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-006-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-006-expected.png
new file mode 100644
index 0000000..af616b36
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-006-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-007-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-007-expected.png
new file mode 100644
index 0000000..af616b36
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-007-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-008-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-008-expected.png
new file mode 100644
index 0000000..11bb90d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-008-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-014-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-014-expected.png
new file mode 100644
index 0000000..9591b58
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-014-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-016-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-016-expected.png
new file mode 100644
index 0000000..2cd9b30
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-016-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-017-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-017-expected.png
new file mode 100644
index 0000000..6c3caa7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-017-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-018-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-018-expected.png
new file mode 100644
index 0000000..05064fe
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-018-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-020-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-020-expected.png
new file mode 100644
index 0000000..46cd623
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-020-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-021-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-021-expected.png
new file mode 100644
index 0000000..f0df001a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-021-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-022-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-022-expected.png
new file mode 100644
index 0000000..679f270
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-022-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-023-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-023-expected.png
new file mode 100644
index 0000000..5fc9387
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping-023-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping_lig-000-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping_lig-000-expected.png
new file mode 100644
index 0000000..7cf32e8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/shaping/shaping_lig-000-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/text-encoding/shaping-join-003-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/text-encoding/shaping-join-003-expected.png
new file mode 100644
index 0000000..9e983fcc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/text-encoding/shaping-join-003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/text-encoding/shaping-tatweel-003-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/text-encoding/shaping-tatweel-003-expected.png
new file mode 100644
index 0000000..45c87e3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/text-encoding/shaping-tatweel-003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/text-transform/text-transform-shaping-001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/text-transform/text-transform-shaping-001-expected.png
new file mode 100644
index 0000000..320927e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/text-transform/text-transform-shaping-001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/text-transform/text-transform-shaping-002-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/text-transform/text-transform-shaping-002-expected.png
new file mode 100644
index 0000000..320927e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/text-transform/text-transform-shaping-002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/text-transform/text-transform-shaping-003-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/text-transform/text-transform-shaping-003-expected.png
new file mode 100644
index 0000000..320927e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/text-transform/text-transform-shaping-003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/white-space/control-chars-00C-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/white-space/control-chars-00C-expected.png
new file mode 100644
index 0000000..d46473fa
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/white-space/control-chars-00C-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/white-space/line-edge-white-space-collapse-001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/white-space/line-edge-white-space-collapse-001-expected.png
new file mode 100644
index 0000000..17cde20
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/white-space/line-edge-white-space-collapse-001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/white-space/line-edge-white-space-collapse-002-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/white-space/line-edge-white-space-collapse-002-expected.png
new file mode 100644
index 0000000..e345e14
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/white-space/line-edge-white-space-collapse-002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/white-space/seg-break-transformation-016-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/white-space/seg-break-transformation-016-expected.txt
new file mode 100644
index 0000000..17be47d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/white-space/seg-break-transformation-016-expected.txt
@@ -0,0 +1,15 @@
+This is a testharness.js-based test.
+FAIL linebreak only assert_equals: expected 98 but got 105
+PASS zwsp retained 1
+FAIL spaces linebreak assert_equals: expected 98 but got 105
+PASS zwsp retained 2
+FAIL linebreak spaces assert_equals: expected 98 but got 105
+PASS zwsp retained 3
+FAIL spaces linebreak spaces assert_equals: expected 98 but got 105
+PASS zwsp retained 4
+FAIL multiple linebreaks assert_equals: expected 98 but got 105
+PASS zwsp retained 5
+FAIL multiple linebreaks + spaces assert_equals: expected 98 but got 105
+PASS zwsp retained 6
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/white-space/seg-break-transformation-017-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/white-space/seg-break-transformation-017-expected.txt
new file mode 100644
index 0000000..17be47d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/white-space/seg-break-transformation-017-expected.txt
@@ -0,0 +1,15 @@
+This is a testharness.js-based test.
+FAIL linebreak only assert_equals: expected 98 but got 105
+PASS zwsp retained 1
+FAIL spaces linebreak assert_equals: expected 98 but got 105
+PASS zwsp retained 2
+FAIL linebreak spaces assert_equals: expected 98 but got 105
+PASS zwsp retained 3
+FAIL spaces linebreak spaces assert_equals: expected 98 but got 105
+PASS zwsp retained 4
+FAIL multiple linebreaks assert_equals: expected 98 but got 105
+PASS zwsp retained 5
+FAIL multiple linebreaks + spaces assert_equals: expected 98 but got 105
+PASS zwsp retained 6
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/white-space/trailing-space-before-br-001-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/white-space/trailing-space-before-br-001-expected.txt
new file mode 100644
index 0000000..9bc72bc3d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/white-space/trailing-space-before-br-001-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+PASS 1111
+PASS 1111&#x20;
+PASS &#x20;1111
+PASS &#x20;1111&#x20;
+PASS 1111<br>
+PASS 1111<br>&#x20;
+FAIL 1111&#x20;<br> assert_approx_equals: expected 20 +/- 1 but got 23
+FAIL 1111&#x20;<br>&#x20; assert_approx_equals: expected 20 +/- 1 but got 23
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/word-break/word-break-break-all-004-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/word-break/word-break-break-all-004-expected.png
new file mode 100644
index 0000000..51a7d56
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-text/word-break/word-break-break-all-004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-ui/text-overflow-010-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-ui/text-overflow-010-expected.png
new file mode 100644
index 0000000..b60ee837
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-ui/text-overflow-010-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-003-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-003-expected.png
new file mode 100644
index 0000000..ebfd3104
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-005-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-005-expected.png
new file mode 100644
index 0000000..3c1ba13
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-005-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-011-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-011-expected.png
new file mode 100644
index 0000000..ebfd3104
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-011-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-013-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-013-expected.png
new file mode 100644
index 0000000..3c1ba13
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-013-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-033-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-033-expected.png
new file mode 100644
index 0000000..09a4f1a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-033-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-002-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-002-expected.png
new file mode 100644
index 0000000..bf8e2ed
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-004-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-004-expected.png
new file mode 100644
index 0000000..3c1ba13
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-006-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-006-expected.png
new file mode 100644
index 0000000..105d1d7e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-006-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-008-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-008-expected.png
new file mode 100644
index 0000000..073ad955
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-008-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-010-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-010-expected.png
new file mode 100644
index 0000000..73b0deaf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-010-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-012-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-012-expected.png
new file mode 100644
index 0000000..3c1ba13
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-012-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-014-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-014-expected.png
new file mode 100644
index 0000000..073ad955
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-014-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-016-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-016-expected.png
new file mode 100644
index 0000000..073ad955
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-016-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-018-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-018-expected.png
new file mode 100644
index 0000000..37adf50
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-018-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-020-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-020-expected.png
new file mode 100644
index 0000000..37adf50
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-020-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-030-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-030-expected.png
new file mode 100644
index 0000000..99575fa
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-030-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-005-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-005-expected.png
new file mode 100644
index 0000000..91dd899
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-005-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-017-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-017-expected.png
new file mode 100644
index 0000000..882eacf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-017-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-029-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-029-expected.png
new file mode 100644
index 0000000..91dd899
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-029-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-041-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-041-expected.png
new file mode 100644
index 0000000..882eacf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-041-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-053-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-053-expected.png
new file mode 100644
index 0000000..3eef8726
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-053-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-065-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-065-expected.png
new file mode 100644
index 0000000..3eef8726
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-065-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-077-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-077-expected.png
new file mode 100644
index 0000000..882eacf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-077-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-089-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-089-expected.png
new file mode 100644
index 0000000..3eef8726
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-089-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-095-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-095-expected.png
new file mode 100644
index 0000000..2379a48
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-095-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-105-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-105-expected.png
new file mode 100644
index 0000000..91dd899
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-105-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-109-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-109-expected.png
new file mode 100644
index 0000000..3e5ca74
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-109-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-121-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-121-expected.png
new file mode 100644
index 0000000..be3b68b90
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-121-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-125-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-125-expected.png
new file mode 100644
index 0000000..34af7747
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-137-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-137-expected.png
new file mode 100644
index 0000000..91dd899
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-137-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-141-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-141-expected.png
new file mode 100644
index 0000000..3e5ca74
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-141-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-153-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-153-expected.png
new file mode 100644
index 0000000..66358d26
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-153-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-157-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-157-expected.png
new file mode 100644
index 0000000..e924d3e4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-157-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-169-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-169-expected.png
new file mode 100644
index 0000000..be3b68b90
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-169-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-173-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-173-expected.png
new file mode 100644
index 0000000..34af7747
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-173-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-185-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-185-expected.png
new file mode 100644
index 0000000..be3b68b90
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-185-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-189-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-189-expected.png
new file mode 100644
index 0000000..34af7747
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-189-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-201-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-201-expected.png
new file mode 100644
index 0000000..66358d26
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-201-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-205-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-205-expected.png
new file mode 100644
index 0000000..e924d3e4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-205-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-217-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-217-expected.png
new file mode 100644
index 0000000..be3b68b90
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-217-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-221-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-221-expected.png
new file mode 100644
index 0000000..e924d3e4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-221-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-225-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-225-expected.png
new file mode 100644
index 0000000..34af7747
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-225-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-229-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-229-expected.png
new file mode 100644
index 0000000..66358d26
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vlr-229-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-004-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-004-expected.png
new file mode 100644
index 0000000..3eef8726
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-010-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-010-expected.png
new file mode 100644
index 0000000..2379a48
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-010-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-016-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-016-expected.png
new file mode 100644
index 0000000..882eacf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-016-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-028-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-028-expected.png
new file mode 100644
index 0000000..3eef8726
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-028-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-034-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-034-expected.png
new file mode 100644
index 0000000..2379a48
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-034-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-040-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-040-expected.png
new file mode 100644
index 0000000..882eacf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-040-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-052-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-052-expected.png
new file mode 100644
index 0000000..3eef8726
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-052-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-064-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-064-expected.png
new file mode 100644
index 0000000..3eef8726
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-064-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-076-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-076-expected.png
new file mode 100644
index 0000000..882eacf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-076-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-088-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-088-expected.png
new file mode 100644
index 0000000..91dd899
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-088-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-104-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-104-expected.png
new file mode 100644
index 0000000..3eef8726
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-104-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-108-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-108-expected.png
new file mode 100644
index 0000000..e924d3e4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-108-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-112-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-112-expected.png
new file mode 100644
index 0000000..2379a48
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-112-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-116-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-116-expected.png
new file mode 100644
index 0000000..66358d26
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-116-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-124-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-124-expected.png
new file mode 100644
index 0000000..34af7747
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-124-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-128-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-128-expected.png
new file mode 100644
index 0000000..2ff3c3e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-128-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-136-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-136-expected.png
new file mode 100644
index 0000000..3eef8726
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-136-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-140-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-140-expected.png
new file mode 100644
index 0000000..e924d3e4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-140-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-144-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-144-expected.png
new file mode 100644
index 0000000..2379a48
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-144-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-148-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-148-expected.png
new file mode 100644
index 0000000..66358d26
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-148-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-156-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-156-expected.png
new file mode 100644
index 0000000..e924d3e4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-156-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-160-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-160-expected.png
new file mode 100644
index 0000000..2379a48
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-160-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-172-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-172-expected.png
new file mode 100644
index 0000000..34af7747
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-172-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-176-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-176-expected.png
new file mode 100644
index 0000000..2ff3c3e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-176-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-188-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-188-expected.png
new file mode 100644
index 0000000..34af7747
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-188-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-192-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-192-expected.png
new file mode 100644
index 0000000..2ff3c3e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-192-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-204-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-204-expected.png
new file mode 100644
index 0000000..e924d3e4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-204-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-208-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-208-expected.png
new file mode 100644
index 0000000..2379a48
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-208-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-220-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-220-expected.png
new file mode 100644
index 0000000..3e5ca74
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-220-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-224-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-224-expected.png
new file mode 100644
index 0000000..3e5ca74
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-224-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/available-size-002-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/available-size-002-expected.png
new file mode 100644
index 0000000..d9243a5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/available-size-002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/available-size-010-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/available-size-010-expected.png
new file mode 100644
index 0000000..af3f91298
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/available-size-010-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/available-size-017-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/available-size-017-expected.png
new file mode 100644
index 0000000..9e447dcd
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/available-size-017-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/baseline-with-orthogonal-flow-001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/baseline-with-orthogonal-flow-001-expected.png
new file mode 100644
index 0000000..83118c65
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/baseline-with-orthogonal-flow-001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/block-flow-direction-vrl-009-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/block-flow-direction-vrl-009-expected.png
new file mode 100644
index 0000000..ea75daa2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/block-flow-direction-vrl-009-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/inline-box-border-vlr-001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/inline-box-border-vlr-001-expected.png
new file mode 100644
index 0000000..75fb6bf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/inline-box-border-vlr-001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/line-box-direction-vrl-009-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/line-box-direction-vrl-009-expected.png
new file mode 100644
index 0000000..fb43b54a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/line-box-direction-vrl-009-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/line-box-height-vlr-021-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/line-box-height-vlr-021-expected.png
new file mode 100644
index 0000000..5c92f3cd
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/line-box-height-vlr-021-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/line-box-height-vlr-023-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/line-box-height-vlr-023-expected.png
new file mode 100644
index 0000000..5ecd445
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/line-box-height-vlr-023-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/ortho-htb-alongside-vrl-floats-006-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/ortho-htb-alongside-vrl-floats-006-expected.png
new file mode 100644
index 0000000..92a6d5f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/ortho-htb-alongside-vrl-floats-006-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/ortho-htb-alongside-vrl-floats-014-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/ortho-htb-alongside-vrl-floats-014-expected.png
new file mode 100644
index 0000000..78257ce6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/ortho-htb-alongside-vrl-floats-014-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vlr-001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vlr-001-expected.png
new file mode 100644
index 0000000..d097b815
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vlr-001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vlr-004-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vlr-004-expected.png
new file mode 100644
index 0000000..035cd67
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vlr-004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-htb-in-vlr-001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-htb-in-vlr-001-expected.png
new file mode 100644
index 0000000..a6bf546
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-htb-in-vlr-001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-htb-in-vlr-002-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-htb-in-vlr-002-expected.png
new file mode 100644
index 0000000..eb836a5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-htb-in-vlr-002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-htb-in-vrl-001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-htb-in-vrl-001-expected.png
new file mode 100644
index 0000000..cf34608
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-htb-in-vrl-001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-htb-in-vrl-002-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-htb-in-vrl-002-expected.png
new file mode 100644
index 0000000..cbb8435
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-htb-in-vrl-002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-vlr-in-htb-001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-vlr-in-htb-001-expected.png
new file mode 100644
index 0000000..87cea5f6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-vlr-in-htb-001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-vlr-in-htb-002-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-vlr-in-htb-002-expected.png
new file mode 100644
index 0000000..ab82d607
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-vlr-in-htb-002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-vrl-in-htb-001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-vrl-in-htb-001-expected.png
new file mode 100644
index 0000000..f142458
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-vrl-in-htb-001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-vrl-in-htb-002-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-vrl-in-htb-002-expected.png
new file mode 100644
index 0000000..794a279
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-prct-vrl-in-htb-002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-vlr-in-htb-001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-vlr-in-htb-001-expected.png
new file mode 100644
index 0000000..fd8082c9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-vlr-in-htb-001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-vlr-in-htb-004-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-vlr-in-htb-004-expected.png
new file mode 100644
index 0000000..720b450
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-vlr-in-htb-004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-vrl-in-htb-001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-vrl-in-htb-001-expected.png
new file mode 100644
index 0000000..c645ed1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-vrl-in-htb-001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-vrl-in-htb-004-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-vrl-in-htb-004-expected.png
new file mode 100644
index 0000000..6e5e4b5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/sizing-orthog-vrl-in-htb-004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/two-levels-of-orthogonal-flows-percentage-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/two-levels-of-orthogonal-flows-percentage-expected.png
new file mode 100644
index 0000000..e2fb8967
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/two-levels-of-orthogonal-flows-percentage-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/vertical-alignment-003-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/vertical-alignment-003-expected.png
new file mode 100644
index 0000000..e777db28
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/vertical-alignment-003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/vertical-alignment-009-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/vertical-alignment-009-expected.png
new file mode 100644
index 0000000..4448d19
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/css-writing-modes/vertical-alignment-009-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/cssom-view/cssom-getClientRects-002-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/cssom-view/cssom-getClientRects-002-expected.txt
new file mode 100644
index 0000000..f2b29367
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/cssom-view/cssom-getClientRects-002-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL CSSOM View - GetClientRects().length is the same regardless source new lines assert_equals: count2 expected 1 but got 2
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/cssom-view/elementFromPoint-002-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/cssom-view/elementFromPoint-002-expected.txt
new file mode 100644
index 0000000..84331f9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/cssom-view/elementFromPoint-002-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+FAIL Checking whether dynamic changes to visibility interact correctly with
+  table anonymous boxes assert_equals: Should hit the overlay first. expected Element node <div id="overlay"><div></div></div> but got Element node <div id="target">Some text</div>
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/cssom-view/elementFromPoint-003-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/cssom-view/elementFromPoint-003-expected.txt
new file mode 100644
index 0000000..532b2b5a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/cssom-view/elementFromPoint-003-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+FAIL Checking whether dynamic changes to visibility interact correctly with
+  table anonymous boxes assert_equals: Should hit the overlay first. expected Element node <div id="overlay"><div></div><div></div></div> but got Element node <div id="target">Some text</div>
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/cssom/getComputedStyle-insets-absolute-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/cssom/getComputedStyle-insets-absolute-expected.txt
new file mode 100644
index 0000000..74a91796
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/cssom/getComputedStyle-insets-absolute-expected.txt
@@ -0,0 +1,328 @@
+This is a testharness.js-based test.
+Found 324 tests; 276 PASS, 48 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS horizontal-tb ltr inside horizontal-tb ltr - Pixels resolve as-is
+PASS horizontal-tb ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels
+PASS horizontal-tb ltr inside horizontal-tb ltr - Percentages are absolutized into pixels
+PASS horizontal-tb ltr inside horizontal-tb ltr - calc() is absolutized into pixels
+PASS horizontal-tb ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained
+PASS horizontal-tb ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained
+PASS horizontal-tb ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS horizontal-tb ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+PASS horizontal-tb ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value
+PASS horizontal-tb ltr inside horizontal-tb rtl - Pixels resolve as-is
+PASS horizontal-tb ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels
+PASS horizontal-tb ltr inside horizontal-tb rtl - Percentages are absolutized into pixels
+PASS horizontal-tb ltr inside horizontal-tb rtl - calc() is absolutized into pixels
+PASS horizontal-tb ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained
+PASS horizontal-tb ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained
+PASS horizontal-tb ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS horizontal-tb ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+PASS horizontal-tb ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value
+PASS horizontal-tb ltr inside vertical-lr ltr - Pixels resolve as-is
+PASS horizontal-tb ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels
+PASS horizontal-tb ltr inside vertical-lr ltr - Percentages are absolutized into pixels
+PASS horizontal-tb ltr inside vertical-lr ltr - calc() is absolutized into pixels
+PASS horizontal-tb ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained
+PASS horizontal-tb ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained
+PASS horizontal-tb ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS horizontal-tb ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL horizontal-tb ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "15px" but got "30px"
+PASS horizontal-tb ltr inside vertical-lr rtl - Pixels resolve as-is
+PASS horizontal-tb ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels
+PASS horizontal-tb ltr inside vertical-lr rtl - Percentages are absolutized into pixels
+PASS horizontal-tb ltr inside vertical-lr rtl - calc() is absolutized into pixels
+PASS horizontal-tb ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained
+PASS horizontal-tb ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained
+PASS horizontal-tb ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS horizontal-tb ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL horizontal-tb ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "185px" but got "30px"
+PASS horizontal-tb ltr inside vertical-rl ltr - Pixels resolve as-is
+PASS horizontal-tb ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels
+PASS horizontal-tb ltr inside vertical-rl ltr - Percentages are absolutized into pixels
+PASS horizontal-tb ltr inside vertical-rl ltr - calc() is absolutized into pixels
+PASS horizontal-tb ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained
+PASS horizontal-tb ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained
+FAIL horizontal-tb ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "396px" but got "4px"
+FAIL horizontal-tb ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "398px" but got "2px"
+FAIL horizontal-tb ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "15px" but got "30px"
+PASS horizontal-tb ltr inside vertical-rl rtl - Pixels resolve as-is
+PASS horizontal-tb ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels
+PASS horizontal-tb ltr inside vertical-rl rtl - Percentages are absolutized into pixels
+PASS horizontal-tb ltr inside vertical-rl rtl - calc() is absolutized into pixels
+PASS horizontal-tb ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained
+PASS horizontal-tb ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained
+FAIL horizontal-tb ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "396px" but got "4px"
+FAIL horizontal-tb ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "398px" but got "2px"
+FAIL horizontal-tb ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "185px" but got "30px"
+PASS horizontal-tb rtl inside horizontal-tb ltr - Pixels resolve as-is
+PASS horizontal-tb rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels
+PASS horizontal-tb rtl inside horizontal-tb ltr - Percentages are absolutized into pixels
+PASS horizontal-tb rtl inside horizontal-tb ltr - calc() is absolutized into pixels
+PASS horizontal-tb rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained
+PASS horizontal-tb rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained
+PASS horizontal-tb rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS horizontal-tb rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+PASS horizontal-tb rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value
+PASS horizontal-tb rtl inside horizontal-tb rtl - Pixels resolve as-is
+PASS horizontal-tb rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels
+PASS horizontal-tb rtl inside horizontal-tb rtl - Percentages are absolutized into pixels
+PASS horizontal-tb rtl inside horizontal-tb rtl - calc() is absolutized into pixels
+PASS horizontal-tb rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained
+PASS horizontal-tb rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained
+PASS horizontal-tb rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS horizontal-tb rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+PASS horizontal-tb rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value
+PASS horizontal-tb rtl inside vertical-lr ltr - Pixels resolve as-is
+PASS horizontal-tb rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels
+PASS horizontal-tb rtl inside vertical-lr ltr - Percentages are absolutized into pixels
+PASS horizontal-tb rtl inside vertical-lr ltr - calc() is absolutized into pixels
+PASS horizontal-tb rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained
+PASS horizontal-tb rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained
+PASS horizontal-tb rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS horizontal-tb rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL horizontal-tb rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "15px" but got "30px"
+PASS horizontal-tb rtl inside vertical-lr rtl - Pixels resolve as-is
+PASS horizontal-tb rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels
+PASS horizontal-tb rtl inside vertical-lr rtl - Percentages are absolutized into pixels
+PASS horizontal-tb rtl inside vertical-lr rtl - calc() is absolutized into pixels
+PASS horizontal-tb rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained
+PASS horizontal-tb rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained
+PASS horizontal-tb rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS horizontal-tb rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL horizontal-tb rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "185px" but got "30px"
+PASS horizontal-tb rtl inside vertical-rl ltr - Pixels resolve as-is
+PASS horizontal-tb rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels
+PASS horizontal-tb rtl inside vertical-rl ltr - Percentages are absolutized into pixels
+PASS horizontal-tb rtl inside vertical-rl ltr - calc() is absolutized into pixels
+PASS horizontal-tb rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained
+PASS horizontal-tb rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained
+FAIL horizontal-tb rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "396px" but got "4px"
+FAIL horizontal-tb rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "398px" but got "2px"
+FAIL horizontal-tb rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "15px" but got "30px"
+PASS horizontal-tb rtl inside vertical-rl rtl - Pixels resolve as-is
+PASS horizontal-tb rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels
+PASS horizontal-tb rtl inside vertical-rl rtl - Percentages are absolutized into pixels
+PASS horizontal-tb rtl inside vertical-rl rtl - calc() is absolutized into pixels
+PASS horizontal-tb rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained
+PASS horizontal-tb rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained
+FAIL horizontal-tb rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "396px" but got "4px"
+FAIL horizontal-tb rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "398px" but got "2px"
+FAIL horizontal-tb rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "185px" but got "30px"
+PASS vertical-lr ltr inside horizontal-tb ltr - Pixels resolve as-is
+PASS vertical-lr ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels
+PASS vertical-lr ltr inside horizontal-tb ltr - Percentages are absolutized into pixels
+PASS vertical-lr ltr inside horizontal-tb ltr - calc() is absolutized into pixels
+PASS vertical-lr ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained
+PASS vertical-lr ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained
+PASS vertical-lr ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-lr ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-lr ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "15px" but got "30px"
+PASS vertical-lr ltr inside horizontal-tb rtl - Pixels resolve as-is
+PASS vertical-lr ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels
+PASS vertical-lr ltr inside horizontal-tb rtl - Percentages are absolutized into pixels
+PASS vertical-lr ltr inside horizontal-tb rtl - calc() is absolutized into pixels
+PASS vertical-lr ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained
+PASS vertical-lr ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained
+PASS vertical-lr ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-lr ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-lr ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "15px" but got "370px"
+PASS vertical-lr ltr inside vertical-lr ltr - Pixels resolve as-is
+PASS vertical-lr ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels
+PASS vertical-lr ltr inside vertical-lr ltr - Percentages are absolutized into pixels
+PASS vertical-lr ltr inside vertical-lr ltr - calc() is absolutized into pixels
+PASS vertical-lr ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained
+PASS vertical-lr ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained
+PASS vertical-lr ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-lr ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+PASS vertical-lr ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value
+PASS vertical-lr ltr inside vertical-lr rtl - Pixels resolve as-is
+PASS vertical-lr ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels
+PASS vertical-lr ltr inside vertical-lr rtl - Percentages are absolutized into pixels
+PASS vertical-lr ltr inside vertical-lr rtl - calc() is absolutized into pixels
+PASS vertical-lr ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained
+PASS vertical-lr ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained
+PASS vertical-lr ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-lr ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+PASS vertical-lr ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value
+PASS vertical-lr ltr inside vertical-rl ltr - Pixels resolve as-is
+PASS vertical-lr ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels
+PASS vertical-lr ltr inside vertical-rl ltr - Percentages are absolutized into pixels
+PASS vertical-lr ltr inside vertical-rl ltr - calc() is absolutized into pixels
+PASS vertical-lr ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained
+PASS vertical-lr ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained
+FAIL vertical-lr ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "396px" but got "4px"
+FAIL vertical-lr ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "398px" but got "2px"
+PASS vertical-lr ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value
+PASS vertical-lr ltr inside vertical-rl rtl - Pixels resolve as-is
+PASS vertical-lr ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels
+PASS vertical-lr ltr inside vertical-rl rtl - Percentages are absolutized into pixels
+PASS vertical-lr ltr inside vertical-rl rtl - calc() is absolutized into pixels
+PASS vertical-lr ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained
+PASS vertical-lr ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained
+FAIL vertical-lr ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "396px" but got "4px"
+FAIL vertical-lr ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "398px" but got "2px"
+PASS vertical-lr ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value
+PASS vertical-lr rtl inside horizontal-tb ltr - Pixels resolve as-is
+PASS vertical-lr rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels
+PASS vertical-lr rtl inside horizontal-tb ltr - Percentages are absolutized into pixels
+PASS vertical-lr rtl inside horizontal-tb ltr - calc() is absolutized into pixels
+PASS vertical-lr rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained
+PASS vertical-lr rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained
+PASS vertical-lr rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-lr rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-lr rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "15px" but got "30px"
+PASS vertical-lr rtl inside horizontal-tb rtl - Pixels resolve as-is
+PASS vertical-lr rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels
+PASS vertical-lr rtl inside horizontal-tb rtl - Percentages are absolutized into pixels
+PASS vertical-lr rtl inside horizontal-tb rtl - calc() is absolutized into pixels
+PASS vertical-lr rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained
+PASS vertical-lr rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained
+PASS vertical-lr rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-lr rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-lr rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "15px" but got "370px"
+PASS vertical-lr rtl inside vertical-lr ltr - Pixels resolve as-is
+PASS vertical-lr rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels
+PASS vertical-lr rtl inside vertical-lr ltr - Percentages are absolutized into pixels
+PASS vertical-lr rtl inside vertical-lr ltr - calc() is absolutized into pixels
+PASS vertical-lr rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained
+PASS vertical-lr rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained
+PASS vertical-lr rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-lr rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+PASS vertical-lr rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value
+PASS vertical-lr rtl inside vertical-lr rtl - Pixels resolve as-is
+PASS vertical-lr rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels
+PASS vertical-lr rtl inside vertical-lr rtl - Percentages are absolutized into pixels
+PASS vertical-lr rtl inside vertical-lr rtl - calc() is absolutized into pixels
+PASS vertical-lr rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained
+PASS vertical-lr rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained
+PASS vertical-lr rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-lr rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+PASS vertical-lr rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value
+PASS vertical-lr rtl inside vertical-rl ltr - Pixels resolve as-is
+PASS vertical-lr rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels
+PASS vertical-lr rtl inside vertical-rl ltr - Percentages are absolutized into pixels
+PASS vertical-lr rtl inside vertical-rl ltr - calc() is absolutized into pixels
+PASS vertical-lr rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained
+PASS vertical-lr rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained
+FAIL vertical-lr rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "396px" but got "4px"
+FAIL vertical-lr rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "398px" but got "2px"
+PASS vertical-lr rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value
+PASS vertical-lr rtl inside vertical-rl rtl - Pixels resolve as-is
+PASS vertical-lr rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels
+PASS vertical-lr rtl inside vertical-rl rtl - Percentages are absolutized into pixels
+PASS vertical-lr rtl inside vertical-rl rtl - calc() is absolutized into pixels
+PASS vertical-lr rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained
+PASS vertical-lr rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained
+FAIL vertical-lr rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "396px" but got "4px"
+FAIL vertical-lr rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "398px" but got "2px"
+PASS vertical-lr rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value
+PASS vertical-rl ltr inside horizontal-tb ltr - Pixels resolve as-is
+PASS vertical-rl ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels
+PASS vertical-rl ltr inside horizontal-tb ltr - Percentages are absolutized into pixels
+PASS vertical-rl ltr inside horizontal-tb ltr - calc() is absolutized into pixels
+PASS vertical-rl ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained
+PASS vertical-rl ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained
+PASS vertical-rl ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-rl ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-rl ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "15px" but got "30px"
+PASS vertical-rl ltr inside horizontal-tb rtl - Pixels resolve as-is
+PASS vertical-rl ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels
+PASS vertical-rl ltr inside horizontal-tb rtl - Percentages are absolutized into pixels
+PASS vertical-rl ltr inside horizontal-tb rtl - calc() is absolutized into pixels
+PASS vertical-rl ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained
+PASS vertical-rl ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained
+PASS vertical-rl ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-rl ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-rl ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "15px" but got "370px"
+PASS vertical-rl ltr inside vertical-lr ltr - Pixels resolve as-is
+PASS vertical-rl ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels
+PASS vertical-rl ltr inside vertical-lr ltr - Percentages are absolutized into pixels
+PASS vertical-rl ltr inside vertical-lr ltr - calc() is absolutized into pixels
+PASS vertical-rl ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained
+PASS vertical-rl ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained
+PASS vertical-rl ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-rl ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-rl ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'left' expected "30px" but got "370px"
+PASS vertical-rl ltr inside vertical-lr rtl - Pixels resolve as-is
+PASS vertical-rl ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels
+PASS vertical-rl ltr inside vertical-lr rtl - Percentages are absolutized into pixels
+PASS vertical-rl ltr inside vertical-lr rtl - calc() is absolutized into pixels
+PASS vertical-rl ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained
+PASS vertical-rl ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained
+PASS vertical-rl ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-rl ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-rl ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'left' expected "30px" but got "370px"
+PASS vertical-rl ltr inside vertical-rl ltr - Pixels resolve as-is
+PASS vertical-rl ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels
+PASS vertical-rl ltr inside vertical-rl ltr - Percentages are absolutized into pixels
+PASS vertical-rl ltr inside vertical-rl ltr - calc() is absolutized into pixels
+PASS vertical-rl ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained
+PASS vertical-rl ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained
+FAIL vertical-rl ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "396px" but got "4px"
+FAIL vertical-rl ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "398px" but got "2px"
+FAIL vertical-rl ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'left' expected "370px" but got "30px"
+PASS vertical-rl ltr inside vertical-rl rtl - Pixels resolve as-is
+PASS vertical-rl ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels
+PASS vertical-rl ltr inside vertical-rl rtl - Percentages are absolutized into pixels
+PASS vertical-rl ltr inside vertical-rl rtl - calc() is absolutized into pixels
+PASS vertical-rl ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained
+PASS vertical-rl ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained
+FAIL vertical-rl ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "396px" but got "4px"
+FAIL vertical-rl ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "398px" but got "2px"
+FAIL vertical-rl ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'left' expected "370px" but got "30px"
+PASS vertical-rl rtl inside horizontal-tb ltr - Pixels resolve as-is
+PASS vertical-rl rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels
+PASS vertical-rl rtl inside horizontal-tb ltr - Percentages are absolutized into pixels
+PASS vertical-rl rtl inside horizontal-tb ltr - calc() is absolutized into pixels
+PASS vertical-rl rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained
+PASS vertical-rl rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained
+PASS vertical-rl rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-rl rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-rl rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "15px" but got "30px"
+PASS vertical-rl rtl inside horizontal-tb rtl - Pixels resolve as-is
+PASS vertical-rl rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels
+PASS vertical-rl rtl inside horizontal-tb rtl - Percentages are absolutized into pixels
+PASS vertical-rl rtl inside horizontal-tb rtl - calc() is absolutized into pixels
+PASS vertical-rl rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained
+PASS vertical-rl rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained
+PASS vertical-rl rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-rl rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-rl rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "15px" but got "370px"
+PASS vertical-rl rtl inside vertical-lr ltr - Pixels resolve as-is
+PASS vertical-rl rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels
+PASS vertical-rl rtl inside vertical-lr ltr - Percentages are absolutized into pixels
+PASS vertical-rl rtl inside vertical-lr ltr - calc() is absolutized into pixels
+PASS vertical-rl rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained
+PASS vertical-rl rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained
+PASS vertical-rl rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-rl rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-rl rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'left' expected "30px" but got "370px"
+PASS vertical-rl rtl inside vertical-lr rtl - Pixels resolve as-is
+PASS vertical-rl rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels
+PASS vertical-rl rtl inside vertical-lr rtl - Percentages are absolutized into pixels
+PASS vertical-rl rtl inside vertical-lr rtl - calc() is absolutized into pixels
+PASS vertical-rl rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained
+PASS vertical-rl rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained
+PASS vertical-rl rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-rl rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-rl rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'left' expected "30px" but got "370px"
+PASS vertical-rl rtl inside vertical-rl ltr - Pixels resolve as-is
+PASS vertical-rl rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels
+PASS vertical-rl rtl inside vertical-rl ltr - Percentages are absolutized into pixels
+PASS vertical-rl rtl inside vertical-rl ltr - calc() is absolutized into pixels
+PASS vertical-rl rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained
+PASS vertical-rl rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained
+FAIL vertical-rl rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "396px" but got "4px"
+FAIL vertical-rl rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "398px" but got "2px"
+FAIL vertical-rl rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'left' expected "370px" but got "30px"
+PASS vertical-rl rtl inside vertical-rl rtl - Pixels resolve as-is
+PASS vertical-rl rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels
+PASS vertical-rl rtl inside vertical-rl rtl - Percentages are absolutized into pixels
+PASS vertical-rl rtl inside vertical-rl rtl - calc() is absolutized into pixels
+PASS vertical-rl rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained
+PASS vertical-rl rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained
+FAIL vertical-rl rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "396px" but got "4px"
+FAIL vertical-rl rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "398px" but got "2px"
+FAIL vertical-rl rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'left' expected "370px" but got "30px"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/cssom/getComputedStyle-insets-fixed-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/cssom/getComputedStyle-insets-fixed-expected.txt
new file mode 100644
index 0000000..921f9ae
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/cssom/getComputedStyle-insets-fixed-expected.txt
@@ -0,0 +1,328 @@
+This is a testharness.js-based test.
+Found 324 tests; 276 PASS, 48 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS horizontal-tb ltr inside horizontal-tb ltr - Pixels resolve as-is
+PASS horizontal-tb ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels
+PASS horizontal-tb ltr inside horizontal-tb ltr - Percentages are absolutized into pixels
+PASS horizontal-tb ltr inside horizontal-tb ltr - calc() is absolutized into pixels
+PASS horizontal-tb ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained
+PASS horizontal-tb ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained
+PASS horizontal-tb ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS horizontal-tb ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+PASS horizontal-tb ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value
+PASS horizontal-tb ltr inside horizontal-tb rtl - Pixels resolve as-is
+PASS horizontal-tb ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels
+PASS horizontal-tb ltr inside horizontal-tb rtl - Percentages are absolutized into pixels
+PASS horizontal-tb ltr inside horizontal-tb rtl - calc() is absolutized into pixels
+PASS horizontal-tb ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained
+PASS horizontal-tb ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained
+PASS horizontal-tb ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS horizontal-tb ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+PASS horizontal-tb ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value
+PASS horizontal-tb ltr inside vertical-lr ltr - Pixels resolve as-is
+PASS horizontal-tb ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels
+PASS horizontal-tb ltr inside vertical-lr ltr - Percentages are absolutized into pixels
+PASS horizontal-tb ltr inside vertical-lr ltr - calc() is absolutized into pixels
+PASS horizontal-tb ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained
+PASS horizontal-tb ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained
+PASS horizontal-tb ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS horizontal-tb ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL horizontal-tb ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "127px" but got "254px"
+PASS horizontal-tb ltr inside vertical-lr rtl - Pixels resolve as-is
+PASS horizontal-tb ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels
+PASS horizontal-tb ltr inside vertical-lr rtl - Percentages are absolutized into pixels
+PASS horizontal-tb ltr inside vertical-lr rtl - calc() is absolutized into pixels
+PASS horizontal-tb ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained
+PASS horizontal-tb ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained
+PASS horizontal-tb ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS horizontal-tb ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL horizontal-tb ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "173px" but got "254px"
+PASS horizontal-tb ltr inside vertical-rl ltr - Pixels resolve as-is
+PASS horizontal-tb ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels
+PASS horizontal-tb ltr inside vertical-rl ltr - Percentages are absolutized into pixels
+PASS horizontal-tb ltr inside vertical-rl ltr - calc() is absolutized into pixels
+PASS horizontal-tb ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained
+PASS horizontal-tb ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained
+FAIL horizontal-tb ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "596px" but got "4px"
+FAIL horizontal-tb ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "598px" but got "2px"
+FAIL horizontal-tb ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "127px" but got "254px"
+PASS horizontal-tb ltr inside vertical-rl rtl - Pixels resolve as-is
+PASS horizontal-tb ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels
+PASS horizontal-tb ltr inside vertical-rl rtl - Percentages are absolutized into pixels
+PASS horizontal-tb ltr inside vertical-rl rtl - calc() is absolutized into pixels
+PASS horizontal-tb ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained
+PASS horizontal-tb ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained
+FAIL horizontal-tb ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "596px" but got "4px"
+FAIL horizontal-tb ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "598px" but got "2px"
+FAIL horizontal-tb ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "173px" but got "254px"
+PASS horizontal-tb rtl inside horizontal-tb ltr - Pixels resolve as-is
+PASS horizontal-tb rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels
+PASS horizontal-tb rtl inside horizontal-tb ltr - Percentages are absolutized into pixels
+PASS horizontal-tb rtl inside horizontal-tb ltr - calc() is absolutized into pixels
+PASS horizontal-tb rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained
+PASS horizontal-tb rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained
+PASS horizontal-tb rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS horizontal-tb rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+PASS horizontal-tb rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value
+PASS horizontal-tb rtl inside horizontal-tb rtl - Pixels resolve as-is
+PASS horizontal-tb rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels
+PASS horizontal-tb rtl inside horizontal-tb rtl - Percentages are absolutized into pixels
+PASS horizontal-tb rtl inside horizontal-tb rtl - calc() is absolutized into pixels
+PASS horizontal-tb rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained
+PASS horizontal-tb rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained
+PASS horizontal-tb rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS horizontal-tb rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+PASS horizontal-tb rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value
+PASS horizontal-tb rtl inside vertical-lr ltr - Pixels resolve as-is
+PASS horizontal-tb rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels
+PASS horizontal-tb rtl inside vertical-lr ltr - Percentages are absolutized into pixels
+PASS horizontal-tb rtl inside vertical-lr ltr - calc() is absolutized into pixels
+PASS horizontal-tb rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained
+PASS horizontal-tb rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained
+PASS horizontal-tb rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS horizontal-tb rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL horizontal-tb rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "127px" but got "254px"
+PASS horizontal-tb rtl inside vertical-lr rtl - Pixels resolve as-is
+PASS horizontal-tb rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels
+PASS horizontal-tb rtl inside vertical-lr rtl - Percentages are absolutized into pixels
+PASS horizontal-tb rtl inside vertical-lr rtl - calc() is absolutized into pixels
+PASS horizontal-tb rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained
+PASS horizontal-tb rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained
+PASS horizontal-tb rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS horizontal-tb rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL horizontal-tb rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "173px" but got "254px"
+PASS horizontal-tb rtl inside vertical-rl ltr - Pixels resolve as-is
+PASS horizontal-tb rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels
+PASS horizontal-tb rtl inside vertical-rl ltr - Percentages are absolutized into pixels
+PASS horizontal-tb rtl inside vertical-rl ltr - calc() is absolutized into pixels
+PASS horizontal-tb rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained
+PASS horizontal-tb rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained
+FAIL horizontal-tb rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "596px" but got "4px"
+FAIL horizontal-tb rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "598px" but got "2px"
+FAIL horizontal-tb rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "127px" but got "254px"
+PASS horizontal-tb rtl inside vertical-rl rtl - Pixels resolve as-is
+PASS horizontal-tb rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels
+PASS horizontal-tb rtl inside vertical-rl rtl - Percentages are absolutized into pixels
+PASS horizontal-tb rtl inside vertical-rl rtl - calc() is absolutized into pixels
+PASS horizontal-tb rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained
+PASS horizontal-tb rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained
+FAIL horizontal-tb rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "596px" but got "4px"
+FAIL horizontal-tb rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "598px" but got "2px"
+FAIL horizontal-tb rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "173px" but got "254px"
+PASS vertical-lr ltr inside horizontal-tb ltr - Pixels resolve as-is
+PASS vertical-lr ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels
+PASS vertical-lr ltr inside horizontal-tb ltr - Percentages are absolutized into pixels
+PASS vertical-lr ltr inside horizontal-tb ltr - calc() is absolutized into pixels
+PASS vertical-lr ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained
+PASS vertical-lr ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained
+PASS vertical-lr ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-lr ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-lr ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "127px" but got "254px"
+PASS vertical-lr ltr inside horizontal-tb rtl - Pixels resolve as-is
+PASS vertical-lr ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels
+PASS vertical-lr ltr inside horizontal-tb rtl - Percentages are absolutized into pixels
+PASS vertical-lr ltr inside horizontal-tb rtl - calc() is absolutized into pixels
+PASS vertical-lr ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained
+PASS vertical-lr ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained
+PASS vertical-lr ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-lr ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-lr ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "127px" but got "346px"
+PASS vertical-lr ltr inside vertical-lr ltr - Pixels resolve as-is
+PASS vertical-lr ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels
+PASS vertical-lr ltr inside vertical-lr ltr - Percentages are absolutized into pixels
+PASS vertical-lr ltr inside vertical-lr ltr - calc() is absolutized into pixels
+PASS vertical-lr ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained
+PASS vertical-lr ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained
+PASS vertical-lr ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-lr ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+PASS vertical-lr ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value
+PASS vertical-lr ltr inside vertical-lr rtl - Pixels resolve as-is
+PASS vertical-lr ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels
+PASS vertical-lr ltr inside vertical-lr rtl - Percentages are absolutized into pixels
+PASS vertical-lr ltr inside vertical-lr rtl - calc() is absolutized into pixels
+PASS vertical-lr ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained
+PASS vertical-lr ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained
+PASS vertical-lr ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-lr ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+PASS vertical-lr ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value
+PASS vertical-lr ltr inside vertical-rl ltr - Pixels resolve as-is
+PASS vertical-lr ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels
+PASS vertical-lr ltr inside vertical-rl ltr - Percentages are absolutized into pixels
+PASS vertical-lr ltr inside vertical-rl ltr - calc() is absolutized into pixels
+PASS vertical-lr ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained
+PASS vertical-lr ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained
+FAIL vertical-lr ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "596px" but got "4px"
+FAIL vertical-lr ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "598px" but got "2px"
+PASS vertical-lr ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value
+PASS vertical-lr ltr inside vertical-rl rtl - Pixels resolve as-is
+PASS vertical-lr ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels
+PASS vertical-lr ltr inside vertical-rl rtl - Percentages are absolutized into pixels
+PASS vertical-lr ltr inside vertical-rl rtl - calc() is absolutized into pixels
+PASS vertical-lr ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained
+PASS vertical-lr ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained
+FAIL vertical-lr ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "596px" but got "4px"
+FAIL vertical-lr ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "598px" but got "2px"
+PASS vertical-lr ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value
+PASS vertical-lr rtl inside horizontal-tb ltr - Pixels resolve as-is
+PASS vertical-lr rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels
+PASS vertical-lr rtl inside horizontal-tb ltr - Percentages are absolutized into pixels
+PASS vertical-lr rtl inside horizontal-tb ltr - calc() is absolutized into pixels
+PASS vertical-lr rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained
+PASS vertical-lr rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained
+PASS vertical-lr rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-lr rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-lr rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "127px" but got "254px"
+PASS vertical-lr rtl inside horizontal-tb rtl - Pixels resolve as-is
+PASS vertical-lr rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels
+PASS vertical-lr rtl inside horizontal-tb rtl - Percentages are absolutized into pixels
+PASS vertical-lr rtl inside horizontal-tb rtl - calc() is absolutized into pixels
+PASS vertical-lr rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained
+PASS vertical-lr rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained
+PASS vertical-lr rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-lr rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-lr rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "127px" but got "346px"
+PASS vertical-lr rtl inside vertical-lr ltr - Pixels resolve as-is
+PASS vertical-lr rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels
+PASS vertical-lr rtl inside vertical-lr ltr - Percentages are absolutized into pixels
+PASS vertical-lr rtl inside vertical-lr ltr - calc() is absolutized into pixels
+PASS vertical-lr rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained
+PASS vertical-lr rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained
+PASS vertical-lr rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-lr rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+PASS vertical-lr rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value
+PASS vertical-lr rtl inside vertical-lr rtl - Pixels resolve as-is
+PASS vertical-lr rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels
+PASS vertical-lr rtl inside vertical-lr rtl - Percentages are absolutized into pixels
+PASS vertical-lr rtl inside vertical-lr rtl - calc() is absolutized into pixels
+PASS vertical-lr rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained
+PASS vertical-lr rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained
+PASS vertical-lr rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-lr rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+PASS vertical-lr rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value
+PASS vertical-lr rtl inside vertical-rl ltr - Pixels resolve as-is
+PASS vertical-lr rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels
+PASS vertical-lr rtl inside vertical-rl ltr - Percentages are absolutized into pixels
+PASS vertical-lr rtl inside vertical-rl ltr - calc() is absolutized into pixels
+PASS vertical-lr rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained
+PASS vertical-lr rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained
+FAIL vertical-lr rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "596px" but got "4px"
+FAIL vertical-lr rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "598px" but got "2px"
+PASS vertical-lr rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value
+PASS vertical-lr rtl inside vertical-rl rtl - Pixels resolve as-is
+PASS vertical-lr rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels
+PASS vertical-lr rtl inside vertical-rl rtl - Percentages are absolutized into pixels
+PASS vertical-lr rtl inside vertical-rl rtl - calc() is absolutized into pixels
+PASS vertical-lr rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained
+PASS vertical-lr rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained
+FAIL vertical-lr rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "596px" but got "4px"
+FAIL vertical-lr rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "598px" but got "2px"
+PASS vertical-lr rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value
+PASS vertical-rl ltr inside horizontal-tb ltr - Pixels resolve as-is
+PASS vertical-rl ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels
+PASS vertical-rl ltr inside horizontal-tb ltr - Percentages are absolutized into pixels
+PASS vertical-rl ltr inside horizontal-tb ltr - calc() is absolutized into pixels
+PASS vertical-rl ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained
+PASS vertical-rl ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained
+PASS vertical-rl ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-rl ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-rl ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "127px" but got "254px"
+PASS vertical-rl ltr inside horizontal-tb rtl - Pixels resolve as-is
+PASS vertical-rl ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels
+PASS vertical-rl ltr inside horizontal-tb rtl - Percentages are absolutized into pixels
+PASS vertical-rl ltr inside horizontal-tb rtl - calc() is absolutized into pixels
+PASS vertical-rl ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained
+PASS vertical-rl ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained
+PASS vertical-rl ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-rl ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-rl ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "127px" but got "346px"
+PASS vertical-rl ltr inside vertical-lr ltr - Pixels resolve as-is
+PASS vertical-rl ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels
+PASS vertical-rl ltr inside vertical-lr ltr - Percentages are absolutized into pixels
+PASS vertical-rl ltr inside vertical-lr ltr - calc() is absolutized into pixels
+PASS vertical-rl ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained
+PASS vertical-rl ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained
+PASS vertical-rl ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-rl ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-rl ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'left' expected "254px" but got "346px"
+PASS vertical-rl ltr inside vertical-lr rtl - Pixels resolve as-is
+PASS vertical-rl ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels
+PASS vertical-rl ltr inside vertical-lr rtl - Percentages are absolutized into pixels
+PASS vertical-rl ltr inside vertical-lr rtl - calc() is absolutized into pixels
+PASS vertical-rl ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained
+PASS vertical-rl ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained
+PASS vertical-rl ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-rl ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-rl ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'left' expected "254px" but got "346px"
+PASS vertical-rl ltr inside vertical-rl ltr - Pixels resolve as-is
+PASS vertical-rl ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels
+PASS vertical-rl ltr inside vertical-rl ltr - Percentages are absolutized into pixels
+PASS vertical-rl ltr inside vertical-rl ltr - calc() is absolutized into pixels
+PASS vertical-rl ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained
+PASS vertical-rl ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained
+FAIL vertical-rl ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "596px" but got "4px"
+FAIL vertical-rl ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "598px" but got "2px"
+FAIL vertical-rl ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'left' expected "346px" but got "254px"
+PASS vertical-rl ltr inside vertical-rl rtl - Pixels resolve as-is
+PASS vertical-rl ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels
+PASS vertical-rl ltr inside vertical-rl rtl - Percentages are absolutized into pixels
+PASS vertical-rl ltr inside vertical-rl rtl - calc() is absolutized into pixels
+PASS vertical-rl ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained
+PASS vertical-rl ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained
+FAIL vertical-rl ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "596px" but got "4px"
+FAIL vertical-rl ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "598px" but got "2px"
+FAIL vertical-rl ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'left' expected "346px" but got "254px"
+PASS vertical-rl rtl inside horizontal-tb ltr - Pixels resolve as-is
+PASS vertical-rl rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels
+PASS vertical-rl rtl inside horizontal-tb ltr - Percentages are absolutized into pixels
+PASS vertical-rl rtl inside horizontal-tb ltr - calc() is absolutized into pixels
+PASS vertical-rl rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained
+PASS vertical-rl rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained
+PASS vertical-rl rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-rl rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-rl rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "127px" but got "254px"
+PASS vertical-rl rtl inside horizontal-tb rtl - Pixels resolve as-is
+PASS vertical-rl rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels
+PASS vertical-rl rtl inside horizontal-tb rtl - Percentages are absolutized into pixels
+PASS vertical-rl rtl inside horizontal-tb rtl - calc() is absolutized into pixels
+PASS vertical-rl rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained
+PASS vertical-rl rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained
+PASS vertical-rl rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-rl rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-rl rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'top' expected "127px" but got "346px"
+PASS vertical-rl rtl inside vertical-lr ltr - Pixels resolve as-is
+PASS vertical-rl rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels
+PASS vertical-rl rtl inside vertical-lr ltr - Percentages are absolutized into pixels
+PASS vertical-rl rtl inside vertical-lr ltr - calc() is absolutized into pixels
+PASS vertical-rl rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained
+PASS vertical-rl rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained
+PASS vertical-rl rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-rl rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-rl rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'left' expected "254px" but got "346px"
+PASS vertical-rl rtl inside vertical-lr rtl - Pixels resolve as-is
+PASS vertical-rl rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels
+PASS vertical-rl rtl inside vertical-lr rtl - Percentages are absolutized into pixels
+PASS vertical-rl rtl inside vertical-lr rtl - calc() is absolutized into pixels
+PASS vertical-rl rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained
+PASS vertical-rl rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained
+PASS vertical-rl rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value
+PASS vertical-rl rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value
+FAIL vertical-rl rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'left' expected "254px" but got "346px"
+PASS vertical-rl rtl inside vertical-rl ltr - Pixels resolve as-is
+PASS vertical-rl rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels
+PASS vertical-rl rtl inside vertical-rl ltr - Percentages are absolutized into pixels
+PASS vertical-rl rtl inside vertical-rl ltr - calc() is absolutized into pixels
+PASS vertical-rl rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained
+PASS vertical-rl rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained
+FAIL vertical-rl rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "596px" but got "4px"
+FAIL vertical-rl rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "598px" but got "2px"
+FAIL vertical-rl rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value assert_equals: 'left' expected "346px" but got "254px"
+PASS vertical-rl rtl inside vertical-rl rtl - Pixels resolve as-is
+PASS vertical-rl rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels
+PASS vertical-rl rtl inside vertical-rl rtl - Percentages are absolutized into pixels
+PASS vertical-rl rtl inside vertical-rl rtl - calc() is absolutized into pixels
+PASS vertical-rl rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained
+PASS vertical-rl rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained
+FAIL vertical-rl rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value assert_equals: 'left' expected "596px" but got "4px"
+FAIL vertical-rl rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value assert_equals: 'right' expected "598px" but got "2px"
+FAIL vertical-rl rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value assert_equals: 'left' expected "346px" but got "254px"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/filter-effects/filtered-inline-applies-to-float-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/filter-effects/filtered-inline-applies-to-float-expected.png
new file mode 100644
index 0000000..d6ae2743
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/filter-effects/filtered-inline-applies-to-float-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-002-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-002-expected.png
new file mode 100644
index 0000000..a2ff5d8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/emptyspan-1-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/emptyspan-1-expected.png
new file mode 100644
index 0000000..c70cd3d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/emptyspan-1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/emptyspan-4-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/emptyspan-4-expected.png
new file mode 100644
index 0000000..e24e9ccb
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/emptyspan-4-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/remove-from-split-inline-6-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/remove-from-split-inline-6-expected.png
new file mode 100644
index 0000000..a9ed8b77
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/remove-from-split-inline-6-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/split-inner-inline-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/split-inner-inline-2-expected.png
new file mode 100644
index 0000000..b8cd592
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/split-inner-inline-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-003-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-003-expected.png
new file mode 100644
index 0000000..c0f0136
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-004-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-004-expected.png
new file mode 100644
index 0000000..9e453409
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-042-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-042-expected.png
new file mode 100644
index 0000000..fb5e1a1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-042-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-044-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-044-expected.png
new file mode 100644
index 0000000..fb5e1a1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-044-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-050-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-050-expected.png
new file mode 100644
index 0000000..d95ce2d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-050-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-055-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-055-expected.png
new file mode 100644
index 0000000..1ce195e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-055-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-content-box-border-radius-002-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-content-box-border-radius-002-expected.png
new file mode 100644
index 0000000..de4ae06
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-content-box-border-radius-002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-038-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-038-expected.png
new file mode 100644
index 0000000..14d80bd
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-038-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-039-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-039-expected.png
new file mode 100644
index 0000000..012d5ca7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-039-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-024-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-024-expected.png
new file mode 100644
index 0000000..41ca0b55
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-024-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-003-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-003-expected.png
new file mode 100644
index 0000000..d1afd75
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-004-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-004-expected.png
new file mode 100644
index 0000000..93ab14a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-008-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-008-expected.png
new file mode 100644
index 0000000..c5642d9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-008-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-padding-box-border-radius-002-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-padding-box-border-radius-002-expected.png
new file mode 100644
index 0000000..63f2f3c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-padding-box-border-radius-002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/sizing/block-size-with-min-or-max-content-1a-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/sizing/block-size-with-min-or-max-content-1a-expected.png
new file mode 100644
index 0000000..9683213
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/sizing/block-size-with-min-or-max-content-1a-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/quirks/line-height-trailing-collapsable-whitespace-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/quirks/line-height-trailing-collapsable-whitespace-expected.png
new file mode 100644
index 0000000..c6a9ee7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/external/wpt/quirks/line-height-trailing-collapsable-whitespace-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/backgrounds/background-inherit-color-bug-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/backgrounds/background-inherit-color-bug-expected.png
new file mode 100644
index 0000000..386ca50
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/backgrounds/background-inherit-color-bug-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/backgrounds/background-leakage-transforms-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/backgrounds/background-leakage-transforms-expected.png
new file mode 100644
index 0000000..bb23833
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/backgrounds/background-leakage-transforms-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/backgrounds/background-origin-root-element-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/backgrounds/background-origin-root-element-expected.png
new file mode 100644
index 0000000..0aa150b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/backgrounds/background-origin-root-element-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/backgrounds/selection-background-color-of-image-list-style-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/backgrounds/selection-background-color-of-image-list-style-expected.png
new file mode 100644
index 0000000..f50eef1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/backgrounds/selection-background-color-of-image-list-style-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/backgrounds/selection-background-color-of-list-style-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/backgrounds/selection-background-color-of-list-style-expected.png
new file mode 100644
index 0000000..2d36b003
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/backgrounds/selection-background-color-of-list-style-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/basic/011-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/basic/011-expected.png
new file mode 100644
index 0000000..9bc8487
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/basic/011-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/basic/015-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/basic/015-expected.png
new file mode 100644
index 0000000..c8cc1b6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/basic/015-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/basic/016-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/basic/016-expected.png
new file mode 100644
index 0000000..b4453b39
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/basic/016-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/basic/020-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/basic/020-expected.png
new file mode 100644
index 0000000..65b15896
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/basic/020-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/basic/minheight-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/basic/minheight-expected.png
new file mode 100644
index 0000000..641dd9e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/basic/minheight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/float/016-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/float/016-expected.png
new file mode 100644
index 0000000..785ad81
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/float/016-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/float/centered-float-avoidance-complexity-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/float/centered-float-avoidance-complexity-expected.png
new file mode 100644
index 0000000..d464e27
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/float/centered-float-avoidance-complexity-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/float/float-in-float-painting-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/float/float-in-float-painting-expected.png
new file mode 100644
index 0000000..e47f0b83
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/float/float-in-float-painting-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/float/independent-align-positioning-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/float/independent-align-positioning-expected.png
new file mode 100644
index 0000000..02e26bf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/float/independent-align-positioning-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/float/nopaint-after-layer-destruction2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/float/nopaint-after-layer-destruction2-expected.png
new file mode 100644
index 0000000..928ca53
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/float/nopaint-after-layer-destruction2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/float/overhanging-float-remove-from-fixed-position-block-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/float/overhanging-float-remove-from-fixed-position-block-expected.png
new file mode 100644
index 0000000..eda146c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/float/overhanging-float-remove-from-fixed-position-block-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/float/overhanging-float-remove-from-fixed-position-block2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/float/overhanging-float-remove-from-fixed-position-block2-expected.png
new file mode 100644
index 0000000..eda146c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/float/overhanging-float-remove-from-fixed-position-block2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/absolute-in-inline-rtl-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/absolute-in-inline-rtl-2-expected.png
new file mode 100644
index 0000000..cc88862b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/absolute-in-inline-rtl-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/absolute-in-inline-rtl-3-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/absolute-in-inline-rtl-3-expected.png
new file mode 100644
index 0000000..f9532a93
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/absolute-in-inline-rtl-3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/absolute-in-inline-rtl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/absolute-in-inline-rtl-expected.png
new file mode 100644
index 0000000..a3a4b76d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/absolute-in-inline-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/absolute-in-inline-short-rtl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/absolute-in-inline-short-rtl-expected.png
new file mode 100644
index 0000000..231fec9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/absolute-in-inline-short-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/auto/vertical-lr/001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/auto/vertical-lr/001-expected.png
new file mode 100644
index 0000000..72cd2037
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/auto/vertical-lr/001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/auto/vertical-lr/002-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/auto/vertical-lr/002-expected.png
new file mode 100644
index 0000000..2f7dc9a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/auto/vertical-lr/002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/auto/vertical-lr/003-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/auto/vertical-lr/003-expected.png
new file mode 100644
index 0000000..2f7dc9a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/auto/vertical-lr/003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/auto/vertical-lr/004-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/auto/vertical-lr/004-expected.png
new file mode 100644
index 0000000..2f7dc9a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/auto/vertical-lr/004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/auto/vertical-lr/005-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/auto/vertical-lr/005-expected.png
new file mode 100644
index 0000000..83ef3a1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/auto/vertical-lr/005-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/auto/vertical-lr/006-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/auto/vertical-lr/006-expected.png
new file mode 100644
index 0000000..92acf3e1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/auto/vertical-lr/006-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/auto/vertical-lr/007-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/auto/vertical-lr/007-expected.png
new file mode 100644
index 0000000..309cf0a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/auto/vertical-lr/007-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/vertical-lr/001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/vertical-lr/001-expected.png
new file mode 100644
index 0000000..7827f1b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/block/positioning/vertical-lr/001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/borders/bidi-012-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/borders/bidi-012-expected.png
new file mode 100644
index 0000000..1a1e2ef
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/borders/bidi-012-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/borders/inline-mask-overlay-image-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/borders/inline-mask-overlay-image-expected.png
new file mode 100644
index 0000000..73bca9c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/borders/inline-mask-overlay-image-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/borders/inline-mask-overlay-image-outset-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/borders/inline-mask-overlay-image-outset-expected.png
new file mode 100644
index 0000000..0c2047d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/borders/inline-mask-overlay-image-outset-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/borders/rtl-border-02-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/borders/rtl-border-02-expected.png
new file mode 100644
index 0000000..b2635b2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/borders/rtl-border-02-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/canvas/image-object-in-canvas-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/canvas/image-object-in-canvas-expected.png
new file mode 100644
index 0000000..bfab2c2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/canvas/image-object-in-canvas-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/canvas/patternfill-repeat-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/canvas/patternfill-repeat-expected.png
new file mode 100644
index 0000000..640fddc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/canvas/patternfill-repeat-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/clip/overflow-border-radius-fixed-position-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/clip/overflow-border-radius-fixed-position-expected.png
new file mode 100644
index 0000000..caad5c3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/clip/overflow-border-radius-fixed-position-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css-generated-content/012-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css-generated-content/012-expected.png
new file mode 100644
index 0000000..6258bcd6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css-generated-content/012-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css-generated-content/013-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css-generated-content/013-expected.png
new file mode 100644
index 0000000..11618314
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css-generated-content/013-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css-generated-content/table-before-after-child-add-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css-generated-content/table-before-after-child-add-expected.png
new file mode 100644
index 0000000..2f653a37
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css-generated-content/table-before-after-child-add-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css-generated-content/table-cell-before-after-child-add-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css-generated-content/table-cell-before-after-child-add-expected.png
new file mode 100644
index 0000000..0e129d46
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css-generated-content/table-cell-before-after-child-add-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css-generated-content/table-row-before-after-child-add-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css-generated-content/table-row-before-after-child-add-expected.png
new file mode 100644
index 0000000..2f653a37
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css-generated-content/table-row-before-after-child-add-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css-generated-content/table-table-before-after-child-add-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css-generated-content/table-table-before-after-child-add-expected.png
new file mode 100644
index 0000000..2f653a37
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css-generated-content/table-table-before-after-child-add-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css-grid-layout/grid-align-baseline-vertical-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css-grid-layout/grid-align-baseline-vertical-expected.txt
new file mode 100644
index 0000000..434973e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css-grid-layout/grid-align-baseline-vertical-expected.txt
@@ -0,0 +1,16 @@
+This is a testharness.js-based test.
+PASS .grid 1
+PASS .grid 2
+PASS .grid 3
+FAIL .grid 4 assert_equals: 
+<div class="grid" style="-webkit-writing-mode: vertical-lr">
+  <div id="baseline6" data-offset-x="18" class="firstRowFirstColumn alignSelfBaseline">ahem</div>
+  <div id="baseline7" data-offset-x="18" class="firstRowSecondColumn alignSelfBaseline"><img src="../../fast/replaced/resources/1x1-blue.png" style="width: 50px;"></div>
+  <div data-expected-width="50" data-offset-x="25" class="firstRowThirdColumn alignSelfCenter"><img src="../../fast/replaced/resources/1x1-blue.png" style="width: 50px; vertical-align: middle"></div>
+  <div data-expected-width="50" data-offset-x="0" class="firstRowFourthColumn alignSelfBaseline"><img src="../../fast/replaced/resources/1x1-blue.png" style="width: 50px; vertical-align: middle"></div>
+  <div data-expected-width="100" data-offset-x="0" class="firstRowFifthColumn" style="width: 100px;"></div>
+</div>
+offsetLeft expected 18 but got 17
+PASS .grid 5
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/002-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/002-expected.png
new file mode 100644
index 0000000..590521a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/004-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/004-expected.png
new file mode 100644
index 0000000..e4f3a5e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/005-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/005-expected.png
new file mode 100644
index 0000000..1a07da3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/005-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/ZeroOpacityLayers-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/ZeroOpacityLayers-expected.png
new file mode 100644
index 0000000..37d821d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/ZeroOpacityLayers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/ZeroOpacityLayers2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/ZeroOpacityLayers2-expected.png
new file mode 100644
index 0000000..3c8b88c8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/ZeroOpacityLayers2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/absolute-inline-alignment-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/absolute-inline-alignment-2-expected.png
new file mode 100644
index 0000000..e61542f7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/absolute-inline-alignment-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/clip-zooming-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/clip-zooming-expected.png
new file mode 100644
index 0000000..59ee8ff
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/clip-zooming-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/color-correction-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/color-correction-expected.png
new file mode 100644
index 0000000..4daf4815
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/color-correction-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/content/content-quotes-01-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/content/content-quotes-01-expected.txt
new file mode 100644
index 0000000..aa4e2d11
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/content/content-quotes-01-expected.txt
@@ -0,0 +1,13 @@
+The texts between the markers should be identical.
+
+========Marker1========
+
+ab	1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+
+========Marker2========
+
+WWaWWbWWWWWWWW	1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+
+========Marker3========
+
+FAILED: testWidth=195px; expected 194px
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/content/content-quotes-05-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/content/content-quotes-05-expected.txt
new file mode 100644
index 0000000..77f6c55d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/content/content-quotes-05-expected.txt
@@ -0,0 +1,11 @@
+========Marker1========
+
+abc	1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+
+========Marker2========
+
+WWaWWWbWWWWWcWWWW	1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+
+========Marker3========
+
+FAILED: testWidth=232px; expected 231px
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/css1_forward_compatible_parsing-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/css1_forward_compatible_parsing-expected.png
new file mode 100644
index 0000000..789003e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/css1_forward_compatible_parsing-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/css3-space-in-nth-and-lang-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/css3-space-in-nth-and-lang-expected.png
new file mode 100644
index 0000000..6d869e5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/css3-space-in-nth-and-lang-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/first-child-pseudo-class-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/first-child-pseudo-class-expected.png
new file mode 100644
index 0000000..05df590
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/first-child-pseudo-class-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/first-letter-detach-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/first-letter-detach-expected.png
new file mode 100644
index 0000000..03b0429
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/first-letter-detach-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/first-line-text-decoration-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/first-line-text-decoration-expected.png
new file mode 100644
index 0000000..dfd3b00
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/first-line-text-decoration-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/first-line-text-decoration-inherited-from-parent-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/first-line-text-decoration-inherited-from-parent-expected.png
new file mode 100644
index 0000000..a398def
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/first-line-text-decoration-inherited-from-parent-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/first-of-type-pseudo-class-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/first-of-type-pseudo-class-expected.png
new file mode 100644
index 0000000..cae4478
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/first-of-type-pseudo-class-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/focus-ring-detached-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/focus-ring-detached-expected.png
new file mode 100644
index 0000000..61466809
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/focus-ring-detached-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/font-face-opentype-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/font-face-opentype-expected.png
new file mode 100644
index 0000000..1751b306
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/font-face-opentype-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/font_property_normal-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/font_property_normal-expected.png
new file mode 100644
index 0000000..8ae2e64
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/font_property_normal-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/image-orientation/image-orientation-default-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/image-orientation/image-orientation-default-expected.png
new file mode 100644
index 0000000..a6c56ce
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/image-orientation/image-orientation-default-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/image-orientation/image-orientation-from-image-composited-dynamic-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/image-orientation/image-orientation-from-image-composited-dynamic-expected.png
new file mode 100644
index 0000000..34f6c5e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/image-orientation/image-orientation-from-image-composited-dynamic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/image-orientation/image-orientation-from-image-composited-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/image-orientation/image-orientation-from-image-composited-expected.png
new file mode 100644
index 0000000..34f6c5e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/image-orientation/image-orientation-from-image-composited-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/image-orientation/image-orientation-from-image-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/image-orientation/image-orientation-from-image-expected.png
new file mode 100644
index 0000000..e880a5d4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/image-orientation/image-orientation-from-image-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/last-child-pseudo-class-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/last-child-pseudo-class-expected.png
new file mode 100644
index 0000000..fa125cc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/last-child-pseudo-class-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/last-of-type-pseudo-class-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/last-of-type-pseudo-class-expected.png
new file mode 100644
index 0000000..27cfcbcb
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/last-of-type-pseudo-class-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/list-outline-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/list-outline-expected.png
new file mode 100644
index 0000000..db364b2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/list-outline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/non-empty-span-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/non-empty-span-expected.png
new file mode 100644
index 0000000..b47f5a9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/non-empty-span-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/nth-child-dynamic-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/nth-child-dynamic-expected.png
new file mode 100644
index 0000000..a82a0e5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/nth-child-dynamic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/only-child-pseudo-class-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/only-child-pseudo-class-expected.png
new file mode 100644
index 0000000..68f69b2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/only-child-pseudo-class-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/only-of-type-pseudo-class-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/only-of-type-pseudo-class-expected.png
new file mode 100644
index 0000000..9b9ead25
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/only-of-type-pseudo-class-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/selector-set-attribute-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/selector-set-attribute-expected.png
new file mode 100644
index 0000000..115aaed
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/selector-set-attribute-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-align-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-align-expected.png
new file mode 100644
index 0000000..9d327322
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-align-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-bidi-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-bidi-expected.png
new file mode 100644
index 0000000..37578bc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-bidi-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-block-with-border-and-padding-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-block-with-border-and-padding-expected.png
new file mode 100644
index 0000000..b9f0592
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-block-with-border-and-padding-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-expected.png
new file mode 100644
index 0000000..a3d2066
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-strict-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-strict-expected.png
new file mode 100644
index 0000000..a3d2066
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-strict-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-center-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-center-expected.png
new file mode 100644
index 0000000..218e71c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-center-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-justify-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-justify-expected.png
new file mode 100644
index 0000000..c5bbafa4d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-justify-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-left-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-left-expected.png
new file mode 100644
index 0000000..0ca2385
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-left-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-right-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-right-expected.png
new file mode 100644
index 0000000..0c0622e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-right-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-vertical-hittest-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-vertical-hittest-expected.txt
new file mode 100644
index 0000000..ebf6469
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-vertical-hittest-expected.txt
@@ -0,0 +1,3 @@
+Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+clicked
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-rendering-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-rendering-expected.png
new file mode 100644
index 0000000..e036238
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/text-rendering-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/textCapitalizeEdgeCases-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/textCapitalizeEdgeCases-expected.png
new file mode 100644
index 0000000..a710ba58
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/textCapitalizeEdgeCases-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-center-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-center-expected.png
new file mode 100644
index 0000000..e9b21df
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-center-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-right-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-right-expected.png
new file mode 100644
index 0000000..a0ec461b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-right-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/word-space-extra-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/word-space-extra-expected.png
new file mode 100644
index 0000000..603ed41a3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css/word-space-extra-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-all-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-all-expected.png
new file mode 100644
index 0000000..934612ba
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-all-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-auto-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-auto-expected.png
new file mode 100644
index 0000000..7034c3e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-auto-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css3-text/css3-text-indent/text-indent-out-of-flow-each-line-hanging-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css3-text/css3-text-indent/text-indent-out-of-flow-each-line-hanging-expected.txt
new file mode 100644
index 0000000..07f14ec1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css3-text/css3-text-indent/text-indent-out-of-flow-each-line-hanging-expected.txt
@@ -0,0 +1,57 @@
+crbug.com/568851: text-indent should be applied to leading statically positioned out-of-flow objects.
+
+xxxx
+PASS
+
+
+xxxx
+PASS
+xxxx xxxx
+
+
+xxxx
+PASS
+
+
+xxxx
+PASS
+
+
+xxxx
+PASS
+
+
+xxxx
+PASS
+xxxx
+
+xxxx
+PASS
+
+
+xxxx
+xxxx
+PASS
+
+
+xxxx
+PASS
+
+
+xxxx
+xxxx
+PASS
+xxxx
+PASS
+
+
+xxxx
+xxxx
+xxxx
+
+
+xxxx
+xxxx
+PASS
+
+xxxx
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css3-text/css3-text-justify/text-justify-distribute-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css3-text/css3-text-justify/text-justify-distribute-expected.png
new file mode 100644
index 0000000..2629fa7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/css3-text/css3-text-justify/text-justify-distribute-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/deprecated-flexbox/023-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/deprecated-flexbox/023-expected.png
new file mode 100644
index 0000000..a27d0bf5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/deprecated-flexbox/023-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/deprecated-flexbox/024-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/deprecated-flexbox/024-expected.png
new file mode 100644
index 0000000..a27d0bf5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/deprecated-flexbox/024-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dom/HTMLMeterElement/meter-boundary-values-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dom/HTMLMeterElement/meter-boundary-values-expected.png
new file mode 100644
index 0000000..1453b16
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dom/HTMLMeterElement/meter-boundary-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dom/HTMLObjectElement/vspace-hspace-as-number-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dom/HTMLObjectElement/vspace-hspace-as-number-expected.png
new file mode 100644
index 0000000..2c5e4f5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dom/HTMLObjectElement/vspace-hspace-as-number-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt
new file mode 100644
index 0000000..77334292
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt
@@ -0,0 +1,48 @@
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+FAIL Unexpected node #0 for rect [39,202], [2,41] - DIV#d2
+FAIL Unexpected node #1 for rect [39,202], [6,41] - DIV#d2
+FAIL Unexpected node #2 for rect [39,202], [16,41] - DIV#d2
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dom/scroll-reveal-top-overflow-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dom/scroll-reveal-top-overflow-expected.png
new file mode 100644
index 0000000..cc5cddf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dom/scroll-reveal-top-overflow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dynamic/011-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dynamic/011-expected.png
new file mode 100644
index 0000000..846fbab
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dynamic/011-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dynamic/outerHTML-doc-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dynamic/outerHTML-doc-expected.png
new file mode 100644
index 0000000..cd0ebf6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dynamic/outerHTML-doc-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dynamic/outerHTML-img-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dynamic/outerHTML-img-expected.png
new file mode 100644
index 0000000..c45ef37
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dynamic/outerHTML-img-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dynamic/selection-highlight-adjust-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dynamic/selection-highlight-adjust-expected.png
new file mode 100644
index 0000000..1d1546c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/dynamic/selection-highlight-adjust-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/encoding/utf-16-big-endian-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/encoding/utf-16-big-endian-expected.png
new file mode 100644
index 0000000..21b9da5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/encoding/utf-16-big-endian-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/encoding/utf-16-little-endian-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/encoding/utf-16-little-endian-expected.png
new file mode 100644
index 0000000..21b9da5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/encoding/utf-16-little-endian-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/encoding/xmacroman-encoding-test-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/encoding/xmacroman-encoding-test-expected.png
new file mode 100644
index 0000000..a3772d3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/encoding/xmacroman-encoding-test-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/events/pointer-events-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/events/pointer-events-2-expected.png
new file mode 100644
index 0000000..a4804f3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/events/pointer-events-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/events/updateLayoutForHitTest-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/events/updateLayoutForHitTest-expected.png
new file mode 100644
index 0000000..b1a8ae0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/events/updateLayoutForHitTest-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/001-expected.png
new file mode 100644
index 0000000..38c6b5f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/color/input-appearance-color-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/color/input-appearance-color-expected.png
new file mode 100644
index 0000000..f5ecf85
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/color/input-appearance-color-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/date/date-appearance-basic-expected.png
new file mode 100644
index 0000000..fb34312
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
new file mode 100644
index 0000000..c0ba4ea
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/form-element-geometry-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/form-element-geometry-expected.png
new file mode 100644
index 0000000..494322d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/form-element-geometry-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/image/image-alt-text-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/image/image-alt-text-expected.png
new file mode 100644
index 0000000..9b9f2ed4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/image/image-alt-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/month/month-appearance-basic-expected.png
new file mode 100644
index 0000000..c083bb2b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/plaintext-mode-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/plaintext-mode-2-expected.png
new file mode 100644
index 0000000..b4b0998b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/plaintext-mode-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/select-popup/popup-menu-appearance-zoom-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/select-popup/popup-menu-appearance-zoom-expected.png
new file mode 100644
index 0000000..0e4ad5f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/select-popup/popup-menu-appearance-zoom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/select/select-multiple-rtl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/select/select-multiple-rtl-expected.png
new file mode 100644
index 0000000..9bd7bbe
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/select/select-multiple-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/select/select-style-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/select/select-style-expected.png
new file mode 100644
index 0000000..b8dfaa1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/select/select-style-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/select/select-writing-direction-natural-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/select/select-writing-direction-natural-expected.png
new file mode 100644
index 0000000..bfb6b5a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/select/select-writing-direction-natural-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
new file mode 100644
index 0000000..d7a9b07
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
new file mode 100644
index 0000000..95706a1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
new file mode 100644
index 0000000..1b376a8d7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/suggestion-picker/time-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/suggestion-picker/time-suggestion-picker-appearance-expected.png
new file mode 100644
index 0000000..0575201
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/suggestion-picker/time-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/suggestion-picker/time-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/suggestion-picker/time-suggestion-picker-appearance-rtl-expected.png
new file mode 100644
index 0000000..691d14b8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/suggestion-picker/time-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/suggestion-picker/time-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/suggestion-picker/time-suggestion-picker-appearance-with-scroll-bar-expected.png
new file mode 100644
index 0000000..0b384839
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/suggestion-picker/time-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/textarea/basic-textareas-quirks-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/textarea/basic-textareas-quirks-expected.png
new file mode 100644
index 0000000..d9d4740
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/textarea/basic-textareas-quirks-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/time/time-appearance-basic-expected.png
new file mode 100644
index 0000000..4cc0e91
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/validation-bubble-appearance-rtl-ui-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/validation-bubble-appearance-rtl-ui-expected.png
new file mode 100644
index 0000000..8a3c8f9e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/validation-bubble-appearance-rtl-ui-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/week/week-appearance-basic-expected.png
new file mode 100644
index 0000000..98c38ea
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/forms/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/gradients/generated-gradients-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/gradients/generated-gradients-expected.png
new file mode 100644
index 0000000..fa96afa
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/gradients/generated-gradients-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/gradients/list-item-gradient-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/gradients/list-item-gradient-expected.png
new file mode 100644
index 0000000..2151dc2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/gradients/list-item-gradient-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/gradients/radial-centered-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/gradients/radial-centered-expected.png
new file mode 100644
index 0000000..235a3db
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/gradients/radial-centered-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/gradients/simple-gradients-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/gradients/simple-gradients-expected.png
new file mode 100644
index 0000000..53e6900b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/gradients/simple-gradients-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/gradients/unprefixed-list-item-gradient-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/gradients/unprefixed-list-item-gradient-expected.png
new file mode 100644
index 0000000..82da0cf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/gradients/unprefixed-list-item-gradient-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline-block/baseline-vertical-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline-block/baseline-vertical-expected.png
new file mode 100644
index 0000000..51483da
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline-block/baseline-vertical-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/absolute-positioned-inline-in-centred-block-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/absolute-positioned-inline-in-centred-block-expected.png
new file mode 100644
index 0000000..fbd2e896
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/absolute-positioned-inline-in-centred-block-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/continuation-outlines-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/continuation-outlines-expected.png
new file mode 100644
index 0000000..46190fe
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/continuation-outlines-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/continuation-outlines-with-layers-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/continuation-outlines-with-layers-expected.png
new file mode 100644
index 0000000..7a808bc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/continuation-outlines-with-layers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/emptyInlinesWithinLists-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/emptyInlinesWithinLists-expected.png
new file mode 100644
index 0000000..2db9dc38
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/emptyInlinesWithinLists-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/inline-borders-with-bidi-override-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/inline-borders-with-bidi-override-expected.png
new file mode 100644
index 0000000..82d23b5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/inline-borders-with-bidi-override-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/inline-box-background-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/inline-box-background-expected.png
new file mode 100644
index 0000000..96aeebc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/inline-box-background-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/inline-box-background-long-image-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/inline-box-background-long-image-expected.png
new file mode 100644
index 0000000..791ce4a0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/inline-box-background-long-image-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/inline-box-background-repeat-x-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/inline-box-background-repeat-x-expected.png
new file mode 100644
index 0000000..166d29d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/inline-box-background-repeat-x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/inline-box-background-repeat-y-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/inline-box-background-repeat-y-expected.png
new file mode 100644
index 0000000..aa020ce
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/inline-box-background-repeat-y-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/justify-emphasis-inline-box-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/justify-emphasis-inline-box-expected.png
new file mode 100644
index 0000000..92c0dcd
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/inline/justify-emphasis-inline-box-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/invalid/010-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/invalid/010-expected.png
new file mode 100644
index 0000000..bf41ad5f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/invalid/010-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/layers/opacity-transforms-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/layers/opacity-transforms-expected.png
new file mode 100644
index 0000000..ed718310
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/layers/opacity-transforms-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/layers/scroll-rect-to-visible-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/layers/scroll-rect-to-visible-expected.png
new file mode 100644
index 0000000..63dd5f2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/layers/scroll-rect-to-visible-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/001-vertical-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/001-vertical-expected.png
new file mode 100644
index 0000000..77c3a48
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/001-vertical-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/003-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/003-expected.png
new file mode 100644
index 0000000..409e070
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/003-vertical-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/003-vertical-expected.png
new file mode 100644
index 0000000..39ebaaf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/003-vertical-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/008-vertical-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/008-vertical-expected.png
new file mode 100644
index 0000000..9ce4f2d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/008-vertical-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/markers-in-selection-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/markers-in-selection-expected.png
new file mode 100644
index 0000000..fb580ad7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/markers-in-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/ol-display-types-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/ol-display-types-expected.png
new file mode 100644
index 0000000..5ccc42a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/ol-display-types-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/ordered-list-with-no-ol-tag-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/ordered-list-with-no-ol-tag-expected.png
new file mode 100644
index 0000000..2225fc8e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/ordered-list-with-no-ol-tag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/scrolled-marker-paint-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/scrolled-marker-paint-expected.png
new file mode 100644
index 0000000..b177f17
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/lists/scrolled-marker-paint-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/multicol/composited-inner-multicol-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/multicol/composited-inner-multicol-expected.png
new file mode 100644
index 0000000..b34ca25
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/multicol/composited-inner-multicol-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/overflow/003-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/overflow/003-expected.png
new file mode 100644
index 0000000..397a330
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/overflow/003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/overflow/image-selection-highlight-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/overflow/image-selection-highlight-expected.png
new file mode 100644
index 0000000..f271390
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/overflow/image-selection-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/overflow/overflow-rtl-vertical-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/overflow/overflow-rtl-vertical-expected.png
new file mode 100644
index 0000000..b75f5f9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/overflow/overflow-rtl-vertical-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/overflow/overflow-x-y-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/overflow/overflow-x-y-expected.png
new file mode 100644
index 0000000..f138ae8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/overflow/overflow-x-y-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/parser/xhtml-alternate-entities-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/parser/xhtml-alternate-entities-expected.png
new file mode 100644
index 0000000..79f74b51
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/parser/xhtml-alternate-entities-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/reflections/inline-crash-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/reflections/inline-crash-expected.png
new file mode 100644
index 0000000..01da2169
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/reflections/inline-crash-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/reflections/opacity-reflection-transform-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/reflections/opacity-reflection-transform-expected.png
new file mode 100644
index 0000000..3b0016e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/reflections/opacity-reflection-transform-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/reflections/reflection-overflow-hidden-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/reflections/reflection-overflow-hidden-expected.png
new file mode 100644
index 0000000..dd20c22
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/reflections/reflection-overflow-hidden-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/replaced/border-radius-clip-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/replaced/border-radius-clip-expected.png
new file mode 100644
index 0000000..6fdbebf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/replaced/border-radius-clip-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/replaced/selection-rect-in-table-cell-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/replaced/selection-rect-in-table-cell-expected.png
new file mode 100644
index 0000000..720b772
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/replaced/selection-rect-in-table-cell-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/replaced/table-replaced-element-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/replaced/table-replaced-element-expected.txt
new file mode 100644
index 0000000..8b072d5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/replaced/table-replaced-element-expected.txt
@@ -0,0 +1,8 @@
+Layout test for WebKit bug 85581.
+
+This tests that the contents of a table do not overflow when the table contains an image with percentage height. For this test to pass, the blue rectangle should be entirely within the table border and/or you should see a 'PASS' message below.
+
+Height of table: 306
+Height of table contents: 280
+PASS: Table contents do not overflow outside of table border.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/replaced/vertical-lr/absolute-position-percentage-width-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/replaced/vertical-lr/absolute-position-percentage-width-expected.png
new file mode 100644
index 0000000..65b647c7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/replaced/vertical-lr/absolute-position-percentage-width-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/replaced/vertical-lr/absolute-position-with-auto-height-and-top-and-bottom-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/replaced/vertical-lr/absolute-position-with-auto-height-and-top-and-bottom-expected.png
new file mode 100644
index 0000000..cba8dadc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/replaced/vertical-lr/absolute-position-with-auto-height-and-top-and-bottom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/replaced/vertical-lr/absolute-position-with-auto-width-and-left-and-right-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/replaced/vertical-lr/absolute-position-with-auto-width-and-left-and-right-expected.png
new file mode 100644
index 0000000..896688822
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/replaced/vertical-lr/absolute-position-with-auto-width-and-left-and-right-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/selectors/040-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/selectors/040-expected.png
new file mode 100644
index 0000000..7a6ab17
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/selectors/040-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/selectors/041-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/selectors/041-expected.png
new file mode 100644
index 0000000..761e3a3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/selectors/041-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/selectors/159-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/selectors/159-expected.png
new file mode 100644
index 0000000..c392156
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/selectors/159-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/selectors/166-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/selectors/166-expected.png
new file mode 100644
index 0000000..a3467639
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/selectors/166-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/selectors/177a-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/selectors/177a-expected.png
new file mode 100644
index 0000000..0ca1165
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/selectors/177a-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/sub-pixel/inline-block-with-padding-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/sub-pixel/inline-block-with-padding-expected.txt
new file mode 100644
index 0000000..2a05f8a2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/sub-pixel/inline-block-with-padding-expected.txt
@@ -0,0 +1,10 @@
+PASS links[0].offsetWidth is within 5 of 175
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
+
+Both links should render the same and not wrap.
+
+This shouldn't wrap
+This shouldn't wrap
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/040-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/040-expected.png
new file mode 100644
index 0000000..34e8a73
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/040-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/040-vertical-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/040-vertical-expected.png
new file mode 100644
index 0000000..3ef43a2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/040-vertical-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-cell-collapsed-border-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-cell-collapsed-border-expected.png
new file mode 100644
index 0000000..4b494e6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-cell-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-cell-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-cell-expected.png
new file mode 100644
index 0000000..29f0bf3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-cell-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-collapsed-border-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-collapsed-border-expected.png
new file mode 100644
index 0000000..7ac0c80
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-column-collapsed-border-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-column-collapsed-border-expected.png
new file mode 100644
index 0000000..52d963c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-column-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-column-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-column-expected.png
new file mode 100644
index 0000000..aebc011
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-column-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-column-group-collapsed-border-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-column-group-collapsed-border-expected.png
new file mode 100644
index 0000000..a0a1911d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-column-group-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-column-group-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-column-group-expected.png
new file mode 100644
index 0000000..c52eb55
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-column-group-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-expected.png
new file mode 100644
index 0000000..c2271d1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-quirks-collapsed-border-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-quirks-collapsed-border-expected.png
new file mode 100644
index 0000000..780cfbbc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-quirks-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-quirks-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-quirks-expected.png
new file mode 100644
index 0000000..0d655db
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-quirks-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-row-collapsed-border-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-row-collapsed-border-expected.png
new file mode 100644
index 0000000..0edea66
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-row-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-row-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-row-expected.png
new file mode 100644
index 0000000..0909a74b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-row-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-row-group-collapsed-border-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-row-group-collapsed-border-expected.png
new file mode 100644
index 0000000..7289278
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-row-group-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-row-group-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-row-group-expected.png
new file mode 100644
index 0000000..7a823c6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_border-table-row-group-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_layers-hide-collapsed-border-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_layers-hide-collapsed-border-expected.png
new file mode 100644
index 0000000..9a4ca02
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_layers-hide-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_layers-hide-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_layers-hide-expected.png
new file mode 100644
index 0000000..6ad95106
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_layers-hide-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_layers-opacity-collapsed-border-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_layers-opacity-collapsed-border-expected.png
new file mode 100644
index 0000000..a37a1eb
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_layers-opacity-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_layers-opacity-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_layers-opacity-expected.png
new file mode 100644
index 0000000..a37a1eb
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_layers-opacity-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_layers-show-collapsed-border-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_layers-show-collapsed-border-expected.png
new file mode 100644
index 0000000..9a2f30e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_layers-show-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_layers-show-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_layers-show-expected.png
new file mode 100644
index 0000000..5ab9979
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_layers-show-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-cell-collapsed-border-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-cell-collapsed-border-expected.png
new file mode 100644
index 0000000..7b6f7dea
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-cell-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-cell-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-cell-expected.png
new file mode 100644
index 0000000..badb54c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-cell-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-collapsed-border-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-collapsed-border-expected.png
new file mode 100644
index 0000000..943ddcfe
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-column-collapsed-border-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-column-collapsed-border-expected.png
new file mode 100644
index 0000000..7717118
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-column-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-column-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-column-expected.png
new file mode 100644
index 0000000..ded9ed3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-column-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-column-group-collapsed-border-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-column-group-collapsed-border-expected.png
new file mode 100644
index 0000000..ce790155
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-column-group-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-column-group-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-column-group-expected.png
new file mode 100644
index 0000000..b2f1dff
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-column-group-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-expected.png
new file mode 100644
index 0000000..1c7b4a70
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-row-collapsed-border-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-row-collapsed-border-expected.png
new file mode 100644
index 0000000..08f24ac2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-row-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-row-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-row-expected.png
new file mode 100644
index 0000000..86f84663
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-row-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-row-group-collapsed-border-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-row-group-collapsed-border-expected.png
new file mode 100644
index 0000000..c620b84
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-row-group-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-row-group-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-row-group-expected.png
new file mode 100644
index 0000000..ff03e75
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_position-table-row-group-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-cell-collapsed-border-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-cell-collapsed-border-expected.png
new file mode 100644
index 0000000..dae51df
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-cell-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-cell-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-cell-expected.png
new file mode 100644
index 0000000..1cbb9c10
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-cell-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-collapsed-border-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-collapsed-border-expected.png
new file mode 100644
index 0000000..a531507f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-column-collapsed-border-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-column-collapsed-border-expected.png
new file mode 100644
index 0000000..af92a81
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-column-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-column-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-column-expected.png
new file mode 100644
index 0000000..bce2a10
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-column-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-column-group-collapsed-border-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-column-group-collapsed-border-expected.png
new file mode 100644
index 0000000..d1882ba
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-column-group-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-column-group-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-column-group-expected.png
new file mode 100644
index 0000000..b46fb476
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-column-group-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-expected.png
new file mode 100644
index 0000000..aa807e0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-row-collapsed-border-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-row-collapsed-border-expected.png
new file mode 100644
index 0000000..b45dcaa
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-row-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-row-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-row-expected.png
new file mode 100644
index 0000000..b590494
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-row-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-row-group-collapsed-border-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-row-group-collapsed-border-expected.png
new file mode 100644
index 0000000..bcb021f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-row-group-collapsed-border-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-row-group-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-row-group-expected.png
new file mode 100644
index 0000000..4cf5bbae1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/backgr_simple-table-row-group-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/border-collapsing/002-vertical-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/border-collapsing/002-vertical-expected.png
new file mode 100644
index 0000000..20c674f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/border-collapsing/002-vertical-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/border-collapsing/004-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/border-collapsing/004-expected.png
new file mode 100644
index 0000000..678d2c4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/border-collapsing/004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/border-collapsing/rtl-border-collapsing-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/border-collapsing/rtl-border-collapsing-expected.png
new file mode 100644
index 0000000..f0e36cd
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/border-collapsing/rtl-border-collapsing-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/border-collapsing/rtl-border-collapsing-vertical-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/border-collapsing/rtl-border-collapsing-vertical-expected.png
new file mode 100644
index 0000000..4eb3cbf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/border-collapsing/rtl-border-collapsing-vertical-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/quote-text-around-iframe-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/quote-text-around-iframe-expected.png
new file mode 100644
index 0000000..b7c831772
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/quote-text-around-iframe-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/split-table-section-before-anonymous-block-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/split-table-section-before-anonymous-block-2-expected.png
new file mode 100644
index 0000000..1c7763d0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/split-table-section-before-anonymous-block-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/split-table-section-before-anonymous-block-3-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/split-table-section-before-anonymous-block-3-expected.png
new file mode 100644
index 0000000..07536fe
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/split-table-section-before-anonymous-block-3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/split-table-section-before-anonymous-block-4-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/split-table-section-before-anonymous-block-4-expected.png
new file mode 100644
index 0000000..1c7763d0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/table/split-table-section-before-anonymous-block-4-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/atomic-inline-before-ellipsis-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/atomic-inline-before-ellipsis-expected.png
new file mode 100644
index 0000000..8e9264c5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/atomic-inline-before-ellipsis-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/basic/007-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/basic/007-expected.png
new file mode 100644
index 0000000..bb3789a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/basic/007-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/basic/009-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/basic/009-expected.png
new file mode 100644
index 0000000..473dfde
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/basic/009-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/basic/013-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/basic/013-expected.png
new file mode 100644
index 0000000..b7ad34c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/basic/013-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/basic/015-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/basic/015-expected.png
new file mode 100644
index 0000000..1b3e1f9c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/basic/015-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/capitalize-boundaries-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/capitalize-boundaries-expected.png
new file mode 100644
index 0000000..f621ea9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/capitalize-boundaries-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/ellipsis-at-edge-of-ltr-text-in-rtl-flow-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/ellipsis-at-edge-of-ltr-text-in-rtl-flow-expected.png
new file mode 100644
index 0000000..3ded8b1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/ellipsis-at-edge-of-ltr-text-in-rtl-flow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/ellipsis-at-edge-of-rtl-text-in-ltr-flow-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/ellipsis-at-edge-of-rtl-text-in-ltr-flow-expected.png
new file mode 100644
index 0000000..d7248bf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/ellipsis-at-edge-of-rtl-text-in-ltr-flow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/ellipsis-in-absolute-block-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/ellipsis-in-absolute-block-expected.png
new file mode 100644
index 0000000..21531901
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/ellipsis-in-absolute-block-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/ellipsis-mixed-text-in-ltr-flow-underline-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/ellipsis-mixed-text-in-ltr-flow-underline-expected.png
new file mode 100644
index 0000000..3dfd14f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/ellipsis-mixed-text-in-ltr-flow-underline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/ellipsis-mixed-text-in-rtl-flow-underline-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/ellipsis-mixed-text-in-rtl-flow-underline-2-expected.png
new file mode 100644
index 0000000..0351d02b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/ellipsis-mixed-text-in-rtl-flow-underline-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/ellipsis-rtl-text-in-rtl-flow-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/ellipsis-rtl-text-in-rtl-flow-expected.png
new file mode 100644
index 0000000..2ccd6f8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/ellipsis-rtl-text-in-rtl-flow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/ellipsis-rtl-text-in-rtl-flow-underline-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/ellipsis-rtl-text-in-rtl-flow-underline-expected.png
new file mode 100644
index 0000000..89bae7b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/ellipsis-rtl-text-in-rtl-flow-underline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/emoticons-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/emoticons-expected.png
new file mode 100644
index 0000000..3aff8f23
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/emoticons-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/emphasis-ellipsis-complextext-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/emphasis-ellipsis-complextext-expected.png
new file mode 100644
index 0000000..dee50bae
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/emphasis-ellipsis-complextext-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/fake-italic-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/fake-italic-expected.png
new file mode 100644
index 0000000..6e67c9bc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/fake-italic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/fallback-for-custom-font-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/fallback-for-custom-font-expected.png
new file mode 100644
index 0000000..2751edf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/fallback-for-custom-font-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/font-features/caps-native-synthesis-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/font-features/caps-native-synthesis-expected.png
new file mode 100644
index 0000000..d5b5161
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/font-features/caps-native-synthesis-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/font-stretch-variant-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/font-stretch-variant-expected.png
new file mode 100644
index 0000000..ad3cd3a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/font-stretch-variant-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/hide-atomic-inlines-after-ellipsis-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/hide-atomic-inlines-after-ellipsis-expected.png
new file mode 100644
index 0000000..8bde08f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/hide-atomic-inlines-after-ellipsis-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/003-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/003-expected.png
new file mode 100644
index 0000000..a04ecdee
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-CS-after-AN-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-CS-after-AN-expected.png
new file mode 100644
index 0000000..da0414d5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-CS-after-AN-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-LDB-2-CSS-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-LDB-2-CSS-expected.png
new file mode 100644
index 0000000..e0342b69
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-LDB-2-CSS-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-LDB-2-HTML-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-LDB-2-HTML-expected.png
new file mode 100644
index 0000000..c349b48
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-LDB-2-HTML-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-LDB-2-formatting-characters-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-LDB-2-formatting-characters-expected.png
new file mode 100644
index 0000000..772c849
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-LDB-2-formatting-characters-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-ignored-for-first-child-inline-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-ignored-for-first-child-inline-expected.png
new file mode 100644
index 0000000..d87c632
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-ignored-for-first-child-inline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-innertext-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-innertext-expected.png
new file mode 100644
index 0000000..ce29e35
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-innertext-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-linebreak-001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-linebreak-001-expected.png
new file mode 100644
index 0000000..fba79c2d6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-linebreak-001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-linebreak-002-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-linebreak-002-expected.png
new file mode 100644
index 0000000..dc9aaa2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-linebreak-002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-linebreak-003-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-linebreak-003-expected.png
new file mode 100644
index 0000000..dc9aaa2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-linebreak-003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-listbox-atsui-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-listbox-atsui-expected.png
new file mode 100644
index 0000000..1a83774
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-listbox-atsui-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-mirror-he-ar-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-mirror-he-ar-expected.png
new file mode 100644
index 0000000..f0c4808c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-mirror-he-ar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-neutral-directionality-paragraph-start-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-neutral-directionality-paragraph-start-expected.png
new file mode 100644
index 0000000..d78fdc0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/bidi-neutral-directionality-paragraph-start-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/hindi-whitespace-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/hindi-whitespace-expected.png
new file mode 100644
index 0000000..e5f7776
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/hindi-whitespace-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/plane2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/plane2-expected.png
new file mode 100644
index 0000000..d4c7554f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/plane2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/shape-across-elements-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/shape-across-elements-expected.txt
new file mode 100644
index 0000000..df204ba
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/shape-across-elements-expected.txt
@@ -0,0 +1,11 @@
+FAIL Width of isolated word should match width of word with markup.
+FAIL Width of partial glyph in ligature should not match width of isolated glyph.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
+Shape across element boundary test
+سلام The word by itself.
+سلام Adding a span around a character that forms a ligature. Should render the same as the above, except that half of the middle glyph should be red.
+سل‍ام Same word with a ZWJ character to disallow the ligature.
+ل The letter in red, in isolation.
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/thai-baht-space-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/thai-baht-space-expected.png
new file mode 100644
index 0000000..08f8365
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/thai-baht-space-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/unicode-bidi-plaintext-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/unicode-bidi-plaintext-expected.png
new file mode 100644
index 0000000..933ea41
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/unicode-bidi-plaintext-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/wrap-CJK-001-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/wrap-CJK-001-expected.png
new file mode 100644
index 0000000..dc558b3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/international/wrap-CJK-001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/justify-ideograph-simple-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/justify-ideograph-simple-expected.png
new file mode 100644
index 0000000..021fc177
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/justify-ideograph-simple-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/justify-ideograph-vertical-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/justify-ideograph-vertical-expected.png
new file mode 100644
index 0000000..0915ce3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/justify-ideograph-vertical-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/midword-break-before-surrogate-pair-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/midword-break-before-surrogate-pair-expected.png
new file mode 100644
index 0000000..dd671b0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/midword-break-before-surrogate-pair-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/orientation-sideways-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/orientation-sideways-expected.png
new file mode 100644
index 0000000..f8518768
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/orientation-sideways-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-block-adjacent-float-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-block-adjacent-float-2-expected.png
new file mode 100644
index 0000000..b457b61
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-block-adjacent-float-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-block-adjacent-float-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-block-adjacent-float-expected.png
new file mode 100644
index 0000000..37b0c0d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-block-adjacent-float-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-blocks-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-blocks-2-expected.png
new file mode 100644
index 0000000..78c1861f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-blocks-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-blocks-align-center-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-blocks-align-center-expected.png
new file mode 100644
index 0000000..7999d0e8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-blocks-align-center-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-blocks-align-justify-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-blocks-align-justify-expected.png
new file mode 100644
index 0000000..7999d0e8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-blocks-align-justify-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-blocks-align-left-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-blocks-align-left-expected.png
new file mode 100644
index 0000000..7999d0e8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-blocks-align-left-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-blocks-align-right-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-blocks-align-right-expected.png
new file mode 100644
index 0000000..7999d0e8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-blocks-align-right-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-blocks-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-blocks-expected.png
new file mode 100644
index 0000000..7999d0e8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-ellipsis-in-inline-blocks-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-2-expected.png
new file mode 100644
index 0000000..9aea753
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-align-center-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-align-center-2-expected.png
new file mode 100644
index 0000000..e93b020
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-align-center-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-align-center-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-align-center-expected.png
new file mode 100644
index 0000000..19049a0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-align-center-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-align-justify-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-align-justify-expected.png
new file mode 100644
index 0000000..dfe01cf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-align-justify-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-align-left-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-align-left-2-expected.png
new file mode 100644
index 0000000..2bfd330
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-align-left-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-align-left-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-align-left-expected.png
new file mode 100644
index 0000000..7f23912
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-align-left-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-align-right-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-align-right-2-expected.png
new file mode 100644
index 0000000..3236f044
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-align-right-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-align-right-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-align-right-expected.png
new file mode 100644
index 0000000..299ee5b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-align-right-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-expected.png
new file mode 100644
index 0000000..dfe01cf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-mixed-ellipsis-in-inline-blocks-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-rtl-ellipsis-in-inline-blocks-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-rtl-ellipsis-in-inline-blocks-2-expected.png
new file mode 100644
index 0000000..956bb3b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-rtl-ellipsis-in-inline-blocks-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-rtl-ellipsis-in-inline-blocks-align-center-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-rtl-ellipsis-in-inline-blocks-align-center-expected.png
new file mode 100644
index 0000000..a71336bf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-rtl-ellipsis-in-inline-blocks-align-center-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-rtl-ellipsis-in-inline-blocks-align-justify-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-rtl-ellipsis-in-inline-blocks-align-justify-expected.png
new file mode 100644
index 0000000..a71336bf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-rtl-ellipsis-in-inline-blocks-align-justify-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-rtl-ellipsis-in-inline-blocks-align-left-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-rtl-ellipsis-in-inline-blocks-align-left-expected.png
new file mode 100644
index 0000000..a71336bf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-rtl-ellipsis-in-inline-blocks-align-left-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-rtl-ellipsis-in-inline-blocks-align-right-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-rtl-ellipsis-in-inline-blocks-align-right-expected.png
new file mode 100644
index 0000000..a71336bf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-rtl-ellipsis-in-inline-blocks-align-right-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-rtl-ellipsis-in-inline-blocks-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-rtl-ellipsis-in-inline-blocks-expected.png
new file mode 100644
index 0000000..a71336bf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/place-rtl-ellipsis-in-inline-blocks-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/atsui-kerning-and-ligatures-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/atsui-kerning-and-ligatures-expected.png
new file mode 100644
index 0000000..76358b4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/atsui-kerning-and-ligatures-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/atsui-partial-selection-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/atsui-partial-selection-expected.png
new file mode 100644
index 0000000..b76b20d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/atsui-partial-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/atsui-rtl-override-selection-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/atsui-rtl-override-selection-expected.png
new file mode 100644
index 0000000..162686a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/atsui-rtl-override-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/complex-text-rtl-selection-repaint-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/complex-text-rtl-selection-repaint-expected.png
new file mode 100644
index 0000000..018a580
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/complex-text-rtl-selection-repaint-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/emphasis-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/emphasis-expected.png
new file mode 100644
index 0000000..a80fef06
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/emphasis-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/flexbox-selection-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/flexbox-selection-expected.png
new file mode 100644
index 0000000..d98f4031
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/flexbox-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/flexbox-selection-nested-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/flexbox-selection-nested-expected.png
new file mode 100644
index 0000000..c3d9c34
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/flexbox-selection-nested-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/justified-selection-at-edge-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/justified-selection-at-edge-expected.png
new file mode 100644
index 0000000..effc16c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/justified-selection-at-edge-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/justified-selection-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/justified-selection-expected.png
new file mode 100644
index 0000000..c0d89c4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/justified-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/khmer-selection-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/khmer-selection-expected.png
new file mode 100644
index 0000000..22edc5c9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/khmer-selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/selection-hard-linebreak-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/selection-hard-linebreak-expected.png
new file mode 100644
index 0000000..649a6b2c2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/selection-hard-linebreak-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/selection-multiple-runs-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/selection-multiple-runs-expected.png
new file mode 100644
index 0000000..610315c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/selection-multiple-runs-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/selection-painting-hidpi-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/selection-painting-hidpi-expected.png
new file mode 100644
index 0000000..cd1c626
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/selection-painting-hidpi-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/selection-rect-line-height-too-big-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/selection-rect-line-height-too-big-expected.png
new file mode 100644
index 0000000..09ebca3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/selection-rect-line-height-too-big-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/selection-with-inline-padding-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/selection-with-inline-padding-expected.png
new file mode 100644
index 0000000..f8f78964
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/selection-with-inline-padding-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/shaping-selection-rect-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/shaping-selection-rect-expected.png
new file mode 100644
index 0000000..8206947
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/shaping-selection-rect-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/should-use-atsui-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/should-use-atsui-expected.png
new file mode 100644
index 0000000..a222513
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/selection/should-use-atsui-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/shaping/same-script-different-lang-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/shaping/same-script-different-lang-expected.png
new file mode 100644
index 0000000..4216585
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/shaping/same-script-different-lang-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/sub-pixel/text-scaling-pixel-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/sub-pixel/text-scaling-pixel-expected.png
new file mode 100644
index 0000000..a3dbc680c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/sub-pixel/text-scaling-pixel-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/text-letter-spacing-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/text-letter-spacing-expected.png
new file mode 100644
index 0000000..b1c63767
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/text-letter-spacing-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/trailing-white-space-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/trailing-white-space-2-expected.png
new file mode 100644
index 0000000..84ef0d3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/trailing-white-space-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/trailing-white-space-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/trailing-white-space-expected.png
new file mode 100644
index 0000000..c30b7f34
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/trailing-white-space-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/unicode-fallback-font-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/unicode-fallback-font-expected.png
new file mode 100644
index 0000000..96a67b0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/unicode-fallback-font-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/whitespace/028-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/whitespace/028-expected.png
new file mode 100644
index 0000000..ed86d31a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/whitespace/028-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/word-space-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/word-space-expected.png
new file mode 100644
index 0000000..b00fe08
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/text/word-space-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/background-vertical-lr-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/background-vertical-lr-expected.png
new file mode 100644
index 0000000..9dc056be
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/background-vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/basic-vertical-line-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/basic-vertical-line-expected.png
new file mode 100644
index 0000000..e2402cf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/basic-vertical-line-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/border-image-vertical-lr-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/border-image-vertical-lr-expected.png
new file mode 100644
index 0000000..a447982
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/border-image-vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/border-radius-clipping-vertical-lr-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/border-radius-clipping-vertical-lr-expected.png
new file mode 100644
index 0000000..c8bcd7af
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/border-radius-clipping-vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/border-styles-vertical-lr-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/border-styles-vertical-lr-expected.png
new file mode 100644
index 0000000..fd1f876
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/border-styles-vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/english-lr-text-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/english-lr-text-expected.png
new file mode 100644
index 0000000..0bc0566a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/english-lr-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/fieldsets-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/fieldsets-expected.png
new file mode 100644
index 0000000..92a91be5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/fieldsets-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/flipped-blocks-hit-test-line-edges-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/flipped-blocks-hit-test-line-edges-expected.txt
new file mode 100644
index 0000000..c734702
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/flipped-blocks-hit-test-line-edges-expected.txt
@@ -0,0 +1,12 @@
+Lorem ipsum dolor sit amet
+PASS: offset at (100,105) was 4.
+PASS: offset at (160,105) was 5.
+PASS: offset at (100,104) was 10.
+PASS: offset at (160,104) was 11.
+PASS: offset at (60,26) was 24.
+PASS: offset at (160,26) was 26.
+PASS: offset at (60,25) was 24.
+PASS: offset at (160,25) was 26.
+FAIL: offset at (60,24) was 26. Expected 24.
+PASS: offset at (160,24) was 26.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/japanese-lr-text-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/japanese-lr-text-expected.png
new file mode 100644
index 0000000..ab03b11
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/japanese-lr-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/table-percent-width-quirk-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/table-percent-width-quirk-expected.png
new file mode 100644
index 0000000..4494e9ee
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/table-percent-width-quirk-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/vertical-align-table-baseline-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/vertical-align-table-baseline-expected.png
new file mode 100644
index 0000000..18e1812
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/vertical-align-table-baseline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/vertical-baseline-alignment-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/vertical-baseline-alignment-expected.png
new file mode 100644
index 0000000..58aac1d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/vertical-baseline-alignment-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/vertical-font-fallback-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/vertical-font-fallback-expected.png
new file mode 100644
index 0000000..41e5d8da
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/writing-mode/vertical-font-fallback-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/xsl/xslt-extra-content-at-end-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/xsl/xslt-extra-content-at-end-expected.png
new file mode 100644
index 0000000..dc46ed3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fast/xsl/xslt-extra-content-at-end-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fonts/monospace-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fonts/monospace-expected.png
new file mode 100644
index 0000000..903c0ea
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fonts/monospace-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fonts/sans-serif-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fonts/sans-serif-expected.png
new file mode 100644
index 0000000..15ce881
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fonts/sans-serif-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fonts/serif-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fonts/serif-expected.png
new file mode 100644
index 0000000..e01dd15f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fonts/serif-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fullscreen/full-screen-with-flex-item-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fullscreen/full-screen-with-flex-item-expected.txt
new file mode 100644
index 0000000..b5c66b7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/fullscreen/full-screen-with-flex-item-expected.txt
@@ -0,0 +1,6 @@
+Enter Fullscreen
+EVENT(webkitfullscreenchange)
+EVENT(webkitfullscreenchange)
+EXPECTED (584 == '584') OK
+END OF TEST
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/html/details_summary/details-writing-mode-align-center-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/html/details_summary/details-writing-mode-align-center-expected.png
new file mode 100644
index 0000000..c830efd
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/html/details_summary/details-writing-mode-align-center-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/html/details_summary/details-writing-mode-align-left-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/html/details_summary/details-writing-mode-align-left-expected.png
new file mode 100644
index 0000000..1b4b19a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/html/details_summary/details-writing-mode-align-left-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/html/details_summary/details-writing-mode-align-right-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/html/details_summary/details-writing-mode-align-right-expected.png
new file mode 100644
index 0000000..e72ee4f4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/html/details_summary/details-writing-mode-align-right-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/html/details_summary/details-writing-mode-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/html/details_summary/details-writing-mode-expected.png
new file mode 100644
index 0000000..1019e58c3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/html/details_summary/details-writing-mode-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/html/tabular_data/td_colspan_rendering-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/html/tabular_data/td_colspan_rendering-expected.png
new file mode 100644
index 0000000..5c6f2d1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/html/tabular_data/td_colspan_rendering-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/http/tests/misc/iframe404-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/http/tests/misc/iframe404-expected.png
new file mode 100644
index 0000000..ea148ae
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/http/tests/misc/iframe404-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/http/tests/misc/slow-loading-image-in-pattern-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/http/tests/misc/slow-loading-image-in-pattern-expected.png
new file mode 100644
index 0000000..e6ce6bd
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/http/tests/misc/slow-loading-image-in-pattern-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/http/tests/misc/slow-loading-mask-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/http/tests/misc/slow-loading-mask-expected.png
new file mode 100644
index 0000000..487f249
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/http/tests/misc/slow-loading-mask-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/http/tests/uri/css-href-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/http/tests/uri/css-href-expected.png
new file mode 100644
index 0000000..8ca0fdd
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/http/tests/uri/css-href-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/ietestcenter/css3/text/textshadow-002-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/ietestcenter/css3/text/textshadow-002-expected.png
new file mode 100644
index 0000000..76d9d3a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/ietestcenter/css3/text/textshadow-002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/images/color-profile-image-filter-all-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/images/color-profile-image-filter-all-expected.png
new file mode 100644
index 0000000..3287a0c7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/images/color-profile-image-filter-all-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/images/exif-orientation-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/images/exif-orientation-expected.png
new file mode 100644
index 0000000..8a94dff
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/images/exif-orientation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/images/exif-orientation-image-document-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/images/exif-orientation-image-document-expected.png
new file mode 100644
index 0000000..1e251535
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/images/exif-orientation-image-document-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/inspector-protocol/css/css-get-platform-fonts-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/inspector-protocol/css/css-get-platform-fonts-expected.txt
new file mode 100644
index 0000000..c14ba14e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/inspector-protocol/css/css-get-platform-fonts-expected.txt
@@ -0,0 +1,22 @@
+Test css.getPlatformFontsForNode method.
+
+Running test: testFirstLetterPseudoClass
+Font #0
+    name: <Some-family-name-0>
+    glyphCount: 29
+    isCustomFont: true
+Font #1
+    name: <Some-family-name-1>
+    glyphCount: 7
+    isCustomFont: false
+Font #2
+    name: <Some-family-name-2>
+    glyphCount: 1
+    isCustomFont: false
+
+Running test: testSelectElementPlatformFonts
+Font #0
+    name: <Some-family-name-0>
+    glyphCount: 27
+    isCustomFont: false
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/inspector-protocol/layout-fonts/languages-emoji-rare-glyphs-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/inspector-protocol/layout-fonts/languages-emoji-rare-glyphs-expected.txt
new file mode 100644
index 0000000..c21b7c5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/inspector-protocol/layout-fonts/languages-emoji-rare-glyphs-expected.txt
@@ -0,0 +1,40 @@
+百家姓 趙錢孫李 周吳鄭王 馮陳褚衛 蔣沈韓楊 朱秦尤許 何呂施張 孔曹嚴華 金魏陶薑 戚謝鄒喻 柏水竇章 雲蘇潘葛 奚範彭郎 魯韋昌馬 苗鳳花方 俞任袁柳 酆鮑史唐 費廉岑薛 雷賀倪湯 滕殷羅畢 郝鄔安常 樂於時傅 皮卞齊康 伍餘元蔔 顧孟平黃 和穆蕭尹 姚邵堪汪 祁毛禹狄 米貝明臧 計伏成戴 談宋茅龐 熊紀舒屈 項祝董梁 杜阮藍閔 席季麻強 賈路婁危 江童顏郭 梅盛林刁 鍾徐邱駱 高夏蔡田 樊胡淩霍 虞萬支柯 昝管盧莫 經房裘繆 幹解應宗 丁宣賁鄧 鬱單杭洪 包諸左石 崔吉鈕龔 程嵇邢滑 裴陸榮翁 荀羊於惠 甄曲家封 芮羿儲靳 汲邴糜松 井段富巫 烏焦巴弓 牧隗山穀 車侯宓蓬 全郗班仰 秋仲伊宮 寧仇欒暴 甘鈄厲戎 祖武符劉 景詹束龍 葉幸司韶 郜黎薊薄 印宿白懷 蒲台從鄂 索鹹籍賴 卓藺屠蒙 池喬陰鬱 胥能蒼雙 聞莘黨翟 譚貢勞逄 姬申扶堵 冉宰酈雍 卻璩桑桂 濮牛壽通 邊扈燕冀 郟浦尚農 溫別莊晏 柴瞿閻充 慕連茹習 宦艾魚容 向古易慎 戈廖庚終 暨居衡步 都耿滿弘 匡國文寇 廣祿闕東 毆殳沃利 蔚越夔隆 師鞏厙聶 晁勾敖融 冷訾辛闞 那簡饒空 曾毋沙乜 養鞠須豐 巢關蒯相 查後荊紅 遊竺權逯 蓋益桓公 萬俟司馬 上官歐陽 夏侯諸葛 聞人東方 赫連皇甫 尉遲公羊 澹台公冶 宗政濮陽 淳於單於 太叔申屠 公孫仲孫 軒轅令狐 鐘離宇文 長孫慕容 鮮於閭丘 司徒司空 亓官司寇 仉督子車 顓孫端木 巫馬公西 漆雕樂正 壤駟公良 拓拔夾穀 宰父穀粱 晉楚閆法 汝鄢塗欽 段幹百里 東郭南門 呼延歸海 羊舌微生 嶽帥緱亢 況後有琴 梁丘左丘 東門西門 商牟佘佴 伯賞南宮 墨哈譙笪 年愛陽佟
+#hundred_chinese_surnames:
+"Noto Sans CJK JP Regular" : 560,
+"Tinos" : 140,
+"Ahem" : 3
+
+いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさき ゆめみし ゑひもせす(ん)色は匂へど 散りぬるを 我が世誰ぞ 常ならむ 有為の奥山 今日越えて 浅き夢見じ 酔ひもせず(ん)
+#japanese_iroha:
+"Noto Sans CJK JP Regular" : 92,
+"Tinos" : 15
+
+키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다.
+#korean_pangram:
+"Noto Sans CJK JP Regular" : 28,
+"Tinos" : 9
+
+ऋषियों को सताने वाले दुष्ट राक्षसों के राजा रावण का सर्वनाश करने वाले विष्णुवतार भगवान श्रीराम, अयोध्या के महाराज दशरथ के बड़े सपुत्र थे।
+#hindi_pangram:
+"Lohit Devanagari" : 99,
+"Tinos" : 24
+
+نصٌّ حكيمٌ لهُ سِرٌّ قاطِعٌ وَذُو شَأنٍ عَظيمٍ مكتوبٌ على ثوبٍ أخضرَ ومُغلفٌ بجلدٍ أزرق
+#arabic_pangram:
+"DejaVu Sans" : 71,
+"Tinos" : 14
+
+🌱🌲🌳🌴🌵🌷🌸🌹🌺🌻🌼💐🌾🌿🍀🍁🍂🍃🍄🌰
+#emoji:
+"DejaVu Sans" : 20
+
+𓀀𓀁𓀂𓀃𓀄𓀅𓀆𓀇𓀈𓀉𓀊𓀋𓀌𓀍𓀎𓀏
+#egyptian_hieroglyphs:
+"DejaVu Sans" : 16
+
+ខ្ញុំអាចញុំកញ្ចក់បាន ដោយគ្មានបញ្ហារ
+#khmer:
+"Noto Sans Khmer" : 26,
+"Tinos" : 1
+
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/media/video-aspect-ratio-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/media/video-aspect-ratio-expected.png
new file mode 100644
index 0000000..324e5f47
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/media/video-aspect-ratio-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/media/video-colorspace-yuv420-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/media/video-colorspace-yuv420-expected.png
new file mode 100644
index 0000000..c0571f8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/media/video-colorspace-yuv420-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/media/video-colorspace-yuv422-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/media/video-colorspace-yuv422-expected.png
new file mode 100644
index 0000000..33b7d3f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/media/video-colorspace-yuv422-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/background/background-misaligned-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/background/background-misaligned-expected.txt
new file mode 100644
index 0000000..8b085536
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/background/background-misaligned-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV id='target'",
+          "rect": [238, 241, 40, 40],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/block-layout-inline-children-replaced-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/block-layout-inline-children-replaced-expected.txt
new file mode 100644
index 0000000..0f1216a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/block-layout-inline-children-replaced-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='target' class='target'",
+          "rect": [0, 116, 402, 152],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutImage IMG",
+          "rect": [151, 117, 100, 100],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/block-no-inflow-children-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/block-no-inflow-children-expected.txt
new file mode 100644
index 0000000..c298739e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/block-no-inflow-children-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'La la la la'",
+          "rect": [0, 0, 62, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'La la la'",
+          "rect": [0, 0, 47, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/box/hover-pseudo-borders-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/box/hover-pseudo-borders-expected.txt
new file mode 100644
index 0000000..ee1886f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/box/hover-pseudo-borders-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) \u003Cpseudo:after\u003E",
+          "rect": [138, 8, 100, 100],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='hitregion'",
+          "rect": [8, 8, 100, 100],
+          "reason": "background"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/box/invalidate-box-shadow-currentColor-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/box/invalidate-box-shadow-currentColor-expected.txt
new file mode 100644
index 0000000..e52439a1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/box/invalidate-box-shadow-currentColor-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineFlowBox",
+          "rect": [8, 8, 29, 24],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'Text'",
+          "rect": [8, 8, 29, 19],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/bugzilla-3509-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/bugzilla-3509-expected.txt
new file mode 100644
index 0000000..9cfe063
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/bugzilla-3509-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='im'",
+          "rect": [11, 131, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [11, 131, 4, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [11, 131, 4, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/bugzilla-5699-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/bugzilla-5699-expected.txt
new file mode 100644
index 0000000..3cb2aa5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/bugzilla-5699-expected.txt
@@ -0,0 +1,44 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Hello'",
+          "rect": [8, 184, 35, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'Hello'",
+          "rect": [8, 156, 35, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [8, 150, 4, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [8, 136, 4, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/bugzilla-6278-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/bugzilla-6278-expected.txt
new file mode 100644
index 0000000..06a3459
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/bugzilla-6278-expected.txt
@@ -0,0 +1,144 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [10, 138, 292, 160],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [10, 303, 292, 50],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'Curabitur pretium, quam quis semper'",
+          "rect": [10, 138, 291, 159],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Phasellus vehicula, sem at posuere vehicula,'",
+          "rect": [10, 138, 291, 159],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'augue nibh molestie nisl, nec ullamcorper'",
+          "rect": [10, 138, 291, 159],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'fringilla orci nibh sed neque. Quisque eu nulla'",
+          "rect": [10, 138, 291, 159],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'lacus ante vulputate pede.'",
+          "rect": [10, 138, 291, 159],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'laoreet ac, laoreet non, suscipit sed, sapien.'",
+          "rect": [10, 138, 291, 159],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'malesuada, est libero feugiat libero, vel'",
+          "rect": [10, 138, 291, 159],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'non nisi molestie accumsan. Etiam tellus urna,'",
+          "rect": [10, 138, 291, 159],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [10, 138, 242, 200],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [10, 343, 242, 50],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD id='col1'",
+          "rect": [10, 353, 242, 40],
+          "reason": "incremental"
+        },
+        {
+          "object": "InlineTextBox 'Curabitur pretium, quam quis semper'",
+          "rect": [10, 138, 235, 199],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Phasellus vehicula, sem at posuere'",
+          "rect": [10, 138, 235, 199],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Quisque eu nulla non nisi molestie'",
+          "rect": [10, 138, 235, 199],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'ac, laoreet non, suscipit sed, sapien.'",
+          "rect": [10, 138, 235, 199],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'accumsan. Etiam tellus urna, laoreet'",
+          "rect": [10, 138, 235, 199],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'malesuada, est libero feugiat libero,'",
+          "rect": [10, 138, 235, 199],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'nec ullamcorper lacus ante vulputate'",
+          "rect": [10, 138, 235, 199],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'pede.'",
+          "rect": [10, 138, 235, 199],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'vehicula, augue nibh molestie nisl,'",
+          "rect": [10, 138, 235, 199],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'vel fringilla orci nibh sed neque.'",
+          "rect": [10, 138, 235, 199],
+          "reason": "appeared"
+        },
+        {
+          "object": "LayoutTableCell TD id='col1'",
+          "rect": [252, 138, 50, 215],
+          "reason": "incremental"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/bugzilla-7235-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/bugzilla-7235-expected.txt
new file mode 100644
index 0000000..3e464899
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/bugzilla-7235-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV id='t'",
+          "rect": [8, 176, 100, 100],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [8, 156, 4, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [8, 156, 4, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/clip/clip-with-layout-delta-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/clip/clip-with-layout-delta-expected.txt
new file mode 100644
index 0000000..ca6e810
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/clip/clip-with-layout-delta-expected.txt
@@ -0,0 +1,54 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV",
+          "rect": [108, 8, 100, 100],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV",
+          "rect": [108, 8, 100, 100],
+          "reason": "chunk appeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [8, 8, 100, 100],
+          "reason": "appeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [8, 8, 100, 100],
+          "reason": "chunk disappeared"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [108, 8, 4, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow HTML",
+          "rect": [8, 8, 4, 19],
+          "reason": "chunk appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/clip/outline-clip-change-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/clip/outline-clip-change-expected.txt
new file mode 100644
index 0000000..658dc13
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/clip/outline-clip-change-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) A id='link' class='updated'",
+          "rect": [48, 108, 90, 25],
+          "reason": "chunk appeared"
+        },
+        {
+          "object": "LayoutBlockFlow HTML",
+          "rect": [48, 108, 86, 19],
+          "reason": "chunk disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/iframe-inside-squashed-layer-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/iframe-inside-squashed-layer-expected.txt
new file mode 100644
index 0000000..865abe4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/iframe-inside-squashed-layer-expected.txt
@@ -0,0 +1,67 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [785, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [785, 1016],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Squashing Containment Layer",
+      "drawsContent": false
+    },
+    {
+      "name": "LayoutBlockFlow DIV id='foo'",
+      "bounds": [200, 1000],
+      "contentsOpaque": true,
+      "backgroundColor": "#D3D3D3",
+      "transform": 1
+    },
+    {
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV)",
+      "position": [8, 0],
+      "bounds": [300, 654],
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'test1'",
+          "rect": [8, 508, 29, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'test1'",
+          "rect": [8, 508, 29, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutView #document",
+          "rect": [285, 500, 15, 150],
+          "reason": "chunk appeared"
+        }
+      ]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [8, 8, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/layer-repaint-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/layer-repaint-expected.png
new file mode 100644
index 0000000..2dbfcc49
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/layer-repaint-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/layer-repaint-rects-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/layer-repaint-rects-expected.png
new file mode 100644
index 0000000..2343e6d6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/layer-repaint-rects-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/remove-squashed-layer-plus-move-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/remove-squashed-layer-plus-move-expected.txt
new file mode 100644
index 0000000..ae328dc1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/remove-squashed-layer-plus-move-expected.txt
@@ -0,0 +1,61 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [785, 585],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [1418, 1008],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Squashing Containment Layer",
+      "drawsContent": false
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV",
+      "bounds": [1000, 1000],
+      "drawsContent": false,
+      "transform": 1
+    },
+    {
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (relative positioned) DIV class='mv-tile')",
+      "position": [8, 8],
+      "bounds": [1000, 105],
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV class='mv-tile'",
+          "rect": [0, 55, 100, 50],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV class='mv-tile'",
+          "rect": [0, 0, 100, 50],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [8, 8, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/should-not-clip-composited-overflow-scrolling-layer-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/should-not-clip-composited-overflow-scrolling-layer-expected.txt
new file mode 100644
index 0000000..c492349b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/should-not-clip-composited-overflow-scrolling-layer-expected.txt
@@ -0,0 +1,95 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "LayoutBlockFlow DIV id='container'",
+      "position": [8, 8],
+      "bounds": [400, 300]
+    },
+    {
+      "name": "Scrolling Layer",
+      "position": [8, 8],
+      "bounds": [385, 285],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "position": [8, 8],
+      "bounds": [1000, 1000],
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='content'",
+          "rect": [0, 0, 1000, 1000],
+          "reason": "background"
+        }
+      ],
+      "transform": 1
+    },
+    {
+      "name": "Overflow Controls Host Layer",
+      "position": [8, 8],
+      "bounds": [400, 300],
+      "drawsContent": false
+    },
+    {
+      "name": "Horizontal Scrollbar Layer",
+      "position": [8, 293],
+      "bounds": [385, 15],
+      "drawsContent": false,
+      "paintInvalidations": [
+        {
+          "object": "Horizontal Scrollbar Layer",
+          "rect": [0, 0, 385, 15],
+          "reason": "full layer"
+        }
+      ]
+    },
+    {
+      "name": "Vertical Scrollbar Layer",
+      "position": [393, 8],
+      "bounds": [15, 285],
+      "drawsContent": false,
+      "paintInvalidations": [
+        {
+          "object": "Vertical Scrollbar Layer",
+          "rect": [0, 0, 15, 285],
+          "reason": "full layer"
+        }
+      ]
+    },
+    {
+      "name": "Scroll Corner Layer",
+      "position": [393, 293],
+      "bounds": [15, 15]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [-500, -400, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/should-not-clip-composited-viewport-scrolling-layer-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/should-not-clip-composited-viewport-scrolling-layer-expected.txt
new file mode 100644
index 0000000..5d571984
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/should-not-clip-composited-viewport-scrolling-layer-expected.txt
@@ -0,0 +1,42 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [785, 585],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [2008, 1516],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='content'",
+          "rect": [8, 8, 2000, 1500],
+          "reason": "background"
+        }
+      ],
+      "transform": 1
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [-900, -700, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/text-color-change-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/text-color-change-expected.txt
new file mode 100644
index 0000000..23ed21cc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/text-color-change-expected.txt
@@ -0,0 +1,144 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/text-match-highlight-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/text-match-highlight-expected.txt
new file mode 100644
index 0000000..f7e5f434
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/text-match-highlight-expected.txt
@@ -0,0 +1,64 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Can you findme in this boring text?'",
+          "rect": [10, 135, 223, 19],
+          "reason": "DocumentMarker change"
+        },
+        {
+          "object": "InlineTextBox 'Findme on a path! Did you findme?'",
+          "rect": [20, 224, 182, 72],
+          "reason": "DocumentMarker change"
+        },
+        {
+          "object": "InlineTextBox 'Findme in a typewriter!'",
+          "rect": [10, 191, 138, 12],
+          "reason": "DocumentMarker change"
+        },
+        {
+          "object": "InlineTextBox 'findme'",
+          "rect": [278, 40, 44, 19],
+          "reason": "DocumentMarker change"
+        },
+        {
+          "object": "InlineTextBox 'findme'",
+          "rect": [264, 60, 44, 19],
+          "reason": "DocumentMarker change"
+        },
+        {
+          "object": "InlineTextBox 'findme'",
+          "rect": [220, 60, 44, 19],
+          "reason": "DocumentMarker change"
+        },
+        {
+          "object": "InlineTextBox 'findme'",
+          "rect": [89, 60, 44, 19],
+          "reason": "DocumentMarker change"
+        },
+        {
+          "object": "InlineTextBox 'findme'",
+          "rect": [51, 80, 44, 19],
+          "reason": "DocumentMarker change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/updating-scrolling-container-and-content-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/updating-scrolling-container-and-content-expected.txt
new file mode 100644
index 0000000..39c99a79
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/compositing/updating-scrolling-container-and-content-expected.txt
@@ -0,0 +1,74 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'CONTENT'",
+          "rect": [8, 258, 77, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'CONTENT'",
+          "rect": [8, 238, 77, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'CONTENT'",
+          "rect": [8, 218, 77, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'CONTENT'",
+          "rect": [8, 198, 77, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'CONTENT'",
+          "rect": [8, 178, 77, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'CONTENT'",
+          "rect": [8, 158, 77, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'CONTENT'",
+          "rect": [8, 138, 77, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'CONTENT'",
+          "rect": [8, 118, 77, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'CONTENT'",
+          "rect": [8, 278, 77, 15],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'CONTENT'",
+          "rect": [8, 108, 77, 9],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/crbug-371640-4-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/crbug-371640-4-expected.txt
new file mode 100644
index 0000000..084dd6b2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/crbug-371640-4-expected.txt
@@ -0,0 +1,54 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='keep' class='item'",
+          "rect": [408, 88, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='to_remove' class='item'",
+          "rect": [408, 88, 100, 100],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='keep' class='item'",
+          "rect": [208, 88, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [408, 88, 4, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [408, 88, 4, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [208, 88, 4, 19],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/crbug-371640-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/crbug-371640-expected.txt
new file mode 100644
index 0000000..68e2fac
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/crbug-371640-expected.txt
@@ -0,0 +1,54 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='keep' class='item'",
+          "rect": [348, 88, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='to_remove' class='item'",
+          "rect": [348, 88, 100, 100],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='keep' class='item'",
+          "rect": [88, 88, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [348, 88, 4, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [348, 88, 4, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [88, 88, 4, 19],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/flexbox/remove-inline-block-descendant-of-flex-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/flexbox/remove-inline-block-descendant-of-flex-expected.txt
new file mode 100644
index 0000000..7a69cfd
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/flexbox/remove-inline-block-descendant-of-flex-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='inline-block-2' class='item'",
+          "rect": [0, 200, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='inline-block-1' class='item'",
+          "rect": [0, 100, 100, 100],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='inline-block-2' class='item'",
+          "rect": [0, 100, 100, 100],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/flexbox/repaint-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/flexbox/repaint-expected.txt
new file mode 100644
index 0000000..fff7961
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/flexbox/repaint-expected.txt
@@ -0,0 +1,174 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='content'",
+          "rect": [138, 128, 654, 100],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='content'",
+          "rect": [148, 128, 644, 100],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean laoreet dolor id urna eleifend aliquet.'",
+          "rect": [138, 128, 636, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Nulla vel dolor ipsum. Aliquam ut turpis nisl, in vulputate sapien. Cum sociis natoque penatibus et'",
+          "rect": [138, 128, 636, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Sed volutpat, tellus vel varius vestibulum, purus quam mollis sapien, in condimentum leo neque sed'",
+          "rect": [138, 128, 636, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'magnis dis parturient montes, nascetur ridiculus mus. Sed congue magna vitae dolor feugiat vehicula.'",
+          "rect": [138, 128, 636, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'nulla. Nunc quis porta elit. Pellentesque erat lectus, ultricies a lobortis id, faucibus id quam.'",
+          "rect": [138, 128, 636, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean laoreet dolor id urna eleifend aliquet.'",
+          "rect": [148, 128, 635, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean laoreet dolor id urna eleifend aliquet.'",
+          "rect": [148, 128, 635, 99],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Nulla vel dolor ipsum. Aliquam ut turpis nisl, in vulputate sapien. Cum sociis natoque penatibus et'",
+          "rect": [148, 128, 635, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Nulla vel dolor ipsum. Aliquam ut turpis nisl, in vulputate sapien. Cum sociis natoque penatibus et'",
+          "rect": [148, 128, 635, 99],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Sed volutpat, tellus vel varius vestibulum, purus quam mollis sapien, in condimentum leo neque sed'",
+          "rect": [148, 128, 635, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Sed volutpat, tellus vel varius vestibulum, purus quam mollis sapien, in condimentum leo neque sed'",
+          "rect": [148, 128, 635, 99],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'magnis dis parturient montes, nascetur ridiculus mus. Sed congue magna vitae dolor feugiat vehicula.'",
+          "rect": [148, 128, 635, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'magnis dis parturient montes, nascetur ridiculus mus. Sed congue magna vitae dolor feugiat vehicula.'",
+          "rect": [148, 128, 635, 99],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'nulla. Nunc quis porta elit. Pellentesque erat lectus, ultricies a lobortis id, faucibus id quam.'",
+          "rect": [148, 128, 635, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'nulla. Nunc quis porta elit. Pellentesque erat lectus, ultricies a lobortis id, faucibus id quam.'",
+          "rect": [148, 128, 635, 99],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='content'",
+          "rect": [400, 128, 392, 180],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='left'",
+          "rect": [8, 228, 392, 80],
+          "reason": "incremental"
+        },
+        {
+          "object": "InlineTextBox 'Aenean laoreet dolor id urna eleifend aliquet. Nulla vel dolor'",
+          "rect": [400, 128, 391, 179],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'",
+          "rect": [400, 128, 391, 179],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Sed volutpat, tellus vel varius vestibulum, purus quam mollis'",
+          "rect": [400, 128, 391, 179],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'elit. Pellentesque erat lectus, ultricies a lobortis id, faucibus id'",
+          "rect": [400, 128, 391, 179],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'ipsum. Aliquam ut turpis nisl, in vulputate sapien. Cum sociis'",
+          "rect": [400, 128, 391, 179],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'natoque penatibus et magnis dis parturient montes, nascetur'",
+          "rect": [400, 128, 391, 179],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'quam.'",
+          "rect": [400, 128, 391, 179],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'ridiculus mus. Sed congue magna vitae dolor feugiat vehicula.'",
+          "rect": [400, 128, 391, 179],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'sapien, in condimentum leo neque sed nulla. Nunc quis porta'",
+          "rect": [400, 128, 391, 179],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='left'",
+          "rect": [148, 128, 252, 180],
+          "reason": "incremental"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='left'",
+          "rect": [8, 128, 140, 100],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/float-new-in-block-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/float-new-in-block-expected.txt
new file mode 100644
index 0000000..3e68d9d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/float-new-in-block-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (floating) DIV id='target'",
+          "rect": [8, 8, 100, 100],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/forms/details-marker-color-change-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/forms/details-marker-color-change-expected.txt
new file mode 100644
index 0000000..ddc62053
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/forms/details-marker-color-change-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Details'",
+          "rect": [24, 8, 45, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutDetailsMarker DIV id='details-marker'",
+          "rect": [8, 12, 11, 11],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/gradients-em-stops-repaint-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/gradients-em-stops-repaint-expected.txt
new file mode 100644
index 0000000..f107eda
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/gradients-em-stops-repaint-expected.txt
@@ -0,0 +1,49 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='box4' class='box'",
+          "rect": [344, 18, 302, 122],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='box3' class='box'",
+          "rect": [18, 18, 302, 122],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='indicator'",
+          "rect": [345, 19, 240, 20],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [330, 135, 4, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [330, 135, 4, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/inline-color-change-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/inline-color-change-expected.txt
new file mode 100644
index 0000000..709b4aa
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/inline-color-change-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineFlowBox",
+          "rect": [8, 72, 38, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'PASS'",
+          "rect": [8, 72, 38, 19],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/inline-reflow-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/inline-reflow-expected.txt
new file mode 100644
index 0000000..59e553a6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/inline-reflow-expected.txt
@@ -0,0 +1,159 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'A A A A A AA AA'",
+          "rect": [0, 0, 300, 200],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'A A'",
+          "rect": [0, 0, 300, 200],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'AA AA AA A A A'",
+          "rect": [0, 0, 300, 200],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'AA AA AAA AAA'",
+          "rect": [0, 0, 300, 200],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'AAA AAA AAA AA'",
+          "rect": [0, 0, 300, 200],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'AAA AAAA AAAA'",
+          "rect": [0, 0, 300, 200],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAAA AAAA AAAA'",
+          "rect": [0, 0, 300, 200],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAAA AAAAA'",
+          "rect": [0, 0, 300, 200],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAAAA AAAAA'",
+          "rect": [0, 0, 300, 200],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAAAA AAAAAAA'",
+          "rect": [0, 0, 300, 200],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'A A A A A'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'A A A A'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AA AA AA A'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AA AA AA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AA AAA AAA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AAA AAA AA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AAA AAAA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAA AAA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAA AAAAA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAAA AAAA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAAA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAAA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAAAA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAAAA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAAAAA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'A A A A A'",
+          "rect": [0, 300, 180, 20],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'A A A A A'",
+          "rect": [0, 300, 180, 20],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-1-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-1-expected.png
new file mode 100644
index 0000000..bf130ce5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-1-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-1-expected.txt
new file mode 100644
index 0000000..40df7926
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-1-expected.txt
@@ -0,0 +1,109 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'The chief difficulty Alice found at first was in managing'",
+          "rect": [14, 80, 406, 119],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'away,\n'",
+          "rect": [14, 80, 406, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'but generally, just as she had got its'",
+          "rect": [14, 80, 406, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'comfortably enough, under her arm, with its legs'",
+          "rect": [14, 80, 406, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'flamingo: she succeeded in getting its body tucked'",
+          "rect": [14, 80, 406, 119],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'hanging down,\n'",
+          "rect": [14, 80, 406, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog a blow with its head, it\n'",
+          "rect": [14, 80, 406, 119],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'her\n'",
+          "rect": [14, 80, 406, 119],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'neck nicely straightened\n'",
+          "rect": [14, 80, 406, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'out, and was going to give the'",
+          "rect": [14, 80, 406, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'away,\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'but generally, just as she had got its'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'comfortably enough, under her arm, with its legs'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'hanging down,\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'neck nicely straightened\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'out, and was going to give the'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV id='pinkFloat'",
+          "rect": [378, 138, 70, 30],
+          "reason": "incremental"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-10-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-10-expected.png
new file mode 100644
index 0000000..be38c00
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-10-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-10-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-10-expected.txt
new file mode 100644
index 0000000..afeedc0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-10-expected.txt
@@ -0,0 +1,309 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'a ridge or furrow in the way wherever\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'begin again, it was very'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'in the act of crawling away: besides all\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'provoking to find that the hedgehog had\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'she wanted to send the'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'this, there was generally'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'unrolled itself, and was'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Queen'",
+          "rect": [14, 440, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the'",
+          "rect": [14, 440, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox ' was in a furious passion, and went\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'about once in a minute.\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'about, and shouting \u2018Off with his head!\u2019 or \u2018Off with'",
+          "rect": [14, 460, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019 about once in a minute.\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'shouting \u2018Off with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping'",
+          "rect": [14, 460, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'was in a furious passion, and went\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [65, 420, 304, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [65, 420, 304, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [65, 420, 304, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [65, 420, 304, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [302, 440, 66, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 363, 48, 65],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 374, 48, 64],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-2-expected.png
new file mode 100644
index 0000000..e0cbb015
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-2-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-2-expected.txt
new file mode 100644
index 0000000..e833aa7f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-2-expected.txt
@@ -0,0 +1,499 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow P",
+          "rect": [8, 74, 418, 526],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 520, 407, 80],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 520, 407, 80],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 520, 407, 80],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 520, 407, 80],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 521, 407, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 521, 407, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 521, 407, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 521, 407, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 521, 407, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 521, 407, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'a ridge or furrow in the way wherever\n'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'begin again, it was very'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'in the act of crawling away: besides all\n'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'provoking to find that the hedgehog had\n'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'she wanted to send the'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'this, there was generally'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'unrolled itself, and was'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'a ridge or furrow in the way wherever\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'begin again, it was very'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'in the act of crawling away: besides all\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'provoking to find that the hedgehog had\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'she wanted to send the'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'this, there was generally'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'unrolled itself, and was'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox ' twist itself round and'",
+          "rect": [14, 181, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'could not help bursting out\n'",
+          "rect": [14, 181, 406, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'head down, and was going to\n'",
+          "rect": [14, 181, 406, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'laughing: and when she had got its'",
+          "rect": [14, 181, 406, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'look up in her face, with\n'",
+          "rect": [14, 181, 406, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'such a puzzled expression that she'",
+          "rect": [14, 181, 406, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox ' twist itself round and'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'could not help bursting out\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'head down, and was going to\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'laughing: and when she had got its'",
+          "rect": [14, 180, 406, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'look up in her face, with\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'such a puzzled expression that she'",
+          "rect": [14, 180, 406, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 361, 356, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 361, 356, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 421, 355, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [14, 421, 355, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [14, 421, 355, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [14, 421, 355, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 420, 355, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [14, 420, 355, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'The chief difficulty Alice found at first was in managing'",
+          "rect": [14, 80, 354, 120],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'away,\n'",
+          "rect": [14, 80, 354, 120],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'but generally, just as she had got its'",
+          "rect": [14, 80, 354, 120],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'comfortably enough, under her arm, with its legs'",
+          "rect": [14, 80, 354, 120],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'flamingo: she succeeded in getting its body tucked'",
+          "rect": [14, 80, 354, 120],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'hanging down,\n'",
+          "rect": [14, 80, 354, 120],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog a blow with its head, it\n'",
+          "rect": [14, 80, 354, 120],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'her\n'",
+          "rect": [14, 80, 354, 120],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'neck nicely straightened\n'",
+          "rect": [14, 80, 354, 120],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'out, and was going to give the'",
+          "rect": [14, 80, 354, 120],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog a blow with its head, it\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'neck nicely straightened\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'out, and was going to give the'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'about once in a minute.\n'",
+          "rect": [14, 461, 354, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019'",
+          "rect": [14, 461, 354, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'shouting \u2018Off with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 461, 354, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and'",
+          "rect": [14, 461, 354, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'was in a furious passion, and went\n'",
+          "rect": [14, 461, 354, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'about once in a minute.\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019'",
+          "rect": [14, 460, 354, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'shouting \u2018Off with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and'",
+          "rect": [14, 460, 354, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'was in a furious passion, and went\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 401, 304, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [302, 441, 66, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [302, 440, 66, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='greenFloat'",
+          "rect": [372, 404, 48, 81],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='greenFloat'",
+          "rect": [372, 403, 48, 81],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 364, 48, 65],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 363, 48, 65],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'would'",
+          "rect": [235, 180, 45, 20],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'would'",
+          "rect": [238, 180, 40, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "VerticalScrollbar",
+          "rect": [485, 0, 15, 600],
+          "reason": "scroll control"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-3-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-3-expected.png
new file mode 100644
index 0000000..778197d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-3-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-3-expected.txt
new file mode 100644
index 0000000..92c4af04
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-3-expected.txt
@@ -0,0 +1,294 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'a ridge or furrow in the way wherever\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'begin again, it was very'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'in the act of crawling away: besides all\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'provoking to find that the hedgehog had\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'she wanted to send the'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'this, there was generally'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'unrolled itself, and was'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 400, 406, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,'",
+          "rect": [14, 400, 406, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehogs; and in\n'",
+          "rect": [14, 400, 406, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting for the'",
+          "rect": [14, 400, 406, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'about once in a minute.\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'shouting \u2018Off with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'was in a furious passion, and went\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox ' was in'",
+          "rect": [14, 440, 338, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'a furious passion, and went\n'",
+          "rect": [14, 440, 338, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'about once in a minute.\n'",
+          "rect": [14, 440, 338, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019'",
+          "rect": [14, 440, 338, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'shouting \u2018Off with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 440, 338, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and'",
+          "rect": [14, 440, 338, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting\n'",
+          "rect": [65, 400, 298, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [302, 440, 66, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [242, 440, 65, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='greenFloat'",
+          "rect": [356, 423, 64, 81],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='greenFloat'",
+          "rect": [372, 403, 48, 81],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-4-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-4-expected.png
new file mode 100644
index 0000000..27847b3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-4-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-4-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-4-expected.txt
new file mode 100644
index 0000000..8fdb2a6b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-4-expected.txt
@@ -0,0 +1,284 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'a ridge or furrow in the way wherever\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'begin again, it was very'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'in the act of crawling away: besides all\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'provoking to find that the hedgehog had\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'she wanted to send the'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'this, there was generally'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'unrolled itself, and was'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019 about once'",
+          "rect": [14, 460, 406, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'in a minute.\n'",
+          "rect": [14, 460, 406, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'shouting \u2018Off with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 460, 406, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and'",
+          "rect": [14, 460, 406, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'was in a furious passion, and went\n'",
+          "rect": [14, 460, 406, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 420, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [14, 420, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'about once in a minute.\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'shouting \u2018Off with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'was in a furious passion, and went\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [302, 440, 66, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [302, 440, 66, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='greenFloat'",
+          "rect": [372, 403, 48, 81],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-5-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-5-expected.png
new file mode 100644
index 0000000..be9b1bf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-5-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-5-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-5-expected.txt
new file mode 100644
index 0000000..c92f3d52
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-5-expected.txt
@@ -0,0 +1,314 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'a ridge or furrow in the way wherever\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'begin again, it was very'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'in the act of crawling away: besides all\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'provoking to find that the hedgehog had\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'she wanted to send the'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'this, there was generally'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'unrolled itself, and was'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [49, 360, 372, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [49, 360, 372, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 400, 356, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'for'",
+          "rect": [14, 400, 356, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehogs; and in\n'",
+          "rect": [14, 400, 356, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting for the'",
+          "rect": [14, 400, 356, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'turns,\n'",
+          "rect": [14, 400, 356, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox ' was in a'",
+          "rect": [14, 440, 354, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'furious passion, and went\n'",
+          "rect": [14, 440, 354, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019 about once'",
+          "rect": [14, 440, 354, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'in a minute.\n'",
+          "rect": [14, 440, 354, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and shouting'",
+          "rect": [14, 440, 354, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\u2018Off with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 440, 354, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'about once in a minute.\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'shouting \u2018Off with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'was in a furious passion, and went\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting\n'",
+          "rect": [49, 400, 302, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [302, 440, 66, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [245, 440, 65, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 363, 48, 65],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-6-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-6-expected.png
new file mode 100644
index 0000000..625de9b2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-6-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-6-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-6-expected.txt
new file mode 100644
index 0000000..6f72682
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-6-expected.txt
@@ -0,0 +1,149 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'a ridge or furrow in the way wherever\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'begin again, it was very'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'in the act of crawling away: besides all\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'provoking to find that the hedgehog had\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'she wanted to send the'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'this, there was generally'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'unrolled itself, and was'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 363, 48, 65],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'foo'",
+          "rect": [27, 363, 22, 20],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-7-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-7-expected.png
new file mode 100644
index 0000000..a111f37
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-7-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-7-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-7-expected.txt
new file mode 100644
index 0000000..95267ae
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-7-expected.txt
@@ -0,0 +1,74 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 420, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [14, 420, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [298, 440, 70, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [302, 440, 66, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-8-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-8-expected.png
new file mode 100644
index 0000000..58addaa
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-8-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-8-expected.txt
new file mode 100644
index 0000000..cf0c137
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-8-expected.txt
@@ -0,0 +1,459 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow P",
+          "rect": [8, 74, 418, 526],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'a ridge or furrow in the way wherever\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'a ridge or furrow in the way wherever\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'begin again, it was very'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'begin again, it was very'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'in the act of crawling away: besides all\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'in the act of crawling away: besides all\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'provoking to find that the hedgehog had\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'provoking to find that the hedgehog had\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'she wanted to send the'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'she wanted to send the'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'this, there was generally'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'this, there was generally'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'unrolled itself, and was'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'unrolled itself, and was'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox ' twist itself round and'",
+          "rect": [14, 180, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox ' twist itself round and'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'could not help bursting out\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'could not help bursting out\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'head down, and was going to\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'head down, and was going to\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'laughing: and when she had got its'",
+          "rect": [14, 180, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'laughing: and when she had got its'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'look up in her face, with\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'look up in her face, with\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'such a puzzled expression that she'",
+          "rect": [14, 180, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'such a puzzled expression that she'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'difficult game'",
+          "rect": [14, 360, 406, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'indeed.\n'",
+          "rect": [14, 360, 406, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox ' was in a furious'",
+          "rect": [14, 440, 355, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019 about once in a'",
+          "rect": [14, 440, 355, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'minute.\n'",
+          "rect": [14, 440, 355, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'passion, and went\n'",
+          "rect": [14, 440, 355, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and shouting \u2018Off'",
+          "rect": [14, 440, 355, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 440, 355, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'The chief difficulty Alice found at first was in managing'",
+          "rect": [14, 80, 354, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'The chief difficulty Alice found at first was in managing'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'away,\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'away,\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'but generally, just as she had got its'",
+          "rect": [14, 80, 354, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'but generally, just as she had got its'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'comfortably enough, under her arm, with its legs'",
+          "rect": [14, 80, 354, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'comfortably enough, under her arm, with its legs'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'flamingo: she succeeded in getting its body tucked'",
+          "rect": [14, 80, 354, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'flamingo: she succeeded in getting its body tucked'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'hanging down,\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'hanging down,\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog a blow with its head, it\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog a blow with its head, it\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'her\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'her\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'neck nicely straightened\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'neck nicely straightened\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'out, and was going to give the'",
+          "rect": [14, 80, 354, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'out, and was going to give the'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'about once in a minute.\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'shouting \u2018Off with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'was in a furious passion, and went\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 400, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'and in\n'",
+          "rect": [14, 400, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,'",
+          "rect": [14, 400, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting for the hedgehogs;'",
+          "rect": [14, 400, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting\n'",
+          "rect": [14, 400, 297, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [184, 440, 68, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [302, 440, 66, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 363, 48, 65],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'would'",
+          "rect": [238, 180, 40, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'would'",
+          "rect": [238, 180, 40, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-9-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-9-expected.png
new file mode 100644
index 0000000..2b4f4b0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-9-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-9-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-9-expected.txt
new file mode 100644
index 0000000..e15507f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/line-flow-with-floats-9-expected.txt
@@ -0,0 +1,399 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'a ridge or furrow in the way wherever\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'and was in the act of crawling away: besides all\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'begin again, it was very'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'begin again, it was very'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'ground, Alice soon came to the conclusion that it was a very'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'in the act of crawling away: besides all\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'provoking to find that the hedgehog had\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'provoking to find that the hedgehog had\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'she wanted to send the'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'she'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'soldiers'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'there was generally a ridge or furrow in the way wherever\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'this, there was generally'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'this,'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'unrolled itself, and was'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'unrolled itself,'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'wanted to send the hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'were always getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox ' twist itself round and'",
+          "rect": [14, 180, 406, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'could not help bursting out\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'could not help bursting out\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'head down, and was going to\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'head down, and was going to\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'laughing: and when she had got its'",
+          "rect": [14, 180, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'laughing: and when she had got its'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'look up in her face, with\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'look up in her face, with\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'such a puzzled expression that she'",
+          "rect": [14, 180, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'such a puzzled expression that she'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Queen'",
+          "rect": [14, 440, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the'",
+          "rect": [14, 440, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox ' was in a furious passion, and went\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'about once in a minute.\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'about, and shouting \u2018Off with his head!\u2019 or \u2018Off with'",
+          "rect": [14, 460, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019 about once in a minute.\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'shouting \u2018Off with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping'",
+          "rect": [14, 460, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'was in a furious passion, and went\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [65, 420, 304, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [65, 420, 304, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [65, 420, 304, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [65, 420, 304, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'difficult game indeed.\n'",
+          "rect": [65, 380, 142, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [302, 440, 66, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 383, 48, 65],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 363, 48, 65],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='yellowFloat'",
+          "rect": [372, 243, 48, 49],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/lines-with-layout-delta-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/lines-with-layout-delta-expected.txt
new file mode 100644
index 0000000..40e2f8c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/lines-with-layout-delta-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'PASS'",
+          "rect": [8, 58, 38, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'FAIL'",
+          "rect": [8, 58, 35, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/list-marker-2-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/list-marker-2-expected.txt
new file mode 100644
index 0000000..2f63d9c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/list-marker-2-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutImage IMG id='target'",
+          "rect": [48, 100, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutListMarker (anonymous)",
+          "rect": [30, 185, 7, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutListMarker (anonymous)",
+          "rect": [30, 135, 7, 19],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/make-children-non-inline-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/make-children-non-inline-expected.txt
new file mode 100644
index 0000000..b56469a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/make-children-non-inline-expected.txt
@@ -0,0 +1,119 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'about all the stuff'",
+          "rect": [8, 264, 110, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'about all the stuff'",
+          "rect": [8, 164, 110, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'write a book'",
+          "rect": [8, 144, 79, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'write a book'",
+          "rect": [8, 144, 79, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'more words.'",
+          "rect": [8, 104, 79, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'more words.'",
+          "rect": [8, 104, 79, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'that comes'",
+          "rect": [8, 284, 67, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'that comes'",
+          "rect": [8, 184, 67, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the break.'",
+          "rect": [8, 324, 62, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the break.'",
+          "rect": [8, 224, 62, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'I could'",
+          "rect": [8, 124, 44, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'I could'",
+          "rect": [8, 124, 44, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'words,'",
+          "rect": [8, 84, 43, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'words,'",
+          "rect": [8, 84, 43, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Word,'",
+          "rect": [8, 64, 39, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Word,'",
+          "rect": [8, 64, 39, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'after'",
+          "rect": [8, 304, 29, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'after'",
+          "rect": [8, 204, 29, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [8, 164, 10, 100],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/non-text-link-invalidation-optimization-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/non-text-link-invalidation-optimization-expected.txt
new file mode 100644
index 0000000..bdea3add
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/non-text-link-invalidation-optimization-expected.txt
@@ -0,0 +1,54 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox ' text is invalidated and '",
+          "rect": [164, 8, 145, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox ' passes if '",
+          "rect": [75, 8, 61, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'This test '",
+          "rect": [8, 8, 57, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox ' images.'",
+          "rect": [353, 8, 52, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'only'",
+          "rect": [136, 8, 28, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox ' no '",
+          "rect": [319, 8, 24, 19],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/offset-change-wrong-invalidation-with-float-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/offset-change-wrong-invalidation-with-float-expected.txt
new file mode 100644
index 0000000..b013a4b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/offset-change-wrong-invalidation-with-float-expected.txt
@@ -0,0 +1,52 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) UL id='submenu'",
+          "rect": [48, 94, 40, 20],
+          "reason": "chunk disappeared"
+        }
+      ]
+    },
+    {
+      "name": "LayoutListItem (floating) LI id='watches'",
+      "position": [30, 44],
+      "bounds": [7, 19]
+    },
+    {
+      "name": "LayoutInline (relative positioned) SPAN id='placeholder'",
+      "position": [48, 44],
+      "drawsContent": false,
+      "backfaceVisibility": "hidden"
+    },
+    {
+      "name": "LayoutListItem (relative positioned) (floating) LI id='menu'",
+      "position": [30, 44],
+      "bounds": [7, 19],
+      "paintInvalidations": [
+        {
+          "object": "LayoutListMarker (anonymous)",
+          "rect": [0, 0, 7, 19],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/focus-continuations-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/focus-continuations-expected.txt
new file mode 100644
index 0000000..1faf896
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/focus-continuations-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutInline SPAN id='outer'",
+          "rect": [7, 87, 88, 22],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/focus-enable-continuations-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/focus-enable-continuations-expected.txt
new file mode 100644
index 0000000..5fc57cc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/focus-enable-continuations-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutInline SPAN id='outer'",
+          "rect": [7, 87, 88, 22],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/focus-ring-on-child-move-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/focus-ring-on-child-move-expected.txt
new file mode 100644
index 0000000..88b172f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/focus-ring-on-child-move-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV",
+          "rect": [99, 49, 302, 302],
+          "reason": "outline"
+        },
+        {
+          "object": "LayoutBlockFlow (positioned) DIV id='child'",
+          "rect": [300, 50, 20, 300],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (positioned) DIV id='child'",
+          "rect": [150, 50, 20, 300],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/focus-ring-on-continuation-move-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/focus-ring-on-continuation-move-expected.txt
new file mode 100644
index 0000000..24c2846c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/focus-ring-on-continuation-move-expected.txt
@@ -0,0 +1,44 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutInline SPAN",
+          "rect": [207, 231, 102, 102],
+          "reason": "outline"
+        },
+        {
+          "object": "LayoutInline SPAN",
+          "rect": [7, 231, 102, 102],
+          "reason": "outline"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV id='block'",
+          "rect": [208, 232, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV id='block'",
+          "rect": [8, 232, 100, 100],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/focus-ring-on-inline-continuation-move-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/focus-ring-on-inline-continuation-move-expected.txt
new file mode 100644
index 0000000..219a51f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/focus-ring-on-inline-continuation-move-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutInline SPAN",
+          "rect": [7, 7, 102, 182],
+          "reason": "outline"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV id='block'",
+          "rect": [8, 88, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV id='block'",
+          "rect": [8, 8, 100, 100],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/inline-outline-repaint-2-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/inline-outline-repaint-2-expected.txt
new file mode 100644
index 0000000..350810f8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/inline-outline-repaint-2-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutInline SPAN",
+          "rect": [210, 0, 50, 15],
+          "reason": "outline"
+        },
+        {
+          "object": "InlineTextBox 'Test'",
+          "rect": [215, 0, 40, 10],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/outline-change-invalidation-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/outline-change-invalidation-expected.txt
new file mode 100644
index 0000000..a87c2c4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/outline-change-invalidation-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow A id='link'",
+          "rect": [43, 83, 754, 30],
+          "reason": "appeared"
+        },
+        {
+          "object": "LayoutListMarker (anonymous)",
+          "rect": [30, 88, 7, 19],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/outline-containing-image-in-non-standard-mode-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/outline-containing-image-in-non-standard-mode-expected.txt
new file mode 100644
index 0000000..74a8f125
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/outline-containing-image-in-non-standard-mode-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutInline SPAN id='target'",
+          "rect": [6, 6, 204, 58],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutImage IMG",
+          "rect": [8, 8, 200, 50],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/outline-continuations-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/outline-continuations-expected.txt
new file mode 100644
index 0000000..655ab04
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/outline/outline-continuations-expected.txt
@@ -0,0 +1,49 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutInline SPAN id='outer'",
+          "rect": [16, 108, 90, 63],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'CONTENTS'",
+          "rect": [18, 150, 86, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'CONTENTS'",
+          "rect": [18, 150, 86, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'CONTENTS'",
+          "rect": [18, 110, 86, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'CONTENTS'",
+          "rect": [18, 110, 86, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/overflow/float-overflow-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/overflow/float-overflow-expected.txt
new file mode 100644
index 0000000..edc2ece
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/overflow/float-overflow-expected.txt
@@ -0,0 +1,574 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 537, 62, 37],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 531, 62, 37],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 498, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 492, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 459, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 453, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 420, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 414, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutDeprecatedFlexibleBox DIV class='outer box'",
+          "rect": [61, 249, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutDeprecatedFlexibleBox DIV class='outer box'",
+          "rect": [61, 243, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutDeprecatedFlexibleBox DIV class='outer box'",
+          "rect": [61, 210, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutDeprecatedFlexibleBox DIV class='outer box'",
+          "rect": [61, 204, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 171, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 165, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 132, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 126, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 93, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 87, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 54, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 48, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 15, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 9, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [61, 366, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [61, 360, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [61, 327, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [61, 321, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [61, 288, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [61, 282, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 504, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 498, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 465, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 459, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 426, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 420, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 216, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 210, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 177, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 171, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 138, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 132, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 99, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 93, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 60, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 54, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 21, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 15, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [69, 374, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [69, 368, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [69, 335, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [69, 329, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [69, 296, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [69, 290, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [70, 375, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [70, 369, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [70, 336, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [70, 330, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [70, 297, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [70, 291, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [67, 138, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [67, 132, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [65, 60, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [65, 54, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [65, 21, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [65, 15, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 543, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 537, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 504, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 498, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 465, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 459, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 426, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 420, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 255, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 249, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 216, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 210, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 177, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 171, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 99, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 93, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 543, 32, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 537, 32, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [66, 299, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [66, 293, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [63, 23, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [63, 17, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 545, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 539, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 506, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 500, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 467, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 461, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 428, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 422, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 257, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 251, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 218, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 212, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 179, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 173, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 140, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 134, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [58, 377, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [58, 371, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [58, 338, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [58, 332, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [57, 101, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [57, 95, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [57, 62, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [57, 56, 16, 17],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/overflow/float-overflow-right-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/overflow/float-overflow-right-expected.txt
new file mode 100644
index 0000000..63c1af7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/overflow/float-overflow-right-expected.txt
@@ -0,0 +1,574 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 537, 62, 37],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 531, 62, 37],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 498, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 492, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 459, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 453, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 420, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 414, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutDeprecatedFlexibleBox DIV class='outer box'",
+          "rect": [677, 249, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutDeprecatedFlexibleBox DIV class='outer box'",
+          "rect": [677, 243, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutDeprecatedFlexibleBox DIV class='outer box'",
+          "rect": [677, 210, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutDeprecatedFlexibleBox DIV class='outer box'",
+          "rect": [677, 204, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 171, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 165, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 132, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 126, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 93, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 87, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 54, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 48, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 15, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 9, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [681, 366, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [681, 360, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [681, 327, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [681, 321, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [681, 288, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [681, 282, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 504, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 498, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 465, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 459, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 426, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 420, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 216, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 210, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 177, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 171, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 138, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 132, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 99, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 93, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 60, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 54, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 21, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 15, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [689, 374, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [689, 368, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [689, 335, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [689, 329, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [689, 296, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [689, 290, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 543, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 537, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 504, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 498, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 465, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 459, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 426, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 420, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 255, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 249, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 216, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 210, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 177, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 171, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 99, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 93, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [695, 60, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [695, 54, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [695, 21, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [695, 15, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [693, 138, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [693, 132, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [690, 375, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [690, 369, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [690, 336, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [690, 330, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [690, 297, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [690, 291, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [701, 543, 32, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [701, 537, 32, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [727, 101, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [727, 95, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [727, 62, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [727, 56, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [726, 377, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [726, 371, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [726, 338, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [726, 332, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 545, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 539, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 506, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 500, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 467, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 461, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 428, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 422, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 257, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 251, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 218, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 212, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 179, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 173, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 140, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 134, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [721, 23, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [721, 17, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [718, 299, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [718, 293, 16, 17],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/overflow/inline-overflow-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/overflow/inline-overflow-expected.txt
new file mode 100644
index 0000000..cb8bea1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/overflow/inline-overflow-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'A\u00A0\u00A0B'",
+          "rect": [33, 33, 250, 100],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/overflow/inline-vertical-lr-overflow-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/overflow/inline-vertical-lr-overflow-expected.txt
new file mode 100644
index 0000000..0fd8254f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/overflow/inline-vertical-lr-overflow-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'A\u00A0\u00A0B'",
+          "rect": [33, 33, 100, 250],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/overflow/inline-vertical-rl-overflow-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/overflow/inline-vertical-rl-overflow-expected.txt
new file mode 100644
index 0000000..9a3e928
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/overflow/inline-vertical-rl-overflow-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'A\u00A0\u00A0B'",
+          "rect": [667, 33, 100, 250],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/overflow/line-overflow-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/overflow/line-overflow-expected.txt
new file mode 100644
index 0000000..64055976
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/overflow/line-overflow-expected.txt
@@ -0,0 +1,114 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox ' eleifend'",
+          "rect": [8, 122, 195, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'convallis.'",
+          "rect": [8, 122, 195, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'lacus, at sagittis eros leo'",
+          "rect": [8, 122, 195, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'pulvinar velit. Integer'",
+          "rect": [8, 122, 195, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'sollicitudin nisi ut urna blandit'",
+          "rect": [8, 122, 195, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox ' eleifend lacus,'",
+          "rect": [8, 142, 195, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'at sagittis eros leo pulvinar'",
+          "rect": [8, 142, 195, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'urna blandit convallis.'",
+          "rect": [8, 142, 195, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'velit. Integer sollicitudin nisi ut'",
+          "rect": [8, 142, 195, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Cras faucibus. Nunc'",
+          "rect": [8, 82, 192, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'adipiscing, enim in scelerisque'",
+          "rect": [8, 82, 192, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'augue '",
+          "rect": [8, 82, 192, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'augue'",
+          "rect": [8, 82, 192, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'convallis,\n'",
+          "rect": [8, 82, 192, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'convallis,\n'",
+          "rect": [8, 82, 192, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineFlowBox",
+          "rect": [114, 92, 35, 49],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'purus'",
+          "rect": [114, 122, 35, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'purus'",
+          "rect": [38, 142, 35, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/overflow/negative-text-indent-with-overflow-hidden-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/overflow/negative-text-indent-with-overflow-hidden-expected.txt
new file mode 100644
index 0000000..933e54c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/overflow/negative-text-indent-with-overflow-hidden-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='target' class='changed'",
+          "rect": [550, 8, 200, 50],
+          "reason": "background"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/paint-invalidation-with-reparent-across-frame-boundaries-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/paint-invalidation-with-reparent-across-frame-boundaries-expected.txt
new file mode 100644
index 0000000..876f614
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/paint-invalidation-with-reparent-across-frame-boundaries-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow HTML",
+          "rect": [18, 18, 22, 19],
+          "reason": "chunk disappeared"
+        },
+        {
+          "object": "InlineTextBox 'abc'",
+          "rect": [8, 187, 22, 19],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/position/abspos-shift-image-incorrect-repaint-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/position/abspos-shift-image-incorrect-repaint-expected.txt
new file mode 100644
index 0000000..94562dc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/position/abspos-shift-image-incorrect-repaint-expected.txt
@@ -0,0 +1,49 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 585],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [1250, 585],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutImage IMG",
+          "rect": [704, 0, 214, 232],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutImage IMG",
+          "rect": [454, 0, 214, 232],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutImage IMG",
+          "rect": [0, 0, 214, 232],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [700, 217, 4, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [450, 217, 4, 19],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/position/inline-relative-positioned-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/position/inline-relative-positioned-expected.txt
new file mode 100644
index 0000000..2a20486
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/position/inline-relative-positioned-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'a'",
+          "rect": [8, 88, 100, 100],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'p'",
+          "rect": [8, 88, 100, 100],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [8, 88, 100, 100],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/position/layout-state-relative-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/position/layout-state-relative-expected.txt
new file mode 100644
index 0000000..7eb3a55
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/position/layout-state-relative-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'PASS'",
+          "rect": [8, 152, 38, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'FAIL'",
+          "rect": [8, 152, 35, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/position/layoutstate-invalid-invalidation-inline-relative-positioned-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/position/layoutstate-invalid-invalidation-inline-relative-positioned-expected.txt
new file mode 100644
index 0000000..172fb0919
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/position/layoutstate-invalid-invalidation-inline-relative-positioned-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [8, 220, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [8, 200, 100, 100],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/position/positioned-document-element-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/position/positioned-document-element-expected.txt
new file mode 100644
index 0000000..1e5afc6a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/position/positioned-document-element-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#008000"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#008000",
+      "paintInvalidations": [
+        {
+          "object": "Scrolling background of LayoutView #document",
+          "rect": [0, 0, 800, 600],
+          "reason": "background"
+        },
+        {
+          "object": "InlineTextBox 'Tests that the entire viewport is painted with a floated html element.'",
+          "rect": [108, 116, 424, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Tests that the entire viewport is painted with a floated html element.'",
+          "rect": [8, 16, 424, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/position/positioned-great-grandparent-change-location-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/position/positioned-great-grandparent-change-location-expected.txt
new file mode 100644
index 0000000..8278548d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/position/positioned-great-grandparent-change-location-expected.txt
@@ -0,0 +1,44 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV",
+          "rect": [100, 200, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (positioned) DIV",
+          "rect": [100, 100, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'Target'",
+          "rect": [100, 200, 41, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'Target'",
+          "rect": [100, 100, 41, 19],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/push-block-with-first-line-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/push-block-with-first-line-expected.txt
new file mode 100644
index 0000000..0ab0888
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/push-block-with-first-line-expected.txt
@@ -0,0 +1,44 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "RootInlineBox",
+          "rect": [8, 68, 784, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "RootInlineBox",
+          "rect": [8, 8, 784, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'JOCULAR'",
+          "rect": [8, 68, 140, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'JOCULAR'",
+          "rect": [8, 8, 140, 20],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/quotes-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/quotes-expected.txt
new file mode 100644
index 0000000..b12dca4b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/quotes-expected.txt
@@ -0,0 +1,54 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'quote 2'",
+          "rect": [17, 28, 47, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'quote 2'",
+          "rect": [16, 28, 47, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\u003E'",
+          "rect": [64, 28, 9, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '\u003C'",
+          "rect": [8, 28, 9, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '}'",
+          "rect": [63, 28, 8, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '{'",
+          "rect": [8, 28, 8, 19],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/reflection/reflection-redraw-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/reflection/reflection-redraw-expected.txt
new file mode 100644
index 0000000..4d14ecc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/reflection/reflection-redraw-expected.txt
@@ -0,0 +1,84 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'The color of this'",
+          "rect": [380, 267, 286, 59],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'should be green'",
+          "rect": [380, 267, 286, 59],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'text in the reflection'",
+          "rect": [380, 267, 286, 59],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'The color of this'",
+          "rect": [70, 267, 286, 59],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'should be green'",
+          "rect": [70, 267, 286, 59],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'text in the reflection'",
+          "rect": [70, 267, 286, 59],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'The color of this'",
+          "rect": [305, 34, 126, 182],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'should be green'",
+          "rect": [305, 34, 126, 182],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'text in the reflection'",
+          "rect": [305, 34, 126, 182],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'The color of this'",
+          "rect": [305, 377, 126, 156],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'should be green'",
+          "rect": [305, 377, 126, 156],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'text in the reflection'",
+          "rect": [305, 377, 126, 156],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/reflection/reflection-with-rotation-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/reflection/reflection-with-rotation-expected.txt
new file mode 100644
index 0000000..09b3bab1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/reflection/reflection-with-rotation-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [22, 50, 226, 167],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'PASS'",
+          "rect": [23, 51, 72, 110],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'FAIL'",
+          "rect": [23, 51, 69, 109],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/remove-inline-after-layout-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/remove-inline-after-layout-expected.txt
new file mode 100644
index 0000000..7c85837b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/remove-inline-after-layout-expected.txt
@@ -0,0 +1,54 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'This span should disappear.\n'",
+          "rect": [112, 193, 178, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [290, 108, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [112, 108, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [8, 108, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [108, 193, 4, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [108, 193, 4, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/repaint-across-writing-mode-boundary-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/repaint-across-writing-mode-boundary-expected.png
new file mode 100644
index 0000000..b31eb3d8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/repaint-across-writing-mode-boundary-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/repaint-across-writing-mode-boundary-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/repaint-across-writing-mode-boundary-expected.txt
new file mode 100644
index 0000000..cca1667
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/repaint-across-writing-mode-boundary-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox '\u7B2C\u4E00\u6BB5\u843D paragraph 1'",
+          "rect": [548, 191, 23, 36],
+          "reason": "selection"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/repaint-descandant-on-ancestor-layer-move-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/repaint-descandant-on-ancestor-layer-move-expected.txt
new file mode 100644
index 0000000..a91047a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/repaint-descandant-on-ancestor-layer-move-expected.txt
@@ -0,0 +1,44 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV",
+          "rect": [428, 38, 300, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV",
+          "rect": [28, 38, 300, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'There should only be one copy of this text.'",
+          "rect": [428, 38, 270, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'There should only be one copy of this text.'",
+          "rect": [28, 38, 270, 19],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/inline-style-change-in-scrolled-view-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/inline-style-change-in-scrolled-view-expected.txt
new file mode 100644
index 0000000..a39f2251
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/inline-style-change-in-scrolled-view-expected.txt
@@ -0,0 +1,42 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [785, 585],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [2000, 2000],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Text Text Text Text Text Text Text Text Text Text Text Text Text'",
+          "rect": [0, 320, 413, 19],
+          "reason": "style change"
+        }
+      ],
+      "transform": 1
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [-200, -200, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/invalidate-after-composited-scroll-of-window-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/invalidate-after-composited-scroll-of-window-expected.txt
new file mode 100644
index 0000000..35cb461
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/invalidate-after-composited-scroll-of-window-expected.txt
@@ -0,0 +1,47 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [785, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [785, 4936],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Tests that invalidation of a div after scrolling invalidates just the div and no other area.'",
+          "rect": [8, 4908, 540, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [8, 2408, 100, 100],
+          "reason": "background"
+        }
+      ],
+      "transform": 1
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [0, -2350, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/layout-state-scrolloffset-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/layout-state-scrolloffset-expected.txt
new file mode 100644
index 0000000..1c0c148c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/layout-state-scrolloffset-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'before'",
+          "rect": [100, 120, 40, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'after'",
+          "rect": [100, 120, 29, 19],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/layout-state-scrolloffset2-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/layout-state-scrolloffset2-expected.txt
new file mode 100644
index 0000000..369cb30
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/layout-state-scrolloffset2-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'before'",
+          "rect": [102, 122, 40, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'after'",
+          "rect": [102, 122, 29, 19],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/layout-state-scrolloffset3-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/layout-state-scrolloffset3-expected.txt
new file mode 100644
index 0000000..71db693
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/layout-state-scrolloffset3-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'before'",
+          "rect": [100, 120, 34, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'after'",
+          "rect": [100, 120, 29, 19],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/line-in-scrolled-clipped-block-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/line-in-scrolled-clipped-block-expected.png
new file mode 100644
index 0000000..28a2876d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/line-in-scrolled-clipped-block-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/line-in-scrolled-clipped-block-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/line-in-scrolled-clipped-block-expected.txt
new file mode 100644
index 0000000..de2e3d0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/line-in-scrolled-clipped-block-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox '                         FAIL     .'",
+          "rect": [8, 8, 100, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '                         PASS     .'",
+          "rect": [8, 8, 100, 19],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/overflow-scroll-body-appear-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/overflow-scroll-body-appear-expected.txt
new file mode 100644
index 0000000..00843996
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/overflow-scroll-body-appear-expected.txt
@@ -0,0 +1,64 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [785, 585],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [2008, 2096],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Bug 36461 - No vertical scrollbar after the CSS class change'",
+          "rect": [124, 52, 383, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Bug 36461 - No vertical scrollbar after the CSS class change'",
+          "rect": [124, 52, 383, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'You should see both vertical and horizontal scrollbars.'",
+          "rect": [8, 16, 340, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'You should see both vertical and horizontal scrollbars.'",
+          "rect": [8, 16, 340, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'This is the test for '",
+          "rect": [8, 52, 116, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'This is the test for '",
+          "rect": [8, 52, 116, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '.'",
+          "rect": [507, 52, 4, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '.'",
+          "rect": [507, 52, 4, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/overflow-scroll-delete-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/overflow-scroll-delete-expected.png
new file mode 100644
index 0000000..c4905494
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/overflow-scroll-delete-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/overflow-scroll-delete-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/overflow-scroll-delete-expected.txt
new file mode 100644
index 0000000..908f08e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/scroll/overflow-scroll-delete-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Passed'",
+          "rect": [8, 136, 43, 17],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Failed'",
+          "rect": [8, 136, 39, 17],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-expected.png
new file mode 100644
index 0000000..ddf9523
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-expected.txt
new file mode 100644
index 0000000..57e82bed
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'xx'",
+          "rect": [8, 8, 48, 33],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'y'",
+          "rect": [8, 8, 48, 33],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.png
new file mode 100644
index 0000000..966209a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.txt
new file mode 100644
index 0000000..850b0d9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'xx'",
+          "rect": [0, 8, 40, 33],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'y'",
+          "rect": [0, 8, 40, 33],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.png
new file mode 100644
index 0000000..ab06e15
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.txt
new file mode 100644
index 0000000..2d8f395
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'xx'",
+          "rect": [8, 8, 33, 48],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'y'",
+          "rect": [8, 8, 33, 48],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.png
new file mode 100644
index 0000000..e9463718
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.txt
new file mode 100644
index 0000000..b47e41da
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'xx'",
+          "rect": [7, 8, 33, 48],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'y'",
+          "rect": [7, 8, 33, 48],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.png
new file mode 100644
index 0000000..5e142e1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.txt
new file mode 100644
index 0000000..b98e7f3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'b'",
+          "rect": [8, 24, 32, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [24, 8, 16, 16],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'a'",
+          "rect": [8, 8, 16, 16],
+          "reason": "selection"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/japanese-rl-selection-clear-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/japanese-rl-selection-clear-expected.txt
new file mode 100644
index 0000000..2cee848
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/japanese-rl-selection-clear-expected.txt
@@ -0,0 +1,94 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox '\u3042\u3063\u305F\u304B\u5FD8\u308C\u3066\u3057\u307E\u3063\u305F\u7D4C\u9A13\u306F\u3042\u308A\u307E\u3059\u304B'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u3057\u305F\u30A6\u30A7\u30D6\u30DA\u30FC\u30B8\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u304B\u3089\u3082\u691C\u7D22'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u3059\u3002\u8A2A\u554F\u3057\u305F\u30A6\u30A7\u30D6\u30DA\u30FC\u30B8\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u304B'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\u305B\u3063\u304B\u304F\u898B\u3064\u3051\u305F\u3059'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u305B\u3063\u304B\u304F\u898B\u3064\u3051\u305F\u3059\u3070\u3089\u3057\u3044\u8A18\u4E8B\u304C\u3069\u3053\u306B'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u3063\u305F\u7D4C\u9A13\u306F\u3042\u308A\u307E\u3059\u304B \u306A\u3089\u30BF\u30A4\u30C8\u30EB\u3068\u30A2'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u3064\u3051\u305F\u3059\u3070\u3089\u3057\u3044\u8A18\u4E8B\u304C\u3069\u3053\u306B\u3042\u3063\u305F\u304B\u5FD8'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u306A\u3089\u30BF\u30A4\u30C8\u30EB\u3068\u30A2\u30C9\u30EC\u30B9\u3060\u3051\u3067\u306A\u304F\u3001\u8A2A\u554F'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u304B\u3089\u3082\u691C\u7D22\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u3070\u3089\u3057\u3044\u8A18\u4E8B\u304C\u3069\u3053\u306B\u3042\u3063\u305F\u304B\u5FD8\u308C\u3066\u3057\u307E'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u3089\u3082\u691C\u7D22\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\u305B\u3063\u304B\u304F\u898B'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u308C\u3066\u3057\u307E\u3063\u305F\u7D4C\u9A13\u306F\u3042\u308A\u307E\u3059\u304B \u306A\u3089\u30BF\u30A4'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u30C8\u30EB\u3068\u30A2\u30C9\u30EC\u30B9\u3060\u3051\u3067\u306A\u304F\u3001\u8A2A\u554F'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u30C9\u30EC\u30B9\u3060\u3051\u3067\u306A\u304F\u3001\u8A2A\u554F\u3057\u305F\u30A6\u30A7\u30D6\u30DA\u30FC\u30B8'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-change-in-iframe-with-relative-parent-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-change-in-iframe-with-relative-parent-expected.txt
new file mode 100644
index 0000000..1021dc8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-change-in-iframe-with-relative-parent-expected.txt
@@ -0,0 +1,64 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Bazz'",
+          "rect": [18, 238, 40, 10],
+          "reason": "selection"
+        },
+        {
+          "object": "InlineTextBox 'Bar'",
+          "rect": [18, 218, 30, 10],
+          "reason": "selection"
+        },
+        {
+          "object": "InlineTextBox 'Foo'",
+          "rect": [18, 198, 30, 10],
+          "reason": "selection"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [58, 238, 10, 10],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [48, 218, 10, 10],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [48, 198, 10, 10],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [18, 228, 10, 10],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [18, 208, 10, 10],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-clear-after-move-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-clear-after-move-expected.txt
new file mode 100644
index 0000000..7c59e0e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-clear-after-move-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutImage IMG",
+          "rect": [100, 300, 50, 50],
+          "reason": "selection"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-partial-invalidation-between-blocks-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-partial-invalidation-between-blocks-expected.png
new file mode 100644
index 0000000..e68545a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-partial-invalidation-between-blocks-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-partial-invalidation-between-blocks-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-partial-invalidation-between-blocks-expected.txt
new file mode 100644
index 0000000..73e41f2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-partial-invalidation-between-blocks-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Second cell'",
+          "rect": [11, 35, 73, 19],
+          "reason": "selection"
+        },
+        {
+          "object": "InlineTextBox 'First cell'",
+          "rect": [11, 11, 58, 19],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-rl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-rl-expected.png
new file mode 100644
index 0000000..7d9d8c7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-rl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-rl-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-rl-expected.txt
new file mode 100644
index 0000000..e1842b49
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-rl-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Testing both hit testing'",
+          "rect": [773, 38, 19, 83],
+          "reason": "selection"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-within-composited-scroller-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-within-composited-scroller-expected.png
new file mode 100644
index 0000000..54f342d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-within-composited-scroller-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-within-composited-scroller-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-within-composited-scroller-expected.txt
new file mode 100644
index 0000000..8bb3ab9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/selection-within-composited-scroller-expected.txt
@@ -0,0 +1,84 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "LayoutBlockFlow DIV id='scroller'",
+      "position": [8, 8],
+      "bounds": [200, 200],
+      "backgroundColor": "#D3D3D3"
+    },
+    {
+      "name": "Scrolling Layer",
+      "position": [8, 8],
+      "bounds": [185, 185],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "position": [8, 8],
+      "bounds": [200, 1620],
+      "contentsOpaque": true,
+      "backgroundColor": "#D3D3D3",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'test'",
+          "rect": [0, 610, 21, 19],
+          "reason": "selection"
+        }
+      ],
+      "transform": 1
+    },
+    {
+      "name": "Overflow Controls Host Layer",
+      "position": [8, 8],
+      "bounds": [200, 200],
+      "drawsContent": false
+    },
+    {
+      "name": "Horizontal Scrollbar Layer",
+      "position": [8, 193],
+      "bounds": [185, 15],
+      "drawsContent": false
+    },
+    {
+      "name": "Vertical Scrollbar Layer",
+      "position": [193, 8],
+      "bounds": [15, 185],
+      "drawsContent": false
+    },
+    {
+      "name": "Scroll Corner Layer",
+      "position": [193, 193],
+      "bounds": [15, 15]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [0, -450, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/text-selection-rect-in-overflow-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/text-selection-rect-in-overflow-2-expected.png
new file mode 100644
index 0000000..4723cde
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/text-selection-rect-in-overflow-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/text-selection-rect-in-overflow-2-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/text-selection-rect-in-overflow-2-expected.txt
new file mode 100644
index 0000000..eceac54
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/text-selection-rect-in-overflow-2-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Should have blue, not gray, highlight'",
+          "rect": [18, 18, 233, 19],
+          "reason": "selection"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/text-selection-rect-in-overflow-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/text-selection-rect-in-overflow-expected.txt
new file mode 100644
index 0000000..f3061bc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/selection/text-selection-rect-in-overflow-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Should have green background'",
+          "rect": [8, 8, 197, 19],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/stacked-diacritics-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/stacked-diacritics-expected.txt
new file mode 100644
index 0000000..8167057f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/stacked-diacritics-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox '\u1EA6\u1EA4\u1EAA\u1EA8\u1EB0'",
+          "rect": [19, 166, 130, 43],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/subtree-root-skipped-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/subtree-root-skipped-expected.txt
new file mode 100644
index 0000000..5f434dd
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/subtree-root-skipped-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'PASS'",
+          "rect": [10, 11, 35, 16],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'FAIL'",
+          "rect": [10, 11, 27, 16],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow (positioned) DIV id='div'",
+          "rect": [8, 288, 10, 20],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/absolute-sized-content-with-resources-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/absolute-sized-content-with-resources-expected.txt
new file mode 100644
index 0000000..6911b9f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/absolute-sized-content-with-resources-expected.txt
@@ -0,0 +1,49 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 52, 402, 402],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGRect rect",
+          "rect": [42, 119, 334, 268],
+          "reason": "paint property change"
+        },
+        {
+          "object": "LayoutSVGRect rect",
+          "rect": [42, 119, 334, 268],
+          "reason": "paint property change"
+        },
+        {
+          "object": "LayoutSVGRect rect",
+          "rect": [17, 219, 84, 68],
+          "reason": "paint property change"
+        },
+        {
+          "object": "LayoutSVGRect rect",
+          "rect": [17, 219, 84, 68],
+          "reason": "paint property change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/add-background-property-on-root-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/add-background-property-on-root-expected.txt
new file mode 100644
index 0000000..a15d4d8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/add-background-property-on-root-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [8, 8, 100, 100],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutSVGRoot svg",
+          "rect": [8, 8, 100, 100],
+          "reason": "chunk appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png
new file mode 100644
index 0000000..d90c6e3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/hit-test-with-br-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/hit-test-with-br-expected.png
new file mode 100644
index 0000000..913572e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/hit-test-with-br-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/object-sizing-no-width-height-change-content-box-size-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/object-sizing-no-width-height-change-content-box-size-expected.txt
new file mode 100644
index 0000000..05c6287
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/object-sizing-no-width-height-change-content-box-size-expected.txt
@@ -0,0 +1,44 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 8, 402, 402],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutEmbeddedObject object",
+          "rect": [9, 9, 400, 400],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGRoot svg",
+          "rect": [9, 9, 400, 400],
+          "reason": "paint property change"
+        },
+        {
+          "object": "LayoutSVGRoot svg",
+          "rect": [9, 109, 200, 200],
+          "reason": "paint property change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-content-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-content-expected.txt
new file mode 100644
index 0000000..7b64d4d8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-content-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 72, 402, 402],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGRect rect id='targetRect'",
+          "rect": [9, 73, 400, 400],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGRoot svg",
+          "rect": [109, 73, 300, 400],
+          "reason": "incremental"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-content-with-resources-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-content-with-resources-expected.txt
new file mode 100644
index 0000000..48ce931
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-content-with-resources-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 72, 402, 402],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGRoot svg",
+          "rect": [47, 111, 324, 324],
+          "reason": "paint property change"
+        },
+        {
+          "object": "LayoutSVGRoot svg",
+          "rect": [8, 154, 102, 238],
+          "reason": "paint property change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-deep-shadow-tree-content-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-deep-shadow-tree-content-expected.txt
new file mode 100644
index 0000000..8f37782
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-deep-shadow-tree-content-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 72, 402, 402],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGContainer g id='targetUse'",
+          "rect": [209, 273, 200, 200],
+          "reason": "paint property change"
+        },
+        {
+          "object": "LayoutSVGContainer g id='targetUse'",
+          "rect": [59, 273, 50, 200],
+          "reason": "paint property change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-image-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-image-expected.txt
new file mode 100644
index 0000000..55d807ff
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-image-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 72, 402, 402],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGImage image",
+          "rect": [9, 73, 400, 400],
+          "reason": "image"
+        },
+        {
+          "object": "LayoutSVGRoot svg",
+          "rect": [109, 73, 300, 400],
+          "reason": "incremental"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-inner-svg-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-inner-svg-expected.txt
new file mode 100644
index 0000000..8abf99f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-inner-svg-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 52, 402, 402],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGViewportContainer svg",
+          "rect": [27, 69, 364, 366],
+          "reason": "paint property change"
+        },
+        {
+          "object": "LayoutSVGViewportContainer svg",
+          "rect": [13, 207, 92, 92],
+          "reason": "paint property change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-shadow-tree-content-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-shadow-tree-content-expected.txt
new file mode 100644
index 0000000..c91bd35
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-shadow-tree-content-expected.txt
@@ -0,0 +1,49 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 72, 402, 402],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGContainer use",
+          "rect": [209, 273, 200, 200],
+          "reason": "paint property change"
+        },
+        {
+          "object": "LayoutSVGRect rect id='targetRect1'",
+          "rect": [9, 73, 200, 200],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGRect rect id='targetRect1'",
+          "rect": [59, 73, 150, 200],
+          "reason": "incremental"
+        },
+        {
+          "object": "LayoutSVGContainer use",
+          "rect": [59, 273, 50, 200],
+          "reason": "paint property change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-shadow-tree-content-with-symbol-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-shadow-tree-content-with-symbol-expected.txt
new file mode 100644
index 0000000..992ee3c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-shadow-tree-content-with-symbol-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 72, 402, 402],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGViewportContainer svg id='targetSymbol'",
+          "rect": [9, 73, 400, 400],
+          "reason": "paint property change"
+        },
+        {
+          "object": "LayoutSVGViewportContainer svg id='targetSymbol'",
+          "rect": [9, 223, 100, 100],
+          "reason": "paint property change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-use-on-symbol-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-use-on-symbol-expected.txt
new file mode 100644
index 0000000..4289b03
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-use-on-symbol-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 52, 402, 402],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGViewportContainer svg id='gamesBorder'",
+          "rect": [45, 87, 328, 330],
+          "reason": "paint property change"
+        },
+        {
+          "object": "LayoutSVGViewportContainer svg id='gamesBorder'",
+          "rect": [18, 211, 82, 83],
+          "reason": "paint property change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.txt
new file mode 100644
index 0000000..5a0067e8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 52, 402, 402],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGViewportContainer svg id='gamesBorder'",
+          "rect": [27, 69, 364, 366],
+          "reason": "paint property change"
+        },
+        {
+          "object": "LayoutSVGViewportContainer svg id='gamesBorder'",
+          "rect": [13, 207, 92, 92],
+          "reason": "paint property change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/remove-background-property-on-root-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/remove-background-property-on-root-expected.txt
new file mode 100644
index 0000000..0220c96
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/remove-background-property-on-root-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [8, 8, 100, 100],
+          "reason": "appeared"
+        },
+        {
+          "object": "LayoutSVGRoot svg",
+          "rect": [8, 8, 100, 100],
+          "reason": "chunk disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/scrolling-embedded-svg-file-image-repaint-problem-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/scrolling-embedded-svg-file-image-repaint-problem-expected.txt
new file mode 100644
index 0000000..6e5d0f316
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/scrolling-embedded-svg-file-image-repaint-problem-expected.txt
@@ -0,0 +1,92 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [785, 585],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [1026, 996],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'pservers-pattern-01-b \u2190'",
+          "rect": [208, 972, 173, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'pservers-pattern-01-b \u2190'",
+          "rect": [208, 972, 173, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '\u2192 script-handle-01-b'",
+          "rect": [427, 972, 150, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\u2192 script-handle-01-b'",
+          "rect": [427, 972, 150, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutInline A",
+          "rect": [383, 971, 42, 21],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'index'",
+          "rect": [384, 972, 40, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'index'",
+          "rect": [384, 972, 40, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [423, 972, 5, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [423, 972, 5, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [380, 972, 5, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [380, 972, 5, 19],
+          "reason": "disappeared"
+        }
+      ],
+      "transform": 1
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [0, -411, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/svg-image-change-content-size-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/svg-image-change-content-size-expected.txt
new file mode 100644
index 0000000..b507634
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/svg/svg-image-change-content-size-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 52, 602, 422],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutImage img",
+          "rect": [9, 53, 420, 420],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/cached-change-cell-sl-border-color-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/cached-change-cell-sl-border-color-expected.txt
new file mode 100644
index 0000000..cdd3bb5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/cached-change-cell-sl-border-color-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [8, 8, 114, 54],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutBlockFlow (positioned) DIV id='blockDiv'",
+          "rect": [90, 30, 20, 20],
+          "reason": "full"
+        },
+        {
+          "object": "InlineTextBox 'A'",
+          "rect": [90, 30, 12, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/composited-table-row-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/composited-table-row-expected.txt
new file mode 100644
index 0000000..7628914
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/composited-table-row-expected.txt
@@ -0,0 +1,35 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "LayoutTableRow TR",
+      "position": [8, 8],
+      "bounds": [74, 24],
+      "backgroundColor": "#FF0000",
+      "paintInvalidations": [
+        {
+          "object": "LayoutTableCell TD id='target'",
+          "rect": [0, 0, 37, 23],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/resize-table-repaint-percent-size-cell-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/resize-table-repaint-percent-size-cell-expected.txt
new file mode 100644
index 0000000..926118a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/resize-table-repaint-percent-size-cell-expected.txt
@@ -0,0 +1,59 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [0, 52, 106, 238],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [0, 292, 106, 236],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [0, 102, 106, 46],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'ROW2'",
+          "rect": [3, 400, 46, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'ROW1'",
+          "rect": [3, 161, 46, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'ROW2'",
+          "rect": [3, 115, 46, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'ROW1'",
+          "rect": [3, 66, 46, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/resize-table-repaint-vertical-align-cell-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/resize-table-repaint-vertical-align-cell-expected.txt
new file mode 100644
index 0000000..720f995
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/resize-table-repaint-vertical-align-cell-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'MIDDLE'",
+          "rect": [3, 280, 63, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'MIDDLE'",
+          "rect": [3, 90, 63, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/resize-table-row-repaint-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/resize-table-row-repaint-expected.txt
new file mode 100644
index 0000000..29b20b3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/resize-table-row-repaint-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'MIDDLE'",
+          "rect": [3, 192, 63, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'MIDDLE'",
+          "rect": [3, 142, 63, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/single-line-cells-repeating-thead-break-inside-on-thead-only-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/single-line-cells-repeating-thead-break-inside-on-thead-only-expected.png
new file mode 100644
index 0000000..389f921
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/single-line-cells-repeating-thead-break-inside-on-thead-only-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/table-collapsed-border-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/table-collapsed-border-expected.txt
new file mode 100644
index 0000000..aaef5160
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/table-collapsed-border-expected.txt
@@ -0,0 +1,149 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutTableRow TR id='r2'",
+          "rect": [8, 224, 108, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [8, 338, 99, 30],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [8, 286, 99, 30],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [8, 154, 99, 30],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [8, 102, 99, 30],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [8, 316, 99, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableRow TR id='r'",
+          "rect": [8, 132, 99, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [8, 62, 95, 30],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [8, 10, 95, 30],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [8, 40, 95, 22],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'ipsum dolor'",
+          "rect": [23, 317, 76, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'ipsum dolor'",
+          "rect": [23, 133, 76, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'sit amet'",
+          "rect": [23, 339, 49, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'sit amet'",
+          "rect": [23, 339, 49, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'sit amet'",
+          "rect": [23, 155, 49, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'sit amet'",
+          "rect": [23, 155, 49, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Lorem'",
+          "rect": [23, 295, 43, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Lorem'",
+          "rect": [23, 295, 43, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Lorem'",
+          "rect": [23, 111, 43, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Lorem'",
+          "rect": [23, 111, 43, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'dolor'",
+          "rect": [23, 225, 34, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [17, 225, 4, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [17, 225, 4, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [17, 133, 4, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [17, 133, 4, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/table-shrink-row-repaint-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/table-shrink-row-repaint-expected.txt
new file mode 100644
index 0000000..34fb11d3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/table/table-shrink-row-repaint-expected.txt
@@ -0,0 +1,239 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [785, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [785, 850],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutTableCell TD id='resizeMe'",
+          "rect": [8, 112, 769, 210],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 782, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 742, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 722, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 682, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 662, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 622, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 602, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 562, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 542, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 502, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 482, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 442, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 422, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 382, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 362, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 322, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 302, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 242, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 182, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 122, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 802, 769, 48],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '10'",
+          "rect": [13, 822, 16, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '13'",
+          "rect": [13, 802, 16, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '12'",
+          "rect": [13, 742, 16, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '10'",
+          "rect": [13, 622, 16, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '11'",
+          "rect": [13, 682, 15, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '9'",
+          "rect": [13, 762, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '8'",
+          "rect": [13, 702, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '7'",
+          "rect": [13, 642, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '6'",
+          "rect": [13, 582, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '9'",
+          "rect": [13, 562, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '5'",
+          "rect": [13, 522, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '8'",
+          "rect": [13, 502, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '4'",
+          "rect": [13, 462, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '7'",
+          "rect": [13, 442, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '3'",
+          "rect": [13, 402, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '6'",
+          "rect": [13, 382, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '2'",
+          "rect": [13, 342, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '5'",
+          "rect": [13, 322, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '4'",
+          "rect": [13, 262, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '3'",
+          "rect": [13, 202, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '2'",
+          "rect": [13, 142, 8, 19],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/text-append-dirty-lines-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/text-append-dirty-lines-expected.txt
new file mode 100644
index 0000000..6e783648
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/text-append-dirty-lines-expected.txt
@@ -0,0 +1,69 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Curabitur a velit'",
+          "rect": [8, 44, 756, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Curabitur a velit.'",
+          "rect": [8, 44, 756, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse placerat. Morbi tristique. Mauris eu lacus sed felis'",
+          "rect": [8, 44, 756, 139],
+          "reason": "full"
+        },
+        {
+          "object": "InlineTextBox 'fermentum ut, tortor. Sed rhoncus. Quisque enim metus, luctus tincidunt, vestibulum eu, vestibulum eu, libero. Mauris'",
+          "rect": [8, 44, 756, 139],
+          "reason": "full"
+        },
+        {
+          "object": "InlineTextBox 'feugiat molestie, mi lorem bibendum leo, ac gravida orci nunc nec nulla. Nunc nunc lorem, rhoncus et, rutrum ac,'",
+          "rect": [8, 44, 756, 139],
+          "reason": "full"
+        },
+        {
+          "object": "InlineTextBox 'laoreet feugiat. Phasellus mollis pulvinar mi. Etiam ut neque sed eros egestas laoreet. Vestibulum ullamcorper, nulla non'",
+          "rect": [8, 44, 756, 139],
+          "reason": "full"
+        },
+        {
+          "object": "InlineTextBox 'pellentesque cursus. Proin vitae nulla. Vivamus in ipsum. Etiam mi. Nam malesuada purus in sem. Sed eget elit vel erat'",
+          "rect": [8, 44, 756, 139],
+          "reason": "full"
+        },
+        {
+          "object": "InlineTextBox 'sagittis aliquam nunc. Nullam pharetra molestie eros. Donec tempus purus ut ligula. Phasellus non nisl. Etiam eu mauris.'",
+          "rect": [8, 44, 756, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'sagittis aliquam nunc. Nullam pharetra molestie eros. Donec tempus purus ut ligula. Phasellus non nisl. Etiam eu mauris.'",
+          "rect": [8, 44, 756, 139],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/transform/transform-inline-layered-child-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/transform/transform-inline-layered-child-expected.txt
new file mode 100644
index 0000000..e0b225c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/transform/transform-inline-layered-child-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV id='box'",
+          "rect": [135, 361, 159, 195],
+          "reason": "chunk appeared"
+        },
+        {
+          "object": "LayoutBlockFlow HTML",
+          "rect": [300, 302, 80, 177],
+          "reason": "chunk disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/transform/transform-layout-repaint-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/transform/transform-layout-repaint-expected.txt
new file mode 100644
index 0000000..da820dbc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/transform/transform-layout-repaint-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [40, 50, 208, 118],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'PASS'",
+          "rect": [52, 51, 43, 32],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'FAIL'",
+          "rect": [52, 51, 40, 31],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/vertical-align-length1-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/vertical-align-length1-expected.txt
new file mode 100644
index 0000000..6abdff2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/vertical-align-length1-expected.txt
@@ -0,0 +1,49 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [20, 0, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [120, 130, 20, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [120, 100, 20, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [0, 130, 20, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [0, 100, 20, 20],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/vertical-align-length2-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/vertical-align-length2-expected.txt
new file mode 100644
index 0000000..e3a65389
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/vertical-align-length2-expected.txt
@@ -0,0 +1,44 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [300, 0, 200, 200],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [0, 0, 200, 200],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [200, 80, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [200, 50, 100, 100],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/vertical-align1-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/vertical-align1-expected.txt
new file mode 100644
index 0000000..cc6ab6f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/vertical-align1-expected.txt
@@ -0,0 +1,49 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [20, 0, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [120, 33, 20, 21],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [0, 33, 20, 21],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [120, 80, 20, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [0, 80, 20, 20],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/vertical-align2-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/vertical-align2-expected.txt
new file mode 100644
index 0000000..4d81829
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/vertical-align2-expected.txt
@@ -0,0 +1,44 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [300, 0, 200, 200],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [0, 0, 200, 200],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [200, 146, 100, 101],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [200, 100, 100, 100],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/vertical-rl-as-paint-container-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/vertical-rl-as-paint-container-expected.txt
new file mode 100644
index 0000000..95dd103
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/vertical-rl-as-paint-container-expected.txt
@@ -0,0 +1,50 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "LayoutBlockFlow DIV id='target'",
+      "position": [8, 8],
+      "bounds": [600, 400],
+      "backfaceVisibility": "hidden",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Lorem ipsum dolor'",
+          "rect": [520, 0, 80, 340],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'adipiscing elit.'",
+          "rect": [520, 0, 80, 340],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'consectetur'",
+          "rect": [520, 0, 80, 340],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'sit amet,'",
+          "rect": [520, 0, 80, 340],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/window-resize/window-resize-centered-inline-under-fixed-pos-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/window-resize/window-resize-centered-inline-under-fixed-pos-expected.txt
new file mode 100644
index 0000000..e0b8a22
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/window-resize/window-resize-centered-inline-under-fixed-pos-expected.txt
@@ -0,0 +1,168 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [600, 250],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [600, 250],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [600, 250],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV class='container'",
+          "rect": [0, 0, 600, 250],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='parent'",
+          "rect": [0, 0, 6, 250],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV class='child'",
+          "rect": [0, 125, 6, 30],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [400, 250],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [400, 250],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [400, 250],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV class='container'",
+          "rect": [0, 0, 400, 250],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='parent'",
+          "rect": [0, 0, 6, 250],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV class='child'",
+          "rect": [0, 125, 6, 30],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [400, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [400, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [400, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV class='container'",
+          "rect": [0, 0, 400, 600],
+          "reason": "geometry"
+        },
+        {
+          "object": "Scrolling background of LayoutView #document",
+          "rect": [0, 250, 400, 350],
+          "reason": "incremental"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='parent'",
+          "rect": [0, 0, 6, 600],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV class='child'",
+          "rect": [0, 300, 6, 30],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV class='child'",
+          "rect": [0, 125, 6, 30],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV class='container'",
+          "rect": [0, 0, 800, 600],
+          "reason": "geometry"
+        },
+        {
+          "object": "Scrolling background of LayoutView #document",
+          "rect": [400, 0, 400, 600],
+          "reason": "incremental"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='parent'",
+          "rect": [0, 0, 6, 600],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV class='child'",
+          "rect": [0, 300, 6, 30],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/window-resize/window-resize-vertical-writing-mode-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/window-resize/window-resize-vertical-writing-mode-expected.txt
new file mode 100644
index 0000000..ae0bee51
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/invalidation/window-resize/window-resize-vertical-writing-mode-expected.txt
@@ -0,0 +1,189 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [600, 250],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [600, 235],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [939, 235],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "Scrolling Contents Layer",
+          "rect": [0, 0, 939, 235],
+          "reason": "full layer"
+        }
+      ],
+      "transform": 1
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [-339, 0, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [400, 250],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [400, 235],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [939, 235],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "Scrolling Contents Layer",
+          "rect": [0, 0, 939, 235],
+          "reason": "full layer"
+        }
+      ],
+      "transform": 1
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [-539, 0, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [400, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [400, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [400, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "Scrolling Contents Layer",
+          "rect": [0, 0, 400, 600],
+          "reason": "full layer"
+        }
+      ]
+    }
+  ]
+}
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "Scrolling background of LayoutView #document",
+          "rect": [400, 0, 400, 600],
+          "reason": "incremental"
+        },
+        {
+          "object": "InlineTextBox 'AAAA BBBB CCCC'",
+          "rect": [439, 8, 352, 562],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'DDDD EEEE FFFF'",
+          "rect": [439, 8, 352, 562],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'GGGG HHHH IIII JJJJ'",
+          "rect": [439, 8, 352, 562],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'KKKK LLLL MMMM'",
+          "rect": [439, 8, 352, 562],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'NNNN'",
+          "rect": [439, 8, 352, 562],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'AAAA BBBB CCCC'",
+          "rect": [39, 8, 352, 562],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'DDDD EEEE FFFF'",
+          "rect": [39, 8, 352, 562],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'GGGG HHHH IIII JJJJ'",
+          "rect": [39, 8, 352, 562],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'KKKK LLLL MMMM'",
+          "rect": [39, 8, 352, 562],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'NNNN'",
+          "rect": [39, 8, 352, 562],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/ellipsis-ltr-text-in-ltr-flow-with-markers-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/ellipsis-ltr-text-in-ltr-flow-with-markers-expected.png
new file mode 100644
index 0000000..e4463b1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/ellipsis-ltr-text-in-ltr-flow-with-markers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/ellipsis-ltr-text-in-rtl-flow-with-markers-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/ellipsis-ltr-text-in-rtl-flow-with-markers-expected.png
new file mode 100644
index 0000000..1eb942d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/ellipsis-ltr-text-in-rtl-flow-with-markers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/ellipsis-mixed-text-in-ltr-flow-with-markers-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/ellipsis-mixed-text-in-ltr-flow-with-markers-expected.png
new file mode 100644
index 0000000..940baec6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/ellipsis-mixed-text-in-ltr-flow-with-markers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/ellipsis-mixed-text-in-rtl-flow-with-markers-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/ellipsis-mixed-text-in-rtl-flow-with-markers-expected.png
new file mode 100644
index 0000000..abceddd5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/ellipsis-mixed-text-in-rtl-flow-with-markers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/ellipsis-rtl-text-in-ltr-flow-with-markers-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/ellipsis-rtl-text-in-ltr-flow-with-markers-expected.png
new file mode 100644
index 0000000..bf7e327
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/ellipsis-rtl-text-in-ltr-flow-with-markers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/ellipsis-rtl-text-in-rtl-flow-with-markers-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/ellipsis-rtl-text-in-rtl-flow-with-markers-expected.png
new file mode 100644
index 0000000..5dd4841b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/ellipsis-rtl-text-in-rtl-flow-with-markers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/inline-spelling-markers-hidpi-composited-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/inline-spelling-markers-hidpi-composited-expected.png
new file mode 100644
index 0000000..96611816
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/inline-spelling-markers-hidpi-composited-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/inline-spelling-markers-hidpi-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/inline-spelling-markers-hidpi-expected.png
new file mode 100644
index 0000000..96611816
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/inline-spelling-markers-hidpi-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/inline_spelling_markers-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/inline_spelling_markers-expected.png
new file mode 100644
index 0000000..ba6a3ea
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/inline_spelling_markers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/markers-zoomed-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/markers-zoomed-expected.png
new file mode 100644
index 0000000..08d4686
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/markers-zoomed-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/vertical-lr-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/vertical-lr-expected.png
new file mode 100644
index 0000000..0d25d8dd
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/vertical-rl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/vertical-rl-expected.png
new file mode 100644
index 0000000..f82ef3b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/markers/vertical-rl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/image-writing-modes-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/image-writing-modes-expected.png
new file mode 100644
index 0000000..d95cabf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/image-writing-modes-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-inline-block-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-inline-block-expected.png
new file mode 100644
index 0000000..a625e5c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-inline-block-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-inline-block-rtl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-inline-block-rtl-expected.png
new file mode 100644
index 0000000..1badda5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-inline-block-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-across-blocks-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-across-blocks-expected.png
new file mode 100644
index 0000000..5e142e1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-across-blocks-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png
new file mode 100644
index 0000000..f0d68bd0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-br-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-br-expected.png
new file mode 100644
index 0000000..5e142e1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-br-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-clipped-by-overflow-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-clipped-by-overflow-expected.png
new file mode 100644
index 0000000..2317cde
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-clipped-by-overflow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-expected.png
new file mode 100644
index 0000000..ddf9523
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-mixed-ltr-rtl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-mixed-ltr-rtl-expected.png
new file mode 100644
index 0000000..52860ee
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-mixed-ltr-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-rtl-double-linebreak-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-rtl-double-linebreak-expected.png
new file mode 100644
index 0000000..468043a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-rtl-double-linebreak-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-rtl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-rtl-expected.png
new file mode 100644
index 0000000..966209a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-span-across-line-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-span-across-line-expected.png
new file mode 100644
index 0000000..ada2c791
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-span-across-line-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-span-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-span-expected.png
new file mode 100644
index 0000000..1732d68
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-span-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-vertical-lr-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-vertical-lr-expected.png
new file mode 100644
index 0000000..ab06e15
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-vertical-rl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-vertical-rl-expected.png
new file mode 100644
index 0000000..e9463718
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/selection/text-selection-newline-vertical-rl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/text/selection-no-clip-text-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/text/selection-no-clip-text-expected.png
new file mode 100644
index 0000000..d90c4648
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/paint/text/selection-no-clip-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/custom/absolute-sized-svg-in-xhtml-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/custom/absolute-sized-svg-in-xhtml-expected.png
new file mode 100644
index 0000000..c9862cb
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/custom/absolute-sized-svg-in-xhtml-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/custom/clone-element-with-animated-svg-properties-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/custom/clone-element-with-animated-svg-properties-expected.png
new file mode 100644
index 0000000..991bc8c1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/custom/clone-element-with-animated-svg-properties-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/custom/getsvgdocument-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/custom/getsvgdocument-expected.png
new file mode 100644
index 0000000..d3150a6c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/custom/getsvgdocument-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/custom/rootmost-svg-xy-attrs-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/custom/rootmost-svg-xy-attrs-expected.png
new file mode 100644
index 0000000..81e0a94
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/custom/rootmost-svg-xy-attrs-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/custom/svg-float-border-padding-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/custom/svg-float-border-padding-expected.png
new file mode 100644
index 0000000..05a682ad
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/custom/svg-float-border-padding-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/custom/svg-fonts-in-html-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/custom/svg-fonts-in-html-expected.png
new file mode 100644
index 0000000..edbcb22
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/custom/svg-fonts-in-html-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/custom/transformed-text-pattern-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/custom/transformed-text-pattern-expected.png
new file mode 100644
index 0000000..6a5736d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/custom/transformed-text-pattern-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/dom/SVGStringList-basics-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/dom/SVGStringList-basics-expected.png
new file mode 100644
index 0000000..5eade31
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/dom/SVGStringList-basics-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/text/foreignObject-text-clipping-bug-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/text/foreignObject-text-clipping-bug-expected.png
new file mode 100644
index 0000000..d3aa5a80
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/text/foreignObject-text-clipping-bug-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/text/text-repaint-rects-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/text/text-repaint-rects-expected.png
new file mode 100644
index 0000000..ba4d4d7a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/text/text-repaint-rects-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/transforms/text-with-pattern-inside-transformed-html-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/transforms/text-with-pattern-inside-transformed-html-expected.png
new file mode 100644
index 0000000..731c0f03
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/transforms/text-with-pattern-inside-transformed-html-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/zoom/text/zoom-svg-float-border-padding-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/zoom/text/zoom-svg-float-border-padding-expected.png
new file mode 100644
index 0000000..f45e5425
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/svg/zoom/text/zoom-svg-float-border-padding-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug106158-1-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug106158-1-expected.png
new file mode 100644
index 0000000..b7976104
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug106158-1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug106158-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug106158-2-expected.png
new file mode 100644
index 0000000..a6f3b69
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug106158-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug109043-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug109043-expected.png
new file mode 100644
index 0000000..a5ea2b3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug109043-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug11384q-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug11384q-expected.png
new file mode 100644
index 0000000..9b73fa4c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug11384q-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug11384s-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug11384s-expected.png
new file mode 100644
index 0000000..74eaa2c8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug11384s-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug1302-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug1302-expected.png
new file mode 100644
index 0000000..0264ee9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug1302-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug131020-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug131020-expected.png
new file mode 100644
index 0000000..9482393
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug131020-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug131020_iframe-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug131020_iframe-expected.png
new file mode 100644
index 0000000..0a32570
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug131020_iframe-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug13118-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug13118-expected.png
new file mode 100644
index 0000000..a246cbf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug13118-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug1318-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug1318-expected.png
new file mode 100644
index 0000000..a2fd8d2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug1318-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug13196-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug13196-expected.png
new file mode 100644
index 0000000..3ccf677
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug13196-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug139524-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug139524-2-expected.png
new file mode 100644
index 0000000..3ed13cf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug139524-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug14159-1-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug14159-1-expected.png
new file mode 100644
index 0000000..2cb922f7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug14159-1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug1430-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug1430-expected.png
new file mode 100644
index 0000000..01da8ff6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug1430-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug16252-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug16252-expected.png
new file mode 100644
index 0000000..493fbb0e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug16252-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug17130-1-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug17130-1-expected.png
new file mode 100644
index 0000000..05c4412f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug17130-1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug18955-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug18955-expected.png
new file mode 100644
index 0000000..63977d8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug18955-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2267-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2267-expected.png
new file mode 100644
index 0000000..1b678e4d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2267-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug23235-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug23235-expected.png
new file mode 100644
index 0000000..f68aa6a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug23235-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2479-1-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2479-1-expected.png
new file mode 100644
index 0000000..267ea03b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2479-1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2479-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2479-2-expected.png
new file mode 100644
index 0000000..ba22fa5b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2479-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2479-3-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2479-3-expected.png
new file mode 100644
index 0000000..90870a6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2479-3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2479-4-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2479-4-expected.png
new file mode 100644
index 0000000..5c6ee300
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2479-4-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2757-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2757-expected.png
new file mode 100644
index 0000000..b37541d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2757-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2962-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2962-expected.png
new file mode 100644
index 0000000..ddb7717
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2962-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2981-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2981-2-expected.png
new file mode 100644
index 0000000..abfcd9d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2981-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2997-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2997-expected.png
new file mode 100644
index 0000000..62ee70e8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug2997-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug30692-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug30692-expected.png
new file mode 100644
index 0000000..5d9972c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug30692-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug38916-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug38916-expected.png
new file mode 100644
index 0000000..3cd6007
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug38916-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug3977-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug3977-expected.png
new file mode 100644
index 0000000..3fadc21
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug3977-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug43039-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug43039-expected.png
new file mode 100644
index 0000000..48c309d9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug43039-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug4427-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug4427-expected.png
new file mode 100644
index 0000000..4a29f8c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug4427-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug44523-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug44523-expected.png
new file mode 100644
index 0000000..07b7148
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug44523-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug4501-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug4501-expected.png
new file mode 100644
index 0000000..ab8e15d9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug4501-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46268-1-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46268-1-expected.png
new file mode 100644
index 0000000..0c5846c0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46268-1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46268-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46268-2-expected.png
new file mode 100644
index 0000000..0c5846c0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46268-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46268-5-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46268-5-expected.png
new file mode 100644
index 0000000..ea58783e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46268-5-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46268-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46268-expected.png
new file mode 100644
index 0000000..ea58783e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46268-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46368-1-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46368-1-expected.png
new file mode 100644
index 0000000..eb7950b0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46368-1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46368-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46368-2-expected.png
new file mode 100644
index 0000000..842c5b1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46368-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46480-1-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46480-1-expected.png
new file mode 100644
index 0000000..ce82954
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46480-1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46480-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46480-2-expected.png
new file mode 100644
index 0000000..f231cbfb
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46480-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46924-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46924-expected.png
new file mode 100644
index 0000000..71890d2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug46924-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug4803-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug4803-expected.png
new file mode 100644
index 0000000..8a31409
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug4803-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug4849-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug4849-2-expected.png
new file mode 100644
index 0000000..19d2b79
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug4849-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug48827-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug48827-expected.png
new file mode 100644
index 0000000..7324402
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug48827-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug50695-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug50695-2-expected.png
new file mode 100644
index 0000000..e50220e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug50695-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug5538-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug5538-expected.png
new file mode 100644
index 0000000..1702fb31
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug5538-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug57828-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug57828-expected.png
new file mode 100644
index 0000000..6cd5bd5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug57828-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug59354-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug59354-expected.png
new file mode 100644
index 0000000..ffdae6d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug59354-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug60992-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug60992-expected.png
new file mode 100644
index 0000000..80ddb39
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug60992-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug6304-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug6304-expected.png
new file mode 100644
index 0000000..c126830e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug6304-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug69382-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug69382-2-expected.png
new file mode 100644
index 0000000..f698efc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug69382-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug727-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug727-expected.png
new file mode 100644
index 0000000..7a0c104b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug727-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug7342-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug7342-expected.png
new file mode 100644
index 0000000..a3c8849
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug7342-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug78162-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug78162-expected.png
new file mode 100644
index 0000000..b0fca92
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug78162-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug82946-1-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug82946-1-expected.png
new file mode 100644
index 0000000..0ceaed42
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug82946-1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug82946-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug82946-2-expected.png
new file mode 100644
index 0000000..933bc466
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug82946-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug9123-1-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug9123-1-expected.png
new file mode 100644
index 0000000..9e21e38c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug9123-1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug93363-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug93363-expected.png
new file mode 100644
index 0000000..7fe5ce1b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/bugs/bug93363-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/core/bloomberg-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/core/bloomberg-expected.png
new file mode 100644
index 0000000..953c918
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/core/bloomberg-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/col_span-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/col_span-expected.png
new file mode 100644
index 0000000..d3efda9e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/col_span-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_align_center-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_align_center-expected.png
new file mode 100644
index 0000000..3734088
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_align_center-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_align_justify-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_align_justify-expected.png
new file mode 100644
index 0000000..c710b53f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_align_justify-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_align_left-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_align_left-expected.png
new file mode 100644
index 0000000..3bb8f91
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_align_left-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_align_right-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_align_right-expected.png
new file mode 100644
index 0000000..bf2582a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_align_right-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_span-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_span-expected.png
new file mode 100644
index 0000000..8b3803c6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_span-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_valign_baseline-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_valign_baseline-expected.png
new file mode 100644
index 0000000..eb59cce
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_valign_baseline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_valign_bottom-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_valign_bottom-expected.png
new file mode 100644
index 0000000..7884efa
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_valign_bottom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_valign_middle-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_valign_middle-expected.png
new file mode 100644
index 0000000..af40d4c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_valign_middle-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_valign_top-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_valign_top-expected.png
new file mode 100644
index 0000000..7333e068
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_valign_top-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_width_pct-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_width_pct-expected.png
new file mode 100644
index 0000000..307b86b3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_width_pct-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_width_px-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_width_px-expected.png
new file mode 100644
index 0000000..d835743
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/colgroup_width_px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tables_td_align_center-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tables_td_align_center-expected.png
new file mode 100644
index 0000000..fba336aa
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tables_td_align_center-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tables_td_align_left-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tables_td_align_left-expected.png
new file mode 100644
index 0000000..3268be2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tables_td_align_left-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tables_td_align_right-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tables_td_align_right-expected.png
new file mode 100644
index 0000000..9aa7b80
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tables_td_align_right-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tables_th_align_center-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tables_th_align_center-expected.png
new file mode 100644
index 0000000..be57e05e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tables_th_align_center-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tables_th_align_left-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tables_th_align_left-expected.png
new file mode 100644
index 0000000..c45eb320
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tables_th_align_left-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tables_th_align_right-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tables_th_align_right-expected.png
new file mode 100644
index 0000000..6d60ac6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tables_th_align_right-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_align_center-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_align_center-expected.png
new file mode 100644
index 0000000..434554c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_align_center-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_align_char-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_align_char-expected.png
new file mode 100644
index 0000000..0ef50b1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_align_char-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_align_justify-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_align_justify-expected.png
new file mode 100644
index 0000000..85062e5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_align_justify-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_align_left-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_align_left-expected.png
new file mode 100644
index 0000000..acb7733
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_align_left-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_align_right-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_align_right-expected.png
new file mode 100644
index 0000000..758abc8e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_align_right-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_char-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_char-expected.png
new file mode 100644
index 0000000..f613a11
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_char-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_valign_baseline-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_valign_baseline-expected.png
new file mode 100644
index 0000000..78f445a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_valign_baseline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_valign_bottom-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_valign_bottom-expected.png
new file mode 100644
index 0000000..4eba081f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_valign_bottom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_valign_middle-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_valign_middle-expected.png
new file mode 100644
index 0000000..bc25163f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_valign_middle-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_valign_top-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_valign_top-expected.png
new file mode 100644
index 0000000..048b088
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tbody_valign_top-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tfoot_align_char-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tfoot_align_char-expected.png
new file mode 100644
index 0000000..f7fa58c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tfoot_align_char-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tfoot_align_justify-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tfoot_align_justify-expected.png
new file mode 100644
index 0000000..51f06f8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/tfoot_align_justify-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/thead_align_char-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/thead_align_char-expected.png
new file mode 100644
index 0000000..6b510a0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/thead_align_char-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/thead_align_justify-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/thead_align_justify-expected.png
new file mode 100644
index 0000000..24640d8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/thead_align_justify-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_col_valign_baseline-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_col_valign_baseline-expected.png
new file mode 100644
index 0000000..88b1ded
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_col_valign_baseline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_col_valign_bottom-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_col_valign_bottom-expected.png
new file mode 100644
index 0000000..3ab5052
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_col_valign_bottom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_col_valign_middle-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_col_valign_middle-expected.png
new file mode 100644
index 0000000..c2c2f2e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_col_valign_middle-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_col_valign_top-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_col_valign_top-expected.png
new file mode 100644
index 0000000..68d1b42f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_col_valign_top-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_col_width_pct-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_col_width_pct-expected.png
new file mode 100644
index 0000000..5dc2f03
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_col_width_pct-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_col_width_px-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_col_width_px-expected.png
new file mode 100644
index 0000000..a16ee22
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_col_width_px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_col_width_rel-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_col_width_rel-expected.png
new file mode 100644
index 0000000..c48b9f2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_col_width_rel-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_colgroup_valign_baseline-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_colgroup_valign_baseline-expected.png
new file mode 100644
index 0000000..24748390
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_colgroup_valign_baseline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_colgroup_valign_bottom-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_colgroup_valign_bottom-expected.png
new file mode 100644
index 0000000..5d5dfaeb
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_colgroup_valign_bottom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_colgroup_valign_middle-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_colgroup_valign_middle-expected.png
new file mode 100644
index 0000000..a42e427
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_colgroup_valign_middle-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_colgroup_valign_top-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_colgroup_valign_top-expected.png
new file mode 100644
index 0000000..f203519
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_colgroup_valign_top-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_colgroup_width_pct-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_colgroup_width_pct-expected.png
new file mode 100644
index 0000000..198baf0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_colgroup_width_pct-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_colgroup_width_rel-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_colgroup_width_rel-expected.png
new file mode 100644
index 0000000..0ea0d63b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_colgroup_width_rel-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_table-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_table-expected.png
new file mode 100644
index 0000000..02acd9a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_table-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_align_center-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_align_center-expected.png
new file mode 100644
index 0000000..081e87a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_align_center-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_align_char-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_align_char-expected.png
new file mode 100644
index 0000000..bf893fa
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_align_char-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_align_justify-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_align_justify-expected.png
new file mode 100644
index 0000000..981e1de
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_align_justify-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_align_left-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_align_left-expected.png
new file mode 100644
index 0000000..65d9ffa
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_align_left-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_align_right-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_align_right-expected.png
new file mode 100644
index 0000000..60b71fc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_align_right-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_valign_baseline-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_valign_baseline-expected.png
new file mode 100644
index 0000000..c50791c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_valign_baseline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_valign_bottom-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_valign_bottom-expected.png
new file mode 100644
index 0000000..a8536aa
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_valign_bottom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_valign_middle-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_valign_middle-expected.png
new file mode 100644
index 0000000..56e64fb
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_valign_middle-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_valign_top-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_valign_top-expected.png
new file mode 100644
index 0000000..ce0e6b2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tbody_valign_top-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_td_align_justify-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_td_align_justify-expected.png
new file mode 100644
index 0000000..435d77d75
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_td_align_justify-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_th_align_justify-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_th_align_justify-expected.png
new file mode 100644
index 0000000..831d6d4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_th_align_justify-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tr_align_justify-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tr_align_justify-expected.png
new file mode 100644
index 0000000..18fa8ede
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/marvin/x_tr_align_justify-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/other/cellspacing-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/other/cellspacing-expected.png
new file mode 100644
index 0000000..ee1f75f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/other/cellspacing-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/other/test3-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/other/test3-expected.png
new file mode 100644
index 0000000..db6a869c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/other/test3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/other/test6-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/other/test6-expected.png
new file mode 100644
index 0000000..775931c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/other/test6-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/other/wa_table_thtd_rowspan-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/other/wa_table_thtd_rowspan-expected.png
new file mode 100644
index 0000000..3237cb6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/other/wa_table_thtd_rowspan-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/other/wa_table_tr_align-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/other/wa_table_tr_align-expected.png
new file mode 100644
index 0000000..af932398
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla/other/wa_table_tr_align-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug1010-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug1010-expected.png
new file mode 100644
index 0000000..839c2a1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug1010-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug1055-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug1055-2-expected.png
new file mode 100644
index 0000000..8ae4e04f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug1055-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug1128-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug1128-expected.png
new file mode 100644
index 0000000..9edcd41
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug1128-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug21518-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug21518-expected.png
new file mode 100644
index 0000000..b02ba5a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug21518-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug22122-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug22122-expected.png
new file mode 100644
index 0000000..eb25741
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug22122-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug2479-5-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug2479-5-expected.png
new file mode 100644
index 0000000..95eae29
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug2479-5-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug32205-4-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug32205-4-expected.png
new file mode 100644
index 0000000..81e7c5d9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug32205-4-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug4294-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug4294-expected.png
new file mode 100644
index 0000000..fd5b710
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug4294-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug51000-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug51000-expected.png
new file mode 100644
index 0000000..bbb04c120
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug51000-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug72393-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug72393-expected.png
new file mode 100644
index 0000000..977a0ec
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug72393-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug80762-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug80762-2-expected.png
new file mode 100644
index 0000000..16310e1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug80762-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug8499-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug8499-expected.png
new file mode 100644
index 0000000..d11772c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug8499-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug85016-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug85016-expected.png
new file mode 100644
index 0000000..5bba62c4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug85016-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug89315-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug89315-expected.png
new file mode 100644
index 0000000..befdbe0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug89315-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug91057-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug91057-expected.png
new file mode 100644
index 0000000..17784e2b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/bugs/bug91057-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/core/standards1-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/core/standards1-expected.png
new file mode 100644
index 0000000..2bd9edb
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/core/standards1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/marvin/backgr_fixed-bg-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/marvin/backgr_fixed-bg-expected.png
new file mode 100644
index 0000000..f76318b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/marvin/backgr_fixed-bg-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/marvin/x_colgroup_width_px-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/marvin/x_colgroup_width_px-expected.png
new file mode 100644
index 0000000..45227e98
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/tables/mozilla_expected_failures/marvin/x_colgroup_width_px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/transforms/2d/transform-fixed-container-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/transforms/2d/transform-fixed-container-expected.png
new file mode 100644
index 0000000..e502185
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/transforms/2d/transform-fixed-container-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/transforms/3d/general/perspective-units-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/transforms/3d/general/perspective-units-expected.png
new file mode 100644
index 0000000..bfc1e3d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/transforms/3d/general/perspective-units-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/transforms/3d/hit-testing/backface-hit-test-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/transforms/3d/hit-testing/backface-hit-test-expected.png
new file mode 100644
index 0000000..882974fe
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/transforms/3d/hit-testing/backface-hit-test-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/transforms/3d/hit-testing/backface-no-transform-hit-test-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/transforms/3d/hit-testing/backface-no-transform-hit-test-expected.png
new file mode 100644
index 0000000..c4da0c8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/transforms/3d/hit-testing/backface-no-transform-hit-test-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/transforms/transforms-with-zoom-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/transforms/transforms-with-zoom-expected.png
new file mode 100644
index 0000000..716d41b3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/transforms/transforms-with-zoom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/android/fullscreen/full-screen-with-flex-item-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/android/fullscreen/full-screen-with-flex-item-expected.txt
new file mode 100644
index 0000000..b5c66b7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/android/fullscreen/full-screen-with-flex-item-expected.txt
@@ -0,0 +1,6 @@
+Enter Fullscreen
+EVENT(webkitfullscreenchange)
+EVENT(webkitfullscreenchange)
+EXPECTED (584 == '584') OK
+END OF TEST
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/blink-cors/external/wpt/service-workers/service-worker/registration-schedule-job.https-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/blink-cors/external/wpt/service-workers/service-worker/registration-schedule-job.https-expected.txt
new file mode 100644
index 0000000..e077379
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/blink-cors/external/wpt/service-workers/service-worker/registration-schedule-job.https-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+FAIL different scriptURL and updateViaCache promise_test: Unhandled rejection with value: object "TypeError: Cannot read property 'scriptURL' of null"
+FAIL different type assert_equals: expected (string) "classic" but got (undefined) undefined
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/blink-cors/external/wpt/service-workers/service-worker/registration-updateviacache.https-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/blink-cors/external/wpt/service-workers/service-worker/registration-updateviacache.https-expected.txt
new file mode 100644
index 0000000..98881c1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/blink-cors/external/wpt/service-workers/service-worker/registration-updateviacache.https-expected.txt
@@ -0,0 +1,28 @@
+This is a testharness.js-based test.
+PASS register-with-updateViaCache-undefined
+PASS register-with-updateViaCache-imports
+PASS register-with-updateViaCache-all
+PASS register-with-updateViaCache-none
+PASS register-with-updateViaCache-undefined-then-undefined
+PASS register-with-updateViaCache-undefined-then-imports
+PASS register-with-updateViaCache-undefined-then-all
+PASS register-with-updateViaCache-undefined-then-none
+PASS register-with-updateViaCache-imports-then-undefined
+PASS register-with-updateViaCache-imports-then-imports
+PASS register-with-updateViaCache-imports-then-all
+PASS register-with-updateViaCache-imports-then-none
+PASS register-with-updateViaCache-all-then-undefined
+PASS register-with-updateViaCache-all-then-imports
+PASS register-with-updateViaCache-all-then-all
+PASS register-with-updateViaCache-all-then-none
+PASS register-with-updateViaCache-none-then-undefined
+PASS register-with-updateViaCache-none-then-imports
+PASS register-with-updateViaCache-none-then-all
+PASS register-with-updateViaCache-none-then-none
+PASS access-updateViaCache-after-unregister-undefined
+PASS access-updateViaCache-after-unregister-imports
+PASS access-updateViaCache-after-unregister-all
+PASS access-updateViaCache-after-unregister-none
+PASS updateViaCache is not updated if register() rejects
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/animations/rotate-transform-equivalent-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/animations/rotate-transform-equivalent-expected.png
new file mode 100644
index 0000000..95695bb
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/animations/rotate-transform-equivalent-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/geometry/root-layer-update-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/geometry/root-layer-update-expected.png
new file mode 100644
index 0000000..cbd6684
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/geometry/root-layer-update-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/geometry/transfrom-origin-on-zero-size-layer-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/geometry/transfrom-origin-on-zero-size-layer-expected.png
new file mode 100644
index 0000000..e186ea19
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/geometry/transfrom-origin-on-zero-size-layer-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/reflections/compositing-change-inside-reflection-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/reflections/compositing-change-inside-reflection-expected.png
new file mode 100644
index 0000000..5cc9aa2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/reflections/compositing-change-inside-reflection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/reflections/reflection-positioning-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/reflections/reflection-positioning-expected.png
new file mode 100644
index 0000000..ca05e6a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/reflections/reflection-positioning-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/reflections/reflection-positioning2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/reflections/reflection-positioning2-expected.png
new file mode 100644
index 0000000..ede9a990
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/reflections/reflection-positioning2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/reflections/transform-inside-reflection-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/reflections/transform-inside-reflection-expected.png
new file mode 100644
index 0000000..a51968c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/reflections/transform-inside-reflection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/squashing/selection-repaint-with-gaps-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/squashing/selection-repaint-with-gaps-expected.png
new file mode 100644
index 0000000..a56b709
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/squashing/selection-repaint-with-gaps-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/squashing/selection-repaint-with-gaps-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/squashing/selection-repaint-with-gaps-expected.txt
new file mode 100644
index 0000000..05556e5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/squashing/selection-repaint-with-gaps-expected.txt
@@ -0,0 +1,131 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Squashing Containment Layer",
+      "drawsContent": false
+    },
+    {
+      "name": "LayoutBlockFlow DIV class='overlap'",
+      "bounds": [300, 500],
+      "drawsContent": false,
+      "transform": 1
+    },
+    {
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV class='item')",
+      "position": [15, 35],
+      "bounds": [100, 210],
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'ipsum'",
+          "rect": [0, 80, 40, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'lorem'",
+          "rect": [0, 80, 40, 39],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [8, 8, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Squashing Containment Layer",
+      "drawsContent": false
+    },
+    {
+      "name": "LayoutBlockFlow DIV class='overlap'",
+      "bounds": [300, 500],
+      "drawsContent": false,
+      "transform": 1
+    },
+    {
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV class='item')",
+      "position": [15, 35],
+      "bounds": [100, 210],
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'ipsum'",
+          "rect": [0, 80, 42, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'lorem'",
+          "rect": [0, 80, 42, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'ipsum'",
+          "rect": [0, 160, 40, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'lorem'",
+          "rect": [0, 160, 40, 39],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [8, 8, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/squashing/squash-transform-repainting-child-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/squashing/squash-transform-repainting-child-expected.txt
new file mode 100644
index 0000000..de990efa
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/squashing/squash-transform-repainting-child-expected.txt
@@ -0,0 +1,172 @@
+CASE 1, original layer tree
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Squashing Containment Layer",
+      "drawsContent": false
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV class='composited box behind'",
+      "bounds": [100, 100],
+      "contentsOpaque": true,
+      "backgroundColor": "#0000FF",
+      "transform": 1
+    },
+    {
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV class='box middle')",
+      "position": [-1, -1],
+      "bounds": [281, 281]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [100, 100, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
+CASE 2, hovering over the outer div
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Squashing Containment Layer",
+      "drawsContent": false
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV class='composited box behind'",
+      "bounds": [100, 100],
+      "contentsOpaque": true,
+      "backgroundColor": "#0000FF",
+      "transform": 1
+    },
+    {
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV class='box middle')",
+      "position": [-1, -1],
+      "bounds": [281, 281],
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV class='box middle'",
+          "rect": [0, 0, 142, 142],
+          "reason": "background"
+        }
+      ]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [100, 100, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
+CASE 3, hovering over the inner div
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Squashing Containment Layer",
+      "drawsContent": false
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV class='composited box behind'",
+      "bounds": [100, 100],
+      "contentsOpaque": true,
+      "backgroundColor": "#0000FF",
+      "transform": 1
+    },
+    {
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV class='box middle')",
+      "position": [-1, -1],
+      "bounds": [281, 281],
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV class='box middle'",
+          "rect": [0, 0, 142, 142],
+          "reason": "background"
+        },
+        {
+          "object": "LayoutBlockFlow (positioned) DIV class='smallbox'",
+          "rect": [32, 32, 71, 71],
+          "reason": "background"
+        }
+      ]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [100, 100, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/squashing/squash-transform-repainting-transformed-child-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/squashing/squash-transform-repainting-transformed-child-expected.txt
new file mode 100644
index 0000000..d5d4c994
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/compositing/squashing/squash-transform-repainting-transformed-child-expected.txt
@@ -0,0 +1,172 @@
+CASE 1, original layer tree
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Squashing Containment Layer",
+      "drawsContent": false
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV class='composited box behind'",
+      "bounds": [100, 100],
+      "contentsOpaque": true,
+      "backgroundColor": "#0000FF",
+      "transform": 1
+    },
+    {
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV class='box middle')",
+      "position": [4, 4],
+      "bounds": [276, 276]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [100, 100, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
+CASE 2, hovering over the outer div
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Squashing Containment Layer",
+      "drawsContent": false
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV class='composited box behind'",
+      "bounds": [100, 100],
+      "contentsOpaque": true,
+      "backgroundColor": "#0000FF",
+      "transform": 1
+    },
+    {
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV class='box middle')",
+      "position": [4, 4],
+      "bounds": [276, 276],
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV class='box middle'",
+          "rect": [0, 0, 132, 132],
+          "reason": "background"
+        }
+      ]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [100, 100, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
+CASE 3, hovering over the inner div
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Squashing Containment Layer",
+      "drawsContent": false
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV class='composited box behind'",
+      "bounds": [100, 100],
+      "contentsOpaque": true,
+      "backgroundColor": "#0000FF",
+      "transform": 1
+    },
+    {
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV class='box middle')",
+      "position": [4, 4],
+      "bounds": [276, 276],
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV class='box middle'",
+          "rect": [0, 0, 132, 132],
+          "reason": "background"
+        },
+        {
+          "object": "LayoutBlockFlow (positioned) DIV class='smallbox'",
+          "rect": [26, 28, 71, 72],
+          "reason": "background"
+        }
+      ]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [100, 100, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/background/background-misaligned-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/background/background-misaligned-expected.txt
new file mode 100644
index 0000000..8b085536
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/background/background-misaligned-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV id='target'",
+          "rect": [238, 241, 40, 40],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/block-layout-inline-children-replaced-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/block-layout-inline-children-replaced-expected.txt
new file mode 100644
index 0000000..0f1216a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/block-layout-inline-children-replaced-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='target' class='target'",
+          "rect": [0, 116, 402, 152],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutImage IMG",
+          "rect": [151, 117, 100, 100],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/block-no-inflow-children-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/block-no-inflow-children-expected.txt
new file mode 100644
index 0000000..c298739e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/block-no-inflow-children-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'La la la la'",
+          "rect": [0, 0, 62, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'La la la'",
+          "rect": [0, 0, 47, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/box/hover-pseudo-borders-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/box/hover-pseudo-borders-expected.txt
new file mode 100644
index 0000000..ee1886f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/box/hover-pseudo-borders-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) \u003Cpseudo:after\u003E",
+          "rect": [138, 8, 100, 100],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='hitregion'",
+          "rect": [8, 8, 100, 100],
+          "reason": "background"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/box/invalidate-box-shadow-currentColor-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/box/invalidate-box-shadow-currentColor-expected.txt
new file mode 100644
index 0000000..e52439a1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/box/invalidate-box-shadow-currentColor-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineFlowBox",
+          "rect": [8, 8, 29, 24],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'Text'",
+          "rect": [8, 8, 29, 19],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/bugzilla-3509-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/bugzilla-3509-expected.txt
new file mode 100644
index 0000000..9cfe063
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/bugzilla-3509-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='im'",
+          "rect": [11, 131, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [11, 131, 4, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [11, 131, 4, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/bugzilla-5699-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/bugzilla-5699-expected.txt
new file mode 100644
index 0000000..3cb2aa5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/bugzilla-5699-expected.txt
@@ -0,0 +1,44 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Hello'",
+          "rect": [8, 184, 35, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'Hello'",
+          "rect": [8, 156, 35, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [8, 150, 4, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [8, 136, 4, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/bugzilla-6278-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/bugzilla-6278-expected.txt
new file mode 100644
index 0000000..06a3459
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/bugzilla-6278-expected.txt
@@ -0,0 +1,144 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [10, 138, 292, 160],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [10, 303, 292, 50],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'Curabitur pretium, quam quis semper'",
+          "rect": [10, 138, 291, 159],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Phasellus vehicula, sem at posuere vehicula,'",
+          "rect": [10, 138, 291, 159],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'augue nibh molestie nisl, nec ullamcorper'",
+          "rect": [10, 138, 291, 159],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'fringilla orci nibh sed neque. Quisque eu nulla'",
+          "rect": [10, 138, 291, 159],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'lacus ante vulputate pede.'",
+          "rect": [10, 138, 291, 159],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'laoreet ac, laoreet non, suscipit sed, sapien.'",
+          "rect": [10, 138, 291, 159],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'malesuada, est libero feugiat libero, vel'",
+          "rect": [10, 138, 291, 159],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'non nisi molestie accumsan. Etiam tellus urna,'",
+          "rect": [10, 138, 291, 159],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [10, 138, 242, 200],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [10, 343, 242, 50],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD id='col1'",
+          "rect": [10, 353, 242, 40],
+          "reason": "incremental"
+        },
+        {
+          "object": "InlineTextBox 'Curabitur pretium, quam quis semper'",
+          "rect": [10, 138, 235, 199],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Phasellus vehicula, sem at posuere'",
+          "rect": [10, 138, 235, 199],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Quisque eu nulla non nisi molestie'",
+          "rect": [10, 138, 235, 199],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'ac, laoreet non, suscipit sed, sapien.'",
+          "rect": [10, 138, 235, 199],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'accumsan. Etiam tellus urna, laoreet'",
+          "rect": [10, 138, 235, 199],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'malesuada, est libero feugiat libero,'",
+          "rect": [10, 138, 235, 199],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'nec ullamcorper lacus ante vulputate'",
+          "rect": [10, 138, 235, 199],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'pede.'",
+          "rect": [10, 138, 235, 199],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'vehicula, augue nibh molestie nisl,'",
+          "rect": [10, 138, 235, 199],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'vel fringilla orci nibh sed neque.'",
+          "rect": [10, 138, 235, 199],
+          "reason": "appeared"
+        },
+        {
+          "object": "LayoutTableCell TD id='col1'",
+          "rect": [252, 138, 50, 215],
+          "reason": "incremental"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/bugzilla-7235-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/bugzilla-7235-expected.txt
new file mode 100644
index 0000000..3e464899
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/bugzilla-7235-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV id='t'",
+          "rect": [8, 176, 100, 100],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [8, 156, 4, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [8, 156, 4, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/clip/clip-with-layout-delta-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/clip/clip-with-layout-delta-expected.txt
new file mode 100644
index 0000000..ca6e810
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/clip/clip-with-layout-delta-expected.txt
@@ -0,0 +1,54 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV",
+          "rect": [108, 8, 100, 100],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV",
+          "rect": [108, 8, 100, 100],
+          "reason": "chunk appeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [8, 8, 100, 100],
+          "reason": "appeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [8, 8, 100, 100],
+          "reason": "chunk disappeared"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [108, 8, 4, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow HTML",
+          "rect": [8, 8, 4, 19],
+          "reason": "chunk appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/clip/outline-clip-change-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/clip/outline-clip-change-expected.txt
new file mode 100644
index 0000000..658dc13
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/clip/outline-clip-change-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) A id='link' class='updated'",
+          "rect": [48, 108, 90, 25],
+          "reason": "chunk appeared"
+        },
+        {
+          "object": "LayoutBlockFlow HTML",
+          "rect": [48, 108, 86, 19],
+          "reason": "chunk disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/iframe-inside-squashed-layer-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/iframe-inside-squashed-layer-expected.txt
new file mode 100644
index 0000000..865abe4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/iframe-inside-squashed-layer-expected.txt
@@ -0,0 +1,67 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [785, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [785, 1016],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Squashing Containment Layer",
+      "drawsContent": false
+    },
+    {
+      "name": "LayoutBlockFlow DIV id='foo'",
+      "bounds": [200, 1000],
+      "contentsOpaque": true,
+      "backgroundColor": "#D3D3D3",
+      "transform": 1
+    },
+    {
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV)",
+      "position": [8, 0],
+      "bounds": [300, 654],
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'test1'",
+          "rect": [8, 508, 29, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'test1'",
+          "rect": [8, 508, 29, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutView #document",
+          "rect": [285, 500, 15, 150],
+          "reason": "chunk appeared"
+        }
+      ]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [8, 8, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/layer-repaint-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/layer-repaint-expected.png
new file mode 100644
index 0000000..2dbfcc49
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/layer-repaint-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/layer-repaint-rects-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/layer-repaint-rects-expected.png
new file mode 100644
index 0000000..2343e6d6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/layer-repaint-rects-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/remove-squashed-layer-plus-move-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/remove-squashed-layer-plus-move-expected.txt
new file mode 100644
index 0000000..ae328dc1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/remove-squashed-layer-plus-move-expected.txt
@@ -0,0 +1,61 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [785, 585],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [1418, 1008],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Squashing Containment Layer",
+      "drawsContent": false
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV",
+      "bounds": [1000, 1000],
+      "drawsContent": false,
+      "transform": 1
+    },
+    {
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (relative positioned) DIV class='mv-tile')",
+      "position": [8, 8],
+      "bounds": [1000, 105],
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV class='mv-tile'",
+          "rect": [0, 55, 100, 50],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV class='mv-tile'",
+          "rect": [0, 0, 100, 50],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [8, 8, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/should-not-clip-composited-overflow-scrolling-layer-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/should-not-clip-composited-overflow-scrolling-layer-expected.txt
new file mode 100644
index 0000000..c492349b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/should-not-clip-composited-overflow-scrolling-layer-expected.txt
@@ -0,0 +1,95 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "LayoutBlockFlow DIV id='container'",
+      "position": [8, 8],
+      "bounds": [400, 300]
+    },
+    {
+      "name": "Scrolling Layer",
+      "position": [8, 8],
+      "bounds": [385, 285],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "position": [8, 8],
+      "bounds": [1000, 1000],
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='content'",
+          "rect": [0, 0, 1000, 1000],
+          "reason": "background"
+        }
+      ],
+      "transform": 1
+    },
+    {
+      "name": "Overflow Controls Host Layer",
+      "position": [8, 8],
+      "bounds": [400, 300],
+      "drawsContent": false
+    },
+    {
+      "name": "Horizontal Scrollbar Layer",
+      "position": [8, 293],
+      "bounds": [385, 15],
+      "drawsContent": false,
+      "paintInvalidations": [
+        {
+          "object": "Horizontal Scrollbar Layer",
+          "rect": [0, 0, 385, 15],
+          "reason": "full layer"
+        }
+      ]
+    },
+    {
+      "name": "Vertical Scrollbar Layer",
+      "position": [393, 8],
+      "bounds": [15, 285],
+      "drawsContent": false,
+      "paintInvalidations": [
+        {
+          "object": "Vertical Scrollbar Layer",
+          "rect": [0, 0, 15, 285],
+          "reason": "full layer"
+        }
+      ]
+    },
+    {
+      "name": "Scroll Corner Layer",
+      "position": [393, 293],
+      "bounds": [15, 15]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [-500, -400, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/should-not-clip-composited-viewport-scrolling-layer-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/should-not-clip-composited-viewport-scrolling-layer-expected.txt
new file mode 100644
index 0000000..5d571984
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/should-not-clip-composited-viewport-scrolling-layer-expected.txt
@@ -0,0 +1,42 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [785, 585],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [2008, 1516],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='content'",
+          "rect": [8, 8, 2000, 1500],
+          "reason": "background"
+        }
+      ],
+      "transform": 1
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [-900, -700, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/text-color-change-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/text-color-change-expected.txt
new file mode 100644
index 0000000..23ed21cc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/text-color-change-expected.txt
@@ -0,0 +1,144 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '  Text'",
+          "rect": [8, 61, 48, 185],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/text-match-highlight-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/text-match-highlight-expected.txt
new file mode 100644
index 0000000..f7e5f434
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/text-match-highlight-expected.txt
@@ -0,0 +1,64 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Can you findme in this boring text?'",
+          "rect": [10, 135, 223, 19],
+          "reason": "DocumentMarker change"
+        },
+        {
+          "object": "InlineTextBox 'Findme on a path! Did you findme?'",
+          "rect": [20, 224, 182, 72],
+          "reason": "DocumentMarker change"
+        },
+        {
+          "object": "InlineTextBox 'Findme in a typewriter!'",
+          "rect": [10, 191, 138, 12],
+          "reason": "DocumentMarker change"
+        },
+        {
+          "object": "InlineTextBox 'findme'",
+          "rect": [278, 40, 44, 19],
+          "reason": "DocumentMarker change"
+        },
+        {
+          "object": "InlineTextBox 'findme'",
+          "rect": [264, 60, 44, 19],
+          "reason": "DocumentMarker change"
+        },
+        {
+          "object": "InlineTextBox 'findme'",
+          "rect": [220, 60, 44, 19],
+          "reason": "DocumentMarker change"
+        },
+        {
+          "object": "InlineTextBox 'findme'",
+          "rect": [89, 60, 44, 19],
+          "reason": "DocumentMarker change"
+        },
+        {
+          "object": "InlineTextBox 'findme'",
+          "rect": [51, 80, 44, 19],
+          "reason": "DocumentMarker change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/updating-scrolling-container-and-content-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/updating-scrolling-container-and-content-expected.txt
new file mode 100644
index 0000000..39c99a79
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/compositing/updating-scrolling-container-and-content-expected.txt
@@ -0,0 +1,74 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'CONTENT'",
+          "rect": [8, 258, 77, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'CONTENT'",
+          "rect": [8, 238, 77, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'CONTENT'",
+          "rect": [8, 218, 77, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'CONTENT'",
+          "rect": [8, 198, 77, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'CONTENT'",
+          "rect": [8, 178, 77, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'CONTENT'",
+          "rect": [8, 158, 77, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'CONTENT'",
+          "rect": [8, 138, 77, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'CONTENT'",
+          "rect": [8, 118, 77, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'CONTENT'",
+          "rect": [8, 278, 77, 15],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'CONTENT'",
+          "rect": [8, 108, 77, 9],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/crbug-371640-4-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/crbug-371640-4-expected.txt
new file mode 100644
index 0000000..084dd6b2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/crbug-371640-4-expected.txt
@@ -0,0 +1,54 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='keep' class='item'",
+          "rect": [408, 88, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='to_remove' class='item'",
+          "rect": [408, 88, 100, 100],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='keep' class='item'",
+          "rect": [208, 88, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [408, 88, 4, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [408, 88, 4, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [208, 88, 4, 19],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/crbug-371640-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/crbug-371640-expected.txt
new file mode 100644
index 0000000..68e2fac
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/crbug-371640-expected.txt
@@ -0,0 +1,54 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='keep' class='item'",
+          "rect": [348, 88, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='to_remove' class='item'",
+          "rect": [348, 88, 100, 100],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='keep' class='item'",
+          "rect": [88, 88, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [348, 88, 4, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [348, 88, 4, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [88, 88, 4, 19],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/flexbox/remove-inline-block-descendant-of-flex-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/flexbox/remove-inline-block-descendant-of-flex-expected.txt
new file mode 100644
index 0000000..7a69cfd
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/flexbox/remove-inline-block-descendant-of-flex-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='inline-block-2' class='item'",
+          "rect": [0, 200, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='inline-block-1' class='item'",
+          "rect": [0, 100, 100, 100],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='inline-block-2' class='item'",
+          "rect": [0, 100, 100, 100],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/flexbox/repaint-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/flexbox/repaint-expected.txt
new file mode 100644
index 0000000..fff7961
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/flexbox/repaint-expected.txt
@@ -0,0 +1,174 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='content'",
+          "rect": [138, 128, 654, 100],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='content'",
+          "rect": [148, 128, 644, 100],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean laoreet dolor id urna eleifend aliquet.'",
+          "rect": [138, 128, 636, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Nulla vel dolor ipsum. Aliquam ut turpis nisl, in vulputate sapien. Cum sociis natoque penatibus et'",
+          "rect": [138, 128, 636, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Sed volutpat, tellus vel varius vestibulum, purus quam mollis sapien, in condimentum leo neque sed'",
+          "rect": [138, 128, 636, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'magnis dis parturient montes, nascetur ridiculus mus. Sed congue magna vitae dolor feugiat vehicula.'",
+          "rect": [138, 128, 636, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'nulla. Nunc quis porta elit. Pellentesque erat lectus, ultricies a lobortis id, faucibus id quam.'",
+          "rect": [138, 128, 636, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean laoreet dolor id urna eleifend aliquet.'",
+          "rect": [148, 128, 635, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean laoreet dolor id urna eleifend aliquet.'",
+          "rect": [148, 128, 635, 99],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Nulla vel dolor ipsum. Aliquam ut turpis nisl, in vulputate sapien. Cum sociis natoque penatibus et'",
+          "rect": [148, 128, 635, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Nulla vel dolor ipsum. Aliquam ut turpis nisl, in vulputate sapien. Cum sociis natoque penatibus et'",
+          "rect": [148, 128, 635, 99],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Sed volutpat, tellus vel varius vestibulum, purus quam mollis sapien, in condimentum leo neque sed'",
+          "rect": [148, 128, 635, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Sed volutpat, tellus vel varius vestibulum, purus quam mollis sapien, in condimentum leo neque sed'",
+          "rect": [148, 128, 635, 99],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'magnis dis parturient montes, nascetur ridiculus mus. Sed congue magna vitae dolor feugiat vehicula.'",
+          "rect": [148, 128, 635, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'magnis dis parturient montes, nascetur ridiculus mus. Sed congue magna vitae dolor feugiat vehicula.'",
+          "rect": [148, 128, 635, 99],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'nulla. Nunc quis porta elit. Pellentesque erat lectus, ultricies a lobortis id, faucibus id quam.'",
+          "rect": [148, 128, 635, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'nulla. Nunc quis porta elit. Pellentesque erat lectus, ultricies a lobortis id, faucibus id quam.'",
+          "rect": [148, 128, 635, 99],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='content'",
+          "rect": [400, 128, 392, 180],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='left'",
+          "rect": [8, 228, 392, 80],
+          "reason": "incremental"
+        },
+        {
+          "object": "InlineTextBox 'Aenean laoreet dolor id urna eleifend aliquet. Nulla vel dolor'",
+          "rect": [400, 128, 391, 179],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'",
+          "rect": [400, 128, 391, 179],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Sed volutpat, tellus vel varius vestibulum, purus quam mollis'",
+          "rect": [400, 128, 391, 179],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'elit. Pellentesque erat lectus, ultricies a lobortis id, faucibus id'",
+          "rect": [400, 128, 391, 179],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'ipsum. Aliquam ut turpis nisl, in vulputate sapien. Cum sociis'",
+          "rect": [400, 128, 391, 179],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'natoque penatibus et magnis dis parturient montes, nascetur'",
+          "rect": [400, 128, 391, 179],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'quam.'",
+          "rect": [400, 128, 391, 179],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'ridiculus mus. Sed congue magna vitae dolor feugiat vehicula.'",
+          "rect": [400, 128, 391, 179],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'sapien, in condimentum leo neque sed nulla. Nunc quis porta'",
+          "rect": [400, 128, 391, 179],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='left'",
+          "rect": [148, 128, 252, 180],
+          "reason": "incremental"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='left'",
+          "rect": [8, 128, 140, 100],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/float-new-in-block-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/float-new-in-block-expected.txt
new file mode 100644
index 0000000..3e68d9d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/float-new-in-block-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (floating) DIV id='target'",
+          "rect": [8, 8, 100, 100],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/forms/details-marker-color-change-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/forms/details-marker-color-change-expected.txt
new file mode 100644
index 0000000..ddc62053
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/forms/details-marker-color-change-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Details'",
+          "rect": [24, 8, 45, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutDetailsMarker DIV id='details-marker'",
+          "rect": [8, 12, 11, 11],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/gradients-em-stops-repaint-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/gradients-em-stops-repaint-expected.txt
new file mode 100644
index 0000000..f107eda
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/gradients-em-stops-repaint-expected.txt
@@ -0,0 +1,49 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='box4' class='box'",
+          "rect": [344, 18, 302, 122],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='box3' class='box'",
+          "rect": [18, 18, 302, 122],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='indicator'",
+          "rect": [345, 19, 240, 20],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [330, 135, 4, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [330, 135, 4, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/inline-color-change-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/inline-color-change-expected.txt
new file mode 100644
index 0000000..709b4aa
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/inline-color-change-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineFlowBox",
+          "rect": [8, 72, 38, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'PASS'",
+          "rect": [8, 72, 38, 19],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/inline-reflow-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/inline-reflow-expected.txt
new file mode 100644
index 0000000..59e553a6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/inline-reflow-expected.txt
@@ -0,0 +1,159 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'A A A A A AA AA'",
+          "rect": [0, 0, 300, 200],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'A A'",
+          "rect": [0, 0, 300, 200],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'AA AA AA A A A'",
+          "rect": [0, 0, 300, 200],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'AA AA AAA AAA'",
+          "rect": [0, 0, 300, 200],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'AAA AAA AAA AA'",
+          "rect": [0, 0, 300, 200],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'AAA AAAA AAAA'",
+          "rect": [0, 0, 300, 200],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAAA AAAA AAAA'",
+          "rect": [0, 0, 300, 200],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAAA AAAAA'",
+          "rect": [0, 0, 300, 200],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAAAA AAAAA'",
+          "rect": [0, 0, 300, 200],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAAAA AAAAAAA'",
+          "rect": [0, 0, 300, 200],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'A A A A A'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'A A A A'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AA AA AA A'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AA AA AA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AA AAA AAA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AAA AAA AA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AAA AAAA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAA AAA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAA AAAAA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAAA AAAA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAAA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAAA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAAAA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAAAA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'AAAAAAA'",
+          "rect": [0, 0, 200, 300],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'A A A A A'",
+          "rect": [0, 300, 180, 20],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'A A A A A'",
+          "rect": [0, 300, 180, 20],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-1-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-1-expected.png
new file mode 100644
index 0000000..bf130ce5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-1-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-1-expected.txt
new file mode 100644
index 0000000..40df7926
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-1-expected.txt
@@ -0,0 +1,109 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'The chief difficulty Alice found at first was in managing'",
+          "rect": [14, 80, 406, 119],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'away,\n'",
+          "rect": [14, 80, 406, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'but generally, just as she had got its'",
+          "rect": [14, 80, 406, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'comfortably enough, under her arm, with its legs'",
+          "rect": [14, 80, 406, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'flamingo: she succeeded in getting its body tucked'",
+          "rect": [14, 80, 406, 119],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'hanging down,\n'",
+          "rect": [14, 80, 406, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog a blow with its head, it\n'",
+          "rect": [14, 80, 406, 119],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'her\n'",
+          "rect": [14, 80, 406, 119],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'neck nicely straightened\n'",
+          "rect": [14, 80, 406, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'out, and was going to give the'",
+          "rect": [14, 80, 406, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'away,\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'but generally, just as she had got its'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'comfortably enough, under her arm, with its legs'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'hanging down,\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'neck nicely straightened\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'out, and was going to give the'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV id='pinkFloat'",
+          "rect": [378, 138, 70, 30],
+          "reason": "incremental"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-10-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-10-expected.png
new file mode 100644
index 0000000..be38c00
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-10-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-10-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-10-expected.txt
new file mode 100644
index 0000000..afeedc0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-10-expected.txt
@@ -0,0 +1,309 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'a ridge or furrow in the way wherever\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'begin again, it was very'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'in the act of crawling away: besides all\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'provoking to find that the hedgehog had\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'she wanted to send the'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'this, there was generally'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'unrolled itself, and was'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Queen'",
+          "rect": [14, 440, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the'",
+          "rect": [14, 440, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox ' was in a furious passion, and went\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'about once in a minute.\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'about, and shouting \u2018Off with his head!\u2019 or \u2018Off with'",
+          "rect": [14, 460, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019 about once in a minute.\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'shouting \u2018Off with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping'",
+          "rect": [14, 460, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'was in a furious passion, and went\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [65, 420, 304, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [65, 420, 304, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [65, 420, 304, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [65, 420, 304, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [302, 440, 66, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 363, 48, 65],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 374, 48, 64],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-2-expected.png
new file mode 100644
index 0000000..e0cbb015
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-2-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-2-expected.txt
new file mode 100644
index 0000000..e833aa7f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-2-expected.txt
@@ -0,0 +1,499 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow P",
+          "rect": [8, 74, 418, 526],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 520, 407, 80],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 520, 407, 80],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 520, 407, 80],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 520, 407, 80],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 521, 407, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 521, 407, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 521, 407, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 521, 407, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 521, 407, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 521, 407, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'a ridge or furrow in the way wherever\n'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'begin again, it was very'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'in the act of crawling away: besides all\n'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'provoking to find that the hedgehog had\n'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'she wanted to send the'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'this, there was generally'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'unrolled itself, and was'",
+          "rect": [14, 241, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'a ridge or furrow in the way wherever\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'begin again, it was very'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'in the act of crawling away: besides all\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'provoking to find that the hedgehog had\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'she wanted to send the'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'this, there was generally'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'unrolled itself, and was'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox ' twist itself round and'",
+          "rect": [14, 181, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'could not help bursting out\n'",
+          "rect": [14, 181, 406, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'head down, and was going to\n'",
+          "rect": [14, 181, 406, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'laughing: and when she had got its'",
+          "rect": [14, 181, 406, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'look up in her face, with\n'",
+          "rect": [14, 181, 406, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'such a puzzled expression that she'",
+          "rect": [14, 181, 406, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox ' twist itself round and'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'could not help bursting out\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'head down, and was going to\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'laughing: and when she had got its'",
+          "rect": [14, 180, 406, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'look up in her face, with\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'such a puzzled expression that she'",
+          "rect": [14, 180, 406, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 361, 356, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 361, 356, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 421, 355, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [14, 421, 355, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [14, 421, 355, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [14, 421, 355, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 420, 355, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [14, 420, 355, 39],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'The chief difficulty Alice found at first was in managing'",
+          "rect": [14, 80, 354, 120],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'away,\n'",
+          "rect": [14, 80, 354, 120],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'but generally, just as she had got its'",
+          "rect": [14, 80, 354, 120],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'comfortably enough, under her arm, with its legs'",
+          "rect": [14, 80, 354, 120],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'flamingo: she succeeded in getting its body tucked'",
+          "rect": [14, 80, 354, 120],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'hanging down,\n'",
+          "rect": [14, 80, 354, 120],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog a blow with its head, it\n'",
+          "rect": [14, 80, 354, 120],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'her\n'",
+          "rect": [14, 80, 354, 120],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'neck nicely straightened\n'",
+          "rect": [14, 80, 354, 120],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'out, and was going to give the'",
+          "rect": [14, 80, 354, 120],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog a blow with its head, it\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'neck nicely straightened\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'out, and was going to give the'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'about once in a minute.\n'",
+          "rect": [14, 461, 354, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019'",
+          "rect": [14, 461, 354, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'shouting \u2018Off with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 461, 354, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and'",
+          "rect": [14, 461, 354, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'was in a furious passion, and went\n'",
+          "rect": [14, 461, 354, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'about once in a minute.\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019'",
+          "rect": [14, 460, 354, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'shouting \u2018Off with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and'",
+          "rect": [14, 460, 354, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'was in a furious passion, and went\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 401, 304, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [302, 441, 66, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [302, 440, 66, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='greenFloat'",
+          "rect": [372, 404, 48, 81],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='greenFloat'",
+          "rect": [372, 403, 48, 81],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 364, 48, 65],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 363, 48, 65],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'would'",
+          "rect": [235, 180, 45, 20],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'would'",
+          "rect": [238, 180, 40, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "VerticalScrollbar",
+          "rect": [485, 0, 15, 600],
+          "reason": "scroll control"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-3-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-3-expected.png
new file mode 100644
index 0000000..778197d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-3-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-3-expected.txt
new file mode 100644
index 0000000..92c4af04
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-3-expected.txt
@@ -0,0 +1,294 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'a ridge or furrow in the way wherever\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'begin again, it was very'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'in the act of crawling away: besides all\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'provoking to find that the hedgehog had\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'she wanted to send the'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'this, there was generally'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'unrolled itself, and was'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 400, 406, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,'",
+          "rect": [14, 400, 406, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehogs; and in\n'",
+          "rect": [14, 400, 406, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting for the'",
+          "rect": [14, 400, 406, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'about once in a minute.\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'shouting \u2018Off with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'was in a furious passion, and went\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox ' was in'",
+          "rect": [14, 440, 338, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'a furious passion, and went\n'",
+          "rect": [14, 440, 338, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'about once in a minute.\n'",
+          "rect": [14, 440, 338, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019'",
+          "rect": [14, 440, 338, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'shouting \u2018Off with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 440, 338, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and'",
+          "rect": [14, 440, 338, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting\n'",
+          "rect": [65, 400, 298, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [302, 440, 66, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [242, 440, 65, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='greenFloat'",
+          "rect": [356, 423, 64, 81],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='greenFloat'",
+          "rect": [372, 403, 48, 81],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-4-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-4-expected.png
new file mode 100644
index 0000000..27847b3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-4-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-4-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-4-expected.txt
new file mode 100644
index 0000000..8fdb2a6b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-4-expected.txt
@@ -0,0 +1,284 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'a ridge or furrow in the way wherever\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'begin again, it was very'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'in the act of crawling away: besides all\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'provoking to find that the hedgehog had\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'she wanted to send the'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'this, there was generally'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'unrolled itself, and was'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019 about once'",
+          "rect": [14, 460, 406, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'in a minute.\n'",
+          "rect": [14, 460, 406, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'shouting \u2018Off with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 460, 406, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and'",
+          "rect": [14, 460, 406, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'was in a furious passion, and went\n'",
+          "rect": [14, 460, 406, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 420, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [14, 420, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'about once in a minute.\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'shouting \u2018Off with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'was in a furious passion, and went\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [302, 440, 66, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [302, 440, 66, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='greenFloat'",
+          "rect": [372, 403, 48, 81],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-5-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-5-expected.png
new file mode 100644
index 0000000..be9b1bf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-5-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-5-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-5-expected.txt
new file mode 100644
index 0000000..c92f3d52
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-5-expected.txt
@@ -0,0 +1,314 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'a ridge or furrow in the way wherever\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'begin again, it was very'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'in the act of crawling away: besides all\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'provoking to find that the hedgehog had\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'she wanted to send the'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'this, there was generally'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'unrolled itself, and was'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [49, 360, 372, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [49, 360, 372, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 400, 356, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'for'",
+          "rect": [14, 400, 356, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehogs; and in\n'",
+          "rect": [14, 400, 356, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting for the'",
+          "rect": [14, 400, 356, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'turns,\n'",
+          "rect": [14, 400, 356, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox ' was in a'",
+          "rect": [14, 440, 354, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'furious passion, and went\n'",
+          "rect": [14, 440, 354, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019 about once'",
+          "rect": [14, 440, 354, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'in a minute.\n'",
+          "rect": [14, 440, 354, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and shouting'",
+          "rect": [14, 440, 354, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\u2018Off with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 440, 354, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'about once in a minute.\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'shouting \u2018Off with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'was in a furious passion, and went\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting\n'",
+          "rect": [49, 400, 302, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [302, 440, 66, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [245, 440, 65, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 363, 48, 65],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-6-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-6-expected.png
new file mode 100644
index 0000000..625de9b2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-6-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-6-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-6-expected.txt
new file mode 100644
index 0000000..6f72682
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-6-expected.txt
@@ -0,0 +1,149 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'a ridge or furrow in the way wherever\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'begin again, it was very'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'in the act of crawling away: besides all\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'provoking to find that the hedgehog had\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'she wanted to send the'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'this, there was generally'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'unrolled itself, and was'",
+          "rect": [14, 240, 406, 139],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 363, 48, 65],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'foo'",
+          "rect": [27, 363, 22, 20],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-7-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-7-expected.png
new file mode 100644
index 0000000..a111f37
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-7-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-7-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-7-expected.txt
new file mode 100644
index 0000000..95267ae
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-7-expected.txt
@@ -0,0 +1,74 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 420, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [14, 420, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [298, 440, 70, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [302, 440, 66, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-8-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-8-expected.png
new file mode 100644
index 0000000..58addaa
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-8-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-8-expected.txt
new file mode 100644
index 0000000..cf0c137
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-8-expected.txt
@@ -0,0 +1,459 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow P",
+          "rect": [8, 74, 418, 526],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'a ridge or furrow in the way wherever\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'a ridge or furrow in the way wherever\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'begin again, it was very'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'begin again, it was very'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'in the act of crawling away: besides all\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'in the act of crawling away: besides all\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'provoking to find that the hedgehog had\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'provoking to find that the hedgehog had\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'she wanted to send the'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'she wanted to send the'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'this, there was generally'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'this, there was generally'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'unrolled itself, and was'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'unrolled itself, and was'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox ' twist itself round and'",
+          "rect": [14, 180, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox ' twist itself round and'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'could not help bursting out\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'could not help bursting out\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'head down, and was going to\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'head down, and was going to\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'laughing: and when she had got its'",
+          "rect": [14, 180, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'laughing: and when she had got its'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'look up in her face, with\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'look up in her face, with\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'such a puzzled expression that she'",
+          "rect": [14, 180, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'such a puzzled expression that she'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'difficult game'",
+          "rect": [14, 360, 406, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'indeed.\n'",
+          "rect": [14, 360, 406, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox ' was in a furious'",
+          "rect": [14, 440, 355, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019 about once in a'",
+          "rect": [14, 440, 355, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'minute.\n'",
+          "rect": [14, 440, 355, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'passion, and went\n'",
+          "rect": [14, 440, 355, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and shouting \u2018Off'",
+          "rect": [14, 440, 355, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 440, 355, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'The chief difficulty Alice found at first was in managing'",
+          "rect": [14, 80, 354, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'The chief difficulty Alice found at first was in managing'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'away,\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'away,\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'but generally, just as she had got its'",
+          "rect": [14, 80, 354, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'but generally, just as she had got its'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'comfortably enough, under her arm, with its legs'",
+          "rect": [14, 80, 354, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'comfortably enough, under her arm, with its legs'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'flamingo: she succeeded in getting its body tucked'",
+          "rect": [14, 80, 354, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'flamingo: she succeeded in getting its body tucked'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'hanging down,\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'hanging down,\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog a blow with its head, it\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog a blow with its head, it\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'her\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'her\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'neck nicely straightened\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'neck nicely straightened\n'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'out, and was going to give the'",
+          "rect": [14, 80, 354, 119],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'out, and was going to give the'",
+          "rect": [14, 80, 354, 119],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'about once in a minute.\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'shouting \u2018Off with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'was in a furious passion, and went\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 400, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'and in\n'",
+          "rect": [14, 400, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,'",
+          "rect": [14, 400, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting for the hedgehogs;'",
+          "rect": [14, 400, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting\n'",
+          "rect": [14, 400, 297, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [184, 440, 68, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [302, 440, 66, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 363, 48, 65],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'would'",
+          "rect": [238, 180, 40, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'would'",
+          "rect": [238, 180, 40, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-9-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-9-expected.png
new file mode 100644
index 0000000..2b4f4b0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-9-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-9-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-9-expected.txt
new file mode 100644
index 0000000..e15507f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/line-flow-with-floats-9-expected.txt
@@ -0,0 +1,399 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'become of\n'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'had any dispute with the Queen, but she knew that it might'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'happen any minute, \u2018and then,\u2019 thought she, \u2018what would'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'me? They\u2019re dreadfully fond of beheading people'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 520, 407, 80],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'yet'",
+          "rect": [14, 520, 407, 80],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'a ridge or furrow in the way wherever\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'and was in the act of crawling away: besides all\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'begin again, it was very'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'begin again, it was very'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'ground, Alice soon came to the conclusion that it was a very'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'in the act of crawling away: besides all\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'provoking to find that the hedgehog had\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'provoking to find that the hedgehog had\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'she wanted to send the'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'she'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soldiers were always'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'soldiers'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'soon came to the conclusion that it was a very\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the ground, Alice'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'there was generally a ridge or furrow in the way wherever\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'this, there was generally'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'this,'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'unrolled itself, and was'",
+          "rect": [14, 240, 406, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'unrolled itself,'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'wanted to send the hedgehog to, and, as the doubled-up\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'were always getting up and walking off to other parts of\n'",
+          "rect": [14, 240, 406, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox ' twist itself round and'",
+          "rect": [14, 180, 406, 79],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'could not help bursting out\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'could not help bursting out\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'head down, and was going to\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'head down, and was going to\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'laughing: and when she had got its'",
+          "rect": [14, 180, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'laughing: and when she had got its'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'look up in her face, with\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'look up in her face, with\n'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'such a puzzled expression that she'",
+          "rect": [14, 180, 406, 79],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'such a puzzled expression that she'",
+          "rect": [14, 180, 406, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'difficult'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'game indeed.\n'",
+          "rect": [65, 360, 356, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Queen'",
+          "rect": [14, 440, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the'",
+          "rect": [14, 440, 355, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [14, 420, 355, 39],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox ' was in a furious passion, and went\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'about once in a minute.\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'about, and shouting \u2018Off with his head!\u2019 or \u2018Off with'",
+          "rect": [14, 460, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019 about once in a minute.\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'her head!\u2019'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'shouting \u2018Off with his head!\u2019 or \u2018Off with\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping about, and'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'stamping'",
+          "rect": [14, 460, 354, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'was in a furious passion, and went\n'",
+          "rect": [14, 460, 354, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'a very short time '",
+          "rect": [65, 420, 304, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'for the hedgehogs; and in\n'",
+          "rect": [65, 420, 304, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'for turns,\n'",
+          "rect": [65, 420, 304, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'quarrelling all the while, and fighting'",
+          "rect": [65, 420, 304, 39],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'The players all played at once without waiting'",
+          "rect": [65, 400, 304, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'difficult game indeed.\n'",
+          "rect": [65, 380, 142, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the Queen'",
+          "rect": [302, 440, 66, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 383, 48, 65],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='blueFloat'",
+          "rect": [14, 363, 48, 65],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) SPAN id='yellowFloat'",
+          "rect": [372, 243, 48, 49],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/lines-with-layout-delta-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/lines-with-layout-delta-expected.txt
new file mode 100644
index 0000000..40e2f8c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/lines-with-layout-delta-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'PASS'",
+          "rect": [8, 58, 38, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'FAIL'",
+          "rect": [8, 58, 35, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/list-marker-2-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/list-marker-2-expected.txt
new file mode 100644
index 0000000..2f63d9c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/list-marker-2-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutImage IMG id='target'",
+          "rect": [48, 100, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutListMarker (anonymous)",
+          "rect": [30, 185, 7, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutListMarker (anonymous)",
+          "rect": [30, 135, 7, 19],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/make-children-non-inline-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/make-children-non-inline-expected.txt
new file mode 100644
index 0000000..b56469a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/make-children-non-inline-expected.txt
@@ -0,0 +1,119 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'about all the stuff'",
+          "rect": [8, 264, 110, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'about all the stuff'",
+          "rect": [8, 164, 110, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'write a book'",
+          "rect": [8, 144, 79, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'write a book'",
+          "rect": [8, 144, 79, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'more words.'",
+          "rect": [8, 104, 79, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'more words.'",
+          "rect": [8, 104, 79, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'that comes'",
+          "rect": [8, 284, 67, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'that comes'",
+          "rect": [8, 184, 67, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'the break.'",
+          "rect": [8, 324, 62, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'the break.'",
+          "rect": [8, 224, 62, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'I could'",
+          "rect": [8, 124, 44, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'I could'",
+          "rect": [8, 124, 44, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'words,'",
+          "rect": [8, 84, 43, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'words,'",
+          "rect": [8, 84, 43, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Word,'",
+          "rect": [8, 64, 39, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Word,'",
+          "rect": [8, 64, 39, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'after'",
+          "rect": [8, 304, 29, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'after'",
+          "rect": [8, 204, 29, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [8, 164, 10, 100],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/non-text-link-invalidation-optimization-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/non-text-link-invalidation-optimization-expected.txt
new file mode 100644
index 0000000..bdea3add
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/non-text-link-invalidation-optimization-expected.txt
@@ -0,0 +1,54 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox ' text is invalidated and '",
+          "rect": [164, 8, 145, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox ' passes if '",
+          "rect": [75, 8, 61, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'This test '",
+          "rect": [8, 8, 57, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox ' images.'",
+          "rect": [353, 8, 52, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'only'",
+          "rect": [136, 8, 28, 19],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox ' no '",
+          "rect": [319, 8, 24, 19],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/offset-change-wrong-invalidation-with-float-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/offset-change-wrong-invalidation-with-float-expected.txt
new file mode 100644
index 0000000..b013a4b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/offset-change-wrong-invalidation-with-float-expected.txt
@@ -0,0 +1,52 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) UL id='submenu'",
+          "rect": [48, 94, 40, 20],
+          "reason": "chunk disappeared"
+        }
+      ]
+    },
+    {
+      "name": "LayoutListItem (floating) LI id='watches'",
+      "position": [30, 44],
+      "bounds": [7, 19]
+    },
+    {
+      "name": "LayoutInline (relative positioned) SPAN id='placeholder'",
+      "position": [48, 44],
+      "drawsContent": false,
+      "backfaceVisibility": "hidden"
+    },
+    {
+      "name": "LayoutListItem (relative positioned) (floating) LI id='menu'",
+      "position": [30, 44],
+      "bounds": [7, 19],
+      "paintInvalidations": [
+        {
+          "object": "LayoutListMarker (anonymous)",
+          "rect": [0, 0, 7, 19],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/focus-continuations-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/focus-continuations-expected.txt
new file mode 100644
index 0000000..1faf896
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/focus-continuations-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutInline SPAN id='outer'",
+          "rect": [7, 87, 88, 22],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/focus-enable-continuations-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/focus-enable-continuations-expected.txt
new file mode 100644
index 0000000..5fc57cc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/focus-enable-continuations-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutInline SPAN id='outer'",
+          "rect": [7, 87, 88, 22],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/focus-ring-on-child-move-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/focus-ring-on-child-move-expected.txt
new file mode 100644
index 0000000..88b172f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/focus-ring-on-child-move-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV",
+          "rect": [99, 49, 302, 302],
+          "reason": "outline"
+        },
+        {
+          "object": "LayoutBlockFlow (positioned) DIV id='child'",
+          "rect": [300, 50, 20, 300],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (positioned) DIV id='child'",
+          "rect": [150, 50, 20, 300],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/focus-ring-on-continuation-move-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/focus-ring-on-continuation-move-expected.txt
new file mode 100644
index 0000000..24c2846c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/focus-ring-on-continuation-move-expected.txt
@@ -0,0 +1,44 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutInline SPAN",
+          "rect": [207, 231, 102, 102],
+          "reason": "outline"
+        },
+        {
+          "object": "LayoutInline SPAN",
+          "rect": [7, 231, 102, 102],
+          "reason": "outline"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV id='block'",
+          "rect": [208, 232, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV id='block'",
+          "rect": [8, 232, 100, 100],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/focus-ring-on-inline-continuation-move-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/focus-ring-on-inline-continuation-move-expected.txt
new file mode 100644
index 0000000..219a51f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/focus-ring-on-inline-continuation-move-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutInline SPAN",
+          "rect": [7, 7, 102, 182],
+          "reason": "outline"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV id='block'",
+          "rect": [8, 88, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV id='block'",
+          "rect": [8, 8, 100, 100],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/inline-focus-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/inline-focus-expected.txt
new file mode 100644
index 0000000..ba741db
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/inline-focus-expected.txt
@@ -0,0 +1,49 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'crbug.com/424078: ensure inline elements get their outline painted'",
+          "rect": [0, 36, 418, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'crbug.com/424078: ensure inline elements get their outline painted'",
+          "rect": [0, 36, 418, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutInline A id='link'",
+          "rect": [585, 0, 215, 233],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Home'",
+          "rect": [0, 0, 39, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Home'",
+          "rect": [0, 0, 39, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/inline-outline-repaint-2-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/inline-outline-repaint-2-expected.txt
new file mode 100644
index 0000000..350810f8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/inline-outline-repaint-2-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutInline SPAN",
+          "rect": [210, 0, 50, 15],
+          "reason": "outline"
+        },
+        {
+          "object": "InlineTextBox 'Test'",
+          "rect": [215, 0, 40, 10],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/outline-change-invalidation-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/outline-change-invalidation-expected.txt
new file mode 100644
index 0000000..a87c2c4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/outline-change-invalidation-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow A id='link'",
+          "rect": [43, 83, 754, 30],
+          "reason": "appeared"
+        },
+        {
+          "object": "LayoutListMarker (anonymous)",
+          "rect": [30, 88, 7, 19],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/outline-containing-image-in-non-standard-mode-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/outline-containing-image-in-non-standard-mode-expected.txt
new file mode 100644
index 0000000..74a8f125
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/outline-containing-image-in-non-standard-mode-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutInline SPAN id='target'",
+          "rect": [6, 6, 204, 58],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutImage IMG",
+          "rect": [8, 8, 200, 50],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/outline-continuations-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/outline-continuations-expected.txt
new file mode 100644
index 0000000..655ab04
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/outline/outline-continuations-expected.txt
@@ -0,0 +1,49 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutInline SPAN id='outer'",
+          "rect": [16, 108, 90, 63],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'CONTENTS'",
+          "rect": [18, 150, 86, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'CONTENTS'",
+          "rect": [18, 150, 86, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'CONTENTS'",
+          "rect": [18, 110, 86, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'CONTENTS'",
+          "rect": [18, 110, 86, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/float-overflow-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/float-overflow-expected.txt
new file mode 100644
index 0000000..edc2ece
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/float-overflow-expected.txt
@@ -0,0 +1,574 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 537, 62, 37],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 531, 62, 37],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 498, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 492, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 459, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 453, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 420, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 414, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutDeprecatedFlexibleBox DIV class='outer box'",
+          "rect": [61, 249, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutDeprecatedFlexibleBox DIV class='outer box'",
+          "rect": [61, 243, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutDeprecatedFlexibleBox DIV class='outer box'",
+          "rect": [61, 210, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutDeprecatedFlexibleBox DIV class='outer box'",
+          "rect": [61, 204, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 171, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 165, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 132, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 126, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 93, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 87, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 54, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 48, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 15, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [61, 9, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [61, 366, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [61, 360, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [61, 327, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [61, 321, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [61, 288, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [61, 282, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 504, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 498, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 465, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 459, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 426, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 420, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 216, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 210, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 177, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 171, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 138, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 132, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 99, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 93, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 60, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 54, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 21, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 15, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [69, 374, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [69, 368, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [69, 335, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [69, 329, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [69, 296, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [69, 290, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [70, 375, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [70, 369, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [70, 336, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [70, 330, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [70, 297, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [70, 291, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [67, 138, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [67, 132, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [65, 60, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [65, 54, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [65, 21, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [65, 15, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 543, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 537, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 504, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 498, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 465, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 459, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 426, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 420, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 255, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 249, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 216, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 210, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 177, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 171, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 99, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [59, 93, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 543, 32, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [67, 537, 32, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [66, 299, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [66, 293, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [63, 23, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [63, 17, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 545, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 539, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 506, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 500, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 467, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 461, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 428, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 422, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 257, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 251, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 218, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 212, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 179, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 173, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 140, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [59, 134, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [58, 377, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [58, 371, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [58, 338, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [58, 332, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [57, 101, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [57, 95, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [57, 62, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [57, 56, 16, 17],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/float-overflow-right-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/float-overflow-right-expected.txt
new file mode 100644
index 0000000..63c1af7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/float-overflow-right-expected.txt
@@ -0,0 +1,574 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 537, 62, 37],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 531, 62, 37],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 498, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 492, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 459, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 453, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 420, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 414, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutDeprecatedFlexibleBox DIV class='outer box'",
+          "rect": [677, 249, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutDeprecatedFlexibleBox DIV class='outer box'",
+          "rect": [677, 243, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutDeprecatedFlexibleBox DIV class='outer box'",
+          "rect": [677, 210, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutDeprecatedFlexibleBox DIV class='outer box'",
+          "rect": [677, 204, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 171, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 165, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 132, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 126, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 93, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 87, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 54, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 48, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 15, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='outer'",
+          "rect": [677, 9, 62, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [681, 366, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [681, 360, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [681, 327, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [681, 321, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [681, 288, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTable TABLE class='outer'",
+          "rect": [681, 282, 58, 28],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 504, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 498, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 465, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 459, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 426, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 420, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 216, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 210, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 177, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 171, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 138, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 132, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 99, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 93, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 60, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 54, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 21, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [683, 15, 50, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [689, 374, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [689, 368, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [689, 335, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [689, 329, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [689, 296, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [689, 290, 42, 12],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 543, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 537, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 504, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 498, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 465, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 459, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 426, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 420, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 255, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 249, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 216, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 210, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 177, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 171, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 99, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [701, 93, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [695, 60, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [695, 54, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [695, 21, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [695, 15, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [693, 138, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [693, 132, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [690, 375, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [690, 369, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [690, 336, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [690, 330, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [690, 297, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV",
+          "rect": [690, 291, 40, 10],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [701, 543, 32, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [701, 537, 32, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [727, 101, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [727, 95, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [727, 62, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [727, 56, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [726, 377, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [726, 371, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [726, 338, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [726, 332, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 545, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 539, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 506, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 500, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 467, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 461, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 428, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 422, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 257, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 251, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 218, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 212, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 179, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 173, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 140, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [725, 134, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [721, 23, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [721, 17, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [718, 299, 16, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [718, 293, 16, 17],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/inline-overflow-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/inline-overflow-expected.txt
new file mode 100644
index 0000000..cb8bea1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/inline-overflow-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'A\u00A0\u00A0B'",
+          "rect": [33, 33, 250, 100],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/inline-vertical-lr-overflow-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/inline-vertical-lr-overflow-expected.txt
new file mode 100644
index 0000000..0fd8254f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/inline-vertical-lr-overflow-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'A\u00A0\u00A0B'",
+          "rect": [33, 33, 100, 250],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/inline-vertical-rl-overflow-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/inline-vertical-rl-overflow-expected.txt
new file mode 100644
index 0000000..9a3e928
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/inline-vertical-rl-overflow-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'A\u00A0\u00A0B'",
+          "rect": [667, 33, 100, 250],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/line-overflow-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/line-overflow-expected.txt
new file mode 100644
index 0000000..64055976
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/line-overflow-expected.txt
@@ -0,0 +1,114 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox ' eleifend'",
+          "rect": [8, 122, 195, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'convallis.'",
+          "rect": [8, 122, 195, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'lacus, at sagittis eros leo'",
+          "rect": [8, 122, 195, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'pulvinar velit. Integer'",
+          "rect": [8, 122, 195, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'sollicitudin nisi ut urna blandit'",
+          "rect": [8, 122, 195, 99],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox ' eleifend lacus,'",
+          "rect": [8, 142, 195, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'at sagittis eros leo pulvinar'",
+          "rect": [8, 142, 195, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'urna blandit convallis.'",
+          "rect": [8, 142, 195, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'velit. Integer sollicitudin nisi ut'",
+          "rect": [8, 142, 195, 79],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Cras faucibus. Nunc'",
+          "rect": [8, 82, 192, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'adipiscing, enim in scelerisque'",
+          "rect": [8, 82, 192, 59],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'augue '",
+          "rect": [8, 82, 192, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'augue'",
+          "rect": [8, 82, 192, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'convallis,\n'",
+          "rect": [8, 82, 192, 59],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'convallis,\n'",
+          "rect": [8, 82, 192, 59],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineFlowBox",
+          "rect": [114, 92, 35, 49],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'purus'",
+          "rect": [114, 122, 35, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'purus'",
+          "rect": [38, 142, 35, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/negative-text-indent-with-overflow-hidden-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/negative-text-indent-with-overflow-hidden-expected.txt
new file mode 100644
index 0000000..933e54c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/negative-text-indent-with-overflow-hidden-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='target' class='changed'",
+          "rect": [550, 8, 200, 50],
+          "reason": "background"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/opacity-change-on-overflow-float-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/opacity-change-on-overflow-float-expected.txt
new file mode 100644
index 0000000..8a5731b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/overflow/opacity-change-on-overflow-float-expected.txt
@@ -0,0 +1,54 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow HTML",
+          "rect": [8, 8, 761, 59],
+          "reason": "chunk appeared"
+        },
+        {
+          "object": "LayoutBlockFlow HTML",
+          "rect": [8, 8, 761, 59],
+          "reason": "chunk disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV class='green'",
+          "rect": [8, 84, 100, 100],
+          "reason": "chunk disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow (floating) DIV class='red'",
+          "rect": [8, 84, 100, 100],
+          "reason": "chunk appeared"
+        },
+        {
+          "object": "LayoutBlockFlow HTML",
+          "rect": [8, 84, 100, 100],
+          "reason": "chunk appeared"
+        },
+        {
+          "object": "LayoutBlockFlow HTML",
+          "rect": [8, 84, 100, 100],
+          "reason": "chunk disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/paint-invalidation-with-reparent-across-frame-boundaries-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/paint-invalidation-with-reparent-across-frame-boundaries-expected.txt
new file mode 100644
index 0000000..876f614
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/paint-invalidation-with-reparent-across-frame-boundaries-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow HTML",
+          "rect": [18, 18, 22, 19],
+          "reason": "chunk disappeared"
+        },
+        {
+          "object": "InlineTextBox 'abc'",
+          "rect": [8, 187, 22, 19],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/position/abspos-shift-image-incorrect-repaint-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/position/abspos-shift-image-incorrect-repaint-expected.txt
new file mode 100644
index 0000000..94562dc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/position/abspos-shift-image-incorrect-repaint-expected.txt
@@ -0,0 +1,49 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 585],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [1250, 585],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutImage IMG",
+          "rect": [704, 0, 214, 232],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutImage IMG",
+          "rect": [454, 0, 214, 232],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutImage IMG",
+          "rect": [0, 0, 214, 232],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [700, 217, 4, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [450, 217, 4, 19],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/position/inline-relative-positioned-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/position/inline-relative-positioned-expected.txt
new file mode 100644
index 0000000..2a20486
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/position/inline-relative-positioned-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'a'",
+          "rect": [8, 88, 100, 100],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'p'",
+          "rect": [8, 88, 100, 100],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [8, 88, 100, 100],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/position/layout-state-relative-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/position/layout-state-relative-expected.txt
new file mode 100644
index 0000000..7eb3a55
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/position/layout-state-relative-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'PASS'",
+          "rect": [8, 152, 38, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'FAIL'",
+          "rect": [8, 152, 35, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/position/layoutstate-invalid-invalidation-inline-relative-positioned-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/position/layoutstate-invalid-invalidation-inline-relative-positioned-expected.txt
new file mode 100644
index 0000000..172fb0919
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/position/layoutstate-invalid-invalidation-inline-relative-positioned-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [8, 220, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'x'",
+          "rect": [8, 200, 100, 100],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/position/positioned-document-element-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/position/positioned-document-element-expected.txt
new file mode 100644
index 0000000..1e5afc6a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/position/positioned-document-element-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#008000"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#008000",
+      "paintInvalidations": [
+        {
+          "object": "Scrolling background of LayoutView #document",
+          "rect": [0, 0, 800, 600],
+          "reason": "background"
+        },
+        {
+          "object": "InlineTextBox 'Tests that the entire viewport is painted with a floated html element.'",
+          "rect": [108, 116, 424, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Tests that the entire viewport is painted with a floated html element.'",
+          "rect": [8, 16, 424, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/position/positioned-great-grandparent-change-location-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/position/positioned-great-grandparent-change-location-expected.txt
new file mode 100644
index 0000000..8278548d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/position/positioned-great-grandparent-change-location-expected.txt
@@ -0,0 +1,44 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV",
+          "rect": [100, 200, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (positioned) DIV",
+          "rect": [100, 100, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'Target'",
+          "rect": [100, 200, 41, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'Target'",
+          "rect": [100, 100, 41, 19],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/push-block-with-first-line-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/push-block-with-first-line-expected.txt
new file mode 100644
index 0000000..0ab0888
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/push-block-with-first-line-expected.txt
@@ -0,0 +1,44 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "RootInlineBox",
+          "rect": [8, 68, 784, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "RootInlineBox",
+          "rect": [8, 8, 784, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'JOCULAR'",
+          "rect": [8, 68, 140, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'JOCULAR'",
+          "rect": [8, 8, 140, 20],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/quotes-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/quotes-expected.txt
new file mode 100644
index 0000000..b12dca4b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/quotes-expected.txt
@@ -0,0 +1,54 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'quote 2'",
+          "rect": [17, 28, 47, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'quote 2'",
+          "rect": [16, 28, 47, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\u003E'",
+          "rect": [64, 28, 9, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '\u003C'",
+          "rect": [8, 28, 9, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '}'",
+          "rect": [63, 28, 8, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '{'",
+          "rect": [8, 28, 8, 19],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/reflection/reflection-redraw-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/reflection/reflection-redraw-expected.txt
new file mode 100644
index 0000000..4d14ecc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/reflection/reflection-redraw-expected.txt
@@ -0,0 +1,84 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'The color of this'",
+          "rect": [380, 267, 286, 59],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'should be green'",
+          "rect": [380, 267, 286, 59],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'text in the reflection'",
+          "rect": [380, 267, 286, 59],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'The color of this'",
+          "rect": [70, 267, 286, 59],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'should be green'",
+          "rect": [70, 267, 286, 59],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'text in the reflection'",
+          "rect": [70, 267, 286, 59],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'The color of this'",
+          "rect": [305, 34, 126, 182],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'should be green'",
+          "rect": [305, 34, 126, 182],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'text in the reflection'",
+          "rect": [305, 34, 126, 182],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'The color of this'",
+          "rect": [305, 377, 126, 156],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'should be green'",
+          "rect": [305, 377, 126, 156],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'text in the reflection'",
+          "rect": [305, 377, 126, 156],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/reflection/reflection-with-rotation-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/reflection/reflection-with-rotation-expected.txt
new file mode 100644
index 0000000..09b3bab1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/reflection/reflection-with-rotation-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [22, 50, 226, 167],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'PASS'",
+          "rect": [23, 51, 72, 110],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'FAIL'",
+          "rect": [23, 51, 69, 109],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/remove-inline-after-layout-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/remove-inline-after-layout-expected.txt
new file mode 100644
index 0000000..7c85837b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/remove-inline-after-layout-expected.txt
@@ -0,0 +1,54 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'This span should disappear.\n'",
+          "rect": [112, 193, 178, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [290, 108, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [112, 108, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [8, 108, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [108, 193, 4, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [108, 193, 4, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/repaint-across-writing-mode-boundary-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/repaint-across-writing-mode-boundary-expected.png
new file mode 100644
index 0000000..b31eb3d8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/repaint-across-writing-mode-boundary-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/repaint-across-writing-mode-boundary-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/repaint-across-writing-mode-boundary-expected.txt
new file mode 100644
index 0000000..cca1667
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/repaint-across-writing-mode-boundary-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox '\u7B2C\u4E00\u6BB5\u843D paragraph 1'",
+          "rect": [548, 191, 23, 36],
+          "reason": "selection"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/repaint-descandant-on-ancestor-layer-move-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/repaint-descandant-on-ancestor-layer-move-expected.txt
new file mode 100644
index 0000000..a91047a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/repaint-descandant-on-ancestor-layer-move-expected.txt
@@ -0,0 +1,44 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV",
+          "rect": [428, 38, 300, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV",
+          "rect": [28, 38, 300, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'There should only be one copy of this text.'",
+          "rect": [428, 38, 270, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'There should only be one copy of this text.'",
+          "rect": [28, 38, 270, 19],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/fixed-under-composited-fixed-scrolled-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/fixed-under-composited-fixed-scrolled-expected.txt
new file mode 100644
index 0000000..3083be12
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/fixed-under-composited-fixed-scrolled-expected.txt
@@ -0,0 +1,44 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [785, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [785, 2016],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "transform": 1
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV id='fixed-container'",
+      "position": [0, 400],
+      "bounds": [785, 600],
+      "contentsOpaque": true,
+      "backfaceVisibility": "hidden",
+      "backgroundColor": "#008000",
+      "transform": 1
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [0, -400, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/inline-style-change-in-scrolled-view-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/inline-style-change-in-scrolled-view-expected.txt
new file mode 100644
index 0000000..a39f2251
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/inline-style-change-in-scrolled-view-expected.txt
@@ -0,0 +1,42 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [785, 585],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [2000, 2000],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Text Text Text Text Text Text Text Text Text Text Text Text Text'",
+          "rect": [0, 320, 413, 19],
+          "reason": "style change"
+        }
+      ],
+      "transform": 1
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [-200, -200, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/invalidate-after-composited-scroll-of-window-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/invalidate-after-composited-scroll-of-window-expected.txt
new file mode 100644
index 0000000..35cb461
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/invalidate-after-composited-scroll-of-window-expected.txt
@@ -0,0 +1,47 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [785, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [785, 4936],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Tests that invalidation of a div after scrolling invalidates just the div and no other area.'",
+          "rect": [8, 4908, 540, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [8, 2408, 100, 100],
+          "reason": "background"
+        }
+      ],
+      "transform": 1
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [0, -2350, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/layout-state-scrolloffset-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/layout-state-scrolloffset-expected.txt
new file mode 100644
index 0000000..1c0c148c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/layout-state-scrolloffset-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'before'",
+          "rect": [100, 120, 40, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'after'",
+          "rect": [100, 120, 29, 19],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/layout-state-scrolloffset2-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/layout-state-scrolloffset2-expected.txt
new file mode 100644
index 0000000..369cb30
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/layout-state-scrolloffset2-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'before'",
+          "rect": [102, 122, 40, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'after'",
+          "rect": [102, 122, 29, 19],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/layout-state-scrolloffset3-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/layout-state-scrolloffset3-expected.txt
new file mode 100644
index 0000000..71db693
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/layout-state-scrolloffset3-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'before'",
+          "rect": [100, 120, 34, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'after'",
+          "rect": [100, 120, 29, 19],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/line-in-scrolled-clipped-block-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/line-in-scrolled-clipped-block-expected.png
new file mode 100644
index 0000000..28a2876d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/line-in-scrolled-clipped-block-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/line-in-scrolled-clipped-block-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/line-in-scrolled-clipped-block-expected.txt
new file mode 100644
index 0000000..de2e3d0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/line-in-scrolled-clipped-block-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox '                         FAIL     .'",
+          "rect": [8, 8, 100, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '                         PASS     .'",
+          "rect": [8, 8, 100, 19],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/overflow-scroll-body-appear-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/overflow-scroll-body-appear-expected.txt
new file mode 100644
index 0000000..00843996
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/overflow-scroll-body-appear-expected.txt
@@ -0,0 +1,64 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [785, 585],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [2008, 2096],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Bug 36461 - No vertical scrollbar after the CSS class change'",
+          "rect": [124, 52, 383, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Bug 36461 - No vertical scrollbar after the CSS class change'",
+          "rect": [124, 52, 383, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'You should see both vertical and horizontal scrollbars.'",
+          "rect": [8, 16, 340, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'You should see both vertical and horizontal scrollbars.'",
+          "rect": [8, 16, 340, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'This is the test for '",
+          "rect": [8, 52, 116, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'This is the test for '",
+          "rect": [8, 52, 116, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '.'",
+          "rect": [507, 52, 4, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '.'",
+          "rect": [507, 52, 4, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/overflow-scroll-delete-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/overflow-scroll-delete-expected.png
new file mode 100644
index 0000000..c4905494
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/overflow-scroll-delete-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/overflow-scroll-delete-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/overflow-scroll-delete-expected.txt
new file mode 100644
index 0000000..908f08e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/scroll/overflow-scroll-delete-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Passed'",
+          "rect": [8, 136, 43, 17],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Failed'",
+          "rect": [8, 136, 39, 17],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-expected.png
new file mode 100644
index 0000000..ddf9523
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-expected.txt
new file mode 100644
index 0000000..57e82bed
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'xx'",
+          "rect": [8, 8, 48, 33],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'y'",
+          "rect": [8, 8, 48, 33],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.png
new file mode 100644
index 0000000..966209a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.txt
new file mode 100644
index 0000000..850b0d9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-for-rtl-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'xx'",
+          "rect": [0, 8, 40, 33],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'y'",
+          "rect": [0, 8, 40, 33],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.png
new file mode 100644
index 0000000..ab06e15
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.txt
new file mode 100644
index 0000000..2d8f395
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-lr-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'xx'",
+          "rect": [8, 8, 33, 48],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'y'",
+          "rect": [8, 8, 33, 48],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.png
new file mode 100644
index 0000000..e9463718
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.txt
new file mode 100644
index 0000000..b47e41da
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-includes-newline-for-vertical-rl-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'xx'",
+          "rect": [7, 8, 33, 48],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'y'",
+          "rect": [7, 8, 33, 48],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.png
new file mode 100644
index 0000000..5e142e1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.txt
new file mode 100644
index 0000000..b98e7f3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/invalidation-rect-with-br-includes-newline-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'b'",
+          "rect": [8, 24, 32, 17],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [24, 8, 16, 16],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'a'",
+          "rect": [8, 8, 16, 16],
+          "reason": "selection"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/japanese-rl-selection-clear-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/japanese-rl-selection-clear-expected.txt
new file mode 100644
index 0000000..2cee848
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/japanese-rl-selection-clear-expected.txt
@@ -0,0 +1,94 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox '\u3042\u3063\u305F\u304B\u5FD8\u308C\u3066\u3057\u307E\u3063\u305F\u7D4C\u9A13\u306F\u3042\u308A\u307E\u3059\u304B'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u3057\u305F\u30A6\u30A7\u30D6\u30DA\u30FC\u30B8\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u304B\u3089\u3082\u691C\u7D22'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u3059\u3002\u8A2A\u554F\u3057\u305F\u30A6\u30A7\u30D6\u30DA\u30FC\u30B8\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u304B'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\u305B\u3063\u304B\u304F\u898B\u3064\u3051\u305F\u3059'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u305B\u3063\u304B\u304F\u898B\u3064\u3051\u305F\u3059\u3070\u3089\u3057\u3044\u8A18\u4E8B\u304C\u3069\u3053\u306B'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u3063\u305F\u7D4C\u9A13\u306F\u3042\u308A\u307E\u3059\u304B \u306A\u3089\u30BF\u30A4\u30C8\u30EB\u3068\u30A2'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u3064\u3051\u305F\u3059\u3070\u3089\u3057\u3044\u8A18\u4E8B\u304C\u3069\u3053\u306B\u3042\u3063\u305F\u304B\u5FD8'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u306A\u3089\u30BF\u30A4\u30C8\u30EB\u3068\u30A2\u30C9\u30EC\u30B9\u3060\u3051\u3067\u306A\u304F\u3001\u8A2A\u554F'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u304B\u3089\u3082\u691C\u7D22\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u3070\u3089\u3057\u3044\u8A18\u4E8B\u304C\u3069\u3053\u306B\u3042\u3063\u305F\u304B\u5FD8\u308C\u3066\u3057\u307E'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u3089\u3082\u691C\u7D22\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\u305B\u3063\u304B\u304F\u898B'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u308C\u3066\u3057\u307E\u3063\u305F\u7D4C\u9A13\u306F\u3042\u308A\u307E\u3059\u304B \u306A\u3089\u30BF\u30A4'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u30C8\u30EB\u3068\u30A2\u30C9\u30EC\u30B9\u3060\u3051\u3067\u306A\u304F\u3001\u8A2A\u554F'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '\u30C9\u30EC\u30B9\u3060\u3051\u3067\u306A\u304F\u3001\u8A2A\u554F\u3057\u305F\u30A6\u30A7\u30D6\u30DA\u30FC\u30B8'",
+          "rect": [334, 123, 441, 404],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-change-in-iframe-with-relative-parent-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-change-in-iframe-with-relative-parent-expected.txt
new file mode 100644
index 0000000..1021dc8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-change-in-iframe-with-relative-parent-expected.txt
@@ -0,0 +1,64 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Bazz'",
+          "rect": [18, 238, 40, 10],
+          "reason": "selection"
+        },
+        {
+          "object": "InlineTextBox 'Bar'",
+          "rect": [18, 218, 30, 10],
+          "reason": "selection"
+        },
+        {
+          "object": "InlineTextBox 'Foo'",
+          "rect": [18, 198, 30, 10],
+          "reason": "selection"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [58, 238, 10, 10],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [48, 218, 10, 10],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [48, 198, 10, 10],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [18, 228, 10, 10],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [18, 208, 10, 10],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-clear-after-move-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-clear-after-move-expected.txt
new file mode 100644
index 0000000..7c59e0e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-clear-after-move-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutImage IMG",
+          "rect": [100, 300, 50, 50],
+          "reason": "selection"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-partial-invalidation-between-blocks-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-partial-invalidation-between-blocks-expected.png
new file mode 100644
index 0000000..e68545a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-partial-invalidation-between-blocks-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-partial-invalidation-between-blocks-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-partial-invalidation-between-blocks-expected.txt
new file mode 100644
index 0000000..73e41f2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-partial-invalidation-between-blocks-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Second cell'",
+          "rect": [11, 35, 73, 19],
+          "reason": "selection"
+        },
+        {
+          "object": "InlineTextBox 'First cell'",
+          "rect": [11, 11, 58, 19],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-rl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-rl-expected.png
new file mode 100644
index 0000000..7d9d8c7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-rl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-rl-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-rl-expected.txt
new file mode 100644
index 0000000..e1842b49
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-rl-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Testing both hit testing'",
+          "rect": [773, 38, 19, 83],
+          "reason": "selection"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-within-composited-scroller-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-within-composited-scroller-expected.png
new file mode 100644
index 0000000..54f342d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-within-composited-scroller-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-within-composited-scroller-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-within-composited-scroller-expected.txt
new file mode 100644
index 0000000..8bb3ab9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/selection-within-composited-scroller-expected.txt
@@ -0,0 +1,84 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "LayoutBlockFlow DIV id='scroller'",
+      "position": [8, 8],
+      "bounds": [200, 200],
+      "backgroundColor": "#D3D3D3"
+    },
+    {
+      "name": "Scrolling Layer",
+      "position": [8, 8],
+      "bounds": [185, 185],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "position": [8, 8],
+      "bounds": [200, 1620],
+      "contentsOpaque": true,
+      "backgroundColor": "#D3D3D3",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'test'",
+          "rect": [0, 610, 21, 19],
+          "reason": "selection"
+        }
+      ],
+      "transform": 1
+    },
+    {
+      "name": "Overflow Controls Host Layer",
+      "position": [8, 8],
+      "bounds": [200, 200],
+      "drawsContent": false
+    },
+    {
+      "name": "Horizontal Scrollbar Layer",
+      "position": [8, 193],
+      "bounds": [185, 15],
+      "drawsContent": false
+    },
+    {
+      "name": "Vertical Scrollbar Layer",
+      "position": [193, 8],
+      "bounds": [15, 185],
+      "drawsContent": false
+    },
+    {
+      "name": "Scroll Corner Layer",
+      "position": [193, 193],
+      "bounds": [15, 15]
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [0, -450, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/text-selection-rect-in-overflow-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/text-selection-rect-in-overflow-2-expected.png
new file mode 100644
index 0000000..4723cde
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/text-selection-rect-in-overflow-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/text-selection-rect-in-overflow-2-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/text-selection-rect-in-overflow-2-expected.txt
new file mode 100644
index 0000000..eceac54
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/text-selection-rect-in-overflow-2-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Should have blue, not gray, highlight'",
+          "rect": [18, 18, 233, 19],
+          "reason": "selection"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/text-selection-rect-in-overflow-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/text-selection-rect-in-overflow-expected.txt
new file mode 100644
index 0000000..f3061bc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/selection/text-selection-rect-in-overflow-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Should have green background'",
+          "rect": [8, 8, 197, 19],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/stacked-diacritics-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/stacked-diacritics-expected.txt
new file mode 100644
index 0000000..8167057f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/stacked-diacritics-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox '\u1EA6\u1EA4\u1EAA\u1EA8\u1EB0'",
+          "rect": [19, 166, 130, 43],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/subtree-root-skipped-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/subtree-root-skipped-expected.txt
new file mode 100644
index 0000000..5f434dd
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/subtree-root-skipped-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'PASS'",
+          "rect": [10, 11, 35, 16],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'FAIL'",
+          "rect": [10, 11, 27, 16],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutBlockFlow (positioned) DIV id='div'",
+          "rect": [8, 288, 10, 20],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/absolute-sized-content-with-resources-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/absolute-sized-content-with-resources-expected.txt
new file mode 100644
index 0000000..6911b9f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/absolute-sized-content-with-resources-expected.txt
@@ -0,0 +1,49 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 52, 402, 402],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGRect rect",
+          "rect": [42, 119, 334, 268],
+          "reason": "paint property change"
+        },
+        {
+          "object": "LayoutSVGRect rect",
+          "rect": [42, 119, 334, 268],
+          "reason": "paint property change"
+        },
+        {
+          "object": "LayoutSVGRect rect",
+          "rect": [17, 219, 84, 68],
+          "reason": "paint property change"
+        },
+        {
+          "object": "LayoutSVGRect rect",
+          "rect": [17, 219, 84, 68],
+          "reason": "paint property change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/add-background-property-on-root-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/add-background-property-on-root-expected.txt
new file mode 100644
index 0000000..a15d4d8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/add-background-property-on-root-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [8, 8, 100, 100],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutSVGRoot svg",
+          "rect": [8, 8, 100, 100],
+          "reason": "chunk appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png
new file mode 100644
index 0000000..d90c6e3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/animated-path-inside-transformed-html-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/hit-test-with-br-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/hit-test-with-br-expected.png
new file mode 100644
index 0000000..913572e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/hit-test-with-br-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/object-sizing-no-width-height-change-content-box-size-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/object-sizing-no-width-height-change-content-box-size-expected.txt
new file mode 100644
index 0000000..05c6287
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/object-sizing-no-width-height-change-content-box-size-expected.txt
@@ -0,0 +1,44 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 8, 402, 402],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutEmbeddedObject object",
+          "rect": [9, 9, 400, 400],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGRoot svg",
+          "rect": [9, 9, 400, 400],
+          "reason": "paint property change"
+        },
+        {
+          "object": "LayoutSVGRoot svg",
+          "rect": [9, 109, 200, 200],
+          "reason": "paint property change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-content-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-content-expected.txt
new file mode 100644
index 0000000..7b64d4d8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-content-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 72, 402, 402],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGRect rect id='targetRect'",
+          "rect": [9, 73, 400, 400],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGRoot svg",
+          "rect": [109, 73, 300, 400],
+          "reason": "incremental"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-content-with-resources-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-content-with-resources-expected.txt
new file mode 100644
index 0000000..48ce931
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-content-with-resources-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 72, 402, 402],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGRoot svg",
+          "rect": [47, 111, 324, 324],
+          "reason": "paint property change"
+        },
+        {
+          "object": "LayoutSVGRoot svg",
+          "rect": [8, 154, 102, 238],
+          "reason": "paint property change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-deep-shadow-tree-content-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-deep-shadow-tree-content-expected.txt
new file mode 100644
index 0000000..8f37782
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-deep-shadow-tree-content-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 72, 402, 402],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGContainer g id='targetUse'",
+          "rect": [209, 273, 200, 200],
+          "reason": "paint property change"
+        },
+        {
+          "object": "LayoutSVGContainer g id='targetUse'",
+          "rect": [59, 273, 50, 200],
+          "reason": "paint property change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-image-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-image-expected.txt
new file mode 100644
index 0000000..55d807ff
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-image-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 72, 402, 402],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGImage image",
+          "rect": [9, 73, 400, 400],
+          "reason": "image"
+        },
+        {
+          "object": "LayoutSVGRoot svg",
+          "rect": [109, 73, 300, 400],
+          "reason": "incremental"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-inner-svg-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-inner-svg-expected.txt
new file mode 100644
index 0000000..8abf99f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-inner-svg-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 52, 402, 402],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGViewportContainer svg",
+          "rect": [27, 69, 364, 366],
+          "reason": "paint property change"
+        },
+        {
+          "object": "LayoutSVGViewportContainer svg",
+          "rect": [13, 207, 92, 92],
+          "reason": "paint property change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-shadow-tree-content-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-shadow-tree-content-expected.txt
new file mode 100644
index 0000000..c91bd35
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-shadow-tree-content-expected.txt
@@ -0,0 +1,49 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 72, 402, 402],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGContainer use",
+          "rect": [209, 273, 200, 200],
+          "reason": "paint property change"
+        },
+        {
+          "object": "LayoutSVGRect rect id='targetRect1'",
+          "rect": [9, 73, 200, 200],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGRect rect id='targetRect1'",
+          "rect": [59, 73, 150, 200],
+          "reason": "incremental"
+        },
+        {
+          "object": "LayoutSVGContainer use",
+          "rect": [59, 273, 50, 200],
+          "reason": "paint property change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-shadow-tree-content-with-symbol-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-shadow-tree-content-with-symbol-expected.txt
new file mode 100644
index 0000000..992ee3c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-shadow-tree-content-with-symbol-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 72, 402, 402],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGViewportContainer svg id='targetSymbol'",
+          "rect": [9, 73, 400, 400],
+          "reason": "paint property change"
+        },
+        {
+          "object": "LayoutSVGViewportContainer svg id='targetSymbol'",
+          "rect": [9, 223, 100, 100],
+          "reason": "paint property change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-use-on-symbol-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-use-on-symbol-expected.txt
new file mode 100644
index 0000000..4289b03
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-use-on-symbol-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 52, 402, 402],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGViewportContainer svg id='gamesBorder'",
+          "rect": [45, 87, 328, 330],
+          "reason": "paint property change"
+        },
+        {
+          "object": "LayoutSVGViewportContainer svg id='gamesBorder'",
+          "rect": [18, 211, 82, 83],
+          "reason": "paint property change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.txt
new file mode 100644
index 0000000..5a0067e8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 52, 402, 402],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutSVGViewportContainer svg id='gamesBorder'",
+          "rect": [27, 69, 364, 366],
+          "reason": "paint property change"
+        },
+        {
+          "object": "LayoutSVGViewportContainer svg id='gamesBorder'",
+          "rect": [13, 207, 92, 92],
+          "reason": "paint property change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/remove-background-property-on-root-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/remove-background-property-on-root-expected.txt
new file mode 100644
index 0000000..0220c96
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/remove-background-property-on-root-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV",
+          "rect": [8, 8, 100, 100],
+          "reason": "appeared"
+        },
+        {
+          "object": "LayoutSVGRoot svg",
+          "rect": [8, 8, 100, 100],
+          "reason": "chunk disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/scrolling-embedded-svg-file-image-repaint-problem-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/scrolling-embedded-svg-file-image-repaint-problem-expected.txt
new file mode 100644
index 0000000..6e5d0f316
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/scrolling-embedded-svg-file-image-repaint-problem-expected.txt
@@ -0,0 +1,92 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [785, 585],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [1026, 996],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'pservers-pattern-01-b \u2190'",
+          "rect": [208, 972, 173, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'pservers-pattern-01-b \u2190'",
+          "rect": [208, 972, 173, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '\u2192 script-handle-01-b'",
+          "rect": [427, 972, 150, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\u2192 script-handle-01-b'",
+          "rect": [427, 972, 150, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "LayoutInline A",
+          "rect": [383, 971, 42, 21],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'index'",
+          "rect": [384, 972, 40, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'index'",
+          "rect": [384, 972, 40, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [423, 972, 5, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [423, 972, 5, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [380, 972, 5, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\n'",
+          "rect": [380, 972, 5, 19],
+          "reason": "disappeared"
+        }
+      ],
+      "transform": 1
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [0, -411, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/svg-background-partial-redraw-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/svg-background-partial-redraw-expected.txt
new file mode 100644
index 0000000..501d914
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/svg-background-partial-redraw-expected.txt
@@ -0,0 +1,29 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV id='revealer'",
+          "rect": [9, 153, 200, 100],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/svg-image-change-content-size-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/svg-image-change-content-size-expected.txt
new file mode 100644
index 0000000..b507634
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/svg-image-change-content-size-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow div id='contentBox'",
+          "rect": [8, 52, 602, 422],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutImage img",
+          "rect": [9, 53, 420, 420],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/transform-focus-ring-repaint-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/transform-focus-ring-repaint-expected.txt
new file mode 100644
index 0000000..e937af2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/svg/transform-focus-ring-repaint-expected.txt
@@ -0,0 +1,50 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Squashing Containment Layer",
+      "drawsContent": false
+    },
+    {
+      "name": "LayoutBlockFlow (positioned) DIV id='target'",
+      "position": [7, 57],
+      "bounds": [402, 542],
+      "backfaceVisibility": "hidden",
+      "backgroundColor": "#FFFF00",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV id='target'",
+          "rect": [0, 0, 402, 542],
+          "reason": "full layer"
+        },
+        {
+          "object": "LayoutBlockFlow (positioned) DIV id='target'",
+          "rect": [0, 0, 200, 200],
+          "reason": "full layer"
+        }
+      ]
+    },
+    {
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV)",
+      "position": [108, 158],
+      "bounds": [300, 440]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/cached-change-cell-sl-border-color-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/cached-change-cell-sl-border-color-expected.txt
new file mode 100644
index 0000000..cdd3bb5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/cached-change-cell-sl-border-color-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [8, 8, 114, 54],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutBlockFlow (positioned) DIV id='blockDiv'",
+          "rect": [90, 30, 20, 20],
+          "reason": "full"
+        },
+        {
+          "object": "InlineTextBox 'A'",
+          "rect": [90, 30, 12, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/composited-table-row-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/composited-table-row-expected.txt
new file mode 100644
index 0000000..7628914
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/composited-table-row-expected.txt
@@ -0,0 +1,35 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "LayoutTableRow TR",
+      "position": [8, 8],
+      "bounds": [74, 24],
+      "backgroundColor": "#FF0000",
+      "paintInvalidations": [
+        {
+          "object": "LayoutTableCell TD id='target'",
+          "rect": [0, 0, 37, 23],
+          "reason": "appeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/resize-table-repaint-percent-size-cell-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/resize-table-repaint-percent-size-cell-expected.txt
new file mode 100644
index 0000000..926118a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/resize-table-repaint-percent-size-cell-expected.txt
@@ -0,0 +1,59 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [0, 52, 106, 238],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [0, 292, 106, 236],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [0, 102, 106, 46],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'ROW2'",
+          "rect": [3, 400, 46, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'ROW1'",
+          "rect": [3, 161, 46, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'ROW2'",
+          "rect": [3, 115, 46, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'ROW1'",
+          "rect": [3, 66, 46, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/resize-table-repaint-vertical-align-cell-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/resize-table-repaint-vertical-align-cell-expected.txt
new file mode 100644
index 0000000..720f995
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/resize-table-repaint-vertical-align-cell-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'MIDDLE'",
+          "rect": [3, 280, 63, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'MIDDLE'",
+          "rect": [3, 90, 63, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/resize-table-row-repaint-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/resize-table-row-repaint-expected.txt
new file mode 100644
index 0000000..29b20b3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/resize-table-row-repaint-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'MIDDLE'",
+          "rect": [3, 192, 63, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'MIDDLE'",
+          "rect": [3, 142, 63, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/single-line-cells-repeating-thead-break-inside-on-thead-only-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/single-line-cells-repeating-thead-break-inside-on-thead-only-expected.png
new file mode 100644
index 0000000..389f921
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/single-line-cells-repeating-thead-break-inside-on-thead-only-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/table-collapsed-border-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/table-collapsed-border-expected.txt
new file mode 100644
index 0000000..aaef5160
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/table-collapsed-border-expected.txt
@@ -0,0 +1,149 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutTableRow TR id='r2'",
+          "rect": [8, 224, 108, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [8, 338, 99, 30],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [8, 286, 99, 30],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [8, 154, 99, 30],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [8, 102, 99, 30],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [8, 316, 99, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableRow TR id='r'",
+          "rect": [8, 132, 99, 22],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [8, 62, 95, 30],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [8, 10, 95, 30],
+          "reason": "style change"
+        },
+        {
+          "object": "LayoutTableRow TR",
+          "rect": [8, 40, 95, 22],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'ipsum dolor'",
+          "rect": [23, 317, 76, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'ipsum dolor'",
+          "rect": [23, 133, 76, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'sit amet'",
+          "rect": [23, 339, 49, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'sit amet'",
+          "rect": [23, 339, 49, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'sit amet'",
+          "rect": [23, 155, 49, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'sit amet'",
+          "rect": [23, 155, 49, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Lorem'",
+          "rect": [23, 295, 43, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Lorem'",
+          "rect": [23, 295, 43, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Lorem'",
+          "rect": [23, 111, 43, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Lorem'",
+          "rect": [23, 111, 43, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'dolor'",
+          "rect": [23, 225, 34, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [17, 225, 4, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [17, 225, 4, 19],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [17, 133, 4, 19],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox '\u00A0'",
+          "rect": [17, 133, 4, 19],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/table-shrink-row-repaint-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/table-shrink-row-repaint-expected.txt
new file mode 100644
index 0000000..34fb11d3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/table/table-shrink-row-repaint-expected.txt
@@ -0,0 +1,239 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [785, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [785, 850],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutTableCell TD id='resizeMe'",
+          "rect": [8, 112, 769, 210],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 782, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 742, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 722, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 682, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 662, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 622, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 602, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 562, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 542, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 502, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 482, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 442, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 422, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 382, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 362, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 322, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 302, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 242, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 182, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 122, 769, 60],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 802, 769, 48],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '10'",
+          "rect": [13, 822, 16, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '13'",
+          "rect": [13, 802, 16, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '12'",
+          "rect": [13, 742, 16, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '10'",
+          "rect": [13, 622, 16, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '11'",
+          "rect": [13, 682, 15, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '9'",
+          "rect": [13, 762, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '8'",
+          "rect": [13, 702, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '7'",
+          "rect": [13, 642, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '6'",
+          "rect": [13, 582, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '9'",
+          "rect": [13, 562, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '5'",
+          "rect": [13, 522, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '8'",
+          "rect": [13, 502, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '4'",
+          "rect": [13, 462, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '7'",
+          "rect": [13, 442, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '3'",
+          "rect": [13, 402, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '6'",
+          "rect": [13, 382, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '2'",
+          "rect": [13, 342, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '5'",
+          "rect": [13, 322, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '4'",
+          "rect": [13, 262, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '3'",
+          "rect": [13, 202, 8, 19],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox '2'",
+          "rect": [13, 142, 8, 19],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/text-append-dirty-lines-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/text-append-dirty-lines-expected.txt
new file mode 100644
index 0000000..6e783648
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/text-append-dirty-lines-expected.txt
@@ -0,0 +1,69 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Curabitur a velit'",
+          "rect": [8, 44, 756, 139],
+          "reason": "disappeared"
+        },
+        {
+          "object": "InlineTextBox 'Curabitur a velit.'",
+          "rect": [8, 44, 756, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse placerat. Morbi tristique. Mauris eu lacus sed felis'",
+          "rect": [8, 44, 756, 139],
+          "reason": "full"
+        },
+        {
+          "object": "InlineTextBox 'fermentum ut, tortor. Sed rhoncus. Quisque enim metus, luctus tincidunt, vestibulum eu, vestibulum eu, libero. Mauris'",
+          "rect": [8, 44, 756, 139],
+          "reason": "full"
+        },
+        {
+          "object": "InlineTextBox 'feugiat molestie, mi lorem bibendum leo, ac gravida orci nunc nec nulla. Nunc nunc lorem, rhoncus et, rutrum ac,'",
+          "rect": [8, 44, 756, 139],
+          "reason": "full"
+        },
+        {
+          "object": "InlineTextBox 'laoreet feugiat. Phasellus mollis pulvinar mi. Etiam ut neque sed eros egestas laoreet. Vestibulum ullamcorper, nulla non'",
+          "rect": [8, 44, 756, 139],
+          "reason": "full"
+        },
+        {
+          "object": "InlineTextBox 'pellentesque cursus. Proin vitae nulla. Vivamus in ipsum. Etiam mi. Nam malesuada purus in sem. Sed eget elit vel erat'",
+          "rect": [8, 44, 756, 139],
+          "reason": "full"
+        },
+        {
+          "object": "InlineTextBox 'sagittis aliquam nunc. Nullam pharetra molestie eros. Donec tempus purus ut ligula. Phasellus non nisl. Etiam eu mauris.'",
+          "rect": [8, 44, 756, 139],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'sagittis aliquam nunc. Nullam pharetra molestie eros. Donec tempus purus ut ligula. Phasellus non nisl. Etiam eu mauris.'",
+          "rect": [8, 44, 756, 139],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/transform/transform-inline-layered-child-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/transform/transform-inline-layered-child-expected.txt
new file mode 100644
index 0000000..e0b225c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/transform/transform-inline-layered-child-expected.txt
@@ -0,0 +1,34 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV id='box'",
+          "rect": [135, 361, 159, 195],
+          "reason": "chunk appeared"
+        },
+        {
+          "object": "LayoutBlockFlow HTML",
+          "rect": [300, 302, 80, 177],
+          "reason": "chunk disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/transform/transform-layout-repaint-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/transform/transform-layout-repaint-expected.txt
new file mode 100644
index 0000000..da820dbc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/transform/transform-layout-repaint-expected.txt
@@ -0,0 +1,39 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [40, 50, 208, 118],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'PASS'",
+          "rect": [52, 51, 43, 32],
+          "reason": "appeared"
+        },
+        {
+          "object": "InlineTextBox 'FAIL'",
+          "rect": [52, 51, 40, 31],
+          "reason": "disappeared"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/vertical-align-length1-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/vertical-align-length1-expected.txt
new file mode 100644
index 0000000..6abdff2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/vertical-align-length1-expected.txt
@@ -0,0 +1,49 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [20, 0, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [120, 130, 20, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [120, 100, 20, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [0, 130, 20, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [0, 100, 20, 20],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/vertical-align-length2-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/vertical-align-length2-expected.txt
new file mode 100644
index 0000000..e3a65389
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/vertical-align-length2-expected.txt
@@ -0,0 +1,44 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [300, 0, 200, 200],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [0, 0, 200, 200],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [200, 80, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [200, 50, 100, 100],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/vertical-align1-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/vertical-align1-expected.txt
new file mode 100644
index 0000000..cc6ab6f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/vertical-align1-expected.txt
@@ -0,0 +1,49 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [20, 0, 100, 100],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [120, 33, 20, 21],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [0, 33, 20, 21],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [120, 80, 20, 20],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [0, 80, 20, 20],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/vertical-align2-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/vertical-align2-expected.txt
new file mode 100644
index 0000000..4d81829
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/vertical-align2-expected.txt
@@ -0,0 +1,44 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [300, 0, 200, 200],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='other'",
+          "rect": [0, 0, 200, 200],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [200, 146, 100, 101],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV id='target'",
+          "rect": [200, 100, 100, 100],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/vertical-rl-as-paint-container-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/vertical-rl-as-paint-container-expected.txt
new file mode 100644
index 0000000..95dd103
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/vertical-rl-as-paint-container-expected.txt
@@ -0,0 +1,50 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "LayoutBlockFlow DIV id='target'",
+      "position": [8, 8],
+      "bounds": [600, 400],
+      "backfaceVisibility": "hidden",
+      "paintInvalidations": [
+        {
+          "object": "InlineTextBox 'Lorem ipsum dolor'",
+          "rect": [520, 0, 80, 340],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'adipiscing elit.'",
+          "rect": [520, 0, 80, 340],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'consectetur'",
+          "rect": [520, 0, 80, 340],
+          "reason": "style change"
+        },
+        {
+          "object": "InlineTextBox 'sit amet,'",
+          "rect": [520, 0, 80, 340],
+          "reason": "style change"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/window-resize/window-resize-centered-inline-under-fixed-pos-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/window-resize/window-resize-centered-inline-under-fixed-pos-expected.txt
new file mode 100644
index 0000000..e0b8a22
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/window-resize/window-resize-centered-inline-under-fixed-pos-expected.txt
@@ -0,0 +1,168 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [600, 250],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [600, 250],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [600, 250],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV class='container'",
+          "rect": [0, 0, 600, 250],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='parent'",
+          "rect": [0, 0, 6, 250],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV class='child'",
+          "rect": [0, 125, 6, 30],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [400, 250],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [400, 250],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [400, 250],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV class='container'",
+          "rect": [0, 0, 400, 250],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='parent'",
+          "rect": [0, 0, 6, 250],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV class='child'",
+          "rect": [0, 125, 6, 30],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [400, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [400, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [400, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV class='container'",
+          "rect": [0, 0, 400, 600],
+          "reason": "geometry"
+        },
+        {
+          "object": "Scrolling background of LayoutView #document",
+          "rect": [0, 250, 400, 350],
+          "reason": "incremental"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='parent'",
+          "rect": [0, 0, 6, 600],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV class='child'",
+          "rect": [0, 300, 6, 30],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV class='child'",
+          "rect": [0, 125, 6, 30],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "LayoutBlockFlow (positioned) DIV class='container'",
+          "rect": [0, 0, 800, 600],
+          "reason": "geometry"
+        },
+        {
+          "object": "Scrolling background of LayoutView #document",
+          "rect": [400, 0, 400, 600],
+          "reason": "incremental"
+        },
+        {
+          "object": "LayoutBlockFlow DIV class='parent'",
+          "rect": [0, 0, 6, 600],
+          "reason": "geometry"
+        },
+        {
+          "object": "LayoutBlockFlow (relative positioned) DIV class='child'",
+          "rect": [0, 300, 6, 30],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/window-resize/window-resize-vertical-writing-mode-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/window-resize/window-resize-vertical-writing-mode-expected.txt
new file mode 100644
index 0000000..ae0bee51
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/invalidation/window-resize/window-resize-vertical-writing-mode-expected.txt
@@ -0,0 +1,189 @@
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [600, 250],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [600, 235],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [939, 235],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "Scrolling Contents Layer",
+          "rect": [0, 0, 939, 235],
+          "reason": "full layer"
+        }
+      ],
+      "transform": 1
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [-339, 0, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [400, 250],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [400, 235],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [939, 235],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "Scrolling Contents Layer",
+          "rect": [0, 0, 939, 235],
+          "reason": "full layer"
+        }
+      ],
+      "transform": 1
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [-539, 0, 0, 1]
+      ],
+      "flattenInheritedTransform": false
+    }
+  ]
+}
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [400, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [400, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [400, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "Scrolling Contents Layer",
+          "rect": [0, 0, 400, 600],
+          "reason": "full layer"
+        }
+      ]
+    }
+  ]
+}
+{
+  "layers": [
+    {
+      "name": "LayoutView #document",
+      "bounds": [800, 600],
+      "drawsContent": false,
+      "backgroundColor": "#FFFFFF"
+    },
+    {
+      "name": "Scrolling Layer",
+      "bounds": [800, 600],
+      "drawsContent": false
+    },
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "paintInvalidations": [
+        {
+          "object": "Scrolling background of LayoutView #document",
+          "rect": [400, 0, 400, 600],
+          "reason": "incremental"
+        },
+        {
+          "object": "InlineTextBox 'AAAA BBBB CCCC'",
+          "rect": [439, 8, 352, 562],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'DDDD EEEE FFFF'",
+          "rect": [439, 8, 352, 562],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'GGGG HHHH IIII JJJJ'",
+          "rect": [439, 8, 352, 562],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'KKKK LLLL MMMM'",
+          "rect": [439, 8, 352, 562],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'NNNN'",
+          "rect": [439, 8, 352, 562],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'AAAA BBBB CCCC'",
+          "rect": [39, 8, 352, 562],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'DDDD EEEE FFFF'",
+          "rect": [39, 8, 352, 562],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'GGGG HHHH IIII JJJJ'",
+          "rect": [39, 8, 352, 562],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'KKKK LLLL MMMM'",
+          "rect": [39, 8, 352, 562],
+          "reason": "geometry"
+        },
+        {
+          "object": "InlineTextBox 'NNNN'",
+          "rect": [39, 8, 352, 562],
+          "reason": "geometry"
+        }
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/ellipsis-ltr-text-in-ltr-flow-with-markers-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/ellipsis-ltr-text-in-ltr-flow-with-markers-expected.png
new file mode 100644
index 0000000..e4463b1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/ellipsis-ltr-text-in-ltr-flow-with-markers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/ellipsis-ltr-text-in-rtl-flow-with-markers-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/ellipsis-ltr-text-in-rtl-flow-with-markers-expected.png
new file mode 100644
index 0000000..1eb942d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/ellipsis-ltr-text-in-rtl-flow-with-markers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/ellipsis-mixed-text-in-ltr-flow-with-markers-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/ellipsis-mixed-text-in-ltr-flow-with-markers-expected.png
new file mode 100644
index 0000000..940baec6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/ellipsis-mixed-text-in-ltr-flow-with-markers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/ellipsis-mixed-text-in-rtl-flow-with-markers-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/ellipsis-mixed-text-in-rtl-flow-with-markers-expected.png
new file mode 100644
index 0000000..abceddd5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/ellipsis-mixed-text-in-rtl-flow-with-markers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/ellipsis-rtl-text-in-ltr-flow-with-markers-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/ellipsis-rtl-text-in-ltr-flow-with-markers-expected.png
new file mode 100644
index 0000000..bf7e327
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/ellipsis-rtl-text-in-ltr-flow-with-markers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/ellipsis-rtl-text-in-rtl-flow-with-markers-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/ellipsis-rtl-text-in-rtl-flow-with-markers-expected.png
new file mode 100644
index 0000000..5dd4841b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/ellipsis-rtl-text-in-rtl-flow-with-markers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/inline-spelling-markers-hidpi-composited-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/inline-spelling-markers-hidpi-composited-expected.png
new file mode 100644
index 0000000..96611816
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/inline-spelling-markers-hidpi-composited-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/inline-spelling-markers-hidpi-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/inline-spelling-markers-hidpi-expected.png
new file mode 100644
index 0000000..96611816
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/inline-spelling-markers-hidpi-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/inline_spelling_markers-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/inline_spelling_markers-expected.png
new file mode 100644
index 0000000..ba6a3ea
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/inline_spelling_markers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/markers-zoomed-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/markers-zoomed-expected.png
new file mode 100644
index 0000000..08d4686
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/markers-zoomed-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/vertical-lr-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/vertical-lr-expected.png
new file mode 100644
index 0000000..0d25d8dd
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/vertical-rl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/vertical-rl-expected.png
new file mode 100644
index 0000000..f82ef3b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/markers/vertical-rl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/image-writing-modes-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/image-writing-modes-expected.png
new file mode 100644
index 0000000..d95cabf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/image-writing-modes-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-inline-block-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-inline-block-expected.png
new file mode 100644
index 0000000..a625e5c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-inline-block-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-inline-block-rtl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-inline-block-rtl-expected.png
new file mode 100644
index 0000000..1badda5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-inline-block-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-across-blocks-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-across-blocks-expected.png
new file mode 100644
index 0000000..5e142e1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-across-blocks-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png
new file mode 100644
index 0000000..f0d68bd0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-br-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-br-expected.png
new file mode 100644
index 0000000..5e142e1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-br-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-clipped-by-overflow-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-clipped-by-overflow-expected.png
new file mode 100644
index 0000000..2317cde
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-clipped-by-overflow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-expected.png
new file mode 100644
index 0000000..ddf9523
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-mixed-ltr-rtl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-mixed-ltr-rtl-expected.png
new file mode 100644
index 0000000..52860ee
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-mixed-ltr-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-rtl-double-linebreak-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-rtl-double-linebreak-expected.png
new file mode 100644
index 0000000..468043a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-rtl-double-linebreak-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-rtl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-rtl-expected.png
new file mode 100644
index 0000000..966209a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-span-across-line-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-span-across-line-expected.png
new file mode 100644
index 0000000..ada2c791
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-span-across-line-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-span-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-span-expected.png
new file mode 100644
index 0000000..1732d68
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-span-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-vertical-lr-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-vertical-lr-expected.png
new file mode 100644
index 0000000..ab06e15
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-vertical-rl-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-vertical-rl-expected.png
new file mode 100644
index 0000000..e9463718
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/selection/text-selection-newline-vertical-rl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/text/selection-no-clip-text-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/text/selection-no-clip-text-expected.png
new file mode 100644
index 0000000..d90c4648
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/disable-blink-gen-property-trees/paint/text/selection-no-clip-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/exotic-color-space/images/color-profile-image-filter-all-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/exotic-color-space/images/color-profile-image-filter-all-expected.png
new file mode 100644
index 0000000..e789ba6f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/exotic-color-space/images/color-profile-image-filter-all-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/exotic-color-space/images/exif-orientation-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/exotic-color-space/images/exif-orientation-expected.png
new file mode 100644
index 0000000..a503c96
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/exotic-color-space/images/exif-orientation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/exotic-color-space/images/exif-orientation-image-document-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/exotic-color-space/images/exif-orientation-image-document-expected.png
new file mode 100644
index 0000000..19b89aeb
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/exotic-color-space/images/exif-orientation-image-document-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/gpu-rasterization/images/color-profile-image-filter-all-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/gpu-rasterization/images/color-profile-image-filter-all-expected.png
new file mode 100644
index 0000000..61ce18b1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/gpu-rasterization/images/color-profile-image-filter-all-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/gpu-rasterization/images/exif-orientation-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/gpu-rasterization/images/exif-orientation-expected.png
new file mode 100644
index 0000000..30af65b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/gpu-rasterization/images/exif-orientation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/gpu-rasterization/images/exif-orientation-image-document-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/gpu-rasterization/images/exif-orientation-image-document-expected.png
new file mode 100644
index 0000000..32f4aeb
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/gpu-rasterization/images/exif-orientation-image-document-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/gpu/fast/canvas/image-object-in-canvas-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/gpu/fast/canvas/image-object-in-canvas-expected.png
new file mode 100644
index 0000000..624fbe2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/gpu/fast/canvas/image-object-in-canvas-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/gpu/fast/canvas/patternfill-repeat-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/gpu/fast/canvas/patternfill-repeat-expected.png
new file mode 100644
index 0000000..640fddc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/gpu/fast/canvas/patternfill-repeat-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/mouseevent_fractional/fast/events/pointer-events-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/mouseevent_fractional/fast/events/pointer-events-2-expected.png
new file mode 100644
index 0000000..a4804f3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/mouseevent_fractional/fast/events/pointer-events-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/mouseevent_fractional/fast/events/updateLayoutForHitTest-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/mouseevent_fractional/fast/events/updateLayoutForHitTest-expected.png
new file mode 100644
index 0000000..b1a8ae0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/mouseevent_fractional/fast/events/updateLayoutForHitTest-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/registration-updateviacache.https-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/registration-updateviacache.https-expected.txt
new file mode 100644
index 0000000..98881c1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/registration-updateviacache.https-expected.txt
@@ -0,0 +1,28 @@
+This is a testharness.js-based test.
+PASS register-with-updateViaCache-undefined
+PASS register-with-updateViaCache-imports
+PASS register-with-updateViaCache-all
+PASS register-with-updateViaCache-none
+PASS register-with-updateViaCache-undefined-then-undefined
+PASS register-with-updateViaCache-undefined-then-imports
+PASS register-with-updateViaCache-undefined-then-all
+PASS register-with-updateViaCache-undefined-then-none
+PASS register-with-updateViaCache-imports-then-undefined
+PASS register-with-updateViaCache-imports-then-imports
+PASS register-with-updateViaCache-imports-then-all
+PASS register-with-updateViaCache-imports-then-none
+PASS register-with-updateViaCache-all-then-undefined
+PASS register-with-updateViaCache-all-then-imports
+PASS register-with-updateViaCache-all-then-all
+PASS register-with-updateViaCache-all-then-none
+PASS register-with-updateViaCache-none-then-undefined
+PASS register-with-updateViaCache-none-then-imports
+PASS register-with-updateViaCache-none-then-all
+PASS register-with-updateViaCache-none-then-none
+PASS access-updateViaCache-after-unregister-undefined
+PASS access-updateViaCache-after-unregister-imports
+PASS access-updateViaCache-after-unregister-all
+PASS access-updateViaCache-after-unregister-none
+PASS updateViaCache is not updated if register() rejects
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/scalefactor200/fast/hidpi/static/popup-menu-appearance-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/scalefactor200/fast/hidpi/static/popup-menu-appearance-expected.png
new file mode 100644
index 0000000..8547c919
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/scalefactor200/fast/hidpi/static/popup-menu-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/scalefactor200withzoom/fast/hidpi/static/popup-menu-appearance-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/scalefactor200withzoom/fast/hidpi/static/popup-menu-appearance-expected.png
new file mode 100644
index 0000000..8547c919
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/scalefactor200withzoom/fast/hidpi/static/popup-menu-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/scroll_customization/fast/events/touch/compositor-touch-hit-rects-continuation-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/scroll_customization/fast/events/touch/compositor-touch-hit-rects-continuation-expected.txt
new file mode 100644
index 0000000..5b45d439
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/scroll_customization/fast/events/touch/compositor-touch-hit-rects-continuation-expected.txt
@@ -0,0 +1,7 @@
+This tests verifies the hit test regions given to the compositor specifically for continuation case. It can only be run in DumpRenderTree.
+
+continuation: layer(0,0 800x600) has hit test rect (13,79 101x11)
+continuation: layer(0,0 800x600) has hit test rect (13,90 290x12)
+continuation: layer(0,0 800x600) has hit test rect (13,102 121x11)
+
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/scroll_customization/fast/events/touch/compositor-touch-hit-rects-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/scroll_customization/fast/events/touch/compositor-touch-hit-rects-expected.txt
new file mode 100644
index 0000000..1eea2e4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/scroll_customization/fast/events/touch/compositor-touch-hit-rects-expected.txt
@@ -0,0 +1,49 @@
+This tests verifies the hit test regions given to the compositor. It can only be run in DumpRenderTree. The outputted rects should cover the hit test regions of all the listed elements. Enable visualize mode to quickly validate graphically.
+
+normalFlow: layer(0,0 785x1530) has hit test rect (13,128 290x12)
+
+inlineOverflow: layer(0,0 785x1578) has hit test rect (13,145 152x12)
+inlineOverflow: layer(0,0 785x1578) has hit test rect (13,157 42x10)
+
+absoluteChildContainer: layer(0,0 785x1658) has hit test rect (13,172 290x12)
+absoluteChildContainer: layer(0,0 785x1658) has hit test rect (320,173 142x12)
+
+relativeChildContainer: layer(0,0 785x1738) has hit test rect (13,189 290x22)
+relativeChildContainer: layer(0,0 785x1738) has hit test rect (314,199 142x12)
+
+fixed: layer(405,98 52x12) has hit test rect (0,0 52x12)
+
+translate: layer(0,0 785x1866) has hit test rect (13,216 290x14)
+translate: layer(0,0 785x1866) has hit test rect (314,219 288x12)
+
+transform2d: layer(0,0 785x1946) has hit test rect (16,236 284x20)
+
+overhangingContainer: layer(0,0 785x1994) has hit test rect (13,262 290x12)
+overhangingContainer: layer(0,0 785x1994) has hit test rect (14,274 102x10)
+overhangingContainer: layer(0,0 785x1994) has hit test rect (14,284 111x10)
+overhangingContainer: layer(0,0 785x1994) has hit test rect (14,294 102x11)
+
+transform3d: layer(14,316 288x12) has hit test rect (0,0 288x12)
+transform3d: layer(0,0 785x2138) has hit test rect (13,315 290x14)
+
+negativeOffsetChild: layer(-96,339 211x13) has hit test rect (0,1 102x12)
+
+continuation: layer(0,0 785x2266) has hit test rect (13,355 101x11)
+continuation: layer(0,0 785x2266) has hit test rect (13,366 290x12)
+continuation: layer(0,0 785x2266) has hit test rect (13,378 121x11)
+
+inlineAbsoluteChildContainer: layer(0,0 785x2378) has hit test rect (13,392 262x12)
+inlineAbsoluteChildContainer: layer(0,0 785x2378) has hit test rect (320,393 252x12)
+
+list: layer(0,0 785x2458) has hit test rect (13,413 290x14)
+list: layer(0,0 785x2458) has hit test rect (354,414 248x12)
+
+styleModified: layer(0,0 785x2548) has hit test rect (13,437 290x22)
+
+containsSvg: layer(0,0 785x2596) has hit test rect (13,464 290x16)
+
+svgline: layer(0,0 785x2644) has hit test rect (13,489 22x3)
+
+tablecell: layer(0,0 785x2692) has hit test rect (45,518 32x11)
+
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/scroll_customization/fast/events/touch/compositor-touch-hit-rects-list-translate-expected.txt b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/scroll_customization/fast/events/touch/compositor-touch-hit-rects-list-translate-expected.txt
new file mode 100644
index 0000000..e0c5934
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/scroll_customization/fast/events/touch/compositor-touch-hit-rects-list-translate-expected.txt
@@ -0,0 +1,4 @@
+list: layer(0,0 800x600) has hit test rect (13,10 290x14)
+list: layer(0,0 800x600) has hit test rect (354,11 248x12)
+
+
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/threaded/animations/rotate-transform-equivalent-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/threaded/animations/rotate-transform-equivalent-expected.png
new file mode 100644
index 0000000..95695bb
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/threaded/animations/rotate-transform-equivalent-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/threaded/external/wpt/css/css-paint-api/geometry-background-image-001.https-expected.png b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/threaded/external/wpt/css/css-paint-api/geometry-background-image-001.https-expected.png
new file mode 100644
index 0000000..b5daa85
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-blink-features=LayoutNG/virtual/threaded/external/wpt/css/css-paint-api/geometry-background-image-001.https-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/http/tests/background_sync/periodic_sync_tests.html b/third_party/blink/web_tests/http/tests/background_sync/periodic_sync_tests.html
index 9a433f9..5f9d553f 100644
--- a/third_party/blink/web_tests/http/tests/background_sync/periodic_sync_tests.html
+++ b/third_party/blink/web_tests/http/tests/background_sync/periodic_sync_tests.html
@@ -10,7 +10,6 @@
 <script src="./resources/utils.js"></script>
 
 <script>
-
   periodicSyncTest(async (test, periodicSync) => {
     await periodicSync.register('test');
   }, 'register succeeds when no options are provided');
@@ -26,4 +25,24 @@
         'register should have thrown an error');
   }, 'register fails when invalid minInterval is provided');
 
+  periodicSyncTest(async (test, periodicSync) => {
+    await periodicSync.register('test');
+    const tags = await periodicSync.getTags();
+    assert_equals(tags.length, 1);
+    assert_equals(tags[0], 'test');
+  }, 'getTags works as expected');
+
+  periodicSyncTest(async (test, periodicSync) => {
+    await periodicSync.unregister('non-existent');
+  }, 'unregister succeeds when a non-existent tag is provided');
+
+  periodicSyncTest(async (test, periodicSync) => {
+    await periodicSync.register('test');
+    let tags = await periodicSync.getTags();
+    assert_equals(tags.length, 1);
+
+    await periodicSync.unregister('test');
+    tags = await periodicSync.getTags();
+    assert_equals(tags.length, 0);
+  }, 'unregister removes the specified registration');
 </script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/README.md b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/README.md
index defa765..c95c9884 100644
--- a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/README.md
+++ b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/README.md
@@ -7,4 +7,4 @@
 this. Depending on the test, it may be necessary to add specific
 results in the directory:
 
-LayoutTests/virtual/origin-trials-runtimeflags-disabled/http/tests/origin_trials/webexposed/
+web_tests/virtual/origin-trials-runtimeflags-disabled/http/tests/origin_trials/webexposed/
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/trusted-types-origin-trial.html b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/trusted-types-origin-trial.html
new file mode 100644
index 0000000..ad08c22
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/trusted-types-origin-trial.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Trusted types - exposed by origin trial</title>
+<script src="../../../../resources/testharness.js"></script>
+<script src="../../../../resources/testharnessreport.js"></script>
+<script src="../../../../resources/origin-trials-helper.js"></script>
+
+<script>
+// Can only run this test if TrustedDOMTypes is not enabled via a Chrome flag.
+// That is only the case when running this in a virtual test suite (by default,
+// runtime enabled features are on for layout tests).
+// To run in virtual test suite:
+// tools/run_web_tests.py virtual/origin-trials-runtimeflags-disabled/http/tests/origin_trials/webexposed
+if (!self.internals.runtimeFlags.trustedDOMTypesEnabled) {
+  test(t => {
+    assert_not_own_property(window, 'TrustedTypes', 'TrustedTypes is defined on the window');
+  }, 'trusted types in Origin-Trial disabled document.');
+}
+
+// generated with command
+// tools/origin_trials/generate_token.py http://127.0.0.1:8000 TrustedDOMTypes --expire-timestamp=2000000000
+const token = 'AqXgC692H4wuaTLMJ0jzBazq/pN6WCvcllT60HwwZpdNy/vrnklJOcAL7D6wcSDL+FjyR16xxhbcTtB8Mc1Q4wMAAABXeyJvcmlnaW4iOiAiaHR0cDovLzEyNy4wLjAuMTo4MDAwIiwgImZlYXR1cmUiOiAiVHJ1c3RlZERPTVR5cGVzIiwgImV4cGlyeSI6IDIwMDAwMDAwMDB9';
+OriginTrialsHelper.add_token(token);
+test(t => {
+  assert_own_property(window, 'TrustedTypes', 'TrustedTypes is not defined on the window');
+  assert_own_property(window.TrustedTypes, 'createPolicy', 'createPolicy is not defined on TrustedTypes');
+}, 'trusted types in Origin-Trial enabled document.');
+</script>
diff --git a/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
index 46530fa..989716d 100644
--- a/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
+++ b/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -1093,7 +1093,9 @@
 interface PeriodicSyncManager
     attribute @@toStringTag
     method constructor
+    method getTags
     method register
+    method unregister
 interface PermissionStatus : EventTarget
     attribute @@toStringTag
     getter onchange
diff --git a/third_party/blink/web_tests/platform/linux/fast/text/emoji-vertical-origin-visual-expected.png b/third_party/blink/web_tests/platform/linux/fast/text/emoji-vertical-origin-visual-expected.png
index e69eac4..ba0e4f9 100644
--- a/third_party/blink/web_tests/platform/linux/fast/text/emoji-vertical-origin-visual-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/text/emoji-vertical-origin-visual-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/gpu/fast/canvas/image-object-in-canvas-expected.png b/third_party/blink/web_tests/platform/linux/virtual/gpu/fast/canvas/image-object-in-canvas-expected.png
index 1c05c36..9d79a4c 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/gpu/fast/canvas/image-object-in-canvas-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/gpu/fast/canvas/image-object-in-canvas-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/css3/masking/clip-path-inset-large-radii-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/css3/masking/clip-path-inset-large-radii-expected.png
deleted file mode 100644
index fb5625f..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.10/css3/masking/clip-path-inset-large-radii-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/media/controls/modern/tap-to-hide-controls-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.10/media/controls/modern/tap-to-hide-controls-expected.txt
deleted file mode 100644
index dd92a7e..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.10/media/controls/modern/tap-to-hide-controls-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Test that the controls are hidden if they are tapped assert_false: expected false got true
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/exotic-color-space/images/icon-decoding-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/exotic-color-space/images/icon-decoding-expected.png
deleted file mode 100644
index e312987..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/exotic-color-space/images/icon-decoding-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/css3/masking/clip-path-inset-large-radii-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/css3/masking/clip-path-inset-large-radii-expected.png
deleted file mode 100644
index 0400e83..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.11/css3/masking/clip-path-inset-large-radii-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/exotic-color-space/images/icon-decoding-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/exotic-color-space/images/icon-decoding-expected.png
deleted file mode 100644
index 5d8af4d3..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/exotic-color-space/images/icon-decoding-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/scalefactor200/fast/hidpi/static/popup-menu-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/scalefactor200/fast/hidpi/static/popup-menu-appearance-expected.png
new file mode 100644
index 0000000..cb5ae1c2
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/scalefactor200/fast/hidpi/static/popup-menu-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/scalefactor200/fast/hidpi/static/popup-menu-appearance-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/scalefactor200/fast/hidpi/static/popup-menu-appearance-expected.png
deleted file mode 100644
index 003114f..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/scalefactor200/fast/hidpi/static/popup-menu-appearance-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/dynamic/011-expected.png b/third_party/blink/web_tests/platform/mac/fast/dynamic/011-expected.png
index 4693029..e8aa156 100644
--- a/third_party/blink/web_tests/platform/mac/fast/dynamic/011-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/dynamic/011-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/fast/hidpi/static/popup-menu-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/fast/hidpi/static/popup-menu-appearance-expected.png
index cb5ae1c2..003114f 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/fast/hidpi/static/popup-menu-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/fast/hidpi/static/popup-menu-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/text/emoji-vertical-origin-visual-expected.png b/third_party/blink/web_tests/platform/win/fast/text/emoji-vertical-origin-visual-expected.png
index c04cf0cf..d2af031 100644
--- a/third_party/blink/web_tests/platform/win/fast/text/emoji-vertical-origin-visual-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/text/emoji-vertical-origin-visual-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/text/emoji-vertical-origin-visual-expected.png b/third_party/blink/web_tests/platform/win7/fast/text/emoji-vertical-origin-visual-expected.png
index 733eb62..dd7c153 100644
--- a/third_party/blink/web_tests/platform/win7/fast/text/emoji-vertical-origin-visual-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/text/emoji-vertical-origin-visual-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
index 79e727a..1037fdf 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -1027,7 +1027,9 @@
 [Worker] interface PeriodicSyncManager
 [Worker]     attribute @@toStringTag
 [Worker]     method constructor
+[Worker]     method getTags
 [Worker]     method register
+[Worker]     method unregister
 [Worker] interface PermissionStatus : EventTarget
 [Worker]     attribute @@toStringTag
 [Worker]     getter onchange
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
index b08cec5..543c2222 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -5530,7 +5530,9 @@
 interface PeriodicSyncManager
     attribute @@toStringTag
     method constructor
+    method getTags
     method register
+    method unregister
 interface PeriodicWave
     attribute @@toStringTag
     method constructor
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
index 2397eaa..5bc47e4 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -1009,7 +1009,9 @@
 [Worker] interface PeriodicSyncManager
 [Worker]     attribute @@toStringTag
 [Worker]     method constructor
+[Worker]     method getTags
 [Worker]     method register
+[Worker]     method unregister
 [Worker] interface PermissionStatus : EventTarget
 [Worker]     attribute @@toStringTag
 [Worker]     getter onchange
diff --git a/third_party/mach_override/BUILD.gn b/third_party/mach_override/BUILD.gn
deleted file mode 100644
index 410cf36..0000000
--- a/third_party/mach_override/BUILD.gn
+++ /dev/null
@@ -1,63 +0,0 @@
-# Copyright (c) 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-assert(is_mac || is_ios)
-
-config("libudis86_warnings") {
-  cflags = [
-    # syn.c contains a switch with an assert(false) in a default:
-    # block.  In release builds, the function is missing a return.
-    "-Wno-return-type",
-
-    # Fires once in decode.c.
-    "-Wno-sometimes-uninitialized",
-  ]
-}
-
-static_library("libudis86") {
-  sources = [
-    "libudis86/decode.c",
-    "libudis86/decode.h",
-    "libudis86/extern.h",
-    "libudis86/input.c",
-    "libudis86/input.h",
-    "libudis86/itab.c",
-    "libudis86/itab.h",
-    "libudis86/syn-att.c",
-    "libudis86/syn-intel.c",
-    "libudis86/syn.c",
-    "libudis86/syn.h",
-    "libudis86/types.h",
-    "libudis86/udint.h",
-    "libudis86/udis86.c",
-    "udis86.h",
-  ]
-  defines = [
-    "HAVE_ASSERT_H",
-    "HAVE_STRING_H",
-  ]
-
-  configs -= [
-    "//build/config/compiler:chromium_code",
-
-    # For UD_ASSERT(!"message");
-    "//build/config/clang:extra_warnings",
-  ]
-  configs += [
-    "//build/config/compiler:no_chromium_code",
-
-    # Must be after no_chromium_code for warning flags to be ordered correctly.
-    ":libudis86_warnings",
-  ]
-}
-
-static_library("mach_override") {
-  sources = [
-    "mach_override.c",
-    "mach_override.h",
-  ]
-  deps = [
-    ":libudis86",
-  ]
-}
diff --git a/third_party/mach_override/LICENSE b/third_party/mach_override/LICENSE
deleted file mode 100644
index 90faa6f..0000000
--- a/third_party/mach_override/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2003-2012 Jonathan 'Wolf' Rentzsch: http://rentzsch.com
-Some rights reserved: http://opensource.org/licenses/mit
-
-mach_override includes a copy of libudis86, licensed as follows:
-
-Copyright (c) 2002-2009 Vivek Thampi
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, 
-are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice, 
-      this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright notice, 
-      this list of conditions and the following disclaimer in the documentation 
-      and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/third_party/mach_override/OWNERS b/third_party/mach_override/OWNERS
deleted file mode 100644
index 720b872..0000000
--- a/third_party/mach_override/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-avi@chromium.org
-mark@chromium.org
-rsesek@chromium.org
diff --git a/third_party/mach_override/README.chromium b/third_party/mach_override/README.chromium
deleted file mode 100644
index 9206bde9..0000000
--- a/third_party/mach_override/README.chromium
+++ /dev/null
@@ -1,21 +0,0 @@
-Name: mach_override
-Short Name: mach_override
-Version: unknown
-URL: https://github.com/rentzsch/mach_override
-Date: 2014-05-11
-Revision: 919148f94db54fc04d287eb6a42c0c36b166bbfa
-License: MIT and 2-clause BSD
-Security Critical: Yes
-
-
-Description:
-This package is used to replace framework functions with different
-implementations at run time.
-
-mach_override includes a copy of libudis86 1.7.1, available separately from
-http://udis86.sourceforge.net/ and https://github.com/vmt/udis86 .
-
-
-Local Modifications: Sped up allocation of branch island memory via usage of
-   vm_region to skip already allocated pages; add diagnostics for allocation
-   attempts. Catch allocation attempts on restricted pages.
diff --git a/third_party/mach_override/chromium.patch b/third_party/mach_override/chromium.patch
deleted file mode 100644
index 8a6abee..0000000
--- a/third_party/mach_override/chromium.patch
+++ /dev/null
@@ -1,175 +0,0 @@
-diff --git a/third_party/mach_override/mach_override.c b/third_party/mach_override/mach_override.c
-index 85a75e5c2067..ca68c0e90e61 100644
---- a/third_party/mach_override/mach_override.c
-+++ b/third_party/mach_override/mach_override.c
-@@ -8,6 +8,7 @@
- #include "udis86.h"
- #endif
- 
-+#include <libkern/OSAtomic.h>
- #include <mach-o/dyld.h>
- #include <mach/mach_init.h>
- #include <mach/vm_map.h>
-@@ -41,7 +42,7 @@ long kIslandTemplate[] = {
- #define kInstructionHi		10
- #define kInstructionLo		11
- 
--#elif defined(__i386__) 
-+#elif defined(__i386__)
- 
- #define kOriginalInstructionsSize 16
- 
-@@ -61,6 +62,7 @@ char kIslandTemplate[] = {
- #define kOriginalInstructionsSize 32
- 
- #define kJumpAddress    kOriginalInstructionsSize + 6
-+#define kMaxJumpOffset  (0x7fffffffUL)
- 
- char kIslandTemplate[] = {
- 	// kOriginalInstructionsSize nop instructions so that we 
-@@ -93,6 +95,14 @@ typedef	struct	{
- 	int		allocatedHigh;
- }	BranchIsland;
- 
-+/**************************
-+*
-+*	Statistics
-+*
-+**************************/
-+static volatile int64_t __attribute__((__aligned__((sizeof(int64_t)))))
-+    g_mach_override_allocation_attempts = 0;
-+
- /**************************
- *	
- *	Funky Protos
-@@ -101,6 +111,10 @@ typedef	struct	{
- #pragma mark	-
- #pragma mark	(Funky Protos)
- 
-+u_int64_t mach_override_ptr_allocation_attempts() {
-+  return OSAtomicAdd64(0, &g_mach_override_allocation_attempts);
-+}
-+
- 	mach_error_t
- allocateBranchIsland(
- 		BranchIsland	**island,
-@@ -267,7 +281,13 @@ mach_override_ptr(
- 
- #if defined(__i386__) || defined(__x86_64__)
- 	if (!err) {
--		uint32_t addressOffset = ((char*)escapeIsland - (char*)originalFunctionPtr - 5);
-+		// TODO: On 64-bit, move to opcode FF/4 (jmp 64-bit absolute indirect)
-+		// instead of E9 (jmp 32-bit relative to RIP). Then we should update
-+		// allocateBranchIsland to simply allocate any page in the address space.
-+		// See the 64-bit version of kIslandTemplate array.
-+		int64_t addressOffset64 = ((char*)escapeIsland - (char*)originalFunctionPtr - 5);
-+		int32_t addressOffset = addressOffset64;
-+		assert(addressOffset64 == addressOffset);
- 		addressOffset = OSSwapInt32(addressOffset);
- 		
- 		jumpRelativeInstruction |= 0xE900000000000000LL; 
-@@ -385,13 +405,14 @@ allocateBranchIsland(
- 		void *originalFunctionAddress)
- {
- 	assert( island );
--	
-+
- 	mach_error_t	err = err_none;
- 	
- 	if( allocateHigh ) {
- 		assert( sizeof( BranchIsland ) <= PAGE_SIZE );
- 		vm_address_t page = 0;
- #if defined(__i386__)
-+		OSAtomicAdd64(1, &g_mach_override_allocation_attempts);
- 		err = vm_allocate( mach_task_self(), &page, PAGE_SIZE, VM_FLAGS_ANYWHERE );
- 		if( err == err_none )
- 			*island = (BranchIsland*) page;
-@@ -401,23 +422,42 @@ allocateBranchIsland(
- 		vm_address_t first = 0xfeffffff;
- 		vm_address_t last = 0xfe000000 + PAGE_SIZE;
- #elif defined(__x86_64__)
--		// 64-bit ASLR is in bits 13-28
--		vm_address_t first = ((uint64_t)originalFunctionAddress & ~( (0xFUL << 28) | (PAGE_SIZE - 1) ) ) | (0x1UL << 31);
--		vm_address_t last = (uint64_t)originalFunctionAddress & ~((0x1UL << 32) - 1);
-+		// This logic is more complex due to the 32-bit limit of the jump out
-+		// of the original function. Once that limitation is removed, we can
-+		// use vm_allocate with VM_FLAGS_ANYWHERE as in the i386 code above.
-+		const uint64_t kPageMask = ~(PAGE_SIZE - 1);
-+		vm_address_t first = (uint64_t)originalFunctionAddress - kMaxJumpOffset;
-+		first = (first & kPageMask) + PAGE_SIZE; // Align up to the next page start
-+		if (first > (uint64_t)originalFunctionAddress) first = 0;
-+		vm_address_t last = (uint64_t)originalFunctionAddress + kMaxJumpOffset;
-+		if (last < (uint64_t)originalFunctionAddress) last = ULONG_MAX;
- #endif
- 
- 		page = first;
- 		int allocated = 0;
- 		vm_map_t task_self = mach_task_self();
- 
--		while( !err && !allocated && page != last ) {
-+		while( !err && !allocated && page < last ) {
- 
-+			OSAtomicAdd64(1, &g_mach_override_allocation_attempts);
- 			err = vm_allocate( task_self, &page, PAGE_SIZE, 0 );
- 			if( err == err_none )
- 				allocated = 1;
--			else if( err == KERN_NO_SPACE ) {
-+			else if( err == KERN_NO_SPACE || err == KERN_INVALID_ADDRESS) {
- #if defined(__x86_64__)
--				page -= PAGE_SIZE;
-+				// This memory region is not suitable, skip it:
-+				vm_size_t region_size;
-+				mach_msg_type_number_t int_count = VM_REGION_BASIC_INFO_COUNT_64;
-+				vm_region_basic_info_data_64_t vm_region_info;
-+				mach_port_t object_name;
-+				// The call will move 'page' to the beginning of the region:
-+				err = vm_region_64(task_self, &page, &region_size,
-+							VM_REGION_BASIC_INFO_64, (vm_region_info_t)&vm_region_info,
-+							&int_count, &object_name);
-+				if (err == KERN_SUCCESS)
-+					page += region_size;
-+				else
-+					break;
- #else
- 				page += PAGE_SIZE;
- #endif
-@@ -430,6 +470,7 @@ allocateBranchIsland(
- 			err = KERN_NO_SPACE;
- #endif
- 	} else {
-+		OSAtomicAdd64(1, &g_mach_override_allocation_attempts);
- 		void *block = malloc( sizeof( BranchIsland ) );
- 		if( block )
- 			*island = block;
-@@ -438,7 +479,7 @@ allocateBranchIsland(
- 	}
- 	if( !err )
- 		(**island).allocatedHigh = allocateHigh;
--	
-+
- 	return err;
- }
- 
-diff --git a/third_party/mach_override/mach_override.h b/third_party/mach_override/mach_override.h
-index ecd319c1cd7a..253f273d16b6 100644
---- a/third_party/mach_override/mach_override.h
-+++ b/third_party/mach_override/mach_override.h
-@@ -37,6 +37,18 @@ mach_override_ptr(
-     const void *overrideFunctionAddress,
-     void **originalFunctionReentryIsland );
- 
-+/****************************************************************************************
-+	mach_override_ptr makes multiple allocation attempts with vm_allocate or malloc,
-+  until a suitable address is found for the branch islands. This method returns the
-+  global number of such attempts made by all mach_override_ptr calls so far. This
-+  statistic is provided for testing purposes and it can be off, if mach_override_ptr
-+  is called by multiple threads.
-+
-+	@result									<-	Total number of vm_allocate calls so far.
-+
-+	************************************************************************************/
-+u_int64_t mach_override_ptr_allocation_attempts();
-+
- __END_DECLS
- 
- /****************************************************************************************
diff --git a/third_party/mach_override/libudis86/decode.c b/third_party/mach_override/libudis86/decode.c
deleted file mode 100644
index 2b352dc8..0000000
--- a/third_party/mach_override/libudis86/decode.c
+++ /dev/null
@@ -1,1094 +0,0 @@
-/* udis86 - libudis86/decode.c
- * 
- * Copyright (c) 2002-2009 Vivek Thampi
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without modification, 
- * are permitted provided that the following conditions are met:
- * 
- *     * Redistributions of source code must retain the above copyright notice, 
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice, 
- *       this list of conditions and the following disclaimer in the documentation 
- *       and/or other materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "udint.h"
-#include "types.h"
-#include "input.h"
-#include "decode.h"
-
-#ifndef __UD_STANDALONE__
-# include <string.h>
-#endif /* __UD_STANDALONE__ */
-
-/* The max number of prefixes to an instruction */
-#define MAX_PREFIXES    15
-
-/* rex prefix bits */
-#define REX_W(r)        ( ( 0xF & ( r ) )  >> 3 )
-#define REX_R(r)        ( ( 0x7 & ( r ) )  >> 2 )
-#define REX_X(r)        ( ( 0x3 & ( r ) )  >> 1 )
-#define REX_B(r)        ( ( 0x1 & ( r ) )  >> 0 )
-#define REX_PFX_MASK(n) ( ( P_REXW(n) << 3 ) | \
-                          ( P_REXR(n) << 2 ) | \
-                          ( P_REXX(n) << 1 ) | \
-                          ( P_REXB(n) << 0 ) )
-
-/* scable-index-base bits */
-#define SIB_S(b)        ( ( b ) >> 6 )
-#define SIB_I(b)        ( ( ( b ) >> 3 ) & 7 )
-#define SIB_B(b)        ( ( b ) & 7 )
-
-/* modrm bits */
-#define MODRM_REG(b)    ( ( ( b ) >> 3 ) & 7 )
-#define MODRM_NNN(b)    ( ( ( b ) >> 3 ) & 7 )
-#define MODRM_MOD(b)    ( ( ( b ) >> 6 ) & 3 )
-#define MODRM_RM(b)     ( ( b ) & 7 )
-
-static int decode_ext(struct ud *u, uint16_t ptr);
-
-enum reg_class { /* register classes */
-  REGCLASS_NONE,
-  REGCLASS_GPR,
-  REGCLASS_MMX,
-  REGCLASS_CR,
-  REGCLASS_DB,
-  REGCLASS_SEG,
-  REGCLASS_XMM
-};
-
-
-/*
- * inp_uint8
- * int_uint16
- * int_uint32
- * int_uint64
- *    Load little-endian values from input
- */
-static uint8_t 
-inp_uint8(struct ud* u)
-{
-  return ud_inp_next(u);
-}
-
-static uint16_t 
-inp_uint16(struct ud* u)
-{
-  uint16_t r, ret;
-
-  ret = ud_inp_next(u);
-  r = ud_inp_next(u);
-  return ret | (r << 8);
-}
-
-static uint32_t 
-inp_uint32(struct ud* u)
-{
-  uint32_t r, ret;
-
-  ret = ud_inp_next(u);
-  r = ud_inp_next(u);
-  ret = ret | (r << 8);
-  r = ud_inp_next(u);
-  ret = ret | (r << 16);
-  r = ud_inp_next(u);
-  return ret | (r << 24);
-}
-
-static uint64_t 
-inp_uint64(struct ud* u)
-{
-  uint64_t r, ret;
-
-  ret = ud_inp_next(u);
-  r = ud_inp_next(u);
-  ret = ret | (r << 8);
-  r = ud_inp_next(u);
-  ret = ret | (r << 16);
-  r = ud_inp_next(u);
-  ret = ret | (r << 24);
-  r = ud_inp_next(u);
-  ret = ret | (r << 32);
-  r = ud_inp_next(u);
-  ret = ret | (r << 40);
-  r = ud_inp_next(u);
-  ret = ret | (r << 48);
-  r = ud_inp_next(u);
-  return ret | (r << 56);
-}
-
-
-static inline int
-eff_opr_mode(int dis_mode, int rex_w, int pfx_opr)
-{
-  if (dis_mode == 64) {
-    return rex_w ? 64 : (pfx_opr ? 16 : 32);
-  } else if (dis_mode == 32) {
-    return pfx_opr ? 16 : 32;
-  } else {
-    UD_ASSERT(dis_mode == 16);
-    return pfx_opr ? 32 : 16;
-  }
-}
-
-
-static inline int
-eff_adr_mode(int dis_mode, int pfx_adr)
-{
-  if (dis_mode == 64) {
-    return pfx_adr ? 32 : 64;
-  } else if (dis_mode == 32) {
-    return pfx_adr ? 16 : 32;
-  } else {
-    UD_ASSERT(dis_mode == 16);
-    return pfx_adr ? 32 : 16;
-  }
-}
-
-
-/* Looks up mnemonic code in the mnemonic string table
- * Returns NULL if the mnemonic code is invalid
- */
-const char*
-ud_lookup_mnemonic(enum ud_mnemonic_code c)
-{
-  if (c < UD_MAX_MNEMONIC_CODE) {
-    return ud_mnemonics_str[c];
-  } else {
-    return NULL;
-  }
-}
-
-
-/* 
- * decode_prefixes
- *
- *  Extracts instruction prefixes.
- */
-static int 
-decode_prefixes(struct ud *u)
-{
-  int done = 0;
-  uint8_t curr;
-  UD_RETURN_ON_ERROR(u);
-
-  do {
-    ud_inp_next(u); 
-    UD_RETURN_ON_ERROR(u);
-    if (inp_len(u) == MAX_INSN_LENGTH) {
-      UD_RETURN_WITH_ERROR(u, "max instruction length");
-    }
-    curr = inp_curr(u);
-
-    switch (curr)  
-    {
-    case 0x2E : 
-      u->pfx_seg = UD_R_CS; 
-      break;
-    case 0x36 :     
-      u->pfx_seg = UD_R_SS; 
-      break;
-    case 0x3E : 
-      u->pfx_seg = UD_R_DS; 
-      break;
-    case 0x26 : 
-      u->pfx_seg = UD_R_ES; 
-      break;
-    case 0x64 : 
-      u->pfx_seg = UD_R_FS; 
-      break;
-    case 0x65 : 
-      u->pfx_seg = UD_R_GS; 
-      break;
-    case 0x67 : /* adress-size override prefix */ 
-      u->pfx_adr = 0x67;
-      break;
-    case 0xF0 : 
-      u->pfx_lock = 0xF0;
-      break;
-    case 0x66: 
-      u->pfx_opr = 0x66;
-      break;
-    case 0xF2:
-      u->pfx_str = 0xf2;
-      break;
-    case 0xF3:
-      u->pfx_str = 0xf3;
-      break;
-    default:
-      done = 1;
-      break;
-    }
-  } while (!done);
-
-  if (u->dis_mode == 64 && (curr & 0xF0) == 0x40) {
-    /* rex prefixes in 64bit mode, must be the last prefix
-     */
-    u->pfx_rex = curr;  
-  } else {
-    /* rewind back one byte in stream, since the above loop 
-     * stops with a non-prefix byte. 
-     */
-    inp_back(u);
-  }
-  return 0;
-}
-
-
-static inline unsigned int modrm( struct ud * u )
-{
-    if ( !u->have_modrm ) {
-        u->modrm = ud_inp_next( u );
-        u->have_modrm = 1;
-    }
-    return u->modrm;
-}
-
-
-static unsigned int
-resolve_operand_size( const struct ud * u, unsigned int s )
-{
-    switch ( s ) 
-    {
-    case SZ_V:
-        return ( u->opr_mode );
-    case SZ_Z:  
-        return ( u->opr_mode == 16 ) ? 16 : 32;
-    case SZ_Y:
-        return ( u->opr_mode == 16 ) ? 32 : u->opr_mode;
-    case SZ_RDQ:
-        return ( u->dis_mode == 64 ) ? 64 : 32;
-    default:
-        return s;
-    }
-}
-
-
-static int resolve_mnemonic( struct ud* u )
-{
-  /* resolve 3dnow weirdness. */
-  if ( u->mnemonic == UD_I3dnow ) {
-    u->mnemonic = ud_itab[ u->le->table[ inp_curr( u )  ] ].mnemonic;
-  }
-  /* SWAPGS is only valid in 64bits mode */
-  if ( u->mnemonic == UD_Iswapgs && u->dis_mode != 64 ) {
-    UDERR(u, "swapgs invalid in 64bits mode");
-    return -1;
-  }
-
-  if (u->mnemonic == UD_Ixchg) {
-    if ((u->operand[0].type == UD_OP_REG && u->operand[0].base == UD_R_AX  &&
-         u->operand[1].type == UD_OP_REG && u->operand[1].base == UD_R_AX) ||
-        (u->operand[0].type == UD_OP_REG && u->operand[0].base == UD_R_EAX &&
-         u->operand[1].type == UD_OP_REG && u->operand[1].base == UD_R_EAX)) {
-      u->operand[0].type = UD_NONE;
-      u->operand[1].type = UD_NONE;
-      u->mnemonic = UD_Inop;
-    }
-  }
-
-  if (u->mnemonic == UD_Inop && u->pfx_repe) {
-    u->pfx_repe = 0;
-    u->mnemonic = UD_Ipause;
-  }
-  return 0;
-}
-
-
-/* -----------------------------------------------------------------------------
- * decode_a()- Decodes operands of the type seg:offset
- * -----------------------------------------------------------------------------
- */
-static void 
-decode_a(struct ud* u, struct ud_operand *op)
-{
-  if (u->opr_mode == 16) {  
-    /* seg16:off16 */
-    op->type = UD_OP_PTR;
-    op->size = 32;
-    op->lval.ptr.off = inp_uint16(u);
-    op->lval.ptr.seg = inp_uint16(u);
-  } else {
-    /* seg16:off32 */
-    op->type = UD_OP_PTR;
-    op->size = 48;
-    op->lval.ptr.off = inp_uint32(u);
-    op->lval.ptr.seg = inp_uint16(u);
-  }
-}
-
-/* -----------------------------------------------------------------------------
- * decode_gpr() - Returns decoded General Purpose Register 
- * -----------------------------------------------------------------------------
- */
-static enum ud_type 
-decode_gpr(register struct ud* u, unsigned int s, unsigned char rm)
-{
-  switch (s) {
-    case 64:
-        return UD_R_RAX + rm;
-    case 32:
-        return UD_R_EAX + rm;
-    case 16:
-        return UD_R_AX  + rm;
-    case  8:
-        if (u->dis_mode == 64 && u->pfx_rex) {
-            if (rm >= 4)
-                return UD_R_SPL + (rm-4);
-            return UD_R_AL + rm;
-        } else return UD_R_AL + rm;
-    default:
-        UD_ASSERT(!"invalid operand size");
-        return 0;
-  }
-}
-
-static void
-decode_reg(struct ud *u, 
-           struct ud_operand *opr,
-           int type,
-           int num,
-           int size)
-{
-  int reg;
-  size = resolve_operand_size(u, size);
-  switch (type) {
-    case REGCLASS_GPR : reg = decode_gpr(u, size, num); break;
-    case REGCLASS_MMX : reg = UD_R_MM0  + (num & 7); break;
-    case REGCLASS_XMM : reg = UD_R_XMM0 + num; break;
-    case REGCLASS_CR : reg = UD_R_CR0  + num; break;
-    case REGCLASS_DB : reg = UD_R_DR0  + num; break;
-    case REGCLASS_SEG : {
-      /*
-       * Only 6 segment registers, anything else is an error.
-       */
-      if ((num & 7) > 5) {
-        UDERR(u, "invalid segment register value");
-        return;
-      } else {
-        reg = UD_R_ES + (num & 7);
-      }
-      break;
-    }
-    default:
-      UD_ASSERT(!"invalid register type");
-      break;
-  }
-  opr->type = UD_OP_REG;
-  opr->base = reg;
-  opr->size = size;
-}
-
-
-/*
- * decode_imm 
- *
- *    Decode Immediate values.
- */
-static void 
-decode_imm(struct ud* u, unsigned int size, struct ud_operand *op)
-{
-  op->size = resolve_operand_size(u, size);
-  op->type = UD_OP_IMM;
-
-  switch (op->size) {
-  case  8: op->lval.sbyte = inp_uint8(u);   break;
-  case 16: op->lval.uword = inp_uint16(u);  break;
-  case 32: op->lval.udword = inp_uint32(u); break;
-  case 64: op->lval.uqword = inp_uint64(u); break;
-  default: return;
-  }
-}
-
-
-/* 
- * decode_mem_disp
- *
- *    Decode mem address displacement.
- */
-static void 
-decode_mem_disp(struct ud* u, unsigned int size, struct ud_operand *op)
-{
-  switch (size) {
-  case 8:
-    op->offset = 8; 
-    op->lval.ubyte  = inp_uint8(u);
-    break;
-  case 16:
-    op->offset = 16; 
-    op->lval.uword  = inp_uint16(u); 
-    break;
-  case 32:
-    op->offset = 32; 
-    op->lval.udword = inp_uint32(u); 
-    break;
-  case 64:
-    op->offset = 64; 
-    op->lval.uqword = inp_uint64(u); 
-    break;
-  default:
-      return;
-  }
-}
-
-
-/*
- * decode_modrm_reg
- *
- *    Decodes reg field of mod/rm byte
- * 
- */
-static inline void
-decode_modrm_reg(struct ud         *u, 
-                 struct ud_operand *operand,
-                 unsigned int       type,
-                 unsigned int       size)
-{
-  uint8_t reg = (REX_R(u->pfx_rex) << 3) | MODRM_REG(modrm(u));
-  decode_reg(u, operand, type, reg, size);
-}
-
-
-/*
- * decode_modrm_rm
- *
- *    Decodes rm field of mod/rm byte
- * 
- */
-static void 
-decode_modrm_rm(struct ud         *u, 
-                struct ud_operand *op,
-                unsigned char      type,    /* register type */
-                unsigned int       size)    /* operand size */
-
-{
-  size_t offset = 0;
-  unsigned char mod, rm;
-
-  /* get mod, r/m and reg fields */
-  mod = MODRM_MOD(modrm(u));
-  rm  = (REX_B(u->pfx_rex) << 3) | MODRM_RM(modrm(u));
-
-  /* 
-   * If mod is 11b, then the modrm.rm specifies a register.
-   *
-   */
-  if (mod == 3) {
-    decode_reg(u, op, type, rm, size);
-    return;
-  }
-
-  /* 
-   * !11b => Memory Address
-   */  
-  op->type = UD_OP_MEM;
-  op->size = resolve_operand_size(u, size);
-
-  if (u->adr_mode == 64) {
-    op->base = UD_R_RAX + rm;
-    if (mod == 1) {
-      offset = 8;
-    } else if (mod == 2) {
-      offset = 32;
-    } else if (mod == 0 && (rm & 7) == 5) {           
-      op->base = UD_R_RIP;
-      offset = 32;
-    } else {
-      offset = 0;
-    }
-    /* 
-     * Scale-Index-Base (SIB) 
-     */
-    if ((rm & 7) == 4) {
-      ud_inp_next(u);
-      
-      op->scale = (1 << SIB_S(inp_curr(u))) & ~1;
-      op->index = UD_R_RAX + (SIB_I(inp_curr(u)) | (REX_X(u->pfx_rex) << 3));
-      op->base  = UD_R_RAX + (SIB_B(inp_curr(u)) | (REX_B(u->pfx_rex) << 3));
-
-      /* special conditions for base reference */
-      if (op->index == UD_R_RSP) {
-        op->index = UD_NONE;
-        op->scale = UD_NONE;
-      }
-
-      if (op->base == UD_R_RBP || op->base == UD_R_R13) {
-        if (mod == 0) {
-          op->base = UD_NONE;
-        } 
-        if (mod == 1) {
-          offset = 8;
-        } else {
-          offset = 32;
-        }
-      }
-    }
-  } else if (u->adr_mode == 32) {
-    op->base = UD_R_EAX + rm;
-    if (mod == 1) {
-      offset = 8;
-    } else if (mod == 2) {
-      offset = 32;
-    } else if (mod == 0 && rm == 5) {
-      op->base = UD_NONE;
-      offset = 32;
-    } else {
-      offset = 0;
-    }
-
-    /* Scale-Index-Base (SIB) */
-    if ((rm & 7) == 4) {
-      ud_inp_next(u);
-
-      op->scale = (1 << SIB_S(inp_curr(u))) & ~1;
-      op->index = UD_R_EAX + (SIB_I(inp_curr(u)) | (REX_X(u->pfx_rex) << 3));
-      op->base  = UD_R_EAX + (SIB_B(inp_curr(u)) | (REX_B(u->pfx_rex) << 3));
-
-      if (op->index == UD_R_ESP) {
-        op->index = UD_NONE;
-        op->scale = UD_NONE;
-      }
-
-      /* special condition for base reference */
-      if (op->base == UD_R_EBP) {
-        if (mod == 0) {
-          op->base = UD_NONE;
-        } 
-        if (mod == 1) {
-          offset = 8;
-        } else {
-          offset = 32;
-        }
-      }
-    }
-  } else {
-    const unsigned int bases[]   = { UD_R_BX, UD_R_BX, UD_R_BP, UD_R_BP,
-                                     UD_R_SI, UD_R_DI, UD_R_BP, UD_R_BX };
-    const unsigned int indices[] = { UD_R_SI, UD_R_DI, UD_R_SI, UD_R_DI,
-                                     UD_NONE, UD_NONE, UD_NONE, UD_NONE };
-    op->base  = bases[rm & 7];
-    op->index = indices[rm & 7];
-    if (mod == 0 && rm == 6) {
-      offset = 16;
-      op->base = UD_NONE;
-    } else if (mod == 1) {
-      offset = 8;
-    } else if (mod == 2) { 
-      offset = 16;
-    }
-  }
-
-  if (offset) {
-    decode_mem_disp(u, offset, op);
-  }
-}
-
-
-/* 
- * decode_moffset
- *    Decode offset-only memory operand
- */
-static void
-decode_moffset(struct ud *u, unsigned int size, struct ud_operand *opr)
-{
-  opr->type = UD_OP_MEM;
-  opr->size = resolve_operand_size(u, size);
-  decode_mem_disp(u, u->adr_mode, opr);
-}
-
-
-/* -----------------------------------------------------------------------------
- * decode_operands() - Disassembles Operands.
- * -----------------------------------------------------------------------------
- */
-static int
-decode_operand(struct ud           *u, 
-               struct ud_operand   *operand,
-               enum ud_operand_code type,
-               unsigned int         size)
-{
-  operand->_oprcode = type;
-
-  switch (type) {
-    case OP_A :
-      decode_a(u, operand);
-      break;
-    case OP_MR:
-      decode_modrm_rm(u, operand, REGCLASS_GPR, 
-                      MODRM_MOD(modrm(u)) == 3 ? 
-                        Mx_reg_size(size) : Mx_mem_size(size));
-      break;
-    case OP_F:
-      u->br_far  = 1;
-      /* intended fall through */
-    case OP_M:
-      if (MODRM_MOD(modrm(u)) == 3) {
-        UDERR(u, "expected modrm.mod != 3");
-      }
-      /* intended fall through */
-    case OP_E:
-      decode_modrm_rm(u, operand, REGCLASS_GPR, size);
-      break;
-    case OP_G:
-      decode_modrm_reg(u, operand, REGCLASS_GPR, size);
-      break;
-    case OP_sI:
-    case OP_I:
-      decode_imm(u, size, operand);
-      break;
-    case OP_I1:
-      operand->type = UD_OP_CONST;
-      operand->lval.udword = 1;
-      break;
-    case OP_N:
-      if (MODRM_MOD(modrm(u)) != 3) {
-        UDERR(u, "expected modrm.mod == 3");
-      }
-      /* intended fall through */
-    case OP_Q:
-      decode_modrm_rm(u, operand, REGCLASS_MMX, size);
-      break;
-    case OP_P:
-      decode_modrm_reg(u, operand, REGCLASS_MMX, size);
-      break;
-    case OP_U:
-      if (MODRM_MOD(modrm(u)) != 3) {
-        UDERR(u, "expected modrm.mod == 3");
-      }
-      /* intended fall through */
-    case OP_W:
-      decode_modrm_rm(u, operand, REGCLASS_XMM, size);
-      break;
-    case OP_V:
-      decode_modrm_reg(u, operand, REGCLASS_XMM, size);
-      break;
-    case OP_MU:
-      decode_modrm_rm(u, operand, REGCLASS_XMM, 
-                      MODRM_MOD(modrm(u)) == 3 ? 
-                        Mx_reg_size(size) : Mx_mem_size(size));
-      break;
-    case OP_S:
-      decode_modrm_reg(u, operand, REGCLASS_SEG, size);
-      break;
-    case OP_O:
-      decode_moffset(u, size, operand);
-      break;
-    case OP_R0: 
-    case OP_R1: 
-    case OP_R2: 
-    case OP_R3: 
-    case OP_R4: 
-    case OP_R5: 
-    case OP_R6: 
-    case OP_R7:
-      decode_reg(u, operand, REGCLASS_GPR, 
-                 (REX_B(u->pfx_rex) << 3) | (type - OP_R0), size);
-      break;
-    case OP_AL:
-    case OP_AX:
-    case OP_eAX:
-    case OP_rAX:
-      decode_reg(u, operand, REGCLASS_GPR, 0, size);
-      break;
-    case OP_CL:
-    case OP_CX:
-    case OP_eCX:
-      decode_reg(u, operand, REGCLASS_GPR, 1, size);
-      break;
-    case OP_DL:
-    case OP_DX:
-    case OP_eDX:
-      decode_reg(u, operand, REGCLASS_GPR, 2, size);
-      break;
-    case OP_ES: 
-    case OP_CS: 
-    case OP_DS:
-    case OP_SS: 
-    case OP_FS: 
-    case OP_GS:
-      /* in 64bits mode, only fs and gs are allowed */
-      if (u->dis_mode == 64) {
-        if (type != OP_FS && type != OP_GS) {
-          UDERR(u, "invalid segment register in 64bits");
-        }
-      }
-      operand->type = UD_OP_REG;
-      operand->base = (type - OP_ES) + UD_R_ES;
-      operand->size = 16;
-      break;
-    case OP_J :
-      decode_imm(u, size, operand);
-      operand->type = UD_OP_JIMM;
-      break ;
-    case OP_R :
-      if (MODRM_MOD(modrm(u)) != 3) {
-        UDERR(u, "expected modrm.mod == 3");
-      }
-      decode_modrm_rm(u, operand, REGCLASS_GPR, size);
-      break;
-    case OP_C:
-      decode_modrm_reg(u, operand, REGCLASS_CR, size);
-      break;
-    case OP_D:
-      decode_modrm_reg(u, operand, REGCLASS_DB, size);
-      break;
-    case OP_I3 :
-      operand->type = UD_OP_CONST;
-      operand->lval.sbyte = 3;
-      break;
-    case OP_ST0: 
-    case OP_ST1: 
-    case OP_ST2: 
-    case OP_ST3:
-    case OP_ST4:
-    case OP_ST5: 
-    case OP_ST6: 
-    case OP_ST7:
-      operand->type = UD_OP_REG;
-      operand->base = (type - OP_ST0) + UD_R_ST0;
-      operand->size = 80;
-      break;
-    default :
-      break;
-  }
-  return 0;
-}
-
-
-/* 
- * decode_operands
- *
- *    Disassemble upto 3 operands of the current instruction being
- *    disassembled. By the end of the function, the operand fields
- *    of the ud structure will have been filled.
- */
-static int
-decode_operands(struct ud* u)
-{
-  decode_operand(u, &u->operand[0],
-                    u->itab_entry->operand1.type,
-                    u->itab_entry->operand1.size);
-  decode_operand(u, &u->operand[1],
-                    u->itab_entry->operand2.type,
-                    u->itab_entry->operand2.size);
-  decode_operand(u, &u->operand[2],
-                    u->itab_entry->operand3.type,
-                    u->itab_entry->operand3.size);
-  return 0;
-}
-    
-/* -----------------------------------------------------------------------------
- * clear_insn() - clear instruction structure
- * -----------------------------------------------------------------------------
- */
-static void
-clear_insn(register struct ud* u)
-{
-  u->error     = 0;
-  u->pfx_seg   = 0;
-  u->pfx_opr   = 0;
-  u->pfx_adr   = 0;
-  u->pfx_lock  = 0;
-  u->pfx_repne = 0;
-  u->pfx_rep   = 0;
-  u->pfx_repe  = 0;
-  u->pfx_rex   = 0;
-  u->pfx_str   = 0;
-  u->mnemonic  = UD_Inone;
-  u->itab_entry = NULL;
-  u->have_modrm = 0;
-  u->br_far    = 0;
-
-  memset( &u->operand[ 0 ], 0, sizeof( struct ud_operand ) );
-  memset( &u->operand[ 1 ], 0, sizeof( struct ud_operand ) );
-  memset( &u->operand[ 2 ], 0, sizeof( struct ud_operand ) );
-}
-
-
-static inline int
-resolve_pfx_str(struct ud* u)
-{
-  if (u->pfx_str == 0xf3) {
-    if (P_STR(u->itab_entry->prefix)) {
-        u->pfx_rep  = 0xf3;
-    } else {
-        u->pfx_repe = 0xf3;
-    }
-  } else if (u->pfx_str == 0xf2) {
-    u->pfx_repne = 0xf3;
-  }
-  return 0;
-}
-
-
-static int
-resolve_mode( struct ud* u )
-{
-  /* if in error state, bail out */
-  if ( u->error ) return -1; 
-
-  /* propagate prefix effects */
-  if ( u->dis_mode == 64 ) {  /* set 64bit-mode flags */
-
-    /* Check validity of  instruction m64 */
-    if ( P_INV64( u->itab_entry->prefix ) ) {
-      UDERR(u, "instruction invalid in 64bits");
-      return -1;
-    }
-
-    /* effective rex prefix is the  effective mask for the 
-     * instruction hard-coded in the opcode map.
-     */
-    u->pfx_rex = ( u->pfx_rex & 0x40 ) | 
-                 ( u->pfx_rex & REX_PFX_MASK( u->itab_entry->prefix ) ); 
-
-    /* whether this instruction has a default operand size of 
-     * 64bit, also hardcoded into the opcode map.
-     */
-    u->default64 = P_DEF64( u->itab_entry->prefix ); 
-    /* calculate effective operand size */
-    if ( REX_W( u->pfx_rex ) ) {
-        u->opr_mode = 64;
-    } else if ( u->pfx_opr ) {
-        u->opr_mode = 16;
-    } else {
-        /* unless the default opr size of instruction is 64,
-         * the effective operand size in the absence of rex.w
-         * prefix is 32.
-         */
-        u->opr_mode = ( u->default64 ) ? 64 : 32;
-    }
-
-    /* calculate effective address size */
-    u->adr_mode = (u->pfx_adr) ? 32 : 64;
-  } else if ( u->dis_mode == 32 ) { /* set 32bit-mode flags */
-    u->opr_mode = ( u->pfx_opr ) ? 16 : 32;
-    u->adr_mode = ( u->pfx_adr ) ? 16 : 32;
-  } else if ( u->dis_mode == 16 ) { /* set 16bit-mode flags */
-    u->opr_mode = ( u->pfx_opr ) ? 32 : 16;
-    u->adr_mode = ( u->pfx_adr ) ? 32 : 16;
-  }
-
-  /* set flags for implicit addressing */
-  u->implicit_addr = P_IMPADDR( u->itab_entry->prefix );
-
-  return 0;
-}
-
-
-static inline int
-decode_insn(struct ud *u, uint16_t ptr)
-{
-  UD_ASSERT((ptr & 0x8000) == 0);
-  u->itab_entry = &ud_itab[ ptr ];
-  u->mnemonic = u->itab_entry->mnemonic;
-  return (resolve_pfx_str(u)  == 0 &&
-          resolve_mode(u)     == 0 &&
-          decode_operands(u)  == 0 &&
-          resolve_mnemonic(u) == 0) ? 0 : -1;
-}
-
-
-/*
- * decode_3dnow()
- *
- *    Decoding 3dnow is a little tricky because of its strange opcode
- *    structure. The final opcode disambiguation depends on the last
- *    byte that comes after the operands have been decoded. Fortunately,
- *    all 3dnow instructions have the same set of operand types. So we
- *    go ahead and decode the instruction by picking an arbitrarily chosen
- *    valid entry in the table, decode the operands, and read the final
- *    byte to resolve the menmonic.
- */
-static inline int
-decode_3dnow(struct ud* u)
-{
-  uint16_t ptr;
-  UD_ASSERT(u->le->type == UD_TAB__OPC_3DNOW);
-  UD_ASSERT(u->le->table[0xc] != 0);
-  decode_insn(u, u->le->table[0xc]);
-  ud_inp_next(u); 
-  if (u->error) {
-    return -1;
-  }
-  ptr = u->le->table[inp_curr(u)]; 
-  UD_ASSERT((ptr & 0x8000) == 0);
-  u->mnemonic = ud_itab[ptr].mnemonic;
-  return 0;
-}
-
-
-static int
-decode_ssepfx(struct ud *u)
-{
-  uint8_t idx;
-  uint8_t pfx;
- 
-  /*
-   * String prefixes (f2, f3) take precedence over operand
-   * size prefix (66).
-   */
-  pfx = u->pfx_str;
-  if (pfx == 0) {
-    pfx = u->pfx_opr;
-  }
-  idx = ((pfx & 0xf) + 1) / 2;
-  if (u->le->table[idx] == 0) {
-    idx = 0;
-  }
-  if (idx && u->le->table[idx] != 0) {
-    /*
-     * "Consume" the prefix as a part of the opcode, so it is no
-     * longer exported as an instruction prefix.
-     */
-    u->pfx_str = 0;
-    if (pfx == 0x66) {
-        /* 
-         * consume "66" only if it was used for decoding, leaving
-         * it to be used as an operands size override for some
-         * simd instructions.
-         */
-        u->pfx_opr = 0;
-    }
-  }
-  return decode_ext(u, u->le->table[idx]);
-}
-
-
-/*
- * decode_ext()
- *
- *    Decode opcode extensions (if any)
- */
-static int
-decode_ext(struct ud *u, uint16_t ptr)
-{
-  uint8_t idx = 0;
-  if ((ptr & 0x8000) == 0) {
-    return decode_insn(u, ptr); 
-  }
-  u->le = &ud_lookup_table_list[(~0x8000 & ptr)];
-  if (u->le->type == UD_TAB__OPC_3DNOW) {
-    return decode_3dnow(u);
-  }
-
-  switch (u->le->type) {
-    case UD_TAB__OPC_MOD:
-      /* !11 = 0, 11 = 1 */
-      idx = (MODRM_MOD(modrm(u)) + 1) / 4;
-      break;
-      /* disassembly mode/operand size/address size based tables.
-       * 16 = 0,, 32 = 1, 64 = 2
-       */
-    case UD_TAB__OPC_MODE:
-      idx = u->dis_mode != 64 ? 0 : 1;
-      break;
-    case UD_TAB__OPC_OSIZE:
-      idx = eff_opr_mode(u->dis_mode, REX_W(u->pfx_rex), u->pfx_opr) / 32;
-      break;
-    case UD_TAB__OPC_ASIZE:
-      idx = eff_adr_mode(u->dis_mode, u->pfx_adr) / 32;
-      break;
-    case UD_TAB__OPC_X87:
-      idx = modrm(u) - 0xC0;
-      break;
-    case UD_TAB__OPC_VENDOR:
-      if (u->vendor == UD_VENDOR_ANY) {
-        /* choose a valid entry */
-        idx = (u->le->table[idx] != 0) ? 0 : 1;
-      } else if (u->vendor == UD_VENDOR_AMD) {
-        idx = 0;
-      } else {
-        idx = 1;
-      }
-      break;
-    case UD_TAB__OPC_RM:
-      idx = MODRM_RM(modrm(u));
-      break;
-    case UD_TAB__OPC_REG:
-      idx = MODRM_REG(modrm(u));
-      break;
-    case UD_TAB__OPC_SSE:
-      return decode_ssepfx(u);
-    default:
-      UD_ASSERT(!"not reached");
-      break;
-  }
-
-  return decode_ext(u, u->le->table[idx]);
-}
-
-
-static int
-decode_opcode(struct ud *u)
-{
-  uint16_t ptr;
-  UD_ASSERT(u->le->type == UD_TAB__OPC_TABLE);
-  ud_inp_next(u); 
-  if (u->error) {
-    return -1;
-  }
-  u->primary_opcode = inp_curr(u);
-  ptr = u->le->table[inp_curr(u)];
-  if (ptr & 0x8000) {
-    u->le = &ud_lookup_table_list[ptr & ~0x8000];
-    if (u->le->type == UD_TAB__OPC_TABLE) {
-      return decode_opcode(u);
-    }
-  }
-  return decode_ext(u, ptr);
-}
-
- 
-/* =============================================================================
- * ud_decode() - Instruction decoder. Returns the number of bytes decoded.
- * =============================================================================
- */
-unsigned int
-ud_decode(struct ud *u)
-{
-  inp_start(u);
-  clear_insn(u);
-  u->le = &ud_lookup_table_list[0];
-  u->error = decode_prefixes(u) == -1 || 
-             decode_opcode(u)   == -1 ||
-             u->error;
-  /* Handle decode error. */
-  if (u->error) {
-    /* clear out the decode data. */
-    clear_insn(u);
-    /* mark the sequence of bytes as invalid. */
-    u->itab_entry = &ud_itab[0]; /* entry 0 is invalid */
-    u->mnemonic = u->itab_entry->mnemonic;
-  } 
-
-    /* maybe this stray segment override byte
-     * should be spewed out?
-     */
-    if ( !P_SEG( u->itab_entry->prefix ) && 
-            u->operand[0].type != UD_OP_MEM &&
-            u->operand[1].type != UD_OP_MEM )
-        u->pfx_seg = 0;
-
-  u->insn_offset = u->pc; /* set offset of instruction */
-  u->asm_buf_fill = 0;   /* set translation buffer index to 0 */
-  u->pc += u->inp_ctr;    /* move program counter by bytes decoded */
-
-  /* return number of bytes disassembled. */
-  return u->inp_ctr;
-}
-
-/*
-vim: set ts=2 sw=2 expandtab
-*/
diff --git a/third_party/mach_override/libudis86/decode.h b/third_party/mach_override/libudis86/decode.h
deleted file mode 100644
index a7362c8..0000000
--- a/third_party/mach_override/libudis86/decode.h
+++ /dev/null
@@ -1,195 +0,0 @@
-/* udis86 - libudis86/decode.h
- *
- * Copyright (c) 2002-2009 Vivek Thampi
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without modification, 
- * are permitted provided that the following conditions are met:
- * 
- *     * Redistributions of source code must retain the above copyright notice, 
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice, 
- *       this list of conditions and the following disclaimer in the documentation 
- *       and/or other materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef UD_DECODE_H
-#define UD_DECODE_H
-
-#include "types.h"
-#include "itab.h"
-
-#define MAX_INSN_LENGTH 15
-
-/* itab prefix bits */
-#define P_none          ( 0 )
-#define P_cast          ( 1 << 0 )
-#define P_CAST(n)       ( ( n >> 0 ) & 1 )
-#define P_rexb          ( 1 << 1 )
-#define P_REXB(n)       ( ( n >> 1 ) & 1 )
-#define P_inv64         ( 1 << 4 )
-#define P_INV64(n)      ( ( n >> 4 ) & 1 )
-#define P_rexw          ( 1 << 5 )
-#define P_REXW(n)       ( ( n >> 5 ) & 1 )
-#define P_def64         ( 1 << 7 )
-#define P_DEF64(n)      ( ( n >> 7 ) & 1 )
-#define P_rexr          ( 1 << 8 )
-#define P_REXR(n)       ( ( n >> 8 ) & 1 )
-#define P_oso           ( 1 << 9 )
-#define P_OSO(n)        ( ( n >> 9 ) & 1 )
-#define P_aso           ( 1 << 10 )
-#define P_ASO(n)        ( ( n >> 10 ) & 1 )
-#define P_rexx          ( 1 << 11 )
-#define P_REXX(n)       ( ( n >> 11 ) & 1 )
-#define P_ImpAddr       ( 1 << 12 )
-#define P_IMPADDR(n)    ( ( n >> 12 ) & 1 )
-#define P_seg           ( 1 << 13 )
-#define P_SEG(n)        ( ( n >> 13 ) & 1 )
-#define P_str           ( 1 << 14 )
-#define P_STR(n)        ( ( n >> 14 ) & 1 )
-#define P_strz          ( 1 << 15 )
-#define P_STR_ZF(n)     ( ( n >> 15 ) & 1 )
-
-/* operand type constants -- order is important! */
-
-enum ud_operand_code {
-    OP_NONE,
-
-    OP_A,      OP_E,      OP_M,       OP_G,       
-    OP_I,      OP_F,
-
-    OP_R0,     OP_R1,     OP_R2,      OP_R3,
-    OP_R4,     OP_R5,     OP_R6,      OP_R7,
-
-    OP_AL,     OP_CL,     OP_DL,
-    OP_AX,     OP_CX,     OP_DX,
-    OP_eAX,    OP_eCX,    OP_eDX,
-    OP_rAX,    OP_rCX,    OP_rDX,
-
-    OP_ES,     OP_CS,     OP_SS,      OP_DS,  
-    OP_FS,     OP_GS,
-
-    OP_ST0,    OP_ST1,    OP_ST2,     OP_ST3,
-    OP_ST4,    OP_ST5,    OP_ST6,     OP_ST7,
-
-    OP_J,      OP_S,      OP_O,          
-    OP_I1,     OP_I3,     OP_sI,
-
-    OP_V,      OP_W,      OP_Q,       OP_P, 
-    OP_U,      OP_N,      OP_MU,
-
-    OP_R,      OP_C,      OP_D,       
-
-    OP_MR
-} UD_ATTR_PACKED;
-
-
-/* operand size constants */
-
-enum ud_operand_size {
-    SZ_NA  = 0,
-    SZ_Z   = 1,
-    SZ_V   = 2,
-    SZ_RDQ = 7,
-
-    /* the following values are used as is,
-     * and thus hard-coded. changing them 
-     * will break internals 
-     */
-    SZ_B   = 8,
-    SZ_W   = 16,
-    SZ_D   = 32,
-    SZ_Q   = 64,
-    SZ_T   = 80,
-    SZ_O   = 128,
-
-    SZ_Y   = 17,
-
-    /*
-     * complex size types, that encode sizes for operands
-     * of type MR (memory or register), for internal use
-     * only. Id space 256 and above.
-     */
-    SZ_BD  = (SZ_B << 8) | SZ_D,
-    SZ_BV  = (SZ_B << 8) | SZ_V,
-    SZ_WD  = (SZ_W << 8) | SZ_D,
-    SZ_WV  = (SZ_W << 8) | SZ_V,
-    SZ_WY  = (SZ_W << 8) | SZ_Y,
-    SZ_DY  = (SZ_D << 8) | SZ_Y,
-    SZ_WO  = (SZ_W << 8) | SZ_O,
-    SZ_DO  = (SZ_D << 8) | SZ_O,
-    SZ_QO  = (SZ_Q << 8) | SZ_O,
-
-} UD_ATTR_PACKED;
-
-
-/* resolve complex size type.
- */
-static inline enum ud_operand_size
-Mx_mem_size(enum ud_operand_size size)
-{
-    return (size >> 8) & 0xff;
-}
-
-static inline enum ud_operand_size
-Mx_reg_size(enum ud_operand_size size)
-{
-    return size & 0xff;
-}
-
-/* A single operand of an entry in the instruction table. 
- * (internal use only)
- */
-struct ud_itab_entry_operand 
-{
-  enum ud_operand_code type;
-  enum ud_operand_size size;
-};
-
-
-/* A single entry in an instruction table. 
- *(internal use only)
- */
-struct ud_itab_entry 
-{
-  enum ud_mnemonic_code         mnemonic;
-  struct ud_itab_entry_operand  operand1;
-  struct ud_itab_entry_operand  operand2;
-  struct ud_itab_entry_operand  operand3;
-  uint32_t                      prefix;
-};
-
-struct ud_lookup_table_list_entry {
-    const uint16_t *table;
-    enum ud_table_type type;
-    const char *meta;
-};
-     
-
-
-static inline int
-ud_opcode_field_sext(uint8_t primary_opcode)
-{
-  return (primary_opcode & 0x02) != 0;
-}
-
-extern struct ud_itab_entry ud_itab[];
-extern struct ud_lookup_table_list_entry ud_lookup_table_list[];
-
-#endif /* UD_DECODE_H */
-
-/* vim:cindent
- * vim:expandtab
- * vim:ts=4
- * vim:sw=4
- */
diff --git a/third_party/mach_override/libudis86/extern.h b/third_party/mach_override/libudis86/extern.h
deleted file mode 100644
index 6dc17298..0000000
--- a/third_party/mach_override/libudis86/extern.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/* udis86 - libudis86/extern.h
- *
- * Copyright (c) 2002-2009, 2013 Vivek Thampi
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without modification, 
- * are permitted provided that the following conditions are met:
- * 
- *     * Redistributions of source code must retain the above copyright notice, 
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice, 
- *       this list of conditions and the following disclaimer in the documentation 
- *       and/or other materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef UD_EXTERN_H
-#define UD_EXTERN_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "types.h"
-
-/* ============================= PUBLIC API ================================= */
-
-extern void ud_init(struct ud*);
-
-extern void ud_set_mode(struct ud*, uint8_t);
-
-extern void ud_set_pc(struct ud*, uint64_t);
-
-extern void ud_set_input_hook(struct ud*, int (*)(struct ud*));
-
-extern void ud_set_input_buffer(struct ud*, const uint8_t*, size_t);
-
-#ifndef __UD_STANDALONE__
-extern void ud_set_input_file(struct ud*, FILE*);
-#endif /* __UD_STANDALONE__ */
-
-extern void ud_set_vendor(struct ud*, unsigned);
-
-extern void ud_set_syntax(struct ud*, void (*)(struct ud*));
-
-extern void ud_input_skip(struct ud*, size_t);
-
-extern int ud_input_end(const struct ud*);
-
-extern unsigned int ud_decode(struct ud*);
-
-extern unsigned int ud_disassemble(struct ud*);
-
-extern void ud_translate_intel(struct ud*);
-
-extern void ud_translate_att(struct ud*);
-
-extern const char* ud_insn_asm(const struct ud* u);
-
-extern const uint8_t* ud_insn_ptr(const struct ud* u);
-
-extern uint64_t ud_insn_off(const struct ud*);
-
-extern const char* ud_insn_hex(struct ud*);
-
-extern unsigned int ud_insn_len(const struct ud* u);
-
-extern const struct ud_operand* ud_insn_opr(const struct ud *u, unsigned int n);
-
-extern int ud_opr_is_sreg(const struct ud_operand *opr);
-
-extern int ud_opr_isgpr(const struct ud_operand *opr);
-
-extern const char* ud_lookup_mnemonic(enum ud_mnemonic_code c);
-
-extern void ud_set_user_opaque_data(struct ud*, void*);
-
-extern void* ud_get_user_opaque_data(const struct ud*);
-
-extern uint64_t ud_insn_sext_imm(const struct ud*, const struct ud_operand*);
-
-extern void ud_set_asm_buffer(struct ud *u, char *buf, size_t size);
-
-extern void ud_set_sym_resolver(struct ud *u, 
-                                const char* (*resolver)(struct ud*, 
-                                                        uint64_t addr,
-                                                        int64_t *offset));
-
-/* ========================================================================== */
-
-#ifdef __cplusplus
-}
-#endif
-#endif /* UD_EXTERN_H */
diff --git a/third_party/mach_override/libudis86/input.c b/third_party/mach_override/libudis86/input.c
deleted file mode 100644
index 58457a5..0000000
--- a/third_party/mach_override/libudis86/input.c
+++ /dev/null
@@ -1,175 +0,0 @@
-/* udis86 - libudis86/input.c
- *
- * Copyright (c) 2002-2009 Vivek Thampi
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without modification, 
- * are permitted provided that the following conditions are met:
- * 
- *     * Redistributions of source code must retain the above copyright notice, 
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice, 
- *       this list of conditions and the following disclaimer in the documentation 
- *       and/or other materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "extern.h"
-#include "types.h"
-#include "input.h"
-#include "udint.h"
-
-/* 
- * inp_init
- *    Initializes the input system.
- */
-static void
-inp_init(struct ud *u)
-{
-  u->inp_curr = 0;
-  u->inp_fill = 0;
-  u->inp_ctr  = 0;
-  u->inp_end  = 0;
-}
-
-
-/* -----------------------------------------------------------------------------
- * inp_buff_hook() - Hook for buffered inputs.
- * -----------------------------------------------------------------------------
- */
-static int 
-inp_buff_hook(struct ud* u)
-{
-  if (u->inp_buff < u->inp_buff_end)
-  return *u->inp_buff++;
-  else  return -1;
-}
-
-#ifndef __UD_STANDALONE__
-/* -----------------------------------------------------------------------------
- * inp_file_hook() - Hook for FILE inputs.
- * -----------------------------------------------------------------------------
- */
-static int 
-inp_file_hook(struct ud* u)
-{
-  return fgetc(u->inp_file);
-}
-#endif /* __UD_STANDALONE__*/
-
-/* =============================================================================
- * ud_inp_set_hook() - Sets input hook.
- * =============================================================================
- */
-void 
-ud_set_input_hook(register struct ud* u, int (*hook)(struct ud*))
-{
-  u->inp_hook = hook;
-  inp_init(u);
-}
-
-/* =============================================================================
- * ud_inp_set_buffer() - Set buffer as input.
- * =============================================================================
- */
-void 
-ud_set_input_buffer(register struct ud* u, const uint8_t* buf, size_t len)
-{
-  u->inp_hook = inp_buff_hook;
-  u->inp_buff = buf;
-  u->inp_buff_end = buf + len;
-  inp_init(u);
-}
-
-#ifndef __UD_STANDALONE__
-/* =============================================================================
- * ud_input_set_file() - Set buffer as input.
- * =============================================================================
- */
-void 
-ud_set_input_file(register struct ud* u, FILE* f)
-{
-  u->inp_hook = inp_file_hook;
-  u->inp_file = f;
-  inp_init(u);
-}
-#endif /* __UD_STANDALONE__ */
-
-/* =============================================================================
- * ud_input_skip() - Skip n input bytes.
- * =============================================================================
- */
-void 
-ud_input_skip(struct ud* u, size_t n)
-{
-  while (n--) {
-    u->inp_hook(u);
-  }
-}
-
-/* =============================================================================
- * ud_input_end() - Test for end of input.
- * =============================================================================
- */
-int 
-ud_input_end(const struct ud* u)
-{
-  return (u->inp_curr == u->inp_fill) && u->inp_end;
-}
-
-
-/* 
- * ud_inp_next
- *    Loads and returns the next byte from input.
- *
- *    inp_curr and inp_fill are pointers to the cache. The program is
- *    written based on the property that they are 8-bits in size, and
- *    will eventually wrap around forming a circular buffer. So, the 
- *    size of the cache is 256 in size, kind of unnecessary yet 
- *    optimal.
- *
- *    A buffer inp_sess stores the bytes disassembled for a single
- *    session.
- */
-uint8_t
-ud_inp_next(struct ud* u) 
-{
-  int c = -1;
-  /* if current pointer is not upto the fill point in the 
-   * input cache.
-   */
-  if (u->inp_curr != u->inp_fill) {
-    c = u->inp_cache[ ++u->inp_curr ];
-  /* if !end-of-input, call the input hook and get a byte */
-  } else if (u->inp_end || (c = u->inp_hook(u)) == -1) {
-    /* end-of-input, mark it as an error, since the decoder,
-     * expected a byte more.
-     */
-    UDERR(u, "byte expected, eoi received");
-    /* flag end of input */
-    u->inp_end = 1;
-    return 0;
-  } else {
-    /* increment pointers, we have a new byte.  */
-    u->inp_curr = ++u->inp_fill;
-    /* add the byte to the cache */
-    u->inp_cache[u->inp_fill] = c;
-  }
-  /* record bytes input per decode-session. */
-  u->inp_sess[u->inp_ctr++] = c;
-  /* return byte */
-  return  (uint8_t) c;
-}
-
-/*
-vim: set ts=2 sw=2 expandtab
-*/
diff --git a/third_party/mach_override/libudis86/input.h b/third_party/mach_override/libudis86/input.h
deleted file mode 100644
index a4ee7f51..0000000
--- a/third_party/mach_override/libudis86/input.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/* udis86 - libudis86/input.h
- *
- * Copyright (c) 2002-2009 Vivek Thampi
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without modification, 
- * are permitted provided that the following conditions are met:
- * 
- *     * Redistributions of source code must retain the above copyright notice, 
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice, 
- *       this list of conditions and the following disclaimer in the documentation 
- *       and/or other materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef UD_INPUT_H
-#define UD_INPUT_H
-
-#include "types.h"
-#include "udint.h"
-
-uint8_t ud_inp_next(struct ud* u);
-
-/* 
- * inp_start
- *    Should be called before each de-code operation.
- */
-static inline void
-inp_start(struct ud *u)
-{
-  u->inp_ctr = 0;
-}
-
-/* inp_reset
- *    Resets the current pointer to its position before the current
- *    instruction disassembly was started.
- */
-static inline void
-inp_reset(struct ud *u)
-{
-  u->inp_curr -= u->inp_ctr;
-  u->inp_ctr   = 0;
-}
-
-/* inp_sess
- *    Returns the pointer to current session.
- */
-static inline uint8_t*
-inp_sess(struct ud *u)
-{
-  return u->inp_sess;
-}
-
-/* 
- * inp_curr 
- *    Returns the current input byte.
- */
-static inline uint8_t
-inp_curr(const struct ud *u)
-{
-  return u->inp_cache[u->inp_curr];
-}
-
-/*
- * inp_back
- *    Move back a single byte in the stream.
- */
-static inline void
-inp_back(struct ud* u) 
-{
-  if (u->inp_ctr > 0) {
-    --u->inp_curr;
-    --u->inp_ctr;
-  }
-}
-
-/* 
- * inp_peek
- *    Peek next byte in input. 
- */
-static inline uint8_t
-inp_peek(struct ud* u) 
-{
-  uint8_t r = ud_inp_next(u);
-  if (!u->error) {
-      inp_back(u); /* Don't backup if there was an error */
-  }
-  return r;
-}
-
-
-/*
- * inp_len
- *    Returns the number of bytes input in the current
- *    session.
- */
-static inline size_t
-inp_len(const struct ud *u)
-{
-  return u->inp_ctr;
-}
-
-#endif /* UD_INPUT_H */
-/*
-vim: set ts=2 sw=2 expandtab
-*/
diff --git a/third_party/mach_override/libudis86/itab.c b/third_party/mach_override/libudis86/itab.c
deleted file mode 100644
index 06d690f..0000000
--- a/third_party/mach_override/libudis86/itab.c
+++ /dev/null
@@ -1,8401 +0,0 @@
-/* itab.c -- generated by udis86:scripts/ud_itab.py, do no edit */
-#include "decode.h"
-
-#define GROUP(n) (0x8000 | (n))
-
-
-static const uint16_t ud_itab__1[] = {
-  /*  0 */           7,           0,
-};
-
-static const uint16_t ud_itab__2[] = {
-  /*  0 */           8,           0,
-};
-
-static const uint16_t ud_itab__3[] = {
-  /*  0 */          15,           0,
-};
-
-static const uint16_t ud_itab__6[] = {
-  /*  0 */          16,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__7[] = {
-  /*  0 */          17,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__8[] = {
-  /*  0 */          18,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__9[] = {
-  /*  0 */          19,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__10[] = {
-  /*  0 */          20,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__11[] = {
-  /*  0 */          21,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__5[] = {
-  /*  0 */    GROUP(6),    GROUP(7),    GROUP(8),    GROUP(9),
-  /*  4 */   GROUP(10),   GROUP(11),           0,           0,
-};
-
-static const uint16_t ud_itab__15[] = {
-  /*  0 */          22,           0,
-};
-
-static const uint16_t ud_itab__14[] = {
-  /*  0 */   GROUP(15),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__17[] = {
-  /*  0 */          23,           0,
-};
-
-static const uint16_t ud_itab__16[] = {
-  /*  0 */   GROUP(17),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__19[] = {
-  /*  0 */          24,           0,
-};
-
-static const uint16_t ud_itab__18[] = {
-  /*  0 */   GROUP(19),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__21[] = {
-  /*  0 */          25,           0,
-};
-
-static const uint16_t ud_itab__20[] = {
-  /*  0 */   GROUP(21),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__23[] = {
-  /*  0 */          26,           0,
-};
-
-static const uint16_t ud_itab__22[] = {
-  /*  0 */   GROUP(23),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__25[] = {
-  /*  0 */          27,           0,
-};
-
-static const uint16_t ud_itab__24[] = {
-  /*  0 */   GROUP(25),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__27[] = {
-  /*  0 */          28,           0,
-};
-
-static const uint16_t ud_itab__26[] = {
-  /*  0 */   GROUP(27),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__13[] = {
-  /*  0 */   GROUP(14),   GROUP(16),   GROUP(18),   GROUP(20),
-  /*  4 */   GROUP(22),           0,   GROUP(24),   GROUP(26),
-};
-
-static const uint16_t ud_itab__32[] = {
-  /*  0 */           0,          29,           0,
-};
-
-static const uint16_t ud_itab__31[] = {
-  /*  0 */           0,   GROUP(32),
-};
-
-static const uint16_t ud_itab__30[] = {
-  /*  0 */   GROUP(31),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__35[] = {
-  /*  0 */           0,          30,           0,
-};
-
-static const uint16_t ud_itab__34[] = {
-  /*  0 */           0,   GROUP(35),
-};
-
-static const uint16_t ud_itab__33[] = {
-  /*  0 */   GROUP(34),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__38[] = {
-  /*  0 */           0,          31,           0,
-};
-
-static const uint16_t ud_itab__37[] = {
-  /*  0 */           0,   GROUP(38),
-};
-
-static const uint16_t ud_itab__36[] = {
-  /*  0 */   GROUP(37),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__41[] = {
-  /*  0 */           0,          32,           0,
-};
-
-static const uint16_t ud_itab__40[] = {
-  /*  0 */           0,   GROUP(41),
-};
-
-static const uint16_t ud_itab__39[] = {
-  /*  0 */   GROUP(40),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__29[] = {
-  /*  0 */           0,   GROUP(30),   GROUP(33),   GROUP(36),
-  /*  4 */   GROUP(39),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__44[] = {
-  /*  0 */           0,          33,
-};
-
-static const uint16_t ud_itab__43[] = {
-  /*  0 */   GROUP(44),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__46[] = {
-  /*  0 */           0,          34,
-};
-
-static const uint16_t ud_itab__45[] = {
-  /*  0 */   GROUP(46),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__42[] = {
-  /*  0 */   GROUP(43),   GROUP(45),           0,           0,
-  /*  4 */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__49[] = {
-  /*  0 */           0,          35,
-};
-
-static const uint16_t ud_itab__48[] = {
-  /*  0 */   GROUP(49),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__51[] = {
-  /*  0 */           0,          36,
-};
-
-static const uint16_t ud_itab__50[] = {
-  /*  0 */   GROUP(51),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__47[] = {
-  /*  0 */   GROUP(48),   GROUP(50),           0,           0,
-  /*  4 */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__55[] = {
-  /*  0 */          37,           0,           0,
-};
-
-static const uint16_t ud_itab__54[] = {
-  /*  0 */           0,   GROUP(55),
-};
-
-static const uint16_t ud_itab__53[] = {
-  /*  0 */   GROUP(54),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__58[] = {
-  /*  0 */          38,           0,           0,
-};
-
-static const uint16_t ud_itab__57[] = {
-  /*  0 */           0,   GROUP(58),
-};
-
-static const uint16_t ud_itab__56[] = {
-  /*  0 */   GROUP(57),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__61[] = {
-  /*  0 */          39,           0,           0,
-};
-
-static const uint16_t ud_itab__60[] = {
-  /*  0 */           0,   GROUP(61),
-};
-
-static const uint16_t ud_itab__59[] = {
-  /*  0 */   GROUP(60),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__64[] = {
-  /*  0 */          40,           0,           0,
-};
-
-static const uint16_t ud_itab__63[] = {
-  /*  0 */           0,   GROUP(64),
-};
-
-static const uint16_t ud_itab__62[] = {
-  /*  0 */   GROUP(63),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__67[] = {
-  /*  0 */          41,           0,           0,
-};
-
-static const uint16_t ud_itab__66[] = {
-  /*  0 */           0,   GROUP(67),
-};
-
-static const uint16_t ud_itab__65[] = {
-  /*  0 */   GROUP(66),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__70[] = {
-  /*  0 */          42,           0,           0,
-};
-
-static const uint16_t ud_itab__69[] = {
-  /*  0 */           0,   GROUP(70),
-};
-
-static const uint16_t ud_itab__68[] = {
-  /*  0 */   GROUP(69),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__73[] = {
-  /*  0 */          43,           0,           0,
-};
-
-static const uint16_t ud_itab__72[] = {
-  /*  0 */           0,   GROUP(73),
-};
-
-static const uint16_t ud_itab__71[] = {
-  /*  0 */   GROUP(72),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__76[] = {
-  /*  0 */          44,           0,           0,
-};
-
-static const uint16_t ud_itab__75[] = {
-  /*  0 */           0,   GROUP(76),
-};
-
-static const uint16_t ud_itab__74[] = {
-  /*  0 */   GROUP(75),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__52[] = {
-  /*  0 */   GROUP(53),   GROUP(56),   GROUP(59),   GROUP(62),
-  /*  4 */   GROUP(65),   GROUP(68),   GROUP(71),   GROUP(74),
-};
-
-static const uint16_t ud_itab__78[] = {
-  /*  0 */           0,          45,
-};
-
-static const uint16_t ud_itab__77[] = {
-  /*  0 */   GROUP(78),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__80[] = {
-  /*  0 */           0,          46,
-};
-
-static const uint16_t ud_itab__79[] = {
-  /*  0 */   GROUP(80),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__83[] = {
-  /*  0 */           0,          47,
-};
-
-static const uint16_t ud_itab__82[] = {
-  /*  0 */   GROUP(83),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__86[] = {
-  /*  0 */          48,           0,           0,
-};
-
-static const uint16_t ud_itab__85[] = {
-  /*  0 */           0,   GROUP(86),
-};
-
-static const uint16_t ud_itab__84[] = {
-  /*  0 */   GROUP(85),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__81[] = {
-  /*  0 */   GROUP(82),   GROUP(84),           0,           0,
-  /*  4 */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__28[] = {
-  /*  0 */   GROUP(29),   GROUP(42),   GROUP(47),   GROUP(52),
-  /*  4 */   GROUP(77),           0,   GROUP(79),   GROUP(81),
-};
-
-static const uint16_t ud_itab__12[] = {
-  /*  0 */   GROUP(13),   GROUP(28),
-};
-
-static const uint16_t ud_itab__87[] = {
-  /*  0 */          49,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__88[] = {
-  /*  0 */          50,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__89[] = {
-  /*  0 */          51,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__90[] = {
-  /*  0 */          52,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__91[] = {
-  /*  0 */          53,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__92[] = {
-  /*  0 */          54,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__93[] = {
-  /*  0 */          55,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__94[] = {
-  /*  0 */          56,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__96[] = {
-  /*  0 */          57,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__97[] = {
-  /*  0 */          58,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__98[] = {
-  /*  0 */          59,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__99[] = {
-  /*  0 */          60,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__100[] = {
-  /*  0 */          61,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__101[] = {
-  /*  0 */          62,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__102[] = {
-  /*  0 */          63,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__103[] = {
-  /*  0 */          64,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__95[] = {
-  /*  0 */   GROUP(96),   GROUP(97),   GROUP(98),   GROUP(99),
-  /*  4 */  GROUP(100),  GROUP(101),  GROUP(102),  GROUP(103),
-};
-
-static const uint16_t ud_itab__104[] = {
-  /*  0 */          65,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__105[] = {
-  /*  0 */           0,           0,           0,           0,
-  /*  4 */           0,           0,           0,           0,
-  /*  8 */           0,           0,           0,           0,
-  /*  c */          66,          67,           0,           0,
-  /* 10 */           0,           0,           0,           0,
-  /* 14 */           0,           0,           0,           0,
-  /* 18 */           0,           0,           0,           0,
-  /* 1c */          68,          69,           0,           0,
-  /* 20 */           0,           0,           0,           0,
-  /* 24 */           0,           0,           0,           0,
-  /* 28 */           0,           0,           0,           0,
-  /* 2c */           0,           0,           0,           0,
-  /* 30 */           0,           0,           0,           0,
-  /* 34 */           0,           0,           0,           0,
-  /* 38 */           0,           0,           0,           0,
-  /* 3c */           0,           0,           0,           0,
-  /* 40 */           0,           0,           0,           0,
-  /* 44 */           0,           0,           0,           0,
-  /* 48 */           0,           0,           0,           0,
-  /* 4c */           0,           0,           0,           0,
-  /* 50 */           0,           0,           0,           0,
-  /* 54 */           0,           0,           0,           0,
-  /* 58 */           0,           0,           0,           0,
-  /* 5c */           0,           0,           0,           0,
-  /* 60 */           0,           0,           0,           0,
-  /* 64 */           0,           0,           0,           0,
-  /* 68 */           0,           0,           0,           0,
-  /* 6c */           0,           0,           0,           0,
-  /* 70 */           0,           0,           0,           0,
-  /* 74 */           0,           0,           0,           0,
-  /* 78 */           0,           0,           0,           0,
-  /* 7c */           0,           0,           0,           0,
-  /* 80 */           0,           0,           0,           0,
-  /* 84 */           0,           0,           0,           0,
-  /* 88 */           0,           0,          70,           0,
-  /* 8c */           0,           0,          71,           0,
-  /* 90 */          72,           0,           0,           0,
-  /* 94 */          73,           0,          74,          75,
-  /* 98 */           0,           0,          76,           0,
-  /* 9c */           0,           0,          77,           0,
-  /* a0 */          78,           0,           0,           0,
-  /* a4 */          79,           0,          80,          81,
-  /* a8 */           0,           0,          82,           0,
-  /* ac */           0,           0,          83,           0,
-  /* b0 */          84,           0,           0,           0,
-  /* b4 */          85,           0,          86,          87,
-  /* b8 */           0,           0,           0,          88,
-  /* bc */           0,           0,           0,          89,
-  /* c0 */           0,           0,           0,           0,
-  /* c4 */           0,           0,           0,           0,
-  /* c8 */           0,           0,           0,           0,
-  /* cc */           0,           0,           0,           0,
-  /* d0 */           0,           0,           0,           0,
-  /* d4 */           0,           0,           0,           0,
-  /* d8 */           0,           0,           0,           0,
-  /* dc */           0,           0,           0,           0,
-  /* e0 */           0,           0,           0,           0,
-  /* e4 */           0,           0,           0,           0,
-  /* e8 */           0,           0,           0,           0,
-  /* ec */           0,           0,           0,           0,
-  /* f0 */           0,           0,           0,           0,
-  /* f4 */           0,           0,           0,           0,
-  /* f8 */           0,           0,           0,           0,
-  /* fc */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__106[] = {
-  /*  0 */          90,          91,          92,          93,
-};
-
-static const uint16_t ud_itab__107[] = {
-  /*  0 */          94,          95,          96,          97,
-};
-
-static const uint16_t ud_itab__110[] = {
-  /*  0 */          98,           0,
-};
-
-static const uint16_t ud_itab__111[] = {
-  /*  0 */          99,           0,
-};
-
-static const uint16_t ud_itab__112[] = {
-  /*  0 */         100,           0,
-};
-
-static const uint16_t ud_itab__113[] = {
-  /*  0 */         101,           0,
-};
-
-static const uint16_t ud_itab__109[] = {
-  /*  0 */  GROUP(110),  GROUP(111),  GROUP(112),  GROUP(113),
-};
-
-static const uint16_t ud_itab__115[] = {
-  /*  0 */           0,         102,
-};
-
-static const uint16_t ud_itab__116[] = {
-  /*  0 */           0,         103,
-};
-
-static const uint16_t ud_itab__117[] = {
-  /*  0 */           0,         104,
-};
-
-static const uint16_t ud_itab__114[] = {
-  /*  0 */  GROUP(115),  GROUP(116),  GROUP(117),           0,
-};
-
-static const uint16_t ud_itab__108[] = {
-  /*  0 */  GROUP(109),  GROUP(114),
-};
-
-static const uint16_t ud_itab__118[] = {
-  /*  0 */         105,           0,           0,         106,
-};
-
-static const uint16_t ud_itab__119[] = {
-  /*  0 */         107,           0,           0,         108,
-};
-
-static const uint16_t ud_itab__120[] = {
-  /*  0 */         109,           0,           0,         110,
-};
-
-static const uint16_t ud_itab__123[] = {
-  /*  0 */         111,           0,
-};
-
-static const uint16_t ud_itab__124[] = {
-  /*  0 */         112,           0,
-};
-
-static const uint16_t ud_itab__125[] = {
-  /*  0 */         113,           0,
-};
-
-static const uint16_t ud_itab__122[] = {
-  /*  0 */  GROUP(123),           0,  GROUP(124),  GROUP(125),
-};
-
-static const uint16_t ud_itab__127[] = {
-  /*  0 */           0,         114,
-};
-
-static const uint16_t ud_itab__128[] = {
-  /*  0 */           0,         115,
-};
-
-static const uint16_t ud_itab__126[] = {
-  /*  0 */  GROUP(127),           0,  GROUP(128),           0,
-};
-
-static const uint16_t ud_itab__121[] = {
-  /*  0 */  GROUP(122),  GROUP(126),
-};
-
-static const uint16_t ud_itab__129[] = {
-  /*  0 */         116,           0,           0,         117,
-};
-
-static const uint16_t ud_itab__131[] = {
-  /*  0 */         118,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__132[] = {
-  /*  0 */         119,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__133[] = {
-  /*  0 */         120,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__134[] = {
-  /*  0 */         121,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__130[] = {
-  /*  0 */  GROUP(131),  GROUP(132),  GROUP(133),  GROUP(134),
-  /*  4 */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__135[] = {
-  /*  0 */         122,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__136[] = {
-  /*  0 */         123,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__137[] = {
-  /*  0 */         124,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__138[] = {
-  /*  0 */         125,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__139[] = {
-  /*  0 */         126,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__140[] = {
-  /*  0 */         127,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__141[] = {
-  /*  0 */         128,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__142[] = {
-  /*  0 */         129,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__143[] = {
-  /*  0 */         130,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__144[] = {
-  /*  0 */         131,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__145[] = {
-  /*  0 */         132,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__146[] = {
-  /*  0 */         133,           0,           0,         134,
-};
-
-static const uint16_t ud_itab__147[] = {
-  /*  0 */         135,           0,           0,         136,
-};
-
-static const uint16_t ud_itab__148[] = {
-  /*  0 */         137,         138,         139,         140,
-};
-
-static const uint16_t ud_itab__149[] = {
-  /*  0 */         141,           0,           0,         142,
-};
-
-static const uint16_t ud_itab__150[] = {
-  /*  0 */         143,         144,         145,         146,
-};
-
-static const uint16_t ud_itab__151[] = {
-  /*  0 */         147,         148,         149,         150,
-};
-
-static const uint16_t ud_itab__152[] = {
-  /*  0 */         151,           0,           0,         152,
-};
-
-static const uint16_t ud_itab__153[] = {
-  /*  0 */         153,           0,           0,         154,
-};
-
-static const uint16_t ud_itab__154[] = {
-  /*  0 */         155,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__155[] = {
-  /*  0 */         156,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__156[] = {
-  /*  0 */         157,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__157[] = {
-  /*  0 */         158,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__160[] = {
-  /*  0 */           0,         160,           0,
-};
-
-static const uint16_t ud_itab__159[] = {
-  /*  0 */         159,  GROUP(160),
-};
-
-static const uint16_t ud_itab__158[] = {
-  /*  0 */  GROUP(159),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__163[] = {
-  /*  0 */           0,         162,           0,
-};
-
-static const uint16_t ud_itab__162[] = {
-  /*  0 */         161,  GROUP(163),
-};
-
-static const uint16_t ud_itab__161[] = {
-  /*  0 */  GROUP(162),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__164[] = {
-  /*  0 */         163,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__166[] = {
-  /*  0 */         164,           0,           0,         165,
-};
-
-static const uint16_t ud_itab__167[] = {
-  /*  0 */         166,           0,           0,         167,
-};
-
-static const uint16_t ud_itab__168[] = {
-  /*  0 */         168,           0,           0,         169,
-};
-
-static const uint16_t ud_itab__169[] = {
-  /*  0 */         170,           0,           0,         171,
-};
-
-static const uint16_t ud_itab__170[] = {
-  /*  0 */         172,           0,           0,         173,
-};
-
-static const uint16_t ud_itab__171[] = {
-  /*  0 */         174,           0,           0,         175,
-};
-
-static const uint16_t ud_itab__172[] = {
-  /*  0 */         176,           0,           0,         177,
-};
-
-static const uint16_t ud_itab__173[] = {
-  /*  0 */         178,           0,           0,         179,
-};
-
-static const uint16_t ud_itab__174[] = {
-  /*  0 */         180,           0,           0,         181,
-};
-
-static const uint16_t ud_itab__175[] = {
-  /*  0 */         182,           0,           0,         183,
-};
-
-static const uint16_t ud_itab__176[] = {
-  /*  0 */         184,           0,           0,         185,
-};
-
-static const uint16_t ud_itab__177[] = {
-  /*  0 */         186,           0,           0,         187,
-};
-
-static const uint16_t ud_itab__178[] = {
-  /*  0 */           0,           0,           0,         188,
-};
-
-static const uint16_t ud_itab__179[] = {
-  /*  0 */           0,           0,           0,         189,
-};
-
-static const uint16_t ud_itab__180[] = {
-  /*  0 */           0,           0,           0,         190,
-};
-
-static const uint16_t ud_itab__181[] = {
-  /*  0 */           0,           0,           0,         191,
-};
-
-static const uint16_t ud_itab__182[] = {
-  /*  0 */         192,           0,           0,         193,
-};
-
-static const uint16_t ud_itab__183[] = {
-  /*  0 */         194,           0,           0,         195,
-};
-
-static const uint16_t ud_itab__184[] = {
-  /*  0 */         196,           0,           0,         197,
-};
-
-static const uint16_t ud_itab__185[] = {
-  /*  0 */           0,           0,           0,         198,
-};
-
-static const uint16_t ud_itab__186[] = {
-  /*  0 */           0,           0,           0,         199,
-};
-
-static const uint16_t ud_itab__187[] = {
-  /*  0 */           0,           0,           0,         200,
-};
-
-static const uint16_t ud_itab__188[] = {
-  /*  0 */           0,           0,           0,         201,
-};
-
-static const uint16_t ud_itab__189[] = {
-  /*  0 */           0,           0,           0,         202,
-};
-
-static const uint16_t ud_itab__190[] = {
-  /*  0 */           0,           0,           0,         203,
-};
-
-static const uint16_t ud_itab__191[] = {
-  /*  0 */           0,           0,           0,         204,
-};
-
-static const uint16_t ud_itab__192[] = {
-  /*  0 */           0,           0,           0,         205,
-};
-
-static const uint16_t ud_itab__193[] = {
-  /*  0 */           0,           0,           0,         206,
-};
-
-static const uint16_t ud_itab__194[] = {
-  /*  0 */           0,           0,           0,         207,
-};
-
-static const uint16_t ud_itab__195[] = {
-  /*  0 */           0,           0,           0,         208,
-};
-
-static const uint16_t ud_itab__196[] = {
-  /*  0 */           0,           0,           0,         209,
-};
-
-static const uint16_t ud_itab__197[] = {
-  /*  0 */           0,           0,           0,         210,
-};
-
-static const uint16_t ud_itab__198[] = {
-  /*  0 */           0,           0,           0,         211,
-};
-
-static const uint16_t ud_itab__199[] = {
-  /*  0 */           0,           0,           0,         212,
-};
-
-static const uint16_t ud_itab__200[] = {
-  /*  0 */           0,           0,           0,         213,
-};
-
-static const uint16_t ud_itab__201[] = {
-  /*  0 */           0,           0,           0,         214,
-};
-
-static const uint16_t ud_itab__202[] = {
-  /*  0 */           0,           0,           0,         215,
-};
-
-static const uint16_t ud_itab__203[] = {
-  /*  0 */           0,           0,           0,         216,
-};
-
-static const uint16_t ud_itab__204[] = {
-  /*  0 */           0,           0,           0,         217,
-};
-
-static const uint16_t ud_itab__205[] = {
-  /*  0 */           0,           0,           0,         218,
-};
-
-static const uint16_t ud_itab__206[] = {
-  /*  0 */           0,           0,           0,         219,
-};
-
-static const uint16_t ud_itab__207[] = {
-  /*  0 */           0,           0,           0,         220,
-};
-
-static const uint16_t ud_itab__208[] = {
-  /*  0 */           0,           0,           0,         221,
-};
-
-static const uint16_t ud_itab__209[] = {
-  /*  0 */           0,           0,           0,         222,
-};
-
-static const uint16_t ud_itab__210[] = {
-  /*  0 */           0,           0,           0,         223,
-};
-
-static const uint16_t ud_itab__211[] = {
-  /*  0 */           0,           0,           0,         224,
-};
-
-static const uint16_t ud_itab__214[] = {
-  /*  0 */           0,         225,           0,
-};
-
-static const uint16_t ud_itab__213[] = {
-  /*  0 */           0,  GROUP(214),
-};
-
-static const uint16_t ud_itab__212[] = {
-  /*  0 */           0,           0,           0,  GROUP(213),
-};
-
-static const uint16_t ud_itab__217[] = {
-  /*  0 */           0,         226,           0,
-};
-
-static const uint16_t ud_itab__216[] = {
-  /*  0 */           0,  GROUP(217),
-};
-
-static const uint16_t ud_itab__215[] = {
-  /*  0 */           0,           0,           0,  GROUP(216),
-};
-
-static const uint16_t ud_itab__218[] = {
-  /*  0 */           0,           0,           0,         227,
-};
-
-static const uint16_t ud_itab__219[] = {
-  /*  0 */           0,           0,           0,         228,
-};
-
-static const uint16_t ud_itab__220[] = {
-  /*  0 */           0,           0,           0,         229,
-};
-
-static const uint16_t ud_itab__221[] = {
-  /*  0 */           0,           0,           0,         230,
-};
-
-static const uint16_t ud_itab__222[] = {
-  /*  0 */           0,           0,           0,         231,
-};
-
-static const uint16_t ud_itab__223[] = {
-  /*  0 */         232,         233,           0,           0,
-};
-
-static const uint16_t ud_itab__224[] = {
-  /*  0 */         234,         235,           0,           0,
-};
-
-static const uint16_t ud_itab__165[] = {
-  /*  0 */  GROUP(166),  GROUP(167),  GROUP(168),  GROUP(169),
-  /*  4 */  GROUP(170),  GROUP(171),  GROUP(172),  GROUP(173),
-  /*  8 */  GROUP(174),  GROUP(175),  GROUP(176),  GROUP(177),
-  /*  c */           0,           0,           0,           0,
-  /* 10 */  GROUP(178),           0,           0,           0,
-  /* 14 */  GROUP(179),  GROUP(180),           0,  GROUP(181),
-  /* 18 */           0,           0,           0,           0,
-  /* 1c */  GROUP(182),  GROUP(183),  GROUP(184),           0,
-  /* 20 */  GROUP(185),  GROUP(186),  GROUP(187),  GROUP(188),
-  /* 24 */  GROUP(189),  GROUP(190),           0,           0,
-  /* 28 */  GROUP(191),  GROUP(192),  GROUP(193),  GROUP(194),
-  /* 2c */           0,           0,           0,           0,
-  /* 30 */  GROUP(195),  GROUP(196),  GROUP(197),  GROUP(198),
-  /* 34 */  GROUP(199),  GROUP(200),           0,  GROUP(201),
-  /* 38 */  GROUP(202),  GROUP(203),  GROUP(204),  GROUP(205),
-  /* 3c */  GROUP(206),  GROUP(207),  GROUP(208),  GROUP(209),
-  /* 40 */  GROUP(210),  GROUP(211),           0,           0,
-  /* 44 */           0,           0,           0,           0,
-  /* 48 */           0,           0,           0,           0,
-  /* 4c */           0,           0,           0,           0,
-  /* 50 */           0,           0,           0,           0,
-  /* 54 */           0,           0,           0,           0,
-  /* 58 */           0,           0,           0,           0,
-  /* 5c */           0,           0,           0,           0,
-  /* 60 */           0,           0,           0,           0,
-  /* 64 */           0,           0,           0,           0,
-  /* 68 */           0,           0,           0,           0,
-  /* 6c */           0,           0,           0,           0,
-  /* 70 */           0,           0,           0,           0,
-  /* 74 */           0,           0,           0,           0,
-  /* 78 */           0,           0,           0,           0,
-  /* 7c */           0,           0,           0,           0,
-  /* 80 */  GROUP(212),  GROUP(215),           0,           0,
-  /* 84 */           0,           0,           0,           0,
-  /* 88 */           0,           0,           0,           0,
-  /* 8c */           0,           0,           0,           0,
-  /* 90 */           0,           0,           0,           0,
-  /* 94 */           0,           0,           0,           0,
-  /* 98 */           0,           0,           0,           0,
-  /* 9c */           0,           0,           0,           0,
-  /* a0 */           0,           0,           0,           0,
-  /* a4 */           0,           0,           0,           0,
-  /* a8 */           0,           0,           0,           0,
-  /* ac */           0,           0,           0,           0,
-  /* b0 */           0,           0,           0,           0,
-  /* b4 */           0,           0,           0,           0,
-  /* b8 */           0,           0,           0,           0,
-  /* bc */           0,           0,           0,           0,
-  /* c0 */           0,           0,           0,           0,
-  /* c4 */           0,           0,           0,           0,
-  /* c8 */           0,           0,           0,           0,
-  /* cc */           0,           0,           0,           0,
-  /* d0 */           0,           0,           0,           0,
-  /* d4 */           0,           0,           0,           0,
-  /* d8 */           0,           0,           0,  GROUP(218),
-  /* dc */  GROUP(219),  GROUP(220),  GROUP(221),  GROUP(222),
-  /* e0 */           0,           0,           0,           0,
-  /* e4 */           0,           0,           0,           0,
-  /* e8 */           0,           0,           0,           0,
-  /* ec */           0,           0,           0,           0,
-  /* f0 */  GROUP(223),  GROUP(224),           0,           0,
-  /* f4 */           0,           0,           0,           0,
-  /* f8 */           0,           0,           0,           0,
-  /* fc */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__226[] = {
-  /*  0 */           0,           0,           0,         236,
-};
-
-static const uint16_t ud_itab__227[] = {
-  /*  0 */           0,           0,           0,         237,
-};
-
-static const uint16_t ud_itab__228[] = {
-  /*  0 */           0,           0,           0,         238,
-};
-
-static const uint16_t ud_itab__229[] = {
-  /*  0 */           0,           0,           0,         239,
-};
-
-static const uint16_t ud_itab__230[] = {
-  /*  0 */           0,           0,           0,         240,
-};
-
-static const uint16_t ud_itab__231[] = {
-  /*  0 */           0,           0,           0,         241,
-};
-
-static const uint16_t ud_itab__232[] = {
-  /*  0 */           0,           0,           0,         242,
-};
-
-static const uint16_t ud_itab__233[] = {
-  /*  0 */         243,           0,           0,         244,
-};
-
-static const uint16_t ud_itab__234[] = {
-  /*  0 */           0,           0,           0,         245,
-};
-
-static const uint16_t ud_itab__235[] = {
-  /*  0 */           0,           0,           0,         246,
-};
-
-static const uint16_t ud_itab__237[] = {
-  /*  0 */         247,         248,         249,
-};
-
-static const uint16_t ud_itab__236[] = {
-  /*  0 */           0,           0,           0,  GROUP(237),
-};
-
-static const uint16_t ud_itab__238[] = {
-  /*  0 */           0,           0,           0,         250,
-};
-
-static const uint16_t ud_itab__239[] = {
-  /*  0 */           0,           0,           0,         251,
-};
-
-static const uint16_t ud_itab__240[] = {
-  /*  0 */           0,           0,           0,         252,
-};
-
-static const uint16_t ud_itab__242[] = {
-  /*  0 */         253,         254,         255,
-};
-
-static const uint16_t ud_itab__241[] = {
-  /*  0 */           0,           0,           0,  GROUP(242),
-};
-
-static const uint16_t ud_itab__243[] = {
-  /*  0 */           0,           0,           0,         256,
-};
-
-static const uint16_t ud_itab__244[] = {
-  /*  0 */           0,           0,           0,         257,
-};
-
-static const uint16_t ud_itab__245[] = {
-  /*  0 */           0,           0,           0,         258,
-};
-
-static const uint16_t ud_itab__246[] = {
-  /*  0 */           0,           0,           0,         259,
-};
-
-static const uint16_t ud_itab__247[] = {
-  /*  0 */           0,           0,           0,         260,
-};
-
-static const uint16_t ud_itab__248[] = {
-  /*  0 */           0,           0,           0,         261,
-};
-
-static const uint16_t ud_itab__249[] = {
-  /*  0 */           0,           0,           0,         262,
-};
-
-static const uint16_t ud_itab__250[] = {
-  /*  0 */           0,           0,           0,         263,
-};
-
-static const uint16_t ud_itab__251[] = {
-  /*  0 */           0,           0,           0,         264,
-};
-
-static const uint16_t ud_itab__225[] = {
-  /*  0 */           0,           0,           0,           0,
-  /*  4 */           0,           0,           0,           0,
-  /*  8 */  GROUP(226),  GROUP(227),  GROUP(228),  GROUP(229),
-  /*  c */  GROUP(230),  GROUP(231),  GROUP(232),  GROUP(233),
-  /* 10 */           0,           0,           0,           0,
-  /* 14 */  GROUP(234),  GROUP(235),  GROUP(236),  GROUP(238),
-  /* 18 */           0,           0,           0,           0,
-  /* 1c */           0,           0,           0,           0,
-  /* 20 */  GROUP(239),  GROUP(240),  GROUP(241),           0,
-  /* 24 */           0,           0,           0,           0,
-  /* 28 */           0,           0,           0,           0,
-  /* 2c */           0,           0,           0,           0,
-  /* 30 */           0,           0,           0,           0,
-  /* 34 */           0,           0,           0,           0,
-  /* 38 */           0,           0,           0,           0,
-  /* 3c */           0,           0,           0,           0,
-  /* 40 */  GROUP(243),  GROUP(244),  GROUP(245),           0,
-  /* 44 */  GROUP(246),           0,           0,           0,
-  /* 48 */           0,           0,           0,           0,
-  /* 4c */           0,           0,           0,           0,
-  /* 50 */           0,           0,           0,           0,
-  /* 54 */           0,           0,           0,           0,
-  /* 58 */           0,           0,           0,           0,
-  /* 5c */           0,           0,           0,           0,
-  /* 60 */  GROUP(247),  GROUP(248),  GROUP(249),  GROUP(250),
-  /* 64 */           0,           0,           0,           0,
-  /* 68 */           0,           0,           0,           0,
-  /* 6c */           0,           0,           0,           0,
-  /* 70 */           0,           0,           0,           0,
-  /* 74 */           0,           0,           0,           0,
-  /* 78 */           0,           0,           0,           0,
-  /* 7c */           0,           0,           0,           0,
-  /* 80 */           0,           0,           0,           0,
-  /* 84 */           0,           0,           0,           0,
-  /* 88 */           0,           0,           0,           0,
-  /* 8c */           0,           0,           0,           0,
-  /* 90 */           0,           0,           0,           0,
-  /* 94 */           0,           0,           0,           0,
-  /* 98 */           0,           0,           0,           0,
-  /* 9c */           0,           0,           0,           0,
-  /* a0 */           0,           0,           0,           0,
-  /* a4 */           0,           0,           0,           0,
-  /* a8 */           0,           0,           0,           0,
-  /* ac */           0,           0,           0,           0,
-  /* b0 */           0,           0,           0,           0,
-  /* b4 */           0,           0,           0,           0,
-  /* b8 */           0,           0,           0,           0,
-  /* bc */           0,           0,           0,           0,
-  /* c0 */           0,           0,           0,           0,
-  /* c4 */           0,           0,           0,           0,
-  /* c8 */           0,           0,           0,           0,
-  /* cc */           0,           0,           0,           0,
-  /* d0 */           0,           0,           0,           0,
-  /* d4 */           0,           0,           0,           0,
-  /* d8 */           0,           0,           0,           0,
-  /* dc */           0,           0,           0,  GROUP(251),
-  /* e0 */           0,           0,           0,           0,
-  /* e4 */           0,           0,           0,           0,
-  /* e8 */           0,           0,           0,           0,
-  /* ec */           0,           0,           0,           0,
-  /* f0 */           0,           0,           0,           0,
-  /* f4 */           0,           0,           0,           0,
-  /* f8 */           0,           0,           0,           0,
-  /* fc */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__252[] = {
-  /*  0 */         265,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__253[] = {
-  /*  0 */         266,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__254[] = {
-  /*  0 */         267,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__255[] = {
-  /*  0 */         268,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__256[] = {
-  /*  0 */         269,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__257[] = {
-  /*  0 */         270,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__258[] = {
-  /*  0 */         271,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__259[] = {
-  /*  0 */         272,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__260[] = {
-  /*  0 */         273,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__261[] = {
-  /*  0 */         274,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__262[] = {
-  /*  0 */         275,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__263[] = {
-  /*  0 */         276,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__264[] = {
-  /*  0 */         277,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__265[] = {
-  /*  0 */         278,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__266[] = {
-  /*  0 */         279,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__267[] = {
-  /*  0 */         280,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__268[] = {
-  /*  0 */         281,           0,           0,         282,
-};
-
-static const uint16_t ud_itab__269[] = {
-  /*  0 */         283,         284,         285,         286,
-};
-
-static const uint16_t ud_itab__270[] = {
-  /*  0 */         287,           0,         288,           0,
-};
-
-static const uint16_t ud_itab__271[] = {
-  /*  0 */         289,           0,         290,           0,
-};
-
-static const uint16_t ud_itab__272[] = {
-  /*  0 */         291,           0,           0,         292,
-};
-
-static const uint16_t ud_itab__273[] = {
-  /*  0 */         293,           0,           0,         294,
-};
-
-static const uint16_t ud_itab__274[] = {
-  /*  0 */         295,           0,           0,         296,
-};
-
-static const uint16_t ud_itab__275[] = {
-  /*  0 */         297,           0,           0,         298,
-};
-
-static const uint16_t ud_itab__276[] = {
-  /*  0 */         299,         300,         301,         302,
-};
-
-static const uint16_t ud_itab__277[] = {
-  /*  0 */         303,         304,         305,         306,
-};
-
-static const uint16_t ud_itab__278[] = {
-  /*  0 */         307,         308,         309,         310,
-};
-
-static const uint16_t ud_itab__279[] = {
-  /*  0 */         311,           0,         312,         313,
-};
-
-static const uint16_t ud_itab__280[] = {
-  /*  0 */         314,         315,         316,         317,
-};
-
-static const uint16_t ud_itab__281[] = {
-  /*  0 */         318,         319,         320,         321,
-};
-
-static const uint16_t ud_itab__282[] = {
-  /*  0 */         322,         323,         324,         325,
-};
-
-static const uint16_t ud_itab__283[] = {
-  /*  0 */         326,         327,         328,         329,
-};
-
-static const uint16_t ud_itab__284[] = {
-  /*  0 */         330,           0,           0,         331,
-};
-
-static const uint16_t ud_itab__285[] = {
-  /*  0 */         332,           0,           0,         333,
-};
-
-static const uint16_t ud_itab__286[] = {
-  /*  0 */         334,           0,           0,         335,
-};
-
-static const uint16_t ud_itab__287[] = {
-  /*  0 */         336,           0,           0,         337,
-};
-
-static const uint16_t ud_itab__288[] = {
-  /*  0 */         338,           0,           0,         339,
-};
-
-static const uint16_t ud_itab__289[] = {
-  /*  0 */         340,           0,           0,         341,
-};
-
-static const uint16_t ud_itab__290[] = {
-  /*  0 */         342,           0,           0,         343,
-};
-
-static const uint16_t ud_itab__291[] = {
-  /*  0 */         344,           0,           0,         345,
-};
-
-static const uint16_t ud_itab__292[] = {
-  /*  0 */         346,           0,           0,         347,
-};
-
-static const uint16_t ud_itab__293[] = {
-  /*  0 */         348,           0,           0,         349,
-};
-
-static const uint16_t ud_itab__294[] = {
-  /*  0 */         350,           0,           0,         351,
-};
-
-static const uint16_t ud_itab__295[] = {
-  /*  0 */         352,           0,           0,         353,
-};
-
-static const uint16_t ud_itab__296[] = {
-  /*  0 */           0,           0,           0,         354,
-};
-
-static const uint16_t ud_itab__297[] = {
-  /*  0 */           0,           0,           0,         355,
-};
-
-static const uint16_t ud_itab__298[] = {
-  /*  0 */         356,           0,           0,         357,
-};
-
-static const uint16_t ud_itab__299[] = {
-  /*  0 */         358,           0,         359,         360,
-};
-
-static const uint16_t ud_itab__300[] = {
-  /*  0 */         361,         362,         363,         364,
-};
-
-static const uint16_t ud_itab__302[] = {
-  /*  0 */         365,           0,           0,         366,
-};
-
-static const uint16_t ud_itab__303[] = {
-  /*  0 */         367,           0,           0,         368,
-};
-
-static const uint16_t ud_itab__304[] = {
-  /*  0 */         369,           0,           0,         370,
-};
-
-static const uint16_t ud_itab__301[] = {
-  /*  0 */           0,           0,  GROUP(302),           0,
-  /*  4 */  GROUP(303),           0,  GROUP(304),           0,
-};
-
-static const uint16_t ud_itab__306[] = {
-  /*  0 */         371,           0,           0,         372,
-};
-
-static const uint16_t ud_itab__307[] = {
-  /*  0 */         373,           0,           0,         374,
-};
-
-static const uint16_t ud_itab__308[] = {
-  /*  0 */         375,           0,           0,         376,
-};
-
-static const uint16_t ud_itab__305[] = {
-  /*  0 */           0,           0,  GROUP(306),           0,
-  /*  4 */  GROUP(307),           0,  GROUP(308),           0,
-};
-
-static const uint16_t ud_itab__310[] = {
-  /*  0 */         377,           0,           0,         378,
-};
-
-static const uint16_t ud_itab__311[] = {
-  /*  0 */           0,           0,           0,         379,
-};
-
-static const uint16_t ud_itab__312[] = {
-  /*  0 */         380,           0,           0,         381,
-};
-
-static const uint16_t ud_itab__313[] = {
-  /*  0 */           0,           0,           0,         382,
-};
-
-static const uint16_t ud_itab__309[] = {
-  /*  0 */           0,           0,  GROUP(310),  GROUP(311),
-  /*  4 */           0,           0,  GROUP(312),  GROUP(313),
-};
-
-static const uint16_t ud_itab__314[] = {
-  /*  0 */         383,           0,           0,         384,
-};
-
-static const uint16_t ud_itab__315[] = {
-  /*  0 */         385,           0,           0,         386,
-};
-
-static const uint16_t ud_itab__316[] = {
-  /*  0 */         387,           0,           0,         388,
-};
-
-static const uint16_t ud_itab__317[] = {
-  /*  0 */         389,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__319[] = {
-  /*  0 */           0,         390,           0,
-};
-
-static const uint16_t ud_itab__318[] = {
-  /*  0 */  GROUP(319),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__321[] = {
-  /*  0 */           0,         391,           0,
-};
-
-static const uint16_t ud_itab__320[] = {
-  /*  0 */  GROUP(321),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__322[] = {
-  /*  0 */           0,         392,           0,         393,
-};
-
-static const uint16_t ud_itab__323[] = {
-  /*  0 */           0,         394,           0,         395,
-};
-
-static const uint16_t ud_itab__324[] = {
-  /*  0 */         396,           0,         397,         398,
-};
-
-static const uint16_t ud_itab__325[] = {
-  /*  0 */         399,           0,         400,         401,
-};
-
-static const uint16_t ud_itab__326[] = {
-  /*  0 */         402,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__327[] = {
-  /*  0 */         403,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__328[] = {
-  /*  0 */         404,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__329[] = {
-  /*  0 */         405,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__330[] = {
-  /*  0 */         406,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__331[] = {
-  /*  0 */         407,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__332[] = {
-  /*  0 */         408,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__333[] = {
-  /*  0 */         409,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__334[] = {
-  /*  0 */         410,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__335[] = {
-  /*  0 */         411,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__336[] = {
-  /*  0 */         412,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__337[] = {
-  /*  0 */         413,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__338[] = {
-  /*  0 */         414,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__339[] = {
-  /*  0 */         415,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__340[] = {
-  /*  0 */         416,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__341[] = {
-  /*  0 */         417,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__342[] = {
-  /*  0 */         418,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__343[] = {
-  /*  0 */         419,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__344[] = {
-  /*  0 */         420,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__345[] = {
-  /*  0 */         421,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__346[] = {
-  /*  0 */         422,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__347[] = {
-  /*  0 */         423,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__348[] = {
-  /*  0 */         424,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__349[] = {
-  /*  0 */         425,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__350[] = {
-  /*  0 */         426,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__351[] = {
-  /*  0 */         427,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__352[] = {
-  /*  0 */         428,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__353[] = {
-  /*  0 */         429,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__354[] = {
-  /*  0 */         430,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__355[] = {
-  /*  0 */         431,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__356[] = {
-  /*  0 */         432,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__357[] = {
-  /*  0 */         433,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__358[] = {
-  /*  0 */         434,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__359[] = {
-  /*  0 */         435,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__360[] = {
-  /*  0 */         436,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__361[] = {
-  /*  0 */         437,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__362[] = {
-  /*  0 */         438,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__363[] = {
-  /*  0 */         439,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__368[] = {
-  /*  0 */           0,         440,
-};
-
-static const uint16_t ud_itab__367[] = {
-  /*  0 */  GROUP(368),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__366[] = {
-  /*  0 */  GROUP(367),           0,           0,           0,
-  /*  4 */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__371[] = {
-  /*  0 */           0,         441,
-};
-
-static const uint16_t ud_itab__370[] = {
-  /*  0 */  GROUP(371),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__369[] = {
-  /*  0 */  GROUP(370),           0,           0,           0,
-  /*  4 */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__374[] = {
-  /*  0 */           0,         442,
-};
-
-static const uint16_t ud_itab__373[] = {
-  /*  0 */  GROUP(374),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__372[] = {
-  /*  0 */  GROUP(373),           0,           0,           0,
-  /*  4 */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__365[] = {
-  /*  0 */  GROUP(366),  GROUP(369),  GROUP(372),           0,
-  /*  4 */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__364[] = {
-  /*  0 */           0,  GROUP(365),
-};
-
-static const uint16_t ud_itab__379[] = {
-  /*  0 */           0,         443,
-};
-
-static const uint16_t ud_itab__378[] = {
-  /*  0 */  GROUP(379),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__377[] = {
-  /*  0 */  GROUP(378),           0,           0,           0,
-  /*  4 */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__382[] = {
-  /*  0 */           0,         444,
-};
-
-static const uint16_t ud_itab__381[] = {
-  /*  0 */  GROUP(382),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__380[] = {
-  /*  0 */  GROUP(381),           0,           0,           0,
-  /*  4 */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__385[] = {
-  /*  0 */           0,         445,
-};
-
-static const uint16_t ud_itab__384[] = {
-  /*  0 */  GROUP(385),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__383[] = {
-  /*  0 */  GROUP(384),           0,           0,           0,
-  /*  4 */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__388[] = {
-  /*  0 */           0,         446,
-};
-
-static const uint16_t ud_itab__387[] = {
-  /*  0 */  GROUP(388),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__386[] = {
-  /*  0 */  GROUP(387),           0,           0,           0,
-  /*  4 */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__391[] = {
-  /*  0 */           0,         447,
-};
-
-static const uint16_t ud_itab__390[] = {
-  /*  0 */  GROUP(391),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__389[] = {
-  /*  0 */  GROUP(390),           0,           0,           0,
-  /*  4 */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__394[] = {
-  /*  0 */           0,         448,
-};
-
-static const uint16_t ud_itab__393[] = {
-  /*  0 */  GROUP(394),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__392[] = {
-  /*  0 */  GROUP(393),           0,           0,           0,
-  /*  4 */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__376[] = {
-  /*  0 */  GROUP(377),  GROUP(380),  GROUP(383),  GROUP(386),
-  /*  4 */  GROUP(389),  GROUP(392),           0,           0,
-};
-
-static const uint16_t ud_itab__375[] = {
-  /*  0 */           0,  GROUP(376),
-};
-
-static const uint16_t ud_itab__395[] = {
-  /*  0 */         449,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__396[] = {
-  /*  0 */         450,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__397[] = {
-  /*  0 */         451,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__398[] = {
-  /*  0 */         452,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__399[] = {
-  /*  0 */         453,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__400[] = {
-  /*  0 */         454,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__404[] = {
-  /*  0 */         455,           0,
-};
-
-static const uint16_t ud_itab__403[] = {
-  /*  0 */  GROUP(404),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__406[] = {
-  /*  0 */         456,           0,
-};
-
-static const uint16_t ud_itab__405[] = {
-  /*  0 */  GROUP(406),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__408[] = {
-  /*  0 */         457,           0,
-};
-
-static const uint16_t ud_itab__407[] = {
-  /*  0 */  GROUP(408),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__410[] = {
-  /*  0 */         458,           0,
-};
-
-static const uint16_t ud_itab__409[] = {
-  /*  0 */  GROUP(410),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__412[] = {
-  /*  0 */         459,           0,
-};
-
-static const uint16_t ud_itab__411[] = {
-  /*  0 */  GROUP(412),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__414[] = {
-  /*  0 */         460,           0,
-};
-
-static const uint16_t ud_itab__413[] = {
-  /*  0 */  GROUP(414),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__416[] = {
-  /*  0 */         461,           0,
-};
-
-static const uint16_t ud_itab__415[] = {
-  /*  0 */  GROUP(416),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__402[] = {
-  /*  0 */  GROUP(403),  GROUP(405),  GROUP(407),  GROUP(409),
-  /*  4 */  GROUP(411),  GROUP(413),           0,  GROUP(415),
-};
-
-static const uint16_t ud_itab__420[] = {
-  /*  0 */           0,         462,
-};
-
-static const uint16_t ud_itab__419[] = {
-  /*  0 */  GROUP(420),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__422[] = {
-  /*  0 */           0,         463,
-};
-
-static const uint16_t ud_itab__421[] = {
-  /*  0 */  GROUP(422),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__424[] = {
-  /*  0 */           0,         464,
-};
-
-static const uint16_t ud_itab__423[] = {
-  /*  0 */  GROUP(424),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__426[] = {
-  /*  0 */           0,         465,
-};
-
-static const uint16_t ud_itab__425[] = {
-  /*  0 */  GROUP(426),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__428[] = {
-  /*  0 */           0,         466,
-};
-
-static const uint16_t ud_itab__427[] = {
-  /*  0 */  GROUP(428),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__430[] = {
-  /*  0 */           0,         467,
-};
-
-static const uint16_t ud_itab__429[] = {
-  /*  0 */  GROUP(430),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__432[] = {
-  /*  0 */           0,         468,
-};
-
-static const uint16_t ud_itab__431[] = {
-  /*  0 */  GROUP(432),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__434[] = {
-  /*  0 */           0,         469,
-};
-
-static const uint16_t ud_itab__433[] = {
-  /*  0 */  GROUP(434),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__418[] = {
-  /*  0 */  GROUP(419),  GROUP(421),  GROUP(423),  GROUP(425),
-  /*  4 */  GROUP(427),  GROUP(429),  GROUP(431),  GROUP(433),
-};
-
-static const uint16_t ud_itab__437[] = {
-  /*  0 */           0,         470,
-};
-
-static const uint16_t ud_itab__436[] = {
-  /*  0 */  GROUP(437),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__439[] = {
-  /*  0 */           0,         471,
-};
-
-static const uint16_t ud_itab__438[] = {
-  /*  0 */  GROUP(439),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__441[] = {
-  /*  0 */           0,         472,
-};
-
-static const uint16_t ud_itab__440[] = {
-  /*  0 */  GROUP(441),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__443[] = {
-  /*  0 */           0,         473,
-};
-
-static const uint16_t ud_itab__442[] = {
-  /*  0 */  GROUP(443),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__445[] = {
-  /*  0 */           0,         474,
-};
-
-static const uint16_t ud_itab__444[] = {
-  /*  0 */  GROUP(445),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__447[] = {
-  /*  0 */           0,         475,
-};
-
-static const uint16_t ud_itab__446[] = {
-  /*  0 */  GROUP(447),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__449[] = {
-  /*  0 */           0,         476,
-};
-
-static const uint16_t ud_itab__448[] = {
-  /*  0 */  GROUP(449),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__451[] = {
-  /*  0 */           0,         477,
-};
-
-static const uint16_t ud_itab__450[] = {
-  /*  0 */  GROUP(451),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__435[] = {
-  /*  0 */  GROUP(436),  GROUP(438),  GROUP(440),  GROUP(442),
-  /*  4 */  GROUP(444),  GROUP(446),  GROUP(448),  GROUP(450),
-};
-
-static const uint16_t ud_itab__454[] = {
-  /*  0 */           0,         478,
-};
-
-static const uint16_t ud_itab__453[] = {
-  /*  0 */  GROUP(454),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__456[] = {
-  /*  0 */           0,         479,
-};
-
-static const uint16_t ud_itab__455[] = {
-  /*  0 */  GROUP(456),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__458[] = {
-  /*  0 */           0,         480,
-};
-
-static const uint16_t ud_itab__457[] = {
-  /*  0 */  GROUP(458),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__460[] = {
-  /*  0 */           0,         481,
-};
-
-static const uint16_t ud_itab__459[] = {
-  /*  0 */  GROUP(460),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__462[] = {
-  /*  0 */           0,         482,
-};
-
-static const uint16_t ud_itab__461[] = {
-  /*  0 */  GROUP(462),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__464[] = {
-  /*  0 */           0,         483,
-};
-
-static const uint16_t ud_itab__463[] = {
-  /*  0 */  GROUP(464),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__466[] = {
-  /*  0 */           0,         484,
-};
-
-static const uint16_t ud_itab__465[] = {
-  /*  0 */  GROUP(466),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__468[] = {
-  /*  0 */           0,         485,
-};
-
-static const uint16_t ud_itab__467[] = {
-  /*  0 */  GROUP(468),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__452[] = {
-  /*  0 */  GROUP(453),  GROUP(455),  GROUP(457),  GROUP(459),
-  /*  4 */  GROUP(461),  GROUP(463),  GROUP(465),  GROUP(467),
-};
-
-static const uint16_t ud_itab__417[] = {
-  /*  0 */           0,           0,           0,           0,
-  /*  4 */           0,  GROUP(418),  GROUP(435),  GROUP(452),
-};
-
-static const uint16_t ud_itab__401[] = {
-  /*  0 */  GROUP(402),  GROUP(417),
-};
-
-static const uint16_t ud_itab__469[] = {
-  /*  0 */         486,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__470[] = {
-  /*  0 */         487,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__471[] = {
-  /*  0 */         488,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__472[] = {
-  /*  0 */         489,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__473[] = {
-  /*  0 */         490,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__474[] = {
-  /*  0 */         491,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__475[] = {
-  /*  0 */         492,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__476[] = {
-  /*  0 */         493,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__477[] = {
-  /*  0 */         494,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__478[] = {
-  /*  0 */           0,           0,         495,           0,
-};
-
-static const uint16_t ud_itab__480[] = {
-  /*  0 */         496,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__481[] = {
-  /*  0 */         497,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__482[] = {
-  /*  0 */         498,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__483[] = {
-  /*  0 */         499,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__479[] = {
-  /*  0 */           0,           0,           0,           0,
-  /*  4 */  GROUP(480),  GROUP(481),  GROUP(482),  GROUP(483),
-};
-
-static const uint16_t ud_itab__484[] = {
-  /*  0 */         500,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__485[] = {
-  /*  0 */         501,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__486[] = {
-  /*  0 */         502,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__487[] = {
-  /*  0 */         503,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__488[] = {
-  /*  0 */         504,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__489[] = {
-  /*  0 */         505,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__490[] = {
-  /*  0 */         506,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__491[] = {
-  /*  0 */         507,         508,         509,         510,
-};
-
-static const uint16_t ud_itab__492[] = {
-  /*  0 */         511,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__493[] = {
-  /*  0 */         512,           0,           0,         513,
-};
-
-static const uint16_t ud_itab__494[] = {
-  /*  0 */         514,           0,           0,         515,
-};
-
-static const uint16_t ud_itab__495[] = {
-  /*  0 */         516,           0,           0,         517,
-};
-
-static const uint16_t ud_itab__498[] = {
-  /*  0 */         518,         519,         520,
-};
-
-static const uint16_t ud_itab__497[] = {
-  /*  0 */  GROUP(498),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__500[] = {
-  /*  0 */           0,         521,           0,
-};
-
-static const uint16_t ud_itab__501[] = {
-  /*  0 */           0,         522,           0,
-};
-
-static const uint16_t ud_itab__502[] = {
-  /*  0 */           0,         523,           0,
-};
-
-static const uint16_t ud_itab__499[] = {
-  /*  0 */  GROUP(500),           0,  GROUP(501),  GROUP(502),
-};
-
-static const uint16_t ud_itab__504[] = {
-  /*  0 */           0,         524,           0,
-};
-
-static const uint16_t ud_itab__503[] = {
-  /*  0 */  GROUP(504),           0,           0,           0,
-};
-
-static const uint16_t ud_itab__496[] = {
-  /*  0 */           0,  GROUP(497),           0,           0,
-  /*  4 */           0,           0,  GROUP(499),  GROUP(503),
-};
-
-static const uint16_t ud_itab__505[] = {
-  /*  0 */         525,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__506[] = {
-  /*  0 */         526,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__507[] = {
-  /*  0 */         527,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__508[] = {
-  /*  0 */         528,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__509[] = {
-  /*  0 */         529,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__510[] = {
-  /*  0 */         530,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__511[] = {
-  /*  0 */         531,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__512[] = {
-  /*  0 */         532,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__513[] = {
-  /*  0 */           0,         533,           0,         534,
-};
-
-static const uint16_t ud_itab__514[] = {
-  /*  0 */         535,           0,           0,         536,
-};
-
-static const uint16_t ud_itab__515[] = {
-  /*  0 */         537,           0,           0,         538,
-};
-
-static const uint16_t ud_itab__516[] = {
-  /*  0 */         539,           0,           0,         540,
-};
-
-static const uint16_t ud_itab__517[] = {
-  /*  0 */         541,           0,           0,         542,
-};
-
-static const uint16_t ud_itab__518[] = {
-  /*  0 */         543,           0,           0,         544,
-};
-
-static const uint16_t ud_itab__519[] = {
-  /*  0 */           0,         545,         546,         547,
-};
-
-static const uint16_t ud_itab__520[] = {
-  /*  0 */         548,           0,           0,         549,
-};
-
-static const uint16_t ud_itab__521[] = {
-  /*  0 */         550,           0,           0,         551,
-};
-
-static const uint16_t ud_itab__522[] = {
-  /*  0 */         552,           0,           0,         553,
-};
-
-static const uint16_t ud_itab__523[] = {
-  /*  0 */         554,           0,           0,         555,
-};
-
-static const uint16_t ud_itab__524[] = {
-  /*  0 */         556,           0,           0,         557,
-};
-
-static const uint16_t ud_itab__525[] = {
-  /*  0 */         558,           0,           0,         559,
-};
-
-static const uint16_t ud_itab__526[] = {
-  /*  0 */         560,           0,           0,         561,
-};
-
-static const uint16_t ud_itab__527[] = {
-  /*  0 */         562,           0,           0,         563,
-};
-
-static const uint16_t ud_itab__528[] = {
-  /*  0 */         564,           0,           0,         565,
-};
-
-static const uint16_t ud_itab__529[] = {
-  /*  0 */         566,           0,           0,         567,
-};
-
-static const uint16_t ud_itab__530[] = {
-  /*  0 */         568,           0,           0,         569,
-};
-
-static const uint16_t ud_itab__531[] = {
-  /*  0 */         570,           0,           0,         571,
-};
-
-static const uint16_t ud_itab__532[] = {
-  /*  0 */         572,           0,           0,         573,
-};
-
-static const uint16_t ud_itab__533[] = {
-  /*  0 */         574,           0,           0,         575,
-};
-
-static const uint16_t ud_itab__534[] = {
-  /*  0 */         576,           0,           0,         577,
-};
-
-static const uint16_t ud_itab__535[] = {
-  /*  0 */           0,         578,         579,         580,
-};
-
-static const uint16_t ud_itab__536[] = {
-  /*  0 */         581,           0,           0,         582,
-};
-
-static const uint16_t ud_itab__537[] = {
-  /*  0 */         583,           0,           0,         584,
-};
-
-static const uint16_t ud_itab__538[] = {
-  /*  0 */         585,           0,           0,         586,
-};
-
-static const uint16_t ud_itab__539[] = {
-  /*  0 */         587,           0,           0,         588,
-};
-
-static const uint16_t ud_itab__540[] = {
-  /*  0 */         589,           0,           0,         590,
-};
-
-static const uint16_t ud_itab__541[] = {
-  /*  0 */         591,           0,           0,         592,
-};
-
-static const uint16_t ud_itab__542[] = {
-  /*  0 */         593,           0,           0,         594,
-};
-
-static const uint16_t ud_itab__543[] = {
-  /*  0 */         595,           0,           0,         596,
-};
-
-static const uint16_t ud_itab__544[] = {
-  /*  0 */         597,           0,           0,         598,
-};
-
-static const uint16_t ud_itab__545[] = {
-  /*  0 */           0,         599,           0,           0,
-};
-
-static const uint16_t ud_itab__546[] = {
-  /*  0 */         600,           0,           0,         601,
-};
-
-static const uint16_t ud_itab__547[] = {
-  /*  0 */         602,           0,           0,         603,
-};
-
-static const uint16_t ud_itab__548[] = {
-  /*  0 */         604,           0,           0,         605,
-};
-
-static const uint16_t ud_itab__549[] = {
-  /*  0 */         606,           0,           0,         607,
-};
-
-static const uint16_t ud_itab__550[] = {
-  /*  0 */         608,           0,           0,         609,
-};
-
-static const uint16_t ud_itab__551[] = {
-  /*  0 */         610,           0,           0,         611,
-};
-
-static const uint16_t ud_itab__554[] = {
-  /*  0 */           0,         612,
-};
-
-static const uint16_t ud_itab__555[] = {
-  /*  0 */           0,         613,
-};
-
-static const uint16_t ud_itab__553[] = {
-  /*  0 */  GROUP(554),           0,           0,  GROUP(555),
-};
-
-static const uint16_t ud_itab__552[] = {
-  /*  0 */           0,  GROUP(553),
-};
-
-static const uint16_t ud_itab__556[] = {
-  /*  0 */         614,           0,           0,         615,
-};
-
-static const uint16_t ud_itab__557[] = {
-  /*  0 */         616,           0,           0,         617,
-};
-
-static const uint16_t ud_itab__558[] = {
-  /*  0 */         618,           0,           0,         619,
-};
-
-static const uint16_t ud_itab__559[] = {
-  /*  0 */         620,           0,           0,         621,
-};
-
-static const uint16_t ud_itab__560[] = {
-  /*  0 */         622,           0,           0,         623,
-};
-
-static const uint16_t ud_itab__561[] = {
-  /*  0 */         624,           0,           0,         625,
-};
-
-static const uint16_t ud_itab__562[] = {
-  /*  0 */         626,           0,           0,         627,
-};
-
-static const uint16_t ud_itab__4[] = {
-  /*  0 */    GROUP(5),   GROUP(12),   GROUP(87),   GROUP(88),
-  /*  4 */           0,   GROUP(89),   GROUP(90),   GROUP(91),
-  /*  8 */   GROUP(92),   GROUP(93),           0,   GROUP(94),
-  /*  c */           0,   GROUP(95),  GROUP(104),  GROUP(105),
-  /* 10 */  GROUP(106),  GROUP(107),  GROUP(108),  GROUP(118),
-  /* 14 */  GROUP(119),  GROUP(120),  GROUP(121),  GROUP(129),
-  /* 18 */  GROUP(130),  GROUP(135),  GROUP(136),  GROUP(137),
-  /* 1c */  GROUP(138),  GROUP(139),  GROUP(140),  GROUP(141),
-  /* 20 */  GROUP(142),  GROUP(143),  GROUP(144),  GROUP(145),
-  /* 24 */           0,           0,           0,           0,
-  /* 28 */  GROUP(146),  GROUP(147),  GROUP(148),  GROUP(149),
-  /* 2c */  GROUP(150),  GROUP(151),  GROUP(152),  GROUP(153),
-  /* 30 */  GROUP(154),  GROUP(155),  GROUP(156),  GROUP(157),
-  /* 34 */  GROUP(158),  GROUP(161),           0,  GROUP(164),
-  /* 38 */  GROUP(165),           0,  GROUP(225),           0,
-  /* 3c */           0,           0,           0,           0,
-  /* 40 */  GROUP(252),  GROUP(253),  GROUP(254),  GROUP(255),
-  /* 44 */  GROUP(256),  GROUP(257),  GROUP(258),  GROUP(259),
-  /* 48 */  GROUP(260),  GROUP(261),  GROUP(262),  GROUP(263),
-  /* 4c */  GROUP(264),  GROUP(265),  GROUP(266),  GROUP(267),
-  /* 50 */  GROUP(268),  GROUP(269),  GROUP(270),  GROUP(271),
-  /* 54 */  GROUP(272),  GROUP(273),  GROUP(274),  GROUP(275),
-  /* 58 */  GROUP(276),  GROUP(277),  GROUP(278),  GROUP(279),
-  /* 5c */  GROUP(280),  GROUP(281),  GROUP(282),  GROUP(283),
-  /* 60 */  GROUP(284),  GROUP(285),  GROUP(286),  GROUP(287),
-  /* 64 */  GROUP(288),  GROUP(289),  GROUP(290),  GROUP(291),
-  /* 68 */  GROUP(292),  GROUP(293),  GROUP(294),  GROUP(295),
-  /* 6c */  GROUP(296),  GROUP(297),  GROUP(298),  GROUP(299),
-  /* 70 */  GROUP(300),  GROUP(301),  GROUP(305),  GROUP(309),
-  /* 74 */  GROUP(314),  GROUP(315),  GROUP(316),  GROUP(317),
-  /* 78 */  GROUP(318),  GROUP(320),           0,           0,
-  /* 7c */  GROUP(322),  GROUP(323),  GROUP(324),  GROUP(325),
-  /* 80 */  GROUP(326),  GROUP(327),  GROUP(328),  GROUP(329),
-  /* 84 */  GROUP(330),  GROUP(331),  GROUP(332),  GROUP(333),
-  /* 88 */  GROUP(334),  GROUP(335),  GROUP(336),  GROUP(337),
-  /* 8c */  GROUP(338),  GROUP(339),  GROUP(340),  GROUP(341),
-  /* 90 */  GROUP(342),  GROUP(343),  GROUP(344),  GROUP(345),
-  /* 94 */  GROUP(346),  GROUP(347),  GROUP(348),  GROUP(349),
-  /* 98 */  GROUP(350),  GROUP(351),  GROUP(352),  GROUP(353),
-  /* 9c */  GROUP(354),  GROUP(355),  GROUP(356),  GROUP(357),
-  /* a0 */  GROUP(358),  GROUP(359),  GROUP(360),  GROUP(361),
-  /* a4 */  GROUP(362),  GROUP(363),  GROUP(364),  GROUP(375),
-  /* a8 */  GROUP(395),  GROUP(396),  GROUP(397),  GROUP(398),
-  /* ac */  GROUP(399),  GROUP(400),  GROUP(401),  GROUP(469),
-  /* b0 */  GROUP(470),  GROUP(471),  GROUP(472),  GROUP(473),
-  /* b4 */  GROUP(474),  GROUP(475),  GROUP(476),  GROUP(477),
-  /* b8 */  GROUP(478),           0,  GROUP(479),  GROUP(484),
-  /* bc */  GROUP(485),  GROUP(486),  GROUP(487),  GROUP(488),
-  /* c0 */  GROUP(489),  GROUP(490),  GROUP(491),  GROUP(492),
-  /* c4 */  GROUP(493),  GROUP(494),  GROUP(495),  GROUP(496),
-  /* c8 */  GROUP(505),  GROUP(506),  GROUP(507),  GROUP(508),
-  /* cc */  GROUP(509),  GROUP(510),  GROUP(511),  GROUP(512),
-  /* d0 */  GROUP(513),  GROUP(514),  GROUP(515),  GROUP(516),
-  /* d4 */  GROUP(517),  GROUP(518),  GROUP(519),  GROUP(520),
-  /* d8 */  GROUP(521),  GROUP(522),  GROUP(523),  GROUP(524),
-  /* dc */  GROUP(525),  GROUP(526),  GROUP(527),  GROUP(528),
-  /* e0 */  GROUP(529),  GROUP(530),  GROUP(531),  GROUP(532),
-  /* e4 */  GROUP(533),  GROUP(534),  GROUP(535),  GROUP(536),
-  /* e8 */  GROUP(537),  GROUP(538),  GROUP(539),  GROUP(540),
-  /* ec */  GROUP(541),  GROUP(542),  GROUP(543),  GROUP(544),
-  /* f0 */  GROUP(545),  GROUP(546),  GROUP(547),  GROUP(548),
-  /* f4 */  GROUP(549),  GROUP(550),  GROUP(551),  GROUP(552),
-  /* f8 */  GROUP(556),  GROUP(557),  GROUP(558),  GROUP(559),
-  /* fc */  GROUP(560),  GROUP(561),  GROUP(562),           0,
-};
-
-static const uint16_t ud_itab__563[] = {
-  /*  0 */         634,           0,
-};
-
-static const uint16_t ud_itab__564[] = {
-  /*  0 */         635,           0,
-};
-
-static const uint16_t ud_itab__565[] = {
-  /*  0 */         642,           0,
-};
-
-static const uint16_t ud_itab__566[] = {
-  /*  0 */         643,           0,
-};
-
-static const uint16_t ud_itab__567[] = {
-  /*  0 */         650,           0,
-};
-
-static const uint16_t ud_itab__568[] = {
-  /*  0 */         657,           0,
-};
-
-static const uint16_t ud_itab__569[] = {
-  /*  0 */         664,           0,
-};
-
-static const uint16_t ud_itab__570[] = {
-  /*  0 */         671,           0,
-};
-
-static const uint16_t ud_itab__572[] = {
-  /*  0 */         704,           0,
-};
-
-static const uint16_t ud_itab__573[] = {
-  /*  0 */         705,           0,
-};
-
-static const uint16_t ud_itab__571[] = {
-  /*  0 */  GROUP(572),  GROUP(573),           0,
-};
-
-static const uint16_t ud_itab__575[] = {
-  /*  0 */         706,           0,
-};
-
-static const uint16_t ud_itab__576[] = {
-  /*  0 */         707,           0,
-};
-
-static const uint16_t ud_itab__574[] = {
-  /*  0 */  GROUP(575),  GROUP(576),           0,
-};
-
-static const uint16_t ud_itab__577[] = {
-  /*  0 */         708,           0,
-};
-
-static const uint16_t ud_itab__578[] = {
-  /*  0 */         709,         710,
-};
-
-static const uint16_t ud_itab__579[] = {
-  /*  0 */         716,         717,           0,
-};
-
-static const uint16_t ud_itab__580[] = {
-  /*  0 */         719,         720,           0,
-};
-
-static const uint16_t ud_itab__581[] = {
-  /*  0 */         737,         738,         739,         740,
-  /*  4 */         741,         742,         743,         744,
-};
-
-static const uint16_t ud_itab__582[] = {
-  /*  0 */         745,         746,         747,         748,
-  /*  4 */         749,         750,         751,         752,
-};
-
-static const uint16_t ud_itab__584[] = {
-  /*  0 */         753,           0,
-};
-
-static const uint16_t ud_itab__585[] = {
-  /*  0 */         754,           0,
-};
-
-static const uint16_t ud_itab__586[] = {
-  /*  0 */         755,           0,
-};
-
-static const uint16_t ud_itab__587[] = {
-  /*  0 */         756,           0,
-};
-
-static const uint16_t ud_itab__588[] = {
-  /*  0 */         757,           0,
-};
-
-static const uint16_t ud_itab__589[] = {
-  /*  0 */         758,           0,
-};
-
-static const uint16_t ud_itab__590[] = {
-  /*  0 */         759,           0,
-};
-
-static const uint16_t ud_itab__591[] = {
-  /*  0 */         760,           0,
-};
-
-static const uint16_t ud_itab__583[] = {
-  /*  0 */  GROUP(584),  GROUP(585),  GROUP(586),  GROUP(587),
-  /*  4 */  GROUP(588),  GROUP(589),  GROUP(590),  GROUP(591),
-};
-
-static const uint16_t ud_itab__592[] = {
-  /*  0 */         761,         762,         763,         764,
-  /*  4 */         765,         766,         767,         768,
-};
-
-static const uint16_t ud_itab__593[] = {
-  /*  0 */         780,           0,           0,           0,
-  /*  4 */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__594[] = {
-  /*  0 */         789,         790,         791,
-};
-
-static const uint16_t ud_itab__595[] = {
-  /*  0 */         792,         793,         794,
-};
-
-static const uint16_t ud_itab__596[] = {
-  /*  0 */         795,           0,
-};
-
-static const uint16_t ud_itab__598[] = {
-  /*  0 */         797,         798,
-};
-
-static const uint16_t ud_itab__599[] = {
-  /*  0 */         799,         800,
-};
-
-static const uint16_t ud_itab__600[] = {
-  /*  0 */           0,         801,
-};
-
-static const uint16_t ud_itab__597[] = {
-  /*  0 */  GROUP(598),  GROUP(599),  GROUP(600),
-};
-
-static const uint16_t ud_itab__602[] = {
-  /*  0 */         802,           0,
-};
-
-static const uint16_t ud_itab__603[] = {
-  /*  0 */         803,         804,
-};
-
-static const uint16_t ud_itab__604[] = {
-  /*  0 */           0,         805,
-};
-
-static const uint16_t ud_itab__601[] = {
-  /*  0 */  GROUP(602),  GROUP(603),  GROUP(604),
-};
-
-static const uint16_t ud_itab__605[] = {
-  /*  0 */         813,         814,         815,
-};
-
-static const uint16_t ud_itab__606[] = {
-  /*  0 */         817,         818,         819,
-};
-
-static const uint16_t ud_itab__607[] = {
-  /*  0 */         823,         824,         825,
-};
-
-static const uint16_t ud_itab__608[] = {
-  /*  0 */         827,         828,         829,
-};
-
-static const uint16_t ud_itab__609[] = {
-  /*  0 */         831,         832,         833,
-};
-
-static const uint16_t ud_itab__610[] = {
-  /*  0 */         850,         851,         852,         853,
-  /*  4 */         854,         855,         856,         857,
-};
-
-static const uint16_t ud_itab__611[] = {
-  /*  0 */         858,         859,         860,         861,
-  /*  4 */         862,         863,         864,         865,
-};
-
-static const uint16_t ud_itab__612[] = {
-  /*  0 */         868,           0,
-};
-
-static const uint16_t ud_itab__613[] = {
-  /*  0 */         869,           0,
-};
-
-static const uint16_t ud_itab__614[] = {
-  /*  0 */         870,           0,           0,           0,
-  /*  4 */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__615[] = {
-  /*  0 */         871,           0,           0,           0,
-  /*  4 */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__616[] = {
-  /*  0 */         878,           0,
-};
-
-static const uint16_t ud_itab__617[] = {
-  /*  0 */         879,         880,         881,
-};
-
-static const uint16_t ud_itab__618[] = {
-  /*  0 */         882,         883,         884,         885,
-  /*  4 */         886,         887,         888,         889,
-};
-
-static const uint16_t ud_itab__619[] = {
-  /*  0 */         890,         891,         892,         893,
-  /*  4 */         894,         895,         896,         897,
-};
-
-static const uint16_t ud_itab__620[] = {
-  /*  0 */         898,         899,         900,         901,
-  /*  4 */         902,         903,         904,         905,
-};
-
-static const uint16_t ud_itab__621[] = {
-  /*  0 */         906,         907,         908,         909,
-  /*  4 */         910,         911,         912,         913,
-};
-
-static const uint16_t ud_itab__622[] = {
-  /*  0 */         914,           0,
-};
-
-static const uint16_t ud_itab__623[] = {
-  /*  0 */         915,           0,
-};
-
-static const uint16_t ud_itab__624[] = {
-  /*  0 */         916,           0,
-};
-
-static const uint16_t ud_itab__627[] = {
-  /*  0 */         918,           0,
-};
-
-static const uint16_t ud_itab__628[] = {
-  /*  0 */         919,           0,
-};
-
-static const uint16_t ud_itab__629[] = {
-  /*  0 */         920,           0,
-};
-
-static const uint16_t ud_itab__630[] = {
-  /*  0 */         921,           0,
-};
-
-static const uint16_t ud_itab__631[] = {
-  /*  0 */         922,           0,
-};
-
-static const uint16_t ud_itab__632[] = {
-  /*  0 */         923,           0,
-};
-
-static const uint16_t ud_itab__633[] = {
-  /*  0 */         924,           0,
-};
-
-static const uint16_t ud_itab__634[] = {
-  /*  0 */         925,           0,
-};
-
-static const uint16_t ud_itab__626[] = {
-  /*  0 */  GROUP(627),  GROUP(628),  GROUP(629),  GROUP(630),
-  /*  4 */  GROUP(631),  GROUP(632),  GROUP(633),  GROUP(634),
-};
-
-static const uint16_t ud_itab__636[] = {
-  /*  0 */           0,         926,
-};
-
-static const uint16_t ud_itab__637[] = {
-  /*  0 */           0,         927,
-};
-
-static const uint16_t ud_itab__638[] = {
-  /*  0 */           0,         928,
-};
-
-static const uint16_t ud_itab__639[] = {
-  /*  0 */           0,         929,
-};
-
-static const uint16_t ud_itab__640[] = {
-  /*  0 */           0,         930,
-};
-
-static const uint16_t ud_itab__641[] = {
-  /*  0 */           0,         931,
-};
-
-static const uint16_t ud_itab__642[] = {
-  /*  0 */           0,         932,
-};
-
-static const uint16_t ud_itab__643[] = {
-  /*  0 */           0,         933,
-};
-
-static const uint16_t ud_itab__644[] = {
-  /*  0 */           0,         934,
-};
-
-static const uint16_t ud_itab__645[] = {
-  /*  0 */           0,         935,
-};
-
-static const uint16_t ud_itab__646[] = {
-  /*  0 */           0,         936,
-};
-
-static const uint16_t ud_itab__647[] = {
-  /*  0 */           0,         937,
-};
-
-static const uint16_t ud_itab__648[] = {
-  /*  0 */           0,         938,
-};
-
-static const uint16_t ud_itab__649[] = {
-  /*  0 */           0,         939,
-};
-
-static const uint16_t ud_itab__650[] = {
-  /*  0 */           0,         940,
-};
-
-static const uint16_t ud_itab__651[] = {
-  /*  0 */           0,         941,
-};
-
-static const uint16_t ud_itab__652[] = {
-  /*  0 */           0,         942,
-};
-
-static const uint16_t ud_itab__653[] = {
-  /*  0 */           0,         943,
-};
-
-static const uint16_t ud_itab__654[] = {
-  /*  0 */           0,         944,
-};
-
-static const uint16_t ud_itab__655[] = {
-  /*  0 */           0,         945,
-};
-
-static const uint16_t ud_itab__656[] = {
-  /*  0 */           0,         946,
-};
-
-static const uint16_t ud_itab__657[] = {
-  /*  0 */           0,         947,
-};
-
-static const uint16_t ud_itab__658[] = {
-  /*  0 */           0,         948,
-};
-
-static const uint16_t ud_itab__659[] = {
-  /*  0 */           0,         949,
-};
-
-static const uint16_t ud_itab__660[] = {
-  /*  0 */           0,         950,
-};
-
-static const uint16_t ud_itab__661[] = {
-  /*  0 */           0,         951,
-};
-
-static const uint16_t ud_itab__662[] = {
-  /*  0 */           0,         952,
-};
-
-static const uint16_t ud_itab__663[] = {
-  /*  0 */           0,         953,
-};
-
-static const uint16_t ud_itab__664[] = {
-  /*  0 */           0,         954,
-};
-
-static const uint16_t ud_itab__665[] = {
-  /*  0 */           0,         955,
-};
-
-static const uint16_t ud_itab__666[] = {
-  /*  0 */           0,         956,
-};
-
-static const uint16_t ud_itab__667[] = {
-  /*  0 */           0,         957,
-};
-
-static const uint16_t ud_itab__668[] = {
-  /*  0 */           0,         958,
-};
-
-static const uint16_t ud_itab__669[] = {
-  /*  0 */           0,         959,
-};
-
-static const uint16_t ud_itab__670[] = {
-  /*  0 */           0,         960,
-};
-
-static const uint16_t ud_itab__671[] = {
-  /*  0 */           0,         961,
-};
-
-static const uint16_t ud_itab__672[] = {
-  /*  0 */           0,         962,
-};
-
-static const uint16_t ud_itab__673[] = {
-  /*  0 */           0,         963,
-};
-
-static const uint16_t ud_itab__674[] = {
-  /*  0 */           0,         964,
-};
-
-static const uint16_t ud_itab__675[] = {
-  /*  0 */           0,         965,
-};
-
-static const uint16_t ud_itab__676[] = {
-  /*  0 */           0,         966,
-};
-
-static const uint16_t ud_itab__677[] = {
-  /*  0 */           0,         967,
-};
-
-static const uint16_t ud_itab__678[] = {
-  /*  0 */           0,         968,
-};
-
-static const uint16_t ud_itab__679[] = {
-  /*  0 */           0,         969,
-};
-
-static const uint16_t ud_itab__680[] = {
-  /*  0 */           0,         970,
-};
-
-static const uint16_t ud_itab__681[] = {
-  /*  0 */           0,         971,
-};
-
-static const uint16_t ud_itab__682[] = {
-  /*  0 */           0,         972,
-};
-
-static const uint16_t ud_itab__683[] = {
-  /*  0 */           0,         973,
-};
-
-static const uint16_t ud_itab__684[] = {
-  /*  0 */           0,         974,
-};
-
-static const uint16_t ud_itab__685[] = {
-  /*  0 */           0,         975,
-};
-
-static const uint16_t ud_itab__686[] = {
-  /*  0 */           0,         976,
-};
-
-static const uint16_t ud_itab__687[] = {
-  /*  0 */           0,         977,
-};
-
-static const uint16_t ud_itab__688[] = {
-  /*  0 */           0,         978,
-};
-
-static const uint16_t ud_itab__689[] = {
-  /*  0 */           0,         979,
-};
-
-static const uint16_t ud_itab__690[] = {
-  /*  0 */           0,         980,
-};
-
-static const uint16_t ud_itab__691[] = {
-  /*  0 */           0,         981,
-};
-
-static const uint16_t ud_itab__692[] = {
-  /*  0 */           0,         982,
-};
-
-static const uint16_t ud_itab__693[] = {
-  /*  0 */           0,         983,
-};
-
-static const uint16_t ud_itab__694[] = {
-  /*  0 */           0,         984,
-};
-
-static const uint16_t ud_itab__695[] = {
-  /*  0 */           0,         985,
-};
-
-static const uint16_t ud_itab__696[] = {
-  /*  0 */           0,         986,
-};
-
-static const uint16_t ud_itab__697[] = {
-  /*  0 */           0,         987,
-};
-
-static const uint16_t ud_itab__698[] = {
-  /*  0 */           0,         988,
-};
-
-static const uint16_t ud_itab__699[] = {
-  /*  0 */           0,         989,
-};
-
-static const uint16_t ud_itab__635[] = {
-  /*  0 */  GROUP(636),  GROUP(637),  GROUP(638),  GROUP(639),
-  /*  4 */  GROUP(640),  GROUP(641),  GROUP(642),  GROUP(643),
-  /*  8 */  GROUP(644),  GROUP(645),  GROUP(646),  GROUP(647),
-  /*  c */  GROUP(648),  GROUP(649),  GROUP(650),  GROUP(651),
-  /* 10 */  GROUP(652),  GROUP(653),  GROUP(654),  GROUP(655),
-  /* 14 */  GROUP(656),  GROUP(657),  GROUP(658),  GROUP(659),
-  /* 18 */  GROUP(660),  GROUP(661),  GROUP(662),  GROUP(663),
-  /* 1c */  GROUP(664),  GROUP(665),  GROUP(666),  GROUP(667),
-  /* 20 */  GROUP(668),  GROUP(669),  GROUP(670),  GROUP(671),
-  /* 24 */  GROUP(672),  GROUP(673),  GROUP(674),  GROUP(675),
-  /* 28 */  GROUP(676),  GROUP(677),  GROUP(678),  GROUP(679),
-  /* 2c */  GROUP(680),  GROUP(681),  GROUP(682),  GROUP(683),
-  /* 30 */  GROUP(684),  GROUP(685),  GROUP(686),  GROUP(687),
-  /* 34 */  GROUP(688),  GROUP(689),  GROUP(690),  GROUP(691),
-  /* 38 */  GROUP(692),  GROUP(693),  GROUP(694),  GROUP(695),
-  /* 3c */  GROUP(696),  GROUP(697),  GROUP(698),  GROUP(699),
-};
-
-static const uint16_t ud_itab__625[] = {
-  /*  0 */  GROUP(626),  GROUP(635),
-};
-
-static const uint16_t ud_itab__702[] = {
-  /*  0 */         990,           0,
-};
-
-static const uint16_t ud_itab__703[] = {
-  /*  0 */         991,           0,
-};
-
-static const uint16_t ud_itab__704[] = {
-  /*  0 */         992,           0,
-};
-
-static const uint16_t ud_itab__705[] = {
-  /*  0 */         993,           0,
-};
-
-static const uint16_t ud_itab__706[] = {
-  /*  0 */         994,           0,
-};
-
-static const uint16_t ud_itab__707[] = {
-  /*  0 */         995,           0,
-};
-
-static const uint16_t ud_itab__708[] = {
-  /*  0 */         996,           0,
-};
-
-static const uint16_t ud_itab__701[] = {
-  /*  0 */  GROUP(702),           0,  GROUP(703),  GROUP(704),
-  /*  4 */  GROUP(705),  GROUP(706),  GROUP(707),  GROUP(708),
-};
-
-static const uint16_t ud_itab__710[] = {
-  /*  0 */           0,         997,
-};
-
-static const uint16_t ud_itab__711[] = {
-  /*  0 */           0,         998,
-};
-
-static const uint16_t ud_itab__712[] = {
-  /*  0 */           0,         999,
-};
-
-static const uint16_t ud_itab__713[] = {
-  /*  0 */           0,        1000,
-};
-
-static const uint16_t ud_itab__714[] = {
-  /*  0 */           0,        1001,
-};
-
-static const uint16_t ud_itab__715[] = {
-  /*  0 */           0,        1002,
-};
-
-static const uint16_t ud_itab__716[] = {
-  /*  0 */           0,        1003,
-};
-
-static const uint16_t ud_itab__717[] = {
-  /*  0 */           0,        1004,
-};
-
-static const uint16_t ud_itab__718[] = {
-  /*  0 */           0,        1005,
-};
-
-static const uint16_t ud_itab__719[] = {
-  /*  0 */           0,        1006,
-};
-
-static const uint16_t ud_itab__720[] = {
-  /*  0 */           0,        1007,
-};
-
-static const uint16_t ud_itab__721[] = {
-  /*  0 */           0,        1008,
-};
-
-static const uint16_t ud_itab__722[] = {
-  /*  0 */           0,        1009,
-};
-
-static const uint16_t ud_itab__723[] = {
-  /*  0 */           0,        1010,
-};
-
-static const uint16_t ud_itab__724[] = {
-  /*  0 */           0,        1011,
-};
-
-static const uint16_t ud_itab__725[] = {
-  /*  0 */           0,        1012,
-};
-
-static const uint16_t ud_itab__726[] = {
-  /*  0 */           0,        1013,
-};
-
-static const uint16_t ud_itab__727[] = {
-  /*  0 */           0,        1014,
-};
-
-static const uint16_t ud_itab__728[] = {
-  /*  0 */           0,        1015,
-};
-
-static const uint16_t ud_itab__729[] = {
-  /*  0 */           0,        1016,
-};
-
-static const uint16_t ud_itab__730[] = {
-  /*  0 */           0,        1017,
-};
-
-static const uint16_t ud_itab__731[] = {
-  /*  0 */           0,        1018,
-};
-
-static const uint16_t ud_itab__732[] = {
-  /*  0 */           0,        1019,
-};
-
-static const uint16_t ud_itab__733[] = {
-  /*  0 */           0,        1020,
-};
-
-static const uint16_t ud_itab__734[] = {
-  /*  0 */           0,        1021,
-};
-
-static const uint16_t ud_itab__735[] = {
-  /*  0 */           0,        1022,
-};
-
-static const uint16_t ud_itab__736[] = {
-  /*  0 */           0,        1023,
-};
-
-static const uint16_t ud_itab__737[] = {
-  /*  0 */           0,        1024,
-};
-
-static const uint16_t ud_itab__738[] = {
-  /*  0 */           0,        1025,
-};
-
-static const uint16_t ud_itab__739[] = {
-  /*  0 */           0,        1026,
-};
-
-static const uint16_t ud_itab__740[] = {
-  /*  0 */           0,        1027,
-};
-
-static const uint16_t ud_itab__741[] = {
-  /*  0 */           0,        1028,
-};
-
-static const uint16_t ud_itab__742[] = {
-  /*  0 */           0,        1029,
-};
-
-static const uint16_t ud_itab__743[] = {
-  /*  0 */           0,        1030,
-};
-
-static const uint16_t ud_itab__744[] = {
-  /*  0 */           0,        1031,
-};
-
-static const uint16_t ud_itab__745[] = {
-  /*  0 */           0,        1032,
-};
-
-static const uint16_t ud_itab__746[] = {
-  /*  0 */           0,        1033,
-};
-
-static const uint16_t ud_itab__747[] = {
-  /*  0 */           0,        1034,
-};
-
-static const uint16_t ud_itab__748[] = {
-  /*  0 */           0,        1035,
-};
-
-static const uint16_t ud_itab__749[] = {
-  /*  0 */           0,        1036,
-};
-
-static const uint16_t ud_itab__750[] = {
-  /*  0 */           0,        1037,
-};
-
-static const uint16_t ud_itab__751[] = {
-  /*  0 */           0,        1038,
-};
-
-static const uint16_t ud_itab__752[] = {
-  /*  0 */           0,        1039,
-};
-
-static const uint16_t ud_itab__753[] = {
-  /*  0 */           0,        1040,
-};
-
-static const uint16_t ud_itab__754[] = {
-  /*  0 */           0,        1041,
-};
-
-static const uint16_t ud_itab__755[] = {
-  /*  0 */           0,        1042,
-};
-
-static const uint16_t ud_itab__756[] = {
-  /*  0 */           0,        1043,
-};
-
-static const uint16_t ud_itab__757[] = {
-  /*  0 */           0,        1044,
-};
-
-static const uint16_t ud_itab__758[] = {
-  /*  0 */           0,        1045,
-};
-
-static const uint16_t ud_itab__759[] = {
-  /*  0 */           0,        1046,
-};
-
-static const uint16_t ud_itab__760[] = {
-  /*  0 */           0,        1047,
-};
-
-static const uint16_t ud_itab__761[] = {
-  /*  0 */           0,        1048,
-};
-
-static const uint16_t ud_itab__709[] = {
-  /*  0 */  GROUP(710),  GROUP(711),  GROUP(712),  GROUP(713),
-  /*  4 */  GROUP(714),  GROUP(715),  GROUP(716),  GROUP(717),
-  /*  8 */  GROUP(718),  GROUP(719),  GROUP(720),  GROUP(721),
-  /*  c */  GROUP(722),  GROUP(723),  GROUP(724),  GROUP(725),
-  /* 10 */  GROUP(726),           0,           0,           0,
-  /* 14 */           0,           0,           0,           0,
-  /* 18 */  GROUP(727),  GROUP(728),  GROUP(729),  GROUP(730),
-  /* 1c */  GROUP(731),  GROUP(732),  GROUP(733),  GROUP(734),
-  /* 20 */  GROUP(735),  GROUP(736),           0,           0,
-  /* 24 */  GROUP(737),  GROUP(738),           0,           0,
-  /* 28 */  GROUP(739),  GROUP(740),  GROUP(741),  GROUP(742),
-  /* 2c */  GROUP(743),  GROUP(744),  GROUP(745),           0,
-  /* 30 */  GROUP(746),  GROUP(747),  GROUP(748),  GROUP(749),
-  /* 34 */  GROUP(750),  GROUP(751),  GROUP(752),  GROUP(753),
-  /* 38 */  GROUP(754),  GROUP(755),  GROUP(756),  GROUP(757),
-  /* 3c */  GROUP(758),  GROUP(759),  GROUP(760),  GROUP(761),
-};
-
-static const uint16_t ud_itab__700[] = {
-  /*  0 */  GROUP(701),  GROUP(709),
-};
-
-static const uint16_t ud_itab__764[] = {
-  /*  0 */        1049,           0,
-};
-
-static const uint16_t ud_itab__765[] = {
-  /*  0 */        1050,           0,
-};
-
-static const uint16_t ud_itab__766[] = {
-  /*  0 */        1051,           0,
-};
-
-static const uint16_t ud_itab__767[] = {
-  /*  0 */        1052,           0,
-};
-
-static const uint16_t ud_itab__768[] = {
-  /*  0 */        1053,           0,
-};
-
-static const uint16_t ud_itab__769[] = {
-  /*  0 */        1054,           0,
-};
-
-static const uint16_t ud_itab__770[] = {
-  /*  0 */        1055,           0,
-};
-
-static const uint16_t ud_itab__771[] = {
-  /*  0 */        1056,           0,
-};
-
-static const uint16_t ud_itab__763[] = {
-  /*  0 */  GROUP(764),  GROUP(765),  GROUP(766),  GROUP(767),
-  /*  4 */  GROUP(768),  GROUP(769),  GROUP(770),  GROUP(771),
-};
-
-static const uint16_t ud_itab__773[] = {
-  /*  0 */           0,        1057,
-};
-
-static const uint16_t ud_itab__774[] = {
-  /*  0 */           0,        1058,
-};
-
-static const uint16_t ud_itab__775[] = {
-  /*  0 */           0,        1059,
-};
-
-static const uint16_t ud_itab__776[] = {
-  /*  0 */           0,        1060,
-};
-
-static const uint16_t ud_itab__777[] = {
-  /*  0 */           0,        1061,
-};
-
-static const uint16_t ud_itab__778[] = {
-  /*  0 */           0,        1062,
-};
-
-static const uint16_t ud_itab__779[] = {
-  /*  0 */           0,        1063,
-};
-
-static const uint16_t ud_itab__780[] = {
-  /*  0 */           0,        1064,
-};
-
-static const uint16_t ud_itab__781[] = {
-  /*  0 */           0,        1065,
-};
-
-static const uint16_t ud_itab__782[] = {
-  /*  0 */           0,        1066,
-};
-
-static const uint16_t ud_itab__783[] = {
-  /*  0 */           0,        1067,
-};
-
-static const uint16_t ud_itab__784[] = {
-  /*  0 */           0,        1068,
-};
-
-static const uint16_t ud_itab__785[] = {
-  /*  0 */           0,        1069,
-};
-
-static const uint16_t ud_itab__786[] = {
-  /*  0 */           0,        1070,
-};
-
-static const uint16_t ud_itab__787[] = {
-  /*  0 */           0,        1071,
-};
-
-static const uint16_t ud_itab__788[] = {
-  /*  0 */           0,        1072,
-};
-
-static const uint16_t ud_itab__789[] = {
-  /*  0 */           0,        1073,
-};
-
-static const uint16_t ud_itab__790[] = {
-  /*  0 */           0,        1074,
-};
-
-static const uint16_t ud_itab__791[] = {
-  /*  0 */           0,        1075,
-};
-
-static const uint16_t ud_itab__792[] = {
-  /*  0 */           0,        1076,
-};
-
-static const uint16_t ud_itab__793[] = {
-  /*  0 */           0,        1077,
-};
-
-static const uint16_t ud_itab__794[] = {
-  /*  0 */           0,        1078,
-};
-
-static const uint16_t ud_itab__795[] = {
-  /*  0 */           0,        1079,
-};
-
-static const uint16_t ud_itab__796[] = {
-  /*  0 */           0,        1080,
-};
-
-static const uint16_t ud_itab__797[] = {
-  /*  0 */           0,        1081,
-};
-
-static const uint16_t ud_itab__798[] = {
-  /*  0 */           0,        1082,
-};
-
-static const uint16_t ud_itab__799[] = {
-  /*  0 */           0,        1083,
-};
-
-static const uint16_t ud_itab__800[] = {
-  /*  0 */           0,        1084,
-};
-
-static const uint16_t ud_itab__801[] = {
-  /*  0 */           0,        1085,
-};
-
-static const uint16_t ud_itab__802[] = {
-  /*  0 */           0,        1086,
-};
-
-static const uint16_t ud_itab__803[] = {
-  /*  0 */           0,        1087,
-};
-
-static const uint16_t ud_itab__804[] = {
-  /*  0 */           0,        1088,
-};
-
-static const uint16_t ud_itab__805[] = {
-  /*  0 */           0,        1089,
-};
-
-static const uint16_t ud_itab__772[] = {
-  /*  0 */  GROUP(773),  GROUP(774),  GROUP(775),  GROUP(776),
-  /*  4 */  GROUP(777),  GROUP(778),  GROUP(779),  GROUP(780),
-  /*  8 */  GROUP(781),  GROUP(782),  GROUP(783),  GROUP(784),
-  /*  c */  GROUP(785),  GROUP(786),  GROUP(787),  GROUP(788),
-  /* 10 */  GROUP(789),  GROUP(790),  GROUP(791),  GROUP(792),
-  /* 14 */  GROUP(793),  GROUP(794),  GROUP(795),  GROUP(796),
-  /* 18 */  GROUP(797),  GROUP(798),  GROUP(799),  GROUP(800),
-  /* 1c */  GROUP(801),  GROUP(802),  GROUP(803),  GROUP(804),
-  /* 20 */           0,           0,           0,           0,
-  /* 24 */           0,           0,           0,           0,
-  /* 28 */           0,  GROUP(805),           0,           0,
-  /* 2c */           0,           0,           0,           0,
-  /* 30 */           0,           0,           0,           0,
-  /* 34 */           0,           0,           0,           0,
-  /* 38 */           0,           0,           0,           0,
-  /* 3c */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__762[] = {
-  /*  0 */  GROUP(763),  GROUP(772),
-};
-
-static const uint16_t ud_itab__808[] = {
-  /*  0 */        1090,           0,
-};
-
-static const uint16_t ud_itab__809[] = {
-  /*  0 */        1091,           0,
-};
-
-static const uint16_t ud_itab__810[] = {
-  /*  0 */        1092,           0,
-};
-
-static const uint16_t ud_itab__811[] = {
-  /*  0 */        1093,           0,
-};
-
-static const uint16_t ud_itab__812[] = {
-  /*  0 */        1094,           0,
-};
-
-static const uint16_t ud_itab__813[] = {
-  /*  0 */        1095,           0,
-};
-
-static const uint16_t ud_itab__807[] = {
-  /*  0 */  GROUP(808),  GROUP(809),  GROUP(810),  GROUP(811),
-  /*  4 */           0,  GROUP(812),           0,  GROUP(813),
-};
-
-static const uint16_t ud_itab__815[] = {
-  /*  0 */           0,        1096,
-};
-
-static const uint16_t ud_itab__816[] = {
-  /*  0 */           0,        1097,
-};
-
-static const uint16_t ud_itab__817[] = {
-  /*  0 */           0,        1098,
-};
-
-static const uint16_t ud_itab__818[] = {
-  /*  0 */           0,        1099,
-};
-
-static const uint16_t ud_itab__819[] = {
-  /*  0 */           0,        1100,
-};
-
-static const uint16_t ud_itab__820[] = {
-  /*  0 */           0,        1101,
-};
-
-static const uint16_t ud_itab__821[] = {
-  /*  0 */           0,        1102,
-};
-
-static const uint16_t ud_itab__822[] = {
-  /*  0 */           0,        1103,
-};
-
-static const uint16_t ud_itab__823[] = {
-  /*  0 */           0,        1104,
-};
-
-static const uint16_t ud_itab__824[] = {
-  /*  0 */           0,        1105,
-};
-
-static const uint16_t ud_itab__825[] = {
-  /*  0 */           0,        1106,
-};
-
-static const uint16_t ud_itab__826[] = {
-  /*  0 */           0,        1107,
-};
-
-static const uint16_t ud_itab__827[] = {
-  /*  0 */           0,        1108,
-};
-
-static const uint16_t ud_itab__828[] = {
-  /*  0 */           0,        1109,
-};
-
-static const uint16_t ud_itab__829[] = {
-  /*  0 */           0,        1110,
-};
-
-static const uint16_t ud_itab__830[] = {
-  /*  0 */           0,        1111,
-};
-
-static const uint16_t ud_itab__831[] = {
-  /*  0 */           0,        1112,
-};
-
-static const uint16_t ud_itab__832[] = {
-  /*  0 */           0,        1113,
-};
-
-static const uint16_t ud_itab__833[] = {
-  /*  0 */           0,        1114,
-};
-
-static const uint16_t ud_itab__834[] = {
-  /*  0 */           0,        1115,
-};
-
-static const uint16_t ud_itab__835[] = {
-  /*  0 */           0,        1116,
-};
-
-static const uint16_t ud_itab__836[] = {
-  /*  0 */           0,        1117,
-};
-
-static const uint16_t ud_itab__837[] = {
-  /*  0 */           0,        1118,
-};
-
-static const uint16_t ud_itab__838[] = {
-  /*  0 */           0,        1119,
-};
-
-static const uint16_t ud_itab__839[] = {
-  /*  0 */           0,        1120,
-};
-
-static const uint16_t ud_itab__840[] = {
-  /*  0 */           0,        1121,
-};
-
-static const uint16_t ud_itab__841[] = {
-  /*  0 */           0,        1122,
-};
-
-static const uint16_t ud_itab__842[] = {
-  /*  0 */           0,        1123,
-};
-
-static const uint16_t ud_itab__843[] = {
-  /*  0 */           0,        1124,
-};
-
-static const uint16_t ud_itab__844[] = {
-  /*  0 */           0,        1125,
-};
-
-static const uint16_t ud_itab__845[] = {
-  /*  0 */           0,        1126,
-};
-
-static const uint16_t ud_itab__846[] = {
-  /*  0 */           0,        1127,
-};
-
-static const uint16_t ud_itab__847[] = {
-  /*  0 */           0,        1128,
-};
-
-static const uint16_t ud_itab__848[] = {
-  /*  0 */           0,        1129,
-};
-
-static const uint16_t ud_itab__849[] = {
-  /*  0 */           0,        1130,
-};
-
-static const uint16_t ud_itab__850[] = {
-  /*  0 */           0,        1131,
-};
-
-static const uint16_t ud_itab__851[] = {
-  /*  0 */           0,        1132,
-};
-
-static const uint16_t ud_itab__852[] = {
-  /*  0 */           0,        1133,
-};
-
-static const uint16_t ud_itab__853[] = {
-  /*  0 */           0,        1134,
-};
-
-static const uint16_t ud_itab__854[] = {
-  /*  0 */           0,        1135,
-};
-
-static const uint16_t ud_itab__855[] = {
-  /*  0 */           0,        1136,
-};
-
-static const uint16_t ud_itab__856[] = {
-  /*  0 */           0,        1137,
-};
-
-static const uint16_t ud_itab__857[] = {
-  /*  0 */           0,        1138,
-};
-
-static const uint16_t ud_itab__858[] = {
-  /*  0 */           0,        1139,
-};
-
-static const uint16_t ud_itab__859[] = {
-  /*  0 */           0,        1140,
-};
-
-static const uint16_t ud_itab__860[] = {
-  /*  0 */           0,        1141,
-};
-
-static const uint16_t ud_itab__861[] = {
-  /*  0 */           0,        1142,
-};
-
-static const uint16_t ud_itab__862[] = {
-  /*  0 */           0,        1143,
-};
-
-static const uint16_t ud_itab__863[] = {
-  /*  0 */           0,        1144,
-};
-
-static const uint16_t ud_itab__864[] = {
-  /*  0 */           0,        1145,
-};
-
-static const uint16_t ud_itab__814[] = {
-  /*  0 */  GROUP(815),  GROUP(816),  GROUP(817),  GROUP(818),
-  /*  4 */  GROUP(819),  GROUP(820),  GROUP(821),  GROUP(822),
-  /*  8 */  GROUP(823),  GROUP(824),  GROUP(825),  GROUP(826),
-  /*  c */  GROUP(827),  GROUP(828),  GROUP(829),  GROUP(830),
-  /* 10 */  GROUP(831),  GROUP(832),  GROUP(833),  GROUP(834),
-  /* 14 */  GROUP(835),  GROUP(836),  GROUP(837),  GROUP(838),
-  /* 18 */  GROUP(839),  GROUP(840),  GROUP(841),  GROUP(842),
-  /* 1c */  GROUP(843),  GROUP(844),  GROUP(845),  GROUP(846),
-  /* 20 */           0,           0,  GROUP(847),  GROUP(848),
-  /* 24 */           0,           0,           0,           0,
-  /* 28 */  GROUP(849),  GROUP(850),  GROUP(851),  GROUP(852),
-  /* 2c */  GROUP(853),  GROUP(854),  GROUP(855),  GROUP(856),
-  /* 30 */  GROUP(857),  GROUP(858),  GROUP(859),  GROUP(860),
-  /* 34 */  GROUP(861),  GROUP(862),  GROUP(863),  GROUP(864),
-  /* 38 */           0,           0,           0,           0,
-  /* 3c */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__806[] = {
-  /*  0 */  GROUP(807),  GROUP(814),
-};
-
-static const uint16_t ud_itab__867[] = {
-  /*  0 */        1146,           0,
-};
-
-static const uint16_t ud_itab__868[] = {
-  /*  0 */        1147,           0,
-};
-
-static const uint16_t ud_itab__869[] = {
-  /*  0 */        1148,           0,
-};
-
-static const uint16_t ud_itab__870[] = {
-  /*  0 */        1149,           0,
-};
-
-static const uint16_t ud_itab__871[] = {
-  /*  0 */        1150,           0,
-};
-
-static const uint16_t ud_itab__872[] = {
-  /*  0 */        1151,           0,
-};
-
-static const uint16_t ud_itab__873[] = {
-  /*  0 */        1152,           0,
-};
-
-static const uint16_t ud_itab__874[] = {
-  /*  0 */        1153,           0,
-};
-
-static const uint16_t ud_itab__866[] = {
-  /*  0 */  GROUP(867),  GROUP(868),  GROUP(869),  GROUP(870),
-  /*  4 */  GROUP(871),  GROUP(872),  GROUP(873),  GROUP(874),
-};
-
-static const uint16_t ud_itab__876[] = {
-  /*  0 */           0,        1154,
-};
-
-static const uint16_t ud_itab__877[] = {
-  /*  0 */           0,        1155,
-};
-
-static const uint16_t ud_itab__878[] = {
-  /*  0 */           0,        1156,
-};
-
-static const uint16_t ud_itab__879[] = {
-  /*  0 */           0,        1157,
-};
-
-static const uint16_t ud_itab__880[] = {
-  /*  0 */           0,        1158,
-};
-
-static const uint16_t ud_itab__881[] = {
-  /*  0 */           0,        1159,
-};
-
-static const uint16_t ud_itab__882[] = {
-  /*  0 */           0,        1160,
-};
-
-static const uint16_t ud_itab__883[] = {
-  /*  0 */           0,        1161,
-};
-
-static const uint16_t ud_itab__884[] = {
-  /*  0 */           0,        1162,
-};
-
-static const uint16_t ud_itab__885[] = {
-  /*  0 */           0,        1163,
-};
-
-static const uint16_t ud_itab__886[] = {
-  /*  0 */           0,        1164,
-};
-
-static const uint16_t ud_itab__887[] = {
-  /*  0 */           0,        1165,
-};
-
-static const uint16_t ud_itab__888[] = {
-  /*  0 */           0,        1166,
-};
-
-static const uint16_t ud_itab__889[] = {
-  /*  0 */           0,        1167,
-};
-
-static const uint16_t ud_itab__890[] = {
-  /*  0 */           0,        1168,
-};
-
-static const uint16_t ud_itab__891[] = {
-  /*  0 */           0,        1169,
-};
-
-static const uint16_t ud_itab__892[] = {
-  /*  0 */           0,        1170,
-};
-
-static const uint16_t ud_itab__893[] = {
-  /*  0 */           0,        1171,
-};
-
-static const uint16_t ud_itab__894[] = {
-  /*  0 */           0,        1172,
-};
-
-static const uint16_t ud_itab__895[] = {
-  /*  0 */           0,        1173,
-};
-
-static const uint16_t ud_itab__896[] = {
-  /*  0 */           0,        1174,
-};
-
-static const uint16_t ud_itab__897[] = {
-  /*  0 */           0,        1175,
-};
-
-static const uint16_t ud_itab__898[] = {
-  /*  0 */           0,        1176,
-};
-
-static const uint16_t ud_itab__899[] = {
-  /*  0 */           0,        1177,
-};
-
-static const uint16_t ud_itab__900[] = {
-  /*  0 */           0,        1178,
-};
-
-static const uint16_t ud_itab__901[] = {
-  /*  0 */           0,        1179,
-};
-
-static const uint16_t ud_itab__902[] = {
-  /*  0 */           0,        1180,
-};
-
-static const uint16_t ud_itab__903[] = {
-  /*  0 */           0,        1181,
-};
-
-static const uint16_t ud_itab__904[] = {
-  /*  0 */           0,        1182,
-};
-
-static const uint16_t ud_itab__905[] = {
-  /*  0 */           0,        1183,
-};
-
-static const uint16_t ud_itab__906[] = {
-  /*  0 */           0,        1184,
-};
-
-static const uint16_t ud_itab__907[] = {
-  /*  0 */           0,        1185,
-};
-
-static const uint16_t ud_itab__908[] = {
-  /*  0 */           0,        1186,
-};
-
-static const uint16_t ud_itab__909[] = {
-  /*  0 */           0,        1187,
-};
-
-static const uint16_t ud_itab__910[] = {
-  /*  0 */           0,        1188,
-};
-
-static const uint16_t ud_itab__911[] = {
-  /*  0 */           0,        1189,
-};
-
-static const uint16_t ud_itab__912[] = {
-  /*  0 */           0,        1190,
-};
-
-static const uint16_t ud_itab__913[] = {
-  /*  0 */           0,        1191,
-};
-
-static const uint16_t ud_itab__914[] = {
-  /*  0 */           0,        1192,
-};
-
-static const uint16_t ud_itab__915[] = {
-  /*  0 */           0,        1193,
-};
-
-static const uint16_t ud_itab__916[] = {
-  /*  0 */           0,        1194,
-};
-
-static const uint16_t ud_itab__917[] = {
-  /*  0 */           0,        1195,
-};
-
-static const uint16_t ud_itab__918[] = {
-  /*  0 */           0,        1196,
-};
-
-static const uint16_t ud_itab__919[] = {
-  /*  0 */           0,        1197,
-};
-
-static const uint16_t ud_itab__920[] = {
-  /*  0 */           0,        1198,
-};
-
-static const uint16_t ud_itab__921[] = {
-  /*  0 */           0,        1199,
-};
-
-static const uint16_t ud_itab__922[] = {
-  /*  0 */           0,        1200,
-};
-
-static const uint16_t ud_itab__923[] = {
-  /*  0 */           0,        1201,
-};
-
-static const uint16_t ud_itab__924[] = {
-  /*  0 */           0,        1202,
-};
-
-static const uint16_t ud_itab__925[] = {
-  /*  0 */           0,        1203,
-};
-
-static const uint16_t ud_itab__926[] = {
-  /*  0 */           0,        1204,
-};
-
-static const uint16_t ud_itab__927[] = {
-  /*  0 */           0,        1205,
-};
-
-static const uint16_t ud_itab__928[] = {
-  /*  0 */           0,        1206,
-};
-
-static const uint16_t ud_itab__929[] = {
-  /*  0 */           0,        1207,
-};
-
-static const uint16_t ud_itab__930[] = {
-  /*  0 */           0,        1208,
-};
-
-static const uint16_t ud_itab__931[] = {
-  /*  0 */           0,        1209,
-};
-
-static const uint16_t ud_itab__932[] = {
-  /*  0 */           0,        1210,
-};
-
-static const uint16_t ud_itab__933[] = {
-  /*  0 */           0,        1211,
-};
-
-static const uint16_t ud_itab__934[] = {
-  /*  0 */           0,        1212,
-};
-
-static const uint16_t ud_itab__935[] = {
-  /*  0 */           0,        1213,
-};
-
-static const uint16_t ud_itab__936[] = {
-  /*  0 */           0,        1214,
-};
-
-static const uint16_t ud_itab__937[] = {
-  /*  0 */           0,        1215,
-};
-
-static const uint16_t ud_itab__938[] = {
-  /*  0 */           0,        1216,
-};
-
-static const uint16_t ud_itab__939[] = {
-  /*  0 */           0,        1217,
-};
-
-static const uint16_t ud_itab__875[] = {
-  /*  0 */  GROUP(876),  GROUP(877),  GROUP(878),  GROUP(879),
-  /*  4 */  GROUP(880),  GROUP(881),  GROUP(882),  GROUP(883),
-  /*  8 */  GROUP(884),  GROUP(885),  GROUP(886),  GROUP(887),
-  /*  c */  GROUP(888),  GROUP(889),  GROUP(890),  GROUP(891),
-  /* 10 */  GROUP(892),  GROUP(893),  GROUP(894),  GROUP(895),
-  /* 14 */  GROUP(896),  GROUP(897),  GROUP(898),  GROUP(899),
-  /* 18 */  GROUP(900),  GROUP(901),  GROUP(902),  GROUP(903),
-  /* 1c */  GROUP(904),  GROUP(905),  GROUP(906),  GROUP(907),
-  /* 20 */  GROUP(908),  GROUP(909),  GROUP(910),  GROUP(911),
-  /* 24 */  GROUP(912),  GROUP(913),  GROUP(914),  GROUP(915),
-  /* 28 */  GROUP(916),  GROUP(917),  GROUP(918),  GROUP(919),
-  /* 2c */  GROUP(920),  GROUP(921),  GROUP(922),  GROUP(923),
-  /* 30 */  GROUP(924),  GROUP(925),  GROUP(926),  GROUP(927),
-  /* 34 */  GROUP(928),  GROUP(929),  GROUP(930),  GROUP(931),
-  /* 38 */  GROUP(932),  GROUP(933),  GROUP(934),  GROUP(935),
-  /* 3c */  GROUP(936),  GROUP(937),  GROUP(938),  GROUP(939),
-};
-
-static const uint16_t ud_itab__865[] = {
-  /*  0 */  GROUP(866),  GROUP(875),
-};
-
-static const uint16_t ud_itab__942[] = {
-  /*  0 */        1218,           0,
-};
-
-static const uint16_t ud_itab__943[] = {
-  /*  0 */        1219,           0,
-};
-
-static const uint16_t ud_itab__944[] = {
-  /*  0 */        1220,           0,
-};
-
-static const uint16_t ud_itab__945[] = {
-  /*  0 */        1221,           0,
-};
-
-static const uint16_t ud_itab__946[] = {
-  /*  0 */        1222,           0,
-};
-
-static const uint16_t ud_itab__947[] = {
-  /*  0 */        1223,           0,
-};
-
-static const uint16_t ud_itab__948[] = {
-  /*  0 */        1224,           0,
-};
-
-static const uint16_t ud_itab__941[] = {
-  /*  0 */  GROUP(942),  GROUP(943),  GROUP(944),  GROUP(945),
-  /*  4 */  GROUP(946),           0,  GROUP(947),  GROUP(948),
-};
-
-static const uint16_t ud_itab__950[] = {
-  /*  0 */           0,        1225,
-};
-
-static const uint16_t ud_itab__951[] = {
-  /*  0 */           0,        1226,
-};
-
-static const uint16_t ud_itab__952[] = {
-  /*  0 */           0,        1227,
-};
-
-static const uint16_t ud_itab__953[] = {
-  /*  0 */           0,        1228,
-};
-
-static const uint16_t ud_itab__954[] = {
-  /*  0 */           0,        1229,
-};
-
-static const uint16_t ud_itab__955[] = {
-  /*  0 */           0,        1230,
-};
-
-static const uint16_t ud_itab__956[] = {
-  /*  0 */           0,        1231,
-};
-
-static const uint16_t ud_itab__957[] = {
-  /*  0 */           0,        1232,
-};
-
-static const uint16_t ud_itab__958[] = {
-  /*  0 */           0,        1233,
-};
-
-static const uint16_t ud_itab__959[] = {
-  /*  0 */           0,        1234,
-};
-
-static const uint16_t ud_itab__960[] = {
-  /*  0 */           0,        1235,
-};
-
-static const uint16_t ud_itab__961[] = {
-  /*  0 */           0,        1236,
-};
-
-static const uint16_t ud_itab__962[] = {
-  /*  0 */           0,        1237,
-};
-
-static const uint16_t ud_itab__963[] = {
-  /*  0 */           0,        1238,
-};
-
-static const uint16_t ud_itab__964[] = {
-  /*  0 */           0,        1239,
-};
-
-static const uint16_t ud_itab__965[] = {
-  /*  0 */           0,        1240,
-};
-
-static const uint16_t ud_itab__966[] = {
-  /*  0 */           0,        1241,
-};
-
-static const uint16_t ud_itab__967[] = {
-  /*  0 */           0,        1242,
-};
-
-static const uint16_t ud_itab__968[] = {
-  /*  0 */           0,        1243,
-};
-
-static const uint16_t ud_itab__969[] = {
-  /*  0 */           0,        1244,
-};
-
-static const uint16_t ud_itab__970[] = {
-  /*  0 */           0,        1245,
-};
-
-static const uint16_t ud_itab__971[] = {
-  /*  0 */           0,        1246,
-};
-
-static const uint16_t ud_itab__972[] = {
-  /*  0 */           0,        1247,
-};
-
-static const uint16_t ud_itab__973[] = {
-  /*  0 */           0,        1248,
-};
-
-static const uint16_t ud_itab__974[] = {
-  /*  0 */           0,        1249,
-};
-
-static const uint16_t ud_itab__975[] = {
-  /*  0 */           0,        1250,
-};
-
-static const uint16_t ud_itab__976[] = {
-  /*  0 */           0,        1251,
-};
-
-static const uint16_t ud_itab__977[] = {
-  /*  0 */           0,        1252,
-};
-
-static const uint16_t ud_itab__978[] = {
-  /*  0 */           0,        1253,
-};
-
-static const uint16_t ud_itab__979[] = {
-  /*  0 */           0,        1254,
-};
-
-static const uint16_t ud_itab__980[] = {
-  /*  0 */           0,        1255,
-};
-
-static const uint16_t ud_itab__981[] = {
-  /*  0 */           0,        1256,
-};
-
-static const uint16_t ud_itab__982[] = {
-  /*  0 */           0,        1257,
-};
-
-static const uint16_t ud_itab__983[] = {
-  /*  0 */           0,        1258,
-};
-
-static const uint16_t ud_itab__984[] = {
-  /*  0 */           0,        1259,
-};
-
-static const uint16_t ud_itab__985[] = {
-  /*  0 */           0,        1260,
-};
-
-static const uint16_t ud_itab__986[] = {
-  /*  0 */           0,        1261,
-};
-
-static const uint16_t ud_itab__987[] = {
-  /*  0 */           0,        1262,
-};
-
-static const uint16_t ud_itab__988[] = {
-  /*  0 */           0,        1263,
-};
-
-static const uint16_t ud_itab__989[] = {
-  /*  0 */           0,        1264,
-};
-
-static const uint16_t ud_itab__990[] = {
-  /*  0 */           0,        1265,
-};
-
-static const uint16_t ud_itab__991[] = {
-  /*  0 */           0,        1266,
-};
-
-static const uint16_t ud_itab__992[] = {
-  /*  0 */           0,        1267,
-};
-
-static const uint16_t ud_itab__993[] = {
-  /*  0 */           0,        1268,
-};
-
-static const uint16_t ud_itab__994[] = {
-  /*  0 */           0,        1269,
-};
-
-static const uint16_t ud_itab__995[] = {
-  /*  0 */           0,        1270,
-};
-
-static const uint16_t ud_itab__996[] = {
-  /*  0 */           0,        1271,
-};
-
-static const uint16_t ud_itab__997[] = {
-  /*  0 */           0,        1272,
-};
-
-static const uint16_t ud_itab__949[] = {
-  /*  0 */  GROUP(950),  GROUP(951),  GROUP(952),  GROUP(953),
-  /*  4 */  GROUP(954),  GROUP(955),  GROUP(956),  GROUP(957),
-  /*  8 */  GROUP(958),  GROUP(959),  GROUP(960),  GROUP(961),
-  /*  c */  GROUP(962),  GROUP(963),  GROUP(964),  GROUP(965),
-  /* 10 */  GROUP(966),  GROUP(967),  GROUP(968),  GROUP(969),
-  /* 14 */  GROUP(970),  GROUP(971),  GROUP(972),  GROUP(973),
-  /* 18 */  GROUP(974),  GROUP(975),  GROUP(976),  GROUP(977),
-  /* 1c */  GROUP(978),  GROUP(979),  GROUP(980),  GROUP(981),
-  /* 20 */  GROUP(982),  GROUP(983),  GROUP(984),  GROUP(985),
-  /* 24 */  GROUP(986),  GROUP(987),  GROUP(988),  GROUP(989),
-  /* 28 */  GROUP(990),  GROUP(991),  GROUP(992),  GROUP(993),
-  /* 2c */  GROUP(994),  GROUP(995),  GROUP(996),  GROUP(997),
-  /* 30 */           0,           0,           0,           0,
-  /* 34 */           0,           0,           0,           0,
-  /* 38 */           0,           0,           0,           0,
-  /* 3c */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__940[] = {
-  /*  0 */  GROUP(941),  GROUP(949),
-};
-
-static const uint16_t ud_itab__1000[] = {
-  /*  0 */        1273,           0,
-};
-
-static const uint16_t ud_itab__1001[] = {
-  /*  0 */        1274,           0,
-};
-
-static const uint16_t ud_itab__1002[] = {
-  /*  0 */        1275,           0,
-};
-
-static const uint16_t ud_itab__1003[] = {
-  /*  0 */        1276,           0,
-};
-
-static const uint16_t ud_itab__1004[] = {
-  /*  0 */        1277,           0,
-};
-
-static const uint16_t ud_itab__1005[] = {
-  /*  0 */        1278,           0,
-};
-
-static const uint16_t ud_itab__1006[] = {
-  /*  0 */        1279,           0,
-};
-
-static const uint16_t ud_itab__1007[] = {
-  /*  0 */        1280,           0,
-};
-
-static const uint16_t ud_itab__999[] = {
-  /*  0 */ GROUP(1000), GROUP(1001), GROUP(1002), GROUP(1003),
-  /*  4 */ GROUP(1004), GROUP(1005), GROUP(1006), GROUP(1007),
-};
-
-static const uint16_t ud_itab__1009[] = {
-  /*  0 */           0,        1281,
-};
-
-static const uint16_t ud_itab__1010[] = {
-  /*  0 */           0,        1282,
-};
-
-static const uint16_t ud_itab__1011[] = {
-  /*  0 */           0,        1283,
-};
-
-static const uint16_t ud_itab__1012[] = {
-  /*  0 */           0,        1284,
-};
-
-static const uint16_t ud_itab__1013[] = {
-  /*  0 */           0,        1285,
-};
-
-static const uint16_t ud_itab__1014[] = {
-  /*  0 */           0,        1286,
-};
-
-static const uint16_t ud_itab__1015[] = {
-  /*  0 */           0,        1287,
-};
-
-static const uint16_t ud_itab__1016[] = {
-  /*  0 */           0,        1288,
-};
-
-static const uint16_t ud_itab__1017[] = {
-  /*  0 */           0,        1289,
-};
-
-static const uint16_t ud_itab__1018[] = {
-  /*  0 */           0,        1290,
-};
-
-static const uint16_t ud_itab__1019[] = {
-  /*  0 */           0,        1291,
-};
-
-static const uint16_t ud_itab__1020[] = {
-  /*  0 */           0,        1292,
-};
-
-static const uint16_t ud_itab__1021[] = {
-  /*  0 */           0,        1293,
-};
-
-static const uint16_t ud_itab__1022[] = {
-  /*  0 */           0,        1294,
-};
-
-static const uint16_t ud_itab__1023[] = {
-  /*  0 */           0,        1295,
-};
-
-static const uint16_t ud_itab__1024[] = {
-  /*  0 */           0,        1296,
-};
-
-static const uint16_t ud_itab__1025[] = {
-  /*  0 */           0,        1297,
-};
-
-static const uint16_t ud_itab__1026[] = {
-  /*  0 */           0,        1298,
-};
-
-static const uint16_t ud_itab__1027[] = {
-  /*  0 */           0,        1299,
-};
-
-static const uint16_t ud_itab__1028[] = {
-  /*  0 */           0,        1300,
-};
-
-static const uint16_t ud_itab__1029[] = {
-  /*  0 */           0,        1301,
-};
-
-static const uint16_t ud_itab__1030[] = {
-  /*  0 */           0,        1302,
-};
-
-static const uint16_t ud_itab__1031[] = {
-  /*  0 */           0,        1303,
-};
-
-static const uint16_t ud_itab__1032[] = {
-  /*  0 */           0,        1304,
-};
-
-static const uint16_t ud_itab__1033[] = {
-  /*  0 */           0,        1305,
-};
-
-static const uint16_t ud_itab__1034[] = {
-  /*  0 */           0,        1306,
-};
-
-static const uint16_t ud_itab__1035[] = {
-  /*  0 */           0,        1307,
-};
-
-static const uint16_t ud_itab__1036[] = {
-  /*  0 */           0,        1308,
-};
-
-static const uint16_t ud_itab__1037[] = {
-  /*  0 */           0,        1309,
-};
-
-static const uint16_t ud_itab__1038[] = {
-  /*  0 */           0,        1310,
-};
-
-static const uint16_t ud_itab__1039[] = {
-  /*  0 */           0,        1311,
-};
-
-static const uint16_t ud_itab__1040[] = {
-  /*  0 */           0,        1312,
-};
-
-static const uint16_t ud_itab__1041[] = {
-  /*  0 */           0,        1313,
-};
-
-static const uint16_t ud_itab__1042[] = {
-  /*  0 */           0,        1314,
-};
-
-static const uint16_t ud_itab__1043[] = {
-  /*  0 */           0,        1315,
-};
-
-static const uint16_t ud_itab__1044[] = {
-  /*  0 */           0,        1316,
-};
-
-static const uint16_t ud_itab__1045[] = {
-  /*  0 */           0,        1317,
-};
-
-static const uint16_t ud_itab__1046[] = {
-  /*  0 */           0,        1318,
-};
-
-static const uint16_t ud_itab__1047[] = {
-  /*  0 */           0,        1319,
-};
-
-static const uint16_t ud_itab__1048[] = {
-  /*  0 */           0,        1320,
-};
-
-static const uint16_t ud_itab__1049[] = {
-  /*  0 */           0,        1321,
-};
-
-static const uint16_t ud_itab__1050[] = {
-  /*  0 */           0,        1322,
-};
-
-static const uint16_t ud_itab__1051[] = {
-  /*  0 */           0,        1323,
-};
-
-static const uint16_t ud_itab__1052[] = {
-  /*  0 */           0,        1324,
-};
-
-static const uint16_t ud_itab__1053[] = {
-  /*  0 */           0,        1325,
-};
-
-static const uint16_t ud_itab__1054[] = {
-  /*  0 */           0,        1326,
-};
-
-static const uint16_t ud_itab__1055[] = {
-  /*  0 */           0,        1327,
-};
-
-static const uint16_t ud_itab__1056[] = {
-  /*  0 */           0,        1328,
-};
-
-static const uint16_t ud_itab__1057[] = {
-  /*  0 */           0,        1329,
-};
-
-static const uint16_t ud_itab__1058[] = {
-  /*  0 */           0,        1330,
-};
-
-static const uint16_t ud_itab__1059[] = {
-  /*  0 */           0,        1331,
-};
-
-static const uint16_t ud_itab__1060[] = {
-  /*  0 */           0,        1332,
-};
-
-static const uint16_t ud_itab__1061[] = {
-  /*  0 */           0,        1333,
-};
-
-static const uint16_t ud_itab__1062[] = {
-  /*  0 */           0,        1334,
-};
-
-static const uint16_t ud_itab__1063[] = {
-  /*  0 */           0,        1335,
-};
-
-static const uint16_t ud_itab__1064[] = {
-  /*  0 */           0,        1336,
-};
-
-static const uint16_t ud_itab__1065[] = {
-  /*  0 */           0,        1337,
-};
-
-static const uint16_t ud_itab__1008[] = {
-  /*  0 */ GROUP(1009), GROUP(1010), GROUP(1011), GROUP(1012),
-  /*  4 */ GROUP(1013), GROUP(1014), GROUP(1015), GROUP(1016),
-  /*  8 */ GROUP(1017), GROUP(1018), GROUP(1019), GROUP(1020),
-  /*  c */ GROUP(1021), GROUP(1022), GROUP(1023), GROUP(1024),
-  /* 10 */ GROUP(1025), GROUP(1026), GROUP(1027), GROUP(1028),
-  /* 14 */ GROUP(1029), GROUP(1030), GROUP(1031), GROUP(1032),
-  /* 18 */           0, GROUP(1033),           0,           0,
-  /* 1c */           0,           0,           0,           0,
-  /* 20 */ GROUP(1034), GROUP(1035), GROUP(1036), GROUP(1037),
-  /* 24 */ GROUP(1038), GROUP(1039), GROUP(1040), GROUP(1041),
-  /* 28 */ GROUP(1042), GROUP(1043), GROUP(1044), GROUP(1045),
-  /* 2c */ GROUP(1046), GROUP(1047), GROUP(1048), GROUP(1049),
-  /* 30 */ GROUP(1050), GROUP(1051), GROUP(1052), GROUP(1053),
-  /* 34 */ GROUP(1054), GROUP(1055), GROUP(1056), GROUP(1057),
-  /* 38 */ GROUP(1058), GROUP(1059), GROUP(1060), GROUP(1061),
-  /* 3c */ GROUP(1062), GROUP(1063), GROUP(1064), GROUP(1065),
-};
-
-static const uint16_t ud_itab__998[] = {
-  /*  0 */  GROUP(999), GROUP(1008),
-};
-
-static const uint16_t ud_itab__1068[] = {
-  /*  0 */        1338,           0,
-};
-
-static const uint16_t ud_itab__1069[] = {
-  /*  0 */        1339,           0,
-};
-
-static const uint16_t ud_itab__1070[] = {
-  /*  0 */        1340,           0,
-};
-
-static const uint16_t ud_itab__1071[] = {
-  /*  0 */        1341,           0,
-};
-
-static const uint16_t ud_itab__1072[] = {
-  /*  0 */        1342,           0,
-};
-
-static const uint16_t ud_itab__1073[] = {
-  /*  0 */        1343,           0,
-};
-
-static const uint16_t ud_itab__1074[] = {
-  /*  0 */        1344,           0,
-};
-
-static const uint16_t ud_itab__1075[] = {
-  /*  0 */        1345,           0,
-};
-
-static const uint16_t ud_itab__1067[] = {
-  /*  0 */ GROUP(1068), GROUP(1069), GROUP(1070), GROUP(1071),
-  /*  4 */ GROUP(1072), GROUP(1073), GROUP(1074), GROUP(1075),
-};
-
-static const uint16_t ud_itab__1077[] = {
-  /*  0 */           0,        1346,
-};
-
-static const uint16_t ud_itab__1078[] = {
-  /*  0 */           0,        1347,
-};
-
-static const uint16_t ud_itab__1079[] = {
-  /*  0 */           0,        1348,
-};
-
-static const uint16_t ud_itab__1080[] = {
-  /*  0 */           0,        1349,
-};
-
-static const uint16_t ud_itab__1081[] = {
-  /*  0 */           0,        1350,
-};
-
-static const uint16_t ud_itab__1082[] = {
-  /*  0 */           0,        1351,
-};
-
-static const uint16_t ud_itab__1083[] = {
-  /*  0 */           0,        1352,
-};
-
-static const uint16_t ud_itab__1084[] = {
-  /*  0 */           0,        1353,
-};
-
-static const uint16_t ud_itab__1085[] = {
-  /*  0 */           0,        1354,
-};
-
-static const uint16_t ud_itab__1086[] = {
-  /*  0 */           0,        1355,
-};
-
-static const uint16_t ud_itab__1087[] = {
-  /*  0 */           0,        1356,
-};
-
-static const uint16_t ud_itab__1088[] = {
-  /*  0 */           0,        1357,
-};
-
-static const uint16_t ud_itab__1089[] = {
-  /*  0 */           0,        1358,
-};
-
-static const uint16_t ud_itab__1090[] = {
-  /*  0 */           0,        1359,
-};
-
-static const uint16_t ud_itab__1091[] = {
-  /*  0 */           0,        1360,
-};
-
-static const uint16_t ud_itab__1092[] = {
-  /*  0 */           0,        1361,
-};
-
-static const uint16_t ud_itab__1093[] = {
-  /*  0 */           0,        1362,
-};
-
-static const uint16_t ud_itab__1094[] = {
-  /*  0 */           0,        1363,
-};
-
-static const uint16_t ud_itab__1095[] = {
-  /*  0 */           0,        1364,
-};
-
-static const uint16_t ud_itab__1096[] = {
-  /*  0 */           0,        1365,
-};
-
-static const uint16_t ud_itab__1097[] = {
-  /*  0 */           0,        1366,
-};
-
-static const uint16_t ud_itab__1098[] = {
-  /*  0 */           0,        1367,
-};
-
-static const uint16_t ud_itab__1099[] = {
-  /*  0 */           0,        1368,
-};
-
-static const uint16_t ud_itab__1100[] = {
-  /*  0 */           0,        1369,
-};
-
-static const uint16_t ud_itab__1101[] = {
-  /*  0 */           0,        1370,
-};
-
-static const uint16_t ud_itab__1102[] = {
-  /*  0 */           0,        1371,
-};
-
-static const uint16_t ud_itab__1103[] = {
-  /*  0 */           0,        1372,
-};
-
-static const uint16_t ud_itab__1104[] = {
-  /*  0 */           0,        1373,
-};
-
-static const uint16_t ud_itab__1105[] = {
-  /*  0 */           0,        1374,
-};
-
-static const uint16_t ud_itab__1106[] = {
-  /*  0 */           0,        1375,
-};
-
-static const uint16_t ud_itab__1107[] = {
-  /*  0 */           0,        1376,
-};
-
-static const uint16_t ud_itab__1108[] = {
-  /*  0 */           0,        1377,
-};
-
-static const uint16_t ud_itab__1109[] = {
-  /*  0 */           0,        1378,
-};
-
-static const uint16_t ud_itab__1110[] = {
-  /*  0 */           0,        1379,
-};
-
-static const uint16_t ud_itab__1111[] = {
-  /*  0 */           0,        1380,
-};
-
-static const uint16_t ud_itab__1112[] = {
-  /*  0 */           0,        1381,
-};
-
-static const uint16_t ud_itab__1113[] = {
-  /*  0 */           0,        1382,
-};
-
-static const uint16_t ud_itab__1114[] = {
-  /*  0 */           0,        1383,
-};
-
-static const uint16_t ud_itab__1115[] = {
-  /*  0 */           0,        1384,
-};
-
-static const uint16_t ud_itab__1116[] = {
-  /*  0 */           0,        1385,
-};
-
-static const uint16_t ud_itab__1117[] = {
-  /*  0 */           0,        1386,
-};
-
-static const uint16_t ud_itab__1118[] = {
-  /*  0 */           0,        1387,
-};
-
-static const uint16_t ud_itab__1119[] = {
-  /*  0 */           0,        1388,
-};
-
-static const uint16_t ud_itab__1120[] = {
-  /*  0 */           0,        1389,
-};
-
-static const uint16_t ud_itab__1121[] = {
-  /*  0 */           0,        1390,
-};
-
-static const uint16_t ud_itab__1122[] = {
-  /*  0 */           0,        1391,
-};
-
-static const uint16_t ud_itab__1123[] = {
-  /*  0 */           0,        1392,
-};
-
-static const uint16_t ud_itab__1124[] = {
-  /*  0 */           0,        1393,
-};
-
-static const uint16_t ud_itab__1125[] = {
-  /*  0 */           0,        1394,
-};
-
-static const uint16_t ud_itab__1076[] = {
-  /*  0 */ GROUP(1077), GROUP(1078), GROUP(1079), GROUP(1080),
-  /*  4 */ GROUP(1081), GROUP(1082), GROUP(1083), GROUP(1084),
-  /*  8 */ GROUP(1085), GROUP(1086), GROUP(1087), GROUP(1088),
-  /*  c */ GROUP(1089), GROUP(1090), GROUP(1091), GROUP(1092),
-  /* 10 */ GROUP(1093), GROUP(1094), GROUP(1095), GROUP(1096),
-  /* 14 */ GROUP(1097), GROUP(1098), GROUP(1099), GROUP(1100),
-  /* 18 */ GROUP(1101), GROUP(1102), GROUP(1103), GROUP(1104),
-  /* 1c */ GROUP(1105), GROUP(1106), GROUP(1107), GROUP(1108),
-  /* 20 */ GROUP(1109),           0,           0,           0,
-  /* 24 */           0,           0,           0,           0,
-  /* 28 */ GROUP(1110), GROUP(1111), GROUP(1112), GROUP(1113),
-  /* 2c */ GROUP(1114), GROUP(1115), GROUP(1116), GROUP(1117),
-  /* 30 */ GROUP(1118), GROUP(1119), GROUP(1120), GROUP(1121),
-  /* 34 */ GROUP(1122), GROUP(1123), GROUP(1124), GROUP(1125),
-  /* 38 */           0,           0,           0,           0,
-  /* 3c */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__1066[] = {
-  /*  0 */ GROUP(1067), GROUP(1076),
-};
-
-static const uint16_t ud_itab__1126[] = {
-  /*  0 */        1398,        1399,        1400,
-};
-
-static const uint16_t ud_itab__1127[] = {
-  /*  0 */        1407,           0,
-};
-
-static const uint16_t ud_itab__1128[] = {
-  /*  0 */        1419,        1420,        1421,        1422,
-  /*  4 */        1423,        1424,        1425,        1426,
-};
-
-static const uint16_t ud_itab__1129[] = {
-  /*  0 */        1427,        1428,        1429,        1430,
-  /*  4 */        1431,        1432,        1433,        1434,
-};
-
-static const uint16_t ud_itab__1130[] = {
-  /*  0 */        1441,        1442,           0,           0,
-  /*  4 */           0,           0,           0,           0,
-};
-
-static const uint16_t ud_itab__1132[] = {
-  /*  0 */        1445,        1446,
-};
-
-static const uint16_t ud_itab__1131[] = {
-  /*  0 */        1443,        1444, GROUP(1132),        1447,
-  /*  4 */        1448,        1449,        1450,           0,
-};
-
-const uint16_t ud_itab__0[] = {
-  /*  0 */           1,           2,           3,           4,
-  /*  4 */           5,           6,    GROUP(1),    GROUP(2),
-  /*  8 */           9,          10,          11,          12,
-  /*  c */          13,          14,    GROUP(3),    GROUP(4),
-  /* 10 */         628,         629,         630,         631,
-  /* 14 */         632,         633,  GROUP(563),  GROUP(564),
-  /* 18 */         636,         637,         638,         639,
-  /* 1c */         640,         641,  GROUP(565),  GROUP(566),
-  /* 20 */         644,         645,         646,         647,
-  /* 24 */         648,         649,           0,  GROUP(567),
-  /* 28 */         651,         652,         653,         654,
-  /* 2c */         655,         656,           0,  GROUP(568),
-  /* 30 */         658,         659,         660,         661,
-  /* 34 */         662,         663,           0,  GROUP(569),
-  /* 38 */         665,         666,         667,         668,
-  /* 3c */         669,         670,           0,  GROUP(570),
-  /* 40 */         672,         673,         674,         675,
-  /* 44 */         676,         677,         678,         679,
-  /* 48 */         680,         681,         682,         683,
-  /* 4c */         684,         685,         686,         687,
-  /* 50 */         688,         689,         690,         691,
-  /* 54 */         692,         693,         694,         695,
-  /* 58 */         696,         697,         698,         699,
-  /* 5c */         700,         701,         702,         703,
-  /* 60 */  GROUP(571),  GROUP(574),  GROUP(577),  GROUP(578),
-  /* 64 */           0,           0,           0,           0,
-  /* 68 */         711,         712,         713,         714,
-  /* 6c */         715,  GROUP(579),         718,  GROUP(580),
-  /* 70 */         721,         722,         723,         724,
-  /* 74 */         725,         726,         727,         728,
-  /* 78 */         729,         730,         731,         732,
-  /* 7c */         733,         734,         735,         736,
-  /* 80 */  GROUP(581),  GROUP(582),  GROUP(583),  GROUP(592),
-  /* 84 */         769,         770,         771,         772,
-  /* 88 */         773,         774,         775,         776,
-  /* 8c */         777,         778,         779,  GROUP(593),
-  /* 90 */         781,         782,         783,         784,
-  /* 94 */         785,         786,         787,         788,
-  /* 98 */  GROUP(594),  GROUP(595),  GROUP(596),         796,
-  /* 9c */  GROUP(597),  GROUP(601),         806,         807,
-  /* a0 */         808,         809,         810,         811,
-  /* a4 */         812,  GROUP(605),         816,  GROUP(606),
-  /* a8 */         820,         821,         822,  GROUP(607),
-  /* ac */         826,  GROUP(608),         830,  GROUP(609),
-  /* b0 */         834,         835,         836,         837,
-  /* b4 */         838,         839,         840,         841,
-  /* b8 */         842,         843,         844,         845,
-  /* bc */         846,         847,         848,         849,
-  /* c0 */  GROUP(610),  GROUP(611),         866,         867,
-  /* c4 */  GROUP(612),  GROUP(613),  GROUP(614),  GROUP(615),
-  /* c8 */         872,         873,         874,         875,
-  /* cc */         876,         877,  GROUP(616),  GROUP(617),
-  /* d0 */  GROUP(618),  GROUP(619),  GROUP(620),  GROUP(621),
-  /* d4 */  GROUP(622),  GROUP(623),  GROUP(624),         917,
-  /* d8 */  GROUP(625),  GROUP(700),  GROUP(762),  GROUP(806),
-  /* dc */  GROUP(865),  GROUP(940),  GROUP(998), GROUP(1066),
-  /* e0 */        1395,        1396,        1397, GROUP(1126),
-  /* e4 */        1401,        1402,        1403,        1404,
-  /* e8 */        1405,        1406, GROUP(1127),        1408,
-  /* ec */        1409,        1410,        1411,        1412,
-  /* f0 */        1413,        1414,        1415,        1416,
-  /* f4 */        1417,        1418, GROUP(1128), GROUP(1129),
-  /* f8 */        1435,        1436,        1437,        1438,
-  /* fc */        1439,        1440, GROUP(1130), GROUP(1131),
-};
-
-
-struct ud_lookup_table_list_entry ud_lookup_table_list[] = {
-    /* 000 */ { ud_itab__0, UD_TAB__OPC_TABLE, "table0" },
-    /* 001 */ { ud_itab__1, UD_TAB__OPC_MODE, "/m" },
-    /* 002 */ { ud_itab__2, UD_TAB__OPC_MODE, "/m" },
-    /* 003 */ { ud_itab__3, UD_TAB__OPC_MODE, "/m" },
-    /* 004 */ { ud_itab__4, UD_TAB__OPC_TABLE, "0f" },
-    /* 005 */ { ud_itab__5, UD_TAB__OPC_REG, "/reg" },
-    /* 006 */ { ud_itab__6, UD_TAB__OPC_SSE, "/sse" },
-    /* 007 */ { ud_itab__7, UD_TAB__OPC_SSE, "/sse" },
-    /* 008 */ { ud_itab__8, UD_TAB__OPC_SSE, "/sse" },
-    /* 009 */ { ud_itab__9, UD_TAB__OPC_SSE, "/sse" },
-    /* 010 */ { ud_itab__10, UD_TAB__OPC_SSE, "/sse" },
-    /* 011 */ { ud_itab__11, UD_TAB__OPC_SSE, "/sse" },
-    /* 012 */ { ud_itab__12, UD_TAB__OPC_MOD, "/mod" },
-    /* 013 */ { ud_itab__13, UD_TAB__OPC_REG, "/reg" },
-    /* 014 */ { ud_itab__14, UD_TAB__OPC_SSE, "/sse" },
-    /* 015 */ { ud_itab__15, UD_TAB__OPC_MOD, "/mod" },
-    /* 016 */ { ud_itab__16, UD_TAB__OPC_SSE, "/sse" },
-    /* 017 */ { ud_itab__17, UD_TAB__OPC_MOD, "/mod" },
-    /* 018 */ { ud_itab__18, UD_TAB__OPC_SSE, "/sse" },
-    /* 019 */ { ud_itab__19, UD_TAB__OPC_MOD, "/mod" },
-    /* 020 */ { ud_itab__20, UD_TAB__OPC_SSE, "/sse" },
-    /* 021 */ { ud_itab__21, UD_TAB__OPC_MOD, "/mod" },
-    /* 022 */ { ud_itab__22, UD_TAB__OPC_SSE, "/sse" },
-    /* 023 */ { ud_itab__23, UD_TAB__OPC_MOD, "/mod" },
-    /* 024 */ { ud_itab__24, UD_TAB__OPC_SSE, "/sse" },
-    /* 025 */ { ud_itab__25, UD_TAB__OPC_MOD, "/mod" },
-    /* 026 */ { ud_itab__26, UD_TAB__OPC_SSE, "/sse" },
-    /* 027 */ { ud_itab__27, UD_TAB__OPC_MOD, "/mod" },
-    /* 028 */ { ud_itab__28, UD_TAB__OPC_REG, "/reg" },
-    /* 029 */ { ud_itab__29, UD_TAB__OPC_RM, "/rm" },
-    /* 030 */ { ud_itab__30, UD_TAB__OPC_SSE, "/sse" },
-    /* 031 */ { ud_itab__31, UD_TAB__OPC_MOD, "/mod" },
-    /* 032 */ { ud_itab__32, UD_TAB__OPC_VENDOR, "intel" },
-    /* 033 */ { ud_itab__33, UD_TAB__OPC_SSE, "/sse" },
-    /* 034 */ { ud_itab__34, UD_TAB__OPC_MOD, "/mod" },
-    /* 035 */ { ud_itab__35, UD_TAB__OPC_VENDOR, "intel" },
-    /* 036 */ { ud_itab__36, UD_TAB__OPC_SSE, "/sse" },
-    /* 037 */ { ud_itab__37, UD_TAB__OPC_MOD, "/mod" },
-    /* 038 */ { ud_itab__38, UD_TAB__OPC_VENDOR, "intel" },
-    /* 039 */ { ud_itab__39, UD_TAB__OPC_SSE, "/sse" },
-    /* 040 */ { ud_itab__40, UD_TAB__OPC_MOD, "/mod" },
-    /* 041 */ { ud_itab__41, UD_TAB__OPC_VENDOR, "intel" },
-    /* 042 */ { ud_itab__42, UD_TAB__OPC_RM, "/rm" },
-    /* 043 */ { ud_itab__43, UD_TAB__OPC_SSE, "/sse" },
-    /* 044 */ { ud_itab__44, UD_TAB__OPC_MOD, "/mod" },
-    /* 045 */ { ud_itab__45, UD_TAB__OPC_SSE, "/sse" },
-    /* 046 */ { ud_itab__46, UD_TAB__OPC_MOD, "/mod" },
-    /* 047 */ { ud_itab__47, UD_TAB__OPC_RM, "/rm" },
-    /* 048 */ { ud_itab__48, UD_TAB__OPC_SSE, "/sse" },
-    /* 049 */ { ud_itab__49, UD_TAB__OPC_MOD, "/mod" },
-    /* 050 */ { ud_itab__50, UD_TAB__OPC_SSE, "/sse" },
-    /* 051 */ { ud_itab__51, UD_TAB__OPC_MOD, "/mod" },
-    /* 052 */ { ud_itab__52, UD_TAB__OPC_RM, "/rm" },
-    /* 053 */ { ud_itab__53, UD_TAB__OPC_SSE, "/sse" },
-    /* 054 */ { ud_itab__54, UD_TAB__OPC_MOD, "/mod" },
-    /* 055 */ { ud_itab__55, UD_TAB__OPC_VENDOR, "amd" },
-    /* 056 */ { ud_itab__56, UD_TAB__OPC_SSE, "/sse" },
-    /* 057 */ { ud_itab__57, UD_TAB__OPC_MOD, "/mod" },
-    /* 058 */ { ud_itab__58, UD_TAB__OPC_VENDOR, "amd" },
-    /* 059 */ { ud_itab__59, UD_TAB__OPC_SSE, "/sse" },
-    /* 060 */ { ud_itab__60, UD_TAB__OPC_MOD, "/mod" },
-    /* 061 */ { ud_itab__61, UD_TAB__OPC_VENDOR, "amd" },
-    /* 062 */ { ud_itab__62, UD_TAB__OPC_SSE, "/sse" },
-    /* 063 */ { ud_itab__63, UD_TAB__OPC_MOD, "/mod" },
-    /* 064 */ { ud_itab__64, UD_TAB__OPC_VENDOR, "amd" },
-    /* 065 */ { ud_itab__65, UD_TAB__OPC_SSE, "/sse" },
-    /* 066 */ { ud_itab__66, UD_TAB__OPC_MOD, "/mod" },
-    /* 067 */ { ud_itab__67, UD_TAB__OPC_VENDOR, "amd" },
-    /* 068 */ { ud_itab__68, UD_TAB__OPC_SSE, "/sse" },
-    /* 069 */ { ud_itab__69, UD_TAB__OPC_MOD, "/mod" },
-    /* 070 */ { ud_itab__70, UD_TAB__OPC_VENDOR, "amd" },
-    /* 071 */ { ud_itab__71, UD_TAB__OPC_SSE, "/sse" },
-    /* 072 */ { ud_itab__72, UD_TAB__OPC_MOD, "/mod" },
-    /* 073 */ { ud_itab__73, UD_TAB__OPC_VENDOR, "amd" },
-    /* 074 */ { ud_itab__74, UD_TAB__OPC_SSE, "/sse" },
-    /* 075 */ { ud_itab__75, UD_TAB__OPC_MOD, "/mod" },
-    /* 076 */ { ud_itab__76, UD_TAB__OPC_VENDOR, "amd" },
-    /* 077 */ { ud_itab__77, UD_TAB__OPC_SSE, "/sse" },
-    /* 078 */ { ud_itab__78, UD_TAB__OPC_MOD, "/mod" },
-    /* 079 */ { ud_itab__79, UD_TAB__OPC_SSE, "/sse" },
-    /* 080 */ { ud_itab__80, UD_TAB__OPC_MOD, "/mod" },
-    /* 081 */ { ud_itab__81, UD_TAB__OPC_RM, "/rm" },
-    /* 082 */ { ud_itab__82, UD_TAB__OPC_SSE, "/sse" },
-    /* 083 */ { ud_itab__83, UD_TAB__OPC_MOD, "/mod" },
-    /* 084 */ { ud_itab__84, UD_TAB__OPC_SSE, "/sse" },
-    /* 085 */ { ud_itab__85, UD_TAB__OPC_MOD, "/mod" },
-    /* 086 */ { ud_itab__86, UD_TAB__OPC_VENDOR, "amd" },
-    /* 087 */ { ud_itab__87, UD_TAB__OPC_SSE, "/sse" },
-    /* 088 */ { ud_itab__88, UD_TAB__OPC_SSE, "/sse" },
-    /* 089 */ { ud_itab__89, UD_TAB__OPC_SSE, "/sse" },
-    /* 090 */ { ud_itab__90, UD_TAB__OPC_SSE, "/sse" },
-    /* 091 */ { ud_itab__91, UD_TAB__OPC_SSE, "/sse" },
-    /* 092 */ { ud_itab__92, UD_TAB__OPC_SSE, "/sse" },
-    /* 093 */ { ud_itab__93, UD_TAB__OPC_SSE, "/sse" },
-    /* 094 */ { ud_itab__94, UD_TAB__OPC_SSE, "/sse" },
-    /* 095 */ { ud_itab__95, UD_TAB__OPC_REG, "/reg" },
-    /* 096 */ { ud_itab__96, UD_TAB__OPC_SSE, "/sse" },
-    /* 097 */ { ud_itab__97, UD_TAB__OPC_SSE, "/sse" },
-    /* 098 */ { ud_itab__98, UD_TAB__OPC_SSE, "/sse" },
-    /* 099 */ { ud_itab__99, UD_TAB__OPC_SSE, "/sse" },
-    /* 100 */ { ud_itab__100, UD_TAB__OPC_SSE, "/sse" },
-    /* 101 */ { ud_itab__101, UD_TAB__OPC_SSE, "/sse" },
-    /* 102 */ { ud_itab__102, UD_TAB__OPC_SSE, "/sse" },
-    /* 103 */ { ud_itab__103, UD_TAB__OPC_SSE, "/sse" },
-    /* 104 */ { ud_itab__104, UD_TAB__OPC_SSE, "/sse" },
-    /* 105 */ { ud_itab__105, UD_TAB__OPC_3DNOW, "/3dnow" },
-    /* 106 */ { ud_itab__106, UD_TAB__OPC_SSE, "/sse" },
-    /* 107 */ { ud_itab__107, UD_TAB__OPC_SSE, "/sse" },
-    /* 108 */ { ud_itab__108, UD_TAB__OPC_MOD, "/mod" },
-    /* 109 */ { ud_itab__109, UD_TAB__OPC_SSE, "/sse" },
-    /* 110 */ { ud_itab__110, UD_TAB__OPC_MOD, "/mod" },
-    /* 111 */ { ud_itab__111, UD_TAB__OPC_MOD, "/mod" },
-    /* 112 */ { ud_itab__112, UD_TAB__OPC_MOD, "/mod" },
-    /* 113 */ { ud_itab__113, UD_TAB__OPC_MOD, "/mod" },
-    /* 114 */ { ud_itab__114, UD_TAB__OPC_SSE, "/sse" },
-    /* 115 */ { ud_itab__115, UD_TAB__OPC_MOD, "/mod" },
-    /* 116 */ { ud_itab__116, UD_TAB__OPC_MOD, "/mod" },
-    /* 117 */ { ud_itab__117, UD_TAB__OPC_MOD, "/mod" },
-    /* 118 */ { ud_itab__118, UD_TAB__OPC_SSE, "/sse" },
-    /* 119 */ { ud_itab__119, UD_TAB__OPC_SSE, "/sse" },
-    /* 120 */ { ud_itab__120, UD_TAB__OPC_SSE, "/sse" },
-    /* 121 */ { ud_itab__121, UD_TAB__OPC_MOD, "/mod" },
-    /* 122 */ { ud_itab__122, UD_TAB__OPC_SSE, "/sse" },
-    /* 123 */ { ud_itab__123, UD_TAB__OPC_MOD, "/mod" },
-    /* 124 */ { ud_itab__124, UD_TAB__OPC_MOD, "/mod" },
-    /* 125 */ { ud_itab__125, UD_TAB__OPC_MOD, "/mod" },
-    /* 126 */ { ud_itab__126, UD_TAB__OPC_SSE, "/sse" },
-    /* 127 */ { ud_itab__127, UD_TAB__OPC_MOD, "/mod" },
-    /* 128 */ { ud_itab__128, UD_TAB__OPC_MOD, "/mod" },
-    /* 129 */ { ud_itab__129, UD_TAB__OPC_SSE, "/sse" },
-    /* 130 */ { ud_itab__130, UD_TAB__OPC_REG, "/reg" },
-    /* 131 */ { ud_itab__131, UD_TAB__OPC_SSE, "/sse" },
-    /* 132 */ { ud_itab__132, UD_TAB__OPC_SSE, "/sse" },
-    /* 133 */ { ud_itab__133, UD_TAB__OPC_SSE, "/sse" },
-    /* 134 */ { ud_itab__134, UD_TAB__OPC_SSE, "/sse" },
-    /* 135 */ { ud_itab__135, UD_TAB__OPC_SSE, "/sse" },
-    /* 136 */ { ud_itab__136, UD_TAB__OPC_SSE, "/sse" },
-    /* 137 */ { ud_itab__137, UD_TAB__OPC_SSE, "/sse" },
-    /* 138 */ { ud_itab__138, UD_TAB__OPC_SSE, "/sse" },
-    /* 139 */ { ud_itab__139, UD_TAB__OPC_SSE, "/sse" },
-    /* 140 */ { ud_itab__140, UD_TAB__OPC_SSE, "/sse" },
-    /* 141 */ { ud_itab__141, UD_TAB__OPC_SSE, "/sse" },
-    /* 142 */ { ud_itab__142, UD_TAB__OPC_SSE, "/sse" },
-    /* 143 */ { ud_itab__143, UD_TAB__OPC_SSE, "/sse" },
-    /* 144 */ { ud_itab__144, UD_TAB__OPC_SSE, "/sse" },
-    /* 145 */ { ud_itab__145, UD_TAB__OPC_SSE, "/sse" },
-    /* 146 */ { ud_itab__146, UD_TAB__OPC_SSE, "/sse" },
-    /* 147 */ { ud_itab__147, UD_TAB__OPC_SSE, "/sse" },
-    /* 148 */ { ud_itab__148, UD_TAB__OPC_SSE, "/sse" },
-    /* 149 */ { ud_itab__149, UD_TAB__OPC_SSE, "/sse" },
-    /* 150 */ { ud_itab__150, UD_TAB__OPC_SSE, "/sse" },
-    /* 151 */ { ud_itab__151, UD_TAB__OPC_SSE, "/sse" },
-    /* 152 */ { ud_itab__152, UD_TAB__OPC_SSE, "/sse" },
-    /* 153 */ { ud_itab__153, UD_TAB__OPC_SSE, "/sse" },
-    /* 154 */ { ud_itab__154, UD_TAB__OPC_SSE, "/sse" },
-    /* 155 */ { ud_itab__155, UD_TAB__OPC_SSE, "/sse" },
-    /* 156 */ { ud_itab__156, UD_TAB__OPC_SSE, "/sse" },
-    /* 157 */ { ud_itab__157, UD_TAB__OPC_SSE, "/sse" },
-    /* 158 */ { ud_itab__158, UD_TAB__OPC_SSE, "/sse" },
-    /* 159 */ { ud_itab__159, UD_TAB__OPC_MODE, "/m" },
-    /* 160 */ { ud_itab__160, UD_TAB__OPC_VENDOR, "intel" },
-    /* 161 */ { ud_itab__161, UD_TAB__OPC_SSE, "/sse" },
-    /* 162 */ { ud_itab__162, UD_TAB__OPC_MODE, "/m" },
-    /* 163 */ { ud_itab__163, UD_TAB__OPC_VENDOR, "intel" },
-    /* 164 */ { ud_itab__164, UD_TAB__OPC_SSE, "/sse" },
-    /* 165 */ { ud_itab__165, UD_TAB__OPC_TABLE, "38" },
-    /* 166 */ { ud_itab__166, UD_TAB__OPC_SSE, "/sse" },
-    /* 167 */ { ud_itab__167, UD_TAB__OPC_SSE, "/sse" },
-    /* 168 */ { ud_itab__168, UD_TAB__OPC_SSE, "/sse" },
-    /* 169 */ { ud_itab__169, UD_TAB__OPC_SSE, "/sse" },
-    /* 170 */ { ud_itab__170, UD_TAB__OPC_SSE, "/sse" },
-    /* 171 */ { ud_itab__171, UD_TAB__OPC_SSE, "/sse" },
-    /* 172 */ { ud_itab__172, UD_TAB__OPC_SSE, "/sse" },
-    /* 173 */ { ud_itab__173, UD_TAB__OPC_SSE, "/sse" },
-    /* 174 */ { ud_itab__174, UD_TAB__OPC_SSE, "/sse" },
-    /* 175 */ { ud_itab__175, UD_TAB__OPC_SSE, "/sse" },
-    /* 176 */ { ud_itab__176, UD_TAB__OPC_SSE, "/sse" },
-    /* 177 */ { ud_itab__177, UD_TAB__OPC_SSE, "/sse" },
-    /* 178 */ { ud_itab__178, UD_TAB__OPC_SSE, "/sse" },
-    /* 179 */ { ud_itab__179, UD_TAB__OPC_SSE, "/sse" },
-    /* 180 */ { ud_itab__180, UD_TAB__OPC_SSE, "/sse" },
-    /* 181 */ { ud_itab__181, UD_TAB__OPC_SSE, "/sse" },
-    /* 182 */ { ud_itab__182, UD_TAB__OPC_SSE, "/sse" },
-    /* 183 */ { ud_itab__183, UD_TAB__OPC_SSE, "/sse" },
-    /* 184 */ { ud_itab__184, UD_TAB__OPC_SSE, "/sse" },
-    /* 185 */ { ud_itab__185, UD_TAB__OPC_SSE, "/sse" },
-    /* 186 */ { ud_itab__186, UD_TAB__OPC_SSE, "/sse" },
-    /* 187 */ { ud_itab__187, UD_TAB__OPC_SSE, "/sse" },
-    /* 188 */ { ud_itab__188, UD_TAB__OPC_SSE, "/sse" },
-    /* 189 */ { ud_itab__189, UD_TAB__OPC_SSE, "/sse" },
-    /* 190 */ { ud_itab__190, UD_TAB__OPC_SSE, "/sse" },
-    /* 191 */ { ud_itab__191, UD_TAB__OPC_SSE, "/sse" },
-    /* 192 */ { ud_itab__192, UD_TAB__OPC_SSE, "/sse" },
-    /* 193 */ { ud_itab__193, UD_TAB__OPC_SSE, "/sse" },
-    /* 194 */ { ud_itab__194, UD_TAB__OPC_SSE, "/sse" },
-    /* 195 */ { ud_itab__195, UD_TAB__OPC_SSE, "/sse" },
-    /* 196 */ { ud_itab__196, UD_TAB__OPC_SSE, "/sse" },
-    /* 197 */ { ud_itab__197, UD_TAB__OPC_SSE, "/sse" },
-    /* 198 */ { ud_itab__198, UD_TAB__OPC_SSE, "/sse" },
-    /* 199 */ { ud_itab__199, UD_TAB__OPC_SSE, "/sse" },
-    /* 200 */ { ud_itab__200, UD_TAB__OPC_SSE, "/sse" },
-    /* 201 */ { ud_itab__201, UD_TAB__OPC_SSE, "/sse" },
-    /* 202 */ { ud_itab__202, UD_TAB__OPC_SSE, "/sse" },
-    /* 203 */ { ud_itab__203, UD_TAB__OPC_SSE, "/sse" },
-    /* 204 */ { ud_itab__204, UD_TAB__OPC_SSE, "/sse" },
-    /* 205 */ { ud_itab__205, UD_TAB__OPC_SSE, "/sse" },
-    /* 206 */ { ud_itab__206, UD_TAB__OPC_SSE, "/sse" },
-    /* 207 */ { ud_itab__207, UD_TAB__OPC_SSE, "/sse" },
-    /* 208 */ { ud_itab__208, UD_TAB__OPC_SSE, "/sse" },
-    /* 209 */ { ud_itab__209, UD_TAB__OPC_SSE, "/sse" },
-    /* 210 */ { ud_itab__210, UD_TAB__OPC_SSE, "/sse" },
-    /* 211 */ { ud_itab__211, UD_TAB__OPC_SSE, "/sse" },
-    /* 212 */ { ud_itab__212, UD_TAB__OPC_SSE, "/sse" },
-    /* 213 */ { ud_itab__213, UD_TAB__OPC_MODE, "/m" },
-    /* 214 */ { ud_itab__214, UD_TAB__OPC_VENDOR, "intel" },
-    /* 215 */ { ud_itab__215, UD_TAB__OPC_SSE, "/sse" },
-    /* 216 */ { ud_itab__216, UD_TAB__OPC_MODE, "/m" },
-    /* 217 */ { ud_itab__217, UD_TAB__OPC_VENDOR, "intel" },
-    /* 218 */ { ud_itab__218, UD_TAB__OPC_SSE, "/sse" },
-    /* 219 */ { ud_itab__219, UD_TAB__OPC_SSE, "/sse" },
-    /* 220 */ { ud_itab__220, UD_TAB__OPC_SSE, "/sse" },
-    /* 221 */ { ud_itab__221, UD_TAB__OPC_SSE, "/sse" },
-    /* 222 */ { ud_itab__222, UD_TAB__OPC_SSE, "/sse" },
-    /* 223 */ { ud_itab__223, UD_TAB__OPC_SSE, "/sse" },
-    /* 224 */ { ud_itab__224, UD_TAB__OPC_SSE, "/sse" },
-    /* 225 */ { ud_itab__225, UD_TAB__OPC_TABLE, "3a" },
-    /* 226 */ { ud_itab__226, UD_TAB__OPC_SSE, "/sse" },
-    /* 227 */ { ud_itab__227, UD_TAB__OPC_SSE, "/sse" },
-    /* 228 */ { ud_itab__228, UD_TAB__OPC_SSE, "/sse" },
-    /* 229 */ { ud_itab__229, UD_TAB__OPC_SSE, "/sse" },
-    /* 230 */ { ud_itab__230, UD_TAB__OPC_SSE, "/sse" },
-    /* 231 */ { ud_itab__231, UD_TAB__OPC_SSE, "/sse" },
-    /* 232 */ { ud_itab__232, UD_TAB__OPC_SSE, "/sse" },
-    /* 233 */ { ud_itab__233, UD_TAB__OPC_SSE, "/sse" },
-    /* 234 */ { ud_itab__234, UD_TAB__OPC_SSE, "/sse" },
-    /* 235 */ { ud_itab__235, UD_TAB__OPC_SSE, "/sse" },
-    /* 236 */ { ud_itab__236, UD_TAB__OPC_SSE, "/sse" },
-    /* 237 */ { ud_itab__237, UD_TAB__OPC_OSIZE, "/o" },
-    /* 238 */ { ud_itab__238, UD_TAB__OPC_SSE, "/sse" },
-    /* 239 */ { ud_itab__239, UD_TAB__OPC_SSE, "/sse" },
-    /* 240 */ { ud_itab__240, UD_TAB__OPC_SSE, "/sse" },
-    /* 241 */ { ud_itab__241, UD_TAB__OPC_SSE, "/sse" },
-    /* 242 */ { ud_itab__242, UD_TAB__OPC_OSIZE, "/o" },
-    /* 243 */ { ud_itab__243, UD_TAB__OPC_SSE, "/sse" },
-    /* 244 */ { ud_itab__244, UD_TAB__OPC_SSE, "/sse" },
-    /* 245 */ { ud_itab__245, UD_TAB__OPC_SSE, "/sse" },
-    /* 246 */ { ud_itab__246, UD_TAB__OPC_SSE, "/sse" },
-    /* 247 */ { ud_itab__247, UD_TAB__OPC_SSE, "/sse" },
-    /* 248 */ { ud_itab__248, UD_TAB__OPC_SSE, "/sse" },
-    /* 249 */ { ud_itab__249, UD_TAB__OPC_SSE, "/sse" },
-    /* 250 */ { ud_itab__250, UD_TAB__OPC_SSE, "/sse" },
-    /* 251 */ { ud_itab__251, UD_TAB__OPC_SSE, "/sse" },
-    /* 252 */ { ud_itab__252, UD_TAB__OPC_SSE, "/sse" },
-    /* 253 */ { ud_itab__253, UD_TAB__OPC_SSE, "/sse" },
-    /* 254 */ { ud_itab__254, UD_TAB__OPC_SSE, "/sse" },
-    /* 255 */ { ud_itab__255, UD_TAB__OPC_SSE, "/sse" },
-    /* 256 */ { ud_itab__256, UD_TAB__OPC_SSE, "/sse" },
-    /* 257 */ { ud_itab__257, UD_TAB__OPC_SSE, "/sse" },
-    /* 258 */ { ud_itab__258, UD_TAB__OPC_SSE, "/sse" },
-    /* 259 */ { ud_itab__259, UD_TAB__OPC_SSE, "/sse" },
-    /* 260 */ { ud_itab__260, UD_TAB__OPC_SSE, "/sse" },
-    /* 261 */ { ud_itab__261, UD_TAB__OPC_SSE, "/sse" },
-    /* 262 */ { ud_itab__262, UD_TAB__OPC_SSE, "/sse" },
-    /* 263 */ { ud_itab__263, UD_TAB__OPC_SSE, "/sse" },
-    /* 264 */ { ud_itab__264, UD_TAB__OPC_SSE, "/sse" },
-    /* 265 */ { ud_itab__265, UD_TAB__OPC_SSE, "/sse" },
-    /* 266 */ { ud_itab__266, UD_TAB__OPC_SSE, "/sse" },
-    /* 267 */ { ud_itab__267, UD_TAB__OPC_SSE, "/sse" },
-    /* 268 */ { ud_itab__268, UD_TAB__OPC_SSE, "/sse" },
-    /* 269 */ { ud_itab__269, UD_TAB__OPC_SSE, "/sse" },
-    /* 270 */ { ud_itab__270, UD_TAB__OPC_SSE, "/sse" },
-    /* 271 */ { ud_itab__271, UD_TAB__OPC_SSE, "/sse" },
-    /* 272 */ { ud_itab__272, UD_TAB__OPC_SSE, "/sse" },
-    /* 273 */ { ud_itab__273, UD_TAB__OPC_SSE, "/sse" },
-    /* 274 */ { ud_itab__274, UD_TAB__OPC_SSE, "/sse" },
-    /* 275 */ { ud_itab__275, UD_TAB__OPC_SSE, "/sse" },
-    /* 276 */ { ud_itab__276, UD_TAB__OPC_SSE, "/sse" },
-    /* 277 */ { ud_itab__277, UD_TAB__OPC_SSE, "/sse" },
-    /* 278 */ { ud_itab__278, UD_TAB__OPC_SSE, "/sse" },
-    /* 279 */ { ud_itab__279, UD_TAB__OPC_SSE, "/sse" },
-    /* 280 */ { ud_itab__280, UD_TAB__OPC_SSE, "/sse" },
-    /* 281 */ { ud_itab__281, UD_TAB__OPC_SSE, "/sse" },
-    /* 282 */ { ud_itab__282, UD_TAB__OPC_SSE, "/sse" },
-    /* 283 */ { ud_itab__283, UD_TAB__OPC_SSE, "/sse" },
-    /* 284 */ { ud_itab__284, UD_TAB__OPC_SSE, "/sse" },
-    /* 285 */ { ud_itab__285, UD_TAB__OPC_SSE, "/sse" },
-    /* 286 */ { ud_itab__286, UD_TAB__OPC_SSE, "/sse" },
-    /* 287 */ { ud_itab__287, UD_TAB__OPC_SSE, "/sse" },
-    /* 288 */ { ud_itab__288, UD_TAB__OPC_SSE, "/sse" },
-    /* 289 */ { ud_itab__289, UD_TAB__OPC_SSE, "/sse" },
-    /* 290 */ { ud_itab__290, UD_TAB__OPC_SSE, "/sse" },
-    /* 291 */ { ud_itab__291, UD_TAB__OPC_SSE, "/sse" },
-    /* 292 */ { ud_itab__292, UD_TAB__OPC_SSE, "/sse" },
-    /* 293 */ { ud_itab__293, UD_TAB__OPC_SSE, "/sse" },
-    /* 294 */ { ud_itab__294, UD_TAB__OPC_SSE, "/sse" },
-    /* 295 */ { ud_itab__295, UD_TAB__OPC_SSE, "/sse" },
-    /* 296 */ { ud_itab__296, UD_TAB__OPC_SSE, "/sse" },
-    /* 297 */ { ud_itab__297, UD_TAB__OPC_SSE, "/sse" },
-    /* 298 */ { ud_itab__298, UD_TAB__OPC_SSE, "/sse" },
-    /* 299 */ { ud_itab__299, UD_TAB__OPC_SSE, "/sse" },
-    /* 300 */ { ud_itab__300, UD_TAB__OPC_SSE, "/sse" },
-    /* 301 */ { ud_itab__301, UD_TAB__OPC_REG, "/reg" },
-    /* 302 */ { ud_itab__302, UD_TAB__OPC_SSE, "/sse" },
-    /* 303 */ { ud_itab__303, UD_TAB__OPC_SSE, "/sse" },
-    /* 304 */ { ud_itab__304, UD_TAB__OPC_SSE, "/sse" },
-    /* 305 */ { ud_itab__305, UD_TAB__OPC_REG, "/reg" },
-    /* 306 */ { ud_itab__306, UD_TAB__OPC_SSE, "/sse" },
-    /* 307 */ { ud_itab__307, UD_TAB__OPC_SSE, "/sse" },
-    /* 308 */ { ud_itab__308, UD_TAB__OPC_SSE, "/sse" },
-    /* 309 */ { ud_itab__309, UD_TAB__OPC_REG, "/reg" },
-    /* 310 */ { ud_itab__310, UD_TAB__OPC_SSE, "/sse" },
-    /* 311 */ { ud_itab__311, UD_TAB__OPC_SSE, "/sse" },
-    /* 312 */ { ud_itab__312, UD_TAB__OPC_SSE, "/sse" },
-    /* 313 */ { ud_itab__313, UD_TAB__OPC_SSE, "/sse" },
-    /* 314 */ { ud_itab__314, UD_TAB__OPC_SSE, "/sse" },
-    /* 315 */ { ud_itab__315, UD_TAB__OPC_SSE, "/sse" },
-    /* 316 */ { ud_itab__316, UD_TAB__OPC_SSE, "/sse" },
-    /* 317 */ { ud_itab__317, UD_TAB__OPC_SSE, "/sse" },
-    /* 318 */ { ud_itab__318, UD_TAB__OPC_SSE, "/sse" },
-    /* 319 */ { ud_itab__319, UD_TAB__OPC_VENDOR, "intel" },
-    /* 320 */ { ud_itab__320, UD_TAB__OPC_SSE, "/sse" },
-    /* 321 */ { ud_itab__321, UD_TAB__OPC_VENDOR, "intel" },
-    /* 322 */ { ud_itab__322, UD_TAB__OPC_SSE, "/sse" },
-    /* 323 */ { ud_itab__323, UD_TAB__OPC_SSE, "/sse" },
-    /* 324 */ { ud_itab__324, UD_TAB__OPC_SSE, "/sse" },
-    /* 325 */ { ud_itab__325, UD_TAB__OPC_SSE, "/sse" },
-    /* 326 */ { ud_itab__326, UD_TAB__OPC_SSE, "/sse" },
-    /* 327 */ { ud_itab__327, UD_TAB__OPC_SSE, "/sse" },
-    /* 328 */ { ud_itab__328, UD_TAB__OPC_SSE, "/sse" },
-    /* 329 */ { ud_itab__329, UD_TAB__OPC_SSE, "/sse" },
-    /* 330 */ { ud_itab__330, UD_TAB__OPC_SSE, "/sse" },
-    /* 331 */ { ud_itab__331, UD_TAB__OPC_SSE, "/sse" },
-    /* 332 */ { ud_itab__332, UD_TAB__OPC_SSE, "/sse" },
-    /* 333 */ { ud_itab__333, UD_TAB__OPC_SSE, "/sse" },
-    /* 334 */ { ud_itab__334, UD_TAB__OPC_SSE, "/sse" },
-    /* 335 */ { ud_itab__335, UD_TAB__OPC_SSE, "/sse" },
-    /* 336 */ { ud_itab__336, UD_TAB__OPC_SSE, "/sse" },
-    /* 337 */ { ud_itab__337, UD_TAB__OPC_SSE, "/sse" },
-    /* 338 */ { ud_itab__338, UD_TAB__OPC_SSE, "/sse" },
-    /* 339 */ { ud_itab__339, UD_TAB__OPC_SSE, "/sse" },
-    /* 340 */ { ud_itab__340, UD_TAB__OPC_SSE, "/sse" },
-    /* 341 */ { ud_itab__341, UD_TAB__OPC_SSE, "/sse" },
-    /* 342 */ { ud_itab__342, UD_TAB__OPC_SSE, "/sse" },
-    /* 343 */ { ud_itab__343, UD_TAB__OPC_SSE, "/sse" },
-    /* 344 */ { ud_itab__344, UD_TAB__OPC_SSE, "/sse" },
-    /* 345 */ { ud_itab__345, UD_TAB__OPC_SSE, "/sse" },
-    /* 346 */ { ud_itab__346, UD_TAB__OPC_SSE, "/sse" },
-    /* 347 */ { ud_itab__347, UD_TAB__OPC_SSE, "/sse" },
-    /* 348 */ { ud_itab__348, UD_TAB__OPC_SSE, "/sse" },
-    /* 349 */ { ud_itab__349, UD_TAB__OPC_SSE, "/sse" },
-    /* 350 */ { ud_itab__350, UD_TAB__OPC_SSE, "/sse" },
-    /* 351 */ { ud_itab__351, UD_TAB__OPC_SSE, "/sse" },
-    /* 352 */ { ud_itab__352, UD_TAB__OPC_SSE, "/sse" },
-    /* 353 */ { ud_itab__353, UD_TAB__OPC_SSE, "/sse" },
-    /* 354 */ { ud_itab__354, UD_TAB__OPC_SSE, "/sse" },
-    /* 355 */ { ud_itab__355, UD_TAB__OPC_SSE, "/sse" },
-    /* 356 */ { ud_itab__356, UD_TAB__OPC_SSE, "/sse" },
-    /* 357 */ { ud_itab__357, UD_TAB__OPC_SSE, "/sse" },
-    /* 358 */ { ud_itab__358, UD_TAB__OPC_SSE, "/sse" },
-    /* 359 */ { ud_itab__359, UD_TAB__OPC_SSE, "/sse" },
-    /* 360 */ { ud_itab__360, UD_TAB__OPC_SSE, "/sse" },
-    /* 361 */ { ud_itab__361, UD_TAB__OPC_SSE, "/sse" },
-    /* 362 */ { ud_itab__362, UD_TAB__OPC_SSE, "/sse" },
-    /* 363 */ { ud_itab__363, UD_TAB__OPC_SSE, "/sse" },
-    /* 364 */ { ud_itab__364, UD_TAB__OPC_MOD, "/mod" },
-    /* 365 */ { ud_itab__365, UD_TAB__OPC_REG, "/reg" },
-    /* 366 */ { ud_itab__366, UD_TAB__OPC_RM, "/rm" },
-    /* 367 */ { ud_itab__367, UD_TAB__OPC_SSE, "/sse" },
-    /* 368 */ { ud_itab__368, UD_TAB__OPC_MOD, "/mod" },
-    /* 369 */ { ud_itab__369, UD_TAB__OPC_RM, "/rm" },
-    /* 370 */ { ud_itab__370, UD_TAB__OPC_SSE, "/sse" },
-    /* 371 */ { ud_itab__371, UD_TAB__OPC_MOD, "/mod" },
-    /* 372 */ { ud_itab__372, UD_TAB__OPC_RM, "/rm" },
-    /* 373 */ { ud_itab__373, UD_TAB__OPC_SSE, "/sse" },
-    /* 374 */ { ud_itab__374, UD_TAB__OPC_MOD, "/mod" },
-    /* 375 */ { ud_itab__375, UD_TAB__OPC_MOD, "/mod" },
-    /* 376 */ { ud_itab__376, UD_TAB__OPC_REG, "/reg" },
-    /* 377 */ { ud_itab__377, UD_TAB__OPC_RM, "/rm" },
-    /* 378 */ { ud_itab__378, UD_TAB__OPC_SSE, "/sse" },
-    /* 379 */ { ud_itab__379, UD_TAB__OPC_MOD, "/mod" },
-    /* 380 */ { ud_itab__380, UD_TAB__OPC_RM, "/rm" },
-    /* 381 */ { ud_itab__381, UD_TAB__OPC_SSE, "/sse" },
-    /* 382 */ { ud_itab__382, UD_TAB__OPC_MOD, "/mod" },
-    /* 383 */ { ud_itab__383, UD_TAB__OPC_RM, "/rm" },
-    /* 384 */ { ud_itab__384, UD_TAB__OPC_SSE, "/sse" },
-    /* 385 */ { ud_itab__385, UD_TAB__OPC_MOD, "/mod" },
-    /* 386 */ { ud_itab__386, UD_TAB__OPC_RM, "/rm" },
-    /* 387 */ { ud_itab__387, UD_TAB__OPC_SSE, "/sse" },
-    /* 388 */ { ud_itab__388, UD_TAB__OPC_MOD, "/mod" },
-    /* 389 */ { ud_itab__389, UD_TAB__OPC_RM, "/rm" },
-    /* 390 */ { ud_itab__390, UD_TAB__OPC_SSE, "/sse" },
-    /* 391 */ { ud_itab__391, UD_TAB__OPC_MOD, "/mod" },
-    /* 392 */ { ud_itab__392, UD_TAB__OPC_RM, "/rm" },
-    /* 393 */ { ud_itab__393, UD_TAB__OPC_SSE, "/sse" },
-    /* 394 */ { ud_itab__394, UD_TAB__OPC_MOD, "/mod" },
-    /* 395 */ { ud_itab__395, UD_TAB__OPC_SSE, "/sse" },
-    /* 396 */ { ud_itab__396, UD_TAB__OPC_SSE, "/sse" },
-    /* 397 */ { ud_itab__397, UD_TAB__OPC_SSE, "/sse" },
-    /* 398 */ { ud_itab__398, UD_TAB__OPC_SSE, "/sse" },
-    /* 399 */ { ud_itab__399, UD_TAB__OPC_SSE, "/sse" },
-    /* 400 */ { ud_itab__400, UD_TAB__OPC_SSE, "/sse" },
-    /* 401 */ { ud_itab__401, UD_TAB__OPC_MOD, "/mod" },
-    /* 402 */ { ud_itab__402, UD_TAB__OPC_REG, "/reg" },
-    /* 403 */ { ud_itab__403, UD_TAB__OPC_SSE, "/sse" },
-    /* 404 */ { ud_itab__404, UD_TAB__OPC_MOD, "/mod" },
-    /* 405 */ { ud_itab__405, UD_TAB__OPC_SSE, "/sse" },
-    /* 406 */ { ud_itab__406, UD_TAB__OPC_MOD, "/mod" },
-    /* 407 */ { ud_itab__407, UD_TAB__OPC_SSE, "/sse" },
-    /* 408 */ { ud_itab__408, UD_TAB__OPC_MOD, "/mod" },
-    /* 409 */ { ud_itab__409, UD_TAB__OPC_SSE, "/sse" },
-    /* 410 */ { ud_itab__410, UD_TAB__OPC_MOD, "/mod" },
-    /* 411 */ { ud_itab__411, UD_TAB__OPC_SSE, "/sse" },
-    /* 412 */ { ud_itab__412, UD_TAB__OPC_MOD, "/mod" },
-    /* 413 */ { ud_itab__413, UD_TAB__OPC_SSE, "/sse" },
-    /* 414 */ { ud_itab__414, UD_TAB__OPC_MOD, "/mod" },
-    /* 415 */ { ud_itab__415, UD_TAB__OPC_SSE, "/sse" },
-    /* 416 */ { ud_itab__416, UD_TAB__OPC_MOD, "/mod" },
-    /* 417 */ { ud_itab__417, UD_TAB__OPC_REG, "/reg" },
-    /* 418 */ { ud_itab__418, UD_TAB__OPC_RM, "/rm" },
-    /* 419 */ { ud_itab__419, UD_TAB__OPC_SSE, "/sse" },
-    /* 420 */ { ud_itab__420, UD_TAB__OPC_MOD, "/mod" },
-    /* 421 */ { ud_itab__421, UD_TAB__OPC_SSE, "/sse" },
-    /* 422 */ { ud_itab__422, UD_TAB__OPC_MOD, "/mod" },
-    /* 423 */ { ud_itab__423, UD_TAB__OPC_SSE, "/sse" },
-    /* 424 */ { ud_itab__424, UD_TAB__OPC_MOD, "/mod" },
-    /* 425 */ { ud_itab__425, UD_TAB__OPC_SSE, "/sse" },
-    /* 426 */ { ud_itab__426, UD_TAB__OPC_MOD, "/mod" },
-    /* 427 */ { ud_itab__427, UD_TAB__OPC_SSE, "/sse" },
-    /* 428 */ { ud_itab__428, UD_TAB__OPC_MOD, "/mod" },
-    /* 429 */ { ud_itab__429, UD_TAB__OPC_SSE, "/sse" },
-    /* 430 */ { ud_itab__430, UD_TAB__OPC_MOD, "/mod" },
-    /* 431 */ { ud_itab__431, UD_TAB__OPC_SSE, "/sse" },
-    /* 432 */ { ud_itab__432, UD_TAB__OPC_MOD, "/mod" },
-    /* 433 */ { ud_itab__433, UD_TAB__OPC_SSE, "/sse" },
-    /* 434 */ { ud_itab__434, UD_TAB__OPC_MOD, "/mod" },
-    /* 435 */ { ud_itab__435, UD_TAB__OPC_RM, "/rm" },
-    /* 436 */ { ud_itab__436, UD_TAB__OPC_SSE, "/sse" },
-    /* 437 */ { ud_itab__437, UD_TAB__OPC_MOD, "/mod" },
-    /* 438 */ { ud_itab__438, UD_TAB__OPC_SSE, "/sse" },
-    /* 439 */ { ud_itab__439, UD_TAB__OPC_MOD, "/mod" },
-    /* 440 */ { ud_itab__440, UD_TAB__OPC_SSE, "/sse" },
-    /* 441 */ { ud_itab__441, UD_TAB__OPC_MOD, "/mod" },
-    /* 442 */ { ud_itab__442, UD_TAB__OPC_SSE, "/sse" },
-    /* 443 */ { ud_itab__443, UD_TAB__OPC_MOD, "/mod" },
-    /* 444 */ { ud_itab__444, UD_TAB__OPC_SSE, "/sse" },
-    /* 445 */ { ud_itab__445, UD_TAB__OPC_MOD, "/mod" },
-    /* 446 */ { ud_itab__446, UD_TAB__OPC_SSE, "/sse" },
-    /* 447 */ { ud_itab__447, UD_TAB__OPC_MOD, "/mod" },
-    /* 448 */ { ud_itab__448, UD_TAB__OPC_SSE, "/sse" },
-    /* 449 */ { ud_itab__449, UD_TAB__OPC_MOD, "/mod" },
-    /* 450 */ { ud_itab__450, UD_TAB__OPC_SSE, "/sse" },
-    /* 451 */ { ud_itab__451, UD_TAB__OPC_MOD, "/mod" },
-    /* 452 */ { ud_itab__452, UD_TAB__OPC_RM, "/rm" },
-    /* 453 */ { ud_itab__453, UD_TAB__OPC_SSE, "/sse" },
-    /* 454 */ { ud_itab__454, UD_TAB__OPC_MOD, "/mod" },
-    /* 455 */ { ud_itab__455, UD_TAB__OPC_SSE, "/sse" },
-    /* 456 */ { ud_itab__456, UD_TAB__OPC_MOD, "/mod" },
-    /* 457 */ { ud_itab__457, UD_TAB__OPC_SSE, "/sse" },
-    /* 458 */ { ud_itab__458, UD_TAB__OPC_MOD, "/mod" },
-    /* 459 */ { ud_itab__459, UD_TAB__OPC_SSE, "/sse" },
-    /* 460 */ { ud_itab__460, UD_TAB__OPC_MOD, "/mod" },
-    /* 461 */ { ud_itab__461, UD_TAB__OPC_SSE, "/sse" },
-    /* 462 */ { ud_itab__462, UD_TAB__OPC_MOD, "/mod" },
-    /* 463 */ { ud_itab__463, UD_TAB__OPC_SSE, "/sse" },
-    /* 464 */ { ud_itab__464, UD_TAB__OPC_MOD, "/mod" },
-    /* 465 */ { ud_itab__465, UD_TAB__OPC_SSE, "/sse" },
-    /* 466 */ { ud_itab__466, UD_TAB__OPC_MOD, "/mod" },
-    /* 467 */ { ud_itab__467, UD_TAB__OPC_SSE, "/sse" },
-    /* 468 */ { ud_itab__468, UD_TAB__OPC_MOD, "/mod" },
-    /* 469 */ { ud_itab__469, UD_TAB__OPC_SSE, "/sse" },
-    /* 470 */ { ud_itab__470, UD_TAB__OPC_SSE, "/sse" },
-    /* 471 */ { ud_itab__471, UD_TAB__OPC_SSE, "/sse" },
-    /* 472 */ { ud_itab__472, UD_TAB__OPC_SSE, "/sse" },
-    /* 473 */ { ud_itab__473, UD_TAB__OPC_SSE, "/sse" },
-    /* 474 */ { ud_itab__474, UD_TAB__OPC_SSE, "/sse" },
-    /* 475 */ { ud_itab__475, UD_TAB__OPC_SSE, "/sse" },
-    /* 476 */ { ud_itab__476, UD_TAB__OPC_SSE, "/sse" },
-    /* 477 */ { ud_itab__477, UD_TAB__OPC_SSE, "/sse" },
-    /* 478 */ { ud_itab__478, UD_TAB__OPC_SSE, "/sse" },
-    /* 479 */ { ud_itab__479, UD_TAB__OPC_REG, "/reg" },
-    /* 480 */ { ud_itab__480, UD_TAB__OPC_SSE, "/sse" },
-    /* 481 */ { ud_itab__481, UD_TAB__OPC_SSE, "/sse" },
-    /* 482 */ { ud_itab__482, UD_TAB__OPC_SSE, "/sse" },
-    /* 483 */ { ud_itab__483, UD_TAB__OPC_SSE, "/sse" },
-    /* 484 */ { ud_itab__484, UD_TAB__OPC_SSE, "/sse" },
-    /* 485 */ { ud_itab__485, UD_TAB__OPC_SSE, "/sse" },
-    /* 486 */ { ud_itab__486, UD_TAB__OPC_SSE, "/sse" },
-    /* 487 */ { ud_itab__487, UD_TAB__OPC_SSE, "/sse" },
-    /* 488 */ { ud_itab__488, UD_TAB__OPC_SSE, "/sse" },
-    /* 489 */ { ud_itab__489, UD_TAB__OPC_SSE, "/sse" },
-    /* 490 */ { ud_itab__490, UD_TAB__OPC_SSE, "/sse" },
-    /* 491 */ { ud_itab__491, UD_TAB__OPC_SSE, "/sse" },
-    /* 492 */ { ud_itab__492, UD_TAB__OPC_SSE, "/sse" },
-    /* 493 */ { ud_itab__493, UD_TAB__OPC_SSE, "/sse" },
-    /* 494 */ { ud_itab__494, UD_TAB__OPC_SSE, "/sse" },
-    /* 495 */ { ud_itab__495, UD_TAB__OPC_SSE, "/sse" },
-    /* 496 */ { ud_itab__496, UD_TAB__OPC_REG, "/reg" },
-    /* 497 */ { ud_itab__497, UD_TAB__OPC_SSE, "/sse" },
-    /* 498 */ { ud_itab__498, UD_TAB__OPC_OSIZE, "/o" },
-    /* 499 */ { ud_itab__499, UD_TAB__OPC_SSE, "/sse" },
-    /* 500 */ { ud_itab__500, UD_TAB__OPC_VENDOR, "intel" },
-    /* 501 */ { ud_itab__501, UD_TAB__OPC_VENDOR, "intel" },
-    /* 502 */ { ud_itab__502, UD_TAB__OPC_VENDOR, "intel" },
-    /* 503 */ { ud_itab__503, UD_TAB__OPC_SSE, "/sse" },
-    /* 504 */ { ud_itab__504, UD_TAB__OPC_VENDOR, "intel" },
-    /* 505 */ { ud_itab__505, UD_TAB__OPC_SSE, "/sse" },
-    /* 506 */ { ud_itab__506, UD_TAB__OPC_SSE, "/sse" },
-    /* 507 */ { ud_itab__507, UD_TAB__OPC_SSE, "/sse" },
-    /* 508 */ { ud_itab__508, UD_TAB__OPC_SSE, "/sse" },
-    /* 509 */ { ud_itab__509, UD_TAB__OPC_SSE, "/sse" },
-    /* 510 */ { ud_itab__510, UD_TAB__OPC_SSE, "/sse" },
-    /* 511 */ { ud_itab__511, UD_TAB__OPC_SSE, "/sse" },
-    /* 512 */ { ud_itab__512, UD_TAB__OPC_SSE, "/sse" },
-    /* 513 */ { ud_itab__513, UD_TAB__OPC_SSE, "/sse" },
-    /* 514 */ { ud_itab__514, UD_TAB__OPC_SSE, "/sse" },
-    /* 515 */ { ud_itab__515, UD_TAB__OPC_SSE, "/sse" },
-    /* 516 */ { ud_itab__516, UD_TAB__OPC_SSE, "/sse" },
-    /* 517 */ { ud_itab__517, UD_TAB__OPC_SSE, "/sse" },
-    /* 518 */ { ud_itab__518, UD_TAB__OPC_SSE, "/sse" },
-    /* 519 */ { ud_itab__519, UD_TAB__OPC_SSE, "/sse" },
-    /* 520 */ { ud_itab__520, UD_TAB__OPC_SSE, "/sse" },
-    /* 521 */ { ud_itab__521, UD_TAB__OPC_SSE, "/sse" },
-    /* 522 */ { ud_itab__522, UD_TAB__OPC_SSE, "/sse" },
-    /* 523 */ { ud_itab__523, UD_TAB__OPC_SSE, "/sse" },
-    /* 524 */ { ud_itab__524, UD_TAB__OPC_SSE, "/sse" },
-    /* 525 */ { ud_itab__525, UD_TAB__OPC_SSE, "/sse" },
-    /* 526 */ { ud_itab__526, UD_TAB__OPC_SSE, "/sse" },
-    /* 527 */ { ud_itab__527, UD_TAB__OPC_SSE, "/sse" },
-    /* 528 */ { ud_itab__528, UD_TAB__OPC_SSE, "/sse" },
-    /* 529 */ { ud_itab__529, UD_TAB__OPC_SSE, "/sse" },
-    /* 530 */ { ud_itab__530, UD_TAB__OPC_SSE, "/sse" },
-    /* 531 */ { ud_itab__531, UD_TAB__OPC_SSE, "/sse" },
-    /* 532 */ { ud_itab__532, UD_TAB__OPC_SSE, "/sse" },
-    /* 533 */ { ud_itab__533, UD_TAB__OPC_SSE, "/sse" },
-    /* 534 */ { ud_itab__534, UD_TAB__OPC_SSE, "/sse" },
-    /* 535 */ { ud_itab__535, UD_TAB__OPC_SSE, "/sse" },
-    /* 536 */ { ud_itab__536, UD_TAB__OPC_SSE, "/sse" },
-    /* 537 */ { ud_itab__537, UD_TAB__OPC_SSE, "/sse" },
-    /* 538 */ { ud_itab__538, UD_TAB__OPC_SSE, "/sse" },
-    /* 539 */ { ud_itab__539, UD_TAB__OPC_SSE, "/sse" },
-    /* 540 */ { ud_itab__540, UD_TAB__OPC_SSE, "/sse" },
-    /* 541 */ { ud_itab__541, UD_TAB__OPC_SSE, "/sse" },
-    /* 542 */ { ud_itab__542, UD_TAB__OPC_SSE, "/sse" },
-    /* 543 */ { ud_itab__543, UD_TAB__OPC_SSE, "/sse" },
-    /* 544 */ { ud_itab__544, UD_TAB__OPC_SSE, "/sse" },
-    /* 545 */ { ud_itab__545, UD_TAB__OPC_SSE, "/sse" },
-    /* 546 */ { ud_itab__546, UD_TAB__OPC_SSE, "/sse" },
-    /* 547 */ { ud_itab__547, UD_TAB__OPC_SSE, "/sse" },
-    /* 548 */ { ud_itab__548, UD_TAB__OPC_SSE, "/sse" },
-    /* 549 */ { ud_itab__549, UD_TAB__OPC_SSE, "/sse" },
-    /* 550 */ { ud_itab__550, UD_TAB__OPC_SSE, "/sse" },
-    /* 551 */ { ud_itab__551, UD_TAB__OPC_SSE, "/sse" },
-    /* 552 */ { ud_itab__552, UD_TAB__OPC_MOD, "/mod" },
-    /* 553 */ { ud_itab__553, UD_TAB__OPC_SSE, "/sse" },
-    /* 554 */ { ud_itab__554, UD_TAB__OPC_MOD, "/mod" },
-    /* 555 */ { ud_itab__555, UD_TAB__OPC_MOD, "/mod" },
-    /* 556 */ { ud_itab__556, UD_TAB__OPC_SSE, "/sse" },
-    /* 557 */ { ud_itab__557, UD_TAB__OPC_SSE, "/sse" },
-    /* 558 */ { ud_itab__558, UD_TAB__OPC_SSE, "/sse" },
-    /* 559 */ { ud_itab__559, UD_TAB__OPC_SSE, "/sse" },
-    /* 560 */ { ud_itab__560, UD_TAB__OPC_SSE, "/sse" },
-    /* 561 */ { ud_itab__561, UD_TAB__OPC_SSE, "/sse" },
-    /* 562 */ { ud_itab__562, UD_TAB__OPC_SSE, "/sse" },
-    /* 563 */ { ud_itab__563, UD_TAB__OPC_MODE, "/m" },
-    /* 564 */ { ud_itab__564, UD_TAB__OPC_MODE, "/m" },
-    /* 565 */ { ud_itab__565, UD_TAB__OPC_MODE, "/m" },
-    /* 566 */ { ud_itab__566, UD_TAB__OPC_MODE, "/m" },
-    /* 567 */ { ud_itab__567, UD_TAB__OPC_MODE, "/m" },
-    /* 568 */ { ud_itab__568, UD_TAB__OPC_MODE, "/m" },
-    /* 569 */ { ud_itab__569, UD_TAB__OPC_MODE, "/m" },
-    /* 570 */ { ud_itab__570, UD_TAB__OPC_MODE, "/m" },
-    /* 571 */ { ud_itab__571, UD_TAB__OPC_OSIZE, "/o" },
-    /* 572 */ { ud_itab__572, UD_TAB__OPC_MODE, "/m" },
-    /* 573 */ { ud_itab__573, UD_TAB__OPC_MODE, "/m" },
-    /* 574 */ { ud_itab__574, UD_TAB__OPC_OSIZE, "/o" },
-    /* 575 */ { ud_itab__575, UD_TAB__OPC_MODE, "/m" },
-    /* 576 */ { ud_itab__576, UD_TAB__OPC_MODE, "/m" },
-    /* 577 */ { ud_itab__577, UD_TAB__OPC_MODE, "/m" },
-    /* 578 */ { ud_itab__578, UD_TAB__OPC_MODE, "/m" },
-    /* 579 */ { ud_itab__579, UD_TAB__OPC_OSIZE, "/o" },
-    /* 580 */ { ud_itab__580, UD_TAB__OPC_OSIZE, "/o" },
-    /* 581 */ { ud_itab__581, UD_TAB__OPC_REG, "/reg" },
-    /* 582 */ { ud_itab__582, UD_TAB__OPC_REG, "/reg" },
-    /* 583 */ { ud_itab__583, UD_TAB__OPC_REG, "/reg" },
-    /* 584 */ { ud_itab__584, UD_TAB__OPC_MODE, "/m" },
-    /* 585 */ { ud_itab__585, UD_TAB__OPC_MODE, "/m" },
-    /* 586 */ { ud_itab__586, UD_TAB__OPC_MODE, "/m" },
-    /* 587 */ { ud_itab__587, UD_TAB__OPC_MODE, "/m" },
-    /* 588 */ { ud_itab__588, UD_TAB__OPC_MODE, "/m" },
-    /* 589 */ { ud_itab__589, UD_TAB__OPC_MODE, "/m" },
-    /* 590 */ { ud_itab__590, UD_TAB__OPC_MODE, "/m" },
-    /* 591 */ { ud_itab__591, UD_TAB__OPC_MODE, "/m" },
-    /* 592 */ { ud_itab__592, UD_TAB__OPC_REG, "/reg" },
-    /* 593 */ { ud_itab__593, UD_TAB__OPC_REG, "/reg" },
-    /* 594 */ { ud_itab__594, UD_TAB__OPC_OSIZE, "/o" },
-    /* 595 */ { ud_itab__595, UD_TAB__OPC_OSIZE, "/o" },
-    /* 596 */ { ud_itab__596, UD_TAB__OPC_MODE, "/m" },
-    /* 597 */ { ud_itab__597, UD_TAB__OPC_OSIZE, "/o" },
-    /* 598 */ { ud_itab__598, UD_TAB__OPC_MODE, "/m" },
-    /* 599 */ { ud_itab__599, UD_TAB__OPC_MODE, "/m" },
-    /* 600 */ { ud_itab__600, UD_TAB__OPC_MODE, "/m" },
-    /* 601 */ { ud_itab__601, UD_TAB__OPC_OSIZE, "/o" },
-    /* 602 */ { ud_itab__602, UD_TAB__OPC_MODE, "/m" },
-    /* 603 */ { ud_itab__603, UD_TAB__OPC_MODE, "/m" },
-    /* 604 */ { ud_itab__604, UD_TAB__OPC_MODE, "/m" },
-    /* 605 */ { ud_itab__605, UD_TAB__OPC_OSIZE, "/o" },
-    /* 606 */ { ud_itab__606, UD_TAB__OPC_OSIZE, "/o" },
-    /* 607 */ { ud_itab__607, UD_TAB__OPC_OSIZE, "/o" },
-    /* 608 */ { ud_itab__608, UD_TAB__OPC_OSIZE, "/o" },
-    /* 609 */ { ud_itab__609, UD_TAB__OPC_OSIZE, "/o" },
-    /* 610 */ { ud_itab__610, UD_TAB__OPC_REG, "/reg" },
-    /* 611 */ { ud_itab__611, UD_TAB__OPC_REG, "/reg" },
-    /* 612 */ { ud_itab__612, UD_TAB__OPC_MODE, "/m" },
-    /* 613 */ { ud_itab__613, UD_TAB__OPC_MODE, "/m" },
-    /* 614 */ { ud_itab__614, UD_TAB__OPC_REG, "/reg" },
-    /* 615 */ { ud_itab__615, UD_TAB__OPC_REG, "/reg" },
-    /* 616 */ { ud_itab__616, UD_TAB__OPC_MODE, "/m" },
-    /* 617 */ { ud_itab__617, UD_TAB__OPC_OSIZE, "/o" },
-    /* 618 */ { ud_itab__618, UD_TAB__OPC_REG, "/reg" },
-    /* 619 */ { ud_itab__619, UD_TAB__OPC_REG, "/reg" },
-    /* 620 */ { ud_itab__620, UD_TAB__OPC_REG, "/reg" },
-    /* 621 */ { ud_itab__621, UD_TAB__OPC_REG, "/reg" },
-    /* 622 */ { ud_itab__622, UD_TAB__OPC_MODE, "/m" },
-    /* 623 */ { ud_itab__623, UD_TAB__OPC_MODE, "/m" },
-    /* 624 */ { ud_itab__624, UD_TAB__OPC_MODE, "/m" },
-    /* 625 */ { ud_itab__625, UD_TAB__OPC_MOD, "/mod" },
-    /* 626 */ { ud_itab__626, UD_TAB__OPC_REG, "/reg" },
-    /* 627 */ { ud_itab__627, UD_TAB__OPC_MOD, "/mod" },
-    /* 628 */ { ud_itab__628, UD_TAB__OPC_MOD, "/mod" },
-    /* 629 */ { ud_itab__629, UD_TAB__OPC_MOD, "/mod" },
-    /* 630 */ { ud_itab__630, UD_TAB__OPC_MOD, "/mod" },
-    /* 631 */ { ud_itab__631, UD_TAB__OPC_MOD, "/mod" },
-    /* 632 */ { ud_itab__632, UD_TAB__OPC_MOD, "/mod" },
-    /* 633 */ { ud_itab__633, UD_TAB__OPC_MOD, "/mod" },
-    /* 634 */ { ud_itab__634, UD_TAB__OPC_MOD, "/mod" },
-    /* 635 */ { ud_itab__635, UD_TAB__OPC_X87, "/x87" },
-    /* 636 */ { ud_itab__636, UD_TAB__OPC_MOD, "/mod" },
-    /* 637 */ { ud_itab__637, UD_TAB__OPC_MOD, "/mod" },
-    /* 638 */ { ud_itab__638, UD_TAB__OPC_MOD, "/mod" },
-    /* 639 */ { ud_itab__639, UD_TAB__OPC_MOD, "/mod" },
-    /* 640 */ { ud_itab__640, UD_TAB__OPC_MOD, "/mod" },
-    /* 641 */ { ud_itab__641, UD_TAB__OPC_MOD, "/mod" },
-    /* 642 */ { ud_itab__642, UD_TAB__OPC_MOD, "/mod" },
-    /* 643 */ { ud_itab__643, UD_TAB__OPC_MOD, "/mod" },
-    /* 644 */ { ud_itab__644, UD_TAB__OPC_MOD, "/mod" },
-    /* 645 */ { ud_itab__645, UD_TAB__OPC_MOD, "/mod" },
-    /* 646 */ { ud_itab__646, UD_TAB__OPC_MOD, "/mod" },
-    /* 647 */ { ud_itab__647, UD_TAB__OPC_MOD, "/mod" },
-    /* 648 */ { ud_itab__648, UD_TAB__OPC_MOD, "/mod" },
-    /* 649 */ { ud_itab__649, UD_TAB__OPC_MOD, "/mod" },
-    /* 650 */ { ud_itab__650, UD_TAB__OPC_MOD, "/mod" },
-    /* 651 */ { ud_itab__651, UD_TAB__OPC_MOD, "/mod" },
-    /* 652 */ { ud_itab__652, UD_TAB__OPC_MOD, "/mod" },
-    /* 653 */ { ud_itab__653, UD_TAB__OPC_MOD, "/mod" },
-    /* 654 */ { ud_itab__654, UD_TAB__OPC_MOD, "/mod" },
-    /* 655 */ { ud_itab__655, UD_TAB__OPC_MOD, "/mod" },
-    /* 656 */ { ud_itab__656, UD_TAB__OPC_MOD, "/mod" },
-    /* 657 */ { ud_itab__657, UD_TAB__OPC_MOD, "/mod" },
-    /* 658 */ { ud_itab__658, UD_TAB__OPC_MOD, "/mod" },
-    /* 659 */ { ud_itab__659, UD_TAB__OPC_MOD, "/mod" },
-    /* 660 */ { ud_itab__660, UD_TAB__OPC_MOD, "/mod" },
-    /* 661 */ { ud_itab__661, UD_TAB__OPC_MOD, "/mod" },
-    /* 662 */ { ud_itab__662, UD_TAB__OPC_MOD, "/mod" },
-    /* 663 */ { ud_itab__663, UD_TAB__OPC_MOD, "/mod" },
-    /* 664 */ { ud_itab__664, UD_TAB__OPC_MOD, "/mod" },
-    /* 665 */ { ud_itab__665, UD_TAB__OPC_MOD, "/mod" },
-    /* 666 */ { ud_itab__666, UD_TAB__OPC_MOD, "/mod" },
-    /* 667 */ { ud_itab__667, UD_TAB__OPC_MOD, "/mod" },
-    /* 668 */ { ud_itab__668, UD_TAB__OPC_MOD, "/mod" },
-    /* 669 */ { ud_itab__669, UD_TAB__OPC_MOD, "/mod" },
-    /* 670 */ { ud_itab__670, UD_TAB__OPC_MOD, "/mod" },
-    /* 671 */ { ud_itab__671, UD_TAB__OPC_MOD, "/mod" },
-    /* 672 */ { ud_itab__672, UD_TAB__OPC_MOD, "/mod" },
-    /* 673 */ { ud_itab__673, UD_TAB__OPC_MOD, "/mod" },
-    /* 674 */ { ud_itab__674, UD_TAB__OPC_MOD, "/mod" },
-    /* 675 */ { ud_itab__675, UD_TAB__OPC_MOD, "/mod" },
-    /* 676 */ { ud_itab__676, UD_TAB__OPC_MOD, "/mod" },
-    /* 677 */ { ud_itab__677, UD_TAB__OPC_MOD, "/mod" },
-    /* 678 */ { ud_itab__678, UD_TAB__OPC_MOD, "/mod" },
-    /* 679 */ { ud_itab__679, UD_TAB__OPC_MOD, "/mod" },
-    /* 680 */ { ud_itab__680, UD_TAB__OPC_MOD, "/mod" },
-    /* 681 */ { ud_itab__681, UD_TAB__OPC_MOD, "/mod" },
-    /* 682 */ { ud_itab__682, UD_TAB__OPC_MOD, "/mod" },
-    /* 683 */ { ud_itab__683, UD_TAB__OPC_MOD, "/mod" },
-    /* 684 */ { ud_itab__684, UD_TAB__OPC_MOD, "/mod" },
-    /* 685 */ { ud_itab__685, UD_TAB__OPC_MOD, "/mod" },
-    /* 686 */ { ud_itab__686, UD_TAB__OPC_MOD, "/mod" },
-    /* 687 */ { ud_itab__687, UD_TAB__OPC_MOD, "/mod" },
-    /* 688 */ { ud_itab__688, UD_TAB__OPC_MOD, "/mod" },
-    /* 689 */ { ud_itab__689, UD_TAB__OPC_MOD, "/mod" },
-    /* 690 */ { ud_itab__690, UD_TAB__OPC_MOD, "/mod" },
-    /* 691 */ { ud_itab__691, UD_TAB__OPC_MOD, "/mod" },
-    /* 692 */ { ud_itab__692, UD_TAB__OPC_MOD, "/mod" },
-    /* 693 */ { ud_itab__693, UD_TAB__OPC_MOD, "/mod" },
-    /* 694 */ { ud_itab__694, UD_TAB__OPC_MOD, "/mod" },
-    /* 695 */ { ud_itab__695, UD_TAB__OPC_MOD, "/mod" },
-    /* 696 */ { ud_itab__696, UD_TAB__OPC_MOD, "/mod" },
-    /* 697 */ { ud_itab__697, UD_TAB__OPC_MOD, "/mod" },
-    /* 698 */ { ud_itab__698, UD_TAB__OPC_MOD, "/mod" },
-    /* 699 */ { ud_itab__699, UD_TAB__OPC_MOD, "/mod" },
-    /* 700 */ { ud_itab__700, UD_TAB__OPC_MOD, "/mod" },
-    /* 701 */ { ud_itab__701, UD_TAB__OPC_REG, "/reg" },
-    /* 702 */ { ud_itab__702, UD_TAB__OPC_MOD, "/mod" },
-    /* 703 */ { ud_itab__703, UD_TAB__OPC_MOD, "/mod" },
-    /* 704 */ { ud_itab__704, UD_TAB__OPC_MOD, "/mod" },
-    /* 705 */ { ud_itab__705, UD_TAB__OPC_MOD, "/mod" },
-    /* 706 */ { ud_itab__706, UD_TAB__OPC_MOD, "/mod" },
-    /* 707 */ { ud_itab__707, UD_TAB__OPC_MOD, "/mod" },
-    /* 708 */ { ud_itab__708, UD_TAB__OPC_MOD, "/mod" },
-    /* 709 */ { ud_itab__709, UD_TAB__OPC_X87, "/x87" },
-    /* 710 */ { ud_itab__710, UD_TAB__OPC_MOD, "/mod" },
-    /* 711 */ { ud_itab__711, UD_TAB__OPC_MOD, "/mod" },
-    /* 712 */ { ud_itab__712, UD_TAB__OPC_MOD, "/mod" },
-    /* 713 */ { ud_itab__713, UD_TAB__OPC_MOD, "/mod" },
-    /* 714 */ { ud_itab__714, UD_TAB__OPC_MOD, "/mod" },
-    /* 715 */ { ud_itab__715, UD_TAB__OPC_MOD, "/mod" },
-    /* 716 */ { ud_itab__716, UD_TAB__OPC_MOD, "/mod" },
-    /* 717 */ { ud_itab__717, UD_TAB__OPC_MOD, "/mod" },
-    /* 718 */ { ud_itab__718, UD_TAB__OPC_MOD, "/mod" },
-    /* 719 */ { ud_itab__719, UD_TAB__OPC_MOD, "/mod" },
-    /* 720 */ { ud_itab__720, UD_TAB__OPC_MOD, "/mod" },
-    /* 721 */ { ud_itab__721, UD_TAB__OPC_MOD, "/mod" },
-    /* 722 */ { ud_itab__722, UD_TAB__OPC_MOD, "/mod" },
-    /* 723 */ { ud_itab__723, UD_TAB__OPC_MOD, "/mod" },
-    /* 724 */ { ud_itab__724, UD_TAB__OPC_MOD, "/mod" },
-    /* 725 */ { ud_itab__725, UD_TAB__OPC_MOD, "/mod" },
-    /* 726 */ { ud_itab__726, UD_TAB__OPC_MOD, "/mod" },
-    /* 727 */ { ud_itab__727, UD_TAB__OPC_MOD, "/mod" },
-    /* 728 */ { ud_itab__728, UD_TAB__OPC_MOD, "/mod" },
-    /* 729 */ { ud_itab__729, UD_TAB__OPC_MOD, "/mod" },
-    /* 730 */ { ud_itab__730, UD_TAB__OPC_MOD, "/mod" },
-    /* 731 */ { ud_itab__731, UD_TAB__OPC_MOD, "/mod" },
-    /* 732 */ { ud_itab__732, UD_TAB__OPC_MOD, "/mod" },
-    /* 733 */ { ud_itab__733, UD_TAB__OPC_MOD, "/mod" },
-    /* 734 */ { ud_itab__734, UD_TAB__OPC_MOD, "/mod" },
-    /* 735 */ { ud_itab__735, UD_TAB__OPC_MOD, "/mod" },
-    /* 736 */ { ud_itab__736, UD_TAB__OPC_MOD, "/mod" },
-    /* 737 */ { ud_itab__737, UD_TAB__OPC_MOD, "/mod" },
-    /* 738 */ { ud_itab__738, UD_TAB__OPC_MOD, "/mod" },
-    /* 739 */ { ud_itab__739, UD_TAB__OPC_MOD, "/mod" },
-    /* 740 */ { ud_itab__740, UD_TAB__OPC_MOD, "/mod" },
-    /* 741 */ { ud_itab__741, UD_TAB__OPC_MOD, "/mod" },
-    /* 742 */ { ud_itab__742, UD_TAB__OPC_MOD, "/mod" },
-    /* 743 */ { ud_itab__743, UD_TAB__OPC_MOD, "/mod" },
-    /* 744 */ { ud_itab__744, UD_TAB__OPC_MOD, "/mod" },
-    /* 745 */ { ud_itab__745, UD_TAB__OPC_MOD, "/mod" },
-    /* 746 */ { ud_itab__746, UD_TAB__OPC_MOD, "/mod" },
-    /* 747 */ { ud_itab__747, UD_TAB__OPC_MOD, "/mod" },
-    /* 748 */ { ud_itab__748, UD_TAB__OPC_MOD, "/mod" },
-    /* 749 */ { ud_itab__749, UD_TAB__OPC_MOD, "/mod" },
-    /* 750 */ { ud_itab__750, UD_TAB__OPC_MOD, "/mod" },
-    /* 751 */ { ud_itab__751, UD_TAB__OPC_MOD, "/mod" },
-    /* 752 */ { ud_itab__752, UD_TAB__OPC_MOD, "/mod" },
-    /* 753 */ { ud_itab__753, UD_TAB__OPC_MOD, "/mod" },
-    /* 754 */ { ud_itab__754, UD_TAB__OPC_MOD, "/mod" },
-    /* 755 */ { ud_itab__755, UD_TAB__OPC_MOD, "/mod" },
-    /* 756 */ { ud_itab__756, UD_TAB__OPC_MOD, "/mod" },
-    /* 757 */ { ud_itab__757, UD_TAB__OPC_MOD, "/mod" },
-    /* 758 */ { ud_itab__758, UD_TAB__OPC_MOD, "/mod" },
-    /* 759 */ { ud_itab__759, UD_TAB__OPC_MOD, "/mod" },
-    /* 760 */ { ud_itab__760, UD_TAB__OPC_MOD, "/mod" },
-    /* 761 */ { ud_itab__761, UD_TAB__OPC_MOD, "/mod" },
-    /* 762 */ { ud_itab__762, UD_TAB__OPC_MOD, "/mod" },
-    /* 763 */ { ud_itab__763, UD_TAB__OPC_REG, "/reg" },
-    /* 764 */ { ud_itab__764, UD_TAB__OPC_MOD, "/mod" },
-    /* 765 */ { ud_itab__765, UD_TAB__OPC_MOD, "/mod" },
-    /* 766 */ { ud_itab__766, UD_TAB__OPC_MOD, "/mod" },
-    /* 767 */ { ud_itab__767, UD_TAB__OPC_MOD, "/mod" },
-    /* 768 */ { ud_itab__768, UD_TAB__OPC_MOD, "/mod" },
-    /* 769 */ { ud_itab__769, UD_TAB__OPC_MOD, "/mod" },
-    /* 770 */ { ud_itab__770, UD_TAB__OPC_MOD, "/mod" },
-    /* 771 */ { ud_itab__771, UD_TAB__OPC_MOD, "/mod" },
-    /* 772 */ { ud_itab__772, UD_TAB__OPC_X87, "/x87" },
-    /* 773 */ { ud_itab__773, UD_TAB__OPC_MOD, "/mod" },
-    /* 774 */ { ud_itab__774, UD_TAB__OPC_MOD, "/mod" },
-    /* 775 */ { ud_itab__775, UD_TAB__OPC_MOD, "/mod" },
-    /* 776 */ { ud_itab__776, UD_TAB__OPC_MOD, "/mod" },
-    /* 777 */ { ud_itab__777, UD_TAB__OPC_MOD, "/mod" },
-    /* 778 */ { ud_itab__778, UD_TAB__OPC_MOD, "/mod" },
-    /* 779 */ { ud_itab__779, UD_TAB__OPC_MOD, "/mod" },
-    /* 780 */ { ud_itab__780, UD_TAB__OPC_MOD, "/mod" },
-    /* 781 */ { ud_itab__781, UD_TAB__OPC_MOD, "/mod" },
-    /* 782 */ { ud_itab__782, UD_TAB__OPC_MOD, "/mod" },
-    /* 783 */ { ud_itab__783, UD_TAB__OPC_MOD, "/mod" },
-    /* 784 */ { ud_itab__784, UD_TAB__OPC_MOD, "/mod" },
-    /* 785 */ { ud_itab__785, UD_TAB__OPC_MOD, "/mod" },
-    /* 786 */ { ud_itab__786, UD_TAB__OPC_MOD, "/mod" },
-    /* 787 */ { ud_itab__787, UD_TAB__OPC_MOD, "/mod" },
-    /* 788 */ { ud_itab__788, UD_TAB__OPC_MOD, "/mod" },
-    /* 789 */ { ud_itab__789, UD_TAB__OPC_MOD, "/mod" },
-    /* 790 */ { ud_itab__790, UD_TAB__OPC_MOD, "/mod" },
-    /* 791 */ { ud_itab__791, UD_TAB__OPC_MOD, "/mod" },
-    /* 792 */ { ud_itab__792, UD_TAB__OPC_MOD, "/mod" },
-    /* 793 */ { ud_itab__793, UD_TAB__OPC_MOD, "/mod" },
-    /* 794 */ { ud_itab__794, UD_TAB__OPC_MOD, "/mod" },
-    /* 795 */ { ud_itab__795, UD_TAB__OPC_MOD, "/mod" },
-    /* 796 */ { ud_itab__796, UD_TAB__OPC_MOD, "/mod" },
-    /* 797 */ { ud_itab__797, UD_TAB__OPC_MOD, "/mod" },
-    /* 798 */ { ud_itab__798, UD_TAB__OPC_MOD, "/mod" },
-    /* 799 */ { ud_itab__799, UD_TAB__OPC_MOD, "/mod" },
-    /* 800 */ { ud_itab__800, UD_TAB__OPC_MOD, "/mod" },
-    /* 801 */ { ud_itab__801, UD_TAB__OPC_MOD, "/mod" },
-    /* 802 */ { ud_itab__802, UD_TAB__OPC_MOD, "/mod" },
-    /* 803 */ { ud_itab__803, UD_TAB__OPC_MOD, "/mod" },
-    /* 804 */ { ud_itab__804, UD_TAB__OPC_MOD, "/mod" },
-    /* 805 */ { ud_itab__805, UD_TAB__OPC_MOD, "/mod" },
-    /* 806 */ { ud_itab__806, UD_TAB__OPC_MOD, "/mod" },
-    /* 807 */ { ud_itab__807, UD_TAB__OPC_REG, "/reg" },
-    /* 808 */ { ud_itab__808, UD_TAB__OPC_MOD, "/mod" },
-    /* 809 */ { ud_itab__809, UD_TAB__OPC_MOD, "/mod" },
-    /* 810 */ { ud_itab__810, UD_TAB__OPC_MOD, "/mod" },
-    /* 811 */ { ud_itab__811, UD_TAB__OPC_MOD, "/mod" },
-    /* 812 */ { ud_itab__812, UD_TAB__OPC_MOD, "/mod" },
-    /* 813 */ { ud_itab__813, UD_TAB__OPC_MOD, "/mod" },
-    /* 814 */ { ud_itab__814, UD_TAB__OPC_X87, "/x87" },
-    /* 815 */ { ud_itab__815, UD_TAB__OPC_MOD, "/mod" },
-    /* 816 */ { ud_itab__816, UD_TAB__OPC_MOD, "/mod" },
-    /* 817 */ { ud_itab__817, UD_TAB__OPC_MOD, "/mod" },
-    /* 818 */ { ud_itab__818, UD_TAB__OPC_MOD, "/mod" },
-    /* 819 */ { ud_itab__819, UD_TAB__OPC_MOD, "/mod" },
-    /* 820 */ { ud_itab__820, UD_TAB__OPC_MOD, "/mod" },
-    /* 821 */ { ud_itab__821, UD_TAB__OPC_MOD, "/mod" },
-    /* 822 */ { ud_itab__822, UD_TAB__OPC_MOD, "/mod" },
-    /* 823 */ { ud_itab__823, UD_TAB__OPC_MOD, "/mod" },
-    /* 824 */ { ud_itab__824, UD_TAB__OPC_MOD, "/mod" },
-    /* 825 */ { ud_itab__825, UD_TAB__OPC_MOD, "/mod" },
-    /* 826 */ { ud_itab__826, UD_TAB__OPC_MOD, "/mod" },
-    /* 827 */ { ud_itab__827, UD_TAB__OPC_MOD, "/mod" },
-    /* 828 */ { ud_itab__828, UD_TAB__OPC_MOD, "/mod" },
-    /* 829 */ { ud_itab__829, UD_TAB__OPC_MOD, "/mod" },
-    /* 830 */ { ud_itab__830, UD_TAB__OPC_MOD, "/mod" },
-    /* 831 */ { ud_itab__831, UD_TAB__OPC_MOD, "/mod" },
-    /* 832 */ { ud_itab__832, UD_TAB__OPC_MOD, "/mod" },
-    /* 833 */ { ud_itab__833, UD_TAB__OPC_MOD, "/mod" },
-    /* 834 */ { ud_itab__834, UD_TAB__OPC_MOD, "/mod" },
-    /* 835 */ { ud_itab__835, UD_TAB__OPC_MOD, "/mod" },
-    /* 836 */ { ud_itab__836, UD_TAB__OPC_MOD, "/mod" },
-    /* 837 */ { ud_itab__837, UD_TAB__OPC_MOD, "/mod" },
-    /* 838 */ { ud_itab__838, UD_TAB__OPC_MOD, "/mod" },
-    /* 839 */ { ud_itab__839, UD_TAB__OPC_MOD, "/mod" },
-    /* 840 */ { ud_itab__840, UD_TAB__OPC_MOD, "/mod" },
-    /* 841 */ { ud_itab__841, UD_TAB__OPC_MOD, "/mod" },
-    /* 842 */ { ud_itab__842, UD_TAB__OPC_MOD, "/mod" },
-    /* 843 */ { ud_itab__843, UD_TAB__OPC_MOD, "/mod" },
-    /* 844 */ { ud_itab__844, UD_TAB__OPC_MOD, "/mod" },
-    /* 845 */ { ud_itab__845, UD_TAB__OPC_MOD, "/mod" },
-    /* 846 */ { ud_itab__846, UD_TAB__OPC_MOD, "/mod" },
-    /* 847 */ { ud_itab__847, UD_TAB__OPC_MOD, "/mod" },
-    /* 848 */ { ud_itab__848, UD_TAB__OPC_MOD, "/mod" },
-    /* 849 */ { ud_itab__849, UD_TAB__OPC_MOD, "/mod" },
-    /* 850 */ { ud_itab__850, UD_TAB__OPC_MOD, "/mod" },
-    /* 851 */ { ud_itab__851, UD_TAB__OPC_MOD, "/mod" },
-    /* 852 */ { ud_itab__852, UD_TAB__OPC_MOD, "/mod" },
-    /* 853 */ { ud_itab__853, UD_TAB__OPC_MOD, "/mod" },
-    /* 854 */ { ud_itab__854, UD_TAB__OPC_MOD, "/mod" },
-    /* 855 */ { ud_itab__855, UD_TAB__OPC_MOD, "/mod" },
-    /* 856 */ { ud_itab__856, UD_TAB__OPC_MOD, "/mod" },
-    /* 857 */ { ud_itab__857, UD_TAB__OPC_MOD, "/mod" },
-    /* 858 */ { ud_itab__858, UD_TAB__OPC_MOD, "/mod" },
-    /* 859 */ { ud_itab__859, UD_TAB__OPC_MOD, "/mod" },
-    /* 860 */ { ud_itab__860, UD_TAB__OPC_MOD, "/mod" },
-    /* 861 */ { ud_itab__861, UD_TAB__OPC_MOD, "/mod" },
-    /* 862 */ { ud_itab__862, UD_TAB__OPC_MOD, "/mod" },
-    /* 863 */ { ud_itab__863, UD_TAB__OPC_MOD, "/mod" },
-    /* 864 */ { ud_itab__864, UD_TAB__OPC_MOD, "/mod" },
-    /* 865 */ { ud_itab__865, UD_TAB__OPC_MOD, "/mod" },
-    /* 866 */ { ud_itab__866, UD_TAB__OPC_REG, "/reg" },
-    /* 867 */ { ud_itab__867, UD_TAB__OPC_MOD, "/mod" },
-    /* 868 */ { ud_itab__868, UD_TAB__OPC_MOD, "/mod" },
-    /* 869 */ { ud_itab__869, UD_TAB__OPC_MOD, "/mod" },
-    /* 870 */ { ud_itab__870, UD_TAB__OPC_MOD, "/mod" },
-    /* 871 */ { ud_itab__871, UD_TAB__OPC_MOD, "/mod" },
-    /* 872 */ { ud_itab__872, UD_TAB__OPC_MOD, "/mod" },
-    /* 873 */ { ud_itab__873, UD_TAB__OPC_MOD, "/mod" },
-    /* 874 */ { ud_itab__874, UD_TAB__OPC_MOD, "/mod" },
-    /* 875 */ { ud_itab__875, UD_TAB__OPC_X87, "/x87" },
-    /* 876 */ { ud_itab__876, UD_TAB__OPC_MOD, "/mod" },
-    /* 877 */ { ud_itab__877, UD_TAB__OPC_MOD, "/mod" },
-    /* 878 */ { ud_itab__878, UD_TAB__OPC_MOD, "/mod" },
-    /* 879 */ { ud_itab__879, UD_TAB__OPC_MOD, "/mod" },
-    /* 880 */ { ud_itab__880, UD_TAB__OPC_MOD, "/mod" },
-    /* 881 */ { ud_itab__881, UD_TAB__OPC_MOD, "/mod" },
-    /* 882 */ { ud_itab__882, UD_TAB__OPC_MOD, "/mod" },
-    /* 883 */ { ud_itab__883, UD_TAB__OPC_MOD, "/mod" },
-    /* 884 */ { ud_itab__884, UD_TAB__OPC_MOD, "/mod" },
-    /* 885 */ { ud_itab__885, UD_TAB__OPC_MOD, "/mod" },
-    /* 886 */ { ud_itab__886, UD_TAB__OPC_MOD, "/mod" },
-    /* 887 */ { ud_itab__887, UD_TAB__OPC_MOD, "/mod" },
-    /* 888 */ { ud_itab__888, UD_TAB__OPC_MOD, "/mod" },
-    /* 889 */ { ud_itab__889, UD_TAB__OPC_MOD, "/mod" },
-    /* 890 */ { ud_itab__890, UD_TAB__OPC_MOD, "/mod" },
-    /* 891 */ { ud_itab__891, UD_TAB__OPC_MOD, "/mod" },
-    /* 892 */ { ud_itab__892, UD_TAB__OPC_MOD, "/mod" },
-    /* 893 */ { ud_itab__893, UD_TAB__OPC_MOD, "/mod" },
-    /* 894 */ { ud_itab__894, UD_TAB__OPC_MOD, "/mod" },
-    /* 895 */ { ud_itab__895, UD_TAB__OPC_MOD, "/mod" },
-    /* 896 */ { ud_itab__896, UD_TAB__OPC_MOD, "/mod" },
-    /* 897 */ { ud_itab__897, UD_TAB__OPC_MOD, "/mod" },
-    /* 898 */ { ud_itab__898, UD_TAB__OPC_MOD, "/mod" },
-    /* 899 */ { ud_itab__899, UD_TAB__OPC_MOD, "/mod" },
-    /* 900 */ { ud_itab__900, UD_TAB__OPC_MOD, "/mod" },
-    /* 901 */ { ud_itab__901, UD_TAB__OPC_MOD, "/mod" },
-    /* 902 */ { ud_itab__902, UD_TAB__OPC_MOD, "/mod" },
-    /* 903 */ { ud_itab__903, UD_TAB__OPC_MOD, "/mod" },
-    /* 904 */ { ud_itab__904, UD_TAB__OPC_MOD, "/mod" },
-    /* 905 */ { ud_itab__905, UD_TAB__OPC_MOD, "/mod" },
-    /* 906 */ { ud_itab__906, UD_TAB__OPC_MOD, "/mod" },
-    /* 907 */ { ud_itab__907, UD_TAB__OPC_MOD, "/mod" },
-    /* 908 */ { ud_itab__908, UD_TAB__OPC_MOD, "/mod" },
-    /* 909 */ { ud_itab__909, UD_TAB__OPC_MOD, "/mod" },
-    /* 910 */ { ud_itab__910, UD_TAB__OPC_MOD, "/mod" },
-    /* 911 */ { ud_itab__911, UD_TAB__OPC_MOD, "/mod" },
-    /* 912 */ { ud_itab__912, UD_TAB__OPC_MOD, "/mod" },
-    /* 913 */ { ud_itab__913, UD_TAB__OPC_MOD, "/mod" },
-    /* 914 */ { ud_itab__914, UD_TAB__OPC_MOD, "/mod" },
-    /* 915 */ { ud_itab__915, UD_TAB__OPC_MOD, "/mod" },
-    /* 916 */ { ud_itab__916, UD_TAB__OPC_MOD, "/mod" },
-    /* 917 */ { ud_itab__917, UD_TAB__OPC_MOD, "/mod" },
-    /* 918 */ { ud_itab__918, UD_TAB__OPC_MOD, "/mod" },
-    /* 919 */ { ud_itab__919, UD_TAB__OPC_MOD, "/mod" },
-    /* 920 */ { ud_itab__920, UD_TAB__OPC_MOD, "/mod" },
-    /* 921 */ { ud_itab__921, UD_TAB__OPC_MOD, "/mod" },
-    /* 922 */ { ud_itab__922, UD_TAB__OPC_MOD, "/mod" },
-    /* 923 */ { ud_itab__923, UD_TAB__OPC_MOD, "/mod" },
-    /* 924 */ { ud_itab__924, UD_TAB__OPC_MOD, "/mod" },
-    /* 925 */ { ud_itab__925, UD_TAB__OPC_MOD, "/mod" },
-    /* 926 */ { ud_itab__926, UD_TAB__OPC_MOD, "/mod" },
-    /* 927 */ { ud_itab__927, UD_TAB__OPC_MOD, "/mod" },
-    /* 928 */ { ud_itab__928, UD_TAB__OPC_MOD, "/mod" },
-    /* 929 */ { ud_itab__929, UD_TAB__OPC_MOD, "/mod" },
-    /* 930 */ { ud_itab__930, UD_TAB__OPC_MOD, "/mod" },
-    /* 931 */ { ud_itab__931, UD_TAB__OPC_MOD, "/mod" },
-    /* 932 */ { ud_itab__932, UD_TAB__OPC_MOD, "/mod" },
-    /* 933 */ { ud_itab__933, UD_TAB__OPC_MOD, "/mod" },
-    /* 934 */ { ud_itab__934, UD_TAB__OPC_MOD, "/mod" },
-    /* 935 */ { ud_itab__935, UD_TAB__OPC_MOD, "/mod" },
-    /* 936 */ { ud_itab__936, UD_TAB__OPC_MOD, "/mod" },
-    /* 937 */ { ud_itab__937, UD_TAB__OPC_MOD, "/mod" },
-    /* 938 */ { ud_itab__938, UD_TAB__OPC_MOD, "/mod" },
-    /* 939 */ { ud_itab__939, UD_TAB__OPC_MOD, "/mod" },
-    /* 940 */ { ud_itab__940, UD_TAB__OPC_MOD, "/mod" },
-    /* 941 */ { ud_itab__941, UD_TAB__OPC_REG, "/reg" },
-    /* 942 */ { ud_itab__942, UD_TAB__OPC_MOD, "/mod" },
-    /* 943 */ { ud_itab__943, UD_TAB__OPC_MOD, "/mod" },
-    /* 944 */ { ud_itab__944, UD_TAB__OPC_MOD, "/mod" },
-    /* 945 */ { ud_itab__945, UD_TAB__OPC_MOD, "/mod" },
-    /* 946 */ { ud_itab__946, UD_TAB__OPC_MOD, "/mod" },
-    /* 947 */ { ud_itab__947, UD_TAB__OPC_MOD, "/mod" },
-    /* 948 */ { ud_itab__948, UD_TAB__OPC_MOD, "/mod" },
-    /* 949 */ { ud_itab__949, UD_TAB__OPC_X87, "/x87" },
-    /* 950 */ { ud_itab__950, UD_TAB__OPC_MOD, "/mod" },
-    /* 951 */ { ud_itab__951, UD_TAB__OPC_MOD, "/mod" },
-    /* 952 */ { ud_itab__952, UD_TAB__OPC_MOD, "/mod" },
-    /* 953 */ { ud_itab__953, UD_TAB__OPC_MOD, "/mod" },
-    /* 954 */ { ud_itab__954, UD_TAB__OPC_MOD, "/mod" },
-    /* 955 */ { ud_itab__955, UD_TAB__OPC_MOD, "/mod" },
-    /* 956 */ { ud_itab__956, UD_TAB__OPC_MOD, "/mod" },
-    /* 957 */ { ud_itab__957, UD_TAB__OPC_MOD, "/mod" },
-    /* 958 */ { ud_itab__958, UD_TAB__OPC_MOD, "/mod" },
-    /* 959 */ { ud_itab__959, UD_TAB__OPC_MOD, "/mod" },
-    /* 960 */ { ud_itab__960, UD_TAB__OPC_MOD, "/mod" },
-    /* 961 */ { ud_itab__961, UD_TAB__OPC_MOD, "/mod" },
-    /* 962 */ { ud_itab__962, UD_TAB__OPC_MOD, "/mod" },
-    /* 963 */ { ud_itab__963, UD_TAB__OPC_MOD, "/mod" },
-    /* 964 */ { ud_itab__964, UD_TAB__OPC_MOD, "/mod" },
-    /* 965 */ { ud_itab__965, UD_TAB__OPC_MOD, "/mod" },
-    /* 966 */ { ud_itab__966, UD_TAB__OPC_MOD, "/mod" },
-    /* 967 */ { ud_itab__967, UD_TAB__OPC_MOD, "/mod" },
-    /* 968 */ { ud_itab__968, UD_TAB__OPC_MOD, "/mod" },
-    /* 969 */ { ud_itab__969, UD_TAB__OPC_MOD, "/mod" },
-    /* 970 */ { ud_itab__970, UD_TAB__OPC_MOD, "/mod" },
-    /* 971 */ { ud_itab__971, UD_TAB__OPC_MOD, "/mod" },
-    /* 972 */ { ud_itab__972, UD_TAB__OPC_MOD, "/mod" },
-    /* 973 */ { ud_itab__973, UD_TAB__OPC_MOD, "/mod" },
-    /* 974 */ { ud_itab__974, UD_TAB__OPC_MOD, "/mod" },
-    /* 975 */ { ud_itab__975, UD_TAB__OPC_MOD, "/mod" },
-    /* 976 */ { ud_itab__976, UD_TAB__OPC_MOD, "/mod" },
-    /* 977 */ { ud_itab__977, UD_TAB__OPC_MOD, "/mod" },
-    /* 978 */ { ud_itab__978, UD_TAB__OPC_MOD, "/mod" },
-    /* 979 */ { ud_itab__979, UD_TAB__OPC_MOD, "/mod" },
-    /* 980 */ { ud_itab__980, UD_TAB__OPC_MOD, "/mod" },
-    /* 981 */ { ud_itab__981, UD_TAB__OPC_MOD, "/mod" },
-    /* 982 */ { ud_itab__982, UD_TAB__OPC_MOD, "/mod" },
-    /* 983 */ { ud_itab__983, UD_TAB__OPC_MOD, "/mod" },
-    /* 984 */ { ud_itab__984, UD_TAB__OPC_MOD, "/mod" },
-    /* 985 */ { ud_itab__985, UD_TAB__OPC_MOD, "/mod" },
-    /* 986 */ { ud_itab__986, UD_TAB__OPC_MOD, "/mod" },
-    /* 987 */ { ud_itab__987, UD_TAB__OPC_MOD, "/mod" },
-    /* 988 */ { ud_itab__988, UD_TAB__OPC_MOD, "/mod" },
-    /* 989 */ { ud_itab__989, UD_TAB__OPC_MOD, "/mod" },
-    /* 990 */ { ud_itab__990, UD_TAB__OPC_MOD, "/mod" },
-    /* 991 */ { ud_itab__991, UD_TAB__OPC_MOD, "/mod" },
-    /* 992 */ { ud_itab__992, UD_TAB__OPC_MOD, "/mod" },
-    /* 993 */ { ud_itab__993, UD_TAB__OPC_MOD, "/mod" },
-    /* 994 */ { ud_itab__994, UD_TAB__OPC_MOD, "/mod" },
-    /* 995 */ { ud_itab__995, UD_TAB__OPC_MOD, "/mod" },
-    /* 996 */ { ud_itab__996, UD_TAB__OPC_MOD, "/mod" },
-    /* 997 */ { ud_itab__997, UD_TAB__OPC_MOD, "/mod" },
-    /* 998 */ { ud_itab__998, UD_TAB__OPC_MOD, "/mod" },
-    /* 999 */ { ud_itab__999, UD_TAB__OPC_REG, "/reg" },
-    /* 1000 */ { ud_itab__1000, UD_TAB__OPC_MOD, "/mod" },
-    /* 1001 */ { ud_itab__1001, UD_TAB__OPC_MOD, "/mod" },
-    /* 1002 */ { ud_itab__1002, UD_TAB__OPC_MOD, "/mod" },
-    /* 1003 */ { ud_itab__1003, UD_TAB__OPC_MOD, "/mod" },
-    /* 1004 */ { ud_itab__1004, UD_TAB__OPC_MOD, "/mod" },
-    /* 1005 */ { ud_itab__1005, UD_TAB__OPC_MOD, "/mod" },
-    /* 1006 */ { ud_itab__1006, UD_TAB__OPC_MOD, "/mod" },
-    /* 1007 */ { ud_itab__1007, UD_TAB__OPC_MOD, "/mod" },
-    /* 1008 */ { ud_itab__1008, UD_TAB__OPC_X87, "/x87" },
-    /* 1009 */ { ud_itab__1009, UD_TAB__OPC_MOD, "/mod" },
-    /* 1010 */ { ud_itab__1010, UD_TAB__OPC_MOD, "/mod" },
-    /* 1011 */ { ud_itab__1011, UD_TAB__OPC_MOD, "/mod" },
-    /* 1012 */ { ud_itab__1012, UD_TAB__OPC_MOD, "/mod" },
-    /* 1013 */ { ud_itab__1013, UD_TAB__OPC_MOD, "/mod" },
-    /* 1014 */ { ud_itab__1014, UD_TAB__OPC_MOD, "/mod" },
-    /* 1015 */ { ud_itab__1015, UD_TAB__OPC_MOD, "/mod" },
-    /* 1016 */ { ud_itab__1016, UD_TAB__OPC_MOD, "/mod" },
-    /* 1017 */ { ud_itab__1017, UD_TAB__OPC_MOD, "/mod" },
-    /* 1018 */ { ud_itab__1018, UD_TAB__OPC_MOD, "/mod" },
-    /* 1019 */ { ud_itab__1019, UD_TAB__OPC_MOD, "/mod" },
-    /* 1020 */ { ud_itab__1020, UD_TAB__OPC_MOD, "/mod" },
-    /* 1021 */ { ud_itab__1021, UD_TAB__OPC_MOD, "/mod" },
-    /* 1022 */ { ud_itab__1022, UD_TAB__OPC_MOD, "/mod" },
-    /* 1023 */ { ud_itab__1023, UD_TAB__OPC_MOD, "/mod" },
-    /* 1024 */ { ud_itab__1024, UD_TAB__OPC_MOD, "/mod" },
-    /* 1025 */ { ud_itab__1025, UD_TAB__OPC_MOD, "/mod" },
-    /* 1026 */ { ud_itab__1026, UD_TAB__OPC_MOD, "/mod" },
-    /* 1027 */ { ud_itab__1027, UD_TAB__OPC_MOD, "/mod" },
-    /* 1028 */ { ud_itab__1028, UD_TAB__OPC_MOD, "/mod" },
-    /* 1029 */ { ud_itab__1029, UD_TAB__OPC_MOD, "/mod" },
-    /* 1030 */ { ud_itab__1030, UD_TAB__OPC_MOD, "/mod" },
-    /* 1031 */ { ud_itab__1031, UD_TAB__OPC_MOD, "/mod" },
-    /* 1032 */ { ud_itab__1032, UD_TAB__OPC_MOD, "/mod" },
-    /* 1033 */ { ud_itab__1033, UD_TAB__OPC_MOD, "/mod" },
-    /* 1034 */ { ud_itab__1034, UD_TAB__OPC_MOD, "/mod" },
-    /* 1035 */ { ud_itab__1035, UD_TAB__OPC_MOD, "/mod" },
-    /* 1036 */ { ud_itab__1036, UD_TAB__OPC_MOD, "/mod" },
-    /* 1037 */ { ud_itab__1037, UD_TAB__OPC_MOD, "/mod" },
-    /* 1038 */ { ud_itab__1038, UD_TAB__OPC_MOD, "/mod" },
-    /* 1039 */ { ud_itab__1039, UD_TAB__OPC_MOD, "/mod" },
-    /* 1040 */ { ud_itab__1040, UD_TAB__OPC_MOD, "/mod" },
-    /* 1041 */ { ud_itab__1041, UD_TAB__OPC_MOD, "/mod" },
-    /* 1042 */ { ud_itab__1042, UD_TAB__OPC_MOD, "/mod" },
-    /* 1043 */ { ud_itab__1043, UD_TAB__OPC_MOD, "/mod" },
-    /* 1044 */ { ud_itab__1044, UD_TAB__OPC_MOD, "/mod" },
-    /* 1045 */ { ud_itab__1045, UD_TAB__OPC_MOD, "/mod" },
-    /* 1046 */ { ud_itab__1046, UD_TAB__OPC_MOD, "/mod" },
-    /* 1047 */ { ud_itab__1047, UD_TAB__OPC_MOD, "/mod" },
-    /* 1048 */ { ud_itab__1048, UD_TAB__OPC_MOD, "/mod" },
-    /* 1049 */ { ud_itab__1049, UD_TAB__OPC_MOD, "/mod" },
-    /* 1050 */ { ud_itab__1050, UD_TAB__OPC_MOD, "/mod" },
-    /* 1051 */ { ud_itab__1051, UD_TAB__OPC_MOD, "/mod" },
-    /* 1052 */ { ud_itab__1052, UD_TAB__OPC_MOD, "/mod" },
-    /* 1053 */ { ud_itab__1053, UD_TAB__OPC_MOD, "/mod" },
-    /* 1054 */ { ud_itab__1054, UD_TAB__OPC_MOD, "/mod" },
-    /* 1055 */ { ud_itab__1055, UD_TAB__OPC_MOD, "/mod" },
-    /* 1056 */ { ud_itab__1056, UD_TAB__OPC_MOD, "/mod" },
-    /* 1057 */ { ud_itab__1057, UD_TAB__OPC_MOD, "/mod" },
-    /* 1058 */ { ud_itab__1058, UD_TAB__OPC_MOD, "/mod" },
-    /* 1059 */ { ud_itab__1059, UD_TAB__OPC_MOD, "/mod" },
-    /* 1060 */ { ud_itab__1060, UD_TAB__OPC_MOD, "/mod" },
-    /* 1061 */ { ud_itab__1061, UD_TAB__OPC_MOD, "/mod" },
-    /* 1062 */ { ud_itab__1062, UD_TAB__OPC_MOD, "/mod" },
-    /* 1063 */ { ud_itab__1063, UD_TAB__OPC_MOD, "/mod" },
-    /* 1064 */ { ud_itab__1064, UD_TAB__OPC_MOD, "/mod" },
-    /* 1065 */ { ud_itab__1065, UD_TAB__OPC_MOD, "/mod" },
-    /* 1066 */ { ud_itab__1066, UD_TAB__OPC_MOD, "/mod" },
-    /* 1067 */ { ud_itab__1067, UD_TAB__OPC_REG, "/reg" },
-    /* 1068 */ { ud_itab__1068, UD_TAB__OPC_MOD, "/mod" },
-    /* 1069 */ { ud_itab__1069, UD_TAB__OPC_MOD, "/mod" },
-    /* 1070 */ { ud_itab__1070, UD_TAB__OPC_MOD, "/mod" },
-    /* 1071 */ { ud_itab__1071, UD_TAB__OPC_MOD, "/mod" },
-    /* 1072 */ { ud_itab__1072, UD_TAB__OPC_MOD, "/mod" },
-    /* 1073 */ { ud_itab__1073, UD_TAB__OPC_MOD, "/mod" },
-    /* 1074 */ { ud_itab__1074, UD_TAB__OPC_MOD, "/mod" },
-    /* 1075 */ { ud_itab__1075, UD_TAB__OPC_MOD, "/mod" },
-    /* 1076 */ { ud_itab__1076, UD_TAB__OPC_X87, "/x87" },
-    /* 1077 */ { ud_itab__1077, UD_TAB__OPC_MOD, "/mod" },
-    /* 1078 */ { ud_itab__1078, UD_TAB__OPC_MOD, "/mod" },
-    /* 1079 */ { ud_itab__1079, UD_TAB__OPC_MOD, "/mod" },
-    /* 1080 */ { ud_itab__1080, UD_TAB__OPC_MOD, "/mod" },
-    /* 1081 */ { ud_itab__1081, UD_TAB__OPC_MOD, "/mod" },
-    /* 1082 */ { ud_itab__1082, UD_TAB__OPC_MOD, "/mod" },
-    /* 1083 */ { ud_itab__1083, UD_TAB__OPC_MOD, "/mod" },
-    /* 1084 */ { ud_itab__1084, UD_TAB__OPC_MOD, "/mod" },
-    /* 1085 */ { ud_itab__1085, UD_TAB__OPC_MOD, "/mod" },
-    /* 1086 */ { ud_itab__1086, UD_TAB__OPC_MOD, "/mod" },
-    /* 1087 */ { ud_itab__1087, UD_TAB__OPC_MOD, "/mod" },
-    /* 1088 */ { ud_itab__1088, UD_TAB__OPC_MOD, "/mod" },
-    /* 1089 */ { ud_itab__1089, UD_TAB__OPC_MOD, "/mod" },
-    /* 1090 */ { ud_itab__1090, UD_TAB__OPC_MOD, "/mod" },
-    /* 1091 */ { ud_itab__1091, UD_TAB__OPC_MOD, "/mod" },
-    /* 1092 */ { ud_itab__1092, UD_TAB__OPC_MOD, "/mod" },
-    /* 1093 */ { ud_itab__1093, UD_TAB__OPC_MOD, "/mod" },
-    /* 1094 */ { ud_itab__1094, UD_TAB__OPC_MOD, "/mod" },
-    /* 1095 */ { ud_itab__1095, UD_TAB__OPC_MOD, "/mod" },
-    /* 1096 */ { ud_itab__1096, UD_TAB__OPC_MOD, "/mod" },
-    /* 1097 */ { ud_itab__1097, UD_TAB__OPC_MOD, "/mod" },
-    /* 1098 */ { ud_itab__1098, UD_TAB__OPC_MOD, "/mod" },
-    /* 1099 */ { ud_itab__1099, UD_TAB__OPC_MOD, "/mod" },
-    /* 1100 */ { ud_itab__1100, UD_TAB__OPC_MOD, "/mod" },
-    /* 1101 */ { ud_itab__1101, UD_TAB__OPC_MOD, "/mod" },
-    /* 1102 */ { ud_itab__1102, UD_TAB__OPC_MOD, "/mod" },
-    /* 1103 */ { ud_itab__1103, UD_TAB__OPC_MOD, "/mod" },
-    /* 1104 */ { ud_itab__1104, UD_TAB__OPC_MOD, "/mod" },
-    /* 1105 */ { ud_itab__1105, UD_TAB__OPC_MOD, "/mod" },
-    /* 1106 */ { ud_itab__1106, UD_TAB__OPC_MOD, "/mod" },
-    /* 1107 */ { ud_itab__1107, UD_TAB__OPC_MOD, "/mod" },
-    /* 1108 */ { ud_itab__1108, UD_TAB__OPC_MOD, "/mod" },
-    /* 1109 */ { ud_itab__1109, UD_TAB__OPC_MOD, "/mod" },
-    /* 1110 */ { ud_itab__1110, UD_TAB__OPC_MOD, "/mod" },
-    /* 1111 */ { ud_itab__1111, UD_TAB__OPC_MOD, "/mod" },
-    /* 1112 */ { ud_itab__1112, UD_TAB__OPC_MOD, "/mod" },
-    /* 1113 */ { ud_itab__1113, UD_TAB__OPC_MOD, "/mod" },
-    /* 1114 */ { ud_itab__1114, UD_TAB__OPC_MOD, "/mod" },
-    /* 1115 */ { ud_itab__1115, UD_TAB__OPC_MOD, "/mod" },
-    /* 1116 */ { ud_itab__1116, UD_TAB__OPC_MOD, "/mod" },
-    /* 1117 */ { ud_itab__1117, UD_TAB__OPC_MOD, "/mod" },
-    /* 1118 */ { ud_itab__1118, UD_TAB__OPC_MOD, "/mod" },
-    /* 1119 */ { ud_itab__1119, UD_TAB__OPC_MOD, "/mod" },
-    /* 1120 */ { ud_itab__1120, UD_TAB__OPC_MOD, "/mod" },
-    /* 1121 */ { ud_itab__1121, UD_TAB__OPC_MOD, "/mod" },
-    /* 1122 */ { ud_itab__1122, UD_TAB__OPC_MOD, "/mod" },
-    /* 1123 */ { ud_itab__1123, UD_TAB__OPC_MOD, "/mod" },
-    /* 1124 */ { ud_itab__1124, UD_TAB__OPC_MOD, "/mod" },
-    /* 1125 */ { ud_itab__1125, UD_TAB__OPC_MOD, "/mod" },
-    /* 1126 */ { ud_itab__1126, UD_TAB__OPC_ASIZE, "/a" },
-    /* 1127 */ { ud_itab__1127, UD_TAB__OPC_MODE, "/m" },
-    /* 1128 */ { ud_itab__1128, UD_TAB__OPC_REG, "/reg" },
-    /* 1129 */ { ud_itab__1129, UD_TAB__OPC_REG, "/reg" },
-    /* 1130 */ { ud_itab__1130, UD_TAB__OPC_REG, "/reg" },
-    /* 1131 */ { ud_itab__1131, UD_TAB__OPC_REG, "/reg" },
-    /* 1132 */ { ud_itab__1132, UD_TAB__OPC_MODE, "/m" },
-};
-
-/* itab entry operand definitions (for readability) */
-#define O_AL      { OP_AL,       SZ_B     }
-#define O_AX      { OP_AX,       SZ_W     }
-#define O_Av      { OP_A,        SZ_V     }
-#define O_C       { OP_C,        SZ_NA    }
-#define O_CL      { OP_CL,       SZ_B     }
-#define O_CS      { OP_CS,       SZ_NA    }
-#define O_CX      { OP_CX,       SZ_W     }
-#define O_D       { OP_D,        SZ_NA    }
-#define O_DL      { OP_DL,       SZ_B     }
-#define O_DS      { OP_DS,       SZ_NA    }
-#define O_DX      { OP_DX,       SZ_W     }
-#define O_E       { OP_E,        SZ_NA    }
-#define O_ES      { OP_ES,       SZ_NA    }
-#define O_Eb      { OP_E,        SZ_B     }
-#define O_Ed      { OP_E,        SZ_D     }
-#define O_Eq      { OP_E,        SZ_Q     }
-#define O_Ev      { OP_E,        SZ_V     }
-#define O_Ew      { OP_E,        SZ_W     }
-#define O_Ey      { OP_E,        SZ_Y     }
-#define O_Ez      { OP_E,        SZ_Z     }
-#define O_FS      { OP_FS,       SZ_NA    }
-#define O_Fv      { OP_F,        SZ_V     }
-#define O_G       { OP_G,        SZ_NA    }
-#define O_GS      { OP_GS,       SZ_NA    }
-#define O_Gb      { OP_G,        SZ_B     }
-#define O_Gd      { OP_G,        SZ_D     }
-#define O_Gq      { OP_G,        SZ_Q     }
-#define O_Gv      { OP_G,        SZ_V     }
-#define O_Gw      { OP_G,        SZ_W     }
-#define O_Gy      { OP_G,        SZ_Y     }
-#define O_Gz      { OP_G,        SZ_Z     }
-#define O_I1      { OP_I1,       SZ_NA    }
-#define O_I3      { OP_I3,       SZ_NA    }
-#define O_Ib      { OP_I,        SZ_B     }
-#define O_Iv      { OP_I,        SZ_V     }
-#define O_Iw      { OP_I,        SZ_W     }
-#define O_Iz      { OP_I,        SZ_Z     }
-#define O_Jb      { OP_J,        SZ_B     }
-#define O_Jv      { OP_J,        SZ_V     }
-#define O_Jz      { OP_J,        SZ_Z     }
-#define O_M       { OP_M,        SZ_NA    }
-#define O_Mb      { OP_M,        SZ_B     }
-#define O_MbRd    { OP_MR,       SZ_BD    }
-#define O_MbRv    { OP_MR,       SZ_BV    }
-#define O_Md      { OP_M,        SZ_D     }
-#define O_MdRy    { OP_MR,       SZ_DY    }
-#define O_MdU     { OP_MU,       SZ_DO    }
-#define O_Mo      { OP_M,        SZ_O     }
-#define O_Mq      { OP_M,        SZ_Q     }
-#define O_MqU     { OP_MU,       SZ_QO    }
-#define O_Ms      { OP_M,        SZ_W     }
-#define O_Mt      { OP_M,        SZ_T     }
-#define O_Mv      { OP_M,        SZ_V     }
-#define O_Mw      { OP_M,        SZ_W     }
-#define O_MwRd    { OP_MR,       SZ_WD    }
-#define O_MwRv    { OP_MR,       SZ_WV    }
-#define O_MwRy    { OP_MR,       SZ_WY    }
-#define O_MwU     { OP_MU,       SZ_WO    }
-#define O_N       { OP_N,        SZ_Q     }
-#define O_NONE    { OP_NONE,     SZ_NA    }
-#define O_Ob      { OP_O,        SZ_B     }
-#define O_Ov      { OP_O,        SZ_V     }
-#define O_Ow      { OP_O,        SZ_W     }
-#define O_P       { OP_P,        SZ_Q     }
-#define O_Q       { OP_Q,        SZ_Q     }
-#define O_R       { OP_R,        SZ_RDQ   }
-#define O_R0b     { OP_R0,       SZ_B     }
-#define O_R0v     { OP_R0,       SZ_V     }
-#define O_R0w     { OP_R0,       SZ_W     }
-#define O_R0y     { OP_R0,       SZ_Y     }
-#define O_R0z     { OP_R0,       SZ_Z     }
-#define O_R1b     { OP_R1,       SZ_B     }
-#define O_R1v     { OP_R1,       SZ_V     }
-#define O_R1w     { OP_R1,       SZ_W     }
-#define O_R1y     { OP_R1,       SZ_Y     }
-#define O_R1z     { OP_R1,       SZ_Z     }
-#define O_R2b     { OP_R2,       SZ_B     }
-#define O_R2v     { OP_R2,       SZ_V     }
-#define O_R2w     { OP_R2,       SZ_W     }
-#define O_R2y     { OP_R2,       SZ_Y     }
-#define O_R2z     { OP_R2,       SZ_Z     }
-#define O_R3b     { OP_R3,       SZ_B     }
-#define O_R3v     { OP_R3,       SZ_V     }
-#define O_R3w     { OP_R3,       SZ_W     }
-#define O_R3y     { OP_R3,       SZ_Y     }
-#define O_R3z     { OP_R3,       SZ_Z     }
-#define O_R4b     { OP_R4,       SZ_B     }
-#define O_R4v     { OP_R4,       SZ_V     }
-#define O_R4w     { OP_R4,       SZ_W     }
-#define O_R4y     { OP_R4,       SZ_Y     }
-#define O_R4z     { OP_R4,       SZ_Z     }
-#define O_R5b     { OP_R5,       SZ_B     }
-#define O_R5v     { OP_R5,       SZ_V     }
-#define O_R5w     { OP_R5,       SZ_W     }
-#define O_R5y     { OP_R5,       SZ_Y     }
-#define O_R5z     { OP_R5,       SZ_Z     }
-#define O_R6b     { OP_R6,       SZ_B     }
-#define O_R6v     { OP_R6,       SZ_V     }
-#define O_R6w     { OP_R6,       SZ_W     }
-#define O_R6y     { OP_R6,       SZ_Y     }
-#define O_R6z     { OP_R6,       SZ_Z     }
-#define O_R7b     { OP_R7,       SZ_B     }
-#define O_R7v     { OP_R7,       SZ_V     }
-#define O_R7w     { OP_R7,       SZ_W     }
-#define O_R7y     { OP_R7,       SZ_Y     }
-#define O_R7z     { OP_R7,       SZ_Z     }
-#define O_S       { OP_S,        SZ_NA    }
-#define O_SS      { OP_SS,       SZ_NA    }
-#define O_ST0     { OP_ST0,      SZ_NA    }
-#define O_ST1     { OP_ST1,      SZ_NA    }
-#define O_ST2     { OP_ST2,      SZ_NA    }
-#define O_ST3     { OP_ST3,      SZ_NA    }
-#define O_ST4     { OP_ST4,      SZ_NA    }
-#define O_ST5     { OP_ST5,      SZ_NA    }
-#define O_ST6     { OP_ST6,      SZ_NA    }
-#define O_ST7     { OP_ST7,      SZ_NA    }
-#define O_U       { OP_U,        SZ_O     }
-#define O_V       { OP_V,        SZ_O     }
-#define O_W       { OP_W,        SZ_O     }
-#define O_eAX     { OP_eAX,      SZ_Z     }
-#define O_eCX     { OP_eCX,      SZ_Z     }
-#define O_eDX     { OP_eDX,      SZ_Z     }
-#define O_rAX     { OP_rAX,      SZ_V     }
-#define O_rCX     { OP_rCX,      SZ_V     }
-#define O_rDX     { OP_rDX,      SZ_V     }
-#define O_sIb     { OP_sI,       SZ_B     }
-#define O_sIv     { OP_sI,       SZ_V     }
-#define O_sIz     { OP_sI,       SZ_Z     }
-
-struct ud_itab_entry ud_itab[] = {
-  /* 0000 */ { UD_Iinvalid, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0001 */ { UD_Iadd, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0002 */ { UD_Iadd, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0003 */ { UD_Iadd, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0004 */ { UD_Iadd, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0005 */ { UD_Iadd, O_AL, O_Ib, O_NONE, P_none },
-  /* 0006 */ { UD_Iadd, O_rAX, O_sIz, O_NONE, P_oso|P_rexw },
-  /* 0007 */ { UD_Ipush, O_ES, O_NONE, O_NONE, P_inv64 },
-  /* 0008 */ { UD_Ipop, O_ES, O_NONE, O_NONE, P_inv64 },
-  /* 0009 */ { UD_Ior, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0010 */ { UD_Ior, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0011 */ { UD_Ior, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0012 */ { UD_Ior, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0013 */ { UD_Ior, O_AL, O_Ib, O_NONE, P_none },
-  /* 0014 */ { UD_Ior, O_rAX, O_sIz, O_NONE, P_oso|P_rexw },
-  /* 0015 */ { UD_Ipush, O_CS, O_NONE, O_NONE, P_inv64 },
-  /* 0016 */ { UD_Isldt, O_MwRv, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0017 */ { UD_Istr, O_MwRv, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0018 */ { UD_Illdt, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0019 */ { UD_Iltr, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0020 */ { UD_Iverr, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0021 */ { UD_Iverw, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0022 */ { UD_Isgdt, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0023 */ { UD_Isidt, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0024 */ { UD_Ilgdt, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0025 */ { UD_Ilidt, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0026 */ { UD_Ismsw, O_MwRv, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0027 */ { UD_Ilmsw, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0028 */ { UD_Iinvlpg, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0029 */ { UD_Ivmcall, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0030 */ { UD_Ivmlaunch, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0031 */ { UD_Ivmresume, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0032 */ { UD_Ivmxoff, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0033 */ { UD_Imonitor, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0034 */ { UD_Imwait, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0035 */ { UD_Ixgetbv, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0036 */ { UD_Ixsetbv, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0037 */ { UD_Ivmrun, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0038 */ { UD_Ivmmcall, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0039 */ { UD_Ivmload, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0040 */ { UD_Ivmsave, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0041 */ { UD_Istgi, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0042 */ { UD_Iclgi, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0043 */ { UD_Iskinit, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0044 */ { UD_Iinvlpga, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0045 */ { UD_Ismsw, O_MwRv, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0046 */ { UD_Ilmsw, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0047 */ { UD_Iswapgs, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0048 */ { UD_Irdtscp, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0049 */ { UD_Ilar, O_Gv, O_Ew, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0050 */ { UD_Ilsl, O_Gv, O_Ew, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0051 */ { UD_Isyscall, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0052 */ { UD_Iclts, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0053 */ { UD_Isysret, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0054 */ { UD_Iinvd, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0055 */ { UD_Iwbinvd, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0056 */ { UD_Iud2, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0057 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0058 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0059 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0060 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0061 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0062 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0063 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0064 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0065 */ { UD_Ifemms, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0066 */ { UD_Ipi2fw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0067 */ { UD_Ipi2fd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0068 */ { UD_Ipf2iw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0069 */ { UD_Ipf2id, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0070 */ { UD_Ipfnacc, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0071 */ { UD_Ipfpnacc, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0072 */ { UD_Ipfcmpge, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0073 */ { UD_Ipfmin, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0074 */ { UD_Ipfrcp, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0075 */ { UD_Ipfrsqrt, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0076 */ { UD_Ipfsub, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0077 */ { UD_Ipfadd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0078 */ { UD_Ipfcmpgt, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0079 */ { UD_Ipfmax, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0080 */ { UD_Ipfrcpit1, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0081 */ { UD_Ipfrsqit1, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0082 */ { UD_Ipfsubr, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0083 */ { UD_Ipfacc, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0084 */ { UD_Ipfcmpeq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0085 */ { UD_Ipfmul, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0086 */ { UD_Ipfrcpit2, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0087 */ { UD_Ipmulhrw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0088 */ { UD_Ipswapd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0089 */ { UD_Ipavgusb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0090 */ { UD_Imovups, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0091 */ { UD_Imovsd, O_V, O_W, O_NONE, P_str|P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0092 */ { UD_Imovss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0093 */ { UD_Imovupd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0094 */ { UD_Imovups, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0095 */ { UD_Imovsd, O_W, O_V, O_NONE, P_str|P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0096 */ { UD_Imovss, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0097 */ { UD_Imovupd, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0098 */ { UD_Imovlps, O_V, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0099 */ { UD_Imovddup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0100 */ { UD_Imovsldup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0101 */ { UD_Imovlpd, O_V, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0102 */ { UD_Imovhlps, O_V, O_U, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0103 */ { UD_Imovddup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0104 */ { UD_Imovsldup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0105 */ { UD_Imovlps, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0106 */ { UD_Imovlpd, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0107 */ { UD_Iunpcklps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0108 */ { UD_Iunpcklpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0109 */ { UD_Iunpckhps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0110 */ { UD_Iunpckhpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0111 */ { UD_Imovhps, O_V, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0112 */ { UD_Imovshdup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0113 */ { UD_Imovhpd, O_V, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0114 */ { UD_Imovlhps, O_V, O_U, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0115 */ { UD_Imovshdup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0116 */ { UD_Imovhps, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0117 */ { UD_Imovhpd, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0118 */ { UD_Iprefetchnta, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0119 */ { UD_Iprefetcht0, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0120 */ { UD_Iprefetcht1, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0121 */ { UD_Iprefetcht2, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0122 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0123 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0124 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0125 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0126 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0127 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0128 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0129 */ { UD_Imov, O_R, O_C, O_NONE, P_rexr|P_rexw|P_rexb },
-  /* 0130 */ { UD_Imov, O_R, O_D, O_NONE, P_rexr|P_rexw|P_rexb },
-  /* 0131 */ { UD_Imov, O_C, O_R, O_NONE, P_rexr|P_rexw|P_rexb },
-  /* 0132 */ { UD_Imov, O_D, O_R, O_NONE, P_rexr|P_rexw|P_rexb },
-  /* 0133 */ { UD_Imovaps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0134 */ { UD_Imovapd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0135 */ { UD_Imovaps, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0136 */ { UD_Imovapd, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0137 */ { UD_Icvtpi2ps, O_V, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0138 */ { UD_Icvtsi2sd, O_V, O_Ey, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0139 */ { UD_Icvtsi2ss, O_V, O_Ey, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0140 */ { UD_Icvtpi2pd, O_V, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0141 */ { UD_Imovntps, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0142 */ { UD_Imovntpd, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0143 */ { UD_Icvttps2pi, O_P, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0144 */ { UD_Icvttsd2si, O_Gy, O_W, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0145 */ { UD_Icvttss2si, O_Gy, O_W, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0146 */ { UD_Icvttpd2pi, O_P, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0147 */ { UD_Icvtps2pi, O_P, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0148 */ { UD_Icvtsd2si, O_Gy, O_W, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0149 */ { UD_Icvtss2si, O_Gy, O_W, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0150 */ { UD_Icvtpd2pi, O_P, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0151 */ { UD_Iucomiss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0152 */ { UD_Iucomisd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0153 */ { UD_Icomiss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0154 */ { UD_Icomisd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0155 */ { UD_Iwrmsr, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0156 */ { UD_Irdtsc, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0157 */ { UD_Irdmsr, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0158 */ { UD_Irdpmc, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0159 */ { UD_Isysenter, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0160 */ { UD_Isysenter, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0161 */ { UD_Isysexit, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0162 */ { UD_Isysexit, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0163 */ { UD_Igetsec, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0164 */ { UD_Ipshufb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0165 */ { UD_Ipshufb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0166 */ { UD_Iphaddw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0167 */ { UD_Iphaddw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0168 */ { UD_Iphaddd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0169 */ { UD_Iphaddd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0170 */ { UD_Iphaddsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0171 */ { UD_Iphaddsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0172 */ { UD_Ipmaddubsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0173 */ { UD_Ipmaddubsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0174 */ { UD_Iphsubw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0175 */ { UD_Iphsubw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0176 */ { UD_Iphsubd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0177 */ { UD_Iphsubd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0178 */ { UD_Iphsubsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0179 */ { UD_Iphsubsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0180 */ { UD_Ipsignb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0181 */ { UD_Ipsignb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0182 */ { UD_Ipsignw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0183 */ { UD_Ipsignw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0184 */ { UD_Ipsignd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0185 */ { UD_Ipsignd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0186 */ { UD_Ipmulhrsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0187 */ { UD_Ipmulhrsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0188 */ { UD_Ipblendvb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0189 */ { UD_Iblendvps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0190 */ { UD_Iblendvpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0191 */ { UD_Iptest, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0192 */ { UD_Ipabsb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0193 */ { UD_Ipabsb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0194 */ { UD_Ipabsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0195 */ { UD_Ipabsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0196 */ { UD_Ipabsd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0197 */ { UD_Ipabsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0198 */ { UD_Ipmovsxbw, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0199 */ { UD_Ipmovsxbd, O_V, O_MdU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0200 */ { UD_Ipmovsxbq, O_V, O_MwU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0201 */ { UD_Ipmovsxwd, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0202 */ { UD_Ipmovsxwq, O_V, O_MdU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0203 */ { UD_Ipmovsxdq, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0204 */ { UD_Ipmuldq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0205 */ { UD_Ipcmpeqq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0206 */ { UD_Imovntdqa, O_V, O_Mo, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0207 */ { UD_Ipackusdw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0208 */ { UD_Ipmovzxbw, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0209 */ { UD_Ipmovzxbd, O_V, O_MdU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0210 */ { UD_Ipmovzxbq, O_V, O_MwU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0211 */ { UD_Ipmovzxwd, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0212 */ { UD_Ipmovzxwq, O_V, O_MdU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0213 */ { UD_Ipmovzxdq, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0214 */ { UD_Ipcmpgtq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0215 */ { UD_Ipminsb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0216 */ { UD_Ipminsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0217 */ { UD_Ipminuw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0218 */ { UD_Ipminud, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0219 */ { UD_Ipmaxsb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0220 */ { UD_Ipmaxsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0221 */ { UD_Ipmaxuw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0222 */ { UD_Ipmaxud, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0223 */ { UD_Ipmulld, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0224 */ { UD_Iphminposuw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0225 */ { UD_Iinvept, O_Gq, O_Mo, O_NONE, P_none },
-  /* 0226 */ { UD_Iinvvpid, O_Gq, O_Mo, O_NONE, P_none },
-  /* 0227 */ { UD_Iaesimc, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0228 */ { UD_Iaesenc, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0229 */ { UD_Iaesenclast, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0230 */ { UD_Iaesdec, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0231 */ { UD_Iaesdeclast, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0232 */ { UD_Imovbe, O_Gv, O_Mv, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0233 */ { UD_Icrc32, O_Gy, O_Eb, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0234 */ { UD_Imovbe, O_Mv, O_Gv, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0235 */ { UD_Icrc32, O_Gy, O_Ev, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0236 */ { UD_Iroundps, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0237 */ { UD_Iroundpd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0238 */ { UD_Iroundss, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0239 */ { UD_Iroundsd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0240 */ { UD_Iblendps, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0241 */ { UD_Iblendpd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0242 */ { UD_Ipblendw, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0243 */ { UD_Ipalignr, O_P, O_Q, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0244 */ { UD_Ipalignr, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0245 */ { UD_Ipextrb, O_MbRv, O_V, O_Ib, P_aso|P_rexx|P_rexr|P_rexb|P_def64 },
-  /* 0246 */ { UD_Ipextrw, O_MwRd, O_V, O_Ib, P_aso|P_rexx|P_rexr|P_rexb },
-  /* 0247 */ { UD_Ipextrd, O_Ed, O_V, O_Ib, P_aso|P_rexr|P_rexx|P_rexw|P_rexb },
-  /* 0248 */ { UD_Ipextrd, O_Ed, O_V, O_Ib, P_aso|P_rexr|P_rexx|P_rexw|P_rexb },
-  /* 0249 */ { UD_Ipextrq, O_Eq, O_V, O_Ib, P_aso|P_rexr|P_rexw|P_rexb|P_def64 },
-  /* 0250 */ { UD_Iextractps, O_MdRy, O_V, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0251 */ { UD_Ipinsrb, O_V, O_MbRd, O_Ib, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0252 */ { UD_Iinsertps, O_V, O_Md, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0253 */ { UD_Ipinsrd, O_V, O_Ed, O_Ib, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0254 */ { UD_Ipinsrd, O_V, O_Ed, O_Ib, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0255 */ { UD_Ipinsrq, O_V, O_Eq, O_Ib, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0256 */ { UD_Idpps, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0257 */ { UD_Idppd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0258 */ { UD_Impsadbw, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0259 */ { UD_Ipclmulqdq, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0260 */ { UD_Ipcmpestrm, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0261 */ { UD_Ipcmpestri, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0262 */ { UD_Ipcmpistrm, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0263 */ { UD_Ipcmpistri, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0264 */ { UD_Iaeskeygenassist, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0265 */ { UD_Icmovo, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0266 */ { UD_Icmovno, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0267 */ { UD_Icmovb, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0268 */ { UD_Icmovae, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0269 */ { UD_Icmovz, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0270 */ { UD_Icmovnz, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0271 */ { UD_Icmovbe, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0272 */ { UD_Icmova, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0273 */ { UD_Icmovs, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0274 */ { UD_Icmovns, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0275 */ { UD_Icmovp, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0276 */ { UD_Icmovnp, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0277 */ { UD_Icmovl, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0278 */ { UD_Icmovge, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0279 */ { UD_Icmovle, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0280 */ { UD_Icmovg, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0281 */ { UD_Imovmskps, O_Gd, O_U, O_NONE, P_oso|P_rexr|P_rexb },
-  /* 0282 */ { UD_Imovmskpd, O_Gd, O_U, O_NONE, P_oso|P_rexr|P_rexb },
-  /* 0283 */ { UD_Isqrtps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0284 */ { UD_Isqrtsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0285 */ { UD_Isqrtss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0286 */ { UD_Isqrtpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0287 */ { UD_Irsqrtps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0288 */ { UD_Irsqrtss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0289 */ { UD_Ircpps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0290 */ { UD_Ircpss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0291 */ { UD_Iandps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0292 */ { UD_Iandpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0293 */ { UD_Iandnps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0294 */ { UD_Iandnpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0295 */ { UD_Iorps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0296 */ { UD_Iorpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0297 */ { UD_Ixorps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0298 */ { UD_Ixorpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0299 */ { UD_Iaddps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0300 */ { UD_Iaddsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0301 */ { UD_Iaddss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0302 */ { UD_Iaddpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0303 */ { UD_Imulps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0304 */ { UD_Imulsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0305 */ { UD_Imulss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0306 */ { UD_Imulpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0307 */ { UD_Icvtps2pd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0308 */ { UD_Icvtsd2ss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0309 */ { UD_Icvtss2sd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0310 */ { UD_Icvtpd2ps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0311 */ { UD_Icvtdq2ps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0312 */ { UD_Icvttps2dq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0313 */ { UD_Icvtps2dq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0314 */ { UD_Isubps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0315 */ { UD_Isubsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0316 */ { UD_Isubss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0317 */ { UD_Isubpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0318 */ { UD_Iminps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0319 */ { UD_Iminsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0320 */ { UD_Iminss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0321 */ { UD_Iminpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0322 */ { UD_Idivps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0323 */ { UD_Idivsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0324 */ { UD_Idivss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0325 */ { UD_Idivpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0326 */ { UD_Imaxps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0327 */ { UD_Imaxsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0328 */ { UD_Imaxss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0329 */ { UD_Imaxpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0330 */ { UD_Ipunpcklbw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0331 */ { UD_Ipunpcklbw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0332 */ { UD_Ipunpcklwd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0333 */ { UD_Ipunpcklwd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0334 */ { UD_Ipunpckldq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0335 */ { UD_Ipunpckldq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0336 */ { UD_Ipacksswb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0337 */ { UD_Ipacksswb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0338 */ { UD_Ipcmpgtb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0339 */ { UD_Ipcmpgtb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0340 */ { UD_Ipcmpgtw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0341 */ { UD_Ipcmpgtw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0342 */ { UD_Ipcmpgtd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0343 */ { UD_Ipcmpgtd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0344 */ { UD_Ipackuswb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0345 */ { UD_Ipackuswb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0346 */ { UD_Ipunpckhbw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0347 */ { UD_Ipunpckhbw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0348 */ { UD_Ipunpckhwd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0349 */ { UD_Ipunpckhwd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0350 */ { UD_Ipunpckhdq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0351 */ { UD_Ipunpckhdq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0352 */ { UD_Ipackssdw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0353 */ { UD_Ipackssdw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0354 */ { UD_Ipunpcklqdq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0355 */ { UD_Ipunpckhqdq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0356 */ { UD_Imovd, O_P, O_Ey, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0357 */ { UD_Imovd, O_V, O_Ey, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0358 */ { UD_Imovq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0359 */ { UD_Imovdqu, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0360 */ { UD_Imovdqa, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0361 */ { UD_Ipshufw, O_P, O_Q, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0362 */ { UD_Ipshuflw, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0363 */ { UD_Ipshufhw, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0364 */ { UD_Ipshufd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0365 */ { UD_Ipsrlw, O_N, O_Ib, O_NONE, P_none },
-  /* 0366 */ { UD_Ipsrlw, O_U, O_Ib, O_NONE, P_rexb },
-  /* 0367 */ { UD_Ipsraw, O_N, O_Ib, O_NONE, P_none },
-  /* 0368 */ { UD_Ipsraw, O_U, O_Ib, O_NONE, P_rexb },
-  /* 0369 */ { UD_Ipsllw, O_N, O_Ib, O_NONE, P_none },
-  /* 0370 */ { UD_Ipsllw, O_U, O_Ib, O_NONE, P_rexb },
-  /* 0371 */ { UD_Ipsrld, O_N, O_Ib, O_NONE, P_none },
-  /* 0372 */ { UD_Ipsrld, O_U, O_Ib, O_NONE, P_rexb },
-  /* 0373 */ { UD_Ipsrad, O_N, O_Ib, O_NONE, P_none },
-  /* 0374 */ { UD_Ipsrad, O_U, O_Ib, O_NONE, P_rexb },
-  /* 0375 */ { UD_Ipslld, O_N, O_Ib, O_NONE, P_none },
-  /* 0376 */ { UD_Ipslld, O_U, O_Ib, O_NONE, P_rexb },
-  /* 0377 */ { UD_Ipsrlq, O_N, O_Ib, O_NONE, P_none },
-  /* 0378 */ { UD_Ipsrlq, O_U, O_Ib, O_NONE, P_rexb },
-  /* 0379 */ { UD_Ipsrldq, O_U, O_Ib, O_NONE, P_rexb },
-  /* 0380 */ { UD_Ipsllq, O_N, O_Ib, O_NONE, P_none },
-  /* 0381 */ { UD_Ipsllq, O_U, O_Ib, O_NONE, P_rexb },
-  /* 0382 */ { UD_Ipslldq, O_U, O_Ib, O_NONE, P_rexb },
-  /* 0383 */ { UD_Ipcmpeqb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0384 */ { UD_Ipcmpeqb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0385 */ { UD_Ipcmpeqw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0386 */ { UD_Ipcmpeqw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0387 */ { UD_Ipcmpeqd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0388 */ { UD_Ipcmpeqd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0389 */ { UD_Iemms, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0390 */ { UD_Ivmread, O_Ey, O_Gy, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_def64 },
-  /* 0391 */ { UD_Ivmwrite, O_Gy, O_Ey, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_def64 },
-  /* 0392 */ { UD_Ihaddps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0393 */ { UD_Ihaddpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0394 */ { UD_Ihsubps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0395 */ { UD_Ihsubpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0396 */ { UD_Imovd, O_Ey, O_P, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0397 */ { UD_Imovq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0398 */ { UD_Imovd, O_Ey, O_V, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0399 */ { UD_Imovq, O_Q, O_P, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0400 */ { UD_Imovdqu, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0401 */ { UD_Imovdqa, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0402 */ { UD_Ijo, O_Jz, O_NONE, O_NONE, P_oso|P_def64 },
-  /* 0403 */ { UD_Ijno, O_Jz, O_NONE, O_NONE, P_oso|P_def64 },
-  /* 0404 */ { UD_Ijb, O_Jz, O_NONE, O_NONE, P_oso|P_def64 },
-  /* 0405 */ { UD_Ijae, O_Jz, O_NONE, O_NONE, P_oso|P_def64 },
-  /* 0406 */ { UD_Ijz, O_Jz, O_NONE, O_NONE, P_oso|P_def64 },
-  /* 0407 */ { UD_Ijnz, O_Jz, O_NONE, O_NONE, P_oso|P_def64 },
-  /* 0408 */ { UD_Ijbe, O_Jz, O_NONE, O_NONE, P_oso|P_def64 },
-  /* 0409 */ { UD_Ija, O_Jz, O_NONE, O_NONE, P_oso|P_def64 },
-  /* 0410 */ { UD_Ijs, O_Jz, O_NONE, O_NONE, P_oso|P_def64 },
-  /* 0411 */ { UD_Ijns, O_Jz, O_NONE, O_NONE, P_oso|P_def64 },
-  /* 0412 */ { UD_Ijp, O_Jz, O_NONE, O_NONE, P_oso|P_def64 },
-  /* 0413 */ { UD_Ijnp, O_Jz, O_NONE, O_NONE, P_oso|P_def64 },
-  /* 0414 */ { UD_Ijl, O_Jz, O_NONE, O_NONE, P_oso|P_def64 },
-  /* 0415 */ { UD_Ijge, O_Jz, O_NONE, O_NONE, P_oso|P_def64 },
-  /* 0416 */ { UD_Ijle, O_Jz, O_NONE, O_NONE, P_oso|P_def64 },
-  /* 0417 */ { UD_Ijg, O_Jz, O_NONE, O_NONE, P_oso|P_def64 },
-  /* 0418 */ { UD_Iseto, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0419 */ { UD_Isetno, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0420 */ { UD_Isetb, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0421 */ { UD_Isetae, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0422 */ { UD_Isetz, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0423 */ { UD_Isetnz, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0424 */ { UD_Isetbe, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0425 */ { UD_Iseta, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0426 */ { UD_Isets, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0427 */ { UD_Isetns, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0428 */ { UD_Isetp, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0429 */ { UD_Isetnp, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0430 */ { UD_Isetl, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0431 */ { UD_Isetge, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0432 */ { UD_Isetle, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0433 */ { UD_Isetg, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0434 */ { UD_Ipush, O_FS, O_NONE, O_NONE, P_none },
-  /* 0435 */ { UD_Ipop, O_FS, O_NONE, O_NONE, P_none },
-  /* 0436 */ { UD_Icpuid, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0437 */ { UD_Ibt, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0438 */ { UD_Ishld, O_Ev, O_Gv, O_Ib, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0439 */ { UD_Ishld, O_Ev, O_Gv, O_CL, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0440 */ { UD_Imontmul, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0441 */ { UD_Ixsha1, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0442 */ { UD_Ixsha256, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0443 */ { UD_Ixstore, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0444 */ { UD_Ixcryptecb, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0445 */ { UD_Ixcryptcbc, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0446 */ { UD_Ixcryptctr, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0447 */ { UD_Ixcryptcfb, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0448 */ { UD_Ixcryptofb, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0449 */ { UD_Ipush, O_GS, O_NONE, O_NONE, P_none },
-  /* 0450 */ { UD_Ipop, O_GS, O_NONE, O_NONE, P_none },
-  /* 0451 */ { UD_Irsm, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0452 */ { UD_Ibts, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0453 */ { UD_Ishrd, O_Ev, O_Gv, O_Ib, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0454 */ { UD_Ishrd, O_Ev, O_Gv, O_CL, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0455 */ { UD_Ifxsave, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0456 */ { UD_Ifxrstor, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0457 */ { UD_Ildmxcsr, O_Md, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0458 */ { UD_Istmxcsr, O_Md, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0459 */ { UD_Ixsave, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0460 */ { UD_Ixrstor, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0461 */ { UD_Iclflush, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0462 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0463 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0464 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0465 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0466 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0467 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0468 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0469 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0470 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0471 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0472 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0473 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0474 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0475 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0476 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0477 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0478 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0479 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0480 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0481 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0482 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0483 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0484 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0485 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0486 */ { UD_Iimul, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0487 */ { UD_Icmpxchg, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0488 */ { UD_Icmpxchg, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0489 */ { UD_Ilss, O_Gv, O_M, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0490 */ { UD_Ibtr, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0491 */ { UD_Ilfs, O_Gz, O_M, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0492 */ { UD_Ilgs, O_Gz, O_M, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0493 */ { UD_Imovzx, O_Gv, O_Eb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0494 */ { UD_Imovzx, O_Gy, O_Ew, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0495 */ { UD_Ipopcnt, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb },
-  /* 0496 */ { UD_Ibt, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0497 */ { UD_Ibts, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0498 */ { UD_Ibtr, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0499 */ { UD_Ibtc, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0500 */ { UD_Ibtc, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0501 */ { UD_Ibsf, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0502 */ { UD_Ibsr, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0503 */ { UD_Imovsx, O_Gv, O_Eb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0504 */ { UD_Imovsx, O_Gy, O_Ew, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0505 */ { UD_Ixadd, O_Eb, O_Gb, O_NONE, P_aso|P_oso|P_rexr|P_rexx|P_rexb },
-  /* 0506 */ { UD_Ixadd, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0507 */ { UD_Icmpps, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0508 */ { UD_Icmpsd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0509 */ { UD_Icmpss, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0510 */ { UD_Icmppd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0511 */ { UD_Imovnti, O_M, O_Gy, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0512 */ { UD_Ipinsrw, O_P, O_MwRy, O_Ib, P_aso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 },
-  /* 0513 */ { UD_Ipinsrw, O_V, O_MwRy, O_Ib, P_aso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 },
-  /* 0514 */ { UD_Ipextrw, O_Gd, O_N, O_Ib, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0515 */ { UD_Ipextrw, O_Gd, O_U, O_Ib, P_aso|P_rexr|P_rexb },
-  /* 0516 */ { UD_Ishufps, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0517 */ { UD_Ishufpd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0518 */ { UD_Icmpxchg8b, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0519 */ { UD_Icmpxchg8b, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0520 */ { UD_Icmpxchg16b, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0521 */ { UD_Ivmptrld, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0522 */ { UD_Ivmxon, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0523 */ { UD_Ivmclear, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0524 */ { UD_Ivmptrst, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0525 */ { UD_Ibswap, O_R0y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0526 */ { UD_Ibswap, O_R1y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0527 */ { UD_Ibswap, O_R2y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0528 */ { UD_Ibswap, O_R3y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0529 */ { UD_Ibswap, O_R4y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0530 */ { UD_Ibswap, O_R5y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0531 */ { UD_Ibswap, O_R6y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0532 */ { UD_Ibswap, O_R7y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0533 */ { UD_Iaddsubps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0534 */ { UD_Iaddsubpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0535 */ { UD_Ipsrlw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0536 */ { UD_Ipsrlw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0537 */ { UD_Ipsrld, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0538 */ { UD_Ipsrld, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0539 */ { UD_Ipsrlq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0540 */ { UD_Ipsrlq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0541 */ { UD_Ipaddq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0542 */ { UD_Ipaddq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0543 */ { UD_Ipmullw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0544 */ { UD_Ipmullw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0545 */ { UD_Imovdq2q, O_P, O_U, O_NONE, P_aso|P_rexb },
-  /* 0546 */ { UD_Imovq2dq, O_V, O_N, O_NONE, P_aso|P_rexr },
-  /* 0547 */ { UD_Imovq, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0548 */ { UD_Ipmovmskb, O_Gd, O_N, O_NONE, P_oso|P_rexr|P_rexb },
-  /* 0549 */ { UD_Ipmovmskb, O_Gd, O_U, O_NONE, P_rexr|P_rexb },
-  /* 0550 */ { UD_Ipsubusb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0551 */ { UD_Ipsubusb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0552 */ { UD_Ipsubusw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0553 */ { UD_Ipsubusw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0554 */ { UD_Ipminub, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0555 */ { UD_Ipminub, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0556 */ { UD_Ipand, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0557 */ { UD_Ipand, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0558 */ { UD_Ipaddusb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0559 */ { UD_Ipaddusb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0560 */ { UD_Ipaddusw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0561 */ { UD_Ipaddusw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0562 */ { UD_Ipmaxub, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0563 */ { UD_Ipmaxub, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0564 */ { UD_Ipandn, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0565 */ { UD_Ipandn, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0566 */ { UD_Ipavgb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0567 */ { UD_Ipavgb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0568 */ { UD_Ipsraw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0569 */ { UD_Ipsraw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0570 */ { UD_Ipsrad, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0571 */ { UD_Ipsrad, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0572 */ { UD_Ipavgw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0573 */ { UD_Ipavgw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0574 */ { UD_Ipmulhuw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0575 */ { UD_Ipmulhuw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0576 */ { UD_Ipmulhw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0577 */ { UD_Ipmulhw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0578 */ { UD_Icvtpd2dq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0579 */ { UD_Icvtdq2pd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0580 */ { UD_Icvttpd2dq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0581 */ { UD_Imovntq, O_M, O_P, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0582 */ { UD_Imovntdq, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0583 */ { UD_Ipsubsb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0584 */ { UD_Ipsubsb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0585 */ { UD_Ipsubsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0586 */ { UD_Ipsubsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0587 */ { UD_Ipminsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0588 */ { UD_Ipminsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0589 */ { UD_Ipor, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0590 */ { UD_Ipor, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0591 */ { UD_Ipaddsb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0592 */ { UD_Ipaddsb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0593 */ { UD_Ipaddsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0594 */ { UD_Ipaddsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0595 */ { UD_Ipmaxsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0596 */ { UD_Ipmaxsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0597 */ { UD_Ipxor, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0598 */ { UD_Ipxor, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0599 */ { UD_Ilddqu, O_V, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0600 */ { UD_Ipsllw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0601 */ { UD_Ipsllw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0602 */ { UD_Ipslld, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0603 */ { UD_Ipslld, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0604 */ { UD_Ipsllq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0605 */ { UD_Ipsllq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0606 */ { UD_Ipmuludq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0607 */ { UD_Ipmuludq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0608 */ { UD_Ipmaddwd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0609 */ { UD_Ipmaddwd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0610 */ { UD_Ipsadbw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0611 */ { UD_Ipsadbw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0612 */ { UD_Imaskmovq, O_P, O_N, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0613 */ { UD_Imaskmovdqu, O_V, O_U, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0614 */ { UD_Ipsubb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0615 */ { UD_Ipsubb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0616 */ { UD_Ipsubw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0617 */ { UD_Ipsubw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0618 */ { UD_Ipsubd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0619 */ { UD_Ipsubd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0620 */ { UD_Ipsubq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0621 */ { UD_Ipsubq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0622 */ { UD_Ipaddb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0623 */ { UD_Ipaddb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0624 */ { UD_Ipaddw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0625 */ { UD_Ipaddw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0626 */ { UD_Ipaddd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0627 */ { UD_Ipaddd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0628 */ { UD_Iadc, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0629 */ { UD_Iadc, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0630 */ { UD_Iadc, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0631 */ { UD_Iadc, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0632 */ { UD_Iadc, O_AL, O_Ib, O_NONE, P_none },
-  /* 0633 */ { UD_Iadc, O_rAX, O_sIz, O_NONE, P_oso|P_rexw },
-  /* 0634 */ { UD_Ipush, O_SS, O_NONE, O_NONE, P_inv64 },
-  /* 0635 */ { UD_Ipop, O_SS, O_NONE, O_NONE, P_inv64 },
-  /* 0636 */ { UD_Isbb, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0637 */ { UD_Isbb, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0638 */ { UD_Isbb, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0639 */ { UD_Isbb, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0640 */ { UD_Isbb, O_AL, O_Ib, O_NONE, P_none },
-  /* 0641 */ { UD_Isbb, O_rAX, O_sIz, O_NONE, P_oso|P_rexw },
-  /* 0642 */ { UD_Ipush, O_DS, O_NONE, O_NONE, P_inv64 },
-  /* 0643 */ { UD_Ipop, O_DS, O_NONE, O_NONE, P_inv64 },
-  /* 0644 */ { UD_Iand, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0645 */ { UD_Iand, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0646 */ { UD_Iand, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0647 */ { UD_Iand, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0648 */ { UD_Iand, O_AL, O_Ib, O_NONE, P_none },
-  /* 0649 */ { UD_Iand, O_rAX, O_sIz, O_NONE, P_oso|P_rexw },
-  /* 0650 */ { UD_Idaa, O_NONE, O_NONE, O_NONE, P_inv64 },
-  /* 0651 */ { UD_Isub, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0652 */ { UD_Isub, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0653 */ { UD_Isub, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0654 */ { UD_Isub, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0655 */ { UD_Isub, O_AL, O_Ib, O_NONE, P_none },
-  /* 0656 */ { UD_Isub, O_rAX, O_sIz, O_NONE, P_oso|P_rexw },
-  /* 0657 */ { UD_Idas, O_NONE, O_NONE, O_NONE, P_inv64 },
-  /* 0658 */ { UD_Ixor, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0659 */ { UD_Ixor, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0660 */ { UD_Ixor, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0661 */ { UD_Ixor, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0662 */ { UD_Ixor, O_AL, O_Ib, O_NONE, P_none },
-  /* 0663 */ { UD_Ixor, O_rAX, O_sIz, O_NONE, P_oso|P_rexw },
-  /* 0664 */ { UD_Iaaa, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0665 */ { UD_Icmp, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0666 */ { UD_Icmp, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0667 */ { UD_Icmp, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0668 */ { UD_Icmp, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0669 */ { UD_Icmp, O_AL, O_Ib, O_NONE, P_none },
-  /* 0670 */ { UD_Icmp, O_rAX, O_sIz, O_NONE, P_oso|P_rexw },
-  /* 0671 */ { UD_Iaas, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0672 */ { UD_Iinc, O_R0z, O_NONE, O_NONE, P_oso },
-  /* 0673 */ { UD_Iinc, O_R1z, O_NONE, O_NONE, P_oso },
-  /* 0674 */ { UD_Iinc, O_R2z, O_NONE, O_NONE, P_oso },
-  /* 0675 */ { UD_Iinc, O_R3z, O_NONE, O_NONE, P_oso },
-  /* 0676 */ { UD_Iinc, O_R4z, O_NONE, O_NONE, P_oso },
-  /* 0677 */ { UD_Iinc, O_R5z, O_NONE, O_NONE, P_oso },
-  /* 0678 */ { UD_Iinc, O_R6z, O_NONE, O_NONE, P_oso },
-  /* 0679 */ { UD_Iinc, O_R7z, O_NONE, O_NONE, P_oso },
-  /* 0680 */ { UD_Idec, O_R0z, O_NONE, O_NONE, P_oso },
-  /* 0681 */ { UD_Idec, O_R1z, O_NONE, O_NONE, P_oso },
-  /* 0682 */ { UD_Idec, O_R2z, O_NONE, O_NONE, P_oso },
-  /* 0683 */ { UD_Idec, O_R3z, O_NONE, O_NONE, P_oso },
-  /* 0684 */ { UD_Idec, O_R4z, O_NONE, O_NONE, P_oso },
-  /* 0685 */ { UD_Idec, O_R5z, O_NONE, O_NONE, P_oso },
-  /* 0686 */ { UD_Idec, O_R6z, O_NONE, O_NONE, P_oso },
-  /* 0687 */ { UD_Idec, O_R7z, O_NONE, O_NONE, P_oso },
-  /* 0688 */ { UD_Ipush, O_R0v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 },
-  /* 0689 */ { UD_Ipush, O_R1v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 },
-  /* 0690 */ { UD_Ipush, O_R2v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 },
-  /* 0691 */ { UD_Ipush, O_R3v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 },
-  /* 0692 */ { UD_Ipush, O_R4v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 },
-  /* 0693 */ { UD_Ipush, O_R5v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 },
-  /* 0694 */ { UD_Ipush, O_R6v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 },
-  /* 0695 */ { UD_Ipush, O_R7v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 },
-  /* 0696 */ { UD_Ipop, O_R0v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 },
-  /* 0697 */ { UD_Ipop, O_R1v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 },
-  /* 0698 */ { UD_Ipop, O_R2v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 },
-  /* 0699 */ { UD_Ipop, O_R3v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 },
-  /* 0700 */ { UD_Ipop, O_R4v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 },
-  /* 0701 */ { UD_Ipop, O_R5v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 },
-  /* 0702 */ { UD_Ipop, O_R6v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 },
-  /* 0703 */ { UD_Ipop, O_R7v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 },
-  /* 0704 */ { UD_Ipusha, O_NONE, O_NONE, O_NONE, P_oso|P_inv64 },
-  /* 0705 */ { UD_Ipushad, O_NONE, O_NONE, O_NONE, P_oso|P_inv64 },
-  /* 0706 */ { UD_Ipopa, O_NONE, O_NONE, O_NONE, P_oso|P_inv64 },
-  /* 0707 */ { UD_Ipopad, O_NONE, O_NONE, O_NONE, P_oso|P_inv64 },
-  /* 0708 */ { UD_Ibound, O_Gv, O_M, O_NONE, P_aso|P_oso },
-  /* 0709 */ { UD_Iarpl, O_Ew, O_Gw, O_NONE, P_aso },
-  /* 0710 */ { UD_Imovsxd, O_Gq, O_Ed, O_NONE, P_aso|P_oso|P_rexw|P_rexx|P_rexr|P_rexb },
-  /* 0711 */ { UD_Ipush, O_sIz, O_NONE, O_NONE, P_oso|P_def64 },
-  /* 0712 */ { UD_Iimul, O_Gv, O_Ev, O_Iz, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0713 */ { UD_Ipush, O_sIb, O_NONE, O_NONE, P_oso|P_def64 },
-  /* 0714 */ { UD_Iimul, O_Gv, O_Ev, O_sIb, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0715 */ { UD_Iinsb, O_NONE, O_NONE, O_NONE, P_str|P_seg },
-  /* 0716 */ { UD_Iinsw, O_NONE, O_NONE, O_NONE, P_str|P_oso|P_seg },
-  /* 0717 */ { UD_Iinsd, O_NONE, O_NONE, O_NONE, P_str|P_oso|P_seg },
-  /* 0718 */ { UD_Ioutsb, O_NONE, O_NONE, O_NONE, P_str|P_seg },
-  /* 0719 */ { UD_Ioutsw, O_NONE, O_NONE, O_NONE, P_str|P_oso|P_seg },
-  /* 0720 */ { UD_Ioutsd, O_NONE, O_NONE, O_NONE, P_str|P_oso|P_seg },
-  /* 0721 */ { UD_Ijo, O_Jb, O_NONE, O_NONE, P_none },
-  /* 0722 */ { UD_Ijno, O_Jb, O_NONE, O_NONE, P_none },
-  /* 0723 */ { UD_Ijb, O_Jb, O_NONE, O_NONE, P_none },
-  /* 0724 */ { UD_Ijae, O_Jb, O_NONE, O_NONE, P_none },
-  /* 0725 */ { UD_Ijz, O_Jb, O_NONE, O_NONE, P_none },
-  /* 0726 */ { UD_Ijnz, O_Jb, O_NONE, O_NONE, P_none },
-  /* 0727 */ { UD_Ijbe, O_Jb, O_NONE, O_NONE, P_none },
-  /* 0728 */ { UD_Ija, O_Jb, O_NONE, O_NONE, P_none },
-  /* 0729 */ { UD_Ijs, O_Jb, O_NONE, O_NONE, P_none },
-  /* 0730 */ { UD_Ijns, O_Jb, O_NONE, O_NONE, P_none },
-  /* 0731 */ { UD_Ijp, O_Jb, O_NONE, O_NONE, P_none },
-  /* 0732 */ { UD_Ijnp, O_Jb, O_NONE, O_NONE, P_none },
-  /* 0733 */ { UD_Ijl, O_Jb, O_NONE, O_NONE, P_none },
-  /* 0734 */ { UD_Ijge, O_Jb, O_NONE, O_NONE, P_none },
-  /* 0735 */ { UD_Ijle, O_Jb, O_NONE, O_NONE, P_none },
-  /* 0736 */ { UD_Ijg, O_Jb, O_NONE, O_NONE, P_none },
-  /* 0737 */ { UD_Iadd, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0738 */ { UD_Ior, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0739 */ { UD_Iadc, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0740 */ { UD_Isbb, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0741 */ { UD_Iand, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0742 */ { UD_Isub, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0743 */ { UD_Ixor, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0744 */ { UD_Icmp, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0745 */ { UD_Iadd, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0746 */ { UD_Ior, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0747 */ { UD_Iadc, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0748 */ { UD_Isbb, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0749 */ { UD_Iand, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0750 */ { UD_Isub, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0751 */ { UD_Ixor, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0752 */ { UD_Icmp, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0753 */ { UD_Iadd, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 },
-  /* 0754 */ { UD_Ior, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0755 */ { UD_Iadc, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 },
-  /* 0756 */ { UD_Isbb, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 },
-  /* 0757 */ { UD_Iand, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 },
-  /* 0758 */ { UD_Isub, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 },
-  /* 0759 */ { UD_Ixor, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 },
-  /* 0760 */ { UD_Icmp, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 },
-  /* 0761 */ { UD_Iadd, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0762 */ { UD_Ior, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0763 */ { UD_Iadc, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0764 */ { UD_Isbb, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0765 */ { UD_Iand, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0766 */ { UD_Isub, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0767 */ { UD_Ixor, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0768 */ { UD_Icmp, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0769 */ { UD_Itest, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0770 */ { UD_Itest, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0771 */ { UD_Ixchg, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0772 */ { UD_Ixchg, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0773 */ { UD_Imov, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0774 */ { UD_Imov, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0775 */ { UD_Imov, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0776 */ { UD_Imov, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0777 */ { UD_Imov, O_MwRv, O_S, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0778 */ { UD_Ilea, O_Gv, O_M, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0779 */ { UD_Imov, O_S, O_MwRv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0780 */ { UD_Ipop, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 },
-  /* 0781 */ { UD_Ixchg, O_R0v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0782 */ { UD_Ixchg, O_R1v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0783 */ { UD_Ixchg, O_R2v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0784 */ { UD_Ixchg, O_R3v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0785 */ { UD_Ixchg, O_R4v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0786 */ { UD_Ixchg, O_R5v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0787 */ { UD_Ixchg, O_R6v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0788 */ { UD_Ixchg, O_R7v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0789 */ { UD_Icbw, O_NONE, O_NONE, O_NONE, P_oso|P_rexw },
-  /* 0790 */ { UD_Icwde, O_NONE, O_NONE, O_NONE, P_oso|P_rexw },
-  /* 0791 */ { UD_Icdqe, O_NONE, O_NONE, O_NONE, P_oso|P_rexw },
-  /* 0792 */ { UD_Icwd, O_NONE, O_NONE, O_NONE, P_oso|P_rexw },
-  /* 0793 */ { UD_Icdq, O_NONE, O_NONE, O_NONE, P_oso|P_rexw },
-  /* 0794 */ { UD_Icqo, O_NONE, O_NONE, O_NONE, P_oso|P_rexw },
-  /* 0795 */ { UD_Icall, O_Av, O_NONE, O_NONE, P_oso },
-  /* 0796 */ { UD_Iwait, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0797 */ { UD_Ipushfw, O_NONE, O_NONE, O_NONE, P_oso },
-  /* 0798 */ { UD_Ipushfw, O_NONE, O_NONE, O_NONE, P_oso|P_rexw|P_def64 },
-  /* 0799 */ { UD_Ipushfd, O_NONE, O_NONE, O_NONE, P_oso },
-  /* 0800 */ { UD_Ipushfq, O_NONE, O_NONE, O_NONE, P_oso|P_rexw|P_def64 },
-  /* 0801 */ { UD_Ipushfq, O_NONE, O_NONE, O_NONE, P_oso|P_rexw|P_def64 },
-  /* 0802 */ { UD_Ipopfw, O_NONE, O_NONE, O_NONE, P_oso },
-  /* 0803 */ { UD_Ipopfd, O_NONE, O_NONE, O_NONE, P_oso },
-  /* 0804 */ { UD_Ipopfq, O_NONE, O_NONE, O_NONE, P_oso|P_def64 },
-  /* 0805 */ { UD_Ipopfq, O_NONE, O_NONE, O_NONE, P_oso|P_def64 },
-  /* 0806 */ { UD_Isahf, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0807 */ { UD_Ilahf, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0808 */ { UD_Imov, O_AL, O_Ob, O_NONE, P_none },
-  /* 0809 */ { UD_Imov, O_rAX, O_Ov, O_NONE, P_aso|P_oso|P_rexw },
-  /* 0810 */ { UD_Imov, O_Ob, O_AL, O_NONE, P_none },
-  /* 0811 */ { UD_Imov, O_Ov, O_rAX, O_NONE, P_aso|P_oso|P_rexw },
-  /* 0812 */ { UD_Imovsb, O_NONE, O_NONE, O_NONE, P_str|P_seg },
-  /* 0813 */ { UD_Imovsw, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw },
-  /* 0814 */ { UD_Imovsd, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw },
-  /* 0815 */ { UD_Imovsq, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw },
-  /* 0816 */ { UD_Icmpsb, O_NONE, O_NONE, O_NONE, P_strz|P_seg },
-  /* 0817 */ { UD_Icmpsw, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw|P_seg },
-  /* 0818 */ { UD_Icmpsd, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw|P_seg },
-  /* 0819 */ { UD_Icmpsq, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw|P_seg },
-  /* 0820 */ { UD_Itest, O_AL, O_Ib, O_NONE, P_none },
-  /* 0821 */ { UD_Itest, O_rAX, O_sIz, O_NONE, P_oso|P_rexw },
-  /* 0822 */ { UD_Istosb, O_NONE, O_NONE, O_NONE, P_str|P_seg },
-  /* 0823 */ { UD_Istosw, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw },
-  /* 0824 */ { UD_Istosd, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw },
-  /* 0825 */ { UD_Istosq, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw },
-  /* 0826 */ { UD_Ilodsb, O_NONE, O_NONE, O_NONE, P_str|P_seg },
-  /* 0827 */ { UD_Ilodsw, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw },
-  /* 0828 */ { UD_Ilodsd, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw },
-  /* 0829 */ { UD_Ilodsq, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw },
-  /* 0830 */ { UD_Iscasb, O_NONE, O_NONE, O_NONE, P_strz },
-  /* 0831 */ { UD_Iscasw, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw },
-  /* 0832 */ { UD_Iscasd, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw },
-  /* 0833 */ { UD_Iscasq, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw },
-  /* 0834 */ { UD_Imov, O_R0b, O_Ib, O_NONE, P_rexb },
-  /* 0835 */ { UD_Imov, O_R1b, O_Ib, O_NONE, P_rexb },
-  /* 0836 */ { UD_Imov, O_R2b, O_Ib, O_NONE, P_rexb },
-  /* 0837 */ { UD_Imov, O_R3b, O_Ib, O_NONE, P_rexb },
-  /* 0838 */ { UD_Imov, O_R4b, O_Ib, O_NONE, P_rexb },
-  /* 0839 */ { UD_Imov, O_R5b, O_Ib, O_NONE, P_rexb },
-  /* 0840 */ { UD_Imov, O_R6b, O_Ib, O_NONE, P_rexb },
-  /* 0841 */ { UD_Imov, O_R7b, O_Ib, O_NONE, P_rexb },
-  /* 0842 */ { UD_Imov, O_R0v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0843 */ { UD_Imov, O_R1v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0844 */ { UD_Imov, O_R2v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0845 */ { UD_Imov, O_R3v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0846 */ { UD_Imov, O_R4v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0847 */ { UD_Imov, O_R5v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0848 */ { UD_Imov, O_R6v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0849 */ { UD_Imov, O_R7v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb },
-  /* 0850 */ { UD_Irol, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0851 */ { UD_Iror, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0852 */ { UD_Ircl, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0853 */ { UD_Ircr, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0854 */ { UD_Ishl, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0855 */ { UD_Ishr, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0856 */ { UD_Ishl, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0857 */ { UD_Isar, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0858 */ { UD_Irol, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0859 */ { UD_Iror, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0860 */ { UD_Ircl, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0861 */ { UD_Ircr, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0862 */ { UD_Ishl, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0863 */ { UD_Ishr, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0864 */ { UD_Ishl, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0865 */ { UD_Isar, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0866 */ { UD_Iret, O_Iw, O_NONE, O_NONE, P_none },
-  /* 0867 */ { UD_Iret, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0868 */ { UD_Iles, O_Gv, O_M, O_NONE, P_aso|P_oso },
-  /* 0869 */ { UD_Ilds, O_Gv, O_M, O_NONE, P_aso|P_oso },
-  /* 0870 */ { UD_Imov, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0871 */ { UD_Imov, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0872 */ { UD_Ienter, O_Iw, O_Ib, O_NONE, P_def64 },
-  /* 0873 */ { UD_Ileave, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0874 */ { UD_Iretf, O_Iw, O_NONE, O_NONE, P_none },
-  /* 0875 */ { UD_Iretf, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0876 */ { UD_Iint3, O_NONE, O_NONE, O_NONE, P_none },
-  /* 0877 */ { UD_Iint, O_Ib, O_NONE, O_NONE, P_none },
-  /* 0878 */ { UD_Iinto, O_NONE, O_NONE, O_NONE, P_inv64 },
-  /* 0879 */ { UD_Iiretw, O_NONE, O_NONE, O_NONE, P_oso|P_rexw },
-  /* 0880 */ { UD_Iiretd, O_NONE, O_NONE, O_NONE, P_oso|P_rexw },
-  /* 0881 */ { UD_Iiretq, O_NONE, O_NONE, O_NONE, P_oso|P_rexw },
-  /* 0882 */ { UD_Irol, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0883 */ { UD_Iror, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0884 */ { UD_Ircl, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0885 */ { UD_Ircr, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0886 */ { UD_Ishl, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0887 */ { UD_Ishr, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0888 */ { UD_Ishl, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0889 */ { UD_Isar, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0890 */ { UD_Irol, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0891 */ { UD_Iror, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0892 */ { UD_Ircl, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0893 */ { UD_Ircr, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0894 */ { UD_Ishl, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0895 */ { UD_Ishr, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0896 */ { UD_Ishl, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0897 */ { UD_Isar, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0898 */ { UD_Irol, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0899 */ { UD_Iror, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0900 */ { UD_Ircl, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0901 */ { UD_Ircr, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0902 */ { UD_Ishl, O_Eb, O_CL, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0903 */ { UD_Ishr, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0904 */ { UD_Ishl, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0905 */ { UD_Isar, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0906 */ { UD_Irol, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0907 */ { UD_Iror, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0908 */ { UD_Ircl, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0909 */ { UD_Ircr, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0910 */ { UD_Ishl, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0911 */ { UD_Ishr, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0912 */ { UD_Ishl, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0913 */ { UD_Isar, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 0914 */ { UD_Iaam, O_Ib, O_NONE, O_NONE, P_none },
-  /* 0915 */ { UD_Iaad, O_Ib, O_NONE, O_NONE, P_none },
-  /* 0916 */ { UD_Isalc, O_NONE, O_NONE, O_NONE, P_inv64 },
-  /* 0917 */ { UD_Ixlatb, O_NONE, O_NONE, O_NONE, P_rexw|P_seg },
-  /* 0918 */ { UD_Ifadd, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0919 */ { UD_Ifmul, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0920 */ { UD_Ifcom, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0921 */ { UD_Ifcomp, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0922 */ { UD_Ifsub, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0923 */ { UD_Ifsubr, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0924 */ { UD_Ifdiv, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0925 */ { UD_Ifdivr, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0926 */ { UD_Ifadd, O_ST0, O_ST0, O_NONE, P_none },
-  /* 0927 */ { UD_Ifadd, O_ST0, O_ST1, O_NONE, P_none },
-  /* 0928 */ { UD_Ifadd, O_ST0, O_ST2, O_NONE, P_none },
-  /* 0929 */ { UD_Ifadd, O_ST0, O_ST3, O_NONE, P_none },
-  /* 0930 */ { UD_Ifadd, O_ST0, O_ST4, O_NONE, P_none },
-  /* 0931 */ { UD_Ifadd, O_ST0, O_ST5, O_NONE, P_none },
-  /* 0932 */ { UD_Ifadd, O_ST0, O_ST6, O_NONE, P_none },
-  /* 0933 */ { UD_Ifadd, O_ST0, O_ST7, O_NONE, P_none },
-  /* 0934 */ { UD_Ifmul, O_ST0, O_ST0, O_NONE, P_none },
-  /* 0935 */ { UD_Ifmul, O_ST0, O_ST1, O_NONE, P_none },
-  /* 0936 */ { UD_Ifmul, O_ST0, O_ST2, O_NONE, P_none },
-  /* 0937 */ { UD_Ifmul, O_ST0, O_ST3, O_NONE, P_none },
-  /* 0938 */ { UD_Ifmul, O_ST0, O_ST4, O_NONE, P_none },
-  /* 0939 */ { UD_Ifmul, O_ST0, O_ST5, O_NONE, P_none },
-  /* 0940 */ { UD_Ifmul, O_ST0, O_ST6, O_NONE, P_none },
-  /* 0941 */ { UD_Ifmul, O_ST0, O_ST7, O_NONE, P_none },
-  /* 0942 */ { UD_Ifcom, O_ST0, O_ST0, O_NONE, P_none },
-  /* 0943 */ { UD_Ifcom, O_ST0, O_ST1, O_NONE, P_none },
-  /* 0944 */ { UD_Ifcom, O_ST0, O_ST2, O_NONE, P_none },
-  /* 0945 */ { UD_Ifcom, O_ST0, O_ST3, O_NONE, P_none },
-  /* 0946 */ { UD_Ifcom, O_ST0, O_ST4, O_NONE, P_none },
-  /* 0947 */ { UD_Ifcom, O_ST0, O_ST5, O_NONE, P_none },
-  /* 0948 */ { UD_Ifcom, O_ST0, O_ST6, O_NONE, P_none },
-  /* 0949 */ { UD_Ifcom, O_ST0, O_ST7, O_NONE, P_none },
-  /* 0950 */ { UD_Ifcomp, O_ST0, O_ST0, O_NONE, P_none },
-  /* 0951 */ { UD_Ifcomp, O_ST0, O_ST1, O_NONE, P_none },
-  /* 0952 */ { UD_Ifcomp, O_ST0, O_ST2, O_NONE, P_none },
-  /* 0953 */ { UD_Ifcomp, O_ST0, O_ST3, O_NONE, P_none },
-  /* 0954 */ { UD_Ifcomp, O_ST0, O_ST4, O_NONE, P_none },
-  /* 0955 */ { UD_Ifcomp, O_ST0, O_ST5, O_NONE, P_none },
-  /* 0956 */ { UD_Ifcomp, O_ST0, O_ST6, O_NONE, P_none },
-  /* 0957 */ { UD_Ifcomp, O_ST0, O_ST7, O_NONE, P_none },
-  /* 0958 */ { UD_Ifsub, O_ST0, O_ST0, O_NONE, P_none },
-  /* 0959 */ { UD_Ifsub, O_ST0, O_ST1, O_NONE, P_none },
-  /* 0960 */ { UD_Ifsub, O_ST0, O_ST2, O_NONE, P_none },
-  /* 0961 */ { UD_Ifsub, O_ST0, O_ST3, O_NONE, P_none },
-  /* 0962 */ { UD_Ifsub, O_ST0, O_ST4, O_NONE, P_none },
-  /* 0963 */ { UD_Ifsub, O_ST0, O_ST5, O_NONE, P_none },
-  /* 0964 */ { UD_Ifsub, O_ST0, O_ST6, O_NONE, P_none },
-  /* 0965 */ { UD_Ifsub, O_ST0, O_ST7, O_NONE, P_none },
-  /* 0966 */ { UD_Ifsubr, O_ST0, O_ST0, O_NONE, P_none },
-  /* 0967 */ { UD_Ifsubr, O_ST0, O_ST1, O_NONE, P_none },
-  /* 0968 */ { UD_Ifsubr, O_ST0, O_ST2, O_NONE, P_none },
-  /* 0969 */ { UD_Ifsubr, O_ST0, O_ST3, O_NONE, P_none },
-  /* 0970 */ { UD_Ifsubr, O_ST0, O_ST4, O_NONE, P_none },
-  /* 0971 */ { UD_Ifsubr, O_ST0, O_ST5, O_NONE, P_none },
-  /* 0972 */ { UD_Ifsubr, O_ST0, O_ST6, O_NONE, P_none },
-  /* 0973 */ { UD_Ifsubr, O_ST0, O_ST7, O_NONE, P_none },
-  /* 0974 */ { UD_Ifdiv, O_ST0, O_ST0, O_NONE, P_none },
-  /* 0975 */ { UD_Ifdiv, O_ST0, O_ST1, O_NONE, P_none },
-  /* 0976 */ { UD_Ifdiv, O_ST0, O_ST2, O_NONE, P_none },
-  /* 0977 */ { UD_Ifdiv, O_ST0, O_ST3, O_NONE, P_none },
-  /* 0978 */ { UD_Ifdiv, O_ST0, O_ST4, O_NONE, P_none },
-  /* 0979 */ { UD_Ifdiv, O_ST0, O_ST5, O_NONE, P_none },
-  /* 0980 */ { UD_Ifdiv, O_ST0, O_ST6, O_NONE, P_none },
-  /* 0981 */ { UD_Ifdiv, O_ST0, O_ST7, O_NONE, P_none },
-  /* 0982 */ { UD_Ifdivr, O_ST0, O_ST0, O_NONE, P_none },
-  /* 0983 */ { UD_Ifdivr, O_ST0, O_ST1, O_NONE, P_none },
-  /* 0984 */ { UD_Ifdivr, O_ST0, O_ST2, O_NONE, P_none },
-  /* 0985 */ { UD_Ifdivr, O_ST0, O_ST3, O_NONE, P_none },
-  /* 0986 */ { UD_Ifdivr, O_ST0, O_ST4, O_NONE, P_none },
-  /* 0987 */ { UD_Ifdivr, O_ST0, O_ST5, O_NONE, P_none },
-  /* 0988 */ { UD_Ifdivr, O_ST0, O_ST6, O_NONE, P_none },
-  /* 0989 */ { UD_Ifdivr, O_ST0, O_ST7, O_NONE, P_none },
-  /* 0990 */ { UD_Ifld, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0991 */ { UD_Ifst, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0992 */ { UD_Ifstp, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0993 */ { UD_Ifldenv, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0994 */ { UD_Ifldcw, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0995 */ { UD_Ifnstenv, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0996 */ { UD_Ifnstcw, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 0997 */ { UD_Ifld, O_ST0, O_NONE, O_NONE, P_none },
-  /* 0998 */ { UD_Ifld, O_ST1, O_NONE, O_NONE, P_none },
-  /* 0999 */ { UD_Ifld, O_ST2, O_NONE, O_NONE, P_none },
-  /* 1000 */ { UD_Ifld, O_ST3, O_NONE, O_NONE, P_none },
-  /* 1001 */ { UD_Ifld, O_ST4, O_NONE, O_NONE, P_none },
-  /* 1002 */ { UD_Ifld, O_ST5, O_NONE, O_NONE, P_none },
-  /* 1003 */ { UD_Ifld, O_ST6, O_NONE, O_NONE, P_none },
-  /* 1004 */ { UD_Ifld, O_ST7, O_NONE, O_NONE, P_none },
-  /* 1005 */ { UD_Ifxch, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1006 */ { UD_Ifxch, O_ST0, O_ST1, O_NONE, P_none },
-  /* 1007 */ { UD_Ifxch, O_ST0, O_ST2, O_NONE, P_none },
-  /* 1008 */ { UD_Ifxch, O_ST0, O_ST3, O_NONE, P_none },
-  /* 1009 */ { UD_Ifxch, O_ST0, O_ST4, O_NONE, P_none },
-  /* 1010 */ { UD_Ifxch, O_ST0, O_ST5, O_NONE, P_none },
-  /* 1011 */ { UD_Ifxch, O_ST0, O_ST6, O_NONE, P_none },
-  /* 1012 */ { UD_Ifxch, O_ST0, O_ST7, O_NONE, P_none },
-  /* 1013 */ { UD_Ifnop, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1014 */ { UD_Ifstp1, O_ST0, O_NONE, O_NONE, P_none },
-  /* 1015 */ { UD_Ifstp1, O_ST1, O_NONE, O_NONE, P_none },
-  /* 1016 */ { UD_Ifstp1, O_ST2, O_NONE, O_NONE, P_none },
-  /* 1017 */ { UD_Ifstp1, O_ST3, O_NONE, O_NONE, P_none },
-  /* 1018 */ { UD_Ifstp1, O_ST4, O_NONE, O_NONE, P_none },
-  /* 1019 */ { UD_Ifstp1, O_ST5, O_NONE, O_NONE, P_none },
-  /* 1020 */ { UD_Ifstp1, O_ST6, O_NONE, O_NONE, P_none },
-  /* 1021 */ { UD_Ifstp1, O_ST7, O_NONE, O_NONE, P_none },
-  /* 1022 */ { UD_Ifchs, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1023 */ { UD_Ifabs, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1024 */ { UD_Iftst, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1025 */ { UD_Ifxam, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1026 */ { UD_Ifld1, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1027 */ { UD_Ifldl2t, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1028 */ { UD_Ifldl2e, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1029 */ { UD_Ifldpi, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1030 */ { UD_Ifldlg2, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1031 */ { UD_Ifldln2, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1032 */ { UD_Ifldz, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1033 */ { UD_If2xm1, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1034 */ { UD_Ifyl2x, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1035 */ { UD_Ifptan, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1036 */ { UD_Ifpatan, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1037 */ { UD_Ifxtract, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1038 */ { UD_Ifprem1, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1039 */ { UD_Ifdecstp, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1040 */ { UD_Ifincstp, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1041 */ { UD_Ifprem, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1042 */ { UD_Ifyl2xp1, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1043 */ { UD_Ifsqrt, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1044 */ { UD_Ifsincos, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1045 */ { UD_Ifrndint, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1046 */ { UD_Ifscale, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1047 */ { UD_Ifsin, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1048 */ { UD_Ifcos, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1049 */ { UD_Ifiadd, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1050 */ { UD_Ifimul, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1051 */ { UD_Ificom, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1052 */ { UD_Ificomp, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1053 */ { UD_Ifisub, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1054 */ { UD_Ifisubr, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1055 */ { UD_Ifidiv, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1056 */ { UD_Ifidivr, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1057 */ { UD_Ifcmovb, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1058 */ { UD_Ifcmovb, O_ST0, O_ST1, O_NONE, P_none },
-  /* 1059 */ { UD_Ifcmovb, O_ST0, O_ST2, O_NONE, P_none },
-  /* 1060 */ { UD_Ifcmovb, O_ST0, O_ST3, O_NONE, P_none },
-  /* 1061 */ { UD_Ifcmovb, O_ST0, O_ST4, O_NONE, P_none },
-  /* 1062 */ { UD_Ifcmovb, O_ST0, O_ST5, O_NONE, P_none },
-  /* 1063 */ { UD_Ifcmovb, O_ST0, O_ST6, O_NONE, P_none },
-  /* 1064 */ { UD_Ifcmovb, O_ST0, O_ST7, O_NONE, P_none },
-  /* 1065 */ { UD_Ifcmove, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1066 */ { UD_Ifcmove, O_ST0, O_ST1, O_NONE, P_none },
-  /* 1067 */ { UD_Ifcmove, O_ST0, O_ST2, O_NONE, P_none },
-  /* 1068 */ { UD_Ifcmove, O_ST0, O_ST3, O_NONE, P_none },
-  /* 1069 */ { UD_Ifcmove, O_ST0, O_ST4, O_NONE, P_none },
-  /* 1070 */ { UD_Ifcmove, O_ST0, O_ST5, O_NONE, P_none },
-  /* 1071 */ { UD_Ifcmove, O_ST0, O_ST6, O_NONE, P_none },
-  /* 1072 */ { UD_Ifcmove, O_ST0, O_ST7, O_NONE, P_none },
-  /* 1073 */ { UD_Ifcmovbe, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1074 */ { UD_Ifcmovbe, O_ST0, O_ST1, O_NONE, P_none },
-  /* 1075 */ { UD_Ifcmovbe, O_ST0, O_ST2, O_NONE, P_none },
-  /* 1076 */ { UD_Ifcmovbe, O_ST0, O_ST3, O_NONE, P_none },
-  /* 1077 */ { UD_Ifcmovbe, O_ST0, O_ST4, O_NONE, P_none },
-  /* 1078 */ { UD_Ifcmovbe, O_ST0, O_ST5, O_NONE, P_none },
-  /* 1079 */ { UD_Ifcmovbe, O_ST0, O_ST6, O_NONE, P_none },
-  /* 1080 */ { UD_Ifcmovbe, O_ST0, O_ST7, O_NONE, P_none },
-  /* 1081 */ { UD_Ifcmovu, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1082 */ { UD_Ifcmovu, O_ST0, O_ST1, O_NONE, P_none },
-  /* 1083 */ { UD_Ifcmovu, O_ST0, O_ST2, O_NONE, P_none },
-  /* 1084 */ { UD_Ifcmovu, O_ST0, O_ST3, O_NONE, P_none },
-  /* 1085 */ { UD_Ifcmovu, O_ST0, O_ST4, O_NONE, P_none },
-  /* 1086 */ { UD_Ifcmovu, O_ST0, O_ST5, O_NONE, P_none },
-  /* 1087 */ { UD_Ifcmovu, O_ST0, O_ST6, O_NONE, P_none },
-  /* 1088 */ { UD_Ifcmovu, O_ST0, O_ST7, O_NONE, P_none },
-  /* 1089 */ { UD_Ifucompp, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1090 */ { UD_Ifild, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1091 */ { UD_Ifisttp, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1092 */ { UD_Ifist, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1093 */ { UD_Ifistp, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1094 */ { UD_Ifld, O_Mt, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1095 */ { UD_Ifstp, O_Mt, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1096 */ { UD_Ifcmovnb, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1097 */ { UD_Ifcmovnb, O_ST0, O_ST1, O_NONE, P_none },
-  /* 1098 */ { UD_Ifcmovnb, O_ST0, O_ST2, O_NONE, P_none },
-  /* 1099 */ { UD_Ifcmovnb, O_ST0, O_ST3, O_NONE, P_none },
-  /* 1100 */ { UD_Ifcmovnb, O_ST0, O_ST4, O_NONE, P_none },
-  /* 1101 */ { UD_Ifcmovnb, O_ST0, O_ST5, O_NONE, P_none },
-  /* 1102 */ { UD_Ifcmovnb, O_ST0, O_ST6, O_NONE, P_none },
-  /* 1103 */ { UD_Ifcmovnb, O_ST0, O_ST7, O_NONE, P_none },
-  /* 1104 */ { UD_Ifcmovne, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1105 */ { UD_Ifcmovne, O_ST0, O_ST1, O_NONE, P_none },
-  /* 1106 */ { UD_Ifcmovne, O_ST0, O_ST2, O_NONE, P_none },
-  /* 1107 */ { UD_Ifcmovne, O_ST0, O_ST3, O_NONE, P_none },
-  /* 1108 */ { UD_Ifcmovne, O_ST0, O_ST4, O_NONE, P_none },
-  /* 1109 */ { UD_Ifcmovne, O_ST0, O_ST5, O_NONE, P_none },
-  /* 1110 */ { UD_Ifcmovne, O_ST0, O_ST6, O_NONE, P_none },
-  /* 1111 */ { UD_Ifcmovne, O_ST0, O_ST7, O_NONE, P_none },
-  /* 1112 */ { UD_Ifcmovnbe, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1113 */ { UD_Ifcmovnbe, O_ST0, O_ST1, O_NONE, P_none },
-  /* 1114 */ { UD_Ifcmovnbe, O_ST0, O_ST2, O_NONE, P_none },
-  /* 1115 */ { UD_Ifcmovnbe, O_ST0, O_ST3, O_NONE, P_none },
-  /* 1116 */ { UD_Ifcmovnbe, O_ST0, O_ST4, O_NONE, P_none },
-  /* 1117 */ { UD_Ifcmovnbe, O_ST0, O_ST5, O_NONE, P_none },
-  /* 1118 */ { UD_Ifcmovnbe, O_ST0, O_ST6, O_NONE, P_none },
-  /* 1119 */ { UD_Ifcmovnbe, O_ST0, O_ST7, O_NONE, P_none },
-  /* 1120 */ { UD_Ifcmovnu, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1121 */ { UD_Ifcmovnu, O_ST0, O_ST1, O_NONE, P_none },
-  /* 1122 */ { UD_Ifcmovnu, O_ST0, O_ST2, O_NONE, P_none },
-  /* 1123 */ { UD_Ifcmovnu, O_ST0, O_ST3, O_NONE, P_none },
-  /* 1124 */ { UD_Ifcmovnu, O_ST0, O_ST4, O_NONE, P_none },
-  /* 1125 */ { UD_Ifcmovnu, O_ST0, O_ST5, O_NONE, P_none },
-  /* 1126 */ { UD_Ifcmovnu, O_ST0, O_ST6, O_NONE, P_none },
-  /* 1127 */ { UD_Ifcmovnu, O_ST0, O_ST7, O_NONE, P_none },
-  /* 1128 */ { UD_Ifclex, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1129 */ { UD_Ifninit, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1130 */ { UD_Ifucomi, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1131 */ { UD_Ifucomi, O_ST0, O_ST1, O_NONE, P_none },
-  /* 1132 */ { UD_Ifucomi, O_ST0, O_ST2, O_NONE, P_none },
-  /* 1133 */ { UD_Ifucomi, O_ST0, O_ST3, O_NONE, P_none },
-  /* 1134 */ { UD_Ifucomi, O_ST0, O_ST4, O_NONE, P_none },
-  /* 1135 */ { UD_Ifucomi, O_ST0, O_ST5, O_NONE, P_none },
-  /* 1136 */ { UD_Ifucomi, O_ST0, O_ST6, O_NONE, P_none },
-  /* 1137 */ { UD_Ifucomi, O_ST0, O_ST7, O_NONE, P_none },
-  /* 1138 */ { UD_Ifcomi, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1139 */ { UD_Ifcomi, O_ST0, O_ST1, O_NONE, P_none },
-  /* 1140 */ { UD_Ifcomi, O_ST0, O_ST2, O_NONE, P_none },
-  /* 1141 */ { UD_Ifcomi, O_ST0, O_ST3, O_NONE, P_none },
-  /* 1142 */ { UD_Ifcomi, O_ST0, O_ST4, O_NONE, P_none },
-  /* 1143 */ { UD_Ifcomi, O_ST0, O_ST5, O_NONE, P_none },
-  /* 1144 */ { UD_Ifcomi, O_ST0, O_ST6, O_NONE, P_none },
-  /* 1145 */ { UD_Ifcomi, O_ST0, O_ST7, O_NONE, P_none },
-  /* 1146 */ { UD_Ifadd, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1147 */ { UD_Ifmul, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1148 */ { UD_Ifcom, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1149 */ { UD_Ifcomp, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1150 */ { UD_Ifsub, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1151 */ { UD_Ifsubr, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1152 */ { UD_Ifdiv, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1153 */ { UD_Ifdivr, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1154 */ { UD_Ifadd, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1155 */ { UD_Ifadd, O_ST1, O_ST0, O_NONE, P_none },
-  /* 1156 */ { UD_Ifadd, O_ST2, O_ST0, O_NONE, P_none },
-  /* 1157 */ { UD_Ifadd, O_ST3, O_ST0, O_NONE, P_none },
-  /* 1158 */ { UD_Ifadd, O_ST4, O_ST0, O_NONE, P_none },
-  /* 1159 */ { UD_Ifadd, O_ST5, O_ST0, O_NONE, P_none },
-  /* 1160 */ { UD_Ifadd, O_ST6, O_ST0, O_NONE, P_none },
-  /* 1161 */ { UD_Ifadd, O_ST7, O_ST0, O_NONE, P_none },
-  /* 1162 */ { UD_Ifmul, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1163 */ { UD_Ifmul, O_ST1, O_ST0, O_NONE, P_none },
-  /* 1164 */ { UD_Ifmul, O_ST2, O_ST0, O_NONE, P_none },
-  /* 1165 */ { UD_Ifmul, O_ST3, O_ST0, O_NONE, P_none },
-  /* 1166 */ { UD_Ifmul, O_ST4, O_ST0, O_NONE, P_none },
-  /* 1167 */ { UD_Ifmul, O_ST5, O_ST0, O_NONE, P_none },
-  /* 1168 */ { UD_Ifmul, O_ST6, O_ST0, O_NONE, P_none },
-  /* 1169 */ { UD_Ifmul, O_ST7, O_ST0, O_NONE, P_none },
-  /* 1170 */ { UD_Ifcom2, O_ST0, O_NONE, O_NONE, P_none },
-  /* 1171 */ { UD_Ifcom2, O_ST1, O_NONE, O_NONE, P_none },
-  /* 1172 */ { UD_Ifcom2, O_ST2, O_NONE, O_NONE, P_none },
-  /* 1173 */ { UD_Ifcom2, O_ST3, O_NONE, O_NONE, P_none },
-  /* 1174 */ { UD_Ifcom2, O_ST4, O_NONE, O_NONE, P_none },
-  /* 1175 */ { UD_Ifcom2, O_ST5, O_NONE, O_NONE, P_none },
-  /* 1176 */ { UD_Ifcom2, O_ST6, O_NONE, O_NONE, P_none },
-  /* 1177 */ { UD_Ifcom2, O_ST7, O_NONE, O_NONE, P_none },
-  /* 1178 */ { UD_Ifcomp3, O_ST0, O_NONE, O_NONE, P_none },
-  /* 1179 */ { UD_Ifcomp3, O_ST1, O_NONE, O_NONE, P_none },
-  /* 1180 */ { UD_Ifcomp3, O_ST2, O_NONE, O_NONE, P_none },
-  /* 1181 */ { UD_Ifcomp3, O_ST3, O_NONE, O_NONE, P_none },
-  /* 1182 */ { UD_Ifcomp3, O_ST4, O_NONE, O_NONE, P_none },
-  /* 1183 */ { UD_Ifcomp3, O_ST5, O_NONE, O_NONE, P_none },
-  /* 1184 */ { UD_Ifcomp3, O_ST6, O_NONE, O_NONE, P_none },
-  /* 1185 */ { UD_Ifcomp3, O_ST7, O_NONE, O_NONE, P_none },
-  /* 1186 */ { UD_Ifsubr, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1187 */ { UD_Ifsubr, O_ST1, O_ST0, O_NONE, P_none },
-  /* 1188 */ { UD_Ifsubr, O_ST2, O_ST0, O_NONE, P_none },
-  /* 1189 */ { UD_Ifsubr, O_ST3, O_ST0, O_NONE, P_none },
-  /* 1190 */ { UD_Ifsubr, O_ST4, O_ST0, O_NONE, P_none },
-  /* 1191 */ { UD_Ifsubr, O_ST5, O_ST0, O_NONE, P_none },
-  /* 1192 */ { UD_Ifsubr, O_ST6, O_ST0, O_NONE, P_none },
-  /* 1193 */ { UD_Ifsubr, O_ST7, O_ST0, O_NONE, P_none },
-  /* 1194 */ { UD_Ifsub, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1195 */ { UD_Ifsub, O_ST1, O_ST0, O_NONE, P_none },
-  /* 1196 */ { UD_Ifsub, O_ST2, O_ST0, O_NONE, P_none },
-  /* 1197 */ { UD_Ifsub, O_ST3, O_ST0, O_NONE, P_none },
-  /* 1198 */ { UD_Ifsub, O_ST4, O_ST0, O_NONE, P_none },
-  /* 1199 */ { UD_Ifsub, O_ST5, O_ST0, O_NONE, P_none },
-  /* 1200 */ { UD_Ifsub, O_ST6, O_ST0, O_NONE, P_none },
-  /* 1201 */ { UD_Ifsub, O_ST7, O_ST0, O_NONE, P_none },
-  /* 1202 */ { UD_Ifdivr, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1203 */ { UD_Ifdivr, O_ST1, O_ST0, O_NONE, P_none },
-  /* 1204 */ { UD_Ifdivr, O_ST2, O_ST0, O_NONE, P_none },
-  /* 1205 */ { UD_Ifdivr, O_ST3, O_ST0, O_NONE, P_none },
-  /* 1206 */ { UD_Ifdivr, O_ST4, O_ST0, O_NONE, P_none },
-  /* 1207 */ { UD_Ifdivr, O_ST5, O_ST0, O_NONE, P_none },
-  /* 1208 */ { UD_Ifdivr, O_ST6, O_ST0, O_NONE, P_none },
-  /* 1209 */ { UD_Ifdivr, O_ST7, O_ST0, O_NONE, P_none },
-  /* 1210 */ { UD_Ifdiv, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1211 */ { UD_Ifdiv, O_ST1, O_ST0, O_NONE, P_none },
-  /* 1212 */ { UD_Ifdiv, O_ST2, O_ST0, O_NONE, P_none },
-  /* 1213 */ { UD_Ifdiv, O_ST3, O_ST0, O_NONE, P_none },
-  /* 1214 */ { UD_Ifdiv, O_ST4, O_ST0, O_NONE, P_none },
-  /* 1215 */ { UD_Ifdiv, O_ST5, O_ST0, O_NONE, P_none },
-  /* 1216 */ { UD_Ifdiv, O_ST6, O_ST0, O_NONE, P_none },
-  /* 1217 */ { UD_Ifdiv, O_ST7, O_ST0, O_NONE, P_none },
-  /* 1218 */ { UD_Ifld, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1219 */ { UD_Ifisttp, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1220 */ { UD_Ifst, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1221 */ { UD_Ifstp, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1222 */ { UD_Ifrstor, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1223 */ { UD_Ifnsave, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1224 */ { UD_Ifnstsw, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1225 */ { UD_Iffree, O_ST0, O_NONE, O_NONE, P_none },
-  /* 1226 */ { UD_Iffree, O_ST1, O_NONE, O_NONE, P_none },
-  /* 1227 */ { UD_Iffree, O_ST2, O_NONE, O_NONE, P_none },
-  /* 1228 */ { UD_Iffree, O_ST3, O_NONE, O_NONE, P_none },
-  /* 1229 */ { UD_Iffree, O_ST4, O_NONE, O_NONE, P_none },
-  /* 1230 */ { UD_Iffree, O_ST5, O_NONE, O_NONE, P_none },
-  /* 1231 */ { UD_Iffree, O_ST6, O_NONE, O_NONE, P_none },
-  /* 1232 */ { UD_Iffree, O_ST7, O_NONE, O_NONE, P_none },
-  /* 1233 */ { UD_Ifxch4, O_ST0, O_NONE, O_NONE, P_none },
-  /* 1234 */ { UD_Ifxch4, O_ST1, O_NONE, O_NONE, P_none },
-  /* 1235 */ { UD_Ifxch4, O_ST2, O_NONE, O_NONE, P_none },
-  /* 1236 */ { UD_Ifxch4, O_ST3, O_NONE, O_NONE, P_none },
-  /* 1237 */ { UD_Ifxch4, O_ST4, O_NONE, O_NONE, P_none },
-  /* 1238 */ { UD_Ifxch4, O_ST5, O_NONE, O_NONE, P_none },
-  /* 1239 */ { UD_Ifxch4, O_ST6, O_NONE, O_NONE, P_none },
-  /* 1240 */ { UD_Ifxch4, O_ST7, O_NONE, O_NONE, P_none },
-  /* 1241 */ { UD_Ifst, O_ST0, O_NONE, O_NONE, P_none },
-  /* 1242 */ { UD_Ifst, O_ST1, O_NONE, O_NONE, P_none },
-  /* 1243 */ { UD_Ifst, O_ST2, O_NONE, O_NONE, P_none },
-  /* 1244 */ { UD_Ifst, O_ST3, O_NONE, O_NONE, P_none },
-  /* 1245 */ { UD_Ifst, O_ST4, O_NONE, O_NONE, P_none },
-  /* 1246 */ { UD_Ifst, O_ST5, O_NONE, O_NONE, P_none },
-  /* 1247 */ { UD_Ifst, O_ST6, O_NONE, O_NONE, P_none },
-  /* 1248 */ { UD_Ifst, O_ST7, O_NONE, O_NONE, P_none },
-  /* 1249 */ { UD_Ifstp, O_ST0, O_NONE, O_NONE, P_none },
-  /* 1250 */ { UD_Ifstp, O_ST1, O_NONE, O_NONE, P_none },
-  /* 1251 */ { UD_Ifstp, O_ST2, O_NONE, O_NONE, P_none },
-  /* 1252 */ { UD_Ifstp, O_ST3, O_NONE, O_NONE, P_none },
-  /* 1253 */ { UD_Ifstp, O_ST4, O_NONE, O_NONE, P_none },
-  /* 1254 */ { UD_Ifstp, O_ST5, O_NONE, O_NONE, P_none },
-  /* 1255 */ { UD_Ifstp, O_ST6, O_NONE, O_NONE, P_none },
-  /* 1256 */ { UD_Ifstp, O_ST7, O_NONE, O_NONE, P_none },
-  /* 1257 */ { UD_Ifucom, O_ST0, O_NONE, O_NONE, P_none },
-  /* 1258 */ { UD_Ifucom, O_ST1, O_NONE, O_NONE, P_none },
-  /* 1259 */ { UD_Ifucom, O_ST2, O_NONE, O_NONE, P_none },
-  /* 1260 */ { UD_Ifucom, O_ST3, O_NONE, O_NONE, P_none },
-  /* 1261 */ { UD_Ifucom, O_ST4, O_NONE, O_NONE, P_none },
-  /* 1262 */ { UD_Ifucom, O_ST5, O_NONE, O_NONE, P_none },
-  /* 1263 */ { UD_Ifucom, O_ST6, O_NONE, O_NONE, P_none },
-  /* 1264 */ { UD_Ifucom, O_ST7, O_NONE, O_NONE, P_none },
-  /* 1265 */ { UD_Ifucomp, O_ST0, O_NONE, O_NONE, P_none },
-  /* 1266 */ { UD_Ifucomp, O_ST1, O_NONE, O_NONE, P_none },
-  /* 1267 */ { UD_Ifucomp, O_ST2, O_NONE, O_NONE, P_none },
-  /* 1268 */ { UD_Ifucomp, O_ST3, O_NONE, O_NONE, P_none },
-  /* 1269 */ { UD_Ifucomp, O_ST4, O_NONE, O_NONE, P_none },
-  /* 1270 */ { UD_Ifucomp, O_ST5, O_NONE, O_NONE, P_none },
-  /* 1271 */ { UD_Ifucomp, O_ST6, O_NONE, O_NONE, P_none },
-  /* 1272 */ { UD_Ifucomp, O_ST7, O_NONE, O_NONE, P_none },
-  /* 1273 */ { UD_Ifiadd, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1274 */ { UD_Ifimul, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1275 */ { UD_Ificom, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1276 */ { UD_Ificomp, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1277 */ { UD_Ifisub, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1278 */ { UD_Ifisubr, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1279 */ { UD_Ifidiv, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1280 */ { UD_Ifidivr, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1281 */ { UD_Ifaddp, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1282 */ { UD_Ifaddp, O_ST1, O_ST0, O_NONE, P_none },
-  /* 1283 */ { UD_Ifaddp, O_ST2, O_ST0, O_NONE, P_none },
-  /* 1284 */ { UD_Ifaddp, O_ST3, O_ST0, O_NONE, P_none },
-  /* 1285 */ { UD_Ifaddp, O_ST4, O_ST0, O_NONE, P_none },
-  /* 1286 */ { UD_Ifaddp, O_ST5, O_ST0, O_NONE, P_none },
-  /* 1287 */ { UD_Ifaddp, O_ST6, O_ST0, O_NONE, P_none },
-  /* 1288 */ { UD_Ifaddp, O_ST7, O_ST0, O_NONE, P_none },
-  /* 1289 */ { UD_Ifmulp, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1290 */ { UD_Ifmulp, O_ST1, O_ST0, O_NONE, P_none },
-  /* 1291 */ { UD_Ifmulp, O_ST2, O_ST0, O_NONE, P_none },
-  /* 1292 */ { UD_Ifmulp, O_ST3, O_ST0, O_NONE, P_none },
-  /* 1293 */ { UD_Ifmulp, O_ST4, O_ST0, O_NONE, P_none },
-  /* 1294 */ { UD_Ifmulp, O_ST5, O_ST0, O_NONE, P_none },
-  /* 1295 */ { UD_Ifmulp, O_ST6, O_ST0, O_NONE, P_none },
-  /* 1296 */ { UD_Ifmulp, O_ST7, O_ST0, O_NONE, P_none },
-  /* 1297 */ { UD_Ifcomp5, O_ST0, O_NONE, O_NONE, P_none },
-  /* 1298 */ { UD_Ifcomp5, O_ST1, O_NONE, O_NONE, P_none },
-  /* 1299 */ { UD_Ifcomp5, O_ST2, O_NONE, O_NONE, P_none },
-  /* 1300 */ { UD_Ifcomp5, O_ST3, O_NONE, O_NONE, P_none },
-  /* 1301 */ { UD_Ifcomp5, O_ST4, O_NONE, O_NONE, P_none },
-  /* 1302 */ { UD_Ifcomp5, O_ST5, O_NONE, O_NONE, P_none },
-  /* 1303 */ { UD_Ifcomp5, O_ST6, O_NONE, O_NONE, P_none },
-  /* 1304 */ { UD_Ifcomp5, O_ST7, O_NONE, O_NONE, P_none },
-  /* 1305 */ { UD_Ifcompp, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1306 */ { UD_Ifsubrp, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1307 */ { UD_Ifsubrp, O_ST1, O_ST0, O_NONE, P_none },
-  /* 1308 */ { UD_Ifsubrp, O_ST2, O_ST0, O_NONE, P_none },
-  /* 1309 */ { UD_Ifsubrp, O_ST3, O_ST0, O_NONE, P_none },
-  /* 1310 */ { UD_Ifsubrp, O_ST4, O_ST0, O_NONE, P_none },
-  /* 1311 */ { UD_Ifsubrp, O_ST5, O_ST0, O_NONE, P_none },
-  /* 1312 */ { UD_Ifsubrp, O_ST6, O_ST0, O_NONE, P_none },
-  /* 1313 */ { UD_Ifsubrp, O_ST7, O_ST0, O_NONE, P_none },
-  /* 1314 */ { UD_Ifsubp, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1315 */ { UD_Ifsubp, O_ST1, O_ST0, O_NONE, P_none },
-  /* 1316 */ { UD_Ifsubp, O_ST2, O_ST0, O_NONE, P_none },
-  /* 1317 */ { UD_Ifsubp, O_ST3, O_ST0, O_NONE, P_none },
-  /* 1318 */ { UD_Ifsubp, O_ST4, O_ST0, O_NONE, P_none },
-  /* 1319 */ { UD_Ifsubp, O_ST5, O_ST0, O_NONE, P_none },
-  /* 1320 */ { UD_Ifsubp, O_ST6, O_ST0, O_NONE, P_none },
-  /* 1321 */ { UD_Ifsubp, O_ST7, O_ST0, O_NONE, P_none },
-  /* 1322 */ { UD_Ifdivrp, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1323 */ { UD_Ifdivrp, O_ST1, O_ST0, O_NONE, P_none },
-  /* 1324 */ { UD_Ifdivrp, O_ST2, O_ST0, O_NONE, P_none },
-  /* 1325 */ { UD_Ifdivrp, O_ST3, O_ST0, O_NONE, P_none },
-  /* 1326 */ { UD_Ifdivrp, O_ST4, O_ST0, O_NONE, P_none },
-  /* 1327 */ { UD_Ifdivrp, O_ST5, O_ST0, O_NONE, P_none },
-  /* 1328 */ { UD_Ifdivrp, O_ST6, O_ST0, O_NONE, P_none },
-  /* 1329 */ { UD_Ifdivrp, O_ST7, O_ST0, O_NONE, P_none },
-  /* 1330 */ { UD_Ifdivp, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1331 */ { UD_Ifdivp, O_ST1, O_ST0, O_NONE, P_none },
-  /* 1332 */ { UD_Ifdivp, O_ST2, O_ST0, O_NONE, P_none },
-  /* 1333 */ { UD_Ifdivp, O_ST3, O_ST0, O_NONE, P_none },
-  /* 1334 */ { UD_Ifdivp, O_ST4, O_ST0, O_NONE, P_none },
-  /* 1335 */ { UD_Ifdivp, O_ST5, O_ST0, O_NONE, P_none },
-  /* 1336 */ { UD_Ifdivp, O_ST6, O_ST0, O_NONE, P_none },
-  /* 1337 */ { UD_Ifdivp, O_ST7, O_ST0, O_NONE, P_none },
-  /* 1338 */ { UD_Ifild, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1339 */ { UD_Ifisttp, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1340 */ { UD_Ifist, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1341 */ { UD_Ifistp, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1342 */ { UD_Ifbld, O_Mt, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1343 */ { UD_Ifild, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1344 */ { UD_Ifbstp, O_Mt, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1345 */ { UD_Ifistp, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb },
-  /* 1346 */ { UD_Iffreep, O_ST0, O_NONE, O_NONE, P_none },
-  /* 1347 */ { UD_Iffreep, O_ST1, O_NONE, O_NONE, P_none },
-  /* 1348 */ { UD_Iffreep, O_ST2, O_NONE, O_NONE, P_none },
-  /* 1349 */ { UD_Iffreep, O_ST3, O_NONE, O_NONE, P_none },
-  /* 1350 */ { UD_Iffreep, O_ST4, O_NONE, O_NONE, P_none },
-  /* 1351 */ { UD_Iffreep, O_ST5, O_NONE, O_NONE, P_none },
-  /* 1352 */ { UD_Iffreep, O_ST6, O_NONE, O_NONE, P_none },
-  /* 1353 */ { UD_Iffreep, O_ST7, O_NONE, O_NONE, P_none },
-  /* 1354 */ { UD_Ifxch7, O_ST0, O_NONE, O_NONE, P_none },
-  /* 1355 */ { UD_Ifxch7, O_ST1, O_NONE, O_NONE, P_none },
-  /* 1356 */ { UD_Ifxch7, O_ST2, O_NONE, O_NONE, P_none },
-  /* 1357 */ { UD_Ifxch7, O_ST3, O_NONE, O_NONE, P_none },
-  /* 1358 */ { UD_Ifxch7, O_ST4, O_NONE, O_NONE, P_none },
-  /* 1359 */ { UD_Ifxch7, O_ST5, O_NONE, O_NONE, P_none },
-  /* 1360 */ { UD_Ifxch7, O_ST6, O_NONE, O_NONE, P_none },
-  /* 1361 */ { UD_Ifxch7, O_ST7, O_NONE, O_NONE, P_none },
-  /* 1362 */ { UD_Ifstp8, O_ST0, O_NONE, O_NONE, P_none },
-  /* 1363 */ { UD_Ifstp8, O_ST1, O_NONE, O_NONE, P_none },
-  /* 1364 */ { UD_Ifstp8, O_ST2, O_NONE, O_NONE, P_none },
-  /* 1365 */ { UD_Ifstp8, O_ST3, O_NONE, O_NONE, P_none },
-  /* 1366 */ { UD_Ifstp8, O_ST4, O_NONE, O_NONE, P_none },
-  /* 1367 */ { UD_Ifstp8, O_ST5, O_NONE, O_NONE, P_none },
-  /* 1368 */ { UD_Ifstp8, O_ST6, O_NONE, O_NONE, P_none },
-  /* 1369 */ { UD_Ifstp8, O_ST7, O_NONE, O_NONE, P_none },
-  /* 1370 */ { UD_Ifstp9, O_ST0, O_NONE, O_NONE, P_none },
-  /* 1371 */ { UD_Ifstp9, O_ST1, O_NONE, O_NONE, P_none },
-  /* 1372 */ { UD_Ifstp9, O_ST2, O_NONE, O_NONE, P_none },
-  /* 1373 */ { UD_Ifstp9, O_ST3, O_NONE, O_NONE, P_none },
-  /* 1374 */ { UD_Ifstp9, O_ST4, O_NONE, O_NONE, P_none },
-  /* 1375 */ { UD_Ifstp9, O_ST5, O_NONE, O_NONE, P_none },
-  /* 1376 */ { UD_Ifstp9, O_ST6, O_NONE, O_NONE, P_none },
-  /* 1377 */ { UD_Ifstp9, O_ST7, O_NONE, O_NONE, P_none },
-  /* 1378 */ { UD_Ifnstsw, O_AX, O_NONE, O_NONE, P_none },
-  /* 1379 */ { UD_Ifucomip, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1380 */ { UD_Ifucomip, O_ST0, O_ST1, O_NONE, P_none },
-  /* 1381 */ { UD_Ifucomip, O_ST0, O_ST2, O_NONE, P_none },
-  /* 1382 */ { UD_Ifucomip, O_ST0, O_ST3, O_NONE, P_none },
-  /* 1383 */ { UD_Ifucomip, O_ST0, O_ST4, O_NONE, P_none },
-  /* 1384 */ { UD_Ifucomip, O_ST0, O_ST5, O_NONE, P_none },
-  /* 1385 */ { UD_Ifucomip, O_ST0, O_ST6, O_NONE, P_none },
-  /* 1386 */ { UD_Ifucomip, O_ST0, O_ST7, O_NONE, P_none },
-  /* 1387 */ { UD_Ifcomip, O_ST0, O_ST0, O_NONE, P_none },
-  /* 1388 */ { UD_Ifcomip, O_ST0, O_ST1, O_NONE, P_none },
-  /* 1389 */ { UD_Ifcomip, O_ST0, O_ST2, O_NONE, P_none },
-  /* 1390 */ { UD_Ifcomip, O_ST0, O_ST3, O_NONE, P_none },
-  /* 1391 */ { UD_Ifcomip, O_ST0, O_ST4, O_NONE, P_none },
-  /* 1392 */ { UD_Ifcomip, O_ST0, O_ST5, O_NONE, P_none },
-  /* 1393 */ { UD_Ifcomip, O_ST0, O_ST6, O_NONE, P_none },
-  /* 1394 */ { UD_Ifcomip, O_ST0, O_ST7, O_NONE, P_none },
-  /* 1395 */ { UD_Iloopne, O_Jb, O_NONE, O_NONE, P_none },
-  /* 1396 */ { UD_Iloope, O_Jb, O_NONE, O_NONE, P_none },
-  /* 1397 */ { UD_Iloop, O_Jb, O_NONE, O_NONE, P_none },
-  /* 1398 */ { UD_Ijcxz, O_Jb, O_NONE, O_NONE, P_aso },
-  /* 1399 */ { UD_Ijecxz, O_Jb, O_NONE, O_NONE, P_aso },
-  /* 1400 */ { UD_Ijrcxz, O_Jb, O_NONE, O_NONE, P_aso },
-  /* 1401 */ { UD_Iin, O_AL, O_Ib, O_NONE, P_none },
-  /* 1402 */ { UD_Iin, O_eAX, O_Ib, O_NONE, P_oso },
-  /* 1403 */ { UD_Iout, O_Ib, O_AL, O_NONE, P_none },
-  /* 1404 */ { UD_Iout, O_Ib, O_eAX, O_NONE, P_oso },
-  /* 1405 */ { UD_Icall, O_Jz, O_NONE, O_NONE, P_oso|P_def64 },
-  /* 1406 */ { UD_Ijmp, O_Jz, O_NONE, O_NONE, P_oso|P_def64 },
-  /* 1407 */ { UD_Ijmp, O_Av, O_NONE, O_NONE, P_oso },
-  /* 1408 */ { UD_Ijmp, O_Jb, O_NONE, O_NONE, P_none },
-  /* 1409 */ { UD_Iin, O_AL, O_DX, O_NONE, P_none },
-  /* 1410 */ { UD_Iin, O_eAX, O_DX, O_NONE, P_oso },
-  /* 1411 */ { UD_Iout, O_DX, O_AL, O_NONE, P_none },
-  /* 1412 */ { UD_Iout, O_DX, O_eAX, O_NONE, P_oso },
-  /* 1413 */ { UD_Ilock, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1414 */ { UD_Iint1, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1415 */ { UD_Irepne, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1416 */ { UD_Irep, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1417 */ { UD_Ihlt, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1418 */ { UD_Icmc, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1419 */ { UD_Itest, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 1420 */ { UD_Itest, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 1421 */ { UD_Inot, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 1422 */ { UD_Ineg, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 1423 */ { UD_Imul, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 1424 */ { UD_Iimul, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 1425 */ { UD_Idiv, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 1426 */ { UD_Iidiv, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 1427 */ { UD_Itest, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 1428 */ { UD_Itest, O_Ev, O_Iz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 1429 */ { UD_Inot, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 1430 */ { UD_Ineg, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 1431 */ { UD_Imul, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 1432 */ { UD_Iimul, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 1433 */ { UD_Idiv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 1434 */ { UD_Iidiv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 1435 */ { UD_Iclc, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1436 */ { UD_Istc, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1437 */ { UD_Icli, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1438 */ { UD_Isti, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1439 */ { UD_Icld, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1440 */ { UD_Istd, O_NONE, O_NONE, O_NONE, P_none },
-  /* 1441 */ { UD_Iinc, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 1442 */ { UD_Idec, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 1443 */ { UD_Iinc, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 1444 */ { UD_Idec, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 1445 */ { UD_Icall, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 1446 */ { UD_Icall, O_Eq, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 },
-  /* 1447 */ { UD_Icall, O_Fv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 1448 */ { UD_Ijmp, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 },
-  /* 1449 */ { UD_Ijmp, O_Fv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb },
-  /* 1450 */ { UD_Ipush, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 },
-};
-
-
-const char * ud_mnemonics_str[] = {
-"invalid",
-    "3dnow",
-    "none",
-    "db",
-    "pause",
-    "aaa",
-    "aad",
-    "aam",
-    "aas",
-    "adc",
-    "add",
-    "addpd",
-    "addps",
-    "addsd",
-    "addss",
-    "and",
-    "andpd",
-    "andps",
-    "andnpd",
-    "andnps",
-    "arpl",
-    "movsxd",
-    "bound",
-    "bsf",
-    "bsr",
-    "bswap",
-    "bt",
-    "btc",
-    "btr",
-    "bts",
-    "call",
-    "cbw",
-    "cwde",
-    "cdqe",
-    "clc",
-    "cld",
-    "clflush",
-    "clgi",
-    "cli",
-    "clts",
-    "cmc",
-    "cmovo",
-    "cmovno",
-    "cmovb",
-    "cmovae",
-    "cmovz",
-    "cmovnz",
-    "cmovbe",
-    "cmova",
-    "cmovs",
-    "cmovns",
-    "cmovp",
-    "cmovnp",
-    "cmovl",
-    "cmovge",
-    "cmovle",
-    "cmovg",
-    "cmp",
-    "cmppd",
-    "cmpps",
-    "cmpsb",
-    "cmpsw",
-    "cmpsd",
-    "cmpsq",
-    "cmpss",
-    "cmpxchg",
-    "cmpxchg8b",
-    "cmpxchg16b",
-    "comisd",
-    "comiss",
-    "cpuid",
-    "cvtdq2pd",
-    "cvtdq2ps",
-    "cvtpd2dq",
-    "cvtpd2pi",
-    "cvtpd2ps",
-    "cvtpi2ps",
-    "cvtpi2pd",
-    "cvtps2dq",
-    "cvtps2pi",
-    "cvtps2pd",
-    "cvtsd2si",
-    "cvtsd2ss",
-    "cvtsi2ss",
-    "cvtss2si",
-    "cvtss2sd",
-    "cvttpd2pi",
-    "cvttpd2dq",
-    "cvttps2dq",
-    "cvttps2pi",
-    "cvttsd2si",
-    "cvtsi2sd",
-    "cvttss2si",
-    "cwd",
-    "cdq",
-    "cqo",
-    "daa",
-    "das",
-    "dec",
-    "div",
-    "divpd",
-    "divps",
-    "divsd",
-    "divss",
-    "emms",
-    "enter",
-    "f2xm1",
-    "fabs",
-    "fadd",
-    "faddp",
-    "fbld",
-    "fbstp",
-    "fchs",
-    "fclex",
-    "fcmovb",
-    "fcmove",
-    "fcmovbe",
-    "fcmovu",
-    "fcmovnb",
-    "fcmovne",
-    "fcmovnbe",
-    "fcmovnu",
-    "fucomi",
-    "fcom",
-    "fcom2",
-    "fcomp3",
-    "fcomi",
-    "fucomip",
-    "fcomip",
-    "fcomp",
-    "fcomp5",
-    "fcompp",
-    "fcos",
-    "fdecstp",
-    "fdiv",
-    "fdivp",
-    "fdivr",
-    "fdivrp",
-    "femms",
-    "ffree",
-    "ffreep",
-    "ficom",
-    "ficomp",
-    "fild",
-    "fincstp",
-    "fninit",
-    "fiadd",
-    "fidivr",
-    "fidiv",
-    "fisub",
-    "fisubr",
-    "fist",
-    "fistp",
-    "fisttp",
-    "fld",
-    "fld1",
-    "fldl2t",
-    "fldl2e",
-    "fldpi",
-    "fldlg2",
-    "fldln2",
-    "fldz",
-    "fldcw",
-    "fldenv",
-    "fmul",
-    "fmulp",
-    "fimul",
-    "fnop",
-    "fpatan",
-    "fprem",
-    "fprem1",
-    "fptan",
-    "frndint",
-    "frstor",
-    "fnsave",
-    "fscale",
-    "fsin",
-    "fsincos",
-    "fsqrt",
-    "fstp",
-    "fstp1",
-    "fstp8",
-    "fstp9",
-    "fst",
-    "fnstcw",
-    "fnstenv",
-    "fnstsw",
-    "fsub",
-    "fsubp",
-    "fsubr",
-    "fsubrp",
-    "ftst",
-    "fucom",
-    "fucomp",
-    "fucompp",
-    "fxam",
-    "fxch",
-    "fxch4",
-    "fxch7",
-    "fxrstor",
-    "fxsave",
-    "fxtract",
-    "fyl2x",
-    "fyl2xp1",
-    "hlt",
-    "idiv",
-    "in",
-    "imul",
-    "inc",
-    "insb",
-    "insw",
-    "insd",
-    "int1",
-    "int3",
-    "int",
-    "into",
-    "invd",
-    "invept",
-    "invlpg",
-    "invlpga",
-    "invvpid",
-    "iretw",
-    "iretd",
-    "iretq",
-    "jo",
-    "jno",
-    "jb",
-    "jae",
-    "jz",
-    "jnz",
-    "jbe",
-    "ja",
-    "js",
-    "jns",
-    "jp",
-    "jnp",
-    "jl",
-    "jge",
-    "jle",
-    "jg",
-    "jcxz",
-    "jecxz",
-    "jrcxz",
-    "jmp",
-    "lahf",
-    "lar",
-    "lddqu",
-    "ldmxcsr",
-    "lds",
-    "lea",
-    "les",
-    "lfs",
-    "lgs",
-    "lidt",
-    "lss",
-    "leave",
-    "lfence",
-    "lgdt",
-    "lldt",
-    "lmsw",
-    "lock",
-    "lodsb",
-    "lodsw",
-    "lodsd",
-    "lodsq",
-    "loopne",
-    "loope",
-    "loop",
-    "lsl",
-    "ltr",
-    "maskmovq",
-    "maxpd",
-    "maxps",
-    "maxsd",
-    "maxss",
-    "mfence",
-    "minpd",
-    "minps",
-    "minsd",
-    "minss",
-    "monitor",
-    "montmul",
-    "mov",
-    "movapd",
-    "movaps",
-    "movd",
-    "movhpd",
-    "movhps",
-    "movlhps",
-    "movlpd",
-    "movlps",
-    "movhlps",
-    "movmskpd",
-    "movmskps",
-    "movntdq",
-    "movnti",
-    "movntpd",
-    "movntps",
-    "movntq",
-    "movq",
-    "movsb",
-    "movsw",
-    "movsd",
-    "movsq",
-    "movss",
-    "movsx",
-    "movupd",
-    "movups",
-    "movzx",
-    "mul",
-    "mulpd",
-    "mulps",
-    "mulsd",
-    "mulss",
-    "mwait",
-    "neg",
-    "nop",
-    "not",
-    "or",
-    "orpd",
-    "orps",
-    "out",
-    "outsb",
-    "outsw",
-    "outsd",
-    "packsswb",
-    "packssdw",
-    "packuswb",
-    "paddb",
-    "paddw",
-    "paddd",
-    "paddsb",
-    "paddsw",
-    "paddusb",
-    "paddusw",
-    "pand",
-    "pandn",
-    "pavgb",
-    "pavgw",
-    "pcmpeqb",
-    "pcmpeqw",
-    "pcmpeqd",
-    "pcmpgtb",
-    "pcmpgtw",
-    "pcmpgtd",
-    "pextrb",
-    "pextrd",
-    "pextrq",
-    "pextrw",
-    "pinsrb",
-    "pinsrw",
-    "pinsrd",
-    "pinsrq",
-    "pmaddwd",
-    "pmaxsw",
-    "pmaxub",
-    "pminsw",
-    "pminub",
-    "pmovmskb",
-    "pmulhuw",
-    "pmulhw",
-    "pmullw",
-    "pop",
-    "popa",
-    "popad",
-    "popfw",
-    "popfd",
-    "popfq",
-    "por",
-    "prefetch",
-    "prefetchnta",
-    "prefetcht0",
-    "prefetcht1",
-    "prefetcht2",
-    "psadbw",
-    "pshufw",
-    "psllw",
-    "pslld",
-    "psllq",
-    "psraw",
-    "psrad",
-    "psrlw",
-    "psrld",
-    "psrlq",
-    "psubb",
-    "psubw",
-    "psubd",
-    "psubsb",
-    "psubsw",
-    "psubusb",
-    "psubusw",
-    "punpckhbw",
-    "punpckhwd",
-    "punpckhdq",
-    "punpcklbw",
-    "punpcklwd",
-    "punpckldq",
-    "pi2fw",
-    "pi2fd",
-    "pf2iw",
-    "pf2id",
-    "pfnacc",
-    "pfpnacc",
-    "pfcmpge",
-    "pfmin",
-    "pfrcp",
-    "pfrsqrt",
-    "pfsub",
-    "pfadd",
-    "pfcmpgt",
-    "pfmax",
-    "pfrcpit1",
-    "pfrsqit1",
-    "pfsubr",
-    "pfacc",
-    "pfcmpeq",
-    "pfmul",
-    "pfrcpit2",
-    "pmulhrw",
-    "pswapd",
-    "pavgusb",
-    "push",
-    "pusha",
-    "pushad",
-    "pushfw",
-    "pushfd",
-    "pushfq",
-    "pxor",
-    "rcl",
-    "rcr",
-    "rol",
-    "ror",
-    "rcpps",
-    "rcpss",
-    "rdmsr",
-    "rdpmc",
-    "rdtsc",
-    "rdtscp",
-    "repne",
-    "rep",
-    "ret",
-    "retf",
-    "rsm",
-    "rsqrtps",
-    "rsqrtss",
-    "sahf",
-    "salc",
-    "sar",
-    "shl",
-    "shr",
-    "sbb",
-    "scasb",
-    "scasw",
-    "scasd",
-    "scasq",
-    "seto",
-    "setno",
-    "setb",
-    "setae",
-    "setz",
-    "setnz",
-    "setbe",
-    "seta",
-    "sets",
-    "setns",
-    "setp",
-    "setnp",
-    "setl",
-    "setge",
-    "setle",
-    "setg",
-    "sfence",
-    "sgdt",
-    "shld",
-    "shrd",
-    "shufpd",
-    "shufps",
-    "sidt",
-    "sldt",
-    "smsw",
-    "sqrtps",
-    "sqrtpd",
-    "sqrtsd",
-    "sqrtss",
-    "stc",
-    "std",
-    "stgi",
-    "sti",
-    "skinit",
-    "stmxcsr",
-    "stosb",
-    "stosw",
-    "stosd",
-    "stosq",
-    "str",
-    "sub",
-    "subpd",
-    "subps",
-    "subsd",
-    "subss",
-    "swapgs",
-    "syscall",
-    "sysenter",
-    "sysexit",
-    "sysret",
-    "test",
-    "ucomisd",
-    "ucomiss",
-    "ud2",
-    "unpckhpd",
-    "unpckhps",
-    "unpcklps",
-    "unpcklpd",
-    "verr",
-    "verw",
-    "vmcall",
-    "vmclear",
-    "vmxon",
-    "vmptrld",
-    "vmptrst",
-    "vmlaunch",
-    "vmresume",
-    "vmxoff",
-    "vmread",
-    "vmwrite",
-    "vmrun",
-    "vmmcall",
-    "vmload",
-    "vmsave",
-    "wait",
-    "wbinvd",
-    "wrmsr",
-    "xadd",
-    "xchg",
-    "xgetbv",
-    "xlatb",
-    "xor",
-    "xorpd",
-    "xorps",
-    "xcryptecb",
-    "xcryptcbc",
-    "xcryptctr",
-    "xcryptcfb",
-    "xcryptofb",
-    "xrstor",
-    "xsave",
-    "xsetbv",
-    "xsha1",
-    "xsha256",
-    "xstore",
-    "aesdec",
-    "aesdeclast",
-    "aesenc",
-    "aesenclast",
-    "aesimc",
-    "aeskeygenassist",
-    "pclmulqdq",
-    "getsec",
-    "movdqa",
-    "maskmovdqu",
-    "movdq2q",
-    "movdqu",
-    "movq2dq",
-    "paddq",
-    "psubq",
-    "pmuludq",
-    "pshufhw",
-    "pshuflw",
-    "pshufd",
-    "pslldq",
-    "psrldq",
-    "punpckhqdq",
-    "punpcklqdq",
-    "addsubpd",
-    "addsubps",
-    "haddpd",
-    "haddps",
-    "hsubpd",
-    "hsubps",
-    "movddup",
-    "movshdup",
-    "movsldup",
-    "pabsb",
-    "pabsw",
-    "pabsd",
-    "pshufb",
-    "phaddw",
-    "phaddd",
-    "phaddsw",
-    "pmaddubsw",
-    "phsubw",
-    "phsubd",
-    "phsubsw",
-    "psignb",
-    "psignd",
-    "psignw",
-    "pmulhrsw",
-    "palignr",
-    "pblendvb",
-    "pmuldq",
-    "pminsb",
-    "pminsd",
-    "pminuw",
-    "pminud",
-    "pmaxsb",
-    "pmaxsd",
-    "pmaxud",
-    "pmaxuw",
-    "pmulld",
-    "phminposuw",
-    "roundps",
-    "roundpd",
-    "roundss",
-    "roundsd",
-    "blendpd",
-    "pblendw",
-    "blendps",
-    "blendvpd",
-    "blendvps",
-    "dpps",
-    "dppd",
-    "mpsadbw",
-    "extractps",
-    "insertps",
-    "movntdqa",
-    "packusdw",
-    "pmovsxbw",
-    "pmovsxbd",
-    "pmovsxbq",
-    "pmovsxwd",
-    "pmovsxwq",
-    "pmovsxdq",
-    "pmovzxbw",
-    "pmovzxbd",
-    "pmovzxbq",
-    "pmovzxwd",
-    "pmovzxwq",
-    "pmovzxdq",
-    "pcmpeqq",
-    "popcnt",
-    "ptest",
-    "pcmpestri",
-    "pcmpestrm",
-    "pcmpgtq",
-    "pcmpistri",
-    "pcmpistrm",
-    "movbe",
-    "crc32"
-};
diff --git a/third_party/mach_override/libudis86/itab.h b/third_party/mach_override/libudis86/itab.h
deleted file mode 100644
index 778a76d..0000000
--- a/third_party/mach_override/libudis86/itab.h
+++ /dev/null
@@ -1,678 +0,0 @@
-#ifndef UD_ITAB_H
-#define UD_ITAB_H
-
-/* itab.h -- generated by udis86:scripts/ud_itab.py, do no edit */
-
-/* ud_table_type -- lookup table types (see decode.c) */
-enum ud_table_type {
-    UD_TAB__OPC_TABLE,
-    UD_TAB__OPC_X87,
-    UD_TAB__OPC_MOD,
-    UD_TAB__OPC_VEX_M,
-    UD_TAB__OPC_VEX_P,
-    UD_TAB__OPC_RM,
-    UD_TAB__OPC_VENDOR,
-    UD_TAB__OPC_OSIZE,
-    UD_TAB__OPC_MODE,
-    UD_TAB__OPC_3DNOW,
-    UD_TAB__OPC_REG,
-    UD_TAB__OPC_ASIZE,
-    UD_TAB__OPC_SSE
-};
-
-/* ud_mnemonic -- mnemonic constants */
-enum ud_mnemonic_code {
-    UD_Iinvalid,
-    UD_I3dnow,
-    UD_Inone,
-    UD_Idb,
-    UD_Ipause,
-    UD_Iaaa,
-    UD_Iaad,
-    UD_Iaam,
-    UD_Iaas,
-    UD_Iadc,
-    UD_Iadd,
-    UD_Iaddpd,
-    UD_Iaddps,
-    UD_Iaddsd,
-    UD_Iaddss,
-    UD_Iand,
-    UD_Iandpd,
-    UD_Iandps,
-    UD_Iandnpd,
-    UD_Iandnps,
-    UD_Iarpl,
-    UD_Imovsxd,
-    UD_Ibound,
-    UD_Ibsf,
-    UD_Ibsr,
-    UD_Ibswap,
-    UD_Ibt,
-    UD_Ibtc,
-    UD_Ibtr,
-    UD_Ibts,
-    UD_Icall,
-    UD_Icbw,
-    UD_Icwde,
-    UD_Icdqe,
-    UD_Iclc,
-    UD_Icld,
-    UD_Iclflush,
-    UD_Iclgi,
-    UD_Icli,
-    UD_Iclts,
-    UD_Icmc,
-    UD_Icmovo,
-    UD_Icmovno,
-    UD_Icmovb,
-    UD_Icmovae,
-    UD_Icmovz,
-    UD_Icmovnz,
-    UD_Icmovbe,
-    UD_Icmova,
-    UD_Icmovs,
-    UD_Icmovns,
-    UD_Icmovp,
-    UD_Icmovnp,
-    UD_Icmovl,
-    UD_Icmovge,
-    UD_Icmovle,
-    UD_Icmovg,
-    UD_Icmp,
-    UD_Icmppd,
-    UD_Icmpps,
-    UD_Icmpsb,
-    UD_Icmpsw,
-    UD_Icmpsd,
-    UD_Icmpsq,
-    UD_Icmpss,
-    UD_Icmpxchg,
-    UD_Icmpxchg8b,
-    UD_Icmpxchg16b,
-    UD_Icomisd,
-    UD_Icomiss,
-    UD_Icpuid,
-    UD_Icvtdq2pd,
-    UD_Icvtdq2ps,
-    UD_Icvtpd2dq,
-    UD_Icvtpd2pi,
-    UD_Icvtpd2ps,
-    UD_Icvtpi2ps,
-    UD_Icvtpi2pd,
-    UD_Icvtps2dq,
-    UD_Icvtps2pi,
-    UD_Icvtps2pd,
-    UD_Icvtsd2si,
-    UD_Icvtsd2ss,
-    UD_Icvtsi2ss,
-    UD_Icvtss2si,
-    UD_Icvtss2sd,
-    UD_Icvttpd2pi,
-    UD_Icvttpd2dq,
-    UD_Icvttps2dq,
-    UD_Icvttps2pi,
-    UD_Icvttsd2si,
-    UD_Icvtsi2sd,
-    UD_Icvttss2si,
-    UD_Icwd,
-    UD_Icdq,
-    UD_Icqo,
-    UD_Idaa,
-    UD_Idas,
-    UD_Idec,
-    UD_Idiv,
-    UD_Idivpd,
-    UD_Idivps,
-    UD_Idivsd,
-    UD_Idivss,
-    UD_Iemms,
-    UD_Ienter,
-    UD_If2xm1,
-    UD_Ifabs,
-    UD_Ifadd,
-    UD_Ifaddp,
-    UD_Ifbld,
-    UD_Ifbstp,
-    UD_Ifchs,
-    UD_Ifclex,
-    UD_Ifcmovb,
-    UD_Ifcmove,
-    UD_Ifcmovbe,
-    UD_Ifcmovu,
-    UD_Ifcmovnb,
-    UD_Ifcmovne,
-    UD_Ifcmovnbe,
-    UD_Ifcmovnu,
-    UD_Ifucomi,
-    UD_Ifcom,
-    UD_Ifcom2,
-    UD_Ifcomp3,
-    UD_Ifcomi,
-    UD_Ifucomip,
-    UD_Ifcomip,
-    UD_Ifcomp,
-    UD_Ifcomp5,
-    UD_Ifcompp,
-    UD_Ifcos,
-    UD_Ifdecstp,
-    UD_Ifdiv,
-    UD_Ifdivp,
-    UD_Ifdivr,
-    UD_Ifdivrp,
-    UD_Ifemms,
-    UD_Iffree,
-    UD_Iffreep,
-    UD_Ificom,
-    UD_Ificomp,
-    UD_Ifild,
-    UD_Ifincstp,
-    UD_Ifninit,
-    UD_Ifiadd,
-    UD_Ifidivr,
-    UD_Ifidiv,
-    UD_Ifisub,
-    UD_Ifisubr,
-    UD_Ifist,
-    UD_Ifistp,
-    UD_Ifisttp,
-    UD_Ifld,
-    UD_Ifld1,
-    UD_Ifldl2t,
-    UD_Ifldl2e,
-    UD_Ifldpi,
-    UD_Ifldlg2,
-    UD_Ifldln2,
-    UD_Ifldz,
-    UD_Ifldcw,
-    UD_Ifldenv,
-    UD_Ifmul,
-    UD_Ifmulp,
-    UD_Ifimul,
-    UD_Ifnop,
-    UD_Ifpatan,
-    UD_Ifprem,
-    UD_Ifprem1,
-    UD_Ifptan,
-    UD_Ifrndint,
-    UD_Ifrstor,
-    UD_Ifnsave,
-    UD_Ifscale,
-    UD_Ifsin,
-    UD_Ifsincos,
-    UD_Ifsqrt,
-    UD_Ifstp,
-    UD_Ifstp1,
-    UD_Ifstp8,
-    UD_Ifstp9,
-    UD_Ifst,
-    UD_Ifnstcw,
-    UD_Ifnstenv,
-    UD_Ifnstsw,
-    UD_Ifsub,
-    UD_Ifsubp,
-    UD_Ifsubr,
-    UD_Ifsubrp,
-    UD_Iftst,
-    UD_Ifucom,
-    UD_Ifucomp,
-    UD_Ifucompp,
-    UD_Ifxam,
-    UD_Ifxch,
-    UD_Ifxch4,
-    UD_Ifxch7,
-    UD_Ifxrstor,
-    UD_Ifxsave,
-    UD_Ifxtract,
-    UD_Ifyl2x,
-    UD_Ifyl2xp1,
-    UD_Ihlt,
-    UD_Iidiv,
-    UD_Iin,
-    UD_Iimul,
-    UD_Iinc,
-    UD_Iinsb,
-    UD_Iinsw,
-    UD_Iinsd,
-    UD_Iint1,
-    UD_Iint3,
-    UD_Iint,
-    UD_Iinto,
-    UD_Iinvd,
-    UD_Iinvept,
-    UD_Iinvlpg,
-    UD_Iinvlpga,
-    UD_Iinvvpid,
-    UD_Iiretw,
-    UD_Iiretd,
-    UD_Iiretq,
-    UD_Ijo,
-    UD_Ijno,
-    UD_Ijb,
-    UD_Ijae,
-    UD_Ijz,
-    UD_Ijnz,
-    UD_Ijbe,
-    UD_Ija,
-    UD_Ijs,
-    UD_Ijns,
-    UD_Ijp,
-    UD_Ijnp,
-    UD_Ijl,
-    UD_Ijge,
-    UD_Ijle,
-    UD_Ijg,
-    UD_Ijcxz,
-    UD_Ijecxz,
-    UD_Ijrcxz,
-    UD_Ijmp,
-    UD_Ilahf,
-    UD_Ilar,
-    UD_Ilddqu,
-    UD_Ildmxcsr,
-    UD_Ilds,
-    UD_Ilea,
-    UD_Iles,
-    UD_Ilfs,
-    UD_Ilgs,
-    UD_Ilidt,
-    UD_Ilss,
-    UD_Ileave,
-    UD_Ilfence,
-    UD_Ilgdt,
-    UD_Illdt,
-    UD_Ilmsw,
-    UD_Ilock,
-    UD_Ilodsb,
-    UD_Ilodsw,
-    UD_Ilodsd,
-    UD_Ilodsq,
-    UD_Iloopne,
-    UD_Iloope,
-    UD_Iloop,
-    UD_Ilsl,
-    UD_Iltr,
-    UD_Imaskmovq,
-    UD_Imaxpd,
-    UD_Imaxps,
-    UD_Imaxsd,
-    UD_Imaxss,
-    UD_Imfence,
-    UD_Iminpd,
-    UD_Iminps,
-    UD_Iminsd,
-    UD_Iminss,
-    UD_Imonitor,
-    UD_Imontmul,
-    UD_Imov,
-    UD_Imovapd,
-    UD_Imovaps,
-    UD_Imovd,
-    UD_Imovhpd,
-    UD_Imovhps,
-    UD_Imovlhps,
-    UD_Imovlpd,
-    UD_Imovlps,
-    UD_Imovhlps,
-    UD_Imovmskpd,
-    UD_Imovmskps,
-    UD_Imovntdq,
-    UD_Imovnti,
-    UD_Imovntpd,
-    UD_Imovntps,
-    UD_Imovntq,
-    UD_Imovq,
-    UD_Imovsb,
-    UD_Imovsw,
-    UD_Imovsd,
-    UD_Imovsq,
-    UD_Imovss,
-    UD_Imovsx,
-    UD_Imovupd,
-    UD_Imovups,
-    UD_Imovzx,
-    UD_Imul,
-    UD_Imulpd,
-    UD_Imulps,
-    UD_Imulsd,
-    UD_Imulss,
-    UD_Imwait,
-    UD_Ineg,
-    UD_Inop,
-    UD_Inot,
-    UD_Ior,
-    UD_Iorpd,
-    UD_Iorps,
-    UD_Iout,
-    UD_Ioutsb,
-    UD_Ioutsw,
-    UD_Ioutsd,
-    UD_Ipacksswb,
-    UD_Ipackssdw,
-    UD_Ipackuswb,
-    UD_Ipaddb,
-    UD_Ipaddw,
-    UD_Ipaddd,
-    UD_Ipaddsb,
-    UD_Ipaddsw,
-    UD_Ipaddusb,
-    UD_Ipaddusw,
-    UD_Ipand,
-    UD_Ipandn,
-    UD_Ipavgb,
-    UD_Ipavgw,
-    UD_Ipcmpeqb,
-    UD_Ipcmpeqw,
-    UD_Ipcmpeqd,
-    UD_Ipcmpgtb,
-    UD_Ipcmpgtw,
-    UD_Ipcmpgtd,
-    UD_Ipextrb,
-    UD_Ipextrd,
-    UD_Ipextrq,
-    UD_Ipextrw,
-    UD_Ipinsrb,
-    UD_Ipinsrw,
-    UD_Ipinsrd,
-    UD_Ipinsrq,
-    UD_Ipmaddwd,
-    UD_Ipmaxsw,
-    UD_Ipmaxub,
-    UD_Ipminsw,
-    UD_Ipminub,
-    UD_Ipmovmskb,
-    UD_Ipmulhuw,
-    UD_Ipmulhw,
-    UD_Ipmullw,
-    UD_Ipop,
-    UD_Ipopa,
-    UD_Ipopad,
-    UD_Ipopfw,
-    UD_Ipopfd,
-    UD_Ipopfq,
-    UD_Ipor,
-    UD_Iprefetch,
-    UD_Iprefetchnta,
-    UD_Iprefetcht0,
-    UD_Iprefetcht1,
-    UD_Iprefetcht2,
-    UD_Ipsadbw,
-    UD_Ipshufw,
-    UD_Ipsllw,
-    UD_Ipslld,
-    UD_Ipsllq,
-    UD_Ipsraw,
-    UD_Ipsrad,
-    UD_Ipsrlw,
-    UD_Ipsrld,
-    UD_Ipsrlq,
-    UD_Ipsubb,
-    UD_Ipsubw,
-    UD_Ipsubd,
-    UD_Ipsubsb,
-    UD_Ipsubsw,
-    UD_Ipsubusb,
-    UD_Ipsubusw,
-    UD_Ipunpckhbw,
-    UD_Ipunpckhwd,
-    UD_Ipunpckhdq,
-    UD_Ipunpcklbw,
-    UD_Ipunpcklwd,
-    UD_Ipunpckldq,
-    UD_Ipi2fw,
-    UD_Ipi2fd,
-    UD_Ipf2iw,
-    UD_Ipf2id,
-    UD_Ipfnacc,
-    UD_Ipfpnacc,
-    UD_Ipfcmpge,
-    UD_Ipfmin,
-    UD_Ipfrcp,
-    UD_Ipfrsqrt,
-    UD_Ipfsub,
-    UD_Ipfadd,
-    UD_Ipfcmpgt,
-    UD_Ipfmax,
-    UD_Ipfrcpit1,
-    UD_Ipfrsqit1,
-    UD_Ipfsubr,
-    UD_Ipfacc,
-    UD_Ipfcmpeq,
-    UD_Ipfmul,
-    UD_Ipfrcpit2,
-    UD_Ipmulhrw,
-    UD_Ipswapd,
-    UD_Ipavgusb,
-    UD_Ipush,
-    UD_Ipusha,
-    UD_Ipushad,
-    UD_Ipushfw,
-    UD_Ipushfd,
-    UD_Ipushfq,
-    UD_Ipxor,
-    UD_Ircl,
-    UD_Ircr,
-    UD_Irol,
-    UD_Iror,
-    UD_Ircpps,
-    UD_Ircpss,
-    UD_Irdmsr,
-    UD_Irdpmc,
-    UD_Irdtsc,
-    UD_Irdtscp,
-    UD_Irepne,
-    UD_Irep,
-    UD_Iret,
-    UD_Iretf,
-    UD_Irsm,
-    UD_Irsqrtps,
-    UD_Irsqrtss,
-    UD_Isahf,
-    UD_Isalc,
-    UD_Isar,
-    UD_Ishl,
-    UD_Ishr,
-    UD_Isbb,
-    UD_Iscasb,
-    UD_Iscasw,
-    UD_Iscasd,
-    UD_Iscasq,
-    UD_Iseto,
-    UD_Isetno,
-    UD_Isetb,
-    UD_Isetae,
-    UD_Isetz,
-    UD_Isetnz,
-    UD_Isetbe,
-    UD_Iseta,
-    UD_Isets,
-    UD_Isetns,
-    UD_Isetp,
-    UD_Isetnp,
-    UD_Isetl,
-    UD_Isetge,
-    UD_Isetle,
-    UD_Isetg,
-    UD_Isfence,
-    UD_Isgdt,
-    UD_Ishld,
-    UD_Ishrd,
-    UD_Ishufpd,
-    UD_Ishufps,
-    UD_Isidt,
-    UD_Isldt,
-    UD_Ismsw,
-    UD_Isqrtps,
-    UD_Isqrtpd,
-    UD_Isqrtsd,
-    UD_Isqrtss,
-    UD_Istc,
-    UD_Istd,
-    UD_Istgi,
-    UD_Isti,
-    UD_Iskinit,
-    UD_Istmxcsr,
-    UD_Istosb,
-    UD_Istosw,
-    UD_Istosd,
-    UD_Istosq,
-    UD_Istr,
-    UD_Isub,
-    UD_Isubpd,
-    UD_Isubps,
-    UD_Isubsd,
-    UD_Isubss,
-    UD_Iswapgs,
-    UD_Isyscall,
-    UD_Isysenter,
-    UD_Isysexit,
-    UD_Isysret,
-    UD_Itest,
-    UD_Iucomisd,
-    UD_Iucomiss,
-    UD_Iud2,
-    UD_Iunpckhpd,
-    UD_Iunpckhps,
-    UD_Iunpcklps,
-    UD_Iunpcklpd,
-    UD_Iverr,
-    UD_Iverw,
-    UD_Ivmcall,
-    UD_Ivmclear,
-    UD_Ivmxon,
-    UD_Ivmptrld,
-    UD_Ivmptrst,
-    UD_Ivmlaunch,
-    UD_Ivmresume,
-    UD_Ivmxoff,
-    UD_Ivmread,
-    UD_Ivmwrite,
-    UD_Ivmrun,
-    UD_Ivmmcall,
-    UD_Ivmload,
-    UD_Ivmsave,
-    UD_Iwait,
-    UD_Iwbinvd,
-    UD_Iwrmsr,
-    UD_Ixadd,
-    UD_Ixchg,
-    UD_Ixgetbv,
-    UD_Ixlatb,
-    UD_Ixor,
-    UD_Ixorpd,
-    UD_Ixorps,
-    UD_Ixcryptecb,
-    UD_Ixcryptcbc,
-    UD_Ixcryptctr,
-    UD_Ixcryptcfb,
-    UD_Ixcryptofb,
-    UD_Ixrstor,
-    UD_Ixsave,
-    UD_Ixsetbv,
-    UD_Ixsha1,
-    UD_Ixsha256,
-    UD_Ixstore,
-    UD_Iaesdec,
-    UD_Iaesdeclast,
-    UD_Iaesenc,
-    UD_Iaesenclast,
-    UD_Iaesimc,
-    UD_Iaeskeygenassist,
-    UD_Ipclmulqdq,
-    UD_Igetsec,
-    UD_Imovdqa,
-    UD_Imaskmovdqu,
-    UD_Imovdq2q,
-    UD_Imovdqu,
-    UD_Imovq2dq,
-    UD_Ipaddq,
-    UD_Ipsubq,
-    UD_Ipmuludq,
-    UD_Ipshufhw,
-    UD_Ipshuflw,
-    UD_Ipshufd,
-    UD_Ipslldq,
-    UD_Ipsrldq,
-    UD_Ipunpckhqdq,
-    UD_Ipunpcklqdq,
-    UD_Iaddsubpd,
-    UD_Iaddsubps,
-    UD_Ihaddpd,
-    UD_Ihaddps,
-    UD_Ihsubpd,
-    UD_Ihsubps,
-    UD_Imovddup,
-    UD_Imovshdup,
-    UD_Imovsldup,
-    UD_Ipabsb,
-    UD_Ipabsw,
-    UD_Ipabsd,
-    UD_Ipshufb,
-    UD_Iphaddw,
-    UD_Iphaddd,
-    UD_Iphaddsw,
-    UD_Ipmaddubsw,
-    UD_Iphsubw,
-    UD_Iphsubd,
-    UD_Iphsubsw,
-    UD_Ipsignb,
-    UD_Ipsignd,
-    UD_Ipsignw,
-    UD_Ipmulhrsw,
-    UD_Ipalignr,
-    UD_Ipblendvb,
-    UD_Ipmuldq,
-    UD_Ipminsb,
-    UD_Ipminsd,
-    UD_Ipminuw,
-    UD_Ipminud,
-    UD_Ipmaxsb,
-    UD_Ipmaxsd,
-    UD_Ipmaxud,
-    UD_Ipmaxuw,
-    UD_Ipmulld,
-    UD_Iphminposuw,
-    UD_Iroundps,
-    UD_Iroundpd,
-    UD_Iroundss,
-    UD_Iroundsd,
-    UD_Iblendpd,
-    UD_Ipblendw,
-    UD_Iblendps,
-    UD_Iblendvpd,
-    UD_Iblendvps,
-    UD_Idpps,
-    UD_Idppd,
-    UD_Impsadbw,
-    UD_Iextractps,
-    UD_Iinsertps,
-    UD_Imovntdqa,
-    UD_Ipackusdw,
-    UD_Ipmovsxbw,
-    UD_Ipmovsxbd,
-    UD_Ipmovsxbq,
-    UD_Ipmovsxwd,
-    UD_Ipmovsxwq,
-    UD_Ipmovsxdq,
-    UD_Ipmovzxbw,
-    UD_Ipmovzxbd,
-    UD_Ipmovzxbq,
-    UD_Ipmovzxwd,
-    UD_Ipmovzxwq,
-    UD_Ipmovzxdq,
-    UD_Ipcmpeqq,
-    UD_Ipopcnt,
-    UD_Iptest,
-    UD_Ipcmpestri,
-    UD_Ipcmpestrm,
-    UD_Ipcmpgtq,
-    UD_Ipcmpistri,
-    UD_Ipcmpistrm,
-    UD_Imovbe,
-    UD_Icrc32,
-    UD_MAX_MNEMONIC_CODE
-} UD_ATTR_PACKED;
-
-extern const char * ud_mnemonics_str[];
-
-#endif /* UD_ITAB_H */
diff --git a/third_party/mach_override/libudis86/syn-att.c b/third_party/mach_override/libudis86/syn-att.c
deleted file mode 100644
index 4fc17d1..0000000
--- a/third_party/mach_override/libudis86/syn-att.c
+++ /dev/null
@@ -1,223 +0,0 @@
-/* udis86 - libudis86/syn-att.c
- *
- * Copyright (c) 2002-2009 Vivek Thampi
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without modification, 
- * are permitted provided that the following conditions are met:
- * 
- *     * Redistributions of source code must retain the above copyright notice, 
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice, 
- *       this list of conditions and the following disclaimer in the documentation 
- *       and/or other materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "types.h"
-#include "extern.h"
-#include "decode.h"
-#include "itab.h"
-#include "syn.h"
-#include "udint.h"
-
-/* -----------------------------------------------------------------------------
- * opr_cast() - Prints an operand cast.
- * -----------------------------------------------------------------------------
- */
-static void 
-opr_cast(struct ud* u, struct ud_operand* op)
-{
-  switch(op->size) {
-  case 16 : case 32 :
-    ud_asmprintf(u, "*");   break;
-  default: break;
-  }
-}
-
-/* -----------------------------------------------------------------------------
- * gen_operand() - Generates assembly output for each operand.
- * -----------------------------------------------------------------------------
- */
-static void 
-gen_operand(struct ud* u, struct ud_operand* op)
-{
-  switch(op->type) {
-  case UD_OP_CONST:
-    ud_asmprintf(u, "$0x%x", op->lval.udword);
-    break;
-
-  case UD_OP_REG:
-    ud_asmprintf(u, "%%%s", ud_reg_tab[op->base - UD_R_AL]);
-    break;
-
-  case UD_OP_MEM:
-    if (u->br_far) {
-        opr_cast(u, op);
-    }
-    if (u->pfx_seg) {
-      ud_asmprintf(u, "%%%s:", ud_reg_tab[u->pfx_seg - UD_R_AL]);
-    }
-    if (op->offset != 0) { 
-      ud_syn_print_mem_disp(u, op, 0);
-    }
-    if (op->base) {
-      ud_asmprintf(u, "(%%%s", ud_reg_tab[op->base - UD_R_AL]);
-    }
-    if (op->index) {
-      if (op->base) {
-        ud_asmprintf(u, ",");
-      } else {
-        ud_asmprintf(u, "(");
-      }
-      ud_asmprintf(u, "%%%s", ud_reg_tab[op->index - UD_R_AL]);
-    }
-    if (op->scale) {
-      ud_asmprintf(u, ",%d", op->scale);
-    }
-    if (op->base || op->index) {
-      ud_asmprintf(u, ")");
-    }
-    break;
-
-  case UD_OP_IMM:
-    ud_syn_print_imm(u, op);
-    break;
-
-  case UD_OP_JIMM:
-    ud_syn_print_addr(u, ud_syn_rel_target(u, op));
-    break;
-
-  case UD_OP_PTR:
-    switch (op->size) {
-      case 32:
-        ud_asmprintf(u, "$0x%x, $0x%x", op->lval.ptr.seg, 
-          op->lval.ptr.off & 0xFFFF);
-        break;
-      case 48:
-        ud_asmprintf(u, "$0x%x, $0x%x", op->lval.ptr.seg, 
-          op->lval.ptr.off);
-        break;
-    }
-    break;
-      
-  default: return;
-  }
-}
-
-/* =============================================================================
- * translates to AT&T syntax 
- * =============================================================================
- */
-extern void 
-ud_translate_att(struct ud *u)
-{
-  int size = 0;
-  int star = 0;
-
-  /* check if P_OSO prefix is used */
-  if (! P_OSO(u->itab_entry->prefix) && u->pfx_opr) {
-  switch (u->dis_mode) {
-    case 16: 
-      ud_asmprintf(u, "o32 ");
-      break;
-    case 32:
-    case 64:
-      ud_asmprintf(u, "o16 ");
-      break;
-  }
-  }
-
-  /* check if P_ASO prefix was used */
-  if (! P_ASO(u->itab_entry->prefix) && u->pfx_adr) {
-  switch (u->dis_mode) {
-    case 16: 
-      ud_asmprintf(u, "a32 ");
-      break;
-    case 32:
-      ud_asmprintf(u, "a16 ");
-      break;
-    case 64:
-      ud_asmprintf(u, "a32 ");
-      break;
-  }
-  }
-
-  if (u->pfx_lock)
-    ud_asmprintf(u,  "lock ");
-  if (u->pfx_rep) {
-    ud_asmprintf(u, "rep ");
-  } else if (u->pfx_rep) {
-    ud_asmprintf(u, "repe ");
-  } else if (u->pfx_repne) {
-    ud_asmprintf(u, "repne ");
-  }
-
-  /* special instructions */
-  switch (u->mnemonic) {
-  case UD_Iretf: 
-    ud_asmprintf(u, "lret "); 
-    break;
-  case UD_Idb:
-    ud_asmprintf(u, ".byte 0x%x", u->operand[0].lval.ubyte);
-    return;
-  case UD_Ijmp:
-  case UD_Icall:
-    if (u->br_far) ud_asmprintf(u,  "l");
-        if (u->operand[0].type == UD_OP_REG) {
-          star = 1;
-        }
-    ud_asmprintf(u, "%s", ud_lookup_mnemonic(u->mnemonic));
-    break;
-  case UD_Ibound:
-  case UD_Ienter:
-    if (u->operand[0].type != UD_NONE)
-      gen_operand(u, &u->operand[0]);
-    if (u->operand[1].type != UD_NONE) {
-      ud_asmprintf(u, ",");
-      gen_operand(u, &u->operand[1]);
-    }
-    return;
-  default:
-    ud_asmprintf(u, "%s", ud_lookup_mnemonic(u->mnemonic));
-  }
-
-  if (size == 8)
-  ud_asmprintf(u, "b");
-  else if (size == 16)
-  ud_asmprintf(u, "w");
-  else if (size == 64)
-  ud_asmprintf(u, "q");
-
-  if (star) {
-    ud_asmprintf(u, " *");
-  } else {
-    ud_asmprintf(u, " ");
-  }
-
-  if (u->operand[2].type != UD_NONE) {
-  gen_operand(u, &u->operand[2]);
-  ud_asmprintf(u, ", ");
-  }
-
-  if (u->operand[1].type != UD_NONE) {
-  gen_operand(u, &u->operand[1]);
-  ud_asmprintf(u, ", ");
-  }
-
-  if (u->operand[0].type != UD_NONE)
-  gen_operand(u, &u->operand[0]);
-}
-
-/*
-vim: set ts=2 sw=2 expandtab
-*/
diff --git a/third_party/mach_override/libudis86/syn-intel.c b/third_party/mach_override/libudis86/syn-intel.c
deleted file mode 100644
index e4d8409..0000000
--- a/third_party/mach_override/libudis86/syn-intel.c
+++ /dev/null
@@ -1,213 +0,0 @@
-/* udis86 - libudis86/syn-intel.c
- *
- * Copyright (c) 2002-2013 Vivek Thampi
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without modification, 
- * are permitted provided that the following conditions are met:
- * 
- *     * Redistributions of source code must retain the above copyright notice, 
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice, 
- *       this list of conditions and the following disclaimer in the documentation 
- *       and/or other materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "types.h"
-#include "extern.h"
-#include "decode.h"
-#include "itab.h"
-#include "syn.h"
-#include "udint.h"
-
-/* -----------------------------------------------------------------------------
- * opr_cast() - Prints an operand cast.
- * -----------------------------------------------------------------------------
- */
-static void 
-opr_cast(struct ud* u, struct ud_operand* op)
-{
-  if (u->br_far) {
-    ud_asmprintf(u, "far "); 
-  }
-  switch(op->size) {
-  case  8: ud_asmprintf(u, "byte " ); break;
-  case 16: ud_asmprintf(u, "word " ); break;
-  case 32: ud_asmprintf(u, "dword "); break;
-  case 64: ud_asmprintf(u, "qword "); break;
-  case 80: ud_asmprintf(u, "tword "); break;
-  default: break;
-  }
-}
-
-/* -----------------------------------------------------------------------------
- * gen_operand() - Generates assembly output for each operand.
- * -----------------------------------------------------------------------------
- */
-static void gen_operand(struct ud* u, struct ud_operand* op, int syn_cast)
-{
-  switch(op->type) {
-  case UD_OP_REG:
-    ud_asmprintf(u, "%s", ud_reg_tab[op->base - UD_R_AL]);
-    break;
-
-  case UD_OP_MEM:
-    if (syn_cast) {
-      opr_cast(u, op);
-    }
-    ud_asmprintf(u, "[");
-    if (u->pfx_seg) {
-      ud_asmprintf(u, "%s:", ud_reg_tab[u->pfx_seg - UD_R_AL]);
-    }
-    if (op->base) {
-      ud_asmprintf(u, "%s", ud_reg_tab[op->base - UD_R_AL]);
-    }
-    if (op->index) {
-      ud_asmprintf(u, "%s%s", op->base != UD_NONE? "+" : "",
-                              ud_reg_tab[op->index - UD_R_AL]);
-      if (op->scale) {
-        ud_asmprintf(u, "*%d", op->scale);
-      }
-    }
-    if (op->offset != 0) {
-      ud_syn_print_mem_disp(u, op, (op->base  != UD_NONE || 
-                                    op->index != UD_NONE) ? 1 : 0);
-    }
-    ud_asmprintf(u, "]");
-    break;
-      
-  case UD_OP_IMM:
-    ud_syn_print_imm(u, op);
-    break;
-
-
-  case UD_OP_JIMM:
-    ud_syn_print_addr(u, ud_syn_rel_target(u, op));
-    break;
-
-  case UD_OP_PTR:
-    switch (op->size) {
-      case 32:
-        ud_asmprintf(u, "word 0x%x:0x%x", op->lval.ptr.seg, 
-          op->lval.ptr.off & 0xFFFF);
-        break;
-      case 48:
-        ud_asmprintf(u, "dword 0x%x:0x%x", op->lval.ptr.seg, 
-          op->lval.ptr.off);
-        break;
-    }
-    break;
-
-  case UD_OP_CONST:
-    if (syn_cast) opr_cast(u, op);
-    ud_asmprintf(u, "%d", op->lval.udword);
-    break;
-
-  default: return;
-  }
-}
-
-/* =============================================================================
- * translates to intel syntax 
- * =============================================================================
- */
-extern void
-ud_translate_intel(struct ud* u)
-{
-  /* check if P_OSO prefix is used */
-  if (!P_OSO(u->itab_entry->prefix) && u->pfx_opr) {
-    switch (u->dis_mode) {
-    case 16: ud_asmprintf(u, "o32 "); break;
-    case 32:
-    case 64: ud_asmprintf(u, "o16 "); break;
-    }
-  }
-
-  /* check if P_ASO prefix was used */
-  if (!P_ASO(u->itab_entry->prefix) && u->pfx_adr) {
-    switch (u->dis_mode) {
-    case 16: ud_asmprintf(u, "a32 "); break;
-    case 32: ud_asmprintf(u, "a16 "); break;
-    case 64: ud_asmprintf(u, "a32 "); break;
-    }
-  }
-
-  if (u->pfx_seg &&
-      u->operand[0].type != UD_OP_MEM &&
-      u->operand[1].type != UD_OP_MEM ) {
-    ud_asmprintf(u, "%s ", ud_reg_tab[u->pfx_seg - UD_R_AL]);
-  }
-
-  if (u->pfx_lock) {
-    ud_asmprintf(u, "lock ");
-  }
-  if (u->pfx_rep) {
-    ud_asmprintf(u, "rep ");
-  } else if (u->pfx_repe) {
-    ud_asmprintf(u, "repe ");
-  } else if (u->pfx_repne) {
-    ud_asmprintf(u, "repne ");
-  }
-
-  /* print the instruction mnemonic */
-  ud_asmprintf(u, "%s", ud_lookup_mnemonic(u->mnemonic));
-
-  if (u->operand[0].type != UD_NONE) {
-    int cast = 0;
-    ud_asmprintf(u, " ");
-    if (u->operand[0].type == UD_OP_MEM) {
-      if (u->operand[1].type == UD_OP_IMM   ||
-          u->operand[1].type == UD_OP_CONST ||
-          u->operand[1].type == UD_NONE     ||
-          (u->operand[0].size != u->operand[1].size && 
-           u->operand[1].type != UD_OP_REG)) {
-          cast = 1;
-      } else if (u->operand[1].type == UD_OP_REG &&
-                 u->operand[1].base == UD_R_CL) {
-          switch (u->mnemonic) {
-          case UD_Ircl:
-          case UD_Irol:
-          case UD_Iror:
-          case UD_Ircr:
-          case UD_Ishl:
-          case UD_Ishr:
-          case UD_Isar:
-              cast = 1;
-              break;
-          default: break;
-          }
-      }
-    }
-    gen_operand(u, &u->operand[0], cast);
-  }
-
-  if (u->operand[1].type != UD_NONE) {
-    int cast = 0;
-    ud_asmprintf(u, ", ");
-    if (u->operand[1].type == UD_OP_MEM &&
-        u->operand[0].size != u->operand[1].size && 
-        !ud_opr_is_sreg(&u->operand[0])) {
-      cast = 1;
-    }
-    gen_operand(u, &u->operand[1], cast);
-  }
-
-  if (u->operand[2].type != UD_NONE) {
-    ud_asmprintf(u, ", ");
-    gen_operand(u, &u->operand[2], 0);
-  }
-}
-
-/*
-vim: set ts=2 sw=2 expandtab
-*/
diff --git a/third_party/mach_override/libudis86/syn.c b/third_party/mach_override/libudis86/syn.c
deleted file mode 100644
index 2ccf4b5..0000000
--- a/third_party/mach_override/libudis86/syn.c
+++ /dev/null
@@ -1,206 +0,0 @@
-/* udis86 - libudis86/syn.c
- *
- * Copyright (c) 2002-2013 Vivek Thampi
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without modification, 
- * are permitted provided that the following conditions are met:
- * 
- *     * Redistributions of source code must retain the above copyright notice, 
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice, 
- *       this list of conditions and the following disclaimer in the documentation 
- *       and/or other materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "types.h"
-#include "decode.h"
-#include "syn.h"
-#include "udint.h"
-
-/* -----------------------------------------------------------------------------
- * Intel Register Table - Order Matters (types.h)!
- * -----------------------------------------------------------------------------
- */
-const char* ud_reg_tab[] = 
-{
-  "al",   "cl",   "dl",   "bl",
-  "ah",   "ch",   "dh",   "bh",
-  "spl",  "bpl",    "sil",    "dil",
-  "r8b",  "r9b",    "r10b",   "r11b",
-  "r12b", "r13b",   "r14b",   "r15b",
-
-  "ax",   "cx",   "dx",   "bx",
-  "sp",   "bp",   "si",   "di",
-  "r8w",  "r9w",    "r10w",   "r11w",
-  "r12w", "r13w"  , "r14w",   "r15w",
-  
-  "eax",  "ecx",    "edx",    "ebx",
-  "esp",  "ebp",    "esi",    "edi",
-  "r8d",  "r9d",    "r10d",   "r11d",
-  "r12d", "r13d",   "r14d",   "r15d",
-  
-  "rax",  "rcx",    "rdx",    "rbx",
-  "rsp",  "rbp",    "rsi",    "rdi",
-  "r8",   "r9",   "r10",    "r11",
-  "r12",  "r13",    "r14",    "r15",
-
-  "es",   "cs",   "ss",   "ds",
-  "fs",   "gs", 
-
-  "cr0",  "cr1",    "cr2",    "cr3",
-  "cr4",  "cr5",    "cr6",    "cr7",
-  "cr8",  "cr9",    "cr10",   "cr11",
-  "cr12", "cr13",   "cr14",   "cr15",
-  
-  "dr0",  "dr1",    "dr2",    "dr3",
-  "dr4",  "dr5",    "dr6",    "dr7",
-  "dr8",  "dr9",    "dr10",   "dr11",
-  "dr12", "dr13",   "dr14",   "dr15",
-
-  "mm0",  "mm1",    "mm2",    "mm3",
-  "mm4",  "mm5",    "mm6",    "mm7",
-
-  "st0",  "st1",    "st2",    "st3",
-  "st4",  "st5",    "st6",    "st7", 
-
-  "xmm0", "xmm1",   "xmm2",   "xmm3",
-  "xmm4", "xmm5",   "xmm6",   "xmm7",
-  "xmm8", "xmm9",   "xmm10",  "xmm11",
-  "xmm12",  "xmm13",  "xmm14",  "xmm15",
-
-  "rip"
-};
-
-
-uint64_t
-ud_syn_rel_target(struct ud *u, struct ud_operand *opr)
-{
-  const uint64_t trunc_mask = 0xffffffffffffffffull >> (64 - u->opr_mode);
-  switch (opr->size) {
-  case 8 : return (u->pc + opr->lval.sbyte)  & trunc_mask;
-  case 16: return (u->pc + opr->lval.sword)  & trunc_mask;
-  case 32: return (u->pc + opr->lval.sdword) & trunc_mask;
-  default: UD_ASSERT(!"invalid relative offset size.");
-  }
-}
-
-
-/*
- * asmprintf
- *    Printf style function for printing translated assembly
- *    output. Returns the number of characters written and
- *    moves the buffer pointer forward. On an overflow,
- *    returns a negative number and truncates the output.
- */
-int
-ud_asmprintf(struct ud *u, char *fmt, ...)
-{
-  int ret;
-  int avail;
-  va_list ap;
-  va_start(ap, fmt);
-  avail = u->asm_buf_size - u->asm_buf_fill - 1 /* nullchar */;
-  ret = vsnprintf((char*) u->asm_buf + u->asm_buf_fill, avail, fmt, ap);
-  if (ret < 0 || ret > avail) {
-      u->asm_buf_fill = u->asm_buf_size - 1;
-  } else {
-      u->asm_buf_fill += ret;
-  }
-  va_end(ap);
-  return ret;
-}
-
-
-void
-ud_syn_print_addr(struct ud *u, uint64_t addr)
-{
-  const char *name = NULL;
-  if (u->sym_resolver) {
-    int64_t offset = 0;
-    name = u->sym_resolver(u, addr, &offset);
-    if (name) {
-      if (offset) {
-        ud_asmprintf(u, "%s%+" FMT64 "d", name, offset);
-      } else {
-        ud_asmprintf(u, "%s", name);
-      }
-      return;
-    }
-  }
-  ud_asmprintf(u, "0x%" FMT64 "x", addr);
-}
-
-
-void
-ud_syn_print_imm(struct ud* u, const struct ud_operand *op)
-{
-  uint64_t v;
-  if (op->_oprcode == OP_sI && op->size != u->opr_mode) {
-    if (op->size == 8) {
-      v = (int64_t)op->lval.sbyte;
-    } else {
-      UD_ASSERT(op->size == 32);
-      v = (int64_t)op->lval.sdword;
-    }
-    if (u->opr_mode < 64) {
-      v = v & ((1ull << u->opr_mode) - 1ull);
-    }
-  } else {
-    switch (op->size) {
-    case 8 : v = op->lval.ubyte;  break;
-    case 16: v = op->lval.uword;  break;
-    case 32: v = op->lval.udword; break;
-    case 64: v = op->lval.uqword; break;
-    default: UD_ASSERT(!"invalid offset"); v = 0; /* keep cc happy */
-    }
-  }
-  ud_asmprintf(u, "0x%" FMT64 "x", v);
-}
-
-
-void
-ud_syn_print_mem_disp(struct ud* u, const struct ud_operand *op, int sign)
-{
-  UD_ASSERT(op->offset != 0);
- if (op->base == UD_NONE && op->index == UD_NONE) {
-    uint64_t v;
-    UD_ASSERT(op->scale == UD_NONE && op->offset != 8);
-    /* unsigned mem-offset */
-    switch (op->offset) {
-    case 16: v = op->lval.uword;  break;
-    case 32: v = op->lval.udword; break;
-    case 64: v = op->lval.uqword; break;
-    default: UD_ASSERT(!"invalid offset"); v = 0; /* keep cc happy */
-    }
-    ud_asmprintf(u, "0x%" FMT64 "x", v);
-  } else {
-    int64_t v;
-    UD_ASSERT(op->offset != 64);
-    switch (op->offset) {
-    case 8 : v = op->lval.sbyte;  break;
-    case 16: v = op->lval.sword;  break;
-    case 32: v = op->lval.sdword; break;
-    default: UD_ASSERT(!"invalid offset"); v = 0; /* keep cc happy */
-    }
-    if (v < 0) {
-      ud_asmprintf(u, "-0x%" FMT64 "x", -v);
-    } else if (v > 0) {
-      ud_asmprintf(u, "%s0x%" FMT64 "x", sign? "+" : "", v);
-    }
-  }
-}
-
-/*
-vim: set ts=2 sw=2 expandtab
-*/
diff --git a/third_party/mach_override/libudis86/syn.h b/third_party/mach_override/libudis86/syn.h
deleted file mode 100644
index 3e4933e..0000000
--- a/third_party/mach_override/libudis86/syn.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* udis86 - libudis86/syn.h
- *
- * Copyright (c) 2002-2009
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without modification, 
- * are permitted provided that the following conditions are met:
- * 
- *     * Redistributions of source code must retain the above copyright notice, 
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice, 
- *       this list of conditions and the following disclaimer in the documentation 
- *       and/or other materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef UD_SYN_H
-#define UD_SYN_H
-
-#include "types.h"
-#ifndef __UD_STANDALONE__
-# include <stdarg.h>
-#endif /* __UD_STANDALONE__ */
-
-extern const char* ud_reg_tab[];
-
-uint64_t ud_syn_rel_target(struct ud*, struct ud_operand*);
-
-#ifdef __GNUC__
-int ud_asmprintf(struct ud *u, char *fmt, ...) 
-    __attribute__ ((format (printf, 2, 3)));
-#else
-int ud_asmprintf(struct ud *u, char *fmt, ...);
-#endif
-
-void ud_syn_print_addr(struct ud *u, uint64_t addr);
-void ud_syn_print_imm(struct ud* u, const struct ud_operand *op);
-void ud_syn_print_mem_disp(struct ud* u, const struct ud_operand *, int sign);
-
-#endif /* UD_SYN_H */
-
-/*
-vim: set ts=2 sw=2 expandtab
-*/
diff --git a/third_party/mach_override/libudis86/types.h b/third_party/mach_override/libudis86/types.h
deleted file mode 100644
index bdfd4d9..0000000
--- a/third_party/mach_override/libudis86/types.h
+++ /dev/null
@@ -1,253 +0,0 @@
-/* udis86 - libudis86/types.h
- *
- * Copyright (c) 2002-2013 Vivek Thampi
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without modification, 
- * are permitted provided that the following conditions are met:
- * 
- *     * Redistributions of source code must retain the above copyright notice, 
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice, 
- *       this list of conditions and the following disclaimer in the documentation 
- *       and/or other materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef UD_TYPES_H
-#define UD_TYPES_H
-
-#ifdef __KERNEL__
-  /* -D__KERNEL__ is automatically passed on the command line when
-     building something as part of the Linux kernel */
-# include <linux/kernel.h>
-# include <linux/string.h>
-# ifndef __UD_STANDALONE__
-#  define __UD_STANDALONE__ 1
-#endif
-#endif /* __KERNEL__ */
-
-#if defined(_MSC_VER) || defined(__BORLANDC__)
-# include <stdint.h>
-# include <stdio.h>
-# define inline __inline /* MS Visual Studio requires __inline 
-                            instead of inline for C code */
-#elif !defined(__UD_STANDALONE__)
-# include <stdio.h>
-# include <inttypes.h>
-#endif /* !__UD_STANDALONE__ */
-
-/* gcc specific extensions */
-#ifdef __GNUC__
-# define UD_ATTR_PACKED __attribute__((packed))
-#else
-# define UD_ATTR_PACKED
-#endif /* UD_ATTR_PACKED */
-
-
-/* -----------------------------------------------------------------------------
- * All possible "types" of objects in udis86. Order is Important!
- * -----------------------------------------------------------------------------
- */
-enum ud_type
-{
-  UD_NONE,
-
-  /* 8 bit GPRs */
-  UD_R_AL,  UD_R_CL,  UD_R_DL,  UD_R_BL,
-  UD_R_AH,  UD_R_CH,  UD_R_DH,  UD_R_BH,
-  UD_R_SPL, UD_R_BPL, UD_R_SIL, UD_R_DIL,
-  UD_R_R8B, UD_R_R9B, UD_R_R10B,  UD_R_R11B,
-  UD_R_R12B,  UD_R_R13B,  UD_R_R14B,  UD_R_R15B,
-
-  /* 16 bit GPRs */
-  UD_R_AX,  UD_R_CX,  UD_R_DX,  UD_R_BX,
-  UD_R_SP,  UD_R_BP,  UD_R_SI,  UD_R_DI,
-  UD_R_R8W, UD_R_R9W, UD_R_R10W,  UD_R_R11W,
-  UD_R_R12W,  UD_R_R13W,  UD_R_R14W,  UD_R_R15W,
-  
-  /* 32 bit GPRs */
-  UD_R_EAX, UD_R_ECX, UD_R_EDX, UD_R_EBX,
-  UD_R_ESP, UD_R_EBP, UD_R_ESI, UD_R_EDI,
-  UD_R_R8D, UD_R_R9D, UD_R_R10D,  UD_R_R11D,
-  UD_R_R12D,  UD_R_R13D,  UD_R_R14D,  UD_R_R15D,
-  
-  /* 64 bit GPRs */
-  UD_R_RAX, UD_R_RCX, UD_R_RDX, UD_R_RBX,
-  UD_R_RSP, UD_R_RBP, UD_R_RSI, UD_R_RDI,
-  UD_R_R8,  UD_R_R9,  UD_R_R10, UD_R_R11,
-  UD_R_R12, UD_R_R13, UD_R_R14, UD_R_R15,
-
-  /* segment registers */
-  UD_R_ES,  UD_R_CS,  UD_R_SS,  UD_R_DS,
-  UD_R_FS,  UD_R_GS,  
-
-  /* control registers*/
-  UD_R_CR0, UD_R_CR1, UD_R_CR2, UD_R_CR3,
-  UD_R_CR4, UD_R_CR5, UD_R_CR6, UD_R_CR7,
-  UD_R_CR8, UD_R_CR9, UD_R_CR10,  UD_R_CR11,
-  UD_R_CR12,  UD_R_CR13,  UD_R_CR14,  UD_R_CR15,
-  
-  /* debug registers */
-  UD_R_DR0, UD_R_DR1, UD_R_DR2, UD_R_DR3,
-  UD_R_DR4, UD_R_DR5, UD_R_DR6, UD_R_DR7,
-  UD_R_DR8, UD_R_DR9, UD_R_DR10,  UD_R_DR11,
-  UD_R_DR12,  UD_R_DR13,  UD_R_DR14,  UD_R_DR15,
-
-  /* mmx registers */
-  UD_R_MM0, UD_R_MM1, UD_R_MM2, UD_R_MM3,
-  UD_R_MM4, UD_R_MM5, UD_R_MM6, UD_R_MM7,
-
-  /* x87 registers */
-  UD_R_ST0, UD_R_ST1, UD_R_ST2, UD_R_ST3,
-  UD_R_ST4, UD_R_ST5, UD_R_ST6, UD_R_ST7, 
-
-  /* extended multimedia registers */
-  UD_R_XMM0,  UD_R_XMM1,  UD_R_XMM2,  UD_R_XMM3,
-  UD_R_XMM4,  UD_R_XMM5,  UD_R_XMM6,  UD_R_XMM7,
-  UD_R_XMM8,  UD_R_XMM9,  UD_R_XMM10, UD_R_XMM11,
-  UD_R_XMM12, UD_R_XMM13, UD_R_XMM14, UD_R_XMM15,
-
-  UD_R_RIP,
-
-  /* Operand Types */
-  UD_OP_REG,  UD_OP_MEM,  UD_OP_PTR,  UD_OP_IMM,  
-  UD_OP_JIMM, UD_OP_CONST
-};
-
-#include "itab.h"
-
-union ud_lval {
-  int8_t     sbyte;
-  uint8_t    ubyte;
-  int16_t    sword;
-  uint16_t   uword;
-  int32_t    sdword;
-  uint32_t   udword;
-  int64_t    sqword;
-  uint64_t   uqword;
-  struct {
-    uint16_t seg;
-    uint32_t off;
-  } ptr;
-};
-
-/* -----------------------------------------------------------------------------
- * struct ud_operand - Disassembled instruction Operand.
- * -----------------------------------------------------------------------------
- */
-struct ud_operand {
-  enum ud_type    type;
-  uint8_t         size;
-  enum ud_type    base;
-  enum ud_type    index;
-  uint8_t         scale;  
-  uint8_t         offset;
-  union ud_lval   lval;
-  uint64_t        disp;
-  /*
-   * internal use only
-   */
-  uint8_t         _oprcode;
-};
-
-/* -----------------------------------------------------------------------------
- * struct ud - The udis86 object.
- * -----------------------------------------------------------------------------
- */
-struct ud
-{
-  /*
-   * input buffering
-   */
-  int       (*inp_hook) (struct ud*);
-#ifndef __UD_STANDALONE__
-  FILE*     inp_file;
-#endif
-  uint8_t   inp_curr;
-  uint8_t   inp_fill;
-  uint8_t   inp_ctr;
-  const uint8_t*  inp_buff;
-  const uint8_t*  inp_buff_end;
-  uint8_t   inp_end;
-  uint8_t   inp_cache[256];
-  uint8_t   inp_sess[64];
-
-  void      (*translator)(struct ud*);
-  uint64_t  insn_offset;
-  char      insn_hexcode[64];
-
-  /*
-   * Assembly output buffer
-   */
-  char     *asm_buf;
-  size_t    asm_buf_size;
-  size_t    asm_buf_fill;
-  char      asm_buf_int[128];
-
-  /*
-   * Symbol resolver for use in the translation phase.
-   */
-  const char* (*sym_resolver)(struct ud*, uint64_t addr, int64_t *offset);
-
-  uint8_t   dis_mode;
-  uint64_t  pc;
-  uint8_t   vendor;
-  enum ud_mnemonic_code mnemonic;
-  struct ud_operand operand[3];
-  uint8_t   error;
-  uint8_t   pfx_rex;
-  uint8_t   pfx_seg;
-  uint8_t   pfx_opr;
-  uint8_t   pfx_adr;
-  uint8_t   pfx_lock;
-  uint8_t   pfx_str;
-  uint8_t   pfx_rep;
-  uint8_t   pfx_repe;
-  uint8_t   pfx_repne;
-  uint8_t   default64;
-  uint8_t   opr_mode;
-  uint8_t   adr_mode;
-  uint8_t   br_far;
-  uint8_t   br_near;
-  uint8_t   implicit_addr;
-  uint8_t   have_modrm;
-  uint8_t   modrm;
-  uint8_t   primary_opcode;
-  void *    user_opaque_data;
-  struct ud_itab_entry * itab_entry;
-  struct ud_lookup_table_list_entry *le;
-};
-
-/* -----------------------------------------------------------------------------
- * Type-definitions
- * -----------------------------------------------------------------------------
- */
-typedef enum ud_type          ud_type_t;
-typedef enum ud_mnemonic_code ud_mnemonic_code_t;
-
-typedef struct ud             ud_t;
-typedef struct ud_operand     ud_operand_t;
-
-#define UD_SYN_INTEL          ud_translate_intel
-#define UD_SYN_ATT            ud_translate_att
-#define UD_EOI                (-1)
-#define UD_INP_CACHE_SZ       32
-#define UD_VENDOR_AMD         0
-#define UD_VENDOR_INTEL       1
-#define UD_VENDOR_ANY         2
-
-#endif
-
-/*
-vim: set ts=2 sw=2 expandtab
-*/
diff --git a/third_party/mach_override/libudis86/udint.h b/third_party/mach_override/libudis86/udint.h
deleted file mode 100644
index 92b80190..0000000
--- a/third_party/mach_override/libudis86/udint.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/* udis86 - libudis86/udint.h -- definitions for internal use only
- * 
- * Copyright (c) 2002-2009 Vivek Thampi
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without modification, 
- * are permitted provided that the following conditions are met:
- * 
- *     * Redistributions of source code must retain the above copyright notice, 
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice, 
- *       this list of conditions and the following disclaimer in the documentation 
- *       and/or other materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef _UDINT_H_
-#define _UDINT_H_
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-
-#ifdef HAVE_ASSERT_H
-# include <assert.h>
-# define UD_ASSERT(_x) assert(_x)
-#else
-# define UD_ASSERT(_x)
-#endif /* !HAVE_ASSERT_H */
-
-#ifdef LOGERR
-  #define UDERR(u, msg) \
-    do { \
-      (u)->error = 1; \
-      fprintf(stderr, "decode-error: %s:%d: %s", \
-              __FILE__, __LINE__, (msg)); \
-    } while (0)
-#else
-  #define UDERR(u, m) \
-    do { \
-      (u)->error = 1; \
-    } while (0)
-#endif /* !LOGERR */
-
-#define UD_RETURN_ON_ERROR(u) \
-  do { \
-    if ((u)->error != 0) { \
-      return (u)->error; \
-    } \
-  } while (0)
-
-#define UD_RETURN_WITH_ERROR(u, m) \
-  do { \
-    UDERR(u, m); \
-    return (u)->error; \
-  } while (0)
-
-/* printf formatting int64 specifier */
-#ifdef FMT64
-# undef FMT64
-#endif
-#if defined(_MSC_VER) || defined(__BORLANDC__)
-# define FMT64 "I64"
-#else
-# if defined(__APPLE__)
-#  define FMT64 "ll"
-# elif defined(__amd64__) || defined(__x86_64__)
-#  define FMT64 "l"
-# else 
-#  define FMT64 "ll"
-# endif /* !x64 */
-#endif
-
-#endif /* _UDINT_H_ */
diff --git a/third_party/mach_override/libudis86/udis86.c b/third_party/mach_override/libudis86/udis86.c
deleted file mode 100644
index 4c7bf1f..0000000
--- a/third_party/mach_override/libudis86/udis86.c
+++ /dev/null
@@ -1,304 +0,0 @@
-/* udis86 - libudis86/udis86.c
- *
- * Copyright (c) 2002-2013 Vivek Thampi
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without modification, 
- * are permitted provided that the following conditions are met:
- * 
- *     * Redistributions of source code must retain the above copyright notice, 
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice, 
- *       this list of conditions and the following disclaimer in the documentation 
- *       and/or other materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "input.h"
-#include "extern.h"
-#include "decode.h"
-
-#if !defined(__UD_STANDALONE__)
-# if HAVE_STRING_H
-#  include <string.h>
-# endif
-#endif /* !__UD_STANDALONE__ */
-
-/* =============================================================================
- * ud_init() - Initializes ud_t object.
- * =============================================================================
- */
-extern void 
-ud_init(struct ud* u)
-{
-  memset((void*)u, 0, sizeof(struct ud));
-  ud_set_mode(u, 16);
-  u->mnemonic = UD_Iinvalid;
-  ud_set_pc(u, 0);
-#ifndef __UD_STANDALONE__
-  ud_set_input_file(u, stdin);
-#endif /* __UD_STANDALONE__ */
-
-  ud_set_asm_buffer(u, u->asm_buf_int, sizeof(u->asm_buf_int));
-}
-
-/* =============================================================================
- * ud_disassemble() - disassembles one instruction and returns the number of 
- * bytes disassembled. A zero means end of disassembly.
- * =============================================================================
- */
-extern unsigned int
-ud_disassemble(struct ud* u)
-{
-  if (ud_input_end(u))
-  return 0;
-
-  u->asm_buf[0] = 0;
- 
-  if (ud_decode(u) == 0)
-  return 0;
-  if (u->translator)
-  u->translator(u);
-  return ud_insn_len(u);
-}
-
-/* =============================================================================
- * ud_set_mode() - Set Disassemly Mode.
- * =============================================================================
- */
-extern void 
-ud_set_mode(struct ud* u, uint8_t m)
-{
-  switch(m) {
-  case 16:
-  case 32:
-  case 64: u->dis_mode = m ; return;
-  default: u->dis_mode = 16; return;
-  }
-}
-
-/* =============================================================================
- * ud_set_vendor() - Set vendor.
- * =============================================================================
- */
-extern void 
-ud_set_vendor(struct ud* u, unsigned v)
-{
-  switch(v) {
-  case UD_VENDOR_INTEL:
-    u->vendor = v;
-    break;
-  case UD_VENDOR_ANY:
-    u->vendor = v;
-    break;
-  default:
-    u->vendor = UD_VENDOR_AMD;
-  }
-}
-
-/* =============================================================================
- * ud_set_pc() - Sets code origin. 
- * =============================================================================
- */
-extern void 
-ud_set_pc(struct ud* u, uint64_t o)
-{
-  u->pc = o;
-}
-
-/* =============================================================================
- * ud_set_syntax() - Sets the output syntax.
- * =============================================================================
- */
-extern void 
-ud_set_syntax(struct ud* u, void (*t)(struct ud*))
-{
-  u->translator = t;
-}
-
-/* =============================================================================
- * ud_insn() - returns the disassembled instruction
- * =============================================================================
- */
-const char* 
-ud_insn_asm(const struct ud* u) 
-{
-  return u->asm_buf;
-}
-
-/* =============================================================================
- * ud_insn_offset() - Returns the offset.
- * =============================================================================
- */
-uint64_t
-ud_insn_off(const struct ud* u) 
-{
-  return u->insn_offset;
-}
-
-
-/* =============================================================================
- * ud_insn_hex() - Returns hex form of disassembled instruction.
- * =============================================================================
- */
-const char* 
-ud_insn_hex(struct ud* u) 
-{
-  u->insn_hexcode[0] = 0;
-  if (!u->error) {
-    unsigned int i;
-    unsigned char *src_ptr = inp_sess(u);
-    char* src_hex;
-    src_hex = (char*) u->insn_hexcode;
-    /* for each byte used to decode instruction */
-    for (i = 0; i < u->inp_ctr && i < sizeof(u->insn_hexcode) / 2;
-         ++i, ++src_ptr) {
-      sprintf(src_hex, "%02x", *src_ptr & 0xFF);
-      src_hex += 2;
-    }
-  }
-  return u->insn_hexcode;
-}
-
-
-/* =============================================================================
- * ud_insn_ptr() - Returns code disassembled.
- * =============================================================================
- */
-extern const uint8_t* 
-ud_insn_ptr(const struct ud* u) 
-{
-  return u->inp_sess;
-}
-
-/* =============================================================================
- * ud_insn_len() - Returns the count of bytes disassembled.
- * =============================================================================
- */
-extern unsigned int 
-ud_insn_len(const struct ud* u) 
-{
-  return u->inp_ctr;
-}
-
-
-/* =============================================================================
- * ud_insn_get_opr
- *    Return the operand struct representing the nth operand of
- *    the currently disassembled instruction. Returns NULL if
- *    there's no such operand.
- * =============================================================================
- */
-const struct ud_operand*
-ud_insn_opr(const struct ud *u, unsigned int n)
-{
-  if (n > 2 || u->operand[n].type == UD_NONE) {
-    return NULL; 
-  } else {
-    return &u->operand[n];
-  }
-}
-
-
-/* =============================================================================
- * ud_opr_is_sreg
- *    Returns non-zero if the given operand is of a segment register type.
- * =============================================================================
- */
-int
-ud_opr_is_sreg(const struct ud_operand *opr)
-{
-  return opr->type == UD_OP_REG && 
-         opr->base >= UD_R_ES   &&
-         opr->base <= UD_R_GS;
-}
-
-
-/* =============================================================================
- * ud_opr_is_sreg
- *    Returns non-zero if the given operand is of a general purpose
- *    register type.
- * =============================================================================
- */
-int
-ud_opr_is_gpr(const struct ud_operand *opr)
-{
-  return opr->type == UD_OP_REG && 
-         opr->base >= UD_R_AL   &&
-         opr->base <= UD_R_R15;
-}
-
-
-/* =============================================================================
- * ud_set_user_opaque_data
- * ud_get_user_opaque_data
- *    Get/set user opaqute data pointer
- * =============================================================================
- */
-void
-ud_set_user_opaque_data(struct ud * u, void* opaque)
-{
-  u->user_opaque_data = opaque;
-}
-
-void*
-ud_get_user_opaque_data(const struct ud *u)
-{
-  return u->user_opaque_data;
-}
-
-
-/* =============================================================================
- * ud_set_asm_buffer
- *    Allow the user to set an assembler output buffer. If `buf` is NULL,
- *    we switch back to the internal buffer.
- * =============================================================================
- */
-void
-ud_set_asm_buffer(struct ud *u, char *buf, size_t size)
-{
-  if (buf == NULL) {
-    ud_set_asm_buffer(u, u->asm_buf_int, sizeof(u->asm_buf_int));
-  } else {
-    u->asm_buf = buf;
-    u->asm_buf_size = size;
-  }
-}
-
-
-/* =============================================================================
- * ud_set_sym_resolver
- *    Set symbol resolver for relative targets used in the translation
- *    phase.
- *
- *    The resolver is a function that takes a uint64_t address and returns a
- *    symbolic name for the that address. The function also takes a second
- *    argument pointing to an integer that the client can optionally set to a
- *    non-zero value for offsetted targets. (symbol+offset) The function may
- *    also return NULL, in which case the translator only prints the target
- *    address.
- *
- *    The function pointer maybe NULL which resets symbol resolution.
- * =============================================================================
- */
-void
-ud_set_sym_resolver(struct ud *u, const char* (*resolver)(struct ud*, 
-                                                          uint64_t addr,
-                                                          int64_t *offset))
-{
-  u->sym_resolver = resolver;
-}
-
-/*
-vim:set ts=2 sw=2 expandtab
-*/
diff --git a/third_party/mach_override/mach_override.c b/third_party/mach_override/mach_override.c
deleted file mode 100644
index ca68c0e..0000000
--- a/third_party/mach_override/mach_override.c
+++ /dev/null
@@ -1,741 +0,0 @@
-// mach_override.c semver:1.2.0
-//   Copyright (c) 2003-2012 Jonathan 'Wolf' Rentzsch: http://rentzsch.com
-//   Some rights reserved: http://opensource.org/licenses/mit
-//   https://github.com/rentzsch/mach_override
-
-#include "mach_override.h"
-#if defined(__i386__) || defined(__x86_64__)
-#include "udis86.h"
-#endif
-
-#include <libkern/OSAtomic.h>
-#include <mach-o/dyld.h>
-#include <mach/mach_init.h>
-#include <mach/vm_map.h>
-#include <mach/vm_statistics.h>
-#include <sys/mman.h>
-
-#include <CoreServices/CoreServices.h>
-
-/**************************
-*	
-*	Constants
-*	
-**************************/
-#pragma mark	-
-#pragma mark	(Constants)
-
-#if defined(__ppc__) || defined(__POWERPC__)
-
-long kIslandTemplate[] = {
-	0x9001FFFC,	//	stw		r0,-4(SP)
-	0x3C00DEAD,	//	lis		r0,0xDEAD
-	0x6000BEEF,	//	ori		r0,r0,0xBEEF
-	0x7C0903A6,	//	mtctr	r0
-	0x8001FFFC,	//	lwz		r0,-4(SP)
-	0x60000000,	//	nop		; optionally replaced
-	0x4E800420 	//	bctr
-};
-
-#define kAddressHi			3
-#define kAddressLo			5
-#define kInstructionHi		10
-#define kInstructionLo		11
-
-#elif defined(__i386__)
-
-#define kOriginalInstructionsSize 16
-
-char kIslandTemplate[] = {
-	// kOriginalInstructionsSize nop instructions so that we 
-	// should have enough space to host original instructions 
-	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 
-	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
-	// Now the real jump instruction
-	0xE9, 0xEF, 0xBE, 0xAD, 0xDE
-};
-
-#define kInstructions	0
-#define kJumpAddress    kInstructions + kOriginalInstructionsSize + 1
-#elif defined(__x86_64__)
-
-#define kOriginalInstructionsSize 32
-
-#define kJumpAddress    kOriginalInstructionsSize + 6
-#define kMaxJumpOffset  (0x7fffffffUL)
-
-char kIslandTemplate[] = {
-	// kOriginalInstructionsSize nop instructions so that we 
-	// should have enough space to host original instructions 
-	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 
-	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
-	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 
-	0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
-	// Now the real jump instruction
-	0xFF, 0x25, 0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00,
-        0x00, 0x00, 0x00, 0x00
-};
-
-#endif
-
-#define	kAllocateHigh		1
-#define	kAllocateNormal		0
-
-/**************************
-*	
-*	Data Types
-*	
-**************************/
-#pragma mark	-
-#pragma mark	(Data Types)
-
-typedef	struct	{
-	char	instructions[sizeof(kIslandTemplate)];
-	int		allocatedHigh;
-}	BranchIsland;
-
-/**************************
-*
-*	Statistics
-*
-**************************/
-static volatile int64_t __attribute__((__aligned__((sizeof(int64_t)))))
-    g_mach_override_allocation_attempts = 0;
-
-/**************************
-*	
-*	Funky Protos
-*	
-**************************/
-#pragma mark	-
-#pragma mark	(Funky Protos)
-
-u_int64_t mach_override_ptr_allocation_attempts() {
-  return OSAtomicAdd64(0, &g_mach_override_allocation_attempts);
-}
-
-	mach_error_t
-allocateBranchIsland(
-		BranchIsland	**island,
-		int				allocateHigh,
-		void *originalFunctionAddress);
-
-	mach_error_t
-freeBranchIsland(
-		BranchIsland	*island );
-
-#if defined(__ppc__) || defined(__POWERPC__)
-	mach_error_t
-setBranchIslandTarget(
-		BranchIsland	*island,
-		const void		*branchTo,
-		long			instruction );
-#endif 
-
-#if defined(__i386__) || defined(__x86_64__)
-mach_error_t
-setBranchIslandTarget_i386(
-						   BranchIsland	*island,
-						   const void		*branchTo,
-						   char*			instructions );
-void 
-atomic_mov64(
-		uint64_t *targetAddress,
-		uint64_t value );
-
-	static Boolean 
-eatKnownInstructions( 
-	unsigned char	*code, 
-	uint64_t		*newInstruction,
-	int				*howManyEaten, 
-	char			*originalInstructions,
-	int				*originalInstructionCount, 
-	uint8_t			*originalInstructionSizes );
-
-	static void
-fixupInstructions(
-    void		*originalFunction,
-    void		*escapeIsland,
-    void		*instructionsToFix,
-	int			instructionCount,
-	uint8_t		*instructionSizes );
-#endif
-
-/*******************************************************************************
-*	
-*	Interface
-*	
-*******************************************************************************/
-#pragma mark	-
-#pragma mark	(Interface)
-
-#if defined(__i386__) || defined(__x86_64__)
-mach_error_t makeIslandExecutable(void *address) {
-	mach_error_t err = err_none;
-    uintptr_t page = (uintptr_t)address & ~(uintptr_t)(PAGE_SIZE - 1);
-    int e = err_none;
-    e |= mprotect((void *)page, PAGE_SIZE, PROT_EXEC | PROT_READ);
-    e |= msync((void *)page, PAGE_SIZE, MS_INVALIDATE );
-    if (e) {
-        err = err_cannot_override;
-    }
-    return err;
-}
-#endif
-
-    mach_error_t
-mach_override_ptr(
-	void *originalFunctionAddress,
-    const void *overrideFunctionAddress,
-    void **originalFunctionReentryIsland )
-{
-	assert( originalFunctionAddress );
-	assert( overrideFunctionAddress );
-	
-	// this addresses overriding such functions as AudioOutputUnitStart()
-	// test with modified DefaultOutputUnit project
-#if defined(__x86_64__)
-    for(;;){
-        if(*(uint16_t*)originalFunctionAddress==0x25FF)    // jmp qword near [rip+0x????????]
-            originalFunctionAddress=*(void**)((char*)originalFunctionAddress+6+*(int32_t *)((uint16_t*)originalFunctionAddress+1));
-        else break;
-    }
-#elif defined(__i386__)
-    for(;;){
-        if(*(uint16_t*)originalFunctionAddress==0x25FF)    // jmp *0x????????
-            originalFunctionAddress=**(void***)((uint16_t*)originalFunctionAddress+1);
-        else break;
-    }
-#endif
-
-	long	*originalFunctionPtr = (long*) originalFunctionAddress;
-	mach_error_t	err = err_none;
-	
-#if defined(__ppc__) || defined(__POWERPC__)
-	//	Ensure first instruction isn't 'mfctr'.
-	#define	kMFCTRMask			0xfc1fffff
-	#define	kMFCTRInstruction	0x7c0903a6
-	
-	long	originalInstruction = *originalFunctionPtr;
-	if( !err && ((originalInstruction & kMFCTRMask) == kMFCTRInstruction) )
-		err = err_cannot_override;
-#elif defined(__i386__) || defined(__x86_64__)
-	int eatenCount = 0;
-	int originalInstructionCount = 0;
-	char originalInstructions[kOriginalInstructionsSize];
-	uint8_t originalInstructionSizes[kOriginalInstructionsSize];
-	uint64_t jumpRelativeInstruction = 0; // JMP
-
-	Boolean overridePossible = eatKnownInstructions ((unsigned char *)originalFunctionPtr, 
-										&jumpRelativeInstruction, &eatenCount, 
-										originalInstructions, &originalInstructionCount, 
-										originalInstructionSizes );
-	if (eatenCount > kOriginalInstructionsSize) {
-		//printf ("Too many instructions eaten\n");
-		overridePossible = false;
-	}
-	if (!overridePossible) err = err_cannot_override;
-	if (err) fprintf(stderr, "err = %x %s:%d\n", err, __FILE__, __LINE__);
-#endif
-	
-	//	Make the original function implementation writable.
-	if( !err ) {
-		err = vm_protect( mach_task_self(),
-				(vm_address_t) originalFunctionPtr, 8, false,
-				(VM_PROT_ALL | VM_PROT_COPY) );
-		if( err )
-			err = vm_protect( mach_task_self(),
-					(vm_address_t) originalFunctionPtr, 8, false,
-					(VM_PROT_DEFAULT | VM_PROT_COPY) );
-	}
-	if (err) fprintf(stderr, "err = %x %s:%d\n", err, __FILE__, __LINE__);
-	
-	//	Allocate and target the escape island to the overriding function.
-	BranchIsland	*escapeIsland = NULL;
-	if( !err )	
-		err = allocateBranchIsland( &escapeIsland, kAllocateHigh, originalFunctionAddress );
-		if (err) fprintf(stderr, "err = %x %s:%d\n", err, __FILE__, __LINE__);
-
-	
-#if defined(__ppc__) || defined(__POWERPC__)
-	if( !err )
-		err = setBranchIslandTarget( escapeIsland, overrideFunctionAddress, 0 );
-	
-	//	Build the branch absolute instruction to the escape island.
-	long	branchAbsoluteInstruction = 0; // Set to 0 just to silence warning.
-	if( !err ) {
-		long escapeIslandAddress = ((long) escapeIsland) & 0x3FFFFFF;
-		branchAbsoluteInstruction = 0x48000002 | escapeIslandAddress;
-	}
-#elif defined(__i386__) || defined(__x86_64__)
-        if (err) fprintf(stderr, "err = %x %s:%d\n", err, __FILE__, __LINE__);
-
-	if( !err )
-		err = setBranchIslandTarget_i386( escapeIsland, overrideFunctionAddress, 0 );
- 
-	if (err) fprintf(stderr, "err = %x %s:%d\n", err, __FILE__, __LINE__);
-	// Build the jump relative instruction to the escape island
-#endif
-
-
-#if defined(__i386__) || defined(__x86_64__)
-	if (!err) {
-		// TODO: On 64-bit, move to opcode FF/4 (jmp 64-bit absolute indirect)
-		// instead of E9 (jmp 32-bit relative to RIP). Then we should update
-		// allocateBranchIsland to simply allocate any page in the address space.
-		// See the 64-bit version of kIslandTemplate array.
-		int64_t addressOffset64 = ((char*)escapeIsland - (char*)originalFunctionPtr - 5);
-		int32_t addressOffset = addressOffset64;
-		assert(addressOffset64 == addressOffset);
-		addressOffset = OSSwapInt32(addressOffset);
-		
-		jumpRelativeInstruction |= 0xE900000000000000LL; 
-		jumpRelativeInstruction |= ((uint64_t)addressOffset & 0xffffffff) << 24;
-		jumpRelativeInstruction = OSSwapInt64(jumpRelativeInstruction);		
-	}
-#endif
-	
-	//	Optionally allocate & return the reentry island. This may contain relocated
-	//  jmp instructions and so has all the same addressing reachability requirements
-	//  the escape island has to the original function, except the escape island is
-	//  technically our original function.
-	BranchIsland	*reentryIsland = NULL;
-	if( !err && originalFunctionReentryIsland ) {
-		err = allocateBranchIsland( &reentryIsland, kAllocateHigh, escapeIsland);
-		if( !err )
-			*originalFunctionReentryIsland = reentryIsland;
-	}
-	
-#if defined(__ppc__) || defined(__POWERPC__)	
-	//	Atomically:
-	//	o If the reentry island was allocated:
-	//		o Insert the original instruction into the reentry island.
-	//		o Target the reentry island at the 2nd instruction of the
-	//		  original function.
-	//	o Replace the original instruction with the branch absolute.
-	if( !err ) {
-		int escapeIslandEngaged = false;
-		do {
-			if( reentryIsland )
-				err = setBranchIslandTarget( reentryIsland,
-						(void*) (originalFunctionPtr+1), originalInstruction );
-			if( !err ) {
-				escapeIslandEngaged = CompareAndSwap( originalInstruction,
-										branchAbsoluteInstruction,
-										(UInt32*)originalFunctionPtr );
-				if( !escapeIslandEngaged ) {
-					//	Someone replaced the instruction out from under us,
-					//	re-read the instruction, make sure it's still not
-					//	'mfctr' and try again.
-					originalInstruction = *originalFunctionPtr;
-					if( (originalInstruction & kMFCTRMask) == kMFCTRInstruction)
-						err = err_cannot_override;
-				}
-			}
-		} while( !err && !escapeIslandEngaged );
-	}
-#elif defined(__i386__) || defined(__x86_64__)
-	// Atomically:
-	//	o If the reentry island was allocated:
-	//		o Insert the original instructions into the reentry island.
-	//		o Target the reentry island at the first non-replaced 
-	//        instruction of the original function.
-	//	o Replace the original first instructions with the jump relative.
-	//
-	// Note that on i386, we do not support someone else changing the code under our feet
-	if ( !err ) {
-		fixupInstructions(originalFunctionPtr, reentryIsland, originalInstructions,
-					originalInstructionCount, originalInstructionSizes );
-	
-		if( reentryIsland )
-			err = setBranchIslandTarget_i386( reentryIsland,
-										 (void*) ((char *)originalFunctionPtr+eatenCount), originalInstructions );
-		// try making islands executable before planting the jmp
-#if defined(__x86_64__) || defined(__i386__)
-        if( !err )
-            err = makeIslandExecutable(escapeIsland);
-        if( !err && reentryIsland )
-            err = makeIslandExecutable(reentryIsland);
-#endif
-		if ( !err )
-			atomic_mov64((uint64_t *)originalFunctionPtr, jumpRelativeInstruction);
-		mach_error_t prot_err = err_none;
-		prot_err = vm_protect( mach_task_self(),
-				       (vm_address_t) originalFunctionPtr, 8, false,
-				       (VM_PROT_READ | VM_PROT_EXECUTE) );
-		if(prot_err) fprintf(stderr, "err = %x %s:%d\n", prot_err, __FILE__, __LINE__);
-	}
-#endif
-	
-	//	Clean up on error.
-	if( err ) {
-		if( reentryIsland )
-			freeBranchIsland( reentryIsland );
-		if( escapeIsland )
-			freeBranchIsland( escapeIsland );
-	}
-
-	return err;
-}
-
-/*******************************************************************************
-*	
-*	Implementation
-*	
-*******************************************************************************/
-#pragma mark	-
-#pragma mark	(Implementation)
-
-/*******************************************************************************
-	Implementation: Allocates memory for a branch island.
-	
-	@param	island			<-	The allocated island.
-	@param	allocateHigh	->	Whether to allocate the island at the end of the
-								address space (for use with the branch absolute
-								instruction).
-	@result					<-	mach_error_t
-
-	***************************************************************************/
-
-	mach_error_t
-allocateBranchIsland(
-		BranchIsland	**island,
-		int				allocateHigh,
-		void *originalFunctionAddress)
-{
-	assert( island );
-
-	mach_error_t	err = err_none;
-	
-	if( allocateHigh ) {
-		assert( sizeof( BranchIsland ) <= PAGE_SIZE );
-		vm_address_t page = 0;
-#if defined(__i386__)
-		OSAtomicAdd64(1, &g_mach_override_allocation_attempts);
-		err = vm_allocate( mach_task_self(), &page, PAGE_SIZE, VM_FLAGS_ANYWHERE );
-		if( err == err_none )
-			*island = (BranchIsland*) page;
-#else
-
-#if defined(__ppc__) || defined(__POWERPC__)
-		vm_address_t first = 0xfeffffff;
-		vm_address_t last = 0xfe000000 + PAGE_SIZE;
-#elif defined(__x86_64__)
-		// This logic is more complex due to the 32-bit limit of the jump out
-		// of the original function. Once that limitation is removed, we can
-		// use vm_allocate with VM_FLAGS_ANYWHERE as in the i386 code above.
-		const uint64_t kPageMask = ~(PAGE_SIZE - 1);
-		vm_address_t first = (uint64_t)originalFunctionAddress - kMaxJumpOffset;
-		first = (first & kPageMask) + PAGE_SIZE; // Align up to the next page start
-		if (first > (uint64_t)originalFunctionAddress) first = 0;
-		vm_address_t last = (uint64_t)originalFunctionAddress + kMaxJumpOffset;
-		if (last < (uint64_t)originalFunctionAddress) last = ULONG_MAX;
-#endif
-
-		page = first;
-		int allocated = 0;
-		vm_map_t task_self = mach_task_self();
-
-		while( !err && !allocated && page < last ) {
-
-			OSAtomicAdd64(1, &g_mach_override_allocation_attempts);
-			err = vm_allocate( task_self, &page, PAGE_SIZE, 0 );
-			if( err == err_none )
-				allocated = 1;
-			else if( err == KERN_NO_SPACE || err == KERN_INVALID_ADDRESS) {
-#if defined(__x86_64__)
-				// This memory region is not suitable, skip it:
-				vm_size_t region_size;
-				mach_msg_type_number_t int_count = VM_REGION_BASIC_INFO_COUNT_64;
-				vm_region_basic_info_data_64_t vm_region_info;
-				mach_port_t object_name;
-				// The call will move 'page' to the beginning of the region:
-				err = vm_region_64(task_self, &page, &region_size,
-							VM_REGION_BASIC_INFO_64, (vm_region_info_t)&vm_region_info,
-							&int_count, &object_name);
-				if (err == KERN_SUCCESS)
-					page += region_size;
-				else
-					break;
-#else
-				page += PAGE_SIZE;
-#endif
-				err = err_none;
-			}
-		}
-		if( allocated )
-			*island = (BranchIsland*) page;
-		else if( !allocated && !err )
-			err = KERN_NO_SPACE;
-#endif
-	} else {
-		OSAtomicAdd64(1, &g_mach_override_allocation_attempts);
-		void *block = malloc( sizeof( BranchIsland ) );
-		if( block )
-			*island = block;
-		else
-			err = KERN_NO_SPACE;
-	}
-	if( !err )
-		(**island).allocatedHigh = allocateHigh;
-
-	return err;
-}
-
-/*******************************************************************************
-	Implementation: Deallocates memory for a branch island.
-	
-	@param	island	->	The island to deallocate.
-	@result			<-	mach_error_t
-
-	***************************************************************************/
-
-	mach_error_t
-freeBranchIsland(
-		BranchIsland	*island )
-{
-	assert( island );
-	assert( (*(long*)&island->instructions[0]) == kIslandTemplate[0] );
-	assert( island->allocatedHigh );
-	
-	mach_error_t	err = err_none;
-	
-	if( island->allocatedHigh ) {
-		assert( sizeof( BranchIsland ) <= PAGE_SIZE );
-		err = vm_deallocate(mach_task_self(), (vm_address_t) island, PAGE_SIZE );
-	} else {
-		free( island );
-	}
-	
-	return err;
-}
-
-/*******************************************************************************
-	Implementation: Sets the branch island's target, with an optional
-	instruction.
-	
-	@param	island		->	The branch island to insert target into.
-	@param	branchTo	->	The address of the target.
-	@param	instruction	->	Optional instruction to execute prior to branch. Set
-							to zero for nop.
-	@result				<-	mach_error_t
-
-	***************************************************************************/
-#if defined(__ppc__) || defined(__POWERPC__)
-	mach_error_t
-setBranchIslandTarget(
-		BranchIsland	*island,
-		const void		*branchTo,
-		long			instruction )
-{
-	//	Copy over the template code.
-    bcopy( kIslandTemplate, island->instructions, sizeof( kIslandTemplate ) );
-    
-    //	Fill in the address.
-    ((short*)island->instructions)[kAddressLo] = ((long) branchTo) & 0x0000FFFF;
-    ((short*)island->instructions)[kAddressHi]
-    	= (((long) branchTo) >> 16) & 0x0000FFFF;
-    
-    //	Fill in the (optional) instuction.
-    if( instruction != 0 ) {
-        ((short*)island->instructions)[kInstructionLo]
-        	= instruction & 0x0000FFFF;
-        ((short*)island->instructions)[kInstructionHi]
-        	= (instruction >> 16) & 0x0000FFFF;
-    }
-    
-    //MakeDataExecutable( island->instructions, sizeof( kIslandTemplate ) );
-	msync( island->instructions, sizeof( kIslandTemplate ), MS_INVALIDATE );
-    
-    return err_none;
-}
-#endif 
-
-#if defined(__i386__)
-	mach_error_t
-setBranchIslandTarget_i386(
-	BranchIsland	*island,
-	const void		*branchTo,
-	char*			instructions )
-{
-
-	//	Copy over the template code.
-    bcopy( kIslandTemplate, island->instructions, sizeof( kIslandTemplate ) );
-
-	// copy original instructions
-	if (instructions) {
-		bcopy (instructions, island->instructions + kInstructions, kOriginalInstructionsSize);
-	}
-	
-    // Fill in the address.
-    int32_t addressOffset = (char *)branchTo - (island->instructions + kJumpAddress + 4);
-    *((int32_t *)(island->instructions + kJumpAddress)) = addressOffset; 
-
-    msync( island->instructions, sizeof( kIslandTemplate ), MS_INVALIDATE );
-    return err_none;
-}
-
-#elif defined(__x86_64__)
-mach_error_t
-setBranchIslandTarget_i386(
-        BranchIsland	*island,
-        const void		*branchTo,
-        char*			instructions )
-{
-    // Copy over the template code.
-    bcopy( kIslandTemplate, island->instructions, sizeof( kIslandTemplate ) );
-
-    // Copy original instructions.
-    if (instructions) {
-        bcopy (instructions, island->instructions, kOriginalInstructionsSize);
-    }
-
-    //	Fill in the address.
-    *((uint64_t *)(island->instructions + kJumpAddress)) = (uint64_t)branchTo; 
-    msync( island->instructions, sizeof( kIslandTemplate ), MS_INVALIDATE );
-
-    return err_none;
-}
-#endif
-
-
-#if defined(__i386__) || defined(__x86_64__)
-	static Boolean 
-eatKnownInstructions( 
-	unsigned char	*code, 
-	uint64_t		*newInstruction,
-	int				*howManyEaten, 
-	char			*originalInstructions,
-	int				*originalInstructionCount, 
-	uint8_t			*originalInstructionSizes )
-{
-	Boolean allInstructionsKnown = true;
-	int totalEaten = 0;
-	int remainsToEat = 5; // a JMP instruction takes 5 bytes
-	int instructionIndex = 0;
-	ud_t ud_obj;
-	
-	if (howManyEaten) *howManyEaten = 0;
-	if (originalInstructionCount) *originalInstructionCount = 0;
-	ud_init(&ud_obj);
-#if defined(__i386__)
-	ud_set_mode(&ud_obj, 32);
-#else
-	ud_set_mode(&ud_obj, 64);
-#endif
-	ud_set_input_buffer(&ud_obj, code, 64); // Assume that 'code' points to at least 64bytes of data.
-	while (remainsToEat > 0) {
-		if (!ud_disassemble(&ud_obj)) {
-		    allInstructionsKnown = false;
-		    fprintf(stderr, "mach_override: some instructions unknown! Need to update libudis86\n");
-		    break;
-		}
-		
-		// At this point, we've matched curInstr
-		int eaten = ud_insn_len(&ud_obj);
-		remainsToEat -= eaten;
-		totalEaten += eaten;
-		
-		if (originalInstructionSizes) originalInstructionSizes[instructionIndex] = eaten;
-		instructionIndex += 1;
-		if (originalInstructionCount) *originalInstructionCount = instructionIndex;
-	}
-
-
-	if (howManyEaten) *howManyEaten = totalEaten;
-
-	if (originalInstructions) {
-		Boolean enoughSpaceForOriginalInstructions = (totalEaten < kOriginalInstructionsSize);
-		
-		if (enoughSpaceForOriginalInstructions) {
-			memset(originalInstructions, 0x90 /* NOP */, kOriginalInstructionsSize); // fill instructions with NOP
-			bcopy(code, originalInstructions, totalEaten);
-		} else {
-			// printf ("Not enough space in island to store original instructions. Adapt the island definition and kOriginalInstructionsSize\n");
-			return false;
-		}
-	}
-	
-	if (allInstructionsKnown) {
-		// save last 3 bytes of first 64bits of codre we'll replace
-		uint64_t currentFirst64BitsOfCode = *((uint64_t *)code);
-		currentFirst64BitsOfCode = OSSwapInt64(currentFirst64BitsOfCode); // back to memory representation
-		currentFirst64BitsOfCode &= 0x0000000000FFFFFFLL; 
-		
-		// keep only last 3 instructions bytes, first 5 will be replaced by JMP instr
-		*newInstruction &= 0xFFFFFFFFFF000000LL; // clear last 3 bytes
-		*newInstruction |= (currentFirst64BitsOfCode & 0x0000000000FFFFFFLL); // set last 3 bytes
-	}
-
-	return allInstructionsKnown;
-}
-
-	static void
-fixupInstructions(
-    void		*originalFunction,
-    void		*escapeIsland,
-    void		*instructionsToFix,
-	int			instructionCount,
-	uint8_t		*instructionSizes )
-{
-	int	index;
-	for (index = 0;index < instructionCount;index += 1)
-	{
-		if (*(uint8_t*)instructionsToFix == 0xE9) // 32-bit jump relative
-		{
-			uint32_t offset = (uintptr_t)originalFunction - (uintptr_t)escapeIsland;
-			uint32_t *jumpOffsetPtr = (uint32_t*)((uintptr_t)instructionsToFix + 1);
-			*jumpOffsetPtr += offset;
-		}
-		
-		originalFunction = (void*)((uintptr_t)originalFunction + instructionSizes[index]);
-		escapeIsland = (void*)((uintptr_t)escapeIsland + instructionSizes[index]);
-		instructionsToFix = (void*)((uintptr_t)instructionsToFix + instructionSizes[index]);
-    }
-}
-
-#if defined(__i386__)
-__asm(
-			".text;"
-			".align 2, 0x90;"
-			"_atomic_mov64:;"
-			"	pushl %ebp;"
-			"	movl %esp, %ebp;"
-			"	pushl %esi;"
-			"	pushl %ebx;"
-			"	pushl %ecx;"
-			"	pushl %eax;"
-			"	pushl %edx;"
-	
-			// atomic push of value to an address
-			// we use cmpxchg8b, which compares content of an address with 
-			// edx:eax. If they are equal, it atomically puts 64bit value 
-			// ecx:ebx in address. 
-			// We thus put contents of address in edx:eax to force ecx:ebx
-			// in address
-			"	mov		8(%ebp), %esi;"  // esi contains target address
-			"	mov		12(%ebp), %ebx;"
-			"	mov		16(%ebp), %ecx;" // ecx:ebx now contains value to put in target address
-			"	mov		(%esi), %eax;"
-			"	mov		4(%esi), %edx;"  // edx:eax now contains value currently contained in target address
-			"	lock; cmpxchg8b	(%esi);" // atomic move.
-			
-			// restore registers
-			"	popl %edx;"
-			"	popl %eax;"
-			"	popl %ecx;"
-			"	popl %ebx;"
-			"	popl %esi;"
-			"	popl %ebp;"
-			"	ret"
-);
-#elif defined(__x86_64__)
-void atomic_mov64(
-		uint64_t *targetAddress,
-		uint64_t value )
-{
-    *targetAddress = value;
-}
-#endif
-#endif
diff --git a/third_party/mach_override/mach_override.h b/third_party/mach_override/mach_override.h
deleted file mode 100644
index 253f273..0000000
--- a/third_party/mach_override/mach_override.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// mach_override.h semver:1.2.0
-//   Copyright (c) 2003-2012 Jonathan 'Wolf' Rentzsch: http://rentzsch.com
-//   Some rights reserved: http://opensource.org/licenses/mit
-//   https://github.com/rentzsch/mach_override
-
-#ifndef		_mach_override_
-#define		_mach_override_
-
-#include <sys/types.h>
-#include <mach/error.h>
-
-#define	err_cannot_override	(err_local|1)
-
-__BEGIN_DECLS
-
-/****************************************************************************************
-	Dynamically overrides the function implementation referenced by
-	originalFunctionAddress with the implentation pointed to by overrideFunctionAddress.
-	Optionally returns a pointer to a "reentry island" which, if jumped to, will resume
-	the original implementation.
-	
-	@param	originalFunctionAddress			->	Required address of the function to
-												override (with overrideFunctionAddress).
-	@param	overrideFunctionAddress			->	Required address to the overriding
-												function.
-	@param	originalFunctionReentryIsland	<-	Optional pointer to pointer to the
-												reentry island. Can be NULL.
-	@result									<-	err_cannot_override if the original
-												function's implementation begins with
-												the 'mfctr' instruction.
-
-	************************************************************************************/
-
-    mach_error_t
-mach_override_ptr(
-	void *originalFunctionAddress,
-    const void *overrideFunctionAddress,
-    void **originalFunctionReentryIsland );
-
-/****************************************************************************************
-	mach_override_ptr makes multiple allocation attempts with vm_allocate or malloc,
-  until a suitable address is found for the branch islands. This method returns the
-  global number of such attempts made by all mach_override_ptr calls so far. This
-  statistic is provided for testing purposes and it can be off, if mach_override_ptr
-  is called by multiple threads.
-
-	@result									<-	Total number of vm_allocate calls so far.
-
-	************************************************************************************/
-u_int64_t mach_override_ptr_allocation_attempts();
-
-__END_DECLS
-
-/****************************************************************************************
-	If you're using C++ this macro will ease the tedium of typedef'ing, naming, keeping
-	track of reentry islands and defining your override code. See test_mach_override.cp
-	for example usage.
-
-	************************************************************************************/
- 
-#ifdef	__cplusplus
-#define MACH_OVERRIDE( ORIGINAL_FUNCTION_RETURN_TYPE, ORIGINAL_FUNCTION_NAME, ORIGINAL_FUNCTION_ARGS, ERR )		\
-{																												\
-	static ORIGINAL_FUNCTION_RETURN_TYPE (*ORIGINAL_FUNCTION_NAME##_reenter)ORIGINAL_FUNCTION_ARGS;				\
-	static bool ORIGINAL_FUNCTION_NAME##_overriden = false;														\
-	class mach_override_class__##ORIGINAL_FUNCTION_NAME {														\
-	public:																										\
-		static kern_return_t override(void *originalFunctionPtr) {												\
-			kern_return_t result = err_none;																	\
-			if (!ORIGINAL_FUNCTION_NAME##_overriden) {															\
-				ORIGINAL_FUNCTION_NAME##_overriden = true;														\
-				result = mach_override_ptr( (void*)originalFunctionPtr,											\
-											(void*)mach_override_class__##ORIGINAL_FUNCTION_NAME::replacement,	\
-											(void**)&ORIGINAL_FUNCTION_NAME##_reenter );						\
-			}																									\
-			return result;																						\
-		}																										\
-		static ORIGINAL_FUNCTION_RETURN_TYPE replacement ORIGINAL_FUNCTION_ARGS {
-
-#define END_MACH_OVERRIDE( ORIGINAL_FUNCTION_NAME )																\
-		}																										\
-	};																											\
-																												\
-	err = mach_override_class__##ORIGINAL_FUNCTION_NAME::override((void*)ORIGINAL_FUNCTION_NAME);				\
-}
-#endif
-
-#endif	//	_mach_override_
diff --git a/third_party/mach_override/udis86.h b/third_party/mach_override/udis86.h
deleted file mode 100644
index e2aa8ed..0000000
--- a/third_party/mach_override/udis86.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* udis86 - udis86.h
- *
- * Copyright (c) 2002-2009 Vivek Thampi
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without modification, 
- * are permitted provided that the following conditions are met:
- * 
- *     * Redistributions of source code must retain the above copyright notice, 
- *       this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright notice, 
- *       this list of conditions and the following disclaimer in the documentation 
- *       and/or other materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef UDIS86_H
-#define UDIS86_H
-
-#include "third_party/mach_override/libudis86/types.h"
-#include "third_party/mach_override/libudis86/extern.h"
-#include "third_party/mach_override/libudis86/itab.h"
-
-#endif
diff --git a/third_party/vulkan/OWNERS b/third_party/vulkan/OWNERS
index 211e038..f119de20 100644
--- a/third_party/vulkan/OWNERS
+++ b/third_party/vulkan/OWNERS
@@ -1,3 +1,4 @@
+penghuang@chromium.org
 piman@chromium.org
 vmiura@chromium.org
 
diff --git a/tools/android/asan/third_party/with_asan.py b/tools/android/asan/third_party/with_asan.py
index 64bc531..23050205 100755
--- a/tools/android/asan/third_party/with_asan.py
+++ b/tools/android/asan/third_party/with_asan.py
@@ -15,7 +15,9 @@
     os.path.join(os.path.dirname(__file__), '..', '..', '..', '..'))
 
 sys.path.append(os.path.join(_SRC_ROOT, 'third_party', 'catapult', 'devil'))
+from devil.android import device_errors
 from devil.android import device_utils
+from devil.android.sdk import adb_wrapper
 from devil.android.sdk import version_codes
 from devil.utils import logging_common
 
@@ -46,7 +48,17 @@
         logging.info('disable-verity output:')
         for line in verity_output.splitlines():
           logging.info('  %s', line)
-      device.Reboot()
+      try:
+        device.Reboot()
+      except device_errors.CommandFailedError:
+        logging.exception('Failed to reboot device.')
+        logging.error('Devices visible to adb:')
+        for entry in adb_wrapper.AdbWrapper.Devices(desired_state=None,
+                                                    long_list=True):
+          logging.error('  %s: %s',
+                        entry[0].GetDeviceSerial(),
+                        ' '.join(entry[1:]))
+
     # Call EnableRoot prior to asan_device_setup.sh to ensure it doesn't
     # get tripped up by the root timeout.
     device.EnableRoot()
diff --git a/tools/binary_size/README.md b/tools/binary_size/README.md
index 589a9803..99560db 100644
--- a/tools/binary_size/README.md
+++ b/tools/binary_size/README.md
@@ -217,11 +217,6 @@
 **Note:** Refer to
 [diagnose_bloat.py](https://cs.chromium.org/search/?q=file:diagnose_bloat.py+gn_args)
 for list of GN args to build a Release binary (or just use the tool with --single).
-
-**Googlers:** If you just want a `.size` for a commit on master:
-
-    GIT_REV="HEAD~200"
-    tools/binary_size/diagnose_bloat.py --single --cloud --unstripped $GIT_REV
 ***
 
 Example Usage:
@@ -327,8 +322,6 @@
 
 1. Builds multiple revisions using release GN args.
    * Default is to build just two revisions (before & after commit)
-   * Rather than building, can fetch build artifacts and `.size` files from perf
-     bots (`--cloud`)
 1. Measures all outputs using `resource_size.py` and `supersize`.
 1. Saves & displays a breakdown of the difference in binary sizes.
 
@@ -344,12 +337,6 @@
 # Build and diff monochrome_public_apk HEAD^ and HEAD without is_official_build.
 tools/binary_size/diagnose_bloat.py HEAD --gn-args="is_official_build=false" -v
 
-# Diff BEFORE_REV and AFTER_REV using build artifacts downloaded from perf bots.
-tools/binary_size/diagnose_bloat.py AFTER_REV --reference-rev BEFORE_REV --cloud -v
-
-# Fetch a .size, libmonochrome.so, and MonochromePublic.apk from perf bots (Googlers only):
-tools/binary_size/diagnose_bloat.py AFTER_REV --cloud --unstripped --single
-
 # Build and diff all contiguous revs in range BEFORE_REV..AFTER_REV for src/v8.
 tools/binary_size/diagnose_bloat.py AFTER_REV --reference-rev BEFORE_REV --subrepo v8 --all -v
 
diff --git a/tools/binary_size/diagnose_bloat.py b/tools/binary_size/diagnose_bloat.py
index 3ff8c7a..1d8149d4 100755
--- a/tools/binary_size/diagnose_bloat.py
+++ b/tools/binary_size/diagnose_bloat.py
@@ -7,8 +7,7 @@
 
 See //tools/binary_size/README.md for example usage.
 
-Note: this tool will perform gclient sync/git checkout on your local repo if
-you don't use the --cloud option.
+Note: this tool will perform gclient sync/git checkout on your local repo.
 """
 
 import atexit
@@ -220,7 +219,6 @@
   """Helper class for generating and building targets."""
   def __init__(self, args):
     self.clean = args.clean
-    self.cloud = args.cloud
     self.enable_chrome_android_internal = args.enable_chrome_android_internal
     self.extra_gn_args_str = args.gn_args
     self.apply_patch = args.extra_rev
@@ -263,8 +261,7 @@
 
   @property
   def main_lib_path(self):
-    # Cannot extract this from GN because --cloud needs to work without GN.
-    # TODO(agrieve): Could maybe extract from .apk?
+    # TODO(agrieve): Could maybe extract from .apk or GN?
     if self.IsLinux():
       return 'chrome'
     if 'monochrome' in self.target or 'trichrome' in self.target:
@@ -280,15 +277,6 @@
     return os.path.join(self.output_directory, self.main_lib_path)
 
   @property
-  def builder_url(self):
-    url = 'https://build.chromium.org/p/chromium.perf/builders/%s%%20Builder'
-    return url % self.target_os.title()
-
-  @property
-  def download_bucket(self):
-    return 'gs://chrome-perf/%s Builder/' % self.target_os.title()
-
-  @property
   def map_file_path(self):
     return self.main_lib_path + '.map.gz'
 
@@ -368,18 +356,12 @@
     return _RunCmd(
         self._GenNinjaCmd(), verbose=True, exit_on_failure=False)[1]
 
-  def DownloadUrl(self, rev):
-    return self.download_bucket + 'full-build-linux_%s.zip' % rev
-
   def IsAndroid(self):
     return self.target_os == 'android'
 
   def IsLinux(self):
     return self.target_os == 'linux'
 
-  def IsCloud(self):
-    return self.cloud
-
 
 class _BuildArchive(object):
   """Class for managing a directory with build results and build metadata."""
@@ -422,10 +404,10 @@
     return os.path.join(self.dir, self.build.size_name)
 
   def _ArchiveResourceSizes(self):
-    cmd = [_RESOURCE_SIZES_PATH, self.build.abs_apk_path,'--output-dir',
-           self.dir, '--chartjson']
-    if not self.build.IsCloud():
-      cmd += ['--chromium-output-dir', self.build.output_directory]
+    cmd = [
+        _RESOURCE_SIZES_PATH, self.build.abs_apk_path, '--output-dir', self.dir,
+        '--chartjson', '--chromium-output-dir', self.build.output_directory
+    ]
     if self._slow_options:
       cmd += ['--estimate-patch-size', '--dump-static-initializers']
     _RunCmd(cmd)
@@ -441,14 +423,13 @@
       logging.info('Found existing .size file')
       shutil.copy(existing_size_file, self.archived_size_path)
     else:
-      supersize_cmd = [supersize_path, 'archive', self.archived_size_path,
-                       '--elf-file', self.build.abs_main_lib_path]
+      supersize_cmd = [
+          supersize_path, 'archive', self.archived_size_path, '--elf-file',
+          self.build.abs_main_lib_path, '--output-directory',
+          self.build.output_directory
+      ]
       if tool_prefix:
         supersize_cmd += ['--tool-prefix', tool_prefix]
-      if self.build.IsCloud():
-        supersize_cmd += ['--no-source-paths']
-      else:
-        supersize_cmd += ['--output-directory', self.build.output_directory]
       if self.build.IsAndroid():
         supersize_cmd += ['-f', self.build.abs_apk_path]
       logging.info('Creating .size file')
@@ -586,14 +567,12 @@
 class _Metadata(object):
 
   def __init__(self, archives, build, path, subrepo):
-    self.is_cloud = build.IsCloud()
     self.data = {
       'revs': [a.rev for a in archives],
       'apply_patch': build.apply_patch,
       'archive_dirs': [a.dir for a in archives],
       'target': build.target,
       'target_os': build.target_os,
-      'is_cloud': build.IsCloud(),
       'subrepo': subrepo,
       'path': path,
       'gn_args': {
@@ -757,93 +736,6 @@
   sys.exit(1)
 
 
-def _DownloadBuildArtifacts(archive, build, supersize_path, depot_tools_path):
-  """Download artifacts from arm32 chromium perf builder."""
-  if depot_tools_path:
-    gsutil_path = os.path.join(depot_tools_path, 'gsutil.py')
-  else:
-    gsutil_path = distutils.spawn.find_executable('gsutil.py')
-
-  if not gsutil_path:
-    _Die('gsutil.py not found, please provide path to depot_tools via '
-         '--depot-tools-path or add it to your PATH')
-
-  download_dir = tempfile.mkdtemp(dir=_SRC_ROOT)
-  try:
-    _DownloadAndArchive(
-        gsutil_path, archive, download_dir, build, supersize_path)
-  finally:
-    shutil.rmtree(download_dir)
-
-
-def _DownloadAndArchive(gsutil_path, archive, dl_dir, build, supersize_path):
-  # Wraps gsutil calls and returns stdout + stderr.
-  def gsutil_cmd(args, fail_msg=None):
-    fail_msg = fail_msg or ''
-    proc = subprocess.Popen([gsutil_path] + args, stdout=subprocess.PIPE,
-                            stderr=subprocess.STDOUT)
-    output = proc.communicate()[0].rstrip()
-    if proc.returncode or not output:
-      _Die(fail_msg + ' Process output:\n%s' % output)
-    return output
-
-  # Fails if gsutil isn't configured.
-  gsutil_cmd(['version'],
-             'gsutil error. Please file a bug in Tools>BinarySize.')
-  dl_dst = os.path.join(dl_dir, archive.rev)
-  logging.info('Downloading build artifacts for %s', archive.rev)
-
-  # Fails if archive isn't found.
-  output = gsutil_cmd(['stat', build.DownloadUrl(archive.rev)],
-      'Unexpected error while downloading %s. It may no longer exist on the '
-      'server or it may not have been uploaded yet (check %s). Otherwise, you '
-      'may not have the correct access permissions.' % (
-      build.DownloadUrl(archive.rev), build.builder_url))
-  size = re.search(r'Content-Length:\s+([0-9]+)', output).group(1)
-  logging.info('File size: %s', _ReadableBytes(int(size)))
-
-  # Download archive. Any failures here are unexpected.
-  gsutil_cmd(['cp', build.DownloadUrl(archive.rev), dl_dst])
-
-  # Files needed for supersize and resource_sizes. Paths relative to out dir.
-  to_extract = [build.main_lib_path, build.map_file_path, 'args.gn']
-  if build.IsAndroid():
-    to_extract += ['build_vars.txt', build.apk_path,
-                   build.mapping_path, build.apk_path + '.size']
-  extract_dir = dl_dst + '_' + 'unzipped'
-  logging.info('Extracting build artifacts')
-  with zipfile.ZipFile(dl_dst, 'r') as z:
-    dl_out = _ExtractFiles(to_extract, extract_dir, z)
-    build.output_directory, output_directory = dl_out, build.output_directory
-    archive.ArchiveBuildResults(supersize_path)
-    build.output_directory = output_directory
-
-
-def _ReadableBytes(b):
-  val = b
-  units = ['Bytes','KB', 'MB', 'GB']
-  for unit in units:
-    if val < 1024:
-      return '%.2f %s' % (val, unit)
-    val /= 1024.0
-  else:
-    return '%d %s' % (b, 'Bytes')
-
-
-def _ExtractFiles(to_extract, dst, z):
-  """Extract a list of files. Returns the common prefix of the extracted files.
-
-  Paths in |to_extract| should be relative to the output directory.
-  """
-  zipped_paths = z.namelist()
-  output_dir = os.path.commonprefix(zipped_paths)
-  for f in to_extract:
-    path = os.path.join(output_dir, f)
-    if path in zipped_paths:
-      z.extract(path, path=dst)
-  return os.path.join(dst, output_dir)
-
-
 def _WriteToFile(logfile, s, *args, **kwargs):
   if isinstance(s, basestring):
     data = s.format(*args, **kwargs) + '\n'
@@ -918,24 +810,17 @@
                       help='Run some extra steps that take longer to complete. '
                            'This includes apk-patch-size estimation and '
                            'static-initializer counting.')
-  parser.add_argument('--cloud',
-                      action='store_true',
-                      help='Download build artifacts from perf builders '
-                      '(Googlers only).')
   parser.add_argument('--single',
                       action='store_true',
                       help='Sets --reference-rev=rev.')
   parser.add_argument('--unstripped',
                       action='store_true',
                       help='Save the unstripped native library when archiving.')
-  parser.add_argument('--depot-tools-path',
-                      help='Custom path to depot tools. Needed for --cloud if '
-                           'depot tools isn\'t in your PATH.')
-  parser.add_argument('--subrepo',
-                      help='Specify a subrepo directory to use. Implies '
-                           '--no-gclient. All git commands will be executed '
-                           'from the subrepo directory. Does not work with '
-                           '--cloud.')
+  parser.add_argument(
+      '--subrepo',
+      help='Specify a subrepo directory to use. Implies '
+      '--no-gclient. All git commands will be executed '
+      'from the subrepo directory.')
   parser.add_argument('--no-gclient',
                       action='store_true',
                       help='Do not perform gclient sync steps.')
@@ -995,20 +880,11 @@
   log_level = logging.DEBUG if args.verbose else logging.INFO
   logging.basicConfig(level=log_level,
                       format='%(levelname).1s %(relativeCreated)6d %(message)s')
-  build = _BuildHelper(args)
-  if build.IsCloud():
-    if args.subrepo:
-      parser.error('--subrepo doesn\'t work with --cloud')
-    if build.IsLinux():
-      parser.error('--target-os linux doesn\'t work with --cloud because map '
-                   'files aren\'t generated by builders (crbug.com/716209).')
-    if args.extra_rev:
-      parser.error('--apply-patch doesn\'t work with --cloud')
 
+  build = _BuildHelper(args)
   subrepo = args.subrepo or _SRC_ROOT
-  if not build.IsCloud():
-    _EnsureDirectoryClean(subrepo)
-    _SetRestoreFunc(subrepo)
+  _EnsureDirectoryClean(subrepo)
+  _SetRestoreFunc(subrepo)
 
   if build.IsLinux():
     _VerifyUserAccepts('Linux diffs have known deficiencies (crbug/717550).')
@@ -1032,29 +908,24 @@
     i = 0
     for i, archive in enumerate(diff_mngr.build_archives):
       if archive.Exists():
-        step = 'download' if build.IsCloud() else 'build'
-        logging.info('Found matching metadata for %s, skipping %s step.',
-                     archive.rev, step)
+        logging.info('Found matching metadata for %s, skipping build step.',
+                     archive.rev)
       else:
-        if build.IsCloud():
-          _DownloadBuildArtifacts(
-              archive, build, supersize_path, args.depot_tools_path)
+        build_failure = _SyncAndBuild(archive, build, subrepo, args.no_gclient,
+                                      args.extra_rev)
+        if build_failure:
+          logging.info(
+              'Build failed for %s, diffs using this rev will be skipped.',
+              archive.rev)
+          consecutive_failures += 1
+          if len(diff_mngr.build_archives) <= 2:
+            _Die('Stopping due to build failure.')
+          elif consecutive_failures > _ALLOWED_CONSECUTIVE_FAILURES:
+            _Die('%d builds failed in a row, last failure was %s.',
+                 consecutive_failures, archive.rev)
         else:
-          build_failure = _SyncAndBuild(archive, build, subrepo,
-                                        args.no_gclient, args.extra_rev)
-          if build_failure:
-            logging.info(
-                'Build failed for %s, diffs using this rev will be skipped.',
-                archive.rev)
-            consecutive_failures += 1
-            if len(diff_mngr.build_archives) <= 2:
-              _Die('Stopping due to build failure.')
-            elif consecutive_failures > _ALLOWED_CONSECUTIVE_FAILURES:
-              _Die('%d builds failed in a row, last failure was %s.',
-                   consecutive_failures, archive.rev)
-          else:
-            archive.ArchiveBuildResults(supersize_path, tool_prefix)
-            consecutive_failures = 0
+          archive.ArchiveBuildResults(supersize_path, tool_prefix)
+          consecutive_failures = 0
 
       if i != 0:
         diff_mngr.MaybeDiff(i - 1, i)
diff --git a/tools/fuchsia/local-sdk.py b/tools/fuchsia/local-sdk.py
index 505e4e1..4cee6b6 100755
--- a/tools/fuchsia/local-sdk.py
+++ b/tools/fuchsia/local-sdk.py
@@ -37,8 +37,7 @@
   Run('scripts/fx', '--dir', build_dir, 'set', 'terminal.' + arch,
       '--with=//topaz/packages/sdk:topaz', '--with-base=//sdk/bundles:tools',
       '--args=is_debug=false', '--args=build_sdk_archives=true')
-  Run('scripts/fx', 'build', 'topaz/public/sdk:fuchsia_dart', 'sdk',
-      'sdk:images_archive')
+  Run('scripts/fx', 'build', 'topaz/public/sdk:fuchsia_dart', 'sdk')
 
 
 def main(args):
@@ -46,30 +45,16 @@
     print """usage: %s <path_to_fuchsia_tree> [architecture]""" % SELF_FILE
     return 1
 
-  original_dir = os.getcwd()
-
-  fuchsia_root = args[0]
-
-  arch = args[1] if len(args) > 1 else 'x64'
-  if arch not in ['x64', 'arm64']:
-    print 'Unknown architecture: ' + arch
-    print 'Must be "x64" or "arm64".'
-    return 1
-
-  # Switch to the Fuchsia tree and build an SDK.
-  os.chdir(fuchsia_root)
-
-  BuildForArch(arch)
-
-  tempdir = tempfile.mkdtemp()
-  sdk_tars = [
-      os.path.join(fuchsia_root, 'out', 'release-' + arch, 'sdk', 'archive',
-                   'images.tar.gz'),
-      os.path.join(fuchsia_root, 'out', 'release-' + arch, 'sdk', 'archive',
-                   'core.tar.gz'),
-      os.path.join(fuchsia_root, 'out', 'release-' + arch, 'sdk', 'archive',
-                   'fuchsia_dart.tar.gz'),
-  ]
+  target_archs = []
+  if len(args) > 1:
+    arch = args[1]
+    if arch not in ['x64', 'arm64']:
+      print 'Unknown architecture: ' + arch
+      print 'Must be "x64" or "arm64".'
+      return 1
+    target_archs = [arch]
+  else:
+    target_archs = ['x64', 'arm64']
 
   # Nuke the SDK from DEPS, put our just-built one there, and set a fake .hash
   # file. This means that on next gclient runhooks, we'll restore to the
@@ -78,28 +63,52 @@
                             'sdk')
   EnsureEmptyDir(output_dir)
 
-  # Extract tars merging manifests
-  manifest_path = os.path.join(output_dir, 'meta', 'manifest.json')
+  original_dir = os.getcwd()
+  fuchsia_root = args[0]
   merged_manifest = None
-  parts = set()
-  for sdk_tar in sdk_tars:
-    tarfile.open(sdk_tar, mode='r:gz').extractall(path=output_dir)
+  manifest_parts = set()
 
-    # Merge the manifest ensuring that we don't have duplicate entries.
-    if os.path.isfile(manifest_path):
-      manifest = json.load(open(manifest_path))
-      os.remove(manifest_path)
-      if not merged_manifest:
-        merged_manifest = manifest
-      else:
-        for part in manifest['parts']:
-          if part['meta'] not in parts:
-            parts.add(part['meta'])
-            merged_manifest['parts'].append(part)
+  # Switch to the Fuchsia tree and build the SDKs.
+  os.chdir(fuchsia_root)
+
+  for arch in target_archs:
+    BuildForArch(arch)
+
+    sdk_tars = [
+        os.path.join(fuchsia_root, 'out', 'release-' + arch, 'sdk', 'archive',
+                    'core.tar.gz'),
+        os.path.join(fuchsia_root, 'out', 'release-' + arch, 'sdk', 'archive',
+                    'fuchsia_dart.tar.gz'),
+    ]
+
+    # Extract tars merging manifests
+    manifest_path = os.path.join(output_dir, 'meta', 'manifest.json')
+    for sdk_tar in sdk_tars:
+      with tarfile.open(sdk_tar, mode='r:gz') as tar:
+        for tar_file in tar:
+          try:
+            tar.extract(tar_file, output_dir)
+          except IOError:
+            # Ignore overwrite of read-only files.
+            pass
+
+      # Merge the manifest ensuring that we don't have duplicate entries.
+      if os.path.isfile(manifest_path):
+        manifest = json.load(open(manifest_path))
+        os.remove(manifest_path)
+        if not merged_manifest:
+          merged_manifest = manifest
+          for part in manifest['parts']:
+            manifest_parts.add(part['meta'])
+        else:
+          for part in manifest['parts']:
+            if part['meta'] not in manifest_parts:
+              manifest_parts.add(part['meta'])
+              merged_manifest['parts'].append(part)
 
   # Write merged manifest file.
   with open(manifest_path, 'w') as manifest_file:
-    json.dump(merged_manifest, manifest_file)
+    json.dump(merged_manifest, manifest_file, indent=2)
 
   print 'Hashing sysroot...'
   # Hash the sysroot to catch updates to the headers, but don't hash the whole
@@ -118,7 +127,6 @@
     f.write('locally-built-sdk-' + sysroot_hash)
 
   # Clean up.
-  shutil.rmtree(tempdir)
   os.chdir(original_dir)
 
   subprocess.check_call([os.path.join(REPOSITORY_ROOT, 'third_party',
diff --git a/tools/grit/grit/format/html_inline.py b/tools/grit/grit/format/html_inline.py
index 226c323..88ad571 100755
--- a/tools/grit/grit/format/html_inline.py
+++ b/tools/grit/grit/format/html_inline.py
@@ -502,10 +502,11 @@
   # of the text we just inlined.
   flat_text = CheckConditionalElements(flat_text)
 
+  # Allow custom modifications before inlining images.
+  if rewrite_function:
+    flat_text = rewrite_function(input_filepath, flat_text, distribution)
+
   if not preprocess_only:
-    # Allow custom modifications before inlining images.
-    if rewrite_function:
-      flat_text = rewrite_function(input_filepath, flat_text, distribution)
     flat_text = _SRC_RE.sub(SrcReplace, flat_text)
     flat_text = _SRCSET_RE.sub(SrcsetReplace, flat_text)
 
diff --git a/tools/grit/grit/gather/chrome_html_unittest.py b/tools/grit/grit/gather/chrome_html_unittest.py
index 9b17c118..f21caf3 100755
--- a/tools/grit/grit/gather/chrome_html_unittest.py
+++ b/tools/grit/grit/gather/chrome_html_unittest.py
@@ -145,6 +145,36 @@
       '''))
     tmp_dir.CleanUp()
 
+  def testFileResourcesPreprocess(self):
+    '''Tests preprocessed image file resources with available high DPI
+    assets.'''
+
+    tmp_dir = util.TempDir({
+      'test.css': '''
+      .image {
+        background: url('test.png');
+      }
+      ''',
+
+      'test.png': 'PNG DATA',
+
+      '1.4x/test.png': '1.4x PNG DATA',
+
+      '1.8x/test.png': '1.8x PNG DATA',
+    })
+
+    html = chrome_html.ChromeHtml(tmp_dir.GetPath('test.css'))
+    html.SetDefines({'scale_factors': '1.4x,1.8x'})
+    html.SetAttributes({'flattenhtml': 'false', 'preprocess': 'true'})
+    html.Parse()
+    self.failUnlessEqual(StandardizeHtml(html.GetData('en', 'utf-8')),
+                         StandardizeHtml('''
+      .image {
+        background: -webkit-image-set(url('test.png') 1x, url('1.4x/test.png') 1.4x, url('1.8x/test.png') 1.8x);
+      }
+      '''))
+    tmp_dir.CleanUp()
+
   def testFileResourcesDoubleQuotes(self):
     '''Tests inlined image file resources if url() filename is double quoted.'''
 
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 00e2353..f4495daf 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -17321,6 +17321,7 @@
   <int value="568" label="StartupBrowserWindowLaunchSuppressed"/>
   <int value="569" label="DeviceWebUsbAllowDevicesForUrls"/>
   <int value="570" label="UserFeedbackAllowed"/>
+  <int value="571" label="DevicePowerwashAllowed"/>
 </enum>
 
 <enum name="EnterprisePolicyInvalidations">
@@ -19822,6 +19823,7 @@
   <int value="1347" label="LOGIN_EXITCURRENTSESSION"/>
   <int value="1348" label="LOGIN_ISRUNNINGINLOGINPROFILE"/>
   <int value="1349" label="LOGIN_FETCHDATAFORNEXTLOGINATTEMPT"/>
+  <int value="1350" label="ACTION_SETICON"/>
 </enum>
 
 <enum name="ExtensionIconState">
@@ -23769,6 +23771,8 @@
   <int value="2934" label="LazyLoadImageLoadingAttributeEager"/>
   <int value="2935" label="LazyLoadImageLoadingAttributeLazy"/>
   <int value="2936" label="LazyLoadImageMissingDimensionsForLazy"/>
+  <int value="2937" label="PeriodicBackgroundSyncGetTags"/>
+  <int value="2938" label="PeriodicBackgroundSyncUnregister"/>
 </enum>
 
 <enum name="FeaturePolicyAllowlistType">
@@ -33892,6 +33896,7 @@
   <int value="-1467642274" label="KeyboardShortcutViewer:disabled"/>
   <int value="-1467332609" label="tab-management-experiment-type-anise"/>
   <int value="-1466990325" label="CrosCompUpdates:enabled"/>
+  <int value="-1466862366" label="TouchToFillAndroid:enabled"/>
   <int value="-1466759286" label="TabModalJsDialog:disabled"/>
   <int value="-1465172796" label="CCTModule:disabled"/>
   <int value="-1463489219" label="OfflinePagesCTSuppressNotifications:enabled"/>
@@ -36277,6 +36282,7 @@
   <int value="2006413281"
       label="ContextualSuggestionsAlternateCardLayout:enabled"/>
   <int value="2008599705" label="EnableFeedbackPanel:enabled"/>
+  <int value="2008878342" label="TouchToFillAndroid:disabled"/>
   <int value="2009097351" label="memlog-sampling-rate"/>
   <int value="2009362691" label="AllowStartingServiceManagerOnly:enabled"/>
   <int value="2014331873" label="NTPDownloadSuggestions:disabled"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 4f0385d..e801afc 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -37376,7 +37376,9 @@
 </histogram>
 
 <histogram name="ExtensionContentHashFetcher.CreateHashesTime" units="ms"
-    expires_after="M77">
+    expires_after="never">
+<!-- expires-never: Used for monitoring extension content verification latency. -->
+
   <owner>lazyboy@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -38208,7 +38210,10 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.CorruptExtensionTotalDisables" expires_after="M77">
+<histogram name="Extensions.CorruptExtensionTotalDisables"
+    expires_after="never">
+<!-- expires-never: Used for monitoring corrupt extensions. -->
+
   <owner>lazyboy@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -39035,7 +39040,8 @@
 </histogram>
 
 <histogram name="Extensions.ExtensionFrameMapCacheHit" units="Boolean"
-    expires_after="M77">
+    expires_after="M85">
+  <owner>karandeepb@chromium.org</owner>
   <owner>rdevlin.cronin@chromium.org</owner>
   <summary>
     True if the cache of the extension frame map was hit during access on the IO
@@ -39044,7 +39050,8 @@
 </histogram>
 
 <histogram name="Extensions.ExtensionFrameMapLookupSuccessful" units="Boolean"
-    expires_after="M77">
+    expires_after="M85">
+  <owner>karandeepb@chromium.org</owner>
   <owner>rdevlin.cronin@chromium.org</owner>
   <summary>
     True if the lookup for a frame in the extension frame map succeeded after a
@@ -57752,9 +57759,10 @@
 </histogram>
 
 <histogram name="Media.VaapiWrapper.VADisplayStateInitializeSuccess"
-    enum="BooleanSuccess" expires_after="M77">
-  <owner>acourbot@chromium.org</owner>
+    enum="BooleanSuccess" expires_after="M87">
   <owner>mcasas@chromium.org</owner>
+  <owner>acourbot@chromium.org</owner>
+  <owner>chromeos-gfx@chromium.org</owner>
   <summary>
     Whether the call to VaapiWrapper's VADisplayState::Initialize() succeeded or
     not.
@@ -57800,17 +57808,20 @@
 </histogram>
 
 <histogram name="Media.VAVDA.DecoderFailure" enum="VAVDADecoderFailure"
-    expires_after="M77">
+    expires_after="M87">
+  <owner>mcasas@chromium.org</owner>
   <owner>posciak@chromium.org</owner>
+  <owner>chromeos-gfx@chromium.org</owner>
   <summary>
     Error codes reported by video decode using VA-API hardware video decoder.
   </summary>
 </histogram>
 
 <histogram name="Media.VAVDA.VaapiWrapperCreationSuccess" enum="BooleanSuccess"
-    expires_after="M77">
-  <owner>acourbot@chromium.org</owner>
+    expires_after="M87">
   <owner>mcasas@chromium.org</owner>
+  <owner>acourbot@chromium.org</owner>
+  <owner>chromeos-gfx@chromium.org</owner>
   <summary>
     Whether the creation of VaapiWrapper succeeded or not inside VaVDA.
   </summary>
@@ -65220,7 +65231,11 @@
 
 <histogram name="Navigation.Reload.ReloadMainResourceToReloadDuration"
     units="ms" expires_after="M77">
+  <obsolete>
+    Removed 06/2019.
+  </obsolete>
   <owner>toyoshim@chromium.org</owner>
+  <owner>kinuko@chromium.org</owner>
   <summary>
     Reported when a user triggers reload without any other navigations after the
     previous reload in the same page, and the previous reload variant was
@@ -65230,7 +65245,11 @@
 
 <histogram name="Navigation.Reload.ReloadToReloadDuration" units="ms"
     expires_after="M77">
+  <obsolete>
+    Removed 06/2019.
+  </obsolete>
   <owner>toyoshim@chromium.org</owner>
+  <owner>kinuko@chromium.org</owner>
   <summary>
     Reported when a user triggers reload without any other navigations after the
     previous reload in the same page. Duration time between two reloads is
@@ -67865,6 +67884,9 @@
 
 <histogram name="Net.Cors.ActiveLoaderCount" units="entries"
     expires_after="M77">
+  <obsolete>
+    Removed 06/2019.
+  </obsolete>
   <owner>toyoshim@chromium.org</owner>
   <owner>yhirano@chromium.org</owner>
   <summary>
@@ -67876,6 +67898,9 @@
 
 <histogram name="Net.Cors.CompletionStatus" enum="CorsCompletionStatus"
     expires_after="M77">
+  <obsolete>
+    Removed 06/2019.
+  </obsolete>
   <owner>toyoshim@chromium.org</owner>
   <owner>yhirano@chromium.org</owner>
   <summary>
@@ -67886,6 +67911,9 @@
 
 <histogram name="Net.Cors.PreflightCacheEntries" units="entries"
     expires_after="M77">
+  <obsolete>
+    Removed 06/2019.
+  </obsolete>
   <owner>toyoshim@chromium.org</owner>
   <owner>yhirano@chromium.org</owner>
   <summary>
@@ -67897,8 +67925,8 @@
 <histogram name="Net.Cors.PreflightCacheEntriesPerOrigin" units="entries"
     expires_after="2019-05-14">
   <obsolete>
-    Deprecated 05/2019, related to cache organization changes that does not
-    store entries per origin any more.
+    Removed 05/2019, related to cache organization changes that does not store
+    entries per origin any more.
   </obsolete>
   <owner>toyoshim@chromium.org</owner>
   <owner>yhirano@chromium.org</owner>
@@ -67911,6 +67939,9 @@
 
 <histogram name="Net.Cors.PreflightCacheKeySize" units="bytes"
     expires_after="M77">
+  <obsolete>
+    Removed 06/2019.
+  </obsolete>
   <owner>toyoshim@chromium.org</owner>
   <owner>yhirano@chromium.org</owner>
   <summary>
@@ -67921,6 +67952,9 @@
 
 <histogram name="Net.Cors.PreflightCacheResult" enum="CorsPreflightCacheResult"
     expires_after="M77">
+  <obsolete>
+    Removed 06/2019.
+  </obsolete>
   <owner>toyoshim@chromium.org</owner>
   <owner>yhirano@chromium.org</owner>
   <summary>
@@ -67931,6 +67965,9 @@
 
 <histogram name="Net.Cors.PreflightCacheTotalEntries" units="entries"
     expires_after="M77">
+  <obsolete>
+    Removed 06/2019.
+  </obsolete>
   <owner>toyoshim@chromium.org</owner>
   <owner>yhirano@chromium.org</owner>
   <summary>
@@ -67942,6 +67979,9 @@
 
 <histogram name="Net.Cors.PreflightCacheTotalMemoryPressureInBytes"
     units="bytes" expires_after="M77">
+  <obsolete>
+    Removed 06/2019.
+  </obsolete>
   <owner>toyoshim@chromium.org</owner>
   <owner>yhirano@chromium.org</owner>
   <summary>
@@ -67952,6 +67992,9 @@
 
 <histogram name="Net.Cors.PreflightCacheValueSize" units="bytes"
     expires_after="M77">
+  <obsolete>
+    Removed 06/2019.
+  </obsolete>
   <owner>toyoshim@chromium.org</owner>
   <owner>yhirano@chromium.org</owner>
   <summary>
@@ -73014,6 +73057,18 @@
   </summary>
 </histogram>
 
+<histogram name="Net.QuicSession.SelfShloAddressMismatch"
+    enum="QuicAddressMismatch" expires_after="2020-11-01">
+  <owner>rch@google.com</owner>
+  <owner>zhongyi@google.com</owner>
+  <summary>
+    When a SHLO handshake message is received, whether the client IP address and
+    port number in it differ from the local client IP address and port number.
+    In the comparison, the first address is the one in SHLO and the second
+    address is the client IP address.
+  </summary>
+</histogram>
+
 <histogram name="Net.QuicSession.SentConnectivityProbe" enum="Boolean"
     expires_after="2018-03-21">
   <obsolete>
@@ -91923,7 +91978,7 @@
 </histogram>
 
 <histogram name="PasswordManager.CertificateErrorsWhileSeeingForms"
-    enum="PasswordCertificateError" expires_after="M77">
+    enum="PasswordCertificateError" expires_after="M85">
   <owner>battre@chromium.org</owner>
   <owner>dvadym@chromium.org</owner>
   <summary>
@@ -92702,7 +92757,7 @@
 </histogram>
 
 <histogram name="PasswordManager.OsPasswordStatus"
-    enum="PasswordManagerOsPasswordStatus" expires_after="M77">
+    enum="PasswordManagerOsPasswordStatus" expires_after="M83">
   <owner>battre@chromium.org</owner>
   <owner>wfh@chromium.org</owner>
   <summary>
@@ -92770,7 +92825,7 @@
 </histogram>
 
 <histogram name="PasswordManager.PasswordReuse.PasswordFieldDetected"
-    enum="PasswordReusePasswordFieldDetected" expires_after="M77">
+    enum="PasswordReusePasswordFieldDetected" expires_after="M85">
   <owner>dvadym@chromium.org</owner>
   <owner>chrome-safebrowsing-alerts@google.com</owner>
   <summary>
@@ -92805,7 +92860,7 @@
 </histogram>
 
 <histogram name="PasswordManager.PasswordReuse.TotalPasswords"
-    units="credentials" expires_after="M77">
+    units="credentials" expires_after="M85">
   <owner>dvadym@chromium.org</owner>
   <owner>chrome-safebrowsing-alerts@google.com</owner>
   <summary>
@@ -92960,7 +93015,7 @@
 </histogram>
 
 <histogram name="PasswordManager.ReusedPasswordType" enum="ReusedPasswordType"
-    expires_after="M77">
+    expires_after="M85">
   <owner>dvadym@chromium.org</owner>
   <owner>chrome-safebrowsing-alerts@google.com</owner>
   <summary>
@@ -92971,7 +93026,7 @@
 </histogram>
 
 <histogram name="PasswordManager.SavedEnterprisePasswordHashCount"
-    expires_after="M77">
+    expires_after="M85">
   <owner>dvadym@chromium.org</owner>
   <owner>chrome-safebrowsing-alerts@google.com</owner>
   <summary>
@@ -92982,7 +93037,7 @@
 </histogram>
 
 <histogram name="PasswordManager.SavedGaiaPasswordHashCount" units="count"
-    expires_after="M77">
+    expires_after="M85">
   <owner>dvadym@chromium.org</owner>
   <owner>chrome-safebrowsing-alerts@google.com</owner>
   <summary>
@@ -120438,6 +120493,10 @@
 
 <histogram name="SettingsAppMonitor.InitializationResult" enum="BooleanSuccess"
     expires_after="M77">
+  <obsolete>
+    Deprecated 06/2019. All signs indicate that it is exceptionally rare for
+    initialization to fail.
+  </obsolete>
   <owner>grt@chromium.org</owner>
   <summary>
     Indicates whether or not the Windows Settings app monitor was initialized.
@@ -127443,6 +127502,9 @@
 </histogram>
 
 <histogram name="Startup.TimeOfDayGMT" units="HHMM" expires_after="M77">
+  <obsolete>
+    Deprecated 06/2019.
+  </obsolete>
   <owner>feuunk@chromium.org</owner>
   <summary>
     The time of day in GMT that the startup was performed. This is logged in
@@ -140293,6 +140355,18 @@
   </summary>
 </histogram>
 
+<histogram name="V8.WasmCompileModuleAsyncMicroSeconds" units="microseconds"
+    expires_after="2020-03-31">
+  <owner>titzer@chromium.org</owner>
+  <owner>adamk@chromium.org</owner>
+  <owner>clemensh@chromium.org</owner>
+  <summary>
+    Time to asynchronously compile a WebAssembly module (using the
+    'WebAssembly.compile' API). Recorded on each asynchronous WebAssembly
+    compilation, but only if a high-resolution clock is available.
+  </summary>
+</histogram>
+
 <histogram name="V8.WasmCompileModuleMicroSeconds" units="microseconds"
     expires_after="2020-03-31">
   <owner>titzer@chromium.org</owner>
@@ -140310,6 +140384,20 @@
   </summary>
 </histogram>
 
+<histogram name="V8.WasmCompileModuleStreamingMicroSeconds"
+    units="microseconds" expires_after="2020-03-31">
+  <owner>titzer@chromium.org</owner>
+  <owner>adamk@chromium.org</owner>
+  <owner>clemensh@chromium.org</owner>
+  <summary>
+    Time to asynchronously compile a WebAssembly module using streaming
+    compilation (via the 'WebAssembly.compileStreaming' API). Recorded on each
+    streaming WebAssembly compilation, but only if a high-resolution clock is
+    available. Note that compilation speed is often limited by the network
+    speed, which is also reflected in thie metric.
+  </summary>
+</histogram>
+
 <histogram name="V8.WasmDecodeFunctionMicroSeconds" units="microseconds"
     expires_after="2020-03-31">
   <owner>titzer@chromium.org</owner>
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml
index b57a329b..a3d07c8e 100644
--- a/tools/metrics/ukm/ukm.xml
+++ b/tools/metrics/ukm/ukm.xml
@@ -4666,11 +4666,12 @@
   </metric>
 </event>
 
-<event name="OptimizationGuide">
+<event name="OptimizationGuide" singular="True">
   <owner>sophiechang@chromium.org</owner>
   <summary>
-    Optimization guide metrics associated with a page load. See
-    //components/optimization_guide/.
+    Optimization guide metrics associated with a page load. It is recorded when
+    the optimization guide was consulted in making a decision for the page load.
+    See //components/optimization_guide/.
   </summary>
   <metric name="HintGenerationTimestamp">
     <summary>
@@ -5928,6 +5929,9 @@
     //components/previews/.
   </summary>
   <metric name="client_lofi">
+    <obsolete>
+      Deprecated June 2019
+    </obsolete>
     <summary>
       Set to 1 when a user is shown a client lo-fi image in a page load.
     </summary>
@@ -6045,6 +6049,9 @@
     </summary>
   </metric>
   <metric name="server_lofi">
+    <obsolete>
+      Deprecated June 2019
+    </obsolete>
     <summary>
       Set to 1 when a user is shown a server lo-fi image in a page load.
     </summary>
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml
index 8064b0e3..69864509 100644
--- a/tools/traffic_annotation/summary/annotations.xml
+++ b/tools/traffic_annotation/summary/annotations.xml
@@ -198,6 +198,7 @@
  <item id="ppapi_download_request" hash_code="135967426" type="0" content_hash_code="110461402" os_list="linux,windows" file_path="chrome/browser/safe_browsing/download_protection/ppapi_download_request.cc"/>
  <item id="prefetch_download" hash_code="44583172" type="0" content_hash_code="21424542" os_list="linux,windows" file_path="components/offline_pages/core/prefetch/prefetch_downloader_impl.cc"/>
  <item id="prefetch_visuals" hash_code="91068704" type="0" content_hash_code="90439946" os_list="linux,windows" file_path="components/offline_pages/core/prefetch/visuals_fetch_by_url.cc"/>
+ <item id="previews_prober" hash_code="41010697" type="0" content_hash_code="51581107" os_list="linux,windows" file_path="chrome/browser/previews/previews_prober.cc"/>
  <item id="printer_job_handler" hash_code="67638271" type="1" second_id="111712433" content_hash_code="75712693" os_list="linux,windows" semantics_fields="2,3,4" file_path="chrome/service/cloud_print/printer_job_handler.cc"/>
  <item id="privet_http_impl" hash_code="71251498" type="0" content_hash_code="107348604" os_list="linux,windows" file_path="chrome/browser/printing/cloud_print/privet_http_impl.cc"/>
  <item id="profile_avatar" hash_code="51164680" type="0" content_hash_code="113550845" os_list="linux,windows" file_path="chrome/browser/profiles/profile_avatar_downloader.cc"/>
diff --git a/ui/accessibility/platform/ax_platform_node_delegate.h b/ui/accessibility/platform/ax_platform_node_delegate.h
index 47f7b60..60997af 100644
--- a/ui/accessibility/platform/ax_platform_node_delegate.h
+++ b/ui/accessibility/platform/ax_platform_node_delegate.h
@@ -146,8 +146,9 @@
   // Platforms with touch accessibility use a different asynchronous interface.
   virtual gfx::NativeViewAccessible HitTestSync(int x, int y) = 0;
 
-  // Return the node within this node's subtree (inclusive) that currently
-  // has focus.
+  // Return the node within this node's subtree (inclusive) that currently has
+  // focus, or return nullptr if this subtree is not connected to the top
+  // document through its ancestry chain.
   virtual gfx::NativeViewAccessible GetFocus() = 0;
 
   // Get whether this node is offscreen.
diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc
index 9a95ec0..7221dab 100644
--- a/ui/accessibility/platform/ax_platform_node_win.cc
+++ b/ui/accessibility/platform/ax_platform_node_win.cc
@@ -953,10 +953,15 @@
     focus_child->vt = VT_I4;
     focus_child->lVal = CHILDID_SELF;
   } else if (focus_accessible) {
+    Microsoft::WRL::ComPtr<IDispatch> focus_idispatch;
+    if (FAILED(
+            focus_accessible->QueryInterface(IID_PPV_ARGS(&focus_idispatch)))) {
+      focus_child->vt = VT_EMPTY;
+      return E_FAIL;
+    }
+
     focus_child->vt = VT_DISPATCH;
-    focus_child->pdispVal = focus_accessible;
-    focus_child->pdispVal->AddRef();
-    return S_OK;
+    focus_child->pdispVal = focus_idispatch.Detach();
   } else {
     focus_child->vt = VT_EMPTY;
   }
diff --git a/ui/android/DEPS b/ui/android/DEPS
index ffceb86..25b8b451 100644
--- a/ui/android/DEPS
+++ b/ui/android/DEPS
@@ -12,11 +12,11 @@
   "+components/viz/host",
   "+components/viz/service/frame_sinks",
   "+components/viz/service/surfaces",
-  "+ui/android/ui_android_jni_headers",
   "+services/viz/public/interfaces",
   "+skia/ext",
   "+third_party/blink/public/platform/web_cursor_info.h",
   "+third_party/skia",
+  "+ui/android/ui_android_jni_headers",
   "+ui/base",
   "+ui/compositor/compositor_lock.h",
   "+ui/display",
diff --git a/ui/android/java/src/org/chromium/ui/interpolators/BakedBezierInterpolator.java b/ui/android/java/src/org/chromium/ui/interpolators/BakedBezierInterpolator.java
index 68becd05..e461f6c 100644
--- a/ui/android/java/src/org/chromium/ui/interpolators/BakedBezierInterpolator.java
+++ b/ui/android/java/src/org/chromium/ui/interpolators/BakedBezierInterpolator.java
@@ -4,11 +4,14 @@
 
 package org.chromium.ui.interpolators;
 
+import android.support.v4.view.animation.FastOutLinearInInterpolator;
+import android.support.v4.view.animation.FastOutSlowInInterpolator;
+import android.support.v4.view.animation.LinearOutSlowInInterpolator;
 import android.view.animation.Interpolator;
 
 /**
  * A pre-baked bezier-curved interpolator for quantum-paper transitions.
- * TODO(dtrainor): Move to the API Compatability version iff that supports the curves we need and
+ * TODO(dtrainor): Move to the API Compatibility version iff that supports the curves we need and
  * once we move to that SDK.
  */
 public class BakedBezierInterpolator implements Interpolator {
@@ -105,19 +108,28 @@
 
     /**
      * 0.4 to 0.2 bezier curve.  Should be used for general movement.
+     * Use {@link CompositorAnimator#FAST_OUT_SLOW_IN_INTERPOLATOR} or
+     * {@link FastOutSlowInInterpolator} instead.
      */
+    @Deprecated
     public static final BakedBezierInterpolator TRANSFORM_CURVE =
             new BakedBezierInterpolator(TRANSFORM_VALUES);
 
     /**
      * 0.4 to 1.0 bezier curve.  Should be used for fading out.
+     * Use {@link CompositorAnimator#FAST_OUT_LINEAR_IN_INTERPOLATOR} or
+     * {@link FastOutLinearInInterpolator} instead.
      */
+    @Deprecated
     public static final BakedBezierInterpolator FADE_OUT_CURVE =
             new BakedBezierInterpolator(FADE_OUT_VALUES);
 
     /**
      * 0.0 to 0.2 bezier curve.  Should be used for fading in.
+     * Use {@link CompositorAnimator#LINEAR_OUT_SLOW_IN_INTERPOLATOR} or
+     * {@link LinearOutSlowInInterpolator} instead.
      */
+    @Deprecated
     public static final BakedBezierInterpolator FADE_IN_CURVE =
             new BakedBezierInterpolator(FADE_IN_VALUES);
 
diff --git a/ui/base/DEPS b/ui/base/DEPS
index 4312bd3..bc7832a 100644
--- a/ui/base/DEPS
+++ b/ui/base/DEPS
@@ -1,9 +1,9 @@
 include_rules = [
-  "+ui/base/ui_base_jni_headers",
   "+net",
   "+skia/ext",
   "+third_party/skia",
   "+third_party/zlib",
+  "+ui/base/ui_base_jni_headers",
   "+ui/display",
   "+ui/events",
   "+ui/gfx",
diff --git a/ui/base/idle/DEPS b/ui/base/idle/DEPS
index 70c92dd..ce14154 100644
--- a/ui/base/idle/DEPS
+++ b/ui/base/idle/DEPS
@@ -1,5 +1,5 @@
 include_rules = [
-  "+ui/base/ui_base_jni_headers",
   "+chromeos/dbus/dbus_thread_manager.h",
   "+chromeos/dbus/session_manager",
+  "+ui/base/ui_base_jni_headers",
 ]
diff --git a/ui/chromeos/ime/candidate_window_view_unittest.cc b/ui/chromeos/ime/candidate_window_view_unittest.cc
index ec7dbf29..098688c8 100644
--- a/ui/chromeos/ime/candidate_window_view_unittest.cc
+++ b/ui/chromeos/ime/candidate_window_view_unittest.cc
@@ -111,9 +111,9 @@
                     const std::string& candidate,
                     const std::string& annotation,
                     const CandidateView* row) {
-    EXPECT_EQ(shortcut, base::UTF16ToUTF8(row->shortcut_label_->text()));
-    EXPECT_EQ(candidate, base::UTF16ToUTF8(row->candidate_label_->text()));
-    EXPECT_EQ(annotation, base::UTF16ToUTF8(row->annotation_label_->text()));
+    EXPECT_EQ(shortcut, base::UTF16ToUTF8(row->shortcut_label_->GetText()));
+    EXPECT_EQ(candidate, base::UTF16ToUTF8(row->candidate_label_->GetText()));
+    EXPECT_EQ(annotation, base::UTF16ToUTF8(row->annotation_label_->GetText()));
   }
 
  private:
diff --git a/ui/display/display.cc b/ui/display/display.cc
index f2153337b..71d6f3f 100644
--- a/ui/display/display.cc
+++ b/ui/display/display.cc
@@ -215,12 +215,9 @@
       bounds_(bounds),
       work_area_(bounds),
       device_scale_factor_(GetForcedDeviceScaleFactor()) {
-  gfx::ColorSpace color_space = HasForceDisplayColorProfile()
-                                    ? GetForcedDisplayColorProfile()
-                                    : gfx::ColorSpace::CreateSRGB();
-  float sdr_white_level =
-      color_space.IsHDR() ? 200.f : gfx::ColorSpace::kDefaultSDRWhiteLevel;
-  SetColorSpaceAndDepth(color_space, sdr_white_level);
+  SetColorSpaceAndDepth(HasForceDisplayColorProfile()
+                            ? GetForcedDisplayColorProfile()
+                            : gfx::ColorSpace::CreateSRGB());
 #if defined(USE_AURA)
   SetScaleAndBounds(device_scale_factor_, bounds);
 #endif
diff --git a/ui/gfx/paint_vector_icon.cc b/ui/gfx/paint_vector_icon.cc
index 7de3547..ab8056d 100644
--- a/ui/gfx/paint_vector_icon.cc
+++ b/ui/gfx/paint_vector_icon.cc
@@ -468,7 +468,8 @@
     canvas->sk_canvas()->scale(scale, scale);
   }
 
-  ScopedRTLFlipCanvas scoped_rtl_flip_canvas(canvas, canvas_size, flips_in_rtl);
+  if (flips_in_rtl)
+    scoped_canvas.FlipIfRTL(canvas_size);
 
   if (!clip_rect.isEmpty())
     canvas->sk_canvas()->clipRect(clip_rect);
diff --git a/ui/gfx/scoped_canvas.cc b/ui/gfx/scoped_canvas.cc
index 54d75c9a..fe45fcd4 100644
--- a/ui/gfx/scoped_canvas.cc
+++ b/ui/gfx/scoped_canvas.cc
@@ -9,13 +9,20 @@
 
 namespace gfx {
 
-ScopedRTLFlipCanvas::ScopedRTLFlipCanvas(gfx::Canvas* canvas,
-                                         int width,
-                                         bool flip)
-    : canvas_(canvas) {
-  if (flip && base::i18n::IsRTL()) {
-    canvas->Translate(gfx::Vector2d(width, 0));
-    canvas->Scale(-1, 1);
+ScopedCanvas::ScopedCanvas(gfx::Canvas* canvas) : canvas_(canvas) {
+  if (canvas_)
+    canvas_->Save();
+}
+
+ScopedCanvas::~ScopedCanvas() {
+  if (canvas_)
+    canvas_->Restore();
+}
+
+void ScopedCanvas::FlipIfRTL(int width) {
+  if (base::i18n::IsRTL()) {
+    canvas_->Translate(gfx::Vector2d(width, 0));
+    canvas_->Scale(-1, 1);
   }
 }
 
diff --git a/ui/gfx/scoped_canvas.h b/ui/gfx/scoped_canvas.h
index 96ccaffa..d2fee56 100644
--- a/ui/gfx/scoped_canvas.h
+++ b/ui/gfx/scoped_canvas.h
@@ -14,33 +14,17 @@
 // Saves the drawing state, and restores the state when going out of scope.
 class GFX_EXPORT ScopedCanvas {
  public:
-  explicit ScopedCanvas(gfx::Canvas* canvas) : canvas_(canvas) {
-    if (canvas_)
-      canvas_->Save();
-  }
-  ~ScopedCanvas() {
-    if (canvas_)
-      canvas_->Restore();
-  }
+  explicit ScopedCanvas(gfx::Canvas* canvas);
+  ScopedCanvas(const ScopedCanvas&) = delete;
+  ScopedCanvas& operator=(const ScopedCanvas&) = delete;
+  virtual ~ScopedCanvas();
+
+  // If the UI is in RTL layout, applies a transform such that anything drawn
+  // inside the supplied width will be flipped horizontally.
+  void FlipIfRTL(int width);
 
  private:
   gfx::Canvas* canvas_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedCanvas);
-};
-
-// Saves the drawing state.  If |flip| is true, and the UI is in RTL layout,
-// applies a transform such that anything drawn inside the supplied width will
-// be flipped horizontally.
-class GFX_EXPORT ScopedRTLFlipCanvas {
- public:
-  ScopedRTLFlipCanvas(gfx::Canvas* canvas, int width, bool flip = true);
-  ~ScopedRTLFlipCanvas() {}
-
- private:
-  ScopedCanvas canvas_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedRTLFlipCanvas);
 };
 
 }  // namespace gfx
diff --git a/ui/message_center/views/notification_header_view.cc b/ui/message_center/views/notification_header_view.cc
index f13109d..a64de04e 100644
--- a/ui/message_center/views/notification_header_view.cc
+++ b/ui/message_center/views/notification_header_view.cc
@@ -302,9 +302,10 @@
 void NotificationHeaderView::GetAccessibleNodeData(ui::AXNodeData* node_data) {
   Button::GetAccessibleNodeData(node_data);
 
-  node_data->SetName(app_name_view_->text());
-  node_data->SetDescription(summary_text_view_->text() +
-                            base::ASCIIToUTF16(" ") + timestamp_view_->text());
+  node_data->SetName(app_name_view_->GetText());
+  node_data->SetDescription(summary_text_view_->GetText() +
+                            base::ASCIIToUTF16(" ") +
+                            timestamp_view_->GetText());
 
   if (is_expanded_)
     node_data->AddState(ax::mojom::State::kExpanded);
@@ -383,7 +384,7 @@
 }
 
 const base::string16& NotificationHeaderView::app_name_for_testing() const {
-  return app_name_view_->text();
+  return app_name_view_->GetText();
 }
 
 const gfx::ImageSkia& NotificationHeaderView::app_icon_for_testing() const {
@@ -391,11 +392,11 @@
 }
 
 const base::string16& NotificationHeaderView::timestamp_for_testing() const {
-  return timestamp_view_->text();
+  return timestamp_view_->GetText();
 }
 
 void NotificationHeaderView::UpdateSummaryTextVisibility() {
-  const bool summary_visible = !summary_text_view_->text().empty();
+  const bool summary_visible = !summary_text_view_->GetText().empty();
   summary_text_divider_->SetVisible(summary_visible);
   summary_text_view_->SetVisible(summary_visible);
 
diff --git a/ui/message_center/views/notification_view_md.cc b/ui/message_center/views/notification_view_md.cc
index 283cb25..18d581a 100644
--- a/ui/message_center/views/notification_view_md.cc
+++ b/ui/message_center/views/notification_view_md.cc
@@ -182,7 +182,7 @@
 
   auto* title = new views::Label(item.title);
   title->SetFontList(font_list);
-  title->set_collapse_when_hidden(true);
+  title->SetCollapseWhenHidden(true);
   title->SetHorizontalAlignment(gfx::ALIGN_LEFT);
   title->SetEnabledColor(kRegularTextColorMD);
   title->SetAutoColorReadabilityEnabled(false);
@@ -191,7 +191,7 @@
   views::Label* message = new views::Label(l10n_util::GetStringFUTF16(
       IDS_MESSAGE_CENTER_LIST_NOTIFICATION_MESSAGE_WITH_DIVIDER, item.message));
   message->SetFontList(font_list);
-  message->set_collapse_when_hidden(true);
+  message->SetCollapseWhenHidden(true);
   message->SetHorizontalAlignment(gfx::ALIGN_LEFT);
   message->SetEnabledColor(kDimTextColorMD);
   message->SetAutoColorReadabilityEnabled(false);
diff --git a/ui/message_center/views/notification_view_md.h b/ui/message_center/views/notification_view_md.h
index 45e199e..fb280a8 100644
--- a/ui/message_center/views/notification_view_md.h
+++ b/ui/message_center/views/notification_view_md.h
@@ -93,7 +93,7 @@
   std::unique_ptr<views::InkDropHighlight> CreateInkDropHighlight()
       const override;
 
-  SkColor enabled_color_for_testing() { return label()->enabled_color(); }
+  SkColor enabled_color_for_testing() { return label()->GetEnabledColor(); }
 
   const base::Optional<base::string16>& placeholder() const {
     return placeholder_;
diff --git a/ui/shell_dialogs/DEPS b/ui/shell_dialogs/DEPS
index 8a94af5..2cff6e2 100644
--- a/ui/shell_dialogs/DEPS
+++ b/ui/shell_dialogs/DEPS
@@ -1,5 +1,4 @@
 include_rules = [
-  "+ui/base/ui_base_jni_headers",
   "+components/remote_cocoa",
   "+mojo/core/embedder",
   "+mojo/public/cpp/bindings",
diff --git a/ui/views/accessibility/view_ax_platform_node_delegate.cc b/ui/views/accessibility/view_ax_platform_node_delegate.cc
index 8ec950b0..fed9566 100644
--- a/ui/views/accessibility/view_ax_platform_node_delegate.cc
+++ b/ui/views/accessibility/view_ax_platform_node_delegate.cc
@@ -408,6 +408,92 @@
   return ViewAccessibility::GetUniqueId();
 }
 
+bool ViewAXPlatformNodeDelegate::IsOrderedSetItem() const {
+  const ui::AXNodeData& data = GetData();
+  return (view()->GetGroup() >= 0) ||
+         (data.HasIntAttribute(ax::mojom::IntAttribute::kPosInSet) &&
+          data.HasIntAttribute(ax::mojom::IntAttribute::kSetSize));
+}
+
+bool ViewAXPlatformNodeDelegate::IsOrderedSet() const {
+  return (view()->GetGroup() >= 0) ||
+         GetData().HasIntAttribute(ax::mojom::IntAttribute::kSetSize);
+}
+
+base::Optional<int> ViewAXPlatformNodeDelegate::GetPosInSet() const {
+  // Consider overridable attributes first.
+  const ui::AXNodeData& data = GetData();
+  if (data.HasIntAttribute(ax::mojom::IntAttribute::kPosInSet))
+    return data.GetIntAttribute(ax::mojom::IntAttribute::kPosInSet);
+
+  std::vector<View*> views_in_group;
+  GetViewsInGroupForSet(&views_in_group);
+  if (views_in_group.empty())
+    return base::nullopt;
+  // Check this is in views_in_group; it may be removed if it is ignored.
+  auto found_view =
+      std::find(views_in_group.begin(), views_in_group.end(), view());
+  if (found_view == views_in_group.end())
+    return base::nullopt;
+
+  int posInSet = std::distance(views_in_group.begin(), found_view);
+  // posInSet is zero-based; users expect one-based, so increment.
+  return ++posInSet;
+}
+
+base::Optional<int> ViewAXPlatformNodeDelegate::GetSetSize() const {
+  // Consider overridable attributes first.
+  const ui::AXNodeData& data = GetData();
+  if (data.HasIntAttribute(ax::mojom::IntAttribute::kSetSize))
+    return data.GetIntAttribute(ax::mojom::IntAttribute::kSetSize);
+
+  std::vector<View*> views_in_group;
+  GetViewsInGroupForSet(&views_in_group);
+  if (views_in_group.empty())
+    return base::nullopt;
+  // Check this is in views_in_group; it may be removed if it is ignored.
+  auto found_view =
+      std::find(views_in_group.begin(), views_in_group.end(), view());
+  if (found_view == views_in_group.end())
+    return base::nullopt;
+
+  return views_in_group.size();
+}
+
+void ViewAXPlatformNodeDelegate::GetViewsInGroupForSet(
+    std::vector<View*>* views_in_group) const {
+  const int group_id = view()->GetGroup();
+  if (group_id < 0)
+    return;
+
+  View* view_to_check = view();
+  // If this view has a parent, check from the parent, to make sure we catch any
+  // siblings.
+  if (view()->parent())
+    view_to_check = view()->parent();
+  view_to_check->GetViewsInGroup(group_id, views_in_group);
+
+  // Remove any views that are ignored in the accessibility tree.
+  views_in_group->erase(
+      std::remove_if(
+          views_in_group->begin(), views_in_group->end(),
+          [](View* view) {
+            ViewAccessibility& view_accessibility =
+                view->GetViewAccessibility();
+            bool is_ignored = view_accessibility.IsIgnored();
+            // TODO Remove the ViewAXPlatformNodeDelegate::GetData() part of
+            // this lambda, once the temporary code in GetData() setting the
+            // role to kIgnored is moved to ViewAccessibility.
+            ViewAXPlatformNodeDelegate* ax_delegate =
+                static_cast<ViewAXPlatformNodeDelegate*>(&view_accessibility);
+            if (ax_delegate)
+              is_ignored = is_ignored || (ax_delegate->GetData().role ==
+                                          ax::mojom::Role::kIgnored);
+            return is_ignored;
+          }),
+      views_in_group->end());
+}
+
 ViewAXPlatformNodeDelegate::ChildWidgetsResult
 ViewAXPlatformNodeDelegate::GetChildWidgets() const {
   // Only attach child widgets to the root view.
diff --git a/ui/views/accessibility/view_ax_platform_node_delegate.h b/ui/views/accessibility/view_ax_platform_node_delegate.h
index 5c7e638..d6fed0dd 100644
--- a/ui/views/accessibility/view_ax_platform_node_delegate.h
+++ b/ui/views/accessibility/view_ax_platform_node_delegate.h
@@ -66,10 +66,20 @@
   // Also in |ViewAccessibility|.
   const ui::AXUniqueId& GetUniqueId() const override;
 
+  // Ordered-set-like and item-like nodes.
+  bool IsOrderedSetItem() const override;
+  bool IsOrderedSet() const override;
+  base::Optional<int> GetPosInSet() const override;
+  base::Optional<int> GetSetSize() const override;
+
  protected:
   explicit ViewAXPlatformNodeDelegate(View* view);
 
  private:
+  // Uses Views::GetViewsInGroup to find nearby Views in the same group.
+  // Searches from the View's parent to include siblings within that group.
+  void GetViewsInGroupForSet(std::vector<View*>* views_in_group) const;
+
   struct ChildWidgetsResult;
 
   ChildWidgetsResult GetChildWidgets() const;
diff --git a/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc b/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc
index 5671f5fb..4bd13b83 100644
--- a/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc
+++ b/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc
@@ -78,6 +78,11 @@
         &label_->GetViewAccessibility());
   }
 
+  ViewAXPlatformNodeDelegate* view_accessibility(View* view) {
+    return static_cast<ViewAXPlatformNodeDelegate*>(
+        &view->GetViewAccessibility());
+  }
+
   bool SetFocused(ViewAXPlatformNodeDelegate* ax_delegate, bool focused) {
     ui::AXActionData data;
     data.action =
@@ -85,6 +90,58 @@
     return ax_delegate->AccessibilityPerformAction(data);
   }
 
+  // Sets up a more complicated structure of Views - one parent View with four
+  // child Views.
+  std::vector<View*> SetUpExtraViews() {
+    View* parent_view = new View();
+    widget_->GetContentsView()->AddChildView(parent_view);
+    std::vector<View*> views{parent_view};
+
+    const int num_children = 4;
+    for (int i = 0; i < num_children; i++) {
+      View* child_view = new View();
+      parent_view->AddChildView(child_view);
+      views.push_back(child_view);
+    }
+    return views;
+  }
+
+  // Adds group id information to the first 5 values in |views|. If |views| is
+  // empty, populates it with one parent View and four child Views. It is
+  // assumed |views| is either empty or has at least 5 items.
+  void SetUpExtraViewsWithGroups(std::vector<View*>& views) {
+    //                v[0] g1
+    //     |        |        |      |
+    // v[1] g1  v[2] g1  v[3] g2  v[4]
+    if (views.empty())
+      views = SetUpExtraViews();
+    EXPECT_GE(views.size(), (size_t)5);
+
+    views[0]->SetGroup(1);
+    views[1]->SetGroup(1);
+    views[2]->SetGroup(1);
+    views[3]->SetGroup(2);
+    // Skip views[4] - no group id.
+  }
+
+  // Adds posInSet and setSize overrides to the first 5 values in |views|. If
+  // |views| is empty, populates it with one parent View and four child Views.
+  // It is assumed |views| is either empty or has at least 5 items.
+  void SetUpExtraViewsWithSetOverrides(std::vector<View*>& views) {
+    //                     v[0] p4 s4
+    //      |            |            |            |
+    //  v[1] p3 s4   v[2] p2 s4   v[3] p- s-   v[4] p1 s4
+    if (views.empty())
+      views = SetUpExtraViews();
+    EXPECT_GE(views.size(), (size_t)5);
+
+    views[0]->GetViewAccessibility().OverridePosInSet(4, 4);
+    views[1]->GetViewAccessibility().OverridePosInSet(3, 4);
+    views[2]->GetViewAccessibility().OverridePosInSet(2, 4);
+    // Skip views[3] - no override.
+    views[4]->GetViewAccessibility().OverridePosInSet(1, 4);
+  }
+
  protected:
   const int DEFAULT_VIEW_ID = 0;
   const int NON_DEFAULT_VIEW_ID = 1;
@@ -185,6 +242,101 @@
             button_accessibility()->GetAuthorUniqueId());
 }
 
+TEST_F(ViewAXPlatformNodeDelegateTest, IsOrderedSet) {
+  std::vector<View*> group_ids;
+  SetUpExtraViewsWithGroups(group_ids);
+  // Only last element has no group id.
+  EXPECT_TRUE(view_accessibility(group_ids[0])->IsOrderedSet());
+  EXPECT_TRUE(view_accessibility(group_ids[1])->IsOrderedSet());
+  EXPECT_TRUE(view_accessibility(group_ids[2])->IsOrderedSet());
+  EXPECT_TRUE(view_accessibility(group_ids[3])->IsOrderedSet());
+  EXPECT_FALSE(view_accessibility(group_ids[4])->IsOrderedSet());
+
+  EXPECT_TRUE(view_accessibility(group_ids[0])->IsOrderedSetItem());
+  EXPECT_TRUE(view_accessibility(group_ids[1])->IsOrderedSetItem());
+  EXPECT_TRUE(view_accessibility(group_ids[2])->IsOrderedSetItem());
+  EXPECT_TRUE(view_accessibility(group_ids[3])->IsOrderedSetItem());
+  EXPECT_FALSE(view_accessibility(group_ids[4])->IsOrderedSetItem());
+
+  std::vector<View*> overrides;
+  SetUpExtraViewsWithSetOverrides(overrides);
+  // Only overrides[3] has no override values for setSize/ posInSet.
+  EXPECT_TRUE(view_accessibility(overrides[0])->IsOrderedSet());
+  EXPECT_TRUE(view_accessibility(overrides[1])->IsOrderedSet());
+  EXPECT_TRUE(view_accessibility(overrides[2])->IsOrderedSet());
+  EXPECT_FALSE(view_accessibility(overrides[3])->IsOrderedSet());
+  EXPECT_TRUE(view_accessibility(overrides[4])->IsOrderedSet());
+
+  EXPECT_TRUE(view_accessibility(overrides[0])->IsOrderedSetItem());
+  EXPECT_TRUE(view_accessibility(overrides[1])->IsOrderedSetItem());
+  EXPECT_TRUE(view_accessibility(overrides[2])->IsOrderedSetItem());
+  EXPECT_FALSE(view_accessibility(overrides[3])->IsOrderedSetItem());
+  EXPECT_TRUE(view_accessibility(overrides[4])->IsOrderedSetItem());
+}
+
+TEST_F(ViewAXPlatformNodeDelegateTest, SetSizeAndPosition) {
+  // Test Views with group ids.
+  std::vector<View*> group_ids;
+  SetUpExtraViewsWithGroups(group_ids);
+  EXPECT_EQ(view_accessibility(group_ids[0])->GetSetSize(), 3);
+  EXPECT_EQ(view_accessibility(group_ids[0])->GetPosInSet(), 1);
+  EXPECT_EQ(view_accessibility(group_ids[1])->GetSetSize(), 3);
+  EXPECT_EQ(view_accessibility(group_ids[1])->GetPosInSet(), 2);
+  EXPECT_EQ(view_accessibility(group_ids[2])->GetSetSize(), 3);
+  EXPECT_EQ(view_accessibility(group_ids[2])->GetPosInSet(), 3);
+
+  EXPECT_EQ(view_accessibility(group_ids[3])->GetSetSize(), 1);
+  EXPECT_EQ(view_accessibility(group_ids[3])->GetPosInSet(), 1);
+
+  EXPECT_FALSE(view_accessibility(group_ids[4])->GetSetSize().has_value());
+  EXPECT_FALSE(view_accessibility(group_ids[4])->GetPosInSet().has_value());
+
+  // Check if a View is ignored, it is not counted in SetSize or PosInSet
+  group_ids[1]->GetViewAccessibility().OverrideIsIgnored(true);
+  group_ids[2]->GetViewAccessibility().OverrideIsIgnored(true);
+  EXPECT_EQ(view_accessibility(group_ids[0])->GetSetSize(), 1);
+  EXPECT_EQ(view_accessibility(group_ids[0])->GetPosInSet(), 1);
+  EXPECT_FALSE(view_accessibility(group_ids[1])->GetSetSize().has_value());
+  EXPECT_FALSE(view_accessibility(group_ids[1])->GetPosInSet().has_value());
+  EXPECT_FALSE(view_accessibility(group_ids[2])->GetSetSize().has_value());
+  EXPECT_FALSE(view_accessibility(group_ids[2])->GetPosInSet().has_value());
+  group_ids[1]->GetViewAccessibility().OverrideIsIgnored(false);
+  group_ids[2]->GetViewAccessibility().OverrideIsIgnored(false);
+
+  // Test Views with setSize/ posInSet override values set.
+  std::vector<View*> overrides;
+  SetUpExtraViewsWithSetOverrides(overrides);
+  EXPECT_EQ(view_accessibility(overrides[0])->GetSetSize(), 4);
+  EXPECT_EQ(view_accessibility(overrides[0])->GetPosInSet(), 4);
+  EXPECT_EQ(view_accessibility(overrides[1])->GetSetSize(), 4);
+  EXPECT_EQ(view_accessibility(overrides[1])->GetPosInSet(), 3);
+  EXPECT_EQ(view_accessibility(overrides[2])->GetSetSize(), 4);
+  EXPECT_EQ(view_accessibility(overrides[2])->GetPosInSet(), 2);
+
+  EXPECT_FALSE(view_accessibility(overrides[3])->GetSetSize().has_value());
+  EXPECT_FALSE(view_accessibility(overrides[3])->GetPosInSet().has_value());
+
+  EXPECT_EQ(view_accessibility(overrides[4])->GetSetSize(), 4);
+  EXPECT_EQ(view_accessibility(overrides[4])->GetPosInSet(), 1);
+
+  // Test Views with both group ids and setSize/ posInSet override values set.
+  // Make sure the override values take precedence when both are set.
+  // Add setSize/ posInSet overrides to the Views with group ids.
+  SetUpExtraViewsWithSetOverrides(group_ids);
+  EXPECT_EQ(view_accessibility(group_ids[0])->GetSetSize(), 4);
+  EXPECT_EQ(view_accessibility(group_ids[0])->GetPosInSet(), 4);
+  EXPECT_EQ(view_accessibility(group_ids[1])->GetSetSize(), 4);
+  EXPECT_EQ(view_accessibility(group_ids[1])->GetPosInSet(), 3);
+  EXPECT_EQ(view_accessibility(group_ids[2])->GetSetSize(), 4);
+  EXPECT_EQ(view_accessibility(group_ids[2])->GetPosInSet(), 2);
+
+  EXPECT_EQ(view_accessibility(group_ids[3])->GetSetSize(), 1);
+  EXPECT_EQ(view_accessibility(group_ids[3])->GetPosInSet(), 1);
+
+  EXPECT_EQ(view_accessibility(group_ids[4])->GetSetSize(), 4);
+  EXPECT_EQ(view_accessibility(group_ids[4])->GetPosInSet(), 1);
+}
+
 #if defined(USE_AURA)
 class DerivedTestView : public View {
  public:
diff --git a/ui/views/bubble/bubble_frame_view.cc b/ui/views/bubble/bubble_frame_view.cc
index ee06e57..e3fc6bf 100644
--- a/ui/views/bubble/bubble_frame_view.cc
+++ b/ui/views/bubble/bubble_frame_view.cc
@@ -104,7 +104,7 @@
     const base::string16& title_text) {
   auto title = std::make_unique<Label>(title_text, style::CONTEXT_DIALOG_TITLE);
   title->SetHorizontalAlignment(gfx::ALIGN_LEFT);
-  title->set_collapse_when_hidden(true);
+  title->SetCollapseWhenHidden(true);
   title->SetMultiLine(true);
   return title;
 }
diff --git a/ui/views/bubble/bubble_frame_view_unittest.cc b/ui/views/bubble/bubble_frame_view_unittest.cc
index 4c175276..d4b6ed7 100644
--- a/ui/views/bubble/bubble_frame_view_unittest.cc
+++ b/ui/views/bubble/bubble_frame_view_unittest.cc
@@ -1108,8 +1108,8 @@
   // Sanity check: Title labels default to multiline and elide tail. Either of
   // which result in the Layout system making the title and resulting dialog
   // very narrow.
-  EXPECT_EQ(gfx::ELIDE_TAIL, title_label->elide_behavior());
-  EXPECT_TRUE(title_label->multi_line());
+  EXPECT_EQ(gfx::ELIDE_TAIL, title_label->GetElideBehavior());
+  EXPECT_TRUE(title_label->GetMultiLine());
   EXPECT_GT(empty_bubble_width, title_label->size().width());
   EXPECT_EQ(empty_bubble_width, bubble->GetClientAreaBoundsInScreen().width());
 
diff --git a/ui/views/controls/button/checkbox.cc b/ui/views/controls/button/checkbox.cc
index 1f216af..affe2c7 100644
--- a/ui/views/controls/button/checkbox.cc
+++ b/ui/views/controls/button/checkbox.cc
@@ -74,7 +74,7 @@
 }
 
 bool Checkbox::GetMultiLine() const {
-  return label()->multi_line();
+  return label()->GetMultiLine();
 }
 
 void Checkbox::SetAssociatedLabel(View* labelling_view) {
diff --git a/ui/views/controls/button/label_button.cc b/ui/views/controls/button/label_button.cc
index e5a9620..214b1a74 100644
--- a/ui/views/controls/button/label_button.cc
+++ b/ui/views/controls/button/label_button.cc
@@ -67,7 +67,7 @@
 }
 
 base::string16 LabelButton::GetText() const {
-  return label_->text();
+  return label_->GetText();
 }
 
 void LabelButton::SetText(const base::string16& text) {
@@ -256,7 +256,7 @@
       label_area.height());
 
   gfx::Point image_origin(child_area.origin());
-  if (label_->multi_line()) {
+  if (label_->GetMultiLine()) {
     // Right now this code currently only works for CheckBox and RadioButton
     // descendants that have multi-line enabled for their label.
     image_origin.Offset(
@@ -382,7 +382,7 @@
   params->button.is_focused = HasFocus() && IsAccessibilityFocusable();
   params->button.has_border = false;
   params->button.classic_state = 0;
-  params->button.background_color = label_->background_color();
+  params->button.background_color = label_->GetBackgroundColor();
 }
 
 void LabelButton::ResetColorsFromNativeTheme() {
@@ -503,7 +503,7 @@
 
 void LabelButton::ResetLabelEnabledColor() {
   const SkColor color = button_state_colors_[state()];
-  if (state() != STATE_DISABLED && label_->enabled_color() != color)
+  if (state() != STATE_DISABLED && label_->GetEnabledColor() != color)
     label_->SetEnabledColor(color);
 }
 
diff --git a/ui/views/controls/button/label_button_label.cc b/ui/views/controls/button/label_button_label.cc
index b2eff942..81c7c3d 100644
--- a/ui/views/controls/button/label_button_label.cc
+++ b/ui/views/controls/button/label_button_label.cc
@@ -40,7 +40,7 @@
                                         : requested_disabled_color_);
   } else {
     int style = GetEnabled() ? style::STYLE_PRIMARY : style::STYLE_DISABLED;
-    Label::SetEnabledColor(style::GetColor(*this, text_context(), style));
+    Label::SetEnabledColor(style::GetColor(*this, GetTextContext(), style));
   }
 }
 
diff --git a/ui/views/controls/button/label_button_label_unittest.cc b/ui/views/controls/button/label_button_label_unittest.cc
index 1f5cd70..a1254e2c 100644
--- a/ui/views/controls/button/label_button_label_unittest.cc
+++ b/ui/views/controls/button/label_button_label_unittest.cc
@@ -43,7 +43,7 @@
   // LabelButtonLabel:
   void SchedulePaintInRect(const gfx::Rect& r) override {
     LabelButtonLabel::SchedulePaintInRect(r);
-    *last_color_ = enabled_color();
+    *last_color_ = GetEnabledColor();
   }
 
  private:
diff --git a/ui/views/controls/button/label_button_unittest.cc b/ui/views/controls/button/label_button_unittest.cc
index 483d3fa..c55ee6e14 100644
--- a/ui/views/controls/button/label_button_unittest.cc
+++ b/ui/views/controls/button/label_button_unittest.cc
@@ -481,24 +481,24 @@
 TEST_F(LabelButtonTest, HighlightedButtonStyle) {
   // The NativeTheme might not provide SK_ColorBLACK, but it should be the same
   // for normal and pressed states.
-  EXPECT_EQ(themed_normal_text_color_, button_->label()->enabled_color());
+  EXPECT_EQ(themed_normal_text_color_, button_->label()->GetEnabledColor());
   button_->SetState(Button::STATE_PRESSED);
-  EXPECT_EQ(themed_normal_text_color_, button_->label()->enabled_color());
+  EXPECT_EQ(themed_normal_text_color_, button_->label()->GetEnabledColor());
 }
 
 // Ensure the label gets the correct enabled color after
 // LabelButton::ResetColorsFromNativeTheme() is invoked.
 TEST_F(LabelButtonTest, ResetColorsFromNativeTheme) {
   ASSERT_FALSE(color_utils::IsInvertedColorScheme());
-  ASSERT_NE(button_->label()->background_color(), SK_ColorBLACK);
-  EXPECT_EQ(themed_normal_text_color_, button_->label()->enabled_color());
+  ASSERT_NE(button_->label()->GetBackgroundColor(), SK_ColorBLACK);
+  EXPECT_EQ(themed_normal_text_color_, button_->label()->GetEnabledColor());
 
   button_->label()->SetBackgroundColor(SK_ColorBLACK);
   button_->label()->SetAutoColorReadabilityEnabled(true);
-  EXPECT_NE(themed_normal_text_color_, button_->label()->enabled_color());
+  EXPECT_NE(themed_normal_text_color_, button_->label()->GetEnabledColor());
 
   button_->ResetColorsFromNativeTheme();
-  EXPECT_EQ(themed_normal_text_color_, button_->label()->enabled_color());
+  EXPECT_EQ(themed_normal_text_color_, button_->label()->GetEnabledColor());
 }
 
 // Test fixture for a LabelButton that has an ink drop configured.
diff --git a/ui/views/controls/button/md_text_button.cc b/ui/views/controls/button/md_text_button.cc
index 0e8d5319b..0b4f7d7 100644
--- a/ui/views/controls/button/md_text_button.cc
+++ b/ui/views/controls/button/md_text_button.cc
@@ -114,7 +114,7 @@
 }
 
 SkColor MdTextButton::GetInkDropBaseColor() const {
-  return color_utils::DeriveDefaultIconColor(label()->enabled_color());
+  return color_utils::DeriveDefaultIconColor(label()->GetEnabledColor());
 }
 
 void MdTextButton::StateChanged(ButtonState old_state) {
@@ -240,20 +240,20 @@
 void MdTextButton::UpdateColors() {
   bool is_disabled = state() == STATE_DISABLED;
   SkColor enabled_text_color =
-      style::GetColor(*this, label()->text_context(),
+      style::GetColor(*this, label()->GetTextContext(),
                       is_prominent_ ? style::STYLE_DIALOG_BUTTON_DEFAULT
                                     : style::STYLE_PRIMARY);
   if (!explicitly_set_normal_color()) {
     const auto colors = explicitly_set_colors();
     LabelButton::SetEnabledTextColors(enabled_text_color);
     // Disabled buttons need the disabled color explicitly set.
-    // This ensures that label()->enabled_color() returns the correct color as
+    // This ensures that label()->GetEnabledColor() returns the correct color as
     // the basis for calculating the stroke color. enabled_text_color isn't used
     // since a descendant could have overridden the label enabled color.
     if (is_disabled) {
-      LabelButton::SetTextColor(STATE_DISABLED,
-                                style::GetColor(*this, label()->text_context(),
-                                                style::STYLE_DISABLED));
+      LabelButton::SetTextColor(
+          STATE_DISABLED, style::GetColor(*this, label()->GetTextContext(),
+                                          style::STYLE_DISABLED));
     }
     set_explicitly_set_colors(colors);
   }
diff --git a/ui/views/controls/label.cc b/ui/views/controls/label.cc
index bc082eb1..e2d51fc 100644
--- a/ui/views/controls/label.cc
+++ b/ui/views/controls/label.cc
@@ -80,19 +80,36 @@
   ResetLayout();
 }
 
+const base::string16& Label::GetText() const {
+  return full_text_->text();
+}
+
 void Label::SetText(const base::string16& new_text) {
-  if (new_text == text())
+  if (new_text == GetText())
     return;
   full_text_->SetText(new_text);
-  ResetLayout();
+  OnPropertyChanged(&new_text, kPropertyEffectsLayout);
   stored_selection_range_ = gfx::Range::InvalidRange();
 }
 
-void Label::SetAutoColorReadabilityEnabled(bool enabled) {
-  if (auto_color_readability_ == enabled)
+int Label::GetTextContext() const {
+  return text_context_;
+}
+
+bool Label::GetAutoColorReadabilityEnabled() const {
+  return auto_color_readability_enabled_;
+}
+
+void Label::SetAutoColorReadabilityEnabled(
+    bool auto_color_readability_enabled) {
+  if (auto_color_readability_enabled_ == auto_color_readability_enabled)
     return;
-  auto_color_readability_ = enabled;
-  RecalculateColors();
+  auto_color_readability_enabled_ = auto_color_readability_enabled;
+  OnPropertyChanged(&auto_color_readability_enabled_, kPropertyEffectsPaint);
+}
+
+SkColor Label::GetEnabledColor() const {
+  return actual_enabled_color_;
 }
 
 void Label::SetEnabledColor(SkColor color) {
@@ -100,7 +117,11 @@
     return;
   requested_enabled_color_ = color;
   enabled_color_set_ = true;
-  RecalculateColors();
+  OnPropertyChanged(&requested_enabled_color_, kPropertyEffectsPaint);
+}
+
+SkColor Label::GetBackgroundColor() const {
+  return background_color_;
 }
 
 void Label::SetBackgroundColor(SkColor color) {
@@ -108,7 +129,11 @@
     return;
   background_color_ = color;
   background_color_set_ = true;
-  RecalculateColors();
+  OnPropertyChanged(&background_color_, kPropertyEffectsPaint);
+}
+
+SkColor Label::GetSelectionTextColor() const {
+  return actual_selection_text_color_;
 }
 
 void Label::SetSelectionTextColor(SkColor color) {
@@ -116,7 +141,11 @@
     return;
   requested_selection_text_color_ = color;
   selection_text_color_set_ = true;
-  RecalculateColors();
+  OnPropertyChanged(&requested_selection_text_color_, kPropertyEffectsPaint);
+}
+
+SkColor Label::GetSelectionBackgroundColor() const {
+  return selection_background_color_;
 }
 
 void Label::SetSelectionBackgroundColor(SkColor color) {
@@ -124,7 +153,11 @@
     return;
   selection_background_color_ = color;
   selection_background_color_set_ = true;
-  RecalculateColors();
+  OnPropertyChanged(&selection_background_color_, kPropertyEffectsPaint);
+}
+
+const gfx::ShadowValues& Label::shadows() const {
+  return full_text_->shadows();
 }
 
 void Label::SetShadows(const gfx::ShadowValues& shadows) {
@@ -134,53 +167,82 @@
   ResetLayout();
 }
 
+bool Label::GetSubpixelRenderingEnabled() const {
+  return subpixel_rendering_enabled_;
+}
+
 void Label::SetSubpixelRenderingEnabled(bool subpixel_rendering_enabled) {
   if (subpixel_rendering_enabled_ == subpixel_rendering_enabled)
     return;
   subpixel_rendering_enabled_ = subpixel_rendering_enabled;
-  RecalculateColors();
+  OnPropertyChanged(&subpixel_rendering_enabled_, kPropertyEffectsPaint);
+}
+
+gfx::HorizontalAlignment Label::GetHorizontalAlignment() const {
+  return full_text_->horizontal_alignment();
 }
 
 void Label::SetHorizontalAlignment(gfx::HorizontalAlignment alignment) {
   alignment = gfx::MaybeFlipForRTL(alignment);
-  if (horizontal_alignment() == alignment)
+  if (GetHorizontalAlignment() == alignment)
     return;
   full_text_->SetHorizontalAlignment(alignment);
   ResetLayout();
 }
 
+int Label::GetLineHeight() const {
+  return full_text_->min_line_height();
+}
+
 void Label::SetLineHeight(int height) {
-  if (line_height() == height)
+  if (GetLineHeight() == height)
     return;
   full_text_->SetMinLineHeight(height);
-  ResetLayout();
+  OnPropertyChanged(&height, kPropertyEffectsLayout);
+}
+
+bool Label::GetMultiLine() const {
+  return multi_line_;
 }
 
 void Label::SetMultiLine(bool multi_line) {
   DCHECK(!multi_line || (elide_behavior_ == gfx::ELIDE_TAIL ||
                          elide_behavior_ == gfx::NO_ELIDE));
-  if (this->multi_line() == multi_line)
+  if (this->GetMultiLine() == multi_line)
     return;
   multi_line_ = multi_line;
   full_text_->SetMultiline(multi_line);
   full_text_->SetReplaceNewlineCharsWithSymbols(!multi_line);
-  ResetLayout();
+  OnPropertyChanged(&multi_line_, kPropertyEffectsLayout);
+}
+
+int Label::GetMaxLines() const {
+  return max_lines_;
 }
 
 void Label::SetMaxLines(int max_lines) {
   if (max_lines_ == max_lines)
     return;
   max_lines_ = max_lines;
-  ResetLayout();
+  OnPropertyChanged(&max_lines_, kPropertyEffectsLayout);
+}
+
+bool Label::GetObscured() const {
+  return full_text_->obscured();
 }
 
 void Label::SetObscured(bool obscured) {
-  if (this->obscured() == obscured)
+  if (this->GetObscured() == obscured)
     return;
   full_text_->SetObscured(obscured);
   if (obscured)
     SetSelectable(false);
-  ResetLayout();
+  OnPropertyChanged(&obscured, kPropertyEffectsLayout);
+}
+
+bool Label::GetAllowCharacterBreak() const {
+  return full_text_->word_wrap_behavior() == gfx::WRAP_LONG_WORDS ? true
+                                                                  : false;
 }
 
 void Label::SetAllowCharacterBreak(bool allow_character_break) {
@@ -189,41 +251,75 @@
   if (full_text_->word_wrap_behavior() == behavior)
     return;
   full_text_->SetWordWrapBehavior(behavior);
-  if (multi_line()) {
-    ResetLayout();
-  }
+  OnPropertyChanged(&allow_character_break, kPropertyEffectsLayout);
+}
+
+gfx::ElideBehavior Label::GetElideBehavior() const {
+  return elide_behavior_;
 }
 
 void Label::SetElideBehavior(gfx::ElideBehavior elide_behavior) {
-  DCHECK(!multi_line() || (elide_behavior_ == gfx::ELIDE_TAIL ||
-                           elide_behavior_ == gfx::NO_ELIDE));
+  DCHECK(!GetMultiLine() || (elide_behavior_ == gfx::ELIDE_TAIL ||
+                             elide_behavior_ == gfx::NO_ELIDE));
   if (elide_behavior_ == elide_behavior)
     return;
   elide_behavior_ = elide_behavior;
   ResetLayout();
 }
 
+base::string16 Label::GetTooltipText() const {
+  return tooltip_text_;
+}
+
 void Label::SetTooltipText(const base::string16& tooltip_text) {
   DCHECK(handles_tooltips_);
+  if (tooltip_text_ == tooltip_text)
+    return;
   tooltip_text_ = tooltip_text;
+  OnPropertyChanged(&tooltip_text_, kPropertyEffectsNone);
+}
+
+bool Label::GetHandlesTooltips() const {
+  return handles_tooltips_;
 }
 
 void Label::SetHandlesTooltips(bool enabled) {
+  if (handles_tooltips_ == enabled)
+    return;
   handles_tooltips_ = enabled;
+  OnPropertyChanged(&handles_tooltips_, kPropertyEffectsNone);
 }
 
 void Label::SizeToFit(int fixed_width) {
-  DCHECK(multi_line());
+  DCHECK(GetMultiLine());
   DCHECK_EQ(0, max_width_);
   fixed_width_ = fixed_width;
   SizeToPreferredSize();
 }
 
+int Label::GetMaximumWidth() const {
+  return max_width_;
+}
+
 void Label::SetMaximumWidth(int max_width) {
-  DCHECK(multi_line());
+  DCHECK(GetMultiLine());
   DCHECK_EQ(0, fixed_width_);
+  if (max_width_ == max_width)
+    return;
   max_width_ = max_width;
-  SizeToPreferredSize();
+  OnPropertyChanged(&max_width_, kPropertyEffectsPreferredSizeChanged);
+}
+
+bool Label::GetCollapseWhenHidden() const {
+  return collapse_when_hidden_;
+}
+
+void Label::SetCollapseWhenHidden(bool value) {
+  if (collapse_when_hidden_ == value)
+    return;
+  collapse_when_hidden_ = value;
+  OnPropertyChanged(&collapse_when_hidden_,
+                    kPropertyEffectsPreferredSizeChanged);
 }
 
 size_t Label::GetRequiredLines() const {
@@ -241,11 +337,15 @@
 }
 
 bool Label::IsSelectionSupported() const {
-  return !obscured() && full_text_->IsSelectionSupported();
+  return !GetObscured() && full_text_->IsSelectionSupported();
+}
+
+bool Label::GetSelectable() const {
+  return !!selection_controller_;
 }
 
 bool Label::SetSelectable(bool value) {
-  if (value == selectable())
+  if (value == GetSelectable())
     return true;
 
   if (!value) {
@@ -303,17 +403,17 @@
   if (!GetVisible() && collapse_when_hidden_)
     return gfx::Size();
 
-  if (multi_line() && fixed_width_ != 0 && !text().empty())
+  if (GetMultiLine() && fixed_width_ != 0 && !GetText().empty())
     return gfx::Size(fixed_width_, GetHeightForWidth(fixed_width_));
 
   gfx::Size size(GetTextSize());
   const gfx::Insets insets = GetInsets();
   size.Enlarge(insets.width(), insets.height());
 
-  if (multi_line() && max_width_ != 0 && max_width_ < size.width())
+  if (GetMultiLine() && max_width_ != 0 && max_width_ < size.width())
     return gfx::Size(max_width_, GetHeightForWidth(max_width_));
 
-  if (multi_line() && max_lines() > 0)
+  if (GetMultiLine() && GetMaxLines() > 0)
     return gfx::Size(size.width(), GetHeightForWidth(size.width()));
   return size;
 }
@@ -331,7 +431,7 @@
         base::string16(gfx::kEllipsisUTF16), font_list()));
   }
 
-  if (!multi_line()) {
+  if (!GetMultiLine()) {
     if (elide_behavior_ == gfx::NO_ELIDE) {
       // If elision is disabled on single-line Labels, use text size as minimum.
       // This is OK because clients can use |gfx::ElideBehavior::TRUNCATE|
@@ -351,8 +451,8 @@
 
   w -= GetInsets().width();
   int height = 0;
-  int base_line_height = std::max(line_height(), font_list().GetHeight());
-  if (!multi_line() || text().empty() || w <= 0) {
+  int base_line_height = std::max(GetLineHeight(), font_list().GetHeight());
+  if (!GetMultiLine() || GetText().empty() || w <= 0) {
     height = base_line_height;
   } else {
     // SetDisplayRect() has a side effect for later calls of GetStringSize().
@@ -363,10 +463,10 @@
     // and |full_text_| can cache the height.
     full_text_->SetDisplayRect(gfx::Rect(0, 0, w, 0));
     int string_height = full_text_->GetStringSize().height();
-    // Cap the number of lines to |max_lines()| if multi-line and non-zero
-    // |max_lines()|.
-    height = multi_line() && max_lines() > 0
-                 ? std::min(max_lines() * base_line_height, string_height)
+    // Cap the number of lines to |GetMaxLines()| if multi-line and non-zero
+    // |GetMaxLines()|.
+    height = GetMultiLine() && GetMaxLines() > 0
+                 ? std::min(GetMaxLines() * base_line_height, string_height)
                  : string_height;
   }
   height -= gfx::ShadowValue::GetMargin(full_text_->shadows()).height();
@@ -415,33 +515,37 @@
 }
 
 void Label::OnHandlePropertyChangeEffects(PropertyEffects property_effects) {
+  if (property_effects & kPropertyEffectsPreferredSizeChanged)
+    SizeToPreferredSize();
   if (property_effects & kPropertyEffectsLayout)
     ResetLayout();
+  if (property_effects & kPropertyEffectsPaint)
+    RecalculateColors();
 }
 
 std::unique_ptr<gfx::RenderText> Label::CreateRenderText() const {
   // Multi-line labels only support NO_ELIDE and ELIDE_TAIL for now.
   // TODO(warx): Investigate more elide text support.
   gfx::ElideBehavior elide_behavior =
-      multi_line() && (elide_behavior_ != gfx::NO_ELIDE) ? gfx::ELIDE_TAIL
-                                                         : elide_behavior_;
+      GetMultiLine() && (elide_behavior_ != gfx::NO_ELIDE) ? gfx::ELIDE_TAIL
+                                                           : elide_behavior_;
 
   auto render_text = gfx::RenderText::CreateHarfBuzzInstance();
-  render_text->SetHorizontalAlignment(horizontal_alignment());
+  render_text->SetHorizontalAlignment(GetHorizontalAlignment());
   render_text->SetDirectionalityMode(full_text_->directionality_mode());
   render_text->SetElideBehavior(elide_behavior);
-  render_text->SetObscured(obscured());
-  render_text->SetMinLineHeight(line_height());
+  render_text->SetObscured(GetObscured());
+  render_text->SetMinLineHeight(GetLineHeight());
   render_text->SetFontList(font_list());
   render_text->set_shadows(shadows());
   render_text->SetCursorEnabled(false);
-  render_text->SetText(text());
-  render_text->SetMultiline(multi_line());
-  render_text->SetMaxLines(multi_line() ? max_lines() : 0);
+  render_text->SetText(GetText());
+  render_text->SetMultiline(GetMultiLine());
+  render_text->SetMaxLines(GetMultiLine() ? GetMaxLines() : 0);
   render_text->SetWordWrapBehavior(full_text_->word_wrap_behavior());
 
   // Setup render text for selection controller.
-  if (selectable()) {
+  if (GetSelectable()) {
     render_text->set_focused(HasFocus());
     if (stored_selection_range_.IsValid())
       render_text->SelectRange(stored_selection_range_);
@@ -600,7 +704,7 @@
       }
       break;
     case ui::VKEY_A:
-      if (control && !alt && !text().empty()) {
+      if (control && !alt && !GetText().empty()) {
         SelectAll();
         DCHECK(HasSelection());
         UpdateSelectionClipboard();
@@ -733,7 +837,7 @@
 
 void Label::UpdateSelectionClipboard() {
 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-  if (!obscured()) {
+  if (!GetObscured()) {
     ui::ScopedClipboardWriter(ui::ClipboardType::kSelection)
         .WriteText(GetSelectedText());
   }
@@ -747,9 +851,9 @@
 bool Label::IsCommandIdEnabled(int command_id) const {
   switch (command_id) {
     case IDS_APP_COPY:
-      return HasSelection() && !obscured();
+      return HasSelection() && !GetObscured();
     case IDS_APP_SELECT_ALL:
-      return GetRenderTextForSelectionController() && !text().empty();
+      return GetRenderTextForSelectionController() && !GetText().empty();
   }
   return false;
 }
@@ -786,7 +890,7 @@
 }
 
 const gfx::RenderText* Label::GetRenderTextForSelectionController() const {
-  if (!selectable())
+  if (!GetSelectable())
     return nullptr;
   MaybeBuildDisplayText();
 
@@ -813,7 +917,7 @@
   enabled_color_set_ = background_color_set_ = false;
   selection_text_color_set_ = selection_background_color_set_ = false;
   subpixel_rendering_enabled_ = true;
-  auto_color_readability_ = true;
+  auto_color_readability_enabled_ = true;
   multi_line_ = false;
   max_lines_ = 0;
   UpdateColorsFromTheme();
@@ -856,8 +960,8 @@
 
 gfx::Size Label::GetTextSize() const {
   gfx::Size size;
-  if (text().empty()) {
-    size = gfx::Size(0, std::max(line_height(), font_list().GetHeight()));
+  if (GetText().empty()) {
+    size = gfx::Size(0, std::max(GetLineHeight(), font_list().GetHeight()));
   } else {
     // Cancel the display rect of |full_text_|. The display rect may be
     // specified in GetHeightForWidth(), and specifying empty Rect cancels
@@ -875,7 +979,7 @@
 
 SkColor Label::GetForegroundColor(SkColor foreground,
                                   SkColor background) const {
-  return (auto_color_readability_ && IsOpaque(background))
+  return (auto_color_readability_enabled_ && IsOpaque(background))
              ? color_utils::BlendForMinContrast(foreground, background).color
              : foreground;
 }
@@ -932,8 +1036,9 @@
 bool Label::ShouldShowDefaultTooltip() const {
   const gfx::Size text_size = GetTextSize();
   const gfx::Size size = GetContentsBounds().size();
-  return !obscured() && (text_size.width() > size.width() ||
-                         (multi_line() && text_size.height() > size.height()));
+  return !GetObscured() &&
+         (text_size.width() > size.width() ||
+          (GetMultiLine() && text_size.height() > size.height()));
 }
 
 void Label::ClearDisplayText() const {
@@ -957,7 +1062,7 @@
 }
 
 void Label::CopyToClipboard() {
-  if (!HasSelection() || obscured())
+  if (!HasSelection() || GetObscured())
     return;
   ui::ScopedClipboardWriter(ui::ClipboardType::kCopyPaste)
       .WriteText(GetSelectedText());
@@ -971,6 +1076,23 @@
 
 BEGIN_METADATA(Label)
 METADATA_PARENT_CLASS(View)
+ADD_PROPERTY_METADATA(Label, bool, AutoColorReadabilityEnabled)
+ADD_PROPERTY_METADATA(Label, base::string16, Text)
+ADD_PROPERTY_METADATA(Label, SkColor, EnabledColor)
+ADD_PROPERTY_METADATA(Label, SkColor, BackgroundColor)
+ADD_PROPERTY_METADATA(Label, SkColor, SelectionTextColor)
+ADD_PROPERTY_METADATA(Label, SkColor, SelectionBackgroundColor)
+ADD_PROPERTY_METADATA(Label, bool, SubpixelRenderingEnabled)
+ADD_PROPERTY_METADATA(Label, int, LineHeight)
+ADD_PROPERTY_METADATA(Label, bool, MultiLine)
+ADD_PROPERTY_METADATA(Label, int, MaxLines)
+ADD_PROPERTY_METADATA(Label, bool, Obscured)
+ADD_PROPERTY_METADATA(Label, bool, AllowCharacterBreak)
+ADD_PROPERTY_METADATA(Label, base::string16, TooltipText)
+ADD_PROPERTY_METADATA(Label, bool, HandlesTooltips)
+ADD_PROPERTY_METADATA(Label, bool, CollapseWhenHidden)
+ADD_PROPERTY_METADATA(Label, int, MaximumWidth)
+ADD_READONLY_PROPERTY_METADATA(Label, int, TextContext)
 END_METADATA()
 
 }  // namespace views
diff --git a/ui/views/controls/label.h b/ui/views/controls/label.h
index 36117ce..ce169b1 100644
--- a/ui/views/controls/label.h
+++ b/ui/views/controls/label.h
@@ -77,72 +77,71 @@
   virtual void SetFontList(const gfx::FontList& font_list);
 
   // Get or set the label text.
-  const base::string16& text() const { return full_text_->text(); }
+  const base::string16& GetText() const;
   virtual void SetText(const base::string16& text);
 
   // Where the label appears in the UI. Passed in from the constructor. This is
   // a value from views::style::TextContext or an enum that extends it.
-  int text_context() const { return text_context_; }
+  int GetTextContext() const;
 
   // Enables or disables auto-color-readability (enabled by default).  If this
   // is enabled, then calls to set any foreground or background color will
   // trigger an automatic mapper that uses color_utils::BlendForMinContrast()
   // to ensure that the foreground colors are readable over the background
   // color.
+  bool GetAutoColorReadabilityEnabled() const;
   void SetAutoColorReadabilityEnabled(bool enabled);
 
-  // Sets the color.  This will automatically force the color to be readable
-  // over the current background color, if auto color readability is enabled.
+  // Gets/Sets the color.  This will automatically force the color to be
+  // readable over the current background color, if auto color readability is
+  // enabled.
+  SkColor GetEnabledColor() const;
   virtual void SetEnabledColor(SkColor color);
 
-  SkColor enabled_color() const { return actual_enabled_color_; }
-
-  // Sets the background color. This won't be explicitly drawn, but the label
-  // will force the text color to be readable over it.
+  // Gets/Sets the background color. This won't be explicitly drawn, but the
+  // label will force the text color to be readable over it.
+  SkColor GetBackgroundColor() const;
   void SetBackgroundColor(SkColor color);
-  SkColor background_color() const { return background_color_; }
 
-  // Sets the selection text color. This will automatically force the color to
-  // be readable over the selection background color, if auto color readability
-  // is enabled. Initialized with system default.
+  // Gets/Sets the selection text color. This will automatically force the color
+  // to be readable over the selection background color, if auto color
+  // readability is enabled. Initialized with system default.
+  SkColor GetSelectionTextColor() const;
   void SetSelectionTextColor(SkColor color);
-  SkColor selection_text_color() const { return actual_selection_text_color_; }
 
-  // Sets the selection background color. Initialized with system default.
+  // Gets/Sets the selection background color. Initialized with system default.
+  SkColor GetSelectionBackgroundColor() const;
   void SetSelectionBackgroundColor(SkColor color);
-  SkColor selection_background_color() const {
-    return selection_background_color_;
-  }
 
-  // Set drop shadows underneath the text.
+  // Get/Set drop shadows underneath the text.
+  const gfx::ShadowValues& shadows() const;
   void SetShadows(const gfx::ShadowValues& shadows);
-  const gfx::ShadowValues& shadows() const { return full_text_->shadows(); }
 
-  // Sets whether subpixel rendering is used; the default is true, but this
+  // Gets/Sets whether subpixel rendering is used; the default is true, but this
   // feature also requires an opaque background color.
   // TODO(mukai): rename this as SetSubpixelRenderingSuppressed() to keep the
   // consistency with RenderText field name.
+  bool GetSubpixelRenderingEnabled() const;
   void SetSubpixelRenderingEnabled(bool subpixel_rendering_enabled);
 
-  // Sets the horizontal alignment; the argument value is mirrored in RTL UI.
+  // Gets/Sets the horizontal alignment; the argument value is mirrored in RTL
+  // UI.
+  gfx::HorizontalAlignment GetHorizontalAlignment() const;
   void SetHorizontalAlignment(gfx::HorizontalAlignment alignment);
-  gfx::HorizontalAlignment horizontal_alignment() const {
-    return full_text_->horizontal_alignment();
-  }
 
   // Get or set the distance in pixels between baselines of multi-line text.
   // Default is 0, indicating the distance between lines should be the standard
   // one for the label's text, font list, and platform.
-  int line_height() const { return full_text_->min_line_height(); }
+  int GetLineHeight() const;
   void SetLineHeight(int height);
 
   // Get or set if the label text can wrap on multiple lines; default is false.
-  bool multi_line() const { return multi_line_; }
+  bool GetMultiLine() const;
   void SetMultiLine(bool multi_line);
 
   // If multi-line, a non-zero value will cap the number of lines rendered, and
   // elide the rest (currently only ELIDE_TAIL supported). See gfx::RenderText.
-  int max_lines() const { return max_lines_; }
+  int GetMaxLines() const;
   void SetMaxLines(int max_lines);
 
   // Returns the number of lines required to render all text. The actual number
@@ -151,28 +150,31 @@
 
   // Get or set if the label text should be obscured before rendering (e.g.
   // should "Password!" display as "*********"); default is false.
-  bool obscured() const { return full_text_->obscured(); }
+  bool GetObscured() const;
   void SetObscured(bool obscured);
 
-  // Sets whether multi-line text can wrap mid-word; the default is false.
+  // Gets/Sets whether multi-line text can wrap mid-word; the default is false.
   // TODO(mukai): allow specifying WordWrapBehavior.
+  bool GetAllowCharacterBreak() const;
   void SetAllowCharacterBreak(bool allow_character_break);
 
-  // Sets the eliding or fading behavior, applied as necessary. The default is
-  // to elide at the end. Eliding is not well-supported for multi-line labels.
+  // Gets/Sets the eliding or fading behavior, applied as necessary. The default
+  // is to elide at the end. Eliding is not well-supported for multi-line
+  // labels.
+  gfx::ElideBehavior GetElideBehavior() const;
   void SetElideBehavior(gfx::ElideBehavior elide_behavior);
-  gfx::ElideBehavior elide_behavior() const { return elide_behavior_; }
 
-  // Sets the tooltip text.  Default behavior for a label (single-line) is to
-  // show the full text if it is wider than its bounds.  Calling this overrides
-  // the default behavior and lets you set a custom tooltip.  To revert to
-  // default behavior, call this with an empty string.
+  // Gets/Sets the tooltip text.  Default behavior for a label (single-line) is
+  // to show the full text if it is wider than its bounds.  Calling this
+  // overrides the default behavior and lets you set a custom tooltip.  To
+  // revert to default behavior, call this with an empty string.
+  base::string16 GetTooltipText() const;
   void SetTooltipText(const base::string16& tooltip_text);
 
   // Get or set whether this label can act as a tooltip handler; the default is
   // true.  Set to false whenever an ancestor view should handle tooltips
   // instead.
-  bool handles_tooltips() const { return handles_tooltips_; }
+  bool GetHandlesTooltips() const;
   void SetHandlesTooltips(bool enabled);
 
   // Resizes the label so its width is set to the fixed width and its height
@@ -185,10 +187,13 @@
   void SizeToFit(int fixed_width);
 
   // Like SizeToFit, but uses a smaller width if possible.
+  int GetMaximumWidth() const;
   void SetMaximumWidth(int max_width);
 
-  // Sets whether the preferred size is empty when the label is not visible.
-  void set_collapse_when_hidden(bool value) { collapse_when_hidden_ = value; }
+  // Gets/Sets whether the preferred size is empty when the label is not
+  // visible.
+  bool GetCollapseWhenHidden() const;
+  void SetCollapseWhenHidden(bool value);
 
   // Get the text as displayed to the user, respecting the obscured flag.
   base::string16 GetDisplayTextForTesting();
@@ -204,7 +209,7 @@
   virtual bool IsSelectionSupported() const;
 
   // Returns true if the label is selectable. Default is false.
-  bool selectable() const { return !!selection_controller_; }
+  bool GetSelectable() const;
 
   // Sets whether the label is selectable. False is returned if the call fails,
   // i.e. when selection is not supported but |selectable| is true. For example,
@@ -381,7 +386,7 @@
   gfx::ElideBehavior elide_behavior_;
 
   bool subpixel_rendering_enabled_;
-  bool auto_color_readability_;
+  bool auto_color_readability_enabled_;
   // TODO(mukai): remove |multi_line_| when all RenderText can render multiline.
   bool multi_line_;
   int max_lines_;
diff --git a/ui/views/controls/label_unittest.cc b/ui/views/controls/label_unittest.cc
index 66fd7c7f..847e8c7 100644
--- a/ui/views/controls/label_unittest.cc
+++ b/ui/views/controls/label_unittest.cc
@@ -286,14 +286,14 @@
 TEST_F(LabelTest, TextProperty) {
   base::string16 test_text(ASCIIToUTF16("A random string."));
   label()->SetText(test_text);
-  EXPECT_EQ(test_text, label()->text());
+  EXPECT_EQ(test_text, label()->GetText());
 }
 
 TEST_F(LabelTest, ColorProperty) {
   SkColor color = SkColorSetARGB(20, 40, 10, 5);
   label()->SetAutoColorReadabilityEnabled(false);
   label()->SetEnabledColor(color);
-  EXPECT_EQ(color, label()->enabled_color());
+  EXPECT_EQ(color, label()->GetEnabledColor());
 }
 
 TEST_F(LabelTest, AlignmentProperty) {
@@ -307,18 +307,18 @@
     // The alignment should be flipped in RTL UI.
     label()->SetHorizontalAlignment(gfx::ALIGN_RIGHT);
     EXPECT_EQ(reverse_alignment ? gfx::ALIGN_LEFT : gfx::ALIGN_RIGHT,
-              label()->horizontal_alignment());
+              label()->GetHorizontalAlignment());
     label()->SetHorizontalAlignment(gfx::ALIGN_LEFT);
     EXPECT_EQ(reverse_alignment ? gfx::ALIGN_RIGHT : gfx::ALIGN_LEFT,
-              label()->horizontal_alignment());
+              label()->GetHorizontalAlignment());
     label()->SetHorizontalAlignment(gfx::ALIGN_CENTER);
-    EXPECT_EQ(gfx::ALIGN_CENTER, label()->horizontal_alignment());
+    EXPECT_EQ(gfx::ALIGN_CENTER, label()->GetHorizontalAlignment());
 
     for (size_t j = 0; j < 2; ++j) {
       label()->SetHorizontalAlignment(gfx::ALIGN_TO_HEAD);
       const bool rtl = j == 0;
       label()->SetText(rtl ? base::WideToUTF16(L"\x5d0") : ASCIIToUTF16("A"));
-      EXPECT_EQ(gfx::ALIGN_TO_HEAD, label()->horizontal_alignment());
+      EXPECT_EQ(gfx::ALIGN_TO_HEAD, label()->GetHorizontalAlignment());
     }
   }
 
@@ -328,7 +328,7 @@
 TEST_F(LabelTest, ElideBehavior) {
   base::string16 text(ASCIIToUTF16("This is example text."));
   label()->SetText(text);
-  EXPECT_EQ(gfx::ELIDE_TAIL, label()->elide_behavior());
+  EXPECT_EQ(gfx::ELIDE_TAIL, label()->GetElideBehavior());
   gfx::Size size = label()->GetPreferredSize();
   label()->SetBoundsRect(gfx::Rect(size));
   EXPECT_EQ(text, label()->GetDisplayTextForTesting());
@@ -348,7 +348,7 @@
   label()->SetText(text);
 
   // Default should be |gfx::ELIDE_TAIL|.
-  EXPECT_EQ(gfx::ELIDE_TAIL, label()->elide_behavior());
+  EXPECT_EQ(gfx::ELIDE_TAIL, label()->GetElideBehavior());
   gfx::Size size = label()->GetMinimumSize();
   // Elidable labels have a minimum width that fits |gfx::kEllipsisUTF16|.
   EXPECT_EQ(gfx::Canvas::GetStringWidth(base::string16(gfx::kEllipsisUTF16),
@@ -367,7 +367,7 @@
 
   // Non-elidable single-line labels should take up their full text size, since
   // this behavior implies the text should not be cut off.
-  EXPECT_FALSE(label()->multi_line());
+  EXPECT_FALSE(label()->GetMultiLine());
   label()->SetElideBehavior(gfx::NO_ELIDE);
   size = label()->GetMinimumSize();
   EXPECT_EQ(text.length(), label()->GetDisplayTextForTesting().length());
@@ -377,11 +377,11 @@
 }
 
 TEST_F(LabelTest, MultiLineProperty) {
-  EXPECT_FALSE(label()->multi_line());
+  EXPECT_FALSE(label()->GetMultiLine());
   label()->SetMultiLine(true);
-  EXPECT_TRUE(label()->multi_line());
+  EXPECT_TRUE(label()->GetMultiLine());
   label()->SetMultiLine(false);
-  EXPECT_FALSE(label()->multi_line());
+  EXPECT_FALSE(label()->GetMultiLine());
 }
 
 TEST_F(LabelTest, ObscuredProperty) {
@@ -390,30 +390,30 @@
   label()->SizeToPreferredSize();
 
   // The text should be unobscured by default.
-  EXPECT_FALSE(label()->obscured());
+  EXPECT_FALSE(label()->GetObscured());
   EXPECT_EQ(test_text, label()->GetDisplayTextForTesting());
-  EXPECT_EQ(test_text, label()->text());
+  EXPECT_EQ(test_text, label()->GetText());
 
   label()->SetObscured(true);
   label()->SizeToPreferredSize();
-  EXPECT_TRUE(label()->obscured());
+  EXPECT_TRUE(label()->GetObscured());
   EXPECT_EQ(base::string16(test_text.size(),
                            gfx::RenderText::kPasswordReplacementChar),
             label()->GetDisplayTextForTesting());
-  EXPECT_EQ(test_text, label()->text());
+  EXPECT_EQ(test_text, label()->GetText());
 
   label()->SetText(test_text + test_text);
   label()->SizeToPreferredSize();
   EXPECT_EQ(base::string16(test_text.size() * 2,
                            gfx::RenderText::kPasswordReplacementChar),
             label()->GetDisplayTextForTesting());
-  EXPECT_EQ(test_text + test_text, label()->text());
+  EXPECT_EQ(test_text + test_text, label()->GetText());
 
   label()->SetObscured(false);
   label()->SizeToPreferredSize();
-  EXPECT_FALSE(label()->obscured());
+  EXPECT_FALSE(label()->GetObscured());
   EXPECT_EQ(test_text + test_text, label()->GetDisplayTextForTesting());
-  EXPECT_EQ(test_text + test_text, label()->text());
+  EXPECT_EQ(test_text + test_text, label()->GetText());
 }
 
 TEST_F(LabelTest, ObscuredSurrogatePair) {
@@ -425,7 +425,7 @@
   label()->SizeToPreferredSize();
   EXPECT_EQ(base::string16(1, gfx::RenderText::kPasswordReplacementChar),
             label()->GetDisplayTextForTesting());
-  EXPECT_EQ(test_text, label()->text());
+  EXPECT_EQ(test_text, label()->GetText());
 }
 
 // This test case verifies the label preferred size will change based on the
@@ -456,7 +456,7 @@
 
   // Initially, label has no bounds, its text does not fit, and therefore its
   // text should be returned as the tooltip text.
-  EXPECT_EQ(label()->text(), label()->GetTooltipText(gfx::Point()));
+  EXPECT_EQ(label()->GetText(), label()->GetTooltipText(gfx::Point()));
 
   // While tooltip handling is disabled, GetTooltipText() should fail.
   label()->SetHandlesTooltips(false);
@@ -477,7 +477,7 @@
   // When the tooltip text is set to an empty string, the original behavior is
   // restored.
   label()->SetTooltipText(base::string16());
-  EXPECT_EQ(label()->text(), label()->GetTooltipText(gfx::Point()));
+  EXPECT_EQ(label()->GetText(), label()->GetTooltipText(gfx::Point()));
 
   // While tooltip handling is disabled, GetTooltipText() should fail.
   label()->SetHandlesTooltips(false);
@@ -531,7 +531,7 @@
   ui::AXNodeData node_data;
   label()->GetAccessibleNodeData(&node_data);
   EXPECT_EQ(ax::mojom::Role::kStaticText, node_data.role);
-  EXPECT_EQ(label()->text(),
+  EXPECT_EQ(label()->GetText(),
             node_data.GetString16Attribute(ax::mojom::StringAttribute::kName));
   EXPECT_FALSE(
       node_data.HasIntAttribute(ax::mojom::IntAttribute::kRestriction));
@@ -557,7 +557,7 @@
 TEST_F(LabelTest, EmptyLabelSizing) {
   const gfx::Size expected_size(0, label()->font_list().GetHeight());
   EXPECT_EQ(expected_size, label()->GetPreferredSize());
-  label()->SetMultiLine(!label()->multi_line());
+  label()->SetMultiLine(!label()->GetMultiLine());
   EXPECT_EQ(expected_size, label()->GetPreferredSize());
 }
 
@@ -768,7 +768,7 @@
   label()->SetBounds(0, 0, 10, 10);
 
   // By default, labels start out as tooltip handlers.
-  ASSERT_TRUE(label()->handles_tooltips());
+  ASSERT_TRUE(label()->GetHandlesTooltips());
 
   // There's a default tooltip if the text is too big to fit.
   EXPECT_EQ(label(), label()->GetTooltipHandlerForPoint(gfx::Point(2, 2)));
@@ -827,7 +827,7 @@
 
   // Querying fields or size information should not recompute the layout
   // unnecessarily.
-  EXPECT_EQ(ASCIIToUTF16("Example"), label()->text());
+  EXPECT_EQ(ASCIIToUTF16("Example"), label()->GetText());
   EXPECT_FALSE(label()->display_text_);
 
   EXPECT_EQ(preferred_size, label()->GetPreferredSize());
@@ -879,7 +879,7 @@
   label.SetEnabled(false);
   EXPECT_TRUE(Increased(label.schedule_paint_count(), &count));
 
-  label.SetText(label.text() + ASCIIToUTF16("Changed"));
+  label.SetText(label.GetText() + ASCIIToUTF16("Changed"));
   EXPECT_TRUE(Increased(label.schedule_paint_count(), &count));
 
   label.SizeToPreferredSize();
@@ -946,20 +946,20 @@
 
 TEST_F(LabelSelectionTest, Selectable) {
   // By default, labels don't support text selection.
-  EXPECT_FALSE(label()->selectable());
+  EXPECT_FALSE(label()->GetSelectable());
 
   ASSERT_TRUE(label()->SetSelectable(true));
-  EXPECT_TRUE(label()->selectable());
+  EXPECT_TRUE(label()->GetSelectable());
 
   // Verify that making a label multiline still causes the label to support text
   // selection.
   label()->SetMultiLine(true);
-  EXPECT_TRUE(label()->selectable());
+  EXPECT_TRUE(label()->GetSelectable());
 
   // Verify that obscuring the label text causes the label to not support text
   // selection.
   label()->SetObscured(true);
-  EXPECT_FALSE(label()->selectable());
+  EXPECT_FALSE(label()->GetSelectable());
 }
 
 // Verify that labels supporting text selection get focus on clicks.
@@ -1022,7 +1022,7 @@
 
   // Triple clicking should select all the text.
   PerformClick(GetCursorPoint(0));
-  EXPECT_EQ(label()->text(), GetSelectedText());
+  EXPECT_EQ(label()->GetText(), GetSelectedText());
 
   // Clicking again should alternate to double click.
   PerformClick(GetCursorPoint(0));
@@ -1138,7 +1138,8 @@
   label()->SetMultiLine(true);
   label()->SetText(ToRTL("012\n345"));
   // Sanity check.
-  EXPECT_EQ(WideToUTF16(L"\x5d0\x5d1\x5d2\n\x5d3\x5d4\x5d5"), label()->text());
+  EXPECT_EQ(WideToUTF16(L"\x5d0\x5d1\x5d2\n\x5d3\x5d4\x5d5"),
+            label()->GetText());
 
   label()->SizeToPreferredSize();
   ASSERT_TRUE(label()->SetSelectable(true));
@@ -1286,7 +1287,7 @@
 
   // Obscured labels do not support text selection.
   label()->SetObscured(true);
-  EXPECT_FALSE(label()->selectable());
+  EXPECT_FALSE(label()->GetSelectable());
   event_generator()->PressKey(ui::VKEY_A, kControlCommandModifier);
   EXPECT_EQ(base::string16(), GetSelectedText());
 }
@@ -1318,7 +1319,7 @@
   // An obscured label would not show a context menu and both COPY and
   // SELECT_ALL should be disabled for it.
   label()->SetObscured(true);
-  EXPECT_FALSE(label()->selectable());
+  EXPECT_FALSE(label()->GetSelectable());
   EXPECT_FALSE(IsMenuCommandEnabled(IDS_APP_COPY));
   EXPECT_FALSE(IsMenuCommandEnabled(IDS_APP_SELECT_ALL));
   label()->SetObscured(false);
diff --git a/ui/views/controls/link.cc b/ui/views/controls/link.cc
index 33e40630..9b200179 100644
--- a/ui/views/controls/link.cc
+++ b/ui/views/controls/link.cc
@@ -60,7 +60,7 @@
   gfx::Insets insets = Label::GetInsets();
   if (GetFocusStyle() == FocusStyle::RING &&
       GetFocusBehavior() != FocusBehavior::NEVER) {
-    DCHECK(!text().empty());
+    DCHECK(!GetText().empty());
     insets += gfx::Insets(kFocusBorderPadding);
   }
   return insets;
@@ -248,7 +248,7 @@
 
 void Link::ConfigureFocus() {
   // Disable focusability for empty links.
-  if (text().empty()) {
+  if (GetText().empty()) {
     SetFocusBehavior(FocusBehavior::NEVER);
   } else {
 #if defined(OS_MACOSX)
diff --git a/ui/views/controls/message_box_view.cc b/ui/views/controls/message_box_view.cc
index a5f60ec0..984f4dc 100644
--- a/ui/views/controls/message_box_view.cc
+++ b/ui/views/controls/message_box_view.cc
@@ -165,13 +165,15 @@
 
   // Don't intercept Ctrl-C if we only use a single message label supporting
   // text selection.
-  if (message_labels_.size() == 1u && message_labels_[0]->selectable())
+  if (message_labels_.size() == 1u && message_labels_[0]->GetSelectable())
     return false;
 
   ui::ScopedClipboardWriter scw(ui::ClipboardType::kCopyPaste);
-  scw.WriteText(std::accumulate(
-      message_labels_.cbegin(), message_labels_.cend(), base::string16(),
-      [](base::string16& left, Label* right) { return left + right->text(); }));
+  scw.WriteText(std::accumulate(message_labels_.cbegin(),
+                                message_labels_.cend(), base::string16(),
+                                [](base::string16& left, Label* right) {
+                                  return left + right->GetText();
+                                }));
   return true;
 }
 
diff --git a/ui/views/controls/styled_label_unittest.cc b/ui/views/controls/styled_label_unittest.cc
index 310bf9f..8d9c27b4 100644
--- a/ui/views/controls/styled_label_unittest.cc
+++ b/ui/views/controls/styled_label_unittest.cc
@@ -84,7 +84,8 @@
   styled()->Layout();
 
   ASSERT_EQ(1u, styled()->children().size());
-  EXPECT_EQ(ASCIIToUTF16("This is a test block of text"), LabelAt(0)->text());
+  EXPECT_EQ(ASCIIToUTF16("This is a test block of text"),
+            LabelAt(0)->GetText());
 }
 
 TEST_F(StyledLabelTest, RespectLeadingWhitespace) {
@@ -96,7 +97,7 @@
 
   ASSERT_EQ(1u, styled()->children().size());
   EXPECT_EQ(ASCIIToUTF16("   This is a test block of text"),
-            LabelAt(0)->text());
+            LabelAt(0)->GetText());
 }
 
 TEST_F(StyledLabelTest, RespectLeadingSpacesInNonFirstLine) {
@@ -106,7 +107,7 @@
   styled()->SetBounds(0, 0, 1000, 1000);
   styled()->Layout();
   ASSERT_EQ(2u, styled()->children().size());
-  EXPECT_EQ(ASCIIToUTF16(indented_line), LabelAt(1)->text());
+  EXPECT_EQ(ASCIIToUTF16(indented_line), LabelAt(1)->GetText());
 }
 
 TEST_F(StyledLabelTest, CorrectWrapAtNewline) {
@@ -120,9 +121,9 @@
   styled()->SetBounds(0, 0, label_preferred_size.width(), 1000);
   styled()->Layout();
   ASSERT_EQ(2u, styled()->children().size());
-  EXPECT_EQ(ASCIIToUTF16(first_line), LabelAt(0)->text());
+  EXPECT_EQ(ASCIIToUTF16(first_line), LabelAt(0)->GetText());
   const auto* label_1 = LabelAt(1);
-  EXPECT_EQ(ASCIIToUTF16(second_line), label_1->text());
+  EXPECT_EQ(ASCIIToUTF16(second_line), label_1->GetText());
   EXPECT_EQ(styled()->GetHeightForWidth(1000), label_1->bounds().bottom());
 }
 
@@ -137,7 +138,7 @@
   styled()->Layout();
 
   ASSERT_EQ(1u, styled()->children().size());
-  EXPECT_EQ(ASCIIToUTF16("a"), LabelAt(0)->text());
+  EXPECT_EQ(ASCIIToUTF16("a"), LabelAt(0)->GetText());
   EXPECT_EQ(label_preferred_size.height(),
             styled()->GetHeightForWidth(label_preferred_size.width() / 2));
 }
@@ -198,9 +199,9 @@
   EXPECT_EQ(gfx::Point(), label_0->origin());
   EXPECT_EQ(gfx::Point(0, styled()->height() / 2), label_1->origin());
 
-  EXPECT_FALSE(label_0->text().empty());
-  EXPECT_FALSE(label_1->text().empty());
-  EXPECT_EQ(ASCIIToUTF16(text), label_0->text() + label_1->text());
+  EXPECT_FALSE(label_0->GetText().empty());
+  EXPECT_FALSE(label_1->GetText().empty());
+  EXPECT_EQ(ASCIIToUTF16(text), label_0->GetText() + label_1->GetText());
 }
 
 TEST_F(StyledLabelTest, CreateLinks) {
@@ -383,26 +384,26 @@
   // Obtain the default text color for a label.
   Label* label = new Label(ASCIIToUTF16(text));
   container->AddChildView(label);
-  const SkColor kDefaultTextColor = label->enabled_color();
+  const SkColor kDefaultTextColor = label->GetEnabledColor();
 
   // Obtain the default text color for a link.
   Link* link = new Link(ASCIIToUTF16(text_link));
   container->AddChildView(link);
-  const SkColor kDefaultLinkColor = link->enabled_color();
+  const SkColor kDefaultLinkColor = link->GetEnabledColor();
 
-  EXPECT_EQ(SK_ColorBLUE, LabelAt(0)->enabled_color());
+  EXPECT_EQ(SK_ColorBLUE, LabelAt(0)->GetEnabledColor());
   EXPECT_EQ(kDefaultLinkColor,
-            LabelAt(1, Link::kViewClassName)->enabled_color());
-  EXPECT_EQ(kDefaultTextColor, LabelAt(2)->enabled_color());
+            LabelAt(1, Link::kViewClassName)->GetEnabledColor());
+  EXPECT_EQ(kDefaultTextColor, LabelAt(2)->GetEnabledColor());
 
   // Test adjusted color readability.
   styled()->SetDisplayedOnBackgroundColor(SK_ColorBLACK);
   styled()->Layout();
   label->SetBackgroundColor(SK_ColorBLACK);
 
-  const SkColor kAdjustedTextColor = label->enabled_color();
+  const SkColor kAdjustedTextColor = label->GetEnabledColor();
   EXPECT_NE(kAdjustedTextColor, kDefaultTextColor);
-  EXPECT_EQ(kAdjustedTextColor, LabelAt(2)->enabled_color());
+  EXPECT_EQ(kAdjustedTextColor, LabelAt(2)->GetEnabledColor());
 
   widget->CloseNow();
 }
@@ -478,10 +479,10 @@
   styled()->Layout();
   ASSERT_EQ(1u, styled()->children().size());
   Label* sublabel = LabelAt(0);
-  EXPECT_EQ(style::CONTEXT_DIALOG_TITLE, sublabel->text_context());
+  EXPECT_EQ(style::CONTEXT_DIALOG_TITLE, sublabel->GetTextContext());
 
-  EXPECT_NE(SK_ColorBLACK, label.enabled_color());  // Sanity check,
-  EXPECT_EQ(label.enabled_color(), sublabel->enabled_color());
+  EXPECT_NE(SK_ColorBLACK, label.GetEnabledColor());  // Sanity check,
+  EXPECT_EQ(label.GetEnabledColor(), sublabel->GetEnabledColor());
 }
 
 TEST_F(StyledLabelTest, LineHeight) {
diff --git a/ui/views/controls/tabbed_pane/tabbed_pane.cc b/ui/views/controls/tabbed_pane/tabbed_pane.cc
index a367c86..203a747 100644
--- a/ui/views/controls/tabbed_pane/tabbed_pane.cc
+++ b/ui/views/controls/tabbed_pane/tabbed_pane.cc
@@ -177,7 +177,7 @@
 }
 
 const base::string16& Tab::GetTitleText() const {
-  return title_->text();
+  return title_->GetText();
 }
 
 void Tab::SetTitleText(const base::string16& text) {
@@ -315,7 +315,7 @@
 
 void Tab::GetAccessibleNodeData(ui::AXNodeData* data) {
   data->role = ax::mojom::Role::kTab;
-  data->SetName(title()->text());
+  data->SetName(title()->GetText());
   data->AddBoolAttribute(ax::mojom::BoolAttribute::kSelected, selected());
 }
 
diff --git a/ui/views/view.cc b/ui/views/view.cc
index 093f46fd..bb9a41a 100644
--- a/ui/views/view.cc
+++ b/ui/views/view.cc
@@ -986,8 +986,9 @@
                                paint_info.paint_recording_scale_y(),
                                &paint_cache_);
     gfx::Canvas* canvas = recorder.canvas();
-    gfx::ScopedRTLFlipCanvas scoped_canvas(canvas, width(),
-                                           flip_canvas_on_paint_for_rtl_ui_);
+    gfx::ScopedCanvas scoped_canvas(canvas);
+    if (flip_canvas_on_paint_for_rtl_ui_)
+      scoped_canvas.FlipIfRTL(width());
 
     // Delegate painting the contents of the View to the virtual OnPaint method.
     OnPaint(canvas);
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_config.js b/ui/webui/resources/cr_components/chromeos/network/network_config.js
index a01d5ec..615cc938 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_config.js
+++ b/ui/webui/resources/cr_components/chromeos/network/network_config.js
@@ -1492,20 +1492,13 @@
    * @private
    */
   setPropertiesCallback_: function(connect) {
-    this.setError_(this.getRuntimeError_());
-    if (this.error) {
-      console.error('setProperties error: ' + this.guid + ': ' + this.error);
-      this.propertiesSent_ = false;
-      return;
-    }
+    // Only attempt a connection if the network is not yet connected.
     const connectState = this.managedProperties.ConnectionState;
-    if (connect &&
-        (!connectState ||
-         connectState == CrOnc.ConnectionState.NOT_CONNECTED)) {
-      this.startConnect_(this.guid);
-      return;
-    }
-    this.close_();
+    const shouldConnect = connect &&
+        (!connectState || connectState == CrOnc.ConnectionState.NOT_CONNECTED);
+
+    this.handleNetworkConfigurationResponse_(
+        shouldConnect, this.guid, 'setProperties() error');
   },
 
   /**
@@ -1514,17 +1507,30 @@
    * @private
    */
   createNetworkCallback_: function(connect, guid) {
+    this.handleNetworkConfigurationResponse_(
+        connect, guid,
+        'createNetworkError() error; type: ' + this.managedProperties.Type);
+  },
+
+  /**
+   * @param {boolean} connect If true, connect after save.
+   * @param {string} guid
+   * @param {string} errorMessage The message to use in the case of an error.
+   * @private
+   */
+  handleNetworkConfigurationResponse_: function(connect, guid, errorMessage) {
     this.setError_(this.getRuntimeError_());
     if (this.error) {
       console.error(
-          'createNetworkError, type: ' + this.managedProperties.Type + ': ' +
-          'error: ' + this.error);
+          errorMessage + ', GUID: ' + guid + ', error: ' + this.error);
       this.propertiesSent_ = false;
       return;
     }
     if (connect) {
       this.startConnect_(guid);
+      return;
     }
+    this.close_();
   },
 
   /**