diff --git a/DEPS b/DEPS
index 2fd2e6c6..269431b 100644
--- a/DEPS
+++ b/DEPS
@@ -297,7 +297,7 @@
   # 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': '687aa00d6924b1b59e509f4e010ec635c45bcc21',
+  'skia_revision': 'f1d0432ecf588bc9ca1041cd89f159bee67ce473',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -305,7 +305,7 @@
   # 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': 'd0fe12db855d057ecca7fc1f0fa9e37f1d9a40f2',
+  'angle_revision': '3a0d7249f42164ae1d42dc2f0aed447370a10c61',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -344,7 +344,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling NaCl
   # and whatever else without interference from each other.
-  'nacl_revision': '18d9964d47fc44f49a4c19b7ba91197ddca00c6a',
+  'nacl_revision': 'c996bec93273927b54f7528651237128c31060df',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
@@ -368,7 +368,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': 'dd1a8cd9c4b12f9b40620c80d50675313d5e03c7',
+  'catapult_revision': 'b0098bb7849bcc644df1bda896fb07dfd7c60177',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -376,7 +376,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': '8ec1e0e28e54f5deebf62c95315038a0ec415415',
+  'devtools_frontend_revision': 'c405a65d84aec593d9ab646a7735eaa3aa9a97cc',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -412,7 +412,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.
-  'dawn_revision': 'a84b9119eb821a9eb5655b3f16d0ac0364c9b8f6',
+  'dawn_revision': '1e98a9ba4a64301e0ab932e22ce989688f6cdf6c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -480,7 +480,7 @@
 
   # If you change this, also update the libc++ revision in
   # //buildtools/deps_revisions.gni.
-  'libcxx_revision':       '88bf4070487fbe9020697a2281743b91e5e29bef',
+  'libcxx_revision':       '3e55cfbd1a91efb882b2e2c7b69c2daabb2d145a',
 
   # GN CIPD package version.
   'gn_version': 'git_revision:9ef321772ecc161937db69acb346397e0ccc484d',
@@ -773,11 +773,11 @@
     Var('chromium_git') + '/external/github.com/toji/webvr.info.git' + '@' + 'c58ae99b9ff9e2aa4c524633519570bf33536248',
 
   'src/docs/website': {
-    'url': Var('chromium_git') + '/website.git' + '@' + '3965ba67f8d283378e6c0b64d634b91fb830a378',
+    'url': Var('chromium_git') + '/website.git' + '@' + '0945f43c18b49d7530a47acb2e09bdc609155c5d',
   },
 
   'src/ios/third_party/earl_grey2/src': {
-      'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + '53a2982c85ac6cf802719603d037ad3be7091ebb',
+      'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + '5871866d1c9bf11479f3902e2c43227b40fd5104',
       'condition': 'checkout_ios',
   },
 
@@ -1102,7 +1102,7 @@
     Var('boringssl_git') + '/boringssl.git' + '@' +  Var('boringssl_revision'),
 
   'src/third_party/breakpad/breakpad':
-    Var('chromium_git') + '/breakpad/breakpad.git' + '@' + 'c4c43b80ea8854c57a4374ac32579b577172dc23',
+    Var('chromium_git') + '/breakpad/breakpad.git' + '@' + 'afc8daa2de3d9ef5da015ceb5e7436ed8adb5f47',
 
   'src/third_party/byte_buddy': {
       'packages': [
@@ -1473,7 +1473,7 @@
     Var('chromium_git') + '/webm/libwebm.git' + '@' + 'e4fbea0c9751ae8aa86629b197a28d8276a2b0da',
 
   'src/third_party/libwebp/src':
-    Var('chromium_git') + '/webm/libwebp.git' + '@' +  '3c4a0fbfbcc606193f7e943b7e50af4077ce1a6c',
+    Var('chromium_git') + '/webm/libwebp.git' + '@' +  '7366f7f394af26de814296152c50e673ed0a832f',
 
   'src/third_party/libyuv':
     Var('chromium_git') + '/libyuv/libyuv.git' + '@' + 'd248929c059ff7629a85333699717d7a677d8d96',
@@ -1671,7 +1671,7 @@
     Var('chromium_git') + '/external/github.com/google/snappy.git' + '@' + '65dc7b383985eb4f63cd3e752136db8d9b4be8c0',
 
   'src/third_party/sqlite/src':
-    Var('chromium_git') + '/chromium/deps/sqlite.git' + '@' + '88f6139eadb183a025efeba5fc483bb6f6416eb2',
+    Var('chromium_git') + '/chromium/deps/sqlite.git' + '@' + 'e6b63421941617bf5ccac6b4a62d7a7b4a2c3fef',
 
   'src/third_party/sqlite4java': {
       'packages': [
@@ -1754,7 +1754,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'c4eb1df3f306c0ee3e43ba2446eb3616e42d6855',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'dc5cf31cad576376abd3aa6306169453cfd85ba5',
+    Var('webrtc_git') + '/src.git' + '@' + '15087b2137012b03ec7886707d9c7d0be76c3c8e',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1827,7 +1827,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@733a35bf21b6aa2214623566eea6e2badaf23fd4',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@f5a34d81116cf81052e23b1bc8b039c08d30b4c0',
     'condition': 'checkout_src_internal',
   },
 
@@ -1857,7 +1857,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'xdvvAqUK6eWupxT9i53H9txAULl9QguKd4vqgr28iycC',
+        'version': 'MqUROEBmHZCBRsEY3abQ7JOvoDr5wZ_MTK3vAN-901wC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/WATCHLISTS b/WATCHLISTS
index fb247d8..e10c620 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -1718,7 +1718,7 @@
       'filepath': 'screen_ai',
     },
     'search_prefetch': {
-      'filepath': 'chrome/browser/prefetch/search_prefetch',
+      'filepath': 'chrome/browser/preloading/prefetch/search_prefetch',
     },
     'security': {
       'filepath': 'base/json/'\
diff --git a/android_webview/browser/gfx/display_scheduler_webview.cc b/android_webview/browser/gfx/display_scheduler_webview.cc
index 0463e24..7b9c9c4 100644
--- a/android_webview/browser/gfx/display_scheduler_webview.cc
+++ b/android_webview/browser/gfx/display_scheduler_webview.cc
@@ -18,10 +18,11 @@
       overlays_info_provider_(overlays_info_provider),
       use_new_invalidate_heuristic_(base::FeatureList::IsEnabled(
           features::kWebViewNewInvalidateHeuristic)) {
-  surface_manager_observation_.Observe(
-      VizCompositorThreadRunnerWebView::GetInstance()
-          ->GetFrameSinkManager()
-          ->surface_manager());
+  auto* frame_sink_manager =
+      VizCompositorThreadRunnerWebView::GetInstance()->GetFrameSinkManager();
+
+  surface_manager_observation_.Observe(frame_sink_manager->surface_manager());
+  frame_sink_manager_observation_.Observe(frame_sink_manager);
 }
 
 DisplaySchedulerWebView::~DisplaySchedulerWebView() {
@@ -116,4 +117,9 @@
   }
 }
 
+void DisplaySchedulerWebView::OnCaptureStarted(
+    const viz::FrameSinkId& frame_sink_id) {
+  root_frame_sink_->OnCaptureStarted(frame_sink_id);
+}
+
 }  // namespace android_webview
diff --git a/android_webview/browser/gfx/display_scheduler_webview.h b/android_webview/browser/gfx/display_scheduler_webview.h
index 37bdeb7b..cec13cb4 100644
--- a/android_webview/browser/gfx/display_scheduler_webview.h
+++ b/android_webview/browser/gfx/display_scheduler_webview.h
@@ -12,6 +12,8 @@
 #include "base/synchronization/waitable_event.h"
 #include "base/threading/thread_checker.h"
 #include "components/viz/service/display/display_scheduler.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager_impl.h"
+#include "components/viz/service/frame_sinks/frame_sink_observer.h"
 #include "components/viz/service/surfaces/surface_manager.h"
 #include "components/viz/service/surfaces/surface_observer.h"
 
@@ -24,7 +26,8 @@
 };
 
 class DisplaySchedulerWebView : public viz::DisplaySchedulerBase,
-                                public viz::SurfaceObserver {
+                                public viz::SurfaceObserver,
+                                public viz::FrameSinkObserver {
  public:
   DisplaySchedulerWebView(RootFrameSink* root_frame_sink,
                           OverlaysInfoProvider* overlays_info_provider);
@@ -50,6 +53,27 @@
   void OnSurfaceHasNewUncommittedFrame(
       const viz::SurfaceId& surface_id) override;
 
+  // FrameSinkObserver implementation.
+  void OnRegisteredFrameSinkId(const viz::FrameSinkId& frame_sink_id) override {
+  }
+  void OnInvalidatedFrameSinkId(
+      const viz::FrameSinkId& frame_sink_id) override {}
+  void OnCreatedCompositorFrameSink(const viz::FrameSinkId& frame_sink_id,
+                                    bool is_root) override {}
+  void OnDestroyedCompositorFrameSink(
+      const viz::FrameSinkId& frame_sink_id) override {}
+  void OnRegisteredFrameSinkHierarchy(
+      const viz::FrameSinkId& parent_frame_sink_id,
+      const viz::FrameSinkId& child_frame_sink_id) override {}
+  void OnUnregisteredFrameSinkHierarchy(
+      const viz::FrameSinkId& parent_frame_sink_id,
+      const viz::FrameSinkId& child_frame_sink_id) override {}
+  void OnFrameSinkDidBeginFrame(const viz::FrameSinkId& frame_sink_id,
+                                const viz::BeginFrameArgs& args) override {}
+  void OnFrameSinkDidFinishFrame(const viz::FrameSinkId& frame_sink_id,
+                                 const viz::BeginFrameArgs& args) override {}
+  void OnCaptureStarted(const viz::FrameSinkId& frame_sink_id) override;
+
  private:
   bool IsFrameSinkOverlayed(viz::FrameSinkId frame_sink_id);
 
@@ -65,6 +89,8 @@
 
   base::ScopedObservation<viz::SurfaceManager, viz::SurfaceObserver>
       surface_manager_observation_{this};
+  base::ScopedObservation<viz::FrameSinkManagerImpl, viz::FrameSinkObserver>
+      frame_sink_manager_observation_{this};
 
   const bool use_new_invalidate_heuristic_;
 
diff --git a/android_webview/browser/gfx/display_webview.h b/android_webview/browser/gfx/display_webview.h
index a3799488..07b500b 100644
--- a/android_webview/browser/gfx/display_webview.h
+++ b/android_webview/browser/gfx/display_webview.h
@@ -55,6 +55,7 @@
                                 const viz::BeginFrameArgs& args) override {}
   void OnFrameSinkDidFinishFrame(const viz::FrameSinkId& frame_sink_id,
                                  const viz::BeginFrameArgs& args) override;
+  void OnCaptureStarted(const viz::FrameSinkId& frame_sink_id) override {}
 
  private:
   DisplayWebView(
diff --git a/android_webview/browser/gfx/root_frame_sink.cc b/android_webview/browser/gfx/root_frame_sink.cc
index a2215fb..11ca2e5 100644
--- a/android_webview/browser/gfx/root_frame_sink.cc
+++ b/android_webview/browser/gfx/root_frame_sink.cc
@@ -432,4 +432,16 @@
   child_sink_support_->EvictSurface(surface_id);
 }
 
+void RootFrameSink::OnCaptureStarted(const viz::FrameSinkId& frame_sink_id) {
+  auto it = std::find_if(contained_surfaces_.begin(), contained_surfaces_.end(),
+                         [frame_sink_id](const viz::SurfaceId& surface_id) {
+                           return surface_id.frame_sink_id() == frame_sink_id;
+                         });
+  if (it == contained_surfaces_.end())
+    return;
+  // When a capture is started we need to force an invalidate.
+  if (client_)
+    client_->Invalidate();
+}
+
 }  // namespace android_webview
diff --git a/android_webview/browser/gfx/root_frame_sink.h b/android_webview/browser/gfx/root_frame_sink.h
index b0895d0..5d768a56 100644
--- a/android_webview/browser/gfx/root_frame_sink.h
+++ b/android_webview/browser/gfx/root_frame_sink.h
@@ -93,6 +93,8 @@
   // viz::ExternalBeginFrameSourceClient overrides.
   void OnNeedsBeginFrames(bool needs_begin_frames) override;
 
+  void OnCaptureStarted(const viz::FrameSinkId& frame_sink_id);
+
  private:
   friend class base::RefCounted<RootFrameSink>;
   class ChildCompositorFrameSink;
diff --git a/ash/app_list/views/app_list_folder_view.cc b/ash/app_list/views/app_list_folder_view.cc
index 88a56424..16f7215 100644
--- a/ash/app_list/views/app_list_folder_view.cc
+++ b/ash/app_list/views/app_list_folder_view.cc
@@ -1102,6 +1102,10 @@
   }
 }
 
+void AppListFolderView::UpdateShadowForVirtualKeyboard() {
+  shadow_->SetContentBounds(background_view_->layer()->bounds());
+}
+
 int AppListFolderView::GetYOffsetForFolder() {
   auto* const keyboard_controller = keyboard::KeyboardUIController::Get();
   if (!keyboard_controller->IsEnabled())
diff --git a/ash/app_list/views/app_list_folder_view.h b/ash/app_list/views/app_list_folder_view.h
index 127ac71..4da8a5dc 100644
--- a/ash/app_list/views/app_list_folder_view.h
+++ b/ash/app_list/views/app_list_folder_view.h
@@ -137,6 +137,10 @@
   // Virtual keyboard
   int GetYOffsetForFolder();
 
+  // Force the folder `shadow_` to recalculate bounds after a virtual keyboard
+  // repositioned the view.
+  void UpdateShadowForVirtualKeyboard();
+
   // Returns true if this view's child views are in animation for opening or
   // closing the folder.
   bool IsAnimationRunning() const;
diff --git a/ash/app_list/views/app_list_view.cc b/ash/app_list/views/app_list_view.cc
index b3585a7..01df7942 100644
--- a/ash/app_list/views/app_list_view.cc
+++ b/ash/app_list/views/app_list_view.cc
@@ -1992,7 +1992,19 @@
 int AppListView::GetCurrentAppListHeight() const {
   if (!GetWidget())
     return delegate_->GetShelfSize();
-  return GetScreenBottom() - GetWidget()->GetWindowBoundsInScreen().y();
+
+  int current_height =
+      GetScreenBottom() - GetWidget()->GetWindowBoundsInScreen().y();
+
+  // App list may be translated on fullscreen when the Virtual Keyboard is
+  // showing, effectively moving the app list bounds upwards. Current height
+  // needs to account for this translation.
+  if (offset_to_show_folder_with_onscreen_keyboard_) {
+    current_height +=
+        GetWidget()->GetNativeView()->transform().To2dTranslation().y();
+  }
+
+  return current_height;
 }
 
 float AppListView::GetAppListTransitionProgress(int flags) const {
@@ -2248,12 +2260,18 @@
         GetAppsContainerView()->app_list_folder_view()->GetYOffsetForFolder();
     if (folder_offset != 0) {
       OffsetYPositionOfAppList(folder_offset);
+      GetAppsContainerView()
+          ->app_list_folder_view()
+          ->UpdateShadowForVirtualKeyboard();
       offset_to_show_folder_with_onscreen_keyboard_ = true;
     }
   } else if (offset_to_show_folder_with_onscreen_keyboard_) {
     // If the keyboard is closing or a folder isn't being shown, reset
     // the app list's position
     OffsetYPositionOfAppList(0);
+    GetAppsContainerView()
+        ->app_list_folder_view()
+        ->UpdateShadowForVirtualKeyboard();
     offset_to_show_folder_with_onscreen_keyboard_ = false;
   }
 
diff --git a/ash/app_list/views/apps_grid_view_unittest.cc b/ash/app_list/views/apps_grid_view_unittest.cc
index 38bc648..c9afa30 100644
--- a/ash/app_list/views/apps_grid_view_unittest.cc
+++ b/ash/app_list/views/apps_grid_view_unittest.cc
@@ -43,6 +43,8 @@
 #include "ash/app_list/views/search_result_tile_item_view.h"
 #include "ash/app_list/views/suggestion_chip_container_view.h"
 #include "ash/constants/ash_features.h"
+#include "ash/keyboard/ui/keyboard_ui_controller.h"
+#include "ash/keyboard/ui/test/keyboard_test_util.h"
 #include "ash/public/cpp/app_list/app_list_config.h"
 #include "ash/public/cpp/app_list/app_list_features.h"
 #include "ash/public/cpp/app_list/app_list_switches.h"
@@ -54,6 +56,7 @@
 #include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_view.h"
 #include "ash/shell.h"
+#include "ash/style/system_shadow.h"
 #include "ash/test/ash_test_base.h"
 #include "ash/test/layer_animation_stopped_waiter.h"
 #include "ash/utility/haptics_tracking_test_input_controller.h"
@@ -1493,6 +1496,47 @@
   app_list_folder_view()->CloseFolderPage();
 }
 
+TEST_P(AppsGridViewClamshellAndTabletTest, AddItemsToFolderShouldUpdateBounds) {
+  // Populate two folders with different number of apps.
+  AppListFolderItem* folder_1 = model_->CreateAndPopulateFolderWithApps(2);
+  model_->CreateAndPopulateFolderWithApps(4);
+
+  // Record the bounds of the folder view with 4 items in it.
+  AppsGridView* items_grid_view = app_list_folder_view()->items_grid_view();
+  test_api_->PressItemAt(1);
+  EXPECT_TRUE(GetAppListTestHelper()->IsInFolderView());
+  gfx::Rect two_rows_folder_view = items_grid_view->GetBoundsInScreen();
+  app_list_folder_view()->CloseFolderPage();
+
+  // Record the bounds of the folder view with 2 items in it and keep the folder
+  // view open for further testing.
+  test_api_->PressItemAt(0);
+  EXPECT_TRUE(GetAppListTestHelper()->IsInFolderView());
+  gfx::Rect one_row_folder_view = items_grid_view->GetBoundsInScreen();
+  EXPECT_NE(one_row_folder_view.size(), two_rows_folder_view.size());
+
+  // Add an item to the folder so that there are two rows in the folder view.
+  model_->AddItemToFolder(model_->CreateItem("Extra 1"), folder_1->id());
+  EXPECT_TRUE(GetAppListTestHelper()->IsInFolderView());
+  items_grid_view->GetWidget()->LayoutRootViewIfNecessary();
+  EXPECT_EQ(items_grid_view->GetBoundsInScreen().size(),
+            two_rows_folder_view.size());
+  app_list_folder_view()->CloseFolderPage();
+
+  // Create a folder with a full page of apps. Add an item to the folder should
+  // not change the size of the folder view.
+  AppListFolderItem* folder_full =
+      model_->CreateAndPopulateFolderWithApps(kMaxItemsPerFolderPage);
+  test_api_->PressItemAt(2);
+  EXPECT_TRUE(GetAppListTestHelper()->IsInFolderView());
+  gfx::Rect full_folder_view = items_grid_view->GetBoundsInScreen();
+
+  model_->AddItemToFolder(model_->CreateItem("Extra 2"), folder_full->id());
+  EXPECT_EQ(items_grid_view->GetBoundsInScreen().size(),
+            full_folder_view.size());
+  app_list_folder_view()->CloseFolderPage();
+}
+
 TEST_P(AppsGridViewRTLTest, ScrollDownShouldNotExitFolder) {
   const size_t kTotalItems = kMaxItemsPerFolderPage;
   model_->CreateAndPopulateFolderWithApps(kTotalItems);
@@ -5900,5 +5944,63 @@
   EXPECT_FALSE(app_list_folder_view()->folder_header_view()->HasTextFocus());
 }
 
+TEST_P(AppsGridViewTabletTest, ChangeFolderNameShouldUpdateShadows) {
+  SetVirtualKeyboardEnabled(true);
+
+  const int kMaxAppsInGrid = test_api_->TilesPerPage(0);
+  model_->PopulateApps(kMaxAppsInGrid - 1);
+  UpdateLayout();
+
+  // Create a folder on the second row with kMaxItemsInFolder to be big enough
+  // to displace the apps grid bounds on keyboard shown. Open the folder.
+  model_->CreateAndPopulateFolderWithApps(kMaxItemsInFolder);
+  test_api_->PressItemAt(kMaxAppsInGrid - 1);
+  EXPECT_TRUE(GetAppListTestHelper()->IsInFolderView());
+  gfx::Rect initial_folder_bounds =
+      folder_apps_grid_view()->GetBoundsInScreen();
+  gfx::Rect initial_shadow =
+      app_list_folder_view()->shadow()->GetContentBounds();
+  views::View::ConvertRectToScreen(app_list_folder_view(), &initial_shadow);
+
+  // Show the virtual keyboard. The grid view should displace with the folder
+  // and shadow bounds.
+  auto* keyboard_controller = keyboard::KeyboardUIController::Get();
+  keyboard_controller->ShowKeyboard(false);
+  ASSERT_TRUE(keyboard::WaitUntilShown());
+
+  gfx::Rect folder_bounds_with_keyboard =
+      folder_apps_grid_view()->GetBoundsInScreen();
+  gfx::Rect shadow_with_keyboard =
+      app_list_folder_view()->shadow()->GetContentBounds();
+  views::View::ConvertRectToScreen(app_list_folder_view(),
+                                   &shadow_with_keyboard);
+
+  EXPECT_NE(initial_folder_bounds, folder_bounds_with_keyboard);
+  EXPECT_NE(initial_shadow, shadow_with_keyboard);
+
+  // Start typing to change the folder name. The folder and shadow bounds must
+  // stay unchanged from previous step.
+  views::Textfield* folder_header =
+      app_list_folder_view()->folder_header_view()->GetFolderNameViewForTest();
+  folder_header->RequestFocus();
+  ASSERT_TRUE(folder_header->HasFocus());
+  const std::u16string folder_name = folder_header->GetText();
+
+  GetEventGenerator()->PressAndReleaseKey(ui::VKEY_A);
+  // Force app list to Update Layout to catch potential crashes.
+  UpdateLayout();
+
+  EXPECT_NE(folder_name, folder_header->GetText());
+
+  gfx::Rect folder_bounds_after_type =
+      folder_apps_grid_view()->GetBoundsInScreen();
+  gfx::Rect shadow_after_type =
+      app_list_folder_view()->shadow()->GetContentBounds();
+  views::View::ConvertRectToScreen(app_list_folder_view(), &shadow_after_type);
+
+  EXPECT_EQ(folder_bounds_with_keyboard, folder_bounds_after_type);
+  EXPECT_EQ(shadow_with_keyboard, shadow_after_type);
+}
+
 }  // namespace test
 }  // namespace ash
diff --git a/ash/components/arc/net/always_on_vpn_manager_unittest.cc b/ash/components/arc/net/always_on_vpn_manager_unittest.cc
index 6564f8be..d5c33c9e 100644
--- a/ash/components/arc/net/always_on_vpn_manager_unittest.cc
+++ b/ash/components/arc/net/always_on_vpn_manager_unittest.cc
@@ -68,7 +68,7 @@
 
  private:
   content::BrowserTaskEnvironment task_environment_;
-  chromeos::NetworkHandlerTestHelper network_handler_test_helper_;
+  ash::NetworkHandlerTestHelper network_handler_test_helper_;
   TestingPrefServiceSimple pref_service_;
 };
 
diff --git a/ash/constants/notifier_catalogs.h b/ash/constants/notifier_catalogs.h
index fc1f9d6..ded6937 100644
--- a/ash/constants/notifier_catalogs.h
+++ b/ash/constants/notifier_catalogs.h
@@ -8,7 +8,8 @@
 namespace ash {
 
 // A living catalog that registers notifications.
-// Current values should not be renumbered or removed.
+// Current values should not be renumbered or removed. Please keep in sync with
+// "NotificationCatalogName" in tools/metrics/histograms/enums.xml.
 // To deprecate comment out the entry.
 enum class NotificationCatalogName {
   kNone = 0,
diff --git a/ash/public/cpp/BUILD.gn b/ash/public/cpp/BUILD.gn
index f85083e5..dda95a6 100644
--- a/ash/public/cpp/BUILD.gn
+++ b/ash/public/cpp/BUILD.gn
@@ -406,6 +406,7 @@
 
   public_deps = [
     "//ash/components/arc/mojom:notifications",
+    "//ash/components/audio/public/mojom",
     "//ash/components/login/auth",
     "//ash/public/mojom",
     "//ash/services/cellular_setup/public/mojom",
diff --git a/ash/quick_pair/repository/fast_pair/saved_device_registry.cc b/ash/quick_pair/repository/fast_pair/saved_device_registry.cc
index 450304e..555e9f5 100644
--- a/ash/quick_pair/repository/fast_pair/saved_device_registry.cc
+++ b/ash/quick_pair/repository/fast_pair/saved_device_registry.cc
@@ -60,6 +60,32 @@
   return true;
 }
 
+bool SavedDeviceRegistry::DeleteAccountKey(
+    const std::vector<uint8_t>& account_key) {
+  PrefService* pref_service =
+      QuickPairBrowserDelegate::Get()->GetActivePrefService();
+  if (!pref_service) {
+    QP_LOG(WARNING) << __func__ << ": No user pref service available.";
+    return false;
+  }
+
+  const base::Value::Dict& saved_devices =
+      pref_service->GetValueDict(kFastPairSavedDevicesPref);
+  std::string encoded_key = base::Base64Encode(account_key);
+  for (const auto it : saved_devices) {
+    const std::string* value = it.second.GetIfString();
+    DictionaryPrefUpdate update(pref_service, kFastPairSavedDevicesPref);
+    if (value && *value == encoded_key) {
+      DictionaryPrefUpdate update(pref_service, kFastPairSavedDevicesPref);
+      return update->RemoveKey(it.first);
+    }
+  }
+  QP_LOG(WARNING) << __func__
+                  << ": Failed to delete account key record from prefs: "
+                     "account key not found";
+  return false;
+}
+
 absl::optional<const std::vector<uint8_t>> SavedDeviceRegistry::GetAccountKey(
     const std::string& mac_address) {
   PrefService* pref_service =
diff --git a/ash/quick_pair/repository/fast_pair/saved_device_registry.h b/ash/quick_pair/repository/fast_pair/saved_device_registry.h
index a3c979fb..7a2c438 100644
--- a/ash/quick_pair/repository/fast_pair/saved_device_registry.h
+++ b/ash/quick_pair/repository/fast_pair/saved_device_registry.h
@@ -34,10 +34,14 @@
   void SaveAccountKey(const std::string& mac_address,
                       const std::vector<uint8_t>& account_key);
 
-  // Deletes the |mac_address| -> account key record from prefs. Returns true
-  // on success, false on failure.
+  // Deletes the |mac_address| -> account key record from prefs based on
+  // |mac address|. Returns true on success, false on failure.
   bool DeleteAccountKey(const std::string& mac_address);
 
+  // Deletes the mac address -> |account_key| record from prefs based on
+  // |account_key|. Returns true on success, false on failure.
+  bool DeleteAccountKey(const std::vector<uint8_t>& account_key);
+
   // Retrieves an account key from disk if available, otherwise returns an
   // empty vector.
   absl::optional<const std::vector<uint8_t>> GetAccountKey(
diff --git a/ash/quick_pair/repository/fast_pair/saved_device_registry_unittest.cc b/ash/quick_pair/repository/fast_pair/saved_device_registry_unittest.cc
index 4965e479..07729761 100644
--- a/ash/quick_pair/repository/fast_pair/saved_device_registry_unittest.cc
+++ b/ash/quick_pair/repository/fast_pair/saved_device_registry_unittest.cc
@@ -99,7 +99,7 @@
       saved_device_registry_->IsAccountKeySavedToRegistry(kAccountKey2));
 }
 
-TEST_F(SavedDeviceRegistryTest, DeleteAccountKey) {
+TEST_F(SavedDeviceRegistryTest, DeleteAccountKey_MacAddress) {
   saved_device_registry_->SaveAccountKey(kFirstSavedMacAddress, kAccountKey1);
   saved_device_registry_->SaveAccountKey(kSecondSavedMacAddress, kAccountKey2);
 
@@ -132,5 +132,38 @@
   EXPECT_FALSE(saved_device_registry_->DeleteAccountKey(kFirstSavedMacAddress));
 }
 
+TEST_F(SavedDeviceRegistryTest, DeleteAccountKey_AccountKey) {
+  saved_device_registry_->SaveAccountKey(kFirstSavedMacAddress, kAccountKey1);
+  saved_device_registry_->SaveAccountKey(kSecondSavedMacAddress, kAccountKey2);
+
+  auto first = saved_device_registry_->GetAccountKey(kFirstSavedMacAddress);
+  auto second = saved_device_registry_->GetAccountKey(kSecondSavedMacAddress);
+
+  ASSERT_EQ(kAccountKey1, *first);
+  ASSERT_EQ(kAccountKey2, *second);
+
+  EXPECT_TRUE(
+      saved_device_registry_->IsAccountKeySavedToRegistry(kAccountKey1));
+  EXPECT_TRUE(
+      saved_device_registry_->IsAccountKeySavedToRegistry(kAccountKey2));
+
+  // Remove the first account key.
+  EXPECT_TRUE(saved_device_registry_->DeleteAccountKey(kAccountKey1));
+  EXPECT_FALSE(
+      saved_device_registry_->IsAccountKeySavedToRegistry(kAccountKey1));
+  EXPECT_TRUE(
+      saved_device_registry_->IsAccountKeySavedToRegistry(kAccountKey2));
+
+  // Remove the second account key.
+  EXPECT_TRUE(saved_device_registry_->DeleteAccountKey(kAccountKey2));
+  EXPECT_FALSE(
+      saved_device_registry_->IsAccountKeySavedToRegistry(kAccountKey1));
+  EXPECT_FALSE(
+      saved_device_registry_->IsAccountKeySavedToRegistry(kAccountKey2));
+
+  // Removing a key that doesn't exist/is already removed should return false.
+  EXPECT_FALSE(saved_device_registry_->DeleteAccountKey(kAccountKey1));
+}
+
 }  // namespace quick_pair
 }  // namespace ash
diff --git a/ash/quick_pair/scanning/fast_pair/fast_pair_discoverable_scanner_impl_unittest.cc b/ash/quick_pair/scanning/fast_pair/fast_pair_discoverable_scanner_impl_unittest.cc
index 5f61e136..0e7cbd9f 100644
--- a/ash/quick_pair/scanning/fast_pair/fast_pair_discoverable_scanner_impl_unittest.cc
+++ b/ash/quick_pair/scanning/fast_pair/fast_pair_discoverable_scanner_impl_unittest.cc
@@ -173,7 +173,7 @@
 
   FakeQuickPairProcessManager* fake_process_manager_;
   base::test::SingleThreadTaskEnvironment task_enviornment_;
-  chromeos::NetworkStateTestHelper helper_{/*use_defaults=*/true};
+  NetworkStateTestHelper helper_{/*use_default_devices_and_services=*/true};
   scoped_refptr<FakeFastPairScanner> scanner_;
   std::unique_ptr<FakeFastPairRepository> repository_;
   std::unique_ptr<FastPairDiscoverableScannerImpl> discoverable_scanner_;
diff --git a/ash/rgb_keyboard/histogram_util.cc b/ash/rgb_keyboard/histogram_util.cc
index 06df4d6..f340c01 100644
--- a/ash/rgb_keyboard/histogram_util.cc
+++ b/ash/rgb_keyboard/histogram_util.cc
@@ -5,11 +5,35 @@
 #include "ash/rgb_keyboard/histogram_util.h"
 
 #include "base/metrics/histogram_functions.h"
+#include "base/notreached.h"
+#include "base/strings/strcat.h"
 
 namespace ash::rgb_keyboard::metrics {
+std::string GetCapabilityTypeStr(rgbkbd::RgbKeyboardCapabilities capabilities) {
+  switch (capabilities) {
+    case rgbkbd::RgbKeyboardCapabilities::kNone:
+      NOTREACHED();
+      return "";
+    case rgbkbd::RgbKeyboardCapabilities::kFourZoneFortyLed:
+      return "FourZoneFortyLed";
+    case rgbkbd::RgbKeyboardCapabilities::kIndividualKey:
+      return "IndividualKey";
+    case rgbkbd::RgbKeyboardCapabilities::kFourZoneTwelveLed:
+      return "FourZoneTwelveLed";
+    case rgbkbd::RgbKeyboardCapabilities::kFourZoneFifteenLed:
+      return "FourZoneFifteenLed";
+  }
+}
 void EmitRgbKeyboardCapabilityType(
     rgbkbd::RgbKeyboardCapabilities capabilities) {
   base::UmaHistogramEnumeration(kRgbKeyboardCapabilityTypeHistogramName,
                                 RgbKeyboardCapabilityType(capabilities));
 }
+
+void EmitRgbBacklightChangeType(RgbKeyboardBacklightChangeType type,
+                                rgbkbd::RgbKeyboardCapabilities capabilities) {
+  const auto name = base::StrCat(
+      {kRgbKeyboardHistogramPrefix, GetCapabilityTypeStr(capabilities)});
+  base::UmaHistogramEnumeration(name, type);
+}
 }  // namespace ash::rgb_keyboard::metrics
diff --git a/ash/rgb_keyboard/histogram_util.h b/ash/rgb_keyboard/histogram_util.h
index 57122cabe..f8549b89 100644
--- a/ash/rgb_keyboard/histogram_util.h
+++ b/ash/rgb_keyboard/histogram_util.h
@@ -5,16 +5,20 @@
 #ifndef ASH_RGB_KEYBOARD_HISTOGRAM_UTIL_H_
 #define ASH_RGB_KEYBOARD_HISTOGRAM_UTIL_H_
 
+#include <string>
+
+#include "ash/ash_export.h"
 #include "third_party/cros_system_api/dbus/rgbkbd/dbus-constants.h"
 
 namespace ash::rgb_keyboard::metrics {
-
+constexpr char kRgbKeyboardHistogramPrefix[] = "ChromeOS.RgbKeyboard.";
 constexpr char kRgbKeyboardCapabilityTypeHistogramName[] =
     "ChromeOS.RgbKeyboard.RgbKeyboardCapabilityType";
 
 // The enums below are used in histograms, do not remove/renumber entries. If
 // you're adding to any of these enums, update the corresponding enum listing in
-// tools/metrics/histograms/enums.xml: RgbKeyboardCapabilityType.
+// tools/metrics/histograms/enums.xml:
+// RgbKeyboardCapabilityType/RgbKeyboardBacklightChangeType.
 // RgbKeyboardCapabilityType gets its values from RgbKeyboardCapabilities
 // defined in: third_party/cros_system_api/dbus/rgbkbd/dbus-constants.h.
 enum class RgbKeyboardCapabilityType {
@@ -26,9 +30,21 @@
   kMaxValue = kFourZoneFifteenLed,
 };
 
+enum class RgbKeyboardBacklightChangeType {
+  kStaticBackgroundColorChanged = 0,
+  kRainbowModeSelected = 1,
+  kMaxValue = kRainbowModeSelected,
+};
+
+ASH_EXPORT std::string GetCapabilityTypeStr(
+    rgbkbd::RgbKeyboardCapabilities capabilities);
+
 void EmitRgbKeyboardCapabilityType(
     rgbkbd::RgbKeyboardCapabilities capabilities);
 
+void EmitRgbBacklightChangeType(RgbKeyboardBacklightChangeType type,
+                                rgbkbd::RgbKeyboardCapabilities capabilities);
+
 }  // namespace ash::rgb_keyboard::metrics
 
 #endif  // ASH_RGB_KEYBOARD_HISTOGRAM_UTIL_H_
diff --git a/ash/rgb_keyboard/rgb_keyboard_manager.cc b/ash/rgb_keyboard/rgb_keyboard_manager.cc
index 536a22ac..14c23aa9 100644
--- a/ash/rgb_keyboard/rgb_keyboard_manager.cc
+++ b/ash/rgb_keyboard/rgb_keyboard_manager.cc
@@ -69,6 +69,10 @@
 
   VLOG(1) << "Setting RGB keyboard color to R:" << static_cast<int>(r)
           << " G:" << static_cast<int>(g) << " B:" << static_cast<int>(b);
+  ash::rgb_keyboard::metrics::EmitRgbBacklightChangeType(
+      ash::rgb_keyboard::metrics::RgbKeyboardBacklightChangeType::
+          kStaticBackgroundColorChanged,
+      capabilities_);
   RgbkbdClient::Get()->SetStaticBackgroundColor(r, g, b);
 }
 
@@ -80,6 +84,10 @@
   }
 
   VLOG(1) << "Setting RGB keyboard to rainbow mode";
+  ash::rgb_keyboard::metrics::EmitRgbBacklightChangeType(
+      ash::rgb_keyboard::metrics::RgbKeyboardBacklightChangeType::
+          kRainbowModeSelected,
+      capabilities_);
   RgbkbdClient::Get()->SetRainbowMode();
 }
 
diff --git a/ash/rgb_keyboard/rgb_keyboard_manager_unittest.cc b/ash/rgb_keyboard/rgb_keyboard_manager_unittest.cc
index cb78fb4..8b8448f 100644
--- a/ash/rgb_keyboard/rgb_keyboard_manager_unittest.cc
+++ b/ash/rgb_keyboard/rgb_keyboard_manager_unittest.cc
@@ -11,6 +11,7 @@
 #include "ash/ime/ime_controller_impl.h"
 #include "ash/rgb_keyboard/histogram_util.h"
 #include "base/memory/raw_ptr.h"
+#include "base/strings/strcat.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "chromeos/ash/components/dbus/rgbkbd/fake_rgbkbd_client.h"
@@ -116,6 +117,42 @@
       1);
 }
 
+class RgbChangeTypeHistogramEmittedTest
+    : public RgbKeyboardManagerTest,
+      public testing::WithParamInterface<rgbkbd::RgbKeyboardCapabilities> {
+ public:
+  RgbChangeTypeHistogramEmittedTest() = default;
+};
+
+INSTANTIATE_TEST_SUITE_P(
+    All,
+    RgbChangeTypeHistogramEmittedTest,
+    testing::Values(rgbkbd::RgbKeyboardCapabilities::kIndividualKey,
+                    rgbkbd::RgbKeyboardCapabilities::kFourZoneFortyLed,
+                    rgbkbd::RgbKeyboardCapabilities::kFourZoneTwelveLed,
+                    rgbkbd::RgbKeyboardCapabilities::kFourZoneFifteenLed));
+
+TEST_P(RgbChangeTypeHistogramEmittedTest, RgbChangeTypeHistogramEmitted) {
+  base::HistogramTester histogram_tester;
+  const auto capability = GetParam();
+  const auto name =
+      std::string(ash::rgb_keyboard::metrics::kRgbKeyboardHistogramPrefix +
+                  ash::rgb_keyboard::metrics::GetCapabilityTypeStr(capability));
+  InitializeManagerWithCapability(capability);
+  manager_->SetStaticBackgroundColor(/*r=*/1, /*g=*/2, /*b=*/3);
+  histogram_tester.ExpectBucketCount(
+      name,
+      ash::rgb_keyboard::metrics::RgbKeyboardBacklightChangeType::
+          kStaticBackgroundColorChanged,
+      1);
+  manager_->SetRainbowMode();
+  histogram_tester.ExpectBucketCount(
+      name,
+      ash::rgb_keyboard::metrics::RgbKeyboardBacklightChangeType::
+          kRainbowModeSelected,
+      1);
+}
+
 TEST_F(RgbKeyboardManagerTest, SetStaticRgbValues) {
   const uint8_t expected_r = 1;
   const uint8_t expected_g = 2;
diff --git a/ash/services/cellular_setup/esim_test_base.h b/ash/services/cellular_setup/esim_test_base.h
index 88c07a39..d960cab 100644
--- a/ash/services/cellular_setup/esim_test_base.h
+++ b/ash/services/cellular_setup/esim_test_base.h
@@ -17,10 +17,6 @@
 // TODO(https://crbug.com/1164001): move to forward declaration.
 #include "chromeos/ash/components/network/cellular_esim_uninstall_handler.h"
 // TODO(https://crbug.com/1164001): move to forward declaration.
-#include "chromeos/ash/components/network/fake_network_connection_handler.h"
-// TODO(https://crbug.com/1164001): move to forward declaration.
-#include "chromeos/ash/components/network/test_cellular_esim_profile_handler.h"
-// TODO(https://crbug.com/1164001): move to forward declaration.
 #include "chromeos/ash/components/network/network_configuration_handler.h"
 // TODO(https://crbug.com/1164001): move to forward declaration.
 #include "chromeos/ash/components/network/network_device_handler.h"
@@ -31,7 +27,12 @@
 #include "mojo/public/cpp/bindings/remote.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace ash::cellular_setup {
+namespace ash {
+
+class FakeNetworkConnectionHandler;
+class TestCellularESimProfileHandler;
+
+namespace cellular_setup {
 
 class ESimManager;
 
@@ -97,6 +98,7 @@
   std::unique_ptr<ESimManagerTestObserver> observer_;
 };
 
-}  // namespace ash::cellular_setup
+}  // namespace cellular_setup
+}  // namespace ash
 
 #endif  // ASH_SERVICES_CELLULAR_SETUP_ESIM_TEST_BASE_H_
diff --git a/ash/system/message_center/metrics_utils.cc b/ash/system/message_center/metrics_utils.cc
index 629d9c1..ef63675f 100644
--- a/ash/system/message_center/metrics_utils.cc
+++ b/ash/system/message_center/metrics_utils.cc
@@ -4,6 +4,7 @@
 
 #include "ash/system/message_center/metrics_utils.h"
 
+#include "ash/constants/notifier_catalogs.h"
 #include "ash/public/cpp/notification_utils.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
@@ -469,6 +470,10 @@
 }
 
 void LogNotificationAdded(const std::string& notification_id) {
+  // TODO(kradtke): refactor on CL to reuse `FindNotificationById`
+  // https://chromium-review.googlesource.com/c/chromium/src/+/3774436
+  LogSystemNotificationAdded(notification_id);
+
   auto* notification =
       message_center::MessageCenter::Get()->FindVisibleNotificationById(
           notification_id);
@@ -486,6 +491,36 @@
                                 notification_view_type.value());
 }
 
+void LogSystemNotificationAdded(const std::string& notification_id) {
+  auto* notification =
+      message_center::MessageCenter::Get()->FindNotificationById(
+          notification_id);
+  if (!notification)
+    return;
+
+  if (notification->notifier_id().type !=
+      message_center::NotifierType::SYSTEM_COMPONENT) {
+    return;
+  }
+
+  if (notification->notifier_id().catalog_name ==
+          NotificationCatalogName::kNone ||
+      notification->notifier_id().catalog_name ==
+          NotificationCatalogName::kTestCatalogName) {
+    return;
+  }
+
+  if (!notification->pinned()) {
+    base::UmaHistogramEnumeration(
+        "Ash.NotifierFramework.SystemNotification.Added",
+        notification->notifier_id().catalog_name);
+  } else {
+    base::UmaHistogramEnumeration(
+        "Ash.NotifierFramework.PinnedSystemNotification.Added",
+        notification->notifier_id().catalog_name);
+  }
+}
+
 void LogNotificationsShownInFirstMinute(int count) {
   UMA_HISTOGRAM_COUNTS_1000(
       "Notifications.Cros.Actions.CountOfNotificationShownInFirstMinutePerUser",
diff --git a/ash/system/message_center/metrics_utils.h b/ash/system/message_center/metrics_utils.h
index 6953240..43f7bcb 100644
--- a/ash/system/message_center/metrics_utils.h
+++ b/ash/system/message_center/metrics_utils.h
@@ -152,6 +152,9 @@
 // Logs a notification added event.
 void LogNotificationAdded(const std::string& notification_id);
 
+// Logs a system notification added event.
+void LogSystemNotificationAdded(const std::string& notification_id);
+
 // Logs the count of notifications displayed during the first minute after a
 // user logs in.
 void LogNotificationsShownInFirstMinute(int notifications_count);
diff --git a/ash/system/message_center/metrics_utils_unittest.cc b/ash/system/message_center/metrics_utils_unittest.cc
index a614480..ad45029 100644
--- a/ash/system/message_center/metrics_utils_unittest.cc
+++ b/ash/system/message_center/metrics_utils_unittest.cc
@@ -33,6 +33,12 @@
 constexpr char kGroupNotificationAddedHistogramName[] =
     "Ash.Notification.GroupNotificationAdded";
 
+constexpr char kSystemNotificationAddedHistogramName[] =
+    "Ash.NotifierFramework.SystemNotification.Added";
+
+constexpr char kPinnedSystemNotificationAddedHistogramName[] =
+    "Ash.NotifierFramework.PinnedSystemNotification.Added";
+
 const gfx::Image CreateTestImage() {
   SkBitmap bitmap;
   bitmap.allocN32Pixels(/*width=*/80, /*height=*/80);
@@ -52,6 +58,48 @@
   histograms.ExpectBucketCount(kNotificationViewTypeHistogramName, type, 1);
 }
 
+// A blocker that blocks a notification with the given ID.
+class IdNotificationBlocker : public message_center::NotificationBlocker {
+ public:
+  explicit IdNotificationBlocker(message_center::MessageCenter* message_center)
+      : NotificationBlocker(message_center) {}
+  IdNotificationBlocker(const IdNotificationBlocker&) = delete;
+  IdNotificationBlocker& operator=(const IdNotificationBlocker&) = delete;
+  ~IdNotificationBlocker() override = default;
+
+  void SetTargetIdAndNotifyBlock(const std::string& target_id) {
+    target_id_ = target_id;
+    NotifyBlockingStateChanged();
+  }
+
+  // message_center::NotificationBlocker:
+  bool ShouldShowNotification(
+      const message_center::Notification& notification) const override {
+    return notification.id() != target_id_;
+  }
+
+  bool ShouldShowNotificationAsPopup(
+      const message_center::Notification& notification) const override {
+    return notification.id() != target_id_;
+  }
+
+ private:
+  std::string target_id_;
+};
+
+// Returns true if a notification with a given `id` is showing a notification in
+// the message center.
+bool NotificationVisible(const std::string& id) {
+  return message_center::MessageCenter::Get()->FindVisibleNotificationById(
+             id) != nullptr;
+}
+
+// Returns true if a notification with a given `id` has a pop-up.
+bool PopupVisible(const std::string& id) {
+  return message_center::MessageCenter::Get()->FindPopupNotificationById(id) !=
+         nullptr;
+}
+
 }  // namespace
 
 namespace ash {
@@ -93,6 +141,28 @@
         /*delegate=*/nullptr);
   }
 
+  // Create a system notification with given `catalog_name`.
+  std::unique_ptr<Notification> CreateNotificationWithCatalogName(
+      NotificationCatalogName catalog_name) {
+    const std::string id =
+        "id" + base::NumberToString(static_cast<int>(catalog_name));
+    message_center::RichNotificationData data;
+    return std::make_unique<Notification>(
+        message_center::NOTIFICATION_TYPE_BASE_FORMAT, id, u"title", u"message",
+        ui::ImageModel(), u"display source", GURL(u"http://test-url.com"),
+        message_center::NotifierId(
+            message_center::NotifierType::SYSTEM_COMPONENT, id, catalog_name),
+        data, /*delegate=*/nullptr);
+  }
+
+  // Create a pinned system notification with given `catalog_name`.
+  std::unique_ptr<Notification> CreatePinnedNotificationWithCatalogName(
+      NotificationCatalogName catalog_name) {
+    auto notification = CreateNotificationWithCatalogName(catalog_name);
+    notification->set_pinned(true);
+    return notification;
+  }
+
   // Get the notification view from message center associated with `id`.
   views::View* GetNotificationViewFromMessageCenter(const std::string& id) {
     return GetPrimaryUnifiedSystemTray()
@@ -369,4 +439,82 @@
       metrics_utils::GroupNotificationType::GROUP_CHILD, 3);
 }
 
+TEST_F(MessageCenterMetricsUtilsTest, RecordSystemNotificationAdded) {
+  base::HistogramTester histograms;
+
+  // Create a system notification with `kTestCatalogName` for its catalog name.
+  const NotificationCatalogName test_catalog_name =
+      NotificationCatalogName::kTestCatalogName;
+  auto test_notification = CreateNotificationWithCatalogName(test_catalog_name);
+  message_center::MessageCenter::Get()->AddNotification(
+      std::move(test_notification));
+
+  // Check metrics are not recorded for `kTestCatalogName`.
+  histograms.ExpectBucketCount(kSystemNotificationAddedHistogramName,
+                               test_catalog_name, 0);
+
+  // Create system notifications with a valid catalog name, one for a non-pinned
+  // notification and one for a pinned one (e.g. Full Restore and Caps Lock).
+  const NotificationCatalogName catalog_name =
+      NotificationCatalogName::kFullRestore;
+  const NotificationCatalogName pinned_catalog_name =
+      NotificationCatalogName::kCapsLock;
+  auto notification = CreateNotificationWithCatalogName(catalog_name);
+  auto pinned_notification =
+      CreatePinnedNotificationWithCatalogName(pinned_catalog_name);
+
+  // Add notifications to message center.
+  auto* message_center = message_center::MessageCenter::Get();
+  message_center->AddNotification(
+      std::make_unique<message_center::Notification>(*notification));
+  message_center->AddNotification(
+      std::make_unique<message_center::Notification>(*pinned_notification));
+
+  // Expect metric to be recorded for valid catalog names.
+  histograms.ExpectBucketCount(kSystemNotificationAddedHistogramName,
+                               catalog_name, 1);
+  histograms.ExpectBucketCount(kPinnedSystemNotificationAddedHistogramName,
+                               pinned_catalog_name, 1);
+}
+
+TEST_F(MessageCenterMetricsUtilsTest,
+       RecordSystemNotificationAddedWithNotificationBlockers) {
+  base::HistogramTester histograms;
+
+  // Create a system notification with a valid catalog name (e.g. Full Restore).
+  const NotificationCatalogName catalog_name =
+      NotificationCatalogName::kFullRestore;
+  auto notification = CreateNotificationWithCatalogName(catalog_name);
+
+  // Add notification to message center.
+  auto* message_center = message_center::MessageCenter::Get();
+  message_center->AddNotification(
+      std::make_unique<message_center::Notification>(*notification));
+
+  // Verify notification was shown.
+  EXPECT_TRUE(PopupVisible(notification->id()));
+  EXPECT_TRUE(NotificationVisible(notification->id()));
+
+  // Expect metric to be recorded.
+  histograms.ExpectBucketCount(kSystemNotificationAddedHistogramName,
+                               catalog_name, 1);
+
+  // Apply a notification blocker.
+  IdNotificationBlocker blocker(message_center);
+  blocker.SetTargetIdAndNotifyBlock(notification->id());
+
+  // Add more notification instances to the message center.
+  message_center->RemoveNotification(notification->id(), /*by_user=*/false);
+  message_center->AddNotification(
+      std::make_unique<message_center::Notification>(*notification));
+
+  // Verify notification wasn't shown with notification blockers enabled.
+  EXPECT_FALSE(PopupVisible(notification->id()));
+  EXPECT_FALSE(NotificationVisible(notification->id()));
+
+  // Verify the metric is recorded even with notification blockers enabled.
+  histograms.ExpectBucketCount(kSystemNotificationAddedHistogramName,
+                               catalog_name, 2);
+}
+
 }  // namespace ash
diff --git a/ash/system/network/active_network_icon_unittest.cc b/ash/system/network/active_network_icon_unittest.cc
index dd9a106..8a99507 100644
--- a/ash/system/network/active_network_icon_unittest.cc
+++ b/ash/system/network/active_network_icon_unittest.cc
@@ -147,7 +147,7 @@
     network_state_helper().SetServiceProperty(service_path, key, value);
   }
 
-  chromeos::NetworkStateTestHelper& network_state_helper() {
+  NetworkStateTestHelper& network_state_helper() {
     return network_config_helper_.network_state_helper();
   }
   chromeos::NetworkStateHandler* network_state_handler() {
diff --git a/ash/system/network/auto_connect_notifier_unittest.cc b/ash/system/network/auto_connect_notifier_unittest.cc
index ef6d337..ee54945 100644
--- a/ash/system/network/auto_connect_notifier_unittest.cc
+++ b/ash/system/network/auto_connect_notifier_unittest.cc
@@ -49,8 +49,7 @@
     chromeos::SystemTokenCertDbStorage::Initialize();
     chromeos::NetworkCertLoader::Initialize();
     chromeos::NetworkCertLoader::ForceAvailableForNetworkAuthForTesting();
-    network_handler_test_helper_ =
-        std::make_unique<chromeos::NetworkHandlerTestHelper>();
+    network_handler_test_helper_ = std::make_unique<NetworkHandlerTestHelper>();
     CHECK(chromeos::NetworkHandler::Get()->auto_connect_handler());
     network_config_helper_ = std::make_unique<
         chromeos::network_config::CrosNetworkConfigTestHelper>();
@@ -113,8 +112,7 @@
   base::MockOneShotTimer* mock_notification_timer_;
 
  private:
-  std::unique_ptr<chromeos::NetworkHandlerTestHelper>
-      network_handler_test_helper_;
+  std::unique_ptr<NetworkHandlerTestHelper> network_handler_test_helper_;
   std::unique_ptr<chromeos::network_config::CrosNetworkConfigTestHelper>
       network_config_helper_;
   ToastManagerImpl* toast_manager_ = nullptr;
diff --git a/ash/system/network/network_detailed_network_view_unittest.cc b/ash/system/network/network_detailed_network_view_unittest.cc
index b461653..438779f 100644
--- a/ash/system/network/network_detailed_network_view_unittest.cc
+++ b/ash/system/network/network_detailed_network_view_unittest.cc
@@ -174,7 +174,7 @@
     return network_detailed_network_view_;
   }
 
-  chromeos::NetworkStateTestHelper* network_state_helper() {
+  NetworkStateTestHelper* network_state_helper() {
     return &network_config_helper_.network_state_helper();
   }
 
@@ -231,4 +231,4 @@
   EXPECT_EQ(1u, delegate()->network_list_item_selected_count());
 }
 
-}  // namespace ash
\ No newline at end of file
+}  // namespace ash
diff --git a/ash/system/network/network_detailed_view_controller_unittest.cc b/ash/system/network/network_detailed_view_controller_unittest.cc
index fd5f8781..81ebb7d2 100644
--- a/ash/system/network/network_detailed_view_controller_unittest.cc
+++ b/ash/system/network/network_detailed_view_controller_unittest.cc
@@ -259,7 +259,7 @@
     return network_state_helper()->network_state_handler();
   }
 
-  chromeos::NetworkStateTestHelper* network_state_helper() {
+  NetworkStateTestHelper* network_state_helper() {
     return &network_config_helper_->network_state_helper();
   }
 
diff --git a/ash/system/network/network_feature_pod_controller_unittest.cc b/ash/system/network/network_feature_pod_controller_unittest.cc
index 762323e..0f55fe3c 100644
--- a/ash/system/network/network_feature_pod_controller_unittest.cc
+++ b/ash/system/network/network_feature_pod_controller_unittest.cc
@@ -246,7 +246,7 @@
               feature_pod_label_button()->GetSubLabelText());
   }
 
-  chromeos::NetworkStateTestHelper* network_state_helper() {
+  NetworkStateTestHelper* network_state_helper() {
     return &network_config_helper_.network_state_helper();
   }
 
diff --git a/ash/system/network/network_icon_unittest.cc b/ash/system/network/network_icon_unittest.cc
index 8f0000b..269d8288 100644
--- a/ash/system/network/network_icon_unittest.cc
+++ b/ash/system/network/network_icon_unittest.cc
@@ -145,7 +145,7 @@
             chromeos::NetworkTypePattern::Cellular()));
   }
 
-  chromeos::NetworkStateTestHelper& helper() {
+  NetworkStateTestHelper& helper() {
     return network_config_helper_.network_state_helper();
   }
 
diff --git a/ash/system/network/network_info_bubble_unittest.cc b/ash/system/network/network_info_bubble_unittest.cc
index 214d310..8217908 100644
--- a/ash/system/network/network_info_bubble_unittest.cc
+++ b/ash/system/network/network_info_bubble_unittest.cc
@@ -184,7 +184,7 @@
         NetworkInfoBubble::kNetworkInfoBubbleLabelViewId));
   }
 
-  chromeos::NetworkStateTestHelper* network_state_helper() {
+  NetworkStateTestHelper* network_state_helper() {
     return &network_config_helper_.network_state_helper();
   }
 
diff --git a/ash/system/network/network_list_mobile_header_view_unittest.cc b/ash/system/network/network_list_mobile_header_view_unittest.cc
index aefdc233..22379f5 100644
--- a/ash/system/network/network_list_mobile_header_view_unittest.cc
+++ b/ash/system/network/network_list_mobile_header_view_unittest.cc
@@ -100,7 +100,7 @@
     network_list_mobile_header_view_->SetAddESimButtonState(enabled, visible);
   }
 
-  chromeos::NetworkStateTestHelper* network_state_helper() {
+  NetworkStateTestHelper* network_state_helper() {
     return &network_config_helper_.network_state_helper();
   }
 
diff --git a/ash/system/network/network_list_network_item_view_unittest.cc b/ash/system/network/network_list_network_item_view_unittest.cc
index 012c060..33ca24e 100644
--- a/ash/system/network/network_list_network_item_view_unittest.cc
+++ b/ash/system/network/network_list_network_item_view_unittest.cc
@@ -149,7 +149,7 @@
                                       kWiFiDeviceName);
   }
 
-  chromeos::NetworkStateTestHelper* network_state_helper() {
+  NetworkStateTestHelper* network_state_helper() {
     return &network_config_helper_.network_state_helper();
   }
 
diff --git a/ash/system/network/network_list_view_controller_unittest.cc b/ash/system/network/network_list_view_controller_unittest.cc
index 1c7a013..b92c9ef 100644
--- a/ash/system/network/network_list_view_controller_unittest.cc
+++ b/ash/system/network/network_list_view_controller_unittest.cc
@@ -533,7 +533,7 @@
     return network_state_helper()->network_state_handler();
   }
 
-  chromeos::NetworkStateTestHelper* network_state_helper() {
+  NetworkStateTestHelper* network_state_helper() {
     return &cros_network_config_test_helper_->network_state_helper();
   }
 
diff --git a/ash/system/network/network_list_wifi_header_view_unittest.cc b/ash/system/network/network_list_wifi_header_view_unittest.cc
index c9bd696..1a762cc 100644
--- a/ash/system/network/network_list_wifi_header_view_unittest.cc
+++ b/ash/system/network/network_list_wifi_header_view_unittest.cc
@@ -61,7 +61,7 @@
     network_list_wifi_header_view()->SetToggleState(enabled, is_on);
   }
 
-  chromeos::NetworkStateTestHelper* network_state_helper() {
+  NetworkStateTestHelper* network_state_helper() {
     return &network_config_helper_.network_state_helper();
   }
 
diff --git a/ash/system/power/adaptive_charging_controller.cc b/ash/system/power/adaptive_charging_controller.cc
index 40229129..d1c1fc0 100644
--- a/ash/system/power/adaptive_charging_controller.cc
+++ b/ash/system/power/adaptive_charging_controller.cc
@@ -59,14 +59,20 @@
 
   // Nudge and notification should be shown only if heuristic is enabled for
   // this user.
-  if (!proto.has_adaptive_charging_heuristic_enabled() ||
+  if (proto.has_adaptive_charging_heuristic_enabled() &&
       !proto.adaptive_charging_heuristic_enabled()) {
+    // |is_adaptive_delaying_charge_| is set to false when there is no
+    // heuristic enabled. This is to make sure quick settings gets correct
+    // information.
+    is_adaptive_delaying_charge_ = false;
     notification_controller_->CloseAdaptiveChargingNotification();
     return;
   }
 
   // Showing educational nudge.
-  if (!is_on_charger_ && is_on_charger_now)
+  if (proto.has_adaptive_charging_heuristic_enabled() &&
+      proto.adaptive_charging_heuristic_enabled() && !is_on_charger_ &&
+      is_on_charger_now)
     nudge_controller_->ShowNudge();
 
   is_on_charger_ = is_on_charger_now;
diff --git a/ash/system/power/adaptive_charging_controller_unittest.cc b/ash/system/power/adaptive_charging_controller_unittest.cc
index c418e3fd..d145d9a 100644
--- a/ash/system/power/adaptive_charging_controller_unittest.cc
+++ b/ash/system/power/adaptive_charging_controller_unittest.cc
@@ -58,7 +58,7 @@
   power_manager::PowerSupplyProperties power_props;
   power_props.set_adaptive_delaying_charge(true);
   power_manager_client_->UpdatePowerProperties(power_props);
-  EXPECT_FALSE(adaptive_charging_controller_->is_adaptive_delaying_charge());
+  EXPECT_TRUE(adaptive_charging_controller_->is_adaptive_delaying_charge());
 
   // Case (3) set_adaptive_delaying_charge to true with
   // |adaptive_charging_heuristic_enabled| == true.
diff --git a/ash/system/status_area_widget_unittest.cc b/ash/system/status_area_widget_unittest.cc
index 794dd2f..c394c38 100644
--- a/ash/system/status_area_widget_unittest.cc
+++ b/ash/system/status_area_widget_unittest.cc
@@ -292,7 +292,7 @@
   }
 
  private:
-  chromeos::NetworkHandlerTestHelper network_handler_test_helper_;
+  NetworkHandlerTestHelper network_handler_test_helper_;
   TestingPrefServiceSimple profile_prefs_;
   TestingPrefServiceSimple local_state_;
 };
diff --git a/ash/webui/projector_app/resources/BUILD.gn b/ash/webui/projector_app/resources/BUILD.gn
index c022c55..592cac2c 100644
--- a/ash/webui/projector_app/resources/BUILD.gn
+++ b/ash/webui/projector_app/resources/BUILD.gn
@@ -97,6 +97,7 @@
     "annotator/annotator_embedder_impl.js",
     "annotator/trusted/trusted_annotator_comm_factory.js",
     "app/trusted/trusted_app_comm_factory.js",
+    "communication/annotator_browser_proxy.js",
     "communication/projector_browser_proxy.js",
     "app/embedder.html",
     "app/embedder.css",
diff --git a/ash/webui/projector_app/resources/annotator/annotator_embedder_impl.js b/ash/webui/projector_app/resources/annotator/annotator_embedder_impl.js
index a93ab99..513cb78a 100644
--- a/ash/webui/projector_app/resources/annotator/annotator_embedder_impl.js
+++ b/ash/webui/projector_app/resources/annotator/annotator_embedder_impl.js
@@ -5,7 +5,7 @@
 import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behavior.m.js';
 import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {ProjectorBrowserProxyImpl} from '../../communication/projector_browser_proxy.js';
+import {AnnotatorBrowserProxyImpl} from '../../communication/annotator_browser_proxy.js';
 
 import {AnnotatorTrustedCommFactory, UntrustedAnnotatorClient} from './trusted/trusted_annotator_comm_factory.js';
 
@@ -33,7 +33,7 @@
       try {
         client.undo();
       } catch (error) {
-        ProjectorBrowserProxyImpl.getInstance().onError(
+        AnnotatorBrowserProxyImpl.getInstance().onError(
             [AnnotatorToolErrorType.UNDO_ERROR]);
       }
     });
@@ -42,7 +42,7 @@
       try {
         client.redo();
       } catch (error) {
-        ProjectorBrowserProxyImpl.getInstance().onError(
+        AnnotatorBrowserProxyImpl.getInstance().onError(
             [AnnotatorToolErrorType.REDO_ERROR]);
       }
     });
@@ -51,7 +51,7 @@
       try {
         client.clear();
       } catch (error) {
-        ProjectorBrowserProxyImpl.getInstance().onError(
+        AnnotatorBrowserProxyImpl.getInstance().onError(
             [AnnotatorToolErrorType.CLEAR_ERROR]);
       }
     });
@@ -60,7 +60,7 @@
       try {
         client.setTool(tool);
       } catch (error) {
-        ProjectorBrowserProxyImpl.getInstance().onError(
+        AnnotatorBrowserProxyImpl.getInstance().onError(
             [AnnotatorToolErrorType.SET_TOOL_ERROR]);
       }
     });
diff --git a/ash/webui/projector_app/resources/annotator/trusted/trusted_annotator_comm_factory.js b/ash/webui/projector_app/resources/annotator/trusted/trusted_annotator_comm_factory.js
index ad38f07c..293f1307 100644
--- a/ash/webui/projector_app/resources/annotator/trusted/trusted_annotator_comm_factory.js
+++ b/ash/webui/projector_app/resources/annotator/trusted/trusted_annotator_comm_factory.js
@@ -5,7 +5,7 @@
 import {PostMessageAPIClient} from 'chrome://resources/js/post_message_api_client.m.js';
 import {RequestHandler} from 'chrome://resources/js/post_message_api_request_handler.m.js';
 
-import {ProjectorBrowserProxy, ProjectorBrowserProxyImpl} from '../../communication/projector_browser_proxy.js';
+import {AnnotatorBrowserProxy, AnnotatorBrowserProxyImpl} from '../../communication/annotator_browser_proxy.js';
 
 const TARGET_URL = 'chrome-untrusted://projector-annotator/';
 
@@ -60,7 +60,7 @@
   /*
    * @param {!Element} iframeElement The <iframe> element to listen to as a
    *     client.
-   * @param {ProjectorBrowserProxy} browserProxy The browser proxy that will
+   * @param {AnnotatorBrowserProxy} browserProxy The browser proxy that will
    *     be used to handle the messages.
    */
   constructor(iframeElement, browserProxy) {
@@ -107,7 +107,7 @@
 
     AnnotatorTrustedCommFactory.requestHandler_ =
         new TrustedAnnotatorRequestHandler(
-            iframeElement, ProjectorBrowserProxyImpl.getInstance());
+            iframeElement, AnnotatorBrowserProxyImpl.getInstance());
   }
 
   /**
diff --git a/ash/webui/projector_app/resources/communication/annotator_browser_proxy.js b/ash/webui/projector_app/resources/communication/annotator_browser_proxy.js
new file mode 100644
index 0000000..88e898f
--- /dev/null
+++ b/ash/webui/projector_app/resources/communication/annotator_browser_proxy.js
@@ -0,0 +1,61 @@
+// Copyright 2022 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 {addSingletonGetter, sendWithPromise} from 'chrome://resources/js/cr.m.js';
+
+/**
+ * To use the annotator proxy, please import this module and call
+ * AnnotatorBrowserProxyImpl.getInstance().*
+ *
+ * @interface
+ */
+export class AnnotatorBrowserProxy {
+  /**
+   * Annotator
+   * Notifies the embedder content that undo/redo availability changed for
+   * annotator.
+   * @param {boolean} undoAvailable
+   * @param {boolean} redoAvailable
+   */
+  onUndoRedoAvailabilityChanged(undoAvailable, redoAvailable) {}
+
+  /**
+   * Annotator
+   * Notifies the embedder content that the canvas has either succeeded or
+   * failed to initialize.
+   * @param {boolean} success
+   */
+  onCanvasInitialized(success) {}
+
+  /**
+   * Sends 'error' message to handler.
+   * The Handler will log the message. If the error is not a recoverable error,
+   * the handler closes the corresponding WebUI.
+   * @param {!Array<string>} msg Error messages.
+   */
+  onError(msg) {}
+}
+
+/**
+ * @implements {AnnotatorBrowserProxy}
+ */
+export class AnnotatorBrowserProxyImpl {
+  /** @override */
+  onUndoRedoAvailabilityChanged(undoAvailable, redoAvailable) {
+    return chrome.send(
+        'onUndoRedoAvailabilityChanged', [undoAvailable, redoAvailable]);
+  }
+
+  /** @override */
+  onCanvasInitialized(success) {
+    return chrome.send('onCanvasInitialized', [success]);
+  }
+
+  /** @override */
+  onError(msg) {
+    return chrome.send('onError', msg);
+  }
+}
+
+addSingletonGetter(AnnotatorBrowserProxyImpl);
diff --git a/ash/webui/projector_app/resources/communication/projector_browser_proxy.js b/ash/webui/projector_app/resources/communication/projector_browser_proxy.js
index 4f3697c..66c550a 100644
--- a/ash/webui/projector_app/resources/communication/projector_browser_proxy.js
+++ b/ash/webui/projector_app/resources/communication/projector_browser_proxy.js
@@ -12,21 +12,6 @@
  */
 export class ProjectorBrowserProxy {
   /**
-   * Notifies the embedder content that undo/redo availability changed for
-   * annotator.
-   * @param {boolean} undoAvailable
-   * @param {boolean} redoAvailable
-   */
-  onUndoRedoAvailabilityChanged(undoAvailable, redoAvailable) {}
-
-  /**
-   * Notifies the embedder content that the canvas has either succeeded or
-   * failed to initialize.
-   * @param {boolean} success
-   */
-  onCanvasInitialized(success) {}
-
-  /**
    * Gets the list of primary and secondary accounts currently available on the
    * device.
    * @return {Promise<Array<!projectorApp.Account>>}
@@ -137,17 +122,6 @@
  */
 export class ProjectorBrowserProxyImpl {
   /** @override */
-  onUndoRedoAvailabilityChanged(undoAvailable, redoAvailable) {
-    return chrome.send(
-        'onUndoRedoAvailabilityChanged', [undoAvailable, redoAvailable]);
-  }
-
-  /** @override */
-  onCanvasInitialized(success) {
-    return chrome.send('onCanvasInitialized', [success]);
-  }
-
-  /** @override */
   getAccounts() {
     return sendWithPromise('getAccounts');
   }
diff --git a/ash/webui/shimless_rma/backend/shimless_rma_service_unittest.cc b/ash/webui/shimless_rma/backend/shimless_rma_service_unittest.cc
index f268ea7..24ba2b0 100644
--- a/ash/webui/shimless_rma/backend/shimless_rma_service_unittest.cc
+++ b/ash/webui/shimless_rma/backend/shimless_rma_service_unittest.cc
@@ -294,7 +294,7 @@
     return *cros_network_config_test_helper_;
   }
 
-  chromeos::NetworkStateTestHelper& network_state_helper() {
+  NetworkStateTestHelper& network_state_helper() {
     return cros_network_config_test_helper_->network_state_helper();
   }
 
diff --git a/ash/webui/shimless_rma/backend/version_updater_unittest.cc b/ash/webui/shimless_rma/backend/version_updater_unittest.cc
index 75b2e8f..58d51c82 100644
--- a/ash/webui/shimless_rma/backend/version_updater_unittest.cc
+++ b/ash/webui/shimless_rma/backend/version_updater_unittest.cc
@@ -96,7 +96,7 @@
     return *cros_network_config_test_helper_;
   }
 
-  chromeos::NetworkStateTestHelper& network_state_helper() {
+  NetworkStateTestHelper& network_state_helper() {
     return cros_network_config_test_helper_->network_state_helper();
   }
 
diff --git a/ash/webui/shimless_rma/resources/shimless_rma_types.js b/ash/webui/shimless_rma/resources/shimless_rma_types.js
index 3fee7fbbe..4111fdb 100644
--- a/ash/webui/shimless_rma/resources/shimless_rma_types.js
+++ b/ash/webui/shimless_rma/resources/shimless_rma_types.js
@@ -346,3 +346,8 @@
  * @typedef {ash.shimlessRma.mojom.ShutdownMethod}
  */
 export const ShutdownMethod = ash.shimlessRma.mojom.ShutdownMethod;
+
+/**
+ * @typedef {{savePath: mojoBase.mojom.FilePath, error: RmadErrorCode}}
+ */
+export let SaveLogResponse;
diff --git a/ash/webui/shimless_rma/resources/wrapup_repair_complete_page.html b/ash/webui/shimless_rma/resources/wrapup_repair_complete_page.html
index 52851de..039fdfbf 100644
--- a/ash/webui/shimless_rma/resources/wrapup_repair_complete_page.html
+++ b/ash/webui/shimless_rma/resources/wrapup_repair_complete_page.html
@@ -144,6 +144,16 @@
     padding-inline-end: 8px;
     width: 20px;
   }
+
+  #logSaveAttemptButtonContainer {
+    align-items: center;
+    display: flex;
+    justify-content: space-between;
+  }
+
+  #logSavedIconText {
+    align-items: center;
+  }
 </style>
 
 <base-page>
@@ -227,7 +237,8 @@
   <div slot="body">
     <div class="log">[[log_]]</div>
   </div>
-  <div class="dialog-footer" slot="button-container">
+  <div class="dialog-footer" slot="button-container"
+      hidden="[[!shouldShowSaveToUsbButton_(usbLogState_)]]">
     <cr-button id="closeLogDialogButton" on-click="onCancelClick_">
       [[i18n('rmaLogsCancelButtonText')]]
     </cr-button>
@@ -236,6 +247,19 @@
       [[i18n('rmaLogsSaveToUsbButtonText')]]
     </cr-button>
   </div>
+  <div id="logSaveAttemptButtonContainer" class="dialog-footer"
+        slot="button-container"
+        hidden="[[!shouldShowLogSaveAttemptContainer_(usbLogState_)]]">
+    <div id="logSavedIconText">
+      <iron-icon id="verificationIcon" icon="shimless-icon:check"
+          class="small-icon">
+      </iron-icon>
+      [[logSavedStatusText_]]
+    </div>
+    <cr-button id="logSaveDoneDialogButton" class="text-button action-button">
+      [[i18n('doneButtonLabel')]]
+    </cr-button>
+  </div>
 </cr-dialog>
 
 <cr-dialog id="powerwashDialog" close-text="close">
@@ -269,4 +293,4 @@
       [[i18n('repairCompletedBatteryCutoffShutdownButton')]]
     </cr-button>
   </div>
-</cr-dialog>
\ No newline at end of file
+</cr-dialog>
diff --git a/ash/webui/shimless_rma/resources/wrapup_repair_complete_page.js b/ash/webui/shimless_rma/resources/wrapup_repair_complete_page.js
index c6d51c8..159b68a3 100644
--- a/ash/webui/shimless_rma/resources/wrapup_repair_complete_page.js
+++ b/ash/webui/shimless_rma/resources/wrapup_repair_complete_page.js
@@ -13,7 +13,7 @@
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getShimlessRmaService} from './mojo_interface_provider.js';
-import {PowerCableStateObserverInterface, PowerCableStateObserverReceiver, ShimlessRmaServiceInterface, ShutdownMethod} from './shimless_rma_types.js';
+import {PowerCableStateObserverInterface, PowerCableStateObserverReceiver, RmadErrorCode, SaveLogResponse, ShimlessRmaServiceInterface, ShutdownMethod} from './shimless_rma_types.js';
 import {executeThenTransitionState} from './shimless_rma_util.js';
 
 /**
@@ -39,6 +39,20 @@
   REBOOT: 'reboot',
 };
 
+/**
+ * Enum for the state of USB used for saving logs. The states are transitioned
+ * through as the user plugs in a USB then attempts to save the log.
+ * @enum {number}
+ */
+const USBLogState = {
+  // TODO (gavinwill): Implement `USB_UNPLUGGED` once USB detection is ready.
+  USB_UNPLUGGED: 0,
+  USB_READY: 1,
+  SAVING_LOGS: 2,
+  LOG_SAVE_SUCCESS: 3,
+  LOG_SAVE_FAIL: 4,
+};
+
 /** @polymer */
 export class WrapupRepairCompletePage extends WrapupRepairCompletePageBase {
   static get is() {
@@ -109,6 +123,21 @@
         type: Number,
         value: 5000,
       },
+
+      /**
+       * Tracks the current status of the USB and log saving.
+       * @protected {!USBLogState}
+       */
+      usbLogState_: {
+        type: Number,
+        value: USBLogState.USB_READY,
+      },
+
+      /** @protected */
+      logSavedStatusText_: {
+        type: String,
+        value: '',
+      },
     };
   }
 
@@ -272,7 +301,14 @@
 
   /** @protected */
   onSaveLogClick_() {
-    this.shimlessRmaService_.saveLog();
+    this.shimlessRmaService_.saveLog().then(
+        /*@type {!SaveLogResponse}*/ (result) => {
+          if (result.error === RmadErrorCode.kOk) {
+            this.logSavedStatusText_ =
+                this.i18n('rmaLogsSaveSuccessText', result.savePath.path);
+            this.usbLogState_ = USBLogState.LOG_SAVE_SUCCESS;
+          }
+        });
   }
 
   /** @protected */
@@ -363,6 +399,23 @@
         this.i18n('repairCompletedShutoffInstructionsText') :
         this.i18n('repairCompletedShutoffDescriptionText');
   }
+
+  /**
+   * @return {boolean}
+   * @protected
+   */
+  shouldShowSaveToUsbButton_() {
+    return this.usbLogState_ === USBLogState.USB_READY;
+  }
+
+  /**
+   * @return {boolean}
+   * @protected
+   */
+  shouldShowLogSaveAttemptContainer_() {
+    return this.usbLogState_ === USBLogState.LOG_SAVE_SUCCESS ||
+        this.usbLogState_ === USBLogState.LOG_SAVE_FAIL;
+  }
 }
 
 customElements.define(WrapupRepairCompletePage.is, WrapupRepairCompletePage);
diff --git a/ash/webui/shimless_rma/shimless_rma.cc b/ash/webui/shimless_rma/shimless_rma.cc
index 132c1e87..da1dc12c 100644
--- a/ash/webui/shimless_rma/shimless_rma.cc
+++ b/ash/webui/shimless_rma/shimless_rma.cc
@@ -80,6 +80,7 @@
       {"cancelButtonLabel", IDS_SHIMLESS_RMA_CANCEL_BUTTON},
       {"retryButtonLabel", IDS_SHIMLESS_RMA_RETRY_BUTTON},
       {"tryAgainButtonLabel", IDS_SHIMLESS_RMA_TRY_AGAIN_BUTTON},
+      {"doneButtonLabel", IDS_SHIMLESS_RMA_DONE_BUTTON},
       // Exit dialog
       {"exitDialogTitleText", IDS_SHIMLESS_RMA_EXIT_DIALOG_TITLE},
       {"exitDialogDescriptionText", IDS_SHIMLESS_RMA_EXIT_DIALOG_DESCRIPTION},
@@ -240,6 +241,7 @@
        IDS_SHIMLESS_RMA_REPAIR_COMPLETED_CUTOFF_COUNTDOWN_DESCRIPTION},
       {"repairCompletedBatteryCutoffShutdownButton",
        IDS_SHIMLESS_RMA_REPAIR_COMPLETED_BATTERY_CUTOFF_SHUTDOWN_BUTTON},
+      {"rmaLogsSaveSuccessText", IDS_SHIMLESS_RMA_LOGS_SAVE_SUCCESS},
       // Powerwash dialog
       {"powerwashDialogTitle", IDS_SHIMLESS_RMA_POWERWASH_DIALOG_TITLE},
       {"powerwashDialogShutdownDescription",
diff --git a/base/allocator/partition_allocator/partition_alloc_base/files/file_path.cc b/base/allocator/partition_allocator/partition_alloc_base/files/file_path.cc
index e5387b8..9a96cf16 100644
--- a/base/allocator/partition_allocator/partition_alloc_base/files/file_path.cc
+++ b/base/allocator/partition_allocator/partition_alloc_base/files/file_path.cc
@@ -10,7 +10,7 @@
 // on build time. Try not to raise this limit unless necessary. See
 // https://chromium.googlesource.com/chromium/src/+/HEAD/docs/wmax_tokens.md
 #ifndef NACL_TC_REV
-#pragma clang max_tokens_here 370000
+#pragma clang max_tokens_here 380000
 #endif
 
 #include <string.h>
diff --git a/base/check_op.cc b/base/check_op.cc
index a226380..dc52479 100644
--- a/base/check_op.cc
+++ b/base/check_op.cc
@@ -8,7 +8,7 @@
 // build time. Try not to raise this limit unless absolutely necessary. See
 // https://chromium.googlesource.com/chromium/src/+/HEAD/docs/wmax_tokens.md
 #ifndef NACL_TC_REV
-#pragma clang max_tokens_here 390000
+#pragma clang max_tokens_here 400000
 #endif
 
 #include <string.h>
diff --git a/base/containers/circular_deque_unittest.cc b/base/containers/circular_deque_unittest.cc
index daf9b8ec..c87f575 100644
--- a/base/containers/circular_deque_unittest.cc
+++ b/base/containers/circular_deque_unittest.cc
@@ -8,7 +8,7 @@
 // impact on build time. Try not to raise this limit unless necessary. See
 // https://chromium.googlesource.com/chromium/src/+/HEAD/docs/wmax_tokens.md
 #ifndef NACL_TC_REV
-#pragma clang max_tokens_here 500000
+#pragma clang max_tokens_here 510000
 #endif
 
 #include "base/test/copy_only_int.h"
diff --git a/base/debug/crash_logging.cc b/base/debug/crash_logging.cc
index d1ad9a68..4d21ab37 100644
--- a/base/debug/crash_logging.cc
+++ b/base/debug/crash_logging.cc
@@ -4,8 +4,10 @@
 
 #include "base/debug/crash_logging.h"
 
-namespace base {
-namespace debug {
+#include "base/strings/string_piece.h"
+#include "build/build_config.h"
+
+namespace base::debug {
 
 namespace {
 
@@ -18,6 +20,24 @@
   if (!g_crash_key_impl)
     return nullptr;
 
+    // TODO(https://crbug.com/1341077): It would be great if the DCHECKs below
+    // could also be enabled on Android, but debugging tryjob failures was a bit
+    // difficult... :-/
+#if DCHECK_IS_ON() && !BUILDFLAG(IS_ANDROID)
+  base::StringPiece name_piece = name;
+
+  // Some `CrashKeyImplementation`s reserve certain characters and disallow
+  // using them in crash key names.  See also https://crbug.com/1341077.
+  DCHECK_EQ(base::StringPiece::npos, name_piece.find(':'))
+      << "; name_piece = " << name_piece;
+
+  // Some `CrashKeyImplementation`s support only short crash key names (e.g. see
+  // the DCHECK in crash_reporter::internal::CrashKeyStringImpl::Set).
+  // Enforcing this restrictions here ensures that crash keys will work for all
+  // `CrashKeyStringImpl`s.
+  DCHECK_LT(name_piece.size(), 40u);
+#endif
+
   return g_crash_key_impl->Allocate(name, value_length);
 }
 
@@ -60,5 +80,4 @@
   g_crash_key_impl = impl.release();
 }
 
-}  // namespace debug
-}  // namespace base
+}  // namespace base::debug
diff --git a/base/feature_list.cc b/base/feature_list.cc
index b9c8d05..6089f3b 100644
--- a/base/feature_list.cc
+++ b/base/feature_list.cc
@@ -8,7 +8,7 @@
 // time. Try not to raise this limit unless necessary. See
 // https://chromium.googlesource.com/chromium/src/+/HEAD/docs/wmax_tokens.md
 #ifndef NACL_TC_REV
-#pragma clang max_tokens_here 600000
+#pragma clang max_tokens_here 610000
 #endif
 
 #include <string>
diff --git a/base/json/json_parser.cc b/base/json/json_parser.cc
index ff3c5054..e053bce 100644
--- a/base/json/json_parser.cc
+++ b/base/json/json_parser.cc
@@ -480,7 +480,7 @@
     return absl::nullopt;
   }
 
-  Value::ListStorage list_storage;
+  Value::List list;
 
   Token token = GetNextToken();
   while (token != T_ARRAY_END) {
@@ -490,7 +490,7 @@
       return absl::nullopt;
     }
 
-    list_storage.push_back(std::move(*item));
+    list.Append(std::move(*item));
 
     token = GetNextToken();
     if (token == T_LIST_SEPARATOR) {
@@ -508,7 +508,7 @@
 
   ConsumeChar();  // Closing ']'.
 
-  return Value(std::move(list_storage));
+  return Value(std::move(list));
 }
 
 absl::optional<Value> JSONParser::ConsumeString() {
diff --git a/base/json/json_perftest.cc b/base/json/json_perftest.cc
index f852ed5..f57c985 100644
--- a/base/json/json_perftest.cc
+++ b/base/json/json_perftest.cc
@@ -37,10 +37,10 @@
   root.Set("String", "Foo");
 
   Value::List list;
-  list.Append(Value(2.718));
-  list.Append(Value(false));
-  list.Append(Value(123));
-  list.Append(Value("Bar"));
+  list.Append(2.718);
+  list.Append(false);
+  list.Append(123);
+  list.Append("Bar");
   root.Set("List", std::move(list));
 
   return root;
diff --git a/base/json/json_writer_unittest.cc b/base/json/json_writer_unittest.cc
index aa4c22b5..f87e1d0a8f 100644
--- a/base/json/json_writer_unittest.cc
+++ b/base/json/json_writer_unittest.cc
@@ -60,15 +60,15 @@
   // Writer unittests like empty list/dict nesting,
   // list list nesting, etc.
   Value::Dict root_dict;
-  Value::List list_storage;
+  Value::List list;
   Value::Dict inner_dict;
   inner_dict.Set("inner int", 10);
-  list_storage.Append(std::move(inner_dict));
+  list.Append(std::move(inner_dict));
   Value::Dict empty_dict;
-  list_storage.Append(std::move(empty_dict));
-  list_storage.Append(Value::List());
-  list_storage.Append(true);
-  root_dict.Set("list", Value(std::move(list_storage)));
+  list.Append(std::move(empty_dict));
+  list.Append(Value::List());
+  list.Append(true);
+  root_dict.Set("list", Value(std::move(list)));
 
   // The pretty-printer uses a different newline style on Windows than on
   // other platforms.
@@ -123,13 +123,12 @@
       root, JSONWriter::OPTIONS_OMIT_BINARY_VALUES, &output_js));
   EXPECT_TRUE(output_js.empty());
 
-  Value::List binary_list_storage;
-  binary_list_storage.Append(Value(kBufferSpan));
-  binary_list_storage.Append(5);
-  binary_list_storage.Append(Value(kBufferSpan));
-  binary_list_storage.Append(2);
-  binary_list_storage.Append(Value(kBufferSpan));
-  Value binary_list(std::move(binary_list_storage));
+  Value::List binary_list;
+  binary_list.Append(Value(kBufferSpan));
+  binary_list.Append(5);
+  binary_list.Append(Value(kBufferSpan));
+  binary_list.Append(2);
+  binary_list.Append(Value(kBufferSpan));
   EXPECT_FALSE(JSONWriter::Write(binary_list, &output_js));
   EXPECT_TRUE(JSONWriter::WriteWithOptions(
       binary_list, JSONWriter::OPTIONS_OMIT_BINARY_VALUES, &output_js));
diff --git a/base/location.cc b/base/location.cc
index d6e7e2b..2be6932 100644
--- a/base/location.cc
+++ b/base/location.cc
@@ -10,7 +10,7 @@
 // build time. Try not to raise this limit unless absolutely necessary. See
 // https://chromium.googlesource.com/chromium/src/+/HEAD/docs/wmax_tokens.md
 #ifndef NACL_TC_REV
-#pragma clang max_tokens_here 390000
+#pragma clang max_tokens_here 390100
 #endif
 
 #if defined(COMPILER_MSVC)
diff --git a/base/logging.cc b/base/logging.cc
index 827565f..625da29 100644
--- a/base/logging.cc
+++ b/base/logging.cc
@@ -10,7 +10,7 @@
 // build time. Try not to raise this limit unless absolutely necessary. See
 // https://chromium.googlesource.com/chromium/src/+/HEAD/docs/wmax_tokens.md
 #ifndef NACL_TC_REV
-#pragma clang max_tokens_here 470000
+#pragma clang max_tokens_here 480000
 #endif  // NACL_TC_REV
 
 #ifdef BASE_CHECK_H_
diff --git a/base/values.cc b/base/values.cc
index 83f941d..bf81e99 100644
--- a/base/values.cc
+++ b/base/values.cc
@@ -8,7 +8,7 @@
 // build time. Try not to raise this limit unless absolutely necessary. See
 // https://chromium.googlesource.com/chromium/src/+/HEAD/docs/wmax_tokens.md
 #ifndef NACL_TC_REV
-#pragma clang max_tokens_here 580000
+#pragma clang max_tokens_here 600000
 #endif
 
 #include <algorithm>
@@ -235,17 +235,6 @@
 
 Value::Value(List&& value) noexcept : data_(std::move(value)) {}
 
-Value::Value(span<const Value> value) : data_(absl::in_place_type_t<List>()) {
-  list().reserve(value.size());
-  for (const auto& val : value)
-    list().emplace_back(val.Clone());
-}
-
-Value::Value(ListStorage&& value) noexcept
-    : data_(absl::in_place_type_t<List>()) {
-  list() = std::move(value);
-}
-
 Value::Value(const LegacyDictStorage& storage)
     : data_(absl::in_place_type_t<Dict>()) {
   dict().reserve(storage.size());
diff --git a/base/values.h b/base/values.h
index e52f0d9..59d3ccfc 100644
--- a/base/values.h
+++ b/base/values.h
@@ -207,8 +207,6 @@
   using BlobStorage = std::vector<uint8_t>;
 
   using DeprecatedListStorage = std::vector<Value>;
-  // TODO(https://crbug.com/1291666): Make this private.
-  using ListStorage = DeprecatedListStorage;
 
   // Like `DictStorage`, but with std::unique_ptr in the mapped type. This is
   // due to legacy reasons, and should be replaced with
@@ -216,8 +214,9 @@
   // anymore.
   using LegacyDictStorage = flat_map<std::string, std::unique_ptr<Value>>;
 
-  using DeprecatedListView = CheckedContiguousRange<ListStorage>;
-  using DeprecatedConstListView = CheckedContiguousConstRange<ListStorage>;
+  using DeprecatedListView = CheckedContiguousRange<DeprecatedListStorage>;
+  using DeprecatedConstListView =
+      CheckedContiguousConstRange<DeprecatedListStorage>;
   // TODO(https://crbug.com/1291666): Make these private.
   using ListView = DeprecatedListView;
   using ConstListView = DeprecatedConstListView;
@@ -302,10 +301,6 @@
   // Constructor for `Value::Type::LIST`.
   explicit Value(List&& value) noexcept;
 
-  // DEPRECATED: prefer `Value(List&&)`.
-  explicit Value(span<const Value> value);
-  explicit Value(ListStorage&& value) noexcept;
-
   ~Value();
 
   // Returns the name for a given `type`.
@@ -1163,6 +1158,10 @@
   }
 
  protected:
+  // TODO(https://crbug.com/1187091): Once deprecated list methods and ListView
+  // have been removed, make this a private member of List.
+  using ListStorage = DeprecatedListStorage;
+
   // Checked convenience accessors for dict and list.
   const LegacyDictStorage& dict() const { return GetDict().storage_; }
   LegacyDictStorage& dict() { return GetDict().storage_; }
diff --git a/base/values_unittest.cc b/base/values_unittest.cc
index 2ed5fcd..e8ec2d7 100644
--- a/base/values_unittest.cc
+++ b/base/values_unittest.cc
@@ -79,9 +79,6 @@
   static_assert(
       std::is_nothrow_constructible<Value, Value::BlobStorage&&>::value,
       "IsNothrowMoveConstructibleFromBlob");
-  static_assert(
-      std::is_nothrow_constructible<Value, Value::ListStorage&&>::value,
-      "IsNothrowMoveConstructibleFromList");
   static_assert(std::is_nothrow_move_assignable<Value>::value,
                 "IsNothrowMoveAssignable");
 }
@@ -352,9 +349,9 @@
 }
 
 TEST(ValuesTest, CopyList) {
-  Value::ListStorage storage;
-  storage.emplace_back(123);
-  Value value(std::move(storage));
+  Value::List list;
+  list.Append(123);
+  Value value(std::move(list));
 
   Value copied_value(value.Clone());
   EXPECT_EQ(value, copied_value);
@@ -472,15 +469,15 @@
 }
 
 TEST(ValuesTest, MoveList) {
-  Value::ListStorage storage;
-  storage.emplace_back(123);
-  Value value(storage);
+  Value::List list;
+  list.Append(123);
+  Value value(list.Clone());
   Value moved_value(std::move(value));
   EXPECT_EQ(Value::Type::LIST, moved_value.type());
   EXPECT_EQ(123, moved_value.GetListDeprecated().back().GetInt());
 
   Value blank;
-  blank = Value(std::move(storage));
+  blank = Value(std::move(list));
   EXPECT_EQ(Value::Type::LIST, blank.type());
   EXPECT_EQ(123, blank.GetListDeprecated().back().GetInt());
 }
@@ -1668,10 +1665,10 @@
   Value* binary_weak =
       original_dict.SetKey("binary", Value(Value::BlobStorage(42, '!')));
 
-  Value::ListStorage storage;
-  storage.emplace_back(0);
-  storage.emplace_back(1);
-  Value* list_weak = original_dict.SetKey("list", Value(std::move(storage)));
+  Value::List list;
+  list.Append(0);
+  list.Append(1);
+  Value* list_weak = original_dict.SetKey("list", Value(std::move(list)));
 
   Value* dict_weak = original_dict.SetKey(
       "dictionary", base::Value(base::Value::Type::DICTIONARY));
@@ -2007,10 +2004,10 @@
   Value* binary_weak =
       original_dict.SetKey("binary", Value(Value::BlobStorage(42, '!')));
 
-  Value::ListStorage storage;
-  storage.emplace_back(0);
-  storage.emplace_back(1);
-  Value* list_weak = original_dict.SetKey("list", Value(std::move(storage)));
+  Value::List list;
+  list.Append(0);
+  list.Append(1);
+  Value* list_weak = original_dict.SetKey("list", Value(std::move(list)));
 
   auto copy_dict = std::make_unique<Value>(original_dict.Clone());
   auto copy_null = std::make_unique<Value>(null_weak->Clone());
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index b6aaae9..437e8b94 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -152,6 +152,7 @@
   # so only enable them by default for mainstream build configs.
   enable_wmax_tokens =
       !is_official_build && !(is_component_build && !is_debug) &&
+      !using_sanitizer &&
       ((is_mac && target_cpu == "x64" && !use_system_xcode) ||
        (is_linux && target_cpu == "x64") || (is_win && target_cpu == "x86") ||
        (is_win && target_cpu == "x64") || (is_android && target_cpu == "arm") ||
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1
index e12ed82..a3f040c 100644
--- a/build/fuchsia/linux_internal.sdk.sha1
+++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@
-9.20220721.1.1
+9.20220721.3.1
diff --git a/buildtools/deps_revisions.gni b/buildtools/deps_revisions.gni
index 9f6e954..2c33d945 100644
--- a/buildtools/deps_revisions.gni
+++ b/buildtools/deps_revisions.gni
@@ -5,5 +5,5 @@
 declare_args() {
   # Used to cause full rebuilds on libc++ rolls. This should be kept in sync
   # with the libcxx_revision vars in //DEPS.
-  libcxx_revision = "88bf4070487fbe9020697a2281743b91e5e29bef"
+  libcxx_revision = "3e55cfbd1a91efb882b2e2c7b69c2daabb2d145a"
 }
diff --git a/chrome/MAJOR_BRANCH_DATE b/chrome/MAJOR_BRANCH_DATE
index 9466b00..acef1f5 100644
--- a/chrome/MAJOR_BRANCH_DATE
+++ b/chrome/MAJOR_BRANCH_DATE
@@ -1 +1 @@
-MAJOR_BRANCH_DATE=2022-06-10
+MAJOR_BRANCH_DATE=2022-07-22
diff --git a/chrome/VERSION b/chrome/VERSION
index 070a424..9b5c631 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
-MAJOR=105
+MAJOR=106
 MINOR=0
-BUILD=5195
+BUILD=5196
 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 55acb61e..7c56c68 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -1216,6 +1216,7 @@
     "//third_party/androidx:androidx_mediarouter_mediarouter_java",
     "//third_party/androidx:androidx_swiperefreshlayout_swiperefreshlayout_java",
     "//third_party/androidx:androidx_test_core_java",
+    "//third_party/androidx:androidx_test_ext_junit_java",
     "//third_party/androidx:androidx_test_runner_java",
     "//third_party/blink/public:blink_headers_java",
     "//third_party/blink/public/mojom:android_mojo_bindings_java",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java
index 145ffe2..02cf212 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.media;
 
 import android.annotation.SuppressLint;
+import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.ActivityOptions;
 import android.app.PendingIntent;
@@ -28,6 +29,7 @@
 import androidx.annotation.RequiresApi;
 import androidx.annotation.VisibleForTesting;
 
+import org.chromium.base.ApplicationStatus;
 import org.chromium.base.BuildInfo;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.IntentUtils;
@@ -44,6 +46,7 @@
 import org.chromium.components.thinwebview.ThinWebViewConstraints;
 import org.chromium.content_public.browser.MediaSession;
 import org.chromium.content_public.browser.MediaSessionObserver;
+import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.base.ActivityWindowAndroid;
 import org.chromium.ui.base.WindowAndroid;
 
@@ -60,6 +63,12 @@
     private static final String ACTION_PLAY =
             "org.chromium.chrome.browser.media.PictureInPictureActivity.Play";
 
+    // Use for passing unique window id to each PictureInPictureActivity instance.
+    private static final String NATIVE_POINTER_KEY =
+            "org.chromium.chrome.browser.media.PictureInPictureActivity.NativePointer";
+    // Used for passing webcontents to PictureInPictureActivity.
+    private static final String WEB_CONTENTS_KEY =
+            "org.chromium.chrome.browser.media.PictureInPicture.WebContents";
     // If present, it indicates that the intent launches into PiP.
     public static final String LAUNCHED_KEY = "com.android.chrome.pictureinpicture.launched";
     // If present, these provide our aspect ratio hint.
@@ -71,10 +80,12 @@
     private static final float MAX_ASPECT_RATIO = 2.39f;
     private static final float MIN_ASPECT_RATIO = 1 / 2.39f;
 
-    private static long sNativeOverlayWindowAndroid;
-    private static Tab sInitiatorTab;
-    private static int sInitiatorTabTaskID;
-    private static InitiatorTabObserver sTabObserver;
+    private static long sPendingNativeOverlayWindowAndroid;
+
+    private long mNativeOverlayWindowAndroid;
+
+    private Tab mInitiatorTab;
+    private InitiatorTabObserver mTabObserver;
 
     // Used to verify Pre-T that the broadcast sender was Chrome. This extra can be removed when the
     // min supported version is Android T.
@@ -90,10 +101,16 @@
     // Maximum pip width, in pixels, to prevent resizes that are too big.
     private int mMaxWidth;
 
-    private BroadcastReceiver mMediaSessionReceiver = new BroadcastReceiver() {
+    private MediaSessionBroadcastReceiver mMediaSessionReceiver;
+
+    private class MediaSessionBroadcastReceiver extends BroadcastReceiver {
         @Override
         public void onReceive(Context context, Intent intent) {
-            if (sNativeOverlayWindowAndroid == 0) return;
+            long nativeOverlayWindowAndroid = intent.getLongExtra(NATIVE_POINTER_KEY, 0);
+            if (nativeOverlayWindowAndroid != mNativeOverlayWindowAndroid
+                    || mNativeOverlayWindowAndroid == 0) {
+                return;
+            }
 
             if (intent.getAction() == null || !intent.getAction().equals(ACTION_PLAY)) return;
             if (!intent.hasExtra(EXTRA_RECEIVER_TOKEN)
@@ -101,39 +118,19 @@
                 return;
             }
 
-            PictureInPictureActivityJni.get().play(sNativeOverlayWindowAndroid);
+            PictureInPictureActivityJni.get().play(nativeOverlayWindowAndroid);
         }
     };
 
-    private static class InitiatorTabObserver extends EmptyTabObserver {
-        private enum Status { OK, DESTROYED }
-        private PictureInPictureActivity mActivity;
-        private Status mStatus;
-
-        InitiatorTabObserver() {
-            mStatus = Status.OK;
-        }
-
-        public void setActivity(PictureInPictureActivity activity) {
-            mActivity = activity;
-        }
-
-        public Status getStatus() {
-            return mStatus;
-        }
-
+    private class InitiatorTabObserver extends EmptyTabObserver {
         @Override
         public void onDestroyed(Tab tab) {
-            if (tab.isClosing() || !isInitiatorTabAlive()) {
-                mStatus = Status.DESTROYED;
-                if (mActivity != null) mActivity.finish();
-            }
+            if (tab.isClosing()) PictureInPictureActivity.this.finish();
         }
 
         @Override
         public void onCrash(Tab tab) {
-            mStatus = Status.DESTROYED;
-            if (mActivity != null) mActivity.finish();
+            PictureInPictureActivity.this.finish();
         }
     }
 
@@ -204,7 +201,7 @@
             @Override
             public void onLayoutChange(View v, int left, int top, int right, int bottom,
                     int oldLeft, int oldTop, int oldRight, int oldBottom) {
-                if (sNativeOverlayWindowAndroid == 0) return;
+                if (mNativeOverlayWindowAndroid == 0) return;
                 // We sometimes get an initial update of zero before getting something reasonable.
                 if (top == bottom || left == right) return;
 
@@ -214,12 +211,12 @@
                 if (width > mMaxWidth) return;
 
                 PictureInPictureActivityJni.get().onViewSizeChanged(
-                        sNativeOverlayWindowAndroid, width, bottom - top);
+                        mNativeOverlayWindowAndroid, width, bottom - top);
             }
         });
 
         PictureInPictureActivityJni.get().compositorViewCreated(
-                sNativeOverlayWindowAndroid, mCompositorView);
+                mNativeOverlayWindowAndroid, mCompositorView);
     }
 
     @Override
@@ -232,25 +229,34 @@
     public void onStart() {
         super.onStart();
 
+        final Intent intent = getIntent();
+        mNativeOverlayWindowAndroid = intent.getLongExtra(NATIVE_POINTER_KEY, 0);
+
+        intent.setExtrasClassLoader(WebContents.class.getClassLoader());
+        mInitiatorTab = TabUtils.fromWebContents(intent.getParcelableExtra(WEB_CONTENTS_KEY));
+
         // Finish the activity if OverlayWindowAndroid has already been destroyed
         // or InitiatorTab has been destroyed by user or crashed.
-        if (sNativeOverlayWindowAndroid == 0
-                || sTabObserver.getStatus() == InitiatorTabObserver.Status.DESTROYED) {
+        if (mNativeOverlayWindowAndroid != sPendingNativeOverlayWindowAndroid
+                || !isInitiatorTabAlive()) {
             this.finish();
             return;
         }
+        sPendingNativeOverlayWindowAndroid = 0;
 
-        sTabObserver.setActivity(this);
+        mTabObserver = new InitiatorTabObserver();
+        mInitiatorTab.addObserver(mTabObserver);
 
+        mMediaSessionReceiver = new MediaSessionBroadcastReceiver();
         ContextUtils.registerNonExportedBroadcastReceiver(
                 this, mMediaSessionReceiver, new IntentFilter(ACTION_PLAY));
 
         PictureInPictureActivityJni.get().onActivityStart(
-                sNativeOverlayWindowAndroid, this, getWindowAndroid());
+                mNativeOverlayWindowAndroid, this, getWindowAndroid());
 
         // Add an observer to refresh the Picture-in-Picture params if the media
         // session state changes.
-        MediaSession mediaSession = MediaSession.fromWebContents(sInitiatorTab.getWebContents());
+        MediaSession mediaSession = MediaSession.fromWebContents(mInitiatorTab.getWebContents());
         mMediaSessionObserver = new MediaSessionObserver(mediaSession) {
             @Override
             public void mediaSessionStateChanged(boolean isControllable, boolean isSuspended) {
@@ -259,7 +265,6 @@
         };
 
         // See if there are PiP hints in the extras.
-        final Intent intent = getIntent();
         Size size = new Size(
                 intent.getIntExtra(SOURCE_WIDTH_KEY, 0), intent.getIntExtra(SOURCE_HEIGHT_KEY, 0));
         if (size.getWidth() > 0 && size.getHeight() > 0) {
@@ -282,17 +287,22 @@
     @Override
     public void onDestroy() {
         super.onDestroy();
-        sNativeOverlayWindowAndroid = 0;
-        sInitiatorTab.removeObserver(sTabObserver);
-        sInitiatorTab = null;
-        sTabObserver = null;
+
+        if (mMediaSessionReceiver != null) {
+            unregisterReceiver(mMediaSessionReceiver);
+            mMediaSessionReceiver = null;
+        }
 
         if (mMediaSessionObserver != null) {
             mMediaSessionObserver.stopObserving();
             mMediaSessionObserver = null;
         }
 
-        unregisterReceiver(mMediaSessionReceiver);
+        if (mInitiatorTab != null) {
+            mInitiatorTab.removeObserver(mTabObserver);
+            mInitiatorTab = null;
+        }
+        mTabObserver = null;
     }
 
     @Override
@@ -301,9 +311,7 @@
             boolean isInPictureInPictureMode, Configuration newConfig) {
         super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);
         if (isInPictureInPictureMode) return;
-        if (sNativeOverlayWindowAndroid != 0) {
-            PictureInPictureActivityJni.get().onBackToTab(sNativeOverlayWindowAndroid);
-        }
+        PictureInPictureActivityJni.get().onBackToTab(mNativeOverlayWindowAndroid);
         this.finish();
     }
 
@@ -314,12 +322,16 @@
     }
 
     @SuppressLint("NewApi")
-    private static boolean isInitiatorTabAlive() {
+    private boolean isInitiatorTabAlive() {
+        if (mInitiatorTab == null) return false;
+
         ActivityManager activityManager =
                 (ActivityManager) ContextUtils.getApplicationContext().getSystemService(
                         Context.ACTIVITY_SERVICE);
         for (ActivityManager.AppTask appTask : activityManager.getAppTasks()) {
-            if (appTask.getTaskInfo().id == sInitiatorTabTaskID) return true;
+            if (appTask.getTaskInfo().id == TabUtils.getActivity(mInitiatorTab).getTaskId()) {
+                return true;
+            }
         }
 
         return false;
@@ -342,6 +354,7 @@
                 && mIsPlayPauseVisible) {
             Intent intent = new Intent(ACTION_PLAY);
             intent.putExtra(EXTRA_RECEIVER_TOKEN, mMediaSessionReceiver.hashCode());
+            intent.putExtra(NATIVE_POINTER_KEY, mNativeOverlayWindowAndroid);
             PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0,
                     intent, IntentUtils.getPendingIntentMutabilityFlag(false));
 
@@ -392,6 +405,14 @@
         updatePictureInPictureParams();
     }
 
+    private long getNativeOverlayWindowAndroid() {
+        return mNativeOverlayWindowAndroid;
+    }
+
+    private void resetNativeOverlayWindowAndroid() {
+        mNativeOverlayWindowAndroid = 0;
+    }
+
     @VisibleForTesting
     /* package */ Rational getAspectRatio() {
         return mAspectRatio;
@@ -401,25 +422,23 @@
     public static void createActivity(long nativeOverlayWindowAndroid, Object initiatorTab,
             int sourceX, int sourceY, int sourceWidth, int sourceHeight) {
         // Dissociate OverlayWindowAndroid if there is one already.
-        if (sNativeOverlayWindowAndroid != 0) {
-            PictureInPictureActivityJni.get().destroy(sNativeOverlayWindowAndroid);
+        if (sPendingNativeOverlayWindowAndroid != 0) {
+            PictureInPictureActivityJni.get().destroy(sPendingNativeOverlayWindowAndroid);
         }
 
-        sNativeOverlayWindowAndroid = nativeOverlayWindowAndroid;
-        sInitiatorTab = (Tab) initiatorTab;
-        sInitiatorTabTaskID = TabUtils.getActivity(sInitiatorTab).getTaskId();
+        sPendingNativeOverlayWindowAndroid = nativeOverlayWindowAndroid;
 
         Context activityContext = null;
-        final WindowAndroid window = sInitiatorTab.getWindowAndroid();
+        final WindowAndroid window = ((Tab) initiatorTab).getWindowAndroid();
         if (window != null) {
             activityContext = window.getActivity().get();
         }
         Context context =
                 (activityContext != null) ? activityContext : ContextUtils.getApplicationContext();
         Intent intent = new Intent(context, PictureInPictureActivity.class);
+        intent.putExtra(WEB_CONTENTS_KEY, ((Tab) initiatorTab).getWebContents());
 
-        sTabObserver = new InitiatorTabObserver();
-        sInitiatorTab.addObserver(sTabObserver);
+        intent.putExtra(NATIVE_POINTER_KEY, nativeOverlayWindowAndroid);
 
         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         Bundle optionsBundle = null;
@@ -454,9 +473,19 @@
 
     @CalledByNative
     private static void onWindowDestroyed(long nativeOverlayWindowAndroid) {
-        if (sNativeOverlayWindowAndroid != nativeOverlayWindowAndroid) return;
+        if (nativeOverlayWindowAndroid == sPendingNativeOverlayWindowAndroid) {
+            sPendingNativeOverlayWindowAndroid = 0;
+        }
 
-        sNativeOverlayWindowAndroid = 0;
+        for (Activity activity : ApplicationStatus.getRunningActivities()) {
+            if (!(activity instanceof PictureInPictureActivity)) continue;
+
+            PictureInPictureActivity pipActivity = (PictureInPictureActivity) activity;
+            if (nativeOverlayWindowAndroid == pipActivity.getNativeOverlayWindowAndroid()) {
+                pipActivity.resetNativeOverlayWindowAndroid();
+                pipActivity.finish();
+            }
+        }
     }
 
     // Allow tests to mock out our LaunchIntoPipHelper.  Returns the outgoing one.
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/history/HistoryUITest.java b/chrome/android/junit/src/org/chromium/chrome/browser/history/HistoryUITest.java
index 62d07fe..a7a63c31 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/history/HistoryUITest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/history/HistoryUITest.java
@@ -27,8 +27,8 @@
 
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.recyclerview.widget.RecyclerView.ViewHolder;
-import androidx.test.core.app.ActivityScenario;
 import androidx.test.espresso.intent.matcher.IntentMatchers;
+import androidx.test.ext.junit.rules.ActivityScenarioRule;
 import androidx.test.filters.SmallTest;
 
 import com.google.android.material.tabs.TabLayout;
@@ -101,8 +101,10 @@
     public TestRule mProcessor = new Features.JUnitProcessor();
     @Rule
     public JniMocker mJniMocker = new JniMocker();
+    @Rule
+    public ActivityScenarioRule<TestActivity> mActivityScenarioRule =
+            new ActivityScenarioRule<>(TestActivity.class);
 
-    private ActivityScenario<TestActivity> mActivityScenario;
     private StubbedHistoryProvider mHistoryProvider;
     private HistoryAdapter mAdapter;
     private HistoryManager mHistoryManager;
@@ -161,8 +163,7 @@
         IncognitoUtils.setEnabledForTesting(true);
         TemplateUrlServiceFactory.setInstanceForTesting(mTemplateUrlService);
         HistoryClustersBridge.setInstanceForTesting(mHistoryClustersBridge);
-        mActivityScenario = ActivityScenario.launch(TestActivity.class)
-                                    .onActivity(activity -> mActivity = activity);
+        mActivityScenarioRule.getScenario().onActivity(activity -> mActivity = activity);
         mHistoryManager = new HistoryManager(mActivity, true, mSnackbarManager, false,
                 /* Supplier<Tab>= */ null, false, null, mHistoryProvider);
         mHistoryClustersCoordinator = mHistoryManager.getHistoryClustersCoordinatorForTests();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateControllerTest.java
index e22e527b..13d8bf6 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateControllerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateControllerTest.java
@@ -29,7 +29,6 @@
 import org.robolectric.annotation.Config;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
-import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.MaxAndroidSdkLevel;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
 
@@ -93,7 +92,6 @@
     }
 
     @Test
-    @DisabledTest(message = "https://crbug.com/1338271")
     public void testUpdateNightMode_PowerSaveMode_DefaultsToSystem() {
         // Set preference to system default and verify that the night mode isn't enabled.
         SharedPreferencesManager.getInstance().writeInt(UI_THEME_SETTING, ThemeType.SYSTEM_DEFAULT);
@@ -111,7 +109,6 @@
     @Test
     @MaxAndroidSdkLevel(value = Build.VERSION_CODES.P,
             reason = "Default to light parameter is only applicable pre-Q.")
-    @DisabledTest(message = "https://crbug.com/1338271")
     public void
     testUpdateNightMode_PowerSaveMode_DefaultsToLight() {
         // Enable power save mode and verify night mode is not enabled.
@@ -120,7 +117,6 @@
     }
 
     @Test
-    @DisabledTest(message = "https://crbug.com/1338271")
     public void testUpdateNightMode_SystemNightMode_DefaultsToSystem() {
         // Set preference to system default and verify that the night mode isn't enabled.
         SharedPreferencesManager.getInstance().writeInt(UI_THEME_SETTING, ThemeType.SYSTEM_DEFAULT);
@@ -138,7 +134,6 @@
     @Test
     @MaxAndroidSdkLevel(value = Build.VERSION_CODES.P,
             reason = "Default to light parameter is only applicable pre-Q.")
-    @DisabledTest(message = "https://crbug.com/1338271")
     public void
     testUpdateNightMode_SystemNightMode_DefaultsToLight() {
         // Enable system night mode and verify night mode is not enabled.
@@ -147,7 +142,6 @@
     }
 
     @Test
-    @DisabledTest(message = "https://crbug.com/1338271")
     public void testUpdateNightMode_Preference() {
         // Set preference to dark theme and verify night mode is enabled.
         SharedPreferencesManager.getInstance().writeInt(UI_THEME_SETTING, ThemeType.DARK);
@@ -167,7 +161,6 @@
     }
 
     @Test
-    @DisabledTest(message = "https://crbug.com/1338271")
     public void testStopAndRestart() {
         // Simulate to stop listening to night mode state changes. Verify that night mode state is
         // not changed.
@@ -199,7 +192,6 @@
     }
 
     @Test
-    @DisabledTest(message = "https://crbug.com/1338271")
     public void testObserver() {
         mGlobalNightModeStateController.addObserver(mObserver);
 
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 09c7b1f..22de9089 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -13333,8 +13333,8 @@
     <message name="IDS_PRIVACY_SANDBOX_DIALOG_CONSENT_BODY_HEADER_1"  desc="1 of 2 subtitles on the page. We want to write for users who skim the page. That means that the page title, the sub titles, and the button label all work well together as a mini story: 1) Help us build a more private web How? 2) Limit sharing between sites 3) More control over the ads you see 4) Yes, I’ll try it">
       Limited sharing between sites
     </message>
-    <message name="IDS_PRIVACY_SANDBOX_BUBBLE_NOTICE_DESCRIPTION" desc="The body text of the bubble. * “During the trials”: The trials happen in addition to today’s current system (which is based on third-party cookies). In other words, even by agreeing to or remaining in a trial, the user’s core experience doesn’t change much. This is an experiment, and we need the user to understand as much. ">
-      During trials, Chrome is exploring ways to limit spam, fraud, and sharing between sites. Chrome also <ph name="ESTIMATE_INTERESTS_LINK">$1<ex>estimates your interests</ex></ph> that sites can use to show you ads. You can manage your interests in settings.
+    <message name="IDS_PRIVACY_SANDBOX_BUBBLE_NOTICE_DESCRIPTION" desc="The body text of the bubble. * “ad spam”: spam related to web advertising">
+      Chrome is exploring ways to limit ad spam, fraud, and sharing between sites. Chrome also <ph name="ESTIMATE_INTERESTS_LINK">$1<ex>estimates your interests</ex></ph> that sites can use to show you ads. You can manage your interests in settings.
     </message>
     <message name="IDS_PRIVACY_SANDBOX_BUBBLE_NOTICE_SETTINGS_LINK" desc="The user can choose “Go to settings” to visit chrome://settings/privacySandbox. If they do, they’ll find the toggle on for Sandbox trials, which include everything they’ve read above. They can leave trials on or turn them off on this page. Choosing “Go to settings”, the user will navigate away from this page and won’t be able to return here.">
       Go to settings
diff --git a/chrome/app/generated_resources_grd/IDS_PRIVACY_SANDBOX_BUBBLE_NOTICE_DESCRIPTION.png.sha1 b/chrome/app/generated_resources_grd/IDS_PRIVACY_SANDBOX_BUBBLE_NOTICE_DESCRIPTION.png.sha1
index b8a6c5d..cbacdf0 100644
--- a/chrome/app/generated_resources_grd/IDS_PRIVACY_SANDBOX_BUBBLE_NOTICE_DESCRIPTION.png.sha1
+++ b/chrome/app/generated_resources_grd/IDS_PRIVACY_SANDBOX_BUBBLE_NOTICE_DESCRIPTION.png.sha1
@@ -1 +1 @@
-ff7a1754ecdd3a4ecc3032fbb24bd9f4b71996ca
\ No newline at end of file
+7650a622362ae8d000e8515b206d09d7770d945f
\ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index ef07cd4..978d215 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1320,22 +1320,6 @@
     "prefetch/prefetch_proxy/prefetch_type.h",
     "prefetch/prefetch_proxy/prefetched_mainframe_response_container.cc",
     "prefetch/prefetch_proxy/prefetched_mainframe_response_container.h",
-    "prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.cc",
-    "prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.h",
-    "prefetch/search_prefetch/field_trial_settings.cc",
-    "prefetch/search_prefetch/field_trial_settings.h",
-    "prefetch/search_prefetch/search_prefetch_request.cc",
-    "prefetch/search_prefetch/search_prefetch_request.h",
-    "prefetch/search_prefetch/search_prefetch_service.cc",
-    "prefetch/search_prefetch/search_prefetch_service.h",
-    "prefetch/search_prefetch/search_prefetch_service_factory.cc",
-    "prefetch/search_prefetch/search_prefetch_service_factory.h",
-    "prefetch/search_prefetch/search_prefetch_url_loader.cc",
-    "prefetch/search_prefetch/search_prefetch_url_loader.h",
-    "prefetch/search_prefetch/search_prefetch_url_loader_interceptor.cc",
-    "prefetch/search_prefetch/search_prefetch_url_loader_interceptor.h",
-    "prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc",
-    "prefetch/search_prefetch/streaming_search_prefetch_url_loader.h",
     "prefs/browser_prefs.cc",
     "prefs/browser_prefs.h",
     "prefs/chrome_command_line_pref_store.cc",
@@ -1374,6 +1358,22 @@
     "preloading/prefetch/no_state_prefetch/no_state_prefetch_navigation_throttle.h",
     "preloading/prefetch/no_state_prefetch/no_state_prefetch_tab_helper.cc",
     "preloading/prefetch/no_state_prefetch/no_state_prefetch_tab_helper.h",
+    "preloading/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.cc",
+    "preloading/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.h",
+    "preloading/prefetch/search_prefetch/field_trial_settings.cc",
+    "preloading/prefetch/search_prefetch/field_trial_settings.h",
+    "preloading/prefetch/search_prefetch/search_prefetch_request.cc",
+    "preloading/prefetch/search_prefetch/search_prefetch_request.h",
+    "preloading/prefetch/search_prefetch/search_prefetch_service.cc",
+    "preloading/prefetch/search_prefetch/search_prefetch_service.h",
+    "preloading/prefetch/search_prefetch/search_prefetch_service_factory.cc",
+    "preloading/prefetch/search_prefetch/search_prefetch_service_factory.h",
+    "preloading/prefetch/search_prefetch/search_prefetch_url_loader.cc",
+    "preloading/prefetch/search_prefetch/search_prefetch_url_loader.h",
+    "preloading/prefetch/search_prefetch/search_prefetch_url_loader_interceptor.cc",
+    "preloading/prefetch/search_prefetch/search_prefetch_url_loader_interceptor.h",
+    "preloading/prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc",
+    "preloading/prefetch/search_prefetch/streaming_search_prefetch_url_loader.h",
     "preloading/prerender/prerender_manager.cc",
     "preloading/prerender/prerender_manager.h",
     "preloading/prerender/prerender_utils.cc",
@@ -5069,6 +5069,7 @@
       "//ash/components/arc/mojom",
       "//ash/components/arc/mojom",
       "//ash/components/audio",
+      "//ash/components/audio/public/mojom",
       "//ash/components/device_activity:device_activity",
       "//ash/components/geolocation",
       "//ash/components/login/session",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 31846374..b92cadd9 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -8555,6 +8555,13 @@
 #endif
 
 #if !BUILDFLAG(IS_ANDROID)
+    {"enable-tailored-security-desktop-notice",
+     flag_descriptions::kTailoredSecurityDesktopNoticeName,
+     flag_descriptions::kTailoredSecurityDesktopNoticeDescription, kOsDesktop,
+     FEATURE_VALUE_TYPE(safe_browsing::kTailoredSecurityDesktopNotice)},
+#endif
+
+#if !BUILDFLAG(IS_ANDROID)
     {"screen-ai", flag_descriptions::kScreenAIName,
      flag_descriptions::kScreenAIDescription, kOsDesktop,
      FEATURE_VALUE_TYPE(features::kScreenAI)},
diff --git a/chrome/browser/android/omnibox/omnibox_prerender.cc b/chrome/browser/android/omnibox/omnibox_prerender.cc
index 629a9372..004c8aa 100644
--- a/chrome/browser/android/omnibox/omnibox_prerender.cc
+++ b/chrome/browser/android/omnibox/omnibox_prerender.cc
@@ -12,8 +12,8 @@
 #include "chrome/browser/predictors/autocomplete_action_predictor_factory.h"
 #include "chrome/browser/predictors/loading_predictor.h"
 #include "chrome/browser/predictors/loading_predictor_factory.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service_factory.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_factory.h"
 #include "chrome/browser/preloading/prerender/prerender_manager.h"
 #include "chrome/browser/preloading/prerender/prerender_utils.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/apps/app_service/publishers/app_publisher.cc b/chrome/browser/apps/app_service/publishers/app_publisher.cc
index f77454f6..33cb51f 100644
--- a/chrome/browser/apps/app_service/publishers/app_publisher.cc
+++ b/chrome/browser/apps/app_service/publishers/app_publisher.cc
@@ -42,7 +42,20 @@
 void AppPublisher::RegisterPublisher(AppType app_type) {
   proxy_->RegisterPublisher(app_type, this);
 }
+#endif
 
+void AppPublisher::LaunchAppWithIntent(
+    const std::string& app_id,
+    int32_t event_flags,
+    IntentPtr intent,
+    LaunchSource launch_source,
+    WindowInfoPtr window_info,
+    base::OnceCallback<void(bool)> callback) {
+  NOTIMPLEMENTED();
+  std::move(callback).Run(/*success=*/false);
+}
+
+#if !BUILDFLAG(IS_CHROMEOS_LACROS)
 void AppPublisher::Publish(AppPtr app) {
   if (!proxy_) {
     NOTREACHED();
diff --git a/chrome/browser/apps/app_service/publishers/app_publisher.h b/chrome/browser/apps/app_service/publishers/app_publisher.h
index 0652ab3..2e9df3758 100644
--- a/chrome/browser/apps/app_service/publishers/app_publisher.h
+++ b/chrome/browser/apps/app_service/publishers/app_publisher.h
@@ -85,6 +85,15 @@
                       LaunchSource launch_source,
                       WindowInfoPtr window_info) = 0;
 
+  // Launches an app with `app_id` and Chrome OS generic `intent` irrespective
+  // of app platform. Returns whether the app was successfully launched.
+  virtual void LaunchAppWithIntent(const std::string& app_id,
+                                   int32_t event_flags,
+                                   IntentPtr intent,
+                                   LaunchSource launch_source,
+                                   WindowInfoPtr window_info,
+                                   base::OnceCallback<void(bool)> callback);
+
   // Launches an app with |params|.
   //
   // Publishers implementing this method should:
diff --git a/chrome/browser/apps/app_service/publishers/arc_apps.h b/chrome/browser/apps/app_service/publishers/arc_apps.h
index c51b96a..45b2b8d 100644
--- a/chrome/browser/apps/app_service/publishers/arc_apps.h
+++ b/chrome/browser/apps/app_service/publishers/arc_apps.h
@@ -115,7 +115,7 @@
                            IntentPtr intent,
                            LaunchSource launch_source,
                            WindowInfoPtr window_info,
-                           base::OnceCallback<void(bool)> callback);
+                           base::OnceCallback<void(bool)> callback) override;
   void LaunchAppWithParams(AppLaunchParams&& params,
                            LaunchCallback callback) override;
   void LaunchShortcut(const std::string& app_id,
diff --git a/chrome/browser/apps/app_service/publishers/crostini_apps.cc b/chrome/browser/apps/app_service/publishers/crostini_apps.cc
index 237dbcb..0906f188 100644
--- a/chrome/browser/apps/app_service/publishers/crostini_apps.cc
+++ b/chrome/browser/apps/app_service/publishers/crostini_apps.cc
@@ -118,6 +118,25 @@
       window_info ? window_info->display_id : display::kInvalidDisplayId);
 }
 
+void CrostiniApps::LaunchAppWithIntent(
+    const std::string& app_id,
+    int32_t event_flags,
+    IntentPtr intent,
+    LaunchSource launch_source,
+    WindowInfoPtr window_info,
+    base::OnceCallback<void(bool)> callback) {
+  crostini::LaunchCrostiniAppWithIntent(
+      profile_, app_id,
+      window_info ? window_info->display_id : display::kInvalidDisplayId,
+      std::move(intent), /*args=*/{},
+      base::BindOnce(
+          [](LaunchAppWithIntentCallback callback, bool success,
+             const std::string& failure_reason) {
+            std::move(callback).Run(success);
+          },
+          std::move(callback)));
+}
+
 void CrostiniApps::LaunchAppWithParams(AppLaunchParams&& params,
                                        LaunchCallback callback) {
   auto event_flags = apps::GetEventFlags(params.disposition,
diff --git a/chrome/browser/apps/app_service/publishers/crostini_apps.h b/chrome/browser/apps/app_service/publishers/crostini_apps.h
index 0bd7451..5e9ed20 100644
--- a/chrome/browser/apps/app_service/publishers/crostini_apps.h
+++ b/chrome/browser/apps/app_service/publishers/crostini_apps.h
@@ -66,6 +66,12 @@
               int32_t event_flags,
               LaunchSource launch_source,
               WindowInfoPtr window_info) override;
+  void LaunchAppWithIntent(const std::string& app_id,
+                           int32_t event_flags,
+                           IntentPtr intent,
+                           LaunchSource launch_source,
+                           WindowInfoPtr window_info,
+                           base::OnceCallback<void(bool)> callback) override;
   void LaunchAppWithParams(AppLaunchParams&& params,
                            LaunchCallback callback) override;
 
diff --git a/chrome/browser/apps/app_service/publishers/extension_apps_base.cc b/chrome/browser/apps/app_service/publishers/extension_apps_base.cc
index e7d3f09..fcd223b 100644
--- a/chrome/browser/apps/app_service/publishers/extension_apps_base.cc
+++ b/chrome/browser/apps/app_service/publishers/extension_apps_base.cc
@@ -306,10 +306,10 @@
 content::WebContents* ExtensionAppsBase::LaunchAppWithIntentImpl(
     const std::string& app_id,
     int32_t event_flags,
-    apps::mojom::IntentPtr intent,
-    apps::mojom::LaunchSource launch_source,
-    apps::mojom::WindowInfoPtr window_info,
-    LaunchAppWithIntentCallback callback) {
+    IntentPtr intent,
+    LaunchSource launch_source,
+    WindowInfoPtr window_info,
+    base::OnceCallback<void(bool)> callback) {
   const auto* extension = MaybeGetExtension(app_id);
   if (!extension || !extensions::util::IsAppLaunchable(app_id, profile_)) {
     std::move(callback).Run(/*success=*/false);
@@ -319,7 +319,7 @@
   if (!extensions::util::IsAppLaunchableWithoutEnabling(app_id, profile_)) {
     RunExtensionEnableFlow(
         app_id,
-        base::BindOnce(&ExtensionAppsBase::LaunchAppWithIntentMojom,
+        base::BindOnce(&ExtensionAppsBase::LaunchAppWithIntentWhenEnabled,
                        weak_factory_.GetWeakPtr(), app_id, event_flags,
                        std::move(intent), launch_source, std::move(window_info),
                        CallbackWrapper(std::move(callback))));
@@ -327,12 +327,11 @@
   }
 
   auto params = apps::CreateAppLaunchParamsForIntent(
-      app_id, event_flags,
-      ConvertMojomLaunchSourceToLaunchSource(launch_source),
+      app_id, event_flags, launch_source,
       window_info ? window_info->display_id : display::kInvalidDisplayId,
       extensions::GetLaunchContainer(extensions::ExtensionPrefs::Get(profile_),
                                      extension),
-      ConvertMojomIntentToIntent(intent), profile_);
+      std::move(intent), profile_);
   std::move(callback).Run(/*success=*/true);
   return LaunchImpl(std::move(params));
 }
@@ -502,6 +501,17 @@
   LaunchImpl(std::move(params));
 }
 
+void ExtensionAppsBase::LaunchAppWithIntent(
+    const std::string& app_id,
+    int32_t event_flags,
+    IntentPtr intent,
+    LaunchSource launch_source,
+    WindowInfoPtr window_info,
+    base::OnceCallback<void(bool)> callback) {
+  LaunchAppWithIntentImpl(app_id, event_flags, std::move(intent), launch_source,
+                          std::move(window_info), std::move(callback));
+}
+
 void ExtensionAppsBase::LaunchAppWithParams(AppLaunchParams&& params,
                                             LaunchCallback callback) {
   auto app_id = params.app_id;
@@ -656,8 +666,10 @@
     apps::mojom::LaunchSource launch_source,
     apps::mojom::WindowInfoPtr window_info,
     LaunchAppWithIntentCallback callback) {
-  LaunchAppWithIntentImpl(app_id, event_flags, std::move(intent), launch_source,
-                          std::move(window_info), std::move(callback));
+  LaunchAppWithIntentImpl(
+      app_id, event_flags, ConvertMojomIntentToIntent(intent),
+      ConvertMojomLaunchSourceToLaunchSource(launch_source),
+      ConvertMojomWindowInfoToWindowInfo(window_info), std::move(callback));
 }
 
 void ExtensionAppsBase::Uninstall(const std::string& app_id,
@@ -912,6 +924,18 @@
   Launch(app_id, event_flags, launch_source, std::move(window_info));
 }
 
+void ExtensionAppsBase::LaunchAppWithIntentWhenEnabled(
+    const std::string& app_id,
+    int32_t event_flags,
+    IntentPtr intent,
+    LaunchSource launch_source,
+    WindowInfoPtr window_info,
+    CallbackWrapper wrapper) {
+  LaunchAppWithIntent(app_id, event_flags, std::move(intent),
+                      std::move(launch_source), std::move(window_info),
+                      std::move(wrapper.callback));
+}
+
 void ExtensionAppsBase::LaunchMojom(const std::string& app_id,
                                     int32_t event_flags,
                                     apps::mojom::LaunchSource launch_source,
diff --git a/chrome/browser/apps/app_service/publishers/extension_apps_base.h b/chrome/browser/apps/app_service/publishers/extension_apps_base.h
index 156140e..e1bef11c 100644
--- a/chrome/browser/apps/app_service/publishers/extension_apps_base.h
+++ b/chrome/browser/apps/app_service/publishers/extension_apps_base.h
@@ -95,10 +95,10 @@
   content::WebContents* LaunchAppWithIntentImpl(
       const std::string& app_id,
       int32_t event_flags,
-      apps::mojom::IntentPtr intent,
-      apps::mojom::LaunchSource launch_source,
-      apps::mojom::WindowInfoPtr window_info,
-      LaunchAppWithIntentCallback callback);
+      IntentPtr intent,
+      LaunchSource launch_source,
+      WindowInfoPtr window_info,
+      base::OnceCallback<void(bool)> callback);
 
   virtual content::WebContents* LaunchImpl(AppLaunchParams&& params);
   virtual void LaunchAppWithParamsImpl(AppLaunchParams&& params,
@@ -164,6 +164,12 @@
               int32_t event_flags,
               LaunchSource launch_source,
               WindowInfoPtr window_info) override;
+  void LaunchAppWithIntent(const std::string& app_id,
+                           int32_t event_flags,
+                           IntentPtr intent,
+                           LaunchSource launch_source,
+                           WindowInfoPtr window_info,
+                           base::OnceCallback<void(bool)> callback) override;
   void LaunchAppWithParams(AppLaunchParams&& params,
                            LaunchCallback callback) override;
 
@@ -249,6 +255,18 @@
                          int32_t event_flags,
                          LaunchSource launch_source,
                          WindowInfoPtr window_info);
+  // TODO(crbug.com/1253250): This function is used as `callback` for
+  // RunExtensionEnableFlow. The LaunchAppWithIntent interface can't be used as
+  // `callback` with `base::BindOnce`, because we have both mojom and non mojom
+  // Launch function. Remove this function after migrating to the non mojom
+  // Launch interface when we have one non mojom LaunchAppWithIntent interface
+  // only.
+  void LaunchAppWithIntentWhenEnabled(const std::string& app_id,
+                                      int32_t event_flags,
+                                      IntentPtr intent,
+                                      LaunchSource launch_source,
+                                      WindowInfoPtr window_info,
+                                      CallbackWrapper callback);
 
   // TODO(crbug.com/1253250): Remove after migrating to the non mojom Launch
   // interface.
diff --git a/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc b/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc
index ad901a9..acd39843 100644
--- a/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc
+++ b/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc
@@ -216,6 +216,38 @@
 void ExtensionAppsChromeOs::LaunchAppWithIntent(
     const std::string& app_id,
     int32_t event_flags,
+    IntentPtr intent,
+    LaunchSource launch_source,
+    WindowInfoPtr window_info,
+    base::OnceCallback<void(bool)> callback) {
+  const auto* extension = MaybeGetExtension(app_id);
+  if (!extension) {
+    std::move(callback).Run(/*success=*/false);
+    return;
+  }
+  bool is_quickoffice = extension_misc::IsQuickOfficeExtension(extension->id());
+  if (extension->is_app() || is_quickoffice) {
+    content::WebContents* web_contents = LaunchAppWithIntentImpl(
+        app_id, event_flags, std::move(intent), launch_source,
+        std::move(window_info), std::move(callback));
+
+    if (launch_source == LaunchSource::kFromArc && web_contents) {
+      // Add a flag to remember this web_contents originated in the ARC context.
+      web_contents->SetUserData(
+          &arc::ArcWebContentsData::kArcTransitionFlag,
+          std::make_unique<arc::ArcWebContentsData>(web_contents));
+    }
+  } else {
+    DCHECK(extension->is_extension());
+    // TODO(petermarshall): Set Arc flag as above?
+    LaunchExtension(app_id, event_flags, std::move(intent), launch_source,
+                    std::move(window_info), std::move(callback));
+  }
+}
+
+void ExtensionAppsChromeOs::LaunchAppWithIntent(
+    const std::string& app_id,
+    int32_t event_flags,
     apps::mojom::IntentPtr intent,
     apps::mojom::LaunchSource launch_source,
     apps::mojom::WindowInfoPtr window_info,
@@ -228,8 +260,9 @@
   bool is_quickoffice = extension_misc::IsQuickOfficeExtension(extension->id());
   if (extension->is_app() || is_quickoffice) {
     content::WebContents* web_contents = LaunchAppWithIntentImpl(
-        app_id, event_flags, std::move(intent), launch_source,
-        std::move(window_info), std::move(callback));
+        app_id, event_flags, ConvertMojomIntentToIntent(intent),
+        ConvertMojomLaunchSourceToLaunchSource(launch_source),
+        ConvertMojomWindowInfoToWindowInfo(window_info), std::move(callback));
 
     if (launch_source == apps::mojom::LaunchSource::kFromArc && web_contents) {
       // Add a flag to remember this web_contents originated in the ARC context.
diff --git a/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.h b/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.h
index 43acb0e..333e1a0 100644
--- a/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.h
+++ b/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.h
@@ -79,6 +79,13 @@
   void LaunchAppWithParamsImpl(AppLaunchParams&& params,
                                LaunchCallback callback) override;
 
+  void LaunchAppWithIntent(const std::string& app_id,
+                           int32_t event_flags,
+                           IntentPtr intent,
+                           LaunchSource launch_source,
+                           WindowInfoPtr window_info,
+                           base::OnceCallback<void(bool)> callback) override;
+
   // apps::mojom::Publisher overrides.
   void LaunchAppWithIntent(const std::string& app_id,
                            int32_t event_flags,
diff --git a/chrome/browser/apps/app_service/publishers/standalone_browser_extension_apps.cc b/chrome/browser/apps/app_service/publishers/standalone_browser_extension_apps.cc
index 98b416c..3117949d 100644
--- a/chrome/browser/apps/app_service/publishers/standalone_browser_extension_apps.cc
+++ b/chrome/browser/apps/app_service/publishers/standalone_browser_extension_apps.cc
@@ -155,6 +155,39 @@
   }
 }
 
+void StandaloneBrowserExtensionApps::LaunchAppWithIntent(
+    const std::string& app_id,
+    int32_t event_flags,
+    IntentPtr intent,
+    LaunchSource launch_source,
+    WindowInfoPtr window_info,
+    base::OnceCallback<void(bool)> callback) {
+  // It is possible that Lacros is briefly unavailable, for example if it shuts
+  // down for an update.
+  if (!controller_.is_bound()) {
+    std::move(callback).Run(/*success=*/false);
+    return;
+  }
+
+  auto launch_params = crosapi::mojom::LaunchParams::New();
+  launch_params->app_id = app_id;
+  launch_params->launch_source = launch_source;
+  launch_params->intent = apps_util::ConvertAppServiceToCrosapiIntent(
+      intent, ProfileManager::GetPrimaryUserProfile());
+  controller_->Launch(std::move(launch_params),
+                      /*callback=*/base::DoNothing());
+  std::move(callback).Run(/*success=*/true);
+
+  if (ShouldSaveToFullRestore(proxy(), app_id)) {
+    auto launch_info = std::make_unique<app_restore::AppLaunchInfo>(
+        app_id, apps::LaunchContainer::kLaunchContainerNone,
+        WindowOpenDisposition::UNKNOWN, display::kInvalidDisplayId,
+        std::vector<base::FilePath>{}, std::move(intent));
+    full_restore::SaveAppLaunchInfo(proxy()->profile()->GetPath(),
+                                    std::move(launch_info));
+  }
+}
+
 void StandaloneBrowserExtensionApps::LaunchAppWithParams(
     AppLaunchParams&& params,
     LaunchCallback callback) {
diff --git a/chrome/browser/apps/app_service/publishers/standalone_browser_extension_apps.h b/chrome/browser/apps/app_service/publishers/standalone_browser_extension_apps.h
index 1d6ec29..838e6b3 100644
--- a/chrome/browser/apps/app_service/publishers/standalone_browser_extension_apps.h
+++ b/chrome/browser/apps/app_service/publishers/standalone_browser_extension_apps.h
@@ -88,6 +88,12 @@
               int32_t event_flags,
               LaunchSource launch_source,
               WindowInfoPtr window_info) override;
+  void LaunchAppWithIntent(const std::string& app_id,
+                           int32_t event_flags,
+                           IntentPtr intent,
+                           LaunchSource launch_source,
+                           WindowInfoPtr window_info,
+                           base::OnceCallback<void(bool)> callback) override;
   void LaunchAppWithParams(AppLaunchParams&& params,
                            LaunchCallback callback) override;
 
diff --git a/chrome/browser/apps/app_service/publishers/web_apps_crosapi.cc b/chrome/browser/apps/app_service/publishers/web_apps_crosapi.cc
index b5b6968e..0ca56293 100644
--- a/chrome/browser/apps/app_service/publishers/web_apps_crosapi.cc
+++ b/chrome/browser/apps/app_service/publishers/web_apps_crosapi.cc
@@ -105,6 +105,29 @@
       base::DoNothing());
 }
 
+void WebAppsCrosapi::LaunchAppWithIntent(
+    const std::string& app_id,
+    int32_t event_flags,
+    IntentPtr intent,
+    LaunchSource launch_source,
+    WindowInfoPtr window_info,
+    base::OnceCallback<void(bool)> callback) {
+  if (!LogIfNotConnected(FROM_HERE)) {
+    std::move(callback).Run(/*success=*/false);
+    return;
+  }
+
+  auto params = CreateCrosapiLaunchParamsWithEventFlags(
+      proxy_, app_id, event_flags, launch_source,
+      window_info ? window_info->display_id : display::kInvalidDisplayId);
+
+  params->intent =
+      apps_util::ConvertAppServiceToCrosapiIntent(intent, proxy_->profile());
+  controller_->Launch(std::move(params), base::DoNothing());
+  // TODO(crbug/1261263): handle the case where launch fails.
+  std::move(callback).Run(/*success=*/true);
+}
+
 void WebAppsCrosapi::LaunchAppWithParams(AppLaunchParams&& params,
                                          LaunchCallback callback) {
   if (!LogIfNotConnected(FROM_HERE)) {
diff --git a/chrome/browser/apps/app_service/publishers/web_apps_crosapi.h b/chrome/browser/apps/app_service/publishers/web_apps_crosapi.h
index a963a56..049ae03d 100644
--- a/chrome/browser/apps/app_service/publishers/web_apps_crosapi.h
+++ b/chrome/browser/apps/app_service/publishers/web_apps_crosapi.h
@@ -83,6 +83,12 @@
               int32_t event_flags,
               LaunchSource launch_source,
               WindowInfoPtr window_info) override;
+  void LaunchAppWithIntent(const std::string& app_id,
+                           int32_t event_flags,
+                           IntentPtr intent,
+                           LaunchSource launch_source,
+                           WindowInfoPtr window_info,
+                           base::OnceCallback<void(bool)> callback) override;
   void LaunchAppWithParams(AppLaunchParams&& params,
                            LaunchCallback callback) override;
   void LaunchShortcut(const std::string& app_id,
diff --git a/chrome/browser/ash/accessibility/dictation_browsertest.cc b/chrome/browser/ash/accessibility/dictation_browsertest.cc
index 8019d93..637498c 100644
--- a/chrome/browser/ash/accessibility/dictation_browsertest.cc
+++ b/chrome/browser/ash/accessibility/dictation_browsertest.cc
@@ -1338,13 +1338,21 @@
   // Setup ChromeVox first.
   test::SpeechMonitor sm;
   EXPECT_FALSE(GetManager()->IsSpokenFeedbackEnabled());
+  extensions::ExtensionHostTestHelper host_helper(
+      browser()->profile(), extension_misc::kChromeVoxExtensionId);
   EnableChromeVox();
+  host_helper.WaitForHostCompletedFirstLoad();
   EXPECT_TRUE(GetManager()->IsSpokenFeedbackEnabled());
 
-  // Wait for ChromeVox to start.
-  sm.ExpectSpeech("ChromeVox spoken feedback is ready");
+  ToggleDictationWithKeystroke();
+  WaitForRecognitionStarted();
 
-  sm.Call([this]() { ToggleDictationWithKeystroke(); });
+  // Hints should show up after a few seconds without speech.
+  WaitForProperties(
+      /*visible=*/true,
+      /*icon=*/DictationBubbleIconType::kStandby,
+      /*text=*/absl::optional<std::u16string>(),
+      /*hints=*/std::vector<std::u16string>{kTrySaying, kType, kHelp});
 
   // Assert speech from ChromeVox.
   sm.ExpectSpeechPattern("Try saying*Type*Help*");
diff --git a/chrome/browser/ash/arc/intent_helper/arc_settings_service_unittest.cc b/chrome/browser/ash/arc/intent_helper/arc_settings_service_unittest.cc
index c2d40fe..e223395 100644
--- a/chrome/browser/ash/arc/intent_helper/arc_settings_service_unittest.cc
+++ b/chrome/browser/ash/arc/intent_helper/arc_settings_service_unittest.cc
@@ -63,7 +63,7 @@
     chromeos::DBusThreadManager::Initialize();
     ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
     network_handler_test_helper_ =
-        std::make_unique<chromeos::NetworkHandlerTestHelper>();
+        std::make_unique<ash::NetworkHandlerTestHelper>();
     network_config_helper_ = std::make_unique<
         chromeos::network_config::CrosNetworkConfigTestHelper>();
     ash::StatsReportingController::RegisterLocalStatePrefs(
@@ -157,8 +157,7 @@
   }
 
  private:
-  std::unique_ptr<chromeos::NetworkHandlerTestHelper>
-      network_handler_test_helper_;
+  std::unique_ptr<ash::NetworkHandlerTestHelper> network_handler_test_helper_;
   std::unique_ptr<chromeos::network_config::CrosNetworkConfigTestHelper>
       network_config_helper_;
   TestingPrefServiceSimple local_state_;
diff --git a/chrome/browser/ash/authpolicy/authpolicy_credentials_manager_unittest.cc b/chrome/browser/ash/authpolicy/authpolicy_credentials_manager_unittest.cc
index df330a9d..1038e6c 100644
--- a/chrome/browser/ash/authpolicy/authpolicy_credentials_manager_unittest.cc
+++ b/chrome/browser/ash/authpolicy/authpolicy_credentials_manager_unittest.cc
@@ -128,7 +128,7 @@
   }
 
   content::BrowserTaskEnvironment task_environment_;
-  chromeos::NetworkHandlerTestHelper network_handler_test_helper_;
+  NetworkHandlerTestHelper network_handler_test_helper_;
   AccountId account_id_;
   std::unique_ptr<TestingProfile> profile_;
 
diff --git a/chrome/browser/ash/borealis/borealis_context.cc b/chrome/browser/ash/borealis/borealis_context.cc
index 177a549..6409e6a 100644
--- a/chrome/browser/ash/borealis/borealis_context.cc
+++ b/chrome/browser/ash/borealis/borealis_context.cc
@@ -183,46 +183,6 @@
   base::WeakPtrFactory<BorealisLifetimeObserver> weak_factory_;
 };
 
-// Borealis' main app extensively relies on self-activation, and it does not
-// handle being refused that activation very well. This class exists to allow
-// borealis' main app to self-activate at all times.
-//
-// TODO(b/190141156): Prevent crostini from spoofing borealis, which would allow
-// it to self-activate its windows.  This would only be a problem currently on
-// borealis-enabled systems, and only while borealis is running.
-class SelfActivationPermissionGranter
-    : public BorealisWindowManager::AppWindowLifetimeObserver {
- public:
-  explicit SelfActivationPermissionGranter(Profile* profile)
-      : profile_(profile), observation_{this} {
-    observation_.Observe(
-        &BorealisService::GetForProfile(profile_)->WindowManager());
-  }
-
-  void OnWindowStarted(const std::string& app_id,
-                       aura::Window* window) override {
-    if (app_id == kClientAppId)
-      exo::GrantPermissionToActivateIndefinitely(window);
-  }
-
-  void OnWindowFinished(const std::string& app_id,
-                        aura::Window* window) override {
-    if (app_id == kClientAppId)
-      exo::RevokePermissionToActivate(window);
-  }
-
-  void OnWindowManagerDeleted(BorealisWindowManager* window_manager) override {
-    DCHECK(observation_.IsObservingSource(window_manager));
-    observation_.Reset();
-  }
-
- private:
-  Profile* const profile_;
-  base::ScopedObservation<BorealisWindowManager,
-                          BorealisWindowManager::AppWindowLifetimeObserver>
-      observation_;
-};
-
 BorealisContext::~BorealisContext() = default;
 
 void BorealisContext::SetDiskManagerForTesting(
@@ -243,9 +203,7 @@
       game_mode_controller_(std::make_unique<BorealisGameModeController>()),
       engagement_metrics_(std::make_unique<BorealisEngagementMetrics>(profile)),
       disk_manager_(std::make_unique<BorealisDiskManagerImpl>(this)),
-      power_controller_(std::make_unique<BorealisPowerController>()),
-      self_activation_granter_(
-          std::make_unique<SelfActivationPermissionGranter>(profile)) {}
+      power_controller_(std::make_unique<BorealisPowerController>()) {}
 
 std::unique_ptr<BorealisContext>
 BorealisContext::CreateBorealisContextForTesting(Profile* profile) {
diff --git a/chrome/browser/ash/borealis/borealis_context.h b/chrome/browser/ash/borealis/borealis_context.h
index ed64fb6..fc545c4 100644
--- a/chrome/browser/ash/borealis/borealis_context.h
+++ b/chrome/browser/ash/borealis/borealis_context.h
@@ -23,7 +23,6 @@
 class BorealisGameModeController;
 class BorealisLifetimeObserver;
 class BorealisPowerController;
-class SelfActivationPermissionGranter;
 
 // An object to track information about the state of the Borealis VM.
 // BorealisContext objects should only be created by the Borealis Context
@@ -95,8 +94,6 @@
   std::unique_ptr<BorealisDiskManager> disk_manager_;
 
   std::unique_ptr<BorealisPowerController> power_controller_;
-
-  std::unique_ptr<SelfActivationPermissionGranter> self_activation_granter_;
 };
 
 }  // namespace borealis
diff --git a/chrome/browser/ash/borealis/borealis_context_unittest.cc b/chrome/browser/ash/borealis/borealis_context_unittest.cc
index f02ae7a5..fb58cc36 100644
--- a/chrome/browser/ash/borealis/borealis_context_unittest.cc
+++ b/chrome/browser/ash/borealis/borealis_context_unittest.cc
@@ -150,24 +150,4 @@
       1);
 }
 
-TEST_F(BorealisContextTest, MainAppHasSelfActivationPermission) {
-  CreateFakeMainApp(profile_.get());
-  std::unique_ptr<ScopedTestWindow> window = MakeAndTrackWindow(
-      "org.chromium.borealis.wmclass.Steam", borealis_window_manager_.get());
-  EXPECT_TRUE(exo::HasPermissionToActivate(window->window()));
-}
-
-TEST_F(BorealisContextTest, NormalAppDoesNotHaveSelfActivationPermission) {
-  // We need to prevent the system from trying to pop up a feedback form in this
-  // test, it causes a crash.
-  BorealisLaunchOptions::Options opts;
-  opts.feedback_forms = false;
-  borealis_context_->set_launch_options(opts);
-
-  CreateFakeApp(profile_.get(), "some_app", "borealis/123");
-  std::unique_ptr<ScopedTestWindow> window = MakeAndTrackWindow(
-      "org.chromium.borealis.wmclass.some_app", borealis_window_manager_.get());
-  EXPECT_FALSE(exo::HasPermissionToActivate(window->window()));
-}
-
 }  // namespace borealis
diff --git a/chrome/browser/ash/borealis/borealis_security_delegate.cc b/chrome/browser/ash/borealis/borealis_security_delegate.cc
index 6fb9b24..c3361c0e 100644
--- a/chrome/browser/ash/borealis/borealis_security_delegate.cc
+++ b/chrome/browser/ash/borealis/borealis_security_delegate.cc
@@ -9,6 +9,8 @@
 #include "base/logging.h"
 #include "chrome/browser/ash/borealis/borealis_features.h"
 #include "chrome/browser/ash/borealis/borealis_service.h"
+#include "chrome/browser/ash/borealis/borealis_util.h"
+#include "chrome/browser/ash/borealis/borealis_window_manager.h"
 #include "third_party/cros_system_api/constants/vm_tools.h"
 
 namespace borealis {
@@ -18,7 +20,8 @@
     base::OnceCallback<void(std::unique_ptr<guest_os::GuestOsSecurityDelegate>)>
         callback) {
   BorealisService::GetForProfile(profile)->Features().IsAllowed(base::BindOnce(
-      [](base::OnceCallback<void(
+      [](Profile* profile,
+         base::OnceCallback<void(
              std::unique_ptr<guest_os::GuestOsSecurityDelegate>)> callback,
          BorealisFeatures::AllowStatus allow_status) {
         if (allow_status != BorealisFeatures::AllowStatus::kAllowed) {
@@ -26,15 +29,25 @@
           std::move(callback).Run(nullptr);
           return;
         }
-        std::move(callback).Run(std::make_unique<BorealisSecurityDelegate>());
+        std::move(callback).Run(
+            std::make_unique<BorealisSecurityDelegate>(profile));
       },
-      std::move(callback)));
+      profile, std::move(callback)));
 }
 
+BorealisSecurityDelegate::BorealisSecurityDelegate(Profile* profile)
+    : profile_(profile) {}
+
 BorealisSecurityDelegate::~BorealisSecurityDelegate() = default;
 
 std::string BorealisSecurityDelegate::GetSecurityContext() const {
   return vm_tools::kConciergeSecurityContext;
 }
 
+bool BorealisSecurityDelegate::CanSelfActivate(aura::Window* window) const {
+  return BorealisService::GetForProfile(profile_)
+             ->WindowManager()
+             .GetShelfAppId(window) == kClientAppId;
+}
+
 }  // namespace borealis
diff --git a/chrome/browser/ash/borealis/borealis_security_delegate.h b/chrome/browser/ash/borealis/borealis_security_delegate.h
index 844c77fa..1493469 100644
--- a/chrome/browser/ash/borealis/borealis_security_delegate.h
+++ b/chrome/browser/ash/borealis/borealis_security_delegate.h
@@ -22,10 +22,15 @@
       base::OnceCallback<
           void(std::unique_ptr<guest_os::GuestOsSecurityDelegate>)> callback);
 
+  explicit BorealisSecurityDelegate(Profile* profile);
   ~BorealisSecurityDelegate() override;
 
   // exo::SecurityDelegate overrides:
   std::string GetSecurityContext() const override;
+  bool CanSelfActivate(aura::Window* window) const override;
+
+ private:
+  Profile* const profile_;
 };
 
 }  // namespace borealis
diff --git a/chrome/browser/ash/borealis/borealis_security_delegate_unittest.cc b/chrome/browser/ash/borealis/borealis_security_delegate_unittest.cc
new file mode 100644
index 0000000..b2f7243
--- /dev/null
+++ b/chrome/browser/ash/borealis/borealis_security_delegate_unittest.cc
@@ -0,0 +1,62 @@
+// Copyright 2022 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/ash/borealis/borealis_security_delegate.h"
+
+#include "chrome/browser/ash/borealis/borealis_service.h"
+#include "chrome/browser/ash/borealis/borealis_window_manager.h"
+#include "chrome/browser/ash/borealis/borealis_window_manager_test_helper.h"
+#include "chrome/browser/ash/borealis/testing/apps.h"
+#include "chrome/test/base/testing_profile.h"
+#include "content/public/test/browser_task_environment.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace borealis {
+namespace {
+
+class BorealisSecurityDelegateTest : public testing::Test {
+ protected:
+  content::BrowserTaskEnvironment task_env_;
+  TestingProfile profile_;
+};
+
+}  // namespace
+
+TEST_F(BorealisSecurityDelegateTest, MainAppCanSelfActivate) {
+  CreateFakeMainApp(&profile_);
+  std::unique_ptr<ScopedTestWindow> window = MakeAndTrackWindow(
+      "org.chromium.borealis.wmclass.Steam",
+      &BorealisService::GetForProfile(&profile_)->WindowManager());
+  EXPECT_TRUE(
+      BorealisSecurityDelegate(&profile_).CanSelfActivate(window->window()));
+}
+
+TEST_F(BorealisSecurityDelegateTest, NormalAppCanNotSelfActivate) {
+  CreateFakeApp(&profile_, "not_steam", "borealis/123");
+  std::unique_ptr<ScopedTestWindow> window = MakeAndTrackWindow(
+      "org.chromium.borealis.wmclass.not_steam",
+      &BorealisService::GetForProfile(&profile_)->WindowManager());
+
+  ASSERT_FALSE(BorealisWindowManager::IsAnonymousAppId(
+      BorealisService::GetForProfile(&profile_)->WindowManager().GetShelfAppId(
+          window->window())));
+
+  EXPECT_FALSE(
+      BorealisSecurityDelegate(&profile_).CanSelfActivate(window->window()));
+}
+
+TEST_F(BorealisSecurityDelegateTest, AnonymousAppCanNotSelfActivate) {
+  std::unique_ptr<ScopedTestWindow> window = MakeAndTrackWindow(
+      "org.chromium.borealis.wmclass.anonymous",
+      &BorealisService::GetForProfile(&profile_)->WindowManager());
+
+  ASSERT_TRUE(BorealisWindowManager::IsAnonymousAppId(
+      BorealisService::GetForProfile(&profile_)->WindowManager().GetShelfAppId(
+          window->window())));
+
+  EXPECT_FALSE(
+      BorealisSecurityDelegate(&profile_).CanSelfActivate(window->window()));
+}
+
+}  // namespace borealis
diff --git a/chrome/browser/ash/crosapi/geolocation_service_ash_unittest.cc b/chrome/browser/ash/crosapi/geolocation_service_ash_unittest.cc
index 78db4d5..edfe95b 100644
--- a/chrome/browser/ash/crosapi/geolocation_service_ash_unittest.cc
+++ b/chrome/browser/ash/crosapi/geolocation_service_ash_unittest.cc
@@ -22,7 +22,7 @@
  public:
   GeolocationServiceAshTest()
       : network_handler_test_helper_(
-            std::make_unique<chromeos::NetworkHandlerTestHelper>()) {}
+            std::make_unique<ash::NetworkHandlerTestHelper>()) {}
 
   void AddAccessPoints(int ssids, int aps_per_ssid) {
     for (int i = 0; i < ssids; ++i) {
@@ -55,8 +55,7 @@
 
  private:
   base::test::SingleThreadTaskEnvironment task_environment_;
-  std::unique_ptr<chromeos::NetworkHandlerTestHelper>
-      network_handler_test_helper_;
+  std::unique_ptr<ash::NetworkHandlerTestHelper> network_handler_test_helper_;
   GeolocationServiceAsh download_controller_ash_;
 };
 
diff --git a/chrome/browser/ash/crosapi/networking_attributes_ash_unittest.cc b/chrome/browser/ash/crosapi/networking_attributes_ash_unittest.cc
index 8ce3a8a..374a70c 100644
--- a/chrome/browser/ash/crosapi/networking_attributes_ash_unittest.cc
+++ b/chrome/browser/ash/crosapi/networking_attributes_ash_unittest.cc
@@ -197,7 +197,7 @@
   std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_;
   mojo::Remote<mojom::NetworkingAttributes> networking_attributes_remote_;
   std::unique_ptr<NetworkingAttributesAsh> networking_attributes_ash_;
-  chromeos::NetworkHandlerTestHelper network_handler_test_helper_;
+  ash::NetworkHandlerTestHelper network_handler_test_helper_;
 
   ScopedTestingLocalState local_state_;
 };
diff --git a/chrome/browser/ash/customization/customization_document_unittest.cc b/chrome/browser/ash/customization/customization_document_unittest.cc
index a7a7d60b..f1441d8 100644
--- a/chrome/browser/ash/customization/customization_document_unittest.cc
+++ b/chrome/browser/ash/customization/customization_document_unittest.cc
@@ -283,7 +283,7 @@
 
  private:
   content::BrowserTaskEnvironment task_environment_;
-  chromeos::NetworkHandlerTestHelper network_handler_test_helper_;
+  NetworkHandlerTestHelper network_handler_test_helper_;
   chromeos::system::ScopedFakeStatisticsProvider fake_statistics_provider_;
   ScopedCrosSettingsTestHelper scoped_cros_settings_test_helper_;
   TestingPrefServiceSimple local_state_;
diff --git a/chrome/browser/ash/file_manager/volume_manager.cc b/chrome/browser/ash/file_manager/volume_manager.cc
index d3f066b..187bf70 100644
--- a/chrome/browser/ash/file_manager/volume_manager.cc
+++ b/chrome/browser/ash/file_manager/volume_manager.cc
@@ -675,11 +675,11 @@
     return;
   }
 
-  if (!fusebox_mounter_.get())
+  if (!fusebox_mounter_)
     fusebox_mounter_.reset(FuseBoxMounter::Create());
   // The fusebox_mounter_ is enabled by a chrome flag: Create() will return
   // nullptr if the flag is disabled. Check it before attempting to Mount.
-  if (fusebox_mounter_.get())
+  if (fusebox_mounter_)
     fusebox_mounter_->Mount(disk_mount_manager_);
 
   const base::FilePath localVolume =
@@ -690,7 +690,7 @@
   DoMountEvent(chromeos::MOUNT_ERROR_NONE,
                Volume::CreateForDownloads(localVolume));
 
-  // Asyncrhonously record the disk usage for the downloads path
+  // Asynchronously record the disk usage for the downloads path.
   base::ThreadPool::PostTask(
       FROM_HERE,
       {base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN,
@@ -786,7 +786,8 @@
       session_manager->RemoveObserver(this);
   }
 
-  if (fusebox_mounter_.get())
+  // The fusebox_mounter_ is enabled by a chrome flag.
+  if (fusebox_mounter_)
     fusebox_mounter_->Unmount(disk_mount_manager_);
 }
 
@@ -1298,7 +1299,7 @@
   DoMountEvent(mount_error, std::move(volume));
 
   // The fusebox_mounter_ is enabled by a chrome flag.
-  if (!fusebox_mounter_.get())
+  if (!fusebox_mounter_)
     return;
 
   // The FSP is not added to chrome::storage if mounting failed.
@@ -1376,7 +1377,7 @@
   DoUnmountEvent(mount_error, *volume);
 
   // The fusebox_mounter_ is enabled by a chrome flag.
-  if (!fusebox_mounter_.get())
+  if (!fusebox_mounter_)
     return;
 
   // Get FSP chrome::storage |fsid| and fusebox daemon |subdir|.
@@ -1574,7 +1575,7 @@
   DoMountEvent(chromeos::MOUNT_ERROR_NONE, std::move(volume));
 
   // The fusebox_mounter_ is enabled by a chrome flag.
-  if (!fusebox_mounter_.get())
+  if (!fusebox_mounter_)
     return;
 
   // Get the FileSystemURL of the MTP storage device.
@@ -1644,7 +1645,7 @@
                        fsid));
 
     // The fusebox_mounter_ is enabled by a chrome flag.
-    if (!fusebox_mounter_.get())
+    if (!fusebox_mounter_)
       return;
 
     // Unmount the fusebox MTP storage device in files app.
diff --git a/chrome/browser/ash/guest_os/public/guest_os_wayland_server_unittest.cc b/chrome/browser/ash/guest_os/public/guest_os_wayland_server_unittest.cc
index 5dad7766..f9f488c 100644
--- a/chrome/browser/ash/guest_os/public/guest_os_wayland_server_unittest.cc
+++ b/chrome/browser/ash/guest_os/public/guest_os_wayland_server_unittest.cc
@@ -88,10 +88,11 @@
   EXPECT_CALL(capability_factory, Call(_))
       .Times(1)
       .WillOnce(Invoke(
-          [](base::OnceCallback<void(std::unique_ptr<GuestOsSecurityDelegate>)>
-                 callback) {
+          [this](base::OnceCallback<void(
+                     std::unique_ptr<GuestOsSecurityDelegate>)> callback) {
             std::move(callback).Run(
-                std::make_unique<borealis::BorealisSecurityDelegate>());
+                std::make_unique<borealis::BorealisSecurityDelegate>(
+                    &profile_));
           }));
   base::RunLoop loop;
   EXPECT_CALL(result_factory, Call(_))
@@ -123,10 +124,11 @@
 
   EXPECT_CALL(capability_factory, Call(_))
       .WillOnce(Invoke(
-          [](base::OnceCallback<void(std::unique_ptr<GuestOsSecurityDelegate>)>
-                 callback) {
+          [this](base::OnceCallback<void(
+                     std::unique_ptr<GuestOsSecurityDelegate>)> callback) {
             std::move(callback).Run(
-                std::make_unique<borealis::BorealisSecurityDelegate>());
+                std::make_unique<borealis::BorealisSecurityDelegate>(
+                    &profile_));
           }));
   base::RunLoop loop;
   EXPECT_CALL(result_factory, Call(_))
diff --git a/chrome/browser/ash/login/saml/saml_lockscreen_browsertest.cc b/chrome/browser/ash/login/saml/saml_lockscreen_browsertest.cc
index e2ea8c1..0448806ec 100644
--- a/chrome/browser/ash/login/saml/saml_lockscreen_browsertest.cc
+++ b/chrome/browser/ash/login/saml/saml_lockscreen_browsertest.cc
@@ -110,9 +110,8 @@
                                              "", kTestRefreshToken);
 
     // Set up fake networks.
-    network_state_test_helper_ =
-        std::make_unique<chromeos::NetworkStateTestHelper>(
-            true /*use_default_devices_and_services*/);
+    network_state_test_helper_ = std::make_unique<NetworkStateTestHelper>(
+        true /*use_default_devices_and_services*/);
     network_state_test_helper_->manager_test()->SetupDefaultEnvironment();
     // Fake networks have been set up. Connect to WiFi network.
     SetConnected(kWifiServicePath);
diff --git a/chrome/browser/ash/login/screens/update_required_screen_browsertest.cc b/chrome/browser/ash/login/screens/update_required_screen_browsertest.cc
index 6eaf72b..62cf2c5 100644
--- a/chrome/browser/ash/login/screens/update_required_screen_browsertest.cc
+++ b/chrome/browser/ash/login/screens/update_required_screen_browsertest.cc
@@ -153,9 +153,8 @@
     OobeBaseTest::SetUpOnMainThread();
 
     // Set up fake networks.
-    network_state_test_helper_ =
-        std::make_unique<chromeos::NetworkStateTestHelper>(
-            true /*use_default_devices_and_services*/);
+    network_state_test_helper_ = std::make_unique<NetworkStateTestHelper>(
+        true /*use_default_devices_and_services*/);
     network_state_test_helper_->manager_test()->SetupDefaultEnvironment();
     // Fake networks have been set up. Connect to WiFi network.
     SetConnected(kWifiServicePath);
@@ -206,7 +205,7 @@
   NetworkPortalDetectorMixin network_portal_detector_{&mixin_host_};
 
   // Handles network connections
-  std::unique_ptr<chromeos::NetworkStateTestHelper> network_state_test_helper_;
+  std::unique_ptr<NetworkStateTestHelper> network_state_test_helper_;
   policy::DevicePolicyCrosTestHelper policy_helper_;
   DeviceStateMixin device_state_mixin_{
       &mixin_host_, DeviceStateMixin::State::OOBE_COMPLETED_CLOUD_ENROLLED};
diff --git a/chrome/browser/ash/login/screens/update_required_screen_unittest.cc b/chrome/browser/ash/login/screens/update_required_screen_unittest.cc
index ae811b57..5ab2575 100644
--- a/chrome/browser/ash/login/screens/update_required_screen_unittest.cc
+++ b/chrome/browser/ash/login/screens/update_required_screen_unittest.cc
@@ -66,8 +66,7 @@
     DBusThreadManager::Initialize();
     fake_update_engine_client_ = UpdateEngineClient::InitializeFakeForTest();
 
-    network_handler_test_helper_ =
-        std::make_unique<chromeos::NetworkHandlerTestHelper>();
+    network_handler_test_helper_ = std::make_unique<NetworkHandlerTestHelper>();
     network_handler_test_helper_->AddDefaultProfiles();
 
     mock_network_portal_detector_ = new MockNetworkPortalDetector();
@@ -117,8 +116,7 @@
   // Will be deleted in `DBusThreadManager::Shutdown()`.
   FakeUpdateEngineClient* fake_update_engine_client_;
   // Initializes NetworkHandler and required DBus clients.
-  std::unique_ptr<chromeos::NetworkHandlerTestHelper>
-      network_handler_test_helper_;
+  std::unique_ptr<NetworkHandlerTestHelper> network_handler_test_helper_;
 
  private:
   // Test versions of core browser infrastructure.
diff --git a/chrome/browser/ash/login/test/offline_login_test_mixin.cc b/chrome/browser/ash/login/test/offline_login_test_mixin.cc
index cdf9ad6..c626dfc 100644
--- a/chrome/browser/ash/login/test/offline_login_test_mixin.cc
+++ b/chrome/browser/ash/login/test/offline_login_test_mixin.cc
@@ -76,9 +76,8 @@
 }
 
 void OfflineLoginTestMixin::GoOffline() {
-  network_state_test_helper_ =
-      std::make_unique<chromeos::NetworkStateTestHelper>(
-          false /*use_default_devices_and_services*/);
+  network_state_test_helper_ = std::make_unique<NetworkStateTestHelper>(
+      false /*use_default_devices_and_services*/);
   network_state_test_helper_->ClearServices();
   // Notify NetworkStateInformer explicitly
   if (LoginDisplayHost::default_host() &&
diff --git a/chrome/browser/ash/login/test/offline_login_test_mixin.h b/chrome/browser/ash/login/test/offline_login_test_mixin.h
index d3385654..ff3f62696 100644
--- a/chrome/browser/ash/login/test/offline_login_test_mixin.h
+++ b/chrome/browser/ash/login/test/offline_login_test_mixin.h
@@ -9,13 +9,13 @@
 #include <string>
 
 #include "chrome/test/base/mixin_based_in_process_browser_test.h"
-// TODO(https://crbug.com/1164001): move to forward declaration.
-#include "chromeos/ash/components/network/network_state_test_helper.h"
 
 class AccountId;
 
 namespace ash {
 
+class NetworkStateTestHelper;
+
 // This object sets offline login mode on the login screen.
 class OfflineLoginTestMixin : public InProcessBrowserTestMixin {
  public:
@@ -60,7 +60,7 @@
   void StartLoginAuthOffline();
 
   // This is ised to disable networking.
-  std::unique_ptr<chromeos::NetworkStateTestHelper> network_state_test_helper_;
+  std::unique_ptr<NetworkStateTestHelper> network_state_test_helper_;
 };
 
 }  // namespace ash
diff --git a/chrome/browser/ash/login/version_updater/version_updater_unittest.cc b/chrome/browser/ash/login/version_updater/version_updater_unittest.cc
index 240f9631..5c7f13c 100644
--- a/chrome/browser/ash/login/version_updater/version_updater_unittest.cc
+++ b/chrome/browser/ash/login/version_updater/version_updater_unittest.cc
@@ -95,8 +95,7 @@
     DBusThreadManager::Initialize();
     fake_update_engine_client_ = UpdateEngineClient::InitializeFakeForTest();
 
-    network_handler_test_helper_ =
-        std::make_unique<chromeos::NetworkHandlerTestHelper>();
+    network_handler_test_helper_ = std::make_unique<NetworkHandlerTestHelper>();
 
     // `mock_network_portal_detector_->IsEnabled()` will always return false.
     mock_network_portal_detector_ =
@@ -133,8 +132,7 @@
   std::unique_ptr<VersionUpdater> version_updater_;
 
   // Accessory objects needed by VersionUpdater.
-  std::unique_ptr<chromeos::NetworkHandlerTestHelper>
-      network_handler_test_helper_;
+  std::unique_ptr<NetworkHandlerTestHelper> network_handler_test_helper_;
   std::unique_ptr<MockVersionUpdaterDelegate> mock_delegate_;
   std::unique_ptr<MockNetworkPortalDetector> mock_network_portal_detector_;
   std::unique_ptr<NetworkPortalDetectorTestImpl> fake_network_portal_detector_;
diff --git a/chrome/browser/ash/mobile/mobile_activator_unittest.cc b/chrome/browser/ash/mobile/mobile_activator_unittest.cc
index ae44ec2..5a6c232 100644
--- a/chrome/browser/ash/mobile/mobile_activator_unittest.cc
+++ b/chrome/browser/ash/mobile/mobile_activator_unittest.cc
@@ -127,7 +127,7 @@
   }
 
   base::test::SingleThreadTaskEnvironment task_environment_;
-  chromeos::NetworkHandlerTestHelper network_handler_test_helper_;
+  NetworkHandlerTestHelper network_handler_test_helper_;
   NetworkState cellular_network_;
   TestMobileActivator mobile_activator_;
 };
diff --git a/chrome/browser/ash/net/network_diagnostics/has_secure_wifi_connection_routine_unittest.cc b/chrome/browser/ash/net/network_diagnostics/has_secure_wifi_connection_routine_unittest.cc
index 92b57707..10eda17 100644
--- a/chrome/browser/ash/net/network_diagnostics/has_secure_wifi_connection_routine_unittest.cc
+++ b/chrome/browser/ash/net/network_diagnostics/has_secure_wifi_connection_routine_unittest.cc
@@ -56,7 +56,7 @@
     base::RunLoop().RunUntilIdle();
   }
 
-  chromeos::NetworkStateTestHelper& network_state_helper() {
+  NetworkStateTestHelper& network_state_helper() {
     return cros_network_config_test_helper_.network_state_helper();
   }
   HasSecureWiFiConnectionRoutine* has_secure_wifi_connection_routine() {
diff --git a/chrome/browser/ash/net/network_diagnostics/lan_connectivity_routine_unittest.cc b/chrome/browser/ash/net/network_diagnostics/lan_connectivity_routine_unittest.cc
index 74bca70..369f77a 100644
--- a/chrome/browser/ash/net/network_diagnostics/lan_connectivity_routine_unittest.cc
+++ b/chrome/browser/ash/net/network_diagnostics/lan_connectivity_routine_unittest.cc
@@ -72,7 +72,7 @@
     network_state_helper().SetServiceProperty(service_path, key, value);
   }
   const std::string& ethernet_path() const { return ethernet_path_; }
-  chromeos::NetworkStateTestHelper& network_state_helper() {
+  NetworkStateTestHelper& network_state_helper() {
     return cros_network_config_test_helper_.network_state_helper();
   }
   const std::string& wifi_path() const { return wifi_path_; }
diff --git a/chrome/browser/ash/net/network_diagnostics/signal_strength_routine_unittest.cc b/chrome/browser/ash/net/network_diagnostics/signal_strength_routine_unittest.cc
index 74be4538..855ca07d 100644
--- a/chrome/browser/ash/net/network_diagnostics/signal_strength_routine_unittest.cc
+++ b/chrome/browser/ash/net/network_diagnostics/signal_strength_routine_unittest.cc
@@ -54,7 +54,7 @@
     base::RunLoop().RunUntilIdle();
   }
 
-  chromeos::NetworkStateTestHelper& network_state_helper() {
+  NetworkStateTestHelper& network_state_helper() {
     return cros_network_config_test_helper_.network_state_helper();
   }
   SignalStrengthRoutine* signal_strength_routine() {
diff --git a/chrome/browser/ash/net/secure_dns_manager_unittest.cc b/chrome/browser/ash/net/secure_dns_manager_unittest.cc
index 3abc88f..0f1e831 100644
--- a/chrome/browser/ash/net/secure_dns_manager_unittest.cc
+++ b/chrome/browser/ash/net/secure_dns_manager_unittest.cc
@@ -75,7 +75,7 @@
 
  private:
   content::BrowserTaskEnvironment task_environment_;
-  chromeos::NetworkHandlerTestHelper network_handler_test_helper_;
+  NetworkHandlerTestHelper network_handler_test_helper_;
   TestingPrefServiceSimple pref_service_;
 };
 
diff --git a/chrome/browser/ash/notifications/update_required_notification_unittest.cc b/chrome/browser/ash/notifications/update_required_notification_unittest.cc
index b2cfa1c..4d32aeb 100644
--- a/chrome/browser/ash/notifications/update_required_notification_unittest.cc
+++ b/chrome/browser/ash/notifications/update_required_notification_unittest.cc
@@ -93,7 +93,7 @@
 
   FakeUpdateEngineClient* update_engine() { return fake_update_engine_client_; }
 
-  chromeos::NetworkHandlerTestHelper* network_handler_test_helper() {
+  NetworkHandlerTestHelper* network_handler_test_helper() {
     return network_handler_test_helper_.get();
   }
 
@@ -112,8 +112,7 @@
   std::unique_ptr<base::Version> current_version_;
   std::unique_ptr<policy::MinimumVersionPolicyHandler>
       minimum_version_policy_handler_;
-  std::unique_ptr<chromeos::NetworkHandlerTestHelper>
-      network_handler_test_helper_;
+  std::unique_ptr<NetworkHandlerTestHelper> network_handler_test_helper_;
 };
 
 UpdateRequiredNotificationTest::UpdateRequiredNotificationTest()
@@ -126,8 +125,7 @@
 void UpdateRequiredNotificationTest::SetUp() {
   chromeos::DBusThreadManager::Initialize();
   fake_update_engine_client_ = UpdateEngineClient::InitializeFakeForTest();
-  network_handler_test_helper_ =
-      std::make_unique<chromeos::NetworkHandlerTestHelper>();
+  network_handler_test_helper_ = std::make_unique<NetworkHandlerTestHelper>();
 
   chromeos::ShillServiceClient::TestInterface* service_test =
       network_handler_test_helper_->service_test();
diff --git a/chrome/browser/ash/policy/handlers/device_dock_mac_address_source_handler_unittest.cc b/chrome/browser/ash/policy/handlers/device_dock_mac_address_source_handler_unittest.cc
index 4cb135b9..68ce4e6 100644
--- a/chrome/browser/ash/policy/handlers/device_dock_mac_address_source_handler_unittest.cc
+++ b/chrome/browser/ash/policy/handlers/device_dock_mac_address_source_handler_unittest.cc
@@ -42,7 +42,7 @@
 
   ash::ScopedCrosSettingsTestHelper scoped_cros_settings_test_helper_;
 
-  testing::StrictMock<chromeos::MockNetworkDeviceHandler>
+  testing::StrictMock<ash::MockNetworkDeviceHandler>
       network_device_handler_mock_;
 
   std::unique_ptr<DeviceDockMacAddressHandler> device_dock_mac_address_handler_;
diff --git a/chrome/browser/ash/policy/handlers/device_name_policy_handler_impl_unittest.cc b/chrome/browser/ash/policy/handlers/device_name_policy_handler_impl_unittest.cc
index 998e4284..4bcbe260 100644
--- a/chrome/browser/ash/policy/handlers/device_name_policy_handler_impl_unittest.cc
+++ b/chrome/browser/ash/policy/handlers/device_name_policy_handler_impl_unittest.cc
@@ -42,7 +42,7 @@
   void SetUp() override {
     testing::Test::SetUp();
     network_handler_test_helper_ =
-        std::make_unique<chromeos::NetworkHandlerTestHelper>();
+        std::make_unique<ash::NetworkHandlerTestHelper>();
   }
 
   void TearDown() override {
@@ -212,8 +212,7 @@
  private:
   base::test::TaskEnvironment task_environment_;
   base::test::ScopedFeatureList feature_list_;
-  std::unique_ptr<chromeos::NetworkHandlerTestHelper>
-      network_handler_test_helper_;
+  std::unique_ptr<ash::NetworkHandlerTestHelper> network_handler_test_helper_;
   ash::ScopedTestingCrosSettings scoped_testing_cros_settings_;
   std::unique_ptr<ash::ScopedStubInstallAttributes> attributes_;
   chromeos::system::ScopedFakeStatisticsProvider fake_statistics_provider_;
diff --git a/chrome/browser/ash/policy/handlers/minimum_version_policy_handler_browsertest.cc b/chrome/browser/ash/policy/handlers/minimum_version_policy_handler_browsertest.cc
index 65fa842dd..db854c8 100644
--- a/chrome/browser/ash/policy/handlers/minimum_version_policy_handler_browsertest.cc
+++ b/chrome/browser/ash/policy/handlers/minimum_version_policy_handler_browsertest.cc
@@ -188,9 +188,8 @@
     MinimumVersionPolicyTestBase::SetUpOnMainThread();
     display_service_tester_ =
         std::make_unique<NotificationDisplayServiceTester>(nullptr /*profile*/);
-    network_state_test_helper_ =
-        std::make_unique<chromeos::NetworkStateTestHelper>(
-            false /*use_default_devices_and_services*/);
+    network_state_test_helper_ = std::make_unique<ash::NetworkStateTestHelper>(
+        false /*use_default_devices_and_services*/);
     network_state_test_helper_->manager_test()->SetupDefaultEnvironment();
     tray_test_api_ = ash::SystemTrayTestApi::Create();
   }
@@ -218,7 +217,7 @@
   ash::UserPolicyMixin user_policy_mixin_{&mixin_host_,
                                           managed_user.account_id};
   ash::LoginManagerMixin login_manager_{&mixin_host_, {managed_user}};
-  std::unique_ptr<chromeos::NetworkStateTestHelper> network_state_test_helper_;
+  std::unique_ptr<ash::NetworkStateTestHelper> network_state_test_helper_;
   std::unique_ptr<NotificationDisplayServiceTester> display_service_tester_;
   std::unique_ptr<ash::SystemTrayTestApi> tray_test_api_;
 };
diff --git a/chrome/browser/ash/policy/handlers/minimum_version_policy_handler_unittest.cc b/chrome/browser/ash/policy/handlers/minimum_version_policy_handler_unittest.cc
index f54aedc0..4f3eb805 100644
--- a/chrome/browser/ash/policy/handlers/minimum_version_policy_handler_unittest.cc
+++ b/chrome/browser/ash/policy/handlers/minimum_version_policy_handler_unittest.cc
@@ -97,8 +97,7 @@
   ash::ScopedTestingCrosSettings scoped_testing_cros_settings_;
   ash::ScopedStubInstallAttributes scoped_stub_install_attributes_;
   ash::FakeUpdateEngineClient* fake_update_engine_client_;
-  std::unique_ptr<chromeos::NetworkHandlerTestHelper>
-      network_handler_test_helper_;
+  std::unique_ptr<ash::NetworkHandlerTestHelper> network_handler_test_helper_;
   std::unique_ptr<base::Version> current_version_;
   std::unique_ptr<MinimumVersionPolicyHandler> minimum_version_policy_handler_;
 };
@@ -112,7 +111,7 @@
   chromeos::DBusThreadManager::Initialize();
   fake_update_engine_client_ = ash::UpdateEngineClient::InitializeFakeForTest();
   network_handler_test_helper_ =
-      std::make_unique<chromeos::NetworkHandlerTestHelper>();
+      std::make_unique<ash::NetworkHandlerTestHelper>();
 
   chromeos::ShillServiceClient::TestInterface* service_test =
       network_handler_test_helper_->service_test();
diff --git a/chrome/browser/ash/policy/handlers/system_proxy_handler_unittest.cc b/chrome/browser/ash/policy/handlers/system_proxy_handler_unittest.cc
index fcf41e86..686fcda 100644
--- a/chrome/browser/ash/policy/handlers/system_proxy_handler_unittest.cc
+++ b/chrome/browser/ash/policy/handlers/system_proxy_handler_unittest.cc
@@ -50,7 +50,7 @@
   void SetUp() override {
     testing::Test::SetUp();
     network_handler_test_helper_ =
-        std::make_unique<chromeos::NetworkHandlerTestHelper>();
+        std::make_unique<ash::NetworkHandlerTestHelper>();
     ash::SystemProxyClient::InitializeFake();
 
     system_proxy_handler_ =
@@ -103,8 +103,7 @@
   }
 
   content::BrowserTaskEnvironment task_environment_;
-  std::unique_ptr<chromeos::NetworkHandlerTestHelper>
-      network_handler_test_helper_;
+  std::unique_ptr<ash::NetworkHandlerTestHelper> network_handler_test_helper_;
   ScopedTestingLocalState local_state_;
   std::unique_ptr<TestingProfile> profile_;
   chromeos::ScopedTestingCrosSettings scoped_testing_cros_settings_;
diff --git a/chrome/browser/ash/policy/remote_commands/device_command_reset_euicc_job_unittest.cc b/chrome/browser/ash/policy/remote_commands/device_command_reset_euicc_job_unittest.cc
index d3afe9d..9564b68 100644
--- a/chrome/browser/ash/policy/remote_commands/device_command_reset_euicc_job_unittest.cc
+++ b/chrome/browser/ash/policy/remote_commands/device_command_reset_euicc_job_unittest.cc
@@ -79,7 +79,7 @@
 
   void SetUp() override {
     ChromeAshTestBase::SetUp();
-    helper_ = std::make_unique<chromeos::NetworkHandlerTestHelper>();
+    helper_ = std::make_unique<ash::NetworkHandlerTestHelper>();
     helper_->hermes_manager_test()->AddEuicc(
         dbus::ObjectPath(kTestEuiccPath), kTestEid,
         /*is_active=*/true, /*physical_slot=*/0);
@@ -115,7 +115,7 @@
   }
 
   base::HistogramTester histogram_tester_;
-  std::unique_ptr<chromeos::NetworkHandlerTestHelper> helper_;
+  std::unique_ptr<ash::NetworkHandlerTestHelper> helper_;
   base::TimeTicks test_start_time_ = base::TimeTicks::Now();
 };
 
diff --git a/chrome/browser/ash/policy/reporting/arc_app_install_event_log_collector_unittest.cc b/chrome/browser/ash/policy/reporting/arc_app_install_event_log_collector_unittest.cc
index fde7003..c6223e1 100644
--- a/chrome/browser/ash/policy/reporting/arc_app_install_event_log_collector_unittest.cc
+++ b/chrome/browser/ash/policy/reporting/arc_app_install_event_log_collector_unittest.cc
@@ -125,7 +125,7 @@
     arc_app_test_.SetUp(profile_.get());
 
     network_handler_test_helper_ =
-        std::make_unique<chromeos::NetworkHandlerTestHelper>();
+        std::make_unique<ash::NetworkHandlerTestHelper>();
     network_handler_test_helper_->service_test()->AddService(
         kEthernetServicePath, "eth1_guid", "eth1", shill::kTypeEthernet,
         shill::kStateOffline, true /* visible */);
@@ -180,8 +180,7 @@
 
  private:
   content::BrowserTaskEnvironment task_environment_;
-  std::unique_ptr<chromeos::NetworkHandlerTestHelper>
-      network_handler_test_helper_;
+  std::unique_ptr<ash::NetworkHandlerTestHelper> network_handler_test_helper_;
   std::unique_ptr<TestingProfile> profile_;
   FakeAppInstallEventLogCollectorDelegate delegate_;
   TestingPrefServiceSimple pref_service_;
diff --git a/chrome/browser/ash/policy/reporting/arc_app_install_event_logger_unittest.cc b/chrome/browser/ash/policy/reporting/arc_app_install_event_logger_unittest.cc
index aa1cacf2..8878b25 100644
--- a/chrome/browser/ash/policy/reporting/arc_app_install_event_logger_unittest.cc
+++ b/chrome/browser/ash/policy/reporting/arc_app_install_event_logger_unittest.cc
@@ -222,7 +222,7 @@
   }
 
   content::BrowserTaskEnvironment task_environment_;
-  chromeos::NetworkHandlerTestHelper network_handler_test_helper_;
+  ash::NetworkHandlerTestHelper network_handler_test_helper_;
   TestingProfile profile_;
   TestingPrefServiceSimple pref_service_;
 
diff --git a/chrome/browser/ash/policy/reporting/extension_install_event_log_collector_unittest.cc b/chrome/browser/ash/policy/reporting/extension_install_event_log_collector_unittest.cc
index be1bad0..68a30a1 100644
--- a/chrome/browser/ash/policy/reporting/extension_install_event_log_collector_unittest.cc
+++ b/chrome/browser/ash/policy/reporting/extension_install_event_log_collector_unittest.cc
@@ -127,7 +127,7 @@
     TestingBrowserProcess::GetGlobal()->SetLocalState(&pref_service_);
 
     network_handler_test_helper_ =
-        std::make_unique<chromeos::NetworkHandlerTestHelper>();
+        std::make_unique<ash::NetworkHandlerTestHelper>();
     chromeos::PowerManagerClient::InitializeFake();
     profile_ = std::make_unique<TestingProfile>();
     registry_ = extensions::ExtensionRegistry::Get(profile_.get());
@@ -222,8 +222,7 @@
 
  private:
   content::BrowserTaskEnvironment task_environment_;
-  std::unique_ptr<chromeos::NetworkHandlerTestHelper>
-      network_handler_test_helper_;
+  std::unique_ptr<ash::NetworkHandlerTestHelper> network_handler_test_helper_;
   std::unique_ptr<TestingProfile> profile_;
   extensions::ExtensionRegistry* registry_;
   extensions::InstallStageTracker* install_stage_tracker_;
diff --git a/chrome/browser/ash/policy/reporting/extension_install_event_logger_unittest.cc b/chrome/browser/ash/policy/reporting/extension_install_event_logger_unittest.cc
index 2e18e7b..e9fdf825e 100644
--- a/chrome/browser/ash/policy/reporting/extension_install_event_logger_unittest.cc
+++ b/chrome/browser/ash/policy/reporting/extension_install_event_logger_unittest.cc
@@ -198,7 +198,7 @@
   }
 
   content::BrowserTaskEnvironment task_environment_;
-  chromeos::NetworkHandlerTestHelper network_handler_test_helper_;
+  ash::NetworkHandlerTestHelper network_handler_test_helper_;
   TestingProfile profile_;
   TestingPrefServiceSimple pref_service_;
 
diff --git a/chrome/browser/ash/policy/scheduled_task_handler/test/device_scheduled_update_checker_unittest.cc b/chrome/browser/ash/policy/scheduled_task_handler/test/device_scheduled_update_checker_unittest.cc
index e91c55c4..cb1cc8e 100644
--- a/chrome/browser/ash/policy/scheduled_task_handler/test/device_scheduled_update_checker_unittest.cc
+++ b/chrome/browser/ash/policy/scheduled_task_handler/test/device_scheduled_update_checker_unittest.cc
@@ -131,9 +131,8 @@
     chromeos::FakePowerManagerClient::Get()->set_tick_clock(
         task_environment_.GetMockTickClock());
 
-    network_state_test_helper_ =
-        std::make_unique<chromeos::NetworkStateTestHelper>(
-            true /* use_default_devices_and_services */);
+    network_state_test_helper_ = std::make_unique<ash::NetworkStateTestHelper>(
+        true /* use_default_devices_and_services */);
 
     auto task_executor = std::make_unique<FakeScheduledTaskExecutor>(
         task_environment_.GetMockClock());
@@ -358,7 +357,7 @@
       device_scheduled_update_checker_;
   ash::ScopedTestingCrosSettings cros_settings_;
   ash::FakeUpdateEngineClient* fake_update_engine_client_;
-  std::unique_ptr<chromeos::NetworkStateTestHelper> network_state_test_helper_;
+  std::unique_ptr<ash::NetworkStateTestHelper> network_state_test_helper_;
   device::TestWakeLockProvider wake_lock_provider_;
 
  private:
diff --git a/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc b/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc
index d33fdc84..28a9e7f 100644
--- a/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc
+++ b/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc
@@ -4011,7 +4011,7 @@
   virtual void VerifyReporting() = 0;
 
  private:
-  chromeos::NetworkHandlerTestHelper network_handler_test_helper_;
+  ash::NetworkHandlerTestHelper network_handler_test_helper_;
 };
 
 class DeviceStatusCollectorNetworkInterfacesTest
diff --git a/chrome/browser/ash/policy/status_collector/legacy_device_status_collector_browsertest.cc b/chrome/browser/ash/policy/status_collector/legacy_device_status_collector_browsertest.cc
index c024b68..7da3561 100644
--- a/chrome/browser/ash/policy/status_collector/legacy_device_status_collector_browsertest.cc
+++ b/chrome/browser/ash/policy/status_collector/legacy_device_status_collector_browsertest.cc
@@ -3971,7 +3971,7 @@
   virtual void VerifyReporting() = 0;
 
  private:
-  chromeos::NetworkHandlerTestHelper network_handler_test_helper_;
+  ash::NetworkHandlerTestHelper network_handler_test_helper_;
 };
 
 class LegacyDeviceStatusCollectorNetworkInterfacesTest
diff --git a/chrome/browser/ash/tether/tether_service_unittest.cc b/chrome/browser/ash/tether/tether_service_unittest.cc
index 3f9138c..be246ad 100644
--- a/chrome/browser/ash/tether/tether_service_unittest.cc
+++ b/chrome/browser/ash/tether/tether_service_unittest.cc
@@ -518,7 +518,7 @@
   const multidevice::RemoteDeviceRefList test_devices_;
   const content::BrowserTaskEnvironment task_environment_;
 
-  chromeos::NetworkHandlerTestHelper network_handler_test_helper_;
+  NetworkHandlerTestHelper network_handler_test_helper_;
   std::unique_ptr<TestingProfile> profile_;
   FakeChromeUserManager* fake_chrome_user_manager_;
   std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_;
diff --git a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc
index 433a379..ca60d5f 100644
--- a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc
+++ b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc
@@ -26,9 +26,9 @@
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/history/top_sites_factory.h"
 #include "chrome/browser/history_clusters/history_clusters_service_factory.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service_factory.h"
 #include "chrome/browser/prefs/incognito_mode_prefs.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_key.h"
 #include "chrome/browser/query_tiles/tile_service_factory.h"
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
index 1f020ea..e2747f7c 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -59,9 +59,9 @@
 #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_origin_decider.h"
 #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service.h"
 #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service_factory.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service_factory.h"
 #include "chrome/browser/preloading/prefetch/no_state_prefetch/no_state_prefetch_manager_factory.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_factory.h"
 #include "chrome/browser/privacy_sandbox/privacy_sandbox_settings_factory.h"
 #include "chrome/browser/profiles/keep_alive/profile_keep_alive_types.h"
 #include "chrome/browser/profiles/keep_alive/scoped_profile_keep_alive.h"
diff --git a/chrome/browser/browsing_data/cookies_tree_model.cc b/chrome/browser/browsing_data/cookies_tree_model.cc
index 5c3dec04..1010fdf 100644
--- a/chrome/browser/browsing_data/cookies_tree_model.cc
+++ b/chrome/browser/browsing_data/cookies_tree_model.cc
@@ -1289,9 +1289,6 @@
 ///////////////////////////////////////////////////////////////////////////////
 // CookiesTreeModel, TreeModel methods (public):
 
-// TreeModel methods:
-// Returns the set of icons for the nodes in the tree. You only need override
-// this if you don't want to use the default folder icons.
 void CookiesTreeModel::GetIcons(std::vector<ui::ImageModel>* icons) {
   icons->push_back(ui::ImageModel::FromVectorIcon(vector_icons::kCookieIcon,
                                                   ui::kColorIcon, 18));
@@ -1300,16 +1297,12 @@
           IDR_COOKIE_STORAGE_ICON)));
 }
 
-// Returns the index of the icon to use for |node|. Return -1 to use the
-// default icon. The index is relative to the list of icons returned from
-// GetIcons.
-int CookiesTreeModel::GetIconIndex(ui::TreeModelNode* node) {
+absl::optional<size_t> CookiesTreeModel::GetIconIndex(ui::TreeModelNode* node) {
   CookieTreeNode* ct_node = static_cast<CookieTreeNode*>(node);
   switch (ct_node->GetDetailedInfo().node_type) {
     case CookieTreeNode::DetailedInfo::TYPE_COOKIE:
-      return COOKIE;
+      return 0;
 
-    // Fall through each below cases to return DATABASE.
     case CookieTreeNode::DetailedInfo::TYPE_DATABASE:
     case CookieTreeNode::DetailedInfo::TYPE_LOCAL_STORAGE:
     case CookieTreeNode::DetailedInfo::TYPE_SESSION_STORAGE:
@@ -1318,14 +1311,13 @@
     case CookieTreeNode::DetailedInfo::TYPE_SERVICE_WORKER:
     case CookieTreeNode::DetailedInfo::TYPE_SHARED_WORKER:
     case CookieTreeNode::DetailedInfo::TYPE_CACHE_STORAGE:
-      return DATABASE;
+      return 1;
+
     case CookieTreeNode::DetailedInfo::TYPE_HOST:
     case CookieTreeNode::DetailedInfo::TYPE_QUOTA:
-      return -1;
     default:
-      break;
+      return absl::nullopt;
   }
-  return -1;
 }
 
 void CookiesTreeModel::DeleteAllStoredObjects() {
diff --git a/chrome/browser/browsing_data/cookies_tree_model.h b/chrome/browser/browsing_data/cookies_tree_model.h
index 2711972e..c7f1090 100644
--- a/chrome/browser/browsing_data/cookies_tree_model.h
+++ b/chrome/browser/browsing_data/cookies_tree_model.h
@@ -304,17 +304,10 @@
     bool batch_in_progress_ = false;
   };
 
-  // ui::TreeModel methods:
-  // Returns the set of icons for the nodes in the tree. You only need override
-  // this if you don't want to use the default folder icons.
+  // ui::TreeModel:
   void GetIcons(std::vector<ui::ImageModel>* icons) override;
+  absl::optional<size_t> GetIconIndex(ui::TreeModelNode* node) override;
 
-  // Returns the index of the icon to use for |node|. Return -1 to use the
-  // default icon. The index is relative to the list of icons returned from
-  // GetIcons.
-  int GetIconIndex(ui::TreeModelNode* node) override;
-
-  // CookiesTreeModel methods:
   void DeleteAllStoredObjects();
 
   // Deletes a specific node in the tree, identified by |cookie_node|, and its
@@ -380,8 +373,6 @@
   GetCookieDeletionDisabledCallback(Profile* profile);
 
  private:
-  enum CookieIconIndex { COOKIE = 0, DATABASE = 1 };
-
   // Record that one batch has been delivered.
   void RecordBatchSeen();
 
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc
index 4ecf332..ebe8257 100644
--- a/chrome/browser/chrome_browser_interface_binders.cc
+++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -197,6 +197,7 @@
 #endif  // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS_ASH)
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "ash/components/audio/public/mojom/cros_audio_config.mojom.h"
 #include "ash/services/cellular_setup/public/mojom/cellular_setup.mojom.h"
 #include "ash/services/cellular_setup/public/mojom/esim_manager.mojom.h"
 #include "ash/services/multidevice_setup/multidevice_setup_service.h"
@@ -1178,6 +1179,12 @@
         map);
   }
 
+  if (ash::features::IsAudioSettingsPageEnabled()) {
+    RegisterWebUIControllerInterfaceBinder<
+        ash::audio_config::mojom::CrosAudioConfig,
+        chromeos::settings::OSSettingsUI>(map);
+  }
+
   RegisterWebUIControllerInterfaceBinder<audio::mojom::PageHandlerFactory,
                                          chromeos::AudioUI>(map);
 
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index d4afb0f..f102766 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -93,13 +93,13 @@
 #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service.h"
 #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service_factory.h"
 #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor.h"
-#include "chrome/browser/prefetch/search_prefetch/field_trial_settings.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_url_loader.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_url_loader_interceptor.h"
 #include "chrome/browser/preloading/navigation_ablation_throttle.h"
 #include "chrome/browser/preloading/prefetch/no_state_prefetch/chrome_no_state_prefetch_contents_delegate.h"
 #include "chrome/browser/preloading/prefetch/no_state_prefetch/no_state_prefetch_manager_factory.h"
 #include "chrome/browser/preloading/prefetch/no_state_prefetch/no_state_prefetch_navigation_throttle.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader_interceptor.h"
 #include "chrome/browser/privacy_sandbox/privacy_sandbox_settings_factory.h"
 #include "chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index b932474c..7ddb942 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -2850,6 +2850,7 @@
     "../ash/borealis/borealis_installer_unittest.cc",
     "../ash/borealis/borealis_launch_watcher_unittest.cc",
     "../ash/borealis/borealis_power_controller_unittest.cc",
+    "../ash/borealis/borealis_security_delegate_unittest.cc",
     "../ash/borealis/borealis_shutdown_monitor_unittest.cc",
     "../ash/borealis/borealis_task_unittest.cc",
     "../ash/borealis/borealis_util_unittest.cc",
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/BUILD.gn b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/BUILD.gn
new file mode 100644
index 0000000..30b42aa
--- /dev/null
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/BUILD.gn
@@ -0,0 +1,38 @@
+# Copyright 2022 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.
+
+source_set("helper") {
+  public = [ "secure_enclave_helper.h" ]
+
+  sources = [
+    "secure_enclave_helper.cc",
+    "secure_enclave_helper_impl.h",
+    "secure_enclave_helper_impl.mm",
+  ]
+
+  public_deps = [ "//base" ]
+
+  deps = [ "//third_party/boringssl" ]
+
+  frameworks = [
+    "CoreFoundation.framework",
+    "CryptoTokenKit.framework",
+    "Foundation.framework",
+    "Security.framework",
+  ]
+}
+
+source_set("test_support") {
+  testonly = true
+  public = [ "mock_secure_enclave_helper.h" ]
+
+  sources = [ "mock_secure_enclave_helper.cc" ]
+
+  frameworks = [ "Security.framework" ]
+
+  public_deps = [
+    ":helper",
+    "//testing/gmock",
+  ]
+}
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/mock_secure_enclave_helper.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/mock_secure_enclave_helper.cc
new file mode 100644
index 0000000..b1dc0e1
--- /dev/null
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/mock_secure_enclave_helper.cc
@@ -0,0 +1,12 @@
+// Copyright 2022 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/enterprise/connectors/device_trust/key_management/core/mac/mock_secure_enclave_helper.h"
+
+namespace enterprise_connectors::test {
+
+MockSecureEnclaveHelper::MockSecureEnclaveHelper() = default;
+MockSecureEnclaveHelper::~MockSecureEnclaveHelper() = default;
+
+}  // namespace enterprise_connectors::test
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/mock_secure_enclave_helper.h b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/mock_secure_enclave_helper.h
new file mode 100644
index 0000000..4d08c8a
--- /dev/null
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/mock_secure_enclave_helper.h
@@ -0,0 +1,37 @@
+// Copyright 2022 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_ENTERPRISE_CONNECTORS_DEVICE_TRUST_KEY_MANAGEMENT_CORE_MAC_MOCK_SECURE_ENCLAVE_HELPER_H_
+#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_KEY_MANAGEMENT_CORE_MAC_MOCK_SECURE_ENCLAVE_HELPER_H_
+
+#include "chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_helper.h"
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <Security/Security.h>
+
+#include "base/mac/scoped_cftyperef.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace enterprise_connectors::test {
+
+// Mocked implementation of the SecureEnclaveHelper interface.
+class MockSecureEnclaveHelper : public SecureEnclaveHelper {
+ public:
+  MockSecureEnclaveHelper();
+  ~MockSecureEnclaveHelper() override;
+
+  MOCK_METHOD(base::ScopedCFTypeRef<SecKeyRef>,
+              CreateSecureKey,
+              (CFDictionaryRef),
+              (override));
+  MOCK_METHOD(bool, Update, (CFDictionaryRef, CFDictionaryRef), (override));
+  MOCK_METHOD(bool, Delete, (CFDictionaryRef), (override));
+  MOCK_METHOD(bool, CheckExists, (CFDictionaryRef), (override));
+  MOCK_METHOD(bool, CheckKeychainUnlocked, (), (override));
+  MOCK_METHOD(bool, IsSecureEnclaveSupported, (), (override));
+};
+
+}  // namespace enterprise_connectors::test
+
+#endif  // CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_KEY_MANAGEMENT_CORE_MAC_MOCK_SECURE_ENCLAVE_HELPER_H_
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_helper.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_helper.cc
new file mode 100644
index 0000000..c21beed
--- /dev/null
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_helper.cc
@@ -0,0 +1,41 @@
+// Copyright 2022 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/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_helper.h"
+
+#include <memory>
+#include <utility>
+
+#include "base/check.h"
+#include "base/no_destructor.h"
+#include "chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_helper_impl.h"
+
+namespace enterprise_connectors {
+
+namespace {
+
+std::unique_ptr<SecureEnclaveHelper>* GetTestInstanceStorage() {
+  static base::NoDestructor<std::unique_ptr<SecureEnclaveHelper>> storage;
+  return storage.get();
+}
+
+}  // namespace
+
+// static
+std::unique_ptr<SecureEnclaveHelper> SecureEnclaveHelper::Create() {
+  std::unique_ptr<SecureEnclaveHelper>& test_instance =
+      *GetTestInstanceStorage();
+  if (test_instance)
+    return std::move(test_instance);
+  return std::make_unique<SecureEnclaveHelperImpl>();
+}
+
+// static
+void SecureEnclaveHelper::SetInstanceForTesting(
+    std::unique_ptr<SecureEnclaveHelper> helper) {
+  DCHECK(helper);
+  *GetTestInstanceStorage() = std::move(helper);
+}
+
+}  // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_helper.h b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_helper.h
new file mode 100644
index 0000000..6fba910
--- /dev/null
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_helper.h
@@ -0,0 +1,58 @@
+// Copyright 2022 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_ENTERPRISE_CONNECTORS_DEVICE_TRUST_KEY_MANAGEMENT_CORE_MAC_SECURE_ENCLAVE_HELPER_H_
+#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_KEY_MANAGEMENT_CORE_MAC_SECURE_ENCLAVE_HELPER_H_
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <Security/Security.h>
+
+#include <memory>
+
+#include "base/mac/scoped_cftyperef.h"
+
+namespace enterprise_connectors {
+
+// Wrapper for Security Framework Keychain APIs and Crypto utilities
+// to allow them to be mocked in tests.
+class SecureEnclaveHelper {
+ public:
+  virtual ~SecureEnclaveHelper() = default;
+
+  static void SetInstanceForTesting(
+      std::unique_ptr<SecureEnclaveHelper> helper);
+
+  static std::unique_ptr<SecureEnclaveHelper> Create();
+
+  // Issues the SecKeyCreateRandomKey API to create the secure key with its key
+  // `attributes`. Returns the key or a nullptr on failure.
+  virtual base::ScopedCFTypeRef<SecKeyRef> CreateSecureKey(
+      CFDictionaryRef attributes) = 0;
+
+  // Issues the SecItemUpdate API to update the the key retrieved with the
+  // `query` with its `attributes_to_update`. Returns true if the key
+  // attributes were updated successfully and false otherwise.
+  virtual bool Update(CFDictionaryRef query,
+                      CFDictionaryRef attributes_to_update) = 0;
+
+  // Issues the SecItemDelete API to delete the key retrieved with the `query`.
+  // Returns true if the key was deleted and false otherwise.
+  virtual bool Delete(CFDictionaryRef query) = 0;
+
+  // Issues the SecItemCopyMatching API to search the keychain using the
+  // `query` dictionary. Returns true if the key exists and false otherwise.
+  virtual bool CheckExists(CFDictionaryRef query) = 0;
+
+  // Issues the SecKeychainCopyDefault API to check if the keychain is unlocked.
+  // Returns true when the keychain is unlocked and false otherwise.
+  virtual bool CheckKeychainUnlocked() = 0;
+
+  // Uses the crypto library to check whether the Secure Enclave is supported on
+  // the device. Returns true if it is supported and false otherwise.
+  virtual bool IsSecureEnclaveSupported() = 0;
+};
+
+}  // namespace enterprise_connectors
+
+#endif  // CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_KEY_MANAGEMENT_CORE_MAC_SECURE_ENCLAVE_HELPER_H_
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_helper_impl.h b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_helper_impl.h
new file mode 100644
index 0000000..f9e1a56
--- /dev/null
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_helper_impl.h
@@ -0,0 +1,35 @@
+// Copyright 2022 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_ENTERPRISE_CONNECTORS_DEVICE_TRUST_KEY_MANAGEMENT_CORE_MAC_SECURE_ENCLAVE_HELPER_IMPL_H_
+#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_KEY_MANAGEMENT_CORE_MAC_SECURE_ENCLAVE_HELPER_IMPL_H_
+
+#include "chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_helper.h"
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <Security/Security.h>
+
+#include "base/mac/scoped_cftyperef.h"
+
+namespace enterprise_connectors {
+
+// Implementation of the SecureEnclaveHelper interface.
+class SecureEnclaveHelperImpl : public SecureEnclaveHelper {
+ public:
+  ~SecureEnclaveHelperImpl() override;
+
+  // SecureEnclaveHelper:
+  base::ScopedCFTypeRef<SecKeyRef> CreateSecureKey(
+      CFDictionaryRef attributes) override;
+  bool Update(CFDictionaryRef query,
+              CFDictionaryRef attributes_to_update) override;
+  bool Delete(CFDictionaryRef query) override;
+  bool CheckExists(CFDictionaryRef query) override;
+  bool CheckKeychainUnlocked() override;
+  bool IsSecureEnclaveSupported() override;
+};
+
+}  // namespace enterprise_connectors
+
+#endif  // CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_KEY_MANAGEMENT_CORE_MAC_SECURE_ENCLAVE_HELPER_IMPL_H_
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_helper_impl.mm b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_helper_impl.mm
new file mode 100644
index 0000000..f9363288
--- /dev/null
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_helper_impl.mm
@@ -0,0 +1,65 @@
+// Copyright 2022 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/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_helper_impl.h"
+
+#include <CryptoTokenKit/CryptoTokenKit.h>
+#import <Foundation/Foundation.h>
+#include <Security/Security.h>
+
+#include <memory>
+
+#include "base/mac/foundation_util.h"
+#include "base/mac/scoped_cftyperef.h"
+#include "base/mac/scoped_nsobject.h"
+
+namespace enterprise_connectors {
+
+SecureEnclaveHelperImpl::~SecureEnclaveHelperImpl() = default;
+
+base::ScopedCFTypeRef<SecKeyRef> SecureEnclaveHelperImpl::CreateSecureKey(
+    CFDictionaryRef attributes) {
+  base::ScopedCFTypeRef<CFErrorRef> error;
+  base::ScopedCFTypeRef<SecKeyRef> key(
+      SecKeyCreateRandomKey(attributes, error.InitializeInto()));
+  return key;
+}
+
+bool SecureEnclaveHelperImpl::Update(CFDictionaryRef query,
+                                     CFDictionaryRef attributes_to_update) {
+  return SecItemUpdate(query, attributes_to_update) == errSecSuccess;
+}
+
+bool SecureEnclaveHelperImpl::Delete(CFDictionaryRef query) {
+  return SecItemDelete(query) == errSecSuccess;
+}
+
+bool SecureEnclaveHelperImpl::CheckExists(CFDictionaryRef query) {
+  base::ScopedCFTypeRef<CFTypeRef> key;
+  SecItemCopyMatching(query, key.InitializeInto());
+  return key != nullptr;
+}
+
+bool SecureEnclaveHelperImpl::CheckKeychainUnlocked() {
+  base::ScopedCFTypeRef<SecKeychainRef> keychain;
+  auto status = SecKeychainCopyDefault(keychain.InitializeInto());
+  if (status != noErr)
+    return false;
+
+  SecKeychainStatus keychain_status;
+  status = SecKeychainGetStatus(keychain, &keychain_status);
+  if (status != noErr)
+    return false;
+
+  return keychain_status & kSecUnlockStateStatus;
+}
+
+bool SecureEnclaveHelperImpl::IsSecureEnclaveSupported() {
+  base::scoped_nsobject<TKTokenWatcher> token_watcher(
+      [[TKTokenWatcher alloc] init]);
+  return ([token_watcher.get().tokenIDs
+      containsObject:base::mac::CFToNSCast(kSecAttrTokenIDSecureEnclave)]);
+}
+
+}  // namespace enterprise_connectors
diff --git a/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc b/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc
index a1960eb..bf88cd2f 100644
--- a/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc
+++ b/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc
@@ -381,7 +381,7 @@
         profile(), base::BindRepeating(&CreateNetworkingPrivateDelegate));
 
     network_handler_test_helper_ =
-        std::make_unique<chromeos::NetworkHandlerTestHelper>();
+        std::make_unique<ash::NetworkHandlerTestHelper>();
 
     ConfigFakeNetwork();
 
@@ -499,8 +499,7 @@
   }
 
  protected:
-  std::unique_ptr<chromeos::NetworkHandlerTestHelper>
-      network_handler_test_helper_;
+  std::unique_ptr<ash::NetworkHandlerTestHelper> network_handler_test_helper_;
   testing::NiceMock<policy::MockConfigurationPolicyProvider> provider_;
   sync_preferences::TestingPrefServiceSyncable user_prefs_;
   TestingPrefServiceSimple local_state_;
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
index 4d99658..fca3f12 100644
--- a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
+++ b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
@@ -598,7 +598,13 @@
 };
 
 // Tests getWebGLStatus function when WebGL is allowed.
-IN_PROC_BROWSER_TEST_F(ExtensionWebstoreGetWebGLStatusTest, Allowed) {
+// Flaky on Mac. https://crbug.com/1346413.
+#if BUILDFLAG(IS_MAC)
+#define MAYBE_Allowed DISABLED_Allowed
+#else
+#define MAYBE_Allowed Allowed
+#endif
+IN_PROC_BROWSER_TEST_F(ExtensionWebstoreGetWebGLStatusTest, MAYBE_Allowed) {
   bool webgl_allowed = true;
   RunTest(webgl_allowed);
 }
diff --git a/chrome/browser/extensions/extension_keeplist_chromeos.cc b/chrome/browser/extensions/extension_keeplist_chromeos.cc
index 0e701241..96fddbe 100644
--- a/chrome/browser/extensions/extension_keeplist_chromeos.cc
+++ b/chrome/browser/extensions/extension_keeplist_chromeos.cc
@@ -66,7 +66,6 @@
 #endif
 
         extension_misc::kGoogleKeepAppId, extension_misc::kCalculatorAppId,
-        extension_misc::kTextEditorAppId,
         extension_misc::kInAppPaymentsSupportAppId,
         extension_misc::kIdentityApiUiAppId, extension_misc::kGnubbyAppId
   });
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 021f101e..5db56b8 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -2947,6 +2947,11 @@
     "expiry_milestone": 90
   },
   {
+    "name": "enable-tailored-security-desktop-notice",
+    "owners": ["jacastro@chromium.org", "chrome-counter-abuse-alerts@google.com"],
+    "expiry_milestone": 107
+  },
+  {
     "name": "enable-tflite-language-detection",
     "owners": [ "sophiechang", "chrome-intelligence-core@google.com" ],
     "expiry_milestone": 110
@@ -6512,7 +6517,7 @@
   {
     "name": "web-feed-ios",
     "owners": [ "adamta", "sczs", "tinazwang" ],
-    "expiry_milestone": 105
+    "expiry_milestone": 107
   },
   {
     "name": "web-feed-onboarding",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 3dfb2b1b..1286159 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -2703,6 +2703,13 @@
 const char kTabSearchFuzzySearchDescription[] =
     "Enable fuzzy search for Tab Search.";
 
+const char kTailoredSecurityDesktopNoticeName[] =
+    "Dialogs to notify the user of Safe Browsing Enhanced Protection";
+const char kTailoredSecurityDesktopNoticeDescription[] =
+    "Enable the use of dialogs to notify the user of Safe Browsing Enhanced "
+    "Protection within Chrome when they enable or disable Enhanced Protection "
+    "on their Account.";
+
 const char kTFLiteLanguageDetectionName[] = "TFLite-based Language Detection";
 const char kTFLiteLanguageDetectionDescription[] =
     "Uses TFLite for language detection in place of CLD3";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 43a3ab34..20e326a1 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1529,6 +1529,9 @@
 extern const char kTabStripImprovementsAndroidName[];
 extern const char kTabStripImprovementsAndroidDescription[];
 
+extern const char kTailoredSecurityDesktopNoticeName[];
+extern const char kTailoredSecurityDesktopNoticeDescription[];
+
 extern const char kTFLiteLanguageDetectionName[];
 extern const char kTFLiteLanguageDetectionDescription[];
 
diff --git a/chrome/browser/nearby_sharing/wifi_network_configuration/wifi_network_configuration_handler_unittest.cc b/chrome/browser/nearby_sharing/wifi_network_configuration/wifi_network_configuration_handler_unittest.cc
index f6a15b7..1e26c33b 100644
--- a/chrome/browser/nearby_sharing/wifi_network_configuration/wifi_network_configuration_handler_unittest.cc
+++ b/chrome/browser/nearby_sharing/wifi_network_configuration/wifi_network_configuration_handler_unittest.cc
@@ -27,7 +27,7 @@
     : public chromeos::network_config::CrosNetworkConfig {
  public:
   explicit FakeCrosNetworkConfig(
-      chromeos::NetworkStateTestHelper* network_state_test_helper)
+      ash::NetworkStateTestHelper* network_state_test_helper)
       : CrosNetworkConfig(network_state_test_helper->network_state_handler(),
                           network_state_test_helper->network_device_handler(),
                           /*cellular_inhibitor=*/nullptr,
@@ -77,7 +77,7 @@
 
 TEST(WifiNetworkConfigurationHandlerTest, Success) {
   base::test::TaskEnvironment task_environment;
-  chromeos::NetworkStateTestHelper network_state_test_helper{
+  ash::NetworkStateTestHelper network_state_test_helper{
       /*use_default_devices_and_services=*/true};
   FakeCrosNetworkConfig fake_cros_network_config{&network_state_test_helper};
 
@@ -118,7 +118,7 @@
 
 TEST(WifiNetworkConfigurationHandlerTest, Failure) {
   base::test::TaskEnvironment task_environment;
-  chromeos::NetworkStateTestHelper network_state_test_helper{
+  ash::NetworkStateTestHelper network_state_test_helper{
       /*use_default_devices_and_services=*/true};
   FakeCrosNetworkConfig fake_cros_network_config{&network_state_test_helper};
 
diff --git a/chrome/browser/policy/networking/network_configuration_updater_ash_unittest.cc b/chrome/browser/policy/networking/network_configuration_updater_ash_unittest.cc
index 41dd14c..cb92023d 100644
--- a/chrome/browser/policy/networking/network_configuration_updater_ash_unittest.cc
+++ b/chrome/browser/policy/networking/network_configuration_updater_ash_unittest.cc
@@ -100,7 +100,7 @@
   MOCK_METHOD0(OnPolicyProvidedCertsChanged, void());
 };
 
-class FakeNetworkDeviceHandler : public chromeos::FakeNetworkDeviceHandler {
+class FakeNetworkDeviceHandler : public ash::FakeNetworkDeviceHandler {
  public:
   FakeNetworkDeviceHandler() = default;
 
@@ -420,7 +420,7 @@
   content::BrowserTaskEnvironment task_environment_;
 
   std::unique_ptr<chromeos::onc::OncParsedCertificates> fake_certificates_;
-  StrictMock<chromeos::MockManagedNetworkConfigurationHandler>
+  StrictMock<ash::MockManagedNetworkConfigurationHandler>
       network_config_handler_;
   FakeNetworkDeviceHandler network_device_handler_;
   ash::ScopedStubInstallAttributes scoped_stub_install_attributes_;
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index b5c7f1d..20969d8 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -49,10 +49,10 @@
 #include "chrome/browser/permissions/quiet_notification_permission_ui_state.h"
 #include "chrome/browser/prefetch/prefetch_prefs.h"
 #include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_origin_decider.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service.h"
 #include "chrome/browser/prefs/chrome_pref_service_factory.h"
 #include "chrome/browser/prefs/incognito_mode_prefs.h"
 #include "chrome/browser/prefs/session_startup_pref.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h"
 #include "chrome/browser/printing/print_preview_sticky_settings.h"
 #include "chrome/browser/profiles/chrome_version_service.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.cc b/chrome/browser/preloading/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.cc
similarity index 96%
rename from chrome/browser/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.cc
rename to chrome/browser/preloading/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.cc
index a71abd7..62871fe 100644
--- a/chrome/browser/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.cc
+++ b/chrome/browser/preloading/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.cc
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.h"
 
 #include <string>
 #include <utility>
 
 #include "base/bind.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service_factory.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "content/public/browser/storage_partition.h"
 #include "net/base/load_flags.h"
diff --git a/chrome/browser/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.h b/chrome/browser/preloading/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.h
similarity index 90%
rename from chrome/browser/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.h
rename to chrome/browser/preloading/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.h
index 3d1a498..362f3f8 100644
--- a/chrome/browser/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.h
+++ b/chrome/browser/preloading/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_CACHE_ALIAS_SEARCH_PREFETCH_URL_LOADER_H_
-#define CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_CACHE_ALIAS_SEARCH_PREFETCH_URL_LOADER_H_
+#ifndef CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_CACHE_ALIAS_SEARCH_PREFETCH_URL_LOADER_H_
+#define CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_CACHE_ALIAS_SEARCH_PREFETCH_URL_LOADER_H_
 
 #include <memory>
 #include <string>
@@ -11,8 +11,8 @@
 
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_url_loader.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader.h"
 #include "chrome/browser/profiles/profile.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
@@ -123,4 +123,4 @@
   base::WeakPtrFactory<CacheAliasSearchPrefetchURLLoader> weak_factory_{this};
 };
 
-#endif  // CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_CACHE_ALIAS_SEARCH_PREFETCH_URL_LOADER_H_
+#endif  // CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_CACHE_ALIAS_SEARCH_PREFETCH_URL_LOADER_H_
diff --git a/chrome/browser/prefetch/search_prefetch/field_trial_settings.cc b/chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.cc
similarity index 95%
rename from chrome/browser/prefetch/search_prefetch/field_trial_settings.cc
rename to chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.cc
index f5d15d9..db6256d 100644
--- a/chrome/browser/prefetch/search_prefetch/field_trial_settings.cc
+++ b/chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/prefetch/search_prefetch/field_trial_settings.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.h"
 
 #include <string>
 
diff --git a/chrome/browser/prefetch/search_prefetch/field_trial_settings.h b/chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.h
similarity index 86%
rename from chrome/browser/prefetch/search_prefetch/field_trial_settings.h
rename to chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.h
index 908657b..62ab7ae 100644
--- a/chrome/browser/prefetch/search_prefetch/field_trial_settings.h
+++ b/chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_FIELD_TRIAL_SETTINGS_H_
-#define CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_FIELD_TRIAL_SETTINGS_H_
+#ifndef CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_FIELD_TRIAL_SETTINGS_H_
+#define CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_FIELD_TRIAL_SETTINGS_H_
 
 #include "base/feature_list.h"
 #include "base/time/time.h"
@@ -44,4 +44,4 @@
 // navigation start provides benefit over the typical navigation flow.
 bool IsSearchNavigationPrefetchEnabled();
 
-#endif  // CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_FIELD_TRIAL_SETTINGS_H_
+#endif  // CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_FIELD_TRIAL_SETTINGS_H_
diff --git a/chrome/browser/prefetch/search_prefetch/search_prefetch_browser_test_base.cc b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_browser_test_base.cc
similarity index 97%
rename from chrome/browser/prefetch/search_prefetch/search_prefetch_browser_test_base.cc
rename to chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_browser_test_base.cc
index 5d6d28b..6bc5514 100644
--- a/chrome/browser/prefetch/search_prefetch/search_prefetch_browser_test_base.cc
+++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_browser_test_base.cc
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_browser_test_base.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_browser_test_base.h"
 
 #include "base/containers/adapters.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
 #include "chrome/browser/devtools/devtools_window.h"
 #include "chrome/browser/devtools/devtools_window_testing.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_request.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service_factory.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
 #include "chrome/browser/ui/browser.h"
diff --git a/chrome/browser/prefetch/search_prefetch/search_prefetch_browser_test_base.h b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_browser_test_base.h
similarity index 94%
rename from chrome/browser/prefetch/search_prefetch/search_prefetch_browser_test_base.h
rename to chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_browser_test_base.h
index 096f58b..e0359f9 100644
--- a/chrome/browser/prefetch/search_prefetch/search_prefetch_browser_test_base.h
+++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_browser_test_base.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_BROWSER_TEST_BASE_H_
-#define CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_BROWSER_TEST_BASE_H_
+#ifndef CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_BROWSER_TEST_BASE_H_
+#define CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_BROWSER_TEST_BASE_H_
 
 #include <string>
 
@@ -14,7 +14,7 @@
 #include <vector>
 
 #include "base/memory/raw_ptr.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_request.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "content/public/test/content_mock_cert_verifier.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
@@ -181,4 +181,4 @@
   raw_ptr<DevToolsWindow> window_ = nullptr;
 };
 
-#endif  // CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_BROWSER_TEST_BASE_H_
+#endif  // CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_BROWSER_TEST_BASE_H_
diff --git a/chrome/browser/prefetch/search_prefetch/search_prefetch_request.cc b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.cc
similarity index 98%
rename from chrome/browser/prefetch/search_prefetch/search_prefetch_request.cc
rename to chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.cc
index ad85b6c..616c8f7 100644
--- a/chrome/browser/prefetch/search_prefetch/search_prefetch_request.cc
+++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_request.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.h"
 
 #include <algorithm>
 #include <string>
@@ -14,7 +14,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/trace_event/trace_event.h"
 #include "chrome/browser/prefetch/prefetch_headers.h"
-#include "chrome/browser/prefetch/search_prefetch/streaming_search_prefetch_url_loader.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/streaming_search_prefetch_url_loader.h"
 #include "chrome/browser/preloading/prerender/prerender_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
diff --git a/chrome/browser/prefetch/search_prefetch/search_prefetch_request.h b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.h
similarity index 96%
rename from chrome/browser/prefetch/search_prefetch/search_prefetch_request.h
rename to chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.h
index 6aaf05ac..ab8152c 100644
--- a/chrome/browser/prefetch/search_prefetch/search_prefetch_request.h
+++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_REQUEST_H_
-#define CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_REQUEST_H_
+#ifndef CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_REQUEST_H_
+#define CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_REQUEST_H_
 
 #include <memory>
 
@@ -205,4 +205,4 @@
   base::raw_ptr<Profile> profile_;
 };
 
-#endif  // CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_REQUEST_H_
+#endif  // CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_REQUEST_H_
diff --git a/chrome/browser/prefetch/search_prefetch/search_prefetch_service.cc b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.cc
similarity index 98%
rename from chrome/browser/prefetch/search_prefetch/search_prefetch_service.cc
rename to chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.cc
index 8ebf121..36139a4 100644
--- a/chrome/browser/prefetch/search_prefetch/search_prefetch_service.cc
+++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h"
 
 #include <iterator>
 #include <memory>
@@ -17,9 +17,9 @@
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/prefetch/pref_names.h"
 #include "chrome/browser/prefetch/prefetch_prefs.h"
-#include "chrome/browser/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.h"
-#include "chrome/browser/prefetch/search_prefetch/field_trial_settings.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_url_loader.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/cache_alias_search_prefetch_url_loader.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader.h"
 #include "chrome/browser/preloading/prerender/prerender_manager.h"
 #include "chrome/browser/preloading/prerender/prerender_utils.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/prefetch/search_prefetch/search_prefetch_service.h b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h
similarity index 96%
rename from chrome/browser/prefetch/search_prefetch/search_prefetch_service.h
rename to chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h
index 0a57969..6458aad7 100644
--- a/chrome/browser/prefetch/search_prefetch/search_prefetch_service.h
+++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_SERVICE_H_
-#define CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_SERVICE_H_
+#ifndef CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_SERVICE_H_
+#define CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_SERVICE_H_
 
 #include <map>
 #include <memory>
@@ -16,7 +16,7 @@
 #include "base/scoped_observation.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_request.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/omnibox/browser/autocomplete_match.h"
 #include "components/search_engines/template_url_data.h"
@@ -265,4 +265,4 @@
   base::WeakPtrFactory<SearchPrefetchService> weak_factory_{this};
 };
 
-#endif  // CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_SERVICE_H_
+#endif  // CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_SERVICE_H_
diff --git a/chrome/browser/prefetch/search_prefetch/search_prefetch_service_browsertest.cc b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_browsertest.cc
similarity index 99%
rename from chrome/browser/prefetch/search_prefetch/search_prefetch_service_browsertest.cc
rename to chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_browsertest.cc
index 2ab14b1..b80a4b2 100644
--- a/chrome/browser/prefetch/search_prefetch/search_prefetch_service_browsertest.cc
+++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_browsertest.cc
@@ -12,10 +12,10 @@
 #include "chrome/browser/chrome_content_browser_client.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/prefetch/prefetch_prefs.h"
-#include "chrome/browser/prefetch/search_prefetch/field_trial_settings.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_browser_test_base.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service_factory.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_browser_test_base.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
 #include "chrome/browser/ssl/security_state_tab_helper.h"
diff --git a/chrome/browser/prefetch/search_prefetch/search_prefetch_service_factory.cc b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_factory.cc
similarity index 87%
rename from chrome/browser/prefetch/search_prefetch/search_prefetch_service_factory.cc
rename to chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_factory.cc
index e8ec717..92e65d4 100644
--- a/chrome/browser/prefetch/search_prefetch/search_prefetch_service_factory.cc
+++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_factory.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service_factory.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_factory.h"
 
 #include "base/no_destructor.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "content/public/browser/browser_context.h"
diff --git a/chrome/browser/prefetch/search_prefetch/search_prefetch_service_factory.h b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_factory.h
similarity index 82%
rename from chrome/browser/prefetch/search_prefetch/search_prefetch_service_factory.h
rename to chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_factory.h
index 620e814b..07bfb48 100644
--- a/chrome/browser/prefetch/search_prefetch/search_prefetch_service_factory.h
+++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_factory.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_SERVICE_FACTORY_H_
-#define CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_SERVICE_FACTORY_H_
+#ifndef CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_SERVICE_FACTORY_H_
+#define CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_SERVICE_FACTORY_H_
 
 #include "base/no_destructor.h"
 #include "components/keyed_service/content/browser_context_keyed_service_factory.h"
@@ -42,4 +42,4 @@
       content::BrowserContext* context) const override;
 };
 
-#endif  // CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_SERVICE_FACTORY_H_
+#endif  // CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_SERVICE_FACTORY_H_
diff --git a/chrome/browser/prefetch/search_prefetch/search_prefetch_url_loader.cc b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader.cc
similarity index 88%
rename from chrome/browser/prefetch/search_prefetch/search_prefetch_url_loader.cc
rename to chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader.cc
index ef9ef7e..8e8f41d 100644
--- a/chrome/browser/prefetch/search_prefetch/search_prefetch_url_loader.cc
+++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_url_loader.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader.h"
 
 #include <utility>
 
diff --git a/chrome/browser/prefetch/search_prefetch/search_prefetch_url_loader.h b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader.h
similarity index 84%
rename from chrome/browser/prefetch/search_prefetch/search_prefetch_url_loader.h
rename to chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader.h
index 380505b..5647f88 100644
--- a/chrome/browser/prefetch/search_prefetch/search_prefetch_url_loader.h
+++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_URL_LOADER_H_
-#define CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_URL_LOADER_H_
+#ifndef CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_URL_LOADER_H_
+#define CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_URL_LOADER_H_
 
 #include <memory>
 
@@ -42,4 +42,4 @@
   base::TimeTicks interception_time_;
 };
 
-#endif  // CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_URL_LOADER_H_
+#endif  // CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_URL_LOADER_H_
diff --git a/chrome/browser/prefetch/search_prefetch/search_prefetch_url_loader_interceptor.cc b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader_interceptor.cc
similarity index 88%
rename from chrome/browser/prefetch/search_prefetch/search_prefetch_url_loader_interceptor.cc
rename to chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader_interceptor.cc
index f203644..71d4a1fd 100644
--- a/chrome/browser/prefetch/search_prefetch/search_prefetch_url_loader_interceptor.cc
+++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader_interceptor.cc
@@ -2,15 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_url_loader_interceptor.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader_interceptor.h"
 
 #include <memory>
 #include <utility>
 
 #include "base/callback.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service_factory.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_url_loader.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_factory.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader.h"
 #include "chrome/browser/preloading/prerender/prerender_utils.h"
 #include "chrome/browser/profiles/profile.h"
 #include "content/public/browser/browser_context.h"
diff --git a/chrome/browser/prefetch/search_prefetch/search_prefetch_url_loader_interceptor.h b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader_interceptor.h
similarity index 84%
rename from chrome/browser/prefetch/search_prefetch/search_prefetch_url_loader_interceptor.h
rename to chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader_interceptor.h
index 96f9c03..bb1f6733 100644
--- a/chrome/browser/prefetch/search_prefetch/search_prefetch_url_loader_interceptor.h
+++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader_interceptor.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_URL_LOADER_INTERCEPTOR_H_
-#define CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_URL_LOADER_INTERCEPTOR_H_
+#ifndef CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_URL_LOADER_INTERCEPTOR_H_
+#define CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_URL_LOADER_INTERCEPTOR_H_
 
 #include <memory>
 
@@ -51,4 +51,4 @@
   SEQUENCE_CHECKER(sequence_checker_);
 };
 
-#endif  // CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_URL_LOADER_INTERCEPTOR_H_
+#endif  // CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_SEARCH_PREFETCH_URL_LOADER_INTERCEPTOR_H_
diff --git a/chrome/browser/prefetch/search_prefetch/search_preload_unified_browsertest.cc b/chrome/browser/preloading/prefetch/search_prefetch/search_preload_unified_browsertest.cc
similarity index 99%
rename from chrome/browser/prefetch/search_prefetch/search_preload_unified_browsertest.cc
rename to chrome/browser/preloading/prefetch/search_prefetch/search_preload_unified_browsertest.cc
index 5e2d3c1..0abe2a1 100644
--- a/chrome/browser/prefetch/search_prefetch/search_preload_unified_browsertest.cc
+++ b/chrome/browser/preloading/prefetch/search_prefetch/search_preload_unified_browsertest.cc
@@ -12,9 +12,9 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "build/build_config.h"
 #include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h"
-#include "chrome/browser/prefetch/search_prefetch/field_trial_settings.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service_factory.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_factory.h"
 #include "chrome/browser/preloading/prerender/prerender_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
diff --git a/chrome/browser/prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc b/chrome/browser/preloading/prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc
similarity index 98%
rename from chrome/browser/prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc
rename to chrome/browser/preloading/prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc
index 408f2ad..6e76700 100644
--- a/chrome/browser/prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc
+++ b/chrome/browser/preloading/prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/prefetch/search_prefetch/streaming_search_prefetch_url_loader.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/streaming_search_prefetch_url_loader.h"
 
 #include <string>
 #include <utility>
@@ -12,7 +12,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
-#include "chrome/browser/prefetch/search_prefetch/field_trial_settings.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.h"
 #include "chrome/browser/profiles/profile.h"
 #include "content/public/browser/storage_partition.h"
 #include "mojo/public/c/system/data_pipe.h"
diff --git a/chrome/browser/prefetch/search_prefetch/streaming_search_prefetch_url_loader.h b/chrome/browser/preloading/prefetch/search_prefetch/streaming_search_prefetch_url_loader.h
similarity index 94%
rename from chrome/browser/prefetch/search_prefetch/streaming_search_prefetch_url_loader.h
rename to chrome/browser/preloading/prefetch/search_prefetch/streaming_search_prefetch_url_loader.h
index b8e6d9c..3e6e80c 100644
--- a/chrome/browser/prefetch/search_prefetch/streaming_search_prefetch_url_loader.h
+++ b/chrome/browser/preloading/prefetch/search_prefetch/streaming_search_prefetch_url_loader.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_STREAMING_SEARCH_PREFETCH_URL_LOADER_H_
-#define CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_STREAMING_SEARCH_PREFETCH_URL_LOADER_H_
+#ifndef CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_STREAMING_SEARCH_PREFETCH_URL_LOADER_H_
+#define CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_STREAMING_SEARCH_PREFETCH_URL_LOADER_H_
 
 #include <memory>
 #include <string>
@@ -13,8 +13,8 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_request.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_url_loader.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
@@ -225,4 +225,4 @@
   base::WeakPtrFactory<StreamingSearchPrefetchURLLoader> weak_factory_{this};
 };
 
-#endif  // CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_STREAMING_SEARCH_PREFETCH_URL_LOADER_H_
+#endif  // CHROME_BROWSER_PRELOADING_PREFETCH_SEARCH_PREFETCH_STREAMING_SEARCH_PREFETCH_URL_LOADER_H_
diff --git a/chrome/browser/preloading/prerender/omnibox_prerender_browsertest.cc b/chrome/browser/preloading/prerender/omnibox_prerender_browsertest.cc
index 936a12e..c733c1f 100644
--- a/chrome/browser/preloading/prerender/omnibox_prerender_browsertest.cc
+++ b/chrome/browser/preloading/prerender/omnibox_prerender_browsertest.cc
@@ -12,8 +12,8 @@
 #include "chrome/browser/predictors/autocomplete_action_predictor.h"
 #include "chrome/browser/predictors/autocomplete_action_predictor_factory.h"
 #include "chrome/browser/prefetch/prefetch_prefs.h"
-#include "chrome/browser/prefetch/search_prefetch/field_trial_settings.h"
 #include "chrome/browser/preloading/chrome_preloading.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.h"
 #include "chrome/browser/preloading/prerender/prerender_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
diff --git a/chrome/browser/preloading/prerender/prerender_manager.cc b/chrome/browser/preloading/prerender/prerender_manager.cc
index 0ce0c0d..3b07f93 100644
--- a/chrome/browser/preloading/prerender/prerender_manager.cc
+++ b/chrome/browser/preloading/prerender/prerender_manager.cc
@@ -12,9 +12,9 @@
 #include "base/time/time.h"
 #include "base/timer/timer.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
-#include "chrome/browser/prefetch/search_prefetch/field_trial_settings.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service_factory.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_factory.h"
 #include "chrome/browser/preloading/prerender/prerender_utils.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
diff --git a/chrome/browser/preloading/prerender/prerender_omnibox_ui_browsertest.cc b/chrome/browser/preloading/prerender/prerender_omnibox_ui_browsertest.cc
index 7148d66..2b58299 100644
--- a/chrome/browser/preloading/prerender/prerender_omnibox_ui_browsertest.cc
+++ b/chrome/browser/preloading/prerender/prerender_omnibox_ui_browsertest.cc
@@ -14,9 +14,9 @@
 #include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h"
 #include "chrome/browser/predictors/autocomplete_action_predictor.h"
 #include "chrome/browser/predictors/autocomplete_action_predictor_factory.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service_factory.h"
 #include "chrome/browser/preloading/chrome_preloading.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_factory.h"
 #include "chrome/browser/preloading/prerender/prerender_manager.h"
 #include "chrome/browser/preloading/prerender/prerender_utils.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
index c86dad33..1dbf4a1 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
@@ -26,7 +26,6 @@
   "../common/key_code.js",
   "../common/tree_walker.js",
   "background/braille/cursor_dots.js",
-  "background/braille/liblouis.js",
   "background/braille/pan_strategy.js",
   "background/chromevox.js",
   "common/abstract_earcons.js",
@@ -70,6 +69,7 @@
   "background/braille/braille_translator_manager.js",
   "background/braille/cursor_dots.js",
   "background/braille/expanding_braille_translator.js",
+  "background/braille/liblouis.js",
   "background/braille/pan_strategy.js",
   "background/braille/spans.js",
   "background/chromevox_state.js",
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.html b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.html
index 4558424..9ea919e 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.html
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.html
@@ -1,7 +1,19 @@
 <!-- ChromeVox -->
+
+<!-- ChromeVox compiled script (non-ES6 modules) packed into one file. -->
 <script src="../chromeVoxChromeBackgroundScript.js" charset="utf-8">
 </script>
 
+<!--
+  ChromeVox ES6 module(s).
+
+  During the transition to ES6 modules, this top level module will import all
+  migrated modules. The migration will occur in breadth-first order, starting
+  with background.js. ES6 modules can "depend" on Closure files (since these are
+  global), but not vice versa.
+-->
+<script type="module" src="es6_loader.js"></script>
+
 <!-- Generated at build time -->
 <script type="text/javascript" src="../phonetic_dictionaries.js"
   charset="utf-8"></script>
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler.js
index 1ec5e03c..2f7ce2ef 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler.js
@@ -13,6 +13,7 @@
 
 import {BrailleTranslatorManager} from './braille_translator_manager.js';
 import {ExpandingBrailleTranslator} from './expanding_braille_translator.js';
+import {LibLouis} from './liblouis.js';
 import {ExtraCellsSpan, ValueSelectionSpan, ValueSpan} from './spans.js';
 
 export class BrailleInputHandler {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_translator_manager.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_translator_manager.js
index 1d23cc70..9b19e29 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_translator_manager.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_translator_manager.js
@@ -8,6 +8,7 @@
 import {BrailleTable} from '../../common/braille/braille_table.js';
 
 import {ExpandingBrailleTranslator} from './expanding_braille_translator.js';
+import {LibLouis} from './liblouis.js';
 
 export class BrailleTranslatorManager {
   /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator.js
index 626d6d1a..9495ed7 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator.js
@@ -6,6 +6,7 @@
  * @fileoverview Translates text to braille, optionally with some parts
  * uncontracted.
  */
+import {LibLouis} from './liblouis.js';
 import {BrailleTextStyleSpan, ExtraCellsSpan, ValueSelectionSpan, ValueSpan} from './spans.js';
 
 /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator_test.js
index d247bb1..9690a59 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator_test.js
@@ -18,6 +18,7 @@
     await importModule(
         ['ExtraCellsSpan', 'ValueSelectionSpan', 'ValueSpan'],
         '/chromevox/background/braille/spans.js');
+    await importModule('LibLouis', '/chromevox/background/braille/liblouis.js');
   }
 };
 
@@ -26,7 +27,6 @@
   '../../../common/testing/assert_additions.js',
   '../../testing/fake_dom.js',
   '../../common/spannable.js',
-  'liblouis.js',
 ];
 
 /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/liblouis.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/liblouis.js
index bc1a0b2..3cf7502 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/liblouis.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/liblouis.js
@@ -6,11 +6,8 @@
  * @fileoverview JavaScript shim for the liblouis Web Assembly wrapper.
  */
 
-goog.provide('LibLouis');
-goog.provide('LibLouis.FormType');
-
 /** Encapsulates a liblouis Web Assembly instance in the page. */
-LibLouis = class {
+export class LibLouis {
   /**
    * @param {string} wasmPath Path to .wasm file for the module.
    * @param {string=} opt_tablesDir Path to tables directory.
@@ -162,7 +159,7 @@
       this.onInstanceLoad_();
     });
   }
-};
+}
 
 
 /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/liblouis_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/liblouis_test.js
index ecbe6adb..9a49a0f0 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/liblouis_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/liblouis_test.js
@@ -16,6 +16,7 @@
     await super.setUpDeferred();
     await importModule(
         'BrailleTable', '/chromevox/common/braille/braille_table.js');
+    await importModule('LibLouis', '/chromevox/background/braille/liblouis.js');
   }
 
   createLiblouis() {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/spans.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/spans.js
index 51aa8c8e..0ab8fa4e 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/spans.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/spans.js
@@ -7,6 +7,8 @@
  * and selections.
  */
 
+import {LibLouis} from './liblouis.js';
+
 /** Attached to the value region of a braille spannable. */
 export class ValueSpan {
   /** @param {number} offset The offset of the span into the value. */
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/classic_background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/classic_background.js
index 85d8008..093187c 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/classic_background.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/classic_background.js
@@ -54,7 +54,8 @@
     ChromeVox.tts = this.tts;
     ChromeVox.braille = this.backgroundBraille_;
 
-    this.onIntroduceChromeVox();
+    chrome.accessibilityPrivate.onIntroduceChromeVox.addListener(
+        this.onIntroduceChromeVox);
 
     // Set up a message passing system for goog.provide() calls from
     // within the content scripts.
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js
index df38e745..e208a52 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js
@@ -10,6 +10,7 @@
  */
 import {Cursor, CURSOR_NODE_INDEX, CursorMovement, CursorUnit} from '../../../common/cursors/cursor.js';
 import {CursorRange} from '../../../common/cursors/range.js';
+import {LibLouis} from '../braille/liblouis.js';
 import {Output} from '../output/output.js';
 import {OutputEventType, OutputNodeSpan} from '../output/output_types.js';
 
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js
index 150d8ac..9739a5e 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js
@@ -12,6 +12,7 @@
 import {ChromeVoxEvent} from '../../common/custom_automation_event.js';
 import {Msgs} from '../../common/msgs.js';
 import {BrailleBackground} from '../braille/braille_background.js';
+import {LibLouis} from '../braille/liblouis.js';
 import {BrailleTextStyleSpan, ValueSelectionSpan, ValueSpan} from '../braille/spans.js';
 import {ChromeVoxState, ChromeVoxStateObserver} from '../chromevox_state.js';
 import {Color} from '../color.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js
index 61ebedd..b6daa217 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js
@@ -6,11 +6,6 @@
  * @fileoverview Loader for the background page.
  */
 
-// These legacy Closure requires will eventually be moved to ES6 modules (see
-// below block). These requires represent a dependency graph sourced from
-// loader.js via a script node in our top level html. Once done, that script can
-// itself be type="module".
-
 goog.require('AbstractEarcons');
 goog.require('AncestryRecoveryStrategy');
 goog.require('AutomationPredicate');
@@ -26,8 +21,6 @@
 goog.require('EventLog');
 goog.require('JaPhoneticData');
 goog.require('KeyCode');
-goog.require('LibLouis');
-goog.require('LibLouis.FormType');
 goog.require('LogType');
 goog.require('NavBraille');
 goog.require('PanelNodeMenuData');
@@ -47,10 +40,3 @@
 goog.require('goog.i18n.MessageFormat');
 
 goog.require('ALL_NODE_MENU_DATA');
-// ChromeVox ES6 module(s).
-//
-// During the transition to ES6 modules, this top level module will import all
-// migrated modules. The migration will occur in breadth-first order, starting
-// with background.js. ES6 modules can "depend" on Closure provides (since these
-// are global), but not vice versa. Those Closure provides are above.
-import('/chromevox/background/es6_loader.js');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background_test.js
index 8a747ac7..520b50ac 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background_test.js
@@ -260,10 +260,7 @@
       lastSpokenTextString);
 });
 
-AX_TEST_F('ChromeVoxTtsBackgroundTest', 'NumberReadingStyle', async function() {
-  // This test depends on local storage initialized by prefs.
-  await importModule('ChromeVoxPrefs', '/chromevox/background/prefs.js');
-
+AX_TEST_F('ChromeVoxTtsBackgroundTest', 'NumberReadingStyle', function() {
   let lastSpokenTextString = '';
   tts.speakUsingQueue_ = function(utterance, _) {
     lastSpokenTextString = utterance.textString;
@@ -358,10 +355,7 @@
   assertEqualsJSON(['a'], split('a', 'b'));
 });
 
-AX_TEST_F('ChromeVoxTtsBackgroundTest', 'Phonetics', async function() {
-  // JaPhoneticMap gets initialized by Background.
-  await importModule('Background', '/chromevox/background/background.js');
-
+AX_TEST_F('ChromeVoxTtsBackgroundTest', 'Phonetics', function() {
   let spokenStrings = [];
   tts.speakUsingQueue_ = (utterance, ...rest) => {
     spokenStrings.push(utterance.textString);
@@ -548,22 +542,18 @@
   this.expectUtteranceQueueIsLike([]);
 });
 
-AX_TEST_F(
-    'ChromeVoxTtsBackgroundTest', 'ResetTtsSettingsClearsVoice',
-    async function() {
-      // Pull in ChromeVox.tts which is initialized by Background.
-      await importModule('Background', '/chromevox/background/background.js');
-
-      ChromeVox.tts.ttsEngines_[0].currentVoice = '';
-      CommandHandlerInterface.instance.onCommand('resetTextToSpeechSettings');
-      await new Promise(r => {
-        ChromeVox.tts.speak = textString => {
-          if (textString ===
-              'Reset text to speech settings to default values') {
-            r();
-          }
-        };
-      });
-      assertEquals(
-          constants.SYSTEM_VOICE, ChromeVox.tts.ttsEngines_[0].currentVoice);
+TEST_F('ChromeVoxTtsBackgroundTest', 'ResetTtsSettingsClearsVoice', function() {
+  this.newCallback(async () => {
+    ChromeVox.tts.ttsEngines_[0].currentVoice = '';
+    CommandHandlerInterface.instance.onCommand('resetTextToSpeechSettings');
+    await new Promise(r => {
+      ChromeVox.tts.speak = textString => {
+        if (textString === 'Reset text to speech settings to default values') {
+          r();
+        }
+      };
     });
+    assertEquals(
+        constants.SYSTEM_VOICE, ChromeVox.tts.ttsEngines_[0].currentVoice);
+  })();
+});
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/log_types.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/log_types.js
index c6a0659a..75c9242 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/log_types.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/log_types.js
@@ -14,6 +14,7 @@
 goog.provide('TreeLog');
 
 goog.require('QueueMode');
+goog.require('TreeDumper');
 
 /**
  * List of all types of logs supported.
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer_loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer_loader.js
index 3e504a5e..054a44b0fd9 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer_loader.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer_loader.js
@@ -11,6 +11,5 @@
 goog.require('BrailleKeyEvent');
 goog.require('ChromeVox');
 goog.require('KeyCode');
-goog.require('LibLouis');
 goog.require('NavBraille');
 goog.require('Spannable');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_loader.js
index b4ee23a3..6a26695 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_loader.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_loader.js
@@ -10,8 +10,6 @@
 goog.require('BluetoothBrailleDisplayListener');
 goog.require('BluetoothBrailleDisplayManager');
 goog.require('ChromeVox');
-goog.require('LibLouis');
-goog.require('LibLouis.FormType');
 goog.require('Spannable');
 goog.require('SpeechLog');
 goog.require('TtsInterface');
diff --git a/chrome/browser/resources/settings/chromeos/BUILD.gn b/chrome/browser/resources/settings/chromeos/BUILD.gn
index 4097281..6e2a706 100644
--- a/chrome/browser/resources/settings/chromeos/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -335,6 +335,7 @@
     "chromeos/crostini_page/crostini_browser_proxy.js",
     "chromeos/date_time_page/date_time_types.js",
     "chromeos/date_time_page/timezone_browser_proxy.js",
+    "chromeos/device_page/cros_audio_config.js",
     "chromeos/device_page/device_page_browser_proxy.js",
     "chromeos/device_page/drag_behavior.js",
     "chromeos/device_page/layout_behavior.js",
diff --git a/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn
index 73f72e9..86d9f23 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn
@@ -12,6 +12,7 @@
   is_polymer3 = true
   deps = [
     ":audio",
+    ":cros_audio_config",
     ":device_page",
     ":device_page_browser_proxy",
     ":display",
@@ -31,9 +32,11 @@
 
 js_library("audio") {
   deps = [
+    ":cros_audio_config",
     "..:os_route",
     "..:route_observer_behavior",
     "../..:router",
+    "//ash/components/audio/public/mojom:mojom_webui_js",
     "//ui/webui/resources/js:i18n_behavior.m",
   ]
 
@@ -41,6 +44,10 @@
       [ "//ui/webui/resources/cr_elements/cr_slider/cr_slider_externs.js" ]
 }
 
+js_library("cros_audio_config") {
+  deps = [ "//ash/components/audio/public/mojom:mojom_webui_js" ]
+}
+
 js_library("device_page") {
   deps = [
     ":device_page_browser_proxy",
diff --git a/chrome/browser/resources/settings/chromeos/device_page/cros_audio_config.js b/chrome/browser/resources/settings/chromeos/device_page/cros_audio_config.js
new file mode 100644
index 0000000..844787a
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/device_page/cros_audio_config.js
@@ -0,0 +1,33 @@
+// Copyright 2022 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 {CrosAudioConfig, CrosAudioConfigInterface} from '../../mojom-webui/audio/cros_audio_config.mojom-webui.js';
+
+/**
+ * @fileoverview
+ * Provides singleton access to the CrosAudioConfig mojo interface and the
+ * ability to override it with a fake implementation needed for tests.
+ */
+
+/** @type {?CrosAudioConfigInterface} */
+let crosAudioConfig = null;
+
+/**
+ * @param {?CrosAudioConfigInterface} testCrosAudioConfig
+ * The CrosAudioConfig implementation used for testing. Passing null reverses
+ * the override.
+ */
+export function setAudioConfigForTesting(testCrosAudioConfig) {
+  crosAudioConfig = testCrosAudioConfig;
+}
+
+/** @return {!CrosAudioConfigInterface} */
+export function getCrosAudioConfig() {
+  if (!crosAudioConfig) {
+    crosAudioConfig = CrosAudioConfig.getRemote();
+  }
+
+  // Base case returns a fake CrosAudioConfig used for testing.
+  return crosAudioConfig;
+}
diff --git a/chrome/browser/ui/android/logo/BUILD.gn b/chrome/browser/ui/android/logo/BUILD.gn
index 250b2c5..c7b71a335f 100644
--- a/chrome/browser/ui/android/logo/BUILD.gn
+++ b/chrome/browser/ui/android/logo/BUILD.gn
@@ -75,6 +75,7 @@
     "//content/public/android:content_full_java",
     "//content/public/test/android:content_java_test_support",
     "//third_party/androidx:androidx_test_core_java",
+    "//third_party/androidx:androidx_test_ext_junit_java",
     "//third_party/junit:junit",
     "//third_party/mockito:mockito_java",
     "//ui/android:ui_java_test_support",
diff --git a/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoViewTest.java b/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoViewTest.java
index 9c31c74..de3327b 100644
--- a/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoViewTest.java
+++ b/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoViewTest.java
@@ -13,11 +13,12 @@
 import android.text.TextUtils;
 import android.view.ViewGroup.LayoutParams;
 
-import androidx.test.core.app.ActivityScenario;
+import androidx.test.ext.junit.rules.ActivityScenarioRule;
 
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -33,6 +34,10 @@
 /** Instrumentation tests for {@link LogoView}. */
 @RunWith(BaseRobolectricTestRunner.class)
 public class LogoViewTest {
+    @Rule
+    public ActivityScenarioRule<TestActivity> mActivityScenarioRule =
+            new ActivityScenarioRule<>(TestActivity.class);
+
     @Mock
     public TemplateUrlService mTemplateUrlService;
     @Mock
@@ -43,18 +48,16 @@
             "https://www.gstatic.com/chrome/ntp/doodle_test/ddljson_android4.json";
     private static final String ALT_TEXT = "Hello World!";
 
-    private ActivityScenario<TestActivity> mActivityScenario;
     private LogoView mView;
     private Bitmap mBitmap;
 
     @Before
     public void setup() {
         MockitoAnnotations.initMocks(this);
-        mActivityScenario = ActivityScenario.launch(TestActivity.class);
         mBitmap = Bitmap.createBitmap(1, 1, Config.ALPHA_8);
         TemplateUrlServiceFactory.setInstanceForTesting(mTemplateUrlService);
 
-        mActivityScenario.onActivity(activity -> {
+        mActivityScenarioRule.getScenario().onActivity(activity -> {
             mView = new LogoView(activity, null);
             LayoutParams params =
                     new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
index be6a443..e4e5416 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -3689,7 +3689,7 @@
         Try again
       </message>
       <message name="IDS_IPH_PRICE_TRACKING_MENU_ITEM" desc="In-product-help text that describes that a user can track the price of a product in the overflow menu.">
-        Track price here
+        Track price
       </message>
       <message name="IDS_IPH_PRICE_TRACKING_MENU_ITEM_ACCESSIBILITY" is_accessibility_with_no_ui="true" desc="In-product-help accessibility text that describes that a user can track the price of a product in the overflow menu.">
         Track price from the More options button
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IPH_PRICE_TRACKING_MENU_ITEM.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IPH_PRICE_TRACKING_MENU_ITEM.png.sha1
index e40dec2..ff92d542 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IPH_PRICE_TRACKING_MENU_ITEM.png.sha1
+++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IPH_PRICE_TRACKING_MENU_ITEM.png.sha1
@@ -1 +1 @@
-f15fbe96fbc159e466e23498c2a4707e044b955c
+f15fbe96fbc159e466e23498c2a4707e044b955c
\ No newline at end of file
diff --git a/chrome/browser/ui/android/webid/internal/BUILD.gn b/chrome/browser/ui/android/webid/internal/BUILD.gn
index e5e84e6..4dbe88e 100644
--- a/chrome/browser/ui/android/webid/internal/BUILD.gn
+++ b/chrome/browser/ui/android/webid/internal/BUILD.gn
@@ -86,6 +86,7 @@
     "//third_party/androidx:androidx_annotation_annotation_java",
     "//third_party/androidx:androidx_recyclerview_recyclerview_java",
     "//third_party/androidx:androidx_test_core_java",
+    "//third_party/androidx:androidx_test_ext_junit_java",
     "//third_party/junit",
     "//third_party/mockito:mockito_java",
     "//ui/android:ui_full_java",
diff --git a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionViewTest.java b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionViewTest.java
index 222f0d6..17966cc 100644
--- a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionViewTest.java
+++ b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionViewTest.java
@@ -21,9 +21,10 @@
 import android.widget.TextView;
 
 import androidx.recyclerview.widget.RecyclerView;
-import androidx.test.core.app.ActivityScenario;
+import androidx.test.ext.junit.rules.ActivityScenarioRule;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -67,11 +68,14 @@
             new Account("", "", "No Subject", "", TEST_PROFILE_PIC, true);
     private static final Account BOB = new Account("Bob", "", "Bob", "", TEST_PROFILE_PIC, true);
 
+    @Rule
+    public ActivityScenarioRule<TestActivity> mActivityScenarioRule =
+            new ActivityScenarioRule<>(TestActivity.class);
+
     @Mock
     private Callback<Account> mAccountCallback;
     private Runnable mAutoSignInCancelCallback;
 
-    private ActivityScenario<TestActivity> mActivityScenario;
     private Resources mResources;
     private PropertyModel mModel;
     private ModelList mSheetAccountItems;
@@ -81,9 +85,7 @@
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
 
-        mActivityScenario = ActivityScenario.launch(TestActivity.class);
-
-        mActivityScenario.onActivity(activity -> {
+        mActivityScenarioRule.getScenario().onActivity(activity -> {
             mModel = new PropertyModel.Builder(AccountSelectionProperties.ItemProperties.ALL_KEYS)
                              .build();
             mSheetAccountItems = new ModelList();
diff --git a/chrome/browser/ui/ash/assistant/assistant_browser_delegate_impl.cc b/chrome/browser/ui/ash/assistant/assistant_browser_delegate_impl.cc
index 2276887..efac650 100644
--- a/chrome/browser/ui/ash/assistant/assistant_browser_delegate_impl.cc
+++ b/chrome/browser/ui/ash/assistant/assistant_browser_delegate_impl.cc
@@ -126,8 +126,8 @@
 }
 
 void AssistantBrowserDelegateImpl::RequestAudioDecoderFactory(
-    mojo::PendingReceiver<
-        chromeos::assistant::mojom::AssistantAudioDecoderFactory> receiver) {
+    mojo::PendingReceiver<ash::assistant::mojom::AssistantAudioDecoderFactory>
+        receiver) {
   content::ServiceProcessHost::Launch(
       std::move(receiver),
       content::ServiceProcessHost::Options()
diff --git a/chrome/browser/ui/ash/assistant/assistant_browser_delegate_impl.h b/chrome/browser/ui/ash/assistant/assistant_browser_delegate_impl.h
index b0b2be0..305117f 100644
--- a/chrome/browser/ui/ash/assistant/assistant_browser_delegate_impl.h
+++ b/chrome/browser/ui/ash/assistant/assistant_browser_delegate_impl.h
@@ -54,9 +54,8 @@
       mojo::PendingReceiver<media::mojom::AudioStreamFactory> receiver)
       override;
   void RequestAudioDecoderFactory(
-      mojo::PendingReceiver<
-          chromeos::assistant::mojom::AssistantAudioDecoderFactory> receiver)
-      override;
+      mojo::PendingReceiver<ash::assistant::mojom::AssistantAudioDecoderFactory>
+          receiver) override;
   void RequestAudioFocusManager(
       mojo::PendingReceiver<media_session::mojom::AudioFocusManager> receiver)
       override;
diff --git a/chrome/browser/ui/ash/clipboard_history_browsertest.cc b/chrome/browser/ui/ash/clipboard_history_browsertest.cc
index 6c70652..ded7d38 100644
--- a/chrome/browser/ui/ash/clipboard_history_browsertest.cc
+++ b/chrome/browser/ui/ash/clipboard_history_browsertest.cc
@@ -16,7 +16,6 @@
 #include "ash/public/cpp/clipboard_history_controller.h"
 #include "ash/shell.h"
 #include "base/bind.h"
-#include "base/path_service.h"
 #include "base/scoped_observation.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
@@ -30,16 +29,15 @@
 #include "chrome/browser/ash/login/ui/user_adding_screen.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/ash/clipboard_image_model_request.h"
+#include "chrome/browser/ui/ash/clipboard_history_test_util.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/test/base/in_process_browser_test.h"
-#include "chrome/test/base/ui_test_utils.h"
 #include "chromeos/ash/components/dbus/session_manager/session_manager_client.h"
 #include "components/user_manager/user_manager.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
-#include "net/dns/mock_host_resolver.h"
+#include "ui/aura/client/capture_client_observer.h"
 #include "ui/base/clipboard/clipboard_data.h"
 #include "ui/base/clipboard/clipboard_monitor.h"
 #include "ui/base/clipboard/clipboard_non_backed.h"
@@ -56,6 +54,10 @@
 namespace {
 
 using ImageModelRequestTestParams = ClipboardImageModelRequest::TestParams;
+using ScopedClipboardHistoryListUpdateWaiter =
+    clipboard_history::ScopedClipboardHistoryListUpdateWaiter;
+using ClipboardImageModelRequestWaiter =
+    clipboard_history::ClipboardImageModelRequestWaiter;
 
 constexpr char kUrlString[] = "https://www.example.com";
 
@@ -102,63 +104,6 @@
   std::unique_ptr<base::RunLoop> run_loop_;
 };
 
-// The helper class to wait for an update to the clipboard history item list.
-class ScopedClipboardHistoryListUpdateWaiter
-    : public ash::ClipboardHistoryController::Observer {
- public:
-  ScopedClipboardHistoryListUpdateWaiter() {
-    controller_observation_.Observe(ash::ClipboardHistoryController::Get());
-  }
-  ScopedClipboardHistoryListUpdateWaiter(
-      const ScopedClipboardHistoryListUpdateWaiter&) = delete;
-  ScopedClipboardHistoryListUpdateWaiter& operator=(
-      const ScopedClipboardHistoryListUpdateWaiter&) = delete;
-  ~ScopedClipboardHistoryListUpdateWaiter() override { run_loop_.Run(); }
-
-  // ash::ClipboardHistoryController::Observer:
-  void OnClipboardHistoryItemListAddedOrRemoved() override { run_loop_.Quit(); }
-
- private:
-  base::RunLoop run_loop_;
-  base::ScopedObservation<ash::ClipboardHistoryController,
-                          ash::ClipboardHistoryController::Observer>
-      controller_observation_{this};
-};
-
-// The helper class to wait for the completion of the image model request.
-class ClipboardImageModelRequestWaiter {
- public:
-  ClipboardImageModelRequestWaiter(ImageModelRequestTestParams* test_params,
-                                   bool expect_auto_resize)
-      : test_params_(test_params), expect_auto_resize_(expect_auto_resize) {
-    test_params_->callback =
-        base::BindRepeating(&ClipboardImageModelRequestWaiter::OnRequestStop,
-                            base::Unretained(this));
-    ClipboardImageModelRequest::SetTestParams(test_params_);
-  }
-  ClipboardImageModelRequestWaiter(const ClipboardImageModelRequestWaiter&) =
-      delete;
-  ClipboardImageModelRequestWaiter& operator=(
-      const ClipboardImageModelRequestWaiter&) = delete;
-  ~ClipboardImageModelRequestWaiter() {
-    test_params_->callback = base::NullCallback();
-    ClipboardImageModelRequest::SetTestParams(nullptr);
-  }
-
-  void Wait() { run_loop_.Run(); }
-
-  void OnRequestStop(bool use_auto_resize_mode) {
-    EXPECT_EQ(expect_auto_resize_, use_auto_resize_mode);
-    run_loop_.Quit();
-  }
-
- private:
-  ImageModelRequestTestParams* const test_params_;
-  const bool expect_auto_resize_;
-
-  base::RunLoop run_loop_;
-};
-
 // The helper class to wait for the observed view's bounds update.
 class ViewBoundsWaiter : public views::ViewObserver {
  public:
@@ -1202,115 +1147,6 @@
   }
 }
 
-// TODO(crbug.com/1304484): Make this class inherit from
-// `ClipboardHistoryBrowserTest` instead if possible.
-class ClipboardHistoryWebContentsBrowserTest : public InProcessBrowserTest {
- public:
-  ClipboardHistoryWebContentsBrowserTest() = default;
-  ~ClipboardHistoryWebContentsBrowserTest() override = default;
-
-  // InProcessBrowserTest:
-  void SetUpOnMainThread() override {
-    InProcessBrowserTest::SetUpOnMainThread();
-    base::FilePath test_data_dir;
-    ASSERT_TRUE(base::PathService::Get(base::DIR_SOURCE_ROOT, &test_data_dir));
-    host_resolver()->AddRule("*", "127.0.0.1");
-    embedded_test_server()->ServeFilesFromDirectory(
-        test_data_dir.AppendASCII("chrome/test/data/ash/clipboard_history"));
-    ASSERT_TRUE(embedded_test_server()->Start());
-  }
-};
-
-// Verifies that the images rendered from the copied web contents should
-// show in the clipboard history menu. Switching the auto resize mode is covered
-// in this test case.
-// Flaky: crbug/1224777
-IN_PROC_BROWSER_TEST_F(ClipboardHistoryWebContentsBrowserTest,
-                       DISABLED_VerifyHTMLRendering) {
-  // Load the web page which contains images and text.
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(
-      browser(), embedded_test_server()->GetURL("/image-and-text.html")));
-
-  // Select one part of the web page. Wait until the selection region updates.
-  // Then copy the selected part to clipboard.
-  auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents();
-  content::BoundingBoxUpdateWaiter select_part_one(web_contents);
-  ASSERT_TRUE(ExecuteScript(web_contents, "selectPart1();"));
-  select_part_one.Wait();
-
-  const auto& item_lists = GetClipboardItems();
-  {
-    ScopedClipboardHistoryListUpdateWaiter scoped_waiter;
-    ASSERT_TRUE(ExecuteScript(web_contents, "copyToClipboard();"));
-  }
-  ASSERT_EQ(1u, item_lists.size());
-
-  base::HistogramTester histogram_tester;
-
-  // Show the clipboard history menu through the acclerator. When the clipboard
-  // history shows, the process of HTML rendering starts.
-  auto event_generator = std::make_unique<ui::test::EventGenerator>(
-      ash::Shell::GetPrimaryRootWindow());
-  event_generator->PressAndReleaseKey(ui::VKEY_V, ui::EF_COMMAND_DOWN);
-
-  // Render HTML with auto-resize mode enabled. Wait until the rendering
-  // finishes.
-  ImageModelRequestTestParams test_params(/*callback=*/base::NullCallback(),
-                                          /*enforce_auto_resize=*/true);
-  {
-    ClipboardImageModelRequestWaiter image_request_waiter(
-        &test_params, /*expect_auto_resize=*/true);
-    image_request_waiter.Wait();
-  }
-
-  // Verify that the rendering ends normally.
-  histogram_tester.ExpectUniqueSample(
-      "Ash.ClipboardHistory.ImageModelRequest.StopReason",
-      static_cast<int>(
-          ClipboardImageModelRequest::RequestStopReason::kFulfilled),
-      1);
-
-  // Verify that the clipboard history menu shows. Then close the menu.
-  EXPECT_TRUE(GetClipboardHistoryController()->IsMenuShowing());
-  event_generator->PressAndReleaseKey(ui::VKEY_ESCAPE, ui::EF_NONE);
-  EXPECT_FALSE(GetClipboardHistoryController()->IsMenuShowing());
-
-  // Select another part. Wait until the selection region updates. Then copy
-  // the selected html code to clipboard.
-  content::BoundingBoxUpdateWaiter select_part_two(web_contents);
-  ASSERT_TRUE(ExecuteScript(web_contents, "selectPart2();"));
-  select_part_two.Wait();
-
-  {
-    ScopedClipboardHistoryListUpdateWaiter scoped_waiter;
-    ASSERT_TRUE(ExecuteScript(web_contents, "copyToClipboard();"));
-  }
-  ASSERT_EQ(2u, item_lists.size());
-
-  // Show the clipboard history menu.
-  event_generator->PressAndReleaseKey(ui::VKEY_V, ui::EF_COMMAND_DOWN);
-
-  // Render HTML with auto-resize mode disabled. Wait until the rendering
-  // finishes.
-  test_params.enforce_auto_resize = false;
-  {
-    ClipboardImageModelRequestWaiter image_request_waiter(
-        &test_params, /*expect_auto_resize=*/false);
-    image_request_waiter.Wait();
-  }
-
-  // Verify that the rendering ends normally.
-  histogram_tester.ExpectUniqueSample(
-      "Ash.ClipboardHistory.ImageModelRequest.StopReason",
-      static_cast<int>(
-          ClipboardImageModelRequest::RequestStopReason::kFulfilled),
-      2);
-
-  // Verify that the clipboard history menu's status.
-  EXPECT_TRUE(GetClipboardHistoryController()->IsMenuShowing());
-  ASSERT_EQ(2, GetContextMenu()->GetMenuItemsCount());
-}
-
 // The browser test which creates a widget with a textfield during setting-up
 // to help verify the multipaste menu item's response to the gesture tap and
 // the mouse click.
diff --git a/chrome/browser/ui/ash/clipboard_history_interactive_uitest.cc b/chrome/browser/ui/ash/clipboard_history_interactive_uitest.cc
new file mode 100644
index 0000000..475fb22e
--- /dev/null
+++ b/chrome/browser/ui/ash/clipboard_history_interactive_uitest.cc
@@ -0,0 +1,145 @@
+// Copyright 2022 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 <list>
+
+#include "ash/clipboard/clipboard_history_controller_impl.h"
+#include "ash/clipboard/clipboard_history_menu_model_adapter.h"
+#include "ash/shell.h"
+#include "base/path_service.h"
+#include "chrome/browser/ui/ash/clipboard_history_test_util.h"
+#include "chrome/browser/ui/ash/clipboard_image_model_request.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/test/browser_test.h"
+#include "net/dns/mock_host_resolver.h"
+#include "ui/events/test/event_generator.h"
+
+namespace {
+using ImageModelRequestTestParams = ClipboardImageModelRequest::TestParams;
+
+ash::ClipboardHistoryControllerImpl* GetClipboardHistoryController() {
+  return ash::Shell::Get()->clipboard_history_controller();
+}
+
+ash::ClipboardHistoryMenuModelAdapter* GetContextMenu() {
+  return GetClipboardHistoryController()->context_menu_for_test();
+}
+
+const std::list<ash::ClipboardHistoryItem>& GetClipboardItems() {
+  return GetClipboardHistoryController()->history()->GetItems();
+}
+
+}  // namespace
+
+// TODO(crbug.com/1304484): Make this class inherit from
+// `ClipboardHistoryBrowserTest` instead if possible.
+class ClipboardHistoryWebContentsInteractiveTest : public InProcessBrowserTest {
+ public:
+  ClipboardHistoryWebContentsInteractiveTest() = default;
+  ~ClipboardHistoryWebContentsInteractiveTest() override = default;
+
+  // InProcessBrowserTest:
+  void SetUpOnMainThread() override {
+    InProcessBrowserTest::SetUpOnMainThread();
+    base::FilePath test_data_dir;
+    ASSERT_TRUE(base::PathService::Get(base::DIR_SOURCE_ROOT, &test_data_dir));
+    host_resolver()->AddRule("*", "127.0.0.1");
+    embedded_test_server()->ServeFilesFromDirectory(
+        test_data_dir.AppendASCII("chrome/test/data/ash/clipboard_history"));
+    ASSERT_TRUE(embedded_test_server()->Start());
+  }
+};
+
+// Verifies that the images rendered from the copied web contents should
+// show in the clipboard history menu. Switching the auto resize mode is covered
+// in this test case.
+// Flaky: crbug/1224777
+IN_PROC_BROWSER_TEST_F(ClipboardHistoryWebContentsInteractiveTest,
+                       VerifyHTMLRendering) {
+  // Load the web page which contains images and text.
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(
+      browser(), embedded_test_server()->GetURL("/image-and-text.html")));
+
+  // Select one part of the web page. Wait until the selection region updates.
+  // Then copy the selected part to clipboard.
+  auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents();
+  content::BoundingBoxUpdateWaiter select_part_one(web_contents);
+  ASSERT_TRUE(ExecuteScript(web_contents, "selectPart1();"));
+  select_part_one.Wait();
+
+  const auto& item_lists = GetClipboardItems();
+  {
+    clipboard_history::ScopedClipboardHistoryListUpdateWaiter scoped_waiter;
+    ASSERT_TRUE(ExecuteScript(web_contents, "copyToClipboard();"));
+  }
+  ASSERT_EQ(1u, item_lists.size());
+
+  base::HistogramTester histogram_tester;
+
+  // Show the clipboard history menu through the acclerator. When the clipboard
+  // history shows, the process of HTML rendering starts.
+  auto event_generator = std::make_unique<ui::test::EventGenerator>(
+      ash::Shell::GetPrimaryRootWindow());
+  event_generator->PressAndReleaseKey(ui::VKEY_V, ui::EF_COMMAND_DOWN);
+
+  // Render HTML with auto-resize mode enabled. Wait until the rendering
+  // finishes.
+  ImageModelRequestTestParams test_params(
+      /*callback=*/base::NullCallback(),
+      /*enforce_auto_resize=*/true);
+  {
+    clipboard_history::ClipboardImageModelRequestWaiter image_request_waiter(
+        &test_params, /*expect_auto_resize=*/true);
+    image_request_waiter.Wait();
+  }
+
+  // Verify that the rendering ends normally.
+  histogram_tester.ExpectUniqueSample(
+      "Ash.ClipboardHistory.ImageModelRequest.StopReason",
+      static_cast<int>(
+          ClipboardImageModelRequest::RequestStopReason::kFulfilled),
+      1);
+
+  // Verify that the clipboard history menu shows. Then close the menu.
+  EXPECT_TRUE(GetClipboardHistoryController()->IsMenuShowing());
+  event_generator->PressAndReleaseKey(ui::VKEY_ESCAPE, ui::EF_NONE);
+  EXPECT_FALSE(GetClipboardHistoryController()->IsMenuShowing());
+
+  // Select another part. Wait until the selection region updates. Then copy
+  // the selected html code to clipboard.
+  content::BoundingBoxUpdateWaiter select_part_two(web_contents);
+  ASSERT_TRUE(ExecuteScript(web_contents, "selectPart2();"));
+  select_part_two.Wait();
+
+  {
+    clipboard_history::ScopedClipboardHistoryListUpdateWaiter scoped_waiter;
+    ASSERT_TRUE(ExecuteScript(web_contents, "copyToClipboard();"));
+  }
+  ASSERT_EQ(2u, item_lists.size());
+
+  // Show the clipboard history menu.
+  event_generator->PressAndReleaseKey(ui::VKEY_V, ui::EF_COMMAND_DOWN);
+
+  // Render HTML with auto-resize mode disabled. Wait until the rendering
+  // finishes.
+  test_params.enforce_auto_resize = false;
+  {
+    clipboard_history::ClipboardImageModelRequestWaiter image_request_waiter(
+        &test_params, /*expect_auto_resize=*/false);
+    image_request_waiter.Wait();
+  }
+
+  // Verify that the rendering ends normally.
+  histogram_tester.ExpectUniqueSample(
+      "Ash.ClipboardHistory.ImageModelRequest.StopReason",
+      static_cast<int>(
+          ClipboardImageModelRequest::RequestStopReason::kFulfilled),
+      2);
+
+  // Verify that the clipboard history menu's status.
+  EXPECT_TRUE(GetClipboardHistoryController()->IsMenuShowing());
+  ASSERT_EQ(2, GetContextMenu()->GetMenuItemsCount());
+}
diff --git a/chrome/browser/ui/ash/clipboard_history_test_util.cc b/chrome/browser/ui/ash/clipboard_history_test_util.cc
new file mode 100644
index 0000000..8fda9429
--- /dev/null
+++ b/chrome/browser/ui/ash/clipboard_history_test_util.cc
@@ -0,0 +1,54 @@
+// Copyright 2022 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/ash/clipboard_history_test_util.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace clipboard_history {
+
+// ClipboardImageModelRequestWaiter --------------------------------------------
+
+ClipboardImageModelRequestWaiter::ClipboardImageModelRequestWaiter(
+    ClipboardImageModelRequest::TestParams* test_params,
+    bool expect_auto_resize)
+    : test_params_(test_params), expect_auto_resize_(expect_auto_resize) {
+  test_params_->callback = base::BindRepeating(
+      &ClipboardImageModelRequestWaiter::OnRequestStop, base::Unretained(this));
+  ClipboardImageModelRequest::SetTestParams(test_params_);
+}
+
+ClipboardImageModelRequestWaiter::~ClipboardImageModelRequestWaiter() {
+  test_params_->callback = base::NullCallback();
+  ClipboardImageModelRequest::SetTestParams(nullptr);
+}
+
+void ClipboardImageModelRequestWaiter::Wait() {
+  run_loop_.Run();
+}
+
+void ClipboardImageModelRequestWaiter::OnRequestStop(
+    bool use_auto_resize_mode) {
+  EXPECT_EQ(expect_auto_resize_, use_auto_resize_mode);
+  run_loop_.Quit();
+}
+
+// ScopedClipboardHistoryListUpdateWaiter --------------------------------------
+
+ScopedClipboardHistoryListUpdateWaiter::
+    ScopedClipboardHistoryListUpdateWaiter() {
+  controller_observation_.Observe(ash::ClipboardHistoryController::Get());
+}
+
+ScopedClipboardHistoryListUpdateWaiter::
+    ~ScopedClipboardHistoryListUpdateWaiter() {
+  run_loop_.Run();
+}
+
+void ScopedClipboardHistoryListUpdateWaiter::
+    OnClipboardHistoryItemListAddedOrRemoved() {
+  run_loop_.Quit();
+}
+
+}  // namespace clipboard_history
diff --git a/chrome/browser/ui/ash/clipboard_history_test_util.h b/chrome/browser/ui/ash/clipboard_history_test_util.h
new file mode 100644
index 0000000..7256f74f
--- /dev/null
+++ b/chrome/browser/ui/ash/clipboard_history_test_util.h
@@ -0,0 +1,61 @@
+// Copyright 2022 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_ASH_CLIPBOARD_HISTORY_TEST_UTIL_H_
+#define CHROME_BROWSER_UI_ASH_CLIPBOARD_HISTORY_TEST_UTIL_H_
+
+#include "ash/public/cpp/clipboard_history_controller.h"
+#include "base/run_loop.h"
+#include "base/scoped_observation.h"
+#include "chrome/browser/ui/ash/clipboard_image_model_request.h"
+
+namespace clipboard_history {
+
+// The helper class to wait for the completion of the image model request.
+class ClipboardImageModelRequestWaiter {
+ public:
+  ClipboardImageModelRequestWaiter(
+      ClipboardImageModelRequest::TestParams* test_params,
+      bool expect_auto_resize);
+  ClipboardImageModelRequestWaiter(const ClipboardImageModelRequestWaiter&) =
+      delete;
+  ClipboardImageModelRequestWaiter& operator=(
+      const ClipboardImageModelRequestWaiter&) = delete;
+  ~ClipboardImageModelRequestWaiter();
+
+  void Wait();
+
+  void OnRequestStop(bool use_auto_resize_mode);
+
+ private:
+  ClipboardImageModelRequest::TestParams* const test_params_;
+  const bool expect_auto_resize_;
+
+  base::RunLoop run_loop_;
+};
+
+// The helper class to wait for an update to the clipboard history item list.
+class ScopedClipboardHistoryListUpdateWaiter
+    : public ash::ClipboardHistoryController::Observer {
+ public:
+  ScopedClipboardHistoryListUpdateWaiter();
+  ScopedClipboardHistoryListUpdateWaiter(
+      const ScopedClipboardHistoryListUpdateWaiter&) = delete;
+  ScopedClipboardHistoryListUpdateWaiter& operator=(
+      const ScopedClipboardHistoryListUpdateWaiter&) = delete;
+  ~ScopedClipboardHistoryListUpdateWaiter() override;
+
+  // ash::ClipboardHistoryController::Observer:
+  void OnClipboardHistoryItemListAddedOrRemoved() override;
+
+ private:
+  base::RunLoop run_loop_;
+  base::ScopedObservation<ash::ClipboardHistoryController,
+                          ash::ClipboardHistoryController::Observer>
+      controller_observation_{this};
+};
+
+}  // namespace clipboard_history
+
+#endif  // CHROME_BROWSER_UI_ASH_CLIPBOARD_HISTORY_TEST_UTIL_H_
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc
index c862b268..88a1635 100644
--- a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc
+++ b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc
@@ -912,11 +912,12 @@
   }
 }
 
+// TODO(crbug.com/1170667): Fix flakes and re-enable.
 // Tests that holding space item's image representation gets updated when the
 // backing file is changed using move operation. Furthermore, verifies that
 // conflicts caused by moving a holding space item file to another path present
 // in the holding space get resolved.
-TEST_F(HoldingSpaceKeyedServiceTest, UpdateItemsOverwrittenByMove) {
+TEST_F(HoldingSpaceKeyedServiceTest, DISABLED_UpdateItemsOverwrittenByMove) {
   // Create a file system mount point.
   std::unique_ptr<ScopedTestMountPoint> downloads_mount =
       ScopedTestMountPoint::CreateAndMountDownloads(GetProfile());
diff --git a/chrome/browser/ui/ash/network/mobile_data_notifications_unittest.cc b/chrome/browser/ui/ash/network/mobile_data_notifications_unittest.cc
index 50ecaa1f..3227f0ce 100644
--- a/chrome/browser/ui/ash/network/mobile_data_notifications_unittest.cc
+++ b/chrome/browser/ui/ash/network/mobile_data_notifications_unittest.cc
@@ -158,7 +158,7 @@
   }
 
   content::BrowserTaskEnvironment task_environment_;
-  chromeos::NetworkHandlerTestHelper network_handler_test_helper_;
+  ash::NetworkHandlerTestHelper network_handler_test_helper_;
   session_manager::SessionManager session_manager_;
   std::unique_ptr<MobileDataNotifications> mobile_data_notifications_;
   std::unique_ptr<NetworkConnectTestDelegate> network_connect_delegate_;
diff --git a/chrome/browser/ui/omnibox/chrome_omnibox_client.cc b/chrome/browser/ui/omnibox/chrome_omnibox_client.cc
index b24b6326..285500d 100644
--- a/chrome/browser/ui/omnibox/chrome_omnibox_client.cc
+++ b/chrome/browser/ui/omnibox/chrome_omnibox_client.cc
@@ -32,8 +32,8 @@
 #include "chrome/browser/predictors/autocomplete_action_predictor_factory.h"
 #include "chrome/browser/predictors/loading_predictor.h"
 #include "chrome/browser/predictors/loading_predictor_factory.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service_factory.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_factory.h"
 #include "chrome/browser/preloading/prerender/prerender_manager.h"
 #include "chrome/browser/preloading/prerender/prerender_utils.h"
 #include "chrome/browser/profiles/profile.h"
@@ -441,22 +441,13 @@
   if (content::DevToolsAgentHost::IsDebuggerAttached(web_contents))
     return;
 
-  // Treat search hint differently, since AutocompleteActionPredictor does not
-  // prerender search results.
   // TODO(https://crbug.com/1278634): Refactor relevant code to reuse common
   // code, and ensure metrics are correctly recorded.
-  if (AutocompleteMatch::IsSearchType(match.type)) {
-    DCHECK(prerender_utils::IsSearchSuggestionPrerenderEnabled());
-    DCHECK(BaseSearchProvider::ShouldPrerender(match));
-    PrerenderManager::CreateForWebContents(web_contents);
-    auto* prerender_manager = PrerenderManager::FromWebContents(web_contents);
-    prerender_manager->StartPrerenderSearchSuggestion(match);
-  } else {
-    gfx::Rect container_bounds = web_contents->GetContainerBounds();
-    predictors::AutocompleteActionPredictorFactory::GetForProfile(profile_)
-        ->StartPrerendering(match.destination_url, *web_contents,
-                            container_bounds.size());
-  }
+  DCHECK(!AutocompleteMatch::IsSearchType(match.type));
+  gfx::Rect container_bounds = web_contents->GetContainerBounds();
+  predictors::AutocompleteActionPredictorFactory::GetForProfile(profile_)
+      ->StartPrerendering(match.destination_url, *web_contents,
+                          container_bounds.size());
 }
 
 void ChromeOmniboxClient::DoPreconnect(const AutocompleteMatch& match) {
diff --git a/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_model_listener.cc b/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_model_listener.cc
index e5c9c284..ffebded 100644
--- a/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_model_listener.cc
+++ b/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_model_listener.cc
@@ -27,12 +27,12 @@
 
 SavedTabGroupModelListener::~SavedTabGroupModelListener() {
   BrowserList::GetInstance()->RemoveObserver(this);
-  for (Browser* browser : *BrowserList::GetInstance()) {
-    // Note: Can no longer call OnBrowserRemoved here because model_ is already
-    // destroyed.
-    observed_browsers_.erase(browser);
+  // Note: Can no longer call OnBrowserRemoved here because model_ is already
+  // destroyed.
+  for (Browser* browser : observed_browsers_)
     browser->tab_strip_model()->RemoveObserver(this);
-  }
+
+  observed_browsers_.clear();
 }
 
 TabStripModel* SavedTabGroupModelListener::GetTabStripModelWithTabGroupId(
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 4d7516e8..5c23a686 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -254,6 +254,7 @@
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "ash/public/cpp/accelerators.h"
 #include "ash/public/cpp/metrics_util.h"
+#include "chrome/browser/ash/crosapi/browser_util.h"
 #include "chrome/browser/ui/ash/window_properties.h"
 #include "chrome/grit/chrome_unscaled_resources.h"
 #include "ui/compositor/throughput_tracker.h"
@@ -4133,12 +4134,32 @@
 #endif
 }
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+namespace {
+bool ShouldBeHandledByLacrosInstead(int command) {
+  switch (command) {
+    case IDC_NEW_INCOGNITO_WINDOW:
+    case IDC_NEW_TAB:
+    case IDC_NEW_WINDOW:
+    case IDC_RESTORE_TAB:
+      // TODO(neis): Add more here, perhaps anything tab-related.
+      return true;
+    default:
+      return false;
+  }
+}
+}  // namespace
+#endif
+
 void BrowserView::LoadAccelerators() {
   views::FocusManager* focus_manager = GetFocusManager();
   DCHECK(focus_manager);
 
   // Let's fill our own accelerator table.
   const bool is_app_mode = chrome::IsRunningInForcedAppMode();
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  const bool is_lacros_only = !crosapi::browser_util::IsAshWebBrowserEnabled();
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
   const std::vector<AcceleratorMapping> accelerator_list(GetAcceleratorList());
   for (const auto& entry : accelerator_list) {
     // In app mode, only allow accelerators of white listed commands to pass
@@ -4147,6 +4168,13 @@
                            entry.command_id, browser()->is_type_popup()))
       continue;
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+    // When Lacros is the only browser, disable some browser commands in Ash so
+    // that Lacros can handle them instead.
+    if (is_lacros_only && ShouldBeHandledByLacrosInstead(entry.command_id))
+      continue;
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
     ui::Accelerator accelerator(entry.keycode, entry.modifiers);
     accelerator_table_[accelerator] = entry.command_id;
 
diff --git a/chrome/browser/ui/views/frame/windows_icon_painter.cc b/chrome/browser/ui/views/frame/windows_icon_painter.cc
index 6a4d8c6..d095815 100644
--- a/chrome/browser/ui/views/frame/windows_icon_painter.cc
+++ b/chrome/browser/ui/views/frame/windows_icon_painter.cc
@@ -26,7 +26,7 @@
 
 void DrawRoundRect(gfx::Canvas* canvas,
                    const gfx::Rect& rect,
-                   int radius,
+                   float radius,
                    const cc::PaintFlags& flags) {
   gfx::RectF rect_f(rect);
   float stroke_half_width = flags.getStrokeWidth() / 2;
@@ -73,7 +73,7 @@
 void Windows10IconPainter::PaintRestoreIcon(gfx::Canvas* canvas,
                                             gfx::Rect& symbol_rect,
                                             cc::PaintFlags& flags) {
-  const int separation = std::floor(2 * canvas->image_scale());
+  const int separation = base::ClampFloor(2 * canvas->image_scale());
   symbol_rect.Inset(gfx::Insets::TLBR(separation, 0, 0, separation));
 
   // Bottom left ("in front") square.
@@ -122,26 +122,23 @@
                                              gfx::Rect& symbol_rect,
                                              cc::PaintFlags& flags) {
   flags.setAntiAlias(true);
-  const float corner_radius = 2 * canvas->image_scale();
+  const float corner_radius = canvas->image_scale();
   DrawRoundRect(canvas, symbol_rect, corner_radius, flags);
 }
 
 void Windows11IconPainter::PaintRestoreIcon(gfx::Canvas* canvas,
                                             gfx::Rect& symbol_rect,
                                             cc::PaintFlags& flags) {
-  const int separation = std::floor(2 * canvas->image_scale());
+  const int separation = base::ClampFloor(2 * canvas->image_scale());
   symbol_rect.Inset(gfx::Insets::TLBR(separation, 0, 0, separation));
 
   flags.setAntiAlias(true);
   // Bottom left ("in front") rounded square.
-  const float bottom_rect_radius = 1 * canvas->image_scale();
+  const float bottom_rect_radius = canvas->image_scale();
   DrawRoundRect(canvas, symbol_rect, bottom_rect_radius, flags);
 
   // Top right ("behind") top+right edges of rounded square (2.5x).
   symbol_rect.Offset(separation, -separation);
-  // Apply inset to left+bottom edges since we don't draw arcs for those edges
-  constexpr int top_rect_inset = 1;
-  symbol_rect.Inset(gfx::Insets::TLBR(0, top_rect_inset, top_rect_inset, 0));
 
   const float top_rect_radius = 2.5f * canvas->image_scale();
   DrawRoundRectEdges(canvas, symbol_rect, top_rect_radius, flags);
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller.cc b/chrome/browser/ui/views/tabs/tab_drag_controller.cc
index 22325cc..02c2b191 100644
--- a/chrome/browser/ui/views/tabs/tab_drag_controller.cc
+++ b/chrome/browser/ui/views/tabs/tab_drag_controller.cc
@@ -45,7 +45,6 @@
 #include "components/tab_groups/tab_group_id.h"
 #include "content/public/browser/web_contents.h"
 #include "ui/base/clipboard/clipboard_constants.h"
-#include "ui/base/dragdrop/mojom/drag_drop_types.mojom-shared.h"
 #include "ui/base/dragdrop/os_exchange_data_provider_factory.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/display/display.h"
@@ -452,7 +451,7 @@
   if (current_state_ == DragState::kDraggingWindow)
     GetAttachedBrowserWidget()->EndMoveLoop();
 
-  if (event_source_ == EVENT_SOURCE_TOUCH) {
+  if (event_source_ == ui::mojom::DragEventSource::kTouch) {
     TabDragContext* capture_context =
         attached_context_ ? attached_context_.get() : source_context_.get();
     capture_context->GetWidget()->ReleaseCapture();
@@ -466,7 +465,7 @@
                              const gfx::Point& mouse_offset,
                              int source_view_offset,
                              ui::ListSelectionModel initial_selection_model,
-                             EventSource event_source) {
+                             ui::mojom::DragEventSource event_source) {
   DCHECK(!dragging_views.empty());
   DCHECK(base::Contains(dragging_views, source_view));
   source_context_ = source_context;
@@ -523,7 +522,7 @@
 
   // Gestures don't automatically do a capture. We don't allow multiple drags at
   // the same time, so we explicitly capture.
-  if (event_source == EVENT_SOURCE_TOUCH) {
+  if (event_source == ui::mojom::DragEventSource::kTouch) {
     // Taking capture may cause capture to be lost, ending the drag and
     // destroying |this|.
     base::WeakPtr<TabDragController> ref(weak_factory_.GetWeakPtr());
@@ -1563,7 +1562,7 @@
     attached_context_->OwnDragController(std::move(me));
   }
   const views::Widget::MoveLoopSource move_loop_source =
-      event_source_ == EVENT_SOURCE_MOUSE
+      event_source_ == ui::mojom::DragEventSource::kMouse
           ? views::Widget::MoveLoopSource::kMouse
           : views::Widget::MoveLoopSource::kTouch;
   const views::Widget::MoveLoopEscapeBehavior escape_behavior =
@@ -1788,9 +1787,10 @@
   // On ChromeOS, the gesture state is already cleared and so
   // GetCursorScreenPoint() will fail to obtain the last touch location.
   // Therefore it uses the last remembered location instead.
-  const gfx::Point current_screen_point = (event_source_ == EVENT_SOURCE_TOUCH)
-                                              ? last_point_in_screen_
-                                              : GetCursorScreenPoint();
+  const gfx::Point current_screen_point =
+      (event_source_ == ui::mojom::DragEventSource::kTouch)
+          ? last_point_in_screen_
+          : GetCursorScreenPoint();
   // If we're attaching the dragged tabs to an overview window's tabstrip, the
   // tabstrip should not have focus.
   DetachAndAttachToNewContext(DONT_RELEASE_CAPTURE, deferred_target_context,
@@ -2342,11 +2342,8 @@
   DCHECK(widget);
   aura::Window* widget_window = widget->GetNativeWindow();
   DCHECK(widget_window->GetRootWindow());
-  auto event_source = event_source_ == EVENT_SOURCE_MOUSE
-                          ? ui::mojom::DragEventSource::kMouse
-                          : ui::mojom::DragEventSource::kTouch;
   return aura::Env::GetInstance()->GetLastPointerPoint(
-      event_source, widget_window, /*fallback=*/last_point_in_screen_);
+      event_source_, widget_window, /*fallback=*/last_point_in_screen_);
 #else
   return display::Screen::GetScreen()->GetCursorScreenPoint();
 #endif
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller.h b/chrome/browser/ui/views/tabs/tab_drag_controller.h
index 33b4ded..56eac5b4 100644
--- a/chrome/browser/ui/views/tabs/tab_drag_controller.h
+++ b/chrome/browser/ui/views/tabs/tab_drag_controller.h
@@ -20,6 +20,7 @@
 #include "chrome/browser/ui/views/tabs/tab_drag_context.h"
 #include "chrome/browser/ui/views/tabs/tab_strip_types.h"
 #include "components/tab_groups/tab_group_visual_data.h"
+#include "ui/base/dragdrop/mojom/drag_drop_types.mojom-shared.h"
 #include "ui/base/models/list_selection_model.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/native_widget_types.h"
@@ -55,12 +56,6 @@
 // is the default on aura.
 class TabDragController : public views::WidgetObserver {
  public:
-  // Indicates the event source that initiated the drag.
-  enum EventSource {
-    EVENT_SOURCE_MOUSE,
-    EVENT_SOURCE_TOUCH,
-  };
-
   // Amount above or below the tabstrip the user has to drag before detaching.
   static const int kTouchVerticalDetachMagnetism;
   static const int kVerticalDetachMagnetism;
@@ -86,7 +81,7 @@
             const gfx::Point& mouse_offset,
             int source_view_offset,
             ui::ListSelectionModel initial_selection_model,
-            EventSource event_source);
+            ui::mojom::DragEventSource event_source);
 
   // Returns true if there is a drag underway and the drag is attached to
   // |tab_strip|.
@@ -109,7 +104,7 @@
   // Returns the pointer of |source_context_|.
   static TabDragContext* GetSourceContext();
 
-  EventSource event_source() const { return event_source_; }
+  ui::mojom::DragEventSource event_source() const { return event_source_; }
 
   // See description above fields for details on these.
   bool active() const { return current_state_ != DragState::kStopped; }
@@ -565,7 +560,7 @@
   // as a result of a drag finishing.
   void NotifyEventIfTabAddedToGroup();
 
-  EventSource event_source_ = EVENT_SOURCE_MOUSE;
+  ui::mojom::DragEventSource event_source_ = ui::mojom::DragEventSource::kMouse;
 
   // The TabDragContext the drag originated from. This is set to null
   // if destroyed during the drag.
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc
index fd53f6db..02548125c 100644
--- a/chrome/browser/ui/views/tabs/tab_strip.cc
+++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -122,10 +122,9 @@
 
 namespace {
 
-TabDragController::EventSource EventSourceFromEvent(
-    const ui::LocatedEvent& event) {
-  return event.IsGestureEvent() ? TabDragController::EVENT_SOURCE_TOUCH
-                                : TabDragController::EVENT_SOURCE_MOUSE;
+ui::mojom::DragEventSource EventSourceFromEvent(const ui::LocatedEvent& event) {
+  return event.IsGestureEvent() ? ui::mojom::DragEventSource::kTouch
+                                : ui::mojom::DragEventSource::kMouse;
 }
 
 }  // namespace
diff --git a/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog_browsertest.cc b/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog_browsertest.cc
index aba5aec..fb096fcc 100644
--- a/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog_browsertest.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog_browsertest.cc
@@ -5,12 +5,11 @@
 #include <vector>
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_dialogs.h"
-#include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/test/test_browser_dialog.h"
-#include "chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog.h"
-#include "chrome/browser/web_applications/test/web_app_icon_test_utils.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
+#include "components/webapps/common/constants.h"
 #include "content/public/test/browser_test.h"
+#include "third_party/skia/include/core/SkBitmap.h"
 #include "third_party/skia/include/core/SkColor.h"
 
 namespace web_app {
@@ -23,13 +22,25 @@
     install_info->title = u"test";
     install_info->description = u"This is a test app";
 
-    AddGeneratedIcon(&install_info->icon_bitmaps.any, kIconSize, kIconColor);
+    install_info->icon_bitmaps.any[kIconSize] =
+        CreateSolidColorIcon(kIconSize, kIconSize, kIconColor);
 
-    const std::vector<SkBitmap> screenshots = {
-        CreateSquareIcon(kScreenshotSize, SK_ColorGREEN),
-        CreateSquareIcon(kScreenshotSize, SK_ColorBLACK),
-        CreateSquareIcon(kScreenshotSize, SK_ColorBLUE)};
-
+    std::vector<SkBitmap> screenshots;
+    if (name == "single_screenshot") {
+      screenshots.push_back(CreateSolidColorIcon(
+          kScreenshotSize, kScreenshotSize, SK_ColorGREEN));
+    } else if (name == "multiple_screenshots") {
+      screenshots.push_back(CreateSolidColorIcon(
+          kScreenshotSize, kScreenshotSize, SK_ColorGREEN));
+      screenshots.push_back(CreateSolidColorIcon(
+          kScreenshotSize, kScreenshotSize, SK_ColorBLACK));
+      screenshots.push_back(
+          CreateSolidColorIcon(kScreenshotSize, kScreenshotSize, SK_ColorBLUE));
+    } else if (name == "max_ratio_screenshot") {
+      screenshots.push_back(CreateSolidColorIcon(
+          webapps::kMaximumScreenshotRatio * kScreenshotSize, kScreenshotSize,
+          SK_ColorGREEN));
+    }
     chrome::ShowWebAppDetailedInstallDialog(
         browser()->tab_strip_model()->GetWebContentsAt(0),
         std::move(install_info), base::DoNothing(), screenshots,
@@ -37,13 +48,30 @@
   }
 
  private:
+  SkBitmap CreateSolidColorIcon(int width, int height, SkColor color) {
+    SkBitmap bitmap;
+    bitmap.allocN32Pixels(width, height);
+    bitmap.eraseColor(color);
+    return bitmap;
+  };
+
   static constexpr int kIconSize = 40;
   static constexpr int kScreenshotSize = 300;
   static constexpr SkColor kIconColor = SK_ColorGREEN;
 };
 
 IN_PROC_BROWSER_TEST_F(WebAppDetailedInstallDialogBrowserTest,
-                       InvokeUi_Default) {
+                       InvokeUi_single_screenshot) {
+  ShowAndVerifyUi();
+}
+
+IN_PROC_BROWSER_TEST_F(WebAppDetailedInstallDialogBrowserTest,
+                       InvokeUi_multiple_screenshots) {
+  ShowAndVerifyUi();
+}
+
+IN_PROC_BROWSER_TEST_F(WebAppDetailedInstallDialogBrowserTest,
+                       InvokeUi_max_ratio_screenshot) {
   ShowAndVerifyUi();
 }
 
diff --git a/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc b/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc
index aa36c5b..51d6027 100644
--- a/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc
+++ b/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc
@@ -410,7 +410,7 @@
     // NetworkHandlerTestHelper.
     chromeos::DBusThreadManager::Initialize();
     network_handler_test_helper_ =
-        std::make_unique<chromeos::NetworkHandlerTestHelper>();
+        std::make_unique<ash::NetworkHandlerTestHelper>();
     chromeos::NetworkMetadataStore::RegisterPrefs(user_prefs_.registry());
     // The |DeviceSettingsTestBase| setup above instantiates
     // |FakeShillManagerClient| with a default environment which will post
@@ -588,8 +588,7 @@
   std::u16string device_domain_;
   ContextualManagementSourceUpdate extracted_;
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-  std::unique_ptr<chromeos::NetworkHandlerTestHelper>
-      network_handler_test_helper_;
+  std::unique_ptr<ash::NetworkHandlerTestHelper> network_handler_test_helper_;
   std::unique_ptr<ash::ScopedStubInstallAttributes> install_attributes_;
   std::unique_ptr<crostini::FakeCrostiniFeatures> crostini_features_;
   TestingPrefServiceSimple local_state_;
diff --git a/chrome/browser/ui/webui/realbox/realbox_handler.cc b/chrome/browser/ui/webui/realbox/realbox_handler.cc
index 515b20f..fa31dac 100644
--- a/chrome/browser/ui/webui/realbox/realbox_handler.cc
+++ b/chrome/browser/ui/webui/realbox/realbox_handler.cc
@@ -21,8 +21,8 @@
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/predictors/autocomplete_action_predictor.h"
 #include "chrome/browser/predictors/autocomplete_action_predictor_factory.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service_factory.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
 #include "chrome/browser/ui/bookmarks/bookmark_stats.h"
diff --git a/chrome/browser/ui/webui/realbox/realbox_handler_browsertest.cc b/chrome/browser/ui/webui/realbox/realbox_handler_browsertest.cc
index 15da1bb7..e092ee3 100644
--- a/chrome/browser/ui/webui/realbox/realbox_handler_browsertest.cc
+++ b/chrome/browser/ui/webui/realbox/realbox_handler_browsertest.cc
@@ -11,10 +11,10 @@
 #include "base/check.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/test/scoped_feature_list.h"
-#include "chrome/browser/prefetch/search_prefetch/field_trial_settings.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_browser_test_base.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service.h"
-#include "chrome/browser/prefetch/search_prefetch/search_prefetch_service_factory.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_browser_test_base.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h"
+#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_factory.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/omnibox/omnibox_pedal_implementations.h"
 #include "chrome/common/chrome_features.h"
diff --git a/chrome/browser/ui/webui/settings/chromeos/BUILD.gn b/chrome/browser/ui/webui/settings/chromeos/BUILD.gn
index 0fc7523..b20c3183 100644
--- a/chrome/browser/ui/webui/settings/chromeos/BUILD.gn
+++ b/chrome/browser/ui/webui/settings/chromeos/BUILD.gn
@@ -5,6 +5,7 @@
 group("mojom_js") {
   public_deps = [
     "constants:mojom_js",
+    "//ash/components/audio/public/mojom/:mojom_js",
     "//chrome/browser/ui/webui/nearby_share/public/mojom:mojom_js",
     "//chrome/browser/ui/webui/settings/ash/search:mojo_bindings_js",
     "//ui/webui/resources/cr_components/app_management:mojo_bindings_js",
diff --git a/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc b/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc
index 6314a8b..5f036746 100644
--- a/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "ash/constants/ash_features.h"
+#include "ash/public/cpp/audio_config_service.h"
 #include "ash/public/cpp/bluetooth_config_service.h"
 #include "ash/public/cpp/esim_manager.h"
 #include "ash/public/cpp/network_config_service.h"
@@ -223,6 +224,12 @@
 }
 
 void OSSettingsUI::BindInterface(
+    mojo::PendingReceiver<ash::audio_config::mojom::CrosAudioConfig> receiver) {
+  DCHECK(features::IsAudioSettingsPageEnabled());
+  ash::GetAudioConfigService(std::move(receiver));
+}
+
+void OSSettingsUI::BindInterface(
     mojo::PendingReceiver<ash::auth::mojom::AuthFactorConfig> receiver) {
   ash::auth::BindToAuthFactorConfig(std::move(receiver));
 }
diff --git a/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.h b/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.h
index 41a569c..7afd6b32 100644
--- a/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.h
+++ b/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.h
@@ -7,6 +7,7 @@
 
 #include <memory>
 
+#include "ash/components/audio/public/mojom/cros_audio_config.mojom-forward.h"
 #include "ash/services/cellular_setup/public/mojom/cellular_setup.mojom-forward.h"
 #include "ash/services/cellular_setup/public/mojom/esim_manager.mojom-forward.h"
 #include "ash/webui/personalization_app/search/search.mojom-forward.h"
@@ -60,6 +61,12 @@
   void BindInterface(
       mojo::PendingReceiver<ash::cellular_setup::mojom::ESimManager> receiver);
 
+  // Instantiates implementor of the mojom::CrosAudioConfig mojo interface
+  // passing the pending receiver that will be internally bound.
+  void BindInterface(
+      mojo::PendingReceiver<ash::audio_config::mojom::CrosAudioConfig>
+          receiver);
+
   // Instantiates implementor of the mojom::CrosNetworkConfig mojo interface
   // passing the pending receiver that will be internally bound.
   void BindInterface(
diff --git a/chrome/browser/upgrade_detector/get_installed_version_lacros.cc b/chrome/browser/upgrade_detector/get_installed_version_lacros.cc
index 4d75c831..9a8f5c8 100644
--- a/chrome/browser/upgrade_detector/get_installed_version_lacros.cc
+++ b/chrome/browser/upgrade_detector/get_installed_version_lacros.cc
@@ -34,7 +34,7 @@
               base::Version version(version_str);
               if (!version.IsValid() ||
                   (version < version_info::GetVersion() &&
-                   chromeos::BrowserParamsProxy::Get()->lacros_selection() ==
+                   chromeos::BrowserParamsProxy::Get()->LacrosSelection() ==
                        crosapi::mojom::BrowserInitParams::LacrosSelection::
                            kRootfs)) {
                 version = version_info::GetVersion();
diff --git a/chrome/browser/web_applications/app_service/web_apps.h b/chrome/browser/web_applications/app_service/web_apps.h
index dc411fb..e1abd28 100644
--- a/chrome/browser/web_applications/app_service/web_apps.h
+++ b/chrome/browser/web_applications/app_service/web_apps.h
@@ -101,7 +101,7 @@
                            apps::IntentPtr intent,
                            apps::LaunchSource launch_source,
                            apps::WindowInfoPtr window_info,
-                           base::OnceCallback<void(bool)> callback);
+                           base::OnceCallback<void(bool)> callback) override;
   void LaunchAppWithParams(apps::AppLaunchParams&& params,
                            apps::LaunchCallback callback) override;
   void LaunchShortcut(const std::string& app_id,
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index a471cb2..a922bb9 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1658425924-e2c6280a51ccc9e0ee83ef2933893b13ff7fcb7c.profdata
+chrome-linux-main-1658447672-1313a34fab26b29906f917dc455b6d38ebb07e21.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index d037282..f646191f 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1658404777-7084a82ba36c768f97b84ad52e5b3ce4c9720571.profdata
+chrome-mac-main-1658425924-598d7325e74a135e96eafc9cd0ee7c55c688d546.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 384962c..920c91b 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1658425924-23d20021b0a4b09689ed0da2e2eccc4accf2fc53.profdata
+chrome-win64-main-1658437191-63c0aed8dc8292daf98656d254c8c4fe7bcea7fe.profdata
diff --git a/chrome/common/extensions/api/identity.idl b/chrome/common/extensions/api/identity.idl
index aec69f94..3984b39 100644
--- a/chrome/common/extensions/api/identity.idl
+++ b/chrome/common/extensions/api/identity.idl
@@ -109,7 +109,7 @@
     // present on the profile.
     //
     // <code>getAccounts</code> is only supported on dev channel.
-    static void getAccounts(GetAccountsCallback callback);
+    [supportsPromises] static void getAccounts(GetAccountsCallback callback);
 
     // Gets an OAuth2 access token using the client ID and scopes
     // specified in the <a
@@ -155,7 +155,7 @@
     // |callback|: Called with the <code>ProfileUserInfo</code> of the primary
     // Chrome account, of an empty <code>ProfileUserInfo</code> if the account
     // with given <code>details</code> doesn't exist.
-    static void getProfileUserInfo(
+    [supportsPromises] static void getProfileUserInfo(
         optional ProfileDetails details,
         GetProfileUserInfoCallback callback);
 
@@ -168,7 +168,7 @@
     //
     // |details| : Token information.
     // |callback| : Called when the token has been removed from the cache.
-    static void removeCachedAuthToken(
+    [supportsPromises] static void removeCachedAuthToken(
         InvalidTokenDetails details,
         optional InvalidateAuthTokenCallback callback);
 
@@ -180,7 +180,7 @@
     // </ul>
     //
     // |callback| : Called when the state has been cleared.
-    static void clearAllCachedAuthTokens(
+    [supportsPromises] static void clearAllCachedAuthTokens(
         ClearAllCachedAuthTokensCallback callback);
 
     // Starts an auth flow at the specified URL.
@@ -201,8 +201,9 @@
     //
     // |details| : WebAuth flow options.
     // |callback| : Called with the URL redirected back to your application.
-    static void launchWebAuthFlow(WebAuthFlowDetails details,
-                                  LaunchWebAuthFlowCallback callback);
+    [supportsPromises] static void launchWebAuthFlow(
+        WebAuthFlowDetails details,
+        LaunchWebAuthFlowCallback callback);
 
     // Generates a redirect URL to be used in |launchWebAuthFlow|.
     //
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 3bb624d1..52848b07 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -532,6 +532,8 @@
       "../browser/component_updater/fake_cros_component_manager.h",
       "../browser/ui/ash/accessibility/fake_accessibility_controller.cc",
       "../browser/ui/ash/accessibility/fake_accessibility_controller.h",
+      "../browser/ui/ash/clipboard_history_test_util.cc",
+      "../browser/ui/ash/clipboard_history_test_util.h",
       "../browser/ui/webui/chromeos/login/fake_app_launch_splash_screen_handler.cc",
       "../browser/ui/webui/chromeos/login/fake_app_launch_splash_screen_handler.h",
       "base/browser_process_platform_part_test_api_chromeos.cc",
@@ -880,7 +882,7 @@
       "../browser/password_manager/passwords_navigation_observer.cc",
       "../browser/password_manager/passwords_navigation_observer.h",
       "../browser/policy/policy_prefs_browsertest.cc",
-      "../browser/prefetch/search_prefetch/search_preload_unified_browsertest.cc",
+      "../browser/preloading/prefetch/search_prefetch/search_preload_unified_browsertest.cc",
       "../browser/profiles/profile_browsertest_android.cc",
       "../browser/safe_browsing/client_side_detection_service_browsertest.cc",
       "../browser/safe_browsing/test_safe_browsing_database_helper.cc",
@@ -1454,6 +1456,7 @@
       "//components/variations/service",
       "//components/version_info",
       "//components/webapps/browser",
+      "//components/webapps/common:common",
       "//components/webrtc",
       "//components/webrtc_logging/browser",
       "//content/public/common",
@@ -1980,15 +1983,15 @@
       "../browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc",
       "../browser/prefetch/prefetch_proxy/prefetch_proxy_test_utils.cc",
       "../browser/prefetch/prefetch_proxy/prefetch_proxy_test_utils.h",
-      "../browser/prefetch/search_prefetch/search_prefetch_browser_test_base.cc",
-      "../browser/prefetch/search_prefetch/search_prefetch_browser_test_base.h",
-      "../browser/prefetch/search_prefetch/search_prefetch_service_browsertest.cc",
-      "../browser/prefetch/search_prefetch/search_preload_unified_browsertest.cc",
       "../browser/prefs/pref_functional_browsertest.cc",
       "../browser/prefs/pref_service_browsertest.cc",
       "../browser/prefs/tracked/pref_hash_browsertest.cc",
       "../browser/preloading/latency_ablation_browsertest.cc",
       "../browser/preloading/prefetch/no_state_prefetch/prerender_nostate_prefetch_browsertest.cc",
+      "../browser/preloading/prefetch/search_prefetch/search_prefetch_browser_test_base.cc",
+      "../browser/preloading/prefetch/search_prefetch/search_prefetch_browser_test_base.h",
+      "../browser/preloading/prefetch/search_prefetch/search_prefetch_service_browsertest.cc",
+      "../browser/preloading/prefetch/search_prefetch/search_preload_unified_browsertest.cc",
       "../browser/preloading/prefetch/zero_suggest_prefetch/zero_suggest_prefetch_tab_helper_browsertest.cc",
       "../browser/privacy_sandbox/privacy_sandbox_settings_browsertest.cc",
       "../browser/profile_resetter/profile_resetter_browsertest.cc",
@@ -9514,6 +9517,7 @@
         "../browser/ash/login/login_manager_test.cc",
         "../browser/ash/login/login_manager_test.h",
         "../browser/ui/app_list/app_list_client_interactive_uitest.cc",
+        "../browser/ui/ash/clipboard_history_interactive_uitest.cc",
       ]
 
       # These tests are not applicable on Chrome OS.
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/wrapup_repair_complete_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/wrapup_repair_complete_page_test.js
index 2034776..d22935ac 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/wrapup_repair_complete_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/wrapup_repair_complete_page_test.js
@@ -6,11 +6,11 @@
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
 import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js';
 import {ShimlessRma} from 'chrome://shimless-rma/shimless_rma.js';
-import {ShutdownMethod} from 'chrome://shimless-rma/shimless_rma_types.js';
+import {RmadErrorCode, ShutdownMethod} from 'chrome://shimless-rma/shimless_rma_types.js';
 import {WrapupRepairCompletePage} from 'chrome://shimless-rma/wrapup_repair_complete_page.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
-import {flushTasks} from '../../test_util.js';
+import {flushTasks, isVisible} from '../../test_util.js';
 
 export function wrapupRepairCompletePageTest() {
   /**
@@ -343,10 +343,23 @@
       return resolver.promise;
     };
 
+    // Open the logs dialog.
+    await clickButton('#rmaLogButton');
+    assertTrue(
+        isVisible(component.shadowRoot.querySelector('#saveLogDialogButton')));
+
+    // Attempt to save the logs.
     await clickButton('#saveLogDialogButton');
+    resolver.resolve({savePath: 'save/path', error: RmadErrorCode.kOk});
     await flushTasks();
 
     assertEquals(1, callCount);
+
+    // The save log button should be replaced by the done button.
+    assertFalse(
+        isVisible(component.shadowRoot.querySelector('#saveLogDialogButton')));
+    assertTrue(isVisible(
+        component.shadowRoot.querySelector('#logSaveDoneDialogButton')));
   });
 
   test('BatteryCutButtonDisabledByDefault', async () => {
diff --git a/chrome/utility/services.cc b/chrome/utility/services.cc
index 6bbade9e..ba6f7cb 100644
--- a/chrome/utility/services.cc
+++ b/chrome/utility/services.cc
@@ -376,9 +376,9 @@
 
 #if BUILDFLAG(ENABLE_CROS_LIBASSISTANT)
 auto RunAssistantAudioDecoder(
-    mojo::PendingReceiver<
-        chromeos::assistant::mojom::AssistantAudioDecoderFactory> receiver) {
-  return std::make_unique<chromeos::assistant::AssistantAudioDecoderFactory>(
+    mojo::PendingReceiver<ash::assistant::mojom::AssistantAudioDecoderFactory>
+        receiver) {
+  return std::make_unique<ash::assistant::AssistantAudioDecoderFactory>(
       std::move(receiver));
 }
 
diff --git a/chromeos/ash/components/network/cellular_esim_profile_handler_impl.h b/chromeos/ash/components/network/cellular_esim_profile_handler_impl.h
index afc8d87..e2992a79 100644
--- a/chromeos/ash/components/network/cellular_esim_profile_handler_impl.h
+++ b/chromeos/ash/components/network/cellular_esim_profile_handler_impl.h
@@ -108,4 +108,9 @@
 
 }  // namespace chromeos
 
+// TODO(https://crbug.com/1164001): remove when it moved to ash.
+namespace ash {
+using ::chromeos::CellularESimProfileHandlerImpl;
+}
+
 #endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_CELLULAR_ESIM_PROFILE_HANDLER_IMPL_H_
diff --git a/chromeos/ash/components/network/fake_network_activation_handler.cc b/chromeos/ash/components/network/fake_network_activation_handler.cc
index cf2712e..0ffdbd9 100644
--- a/chromeos/ash/components/network/fake_network_activation_handler.cc
+++ b/chromeos/ash/components/network/fake_network_activation_handler.cc
@@ -6,7 +6,7 @@
 
 #include "base/callback.h"
 
-namespace chromeos {
+namespace ash {
 
 FakeNetworkActivationHandler::ActivationParams::ActivationParams(
     const std::string& service_path,
@@ -42,4 +42,4 @@
       service_path, std::move(success_callback), std::move(error_callback));
 }
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chromeos/ash/components/network/fake_network_activation_handler.h b/chromeos/ash/components/network/fake_network_activation_handler.h
index 74b532d..538e7e9 100644
--- a/chromeos/ash/components/network/fake_network_activation_handler.h
+++ b/chromeos/ash/components/network/fake_network_activation_handler.h
@@ -11,7 +11,7 @@
 #include "chromeos/ash/components/network/network_activation_handler.h"
 #include "chromeos/ash/components/network/network_handler_callbacks.h"
 
-namespace chromeos {
+namespace ash {
 
 // Fake NetworkActivationHandler implementation for tests.
 class COMPONENT_EXPORT(CHROMEOS_NETWORK) FakeNetworkActivationHandler
@@ -61,11 +61,6 @@
   std::vector<ActivationParams> complete_activation_calls_;
 };
 
-}  // namespace chromeos
-
-// TODO(https://crbug.com/1164001): remove after the migration is finished.
-namespace ash {
-using ::chromeos::FakeNetworkActivationHandler;
-}
+}  // namespace ash
 
 #endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_FAKE_NETWORK_ACTIVATION_HANDLER_H_
diff --git a/chromeos/ash/components/network/fake_network_connection_handler.cc b/chromeos/ash/components/network/fake_network_connection_handler.cc
index 78181e42..7958a25 100644
--- a/chromeos/ash/components/network/fake_network_connection_handler.cc
+++ b/chromeos/ash/components/network/fake_network_connection_handler.cc
@@ -6,7 +6,7 @@
 
 #include <utility>
 
-namespace chromeos {
+namespace ash {
 
 FakeNetworkConnectionHandler::ConnectionParams::ConnectionParams(
     const std::string& service_path,
@@ -73,4 +73,4 @@
   // No initialization necessary for a test double.
 }
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chromeos/ash/components/network/fake_network_connection_handler.h b/chromeos/ash/components/network/fake_network_connection_handler.h
index 90c56bff..ae6a692 100644
--- a/chromeos/ash/components/network/fake_network_connection_handler.h
+++ b/chromeos/ash/components/network/fake_network_connection_handler.h
@@ -13,7 +13,7 @@
 #include "chromeos/ash/components/network/network_connection_handler.h"
 #include "chromeos/ash/components/network/network_handler_callbacks.h"
 
-namespace chromeos {
+namespace ash {
 
 // Fake NetworkConnectionHandler implementation for tests.
 class COMPONENT_EXPORT(CHROMEOS_NETWORK) FakeNetworkConnectionHandler
@@ -92,11 +92,11 @@
   std::vector<ConnectionParams> disconnect_calls_;
 };
 
-}  // namespace chromeos
+}  // namespace ash
 
-// TODO(https://crbug.com/1164001): remove after the migration is finished.
-namespace ash {
-using ::chromeos::FakeNetworkConnectionHandler;
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos {
+using ::ash::FakeNetworkConnectionHandler;
 }
 
 #endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_FAKE_NETWORK_CONNECTION_HANDLER_H_
diff --git a/chromeos/ash/components/network/fake_network_device_handler.cc b/chromeos/ash/components/network/fake_network_device_handler.cc
index 8a4d656..9375a2c 100644
--- a/chromeos/ash/components/network/fake_network_device_handler.cc
+++ b/chromeos/ash/components/network/fake_network_device_handler.cc
@@ -4,7 +4,7 @@
 
 #include "chromeos/ash/components/network/fake_network_device_handler.h"
 
-namespace chromeos {
+namespace ash {
 
 FakeNetworkDeviceHandler::FakeNetworkDeviceHandler() = default;
 
@@ -63,4 +63,4 @@
 void FakeNetworkDeviceHandler::SetUsbEthernetMacAddressSource(
     const std::string& source) {}
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chromeos/ash/components/network/fake_network_device_handler.h b/chromeos/ash/components/network/fake_network_device_handler.h
index c1d9ea9..c75244ca 100644
--- a/chromeos/ash/components/network/fake_network_device_handler.h
+++ b/chromeos/ash/components/network/fake_network_device_handler.h
@@ -12,7 +12,7 @@
 #include "base/component_export.h"
 #include "chromeos/ash/components/network/network_device_handler.h"
 
-namespace chromeos {
+namespace ash {
 
 // This is a fake implementation which does nothing. Use this as a base class
 // for concrete fake handlers.
@@ -74,6 +74,6 @@
   void SetUsbEthernetMacAddressSource(const std::string& source) override;
 };
 
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_FAKE_NETWORK_DEVICE_HANDLER_H_
diff --git a/chromeos/ash/components/network/fake_stub_cellular_networks_provider.cc b/chromeos/ash/components/network/fake_stub_cellular_networks_provider.cc
index cc39900..af706cb 100644
--- a/chromeos/ash/components/network/fake_stub_cellular_networks_provider.cc
+++ b/chromeos/ash/components/network/fake_stub_cellular_networks_provider.cc
@@ -10,7 +10,7 @@
 #include "base/guid.h"
 #include "chromeos/ash/components/network/cellular_utils.h"
 
-namespace chromeos {
+namespace ash {
 
 FakeStubCellularNetworksProvider::FakeStubCellularNetworksProvider() = default;
 
@@ -141,4 +141,4 @@
   return not_backed_by_shill;
 }
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chromeos/ash/components/network/fake_stub_cellular_networks_provider.h b/chromeos/ash/components/network/fake_stub_cellular_networks_provider.h
index 3fb71b6..27f1a685 100644
--- a/chromeos/ash/components/network/fake_stub_cellular_networks_provider.h
+++ b/chromeos/ash/components/network/fake_stub_cellular_networks_provider.h
@@ -11,7 +11,7 @@
 #include "base/containers/flat_set.h"
 #include "chromeos/ash/components/network/network_state_handler.h"
 
-namespace chromeos {
+namespace ash {
 
 // Fake StubCellularNetworksProvider implementation which allows clients to
 // specify ICCIDs of stub networks to be created.
@@ -58,6 +58,11 @@
   base::flat_set<std::string> managed_iccids_;
 };
 
-}  // namespace chromeos
+}  // namespace ash
+
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos {
+using ::ash::FakeStubCellularNetworksProvider;
+}
 
 #endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_FAKE_STUB_CELLULAR_NETWORKS_PROVIDER_H_
diff --git a/chromeos/ash/components/network/managed_cellular_pref_handler.h b/chromeos/ash/components/network/managed_cellular_pref_handler.h
index 83c87f79ed..8a5d824 100644
--- a/chromeos/ash/components/network/managed_cellular_pref_handler.h
+++ b/chromeos/ash/components/network/managed_cellular_pref_handler.h
@@ -70,4 +70,9 @@
 
 }  // namespace chromeos
 
+// TODO(https://crbug.com/1164001): remove when it moved to ash.
+namespace ash {
+using ::chromeos::ManagedCellularPrefHandler;
+}
+
 #endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_MANAGED_CELLULAR_PREF_HANDLER_H_
diff --git a/chromeos/ash/components/network/managed_network_configuration_handler.h b/chromeos/ash/components/network/managed_network_configuration_handler.h
index 0eb3813..d4ebd6d 100644
--- a/chromeos/ash/components/network/managed_network_configuration_handler.h
+++ b/chromeos/ash/components/network/managed_network_configuration_handler.h
@@ -14,6 +14,10 @@
 #include "chromeos/ash/components/network/client_cert_util.h"
 #include "chromeos/ash/components/network/network_handler.h"
 #include "chromeos/ash/components/network/network_handler_callbacks.h"
+// TODO(https://crbug.com/1164001): move to forward declaration
+#include "chromeos/ash/components/network/network_policy_observer.h"
+// TODO(https://crbug.com/1164001): move to forward declaration
+#include "chromeos/ash/components/network/network_profile.h"
 #include "components/onc/onc_constants.h"
 
 namespace base {
@@ -24,8 +28,6 @@
 
 class NetworkConfigurationHandler;
 class NetworkDeviceHandler;
-class NetworkPolicyObserver;
-struct NetworkProfile;
 class NetworkProfileHandler;
 class NetworkStateHandler;
 
diff --git a/chromeos/ash/components/network/managed_state.h b/chromeos/ash/components/network/managed_state.h
index f516363..b81d6ce 100644
--- a/chromeos/ash/components/network/managed_state.h
+++ b/chromeos/ash/components/network/managed_state.h
@@ -14,6 +14,7 @@
 #include "base/component_export.h"
 
 namespace ash {
+class NetworkStateTestHelper;
 namespace tether {
 class NetworkListSorterTest;
 }  // namespace tether
@@ -128,8 +129,8 @@
 
  private:
   friend class ::ash::tether::NetworkListSorterTest;
+  friend class ::ash::NetworkStateTestHelper;
   friend class NetworkStateHandler;
-  friend class NetworkStateTestHelper;
 
   ManagedType managed_type_;
 
diff --git a/chromeos/ash/components/network/mock_managed_network_configuration_handler.cc b/chromeos/ash/components/network/mock_managed_network_configuration_handler.cc
index 2a2fafc7..af6114b 100644
--- a/chromeos/ash/components/network/mock_managed_network_configuration_handler.cc
+++ b/chromeos/ash/components/network/mock_managed_network_configuration_handler.cc
@@ -4,7 +4,7 @@
 
 #include "chromeos/ash/components/network/mock_managed_network_configuration_handler.h"
 
-namespace chromeos {
+namespace ash {
 
 MockManagedNetworkConfigurationHandler::
     MockManagedNetworkConfigurationHandler() = default;
@@ -12,4 +12,4 @@
 MockManagedNetworkConfigurationHandler::
     ~MockManagedNetworkConfigurationHandler() = default;
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chromeos/ash/components/network/mock_managed_network_configuration_handler.h b/chromeos/ash/components/network/mock_managed_network_configuration_handler.h
index 213aab4..3cb78c9 100644
--- a/chromeos/ash/components/network/mock_managed_network_configuration_handler.h
+++ b/chromeos/ash/components/network/mock_managed_network_configuration_handler.h
@@ -13,7 +13,7 @@
 #include "chromeos/ash/components/network/managed_network_configuration_handler.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
-namespace chromeos {
+namespace ash {
 
 class COMPONENT_EXPORT(CHROMEOS_NETWORK) MockManagedNetworkConfigurationHandler
     : public ManagedNetworkConfigurationHandler {
@@ -104,11 +104,6 @@
   MOCK_CONST_METHOD0(GetBlockedHexSSIDs, std::vector<std::string>());
 };
 
-}  // namespace chromeos
-
-// TODO(https://crbug.com/1164001): remove when this file is moved to ash.
-namespace ash {
-using ::chromeos::MockManagedNetworkConfigurationHandler;
 }  // namespace ash
 
 #endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_MOCK_MANAGED_NETWORK_CONFIGURATION_HANDLER_H_
diff --git a/chromeos/ash/components/network/mock_network_device_handler.cc b/chromeos/ash/components/network/mock_network_device_handler.cc
index ef97917..5f29681 100644
--- a/chromeos/ash/components/network/mock_network_device_handler.cc
+++ b/chromeos/ash/components/network/mock_network_device_handler.cc
@@ -4,10 +4,10 @@
 
 #include "chromeos/ash/components/network/mock_network_device_handler.h"
 
-namespace chromeos {
+namespace ash {
 
 MockNetworkDeviceHandler::MockNetworkDeviceHandler() = default;
 
 MockNetworkDeviceHandler::~MockNetworkDeviceHandler() = default;
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chromeos/ash/components/network/mock_network_device_handler.h b/chromeos/ash/components/network/mock_network_device_handler.h
index d662757..151842f 100644
--- a/chromeos/ash/components/network/mock_network_device_handler.h
+++ b/chromeos/ash/components/network/mock_network_device_handler.h
@@ -16,7 +16,7 @@
 #include "net/base/ip_endpoint.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
-namespace chromeos {
+namespace ash {
 
 class COMPONENT_EXPORT(CHROMEOS_NETWORK) MockNetworkDeviceHandler
     : public NetworkDeviceHandler {
@@ -82,6 +82,6 @@
                void(const std::string& enabled));
 };
 
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_MOCK_NETWORK_DEVICE_HANDLER_H_
diff --git a/chromeos/ash/components/network/mock_network_state_handler.cc b/chromeos/ash/components/network/mock_network_state_handler.cc
index d3e4a14..26ad71fe1 100644
--- a/chromeos/ash/components/network/mock_network_state_handler.cc
+++ b/chromeos/ash/components/network/mock_network_state_handler.cc
@@ -4,7 +4,7 @@
 
 #include "chromeos/ash/components/network/mock_network_state_handler.h"
 
-namespace chromeos {
+namespace ash {
 
 MockNetworkStateHandler::MockNetworkStateHandler() = default;
 
@@ -18,4 +18,4 @@
   return handler;
 }
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chromeos/ash/components/network/mock_network_state_handler.h b/chromeos/ash/components/network/mock_network_state_handler.h
index 44d881c..33ab04c 100644
--- a/chromeos/ash/components/network/mock_network_state_handler.h
+++ b/chromeos/ash/components/network/mock_network_state_handler.h
@@ -8,7 +8,7 @@
 #include "chromeos/ash/components/network/network_state_handler.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
-namespace chromeos {
+namespace ash {
 
 class COMPONENT_EXPORT(CHROMEOS_NETWORK) MockNetworkStateHandler
     : public NetworkStateHandler {
@@ -30,6 +30,11 @@
   MOCK_METHOD1(UpdateBlockedCellularNetworks, void(bool));
 };
 
-}  // namespace chromeos
+}  // namespace ash
 
-#endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_MOCK_NETWORK_STATE_HANDLER_H_
\ No newline at end of file
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos {
+using ::ash::MockNetworkStateHandler;
+}
+
+#endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_MOCK_NETWORK_STATE_HANDLER_H_
diff --git a/chromeos/ash/components/network/network_device_handler.h b/chromeos/ash/components/network/network_device_handler.h
index d16b47c..31519c428 100644
--- a/chromeos/ash/components/network/network_device_handler.h
+++ b/chromeos/ash/components/network/network_device_handler.h
@@ -11,6 +11,8 @@
 #include "base/callback.h"
 #include "base/component_export.h"
 #include "chromeos/ash/components/network/network_handler_callbacks.h"
+// TODO(https://crbug.com/1164001): move to forward declaration
+#include "chromeos/ash/components/network/network_state_handler.h"
 
 namespace base {
 class Value;
@@ -18,8 +20,6 @@
 
 namespace chromeos {
 
-class NetworkStateHandler;
-
 // The NetworkDeviceHandler class allows making device specific requests on a
 // ChromeOS network device. All calls are asynchronous and interact with the
 // Shill device API. No calls will block on DBus calls.
diff --git a/chromeos/ash/components/network/network_handler_test_helper.cc b/chromeos/ash/components/network/network_handler_test_helper.cc
index 70b9d38..1ca3959a 100644
--- a/chromeos/ash/components/network/network_handler_test_helper.cc
+++ b/chromeos/ash/components/network/network_handler_test_helper.cc
@@ -11,7 +11,7 @@
 #include "chromeos/ash/components/network/network_test_helper_base.h"
 #include "components/onc/onc_pref_names.h"
 
-namespace chromeos {
+namespace ash {
 
 NetworkHandlerTestHelper::NetworkHandlerTestHelper() {
   if (!NetworkHandler::IsInitialized()) {
@@ -44,4 +44,4 @@
   NetworkHandler::Get()->InitializePrefServices(user_prefs, device_prefs);
 }
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chromeos/ash/components/network/network_handler_test_helper.h b/chromeos/ash/components/network/network_handler_test_helper.h
index 55fd7c4..b248054 100644
--- a/chromeos/ash/components/network/network_handler_test_helper.h
+++ b/chromeos/ash/components/network/network_handler_test_helper.h
@@ -10,7 +10,7 @@
 class PrefRegistrySimple;
 class PrefService;
 
-namespace chromeos {
+namespace ash {
 
 // Helper class for tests that uses network handler classes. This class
 // handles initialization and shutdown of Shill and Hermes DBus clients and
@@ -36,12 +36,11 @@
   bool network_handler_initialized_ = false;
 };
 
-}  // namespace chromeos
+}  // namespace ash
 
-// TODO(https://crbug.com/1164001): remove after the //chrome/browser/chromeos
-// source migration is finished.
-namespace ash {
-using ::chromeos::NetworkHandlerTestHelper;
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos {
+using ::ash::NetworkHandlerTestHelper;
 }
 
 #endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_NETWORK_HANDLER_TEST_HELPER_H_
diff --git a/chromeos/ash/components/network/network_metadata_store.h b/chromeos/ash/components/network/network_metadata_store.h
index d7cd325..6c331a6 100644
--- a/chromeos/ash/components/network/network_metadata_store.h
+++ b/chromeos/ash/components/network/network_metadata_store.h
@@ -179,4 +179,9 @@
 
 }  // namespace chromeos
 
+// TODO(https://crbug.com/1164001): remove when it moved to ash.
+namespace ash {
+using ::chromeos::NetworkMetadataStore;
+}
+
 #endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_NETWORK_METADATA_STORE_H_
diff --git a/chromeos/ash/components/network/network_state_handler.h b/chromeos/ash/components/network/network_state_handler.h
index ac8c123..70008e9 100644
--- a/chromeos/ash/components/network/network_state_handler.h
+++ b/chromeos/ash/components/network/network_state_handler.h
@@ -15,6 +15,8 @@
 #include "base/gtest_prod_util.h"
 #include "base/observer_list.h"
 #include "base/sequence_checker.h"
+// TODO(https://crbug.com/1164001): move to forward declaration
+#include "chromeos/ash/components/network/device_state.h"
 #include "chromeos/ash/components/network/managed_state.h"
 #include "chromeos/ash/components/network/network_handler.h"
 #include "chromeos/ash/components/network/network_handler_callbacks.h"
@@ -29,7 +31,6 @@
 
 namespace chromeos {
 
-class DeviceState;
 class NetworkStateHandlerObserver;
 class NetworkStateHandlerTest;
 
diff --git a/chromeos/ash/components/network/network_state_test_helper.cc b/chromeos/ash/components/network/network_state_test_helper.cc
index 73e79a4..9192558 100644
--- a/chromeos/ash/components/network/network_state_test_helper.cc
+++ b/chromeos/ash/components/network/network_state_test_helper.cc
@@ -11,7 +11,7 @@
 #include "chromeos/ash/components/network/network_state_handler.h"
 #include "chromeos/dbus/shill/shill_clients.h"
 
-namespace chromeos {
+namespace ash {
 
 NetworkStateTestHelper::NetworkStateTestHelper(
     bool use_default_devices_and_services) {
@@ -42,4 +42,4 @@
   network_state_handler_->SetDeviceStateUpdatedForTest(device_path);
 }
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chromeos/ash/components/network/network_state_test_helper.h b/chromeos/ash/components/network/network_state_test_helper.h
index a125eee5..697a2fe 100644
--- a/chromeos/ash/components/network/network_state_test_helper.h
+++ b/chromeos/ash/components/network/network_state_test_helper.h
@@ -5,12 +5,13 @@
 #ifndef CHROMEOS_ASH_COMPONENTS_NETWORK_NETWORK_STATE_TEST_HELPER_H_
 #define CHROMEOS_ASH_COMPONENTS_NETWORK_NETWORK_STATE_TEST_HELPER_H_
 
+// TODO(https://crbug.com/1164001): move to forward declaration
+#include "chromeos/ash/components/network/network_device_handler.h"
+// TODO(https://crbug.com/1164001): move to forward declaration
+#include "chromeos/ash/components/network/network_state_handler.h"
 #include "chromeos/ash/components/network/network_test_helper_base.h"
 
-namespace chromeos {
-
-class NetworkDeviceHandler;
-class NetworkStateHandler;
+namespace ash {
 
 // Helper class for tests that use NetworkStateHandler and/or
 // NetworkDeviceHandler. Handles initialization and shutdown of Shill and Hermes
@@ -49,12 +50,11 @@
   std::unique_ptr<NetworkDeviceHandler> network_device_handler_;
 };
 
-}  // namespace chromeos
-
-// TODO(https://crbug.com/1164001): remove when
-// //chromeos/network moved to ash
-namespace ash {
-using ::chromeos::NetworkStateTestHelper;
 }  // namespace ash
 
-#endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_NETWORK_STATE_TEST_HELPER_H_
\ No newline at end of file
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos {
+using ::ash::NetworkStateTestHelper;
+}
+
+#endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_NETWORK_STATE_TEST_HELPER_H_
diff --git a/chromeos/ash/components/network/network_test_helper_base.cc b/chromeos/ash/components/network/network_test_helper_base.cc
index 7ea020d..dd31311f 100644
--- a/chromeos/ash/components/network/network_test_helper_base.cc
+++ b/chromeos/ash/components/network/network_test_helper_base.cc
@@ -17,7 +17,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
 
-namespace chromeos {
+namespace ash {
 
 namespace {
 
@@ -188,4 +188,4 @@
   base::RunLoop().RunUntilIdle();
 }
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chromeos/ash/components/network/network_test_helper_base.h b/chromeos/ash/components/network/network_test_helper_base.h
index 688aa97..2f7a894 100644
--- a/chromeos/ash/components/network/network_test_helper_base.h
+++ b/chromeos/ash/components/network/network_test_helper_base.h
@@ -18,7 +18,7 @@
 #include "chromeos/dbus/shill/shill_profile_client.h"
 #include "chromeos/dbus/shill/shill_service_client.h"
 
-namespace chromeos {
+namespace ash {
 
 // Base Network test helper class. This base class handles initialization and
 // shutdown of Shill and Hermes DBus clients and provides utility methods to
@@ -123,6 +123,6 @@
   base::WeakPtrFactory<NetworkTestHelperBase> weak_ptr_factory_{this};
 };
 
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_NETWORK_TEST_HELPER_BASE_H_
diff --git a/chromeos/ash/components/network/system_token_cert_db_storage_test_util.cc b/chromeos/ash/components/network/system_token_cert_db_storage_test_util.cc
index ad00a65..6dc3c1f 100644
--- a/chromeos/ash/components/network/system_token_cert_db_storage_test_util.cc
+++ b/chromeos/ash/components/network/system_token_cert_db_storage_test_util.cc
@@ -14,7 +14,7 @@
 #include "net/cert/nss_cert_database.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace chromeos {
+namespace ash {
 
 GetSystemTokenCertDbCallbackWrapper::GetSystemTokenCertDbCallbackWrapper() =
     default;
@@ -61,4 +61,4 @@
   has_been_notified_ = true;
 }
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chromeos/ash/components/network/system_token_cert_db_storage_test_util.h b/chromeos/ash/components/network/system_token_cert_db_storage_test_util.h
index ca475f26..75338e4 100644
--- a/chromeos/ash/components/network/system_token_cert_db_storage_test_util.h
+++ b/chromeos/ash/components/network/system_token_cert_db_storage_test_util.h
@@ -16,7 +16,7 @@
 class NSSCertDatabase;
 }
 
-namespace chromeos {
+namespace ash {
 
 // A helper that wraps the callback passed to
 // SystemTokenCertDbStorage::GetDatabase and can answer queries
@@ -69,11 +69,12 @@
   bool has_been_notified_ = false;
 };
 
-}  // namespace chromeos
+}  // namespace ash
 
-// TODO(https://crbug.com/1164001): remove after the migration is finished.
-namespace ash {
-using ::chromeos::GetSystemTokenCertDbCallbackWrapper;
-}
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos {
+using ::ash::FakeSystemTokenCertDbStorageObserver;
+using ::ash::GetSystemTokenCertDbCallbackWrapper;
+}  // namespace chromeos
 
 #endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_SYSTEM_TOKEN_CERT_DB_STORAGE_TEST_UTIL_H_
diff --git a/chromeos/ash/components/network/test_cellular_esim_profile_handler.cc b/chromeos/ash/components/network/test_cellular_esim_profile_handler.cc
index b2c17eb..54dfa4e 100644
--- a/chromeos/ash/components/network/test_cellular_esim_profile_handler.cc
+++ b/chromeos/ash/components/network/test_cellular_esim_profile_handler.cc
@@ -8,7 +8,7 @@
 #include "chromeos/ash/components/network/cellular_utils.h"
 #include "chromeos/ash/components/network/network_state_handler.h"
 
-namespace chromeos {
+namespace ash {
 
 TestCellularESimProfileHandler::TestCellularESimProfileHandler()
     : enable_notify_profile_list_update_(true),
@@ -72,4 +72,4 @@
   NotifyESimProfileListUpdated();
 }
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chromeos/ash/components/network/test_cellular_esim_profile_handler.h b/chromeos/ash/components/network/test_cellular_esim_profile_handler.h
index d5bfadd3..62ecc1e 100644
--- a/chromeos/ash/components/network/test_cellular_esim_profile_handler.h
+++ b/chromeos/ash/components/network/test_cellular_esim_profile_handler.h
@@ -11,7 +11,7 @@
 #include "chromeos/ash/components/network/cellular_esim_profile_handler.h"
 #include "dbus/object_path.h"
 
-namespace chromeos {
+namespace ash {
 
 // A Test implementation of CellularESimProfileHandler that stores profile list
 // in-memory and fetches esim profiles directly from the fake hermes clients.
@@ -47,11 +47,11 @@
   bool has_pending_notify_list_update_;
 };
 
-}  // namespace chromeos
+}  // namespace ash
 
-// TODO(https://crbug.com/1164001): remove after the migration is finished.
-namespace ash {
-using ::chromeos::TestCellularESimProfileHandler;
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos {
+using ::ash::TestCellularESimProfileHandler;
 }
 
 #endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_TEST_CELLULAR_ESIM_PROFILE_HANDLER_H_
diff --git a/chromeos/ash/services/assistant/audio_decoder/assistant_audio_decoder.cc b/chromeos/ash/services/assistant/audio_decoder/assistant_audio_decoder.cc
index da2ce071c..c3ba0d8 100644
--- a/chromeos/ash/services/assistant/audio_decoder/assistant_audio_decoder.cc
+++ b/chromeos/ash/services/assistant/audio_decoder/assistant_audio_decoder.cc
@@ -15,8 +15,7 @@
 #include "media/filters/audio_file_reader.h"
 #include "media/filters/blocking_url_protocol.h"
 
-namespace chromeos {
-namespace assistant {
+namespace ash::assistant {
 
 namespace {
 
@@ -162,5 +161,4 @@
     std::move(close_callback_).Run();
 }
 
-}  // namespace assistant
-}  // namespace chromeos
+}  // namespace ash::assistant
diff --git a/chromeos/ash/services/assistant/audio_decoder/assistant_audio_decoder.h b/chromeos/ash/services/assistant/audio_decoder/assistant_audio_decoder.h
index b68522a..a3581feb 100644
--- a/chromeos/ash/services/assistant/audio_decoder/assistant_audio_decoder.h
+++ b/chromeos/ash/services/assistant/audio_decoder/assistant_audio_decoder.h
@@ -20,8 +20,7 @@
 class DataSource;
 }  // namespace media
 
-namespace chromeos {
-namespace assistant {
+namespace ash::assistant {
 
 class AssistantAudioDecoder : public mojom::AssistantAudioDecoder {
  public:
@@ -79,7 +78,11 @@
   base::WeakPtrFactory<AssistantAudioDecoder> weak_factory_;
 };
 
-}  // namespace assistant
-}  // namespace chromeos
+}  // namespace ash::assistant
+
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos::assistant {
+using ::ash::assistant::AssistantAudioDecoder;
+}
 
 #endif  // CHROMEOS_ASH_SERVICES_ASSISTANT_AUDIO_DECODER_ASSISTANT_AUDIO_DECODER_H_
diff --git a/chromeos/ash/services/assistant/audio_decoder/assistant_audio_decoder_factory.cc b/chromeos/ash/services/assistant/audio_decoder/assistant_audio_decoder_factory.cc
index aba49f10..05303f2 100644
--- a/chromeos/ash/services/assistant/audio_decoder/assistant_audio_decoder_factory.cc
+++ b/chromeos/ash/services/assistant/audio_decoder/assistant_audio_decoder_factory.cc
@@ -7,8 +7,7 @@
 #include "chromeos/ash/services/assistant/audio_decoder/assistant_audio_decoder.h"
 #include "mojo/public/cpp/bindings/self_owned_receiver.h"
 
-namespace chromeos {
-namespace assistant {
+namespace ash::assistant {
 
 AssistantAudioDecoderFactory::AssistantAudioDecoderFactory(
     mojo::PendingReceiver<mojom::AssistantAudioDecoderFactory> receiver)
@@ -25,5 +24,4 @@
                               std::move(receiver));
 }
 
-}  // namespace assistant
-}  // namespace chromeos
+}  // namespace ash::assistant
diff --git a/chromeos/ash/services/assistant/audio_decoder/assistant_audio_decoder_factory.h b/chromeos/ash/services/assistant/audio_decoder/assistant_audio_decoder_factory.h
index cf65ed3..e9bb195 100644
--- a/chromeos/ash/services/assistant/audio_decoder/assistant_audio_decoder_factory.h
+++ b/chromeos/ash/services/assistant/audio_decoder/assistant_audio_decoder_factory.h
@@ -10,8 +10,7 @@
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 
-namespace chromeos {
-namespace assistant {
+namespace ash::assistant {
 
 class AssistantAudioDecoderFactory
     : public mojom::AssistantAudioDecoderFactory {
@@ -36,7 +35,11 @@
   mojo::Receiver<mojom::AssistantAudioDecoderFactory> receiver_;
 };
 
-}  // namespace assistant
-}  // namespace chromeos
+}  // namespace ash::assistant
+
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos::assistant {
+using ::ash::assistant::AssistantAudioDecoderFactory;
+}
 
 #endif  // CHROMEOS_ASH_SERVICES_ASSISTANT_AUDIO_DECODER_ASSISTANT_AUDIO_DECODER_FACTORY_H_
diff --git a/chromeos/ash/services/assistant/audio_decoder/ipc_data_source.cc b/chromeos/ash/services/assistant/audio_decoder/ipc_data_source.cc
index 6a7ccb2..1760d63 100644
--- a/chromeos/ash/services/assistant/audio_decoder/ipc_data_source.cc
+++ b/chromeos/ash/services/assistant/audio_decoder/ipc_data_source.cc
@@ -12,8 +12,7 @@
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "mojo/public/cpp/bindings/message.h"
 
-namespace chromeos {
-namespace assistant {
+namespace ash::assistant {
 
 IPCDataSource::IPCDataSource(
     mojo::PendingRemote<mojom::AssistantMediaDataSource> media_data_source)
@@ -87,5 +86,4 @@
   std::move(callback).Run(data.size());
 }
 
-}  // namespace assistant
-}  // namespace chromeos
+}  // namespace ash::assistant
diff --git a/chromeos/ash/services/assistant/audio_decoder/ipc_data_source.h b/chromeos/ash/services/assistant/audio_decoder/ipc_data_source.h
index cf25087..9a6d6f48 100644
--- a/chromeos/ash/services/assistant/audio_decoder/ipc_data_source.h
+++ b/chromeos/ash/services/assistant/audio_decoder/ipc_data_source.h
@@ -13,8 +13,7 @@
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/remote.h"
 
-namespace chromeos {
-namespace assistant {
+namespace ash::assistant {
 
 // Provides data source to the audio stream decoder. Class must be created and
 // destroyed on a same thread. The thread must not be blocked for read
@@ -60,7 +59,11 @@
   THREAD_CHECKER(data_source_thread_checker_);
 };
 
-}  // namespace assistant
-}  // namespace chromeos
+}  // namespace ash::assistant
+
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos::assistant {
+using ::ash::assistant::IPCDataSource;
+}
 
 #endif  // CHROMEOS_ASH_SERVICES_ASSISTANT_AUDIO_DECODER_IPC_DATA_SOURCE_H_
diff --git a/chromeos/ash/services/assistant/platform/platform_delegate_impl.cc b/chromeos/ash/services/assistant/platform/platform_delegate_impl.cc
index cd83173..d4e5973 100644
--- a/chromeos/ash/services/assistant/platform/platform_delegate_impl.cc
+++ b/chromeos/ash/services/assistant/platform/platform_delegate_impl.cc
@@ -23,8 +23,8 @@
 }
 
 void PlatformDelegateImpl::BindAudioDecoderFactory(
-    mojo::PendingReceiver<
-        chromeos::assistant::mojom::AssistantAudioDecoderFactory> receiver) {
+    mojo::PendingReceiver<ash::assistant::mojom::AssistantAudioDecoderFactory>
+        receiver) {
   AssistantBrowserDelegate::Get()->RequestAudioDecoderFactory(
       std::move(receiver));
 }
diff --git a/chromeos/ash/services/assistant/platform/platform_delegate_impl.h b/chromeos/ash/services/assistant/platform/platform_delegate_impl.h
index 752fdd6..5ae49c49 100644
--- a/chromeos/ash/services/assistant/platform/platform_delegate_impl.h
+++ b/chromeos/ash/services/assistant/platform/platform_delegate_impl.h
@@ -27,9 +27,8 @@
       mojo::PendingReceiver<media::mojom::AudioStreamFactory> receiver)
       override;
   void BindAudioDecoderFactory(
-      mojo::PendingReceiver<
-          chromeos::assistant::mojom::AssistantAudioDecoderFactory> receiver)
-      override;
+      mojo::PendingReceiver<ash::assistant::mojom::AssistantAudioDecoderFactory>
+          receiver) override;
   void BindBatteryMonitor(
       mojo::PendingReceiver<::device::mojom::BatteryMonitor> receiver) override;
   void BindNetworkConfig(
diff --git a/chromeos/ash/services/assistant/public/cpp/assistant_browser_delegate.h b/chromeos/ash/services/assistant/public/cpp/assistant_browser_delegate.h
index cdf43f8dc..5a106aa 100644
--- a/chromeos/ash/services/assistant/public/cpp/assistant_browser_delegate.h
+++ b/chromeos/ash/services/assistant/public/cpp/assistant_browser_delegate.h
@@ -61,7 +61,8 @@
   // Requests an audio decoder interface from the Assistant Audio Decoder
   // service, via the browser.
   virtual void RequestAudioDecoderFactory(
-      mojo::PendingReceiver<mojom::AssistantAudioDecoderFactory> receiver) = 0;
+      mojo::PendingReceiver<ash::assistant::mojom::AssistantAudioDecoderFactory>
+          receiver) = 0;
 
   // Requests a connection to the Media Session service's AudioFocusManager from
   // the browser.
diff --git a/chromeos/ash/services/assistant/public/mojom/assistant_audio_decoder.mojom b/chromeos/ash/services/assistant/public/mojom/assistant_audio_decoder.mojom
index a72ac76..5fb061aa 100644
--- a/chromeos/ash/services/assistant/public/mojom/assistant_audio_decoder.mojom
+++ b/chromeos/ash/services/assistant/public/mojom/assistant_audio_decoder.mojom
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-module chromeos.assistant.mojom;
+module ash.assistant.mojom;
 
 import "sandbox/policy/mojom/sandbox.mojom";
 
diff --git a/chromeos/ash/services/assistant/test_support/scoped_assistant_browser_delegate.h b/chromeos/ash/services/assistant/test_support/scoped_assistant_browser_delegate.h
index d207e489..3a2985f 100644
--- a/chromeos/ash/services/assistant/test_support/scoped_assistant_browser_delegate.h
+++ b/chromeos/ash/services/assistant/test_support/scoped_assistant_browser_delegate.h
@@ -43,8 +43,8 @@
       mojo::PendingReceiver<media::mojom::AudioStreamFactory> receiver)
       override {}
   void RequestAudioDecoderFactory(
-      mojo::PendingReceiver<mojom::AssistantAudioDecoderFactory> receiver)
-      override {}
+      mojo::PendingReceiver<ash::assistant::mojom::AssistantAudioDecoderFactory>
+          receiver) override {}
   void RequestAudioFocusManager(
       mojo::PendingReceiver<media_session::mojom::AudioFocusManager> receiver)
       override {}
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd
index 465a6c2..84653c9 100644
--- a/chromeos/chromeos_strings.grd
+++ b/chromeos/chromeos_strings.grd
@@ -2760,6 +2760,9 @@
       <message name="IDS_SHIMLESS_RMA_TRY_AGAIN_BUTTON" desc="Default text for Try Again button used to retry an action.">
         Try again
       </message>
+      <message name="IDS_SHIMLESS_RMA_DONE_BUTTON" desc="Default text for Done button when action is completed for closing a dialog.">
+        Done
+      </message>
       <!-- Exit dialog -->
       <message name="IDS_SHIMLESS_RMA_EXIT_DIALOG_TITLE" translateable="false" desc="Title for the exit dialog.">
         Exit repair?
@@ -3010,6 +3013,9 @@
       <message name="IDS_SHIMLESS_RMA_REPAIR_COMPLETED_BATTERY_CUTOFF_SHUTDOWN_BUTTON" desc="Label for the button in the battery cutoff countdown dialog that shuts down the device and cuts off the battery immediately">
         Shut down
       </message>
+      <message name="IDS_SHIMLESS_RMA_LOGS_SAVE_SUCCESS" desc="The text telling the user that saving the logs to a external USB was successful and showing them the saved file location.">
+        Saved to "<ph name="FILE_LOCATION">$1<ex>/USB/Home/MyFiles</ex></ph>"
+      </message>
       <!-- Powerwash dialog -->
       <message name="IDS_SHIMLESS_RMA_POWERWASH_DIALOG_TITLE" desc="Title for the powerwash dialog displayed on the repair complete page and on the restock page">
         Powerwash (factory reset) required
diff --git a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_DONE_BUTTON.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_DONE_BUTTON.png.sha1
new file mode 100644
index 0000000..c2367c5
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_DONE_BUTTON.png.sha1
@@ -0,0 +1 @@
+c25d4a76d821e5a51dde9a48d87cdba3401aa38a
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_LOGS_SAVE_SUCCESS.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_LOGS_SAVE_SUCCESS.png.sha1
new file mode 100644
index 0000000..ab25977
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_LOGS_SAVE_SUCCESS.png.sha1
@@ -0,0 +1 @@
+9dca3f6c42947272684d3ee296bfb193247f28de
\ No newline at end of file
diff --git a/chromeos/components/string_matching/fuzzy_tokenized_string_match_unittest.cc b/chromeos/components/string_matching/fuzzy_tokenized_string_match_unittest.cc
index ddffb2f..5de0d79 100644
--- a/chromeos/components/string_matching/fuzzy_tokenized_string_match_unittest.cc
+++ b/chromeos/components/string_matching/fuzzy_tokenized_string_match_unittest.cc
@@ -16,7 +16,9 @@
 
 namespace {
 
-constexpr float kEps = 1e-5f;
+constexpr double kEps = 1e-5;
+constexpr double kCompleteMatchScore = 1.0;
+constexpr double kCompleteMismatchScore = 0.0;
 
 // Default parameters.
 constexpr bool kUseWeightedRatio = false;
@@ -188,6 +190,234 @@
   // behavior is implemented.
 }
 
+TEST_F(FuzzyTokenizedStringMatchTest, BenchmarkCompleteMatchSingleToken) {
+  // A complete match between text and query should always score very well. Test
+  // score calculations for pairs of identical strings, for various lengths of
+  // string.
+  std::u16string full_string = u"abcdefgh";
+
+  for (size_t i = 1; i < full_string.size(); ++i) {
+    // N.B. The created `substring` is compared to itself, not to `full_string`.
+    std::u16string substring = full_string.substr(0, i);
+    const double relevance = CalculateRelevance(substring, substring);
+    VLOG(1) << FormatRelevanceResult(substring, substring, relevance,
+                                     /*query_first*/ false);
+    EXPECT_NEAR(relevance, kCompleteMatchScore, kEps);
+  }
+}
+
+TEST_F(FuzzyTokenizedStringMatchTest, BenchmarkCompleteMatchMultiToken) {
+  // A complete match between text and query should always score very well. Test
+  // score calculations for pairs of identical strings, for various lengths of
+  // string.
+  std::u16string full_string = u"ab cdefgh ijk";
+
+  for (size_t i = 1; i < full_string.size(); ++i) {
+    // N.B. The created `substring` is compared to itself, not to `full_string`.
+    std::u16string substring = full_string.substr(0, i);
+    const double relevance = CalculateRelevance(substring, substring);
+    VLOG(1) << FormatRelevanceResult(substring, substring, relevance,
+                                     /*query_first*/ false);
+    EXPECT_NEAR(relevance, kCompleteMatchScore, kEps);
+  }
+}
+
+TEST_F(FuzzyTokenizedStringMatchTest, BenchmarkCompleteNonMatchSingleToken) {
+  std::u16string full_text = u"abcdefgh";
+  std::u16string full_query = u"stuvwxyz";
+  ASSERT_EQ(full_text.size(), full_query.size());
+
+  for (size_t i = 1; i < full_text.size(); ++i) {
+    std::u16string text = full_text.substr(0, i);
+    std::u16string query = full_query.substr(0, i);
+    const double relevance = CalculateRelevance(query, text);
+    VLOG(1) << FormatRelevanceResult(query, text, relevance,
+                                     /*query_first*/ false);
+    EXPECT_NEAR(relevance, kCompleteMismatchScore, kEps);
+  }
+}
+
+TEST_F(FuzzyTokenizedStringMatchTest, BenchmarkCompleteNonMatchMultiToken) {
+  std::u16string full_text = u"ab cdefgh ijk";
+  std::u16string full_query = u"pqrstu vw xyz";
+  ASSERT_EQ(full_text.size(), full_query.size());
+
+  for (size_t i = 1; i < full_text.size(); ++i) {
+    std::u16string text = full_text.substr(0, i);
+    std::u16string query = full_query.substr(0, i);
+    const double relevance = CalculateRelevance(query, text);
+    VLOG(1) << FormatRelevanceResult(query, text, relevance,
+                                     /*query_first*/ false);
+    // TODO(crbug.com/1336160): Expect score is zero. Currently, the
+    // presence of whitespace in both text and query causes
+    // inappropriately high relevance scoring.
+  }
+}
+
+TEST_F(FuzzyTokenizedStringMatchTest,
+       BenchmarkVariedLengthUnmatchedTextSingleToken) {
+  std::u16string full_text = u"abcdefghijklmnop";
+  const size_t shortest_text_length = 6;
+  const size_t longest_text_length = full_text.size();
+
+  std::vector<std::u16string> queries = {u"abc", u"bcd", u"cde", u"def"};
+
+  for (const auto& query : queries) {
+    // For a fixed query, where the query is a full match to some portion of the
+    // text, the relevance score should not be influenced by the
+    // amounts of any remaining unmatched portions of text ("text-length
+    // agnosticism").
+    for (size_t i = shortest_text_length; i < longest_text_length; ++i) {
+      std::u16string text = full_text.substr(0, i);
+      const double relevance = CalculateRelevance(query, text);
+      VLOG(1) << FormatRelevanceResult(query, text, relevance,
+                                       /*query_first*/ true);
+    }
+    // TODO(crbug.com/1336160): Enforce/check text-length agnosticism.
+  }
+}
+
+TEST_F(FuzzyTokenizedStringMatchTest,
+       BenchmarkVariedLengthUnmatchedTextMultiToken) {
+  std::vector<std::u16string> texts = {u"ab cdefgh", u"ab cdefgh ijk",
+                                       u"ab cdefgh ijk lmno",
+                                       u"ab cdefgh ijk lmno pqrst"};
+
+  std::vector<std::u16string> queries = {
+      u"ab c",  // strict prefix of text
+      u"cdef",  // token prefix of text
+      u"defg",  // token in-fix of text
+      u"efgh"   // token suffix of text
+  };
+
+  for (const auto& query : queries) {
+    // For a fixed query, where the query is a full match to some portion of the
+    // text, the relevance score should not be influenced by the
+    // amounts of any remaining unmatched portions of text ("text-length
+    // agnosticism").
+    for (const auto& text : texts) {
+      const double relevance = CalculateRelevance(query, text);
+      VLOG(1) << FormatRelevanceResult(query, text, relevance,
+                                       /*query_first*/ true);
+    }
+    // TODO(crbug.com/1336160): Enforce/check text-length agnosticism.
+  }
+}
+
+TEST_F(FuzzyTokenizedStringMatchTest,
+       BenchmarkVariedLengthUnmatchedQuerySingleToken) {
+  // This test contains the same strings as
+  // BenchmarkVariedLengthUnmatchedTextSingleToken, with the
+  // roles of text and query swapped.
+  std::vector<std::u16string> texts = {u"abc", u"bcd", u"cde", u"def"};
+
+  std::u16string full_query = u"abcdefghijklmnop";
+  const size_t shortest_query_length = 6;
+  const size_t longest_query_length = full_query.size();
+
+  for (const auto& text : texts) {
+    // Compare a fixed text against a number of queries of differing length,
+    // where the query is a substring of the text but the query has leftover
+    // unmatched characters.
+    for (size_t i = shortest_query_length; i < longest_query_length; ++i) {
+      std::u16string query = full_query.substr(0, i);
+      const double relevance = CalculateRelevance(query, text);
+      VLOG(1) << FormatRelevanceResult(query, text, relevance,
+                                       /*query_first*/ false);
+    }
+    // TODO(crbug.com/1336160): Decide on how to handle unmatched portions of
+    // query.
+  }
+}
+
+TEST_F(FuzzyTokenizedStringMatchTest,
+       BenchmarkVariedLengthUnmatchedQueryMultiToken) {
+  // This test contains the same strings as
+  // BenchmarkVariedLengthUnmatchedTextMultiToken, with the
+  // roles of text and query swapped.
+  std::vector<std::u16string> texts = {
+      u"ab c",  // strict prefix of query
+      u"cdef",  // token prefix of query
+      u"defg",  // token in-fix of query
+      u"efgh"   // token suffix of query
+  };
+
+  std::vector<std::u16string> queries = {u"ab cdefgh", u"ab cdefgh ijk",
+                                         u"ab cdefgh ijk lmno",
+                                         u"ab cdefgh ijk lmno pqrst"};
+
+  for (const auto& text : texts) {
+    // Compare a fixed text against a number of queries of differing length,
+    // where the query is a substring of the text but the query has leftover
+    // unmathced characters.
+    for (const auto& query : queries) {
+      const double relevance = CalculateRelevance(query, text);
+      VLOG(1) << FormatRelevanceResult(query, text, relevance,
+                                       /*query_first*/ false);
+    }
+    // TODO(crbug.com/1336160): Decide on how to handle unmatched portions of
+    // query.
+  }
+}
+
+TEST_F(FuzzyTokenizedStringMatchTest, BenchmarkPartialMatchPartialMismatch) {
+  std::u16string text = u"abcdef";
+
+  std::u16string query_full = u"abcdef";
+  std::u16string query_prefix = u"abc";
+
+  std::u16string query_suffix_mismatch = u"abcxyz";
+  std::u16string query_prefix_mismatch = u"xyzdef";
+
+  std::u16string query_suffix_is_text_prefix = u"xyzabc";
+  std::u16string query_prefix_is_text_suffix = u"defxyz";
+
+  const double relevance_query_full = CalculateRelevance(query_full, text);
+  VLOG(1) << FormatRelevanceResult(query_full, text, relevance_query_full,
+                                   /*query_first*/ false);
+
+  const double relevance_query_prefix = CalculateRelevance(query_prefix, text);
+  VLOG(1) << FormatRelevanceResult(query_prefix, text, relevance_query_prefix,
+                                   /*query_first*/ false);
+
+  const double relevance_query_suffix_mismatch =
+      CalculateRelevance(query_suffix_mismatch, text);
+  VLOG(1) << FormatRelevanceResult(query_suffix_mismatch, text,
+                                   relevance_query_suffix_mismatch,
+                                   /*query_first*/ false);
+
+  const double relevance_query_prefix_mismatch =
+      CalculateRelevance(query_prefix_mismatch, text);
+  VLOG(1) << FormatRelevanceResult(query_prefix_mismatch, text,
+                                   relevance_query_prefix_mismatch,
+                                   /*query_first*/ false);
+
+  const double relevance_query_suffix_is_text_prefix =
+      CalculateRelevance(query_suffix_is_text_prefix, text);
+  VLOG(1) << FormatRelevanceResult(query_suffix_is_text_prefix, text,
+                                   relevance_query_suffix_is_text_prefix,
+                                   /*query_first*/ false);
+
+  const double relevance_query_prefix_is_text_suffix =
+      CalculateRelevance(query_prefix_is_text_suffix, text);
+  VLOG(1) << FormatRelevanceResult(query_prefix_is_text_suffix, text,
+                                   relevance_query_prefix_is_text_suffix,
+                                   /*query_first*/ false);
+
+  CHECK_GT(relevance_query_full, relevance_query_prefix);
+
+  CHECK_GT(relevance_query_prefix, relevance_query_suffix_mismatch);
+  CHECK_GT(relevance_query_prefix, relevance_query_prefix_mismatch);
+  CHECK_GT(relevance_query_prefix, relevance_query_suffix_is_text_prefix);
+  CHECK_GT(relevance_query_prefix, relevance_query_prefix_is_text_suffix);
+
+  // TODO(crbug.com/1336160): Consider the following if/when supported:
+  //
+  // CHECK_GT(relevance_query_suffix_mismatch,
+  // relevance_query_prefix_mismatch);
+  // CHECK_GT(relevance_query_suffix_mismatch, query_suffix_is_text_prefix);
+}
+
 /**********************************************************************
  * Benchmarking section 2 - Non-abstract test cases                   *
  **********************************************************************/
diff --git a/chromeos/components/sync_wifi/network_test_helper.h b/chromeos/components/sync_wifi/network_test_helper.h
index 8c9427f4..e1233555f 100644
--- a/chromeos/components/sync_wifi/network_test_helper.h
+++ b/chromeos/components/sync_wifi/network_test_helper.h
@@ -9,6 +9,8 @@
 #include "chromeos/ash/components/network/network_configuration_handler.h"
 #include "chromeos/ash/components/network/network_connection_handler.h"
 #include "chromeos/ash/components/network/network_device_handler.h"
+// TODO(https://crbug.com/1164001): move to forward declaration
+#include "chromeos/ash/components/network/network_handler_test_helper.h"
 #include "chromeos/ash/components/network/network_profile_handler.h"
 #include "chromeos/ash/components/network/network_state_handler.h"
 #include "chromeos/ash/components/network/network_state_test_helper.h"
@@ -24,8 +26,6 @@
 
 namespace chromeos {
 
-class NetworkHandlerTestHelper;
-
 namespace sync_wifi {
 
 // Helper for tests which need to have fake network classes configured.
diff --git a/chromeos/dbus/shill/shill_clients.h b/chromeos/dbus/shill/shill_clients.h
index 66a68d7..26c8f43 100644
--- a/chromeos/dbus/shill/shill_clients.h
+++ b/chromeos/dbus/shill/shill_clients.h
@@ -29,6 +29,7 @@
 // TODO(https://crbug.com/1164001): remove after the migration is finished.
 namespace ash::shill_clients {
 using ::chromeos::shill_clients::InitializeFakes;
-}
+using ::chromeos::shill_clients::Shutdown;
+}  // namespace ash::shill_clients
 
 #endif  // CHROMEOS_DBUS_SHILL_SHILL_CLIENTS_H_
diff --git a/chromeos/dbus/shill/shill_ipconfig_client.h b/chromeos/dbus/shill/shill_ipconfig_client.h
index badabc40..9dd070e 100644
--- a/chromeos/dbus/shill/shill_ipconfig_client.h
+++ b/chromeos/dbus/shill/shill_ipconfig_client.h
@@ -105,4 +105,9 @@
 
 }  // namespace chromeos
 
+// TODO(https://crbug.com/1164001): remove when it moved to ash.
+namespace ash {
+using ::chromeos::ShillIPConfigClient;
+}
+
 #endif  // CHROMEOS_DBUS_SHILL_SHILL_IPCONFIG_CLIENT_H_
diff --git a/chromeos/services/libassistant/audio/audio_media_data_source.h b/chromeos/services/libassistant/audio/audio_media_data_source.h
index 28942869..90bed174 100644
--- a/chromeos/services/libassistant/audio/audio_media_data_source.h
+++ b/chromeos/services/libassistant/audio/audio_media_data_source.h
@@ -20,18 +20,18 @@
 // Class to provide media data source for audio stream decoder.
 // Internally it will read media data from |delegate_|.
 class AudioMediaDataSource
-    : public chromeos::assistant::mojom::AssistantMediaDataSource {
+    : public ash::assistant::mojom::AssistantMediaDataSource {
  public:
   explicit AudioMediaDataSource(
-      mojo::PendingReceiver<
-          chromeos::assistant::mojom::AssistantMediaDataSource> receiver);
+      mojo::PendingReceiver<ash::assistant::mojom::AssistantMediaDataSource>
+          receiver);
 
   AudioMediaDataSource(const AudioMediaDataSource&) = delete;
   AudioMediaDataSource& operator=(const AudioMediaDataSource&) = delete;
 
   ~AudioMediaDataSource() override;
 
-  // chromeos::assistant::mojom::MediaDataSource implementation.
+  // ash::assistant::mojom::MediaDataSource implementation.
   // Must be called after |set_delegate()|.
   // The caller must wait for callback to finish before issuing the next read.
   void Read(uint32_t size, ReadCallback callback) override;
diff --git a/chromeos/services/libassistant/audio/audio_output_provider_impl.cc b/chromeos/services/libassistant/audio/audio_output_provider_impl.cc
index 711b2f19..b1b517b 100644
--- a/chromeos/services/libassistant/audio/audio_output_provider_impl.cc
+++ b/chromeos/services/libassistant/audio/audio_output_provider_impl.cc
@@ -176,8 +176,8 @@
         audio_decoder_factory_.BindNewPipeAndPassReceiver());
   }
 
-  chromeos::assistant::mojom::AssistantAudioDecoderFactory*
-  GetAudioDecoderFactory() override {
+  ash::assistant::mojom::AssistantAudioDecoderFactory* GetAudioDecoderFactory()
+      override {
     return audio_decoder_factory_.get();
   }
 
@@ -195,7 +195,7 @@
   }
 
  private:
-  mojo::Remote<chromeos::assistant::mojom::AssistantAudioDecoderFactory>
+  mojo::Remote<ash::assistant::mojom::AssistantAudioDecoderFactory>
       audio_decoder_factory_;
 
   SEQUENCE_CHECKER(main_sequence_checker_);
diff --git a/chromeos/services/libassistant/audio/audio_output_provider_impl.h b/chromeos/services/libassistant/audio/audio_output_provider_impl.h
index 97a3f170..853efe4 100644
--- a/chromeos/services/libassistant/audio/audio_output_provider_impl.h
+++ b/chromeos/services/libassistant/audio/audio_output_provider_impl.h
@@ -43,7 +43,7 @@
   class AudioDecoderFactoryManager
       : public base::RefCounted<AudioDecoderFactoryManager> {
    public:
-    virtual chromeos::assistant::mojom::AssistantAudioDecoderFactory*
+    virtual ash::assistant::mojom::AssistantAudioDecoderFactory*
     GetAudioDecoderFactory() = 0;
 
     AudioDecoderFactoryManager() = default;
diff --git a/chromeos/services/libassistant/audio/audio_output_provider_impl_unittest.cc b/chromeos/services/libassistant/audio/audio_output_provider_impl_unittest.cc
index 1e999e85..f30da0e 100644
--- a/chromeos/services/libassistant/audio/audio_output_provider_impl_unittest.cc
+++ b/chromeos/services/libassistant/audio/audio_output_provider_impl_unittest.cc
@@ -25,11 +25,11 @@
 namespace chromeos {
 namespace libassistant {
 namespace {
+using ::ash::assistant::mojom::AssistantAudioDecoderFactory;
 using ::assistant_client::OutputStreamMetadata;
 using ::base::test::ScopedFeatureList;
 using ::base::test::SingleThreadTaskEnvironment;
 using ::chromeos::assistant::FakePlatformDelegate;
-using ::chromeos::assistant::mojom::AssistantAudioDecoderFactory;
 
 constexpr char kFakeDeviceId[] = "device_id";
 }  // namespace
@@ -122,13 +122,12 @@
   FakeAssistantAudioDecoderFactory() = default;
 
   void CreateAssistantAudioDecoder(
-      ::mojo::PendingReceiver<
-          ::chromeos::assistant::mojom::AssistantAudioDecoder> audio_decoder,
+      ::mojo::PendingReceiver<::ash::assistant::mojom::AssistantAudioDecoder>
+          audio_decoder,
       ::mojo::PendingRemote<
-          ::chromeos::assistant::mojom::AssistantAudioDecoderClient> client,
-      ::mojo::PendingRemote<
-          ::chromeos::assistant::mojom::AssistantMediaDataSource> data_source)
-      override {}
+          ::ash::assistant::mojom::AssistantAudioDecoderClient> client,
+      ::mojo::PendingRemote<::ash::assistant::mojom::AssistantMediaDataSource>
+          data_source) override {}
 };
 
 class AssistantAudioDeviceOwnerTest : public testing::Test {
diff --git a/chromeos/services/libassistant/audio/audio_stream_handler.cc b/chromeos/services/libassistant/audio/audio_stream_handler.cc
index 0b31ee3c..fa790052 100644
--- a/chromeos/services/libassistant/audio/audio_stream_handler.cc
+++ b/chromeos/services/libassistant/audio/audio_stream_handler.cc
@@ -21,8 +21,7 @@
 }
 
 void AudioStreamHandler::StartAudioDecoder(
-    chromeos::assistant::mojom::AssistantAudioDecoderFactory*
-        audio_decoder_factory,
+    ash::assistant::mojom::AssistantAudioDecoderFactory* audio_decoder_factory,
     assistant_client::AudioOutput::Delegate* delegate,
     InitCB on_inited) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -30,7 +29,7 @@
   mojo::PendingRemote<AssistantAudioDecoderClient> client;
   client_receiver_.Bind(client.InitWithNewPipeAndPassReceiver());
 
-  mojo::PendingRemote<chromeos::assistant::mojom::AssistantMediaDataSource>
+  mojo::PendingRemote<ash::assistant::mojom::AssistantMediaDataSource>
       data_source;
   media_data_source_ = std::make_unique<AudioMediaDataSource>(
       data_source.InitWithNewPipeAndPassReceiver());
diff --git a/chromeos/services/libassistant/audio/audio_stream_handler.h b/chromeos/services/libassistant/audio/audio_stream_handler.h
index 43773cf..3a489e5 100644
--- a/chromeos/services/libassistant/audio/audio_stream_handler.h
+++ b/chromeos/services/libassistant/audio/audio_stream_handler.h
@@ -18,7 +18,7 @@
 class AudioMediaDataSource;
 
 class AudioStreamHandler
-    : public chromeos::assistant::mojom::AssistantAudioDecoderClient,
+    : public ash::assistant::mojom::AssistantAudioDecoderClient,
       public assistant_client::AudioOutput::Delegate {
  public:
   using InitCB =
@@ -31,13 +31,12 @@
 
   ~AudioStreamHandler() override;
 
-  void StartAudioDecoder(
-      chromeos::assistant::mojom::AssistantAudioDecoderFactory*
-          audio_decoder_factory,
-      assistant_client::AudioOutput::Delegate* delegate,
-      InitCB start_device_owner_on_main_thread);
+  void StartAudioDecoder(ash::assistant::mojom::AssistantAudioDecoderFactory*
+                             audio_decoder_factory,
+                         assistant_client::AudioOutput::Delegate* delegate,
+                         InitCB start_device_owner_on_main_thread);
 
-  // chromeos::assistant::mojom::AssistantAudioDecoderClient overrides:
+  // ash::assistant::mojom::AssistantAudioDecoderClient overrides:
   void OnNewBuffers(const std::vector<std::vector<uint8_t>>& buffers) override;
 
   // assistant_client::AudioOutput::Delegate overrides:
@@ -73,8 +72,7 @@
 
   mojo::Receiver<AssistantAudioDecoderClient> client_receiver_{this};
   std::unique_ptr<AudioMediaDataSource> media_data_source_;
-  mojo::Remote<chromeos::assistant::mojom::AssistantAudioDecoder>
-      audio_decoder_;
+  mojo::Remote<ash::assistant::mojom::AssistantAudioDecoder> audio_decoder_;
 
   // True when there is more decoded data.
   bool no_more_data_ = false;
diff --git a/chromeos/services/libassistant/public/mojom/platform_delegate.mojom b/chromeos/services/libassistant/public/mojom/platform_delegate.mojom
index 7eaf646..7be57a2 100644
--- a/chromeos/services/libassistant/public/mojom/platform_delegate.mojom
+++ b/chromeos/services/libassistant/public/mojom/platform_delegate.mojom
@@ -21,7 +21,7 @@
   // Requests an audio decoder interface from the Assistant Audio Decoder
   // service, via the browser.
   BindAudioDecoderFactory(
-    pending_receiver<chromeos.assistant.mojom.AssistantAudioDecoderFactory>
+    pending_receiver<ash.assistant.mojom.AssistantAudioDecoderFactory>
       receiver);
 
   // Requests Ash's AssistantVolumeControl interface from the browser.
diff --git a/chromeos/services/libassistant/test_support/fake_platform_delegate.cc b/chromeos/services/libassistant/test_support/fake_platform_delegate.cc
index b2c84fee..5efdd781 100644
--- a/chromeos/services/libassistant/test_support/fake_platform_delegate.cc
+++ b/chromeos/services/libassistant/test_support/fake_platform_delegate.cc
@@ -16,8 +16,8 @@
 }
 
 void FakePlatformDelegate::BindAudioDecoderFactory(
-    mojo::PendingReceiver<
-        ::chromeos::assistant::mojom::AssistantAudioDecoderFactory> receiver) {
+    mojo::PendingReceiver<::ash::assistant::mojom::AssistantAudioDecoderFactory>
+        receiver) {
   audio_decoder_factory_receiver_ = std::move(receiver);
 }
 
diff --git a/chromeos/services/libassistant/test_support/fake_platform_delegate.h b/chromeos/services/libassistant/test_support/fake_platform_delegate.h
index 616fe0e430..60d4dfb7 100644
--- a/chromeos/services/libassistant/test_support/fake_platform_delegate.h
+++ b/chromeos/services/libassistant/test_support/fake_platform_delegate.h
@@ -23,9 +23,8 @@
       mojo::PendingReceiver<::media::mojom::AudioStreamFactory> receiver)
       override;
   void BindAudioDecoderFactory(
-      mojo::PendingReceiver<
-          chromeos::assistant::mojom::AssistantAudioDecoderFactory> receiver)
-      override;
+      mojo::PendingReceiver<ash::assistant::mojom::AssistantAudioDecoderFactory>
+          receiver) override;
   void BindBatteryMonitor(
       mojo::PendingReceiver<::device::mojom::BatteryMonitor> receiver) override;
   void BindNetworkConfig(
@@ -44,8 +43,7 @@
     return std::move(stream_factory_receiver_);
   }
 
-  mojo::PendingReceiver<
-      ::chromeos::assistant::mojom::AssistantAudioDecoderFactory>
+  mojo::PendingReceiver<::ash::assistant::mojom::AssistantAudioDecoderFactory>
   audio_decoder_factory_receiver() {
     return std::move(audio_decoder_factory_receiver_);
   }
@@ -59,8 +57,7 @@
  private:
   mojo::PendingReceiver<::media::mojom::AudioStreamFactory>
       stream_factory_receiver_;
-  mojo::PendingReceiver<
-      ::chromeos::assistant::mojom::AssistantAudioDecoderFactory>
+  mojo::PendingReceiver<::ash::assistant::mojom::AssistantAudioDecoderFactory>
       audio_decoder_factory_receiver_;
   mojo::PendingReceiver<::device::mojom::BatteryMonitor>
       battery_monitor_receiver_;
diff --git a/chromeos/startup/browser_params_proxy.cc b/chromeos/startup/browser_params_proxy.cc
index db3844cb..df6eec7 100644
--- a/chromeos/startup/browser_params_proxy.cc
+++ b/chromeos/startup/browser_params_proxy.cc
@@ -226,7 +226,7 @@
 };
 
 crosapi::mojom::BrowserInitParams::LacrosSelection
-BrowserParamsProxy::lacros_selection() const {
+BrowserParamsProxy::LacrosSelection() const {
   return BrowserInitParams::Get()->lacros_selection;
 };
 
diff --git a/chromeos/startup/browser_params_proxy.h b/chromeos/startup/browser_params_proxy.h
index 97ac0fdd..124a758 100644
--- a/chromeos/startup/browser_params_proxy.h
+++ b/chromeos/startup/browser_params_proxy.h
@@ -114,7 +114,7 @@
 
   bool EnableLacrosTtsSupport() const;
 
-  crosapi::mojom::BrowserInitParams::LacrosSelection lacros_selection() const;
+  crosapi::mojom::BrowserInitParams::LacrosSelection LacrosSelection() const;
 
  private:
   friend base::NoDestructor<BrowserParamsProxy>;
diff --git a/components/autofill/core/browser/autofill_form_test_utils.cc b/components/autofill/core/browser/autofill_form_test_utils.cc
index c58f17d..3acab8e9 100644
--- a/components/autofill/core/browser/autofill_form_test_utils.cc
+++ b/components/autofill/core/browser/autofill_form_test_utils.cc
@@ -115,7 +115,6 @@
     ff.is_autofilled = dd.is_autofilled.value_or(false);
     ff.origin = dd.origin.value_or(f.main_frame_origin);
     ff.should_autocomplete = dd.should_autocomplete;
-    ff.properties_mask = dd.properties_mask;
     f.fields.push_back(ff);
   }
   return f;
diff --git a/components/autofill/core/browser/autofill_form_test_utils.h b/components/autofill/core/browser/autofill_form_test_utils.h
index 498bfdf..8da4714 100644
--- a/components/autofill/core/browser/autofill_form_test_utils.h
+++ b/components/autofill/core/browser/autofill_form_test_utils.h
@@ -47,7 +47,6 @@
   absl::optional<bool> is_autofilled;
   absl::optional<url::Origin> origin;
   std::vector<SelectOption> select_options = {};
-  FieldPropertiesMask properties_mask = 0;
 };
 
 // Attributes provided to the test form.
diff --git a/components/autofill/core/browser/browser_autofill_manager.cc b/components/autofill/core/browser/browser_autofill_manager.cc
index 8d9e0641..1df3392 100644
--- a/components/autofill/core/browser/browser_autofill_manager.cc
+++ b/components/autofill/core/browser/browser_autofill_manager.cc
@@ -695,12 +695,8 @@
       form_for_autocomplete.fields[i].should_autocomplete = false;
     }
 
-    // If the field was edited by the user and there existed an autofillable
-    // value for the field, log whether the value on submission is same as the
-    // autofillable value.
     if (submitted_form->field(i)
-            ->value_not_autofilled_over_existing_value_hash() &&
-        (submitted_form->field(i)->properties_mask & kUserTyped)) {
+            ->value_not_autofilled_over_existing_value_hash()) {
       // Compare and record if the currently filled value is same as the
       // non-empty value that was to be autofilled in the field.
       AutofillMetrics::
@@ -1926,8 +1922,6 @@
     // case.
     if (base::FeatureList::IsEnabled(
             features::kAutofillPreventOverridingPrefilledValues)) {
-      form_structure->field(i)
-          ->set_value_not_autofilled_over_existing_value_hash(absl::nullopt);
       if (form.fields[i].form_control_type != "select-one" &&
           !form.fields[i].value.empty() && !has_override &&
           !FormFieldData::DeepEqual(form.fields[i], field)) {
@@ -1939,16 +1933,18 @@
             optional_cvc ? *optional_cvc : kEmptyCvc, action,
             &unused_failure_to_fill);
         if (action == mojom::RendererFormDataAction::kFill &&
-            !fill_value.empty() && fill_value != form.fields[i].value &&
-            !form_structure->field(i)->value.empty()) {
-          // Save the value that was supposed to be autofilled for this field if
-          // the field contained an initial value.
+            !fill_value.empty() && fill_value != form.fields[i].value) {
+          // Save the value that was supposed to be autofilled for this field.
           form_structure->field(i)
               ->set_value_not_autofilled_over_existing_value_hash(
                   base::FastHash(base::UTF16ToUTF8(fill_value)));
         }
         continue;
       }
+
+      // Clear out the value in case the autofill happens for the field.
+      form_structure->field(i)
+          ->set_value_not_autofilled_over_existing_value_hash(absl::nullopt);
     }
 
     // Do not fill fields that have been edited by the user, except if the field
diff --git a/components/autofill/core/browser/metrics/autofill_metrics.cc b/components/autofill/core/browser/metrics/autofill_metrics.cc
index ef58aa9..a02cffe 100644
--- a/components/autofill/core/browser/metrics/autofill_metrics.cc
+++ b/components/autofill/core/browser/metrics/autofill_metrics.cc
@@ -3598,7 +3598,7 @@
 void AutofillMetrics::
     LogIsValueNotAutofilledOverExistingValueSameAsSubmittedValue(bool is_same) {
   base::UmaHistogramBoolean(
-      "Autofill.IsValueNotAutofilledOverExistingValueSameAsSubmittedValue2",
+      "Autofill.IsValueNotAutofilledOverExistingValueSameAsSubmittedValue",
       is_same);
 }
 
diff --git a/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc b/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc
index d4e0825..0ec29043 100644
--- a/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc
+++ b/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc
@@ -11863,22 +11863,22 @@
 
 // Tests the following 4 cases when |kAutofillPreventOverridingPrefilledValues|
 // is enabled:
-// 1. The field is not autofilled since it has an initial value but the value
+// 1. The field is not autofilled since it has a prefilled value but the value
 //    is edited before the form submission and is same as the value that was
 //    to be autofilled in the field.
-//    |Autofill.IsValueNotAutofilledOverExistingValueSameAsSubmittedValue2|
+//    |Autofill.IsValueNotAutofilledOverExistingValueSameAsSubmittedValue|
 //    should emit true for this case.
-// 2. The field is not autofilled since it has an initial value but the value
+// 2. The field is not autofilled since it has a prefilled value but the value
 //    is edited before the form submission and is different than the value that
 //    was to be autofilled in the field.
-//    |Autofill.IsValueNotAutofilledOverExistingValueSameAsSubmittedValue2|
+//    |Autofill.IsValueNotAutofilledOverExistingValueSameAsSubmittedValue|
 //    should emit false for this case.
-// 3. The field had an initial value that was similar to the value to be
+// 3. The field had a prefilled value that was similar to the value to be
 //    autofilled in the field.
-//    |Autofill.IsValueNotAutofilledOverExistingValueSameAsSubmittedValue2|
+//    |Autofill.IsValueNotAutofilledOverExistingValueSameAsSubmittedValue|
 //    should not record anything in this case.
 // 4. Selection fields are always overridden by Autofill.
-//    |Autofill.IsValueNotAutofilledOverExistingValueSameAsSubmittedValue2|
+//    |Autofill.IsValueNotAutofilledOverExistingValueSameAsSubmittedValue|
 //    should not record anything in this case.
 TEST_F(AutofillMetricsTest,
        IsValueNotAutofilledOverExistingValueSameAsSubmittedValue) {
@@ -11889,23 +11889,20 @@
 
   FormData form = test::GetFormData(
       {.description_for_logging = "AutofilledStateFieldSource",
-       .fields = {
-           {.role = ServerFieldType::NAME_FULL},
-           {.role = ServerFieldType::ADDRESS_HOME_CITY,
-            .value = u"Sacremento",
-            .properties_mask = FieldPropertiesFlags::kUserTyped},  // Case #1
-           {.role = ServerFieldType::ADDRESS_HOME_STATE,
-            .value = u"CA",
-            .form_control_type = "select-one",
-            .select_options = {{u"TN", u"Tennesse"},
-                               {u"CA", u"California"},
-                               {u"WA", u"Washington DC"}}},  // Case #4
-           {.role = ServerFieldType::ADDRESS_HOME_ZIP,
-            .value = u"00000",
-            .properties_mask = FieldPropertiesFlags::kUserTyped},  // Case #2
-           {.role = ServerFieldType::PHONE_HOME_WHOLE_NUMBER,
-            .value = u"12345678901"},  // Case #3
-           {.role = ServerFieldType::ADDRESS_HOME_COUNTRY}}});
+       .fields = {{.role = ServerFieldType::NAME_FULL},
+                  {.role = ServerFieldType::ADDRESS_HOME_CITY,
+                   .value = u"Sacremento"},  // Case #1
+                  {.role = ServerFieldType::ADDRESS_HOME_STATE,
+                   .value = u"CA",
+                   .form_control_type = "select-one",
+                   .select_options = {{u"TN", u"Tennesse"},
+                                      {u"CA", u"California"},
+                                      {u"WA", u"Washington DC"}}},  // Case #4
+                  {.role = ServerFieldType::ADDRESS_HOME_ZIP,
+                   .value = u"00000"},  // Case #2
+                  {.role = ServerFieldType::PHONE_HOME_WHOLE_NUMBER,
+                   .value = u"12345678901"},  // Case #3
+                  {.role = ServerFieldType::ADDRESS_HOME_COUNTRY}}});
 
   std::vector<ServerFieldType> heuristic_types = {
       NAME_FULL,        ADDRESS_HOME_CITY,       ADDRESS_HOME_STATE,
@@ -11915,8 +11912,7 @@
       ADDRESS_HOME_ZIP, PHONE_HOME_WHOLE_NUMBER, ADDRESS_HOME_COUNTRY};
 
   // Simulate having seen this form on page load.
-  autofill_manager().AddSeenForm(form, heuristic_types, server_types,
-                                 /*preserve_values_in_form_structure=*/true);
+  autofill_manager().AddSeenForm(form, heuristic_types, server_types);
 
   autofill_manager().OnAskForValuesToFillTest(form, form.fields[0]);
   autofill_manager().DidShowSuggestions(
@@ -11946,10 +11942,10 @@
                                      SubmissionSource::FORM_SUBMISSION);
 
   histogram_tester.ExpectBucketCount(
-      "Autofill.IsValueNotAutofilledOverExistingValueSameAsSubmittedValue2",
+      "Autofill.IsValueNotAutofilledOverExistingValueSameAsSubmittedValue",
       true, 1);
   histogram_tester.ExpectBucketCount(
-      "Autofill.IsValueNotAutofilledOverExistingValueSameAsSubmittedValue2",
+      "Autofill.IsValueNotAutofilledOverExistingValueSameAsSubmittedValue",
       false, 1);
 }
 
diff --git a/components/autofill/core/browser/test_browser_autofill_manager.cc b/components/autofill/core/browser/test_browser_autofill_manager.cc
index da912c1..92cf2871 100644
--- a/components/autofill/core/browser/test_browser_autofill_manager.cc
+++ b/components/autofill/core/browser/test_browser_autofill_manager.cc
@@ -107,8 +107,7 @@
 void TestBrowserAutofillManager::AddSeenForm(
     const FormData& form,
     const std::vector<ServerFieldType>& heuristic_types,
-    const std::vector<ServerFieldType>& server_types,
-    bool preserve_values_in_form_structure) {
+    const std::vector<ServerFieldType>& server_types) {
   std::vector<std::vector<std::pair<PatternSource, ServerFieldType>>>
       all_heuristic_types;
 
@@ -119,24 +118,21 @@
         return {{GetActivePatternSource(), type}};
       });
 
-  AddSeenForm(form, all_heuristic_types, server_types,
-              preserve_values_in_form_structure);
+  AddSeenForm(form, all_heuristic_types, server_types);
 }
 
 void TestBrowserAutofillManager::AddSeenForm(
     const FormData& form,
     const std::vector<std::vector<std::pair<PatternSource, ServerFieldType>>>&
         heuristic_types,
-    const std::vector<ServerFieldType>& server_types,
-    bool preserve_values_in_form_structure) {
-  FormData form_with_empty_fields = form;
-  for (auto& field : form_with_empty_fields.fields) {
+    const std::vector<ServerFieldType>& server_types) {
+  FormData empty_form = form;
+  for (auto& field : empty_form.fields) {
     field.value = std::u16string();
   }
 
   std::unique_ptr<TestFormStructure> form_structure =
-      std::make_unique<TestFormStructure>(
-          preserve_values_in_form_structure ? form : form_with_empty_fields);
+      std::make_unique<TestFormStructure>(empty_form);
   form_structure->SetFieldTypes(heuristic_types, server_types);
   form_structure->identify_sections_for_testing();
   AddSeenFormStructure(std::move(form_structure));
diff --git a/components/autofill/core/browser/test_browser_autofill_manager.h b/components/autofill/core/browser/test_browser_autofill_manager.h
index d9078bf..422bf0e 100644
--- a/components/autofill/core/browser/test_browser_autofill_manager.h
+++ b/components/autofill/core/browser/test_browser_autofill_manager.h
@@ -58,15 +58,13 @@
 
   void AddSeenForm(const FormData& form,
                    const std::vector<ServerFieldType>& heuristic_types,
-                   const std::vector<ServerFieldType>& server_types,
-                   bool preserve_values_in_form_structure = false);
+                   const std::vector<ServerFieldType>& server_types);
 
   void AddSeenForm(
       const FormData& form,
       const std::vector<std::vector<std::pair<PatternSource, ServerFieldType>>>&
           heuristic_types,
-      const std::vector<ServerFieldType>& server_types,
-      bool preserve_values_in_form_structure);
+      const std::vector<ServerFieldType>& server_types);
 
   void AddSeenFormStructure(std::unique_ptr<FormStructure> form_structure);
 
diff --git a/components/cronet/cronet_context.cc b/components/cronet/cronet_context.cc
index da976be8..701127d 100644
--- a/components/cronet/cronet_context.cc
+++ b/components/cronet/cronet_context.cc
@@ -122,8 +122,7 @@
   bool OnAnnotateAndMoveUserBlockedCookies(
       const net::URLRequest& request,
       net::CookieAccessResultList& maybe_included_cookies,
-      net::CookieAccessResultList& excluded_cookies,
-      bool allowed_from_caller) override {
+      net::CookieAccessResultList& excluded_cookies) override {
     // Disallow sending cookies by default.
     ExcludeAllCookies(net::CookieInclusionStatus::EXCLUDE_USER_PREFERENCES,
                       maybe_included_cookies, excluded_cookies);
@@ -132,8 +131,7 @@
 
   bool OnCanSetCookie(const net::URLRequest& request,
                       const net::CanonicalCookie& cookie,
-                      net::CookieOptions* options,
-                      bool allowed_from_caller) override {
+                      net::CookieOptions* options) override {
     // Disallow saving cookies by default.
     return false;
   }
diff --git a/components/exo/shell_surface_util.cc b/components/exo/shell_surface_util.cc
index bfe162f..4dd3e30 100644
--- a/components/exo/shell_surface_util.cc
+++ b/components/exo/shell_surface_util.cc
@@ -223,7 +223,13 @@
 
   // Create a clone of the event as targeter may update it during the
   // search.
-  auto cloned = ui::Event::Clone(*original_event);
+  // TODO(crbug.com/1346400): `ui::Event::Clone` doesn't support all types.
+  // Fix it and remove event type check.
+  auto cloned =
+      original_event->type() == ui::ET_DROP_TARGET_EVENT
+          ? std::make_unique<ui::DropTargetEvent>(
+                *static_cast<const ui::DropTargetEvent*>(original_event))
+          : ui::Event::Clone(*original_event);
   ui::LocatedEvent* event = cloned->AsLocatedEvent();
 
   while (true) {
diff --git a/components/exo/wayland/zaura_shell.cc b/components/exo/wayland/zaura_shell.cc
index ab14ab9..d31443f 100644
--- a/components/exo/wayland/zaura_shell.cc
+++ b/components/exo/wayland/zaura_shell.cc
@@ -20,6 +20,7 @@
 #include "base/logging.h"
 #include "base/strings/string_number_conversions.h"
 #include "build/chromeos_buildflags.h"
+#include "chromeos/ui/base/window_properties.h"
 #include "chromeos/ui/base/window_state_type.h"
 #include "components/exo/display.h"
 #include "components/exo/seat.h"
@@ -743,9 +744,9 @@
   shell_surface_->SetSystemModal(modal);
 }
 
-void AddState(wl_array* states, xdg_toplevel_state state) {
-  xdg_toplevel_state* value = static_cast<xdg_toplevel_state*>(
-      wl_array_add(states, sizeof(xdg_toplevel_state)));
+template <class T>
+void AddState(wl_array* states, T state) {
+  T* value = static_cast<T*>(wl_array_add(states, sizeof(T)));
   DCHECK(value);
   *value = state;
 }
@@ -762,6 +763,9 @@
   // TODO(crbug/1250129): Support snapped state.
   if (IsFullscreenOrPinnedWindowStateType(state_type)) {
     AddState(&states, XDG_TOPLEVEL_STATE_FULLSCREEN);
+    if (shell_surface_->GetWidget()->GetNativeWindow()->GetProperty(
+            chromeos::kImmersiveImpliedByFullscreen))
+      AddState(&states, ZAURA_TOPLEVEL_STATE_IMMERSIVE);
   }
   if (resizing)
     AddState(&states, XDG_TOPLEVEL_STATE_RESIZING);
@@ -773,6 +777,9 @@
   if (state_type == chromeos::WindowStateType::kSecondarySnapped)
     AddState(&states, XDG_TOPLEVEL_STATE_TILED_RIGHT);
 
+  if (state_type == chromeos::WindowStateType::kMinimized)
+    AddState(&states, ZAURA_TOPLEVEL_STATE_MINIMIZED);
+
   zaura_toplevel_send_configure(aura_toplevel_resource_, bounds.x(), bounds.y(),
                                 bounds.width(), bounds.height(), &states);
   wl_array_release(&states);
diff --git a/components/exo/wayland/zaura_shell_unittest.cc b/components/exo/wayland/zaura_shell_unittest.cc
index ccf5a6a9..7fb0d0e 100644
--- a/components/exo/wayland/zaura_shell_unittest.cc
+++ b/components/exo/wayland/zaura_shell_unittest.cc
@@ -368,16 +368,6 @@
             aura_surface().last_sent_occlusion_state());
 }
 
-TEST_F(ZAuraSurfaceTest, CanSetFullscreenModeToPlain) {
-  MockSurfaceDelegate delegate;
-  wl_resource resource;
-  resource.data = &aura_surface();
-  surface().SetSurfaceDelegate(&delegate);
-  EXPECT_CALL(delegate, SetUseImmersiveForFullscreen(false));
-
-  aura_surface().SetFullscreenMode(ZAURA_SURFACE_FULLSCREEN_MODE_PLAIN);
-}
-
 TEST_F(ZAuraSurfaceTest, CanPin) {
   MockSurfaceDelegate delegate;
   wl_resource resource;
@@ -398,6 +388,16 @@
   aura_surface().Unpin();
 }
 
+TEST_F(ZAuraSurfaceTest, CanSetFullscreenModeToPlain) {
+  MockSurfaceDelegate delegate;
+  wl_resource resource;
+  resource.data = &aura_surface();
+  surface().SetSurfaceDelegate(&delegate);
+  EXPECT_CALL(delegate, SetUseImmersiveForFullscreen(false));
+
+  aura_surface().SetFullscreenMode(ZAURA_SURFACE_FULLSCREEN_MODE_PLAIN);
+}
+
 TEST_F(ZAuraSurfaceTest, CanSetFullscreenModeToImmersive) {
   MockSurfaceDelegate delegate;
   surface().SetSurfaceDelegate(&delegate);
diff --git a/components/history_clusters/core/config.cc b/components/history_clusters/core/config.cc
index 0c269f5..30de462 100644
--- a/components/history_clusters/core/config.cc
+++ b/components/history_clusters/core/config.cc
@@ -290,6 +290,22 @@
   GetConfigInternal() = config;
 }
 
+base::flat_set<std::string> JourneysMidBlocklist() {
+  const base::FeatureParam<std::string> kJourneysMidBlocklist{
+      &internal::kHistoryClustersKeywordFiltering, "JourneysMidBlocklist", ""};
+  std::string blocklist_string = kJourneysMidBlocklist.Get();
+  if (blocklist_string.empty())
+    return {};
+
+  auto blocklist = base::SplitString(blocklist_string, ",",
+                                     base::WhitespaceHandling::TRIM_WHITESPACE,
+                                     base::SplitResult::SPLIT_WANT_NONEMPTY);
+
+  return blocklist.empty()
+             ? base::flat_set<std::string>()
+             : base::flat_set<std::string>(blocklist.begin(), blocklist.end());
+}
+
 bool IsApplicationLocaleSupportedByJourneys(
     const std::string& application_locale) {
   // Application locale support should be checked only if the Journeys feature
diff --git a/components/history_clusters/core/config.h b/components/history_clusters/core/config.h
index 14d6acd4..058b734 100644
--- a/components/history_clusters/core/config.h
+++ b/components/history_clusters/core/config.h
@@ -7,6 +7,7 @@
 
 #include <string>
 
+#include "base/containers/flat_set.h"
 #include "base/time/time.h"
 
 class PrefService;
@@ -281,6 +282,11 @@
   ~Config();
 };
 
+// Returns the set of mids that should be blocked from being used by the
+// clustering backend, particularly for potential keywords used for omnibox
+// triggering.
+base::flat_set<std::string> JourneysMidBlocklist();
+
 // Returns true if |application_locale| is supported by Journeys.
 // This is a costly check: Should be called only if
 // |is_journeys_enabled_no_locale_check| is true, and the result should be
diff --git a/components/history_clusters/core/config_unittest.cc b/components/history_clusters/core/config_unittest.cc
index 637183f..569edbb2 100644
--- a/components/history_clusters/core/config_unittest.cc
+++ b/components/history_clusters/core/config_unittest.cc
@@ -6,10 +6,13 @@
 
 #include "base/test/scoped_feature_list.h"
 #include "components/history_clusters/core/features.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace history_clusters {
 
+using ::testing::ElementsAre;
+
 TEST(HistoryClustersConfigTest, LocaleOrLanguageAllowlistDefault) {
   base::test::ScopedFeatureList features;
   features.InitAndEnableFeature(internal::kJourneys);
@@ -79,4 +82,28 @@
   }
 }
 
+TEST(HistoryClustersConfigTest, ValidMidBlocklist) {
+  base::test::ScopedFeatureList features;
+  features.InitWithFeaturesAndParameters(
+      {{
+          internal::kHistoryClustersKeywordFiltering,
+          {{"JourneysMidBlocklist", {"/g/midstr1, /m/midstr2"}}},
+      }},
+      {});
+
+  EXPECT_THAT(JourneysMidBlocklist(), ElementsAre("/g/midstr1", "/m/midstr2"));
+}
+
+TEST(HistoryClustersConfigTest, EmptyMidBlocklist) {
+  base::test::ScopedFeatureList features;
+  features.InitWithFeaturesAndParameters(
+      {{
+          internal::kHistoryClustersKeywordFiltering,
+          {{"JourneysMidBlocklist", ""}},
+      }},
+      {});
+
+  EXPECT_EQ(JourneysMidBlocklist(), base::flat_set<std::string>());
+}
+
 }  // namespace history_clusters
diff --git a/components/history_clusters/core/features.cc b/components/history_clusters/core/features.cc
index 22d1c5c..ffc54b5 100644
--- a/components/history_clusters/core/features.cc
+++ b/components/history_clusters/core/features.cc
@@ -54,6 +54,9 @@
 const base::Feature kHistoryClustersUseContinueOnShutdown{
     "HistoryClustersUseContinueOnShutdown", base::FEATURE_ENABLED_BY_DEFAULT};
 
+const base::Feature kHistoryClustersKeywordFiltering{
+    "HistoryClustersKeywordFiltering", base::FEATURE_DISABLED_BY_DEFAULT};
+
 }  // namespace internal
 
 const base::Feature kJourneysSurveyForHistoryEntrypoint{
diff --git a/components/history_clusters/core/features.h b/components/history_clusters/core/features.h
index 81f6fcb1..4dfc859b 100644
--- a/components/history_clusters/core/features.h
+++ b/components/history_clusters/core/features.h
@@ -56,6 +56,9 @@
 // Enables use of task runner with trait CONTINUE_ON_SHUTDOWN.
 extern const base::Feature kHistoryClustersUseContinueOnShutdown;
 
+// Enables use of additional keyword filtering operations on clusters.
+extern const base::Feature kHistoryClustersKeywordFiltering;
+
 }  // namespace internal
 
 // The below features are NOT internal and NOT encapsulated in the Config class.
diff --git a/components/history_clusters/core/history_clusters_service.cc b/components/history_clusters/core/history_clusters_service.cc
index d93193e..1a8ab42 100644
--- a/components/history_clusters/core/history_clusters_service.cc
+++ b/components/history_clusters/core/history_clusters_service.cc
@@ -69,7 +69,7 @@
 
   backend_ = std::make_unique<OnDeviceClusteringBackend>(
       entity_metadata_provider, engagement_score_provider,
-      optimization_guide_decider);
+      optimization_guide_decider, JourneysMidBlocklist());
 }
 
 HistoryClustersService::~HistoryClustersService() = default;
diff --git a/components/history_clusters/core/on_device_clustering_backend.cc b/components/history_clusters/core/on_device_clustering_backend.cc
index e89a515..7f28cad4 100644
--- a/components/history_clusters/core/on_device_clustering_backend.cc
+++ b/components/history_clusters/core/on_device_clustering_backend.cc
@@ -52,7 +52,8 @@
 OnDeviceClusteringBackend::OnDeviceClusteringBackend(
     optimization_guide::EntityMetadataProvider* entity_metadata_provider,
     site_engagement::SiteEngagementScoreProvider* engagement_score_provider,
-    optimization_guide::NewOptimizationGuideDecider* optimization_guide_decider)
+    optimization_guide::NewOptimizationGuideDecider* optimization_guide_decider,
+    base::flat_set<std::string> mid_blocklist)
     : entity_metadata_provider_(entity_metadata_provider),
       engagement_score_provider_(engagement_score_provider),
       user_visible_task_traits_(
@@ -76,7 +77,8 @@
                   ? continue_on_shutdown_best_effort_task_traits_
                   : best_effort_task_traits_)),
       engagement_score_cache_last_refresh_timestamp_(base::TimeTicks::Now()),
-      engagement_score_cache_(GetConfig().engagement_score_cache_size) {
+      engagement_score_cache_(GetConfig().engagement_score_cache_size),
+      mid_blocklist_(mid_blocklist) {
   if (GetConfig().should_check_hosts_to_skip_clustering_for &&
       optimization_guide_decider) {
     optimization_guide_decider_ = optimization_guide_decider;
@@ -117,6 +119,10 @@
   for (const auto& visit : visits) {
     for (const auto& entity :
          visit.content_annotations.model_annotations.entities) {
+      // Remove entities that are on the keyword blocklist.
+      if (mid_blocklist_.find(entity.id) != mid_blocklist_.end()) {
+        continue;
+      }
       // Only put the entity IDs in if they exceed a certain threshold.
       if (entity.weight < GetConfig().entity_relevance_threshold) {
         continue;
diff --git a/components/history_clusters/core/on_device_clustering_backend.h b/components/history_clusters/core/on_device_clustering_backend.h
index fbe1599..028a4f3 100644
--- a/components/history_clusters/core/on_device_clustering_backend.h
+++ b/components/history_clusters/core/on_device_clustering_backend.h
@@ -40,7 +40,8 @@
       optimization_guide::EntityMetadataProvider* entity_metadata_provider,
       site_engagement::SiteEngagementScoreProvider* engagement_score_provider,
       optimization_guide::NewOptimizationGuideDecider*
-          optimization_guide_decider);
+          optimization_guide_decider,
+      base::flat_set<std::string> mid_blocklist);
   ~OnDeviceClusteringBackend() override;
 
   // ClusteringBackend:
@@ -124,6 +125,10 @@
   // URL host to score mapping.
   base::HashingLRUCache<std::string, float> engagement_score_cache_;
 
+  // The set of mid strings that should be blocked from included in the backend
+  // for both clustering and keywords.
+  base::flat_set<std::string> mid_blocklist_;
+
   SEQUENCE_CHECKER(sequence_checker_);
 
   base::WeakPtrFactory<OnDeviceClusteringBackend> weak_ptr_factory_{this};
diff --git a/components/history_clusters/core/on_device_clustering_backend_unittest.cc b/components/history_clusters/core/on_device_clustering_backend_unittest.cc
index 16d89c9..1ecd4a0b 100644
--- a/components/history_clusters/core/on_device_clustering_backend_unittest.cc
+++ b/components/history_clusters/core/on_device_clustering_backend_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "components/history_clusters/core/on_device_clustering_backend.h"
 
+#include "base/containers/flat_set.h"
 #include "base/run_loop.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
@@ -135,7 +136,8 @@
   void SetUp() override {
     clustering_backend_ = std::make_unique<OnDeviceClusteringBackend>(
         /*entity_metadata_provider=*/nullptr, &test_site_engagement_provider_,
-        /*optimization_guide_decider_=*/nullptr);
+        /*optimization_guide_decider_=*/nullptr,
+        /*mid_blocklist_=*/base::flat_set<std::string>({"blockedentity"}));
   }
 
   void TearDown() override { clustering_backend_.reset(); }
@@ -567,7 +569,8 @@
     clustering_backend_ = std::make_unique<OnDeviceClusteringBackend>(
         entity_metadata_provider_.get(),
         /*engagement_score_provider=*/nullptr,
-        optimization_guide_decider_.get());
+        optimization_guide_decider_.get(),
+        /*mid_blocklist_=*/base::flat_set<std::string>({"blockedentity"}));
   }
 
  private:
@@ -575,6 +578,48 @@
   std::unique_ptr<TestOptimizationGuideDecider> optimization_guide_decider_;
 };
 
+TEST_F(OnDeviceClusteringWithAllTheBackendsTest, EntityOnMidBlocklist) {
+  base::HistogramTester histogram_tester;
+  std::vector<history::AnnotatedVisit> visits;
+
+  // Visit 2 refers to visit 1 and will be clustered. Visit 3 refers to a
+  // missing visit and should be considered as in its own cluster.
+  // Goal is to test the mid blocklist
+  history::AnnotatedVisit visit =
+      testing::CreateDefaultAnnotatedVisit(1, GURL("https://github.com/"));
+  visit.content_annotations.model_annotations.entities = {
+      {"blockedentity", 100}};
+  visits.push_back(visit);
+
+  history::AnnotatedVisit visit2 =
+      testing::CreateDefaultAnnotatedVisit(2, GURL("https://google.com/"));
+  visit2.referring_visit_of_redirect_chain_start = 1;
+  visit2.content_annotations.model_annotations.entities = {{"unblocked", 100}};
+  // Set the visit duration to be 2x the default so it has the same duration
+  // after |visit| and |visit4| are deduped.
+  visit2.visit_row.visit_duration = base::Seconds(20);
+  visits.push_back(visit2);
+
+  // This visit has a different title and shouldn't be grouped with the others.
+  history::AnnotatedVisit visit3 = testing::CreateDefaultAnnotatedVisit(
+      10, GURL("https://nonexistentreferrer.com/"));
+  visit3.referring_visit_of_redirect_chain_start = 6;
+  visit3.content_annotations.model_annotations.entities = {{"irrelevant", 100}};
+  visits.push_back(visit3);
+
+  std::vector<history::Cluster> result_clusters =
+      ClusterVisits(ClusteringRequestSource::kJourneysPage, visits);
+
+  histogram_tester.ExpectUniqueSample(
+      "History.Clusters.Backend.ClusterSize.Min", 1, 1);
+  histogram_tester.ExpectUniqueSample(
+      "History.Clusters.Backend.ClusterSize.Max", 2, 1);
+  histogram_tester.ExpectUniqueSample(
+      "History.Clusters.Backend.NumKeywordsPerCluster.Min", 3, 1);
+  histogram_tester.ExpectUniqueSample(
+      "History.Clusters.Backend.NumKeywordsPerCluster.Max", 3, 1);
+}
+
 TEST_F(OnDeviceClusteringWithAllTheBackendsTest,
        DedupeSimilarUrlSameSearchQuery) {
   base::HistogramTester histogram_tester;
diff --git a/components/metrics/net/network_metrics_provider_unittest.cc b/components/metrics/net/network_metrics_provider_unittest.cc
index 9c0ac055..2766669 100644
--- a/components/metrics/net/network_metrics_provider_unittest.cc
+++ b/components/metrics/net/network_metrics_provider_unittest.cc
@@ -44,7 +44,7 @@
  private:
   MetricsTaskEnvironment task_environment_;
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-  chromeos::NetworkHandlerTestHelper network_handler_test_helper_;
+  ash::NetworkHandlerTestHelper network_handler_test_helper_;
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 };
 
diff --git a/components/omnibox/browser/zero_suggest_provider.cc b/components/omnibox/browser/zero_suggest_provider.cc
index 670b69994..e8b4239 100644
--- a/components/omnibox/browser/zero_suggest_provider.cc
+++ b/components/omnibox/browser/zero_suggest_provider.cc
@@ -212,6 +212,10 @@
     if (focus_type == OmniboxFocusType::ON_FOCUS &&
         input.type() == OmniboxInputType::EMPTY) {
       return ZeroSuggestProvider::REMOTE_NO_URL;
+    } else if (page_class == OmniboxEventProto::ANDROID_SHORTCUTS_WIDGET &&
+               focus_type == OmniboxFocusType::ON_FOCUS &&
+               input.type() == OmniboxInputType::URL) {
+      return ZeroSuggestProvider::REMOTE_NO_URL;
     }
   }
 
diff --git a/components/omnibox_strings.grdp b/components/omnibox_strings.grdp
index 9ef03a8..6129b5d 100644
--- a/components/omnibox_strings.grdp
+++ b/components/omnibox_strings.grdp
@@ -293,27 +293,21 @@
     &quot;<ph name="SECTION">$1<ex>Related to recent searches</ex></ph>&quot; section hidden
   </message>
 
-  <!-- Site Search/Keyword mode Starter Pack strings. -->
+  <!-- Site Search/Keyword mode Starter Pack strings. Note: kCurrentDataVersion in template_url_starter_pack_data.cc must also be updated when changing these values. -->
   <message name="IDS_SEARCH_ENGINES_STARTER_PACK_BOOKMARKS_NAME" desc = "The name of the chrome bookmarks search engine as it appears on chrome://settings/searchEngines">
-    Chrome Bookmarks
+    Bookmarks
   </message>
   <message name="IDS_SEARCH_ENGINES_STARTER_PACK_BOOKMARKS_KEYWORD" desc = "The keyword required to trigger bookmarks search in keyword mode. This will be prepended with an '@'.">
     Bookmarks
   </message>
   <message name="IDS_SEARCH_ENGINES_STARTER_PACK_HISTORY_NAME" desc = "The name of the chrome history search engine as it appears on chrome://settings/searchEngines">
-    Chrome History
+    History
   </message>
   <message name="IDS_SEARCH_ENGINES_STARTER_PACK_HISTORY_KEYWORD" desc = "The keyword required to trigger history search in keyword mode. This will be prepended with an '@'.">
     History
   </message>
-  <message name="IDS_SEARCH_ENGINES_STARTER_PACK_SETTINGS_NAME" desc = "The name of the chrome settings search engine as it appears on chrome://settings/searchEngines">
-    Chrome Settings
-  </message>
-  <message name="IDS_SEARCH_ENGINES_STARTER_PACK_SETTINGS_KEYWORD" desc = "The keyword required to trigger settings search in keyword mode. This will be prepended with an '@'.">
-    Settings
-  </message>
   <message name="IDS_SEARCH_ENGINES_STARTER_PACK_TABS_NAME" desc = "The name of the search engine to search through open Chrome Tabs as it appears on chrome://settings/searchEngines.">
-    Chrome Tabs
+    Tabs
   </message>
   <message name="IDS_SEARCH_ENGINES_STARTER_PACK_TABS_KEYWORD" desc = "The keyword required to trigger tab search in keyword mode. This will be prepended with an '@'.">
     Tabs
diff --git a/components/omnibox_strings_grdp/IDS_SEARCH_ENGINES_STARTER_PACK_BOOKMARKS_NAME.png.sha1 b/components/omnibox_strings_grdp/IDS_SEARCH_ENGINES_STARTER_PACK_BOOKMARKS_NAME.png.sha1
index d87c7a6c..f78ea645 100644
--- a/components/omnibox_strings_grdp/IDS_SEARCH_ENGINES_STARTER_PACK_BOOKMARKS_NAME.png.sha1
+++ b/components/omnibox_strings_grdp/IDS_SEARCH_ENGINES_STARTER_PACK_BOOKMARKS_NAME.png.sha1
@@ -1 +1 @@
-153415e5790e4c36cb6d91eaf5e4c1ae044f3df1
\ No newline at end of file
+ddf657e94a22337604057953f831c2e28b195537
\ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_SEARCH_ENGINES_STARTER_PACK_HISTORY_NAME.png.sha1 b/components/omnibox_strings_grdp/IDS_SEARCH_ENGINES_STARTER_PACK_HISTORY_NAME.png.sha1
index d87c7a6c..f78ea645 100644
--- a/components/omnibox_strings_grdp/IDS_SEARCH_ENGINES_STARTER_PACK_HISTORY_NAME.png.sha1
+++ b/components/omnibox_strings_grdp/IDS_SEARCH_ENGINES_STARTER_PACK_HISTORY_NAME.png.sha1
@@ -1 +1 @@
-153415e5790e4c36cb6d91eaf5e4c1ae044f3df1
\ No newline at end of file
+ddf657e94a22337604057953f831c2e28b195537
\ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_SEARCH_ENGINES_STARTER_PACK_SETTINGS_KEYWORD.png.sha1 b/components/omnibox_strings_grdp/IDS_SEARCH_ENGINES_STARTER_PACK_SETTINGS_KEYWORD.png.sha1
deleted file mode 100644
index d87c7a6c..0000000
--- a/components/omnibox_strings_grdp/IDS_SEARCH_ENGINES_STARTER_PACK_SETTINGS_KEYWORD.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-153415e5790e4c36cb6d91eaf5e4c1ae044f3df1
\ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_SEARCH_ENGINES_STARTER_PACK_SETTINGS_NAME.png.sha1 b/components/omnibox_strings_grdp/IDS_SEARCH_ENGINES_STARTER_PACK_SETTINGS_NAME.png.sha1
deleted file mode 100644
index d87c7a6c..0000000
--- a/components/omnibox_strings_grdp/IDS_SEARCH_ENGINES_STARTER_PACK_SETTINGS_NAME.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-153415e5790e4c36cb6d91eaf5e4c1ae044f3df1
\ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_SEARCH_ENGINES_STARTER_PACK_TABS_NAME.png.sha1 b/components/omnibox_strings_grdp/IDS_SEARCH_ENGINES_STARTER_PACK_TABS_NAME.png.sha1
index 28c6e25..f78ea645 100644
--- a/components/omnibox_strings_grdp/IDS_SEARCH_ENGINES_STARTER_PACK_TABS_NAME.png.sha1
+++ b/components/omnibox_strings_grdp/IDS_SEARCH_ENGINES_STARTER_PACK_TABS_NAME.png.sha1
@@ -1 +1 @@
-a1601845088b54f885183b628c39136f5042a9f5
\ No newline at end of file
+ddf657e94a22337604057953f831c2e28b195537
\ No newline at end of file
diff --git a/components/search_engines/template_url_data_util.cc b/components/search_engines/template_url_data_util.cc
index f1c98f6..6c087520 100644
--- a/components/search_engines/template_url_data_util.cc
+++ b/components/search_engines/template_url_data_util.cc
@@ -415,6 +415,7 @@
   turl->favicon_url = GURL(ToStringPiece(engine.favicon_url));
   turl->starter_pack_id = engine.id;
   turl->GenerateSyncGUID();
+  turl->safe_for_autoreplace = true;
   turl->is_active = TemplateURLData::ActiveStatus::kTrue;
 
   return turl;
diff --git a/components/search_engines/template_url_service.cc b/components/search_engines/template_url_service.cc
index 4dd88de..33bae58 100644
--- a/components/search_engines/template_url_service.cc
+++ b/components/search_engines/template_url_service.cc
@@ -2356,11 +2356,12 @@
     DCHECK_NE(turl, candidate) << "This algorithm runs BEFORE |candidate| is "
                                   "added to the keyword map.";
 
-    // Prepopulated engines are marked as safe_for_autoreplace(). But because
+    // Built-in engines are marked as safe_for_autoreplace(). But because
     // they are shown in the Default Search Engines Settings UI, users would
     // find it confusing if they were ever automatically removed.
     // https://crbug.com/1164024
-    if (turl->safe_for_autoreplace() && turl->prepopulate_id() == 0) {
+    if (turl->safe_for_autoreplace() && turl->prepopulate_id() == 0 &&
+        turl->starter_pack_id() == 0) {
       replaceable_turls.push_back(turl);
     }
   }
@@ -2410,7 +2411,7 @@
   // above. Most probably: the solution is to stop Syncing prepopulated engines
   // and make the GUIDs actually globally unique again.
   return candidate != best && candidate->safe_for_autoreplace() &&
-         candidate->prepopulate_id() == 0;
+         candidate->prepopulate_id() == 0 && candidate->starter_pack_id() == 0;
 }
 
 bool TemplateURLService::MatchesDefaultSearchProvider(TemplateURL* turl) const {
diff --git a/components/search_engines/template_url_starter_pack_data.cc b/components/search_engines/template_url_starter_pack_data.cc
index 9f08cec..77f3dd3 100644
--- a/components/search_engines/template_url_starter_pack_data.cc
+++ b/components/search_engines/template_url_starter_pack_data.cc
@@ -13,7 +13,7 @@
 
 namespace TemplateURLStarterPackData {
 
-const int kCurrentDataVersion = 2;
+const int kCurrentDataVersion = 3;
 
 const StarterPackEngine bookmarks = {
     .name_message_id = IDS_SEARCH_ENGINES_STARTER_PACK_BOOKMARKS_NAME,
diff --git a/components/viz/service/frame_sinks/external_begin_frame_source_mojo.h b/components/viz/service/frame_sinks/external_begin_frame_source_mojo.h
index ce01240..0048aee 100644
--- a/components/viz/service/frame_sinks/external_begin_frame_source_mojo.h
+++ b/components/viz/service/frame_sinks/external_begin_frame_source_mojo.h
@@ -71,6 +71,7 @@
                                 const BeginFrameArgs& args) override;
   void OnFrameSinkDidFinishFrame(const FrameSinkId& frame_sink_id,
                                  const BeginFrameArgs& args) override;
+  void OnCaptureStarted(const FrameSinkId& frame_sink_id) override {}
 
   void MaybeProduceFrameCallback();
   void DispatchFrameCallback(const BeginFrameAck& ack);
diff --git a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc
index 083f266..6557fde 100644
--- a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc
+++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc
@@ -683,6 +683,8 @@
   if (captured_frame_sink_ids_.insert(id).second) {
     ClearThrottling(id);
   }
+  for (auto& observer : observer_list_)
+    observer.OnCaptureStarted(id);
 }
 
 void FrameSinkManagerImpl::OnCaptureStopped(const FrameSinkId& id) {
diff --git a/components/viz/service/frame_sinks/frame_sink_observer.h b/components/viz/service/frame_sinks/frame_sink_observer.h
index a97bcafb..7886b27 100644
--- a/components/viz/service/frame_sinks/frame_sink_observer.h
+++ b/components/viz/service/frame_sinks/frame_sink_observer.h
@@ -45,6 +45,9 @@
   // Called when a sink has finished processing a frame.
   virtual void OnFrameSinkDidFinishFrame(const FrameSinkId& frame_sink_id,
                                          const BeginFrameArgs& args) = 0;
+
+  // Called when capturing is started for `frame_sink_id`.
+  virtual void OnCaptureStarted(const FrameSinkId& frame_sink_id) = 0;
 };
 
 }  // namespace viz
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 9089c28..e7351dc8 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -2910,8 +2910,6 @@
       "android/web_contents_observer_proxy.h",
       "contacts/contacts_provider_android.cc",
       "contacts/contacts_provider_android.h",
-      "devtools/devtools_frame_trace_recorder.cc",
-      "devtools/devtools_frame_trace_recorder.h",
       "font_unique_name_lookup/font_unique_name_lookup.cc",
       "font_unique_name_lookup/font_unique_name_lookup.h",
       "font_unique_name_lookup/font_unique_name_lookup_service.cc",
diff --git a/content/browser/android/synchronous_compositor_host.cc b/content/browser/android/synchronous_compositor_host.cc
index e164d3d3..9dd1d77 100644
--- a/content/browser/android/synchronous_compositor_host.cc
+++ b/content/browser/android/synchronous_compositor_host.cc
@@ -304,7 +304,6 @@
   frame_metadata_version_ = version;
   if (new_local_surface_id)
     local_surface_id_ = new_local_surface_id.value();
-  UpdatePresentedFrameToken(frame_metadata.frame_token);
 }
 
 namespace {
@@ -522,14 +521,6 @@
   timing_details_ = timing_details;
   if (!timing_details_.empty())
     AddBeginFrameRequest(BEGIN_FRAME);
-
-  UpdatePresentedFrameToken(frame_token);
-}
-
-void SynchronousCompositorHost::UpdatePresentedFrameToken(
-    uint32_t frame_token) {
-  rwhva_->FrameTokenChangedForSynchronousCompositor(frame_token,
-                                                    root_scroll_offset_);
 }
 
 void SynchronousCompositorHost::SetMemoryPolicy(size_t bytes_limit) {
diff --git a/content/browser/android/synchronous_compositor_host.h b/content/browser/android/synchronous_compositor_host.h
index 547f6885..46912ae 100644
--- a/content/browser/android/synchronous_compositor_host.h
+++ b/content/browser/android/synchronous_compositor_host.h
@@ -145,7 +145,6 @@
   // handle blocking calls.
   bool IsReadyForSynchronousCall();
   void UpdateRootLayerStateOnClient();
-  void UpdatePresentedFrameToken(uint32_t frame_token);
 
   void SendBeginFramePaused();
   void SendBeginFrame(viz::BeginFrameArgs args);
diff --git a/content/browser/code_cache/generated_code_cache.cc b/content/browser/code_cache/generated_code_cache.cc
index e7b1bb2..fa3aea53 100644
--- a/content/browser/code_cache/generated_code_cache.cc
+++ b/content/browser/code_cache/generated_code_cache.cc
@@ -108,8 +108,14 @@
 
   if (base::FeatureList::IsEnabled(
           net::features::kSplitCacheByNetworkIsolationKey)) {
-    key.append(kSeparator);
-    key.append(nik.ToString());
+    // TODO(https://crbug.com/1346188):  Transient NIKs return nullopt when
+    // their ToCacheKeyString() method is invoked, as they generally shouldn't
+    // be written to disk. This code is currently reached for transient NIKs,
+    // which needs to be fixed.
+    if (!nik.IsTransient()) {
+      key.append(kSeparator);
+      key.append(*nik.ToCacheKeyString());
+    }
   }
   return key;
 }
diff --git a/content/browser/compute_pressure/README.md b/content/browser/compute_pressure/README.md
index 779d0a0..5b064a8 100644
--- a/content/browser/compute_pressure/README.md
+++ b/content/browser/compute_pressure/README.md
@@ -19,16 +19,16 @@
 
 `device::PressureSample` represents the device's compute pressure state.
 This information is collected by `device::CpuProbe` and bubbled up by
-`device::PressureSampler` to `device::PressureManagerImpl`, which broadcasts
+`device::PlatformCollector` to `device::PressureManagerImpl`, which broadcasts
 the information to the `content::PressureServiceImpl` instances.
 
-`device::PressureSampler` drives measuring the device's compute pressure
+`device::PlatformCollector` drives measuring the device's compute pressure
 state. The class is responsible for invoking platform-specific measurement
 code at regular intervals, and for straddling between sequences to meet
 the platform-specific code's requirements.
 
 `device::CpuProbe` is an abstract base class that interfaces between
-`device::PressureSampler` and platform-specific code that retrieves the
+`device::PlatformCollector` and platform-specific code that retrieves the
 compute pressure state from the operating system. This interface is also
 a dependency injection point for tests.
 
diff --git a/content/browser/devtools/devtools_frame_trace_recorder.cc b/content/browser/devtools/devtools_frame_trace_recorder.cc
deleted file mode 100644
index 14d7a57..0000000
--- a/content/browser/devtools/devtools_frame_trace_recorder.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright (c) 2015 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/devtools/devtools_frame_trace_recorder.h"
-
-#include <stddef.h>
-
-#include <string>
-#include <vector>
-
-#include "base/atomicops.h"
-#include "base/bind.h"
-#include "base/memory/ref_counted.h"
-#include "base/trace_event/trace_event_impl.h"
-#include "build/build_config.h"
-#include "cc/trees/render_frame_metadata.h"
-#include "content/browser/devtools/devtools_traceable_screenshot.h"
-#include "content/browser/renderer_host/render_frame_host_impl.h"
-#include "content/browser/renderer_host/render_widget_host_view_base.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "ui/gfx/geometry/size.h"
-#include "ui/gfx/geometry/size_conversions.h"
-
-namespace content {
-
-namespace {
-
-static size_t kFrameAreaLimit = 256000;
-
-void FrameCaptured(base::TimeTicks timestamp, const SkBitmap& bitmap) {
-  if (bitmap.drawsNothing())
-    return;
-  if (DevToolsTraceableScreenshot::GetNumberOfInstances() >=
-      DevToolsTraceableScreenshot::kMaximumNumberOfScreenshots) {
-    return;
-  }
-  TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID_AND_TIMESTAMP(
-      TRACE_DISABLED_BY_DEFAULT("devtools.screenshot"), "Screenshot", 1,
-      timestamp,
-      std::unique_ptr<base::trace_event::ConvertableToTraceFormat>(
-          new DevToolsTraceableScreenshot(bitmap)));
-}
-
-void CaptureFrame(RenderFrameHostImpl* host,
-                  const cc::RenderFrameMetadata& metadata) {
-  RenderWidgetHostViewBase* view =
-      static_cast<RenderWidgetHostViewBase*>(host->GetView());
-  if (!view)
-    return;
-  if (DevToolsTraceableScreenshot::GetNumberOfInstances() >=
-      DevToolsTraceableScreenshot::kMaximumNumberOfScreenshots) {
-    return;
-  }
-
-  gfx::Size predicted_bitmap_size = gfx::ToCeiledSize(gfx::ScaleSize(
-      metadata.scrollable_viewport_size, metadata.page_scale_factor));
-  gfx::Size snapshot_size;
-  float area = predicted_bitmap_size.GetArea();
-  if (area <= kFrameAreaLimit) {
-    snapshot_size = predicted_bitmap_size;
-  } else {
-    double scale = sqrt(kFrameAreaLimit / area);
-    snapshot_size = gfx::ScaleToCeiledSize(predicted_bitmap_size, scale);
-  }
-
-  view->CopyFromSurface(gfx::Rect(), snapshot_size,
-                        base::BindOnce(FrameCaptured, base::TimeTicks::Now()));
-}
-
-bool ScreenshotCategoryEnabled() {
-  bool enabled;
-  TRACE_EVENT_CATEGORY_GROUP_ENABLED(
-      TRACE_DISABLED_BY_DEFAULT("devtools.screenshot"), &enabled);
-  return enabled;
-}
-
-}  // namespace
-
-DevToolsFrameTraceRecorder::DevToolsFrameTraceRecorder() = default;
-DevToolsFrameTraceRecorder::~DevToolsFrameTraceRecorder() = default;
-
-void DevToolsFrameTraceRecorder::OnSynchronousSwapCompositorFrame(
-    RenderFrameHostImpl* host,
-    const cc::RenderFrameMetadata& metadata) {
-  if (!host || !ScreenshotCategoryEnabled()) {
-    return;
-  }
-
-  bool is_new_trace;
-  TRACE_EVENT_IS_NEW_TRACE(&is_new_trace);
-  if (!is_new_trace)
-    CaptureFrame(host, metadata);
-}
-
-}  // namespace content
diff --git a/content/browser/devtools/devtools_frame_trace_recorder.h b/content/browser/devtools/devtools_frame_trace_recorder.h
deleted file mode 100644
index 9327f97..0000000
--- a/content/browser/devtools/devtools_frame_trace_recorder.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2015 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_BROWSER_DEVTOOLS_DEVTOOLS_FRAME_TRACE_RECORDER_H_
-#define CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_FRAME_TRACE_RECORDER_H_
-
-#include "base/memory/weak_ptr.h"
-
-namespace cc {
-class RenderFrameMetadata;
-}
-
-namespace content {
-
-class RenderFrameHostImpl;
-
-class DevToolsFrameTraceRecorder {
- public:
-  DevToolsFrameTraceRecorder();
-
-  DevToolsFrameTraceRecorder(const DevToolsFrameTraceRecorder&) = delete;
-  DevToolsFrameTraceRecorder& operator=(const DevToolsFrameTraceRecorder&) =
-      delete;
-
-  ~DevToolsFrameTraceRecorder();
-
-  void OnSynchronousSwapCompositorFrame(
-      RenderFrameHostImpl* host,
-      const cc::RenderFrameMetadata& metadata);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_FRAME_TRACE_RECORDER_H_
diff --git a/content/browser/devtools/protocol/page_handler.cc b/content/browser/devtools/protocol/page_handler.cc
index 9f8887b..13d646ee 100644
--- a/content/browser/devtools/protocol/page_handler.cc
+++ b/content/browser/devtools/protocol/page_handler.cc
@@ -80,8 +80,6 @@
 
 constexpr const char* kMhtml = "mhtml";
 constexpr int kDefaultScreenshotQuality = 80;
-constexpr int kFrameRetryDelayMs = 100;
-constexpr int kCaptureRetryLimit = 2;
 constexpr int kMaxScreencastFramesInFlight = 2;
 constexpr char kCommandIsOnlyAvailableAtTopTarget[] =
     "Command can only be executed on top-level targets";
@@ -213,30 +211,20 @@
       screencast_max_width_(-1),
       screencast_max_height_(-1),
       capture_every_nth_frame_(1),
-      capture_retry_count_(0),
       session_id_(0),
       frame_counter_(0),
       frames_in_flight_(0),
-      video_consumer_(nullptr),
-      last_surface_size_(gfx::Size()),
       host_(nullptr),
       emulation_handler_(emulation_handler),
       browser_handler_(browser_handler) {
-  bool create_video_consumer = true;
 #if BUILDFLAG(IS_ANDROID)
   constexpr auto kScreencastPixelFormat = media::PIXEL_FORMAT_I420;
-  // Video capture doesn't work on Android WebView. Use CopyFromSurface instead.
-  if (!CompositorImpl::IsInitialized())
-    create_video_consumer = false;
 #else
   constexpr auto kScreencastPixelFormat = media::PIXEL_FORMAT_ARGB;
 #endif
-  if (create_video_consumer) {
-    video_consumer_ = std::make_unique<DevToolsVideoConsumer>(
-        base::BindRepeating(&PageHandler::OnFrameFromVideoConsumer,
-                            weak_factory_.GetWeakPtr()));
-    video_consumer_->SetFormat(kScreencastPixelFormat);
-  }
+  video_consumer_ = std::make_unique<DevToolsVideoConsumer>(base::BindRepeating(
+      &PageHandler::OnFrameFromVideoConsumer, weak_factory_.GetWeakPtr()));
+  video_consumer_->SetFormat(kScreencastPixelFormat);
   DCHECK(emulation_handler_);
 }
 
@@ -279,7 +267,7 @@
   if (widget_host)
     observation_.Observe(widget_host);
 
-  if (video_consumer_ && frame_host) {
+  if (frame_host) {
     video_consumer_->SetFrameSinkId(
         frame_host->GetRenderWidgetHost()->GetFrameSinkId());
   }
@@ -290,15 +278,6 @@
   Page::Dispatcher::wire(dispatcher, this);
 }
 
-void PageHandler::OnSynchronousSwapCompositorFrame(
-    const cc::RenderFrameMetadata& frame_metadata) {
-  // Cache |frame_metadata_| as InnerSwapCompositorFrame may also be called on
-  // screencast start.
-  frame_metadata_ = frame_metadata;
-  if (screencast_enabled_)
-    InnerSwapCompositorFrame();
-}
-
 void PageHandler::RenderWidgetHostVisibilityChanged(
     RenderWidgetHost* widget_host,
     bool became_visible) {
@@ -374,8 +353,7 @@
   screencast_enabled_ = false;
   bypass_csp_ = false;
 
-  if (video_consumer_)
-    video_consumer_->StopCapture();
+  video_consumer_->StopCapture();
 
   if (!pending_dialog_.is_null()) {
     ResponseOrWebContents result = GetWebContentsForTopLevelActiveFrame();
@@ -961,32 +939,21 @@
   bool visible = !widget_host->is_hidden();
   NotifyScreencastVisibility(visible);
 
-  if (video_consumer_) {
-    gfx::Size surface_size = gfx::Size();
-    RenderWidgetHostViewBase* const view =
-        static_cast<RenderWidgetHostViewBase*>(host_->GetView());
-    if (view) {
-      surface_size = view->GetCompositorViewportPixelSize();
-      last_surface_size_ = surface_size;
-    }
-
-    gfx::Size snapshot_size = DetermineSnapshotSize(
-        surface_size, screencast_max_width_, screencast_max_height_);
-    if (!snapshot_size.IsEmpty())
-      video_consumer_->SetMinAndMaxFrameSize(snapshot_size, snapshot_size);
-
-    video_consumer_->StartCapture();
-    return Response::FallThrough();
+  gfx::Size surface_size = gfx::Size();
+  RenderWidgetHostViewBase* const view =
+      static_cast<RenderWidgetHostViewBase*>(host_->GetView());
+  if (view) {
+    surface_size = view->GetCompositorViewportPixelSize();
+    last_surface_size_ = surface_size;
   }
 
-  if (!visible)
-    return Response::FallThrough();
+  gfx::Size snapshot_size = DetermineSnapshotSize(
+      surface_size, screencast_max_width_, screencast_max_height_);
+  if (!snapshot_size.IsEmpty())
+    video_consumer_->SetMinAndMaxFrameSize(snapshot_size, snapshot_size);
 
-  if (frame_metadata_) {
-    InnerSwapCompositorFrame();
-  } else {
-    widget_host->RequestForceRedraw(0);
-  }
+  video_consumer_->StartCapture();
+
   return Response::FallThrough();
 }
 
@@ -1079,8 +1046,6 @@
 }
 
 void PageHandler::NotifyScreencastVisibility(bool visible) {
-  if (visible)
-    capture_retry_count_ = kCaptureRetryLimit;
   frontend_->ScreencastVisibilityChanged(visible);
 }
 
@@ -1089,48 +1054,6 @@
          !(++frame_counter_ % capture_every_nth_frame_);
 }
 
-void PageHandler::InnerSwapCompositorFrame() {
-  if (!host_)
-    return;
-
-  if (!ShouldCaptureNextScreencastFrame())
-    return;
-
-  RenderWidgetHostViewBase* const view =
-      static_cast<RenderWidgetHostViewBase*>(host_->GetView());
-  if (!view || !view->IsSurfaceAvailableForCopy())
-    return;
-
-  const gfx::Size surface_size = view->GetCompositorViewportPixelSize();
-  if (surface_size.IsEmpty())
-    return;
-
-  const gfx::Size snapshot_size = DetermineSnapshotSize(
-      surface_size, screencast_max_width_, screencast_max_height_);
-  if (snapshot_size.IsEmpty())
-    return;
-
-  double top_controls_visible_height =
-      frame_metadata_->top_controls_height *
-      frame_metadata_->top_controls_shown_ratio;
-
-  std::unique_ptr<Page::ScreencastFrameMetadata> page_metadata =
-      BuildScreencastFrameMetadata(
-          surface_size, frame_metadata_->device_scale_factor,
-          frame_metadata_->page_scale_factor,
-          frame_metadata_->root_scroll_offset.value_or(gfx::PointF()),
-          top_controls_visible_height);
-  if (!page_metadata)
-    return;
-
-  // Request a copy of the surface as a scaled SkBitmap.
-  view->CopyFromSurface(
-      gfx::Rect(), snapshot_size,
-      base::BindOnce(&PageHandler::ScreencastFrameCaptured,
-                     weak_factory_.GetWeakPtr(), std::move(page_metadata)));
-  frames_in_flight_++;
-}
-
 void PageHandler::OnFrameFromVideoConsumer(
     scoped_refptr<media::VideoFrame> frame) {
   if (!host_)
@@ -1179,14 +1102,6 @@
     std::unique_ptr<Page::ScreencastFrameMetadata> page_metadata,
     const SkBitmap& bitmap) {
   if (bitmap.drawsNothing()) {
-    if (capture_retry_count_) {
-      --capture_retry_count_;
-      base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-          FROM_HERE,
-          base::BindOnce(&PageHandler::InnerSwapCompositorFrame,
-                         weak_factory_.GetWeakPtr()),
-          base::Milliseconds(kFrameRetryDelayMs));
-    }
     --frames_in_flight_;
     return;
   }
diff --git a/content/browser/devtools/protocol/page_handler.h b/content/browser/devtools/protocol/page_handler.h
index c0552226..2065335 100644
--- a/content/browser/devtools/protocol/page_handler.h
+++ b/content/browser/devtools/protocol/page_handler.h
@@ -84,8 +84,6 @@
   void SetRenderer(int process_host_id,
                    RenderFrameHostImpl* frame_host) override;
   // Instrumentation signals.
-  void OnSynchronousSwapCompositorFrame(
-      const cc::RenderFrameMetadata& frame_metadata);
   void DidAttachInterstitialPage();
   void DidDetachInterstitialPage();
   bool screencast_enabled() const { return enabled_ && screencast_enabled_; }
@@ -187,7 +185,6 @@
 
   bool ShouldCaptureNextScreencastFrame();
   void NotifyScreencastVisibility(bool visible);
-  void InnerSwapCompositorFrame();
   void OnFrameFromVideoConsumer(scoped_refptr<media::VideoFrame> frame);
   void ScreencastFrameCaptured(
       std::unique_ptr<Page::ScreencastFrameMetadata> metadata,
@@ -239,8 +236,6 @@
   int screencast_max_width_;
   int screencast_max_height_;
   int capture_every_nth_frame_;
-  int capture_retry_count_;
-  absl::optional<cc::RenderFrameMetadata> frame_metadata_;
   int session_id_;
   int frame_counter_;
   int frames_in_flight_;
diff --git a/content/browser/devtools/protocol/tracing_handler.cc b/content/browser/devtools/protocol/tracing_handler.cc
index 3b5fd32..04dfc03d 100644
--- a/content/browser/devtools/protocol/tracing_handler.cc
+++ b/content/browser/devtools/protocol/tracing_handler.cc
@@ -513,17 +513,8 @@
       return_as_stream_(false),
       gzip_compression_(false),
       buffer_usage_reporting_interval_(0) {
-  bool use_video_capture_api = true;
-#if BUILDFLAG(IS_ANDROID)
-  // Video capture API cannot be used on Android WebView.
-  if (!CompositorImpl::IsInitialized())
-    use_video_capture_api = false;
-#endif
-  if (use_video_capture_api) {
-    video_consumer_ =
-        std::make_unique<DevToolsVideoConsumer>(base::BindRepeating(
-            &TracingHandler::OnFrameFromVideoConsumer, base::Unretained(this)));
-  }
+  video_consumer_ = std::make_unique<DevToolsVideoConsumer>(base::BindRepeating(
+      &TracingHandler::OnFrameFromVideoConsumer, base::Unretained(this)));
 }
 
 TracingHandler::~TracingHandler() = default;
@@ -537,7 +528,7 @@
 void TracingHandler::SetRenderer(int process_host_id,
                                  RenderFrameHostImpl* frame_host) {
   frame_host_ = frame_host;
-  if (!video_consumer_ || !frame_host)
+  if (!frame_host)
     return;
   video_consumer_->SetFrameSinkId(
       frame_host->GetRenderWidgetHost()->GetFrameSinkId());
@@ -954,7 +945,7 @@
   bool screenshot_enabled;
   TRACE_EVENT_CATEGORY_GROUP_ENABLED(
       TRACE_DISABLED_BY_DEFAULT("devtools.screenshot"), &screenshot_enabled);
-  if (video_consumer_ && screenshot_enabled) {
+  if (screenshot_enabled) {
     // Reset number of screenshots received, each time tracing begins.
     number_of_screenshots_from_video_consumer_ = 0;
     video_consumer_->SetMinAndMaxFrameSize(kMinFrameSize, kMaxFrameSize);
@@ -1082,8 +1073,7 @@
   }
   did_initiate_recording_ = false;
   g_any_agent_tracing = false;
-  if (video_consumer_)
-    video_consumer_->StopCapture();
+  video_consumer_->StopCapture();
 }
 
 bool TracingHandler::IsTracing() const {
diff --git a/content/browser/devtools/render_frame_devtools_agent_host.cc b/content/browser/devtools/render_frame_devtools_agent_host.cc
index 6e72582..df78c4f 100644
--- a/content/browser/devtools/render_frame_devtools_agent_host.cc
+++ b/content/browser/devtools/render_frame_devtools_agent_host.cc
@@ -66,7 +66,6 @@
 #include "third_party/blink/public/mojom/devtools/devtools_agent.mojom.h"
 
 #if BUILDFLAG(IS_ANDROID)
-#include "content/browser/devtools/devtools_frame_trace_recorder.h"
 #include "content/browser/renderer_host/compositor_impl_android.h"
 #include "content/public/browser/render_widget_host_view.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
@@ -368,13 +367,6 @@
 #endif  // !BUILDFLAG(IS_ANDROID)
 
   if (sessions().empty()) {
-#if BUILDFLAG(IS_ANDROID)
-    // With video capture API snapshots happen in TracingHandler. However, the
-    // video capture API cannot be used with Android WebView so
-    // DevToolsFrameTraceRecorder takes snapshots.
-    if (!CompositorImpl::IsInitialized())
-      frame_trace_recorder_ = std::make_unique<DevToolsFrameTraceRecorder>();
-#endif
     UpdateRawHeadersAccess(frame_host_);
 #if BUILDFLAG(IS_ANDROID)
     if (acquire_wake_lock)
@@ -387,9 +379,6 @@
 void RenderFrameDevToolsAgentHost::DetachSession(DevToolsSession* session) {
   // Destroying session automatically detaches in renderer.
   if (sessions().empty()) {
-#if BUILDFLAG(IS_ANDROID)
-    frame_trace_recorder_.reset();
-#endif
     UpdateRawHeadersAccess(frame_host_);
 #if BUILDFLAG(IS_ANDROID)
     GetWakeLock()->CancelWakeLock();
@@ -822,39 +811,6 @@
   return base::TimeTicks();
 }
 
-#if BUILDFLAG(IS_ANDROID)
-void RenderFrameDevToolsAgentHost::SignalSynchronousSwapCompositorFrame(
-    RenderFrameHost* frame_host,
-    const cc::RenderFrameMetadata& frame_metadata) {
-  scoped_refptr<RenderFrameDevToolsAgentHost> dtah(FindAgentHost(
-      static_cast<RenderFrameHostImpl*>(frame_host)->frame_tree_node()));
-  if (dtah) {
-    // Unblock the compositor.
-    GetUIThreadTaskRunner({})->PostTask(
-        FROM_HERE,
-        base::BindOnce(
-            &RenderFrameDevToolsAgentHost::SynchronousSwapCompositorFrame,
-            dtah.get(), frame_metadata));
-  }
-}
-
-void RenderFrameDevToolsAgentHost::SynchronousSwapCompositorFrame(
-    const cc::RenderFrameMetadata& frame_metadata) {
-  for (auto* page : protocol::PageHandler::ForAgentHost(this))
-    page->OnSynchronousSwapCompositorFrame(frame_metadata);
-
-  if (!frame_trace_recorder_)
-    return;
-  bool did_initiate_recording = false;
-  for (auto* tracing : protocol::TracingHandler::ForAgentHost(this))
-    did_initiate_recording |= tracing->did_initiate_recording();
-  if (did_initiate_recording) {
-    frame_trace_recorder_->OnSynchronousSwapCompositorFrame(frame_host_,
-                                                            frame_metadata);
-  }
-}
-#endif
-
 void RenderFrameDevToolsAgentHost::UpdateRendererChannel(bool force) {
   mojo::PendingAssociatedRemote<blink::mojom::DevToolsAgent> agent_remote;
   mojo::PendingAssociatedReceiver<blink::mojom::DevToolsAgentHost>
diff --git a/content/browser/devtools/render_frame_devtools_agent_host.h b/content/browser/devtools/render_frame_devtools_agent_host.h
index f796577..5a1ad9c 100644
--- a/content/browser/devtools/render_frame_devtools_agent_host.h
+++ b/content/browser/devtools/render_frame_devtools_agent_host.h
@@ -24,14 +24,9 @@
 #include "ui/android/view_android.h"
 #endif  // BUILDFLAG(IS_ANDROID)
 
-namespace cc {
-class RenderFrameMetadata;
-}
-
 namespace content {
 
 class BrowserContext;
-class DevToolsFrameTraceRecorder;
 class FencedFrame;
 class FrameTreeNode;
 class FrameAutoAttacher;
@@ -76,12 +71,6 @@
 
   static void AttachToWebContents(WebContents* web_contents);
 
-#if BUILDFLAG(IS_ANDROID)
-  static void SignalSynchronousSwapCompositorFrame(
-      RenderFrameHost* frame_host,
-      const cc::RenderFrameMetadata& frame_metadata);
-#endif
-
   FrameTreeNode* frame_tree_node() { return frame_tree_node_; }
 
   void OnNavigationRequestWillBeSent(
@@ -158,14 +147,11 @@
 
 #if BUILDFLAG(IS_ANDROID)
   device::mojom::WakeLock* GetWakeLock();
-  void SynchronousSwapCompositorFrame(
-      const cc::RenderFrameMetadata& frame_metadata);
 #endif
 
   void UpdateResourceLoaderFactories();
 
 #if BUILDFLAG(IS_ANDROID)
-  std::unique_ptr<DevToolsFrameTraceRecorder> frame_trace_recorder_;
   mojo::Remote<device::mojom::WakeLock> wake_lock_;
 #endif
 
diff --git a/content/browser/hid/hid_service_unittest.cc b/content/browser/hid/hid_service_unittest.cc
index 2f4f1c95..ae689105 100644
--- a/content/browser/hid/hid_service_unittest.cc
+++ b/content/browser/hid/hid_service_unittest.cc
@@ -16,6 +16,7 @@
 #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/test/back_forward_cache_util.h"
 #include "content/public/test/test_browser_context.h"
 #include "content/public/test/test_utils.h"
 #include "content/public/test/test_web_contents_factory.h"
@@ -350,9 +351,14 @@
   CheckWebContentsHidServiceConnectedState(service_creation_type, false);
 }
 
-// This test is disabled because it fails on the "linux-bfcache-rel" bot.
-// TODO(https://crbug.com/1232841): Re-enable this test.
-TEST_F(HidServiceRenderFrameHostTest, DISABLED_OpenAndNavigateCrossOrigin) {
+TEST_F(HidServiceRenderFrameHostTest, OpenAndNavigateCrossOrigin) {
+  // The test assumes the previous page gets deleted after navigation,
+  // disconnecting the device. Disable back/forward cache to ensure that it
+  // doesn't get preserved in the cache.
+  // TODO(crbug.com/1346021): Integrate WebHID with bfcache and remove this.
+  DisableBackForwardCacheForTesting(web_contents(),
+                                    BackForwardCache::TEST_REQUIRES_NO_CACHING);
+
   NavigateAndCommit(GURL(kTestUrl));
 
   mojo::Remote<blink::mojom::HidService> service;
diff --git a/content/browser/interest_group/ad_auction_service_impl.cc b/content/browser/interest_group/ad_auction_service_impl.cc
index 95ae319..f6205a9 100644
--- a/content/browser/interest_group/ad_auction_service_impl.cc
+++ b/content/browser/interest_group/ad_auction_service_impl.cc
@@ -126,7 +126,7 @@
       ContentBrowserClient::InterestGroupApiOperation::kLeave, owner);
 
   GetInterestGroupManager().CheckPermissionsAndLeaveInterestGroup(
-      owner, name, main_frame_origin_, origin(),
+      blink::InterestGroupKey(owner, name), main_frame_origin_, origin(),
       GetFrame()->GetNetworkIsolationKey(), report_result_only,
       *GetFrameURLLoaderFactory(), std::move(callback));
 }
@@ -177,7 +177,8 @@
   }
 
   GetInterestGroupManager().LeaveInterestGroup(
-      auction_data->interest_group_owner(), auction_data->interest_group_name(),
+      blink::InterestGroupKey(auction_data->interest_group_owner(),
+                              auction_data->interest_group_name()),
       main_frame_origin_);
 }
 
@@ -450,7 +451,7 @@
 void AdAuctionServiceImpl::OnAuctionComplete(
     RunAdAuctionCallback callback,
     AuctionRunner* auction,
-    absl::optional<AuctionRunner::InterestGroupKey> winning_group_id,
+    absl::optional<blink::InterestGroupKey> winning_group_id,
     absl::optional<GURL> render_url,
     std::vector<GURL> ad_component_urls,
     std::vector<GURL> report_urls,
diff --git a/content/browser/interest_group/ad_auction_service_impl.h b/content/browser/interest_group/ad_auction_service_impl.h
index 701878f..81e9d91 100644
--- a/content/browser/interest_group/ad_auction_service_impl.h
+++ b/content/browser/interest_group/ad_auction_service_impl.h
@@ -106,7 +106,7 @@
   void OnAuctionComplete(
       RunAdAuctionCallback callback,
       AuctionRunner* auction,
-      absl::optional<AuctionRunner::InterestGroupKey> winning_group_id,
+      absl::optional<blink::InterestGroupKey> winning_group_id,
       absl::optional<GURL> render_url,
       std::vector<GURL> ad_component_urls,
       std::vector<GURL> report_urls,
diff --git a/content/browser/interest_group/ad_auction_service_impl_unittest.cc b/content/browser/interest_group/ad_auction_service_impl_unittest.cc
index 5cb9bc7..afea172a 100644
--- a/content/browser/interest_group/ad_auction_service_impl_unittest.cc
+++ b/content/browser/interest_group/ad_auction_service_impl_unittest.cc
@@ -1990,6 +1990,7 @@
 "ads": [{"renderUrl": "https://example.com/new_render"
         }]
 })");
+  blink::InterestGroupKey originA_group_key(kOriginA, kInterestGroupName);
 
   blink::InterestGroup interest_group = CreateInterestGroup();
   interest_group.daily_update_url = kUpdateUrlA;
@@ -2006,9 +2007,9 @@
   EXPECT_EQ(1, GetJoinCount(kOriginA, kInterestGroupName));
 
   // Register 2 bids and a win.
-  manager_->RecordInterestGroupBid(kOriginA, kInterestGroupName);
-  manager_->RecordInterestGroupBid(kOriginA, kInterestGroupName);
-  manager_->RecordInterestGroupWin(kOriginA, kInterestGroupName, "{}");
+  manager_->RecordInterestGroupBids(blink::InterestGroupSet{originA_group_key});
+  manager_->RecordInterestGroupBids(blink::InterestGroupSet{originA_group_key});
+  manager_->RecordInterestGroupWin(originA_group_key, "{}");
 
   std::vector<StorageInterestGroup> prev_groups =
       GetInterestGroupsForOwner(kOriginA);
diff --git a/content/browser/interest_group/auction_runner.cc b/content/browser/interest_group/auction_runner.cc
index 85eaf76d..63f854d 100644
--- a/content/browser/interest_group/auction_runner.cc
+++ b/content/browser/interest_group/auction_runner.cc
@@ -395,7 +395,7 @@
 }
 
 void AuctionRunner::Auction::GetInterestGroupsThatBid(
-    InterestGroupSet& interest_groups) const {
+    blink::InterestGroupSet& interest_groups) const {
   if (!all_bids_scored_)
     return;
 
@@ -936,7 +936,8 @@
 
   if (has_set_priority) {
     interest_group_manager_->SetInterestGroupPriority(
-        state->bidder.interest_group.owner, state->bidder.interest_group.name,
+        blink::InterestGroupKey(state->bidder.interest_group.owner,
+                                state->bidder.interest_group.name),
         set_priority);
   }
 
@@ -1755,12 +1756,9 @@
 }
 
 void AuctionRunner::OnBidsGeneratedAndScored(bool success) {
-  InterestGroupSet interest_groups_that_bid;
+  blink::InterestGroupSet interest_groups_that_bid;
   auction_.GetInterestGroupsThatBid(interest_groups_that_bid);
-  for (const auto& interest_group : interest_groups_that_bid) {
-    interest_group_manager_->RecordInterestGroupBid(interest_group.owner,
-                                                    interest_group.name);
-  }
+  interest_group_manager_->RecordInterestGroupBids(interest_groups_that_bid);
   if (!success) {
     FailAuction();
     return;
@@ -1793,19 +1791,19 @@
                            auction_.top_bid()->bid->render_url.spec().c_str());
   }
 
-  interest_group_manager_->RecordInterestGroupWin(
-      auction_.top_bid()->bid->interest_group->owner,
-      auction_.top_bid()->bid->interest_group->name, ad_metadata);
+  DCHECK(auction_.top_bid()->bid->interest_group);
+  const blink::InterestGroup& winning_group =
+      *auction_.top_bid()->bid->interest_group;
+  blink::InterestGroupKey winning_group_key(
+      {winning_group.owner, winning_group.name});
+
+  interest_group_manager_->RecordInterestGroupWin(winning_group_key,
+                                                  ad_metadata);
 
   std::vector<GURL> debug_win_report_urls;
   std::vector<GURL> debug_loss_report_urls;
   auction_.TakeDebugReportUrls(debug_win_report_urls, debug_loss_report_urls);
 
-  DCHECK(auction_.top_bid()->bid->interest_group);
-  const blink::InterestGroup& winning_group =
-      *auction_.top_bid()->bid->interest_group;
-  InterestGroupKey winning_group_key({winning_group.owner, winning_group.name});
-
   UpdateInterestGroupsPostAuction();
 
   std::move(callback_).Run(
diff --git a/content/browser/interest_group/auction_runner.h b/content/browser/interest_group/auction_runner.h
index 58d4a8e9..a70e58d 100644
--- a/content/browser/interest_group/auction_runner.h
+++ b/content/browser/interest_group/auction_runner.h
@@ -46,21 +46,6 @@
 // the code to assign unique tracing IDs is not threadsafe.
 class CONTENT_EXPORT AuctionRunner {
  public:
-  // TODO(behamilton@google.com): Make this struct more broadly available to
-  // the rest of interest group code and adjust them to use it where
-  // appropriate.
-  struct InterestGroupKey {
-    InterestGroupKey(url::Origin o, std::string n) : owner(o), name(n) {}
-    inline bool operator<(const InterestGroupKey& other) const {
-      return owner != other.owner ? owner < other.owner : name < other.name;
-    }
-    inline bool operator==(const InterestGroupKey& other) const {
-      return owner == other.owner && name == other.name;
-    }
-    url::Origin owner;
-    std::string name;
-  };
-
   // Post auction signals (signals only available after auction completes such
   // as winning bid) for debug loss/win reporting.
   struct PostAuctionSignals {
@@ -109,16 +94,16 @@
   //
   // `errors` are various error messages to be used for debugging. These are too
   //  sensitive for the renderers to see.
-  using RunAuctionCallback =
-      base::OnceCallback<void(AuctionRunner* auction_runner,
-                              absl::optional<InterestGroupKey> winning_group_id,
-                              absl::optional<GURL> render_url,
-                              std::vector<GURL> ad_component_urls,
-                              std::vector<GURL> report_urls,
-                              std::vector<GURL> debug_loss_report_urls,
-                              std::vector<GURL> debug_win_report_urls,
-                              ReportingMetadata ad_beacon_map,
-                              std::vector<std::string> errors)>;
+  using RunAuctionCallback = base::OnceCallback<void(
+      AuctionRunner* auction_runner,
+      absl::optional<blink::InterestGroupKey> winning_group_id,
+      absl::optional<GURL> render_url,
+      std::vector<GURL> ad_component_urls,
+      std::vector<GURL> report_urls,
+      std::vector<GURL> debug_loss_report_urls,
+      std::vector<GURL> debug_win_report_urls,
+      ReportingMetadata ad_beacon_map,
+      std::vector<std::string> errors)>;
 
   // Returns true if `origin` is allowed to use the interest group API. Will be
   // called on worklet / interest group origins before using them in any
@@ -220,12 +205,6 @@
   void FailAuction();
 
  private:
-  // A set of interest groups, identified by owner and name. Used to log which
-  // interest groups bid in an auction. A sets is used to avoid double-counting
-  // interest groups that bid in multiple components auctions in a component
-  // auction.
-  using InterestGroupSet = std::set<InterestGroupKey>;
-
   class Auction;
 
   // TODO(mmenke): Move BidState, Bid, and ScoredBid into Auction.
@@ -469,7 +448,8 @@
     // than the seller rejecting all bids.
     //
     // TODO(mmenke): Consider calling this after the reporting phase.
-    void GetInterestGroupsThatBid(InterestGroupSet& interest_groups) const;
+    void GetInterestGroupsThatBid(
+        blink::InterestGroupSet& interest_groups) const;
 
     // Retrieves any debug reporting URLs. May only be called once, since it
     // takes ownership of stored reporting URLs.
@@ -820,7 +800,7 @@
 
     // A list of all interest groups that need to have their priority adjusted.
     // The new rates will be committed after a successful auction.
-    std::vector<std::pair<InterestGroupKey, double>>
+    std::vector<std::pair<blink::InterestGroupKey, double>>
         post_auction_priority_updates_;
 
     // The highest scoring bid so far. Null if no bid has been accepted yet.
diff --git a/content/browser/interest_group/auction_runner_unittest.cc b/content/browser/interest_group/auction_runner_unittest.cc
index 5484311a..d87a32f 100644
--- a/content/browser/interest_group/auction_runner_unittest.cc
+++ b/content/browser/interest_group/auction_runner_unittest.cc
@@ -60,7 +60,7 @@
 namespace content {
 namespace {
 
-using InterestGroupKey = AuctionRunner::InterestGroupKey;
+using InterestGroupKey = blink::InterestGroupKey;
 using PostAuctionSignals = AuctionRunner::PostAuctionSignals;
 using blink::mojom::ReportingDestination;
 
@@ -1560,12 +1560,14 @@
             bidder.interest_group, bidder.interest_group.owner.GetURL());
       }
       for (int i = 0; i < bidder.bidding_browser_signals->bid_count; i++) {
-        interest_group_manager_->RecordInterestGroupBid(
-            bidder.interest_group.owner, bidder.interest_group.name);
+        interest_group_manager_->RecordInterestGroupBids(
+            {blink::InterestGroupKey(bidder.interest_group.owner,
+                                     bidder.interest_group.name)});
       }
       for (const auto& prev_win : bidder.bidding_browser_signals->prev_wins) {
         interest_group_manager_->RecordInterestGroupWin(
-            bidder.interest_group.owner, bidder.interest_group.name,
+            InterestGroupKey(bidder.interest_group.owner,
+                             bidder.interest_group.name),
             prev_win->ad_json);
         // Add some time between interest group wins, so that they'll be added
         // to the database in the order they appear. Their times will *not*
diff --git a/content/browser/interest_group/interest_group_manager_impl.cc b/content/browser/interest_group/interest_group_manager_impl.cc
index 04d3c61..7d19d61 100644
--- a/content/browser/interest_group/interest_group_manager_impl.cc
+++ b/content/browser/interest_group/interest_group_manager_impl.cc
@@ -139,8 +139,7 @@
 }
 
 void InterestGroupManagerImpl::CheckPermissionsAndLeaveInterestGroup(
-    const url::Origin& owner,
-    const std::string& name,
+    const blink::InterestGroupKey& group_key,
     const url::Origin& main_frame,
     const url::Origin& frame_origin,
     const net::NetworkIsolationKey& network_isolation_key,
@@ -148,11 +147,11 @@
     network::mojom::URLLoaderFactory& url_loader_factory,
     blink::mojom::AdAuctionService::LeaveInterestGroupCallback callback) {
   permissions_checker_.CheckPermissions(
-      InterestGroupPermissionsChecker::Operation::kLeave, frame_origin, owner,
-      network_isolation_key, url_loader_factory,
+      InterestGroupPermissionsChecker::Operation::kLeave, frame_origin,
+      group_key.owner, network_isolation_key, url_loader_factory,
       base::BindOnce(
           &InterestGroupManagerImpl::OnLeaveInterestGroupPermissionsChecked,
-          base::Unretained(this), owner, name, main_frame, report_result_only,
+          base::Unretained(this), group_key, main_frame, report_result_only,
           std::move(callback)));
 }
 
@@ -165,13 +164,12 @@
 }
 
 void InterestGroupManagerImpl::LeaveInterestGroup(
-    const ::url::Origin& owner,
-    const std::string& name,
+    const blink::InterestGroupKey& group_key,
     const ::url::Origin& main_frame) {
   NotifyInterestGroupAccessed(InterestGroupObserverInterface::kLeave,
-                              owner.Serialize(), name);
+                              group_key.owner.Serialize(), group_key.name);
   impl_.AsyncCall(&InterestGroupStorage::LeaveInterestGroup)
-      .WithArgs(owner, name, main_frame);
+      .WithArgs(group_key, main_frame);
 }
 
 void InterestGroupManagerImpl::UpdateInterestGroupsOfOwner(
@@ -199,31 +197,36 @@
       max_parallel_updates);
 }
 
-void InterestGroupManagerImpl::RecordInterestGroupBid(
-    const ::url::Origin& owner,
-    const std::string& name) {
-  NotifyInterestGroupAccessed(InterestGroupObserverInterface::kBid,
-                              owner.Serialize(), name);
-  impl_.AsyncCall(&InterestGroupStorage::RecordInterestGroupBid)
-      .WithArgs(owner, name);
+void InterestGroupManagerImpl::RecordInterestGroupBids(
+    const blink::InterestGroupSet& group_keys) {
+  for (const auto& group_key : group_keys) {
+    NotifyInterestGroupAccessed(InterestGroupObserverInterface::kBid,
+                                group_key.owner.Serialize(), group_key.name);
+  }
+  impl_.AsyncCall(&InterestGroupStorage::RecordInterestGroupBids)
+      .WithArgs(group_keys);
 }
 
 void InterestGroupManagerImpl::RecordInterestGroupWin(
-    const ::url::Origin& owner,
-    const std::string& name,
+    const blink::InterestGroupKey& group_key,
     const std::string& ad_json) {
   NotifyInterestGroupAccessed(InterestGroupObserverInterface::kWin,
-                              owner.Serialize(), name);
+                              group_key.owner.Serialize(), group_key.name);
   impl_.AsyncCall(&InterestGroupStorage::RecordInterestGroupWin)
-      .WithArgs(owner, name, std::move(ad_json));
+      .WithArgs(group_key, std::move(ad_json));
 }
 
 void InterestGroupManagerImpl::GetInterestGroup(
     const url::Origin& owner,
     const std::string& name,
     base::OnceCallback<void(absl::optional<StorageInterestGroup>)> callback) {
+  GetInterestGroup(blink::InterestGroupKey(owner, name), std::move(callback));
+}
+void InterestGroupManagerImpl::GetInterestGroup(
+    const blink::InterestGroupKey& group_key,
+    base::OnceCallback<void(absl::optional<StorageInterestGroup>)> callback) {
   impl_.AsyncCall(&InterestGroupStorage::GetInterestGroup)
-      .WithArgs(owner, name)
+      .WithArgs(group_key)
       .Then(std::move(callback));
 }
 
@@ -272,8 +275,7 @@
 }
 
 void InterestGroupManagerImpl::OnLeaveInterestGroupPermissionsChecked(
-    const url::Origin& owner,
-    const std::string& name,
+    const blink::InterestGroupKey& group_key,
     const url::Origin& main_frame,
     bool report_result_only,
     blink::mojom::AdAuctionService::LeaveInterestGroupCallback callback,
@@ -287,7 +289,7 @@
   // in the InterestGroup through timing differences.
   std::move(callback).Run(/*failed_well_known_check=*/!can_leave);
   if (!report_result_only && can_leave)
-    LeaveInterestGroup(owner, name, main_frame);
+    LeaveInterestGroup(group_key, main_frame);
 }
 
 void InterestGroupManagerImpl::GetInterestGroupsForUpdate(
@@ -300,22 +302,21 @@
 }
 
 void InterestGroupManagerImpl::UpdateInterestGroup(
-    const url::Origin& owner,
-    const std::string& name,
+    const blink::InterestGroupKey& group_key,
     InterestGroupUpdate update,
     base::OnceCallback<void(bool)> callback) {
   NotifyInterestGroupAccessed(InterestGroupObserverInterface::kUpdate,
-                              owner.Serialize(), name);
+                              group_key.owner.Serialize(), group_key.name);
   impl_.AsyncCall(&InterestGroupStorage::UpdateInterestGroup)
-      .WithArgs(owner, name, std::move(update))
+      .WithArgs(group_key, std::move(update))
       .Then(std::move(callback));
 }
 
-void InterestGroupManagerImpl::ReportUpdateFailed(const url::Origin& owner,
-                                                  const std::string& name,
-                                                  bool parse_failure) {
+void InterestGroupManagerImpl::ReportUpdateFailed(
+    const blink::InterestGroupKey& group_key,
+    bool parse_failure) {
   impl_.AsyncCall(&InterestGroupStorage::ReportUpdateFailed)
-      .WithArgs(owner, name, parse_failure);
+      .WithArgs(group_key, parse_failure);
 }
 
 void InterestGroupManagerImpl::NotifyInterestGroupAccessed(
@@ -460,11 +461,10 @@
 }
 
 void InterestGroupManagerImpl::SetInterestGroupPriority(
-    const url::Origin& owner,
-    const std::string& name,
+    const blink::InterestGroupKey& group_key,
     double priority) {
   impl_.AsyncCall(&InterestGroupStorage::SetInterestGroupPriority)
-      .WithArgs(owner, name, priority);
+      .WithArgs(group_key, priority);
 }
 
 void InterestGroupManagerImpl::set_max_report_queue_length_for_testing(
diff --git a/content/browser/interest_group/interest_group_manager_impl.h b/content/browser/interest_group/interest_group_manager_impl.h
index a1c39d61..e7d2d671 100644
--- a/content/browser/interest_group/interest_group_manager_impl.h
+++ b/content/browser/interest_group/interest_group_manager_impl.h
@@ -116,8 +116,7 @@
   // Same as CheckPermissionsAndJoinInterestGroup(), except for a leave
   // operation.
   void CheckPermissionsAndLeaveInterestGroup(
-      const url::Origin& owner,
-      const std::string& name,
+      const blink::InterestGroupKey& group_key,
       const url::Origin& main_frame,
       const url::Origin& frame_origin,
       const net::NetworkIsolationKey& network_isolation_key,
@@ -131,8 +130,7 @@
   // record for this interest group is created.
   void JoinInterestGroup(blink::InterestGroup group, const GURL& joining_url);
   // Remove the interest group if it exists.
-  void LeaveInterestGroup(const url::Origin& owner,
-                          const std::string& name,
+  void LeaveInterestGroup(const blink::InterestGroupKey& group_key,
                           const url::Origin& main_frame);
   // Loads all interest groups owned by `owner`, then updates their definitions
   // by fetching their `dailyUpdateUrl`. Interest group updates that fail to
@@ -154,15 +152,17 @@
   // updated at the same time.
   void set_max_parallel_updates_for_testing(int max_parallel_updates);
   // Adds an entry to the bidding history for this interest group.
-  void RecordInterestGroupBid(const url::Origin& owner,
-                              const std::string& name);
+  void RecordInterestGroupBids(const blink::InterestGroupSet& groups);
   // Adds an entry to the win history for this interest group. `ad_json` is a
   // piece of opaque data to identify the winning ad.
-  void RecordInterestGroupWin(const ::url::Origin& owner,
-                              const std::string& name,
+  void RecordInterestGroupWin(const blink::InterestGroupKey& group_key,
                               const std::string& ad_json);
   // Gets a single interest group.
   void GetInterestGroup(
+      const blink::InterestGroupKey& group_key,
+      base::OnceCallback<void(absl::optional<StorageInterestGroup>)> callback);
+  // Gets a single interest group.
+  void GetInterestGroup(
       const url::Origin& owner,
       const std::string& name,
       base::OnceCallback<void(absl::optional<StorageInterestGroup>)> callback);
@@ -192,8 +192,7 @@
       network::mojom::ClientSecurityStatePtr client_security_state,
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
   // Update the interest group priority.
-  void SetInterestGroupPriority(const url::Origin& owner,
-                                const std::string& name,
+  void SetInterestGroupPriority(const blink::InterestGroupKey& group,
                                 double priority);
 
   // Clears the InterestGroupPermissionsChecker's cache of the results of
@@ -274,8 +273,7 @@
       blink::mojom::AdAuctionService::JoinInterestGroupCallback callback,
       bool can_join);
   void OnLeaveInterestGroupPermissionsChecked(
-      const url::Origin& owner,
-      const std::string& name,
+      const blink::InterestGroupKey& group_key,
       const url::Origin& main_frame,
       bool report_result_only,
       blink::mojom::AdAuctionService::LeaveInterestGroupCallback callback,
@@ -304,8 +302,7 @@
   // success or failure.
   //
   // To be called only by `update_manager_`.
-  void UpdateInterestGroup(const url::Origin& owner,
-                           const std::string& name,
+  void UpdateInterestGroup(const blink::InterestGroupKey& group_key,
                            InterestGroupUpdate update,
                            base::OnceCallback<void(bool)> callback);
 
@@ -313,8 +310,7 @@
   // for parse failure.
   //
   // To be called only by `update_manager_`.
-  void ReportUpdateFailed(const url::Origin& owner,
-                          const std::string& name,
+  void ReportUpdateFailed(const blink::InterestGroupKey& group_key,
                           bool parse_failure);
   void NotifyInterestGroupAccessed(
       InterestGroupObserverInterface::AccessType type,
diff --git a/content/browser/interest_group/interest_group_permissions_checker_unittest.cc b/content/browser/interest_group/interest_group_permissions_checker_unittest.cc
index fd7a4438..3923505 100644
--- a/content/browser/interest_group/interest_group_permissions_checker_unittest.cc
+++ b/content/browser/interest_group/interest_group_permissions_checker_unittest.cc
@@ -316,8 +316,8 @@
   // NetworkIsolationKey.
   const url::Origin kOtherFrameOrigin =
       url::Origin::Create(GURL("https://other.frame.test"));
-  DCHECK_EQ(net::NetworkIsolationKey(kOtherFrameOrigin, kOtherFrameOrigin),
-            kNetworkIsolationKey);
+  DCHECK(net::NetworkIsolationKey(kOtherFrameOrigin, kOtherFrameOrigin) ==
+         kNetworkIsolationKey);
   const GURL kOtherValidationUrl(
       "https://group.test/.well-known/interest-group/permissions/"
       "?origin=https%3A%2F%2Fother.frame.test");
diff --git a/content/browser/interest_group/interest_group_storage.cc b/content/browser/interest_group/interest_group_storage.cc
index 62408f5..3fed1f4 100644
--- a/content/browser/interest_group/interest_group_storage.cc
+++ b/content/browser/interest_group/interest_group_storage.cc
@@ -508,8 +508,7 @@
 }
 
 bool RemoveJoinHistory(sql::Database& db,
-                       const url::Origin& owner,
-                       const std::string& name) {
+                       const blink::InterestGroupKey& group_key) {
   sql::Statement remove_join_history(
       db.GetCachedStatement(SQL_FROM_HERE,
                             "DELETE FROM join_history "
@@ -518,14 +517,13 @@
     return false;
 
   remove_join_history.Reset(true);
-  remove_join_history.BindString(0, Serialize(owner));
-  remove_join_history.BindString(1, name);
+  remove_join_history.BindString(0, Serialize(group_key.owner));
+  remove_join_history.BindString(1, group_key.name);
   return remove_join_history.Run();
 }
 
 bool RemoveBidHistory(sql::Database& db,
-                      const url::Origin& owner,
-                      const std::string& name) {
+                      const blink::InterestGroupKey& group_key) {
   sql::Statement remove_bid_history(
       db.GetCachedStatement(SQL_FROM_HERE,
                             "DELETE FROM bid_history "
@@ -534,14 +532,13 @@
     return false;
 
   remove_bid_history.Reset(true);
-  remove_bid_history.BindString(0, Serialize(owner));
-  remove_bid_history.BindString(1, name);
+  remove_bid_history.BindString(0, Serialize(group_key.owner));
+  remove_bid_history.BindString(1, group_key.name);
   return remove_bid_history.Run();
 }
 
 bool RemoveWinHistory(sql::Database& db,
-                      const url::Origin& owner,
-                      const std::string& name) {
+                      const blink::InterestGroupKey& group_key) {
   sql::Statement remove_win_history(
       db.GetCachedStatement(SQL_FROM_HERE,
                             "DELETE FROM win_history "
@@ -550,24 +547,23 @@
     return false;
 
   remove_win_history.Reset(true);
-  remove_win_history.BindString(0, Serialize(owner));
-  remove_win_history.BindString(1, name);
+  remove_win_history.BindString(0, Serialize(group_key.owner));
+  remove_win_history.BindString(1, group_key.name);
   return remove_win_history.Run();
 }
 
 bool DoRemoveInterestGroup(sql::Database& db,
-                           const url::Origin& owner,
-                           const std::string& name) {
+                           const blink::InterestGroupKey& group_key) {
   sql::Transaction transaction(&db);
   if (!transaction.Begin())
     return false;
 
   // These tables have foreign keys that reference the interest group table.
-  if (!RemoveJoinHistory(db, owner, name))
+  if (!RemoveJoinHistory(db, group_key))
     return false;
-  if (!RemoveBidHistory(db, owner, name))
+  if (!RemoveBidHistory(db, group_key))
     return false;
-  if (!RemoveWinHistory(db, owner, name))
+  if (!RemoveWinHistory(db, group_key))
     return false;
 
   sql::Statement remove_group(
@@ -578,8 +574,8 @@
     return false;
 
   remove_group.Reset(true);
-  remove_group.BindString(0, Serialize(owner));
-  remove_group.BindString(1, name);
+  remove_group.BindString(0, Serialize(group_key.owner));
+  remove_group.BindString(1, group_key.name);
   return remove_group.Run() && transaction.Commit();
 }
 
@@ -609,15 +605,16 @@
              blink::InterestGroup::ExecutionMode::kGroupedByOriginMode));
 
   while (same_cluster_groups.Step()) {
-    if (!DoRemoveInterestGroup(db, owner, same_cluster_groups.ColumnString(0)))
+    if (!DoRemoveInterestGroup(
+            db, blink::InterestGroupKey(owner,
+                                        same_cluster_groups.ColumnString(0))))
       return false;
   }
   return transaction.Commit();
 }
 
 bool DoLoadInterestGroup(sql::Database& db,
-                         const url::Origin& owner,
-                         const std::string& name,
+                         const blink::InterestGroupKey& group_key,
                          blink::InterestGroup& group,
                          url::Origin* joining_origin,
                          base::Time* last_updated) {
@@ -645,15 +642,15 @@
     return false;
 
   load.Reset(true);
-  load.BindString(0, Serialize(owner));
-  load.BindString(1, name);
+  load.BindString(0, Serialize(group_key.owner));
+  load.BindString(1, group_key.name);
 
   if (!load.Step() || !load.Succeeded())
     return false;
 
   group.expiry = load.ColumnTime(0);
-  group.owner = owner;
-  group.name = name;
+  group.owner = group_key.owner;
+  group.name = group_key.name;
   if (joining_origin)
     *joining_origin = DeserializeOrigin(load.ColumnString(1));
   if (last_updated)
@@ -688,8 +685,8 @@
 
   blink::InterestGroup old_group;
   url::Origin old_joining_origin;
-  if (DoLoadInterestGroup(db, data.owner, data.name, old_group,
-                          &old_joining_origin, nullptr) &&
+  if (DoLoadInterestGroup(db, blink::InterestGroupKey(data.owner, data.name),
+                          old_group, &old_joining_origin, nullptr) &&
       old_group.execution_mode ==
           blink::InterestGroup::ExecutionMode::kGroupedByOriginMode &&
       joining_origin != old_joining_origin) {
@@ -820,8 +817,7 @@
 }
 
 bool DoUpdateInterestGroup(sql::Database& db,
-                           const url::Origin& owner,
-                           const std::string& name,
+                           const blink::InterestGroupKey& group_key,
                            InterestGroupUpdate update,
                            base::Time now) {
   sql::Transaction transaction(&db);
@@ -838,7 +834,7 @@
   // verify the interest group is valid before writing it to the database.
 
   blink::InterestGroup stored_group;
-  if (!DoLoadInterestGroup(db, owner, name, stored_group,
+  if (!DoLoadInterestGroup(db, group_key, stored_group,
                            /*joining_origin=*/nullptr,
                            /*last_updated=*/nullptr)) {
     return false;
@@ -886,8 +882,7 @@
 }
 
 bool DoReportUpdateFailed(sql::Database& db,
-                          const url::Origin& owner,
-                          const std::string& name,
+                          const blink::InterestGroupKey& group_key,
                           bool parse_failure,
                           base::Time now) {
   sql::Statement update_group(db.GetCachedStatement(SQL_FROM_HERE, R"(
@@ -907,16 +902,15 @@
     update_group.BindTime(
         0, now + InterestGroupStorage::kUpdateFailedBackoffPeriod);
   }
-  update_group.BindString(1, Serialize(owner));
-  update_group.BindString(2, name);
+  update_group.BindString(1, Serialize(group_key.owner));
+  update_group.BindString(2, group_key.name);
 
   return update_group.Run();
 }
 
-bool DoRecordInterestGroupBid(sql::Database& db,
-                              const url::Origin& owner,
-                              const std::string& name,
-                              base::Time bid_time) {
+bool DoRecordInterestGroupBids(sql::Database& db,
+                               const blink::InterestGroupSet& group_keys,
+                               base::Time bid_time) {
   // Record the bid. It should be unique since auctions should be serialized.
   // If it is not unique we should just keep the first one.
   // clang-format off
@@ -928,16 +922,23 @@
   if (!bid_hist.is_valid())
     return false;
 
-  bid_hist.Reset(true);
-  bid_hist.BindString(0, Serialize(owner));
-  bid_hist.BindString(1, name);
-  bid_hist.BindTime(2, bid_time);
-  return bid_hist.Run();
+  sql::Transaction transaction(&db);
+  if (!transaction.Begin())
+    return false;
+
+  for (const auto& group_key : group_keys) {
+    bid_hist.Reset(true);
+    bid_hist.BindString(0, Serialize(group_key.owner));
+    bid_hist.BindString(1, group_key.name);
+    bid_hist.BindTime(2, bid_time);
+    if (!bid_hist.Run())
+      return false;
+  }
+  return transaction.Commit();
 }
 
 bool DoRecordInterestGroupWin(sql::Database& db,
-                              const url::Origin& owner,
-                              const std::string& name,
+                              const blink::InterestGroupKey& group_key,
                               const std::string& ad_json,
                               base::Time win_time) {
   // Record the win. It should be unique since auctions should be serialized.
@@ -952,8 +953,8 @@
     return false;
 
   win_hist.Reset(true);
-  win_hist.BindString(0, Serialize(owner));
-  win_hist.BindString(1, name);
+  win_hist.BindString(0, Serialize(group_key.owner));
+  win_hist.BindString(1, group_key.name);
   win_hist.BindTime(2, win_time);
   win_hist.BindString(3, ad_json);
   return win_hist.Run();
@@ -1115,8 +1116,7 @@
 }
 
 bool GetPreviousWins(sql::Database& db,
-                     const url::Origin& owner,
-                     const std::string& name,
+                     const blink::InterestGroupKey& group_key,
                      base::Time win_time_after,
                      BiddingBrowserSignalsPtr& output) {
   // clang-format off
@@ -1134,8 +1134,8 @@
     return false;
   }
   prev_wins.Reset(true);
-  prev_wins.BindString(0, Serialize(owner));
-  prev_wins.BindString(1, name);
+  prev_wins.BindString(0, Serialize(group_key.owner));
+  prev_wins.BindString(1, group_key.name);
   prev_wins.BindTime(2, win_time_after);
   while (prev_wins.Step()) {
     PreviousWinPtr prev_win = auction_worklet::mojom::PreviousWin::New(
@@ -1147,8 +1147,7 @@
 }
 
 bool GetJoinCount(sql::Database& db,
-                  const url::Origin& owner,
-                  const std::string& name,
+                  const blink::InterestGroupKey& group_key,
                   base::Time joined_after,
                   BiddingBrowserSignalsPtr& output) {
   // clang-format off
@@ -1164,8 +1163,8 @@
     return false;
   }
   join_count.Reset(true);
-  join_count.BindString(0, Serialize(owner));
-  join_count.BindString(1, name);
+  join_count.BindString(0, Serialize(group_key.owner));
+  join_count.BindString(1, group_key.name);
   join_count.BindTime(2, joined_after);
   while (join_count.Step()) {
     output->join_count = join_count.ColumnInt64(0);
@@ -1174,8 +1173,7 @@
 }
 
 bool GetBidCount(sql::Database& db,
-                 const url::Origin& owner,
-                 const std::string& name,
+                 const blink::InterestGroupKey& group_key,
                  base::Time now,
                  BiddingBrowserSignalsPtr& output) {
   // clang-format off
@@ -1191,8 +1189,8 @@
     return false;
   }
   bid_count.Reset(true);
-  bid_count.BindString(0, Serialize(owner));
-  bid_count.BindString(1, name);
+  bid_count.BindString(0, Serialize(group_key.owner));
+  bid_count.BindString(1, group_key.name);
   bid_count.BindTime(2, now - InterestGroupStorage::kHistoryLength);
   while (bid_count.Step()) {
     output->bid_count = bid_count.ColumnInt64(0);
@@ -1234,18 +1232,16 @@
 
 absl::optional<StorageInterestGroup> DoGetStoredInterestGroup(
     sql::Database& db,
-    const url::Origin owner,
-    std::string name,
+    const blink::InterestGroupKey& group_key,
     base::Time now) {
   StorageInterestGroup db_interest_group;
-  if (!DoLoadInterestGroup(db, owner, name, db_interest_group.interest_group,
+  if (!DoLoadInterestGroup(db, group_key, db_interest_group.interest_group,
                            &db_interest_group.joining_origin,
                            &db_interest_group.last_updated)) {
     return absl::nullopt;
   }
 
-  if (!DoGetInterestGroupNameKAnonymity(db, owner,
-                                        db_interest_group.interest_group.name,
+  if (!DoGetInterestGroupNameKAnonymity(db, group_key.owner, group_key.name,
                                         db_interest_group.name_kanon)) {
     return absl::nullopt;
   }
@@ -1280,15 +1276,15 @@
 
   db_interest_group.bidding_browser_signals =
       auction_worklet::mojom::BiddingBrowserSignals::New();
-  if (!GetJoinCount(db, owner, name, now - InterestGroupStorage::kHistoryLength,
+  if (!GetJoinCount(db, group_key, now - InterestGroupStorage::kHistoryLength,
                     db_interest_group.bidding_browser_signals)) {
     return absl::nullopt;
   }
-  if (!GetBidCount(db, owner, name, now - InterestGroupStorage::kHistoryLength,
+  if (!GetBidCount(db, group_key, now - InterestGroupStorage::kHistoryLength,
                    db_interest_group.bidding_browser_signals)) {
     return absl::nullopt;
   }
-  if (!GetPreviousWins(db, owner, name,
+  if (!GetPreviousWins(db, group_key,
                        now - InterestGroupStorage::kHistoryLength,
                        db_interest_group.bidding_browser_signals)) {
     return absl::nullopt;
@@ -1317,7 +1313,7 @@
   std::vector<StorageInterestGroup> result;
   for (const std::string& name : *group_names) {
     absl::optional<StorageInterestGroup> db_interest_group =
-        DoGetStoredInterestGroup(db, owner, name, now);
+        DoGetStoredInterestGroup(db, blink::InterestGroupKey(owner, name), now);
     if (!db_interest_group)
       return absl::nullopt;
     result.push_back(std::move(db_interest_group).value());
@@ -1329,11 +1325,11 @@
   return result;
 }
 
-absl::optional<std::vector<std::pair<url::Origin, std::string>>>
+absl::optional<std::vector<blink::InterestGroupKey>>
 DoGetInterestGroupNamesForJoiningOrigin(sql::Database& db,
                                         const url::Origin& joining_origin,
                                         base::Time now) {
-  std::vector<std::pair<url::Origin, std::string>> result;
+  std::vector<blink::InterestGroupKey> result;
 
   // clang-format off
   sql::Statement load(
@@ -1393,7 +1389,8 @@
     if (!maybe_group_names)
       return false;
     for (const auto& group_name : maybe_group_names.value()) {
-      if (!DoRemoveInterestGroup(db, affected_origin, group_name))
+      if (!DoRemoveInterestGroup(
+              db, blink::InterestGroupKey(affected_origin, group_name)))
         return false;
     }
   }
@@ -1409,14 +1406,13 @@
     }
   }
   for (const auto& affected_origin : affected_origins) {
-    absl::optional<std::vector<std::pair<url::Origin, std::string>>>
-        maybe_group_names = DoGetInterestGroupNamesForJoiningOrigin(
-            db, affected_origin, distant_past);
+    absl::optional<std::vector<blink::InterestGroupKey>> maybe_group_names =
+        DoGetInterestGroupNamesForJoiningOrigin(db, affected_origin,
+                                                distant_past);
     if (!maybe_group_names)
       return false;
     for (const auto& interest_group_key : maybe_group_names.value()) {
-      if (!DoRemoveInterestGroup(db, interest_group_key.first,
-                                 interest_group_key.second)) {
+      if (!DoRemoveInterestGroup(db, interest_group_key)) {
         return false;
       }
     }
@@ -1426,8 +1422,7 @@
 }
 
 bool DoSetInterestGroupPriority(sql::Database& db,
-                                const url::Origin& owner,
-                                const std::string& name,
+                                const blink::InterestGroupKey& group_key,
                                 double priority) {
   // clang-format off
   sql::Statement set_priority_sql(
@@ -1442,8 +1437,8 @@
   }
   set_priority_sql.Reset(true);
   set_priority_sql.BindDouble(0, priority);
-  set_priority_sql.BindString(1, Serialize(owner));
-  set_priority_sql.BindString(2, name);
+  set_priority_sql.BindString(1, Serialize(group_key.owner));
+  set_priority_sql.BindString(2, group_key.name);
   return set_priority_sql.Run();
 }
 
@@ -1517,8 +1512,10 @@
       first_idx = 0;
     for (size_t group_idx = first_idx;
          group_idx < maybe_interest_groups.value().size(); group_idx++) {
-      if (!DoRemoveInterestGroup(db, affected_origin,
-                                 maybe_interest_groups.value()[group_idx])) {
+      if (!DoRemoveInterestGroup(
+              db,
+              blink::InterestGroupKey(
+                  affected_origin, maybe_interest_groups.value()[group_idx]))) {
         return false;
       }
     }
@@ -1544,7 +1541,7 @@
 
   expired_interest_group.Reset(true);
   expired_interest_group.BindTime(0, expiration_before);
-  std::vector<std::pair<url::Origin, std::string>> expired_groups;
+  std::vector<blink::InterestGroupKey> expired_groups;
   while (expired_interest_group.Step()) {
     expired_groups.emplace_back(
         DeserializeOrigin(expired_interest_group.ColumnString(0)),
@@ -1555,7 +1552,7 @@
     // Keep going so we can clear any groups that we did get.
   }
   for (const auto& interest_group : expired_groups) {
-    if (!DoRemoveInterestGroup(db, interest_group.first, interest_group.second))
+    if (!DoRemoveInterestGroup(db, interest_group))
       return false;
   }
   return transaction.Commit();
@@ -1763,41 +1760,42 @@
     DLOG(ERROR) << "Could not join interest group: " << db_->GetErrorMessage();
 }
 
-void InterestGroupStorage::LeaveInterestGroup(const url::Origin& owner,
-                                              const std::string& name,
-                                              const url::Origin& main_frame) {
+void InterestGroupStorage::LeaveInterestGroup(
+    const blink::InterestGroupKey& group_key,
+    const url::Origin& main_frame) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!EnsureDBInitialized())
     return;
 
   blink::InterestGroup old_group;
   url::Origin old_joining_origin;
-  if (DoLoadInterestGroup(*db_, owner, name, old_group, &old_joining_origin,
+  if (DoLoadInterestGroup(*db_, group_key, old_group, &old_joining_origin,
                           nullptr) &&
       old_group.execution_mode ==
           blink::InterestGroup::ExecutionMode::kGroupedByOriginMode &&
       main_frame != old_joining_origin) {
     // Clear all interest groups with same owner and mode GroupedByOriginMode
     // and same old_joining_origin.
-    if (!DoClearClusteredBiddingGroups(*db_, owner, old_joining_origin))
+    if (!DoClearClusteredBiddingGroups(*db_, group_key.owner,
+                                       old_joining_origin))
       DLOG(ERROR) << "Could not leave interest group: "
                   << db_->GetErrorMessage();
     return;
   }
 
-  if (!DoRemoveInterestGroup(*db_, owner, name))
+  if (!DoRemoveInterestGroup(*db_, group_key))
     DLOG(ERROR) << "Could not leave interest group: " << db_->GetErrorMessage();
 }
 
-bool InterestGroupStorage::UpdateInterestGroup(const url::Origin& owner,
-                                               const std::string& name,
-                                               InterestGroupUpdate update) {
+bool InterestGroupStorage::UpdateInterestGroup(
+    const blink::InterestGroupKey& group_key,
+    InterestGroupUpdate update) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!EnsureDBInitialized())
     return false;
 
   bool success =
-      DoUpdateInterestGroup(*db_, owner, name, update, base::Time::Now());
+      DoUpdateInterestGroup(*db_, group_key, update, base::Time::Now());
   if (!success) {
     DLOG(ERROR) << "Could not update interest group: "
                 << db_->GetErrorMessage();
@@ -1805,43 +1803,42 @@
   return success;
 }
 
-void InterestGroupStorage::ReportUpdateFailed(const url::Origin& owner,
-                                              const std::string& name,
-                                              bool parse_failure) {
+void InterestGroupStorage::ReportUpdateFailed(
+    const blink::InterestGroupKey& group_key,
+    bool parse_failure) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!EnsureDBInitialized()) {
     NOTREACHED();  // We already fetched interest groups to update...
     return;
   }
 
-  if (!DoReportUpdateFailed(*db_, owner, name, parse_failure,
+  if (!DoReportUpdateFailed(*db_, group_key, parse_failure,
                             base::Time::Now())) {
     DLOG(ERROR) << "Couldn't update next_update_after: "
                 << db_->GetErrorMessage();
   }
 }
 
-void InterestGroupStorage::RecordInterestGroupBid(const url::Origin& owner,
-                                                  const std::string& name) {
+void InterestGroupStorage::RecordInterestGroupBids(
+    const blink::InterestGroupSet& group_keys) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!EnsureDBInitialized())
     return;
 
-  if (!DoRecordInterestGroupBid(*db_, owner, name, base::Time::Now())) {
+  if (!DoRecordInterestGroupBids(*db_, group_keys, base::Time::Now())) {
     DLOG(ERROR) << "Could not record win for interest group: "
                 << db_->GetErrorMessage();
   }
 }
 
-void InterestGroupStorage::RecordInterestGroupWin(const url::Origin& owner,
-                                                  const std::string& name,
-                                                  const std::string& ad_json) {
+void InterestGroupStorage::RecordInterestGroupWin(
+    const blink::InterestGroupKey& group_key,
+    const std::string& ad_json) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!EnsureDBInitialized())
     return;
 
-  if (!DoRecordInterestGroupWin(*db_, owner, name, ad_json,
-                                base::Time::Now())) {
+  if (!DoRecordInterestGroupWin(*db_, group_key, ad_json, base::Time::Now())) {
     DLOG(ERROR) << "Could not record bid for interest group: "
                 << db_->GetErrorMessage();
   }
@@ -1887,13 +1884,12 @@
 }
 
 absl::optional<StorageInterestGroup> InterestGroupStorage::GetInterestGroup(
-    const url::Origin& owner,
-    const std::string& name) {
+    const blink::InterestGroupKey& group_key) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!EnsureDBInitialized())
     return absl::nullopt;
 
-  return DoGetStoredInterestGroup(*db_, owner, name, base::Time::Now());
+  return DoGetStoredInterestGroup(*db_, group_key, base::Time::Now());
 }
 
 std::vector<url::Origin> InterestGroupStorage::GetAllInterestGroupOwners() {
@@ -1964,14 +1960,14 @@
   }
 }
 
-void InterestGroupStorage::SetInterestGroupPriority(const url::Origin& owner,
-                                                    const std::string& name,
-                                                    double priority) {
+void InterestGroupStorage::SetInterestGroupPriority(
+    const blink::InterestGroupKey& group_key,
+    double priority) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!EnsureDBInitialized())
     return;
 
-  if (!DoSetInterestGroupPriority(*db_, owner, name, priority)) {
+  if (!DoSetInterestGroupPriority(*db_, group_key, priority)) {
     DLOG(ERROR) << "Could not set interest group priority: "
                 << db_->GetErrorMessage();
   }
diff --git a/content/browser/interest_group/interest_group_storage.h b/content/browser/interest_group/interest_group_storage.h
index 5673249..59f93d9 100644
--- a/content/browser/interest_group/interest_group_storage.h
+++ b/content/browser/interest_group/interest_group_storage.h
@@ -60,32 +60,27 @@
   void JoinInterestGroup(const blink::InterestGroup& group,
                          const GURL& main_frame_joining_url);
   // Remove the interest group if it exists.
-  void LeaveInterestGroup(const url::Origin& owner,
-                          const std::string& name,
+  void LeaveInterestGroup(const blink::InterestGroupKey& group_key,
                           const url::Origin& main_frame);
   // Updates the interest group `name` of `owner` with the populated fields of
   // `update`.
   //
   // If it fails for any reason (e.g., the interest group does not exist, or the
   // data in `update` is not valid), returns false.
-  bool UpdateInterestGroup(const url::Origin& owner,
-                           const std::string& name,
+  bool UpdateInterestGroup(const blink::InterestGroupKey& group_key,
                            InterestGroupUpdate update);
   // Report that updating of the interest group with owner `owner` and name
   // `name` failed. With the exception of parse failures, the rate limit
   // duration for failed updates is shorter than for those that succeed -- for
   // successes, UpdateInterestGroup() automatically updates the rate limit
   // duration.
-  void ReportUpdateFailed(const url::Origin& owner,
-                          const std::string& name,
+  void ReportUpdateFailed(const blink::InterestGroupKey& group_key,
                           bool parse_failure);
-  // Adds an entry to the bidding history for this interest group.
-  void RecordInterestGroupBid(const url::Origin& owner,
-                              const std::string& name);
+  // Adds an entry to the bidding history for these interest groups.
+  void RecordInterestGroupBids(const blink::InterestGroupSet& group);
   // Adds an entry to the win history for this interest group. `ad_json` is a
   // piece of opaque data to identify the winning ad.
-  void RecordInterestGroupWin(const url::Origin& owner,
-                              const std::string& name,
+  void RecordInterestGroupWin(const blink::InterestGroupKey& group_key,
                               const std::string& ad_json);
   // Records the K-anonymity data for an interest group owner/name combination.
   void UpdateInterestGroupNameKAnonymity(
@@ -100,8 +95,7 @@
                           const absl::optional<base::Time>& update_sent_time);
   // Gets a single interest group.
   absl::optional<StorageInterestGroup> GetInterestGroup(
-      const url::Origin& owner,
-      const std::string& name);
+      const blink::InterestGroupKey& group_key);
   // Gets a list of all interest group owners. Each owner will only appear
   // once.
   std::vector<url::Origin> GetAllInterestGroupOwners();
@@ -129,8 +123,7 @@
   void DeleteInterestGroupData(
       StoragePartition::StorageKeyMatcherFunction storage_key_matcher);
   // Update the interest group priority.
-  void SetInterestGroupPriority(const url::Origin& owner,
-                                const std::string& name,
+  void SetInterestGroupPriority(const blink::InterestGroupKey& group_key,
                                 double priority);
 
   std::vector<StorageInterestGroup> GetAllInterestGroupsUnfilteredForTesting();
diff --git a/content/browser/interest_group/interest_group_storage_unittest.cc b/content/browser/interest_group/interest_group_storage_unittest.cc
index a35e9da..5efc898 100644
--- a/content/browser/interest_group/interest_group_storage_unittest.cc
+++ b/content/browser/interest_group/interest_group_storage_unittest.cc
@@ -96,7 +96,8 @@
     std::unique_ptr<InterestGroupStorage> storage = CreateStorage();
     const url::Origin test_origin =
         url::Origin::Create(GURL("https://owner.example.com"));
-    storage->LeaveInterestGroup(test_origin, "example", test_origin);
+    storage->LeaveInterestGroup(blink::InterestGroupKey(test_origin, "example"),
+                                test_origin);
   }
 
   // InterestGroupStorage creates the database if it doesn't exist.
@@ -134,7 +135,8 @@
     // initialization.
     const url::Origin test_origin =
         url::Origin::Create(GURL("https://owner.example.com"));
-    storage->LeaveInterestGroup(test_origin, "example", test_origin);
+    storage->LeaveInterestGroup(blink::InterestGroupKey(test_origin, "example"),
+                                test_origin);
   }
 
   {
@@ -169,7 +171,8 @@
     // initialization.
     const url::Origin test_origin =
         url::Origin::Create(GURL("https://owner.example.com"));
-    storage->LeaveInterestGroup(test_origin, "example", test_origin);
+    storage->LeaveInterestGroup(blink::InterestGroupKey(test_origin, "example"),
+                                test_origin);
   }
 
   {
@@ -242,7 +245,8 @@
   EXPECT_EQ(1u, origins.size());
   EXPECT_EQ(test_origin, origins[0]);
 
-  storage->LeaveInterestGroup(test_origin, "example", test_origin);
+  storage->LeaveInterestGroup(blink::InterestGroupKey(test_origin, "example"),
+                              test_origin);
 
   interest_groups = storage->GetInterestGroupsForOwner(test_origin);
   EXPECT_EQ(1u, interest_groups.size());
@@ -309,6 +313,7 @@
 
   storage->JoinInterestGroup(NewInterestGroup(test_origin, "example"),
                              test_origin.GetURL());
+  blink::InterestGroupKey group_key(test_origin, "example");
 
   std::vector<url::Origin> origins = storage->GetAllInterestGroupOwners();
   EXPECT_EQ(1u, origins.size());
@@ -321,7 +326,7 @@
   EXPECT_EQ(1, interest_groups[0].bidding_browser_signals->join_count);
   EXPECT_EQ(0, interest_groups[0].bidding_browser_signals->bid_count);
 
-  storage->RecordInterestGroupBid(test_origin, "example");
+  storage->RecordInterestGroupBids({group_key});
 
   interest_groups = storage->GetInterestGroupsForOwner(test_origin);
   EXPECT_EQ(1u, interest_groups.size());
@@ -329,7 +334,7 @@
   EXPECT_EQ(1, interest_groups[0].bidding_browser_signals->join_count);
   EXPECT_EQ(1, interest_groups[0].bidding_browser_signals->bid_count);
 
-  storage->RecordInterestGroupBid(test_origin, "example");
+  storage->RecordInterestGroupBids({group_key});
 
   interest_groups = storage->GetInterestGroupsForOwner(test_origin);
   EXPECT_EQ(1u, interest_groups.size());
@@ -344,6 +349,7 @@
   const GURL ad1_url = GURL("http://owner.example.com/ad1");
   const GURL ad2_url = GURL("http://owner.example.com/ad2");
   std::unique_ptr<InterestGroupStorage> storage = CreateStorage();
+  blink::InterestGroupKey group_key(test_origin, "example");
 
   storage->JoinInterestGroup(NewInterestGroup(test_origin, "example"),
                              test_origin.GetURL());
@@ -360,8 +366,8 @@
   EXPECT_EQ(0, interest_groups[0].bidding_browser_signals->bid_count);
 
   std::string ad1_json = "{url: '" + ad1_url.spec() + "'}";
-  storage->RecordInterestGroupBid(test_origin, "example");
-  storage->RecordInterestGroupWin(test_origin, "example", ad1_json);
+  storage->RecordInterestGroupBids({group_key});
+  storage->RecordInterestGroupWin(group_key, ad1_json);
 
   interest_groups = storage->GetInterestGroupsForOwner(test_origin);
   ASSERT_EQ(1u, interest_groups.size());
@@ -372,8 +378,8 @@
   // Add the second win *after* the first so we can check ordering.
   task_environment().FastForwardBy(base::Seconds(1));
   std::string ad2_json = "{url: '" + ad2_url.spec() + "'}";
-  storage->RecordInterestGroupBid(test_origin, "example");
-  storage->RecordInterestGroupWin(test_origin, "example", ad2_json);
+  storage->RecordInterestGroupBids({group_key});
+  storage->RecordInterestGroupWin(group_key, ad2_json);
 
   interest_groups = storage->GetInterestGroupsForOwner(test_origin);
   ASSERT_EQ(1u, interest_groups.size());
@@ -784,7 +790,8 @@
   update.ad_components = full.ad_components;
   update.ad_components->emplace_back(blink::InterestGroup::Ad(
       GURL("https://full.example.com/adcomponent3"), "metadata3c"));
-  storage->UpdateInterestGroup(full.owner, full.name, update);
+  storage->UpdateInterestGroup(blink::InterestGroupKey(full.owner, full.name),
+                               update);
 
   InterestGroup updated = full;
   updated.bidding_url = update.bidding_url;
@@ -1479,7 +1486,8 @@
       storage->GetAllInterestGroupsUnfilteredForTesting();
   EXPECT_EQ(8u, interest_groups.size());
 
-  storage->LeaveInterestGroup(cluster_origin, "cluster0", other_origin);
+  storage->LeaveInterestGroup(
+      blink::InterestGroupKey(cluster_origin, "cluster0"), other_origin);
 
   auto expected_interest_group_matcher = testing::UnorderedElementsAre(
       testing::AllOf(
diff --git a/content/browser/interest_group/interest_group_update_manager.cc b/content/browser/interest_group/interest_group_update_manager.cc
index 67b7eab8..b3a981a39 100644
--- a/content/browser/interest_group/interest_group_update_manager.cc
+++ b/content/browser/interest_group/interest_group_update_manager.cc
@@ -86,14 +86,13 @@
 // must match `name` and `owner`, respectively, if either is specified. Returns
 // true if the check passes, and false otherwise.
 [[nodiscard]] bool ValidateNameAndOwnerIfPresent(
-    const url::Origin& owner,
-    const std::string& name,
+    const blink::InterestGroupKey& group_key,
     const base::Value::Dict& dict) {
   const std::string* maybe_owner = dict.FindString("owner");
-  if (maybe_owner && url::Origin::Create(GURL(*maybe_owner)) != owner)
+  if (maybe_owner && url::Origin::Create(GURL(*maybe_owner)) != group_key.owner)
     return false;
   const std::string* maybe_name = dict.FindString("name");
-  if (maybe_name && *maybe_name != name)
+  if (maybe_name && *maybe_name != group_key.name)
     return false;
   return true;
 }
@@ -199,8 +198,7 @@
 }
 
 absl::optional<InterestGroupUpdate> ParseUpdateJson(
-    const url::Origin& owner,
-    const std::string& name,
+    const blink::InterestGroupKey& group_key,
     const data_decoder::DataDecoder::ValueOrError& result) {
   // TODO(crbug.com/1186444): Report to devtools.
   if (!result.has_value()) {
@@ -210,7 +208,7 @@
   if (!dict) {
     return absl::nullopt;
   }
-  if (!ValidateNameAndOwnerIfPresent(owner, name, *dict)) {
+  if (!ValidateNameAndOwnerIfPresent(group_key, *dict)) {
     return absl::nullopt;
   }
   InterestGroupUpdate interest_group_update;
@@ -417,18 +415,18 @@
             base::BindOnce(&InterestGroupUpdateManager::
                                DidUpdateInterestGroupsOfOwnerNetFetch,
                            weak_factory_.GetWeakPtr(), simple_url_loader_it,
-                           std::move(storage_group.interest_group.owner),
-                           std::move(storage_group.interest_group.name)),
+                           blink::InterestGroupKey(
+                               std::move(storage_group.interest_group.owner),
+                               std::move(storage_group.interest_group.name))),
             kMaxUpdateSize);
   }
 }
 
 void InterestGroupUpdateManager::DidUpdateInterestGroupsOfOwnerNetFetch(
     UrlLoadersList::iterator simple_url_loader_it,
-    url::Origin owner,
-    std::string name,
+    blink::InterestGroupKey group_key,
     std::unique_ptr<std::string> fetch_body) {
-  DCHECK_EQ(owner, owners_to_update_.FrontOwner());
+  DCHECK_EQ(group_key.owner, owners_to_update_.FrontOwner());
   DCHECK_GT(num_in_flight_updates_, 0);
   DCHECK(!waiting_on_db_read_);
   std::unique_ptr<network::SimpleURLLoader> simple_url_loader =
@@ -436,7 +434,7 @@
   url_loaders_.erase(simple_url_loader_it);
   // TODO(crbug.com/1186444): Report HTTP error info to devtools.
   if (!fetch_body) {
-    ReportUpdateFailed(owner, name,
+    ReportUpdateFailed(group_key,
                        /*delay_type=*/simple_url_loader->NetError() ==
                                net::ERR_INTERNET_DISCONNECTED
                            ? UpdateDelayType::kNoInternet
@@ -449,42 +447,39 @@
       *fetch_body,
       base::BindOnce(
           &InterestGroupUpdateManager::DidUpdateInterestGroupsOfOwnerJsonParse,
-          weak_factory_.GetWeakPtr(), std::move(owner), std::move(name)));
+          weak_factory_.GetWeakPtr(), std::move(group_key)));
 }
 
 void InterestGroupUpdateManager::DidUpdateInterestGroupsOfOwnerJsonParse(
-    url::Origin owner,
-    std::string name,
+    blink::InterestGroupKey group_key,
     data_decoder::DataDecoder::ValueOrError result) {
-  DCHECK_EQ(owner, owners_to_update_.FrontOwner());
+  DCHECK_EQ(group_key.owner, owners_to_update_.FrontOwner());
   DCHECK_GT(num_in_flight_updates_, 0);
   DCHECK(!waiting_on_db_read_);
   absl::optional<InterestGroupUpdate> interest_group_update =
-      ParseUpdateJson(owner, name, result);
+      ParseUpdateJson(group_key, result);
   if (!interest_group_update) {
-    ReportUpdateFailed(owner, name, UpdateDelayType::kParseFailure);
+    ReportUpdateFailed(group_key, UpdateDelayType::kParseFailure);
     return;
   }
-  UpdateInterestGroup(owner, name, std::move(*interest_group_update));
+  UpdateInterestGroup(group_key, std::move(*interest_group_update));
 }
 
 void InterestGroupUpdateManager::UpdateInterestGroup(
-    const url::Origin& owner,
-    const std::string& name,
+    const blink::InterestGroupKey& group_key,
     InterestGroupUpdate update) {
   manager_->UpdateInterestGroup(
-      owner, name, std::move(update),
+      group_key, std::move(update),
       base::BindOnce(
           &InterestGroupUpdateManager::OnUpdateInterestGroupCompleted,
-          weak_factory_.GetWeakPtr(), owner, name));
+          weak_factory_.GetWeakPtr(), group_key));
 }
 
 void InterestGroupUpdateManager::OnUpdateInterestGroupCompleted(
-    const url::Origin& owner,
-    const std::string& name,
+    const blink::InterestGroupKey& group_key,
     bool success) {
   if (!success) {
-    ReportUpdateFailed(owner, name, UpdateDelayType::kParseFailure);
+    ReportUpdateFailed(group_key, UpdateDelayType::kParseFailure);
     return;
   }
   OnOneUpdateCompleted();
@@ -497,12 +492,11 @@
 }
 
 void InterestGroupUpdateManager::ReportUpdateFailed(
-    const url::Origin& owner,
-    const std::string& name,
+    const blink::InterestGroupKey& group_key,
     UpdateDelayType delay_type) {
   if (delay_type != UpdateDelayType::kNoInternet) {
     manager_->ReportUpdateFailed(
-        owner, name,
+        group_key,
         /*parse_failure=*/delay_type == UpdateDelayType::kParseFailure);
   }
 
diff --git a/content/browser/interest_group/interest_group_update_manager.h b/content/browser/interest_group/interest_group_update_manager.h
index 7350a133..5a9296e 100644
--- a/content/browser/interest_group/interest_group_update_manager.h
+++ b/content/browser/interest_group/interest_group_update_manager.h
@@ -160,25 +160,21 @@
       std::vector<StorageInterestGroup> storage_groups);
   void DidUpdateInterestGroupsOfOwnerNetFetch(
       UrlLoadersList::iterator simple_url_loader,
-      url::Origin owner,
-      std::string name,
+      blink::InterestGroupKey group_key,
       std::unique_ptr<std::string> fetch_body);
   void DidUpdateInterestGroupsOfOwnerJsonParse(
-      url::Origin owner,
-      std::string name,
+      blink::InterestGroupKey group_key,
       data_decoder::DataDecoder::ValueOrError result);
 
   // Updates the specified interest group with the information in `update`.
   // On completion, invoked OnUpdateInterestGroupCompleted() asynchronously,
   // with a bool indicated whether or not the update succeeded.
-  void UpdateInterestGroup(const url::Origin& owner,
-                           const std::string& name,
+  void UpdateInterestGroup(const blink::InterestGroupKey& group_key,
                            InterestGroupUpdate update);
 
   // This method finishes the current update and invokes either
   // ReportUpdateFailed() or OnOneUpdateCompleted().
-  void OnUpdateInterestGroupCompleted(const url::Origin& owner,
-                                      const std::string& name,
+  void OnUpdateInterestGroupCompleted(const blink::InterestGroupKey& group_key,
                                       bool success);
 
   // Called after a single interest group update finishes. Should be called
@@ -190,8 +186,7 @@
   // the update rate limits stored in the database.
   //
   // This method finishes the current update and calls OnOneUpdateCompleted().
-  void ReportUpdateFailed(const url::Origin& owner,
-                          const std::string& name,
+  void ReportUpdateFailed(const blink::InterestGroupKey& group_key,
                           UpdateDelayType delay_type);
 
   // An unowned pointer to the InterestGroupManagerImpl that owns this
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index 050ff65..353418f 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -440,8 +440,6 @@
   bool is_transparent = metadata.has_transparent_background;
 
   if (!using_browser_compositor_) {
-    // DevTools ScreenCast support for Android WebView.
-    last_render_frame_metadata_ = metadata;
     // Android WebView ignores transparent background.
     is_transparent = false;
   }
@@ -1263,34 +1261,6 @@
                                      absl::nullopt);
 }
 
-void RenderWidgetHostViewAndroid::FrameTokenChangedForSynchronousCompositor(
-    uint32_t frame_token,
-    const gfx::PointF& root_scroll_offset) {
-  if (!viz::FrameTokenGT(frame_token, sync_compositor_last_frame_token_))
-    return;
-  sync_compositor_last_frame_token_ = frame_token;
-
-  if (host() && frame_token) {
-    DCHECK(!using_browser_compositor_);
-    // DevTools ScreenCast support for Android WebView. Don't call this if
-    // we're currently in SynchronousCopyContents, as this can lead to
-    // redundant copies.
-    if (!in_sync_copy_contents_) {
-      RenderFrameHostImpl* frame_host =
-          RenderViewHostImpl::From(host())->GetMainRenderFrameHost();
-      if (frame_host && last_render_frame_metadata_) {
-        // Update our |root_scroll_offset|, as changes to this value do not
-        // trigger a new RenderFrameMetadata, and it may be out of date. This
-        // is needed for devtools DOM node selection.
-        cc::RenderFrameMetadata updated_metadata = *last_render_frame_metadata_;
-        updated_metadata.root_scroll_offset = root_scroll_offset;
-        RenderFrameDevToolsAgentHost::SignalSynchronousSwapCompositorFrame(
-            frame_host, updated_metadata);
-      }
-    }
-  }
-}
-
 void RenderWidgetHostViewAndroid::SetSynchronousCompositorClient(
       SynchronousCompositorClient* client) {
   synchronous_compositor_client_ = client;
@@ -1411,10 +1381,6 @@
     const gfx::Rect& src_subrect_dip,
     const gfx::Size& dst_size_in_pixel,
     base::OnceCallback<void(const SkBitmap&)> callback) {
-  // Track that we're in this function to avoid repeatedly calling DevTools
-  // capture logic.
-  base::AutoReset<bool> in_sync_copy_contents(&in_sync_copy_contents_, true);
-
   // Note: When |src_subrect| is empty, a conversion from the view size must
   // be made instead of using |current_frame_size_|. The latter sometimes also
   // includes extra height for the toolbar UI, which is not intended for
diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h
index 730289c..b17e7e4a 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.h
+++ b/content/browser/renderer_host/render_widget_host_view_android.h
@@ -301,12 +301,6 @@
   void SetTextHandlesTemporarilyHidden(bool hide_handles);
   void SelectAroundCaretAck(blink::mojom::SelectAroundCaretResultPtr result);
 
-  // TODO(ericrk): Ideally we'd remove |root_scroll_offset| from this function
-  // once we have a reliable way to get it through RenderFrameMetadata.
-  void FrameTokenChangedForSynchronousCompositor(
-      uint32_t frame_token,
-      const gfx::PointF& root_scroll_offset);
-
   void SetSynchronousCompositorClient(SynchronousCompositorClient* client);
 
   SynchronousCompositorClient* synchronous_compositor_client() const {
@@ -549,7 +543,6 @@
 
   const bool using_browser_compositor_;
   std::unique_ptr<SynchronousCompositorHost> sync_compositor_;
-  uint32_t sync_compositor_last_frame_token_ = 0u;
 
   raw_ptr<SynchronousCompositorClient> synchronous_compositor_client_;
 
@@ -606,17 +599,9 @@
   // Widget anymore associated with it. See https://crbug.com/419087.
   bool renderer_widget_created_ = false;
 
-  // Tracks whether we are in SynchronousCopyContents to avoid repeated calls
-  // into DevTools capture logic.
-  // TODO(ericrk): Make this more robust.
-  bool in_sync_copy_contents_ = false;
-
   // Whether swipe-to-move-cursor gesture is activated.
   bool swipe_to_move_cursor_activated_ = false;
 
-  // A cached copy of the most up to date RenderFrameMetadata.
-  absl::optional<cc::RenderFrameMetadata> last_render_frame_metadata_;
-
   raw_ptr<WebContentsAccessibilityAndroid> web_contents_accessibility_ =
       nullptr;
 
diff --git a/content/browser/web_package/web_bundle_element_browsertest.cc b/content/browser/web_package/web_bundle_element_browsertest.cc
index c6e1f54d..515f45e 100644
--- a/content/browser/web_package/web_bundle_element_browsertest.cc
+++ b/content/browser/web_package/web_bundle_element_browsertest.cc
@@ -576,7 +576,7 @@
   RenderFrameHost* main_frame = shell()->web_contents()->GetPrimaryMainFrame();
   RenderFrameHost* urn_frame = ChildFrameAt(main_frame, 0);
   EXPECT_EQ("https://page.test https://bundle.test",
-            urn_frame->GetNetworkIsolationKey().ToString());
+            *urn_frame->GetNetworkIsolationKey().ToCacheKeyString());
 }
 
 IN_PROC_BROWSER_TEST_F(WebBundleElementBrowserTest, ReloadSubframe) {
diff --git a/extensions/browser/api/messaging/messaging_api_message_filter.cc b/extensions/browser/api/messaging/messaging_api_message_filter.cc
index c89c991..25af213 100644
--- a/extensions/browser/api/messaging/messaging_api_message_filter.cc
+++ b/extensions/browser/api/messaging/messaging_api_message_filter.cc
@@ -151,20 +151,20 @@
 
 base::debug::CrashKeyString* GetTargetIdCrashKey() {
   static auto* crash_key = base::debug::AllocateCrashKeyString(
-      "ExternalConnectionInfo::target_id", base::debug::CrashKeySize::Size64);
+      "ExternalConnectionInfo-target_id", base::debug::CrashKeySize::Size64);
   return crash_key;
 }
 
 base::debug::CrashKeyString* GetSourceOriginCrashKey() {
   static auto* crash_key = base::debug::AllocateCrashKeyString(
-      "ExternalConnectionInfo::source_origin",
+      "ExternalConnectionInfo-source_origin",
       base::debug::CrashKeySize::Size256);
   return crash_key;
 }
 
 base::debug::CrashKeyString* GetSourceUrlCrashKey() {
   static auto* crash_key = base::debug::AllocateCrashKeyString(
-      "ExternalConnectionInfo::source_url", base::debug::CrashKeySize::Size256);
+      "ExternalConnectionInfo-source_url", base::debug::CrashKeySize::Size256);
   return crash_key;
 }
 
diff --git a/extensions/browser/api/networking_private/networking_private_chromeos_unittest.cc b/extensions/browser/api/networking_private/networking_private_chromeos_unittest.cc
index 6c0cd83..9191fef 100644
--- a/extensions/browser/api/networking_private/networking_private_chromeos_unittest.cc
+++ b/extensions/browser/api/networking_private/networking_private_chromeos_unittest.cc
@@ -358,7 +358,7 @@
   }
 
  private:
-  chromeos::NetworkHandlerTestHelper network_handler_test_helper_;
+  ash::NetworkHandlerTestHelper network_handler_test_helper_;
 };
 
 TEST_F(NetworkingPrivateApiTest, SetSharedNetworkProperties) {
diff --git a/extensions/browser/extension_function_dispatcher.cc b/extensions/browser/extension_function_dispatcher.cc
index c17f326..768cdfa 100644
--- a/extensions/browser/extension_function_dispatcher.cc
+++ b/extensions/browser/extension_function_dispatcher.cc
@@ -200,13 +200,13 @@
  private:
   static base::debug::CrashKeyString* GetNameCrashKey() {
     static auto* crash_key = base::debug::AllocateCrashKeyString(
-        "RequestParams::name", base::debug::CrashKeySize::Size256);
+        "RequestParams-name", base::debug::CrashKeySize::Size256);
     return crash_key;
   }
 
   static base::debug::CrashKeyString* GetExtensionIdCrashKey() {
     static auto* crash_key = base::debug::AllocateCrashKeyString(
-        "RequestParams::extension_id", base::debug::CrashKeySize::Size64);
+        "RequestParams-extension_id", base::debug::CrashKeySize::Size64);
     return crash_key;
   }
 
diff --git a/extensions/common/api/messaging/messaging_endpoint.cc b/extensions/common/api/messaging/messaging_endpoint.cc
index e81aa92..543e168e 100644
--- a/extensions/common/api/messaging/messaging_endpoint.cc
+++ b/extensions/common/api/messaging/messaging_endpoint.cc
@@ -15,19 +15,19 @@
 
 base::debug::CrashKeyString* GetMessagingSourceTypeCrashKey() {
   static auto* crash_key = base::debug::AllocateCrashKeyString(
-      "MessagingSource::type", base::debug::CrashKeySize::Size32);
+      "MessagingSource-type", base::debug::CrashKeySize::Size32);
   return crash_key;
 }
 
 base::debug::CrashKeyString* GetMessagingSourceExtensionIdCrashKey() {
   static auto* crash_key = base::debug::AllocateCrashKeyString(
-      "MessagingSource::extension_id", base::debug::CrashKeySize::Size64);
+      "MessagingSource-extension_id", base::debug::CrashKeySize::Size64);
   return crash_key;
 }
 
 base::debug::CrashKeyString* GetMessagingSourceNativeAppNameCrashKey() {
   static auto* crash_key = base::debug::AllocateCrashKeyString(
-      "MessagingSource::native_app_name", base::debug::CrashKeySize::Size64);
+      "MessagingSource-native_app_name", base::debug::CrashKeySize::Size64);
   return crash_key;
 }
 
diff --git a/fuchsia_web/cast_streaming/BUILD.gn b/fuchsia_web/cast_streaming/BUILD.gn
new file mode 100644
index 0000000..b4de055
--- /dev/null
+++ b/fuchsia_web/cast_streaming/BUILD.gn
@@ -0,0 +1,21 @@
+# Copyright 2022 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_fuchsia)
+
+# Only allow use by CastRunner, WebEngineShell, and CastStreamingShell targets.
+visibility = [
+  "//fuchsia_web/runners:cast_runner_core",
+  "//fuchsia_web/shell/*",
+]
+
+source_set("cast_streaming") {
+  sources = [ "cast_streaming.cc" ]
+  public = [ "cast_streaming.h" ]
+  data = [ "data/receiver.html" ]
+  deps = [
+    "//base",
+    "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.web",
+  ]
+}
diff --git a/fuchsia_web/cast_streaming/cast_streaming.cc b/fuchsia_web/cast_streaming/cast_streaming.cc
new file mode 100644
index 0000000..e2437e9
--- /dev/null
+++ b/fuchsia_web/cast_streaming/cast_streaming.cc
@@ -0,0 +1,46 @@
+// Copyright 2022 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 "fuchsia_web/cast_streaming/cast_streaming.h"
+
+#include <string>
+
+#include "base/fuchsia/file_utils.h"
+#include "base/path_service.h"
+
+namespace {
+
+constexpr char kContentDirectoryRelativePath[] =
+    "fuchsia_web/cast_streaming/data";
+constexpr char kCastStreamingContentDirectoryName[] = "cast-streaming";
+
+// Returns the content directories for the Cast Streaming application.
+std::vector<fuchsia::web::ContentDirectoryProvider>
+GetCastStreamingContentDirectories() {
+  base::FilePath pkg_path;
+  bool success = base::PathService::Get(base::DIR_ASSETS, &pkg_path);
+  DCHECK(success);
+
+  fuchsia::web::ContentDirectoryProvider content_directory;
+  content_directory.set_directory(base::OpenDirectoryHandle(
+      pkg_path.AppendASCII(kContentDirectoryRelativePath)));
+  content_directory.set_name(kCastStreamingContentDirectoryName);
+  std::vector<fuchsia::web::ContentDirectoryProvider> content_directories;
+  content_directories.emplace_back(std::move(content_directory));
+
+  return content_directories;
+}
+
+}  // namespace
+
+const char kCastStreamingWebUrl[] =
+    "fuchsia-dir://cast-streaming/receiver.html";
+
+void ApplyCastStreamingContextParams(
+    fuchsia::web::CreateContextParams* params) {
+  *params->mutable_features() |= fuchsia::web::ContextFeatureFlags::NETWORK;
+
+  // Set the content directory with the streaming app.
+  params->set_content_directories(GetCastStreamingContentDirectories());
+}
diff --git a/fuchsia_web/cast_streaming/cast_streaming.h b/fuchsia_web/cast_streaming/cast_streaming.h
new file mode 100644
index 0000000..cbf9259
--- /dev/null
+++ b/fuchsia_web/cast_streaming/cast_streaming.h
@@ -0,0 +1,16 @@
+// Copyright 2022 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 FUCHSIA_WEB_CAST_STREAMING_CAST_STREAMING_H_
+#define FUCHSIA_WEB_CAST_STREAMING_CAST_STREAMING_H_
+
+#include <fuchsia/web/cpp/fidl.h>
+
+// URL for the Cast Streaming application.
+extern const char kCastStreamingWebUrl[];
+
+// Modifies |params| to apply Cast Streaming-specific Context Params.
+void ApplyCastStreamingContextParams(fuchsia::web::CreateContextParams* params);
+
+#endif  // FUCHSIA_WEB_CAST_STREAMING_CAST_STREAMING_H_
diff --git a/fuchsia_web/runners/cast/data/receiver.html b/fuchsia_web/cast_streaming/data/receiver.html
similarity index 100%
rename from fuchsia_web/runners/cast/data/receiver.html
rename to fuchsia_web/cast_streaming/data/receiver.html
diff --git a/fuchsia_web/runners/BUILD.gn b/fuchsia_web/runners/BUILD.gn
index a4e32b4..94d9d0d 100644
--- a/fuchsia_web/runners/BUILD.gn
+++ b/fuchsia_web/runners/BUILD.gn
@@ -70,17 +70,15 @@
     "cast/pending_cast_component.cc",
     "cast/pending_cast_component.h",
   ]
-  data = [
-    "cast/data/receiver.html",
-    rebase_path(
-        "//components/cast/named_message_port_connector/named_message_port_connector.js"),
-  ]
+  data = [ rebase_path(
+          "//components/cast/named_message_port_connector/named_message_port_connector.js") ]
   deps = [
     "//base",
     "//components/cast/common:constants",
     "//components/cast/message_port",
     "//components/cast/named_message_port_connector:named_message_port_connector",
     "//components/fuchsia_component_support",
+    "//fuchsia_web/cast_streaming",
     "//fuchsia_web/runners/common/modular",
 
     # TODO(crbug.com/852834): Remove this dependency when
diff --git a/fuchsia_web/runners/cast/DEPS b/fuchsia_web/runners/cast/DEPS
index 2606999c..1c2baf8 100644
--- a/fuchsia_web/runners/cast/DEPS
+++ b/fuchsia_web/runners/cast/DEPS
@@ -1,6 +1,7 @@
 include_rules = [
   "+components/cast",
   "+content/public/test",
+  "+fuchsia_web/cast_streaming",
 
   # TODO(crbug.com/852834): Remove this dependency when
   # kAudioCapturerWithEchoCancellation is removed.
diff --git a/fuchsia_web/runners/cast/cast_runner.cc b/fuchsia_web/runners/cast/cast_runner.cc
index 00a74b5d..eeffa8ae 100644
--- a/fuchsia_web/runners/cast/cast_runner.cc
+++ b/fuchsia_web/runners/cast/cast_runner.cc
@@ -28,6 +28,7 @@
 #include "base/values.h"
 #include "components/cast/common/constants.h"
 #include "components/fuchsia_component_support/config_reader.h"
+#include "fuchsia_web/cast_streaming/cast_streaming.h"
 #include "fuchsia_web/runners/cast/cast_streaming.h"
 #include "fuchsia_web/runners/cast/pending_cast_component.h"
 #include "fuchsia_web/runners/common/web_content_runner.h"
diff --git a/fuchsia_web/runners/cast/cast_streaming.cc b/fuchsia_web/runners/cast/cast_streaming.cc
index d2af03bd..c235e61 100644
--- a/fuchsia_web/runners/cast/cast_streaming.cc
+++ b/fuchsia_web/runners/cast/cast_streaming.cc
@@ -6,42 +6,18 @@
 
 #include <string>
 
-#include "base/fuchsia/file_utils.h"
-#include "base/path_service.h"
 #include "components/fuchsia_component_support/config_reader.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace {
 
 constexpr char kCastStreamingAppUrl[] = "cast-streaming:receiver";
-constexpr char kCastDataDirectory[] = "fuchsia_web/runners/cast/data";
-constexpr char kCastStreamingContentDirectoryName[] = "cast-streaming";
 constexpr char kCastStreamingMessagePortOrigin[] = "cast-streaming:receiver";
 constexpr char kCastStreamingVideoOnlyMessagePortOrigin[] =
     "cast-streaming:video-only-receiver";
 
-// Returns the content directories for the Cast Streaming application.
-std::vector<fuchsia::web::ContentDirectoryProvider>
-GetCastStreamingContentDirectories() {
-  base::FilePath pkg_path;
-  bool success = base::PathService::Get(base::DIR_ASSETS, &pkg_path);
-  DCHECK(success);
-
-  fuchsia::web::ContentDirectoryProvider content_directory;
-  content_directory.set_directory(
-      base::OpenDirectoryHandle(pkg_path.AppendASCII(kCastDataDirectory)));
-  content_directory.set_name(kCastStreamingContentDirectoryName);
-  std::vector<fuchsia::web::ContentDirectoryProvider> content_directories;
-  content_directories.emplace_back(std::move(content_directory));
-
-  return content_directories;
-}
-
 }  // namespace
 
-const char kCastStreamingWebUrl[] =
-    "fuchsia-dir://cast-streaming/receiver.html";
-
 const char kCastStreamingMessagePortName[] = "cast.__platform__.cast_transport";
 
 bool IsAppConfigForCastStreaming(
@@ -49,14 +25,6 @@
   return application_config.web_url() == kCastStreamingAppUrl;
 }
 
-void ApplyCastStreamingContextParams(
-    fuchsia::web::CreateContextParams* params) {
-  *params->mutable_features() |= fuchsia::web::ContextFeatureFlags::NETWORK;
-
-  // Set the content directory with the streaming app.
-  params->set_content_directories(GetCastStreamingContentDirectories());
-}
-
 std::string GetMessagePortOriginForAppId(const std::string& app_id) {
   const absl::optional<base::Value>& config =
       fuchsia_component_support::LoadPackageConfig();
diff --git a/fuchsia_web/runners/cast/cast_streaming.h b/fuchsia_web/runners/cast/cast_streaming.h
index fbad9b8..a4a9867 100644
--- a/fuchsia_web/runners/cast/cast_streaming.h
+++ b/fuchsia_web/runners/cast/cast_streaming.h
@@ -7,16 +7,11 @@
 
 #include <fuchsia/web/cpp/fidl.h>
 
-#include "base/callback.h"
-#include "base/strings/string_piece.h"
 #include "fuchsia_web/runners/cast/fidl/fidl/chromium/cast/cpp/fidl.h"
 
 // TODO(crbug.com/1082821): Remove unused methods here once the
 // Cast Streaming Receiver component has been implemented.
 
-// URL for the Cast Streaming application.
-extern const char kCastStreamingWebUrl[];
-
 // Name of the Cast Streaming MessagePort.
 extern const char kCastStreamingMessagePortName[];
 
@@ -24,9 +19,6 @@
 bool IsAppConfigForCastStreaming(
     const chromium::cast::ApplicationConfig& application_config);
 
-// Modifies |params| to apply Cast Streaming-specific Context Params.
-void ApplyCastStreamingContextParams(fuchsia::web::CreateContextParams* params);
-
 // Returns the proper origin value for the MessagePort for |app_id|.
 std::string GetMessagePortOriginForAppId(const std::string& app_id);
 
diff --git a/gpu/config/gpu_finch_features.cc b/gpu/config/gpu_finch_features.cc
index a026e84..ae47e7b 100644
--- a/gpu/config/gpu_finch_features.cc
+++ b/gpu/config/gpu_finch_features.cc
@@ -213,8 +213,14 @@
 #endif
 };
 
-const base::Feature kEnableDrDc{"EnableDrDc",
-                                base::FEATURE_DISABLED_BY_DEFAULT};
+const base::Feature kEnableDrDc {
+  "EnableDrDc",
+#if BUILDFLAG(IS_ANDROID)
+      base::FEATURE_ENABLED_BY_DEFAULT
+#else
+      base::FEATURE_DISABLED_BY_DEFAULT
+#endif
+};
 
 const base::Feature kForceGpuMainThreadToNormalPriorityDrDc{
     "ForceGpuMainThreadToNormalPriorityDrDc",
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index 87799dce..968bb11 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -36247,7 +36247,7 @@
         '    "chromium"'
         '  ]'
         '}'
-      execution_timeout_secs: 14400
+      execution_timeout_secs: 21600
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
diff --git a/infra/config/subprojects/chromium/ci/chromium.chromiumos.star b/infra/config/subprojects/chromium/ci/chromium.chromiumos.star
index a18bcb8..5df9931 100644
--- a/infra/config/subprojects/chromium/ci/chromium.chromiumos.star
+++ b/infra/config/subprojects/chromium/ci/chromium.chromiumos.star
@@ -700,7 +700,8 @@
     reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI,
     # This builder build 2 chrome(Ash and Lacros), so it need
     # more time.
-    execution_timeout = 4 * time.hour,
+    # TODO(crbug.com/1345687) We should reduce this timeout.
+    execution_timeout = 6 * time.hour,
 )
 
 ci.builder(
diff --git a/ios/chrome/browser/net/ios_chrome_network_delegate.cc b/ios/chrome/browser/net/ios_chrome_network_delegate.cc
index 6311f79f..9e43285 100644
--- a/ios/chrome/browser/net/ios_chrome_network_delegate.cc
+++ b/ios/chrome/browser/net/ios_chrome_network_delegate.cc
@@ -72,16 +72,13 @@
 bool IOSChromeNetworkDelegate::OnAnnotateAndMoveUserBlockedCookies(
     const net::URLRequest& request,
     net::CookieAccessResultList& maybe_included_cookies,
-    net::CookieAccessResultList& excluded_cookies,
-    bool allowed_from_caller) {
+    net::CookieAccessResultList& excluded_cookies) {
   // `cookie_settings_` is null during tests, or when we're running in the
   // system context.
-  bool allowed = allowed_from_caller;
-  if (cookie_settings_) {
-    allowed = allowed && cookie_settings_->IsFullCookieAccessAllowed(
-                             request.url(),
-                             request.site_for_cookies().RepresentativeUrl());
-  }
+  bool allowed =
+      !cookie_settings_ ||
+      cookie_settings_->IsFullCookieAccessAllowed(
+          request.url(), request.site_for_cookies().RepresentativeUrl());
 
   if (!allowed) {
     ExcludeAllCookies(
@@ -95,15 +92,13 @@
 bool IOSChromeNetworkDelegate::OnCanSetCookie(
     const net::URLRequest& request,
     const net::CanonicalCookie& cookie,
-    net::CookieOptions* options,
-    bool allowed_from_caller) {
+    net::CookieOptions* options) {
   // Null during tests, or when we're running in the system context.
   if (!cookie_settings_)
-    return allowed_from_caller;
+    return true;
 
-  return allowed_from_caller &&
-         cookie_settings_->IsFullCookieAccessAllowed(
-             request.url(), request.site_for_cookies().RepresentativeUrl());
+  return cookie_settings_->IsFullCookieAccessAllowed(
+      request.url(), request.site_for_cookies().RepresentativeUrl());
 }
 
 net::NetworkDelegate::PrivacySetting
diff --git a/ios/chrome/browser/net/ios_chrome_network_delegate.h b/ios/chrome/browser/net/ios_chrome_network_delegate.h
index a84345c..a5deb0d7 100644
--- a/ios/chrome/browser/net/ios_chrome_network_delegate.h
+++ b/ios/chrome/browser/net/ios_chrome_network_delegate.h
@@ -55,12 +55,10 @@
   bool OnAnnotateAndMoveUserBlockedCookies(
       const net::URLRequest& request,
       net::CookieAccessResultList& maybe_included_cookies,
-      net::CookieAccessResultList& excluded_cookies,
-      bool allowed_from_caller) override;
+      net::CookieAccessResultList& excluded_cookies) override;
   bool OnCanSetCookie(const net::URLRequest& request,
                       const net::CanonicalCookie& cookie,
-                      net::CookieOptions* options,
-                      bool allowed_from_caller) override;
+                      net::CookieOptions* options) override;
   net::NetworkDelegate::PrivacySetting OnForcePrivacyMode(
       const GURL& url,
       const net::SiteForCookies& site_for_cookies,
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/BUILD.gn b/ios/chrome/browser/ui/content_suggestions/cells/BUILD.gn
index c8cebc8..0578d07 100644
--- a/ios/chrome/browser/ui/content_suggestions/cells/BUILD.gn
+++ b/ios/chrome/browser/ui/content_suggestions/cells/BUILD.gn
@@ -63,6 +63,7 @@
     "//ios/chrome/browser/ui/content_suggestions:public",
     "//ios/chrome/browser/ui/content_suggestions/identifier",
     "//ios/chrome/browser/ui/icons:symbols",
+    "//ios/chrome/browser/ui/image_util",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/common:string_util",
     "//ios/chrome/common:timing",
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_module_container.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_module_container.mm
index 482f4c17..8e9cb30 100644
--- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_module_container.mm
+++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_module_container.mm
@@ -6,7 +6,9 @@
 
 #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_cells_constants.h"
 #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_tile_layout_util.h"
+#import "ios/chrome/browser/ui/image_util/image_util.h"
 #import "ios/chrome/common/ui/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
 
@@ -37,14 +39,9 @@
 // The corner radius of this container.
 const float kCornerRadius = 16;
 
-// The shadow radius of this container.
-const float kShadowRadius = 60;
-
-// The shadow opacity of this container.
-const float kShadowOpacity = 0.06;
-
-// The shadow offset of this container.
-const CGSize kShadowOffset = CGSizeMake(0, 20);
+// The shadow offsets of this container.
+const CGFloat kHorizontalShadowOffset = 10;
+const CGFloat kVerticalShadowOffset = 20;
 
 // Vertical space allocated to the Trending Queries module content.
 const float kTrendingQueriesContentHeight = 103;
@@ -74,13 +71,30 @@
     self.layer.cornerRadius = kCornerRadius;
     self.backgroundColor =
         [UIColor colorNamed:kGroupedSecondaryBackgroundColor];
-    self.layer.shadowColor = [UIColor blackColor].CGColor;
-    self.layer.shadowOffset = kShadowOffset;
-    self.layer.shadowRadius = kShadowRadius;
-    self.layer.shadowOpacity = kShadowOpacity;
+
+    // Create content container with same background as this view so that a
+    // shadow view can be placed under it to create a shadow effect.
+    UIImageView* shadow = [[UIImageView alloc]
+        initWithImage:StretchableImageNamed(@"menu_shadow")];
+    shadow.translatesAutoresizingMaskIntoConstraints = NO;
+    [self addSubview:shadow];
+    AddSameConstraintsToSidesWithInsets(
+        shadow, self,
+        LayoutSides::kTop | LayoutSides::kLeading | LayoutSides::kBottom |
+            LayoutSides::kTrailing,
+        {-kHorizontalShadowOffset, -kVerticalShadowOffset,
+         -kVerticalShadowOffset, -kHorizontalShadowOffset});
+
+    UIView* contentContainer = [[UIView alloc] init];
+    contentContainer.backgroundColor =
+        [UIColor colorNamed:kGroupedSecondaryBackgroundColor];
+    contentContainer.layer.cornerRadius = kCornerRadius;
+    contentContainer.translatesAutoresizingMaskIntoConstraints = NO;
+    [self addSubview:contentContainer];
+    AddSameConstraints(self, contentContainer);
 
     contentView.translatesAutoresizingMaskIntoConstraints = NO;
-    [self addSubview:contentView];
+    [contentContainer addSubview:contentView];
 
     NSString* titleString = [self titleString];
     if ([titleString length] > 0) {
@@ -91,14 +105,14 @@
       self.title.textColor = [UIColor colorNamed:kTextSecondaryColor];
       self.title.accessibilityTraits |= UIAccessibilityTraitHeader;
       self.title.translatesAutoresizingMaskIntoConstraints = NO;
-      [self addSubview:self.title];
+      [contentContainer addSubview:self.title];
       [NSLayoutConstraint activateConstraints:@[
         // Title constraints.
         [self.title.leadingAnchor
-            constraintEqualToAnchor:self.leadingAnchor
+            constraintEqualToAnchor:contentContainer.leadingAnchor
                            constant:kContentHorizontalInset],
-        [self.topAnchor constraintEqualToAnchor:self.title.topAnchor
-                                       constant:-kTitleTopInset],
+        [contentContainer.topAnchor constraintEqualToAnchor:self.title.topAnchor
+                                                   constant:-kTitleTopInset],
         // Ensures placeholder for title is visible.
         [self.title.widthAnchor
             constraintGreaterThanOrEqualToConstant:kTitleMinimumWidth],
@@ -106,23 +120,27 @@
             constraintGreaterThanOrEqualToConstant:kTitleMinimumHeight],
         // contentView constraints.
         [contentView.leadingAnchor
-            constraintEqualToAnchor:self.leadingAnchor
+            constraintEqualToAnchor:contentContainer.leadingAnchor
                            constant:kContentHorizontalInset],
         [contentView.trailingAnchor
-            constraintEqualToAnchor:self.trailingAnchor
+            constraintEqualToAnchor:contentContainer.trailingAnchor
                            constant:-kContentHorizontalInset],
-        [contentView.bottomAnchor constraintEqualToAnchor:self.bottomAnchor],
+        [contentView.bottomAnchor
+            constraintEqualToAnchor:contentContainer.bottomAnchor],
         [contentView.topAnchor
             constraintEqualToAnchor:self.title.bottomAnchor
                            constant:kContentTitleVerticalSpacing],
       ]];
     } else {
       [NSLayoutConstraint activateConstraints:@[
-        [contentView.leadingAnchor constraintEqualToAnchor:self.leadingAnchor],
+        [contentView.leadingAnchor
+            constraintEqualToAnchor:contentContainer.leadingAnchor],
         [contentView.trailingAnchor
-            constraintEqualToAnchor:self.trailingAnchor],
-        [contentView.bottomAnchor constraintEqualToAnchor:self.bottomAnchor],
-        [contentView.topAnchor constraintEqualToAnchor:self.topAnchor],
+            constraintEqualToAnchor:contentContainer.trailingAnchor],
+        [contentView.bottomAnchor
+            constraintEqualToAnchor:contentContainer.bottomAnchor],
+        [contentView.topAnchor
+            constraintEqualToAnchor:contentContainer.topAnchor],
       ]];
     }
     self.heightConstraint = [self.heightAnchor
diff --git a/ios/chrome/browser/ui/first_run/BUILD.gn b/ios/chrome/browser/ui/first_run/BUILD.gn
index fc8980e..87917ce3 100644
--- a/ios/chrome/browser/ui/first_run/BUILD.gn
+++ b/ios/chrome/browser/ui/first_run/BUILD.gn
@@ -244,9 +244,11 @@
     "//components/policy/core/common:common_constants",
     "//components/policy/test_support:test_support",
     "//components/signin/ios/browser:features",
+    "//ios/chrome/app/strings",
     "//ios/chrome/app/strings:ios_chromium_strings_grit",
     "//ios/chrome/app/strings:ios_strings_grit",
     "//ios/chrome/browser/policy:eg_test_support+eg2",
+    "//ios/chrome/browser/policy:policy_util",
     "//ios/chrome/browser/ui:feature_flags",
     "//ios/chrome/browser/ui/authentication:authentication_constants",
     "//ios/chrome/browser/ui/authentication:eg_test_support+eg2",
diff --git a/ios/chrome/browser/ui/first_run/first_run_two_steps_egtest.mm b/ios/chrome/browser/ui/first_run/first_run_two_steps_egtest.mm
index c60c14fc..b7039ba 100644
--- a/ios/chrome/browser/ui/first_run/first_run_two_steps_egtest.mm
+++ b/ios/chrome/browser/ui/first_run/first_run_two_steps_egtest.mm
@@ -2,7 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#import "base/i18n/number_formatting.h"
+#import "base/strings/string_util.h"
+#import "base/strings/sys_string_conversions.h"
+#import "components/policy/core/common/policy_loader_ios_constants.h"
+#import "components/policy/policy_constants.h"
 #import "components/signin/ios/browser/features.h"
+#import "ios/chrome/browser/policy/policy_earl_grey_utils.h"
+#import "ios/chrome/browser/policy/policy_util.h"
 #import "ios/chrome/browser/ui/authentication/signin_earl_grey.h"
 #import "ios/chrome/browser/ui/authentication/signin_earl_grey_ui_test_util.h"
 #import "ios/chrome/browser/ui/authentication/signin_matchers.h"
@@ -14,6 +21,7 @@
 #import "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/common/ui/promo_style/constants.h"
 #import "ios/chrome/common/ui/table_view/table_view_cells_constants.h"
+#import "ios/chrome/grit/ios_google_chrome_strings.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
@@ -23,7 +31,9 @@
 #import "ios/chrome/test/earl_grey/test_switches.h"
 #import "ios/public/provider/chrome/browser/signin/fake_chrome_identity.h"
 #import "ios/testing/earl_grey/app_launch_configuration.h"
+#import "ios/testing/earl_grey/app_launch_manager.h"
 #import "ios/testing/earl_grey/earl_grey_test.h"
+#import "ui/base/l10n/l10n_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -31,6 +41,18 @@
 
 namespace {
 
+// Type of FRE sign-in screen intent.
+typedef NS_ENUM(NSUInteger, FRESigninIntent) {
+  // FRE without enterprise policy.
+  FRESigninIntentRegular,
+  // FRE without forced sign-in policy.
+  FRESigninIntentSigninForcedByPolicy,
+  // FRE without disabled sign-in policy.
+  FRESigninIntentSigninDisabledByPolicy,
+  // FRE with an enterprise policy.
+  FRESigninIntentSigninWithPolicy,
+};
+
 NSString* const kSyncPassphrase = @"hello";
 
 // Returns matcher for the primary action button.
@@ -104,7 +126,8 @@
 // Tests FRE with UMA default value and without sign-in.
 - (void)testWithUMACheckedAndNoSignin {
   // Verify 2 step FRE.
-  [self verifyWelcomeScreenIsDisplayed];
+  [self verifyEnterpriseWelcomeScreenIsDisplayedWithFRESigninIntent:
+            FRESigninIntentRegular];
   // Skip sign-in.
   [[self
       elementInteractionWithGreyMatcher:PromoStyleSecondaryActionButtonMatcher()
@@ -122,7 +145,8 @@
 // Tests FRE with UMA off and without sign-in.
 - (void)testWithUMAUncheckedAndNoSignin {
   // Verify 2 step FRE.
-  [self verifyWelcomeScreenIsDisplayed];
+  [self verifyEnterpriseWelcomeScreenIsDisplayedWithFRESigninIntent:
+            FRESigninIntentRegular];
   // Scroll down and open the UMA dialog.
   [[self elementInteractionWithGreyMatcher:grey_allOf(
                                                ManageUMALinkMatcher(),
@@ -158,7 +182,8 @@
 // Tests FRE with UMA off, reopen UMA dialog and close the FRE without sign-in.
 - (void)testUMAUncheckedWhenOpenedSecondTime {
   // Verify 2 step FRE.
-  [self verifyWelcomeScreenIsDisplayed];
+  [self verifyEnterpriseWelcomeScreenIsDisplayedWithFRESigninIntent:
+            FRESigninIntentRegular];
   // Scroll down and open the UMA dialog.
   id<GREYMatcher> manageUMALinkMatcher =
       grey_allOf(ManageUMALinkMatcher(), grey_sufficientlyVisible(), nil);
@@ -210,7 +235,8 @@
 // Tests to turn off UMA, and open the UMA dialog to turn it back on.
 - (void)testUMAUncheckedAndCheckItAgain {
   // Verify 2 step FRE.
-  [self verifyWelcomeScreenIsDisplayed];
+  [self verifyEnterpriseWelcomeScreenIsDisplayedWithFRESigninIntent:
+            FRESigninIntentRegular];
   // Scroll down and open the UMA dialog.
   id<GREYMatcher> manageUMALinkMatcher =
       grey_allOf(ManageUMALinkMatcher(), grey_sufficientlyVisible(), nil);
@@ -265,7 +291,8 @@
   FakeChromeIdentity* fakeIdentity = [FakeChromeIdentity fakeIdentity1];
   [SigninEarlGrey addFakeIdentity:fakeIdentity];
   // Verify 2 step FRE.
-  [self verifyWelcomeScreenIsDisplayed];
+  [self verifyEnterpriseWelcomeScreenIsDisplayedWithFRESigninIntent:
+            FRESigninIntentRegular];
   // Scroll down and open the UMA dialog.
   [[self elementInteractionWithGreyMatcher:grey_allOf(
                                                ManageUMALinkMatcher(),
@@ -313,7 +340,8 @@
   FakeChromeIdentity* fakeIdentity = [FakeChromeIdentity fakeIdentity1];
   [SigninEarlGrey addFakeIdentity:fakeIdentity];
   // Verify 2 step FRE.
-  [self verifyWelcomeScreenIsDisplayed];
+  [self verifyEnterpriseWelcomeScreenIsDisplayedWithFRESigninIntent:
+            FRESigninIntentRegular];
   // Accept sign-in.
   [[self
       elementInteractionWithGreyMatcher:PromoStylePrimaryActionButtonMatcher()
@@ -343,7 +371,8 @@
   FakeChromeIdentity* fakeIdentity = [FakeChromeIdentity fakeIdentity1];
   [SigninEarlGrey addFakeIdentity:fakeIdentity];
   // Verify 2 step FRE.
-  [self verifyWelcomeScreenIsDisplayed];
+  [self verifyEnterpriseWelcomeScreenIsDisplayedWithFRESigninIntent:
+            FRESigninIntentRegular];
   // Accept sign-in.
   [[self
       elementInteractionWithGreyMatcher:PromoStylePrimaryActionButtonMatcher()
@@ -373,7 +402,8 @@
   FakeChromeIdentity* fakeIdentity = [FakeChromeIdentity fakeIdentity1];
   [SigninEarlGrey addFakeIdentity:fakeIdentity];
   // Verify 2 step FRE.
-  [self verifyWelcomeScreenIsDisplayed];
+  [self verifyEnterpriseWelcomeScreenIsDisplayedWithFRESigninIntent:
+            FRESigninIntentRegular];
   // Accept sign-in.
   [[self
       elementInteractionWithGreyMatcher:PromoStylePrimaryActionButtonMatcher()
@@ -453,7 +483,8 @@
   FakeChromeIdentity* fakeIdentity = [FakeChromeIdentity fakeIdentity1];
   [SigninEarlGrey addFakeIdentity:fakeIdentity];
   // Verify 2 step FRE.
-  [self verifyWelcomeScreenIsDisplayed];
+  [self verifyEnterpriseWelcomeScreenIsDisplayedWithFRESigninIntent:
+            FRESigninIntentRegular];
   // Accept sign-in.
   [[self
       elementInteractionWithGreyMatcher:PromoStylePrimaryActionButtonMatcher()
@@ -486,14 +517,323 @@
   [SigninEarlGrey verifySyncUIEnabled:YES];
 }
 
+#pragma mark - Enterprise
+
+// Tests FRE with disabled sign-in policy.
+- (void)testSignInDisabledByPolicy {
+  // Configure the policy to disable SignIn.
+  [self relaunchAppWithBrowserSigninMode:BrowserSigninMode::kDisabled];
+  // Verify 2 step FRE with disabled sign-in policy.
+  [self verifyEnterpriseWelcomeScreenIsDisplayedWithFRESigninIntent:
+            FRESigninIntentSigninDisabledByPolicy];
+  // Accept FRE.
+  [[self
+      elementInteractionWithGreyMatcher:PromoStylePrimaryActionButtonMatcher()
+                   scrollViewIdentifier:
+                       kPromoStyleScrollViewAccessibilityIdentifier]
+      performAction:grey_tap()];
+  // Check that UMA is on.
+  GREYAssertTrue(
+      [FirstRunAppInterface isUMACollectionEnabled],
+      @"kMetricsReportingEnabled pref was unexpectedly false by default.");
+  // Check signed out.
+  [SigninEarlGrey verifySignedOut];
+}
+
+// Tests forced sign-in policy, and accept sync.
+- (void)testForceSigninByPolicy {
+  // Configure the policy to force sign-in.
+  [self relaunchAppWithBrowserSigninMode:BrowserSigninMode::kForced];
+  // Add identity.
+  FakeChromeIdentity* fakeIdentity = [FakeChromeIdentity fakeIdentity1];
+  [SigninEarlGrey addFakeIdentity:fakeIdentity];
+  // Verify 2 step FRE with forced sign-in policy.
+  [self verifyEnterpriseWelcomeScreenIsDisplayedWithFRESigninIntent:
+            FRESigninIntentSigninForcedByPolicy];
+  // Accept sign-in.
+  [[self
+      elementInteractionWithGreyMatcher:PromoStylePrimaryActionButtonMatcher()
+                   scrollViewIdentifier:
+                       kPromoStyleScrollViewAccessibilityIdentifier]
+      performAction:grey_tap()];
+  // Accept sync.
+  [[self
+      elementInteractionWithGreyMatcher:PromoStylePrimaryActionButtonMatcher()
+                   scrollViewIdentifier:
+                       kPromoStyleScrollViewAccessibilityIdentifier]
+      performAction:grey_tap()];
+  // Check that UMA is on.
+  GREYAssertTrue(
+      [FirstRunAppInterface isUMACollectionEnabled],
+      @"kMetricsReportingEnabled pref was unexpectedly false by default.");
+  // Check signed in.
+  [SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity];
+  // Check sync is on.
+  [ChromeEarlGreyUI openSettingsMenu];
+  [SigninEarlGrey verifySyncUIEnabled:YES];
+  // Close settings.
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsDoneButton()]
+      performAction:grey_tap()];
+}
+
+// Tests forced sign-in policy, and refuse sync.
+- (void)testForceSigninByPolicyWithoutSync {
+  // Configure the policy to force sign-in.
+  [self relaunchAppWithBrowserSigninMode:BrowserSigninMode::kForced];
+  // Add identity.
+  FakeChromeIdentity* fakeIdentity = [FakeChromeIdentity fakeIdentity1];
+  [SigninEarlGrey addFakeIdentity:fakeIdentity];
+  // Verify 2 step FRE with forced sign-in policy.
+  [self verifyEnterpriseWelcomeScreenIsDisplayedWithFRESigninIntent:
+            FRESigninIntentSigninForcedByPolicy];
+  // Accept sign-in.
+  [[self
+      elementInteractionWithGreyMatcher:PromoStylePrimaryActionButtonMatcher()
+                   scrollViewIdentifier:
+                       kPromoStyleScrollViewAccessibilityIdentifier]
+      performAction:grey_tap()];
+  // Refuse sync.
+  [[self
+      elementInteractionWithGreyMatcher:PromoStyleSecondaryActionButtonMatcher()
+                   scrollViewIdentifier:
+                       kPromoStyleScrollViewAccessibilityIdentifier]
+      performAction:grey_tap()];
+  // Check that UMA is on.
+  GREYAssertTrue(
+      [FirstRunAppInterface isUMACollectionEnabled],
+      @"kMetricsReportingEnabled pref was unexpectedly false by default.");
+  // Check signed in.
+  [SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity];
+  // Check sync is on.
+  [ChromeEarlGreyUI openSettingsMenu];
+  [SigninEarlGrey verifySyncUIEnabled:NO];
+  // Close settings.
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsDoneButton()]
+      performAction:grey_tap()];
+}
+
+// Tests sign-in with sync disabled policy.
+- (void)testSyncDisabledByPolicy {
+  [self relaunchAppWithPolicyKey:policy::key::kSyncDisabled
+                  xmlPolicyValue:"<true/>"];
+  // Add identity.
+  FakeChromeIdentity* fakeIdentity = [FakeChromeIdentity fakeIdentity1];
+  [SigninEarlGrey addFakeIdentity:fakeIdentity];
+  // Verify 2 step FRE with forced sign-in policy.
+  [self verifyEnterpriseWelcomeScreenIsDisplayedWithFRESigninIntent:
+            FRESigninIntentSigninWithPolicy];
+  // Accept sign-in.
+  [[self
+      elementInteractionWithGreyMatcher:PromoStylePrimaryActionButtonMatcher()
+                   scrollViewIdentifier:
+                       kPromoStyleScrollViewAccessibilityIdentifier]
+      performAction:grey_tap()];
+  // Check that UMA is on.
+  GREYAssertTrue(
+      [FirstRunAppInterface isUMACollectionEnabled],
+      @"kMetricsReportingEnabled pref was unexpectedly false by default.");
+  // Check signed in.
+  [SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity];
+  // Check sync is on.
+  [ChromeEarlGreyUI openSettingsMenu];
+  [SigninEarlGrey verifySyncUIEnabled:NO];
+}
+
+// Tests sign-in and no sync with forced policy.
+- (void)testSigninWithOnlyBookmarkSyncDataTypeEnabled {
+  // Configure the policy to force sign-in.
+  [self relaunchAppWithPolicyKey:policy::key::kSyncTypesListDisabled
+                  xmlPolicyValue:"<array><string>bookmarks</string></array>"];
+  // Add identity.
+  FakeChromeIdentity* fakeIdentity = [FakeChromeIdentity fakeIdentity1];
+  [SigninEarlGrey addFakeIdentity:fakeIdentity];
+  // Verify 2 step FRE with forced sign-in policy.
+  [self verifyEnterpriseWelcomeScreenIsDisplayedWithFRESigninIntent:
+            FRESigninIntentSigninWithPolicy];
+  // Accept sign-in.
+  [[self
+      elementInteractionWithGreyMatcher:PromoStylePrimaryActionButtonMatcher()
+                   scrollViewIdentifier:
+                       kPromoStyleScrollViewAccessibilityIdentifier]
+      performAction:grey_tap()];
+  // Open advanced sync settings.
+  [[EarlGrey selectElementWithMatcher:GetSyncSettings()]
+      performAction:grey_tap()];
+  // Check "Sync Everything" is off
+  [[EarlGrey selectElementWithMatcher:
+                 grey_allOf(grey_accessibilityID(
+                                kSyncEverythingItemAccessibilityIdentifier),
+                            grey_descendant(grey_text(
+                                l10n_util::GetNSString(IDS_IOS_SETTING_OFF))),
+                            nil)] assertWithMatcher:grey_notNil()];
+  // Check "Bookmarks" is off
+  [[EarlGrey selectElementWithMatcher:grey_allOf(grey_accessibilityID(
+                                                     kSyncBookmarksIdentifier),
+                                                 grey_descendant(grey_text(
+                                                     l10n_util::GetNSString(
+                                                         IDS_IOS_SETTING_OFF))),
+                                                 nil)]
+      assertWithMatcher:grey_notNil()];
+  // Close the advanced sync settings.
+  [[EarlGrey selectElementWithMatcher:
+                 chrome_test_util::AdvancedSyncSettingsDoneButtonMatcher()]
+      performAction:grey_tap()];
+  // Accept sync.
+  [[self
+      elementInteractionWithGreyMatcher:PromoStylePrimaryActionButtonMatcher()
+                   scrollViewIdentifier:
+                       kPromoStyleScrollViewAccessibilityIdentifier]
+      performAction:grey_tap()];
+  // Check that UMA is on.
+  GREYAssertTrue(
+      [FirstRunAppInterface isUMACollectionEnabled],
+      @"kMetricsReportingEnabled pref was unexpectedly false by default.");
+  // Check signed in.
+  [SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity];
+  // Check sync is on.
+  [ChromeEarlGreyUI openSettingsMenu];
+  [SigninEarlGrey verifySyncUIEnabled:YES];
+}
+
+// Tests enterprise policy wording on FRE when incognito policy is set.
+- (void)testIncognitoPolicy {
+  // Configure the policy to force sign-in.
+  [self relaunchAppWithPolicyKey:policy::key::kIncognitoModeAvailability
+                  xmlPolicyValue:"<integer>1</integer>"];
+  // Add identity.
+  FakeChromeIdentity* fakeIdentity = [FakeChromeIdentity fakeIdentity1];
+  [SigninEarlGrey addFakeIdentity:fakeIdentity];
+  // Verify 2 step FRE with forced sign-in policy.
+  [self verifyEnterpriseWelcomeScreenIsDisplayedWithFRESigninIntent:
+            FRESigninIntentSigninWithPolicy];
+  // Refuse sign-in.
+  [[self
+      elementInteractionWithGreyMatcher:PromoStyleSecondaryActionButtonMatcher()
+                   scrollViewIdentifier:
+                       kPromoStyleScrollViewAccessibilityIdentifier]
+      performAction:grey_tap()];
+  // Check that UMA is on.
+  GREYAssertTrue(
+      [FirstRunAppInterface isUMACollectionEnabled],
+      @"kMetricsReportingEnabled pref was unexpectedly false by default.");
+  // Check signed out.
+  [SigninEarlGrey verifySignedOut];
+}
+
 #pragma mark Helper
 
-// Checks that the sign-in screen is displayed.
-- (void)verifyWelcomeScreenIsDisplayed {
+- (void)relaunchAppWithBrowserSigninMode:(BrowserSigninMode)mode {
+  std::string xmlPolicyValue("<integer>");
+  xmlPolicyValue += std::to_string(static_cast<int>(mode));
+  xmlPolicyValue += "</integer>";
+  [self relaunchAppWithPolicyKey:policy::key::kBrowserSignin
+                  xmlPolicyValue:xmlPolicyValue];
+}
+
+// Sets policy value and relaunches the app.
+- (void)relaunchAppWithPolicyKey:(std::string)policyKey
+                  xmlPolicyValue:(std::string)xmlPolicyValue {
+  std::string policyData = std::string("<dict><key>") + policyKey + "</key>" +
+                           xmlPolicyValue + "</dict>";
+  // Configure the policy to force sign-in.
+  AppLaunchConfiguration config = self.appConfigurationForTestCase;
+  config.additional_args.push_back(
+      "-" + base::SysNSStringToUTF8(kPolicyLoaderIOSConfigurationKey));
+  config.additional_args.push_back(policyData);
+  // Relaunch the app to take the configuration into account.
+  [[AppLaunchManager sharedManager] ensureAppLaunchedWithConfiguration:config];
+}
+
+// Checks that the sign-in screen for enterprise is displayed.
+- (void)verifyEnterpriseWelcomeScreenIsDisplayedWithFRESigninIntent:
+    (FRESigninIntent)FRESigninIntent {
   [[EarlGrey selectElementWithMatcher:
                  grey_accessibilityID(
                      first_run::kFirstRunSignInScreenAccessibilityIdentifier)]
       assertWithMatcher:grey_notNil()];
+  NSString* title = nil;
+  NSString* subtitle = nil;
+  NSMutableArray* disclaimerStrings = [NSMutableArray array];
+  switch (FRESigninIntent) {
+    case FRESigninIntentRegular:
+      title = l10n_util::GetNSString(IDS_IOS_FIRST_RUN_SIGNIN_TITLE);
+      subtitle =
+          l10n_util::GetNSString(IDS_IOS_FIRST_RUN_SIGNIN_SUBTITLE_SHORT);
+      break;
+    case FRESigninIntentSigninForcedByPolicy:
+      title =
+          l10n_util::GetNSString(IDS_IOS_FIRST_RUN_SIGNIN_TITLE_SIGNIN_FORCED);
+      subtitle = l10n_util::GetNSString(
+          IDS_IOS_FIRST_RUN_SIGNIN_SUBTITLE_SIGNIN_FORCED);
+      [disclaimerStrings
+          addObject:l10n_util::GetNSString(
+                        IDS_IOS_FIRST_RUN_WELCOME_SCREEN_BROWSER_MANAGED)];
+      break;
+    case FRESigninIntentSigninDisabledByPolicy:
+      if ([ChromeEarlGrey isIPadIdiom]) {
+        title =
+            l10n_util::GetNSString(IDS_IOS_FIRST_RUN_WELCOME_SCREEN_TITLE_IPAD);
+      } else {
+        title = l10n_util::GetNSString(
+            IDS_IOS_FIRST_RUN_WELCOME_SCREEN_TITLE_IPHONE);
+      }
+      subtitle =
+          l10n_util::GetNSString(IDS_IOS_FIRST_RUN_WELCOME_SCREEN_SUBTITLE);
+      [disclaimerStrings
+          addObject:l10n_util::GetNSString(
+                        IDS_IOS_FIRST_RUN_WELCOME_SCREEN_BROWSER_MANAGED)];
+      break;
+    case FRESigninIntentSigninWithPolicy:
+      title = l10n_util::GetNSString(IDS_IOS_FIRST_RUN_SIGNIN_TITLE);
+      subtitle =
+          l10n_util::GetNSString(IDS_IOS_FIRST_RUN_SIGNIN_SUBTITLE_SHORT);
+      [disclaimerStrings
+          addObject:l10n_util::GetNSString(
+                        IDS_IOS_FIRST_RUN_WELCOME_SCREEN_BROWSER_MANAGED)];
+      break;
+  }
+  [disclaimerStrings
+      addObject:l10n_util::GetNSString(
+                    IDS_IOS_FIRST_RUN_WELCOME_SCREEN_TERMS_OF_SERVICE)];
+  [disclaimerStrings
+      addObject:l10n_util::GetNSString(
+                    IDS_IOS_FIRST_RUN_WELCOME_SCREEN_METRIC_REPORTING)];
+  // Validate the Title text.
+  [[self elementInteractionWithGreyMatcher:grey_allOf(
+                                               grey_text(title),
+                                               grey_sufficientlyVisible(), nil)
+                      scrollViewIdentifier:
+                          kPromoStyleScrollViewAccessibilityIdentifier]
+      assertWithMatcher:grey_notNil()];
+  // Validate the Subtitle text.
+  [[self elementInteractionWithGreyMatcher:grey_allOf(
+                                               grey_text(subtitle),
+                                               grey_sufficientlyVisible(), nil)
+                      scrollViewIdentifier:
+                          kPromoStyleScrollViewAccessibilityIdentifier]
+      assertWithMatcher:grey_notNil()];
+  // Validate the Managed text.
+  [self verifyDisclaimerFooterWithStrings:disclaimerStrings];
+}
+
+// Checks the disclaimer footer with the list of strings. |strings| can contain
+// "BEGIN_LINK" and "END_LINK" for URL tags.
+- (void)verifyDisclaimerFooterWithStrings:(NSArray*)strings {
+  NSString* disclaimerText = [strings componentsJoinedByString:@" "];
+  // Remove URL tags.
+  disclaimerText =
+      [disclaimerText stringByReplacingOccurrencesOfString:@"BEGIN_LINK"
+                                                withString:@""];
+  disclaimerText =
+      [disclaimerText stringByReplacingOccurrencesOfString:@"END_LINK"
+                                                withString:@""];
+  // Check the footer.
+  [[self elementInteractionWithGreyMatcher:grey_allOf(
+                                               grey_text(disclaimerText),
+                                               grey_sufficientlyVisible(), nil)
+                      scrollViewIdentifier:
+                          kPromoStyleScrollViewAccessibilityIdentifier]
+      assertWithMatcher:grey_notNil()];
 }
 
 // Returns GREYElementInteraction for `matcher`, using `scrollViewMatcher` to
diff --git a/net/base/isolation_info_unittest.cc b/net/base/isolation_info_unittest.cc
index f4ce423..ef280b82 100644
--- a/net/base/isolation_info_unittest.cc
+++ b/net/base/isolation_info_unittest.cc
@@ -101,7 +101,7 @@
   EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
   EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
   EXPECT_EQ("https://foo.test https://foo.test",
-            isolation_info.network_isolation_key().ToString());
+            isolation_info.network_isolation_key().ToCacheKeyString());
   EXPECT_TRUE(
       isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
   EXPECT_EQ(kPartyContextEmpty, isolation_info.party_context());
@@ -122,8 +122,9 @@
   EXPECT_TRUE(
       redirected_isolation_info.network_isolation_key().IsFullyPopulated());
   EXPECT_FALSE(redirected_isolation_info.network_isolation_key().IsTransient());
-  EXPECT_EQ("https://baz.test https://baz.test",
-            redirected_isolation_info.network_isolation_key().ToString());
+  EXPECT_EQ(
+      "https://baz.test https://baz.test",
+      redirected_isolation_info.network_isolation_key().ToCacheKeyString());
   EXPECT_TRUE(redirected_isolation_info.site_for_cookies().IsFirstParty(
       kOrigin3.GetURL()));
   EXPECT_EQ(kPartyContextEmpty, redirected_isolation_info.party_context());
@@ -140,11 +141,11 @@
   if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
     EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
     EXPECT_EQ("https://foo.test https://foo.test",
-              isolation_info.network_isolation_key().ToString());
+              isolation_info.network_isolation_key().ToCacheKeyString());
   } else {
     EXPECT_EQ(kOrigin2, isolation_info.frame_origin());
     EXPECT_EQ("https://foo.test https://bar.test",
-              isolation_info.network_isolation_key().ToString());
+              isolation_info.network_isolation_key().ToCacheKeyString());
   }
   EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
   EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
@@ -163,12 +164,14 @@
 
   if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
     EXPECT_EQ(kOrigin1, redirected_isolation_info.frame_origin());
-    EXPECT_EQ("https://foo.test https://foo.test",
-              redirected_isolation_info.network_isolation_key().ToString());
+    EXPECT_EQ(
+        "https://foo.test https://foo.test",
+        redirected_isolation_info.network_isolation_key().ToCacheKeyString());
   } else {
     EXPECT_EQ(kOrigin3, redirected_isolation_info.frame_origin());
-    EXPECT_EQ("https://foo.test https://baz.test",
-              redirected_isolation_info.network_isolation_key().ToString());
+    EXPECT_EQ(
+        "https://foo.test https://baz.test",
+        redirected_isolation_info.network_isolation_key().ToCacheKeyString());
   }
   EXPECT_TRUE(
       redirected_isolation_info.network_isolation_key().IsFullyPopulated());
@@ -193,7 +196,8 @@
   }
   EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
   EXPECT_TRUE(isolation_info.network_isolation_key().IsTransient());
-  EXPECT_EQ("", isolation_info.network_isolation_key().ToString());
+  EXPECT_EQ(absl::nullopt,
+            isolation_info.network_isolation_key().ToCacheKeyString());
   EXPECT_TRUE(
       isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
   EXPECT_EQ(kPartyContextEmpty, isolation_info.party_context());
@@ -214,7 +218,9 @@
   EXPECT_TRUE(
       redirected_isolation_info.network_isolation_key().IsFullyPopulated());
   EXPECT_TRUE(redirected_isolation_info.network_isolation_key().IsTransient());
-  EXPECT_EQ("", redirected_isolation_info.network_isolation_key().ToString());
+  EXPECT_EQ(
+      absl::nullopt,
+      redirected_isolation_info.network_isolation_key().ToCacheKeyString());
   EXPECT_TRUE(redirected_isolation_info.site_for_cookies().IsFirstParty(
       kOrigin3.GetURL()));
   EXPECT_EQ(kPartyContextEmpty, redirected_isolation_info.party_context());
@@ -235,7 +241,8 @@
   }
   EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
   EXPECT_TRUE(isolation_info.network_isolation_key().IsTransient());
-  EXPECT_EQ("", isolation_info.network_isolation_key().ToString());
+  EXPECT_EQ(absl::nullopt,
+            isolation_info.network_isolation_key().ToCacheKeyString());
   EXPECT_TRUE(
       isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
   EXPECT_EQ(kPartyContext1, isolation_info.party_context());
@@ -256,7 +263,9 @@
   EXPECT_TRUE(
       redirected_isolation_info.network_isolation_key().IsFullyPopulated());
   EXPECT_TRUE(redirected_isolation_info.network_isolation_key().IsTransient());
-  EXPECT_EQ("", redirected_isolation_info.network_isolation_key().ToString());
+  EXPECT_EQ(
+      absl::nullopt,
+      redirected_isolation_info.network_isolation_key().ToCacheKeyString());
   EXPECT_TRUE(redirected_isolation_info.site_for_cookies().IsFirstParty(
       kOrigin1.GetURL()));
   EXPECT_EQ(kPartyContext1, redirected_isolation_info.party_context());
@@ -298,7 +307,7 @@
   EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
   EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
   EXPECT_EQ("https://foo.test https://foo.test",
-            isolation_info.network_isolation_key().ToString());
+            isolation_info.network_isolation_key().ToCacheKeyString());
   EXPECT_TRUE(
       isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
   EXPECT_EQ(kPartyContextEmpty, isolation_info.party_context());
@@ -322,11 +331,11 @@
   if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
     EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
     EXPECT_EQ("https://foo.test https://foo.test",
-              isolation_info.network_isolation_key().ToString());
+              isolation_info.network_isolation_key().ToCacheKeyString());
   } else {
     EXPECT_EQ(kOrigin2, isolation_info.frame_origin());
     EXPECT_EQ("https://foo.test https://bar.test",
-              isolation_info.network_isolation_key().ToString());
+              isolation_info.network_isolation_key().ToCacheKeyString());
   }
   EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
   EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
@@ -376,7 +385,7 @@
   EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
   EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
   EXPECT_EQ("https://foo.test https://foo.test",
-            isolation_info.network_isolation_key().ToString());
+            isolation_info.network_isolation_key().ToCacheKeyString());
   EXPECT_TRUE(
       isolation_info.site_for_cookies().IsFirstParty(kOrigin1.GetURL()));
   EXPECT_EQ(kPartyContextEmpty, isolation_info.party_context());
@@ -510,11 +519,11 @@
   if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
     EXPECT_EQ(kCustomOrigin, isolation_info.frame_origin());
     EXPECT_EQ("foo://a.foo.com foo://a.foo.com",
-              isolation_info.network_isolation_key().ToString());
+              isolation_info.network_isolation_key().ToCacheKeyString());
   } else {
     EXPECT_EQ(kOrigin1, isolation_info.frame_origin());
     EXPECT_EQ("foo://a.foo.com https://foo.test",
-              isolation_info.network_isolation_key().ToString());
+              isolation_info.network_isolation_key().ToCacheKeyString());
   }
   EXPECT_TRUE(isolation_info.network_isolation_key().IsFullyPopulated());
   EXPECT_FALSE(isolation_info.network_isolation_key().IsTransient());
diff --git a/net/base/network_delegate.cc b/net/base/network_delegate.cc
index cac13fadf..6a5a4e2 100644
--- a/net/base/network_delegate.cc
+++ b/net/base/network_delegate.cc
@@ -104,11 +104,10 @@
 bool NetworkDelegate::AnnotateAndMoveUserBlockedCookies(
     const URLRequest& request,
     net::CookieAccessResultList& maybe_included_cookies,
-    net::CookieAccessResultList& excluded_cookies,
-    bool allowed_from_caller) {
+    net::CookieAccessResultList& excluded_cookies) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   bool allowed = OnAnnotateAndMoveUserBlockedCookies(
-      request, maybe_included_cookies, excluded_cookies, allowed_from_caller);
+      request, maybe_included_cookies, excluded_cookies);
   cookie_util::DCheckIncludedAndExcludedCookieLists(maybe_included_cookies,
                                                     excluded_cookies);
   return allowed;
@@ -116,11 +115,10 @@
 
 bool NetworkDelegate::CanSetCookie(const URLRequest& request,
                                    const CanonicalCookie& cookie,
-                                   CookieOptions* options,
-                                   bool allowed_from_caller) {
+                                   CookieOptions* options) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(!(request.load_flags() & LOAD_DO_NOT_SAVE_COOKIES));
-  return OnCanSetCookie(request, cookie, options, allowed_from_caller);
+  return OnCanSetCookie(request, cookie, options);
 }
 
 NetworkDelegate::PrivacySetting NetworkDelegate::ForcePrivacyMode(
diff --git a/net/base/network_delegate.h b/net/base/network_delegate.h
index b9919cd8..3297b067 100644
--- a/net/base/network_delegate.h
+++ b/net/base/network_delegate.h
@@ -79,12 +79,10 @@
   bool AnnotateAndMoveUserBlockedCookies(
       const URLRequest& request,
       CookieAccessResultList& maybe_included_cookies,
-      CookieAccessResultList& excluded_cookies,
-      bool allowed_from_caller);
+      CookieAccessResultList& excluded_cookies);
   bool CanSetCookie(const URLRequest& request,
                     const net::CanonicalCookie& cookie,
-                    CookieOptions* options,
-                    bool allowed_from_caller);
+                    CookieOptions* options);
 
   // PrivacySetting is kStateDisallowed iff the given |url| has to be
   // requested over connection that is not tracked by the server.
@@ -249,19 +247,14 @@
   virtual bool OnAnnotateAndMoveUserBlockedCookies(
       const URLRequest& request,
       net::CookieAccessResultList& maybe_included_cookies,
-      net::CookieAccessResultList& excluded_cookies,
-      bool allowed_from_caller) = 0;
+      net::CookieAccessResultList& excluded_cookies) = 0;
 
   // Called when a cookie is set to allow the network delegate to block access
   // to the cookie. This method will never be invoked when
   // LOAD_DO_NOT_SAVE_COOKIES is specified.
-  // The |allowed_from_caller| param is used to pass whether this operation is
-  // allowed from any higher level delegates (for example, in a
-  // LayeredNetworkDelegate). Any custom logic should be ANDed with this bool.
   virtual bool OnCanSetCookie(const URLRequest& request,
                               const CanonicalCookie& cookie,
-                              CookieOptions* options,
-                              bool allowed_from_caller) = 0;
+                              CookieOptions* options) = 0;
 
   virtual PrivacySetting OnForcePrivacyMode(
       const GURL& url,
diff --git a/net/base/network_delegate_impl.cc b/net/base/network_delegate_impl.cc
index a47dbb0..e460c9d7 100644
--- a/net/base/network_delegate_impl.cc
+++ b/net/base/network_delegate_impl.cc
@@ -51,19 +51,14 @@
 bool NetworkDelegateImpl::OnAnnotateAndMoveUserBlockedCookies(
     const URLRequest& request,
     net::CookieAccessResultList& maybe_included_cookies,
-    net::CookieAccessResultList& excluded_cookies,
-    bool allowed_from_caller) {
-  if (!allowed_from_caller)
-    ExcludeAllCookies(CookieInclusionStatus::EXCLUDE_USER_PREFERENCES,
-                      maybe_included_cookies, excluded_cookies);
-  return allowed_from_caller;
+    net::CookieAccessResultList& excluded_cookies) {
+  return true;
 }
 
 bool NetworkDelegateImpl::OnCanSetCookie(const URLRequest& request,
                                          const net::CanonicalCookie& cookie,
-                                         CookieOptions* options,
-                                         bool allowed_from_caller) {
-  return allowed_from_caller;
+                                         CookieOptions* options) {
+  return true;
 }
 
 NetworkDelegate::PrivacySetting NetworkDelegateImpl::OnForcePrivacyMode(
diff --git a/net/base/network_delegate_impl.h b/net/base/network_delegate_impl.h
index b4dacd82..7a79654 100644
--- a/net/base/network_delegate_impl.h
+++ b/net/base/network_delegate_impl.h
@@ -69,13 +69,11 @@
   bool OnAnnotateAndMoveUserBlockedCookies(
       const URLRequest& request,
       net::CookieAccessResultList& maybe_included_cookies,
-      net::CookieAccessResultList& excluded_cookies,
-      bool allowed_from_caller) override;
+      net::CookieAccessResultList& excluded_cookies) override;
 
   bool OnCanSetCookie(const URLRequest& request,
                       const net::CanonicalCookie& cookie,
-                      CookieOptions* options,
-                      bool allowed_from_caller) override;
+                      CookieOptions* options) override;
 
   NetworkDelegate::PrivacySetting OnForcePrivacyMode(
       const GURL& url,
diff --git a/net/base/network_isolation_key.cc b/net/base/network_isolation_key.cc
index 4ee3e9e..700d6f4 100644
--- a/net/base/network_isolation_key.cc
+++ b/net/base/network_isolation_key.cc
@@ -79,9 +79,9 @@
   return key;
 }
 
-std::string NetworkIsolationKey::ToString() const {
+absl::optional<std::string> NetworkIsolationKey::ToCacheKeyString() const {
   if (IsTransient())
-    return "";
+    return absl::nullopt;
 
   return top_frame_site_->Serialize() + " " + frame_site_->Serialize();
 }
diff --git a/net/base/network_isolation_key.h b/net/base/network_isolation_key.h
index d0076ed..0d73917 100644
--- a/net/base/network_isolation_key.h
+++ b/net/base/network_isolation_key.h
@@ -94,9 +94,11 @@
            std::tie(other.top_frame_site_, other.frame_site_, other.nonce_);
   }
 
-  // Returns the string representation of the key, which is the string
-  // representation of each piece of the key separated by spaces.
-  std::string ToString() const;
+  // Returns the string representation of the key for use in string-keyed disk
+  // cache. This is the string representation of each piece of the key separated
+  // by spaces. Returns nullopt if the network isolation key is transient, in
+  // which case, nothing should typically be saved to disk using the key.
+  absl::optional<std::string> ToCacheKeyString() const;
 
   // Returns string for debugging. Difference from ToString() is that transient
   // entries may be distinguishable from each other.
diff --git a/net/base/network_isolation_key_unittest.cc b/net/base/network_isolation_key_unittest.cc
index a2320dd..80b2d5c 100644
--- a/net/base/network_isolation_key_unittest.cc
+++ b/net/base/network_isolation_key_unittest.cc
@@ -10,6 +10,7 @@
 #include "net/base/features.h"
 #include "net/base/schemeful_site.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "url/gurl.h"
 #include "url/url_util.h"
 
@@ -46,7 +47,7 @@
 TEST_P(NetworkIsolationKeyTest, EmptyKey) {
   NetworkIsolationKey key;
   EXPECT_FALSE(key.IsFullyPopulated());
-  EXPECT_EQ(std::string(), key.ToString());
+  EXPECT_EQ(absl::nullopt, key.ToCacheKeyString());
   EXPECT_TRUE(key.IsTransient());
   EXPECT_EQ("null null", key.ToDebugString());
 }
@@ -57,11 +58,13 @@
   NetworkIsolationKey key(site1, site2);
   EXPECT_TRUE(key.IsFullyPopulated());
   if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
-    EXPECT_EQ(site1.Serialize() + " " + site1.Serialize(), key.ToString());
+    EXPECT_EQ(site1.Serialize() + " " + site1.Serialize(),
+              key.ToCacheKeyString());
     EXPECT_EQ(site1.GetDebugString() + " " + site1.GetDebugString(),
               key.ToDebugString());
   } else {
-    EXPECT_EQ(site1.Serialize() + " " + site2.Serialize(), key.ToString());
+    EXPECT_EQ(site1.Serialize() + " " + site2.Serialize(),
+              key.ToCacheKeyString());
     EXPECT_EQ(site1.GetDebugString() + " " + site2.GetDebugString(),
               key.ToDebugString());
   }
@@ -74,7 +77,7 @@
   base::UnguessableToken nonce = base::UnguessableToken::Create();
   NetworkIsolationKey key(site1, site2, &nonce);
   EXPECT_TRUE(key.IsFullyPopulated());
-  EXPECT_EQ("", key.ToString());
+  EXPECT_EQ(absl::nullopt, key.ToCacheKeyString());
   EXPECT_TRUE(key.IsTransient());
   if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
     EXPECT_EQ(site1.GetDebugString() + " " + site1.GetDebugString() +
@@ -103,7 +106,7 @@
   SchemefulSite site_data = SchemefulSite(GURL(kDataUrl));
   NetworkIsolationKey key(site_data, site_data);
   EXPECT_TRUE(key.IsFullyPopulated());
-  EXPECT_EQ(std::string(), key.ToString());
+  EXPECT_EQ(absl::nullopt, key.ToCacheKeyString());
   EXPECT_TRUE(key.IsTransient());
 
   // Create another site with an opaque origin, and make sure it's different and
@@ -196,13 +199,13 @@
   if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
     EXPECT_FALSE(key1.IsTransient());
     EXPECT_EQ(site.GetDebugString() + " " + site.GetDebugString(),
-              key1.ToString());
+              key1.ToCacheKeyString());
 
     EXPECT_EQ(site.GetDebugString() + " " + site.GetDebugString(),
               key1.ToDebugString());
   } else {
     EXPECT_TRUE(key1.IsTransient());
-    EXPECT_EQ("", key1.ToString());
+    EXPECT_EQ(absl::nullopt, key1.ToCacheKeyString());
     EXPECT_EQ(site.GetDebugString() + " " + opaque_site.GetDebugString(),
               key1.ToDebugString());
   }
@@ -210,7 +213,7 @@
   NetworkIsolationKey key2(opaque_site, site);
   EXPECT_TRUE(key2.IsFullyPopulated());
   EXPECT_TRUE(key2.IsTransient());
-  EXPECT_EQ("", key2.ToString());
+  EXPECT_EQ(absl::nullopt, key2.ToCacheKeyString());
   if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
     EXPECT_EQ(opaque_site.GetDebugString() + " " + opaque_site.GetDebugString(),
               key2.ToDebugString());
@@ -305,10 +308,10 @@
   EXPECT_TRUE(key.IsFullyPopulated());
   EXPECT_FALSE(key.IsTransient());
   if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
-    EXPECT_EQ("http://b.test http://b.test", key.ToString());
+    EXPECT_EQ("http://b.test http://b.test", key.ToCacheKeyString());
     EXPECT_EQ("http://b.test http://b.test", key.ToDebugString());
   } else {
-    EXPECT_EQ("http://b.test http://a.test", key.ToString());
+    EXPECT_EQ("http://b.test http://a.test", key.ToCacheKeyString());
     EXPECT_EQ("http://b.test http://a.test", key.ToDebugString());
   }
   EXPECT_TRUE(key == key);
@@ -327,12 +330,12 @@
     EXPECT_FALSE(key1.IsTransient());
 
     EXPECT_EQ(NetworkIsolationKey(site_a, site_data2), key1);
-    EXPECT_EQ("http://a.test http://a.test", key1.ToString());
+    EXPECT_EQ("http://a.test http://a.test", key1.ToCacheKeyString());
     EXPECT_EQ("http://a.test http://a.test", key1.ToDebugString());
   } else {
     EXPECT_TRUE(key1.IsTransient());
 
-    EXPECT_EQ("", key1.ToString());
+    EXPECT_EQ(absl::nullopt, key1.ToCacheKeyString());
     EXPECT_EQ("http://a.test " + site_data.GetDebugString(),
               key1.ToDebugString());
     EXPECT_NE(NetworkIsolationKey(site_a, site_data2), key1);
@@ -341,7 +344,7 @@
   NetworkIsolationKey key2(site_data, site_a);
   EXPECT_TRUE(key2.IsFullyPopulated());
   EXPECT_TRUE(key2.IsTransient());
-  EXPECT_EQ("", key2.ToString());
+  EXPECT_EQ(absl::nullopt, key2.ToCacheKeyString());
   if (ForceIsolationInfoFrameOriginToTopLevelFrameEnabled()) {
     EXPECT_EQ(site_data.GetDebugString() + " " + site_data.GetDebugString(),
               key2.ToDebugString());
@@ -385,9 +388,9 @@
 
   // Test the ToString and ToDebugString
   EXPECT_EQ(key1.ToDebugString(), key2.ToDebugString());
-  EXPECT_EQ("", key1.ToString());
-  EXPECT_EQ("", key2.ToString());
-  EXPECT_EQ("", key3.ToString());
+  EXPECT_EQ(absl::nullopt, key1.ToCacheKeyString());
+  EXPECT_EQ(absl::nullopt, key2.ToCacheKeyString());
+  EXPECT_EQ(absl::nullopt, key3.ToCacheKeyString());
 }
 
 // Make sure that the logic to extract the registerable domain from an origin
@@ -401,7 +404,7 @@
   SchemefulSite site = SchemefulSite(GURL("foo://a.foo.com"));
   net::NetworkIsolationKey key(site, site);
   EXPECT_FALSE(key.GetTopFrameSite()->opaque());
-  EXPECT_EQ("foo://a.foo.com foo://a.foo.com", key.ToString());
+  EXPECT_EQ("foo://a.foo.com foo://a.foo.com", key.ToCacheKeyString());
 }
 
 TEST_P(NetworkIsolationKeyTest, CreateWithNewFrameSite) {
diff --git a/net/http/http_auth_cache.cc b/net/http/http_auth_cache.cc
index 81f82ea..4ae47ed 100644
--- a/net/http/http_auth_cache.cc
+++ b/net/http/http_auth_cache.cc
@@ -341,7 +341,7 @@
       continue;
 
     // Sanity check - proxy entries should have an empty NetworkIsolationKey.
-    DCHECK_EQ(NetworkIsolationKey(), it->first.network_isolation_key);
+    DCHECK(NetworkIsolationKey() == it->first.network_isolation_key);
 
     // Add an Entry with one of the original entry's paths.
     DCHECK(e.paths_.size() > 0);
diff --git a/net/http/http_cache.cc b/net/http/http_cache.cc
index 7d53cec..d725477 100644
--- a/net/http/http_cache.cc
+++ b/net/http/http_cache.cc
@@ -48,6 +48,7 @@
 #include "net/http/http_util.h"
 #include "net/log/net_log_with_source.h"
 #include "net/quic/quic_server_info.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 
 #if BUILDFLAG(IS_POSIX)
 #include <unistd.h>
@@ -365,7 +366,7 @@
       request_info.load_flags |= ~LOAD_DO_NOT_SAVE_COOKIES;
   }
 
-  std::string key = GenerateCacheKeyForRequest(
+  std::string key = *GenerateCacheKeyForRequest(
       &request_info, /*use_single_keyed_cache=*/false);
   disk_cache_->OnExternalCacheHit(key);
 }
@@ -467,7 +468,7 @@
 
   // TODO(https://crbug.com/1325315): Support looking in the single-keyed cache
   // for the resource.
-  std::string key = GenerateCacheKeyForRequest(
+  std::string key = *GenerateCacheKeyForRequest(
       &request_info, /*use_single_keyed_cache=*/false);
   disk_cache::EntryResult entry_result = disk_cache_->OpenEntry(
       key, net::IDLE,
@@ -482,7 +483,7 @@
 
 // static
 // Generate a key that can be used inside the cache.
-std::string HttpCache::GenerateCacheKey(
+absl::optional<std::string> HttpCache::GenerateCacheKey(
     const GURL& url,
     int load_flags,
     const NetworkIsolationKey& network_isolation_key,
@@ -517,12 +518,13 @@
     // double-keyed (and makes it an invalid url so that it doesn't get
     // confused with a single-keyed entry). Separate the origin and url
     // with invalid whitespace character |kDoubleKeySeparator|.
-    DCHECK(!network_isolation_key.IsTransient());
+    if (network_isolation_key.IsTransient())
+      return absl::nullopt;
     std::string subframe_document_resource_prefix =
         is_subframe_document_resource ? kSubframeDocumentResourcePrefix : "";
-    isolation_key =
-        base::StrCat({kDoubleKeyPrefix, subframe_document_resource_prefix,
-                      network_isolation_key.ToString(), kDoubleKeySeparator});
+    isolation_key = base::StrCat(
+        {kDoubleKeyPrefix, subframe_document_resource_prefix,
+         *network_isolation_key.ToCacheKeyString(), kDoubleKeySeparator});
   }
 
   // The key format is:
@@ -537,7 +539,7 @@
 }
 
 // static
-std::string HttpCache::GenerateCacheKeyForRequest(
+absl::optional<std::string> HttpCache::GenerateCacheKeyForRequest(
     const HttpRequestInfo* request,
     bool use_single_keyed_cache) {
   DCHECK(request);
@@ -726,7 +728,7 @@
   // single-keyed cache, so therefore it is correct that use_single_keyed_cache
   // be false.
   std::string key =
-      GenerateCacheKeyForRequest(&temp_info, /*use_single_keyed_cache=*/false);
+      *GenerateCacheKeyForRequest(&temp_info, /*use_single_keyed_cache=*/false);
 
   // Defer to DoomEntry if there is an active entry, otherwise call
   // AsyncDoomEntry without triggering a callback.
diff --git a/net/http/http_cache.h b/net/http/http_cache.h
index 8bf7072..06f27b1 100644
--- a/net/http/http_cache.h
+++ b/net/http/http_cache.h
@@ -36,6 +36,7 @@
 #include "net/base/net_export.h"
 #include "net/base/request_priority.h"
 #include "net/http/http_transaction_factory.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 
 class GURL;
 
@@ -258,8 +259,11 @@
   // Get the URL from the entry's cache key.
   static std::string GetResourceURLFromHttpCacheKey(const std::string& key);
 
-  // Generates the cache key for a request.
-  static std::string GenerateCacheKey(
+  // Generates the cache key for a request. Returns nullopt if the cache is
+  // configured to be split by the NetworkIsolationKey, and the
+  // NetworkIsolationKey is transient, in which case nothing should generally be
+  // stored to disk.
+  static absl::optional<std::string> GenerateCacheKey(
       const GURL& url,
       int load_flags,
       const NetworkIsolationKey& network_isolation_key,
@@ -267,7 +271,7 @@
       bool is_subframe_document_resource,
       bool use_single_keyed_cache,
       const std::string& single_key_checksum);
-  static std::string GenerateCacheKeyForRequest(
+  static absl::optional<std::string> GenerateCacheKeyForRequest(
       const HttpRequestInfo* request,
       bool use_single_keyed_cache = false);
 
diff --git a/net/http/http_cache_transaction.cc b/net/http/http_cache_transaction.cc
index 61ee20a1..c9153d53 100644
--- a/net/http/http_cache_transaction.cc
+++ b/net/http/http_cache_transaction.cc
@@ -1043,7 +1043,7 @@
     // DoCacheReadResponseComplete(), even though `request_` will still have a
     // checksum. So it needs to be passed explicitly.
     cache_key_ =
-        cache_->GenerateCacheKeyForRequest(request_, use_single_keyed_cache_);
+        *cache_->GenerateCacheKeyForRequest(request_, use_single_keyed_cache_);
 
     // Requested cache access mode.
     if (effective_load_flags_ & LOAD_ONLY_FROM_CACHE) {
diff --git a/net/http/http_cache_unittest.cc b/net/http/http_cache_unittest.cc
index a8ba8e0b..a0deb96d 100644
--- a/net/http/http_cache_unittest.cc
+++ b/net/http/http_cache_unittest.cc
@@ -825,7 +825,7 @@
     request_info.method = "GET";
     request_info.network_isolation_key = net::NetworkIsolationKey(site, site);
     MockHttpCache cache;
-    return cache.http_cache()->GenerateCacheKeyForRequest(&request_info);
+    return *cache.http_cache()->GenerateCacheKeyForRequest(&request_info);
   }
 };
 
@@ -5336,7 +5336,7 @@
   // All would have been added to writers.
   base::RunLoop().RunUntilIdle();
   std::string cache_key =
-      cache.http_cache()->GenerateCacheKeyForRequest(&request);
+      *cache.http_cache()->GenerateCacheKeyForRequest(&request);
   EXPECT_EQ(kNumTransactions, cache.GetCountWriterTransactions(cache_key));
 
   // The second transaction skipped validation, thus only one network
@@ -8311,7 +8311,7 @@
   disk_cache::Entry* entry;
   MockHttpRequest request(transaction);
   std::string cache_key =
-      cache.http_cache()->GenerateCacheKeyForRequest(&request);
+      *cache.http_cache()->GenerateCacheKeyForRequest(&request);
   ASSERT_TRUE(cache.OpenBackendEntry(cache_key, &entry));
   entry->CancelSparseIO();
 
@@ -10919,7 +10919,7 @@
   // Now make a request with an opaque subframe site.  It shouldn't be
   // cached.
   trans_info.network_isolation_key = NetworkIsolationKey(site_a, site_data);
-  EXPECT_TRUE(trans_info.network_isolation_key.ToString().empty());
+  EXPECT_EQ(absl::nullopt, trans_info.network_isolation_key.ToCacheKeyString());
   RunTransactionTestWithRequest(cache.http_cache(), kSimpleGET_Transaction,
                                 trans_info, &response);
   EXPECT_FALSE(response.was_cached);
@@ -11143,7 +11143,7 @@
   // Now make a request with an opaque top frame origin.  It shouldn't be
   // cached.
   trans_info.network_isolation_key = NetworkIsolationKey(site_data, site_data);
-  EXPECT_TRUE(trans_info.network_isolation_key.ToString().empty());
+  EXPECT_EQ(absl::nullopt, trans_info.network_isolation_key.ToCacheKeyString());
   RunTransactionTestWithRequest(cache.http_cache(), kSimpleGET_Transaction,
                                 trans_info, &response);
   EXPECT_FALSE(response.was_cached);
diff --git a/net/http/http_transaction_test_util.cc b/net/http/http_transaction_test_util.cc
index 95beb9d..8650999 100644
--- a/net/http/http_transaction_test_util.cc
+++ b/net/http/http_transaction_test_util.cc
@@ -204,7 +204,7 @@
 }
 
 std::string MockHttpRequest::CacheKey() {
-  return HttpCache::GenerateCacheKeyForRequest(this);
+  return *HttpCache::GenerateCacheKeyForRequest(this);
 }
 
 //-----------------------------------------------------------------------------
diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc
index 8efcfbc..98987fd 100644
--- a/net/quic/quic_stream_factory_test.cc
+++ b/net/quic/quic_stream_factory_test.cc
@@ -1325,7 +1325,7 @@
 
   for (const auto& network_isolation_key :
        {kNetworkIsolationKey1, kNetworkIsolationKey2, NetworkIsolationKey()}) {
-    SCOPED_TRACE(network_isolation_key.ToString());
+    SCOPED_TRACE(network_isolation_key.ToDebugString());
 
     ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
     crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
diff --git a/net/reporting/reporting_cache_impl.cc b/net/reporting/reporting_cache_impl.cc
index f3405d3bae..c976515 100644
--- a/net/reporting/reporting_cache_impl.cc
+++ b/net/reporting/reporting_cache_impl.cc
@@ -389,8 +389,8 @@
 
     // Consistency check: the new client should have the same NIK and origin as
     // all groups parsed from this header.
-    DCHECK_EQ(new_group.group_key.network_isolation_key,
-              new_client.network_isolation_key);
+    DCHECK(new_group.group_key.network_isolation_key ==
+           new_client.network_isolation_key);
     DCHECK_EQ(new_group.group_key.origin, new_client.origin);
 
     for (const auto& parsed_endpoint_info : parsed_endpoint_group.endpoints) {
@@ -867,8 +867,8 @@
   DCHECK(!reporting_source.is_empty());
   DCHECK(group_key.IsDocumentEndpoint());
   DCHECK_EQ(reporting_source, group_key.reporting_source.value());
-  DCHECK_EQ(group_key.network_isolation_key,
-            isolation_info.network_isolation_key());
+  DCHECK(group_key.network_isolation_key ==
+         isolation_info.network_isolation_key());
 
   ReportingEndpoint::EndpointInfo info;
   info.url = url;
diff --git a/net/reporting/reporting_delivery_agent.cc b/net/reporting/reporting_delivery_agent.cc
index edc9f2a..149681a8 100644
--- a/net/reporting/reporting_delivery_agent.cc
+++ b/net/reporting/reporting_delivery_agent.cc
@@ -135,13 +135,12 @@
                   const ReportList::const_iterator reports_begin,
                   const ReportList::const_iterator reports_end) {
     DCHECK(reports_begin != reports_end);
-    DCHECK_EQ(endpoint.group_key.network_isolation_key,
-              network_isolation_key());
+    DCHECK(endpoint.group_key.network_isolation_key == network_isolation_key());
     DCHECK(IsSubdomainOf(target_.origin.host() /* subdomain */,
                          endpoint.group_key.origin.host() /* superdomain */));
     for (auto it = reports_begin; it != reports_end; ++it) {
       DCHECK_EQ((*reports_begin)->GetGroupKey(), (*it)->GetGroupKey());
-      DCHECK_EQ((*it)->network_isolation_key, network_isolation_key());
+      DCHECK((*it)->network_isolation_key == network_isolation_key());
       DCHECK_EQ(url::Origin::Create((*it)->url), target_.origin);
       DCHECK_EQ((*it)->group, endpoint.group_key.group_name);
       // Report origin is equal to, or a subdomain of, the endpoint
diff --git a/net/socket/client_socket_pool_base_unittest.cc b/net/socket/client_socket_pool_base_unittest.cc
index 16ebd84..7edbdf8 100644
--- a/net/socket/client_socket_pool_base_unittest.cc
+++ b/net/socket/client_socket_pool_base_unittest.cc
@@ -875,7 +875,7 @@
       for (const auto& privacy_mode : kPrivacyModes) {
         SCOPED_TRACE(privacy_mode);
         for (const auto& network_isolation_key : kNetworkIsolationKeys) {
-          SCOPED_TRACE(network_isolation_key.ToString());
+          SCOPED_TRACE(network_isolation_key.ToDebugString());
           for (const auto& secure_dns_policy : kSecureDnsPolicys) {
             SCOPED_TRACE(static_cast<int>(secure_dns_policy));
 
diff --git a/net/socket/client_socket_pool_unittest.cc b/net/socket/client_socket_pool_unittest.cc
index 8f8c24c..462467a 100644
--- a/net/socket/client_socket_pool_unittest.cc
+++ b/net/socket/client_socket_pool_unittest.cc
@@ -77,7 +77,7 @@
         for (const auto& privacy_mode : kPrivacyModes) {
           SCOPED_TRACE(privacy_mode);
           for (const auto& network_isolation_key : kNetworkIsolationKeys) {
-            SCOPED_TRACE(network_isolation_key.ToString());
+            SCOPED_TRACE(network_isolation_key.ToDebugString());
             for (const auto& secure_dns_policy : kDisableSecureDnsValues) {
               ClientSocketPool::GroupId group_id(
                   url::SchemeHostPort(scheme, host, port), privacy_mode,
diff --git a/net/url_request/url_request.cc b/net/url_request/url_request.cc
index f502e7b..3ad6523 100644
--- a/net/url_request/url_request.cc
+++ b/net/url_request/url_request.cc
@@ -1049,9 +1049,7 @@
   DCHECK(!(load_flags_ & LOAD_DO_NOT_SAVE_COOKIES));
   bool can_set_cookies = g_default_can_use_cookies;
   if (network_delegate()) {
-    can_set_cookies =
-        network_delegate()->CanSetCookie(*this, cookie, options,
-                                         /*allowed_from_caller=*/true);
+    can_set_cookies = network_delegate()->CanSetCookie(*this, cookie, options);
   }
   if (!can_set_cookies)
     net_log_.AddEvent(NetLogEventType::COOKIE_SET_BLOCKED_BY_NETWORK_DELEGATE);
diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc
index ccb8fa8..7febcbd 100644
--- a/net/url_request/url_request_http_job.cc
+++ b/net/url_request/url_request_http_job.cc
@@ -800,8 +800,7 @@
   if (request()->network_delegate()) {
     can_get_cookies =
         request()->network_delegate()->AnnotateAndMoveUserBlockedCookies(
-            *request(), maybe_included_cookies, excluded_cookies,
-            /*allowed_from_caller=*/true);
+            *request(), maybe_included_cookies, excluded_cookies);
   }
 
   if (!can_get_cookies) {
diff --git a/net/url_request/url_request_test_util.cc b/net/url_request/url_request_test_util.cc
index 7e1bd7ea..2c0b36a 100644
--- a/net/url_request/url_request_test_util.cc
+++ b/net/url_request/url_request_test_util.cc
@@ -502,9 +502,8 @@
 bool TestNetworkDelegate::OnAnnotateAndMoveUserBlockedCookies(
     const URLRequest& request,
     net::CookieAccessResultList& maybe_included_cookies,
-    net::CookieAccessResultList& excluded_cookies,
-    bool allowed_from_caller) {
-  bool allow = allowed_from_caller;
+    net::CookieAccessResultList& excluded_cookies) {
+  bool allow = true;
   if (cookie_options_bit_mask_ & NO_GET_COOKIES)
     allow = false;
 
@@ -527,9 +526,8 @@
 
 bool TestNetworkDelegate::OnCanSetCookie(const URLRequest& request,
                                          const net::CanonicalCookie& cookie,
-                                         CookieOptions* options,
-                                         bool allowed_from_caller) {
-  bool allow = allowed_from_caller;
+                                         CookieOptions* options) {
+  bool allow = true;
   if (cookie_options_bit_mask_ & NO_SET_COOKIE)
     allow = false;
 
@@ -566,18 +564,19 @@
 bool FilteringTestNetworkDelegate::OnCanSetCookie(
     const URLRequest& request,
     const net::CanonicalCookie& cookie,
-    CookieOptions* options,
-    bool allowed_from_caller) {
+    CookieOptions* options) {
   // Filter out cookies with the same name as |cookie_name_filter_| and
   // combine with |allowed_from_caller|.
-  bool allowed = allowed_from_caller && !(cookie.Name() == cookie_name_filter_);
+  bool allowed = cookie.Name() != cookie_name_filter_;
 
   ++set_cookie_called_count_;
 
   if (!allowed)
     ++blocked_set_cookie_count_;
 
-  return TestNetworkDelegate::OnCanSetCookie(request, cookie, options, allowed);
+  // Call the nested delegate's method first to avoid a short circuit.
+  return TestNetworkDelegate::OnCanSetCookie(request, cookie, options) &&
+         allowed;
 }
 
 NetworkDelegate::PrivacySetting
@@ -599,11 +598,10 @@
 bool FilteringTestNetworkDelegate::OnAnnotateAndMoveUserBlockedCookies(
     const URLRequest& request,
     net::CookieAccessResultList& maybe_included_cookies,
-    net::CookieAccessResultList& excluded_cookies,
-    bool allowed_from_caller) {
+    net::CookieAccessResultList& excluded_cookies) {
   // Filter out cookies if |block_annotate_cookies_| is set and
   // combine with |allowed_from_caller|.
-  bool allowed = allowed_from_caller && !block_annotate_cookies_;
+  bool allowed = !block_annotate_cookies_;
 
   ++annotate_cookies_called_count_;
 
@@ -630,8 +628,10 @@
     MoveExcludedCookies(maybe_included_cookies, excluded_cookies);
   }
 
+  // Call the nested delegate's method first to avoid a short circuit.
   return TestNetworkDelegate::OnAnnotateAndMoveUserBlockedCookies(
-      request, maybe_included_cookies, excluded_cookies, allowed);
+             request, maybe_included_cookies, excluded_cookies) &&
+         allowed;
 }
 
 // URLRequestInterceptor that intercepts only the first request it sees,
diff --git a/net/url_request/url_request_test_util.h b/net/url_request/url_request_test_util.h
index 05e5399f..e8fa60fb 100644
--- a/net/url_request/url_request_test_util.h
+++ b/net/url_request/url_request_test_util.h
@@ -311,8 +311,7 @@
   bool OnAnnotateAndMoveUserBlockedCookies(
       const URLRequest& request,
       net::CookieAccessResultList& maybe_included_cookies,
-      net::CookieAccessResultList& excluded_cookies,
-      bool allowed_from_caller) override;
+      net::CookieAccessResultList& excluded_cookies) override;
   NetworkDelegate::PrivacySetting OnForcePrivacyMode(
       const GURL& url,
       const SiteForCookies& site_for_cookies,
@@ -320,8 +319,7 @@
       SamePartyContext::Type same_party_context_type) const override;
   bool OnCanSetCookie(const URLRequest& request,
                       const net::CanonicalCookie& cookie,
-                      CookieOptions* options,
-                      bool allowed_from_caller) override;
+                      CookieOptions* options) override;
   bool OnCancelURLRequestWithPolicyViolatingReferrerHeader(
       const URLRequest& request,
       const GURL& target_url,
@@ -380,8 +378,7 @@
 
   bool OnCanSetCookie(const URLRequest& request,
                       const net::CanonicalCookie& cookie,
-                      CookieOptions* options,
-                      bool allowed_from_caller) override;
+                      CookieOptions* options) override;
 
   void SetCookieFilter(std::string filter) {
     cookie_name_filter_ = std::move(filter);
@@ -398,8 +395,7 @@
   bool OnAnnotateAndMoveUserBlockedCookies(
       const URLRequest& request,
       net::CookieAccessResultList& maybe_included_cookies,
-      net::CookieAccessResultList& excluded_cookies,
-      bool allowed_from_caller) override;
+      net::CookieAccessResultList& excluded_cookies) override;
 
   NetworkDelegate::PrivacySetting OnForcePrivacyMode(
       const GURL& url,
diff --git a/services/device/BUILD.gn b/services/device/BUILD.gn
index 9df9588..4057a343 100644
--- a/services/device/BUILD.gn
+++ b/services/device/BUILD.gn
@@ -135,8 +135,8 @@
 
   sources = [
     "battery/battery_status_service_unittest.cc",
+    "compute_pressure/platform_collector_unittest.cc",
     "compute_pressure/pressure_manager_impl_unittest.cc",
-    "compute_pressure/pressure_sampler_unittest.cc",
     "compute_pressure/pressure_test_support.cc",
     "compute_pressure/pressure_test_support.h",
     "generic_sensor/absolute_orientation_euler_angles_fusion_algorithm_using_accelerometer_and_magnetometer_unittest.cc",
diff --git a/services/device/compute_pressure/BUILD.gn b/services/device/compute_pressure/BUILD.gn
index 31a42fc..7be9e30 100644
--- a/services/device/compute_pressure/BUILD.gn
+++ b/services/device/compute_pressure/BUILD.gn
@@ -10,11 +10,11 @@
   sources = [
     "cpu_probe.cc",
     "cpu_probe.h",
+    "platform_collector.cc",
+    "platform_collector.h",
     "pressure_manager_impl.cc",
     "pressure_manager_impl.h",
     "pressure_sample.h",
-    "pressure_sampler.cc",
-    "pressure_sampler.h",
   ]
 
   public_deps = [ "//services/device/public/mojom" ]
diff --git a/services/device/compute_pressure/cpu_probe_linux.cc b/services/device/compute_pressure/cpu_probe_linux.cc
index b0bae35f..612a625 100644
--- a/services/device/compute_pressure/cpu_probe_linux.cc
+++ b/services/device/compute_pressure/cpu_probe_linux.cc
@@ -50,7 +50,7 @@
     const CoreTimes& current_core_times = core_times[i];
 
     if (last_core_times_.size() == i) {
-      InitializeCore(static_cast<int>(i), current_core_times);
+      InitializeCore(i, current_core_times);
       continue;
     }
 
@@ -78,11 +78,11 @@
   return last_sample_;
 }
 
-void CpuProbeLinux::InitializeCore(int core_index,
+void CpuProbeLinux::InitializeCore(size_t core_index,
                                    const CoreTimes& initial_core_times) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK_GE(core_index, 0);
-  DCHECK_EQ(last_core_times_.size(), static_cast<size_t>(core_index));
+  DCHECK_GE(core_index, 0u);
+  DCHECK_EQ(last_core_times_.size(), core_index);
 
   last_core_times_.push_back(initial_core_times);
 }
diff --git a/services/device/compute_pressure/cpu_probe_linux.h b/services/device/compute_pressure/cpu_probe_linux.h
index 67485ae..f19c9eb 100644
--- a/services/device/compute_pressure/cpu_probe_linux.h
+++ b/services/device/compute_pressure/cpu_probe_linux.h
@@ -45,7 +45,7 @@
   //
   // For most systems, the cores listed in /proc/stat are static. However, it is
   // theoretically possible for cores to go online and offline.
-  void InitializeCore(int core_index, const CoreTimes& initial_core_times);
+  void InitializeCore(size_t core_index, const CoreTimes& initial_core_times);
 
   SEQUENCE_CHECKER(sequence_checker_);
 
diff --git a/services/device/compute_pressure/pressure_sampler.cc b/services/device/compute_pressure/platform_collector.cc
similarity index 87%
rename from services/device/compute_pressure/pressure_sampler.cc
rename to services/device/compute_pressure/platform_collector.cc
index c9f68e3..ac9f8352 100644
--- a/services/device/compute_pressure/pressure_sampler.cc
+++ b/services/device/compute_pressure/platform_collector.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "services/device/compute_pressure/pressure_sampler.h"
+#include "services/device/compute_pressure/platform_collector.h"
 
 #include <utility>
 
@@ -33,7 +33,7 @@
 
 }  // namespace
 
-PressureSampler::PressureSampler(
+PlatformCollector::PlatformCollector(
     std::unique_ptr<CpuProbe> probe,
     base::TimeDelta sampling_interval,
     base::RepeatingCallback<void(PressureSample)> sampling_callback)
@@ -44,12 +44,12 @@
   DCHECK(sampling_callback_);
 }
 
-PressureSampler::~PressureSampler() {
+PlatformCollector::~PlatformCollector() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   probe_task_runner_->DeleteSoon(FROM_HERE, std::move(probe_));
 }
 
-void PressureSampler::EnsureStarted() {
+void PlatformCollector::EnsureStarted() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(has_probe()) << __func__
                       << " should not be called if has_probe() returns false";
@@ -67,18 +67,18 @@
   // base::Unretained usage is safe here because base::RepeatingTimer guarantees
   // that its callback will not be called after it goes out of scope.
   timer_.Start(FROM_HERE, sampling_interval_,
-               base::BindRepeating(&PressureSampler::UpdateProbe,
+               base::BindRepeating(&PlatformCollector::UpdateProbe,
                                    base::Unretained(this)));
 }
 
-void PressureSampler::Stop() {
+void PlatformCollector::Stop() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   timer_.AbandonAndStop();
   got_probe_baseline_ = false;
 }
 
-void PressureSampler::UpdateProbe() {
+void PlatformCollector::UpdateProbe() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(has_probe());
 
@@ -93,11 +93,11 @@
             return probe->LastSample();
           },
           probe_.get()),
-      base::BindOnce(&PressureSampler::DidUpdateProbe,
+      base::BindOnce(&PlatformCollector::DidUpdateProbe,
                      weak_factory_.GetWeakPtr()));
 }
 
-void PressureSampler::DidUpdateProbe(PressureSample sample) {
+void PlatformCollector::DidUpdateProbe(PressureSample sample) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   // Don't report the update result if Stop() was called.
diff --git a/services/device/compute_pressure/pressure_sampler.h b/services/device/compute_pressure/platform_collector.h
similarity index 86%
rename from services/device/compute_pressure/pressure_sampler.h
rename to services/device/compute_pressure/platform_collector.h
index 1c85310..2353ddc 100644
--- a/services/device/compute_pressure/pressure_sampler.h
+++ b/services/device/compute_pressure/platform_collector.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef SERVICES_DEVICE_COMPUTE_PRESSURE_PRESSURE_SAMPLER_H_
-#define SERVICES_DEVICE_COMPUTE_PRESSURE_PRESSURE_SAMPLER_H_
+#ifndef SERVICES_DEVICE_COMPUTE_PRESSURE_PLATFORM_COLLECTOR_H_
+#define SERVICES_DEVICE_COMPUTE_PRESSURE_PLATFORM_COLLECTOR_H_
 
 #include <memory>
 
@@ -29,7 +29,7 @@
 // Instances are not thread-safe. They must be used on the same sequence.
 //
 // The instance is owned by a PressureManagerImpl.
-class PressureSampler {
+class PlatformCollector {
  public:
   // The caller must ensure that `cpu_probe` outlives this instance. Production
   // code should pass CpuProbe::Create().
@@ -37,13 +37,13 @@
   // `sampling_interval` is exposed to avoid idling in tests. Production code
   // should pass `kDefaultSamplingInterval`.
   //
-  // `sampling_callback` is called regularly every `sampling_interval` while the
-  // sampler is started.
-  PressureSampler(
+  // `sampling_callback` is called regularly every `sampling_interval` while
+  // the collector is started.
+  PlatformCollector(
       std::unique_ptr<CpuProbe> cpu_probe,
       base::TimeDelta sampling_interval,
       base::RepeatingCallback<void(PressureSample)> sampling_callback);
-  ~PressureSampler();
+  ~PlatformCollector();
 
   bool has_probe() const {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -66,7 +66,7 @@
   }
 
  private:
-  // Called periodically while the sampler is running.
+  // Called periodically while the collector is running.
   void UpdateProbe();
   // Called after the CpuProbe is updated.
   void DidUpdateProbe(PressureSample sample);
@@ -78,7 +78,7 @@
 
   // Methods on the underlying probe must be executed on `probe_task_runner_`.
   //
-  // Constant between the sampler's construction and destruction.
+  // Constant between the collector's construction and destruction.
   std::unique_ptr<CpuProbe> probe_ GUARDED_BY_CONTEXT(sequence_checker_);
 
   // Drives repeated sampling.
@@ -98,10 +98,10 @@
   // reported via `sampling_callback_`.
   bool got_probe_baseline_ GUARDED_BY_CONTEXT(sequence_checker_) = false;
 
-  base::WeakPtrFactory<PressureSampler> weak_factory_
+  base::WeakPtrFactory<PlatformCollector> weak_factory_
       GUARDED_BY_CONTEXT(sequence_checker_){this};
 };
 
 }  // namespace device
 
-#endif  // SERVICES_DEVICE_COMPUTE_PRESSURE_PRESSURE_SAMPLER_H_
+#endif  // SERVICES_DEVICE_COMPUTE_PRESSURE_PLATFORM_COLLECTOR_H_
diff --git a/services/device/compute_pressure/pressure_sampler_unittest.cc b/services/device/compute_pressure/platform_collector_unittest.cc
similarity index 76%
rename from services/device/compute_pressure/pressure_sampler_unittest.cc
rename to services/device/compute_pressure/platform_collector_unittest.cc
index 53ba05b..1fc0664 100644
--- a/services/device/compute_pressure/pressure_sampler_unittest.cc
+++ b/services/device/compute_pressure/platform_collector_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "services/device/compute_pressure/pressure_sampler.h"
+#include "services/device/compute_pressure/platform_collector.h"
 
 #include <cstddef>
 #include <memory>
@@ -26,13 +26,13 @@
 
 namespace device {
 
-class PressureSamplerTest : public testing::Test {
+class PlatformCollectorTest : public testing::Test {
  public:
-  PressureSamplerTest()
-      : sampler_(std::make_unique<PressureSampler>(
+  PlatformCollectorTest()
+      : collector_(std::make_unique<PlatformCollector>(
             std::make_unique<FakeCpuProbe>(),
             base::Milliseconds(1),
-            base::BindRepeating(&PressureSamplerTest::SamplerCallback,
+            base::BindRepeating(&PlatformCollectorTest::CollectorCallback,
                                 base::Unretained(this)))) {}
 
   void WaitForUpdate() {
@@ -43,16 +43,16 @@
     run_loop.Run();
   }
 
-  // Only valid if `sampler_` uses a FakeCpuProbe. This is guaranteed if
-  // `sampler_` is not replaced during the test.
+  // Only valid if `collector_` uses a FakeCpuProbe. This is guaranteed if
+  // `collector_` is not replaced during the test.
   FakeCpuProbe& cpu_probe() {
     auto* cpu_probe =
-        static_cast<FakeCpuProbe*>(sampler_->cpu_probe_for_testing());
+        static_cast<FakeCpuProbe*>(collector_->cpu_probe_for_testing());
     DCHECK(cpu_probe);
     return *cpu_probe;
   }
 
-  void SamplerCallback(PressureSample sample) {
+  void CollectorCallback(PressureSample sample) {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     samples_.push_back(sample);
     if (update_callback_) {
@@ -66,9 +66,9 @@
 
   base::test::TaskEnvironment task_environment_;
 
-  // This member is a std::unique_ptr instead of a plain PressureSampler
+  // This member is a std::unique_ptr instead of a plain PlatformCollector
   // so it can be replaced inside tests.
-  std::unique_ptr<PressureSampler> sampler_;
+  std::unique_ptr<PlatformCollector> collector_;
 
   // The samples reported by the callback.
   std::vector<PressureSample> samples_ GUARDED_BY_CONTEXT(sequence_checker_);
@@ -85,10 +85,10 @@
   base::OnceClosure update_callback_ GUARDED_BY_CONTEXT(sequence_checker_);
 };
 
-TEST_F(PressureSamplerTest, EnsureStarted) {
+TEST_F(PlatformCollectorTest, EnsureStarted) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  sampler_->EnsureStarted();
+  collector_->EnsureStarted();
   WaitForUpdate();
 
   EXPECT_GE(samples_.size(), 1u);
@@ -145,7 +145,7 @@
 
 }  // namespace
 
-TEST_F(PressureSamplerTest, EnsureStarted_SkipsFirstSample) {
+TEST_F(PlatformCollectorTest, EnsureStarted_SkipsFirstSample) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   std::vector<PressureSample> samples = {
@@ -158,12 +158,12 @@
   };
 
   base::RunLoop run_loop;
-  sampler_ = std::make_unique<PressureSampler>(
+  collector_ = std::make_unique<PlatformCollector>(
       std::make_unique<StreamingCpuProbe>(samples, run_loop.QuitClosure()),
       base::Milliseconds(1),
-      base::BindRepeating(&PressureSamplerTest::SamplerCallback,
+      base::BindRepeating(&PlatformCollectorTest::CollectorCallback,
                           base::Unretained(this)));
-  sampler_->EnsureStarted();
+  collector_->EnsureStarted();
   run_loop.Run();
 
   EXPECT_GE(samples_.size(), 1u);
@@ -172,74 +172,82 @@
 }
 
 // TODO(crbug.com/1271419): Flaky.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_FUCHSIA)
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_WIN)
 #define MAYBE_Stop_Delayed_EnsureStarted_Immediate \
   DISABLED_Stop_Delayed_EnsureStarted_Immediate
 #else
 #define MAYBE_Stop_Delayed_EnsureStarted_Immediate \
   Stop_Delayed_EnsureStarted_Immediate
 #endif
-TEST_F(PressureSamplerTest, MAYBE_Stop_Delayed_EnsureStarted_Immediate) {
+TEST_F(PlatformCollectorTest, MAYBE_Stop_Delayed_EnsureStarted_Immediate) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  sampler_->EnsureStarted();
+  collector_->EnsureStarted();
   WaitForUpdate();
-  sampler_->Stop();
+  collector_->Stop();
 
   samples_.clear();
   cpu_probe().SetLastSample(PressureSample{0.25});
 
-  sampler_->EnsureStarted();
+  collector_->EnsureStarted();
   WaitForUpdate();
   EXPECT_GE(samples_.size(), 1u);
   EXPECT_THAT(samples_, testing::Contains(PressureSample{0.25}));
 }
 
-TEST_F(PressureSamplerTest, Stop_Delayed_EnsureStarted_Delayed) {
+// TODO(crbug.com/1271419): Flaky.
+#if BUILDFLAG(IS_WIN)
+#define MAYBE_Stop_Delayed_EnsureStarted_Delayed \
+  DISABLED_Stop_Delayed_EnsureStarted_Delayed
+#else
+#define MAYBE_Stop_Delayed_EnsureStarted_Delayed \
+  Stop_Delayed_EnsureStarted_Delayed
+#endif
+TEST_F(PlatformCollectorTest, MAYBE_Stop_Delayed_EnsureStarted_Delayed) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  sampler_->EnsureStarted();
+  collector_->EnsureStarted();
   WaitForUpdate();
-  sampler_->Stop();
+  collector_->Stop();
 
   samples_.clear();
   cpu_probe().SetLastSample(PressureSample{0.25});
   // 10ms should be long enough to ensure that all the sampling tasks are done.
   base::PlatformThread::Sleep(base::Milliseconds(10));
 
-  sampler_->EnsureStarted();
+  collector_->EnsureStarted();
   WaitForUpdate();
   EXPECT_GE(samples_.size(), 1u);
   EXPECT_THAT(samples_, testing::Contains(PressureSample{0.25}));
 }
 
-TEST_F(PressureSamplerTest, Stop_Immediate_EnsureStarted_Immediate) {
+TEST_F(PlatformCollectorTest, Stop_Immediate_EnsureStarted_Immediate) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  sampler_->EnsureStarted();
-  sampler_->Stop();
+  collector_->EnsureStarted();
+  collector_->Stop();
 
   samples_.clear();
   cpu_probe().SetLastSample(PressureSample{0.25});
 
-  sampler_->EnsureStarted();
+  collector_->EnsureStarted();
   WaitForUpdate();
   EXPECT_GE(samples_.size(), 1u);
   EXPECT_THAT(samples_, testing::Contains(PressureSample{0.25}));
 }
 
-TEST_F(PressureSamplerTest, Stop_Immediate_EnsureStarted_Delayed) {
+TEST_F(PlatformCollectorTest, Stop_Immediate_EnsureStarted_Delayed) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  sampler_->EnsureStarted();
-  sampler_->Stop();
+  collector_->EnsureStarted();
+  collector_->Stop();
 
   samples_.clear();
   cpu_probe().SetLastSample(PressureSample{0.25});
   // 10ms should be long enough to ensure that all the sampling tasks are done.
   base::PlatformThread::Sleep(base::Milliseconds(10));
 
-  sampler_->EnsureStarted();
+  collector_->EnsureStarted();
   WaitForUpdate();
   EXPECT_GE(samples_.size(), 1u);
   EXPECT_THAT(samples_, testing::Contains(PressureSample{0.25}));
diff --git a/services/device/compute_pressure/pressure_manager_impl.cc b/services/device/compute_pressure/pressure_manager_impl.cc
index b5a2478a..1e241f50 100644
--- a/services/device/compute_pressure/pressure_manager_impl.cc
+++ b/services/device/compute_pressure/pressure_manager_impl.cc
@@ -12,8 +12,8 @@
 #include "mojo/public/cpp/bindings/message.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "services/device/compute_pressure/cpu_probe.h"
+#include "services/device/compute_pressure/platform_collector.h"
 #include "services/device/compute_pressure/pressure_sample.h"
-#include "services/device/compute_pressure/pressure_sampler.h"
 #include "services/device/public/mojom/pressure_state.mojom.h"
 
 namespace device {
@@ -37,11 +37,11 @@
 PressureManagerImpl::PressureManagerImpl(std::unique_ptr<CpuProbe> cpu_probe,
                                          base::TimeDelta sampling_interval)
     // base::Unretained usage is safe here because the callback is only run
-    // while `sampler_` is alive, and `sampler_` is owned by this instance.
-    : sampler_(std::move(cpu_probe),
-               sampling_interval,
-               base::BindRepeating(&PressureManagerImpl::UpdateClients,
-                                   base::Unretained(this))) {
+    // while `collector_` is alive, and `collector_` is owned by this instance.
+    : collector_(std::move(cpu_probe),
+                 sampling_interval,
+                 base::BindRepeating(&PressureManagerImpl::UpdateClients,
+                                     base::Unretained(this))) {
   // base::Unretained use is safe because mojo guarantees the callback will not
   // be called after `clients_` is deallocated, and `clients_` is owned by
   // PressureManagerImpl.
@@ -66,12 +66,12 @@
     AddClientCallback callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  if (!sampler_.has_probe()) {
+  if (!collector_.has_probe()) {
     std::move(callback).Run(false);
     return;
   }
   clients_.Add(std::move(client));
-  sampler_.EnsureStarted();
+  collector_.EnsureStarted();
   std::move(callback).Run(true);
 }
 
@@ -89,7 +89,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (clients_.empty())
-    sampler_.Stop();
+    collector_.Stop();
 }
 
 }  // namespace device
diff --git a/services/device/compute_pressure/pressure_manager_impl.h b/services/device/compute_pressure/pressure_manager_impl.h
index 85d579d..664b247 100644
--- a/services/device/compute_pressure/pressure_manager_impl.h
+++ b/services/device/compute_pressure/pressure_manager_impl.h
@@ -14,8 +14,8 @@
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver_set.h"
 #include "mojo/public/cpp/bindings/remote_set.h"
+#include "services/device/compute_pressure/platform_collector.h"
 #include "services/device/compute_pressure/pressure_sample.h"
-#include "services/device/compute_pressure/pressure_sampler.h"
 #include "services/device/public/mojom/pressure_manager.mojom.h"
 
 namespace device {
@@ -24,7 +24,7 @@
 
 // Handles the communication between the browser process and services.
 //
-// This class owns one instance of PressureSampler. The PressureSampler
+// This class owns one instance of PlatformCollector. The PlatformCollector
 // instance keeps collecting compute pressure information from the
 // underlying operating system when `clients_` is not empty and stops
 // collecting when `clients_` becomes empty.
@@ -61,15 +61,15 @@
   PressureManagerImpl(std::unique_ptr<CpuProbe> cpu_probe,
                       base::TimeDelta sampling_interval);
 
-  // Called periodically by PressureSampler.
+  // Called periodically by PlatformCollector.
   void UpdateClients(PressureSample sample);
 
-  // Stop `sampler_` once there is no client.
+  // Stop `collector_` once there is no client.
   void OnClientRemoteDisconnected(mojo::RemoteSetElementId /*id*/);
 
   SEQUENCE_CHECKER(sequence_checker_);
 
-  PressureSampler sampler_ GUARDED_BY_CONTEXT(sequence_checker_);
+  PlatformCollector collector_ GUARDED_BY_CONTEXT(sequence_checker_);
 
   mojo::ReceiverSet<mojom::PressureManager> receivers_
       GUARDED_BY_CONTEXT(sequence_checker_);
diff --git a/services/device/geolocation/wifi_data_provider_chromeos_unittest.cc b/services/device/geolocation/wifi_data_provider_chromeos_unittest.cc
index 2935d22..ecaeacec 100644
--- a/services/device/geolocation/wifi_data_provider_chromeos_unittest.cc
+++ b/services/device/geolocation/wifi_data_provider_chromeos_unittest.cc
@@ -56,7 +56,7 @@
   }
 
   base::test::SingleThreadTaskEnvironment task_environment_;
-  chromeos::NetworkHandlerTestHelper network_handler_test_helper_;
+  ash::NetworkHandlerTestHelper network_handler_test_helper_;
   scoped_refptr<WifiDataProviderChromeOs> provider_;
   chromeos::ShillManagerClient::TestInterface* manager_test_;
   WifiData::AccessPointDataSet ap_data_;
diff --git a/services/network/http_cache_data_remover_unittest.cc b/services/network/http_cache_data_remover_unittest.cc
index 30118548..c59916ab 100644
--- a/services/network/http_cache_data_remover_unittest.cc
+++ b/services/network/http_cache_data_remover_unittest.cc
@@ -123,7 +123,7 @@
     request_info.method = "GET";
     request_info.network_isolation_key =
         net::NetworkIsolationKey(kOrigin, kOrigin);
-    return cache_->GenerateCacheKeyForRequest(&request_info);
+    return *cache_->GenerateCacheKeyForRequest(&request_info);
   }
 
   void RemoveData(mojom::ClearDataFilterPtr filter,
diff --git a/services/network/network_context_unittest.cc b/services/network/network_context_unittest.cc
index 03989a99..e8d9d89 100644
--- a/services/network/network_context_unittest.cc
+++ b/services/network/network_context_unittest.cc
@@ -1778,7 +1778,7 @@
             is_subframe_document_resource;
         request_info.network_isolation_key = isolation_key;
         disk_cache::EntryResult result = backend->OpenOrCreateEntry(
-            net::HttpCache::GenerateCacheKeyForRequest(&request_info),
+            *net::HttpCache::GenerateCacheKeyForRequest(&request_info),
             net::LOWEST, base::BindOnce([](disk_cache::EntryResult) {}));
         ASSERT_EQ(result.net_error(), net::OK);
 
@@ -4175,11 +4175,11 @@
       net::COOKIE_PRIORITY_LOW, false);
   EXPECT_TRUE(
       network_context->url_request_context()->network_delegate()->CanSetCookie(
-          *request, *cookie, nullptr, true));
+          *request, *cookie, nullptr));
   SetDefaultContentSetting(CONTENT_SETTING_BLOCK, network_context.get());
   EXPECT_FALSE(
       network_context->url_request_context()->network_delegate()->CanSetCookie(
-          *request, *cookie, nullptr, true));
+          *request, *cookie, nullptr));
 }
 
 TEST_F(NetworkContextTest, CanSetCookieTrueIfCookiesAllowed) {
@@ -4197,7 +4197,7 @@
   SetDefaultContentSetting(CONTENT_SETTING_ALLOW, network_context.get());
   EXPECT_TRUE(
       network_context->url_request_context()->network_delegate()->CanSetCookie(
-          *request, *cookie, nullptr, true));
+          *request, *cookie, nullptr));
 }
 
 TEST_F(NetworkContextTest,
@@ -4212,15 +4212,15 @@
   net::CookieAccessResultList included;
   net::CookieAccessResultList excluded;
 
-  EXPECT_TRUE(network_context->url_request_context()
-                  ->network_delegate()
-                  ->AnnotateAndMoveUserBlockedCookies(*request, included,
-                                                      excluded, true));
+  EXPECT_TRUE(
+      network_context->url_request_context()
+          ->network_delegate()
+          ->AnnotateAndMoveUserBlockedCookies(*request, included, excluded));
   SetDefaultContentSetting(CONTENT_SETTING_BLOCK, network_context.get());
-  EXPECT_FALSE(network_context->url_request_context()
-                   ->network_delegate()
-                   ->AnnotateAndMoveUserBlockedCookies(*request, included,
-                                                       excluded, true));
+  EXPECT_FALSE(
+      network_context->url_request_context()
+          ->network_delegate()
+          ->AnnotateAndMoveUserBlockedCookies(*request, included, excluded));
 }
 
 TEST_F(NetworkContextTest,
@@ -4235,10 +4235,10 @@
   net::CookieAccessResultList excluded;
 
   SetDefaultContentSetting(CONTENT_SETTING_ALLOW, network_context.get());
-  EXPECT_TRUE(network_context->url_request_context()
-                  ->network_delegate()
-                  ->AnnotateAndMoveUserBlockedCookies(*request, included,
-                                                      excluded, true));
+  EXPECT_TRUE(
+      network_context->url_request_context()
+          ->network_delegate()
+          ->AnnotateAndMoveUserBlockedCookies(*request, included, excluded));
 }
 
 // Gets notified by the EmbeddedTestServer on incoming connections being
diff --git a/services/network/network_service_memory_cache.cc b/services/network/network_service_memory_cache.cc
index 7c90e0d4..993fb5b2 100644
--- a/services/network/network_service_memory_cache.cc
+++ b/services/network/network_service_memory_cache.cc
@@ -96,12 +96,6 @@
 absl::optional<std::string> GenerateCacheKeyForResourceRequest(
     const ResourceRequest& resource_request,
     const net::NetworkIsolationKey& network_isolation_key) {
-  // See the comment in HttpCache::Transaction::ShouldPassThrough().
-  if (net::HttpCache::IsSplitCacheEnabled() &&
-      network_isolation_key.IsTransient()) {
-    return absl::nullopt;
-  }
-
   const bool is_subframe_document_resource =
       resource_request.destination == mojom::RequestDestination::kIframe;
   return net::HttpCache::GenerateCacheKey(
@@ -113,11 +107,6 @@
 absl::optional<std::string> GenerateCacheKeyForURLRequest(
     const net::URLRequest& url_request,
     mojom::RequestDestination request_destination) {
-  if (net::HttpCache::IsSplitCacheEnabled() &&
-      url_request.isolation_info().network_isolation_key().IsTransient()) {
-    return absl::nullopt;
-  }
-
   bool is_subframe_document_resource =
       request_destination == mojom::RequestDestination::kIframe;
   return net::HttpCache::GenerateCacheKey(
diff --git a/services/network/network_service_network_delegate.cc b/services/network/network_service_network_delegate.cc
index 0a1f0736..5f3bf3a 100644
--- a/services/network/network_service_network_delegate.cc
+++ b/services/network/network_service_network_delegate.cc
@@ -187,14 +187,7 @@
 bool NetworkServiceNetworkDelegate::OnAnnotateAndMoveUserBlockedCookies(
     const net::URLRequest& request,
     net::CookieAccessResultList& maybe_included_cookies,
-    net::CookieAccessResultList& excluded_cookies,
-    bool allowed_from_caller) {
-  if (!allowed_from_caller) {
-    ExcludeAllCookies(net::CookieInclusionStatus::EXCLUDE_USER_PREFERENCES,
-                      maybe_included_cookies, excluded_cookies);
-    return false;
-  }
-
+    net::CookieAccessResultList& excluded_cookies) {
   if (!network_context_->cookie_manager()
            ->cookie_settings()
            .AnnotateAndMoveUserBlockedCookies(
@@ -229,10 +222,8 @@
 bool NetworkServiceNetworkDelegate::OnCanSetCookie(
     const net::URLRequest& request,
     const net::CanonicalCookie& cookie,
-    net::CookieOptions* options,
-    bool allowed_from_caller) {
+    net::CookieOptions* options) {
   bool allowed =
-      allowed_from_caller &&
       network_context_->cookie_manager()->cookie_settings().IsCookieAccessible(
           cookie, request.url(), request.site_for_cookies(),
           request.isolation_info().top_frame_origin());
diff --git a/services/network/network_service_network_delegate.h b/services/network/network_service_network_delegate.h
index 1198b476..f463804d 100644
--- a/services/network/network_service_network_delegate.h
+++ b/services/network/network_service_network_delegate.h
@@ -70,12 +70,10 @@
   bool OnAnnotateAndMoveUserBlockedCookies(
       const net::URLRequest& request,
       net::CookieAccessResultList& maybe_included_cookies,
-      net::CookieAccessResultList& excluded_cookies,
-      bool allowed_from_caller) override;
+      net::CookieAccessResultList& excluded_cookies) override;
   bool OnCanSetCookie(const net::URLRequest& request,
                       const net::CanonicalCookie& cookie,
-                      net::CookieOptions* options,
-                      bool allowed_from_caller) override;
+                      net::CookieOptions* options) override;
   net::NetworkDelegate::PrivacySetting OnForcePrivacyMode(
       const GURL& url,
       const net::SiteForCookies& site_for_cookies,
diff --git a/services/network/resource_scheduler/resource_scheduler_unittest.cc b/services/network/resource_scheduler/resource_scheduler_unittest.cc
index f61e3de..706681d 100644
--- a/services/network/resource_scheduler/resource_scheduler_unittest.cc
+++ b/services/network/resource_scheduler/resource_scheduler_unittest.cc
@@ -522,7 +522,8 @@
     request_info.network_isolation_key =
         net::IsolationInfo().network_isolation_key();
     request_info.is_subframe_document_resource = false;
-    std::string key = net::HttpCache::GenerateCacheKeyForRequest(&request_info);
+    std::string key =
+        *net::HttpCache::GenerateCacheKeyForRequest(&request_info);
 
     TestEntryResultCompletionCallback create_entry_callback;
     disk_cache::EntryResult result = backend->OpenOrCreateEntry(
diff --git a/services/tracing/public/cpp/perfetto/trace_string_lookup.cc b/services/tracing/public/cpp/perfetto/trace_string_lookup.cc
index 6f0b79d..bfbfedc1 100644
--- a/services/tracing/public/cpp/perfetto/trace_string_lookup.cc
+++ b/services/tracing/public/cpp/perfetto/trace_string_lookup.cc
@@ -56,7 +56,7 @@
      ChromeProcessDescriptor::PROCESS_SERVICE_QUARANTINE},
     {"Service: chromeos.local_search_service.mojom.LocalSearchService",
      ChromeProcessDescriptor::PROCESS_SERVICE_CROS_LOCALSEARCH},
-    {"Service: chromeos.assistant.mojom.AssistantAudioDecoderFactory",
+    {"Service: ash.assistant.mojom.AssistantAudioDecoderFactory",
      ChromeProcessDescriptor::PROCESS_SERVICE_CROS_ASSISTANT_AUDIO_DECODER},
     {"Service: chrome.mojom.FileUtilService",
      ChromeProcessDescriptor::PROCESS_SERVICE_FILEUTIL},
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json
index 3650f7f5..8a8c035 100644
--- a/testing/buildbot/chromium.android.fyi.json
+++ b/testing/buildbot/chromium.android.fyi.json
@@ -3929,7 +3929,8 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
+          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n.content_browsertests.filter"
         ],
         "isolate_profile_data": true,
         "merge": {
diff --git a/testing/buildbot/filters/BUILD.gn b/testing/buildbot/filters/BUILD.gn
index 6ae1b616..321df91 100644
--- a/testing/buildbot/filters/BUILD.gn
+++ b/testing/buildbot/filters/BUILD.gn
@@ -97,6 +97,7 @@
     "//testing/buildbot/filters/android.emulator_11.chrome_public_test_apk.filter",
     "//testing/buildbot/filters/android.emulator_12.chrome_public_test_apk.filter",
     "//testing/buildbot/filters/android.emulator_m.chrome_public_test_apk.filter",
+    "//testing/buildbot/filters/android.emulator_n.chrome_public_test_apk.filter",
     "//testing/buildbot/filters/android.emulator_p.chrome_public_test_apk.filter",
   ]
 }
@@ -134,6 +135,7 @@
     "//testing/buildbot/filters/android.asan.content_browsertests.filter",
     "//testing/buildbot/filters/android.emulator_12.content_browsertests.filter",
     "//testing/buildbot/filters/android.emulator_m.content_browsertests.filter",
+    "//testing/buildbot/filters/android.emulator_n.content_browsertests.filter",
     "//testing/buildbot/filters/android.emulator_p.content_browsertests.filter",
     "//testing/buildbot/filters/android.marshmallow_tablet_tester.content_browsertests.filter",
     "//testing/buildbot/filters/cast-linux.content_browsertests.filter",
diff --git a/testing/buildbot/filters/android.emulator_n.content_browsertests.filter b/testing/buildbot/filters/android.emulator_n.content_browsertests.filter
new file mode 100644
index 0000000..4b66b5a
--- /dev/null
+++ b/testing/buildbot/filters/android.emulator_n.content_browsertests.filter
@@ -0,0 +1,8 @@
+# TODO(crbug.com/1326993)
+-All/RenderFrameHostImplBrowsingContextStateNameTest.BlockNameUpdateForBackForwardCache/NewBrowsingContextStateOnBrowsingContextGroupSwap_EnableFrameNameUpdateOnNonCurrentRenderFrameHost
+
+# TODO(crbug.com/1296333)
+-WebRtcBrowserTest.CanSetupH264VideoCallOnSupportedDevice
+
+# TODO(crbug.com/1338951)
+-WebRtcCaptureFromElementBrowserTest.VerifyCanvasWebGLCaptureColor
\ No newline at end of file
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 5b910cad..4d00666 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -1688,6 +1688,9 @@
         },
       },
       'android-nougat-x86-rel': {
+        'args': [
+          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n.content_browsertests.filter',
+        ],
         'swarming': {
           'shards': 20,
         },
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 4f89b44..be6e0a63 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -132,6 +132,21 @@
             ]
         }
     ],
+    "AndroidContextualSearchForceCaption": [
+        {
+            "platforms": [
+                "android"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "ContextualSearchForceCaption"
+                    ]
+                }
+            ]
+        }
+    ],
     "AndroidDynamicPerformanceFramework": [
         {
             "platforms": [
@@ -2851,6 +2866,21 @@
             ]
         }
     ],
+    "ContentSuggestionsUIModuleRefresh": [
+        {
+            "platforms": [
+                "ios"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "ContentSuggestionsUIModuleRefresh"
+                    ]
+                }
+            ]
+        }
+    ],
     "ContextMenuGoogleLensChip": [
         {
             "platforms": [
diff --git a/third_party/abseil-cpp/symbols_arm64_dbg.def b/third_party/abseil-cpp/symbols_arm64_dbg.def
index dbdf937..1c4712e 100644
--- a/third_party/abseil-cpp/symbols_arm64_dbg.def
+++ b/third_party/abseil-cpp/symbols_arm64_dbg.def
@@ -74,6 +74,12 @@
     ??$?0AEAV?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@X@?$__compressed_pair_elem@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@$00$0A@@Cr@std@@QEAA@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z
     ??$?0AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@X@?$__compressed_pair_elem@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@$00$0A@@Cr@std@@QEAA@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z
     ??$?0AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@Cr@std@@X@?$__compressed_pair_elem@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@Cr@std@@$00$0A@@Cr@std@@QEAA@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z
+    ??$?0AEAV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@AEAV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@12@$$QEAV312@@Z
+    ??$?0AEAV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@AEAV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@12@$$QEAV312@@Z
+    ??$?0AEAV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@AEAV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@$$QEAV312@@Z
+    ??$?0AEAV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@AEAV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@12@$$QEAV312@@Z
+    ??$?0AEAV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@AEAV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@$$QEAV312@@Z
+    ??$?0AEAV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@AEAV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@12@$$QEAV312@@Z
     ??$?0AEBV?$allocator@UPayload@status_internal@absl@@@Cr@std@@@?$Storage@V?$allocator@UPayload@status_internal@absl@@@Cr@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEBV?$allocator@UPayload@status_internal@absl@@@Cr@std@@@Z
     ??$?0AEBV?$allocator@UPayload@status_internal@absl@@@Cr@std@@I$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@Cr@std@@_K@container_internal@absl@@QEAA@AEBV?$allocator@UPayload@status_internal@absl@@@Cr@std@@$$QEAI@Z
     ??$?0AEBV?$allocator@UPayload@status_internal@absl@@@Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@Cr@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEBV?$allocator@UPayload@status_internal@absl@@@Cr@std@@$$QEAI@Z
@@ -91,10 +97,14 @@
     ??$?0MU__default_init_tag@Cr@std@@@?$__compressed_pair@MV?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@Cr@std@@@Cr@std@@QEAA@$$QEAM$$QEAU__default_init_tag@12@@Z
     ??$?0PEAI@?$SaltedSeedSeq@Vseed_seq@Cr@std@@@random_internal@absl@@QEAA@PEAI0@Z
     ??$?0PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV01234@$0A@@?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@Cr@std@@QEAA@$$QEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z
+    ??$?0PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV012@$0A@@?$pair@PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV123@@Cr@std@@QEAA@$$QEAPEAPEAVCordzHandle@cord_internal@absl@@0@Z
+    ??$?0PEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV012@$0A@@?$pair@PEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV123@@Cr@std@@QEAA@$$QEAPEAPEBVCordzHandle@cord_internal@absl@@0@Z
+    ??$?0PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU0123@$0A@@?$pair@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU1234@@Cr@std@@QEAA@$$QEAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@0@Z
     ??$?0PEAUTransition@cctz@time_internal@absl@@@?$__wrap_iter@PEBUTransition@cctz@time_internal@absl@@@Cr@std@@QEAA@AEBV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@12@PEAX@Z
     ??$?0PEAUTransition@cctz@time_internal@absl@@PEAU0123@$0A@@?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@Cr@std@@QEAA@$$QEAPEAUTransition@cctz@time_internal@absl@@0@Z
     ??$?0PEAUTransitionType@cctz@time_internal@absl@@@?$__wrap_iter@PEBUTransitionType@cctz@time_internal@absl@@@Cr@std@@QEAA@AEBV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@12@PEAX@Z
     ??$?0PEAUTransitionType@cctz@time_internal@absl@@PEAU0123@$0A@@?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@Cr@std@@QEAA@$$QEAPEAUTransitionType@cctz@time_internal@absl@@0@Z
+    ??$?0PEAUViableSubstitution@strings_internal@absl@@PEAU012@$0A@@?$pair@PEAUViableSubstitution@strings_internal@absl@@PEAU123@@Cr@std@@QEAA@$$QEAPEAUViableSubstitution@strings_internal@absl@@0@Z
     ??$?0PEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@Cr@std@@@?$__compressed_pair@PEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@Cr@std@@@Cr@std@@QEAA@$$QEAPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@$$QEAU?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@12@@Z
     ??$?0PEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@X@?$__compressed_pair_elem@PEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@$0A@$0A@@Cr@std@@QEAA@$$QEAPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@Z
     ??$?0PEBVFormatArgImpl@str_format_internal@absl@@PEAV012@$0A@@?$pair@PEBVFormatArgImpl@str_format_internal@absl@@PEAV123@@Cr@std@@QEAA@$$QEAPEBVFormatArgImpl@str_format_internal@absl@@$$QEAPEAV345@@Z
@@ -164,6 +174,12 @@
     ??$?0V?$basic_ostream@DU?$char_traits@D@Cr@std@@@Cr@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAV?$basic_ostream@DU?$char_traits@D@Cr@std@@@Cr@std@@@Z
     ??$?0V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@$0A@@Cord@absl@@QEAA@$$QEAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z
     ??$?0V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z
+    ??$?0V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@$$QEAV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@12@0@Z
+    ??$?0V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@$$QEAV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@12@0@Z
+    ??$?0V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@$$QEAV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@0@Z
+    ??$?0V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@$$QEAV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z
+    ??$?0V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@$$QEAV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z
+    ??$?0V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@$$QEAV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@12@0@Z
     ??$?0V?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@XV012@H@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEAA@AEBV?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@@Z
     ??$?0VBufferRawSink@str_format_internal@absl@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAVBufferRawSink@12@@Z
     ??$?0VFILERawSink@str_format_internal@absl@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAVFILERawSink@12@@Z
@@ -457,14 +473,6 @@
     ??$__construct_at_end@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z
     ??$__construct_at_end@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z
     ??$__construct_at_end@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z
-    ??$__construct_backward_with_exception_guarantees@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@Cr@std@@PEAVCordzHandle@cord_internal@absl@@X@Cr@std@@YAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@01@PEAPEAVCordzHandle@cord_internal@absl@@1AEAPEAPEAV345@@Z
-    ??$__construct_backward_with_exception_guarantees@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@Cr@std@@PEBVCordzHandle@cord_internal@absl@@X@Cr@std@@YAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@01@PEAPEBVCordzHandle@cord_internal@absl@@1AEAPEAPEBV345@@Z
-    ??$__construct_backward_with_exception_guarantees@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@X@Cr@std@@YAXAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@1AEAPEAU3456@@Z
-    ??$__construct_backward_with_exception_guarantees@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@UTransition@cctz@time_internal@absl@@X@Cr@std@@YAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@01@PEAUTransition@cctz@time_internal@absl@@1AEAPEAU3456@@Z
-    ??$__construct_backward_with_exception_guarantees@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@UTransitionType@cctz@time_internal@absl@@X@Cr@std@@YAXAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@PEAUTransitionType@cctz@time_internal@absl@@1AEAPEAU3456@@Z
-    ??$__construct_backward_with_exception_guarantees@V?$allocator@UViableSubstitution@strings_internal@absl@@@Cr@std@@UViableSubstitution@strings_internal@absl@@X@Cr@std@@YAXAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@PEAUViableSubstitution@strings_internal@absl@@1AEAPEAU345@@Z
-    ??$__construct_forward_with_exception_guarantees@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@YAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@01@PEAUTransition@cctz@time_internal@absl@@1AEAPEAU3456@@Z
-    ??$__construct_forward_with_exception_guarantees@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@YAXAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@PEAUTransitionType@cctz@time_internal@absl@@1AEAPEAU3456@@Z
     ??$__construct_node_hash@AEBUpiecewise_construct_t@Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@AEAA?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@PEAX@Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@PEAX@Cr@std@@@Cr@std@@@23@@12@_KAEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z
     ??$__construct_one_at_end@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEAAXXZ
     ??$__construct_one_at_end@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEAAXXZ
@@ -473,7 +481,6 @@
     ??$__construct_one_at_end@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEBQEBVCordzHandle@cord_internal@absl@@@Z
     ??$__construct_one_at_end@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEBUTransition@cctz@time_internal@absl@@@Z
     ??$__construct_one_at_end@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEAAX$$QEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z
-    ??$__construct_range_forward@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@$$CBVFormatArgImpl@str_format_internal@absl@@V456@V456@V456@X@Cr@std@@YAXAEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@01@PEBVFormatArgImpl@str_format_internal@absl@@1AEAPEAV345@@Z
     ??$__copy@PEBVFormatArgImpl@str_format_internal@absl@@PEBV123@PEAV123@$0A@@Cr@std@@YA?AU?$pair@PEBVFormatArgImpl@str_format_internal@absl@@PEAV123@@01@PEBVFormatArgImpl@str_format_internal@absl@@0PEAV345@@Z
     ??$__copy_impl@$$CBVFormatArgImpl@str_format_internal@absl@@V123@X@Cr@std@@YA?AU?$pair@PEBVFormatArgImpl@str_format_internal@absl@@PEAV123@@01@PEBVFormatArgImpl@str_format_internal@absl@@0PEAV345@@Z
     ??$__cxx_atomic_compare_exchange_weak@PEAUHashtablezInfo@container_internal@absl@@@Cr@std@@YA_NPEAU?$__cxx_atomic_base_impl@PEAUHashtablezInfo@container_internal@absl@@@01@PEAPEAUHashtablezInfo@container_internal@absl@@PEAU345@W4memory_order@01@3@Z
@@ -526,22 +533,48 @@
     ??$__move@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@PEAPEAPEBV12345@@Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z
     ??$__move@PEAUTransition@cctz@time_internal@absl@@PEAU1234@PEAU1234@@Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z
     ??$__move@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@PEAU1234@@Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z
+    ??$__move@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@00@Z
+    ??$__move@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@00@Z
+    ??$__move@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@00@Z
+    ??$__move@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@00@Z
+    ??$__move@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@00@Z
+    ??$__move@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@00@Z
     ??$__move_backward@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@@Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@00@Z
     ??$__move_backward@UTransition@cctz@time_internal@absl@@U1234@@Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@00@Z
     ??$__move_backward@UTransitionType@cctz@time_internal@absl@@U1234@@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@00@Z
+    ??$__move_impl@PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV123@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@00@Z
+    ??$__move_impl@PEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV123@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@00@Z
     ??$__move_impl@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@X@Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z
+    ??$__move_impl@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU1234@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@00@Z
+    ??$__move_impl@PEAUTransition@cctz@time_internal@absl@@PEAU1234@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@00@Z
+    ??$__move_impl@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@00@Z
+    ??$__move_impl@PEAUViableSubstitution@strings_internal@absl@@PEAU123@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@00@Z
+    ??$__move_impl@PEAVCordzHandle@cord_internal@absl@@PEAV123@X@Cr@std@@YA?AU?$pair@PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV123@@01@PEAPEAVCordzHandle@cord_internal@absl@@00@Z
+    ??$__move_impl@PEBVCordzHandle@cord_internal@absl@@PEBV123@X@Cr@std@@YA?AU?$pair@PEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV123@@01@PEAPEBVCordzHandle@cord_internal@absl@@00@Z
+    ??$__move_impl@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U1234@X@Cr@std@@YA?AU?$pair@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU1234@@01@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@00@Z
     ??$__move_impl@UTransition@cctz@time_internal@absl@@U1234@X@Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z
     ??$__move_impl@UTransitionType@cctz@time_internal@absl@@U1234@X@Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z
+    ??$__move_impl@UViableSubstitution@strings_internal@absl@@U123@X@Cr@std@@YA?AU?$pair@PEAUViableSubstitution@strings_internal@absl@@PEAU123@@01@PEAUViableSubstitution@strings_internal@absl@@00@Z
     ??$__push_back_slow_path@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEBQEAVCordzHandle@cord_internal@absl@@@Z
     ??$__push_back_slow_path@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEBQEBVCordzHandle@cord_internal@absl@@@Z
     ??$__push_back_slow_path@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEBUTransition@cctz@time_internal@absl@@@Z
     ??$__push_back_slow_path@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEAAX$$QEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z
     ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@AEAAX_K@Z
-    ??$__rewrap_iter@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@0@Z
-    ??$__rewrap_iter@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@0@Z
-    ??$__rewrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@0@Z
-    ??$__rewrap_iter@PEAVFormatArgImpl@str_format_internal@absl@@@Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEAV234@0@Z
-    ??$__rewrap_iter@PEBVFormatArgImpl@str_format_internal@absl@@@Cr@std@@YAPEBVFormatArgImpl@str_format_internal@absl@@PEBV234@0@Z
+    ??$__rewrap_iter@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@U?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@0@Z
+    ??$__rewrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV123@U?$__unwrap_iter_impl@PEAPEAVCordzHandle@cord_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV234@0@Z
+    ??$__rewrap_iter@PEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV123@U?$__unwrap_iter_impl@PEAPEBVCordzHandle@cord_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV234@0@Z
+    ??$__rewrap_iter@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU1234@U?$__unwrap_iter_impl@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU2345@0@Z
+    ??$__rewrap_iter@PEAUTransition@cctz@time_internal@absl@@PEAU1234@U?$__unwrap_iter_impl@PEAUTransition@cctz@time_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@0@Z
+    ??$__rewrap_iter@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@U?$__unwrap_iter_impl@PEAUTransitionType@cctz@time_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@0@Z
+    ??$__rewrap_iter@PEAUViableSubstitution@strings_internal@absl@@PEAU123@U?$__unwrap_iter_impl@PEAUViableSubstitution@strings_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAUViableSubstitution@strings_internal@absl@@PEAU234@0@Z
+    ??$__rewrap_iter@PEAVFormatArgImpl@str_format_internal@absl@@PEAV123@U?$__unwrap_iter_impl@PEAVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEAV234@0@Z
+    ??$__rewrap_iter@PEBVFormatArgImpl@str_format_internal@absl@@PEBV123@U?$__unwrap_iter_impl@PEBVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEBVFormatArgImpl@str_format_internal@absl@@PEBV234@0@Z
+    ??$__rewrap_iter@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@23@@Cr@std@@YA?AV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@V201@0@Z
+    ??$__rewrap_iter@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@23@@Cr@std@@YA?AV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@V201@0@Z
+    ??$__rewrap_iter@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@$0A@@23@@Cr@std@@YA?AV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@V201@0@Z
+    ??$__rewrap_iter@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@$0A@@23@@Cr@std@@YA?AV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@V201@0@Z
+    ??$__rewrap_iter@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@$0A@@23@@Cr@std@@YA?AV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@V201@0@Z
+    ??$__rewrap_iter@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@$0A@@23@@Cr@std@@YA?AV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@V201@0@Z
     ??$__to_address@$$CBVFormatArgImpl@str_format_internal@absl@@@Cr@std@@YAPEBVFormatArgImpl@str_format_internal@absl@@PEBV234@@Z
     ??$__to_address@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@@Z
     ??$__to_address@PEAVCordzHandle@cord_internal@absl@@@Cr@std@@YAPEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV234@@Z
@@ -551,11 +584,30 @@
     ??$__to_address@UTransitionType@cctz@time_internal@absl@@@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@@Z
     ??$__to_address@UViableSubstitution@strings_internal@absl@@@Cr@std@@YAPEAUViableSubstitution@strings_internal@absl@@PEAU234@@Z
     ??$__to_address@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEAV234@@Z
-    ??$__unwrap_iter@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@@Z
-    ??$__unwrap_iter@PEAUTransition@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PEAUTransition@cctz@time_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@@Z
-    ??$__unwrap_iter@PEAUTransitionType@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PEAUTransitionType@cctz@time_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@@Z
-    ??$__unwrap_iter@PEAVFormatArgImpl@str_format_internal@absl@@U?$__unwrap_iter_impl@PEAVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEAV234@@Z
-    ??$__unwrap_iter@PEBVFormatArgImpl@str_format_internal@absl@@U?$__unwrap_iter_impl@PEBVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEBVFormatArgImpl@str_format_internal@absl@@PEBV234@@Z
+    ??$__uninitialized_allocator_copy@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@VFormatArgImpl@str_format_internal@absl@@V456@$0A@@Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@AEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@01@PEBV234@1PEAV234@@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@Cr@std@@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@23@V423@PEAVCordzHandle@cord_internal@absl@@X@Cr@std@@YA?AV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@01@V201@11@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@Cr@std@@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@23@V423@PEBVCordzHandle@cord_internal@absl@@X@Cr@std@@YA?AV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@01@V201@11@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@V423@UConversionItem@ParsedFormatBase@str_format_internal@absl@@X@Cr@std@@YA?AV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@V201@11@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@PEAUTransition@cctz@time_internal@absl@@PEAU4567@U4567@X@Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@01@PEAU2345@11@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@23@V423@UTransition@cctz@time_internal@absl@@X@Cr@std@@YA?AV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@01@V201@11@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@PEAUTransitionType@cctz@time_internal@absl@@PEAU4567@U4567@X@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@PEAU2345@11@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@23@V423@UTransitionType@cctz@time_internal@absl@@X@Cr@std@@YA?AV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@V201@11@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@UViableSubstitution@strings_internal@absl@@@Cr@std@@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@23@V423@UViableSubstitution@strings_internal@absl@@X@Cr@std@@YA?AV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@V201@11@Z
+    ??$__unwrap_iter@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@@Z
+    ??$__unwrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@U?$__unwrap_iter_impl@PEAPEAVCordzHandle@cord_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV234@@Z
+    ??$__unwrap_iter@PEAPEBVCordzHandle@cord_internal@absl@@U?$__unwrap_iter_impl@PEAPEBVCordzHandle@cord_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV234@@Z
+    ??$__unwrap_iter@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@U?$__unwrap_iter_impl@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU2345@@Z
+    ??$__unwrap_iter@PEAUTransition@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PEAUTransition@cctz@time_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@@Z
+    ??$__unwrap_iter@PEAUTransitionType@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PEAUTransitionType@cctz@time_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@@Z
+    ??$__unwrap_iter@PEAUViableSubstitution@strings_internal@absl@@U?$__unwrap_iter_impl@PEAUViableSubstitution@strings_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPEAUViableSubstitution@strings_internal@absl@@PEAU234@@Z
+    ??$__unwrap_iter@PEAVFormatArgImpl@str_format_internal@absl@@U?$__unwrap_iter_impl@PEAVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEAV234@@Z
+    ??$__unwrap_iter@PEBVFormatArgImpl@str_format_internal@absl@@U?$__unwrap_iter_impl@PEBVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPEBVFormatArgImpl@str_format_internal@absl@@PEBV234@@Z
+    ??$__unwrap_iter@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@23@$0A@@Cr@std@@YA?AV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@V201@@Z
+    ??$__unwrap_iter@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@23@$0A@@Cr@std@@YA?AV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@V201@@Z
+    ??$__unwrap_iter@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@$0A@@23@$0A@@Cr@std@@YA?AV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@V201@@Z
+    ??$__unwrap_iter@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@$0A@@23@$0A@@Cr@std@@YA?AV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@V201@@Z
+    ??$__unwrap_iter@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@$0A@@23@$0A@@Cr@std@@YA?AV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@V201@@Z
+    ??$__unwrap_iter@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@$0A@@23@$0A@@Cr@std@@YA?AV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@V201@@Z
     ??$__upper_bound@AEAUByCivilTime@Transition@cctz@time_internal@absl@@PEBU2345@U2345@@Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@AEAUByCivilTime@2345@@Z
     ??$__upper_bound@AEAUByUnixTime@Transition@cctz@time_internal@absl@@PEBU2345@U2345@@Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@AEAUByUnixTime@2345@@Z
     ??$advance@PEBUTransition@cctz@time_internal@absl@@_J@?$_IterOps@U_ClassicAlgPolicy@Cr@std@@@Cr@std@@SAXAEAPEBUTransition@cctz@time_internal@absl@@_J@Z
@@ -667,10 +719,26 @@
     ??$launder@$$CBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@YAPEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@PEBU201@@Z
     ??$launder@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@PEAU201@@Z
     ??$lower_bound@PEBUTransition@cctz@time_internal@absl@@U1234@UByUnixTime@1234@@Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@UByUnixTime@2345@@Z
+    ??$make_pair@AEAV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@AEAV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@$$QEAV301@@Z
+    ??$make_pair@AEAV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@AEAV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@$$QEAV301@@Z
+    ??$make_pair@AEAV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@AEAV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@$$QEAV301@@Z
+    ??$make_pair@AEAV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@AEAV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@$$QEAV301@@Z
+    ??$make_pair@AEAV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@AEAV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@$$QEAV301@@Z
+    ??$make_pair@AEAV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@AEAV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@$$QEAV301@@Z
     ??$make_pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@$$QEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z
+    ??$make_pair@PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV123@@Cr@std@@YA?AU?$pair@PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV123@@01@$$QEAPEAPEAVCordzHandle@cord_internal@absl@@0@Z
+    ??$make_pair@PEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV123@@Cr@std@@YA?AU?$pair@PEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV123@@01@$$QEAPEAPEBVCordzHandle@cord_internal@absl@@0@Z
+    ??$make_pair@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU1234@@Cr@std@@YA?AU?$pair@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU1234@@01@$$QEAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@0@Z
     ??$make_pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@$$QEAPEAUTransition@cctz@time_internal@absl@@0@Z
     ??$make_pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@$$QEAPEAUTransitionType@cctz@time_internal@absl@@0@Z
+    ??$make_pair@PEAUViableSubstitution@strings_internal@absl@@PEAU123@@Cr@std@@YA?AU?$pair@PEAUViableSubstitution@strings_internal@absl@@PEAU123@@01@$$QEAPEAUViableSubstitution@strings_internal@absl@@0@Z
     ??$make_pair@PEBVFormatArgImpl@str_format_internal@absl@@PEAV123@@Cr@std@@YA?AU?$pair@PEBVFormatArgImpl@str_format_internal@absl@@PEAV123@@01@$$QEAPEBVFormatArgImpl@str_format_internal@absl@@$$QEAPEAV345@@Z
+    ??$make_pair@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@$$QEAV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@0@Z
+    ??$make_pair@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@$$QEAV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@0@Z
+    ??$make_pair@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@$$QEAV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@0@Z
+    ??$make_pair@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@$$QEAV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@0@Z
+    ??$make_pair@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@$$QEAV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@0@Z
+    ??$make_pair@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@$$QEAV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@0@Z
     ??$make_unique@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@$$V@Cr@std@@YA?AV?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@Cr@std@@@01@XZ
     ??$make_unique@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@AEAV12@@Cr@std@@YA?AV?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@Cr@std@@@01@AEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@Z
     ??$max_size@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@X@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@SA_KAEBV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z
@@ -692,6 +760,12 @@
     ??$move@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@00@Z
     ??$move@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@00@Z
     ??$move@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@00@Z
+    ??$move@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@V201@00@Z
+    ??$move@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@V201@00@Z
+    ??$move@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@V201@00@Z
+    ??$move@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@V201@00@Z
+    ??$move@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@V201@00@Z
+    ??$move@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@V201@00@Z
     ??$move_backward@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@00@Z
     ??$move_backward@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@00@Z
     ??$move_backward@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@00@Z
@@ -886,6 +960,12 @@
     ??0?$optional_data_dtor_base@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@$0A@@optional_internal@absl@@IEAA@XZ
     ??0?$optional_data_dtor_base@VCord@absl@@$0A@@optional_internal@absl@@IEAA@XZ
     ??0?$probe_seq@$07@container_internal@absl@@QEAA@_K0@Z
+    ??0?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@QEAA@PEAPEAVCordzHandle@cord_internal@absl@@@Z
+    ??0?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@QEAA@PEAPEBVCordzHandle@cord_internal@absl@@@Z
+    ??0?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@QEAA@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z
+    ??0?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@QEAA@PEAUTransition@cctz@time_internal@absl@@@Z
+    ??0?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@QEAA@PEAUTransitionType@cctz@time_internal@absl@@@Z
+    ??0?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@QEAA@PEAUViableSubstitution@strings_internal@absl@@@Z
     ??0?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@Cr@std@@@Cr@std@@QEAA@$$QEAV012@@Z
     ??0?$unordered_map@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@QEAA@XZ
     ??0?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@QEAA@XZ
@@ -2488,11 +2568,6 @@
     ?__annotate_shrink@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEBAX_K@Z
     ?__append@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEAAX_K@Z
     ?__append@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEAAX_K@Z
-    ?__apply@?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@Cr@std@@SAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@@Z
-    ?__apply@?$__unwrap_iter_impl@PEAUTransition@cctz@time_internal@absl@@$00@Cr@std@@SAPEAUTransition@cctz@time_internal@absl@@PEAU4567@@Z
-    ?__apply@?$__unwrap_iter_impl@PEAUTransitionType@cctz@time_internal@absl@@$00@Cr@std@@SAPEAUTransitionType@cctz@time_internal@absl@@PEAU4567@@Z
-    ?__apply@?$__unwrap_iter_impl@PEAVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@SAPEAVFormatArgImpl@str_format_internal@absl@@PEAV456@@Z
-    ?__apply@?$__unwrap_iter_impl@PEBVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@SAPEBVFormatArgImpl@str_format_internal@absl@@PEBV456@@Z
     ?__back_spare@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEBA_KXZ
     ?__back_spare@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEBA_KXZ
     ?__base_destruct_at_end@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z
@@ -2655,6 +2730,21 @@
     ?__recommend@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@Cr@std@@@Cr@std@@AEBA_K_K@Z
     ?__recommend@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEBA_K_K@Z
     ?__rehash_unique@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@QEAAX_K@Z
+    ?__rewrap@?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@Cr@std@@SAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PEAPEAVCordzHandle@cord_internal@absl@@$00@Cr@std@@SAPEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV456@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PEAPEBVCordzHandle@cord_internal@absl@@$00@Cr@std@@SAPEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV456@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$00@Cr@std@@SAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU4567@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PEAUTransition@cctz@time_internal@absl@@$00@Cr@std@@SAPEAUTransition@cctz@time_internal@absl@@PEAU4567@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PEAUTransitionType@cctz@time_internal@absl@@$00@Cr@std@@SAPEAUTransitionType@cctz@time_internal@absl@@PEAU4567@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PEAUViableSubstitution@strings_internal@absl@@$00@Cr@std@@SAPEAUViableSubstitution@strings_internal@absl@@PEAU456@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PEAVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@SAPEAVFormatArgImpl@str_format_internal@absl@@PEAV456@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PEBVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@SAPEBVFormatArgImpl@str_format_internal@absl@@PEBV456@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@23@V423@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@23@V423@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@V423@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@23@V423@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@23@V423@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@23@V423@0@Z
     ?__swap_out_circular_buffer@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEAU?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@Cr@std@@@23@@Z
     ?__swap_out_circular_buffer@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEAU?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@Cr@std@@@23@@Z
     ?__swap_out_circular_buffer@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEAU?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@@23@@Z
@@ -2670,6 +2760,21 @@
     ?__throw_length_error@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEBAXXZ
     ?__throw_length_error@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@Cr@std@@@Cr@std@@AEBAXXZ
     ?__throw_length_error@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEBAXXZ
+    ?__unwrap@?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@Cr@std@@SAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PEAPEAVCordzHandle@cord_internal@absl@@$00@Cr@std@@SAPEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV456@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PEAPEBVCordzHandle@cord_internal@absl@@$00@Cr@std@@SAPEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV456@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$00@Cr@std@@SAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU4567@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PEAUTransition@cctz@time_internal@absl@@$00@Cr@std@@SAPEAUTransition@cctz@time_internal@absl@@PEAU4567@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PEAUTransitionType@cctz@time_internal@absl@@$00@Cr@std@@SAPEAUTransitionType@cctz@time_internal@absl@@PEAU4567@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PEAUViableSubstitution@strings_internal@absl@@$00@Cr@std@@SAPEAUViableSubstitution@strings_internal@absl@@PEAU456@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PEAVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@SAPEAVFormatArgImpl@str_format_internal@absl@@PEAV456@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PEBVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@SAPEBVFormatArgImpl@str_format_internal@absl@@PEBV456@@Z
+    ?__unwrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@23@V423@@Z
+    ?__unwrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@23@V423@@Z
+    ?__unwrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@V423@@Z
+    ?__unwrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@23@V423@@Z
+    ?__unwrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@23@V423@@Z
+    ?__unwrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@23@V423@@Z
     ?__upcast@?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@PEAX@Cr@std@@@Cr@std@@QEAAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@PEAX@23@XZ
     ?__vallocate@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEAAX_K@Z
     ?__vdeallocate@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEAAXXZ
@@ -2730,6 +2835,12 @@
     ?base@?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@QEBAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ
     ?base@?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@QEBAPEAUTransition@cctz@time_internal@absl@@XZ
     ?base@?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@QEBAPEAUTransitionType@cctz@time_internal@absl@@XZ
+    ?base@?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@QEBAPEAPEAVCordzHandle@cord_internal@absl@@XZ
+    ?base@?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@QEBAPEAPEBVCordzHandle@cord_internal@absl@@XZ
+    ?base@?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@QEBAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ
+    ?base@?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@QEBAPEAUTransition@cctz@time_internal@absl@@XZ
+    ?base@?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@QEBAPEAUTransitionType@cctz@time_internal@absl@@XZ
+    ?base@?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@QEBAPEAUViableSubstitution@strings_internal@absl@@XZ
     ?begin@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@QEAAPEAUPayload@status_internal@2@XZ
     ?begin@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@QEBAPEBUPayload@status_internal@2@XZ
     ?begin@?$Span@$$CBI@absl@@QEBAPEBIXZ
diff --git a/third_party/abseil-cpp/symbols_arm64_rel.def b/third_party/abseil-cpp/symbols_arm64_rel.def
index a820b33..0aaccfe 100644
--- a/third_party/abseil-cpp/symbols_arm64_rel.def
+++ b/third_party/abseil-cpp/symbols_arm64_rel.def
@@ -866,8 +866,6 @@
     ?__append@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEAAX_K@Z
     ?__append@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEAAX_K@Z
     ?__deallocate_node@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@AEAAXPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@PEAX@Cr@std@@@23@@Z
-    ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEAAPEAUTransition@cctz@time_internal@absl@@AEAU?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@23@PEAU4567@@Z
-    ?__swap_out_circular_buffer@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEAAPEAUTransitionType@cctz@time_internal@absl@@AEAU?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@23@PEAU4567@@Z
     ?__vallocate@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEAAX_K@Z
     ?clear@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@QEAAXXZ
     ?code@Status@absl@@QEBA?AW4StatusCode@2@XZ
diff --git a/third_party/abseil-cpp/symbols_x64_dbg.def b/third_party/abseil-cpp/symbols_x64_dbg.def
index ceb58cc..5af79fb 100644
--- a/third_party/abseil-cpp/symbols_x64_dbg.def
+++ b/third_party/abseil-cpp/symbols_x64_dbg.def
@@ -74,6 +74,12 @@
     ??$?0AEAV?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@X@?$__compressed_pair_elem@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@$00$0A@@Cr@std@@QEAA@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z
     ??$?0AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@X@?$__compressed_pair_elem@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@$00$0A@@Cr@std@@QEAA@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z
     ??$?0AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@Cr@std@@X@?$__compressed_pair_elem@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@Cr@std@@$00$0A@@Cr@std@@QEAA@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z
+    ??$?0AEAV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@AEAV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@12@$$QEAV312@@Z
+    ??$?0AEAV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@AEAV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@12@$$QEAV312@@Z
+    ??$?0AEAV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@AEAV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@$$QEAV312@@Z
+    ??$?0AEAV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@AEAV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@12@$$QEAV312@@Z
+    ??$?0AEAV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@AEAV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@$$QEAV312@@Z
+    ??$?0AEAV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@AEAV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@12@$$QEAV312@@Z
     ??$?0AEBV?$allocator@UPayload@status_internal@absl@@@Cr@std@@@?$Storage@V?$allocator@UPayload@status_internal@absl@@@Cr@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEBV?$allocator@UPayload@status_internal@absl@@@Cr@std@@@Z
     ??$?0AEBV?$allocator@UPayload@status_internal@absl@@@Cr@std@@I$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@Cr@std@@_K@container_internal@absl@@QEAA@AEBV?$allocator@UPayload@status_internal@absl@@@Cr@std@@$$QEAI@Z
     ??$?0AEBV?$allocator@UPayload@status_internal@absl@@@Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@Cr@std@@_K@container_internal@absl@@U?$integer_sequence@_K$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QEAA@Uin_place_t@3@AEBV?$allocator@UPayload@status_internal@absl@@@Cr@std@@$$QEAI@Z
@@ -91,10 +97,14 @@
     ??$?0MU__default_init_tag@Cr@std@@@?$__compressed_pair@MV?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@Cr@std@@@Cr@std@@QEAA@$$QEAM$$QEAU__default_init_tag@12@@Z
     ??$?0PEAI@?$SaltedSeedSeq@Vseed_seq@Cr@std@@@random_internal@absl@@QEAA@PEAI0@Z
     ??$?0PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV01234@$0A@@?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@Cr@std@@QEAA@$$QEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z
+    ??$?0PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV012@$0A@@?$pair@PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV123@@Cr@std@@QEAA@$$QEAPEAPEAVCordzHandle@cord_internal@absl@@0@Z
+    ??$?0PEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV012@$0A@@?$pair@PEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV123@@Cr@std@@QEAA@$$QEAPEAPEBVCordzHandle@cord_internal@absl@@0@Z
+    ??$?0PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU0123@$0A@@?$pair@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU1234@@Cr@std@@QEAA@$$QEAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@0@Z
     ??$?0PEAUTransition@cctz@time_internal@absl@@@?$__wrap_iter@PEBUTransition@cctz@time_internal@absl@@@Cr@std@@QEAA@AEBV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@12@PEAX@Z
     ??$?0PEAUTransition@cctz@time_internal@absl@@PEAU0123@$0A@@?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@Cr@std@@QEAA@$$QEAPEAUTransition@cctz@time_internal@absl@@0@Z
     ??$?0PEAUTransitionType@cctz@time_internal@absl@@@?$__wrap_iter@PEBUTransitionType@cctz@time_internal@absl@@@Cr@std@@QEAA@AEBV?$__wrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@12@PEAX@Z
     ??$?0PEAUTransitionType@cctz@time_internal@absl@@PEAU0123@$0A@@?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@Cr@std@@QEAA@$$QEAPEAUTransitionType@cctz@time_internal@absl@@0@Z
+    ??$?0PEAUViableSubstitution@strings_internal@absl@@PEAU012@$0A@@?$pair@PEAUViableSubstitution@strings_internal@absl@@PEAU123@@Cr@std@@QEAA@$$QEAPEAUViableSubstitution@strings_internal@absl@@0@Z
     ??$?0PEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@Cr@std@@@?$__compressed_pair@PEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@Cr@std@@@Cr@std@@QEAA@$$QEAPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@$$QEAU?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@12@@Z
     ??$?0PEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@X@?$__compressed_pair_elem@PEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@$0A@$0A@@Cr@std@@QEAA@$$QEAPEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@Z
     ??$?0PEBVFormatArgImpl@str_format_internal@absl@@PEAV012@$0A@@?$pair@PEBVFormatArgImpl@str_format_internal@absl@@PEAV123@@Cr@std@@QEAA@$$QEAPEBVFormatArgImpl@str_format_internal@absl@@$$QEAPEAV345@@Z
@@ -164,6 +174,12 @@
     ??$?0V?$basic_ostream@DU?$char_traits@D@Cr@std@@@Cr@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAV?$basic_ostream@DU?$char_traits@D@Cr@std@@@Cr@std@@@Z
     ??$?0V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@$0A@@Cord@absl@@QEAA@$$QEAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z
     ??$?0V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z
+    ??$?0V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@$$QEAV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@12@0@Z
+    ??$?0V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@$$QEAV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@12@0@Z
+    ??$?0V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@$$QEAV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@0@Z
+    ??$?0V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@$$QEAV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z
+    ??$?0V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@$$QEAV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z
+    ??$?0V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@Cr@std@@QEAA@$$QEAV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@12@0@Z
     ??$?0V?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@XV012@H@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QEAA@AEBV?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@@Z
     ??$?0VBufferRawSink@str_format_internal@absl@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAVBufferRawSink@12@@Z
     ??$?0VFILERawSink@str_format_internal@absl@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QEAA@PEAVFILERawSink@12@@Z
@@ -457,14 +473,6 @@
     ??$__construct_at_end@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z
     ??$__construct_at_end@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z
     ??$__construct_at_end@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z
-    ??$__construct_backward_with_exception_guarantees@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@Cr@std@@PEAVCordzHandle@cord_internal@absl@@X@Cr@std@@YAXAEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@01@PEAPEAVCordzHandle@cord_internal@absl@@1AEAPEAPEAV345@@Z
-    ??$__construct_backward_with_exception_guarantees@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@Cr@std@@PEBVCordzHandle@cord_internal@absl@@X@Cr@std@@YAXAEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@01@PEAPEBVCordzHandle@cord_internal@absl@@1AEAPEAPEBV345@@Z
-    ??$__construct_backward_with_exception_guarantees@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@X@Cr@std@@YAXAEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@1AEAPEAU3456@@Z
-    ??$__construct_backward_with_exception_guarantees@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@UTransition@cctz@time_internal@absl@@X@Cr@std@@YAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@01@PEAUTransition@cctz@time_internal@absl@@1AEAPEAU3456@@Z
-    ??$__construct_backward_with_exception_guarantees@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@UTransitionType@cctz@time_internal@absl@@X@Cr@std@@YAXAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@PEAUTransitionType@cctz@time_internal@absl@@1AEAPEAU3456@@Z
-    ??$__construct_backward_with_exception_guarantees@V?$allocator@UViableSubstitution@strings_internal@absl@@@Cr@std@@UViableSubstitution@strings_internal@absl@@X@Cr@std@@YAXAEAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@PEAUViableSubstitution@strings_internal@absl@@1AEAPEAU345@@Z
-    ??$__construct_forward_with_exception_guarantees@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@YAXAEAV?$allocator@UTransition@cctz@time_internal@absl@@@01@PEAUTransition@cctz@time_internal@absl@@1AEAPEAU3456@@Z
-    ??$__construct_forward_with_exception_guarantees@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@YAXAEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@PEAUTransitionType@cctz@time_internal@absl@@1AEAPEAU3456@@Z
     ??$__construct_node_hash@AEBUpiecewise_construct_t@Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@AEAA?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@PEAX@Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@PEAX@Cr@std@@@Cr@std@@@23@@12@_KAEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z
     ??$__construct_one_at_end@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEAAXXZ
     ??$__construct_one_at_end@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEAAXXZ
@@ -473,7 +481,6 @@
     ??$__construct_one_at_end@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEBQEBVCordzHandle@cord_internal@absl@@@Z
     ??$__construct_one_at_end@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEBUTransition@cctz@time_internal@absl@@@Z
     ??$__construct_one_at_end@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEAAX$$QEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z
-    ??$__construct_range_forward@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@$$CBVFormatArgImpl@str_format_internal@absl@@V456@V456@V456@X@Cr@std@@YAXAEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@01@PEBVFormatArgImpl@str_format_internal@absl@@1AEAPEAV345@@Z
     ??$__copy@PEBVFormatArgImpl@str_format_internal@absl@@PEBV123@PEAV123@$0A@@Cr@std@@YA?AU?$pair@PEBVFormatArgImpl@str_format_internal@absl@@PEAV123@@01@PEBVFormatArgImpl@str_format_internal@absl@@0PEAV345@@Z
     ??$__copy_impl@$$CBVFormatArgImpl@str_format_internal@absl@@V123@X@Cr@std@@YA?AU?$pair@PEBVFormatArgImpl@str_format_internal@absl@@PEAV123@@01@PEBVFormatArgImpl@str_format_internal@absl@@0PEAV345@@Z
     ??$__cxx_atomic_compare_exchange_weak@PEAUHashtablezInfo@container_internal@absl@@@Cr@std@@YA_NPEAU?$__cxx_atomic_base_impl@PEAUHashtablezInfo@container_internal@absl@@@01@PEAPEAUHashtablezInfo@container_internal@absl@@PEAU345@W4memory_order@01@3@Z
@@ -526,22 +533,48 @@
     ??$__move@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@PEAPEAPEBV12345@@Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z
     ??$__move@PEAUTransition@cctz@time_internal@absl@@PEAU1234@PEAU1234@@Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z
     ??$__move@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@PEAU1234@@Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z
+    ??$__move@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@00@Z
+    ??$__move@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@00@Z
+    ??$__move@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@00@Z
+    ??$__move@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@00@Z
+    ??$__move@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@00@Z
+    ??$__move@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@00@Z
     ??$__move_backward@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@@Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@00@Z
     ??$__move_backward@UTransition@cctz@time_internal@absl@@U1234@@Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@00@Z
     ??$__move_backward@UTransitionType@cctz@time_internal@absl@@U1234@@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@00@Z
+    ??$__move_impl@PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV123@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@00@Z
+    ??$__move_impl@PEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV123@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@00@Z
     ??$__move_impl@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@X@Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z
+    ??$__move_impl@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU1234@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@00@Z
+    ??$__move_impl@PEAUTransition@cctz@time_internal@absl@@PEAU1234@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@00@Z
+    ??$__move_impl@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@00@Z
+    ??$__move_impl@PEAUViableSubstitution@strings_internal@absl@@PEAU123@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@00@Z
+    ??$__move_impl@PEAVCordzHandle@cord_internal@absl@@PEAV123@X@Cr@std@@YA?AU?$pair@PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV123@@01@PEAPEAVCordzHandle@cord_internal@absl@@00@Z
+    ??$__move_impl@PEBVCordzHandle@cord_internal@absl@@PEBV123@X@Cr@std@@YA?AU?$pair@PEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV123@@01@PEAPEBVCordzHandle@cord_internal@absl@@00@Z
+    ??$__move_impl@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U1234@X@Cr@std@@YA?AU?$pair@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU1234@@01@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@00@Z
     ??$__move_impl@UTransition@cctz@time_internal@absl@@U1234@X@Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z
     ??$__move_impl@UTransitionType@cctz@time_internal@absl@@U1234@X@Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z
+    ??$__move_impl@UViableSubstitution@strings_internal@absl@@U123@X@Cr@std@@YA?AU?$pair@PEAUViableSubstitution@strings_internal@absl@@PEAU123@@01@PEAUViableSubstitution@strings_internal@absl@@00@Z
     ??$__push_back_slow_path@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEBQEAVCordzHandle@cord_internal@absl@@@Z
     ??$__push_back_slow_path@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEBQEBVCordzHandle@cord_internal@absl@@@Z
     ??$__push_back_slow_path@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEBUTransition@cctz@time_internal@absl@@@Z
     ??$__push_back_slow_path@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEAAX$$QEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z
     ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@AEAAX_K@Z
-    ??$__rewrap_iter@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@0@Z
-    ??$__rewrap_iter@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@0@Z
-    ??$__rewrap_iter@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@0@Z
-    ??$__rewrap_iter@PEAVFormatArgImpl@str_format_internal@absl@@@Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEAV234@0@Z
-    ??$__rewrap_iter@PEBVFormatArgImpl@str_format_internal@absl@@@Cr@std@@YAPEBVFormatArgImpl@str_format_internal@absl@@PEBV234@0@Z
+    ??$__rewrap_iter@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@U?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@0@Z
+    ??$__rewrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV123@U?$__unwrap_iter_impl@PEAPEAVCordzHandle@cord_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV234@0@Z
+    ??$__rewrap_iter@PEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV123@U?$__unwrap_iter_impl@PEAPEBVCordzHandle@cord_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV234@0@Z
+    ??$__rewrap_iter@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU1234@U?$__unwrap_iter_impl@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU2345@0@Z
+    ??$__rewrap_iter@PEAUTransition@cctz@time_internal@absl@@PEAU1234@U?$__unwrap_iter_impl@PEAUTransition@cctz@time_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@0@Z
+    ??$__rewrap_iter@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@U?$__unwrap_iter_impl@PEAUTransitionType@cctz@time_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@0@Z
+    ??$__rewrap_iter@PEAUViableSubstitution@strings_internal@absl@@PEAU123@U?$__unwrap_iter_impl@PEAUViableSubstitution@strings_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAUViableSubstitution@strings_internal@absl@@PEAU234@0@Z
+    ??$__rewrap_iter@PEAVFormatArgImpl@str_format_internal@absl@@PEAV123@U?$__unwrap_iter_impl@PEAVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEAV234@0@Z
+    ??$__rewrap_iter@PEBVFormatArgImpl@str_format_internal@absl@@PEBV123@U?$__unwrap_iter_impl@PEBVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEBVFormatArgImpl@str_format_internal@absl@@PEBV234@0@Z
+    ??$__rewrap_iter@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@23@@Cr@std@@YA?AV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@V201@0@Z
+    ??$__rewrap_iter@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@23@@Cr@std@@YA?AV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@V201@0@Z
+    ??$__rewrap_iter@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@$0A@@23@@Cr@std@@YA?AV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@V201@0@Z
+    ??$__rewrap_iter@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@$0A@@23@@Cr@std@@YA?AV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@V201@0@Z
+    ??$__rewrap_iter@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@$0A@@23@@Cr@std@@YA?AV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@V201@0@Z
+    ??$__rewrap_iter@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@$0A@@23@@Cr@std@@YA?AV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@V201@0@Z
     ??$__to_address@$$CBVFormatArgImpl@str_format_internal@absl@@@Cr@std@@YAPEBVFormatArgImpl@str_format_internal@absl@@PEBV234@@Z
     ??$__to_address@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@@Z
     ??$__to_address@PEAVCordzHandle@cord_internal@absl@@@Cr@std@@YAPEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV234@@Z
@@ -551,11 +584,30 @@
     ??$__to_address@UTransitionType@cctz@time_internal@absl@@@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@@Z
     ??$__to_address@UViableSubstitution@strings_internal@absl@@@Cr@std@@YAPEAUViableSubstitution@strings_internal@absl@@PEAU234@@Z
     ??$__to_address@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEAV234@@Z
-    ??$__unwrap_iter@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@@Z
-    ??$__unwrap_iter@PEAUTransition@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PEAUTransition@cctz@time_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@@Z
-    ??$__unwrap_iter@PEAUTransitionType@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PEAUTransitionType@cctz@time_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@@Z
-    ??$__unwrap_iter@PEAVFormatArgImpl@str_format_internal@absl@@U?$__unwrap_iter_impl@PEAVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEAV234@@Z
-    ??$__unwrap_iter@PEBVFormatArgImpl@str_format_internal@absl@@U?$__unwrap_iter_impl@PEBVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@@Cr@std@@YAPEBVFormatArgImpl@str_format_internal@absl@@PEBV234@@Z
+    ??$__uninitialized_allocator_copy@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@VFormatArgImpl@str_format_internal@absl@@V456@$0A@@Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@AEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@01@PEBV234@1PEAV234@@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@Cr@std@@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@23@V423@PEAVCordzHandle@cord_internal@absl@@X@Cr@std@@YA?AV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@01@V201@11@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@Cr@std@@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@23@V423@PEBVCordzHandle@cord_internal@absl@@X@Cr@std@@YA?AV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@01@V201@11@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@V423@UConversionItem@ParsedFormatBase@str_format_internal@absl@@X@Cr@std@@YA?AV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@V201@11@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@PEAUTransition@cctz@time_internal@absl@@PEAU4567@U4567@X@Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@01@PEAU2345@11@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@23@V423@UTransition@cctz@time_internal@absl@@X@Cr@std@@YA?AV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@01@V201@11@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@PEAUTransitionType@cctz@time_internal@absl@@PEAU4567@U4567@X@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@PEAU2345@11@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@23@V423@UTransitionType@cctz@time_internal@absl@@X@Cr@std@@YA?AV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@V201@11@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@UViableSubstitution@strings_internal@absl@@@Cr@std@@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@23@V423@UViableSubstitution@strings_internal@absl@@X@Cr@std@@YA?AV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@V201@11@Z
+    ??$__unwrap_iter@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@@Z
+    ??$__unwrap_iter@PEAPEAVCordzHandle@cord_internal@absl@@U?$__unwrap_iter_impl@PEAPEAVCordzHandle@cord_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV234@@Z
+    ??$__unwrap_iter@PEAPEBVCordzHandle@cord_internal@absl@@U?$__unwrap_iter_impl@PEAPEBVCordzHandle@cord_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV234@@Z
+    ??$__unwrap_iter@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@U?$__unwrap_iter_impl@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU2345@@Z
+    ??$__unwrap_iter@PEAUTransition@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PEAUTransition@cctz@time_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@@Z
+    ??$__unwrap_iter@PEAUTransitionType@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PEAUTransitionType@cctz@time_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@@Z
+    ??$__unwrap_iter@PEAUViableSubstitution@strings_internal@absl@@U?$__unwrap_iter_impl@PEAUViableSubstitution@strings_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPEAUViableSubstitution@strings_internal@absl@@PEAU234@@Z
+    ??$__unwrap_iter@PEAVFormatArgImpl@str_format_internal@absl@@U?$__unwrap_iter_impl@PEAVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEAV234@@Z
+    ??$__unwrap_iter@PEBVFormatArgImpl@str_format_internal@absl@@U?$__unwrap_iter_impl@PEBVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPEBVFormatArgImpl@str_format_internal@absl@@PEBV234@@Z
+    ??$__unwrap_iter@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@23@$0A@@Cr@std@@YA?AV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@V201@@Z
+    ??$__unwrap_iter@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@23@$0A@@Cr@std@@YA?AV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@V201@@Z
+    ??$__unwrap_iter@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@$0A@@23@$0A@@Cr@std@@YA?AV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@V201@@Z
+    ??$__unwrap_iter@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@$0A@@23@$0A@@Cr@std@@YA?AV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@V201@@Z
+    ??$__unwrap_iter@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@$0A@@23@$0A@@Cr@std@@YA?AV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@V201@@Z
+    ??$__unwrap_iter@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@U?$__unwrap_iter_impl@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@$0A@@23@$0A@@Cr@std@@YA?AV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@V201@@Z
     ??$__upper_bound@AEAUByCivilTime@Transition@cctz@time_internal@absl@@PEBU2345@U2345@@Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@AEAUByCivilTime@2345@@Z
     ??$__upper_bound@AEAUByUnixTime@Transition@cctz@time_internal@absl@@PEBU2345@U2345@@Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@AEAUByUnixTime@2345@@Z
     ??$advance@PEBUTransition@cctz@time_internal@absl@@_J@?$_IterOps@U_ClassicAlgPolicy@Cr@std@@@Cr@std@@SAXAEAPEBUTransition@cctz@time_internal@absl@@_J@Z
@@ -671,10 +723,26 @@
     ??$launder@$$CBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@YAPEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@PEBU201@@Z
     ??$launder@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@PEAU201@@Z
     ??$lower_bound@PEBUTransition@cctz@time_internal@absl@@U1234@UByUnixTime@1234@@Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@UByUnixTime@2345@@Z
+    ??$make_pair@AEAV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@AEAV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@$$QEAV301@@Z
+    ??$make_pair@AEAV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@AEAV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@$$QEAV301@@Z
+    ??$make_pair@AEAV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@AEAV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@$$QEAV301@@Z
+    ??$make_pair@AEAV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@AEAV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@$$QEAV301@@Z
+    ??$make_pair@AEAV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@AEAV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@$$QEAV301@@Z
+    ??$make_pair@AEAV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@AEAV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@$$QEAV301@@Z
     ??$make_pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@$$QEAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@0@Z
+    ??$make_pair@PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV123@@Cr@std@@YA?AU?$pair@PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV123@@01@$$QEAPEAPEAVCordzHandle@cord_internal@absl@@0@Z
+    ??$make_pair@PEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV123@@Cr@std@@YA?AU?$pair@PEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV123@@01@$$QEAPEAPEBVCordzHandle@cord_internal@absl@@0@Z
+    ??$make_pair@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU1234@@Cr@std@@YA?AU?$pair@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU1234@@01@$$QEAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@0@Z
     ??$make_pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@$$QEAPEAUTransition@cctz@time_internal@absl@@0@Z
     ??$make_pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@$$QEAPEAUTransitionType@cctz@time_internal@absl@@0@Z
+    ??$make_pair@PEAUViableSubstitution@strings_internal@absl@@PEAU123@@Cr@std@@YA?AU?$pair@PEAUViableSubstitution@strings_internal@absl@@PEAU123@@01@$$QEAPEAUViableSubstitution@strings_internal@absl@@0@Z
     ??$make_pair@PEBVFormatArgImpl@str_format_internal@absl@@PEAV123@@Cr@std@@YA?AU?$pair@PEBVFormatArgImpl@str_format_internal@absl@@PEAV123@@01@$$QEAPEBVFormatArgImpl@str_format_internal@absl@@$$QEAPEAV345@@Z
+    ??$make_pair@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@$$QEAV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@0@Z
+    ??$make_pair@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@$$QEAV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@0@Z
+    ??$make_pair@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@$$QEAV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@0@Z
+    ??$make_pair@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@$$QEAV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@0@Z
+    ??$make_pair@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@$$QEAV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@0@Z
+    ??$make_pair@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@$$QEAV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@0@Z
     ??$make_unique@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@$$V@Cr@std@@YA?AV?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@Cr@std@@@01@XZ
     ??$make_unique@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@AEAV12@@Cr@std@@YA?AV?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@Cr@std@@@01@AEAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@Z
     ??$max_size@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@X@?$allocator_traits@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@SA_KAEBV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z
@@ -696,6 +764,12 @@
     ??$move@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@00@Z
     ??$move@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@00@Z
     ??$move@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@00@Z
+    ??$move@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@V201@00@Z
+    ??$move@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@V201@00@Z
+    ??$move@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@V201@00@Z
+    ??$move@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@V201@00@Z
+    ??$move@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@V201@00@Z
+    ??$move@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@V201@00@Z
     ??$move_backward@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@00@Z
     ??$move_backward@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@00@Z
     ??$move_backward@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@00@Z
@@ -889,6 +963,12 @@
     ??0?$optional_data_dtor_base@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@$0A@@optional_internal@absl@@IEAA@XZ
     ??0?$optional_data_dtor_base@VCord@absl@@$0A@@optional_internal@absl@@IEAA@XZ
     ??0?$probe_seq@$0BA@@container_internal@absl@@QEAA@_K0@Z
+    ??0?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@QEAA@PEAPEAVCordzHandle@cord_internal@absl@@@Z
+    ??0?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@QEAA@PEAPEBVCordzHandle@cord_internal@absl@@@Z
+    ??0?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@QEAA@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z
+    ??0?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@QEAA@PEAUTransition@cctz@time_internal@absl@@@Z
+    ??0?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@QEAA@PEAUTransitionType@cctz@time_internal@absl@@@Z
+    ??0?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@QEAA@PEAUViableSubstitution@strings_internal@absl@@@Z
     ??0?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@Cr@std@@@Cr@std@@QEAA@$$QEAV012@@Z
     ??0?$unordered_map@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@QEAA@XZ
     ??0?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@QEAA@XZ
@@ -2488,11 +2568,6 @@
     ?__annotate_shrink@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEBAX_K@Z
     ?__append@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEAAX_K@Z
     ?__append@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEAAX_K@Z
-    ?__apply@?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@Cr@std@@SAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@@Z
-    ?__apply@?$__unwrap_iter_impl@PEAUTransition@cctz@time_internal@absl@@$00@Cr@std@@SAPEAUTransition@cctz@time_internal@absl@@PEAU4567@@Z
-    ?__apply@?$__unwrap_iter_impl@PEAUTransitionType@cctz@time_internal@absl@@$00@Cr@std@@SAPEAUTransitionType@cctz@time_internal@absl@@PEAU4567@@Z
-    ?__apply@?$__unwrap_iter_impl@PEAVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@SAPEAVFormatArgImpl@str_format_internal@absl@@PEAV456@@Z
-    ?__apply@?$__unwrap_iter_impl@PEBVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@SAPEBVFormatArgImpl@str_format_internal@absl@@PEBV456@@Z
     ?__back_spare@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEBA_KXZ
     ?__back_spare@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEBA_KXZ
     ?__base_destruct_at_end@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AEAAXPEAPEAVCordzHandle@cord_internal@absl@@@Z
@@ -2655,6 +2730,21 @@
     ?__recommend@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@Cr@std@@@Cr@std@@AEBA_K_K@Z
     ?__recommend@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEBA_K_K@Z
     ?__rehash_unique@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@QEAAX_K@Z
+    ?__rewrap@?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@Cr@std@@SAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PEAPEAVCordzHandle@cord_internal@absl@@$00@Cr@std@@SAPEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV456@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PEAPEBVCordzHandle@cord_internal@absl@@$00@Cr@std@@SAPEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV456@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$00@Cr@std@@SAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU4567@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PEAUTransition@cctz@time_internal@absl@@$00@Cr@std@@SAPEAUTransition@cctz@time_internal@absl@@PEAU4567@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PEAUTransitionType@cctz@time_internal@absl@@$00@Cr@std@@SAPEAUTransitionType@cctz@time_internal@absl@@PEAU4567@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PEAUViableSubstitution@strings_internal@absl@@$00@Cr@std@@SAPEAUViableSubstitution@strings_internal@absl@@PEAU456@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PEAVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@SAPEAVFormatArgImpl@str_format_internal@absl@@PEAV456@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PEBVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@SAPEBVFormatArgImpl@str_format_internal@absl@@PEBV456@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@23@V423@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@23@V423@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@V423@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@23@V423@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@23@V423@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@23@V423@0@Z
     ?__swap_out_circular_buffer@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEAU?$__split_buffer@PEAVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEAVCordzHandle@cord_internal@absl@@@Cr@std@@@23@@Z
     ?__swap_out_circular_buffer@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEAU?$__split_buffer@PEBVCordzHandle@cord_internal@absl@@AEAV?$allocator@PEBVCordzHandle@cord_internal@absl@@@Cr@std@@@23@@Z
     ?__swap_out_circular_buffer@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEAU?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AEAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@@23@@Z
@@ -2670,6 +2760,21 @@
     ?__throw_length_error@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEBAXXZ
     ?__throw_length_error@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@Cr@std@@@Cr@std@@AEBAXXZ
     ?__throw_length_error@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEBAXXZ
+    ?__unwrap@?$__unwrap_iter_impl@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@$00@Cr@std@@SAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PEAPEAVCordzHandle@cord_internal@absl@@$00@Cr@std@@SAPEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV456@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PEAPEBVCordzHandle@cord_internal@absl@@$00@Cr@std@@SAPEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV456@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$00@Cr@std@@SAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU4567@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PEAUTransition@cctz@time_internal@absl@@$00@Cr@std@@SAPEAUTransition@cctz@time_internal@absl@@PEAU4567@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PEAUTransitionType@cctz@time_internal@absl@@$00@Cr@std@@SAPEAUTransitionType@cctz@time_internal@absl@@PEAU4567@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PEAUViableSubstitution@strings_internal@absl@@$00@Cr@std@@SAPEAUViableSubstitution@strings_internal@absl@@PEAU456@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PEAVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@SAPEAVFormatArgImpl@str_format_internal@absl@@PEAV456@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PEBVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@SAPEBVFormatArgImpl@str_format_internal@absl@@PEBV456@@Z
+    ?__unwrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@23@V423@@Z
+    ?__unwrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@23@V423@@Z
+    ?__unwrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@V423@@Z
+    ?__unwrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@23@V423@@Z
+    ?__unwrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@23@V423@@Z
+    ?__unwrap@?$__unwrap_iter_impl@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@23@V423@@Z
     ?__upcast@?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@PEAX@Cr@std@@@Cr@std@@QEAAPEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@PEAX@23@XZ
     ?__vallocate@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEAAX_K@Z
     ?__vdeallocate@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEAAXXZ
@@ -2731,6 +2836,12 @@
     ?base@?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@QEBAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@XZ
     ?base@?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@QEBAPEAUTransition@cctz@time_internal@absl@@XZ
     ?base@?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@QEBAPEAUTransitionType@cctz@time_internal@absl@@XZ
+    ?base@?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@QEBAPEAPEAVCordzHandle@cord_internal@absl@@XZ
+    ?base@?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@QEBAPEAPEBVCordzHandle@cord_internal@absl@@XZ
+    ?base@?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@QEBAPEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ
+    ?base@?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@QEBAPEAUTransition@cctz@time_internal@absl@@XZ
+    ?base@?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@QEBAPEAUTransitionType@cctz@time_internal@absl@@XZ
+    ?base@?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@QEBAPEAUViableSubstitution@strings_internal@absl@@XZ
     ?begin@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@QEAAPEAUPayload@status_internal@2@XZ
     ?begin@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@QEBAPEBUPayload@status_internal@2@XZ
     ?begin@?$Span@$$CBI@absl@@QEBAPEBIXZ
diff --git a/third_party/abseil-cpp/symbols_x64_rel.def b/third_party/abseil-cpp/symbols_x64_rel.def
index a974eaa4..6d33a5b0 100644
--- a/third_party/abseil-cpp/symbols_x64_rel.def
+++ b/third_party/abseil-cpp/symbols_x64_rel.def
@@ -81,8 +81,6 @@
     ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@AEAAX_K@Z
     ??$__emplace_back_slow_path@AEAVstring_view@absl@@AEBV12@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEAVstring_view@absl@@AEBV34@AEA_K@Z
     ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@PEAX@Cr@std@@@Cr@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z
-    ??$__push_back_slow_path@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEBUTransition@cctz@time_internal@absl@@@Z
-    ??$__push_back_slow_path@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEAAX$$QEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z
     ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@AEAAX_K@Z
     ??$__upper_bound@AEAUByCivilTime@Transition@cctz@time_internal@absl@@PEBU2345@U2345@@Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@AEAUByCivilTime@2345@@Z
     ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z
@@ -309,7 +307,6 @@
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NMAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NNAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z
     ?ConvertFloatImpl@str_format_internal@absl@@YA_NOAEBVFormatConversionSpecImpl@12@PEAVFormatSinkImpl@12@@Z
-    ?ConvertOne@ParsedFormatConsumer@ParsedFormatBase@str_format_internal@absl@@QEAA_NAEBUUnboundConversion@34@Vstring_view@4@@Z
     ?Copy@CordRepRing@cord_internal@absl@@CAPEAV123@PEAV123@II_K@Z
     ?CopyCordToString@absl@@YAXAEBVCord@1@PEAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z
     ?CopyPrefix@CordRepBtree@cord_internal@absl@@AEAA?AUCopyResult@123@_K_N@Z
@@ -861,8 +858,6 @@
     ?__append@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEAAX_K@Z
     ?__append@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEAAX_K@Z
     ?__deallocate_node@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@AEAAXPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@PEAX@Cr@std@@@23@@Z
-    ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEAAPEAUTransition@cctz@time_internal@absl@@AEAU?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@23@PEAU4567@@Z
-    ?__swap_out_circular_buffer@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEAAPEAUTransitionType@cctz@time_internal@absl@@AEAU?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@23@PEAU4567@@Z
     ?__vallocate@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEAAX_K@Z
     ?clear@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@QEAAXXZ
     ?code@Status@absl@@QEBA?AW4StatusCode@2@XZ
@@ -920,6 +915,8 @@
     ?push_back@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z
     ?push_back@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z
     ?push_back@?$deque@PEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEAAXAEBQEBVImpl@time_zone@cctz@time_internal@absl@@@Z
+    ?push_back@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@@Cr@std@@QEAAX$$QEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z
+    ?push_back@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEAAXAEBUTransition@cctz@time_internal@absl@@@Z
     ?push_front@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEAAXAEBQEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z
     ?push_front@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEAAX$$QEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Z
     ?raw_code@Status@absl@@QEBAHXZ
diff --git a/third_party/abseil-cpp/symbols_x86_dbg.def b/third_party/abseil-cpp/symbols_x86_dbg.def
index c73b9378..976d284 100644
--- a/third_party/abseil-cpp/symbols_x86_dbg.def
+++ b/third_party/abseil-cpp/symbols_x86_dbg.def
@@ -74,6 +74,12 @@
     ??$?0AAV?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@X@?$__compressed_pair_elem@AAV?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@$00$0A@@Cr@std@@QAE@AAV?$allocator@UTransition@cctz@time_internal@absl@@@12@@Z
     ??$?0AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@X@?$__compressed_pair_elem@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@$00$0A@@Cr@std@@QAE@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@12@@Z
     ??$?0AAV?$allocator@UViableSubstitution@strings_internal@absl@@@Cr@std@@X@?$__compressed_pair_elem@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@Cr@std@@$00$0A@@Cr@std@@QAE@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@12@@Z
+    ??$?0AAV?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@QAE@AAV?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@12@$$QAV312@@Z
+    ??$?0AAV?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@QAE@AAV?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@12@$$QAV312@@Z
+    ??$?0AAV?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@Cr@std@@QAE@AAV?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@$$QAV312@@Z
+    ??$?0AAV?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@QAE@AAV?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@12@$$QAV312@@Z
+    ??$?0AAV?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@QAE@AAV?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@12@$$QAV312@@Z
+    ??$?0AAV?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@Cr@std@@QAE@AAV?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@12@$$QAV312@@Z
     ??$?0ABV?$allocator@UPayload@status_internal@absl@@@Cr@std@@@?$Storage@V?$allocator@UPayload@status_internal@absl@@@Cr@std@@$0A@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@ABV?$allocator@UPayload@status_internal@absl@@@Cr@std@@@Z
     ??$?0ABV?$allocator@UPayload@status_internal@absl@@@Cr@std@@I$00@?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@Cr@std@@I@container_internal@absl@@QAE@ABV?$allocator@UPayload@status_internal@absl@@@Cr@std@@$$QAI@Z
     ??$?0ABV?$allocator@UPayload@status_internal@absl@@@Cr@std@@I@?$CompressedTupleImpl@V?$CompressedTuple@V?$allocator@UPayload@status_internal@absl@@@Cr@std@@I@container_internal@absl@@U?$integer_sequence@I$0A@$00@3@$00@internal_compressed_tuple@container_internal@absl@@QAE@Uin_place_t@3@ABV?$allocator@UPayload@status_internal@absl@@@Cr@std@@$$QAI@Z
@@ -91,10 +97,14 @@
     ??$?0MU__default_init_tag@Cr@std@@@?$__compressed_pair@MV?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@Cr@std@@@Cr@std@@QAE@$$QAM$$QAU__default_init_tag@12@@Z
     ??$?0PAI@?$SaltedSeedSeq@Vseed_seq@Cr@std@@@random_internal@absl@@QAE@PAI0@Z
     ??$?0PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV01234@$0A@@?$pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@Cr@std@@QAE@$$QAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@0@Z
+    ??$?0PAPAVCordzHandle@cord_internal@absl@@PAPAV012@$0A@@?$pair@PAPAVCordzHandle@cord_internal@absl@@PAPAV123@@Cr@std@@QAE@$$QAPAPAVCordzHandle@cord_internal@absl@@0@Z
+    ??$?0PAPBVCordzHandle@cord_internal@absl@@PAPBV012@$0A@@?$pair@PAPBVCordzHandle@cord_internal@absl@@PAPBV123@@Cr@std@@QAE@$$QAPAPBVCordzHandle@cord_internal@absl@@0@Z
+    ??$?0PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PAU0123@$0A@@?$pair@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PAU1234@@Cr@std@@QAE@$$QAPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@0@Z
     ??$?0PAUTransition@cctz@time_internal@absl@@@?$__wrap_iter@PBUTransition@cctz@time_internal@absl@@@Cr@std@@QAE@ABV?$__wrap_iter@PAUTransition@cctz@time_internal@absl@@@12@PAX@Z
     ??$?0PAUTransition@cctz@time_internal@absl@@PAU0123@$0A@@?$pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@Cr@std@@QAE@$$QAPAUTransition@cctz@time_internal@absl@@0@Z
     ??$?0PAUTransitionType@cctz@time_internal@absl@@@?$__wrap_iter@PBUTransitionType@cctz@time_internal@absl@@@Cr@std@@QAE@ABV?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@12@PAX@Z
     ??$?0PAUTransitionType@cctz@time_internal@absl@@PAU0123@$0A@@?$pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@Cr@std@@QAE@$$QAPAUTransitionType@cctz@time_internal@absl@@0@Z
+    ??$?0PAUViableSubstitution@strings_internal@absl@@PAU012@$0A@@?$pair@PAUViableSubstitution@strings_internal@absl@@PAU123@@Cr@std@@QAE@$$QAPAUViableSubstitution@strings_internal@absl@@0@Z
     ??$?0PAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@Cr@std@@@?$__compressed_pair@PAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@Cr@std@@@Cr@std@@QAE@$$QAPAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@$$QAU?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@12@@Z
     ??$?0PAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@X@?$__compressed_pair_elem@PAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@$0A@$0A@@Cr@std@@QAE@$$QAPAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@Z
     ??$?0PBVFormatArgImpl@str_format_internal@absl@@PAV012@$0A@@?$pair@PBVFormatArgImpl@str_format_internal@absl@@PAV123@@Cr@std@@QAE@$$QAPBVFormatArgImpl@str_format_internal@absl@@$$QAPAV345@@Z
@@ -164,6 +174,12 @@
     ??$?0V?$basic_ostream@DU?$char_traits@D@Cr@std@@@Cr@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QAE@PAV?$basic_ostream@DU?$char_traits@D@Cr@std@@@Cr@std@@@Z
     ??$?0V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@$0A@@Cord@absl@@QAE@$$QAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z
     ??$?0V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QAE@PAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z
+    ??$?0V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@QAE@$$QAV?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@12@0@Z
+    ??$?0V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@QAE@$$QAV?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@12@0@Z
+    ??$?0V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@Cr@std@@QAE@$$QAV?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@12@0@Z
+    ??$?0V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@QAE@$$QAV?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@12@0@Z
+    ??$?0V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@QAE@$$QAV?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@12@0@Z
+    ??$?0V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@V012@$0A@@?$pair@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@Cr@std@@QAE@$$QAV?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@12@0@Z
     ??$?0V?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@XV012@H@?$Span@$$CBVFormatArgImpl@str_format_internal@absl@@@absl@@QAE@ABV?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@@Z
     ??$?0VBufferRawSink@str_format_internal@absl@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QAE@PAVBufferRawSink@12@@Z
     ??$?0VFILERawSink@str_format_internal@absl@@$0A@@FormatRawSinkImpl@str_format_internal@absl@@QAE@PAVFILERawSink@12@@Z
@@ -455,14 +471,6 @@
     ??$__construct_at_end@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QAEXV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z
     ??$__construct_at_end@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QAEXV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@12@0@Z
     ??$__construct_at_end@V?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QAEXV?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@12@0@Z
-    ??$__construct_backward_with_exception_guarantees@V?$allocator@PAVCordzHandle@cord_internal@absl@@@Cr@std@@PAVCordzHandle@cord_internal@absl@@X@Cr@std@@YAXAAV?$allocator@PAVCordzHandle@cord_internal@absl@@@01@PAPAVCordzHandle@cord_internal@absl@@1AAPAPAV345@@Z
-    ??$__construct_backward_with_exception_guarantees@V?$allocator@PBVCordzHandle@cord_internal@absl@@@Cr@std@@PBVCordzHandle@cord_internal@absl@@X@Cr@std@@YAXAAV?$allocator@PBVCordzHandle@cord_internal@absl@@@01@PAPBVCordzHandle@cord_internal@absl@@1AAPAPBV345@@Z
-    ??$__construct_backward_with_exception_guarantees@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@X@Cr@std@@YAXAAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@1AAPAU3456@@Z
-    ??$__construct_backward_with_exception_guarantees@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@UTransition@cctz@time_internal@absl@@X@Cr@std@@YAXAAV?$allocator@UTransition@cctz@time_internal@absl@@@01@PAUTransition@cctz@time_internal@absl@@1AAPAU3456@@Z
-    ??$__construct_backward_with_exception_guarantees@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@UTransitionType@cctz@time_internal@absl@@X@Cr@std@@YAXAAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@PAUTransitionType@cctz@time_internal@absl@@1AAPAU3456@@Z
-    ??$__construct_backward_with_exception_guarantees@V?$allocator@UViableSubstitution@strings_internal@absl@@@Cr@std@@UViableSubstitution@strings_internal@absl@@X@Cr@std@@YAXAAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@PAUViableSubstitution@strings_internal@absl@@1AAPAU345@@Z
-    ??$__construct_forward_with_exception_guarantees@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@PAUTransition@cctz@time_internal@absl@@@Cr@std@@YAXAAV?$allocator@UTransition@cctz@time_internal@absl@@@01@PAUTransition@cctz@time_internal@absl@@1AAPAU3456@@Z
-    ??$__construct_forward_with_exception_guarantees@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@YAXAAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@PAUTransitionType@cctz@time_internal@absl@@1AAPAU3456@@Z
     ??$__construct_node_hash@ABUpiecewise_construct_t@Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@AAE?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@PAX@Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@PAX@Cr@std@@@Cr@std@@@23@@12@IABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z
     ??$__construct_one_at_end@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AAEXXZ
     ??$__construct_one_at_end@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AAEXXZ
@@ -471,7 +479,6 @@
     ??$__construct_one_at_end@ABQBVCordzHandle@cord_internal@absl@@@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AAEXABQBVCordzHandle@cord_internal@absl@@@Z
     ??$__construct_one_at_end@ABUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AAEXABUTransition@cctz@time_internal@absl@@@Z
     ??$__construct_one_at_end@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@@Cr@std@@AAEX$$QAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z
-    ??$__construct_range_forward@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@$$CBVFormatArgImpl@str_format_internal@absl@@V456@V456@V456@X@Cr@std@@YAXAAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@01@PBVFormatArgImpl@str_format_internal@absl@@1AAPAV345@@Z
     ??$__copy@PBVFormatArgImpl@str_format_internal@absl@@PBV123@PAV123@$0A@@Cr@std@@YA?AU?$pair@PBVFormatArgImpl@str_format_internal@absl@@PAV123@@01@PBVFormatArgImpl@str_format_internal@absl@@0PAV345@@Z
     ??$__copy_impl@$$CBVFormatArgImpl@str_format_internal@absl@@V123@X@Cr@std@@YA?AU?$pair@PBVFormatArgImpl@str_format_internal@absl@@PAV123@@01@PBVFormatArgImpl@str_format_internal@absl@@0PAV345@@Z
     ??$__cxx_atomic_compare_exchange_weak@PAUHashtablezInfo@container_internal@absl@@@Cr@std@@YA_NPAU?$__cxx_atomic_base_impl@PAUHashtablezInfo@container_internal@absl@@@01@PAPAUHashtablezInfo@container_internal@absl@@PAU345@W4memory_order@01@3@Z
@@ -524,22 +531,48 @@
     ??$__move@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@PAPAPBV12345@@Cr@std@@YA?AU?$pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@01@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@00@Z
     ??$__move@PAUTransition@cctz@time_internal@absl@@PAU1234@PAU1234@@Cr@std@@YA?AU?$pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@01@PAUTransition@cctz@time_internal@absl@@00@Z
     ??$__move@PAUTransitionType@cctz@time_internal@absl@@PAU1234@PAU1234@@Cr@std@@YA?AU?$pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@01@PAUTransitionType@cctz@time_internal@absl@@00@Z
+    ??$__move@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@01@00@Z
+    ??$__move@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@01@00@Z
+    ??$__move@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@00@Z
+    ??$__move@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@01@00@Z
+    ??$__move@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@01@00@Z
+    ??$__move@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@01@00@Z
     ??$__move_backward@PAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV12345@@Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@00@Z
     ??$__move_backward@UTransition@cctz@time_internal@absl@@U1234@@Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@00@Z
     ??$__move_backward@UTransitionType@cctz@time_internal@absl@@U1234@@Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@00@Z
+    ??$__move_impl@PAPAVCordzHandle@cord_internal@absl@@PAPAV123@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@01@00@Z
+    ??$__move_impl@PAPBVCordzHandle@cord_internal@absl@@PAPBV123@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@01@00@Z
     ??$__move_impl@PAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV12345@X@Cr@std@@YA?AU?$pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@01@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@00@Z
+    ??$__move_impl@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PAU1234@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@00@Z
+    ??$__move_impl@PAUTransition@cctz@time_internal@absl@@PAU1234@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@01@00@Z
+    ??$__move_impl@PAUTransitionType@cctz@time_internal@absl@@PAU1234@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@01@00@Z
+    ??$__move_impl@PAUViableSubstitution@strings_internal@absl@@PAU123@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@01@00@Z
+    ??$__move_impl@PAVCordzHandle@cord_internal@absl@@PAV123@X@Cr@std@@YA?AU?$pair@PAPAVCordzHandle@cord_internal@absl@@PAPAV123@@01@PAPAVCordzHandle@cord_internal@absl@@00@Z
+    ??$__move_impl@PBVCordzHandle@cord_internal@absl@@PBV123@X@Cr@std@@YA?AU?$pair@PAPBVCordzHandle@cord_internal@absl@@PAPBV123@@01@PAPBVCordzHandle@cord_internal@absl@@00@Z
+    ??$__move_impl@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U1234@X@Cr@std@@YA?AU?$pair@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PAU1234@@01@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@00@Z
     ??$__move_impl@UTransition@cctz@time_internal@absl@@U1234@X@Cr@std@@YA?AU?$pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@01@PAUTransition@cctz@time_internal@absl@@00@Z
     ??$__move_impl@UTransitionType@cctz@time_internal@absl@@U1234@X@Cr@std@@YA?AU?$pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@01@PAUTransitionType@cctz@time_internal@absl@@00@Z
+    ??$__move_impl@UViableSubstitution@strings_internal@absl@@U123@X@Cr@std@@YA?AU?$pair@PAUViableSubstitution@strings_internal@absl@@PAU123@@01@PAUViableSubstitution@strings_internal@absl@@00@Z
     ??$__push_back_slow_path@ABQAVCordzHandle@cord_internal@absl@@@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AAEXABQAVCordzHandle@cord_internal@absl@@@Z
     ??$__push_back_slow_path@ABQBVCordzHandle@cord_internal@absl@@@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AAEXABQBVCordzHandle@cord_internal@absl@@@Z
     ??$__push_back_slow_path@ABUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AAEXABUTransition@cctz@time_internal@absl@@@Z
     ??$__push_back_slow_path@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@@Cr@std@@AAEX$$QAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z
     ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@AAEXI@Z
-    ??$__rewrap_iter@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@0@Z
-    ??$__rewrap_iter@PAUTransition@cctz@time_internal@absl@@@Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@0@Z
-    ??$__rewrap_iter@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@0@Z
-    ??$__rewrap_iter@PAVFormatArgImpl@str_format_internal@absl@@@Cr@std@@YAPAVFormatArgImpl@str_format_internal@absl@@PAV234@0@Z
-    ??$__rewrap_iter@PBVFormatArgImpl@str_format_internal@absl@@@Cr@std@@YAPBVFormatArgImpl@str_format_internal@absl@@PBV234@0@Z
+    ??$__rewrap_iter@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@U?$__unwrap_iter_impl@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@$00@Cr@std@@@Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@0@Z
+    ??$__rewrap_iter@PAPAVCordzHandle@cord_internal@absl@@PAPAV123@U?$__unwrap_iter_impl@PAPAVCordzHandle@cord_internal@absl@@$00@Cr@std@@@Cr@std@@YAPAPAVCordzHandle@cord_internal@absl@@PAPAV234@0@Z
+    ??$__rewrap_iter@PAPBVCordzHandle@cord_internal@absl@@PAPBV123@U?$__unwrap_iter_impl@PAPBVCordzHandle@cord_internal@absl@@$00@Cr@std@@@Cr@std@@YAPAPBVCordzHandle@cord_internal@absl@@PAPBV234@0@Z
+    ??$__rewrap_iter@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PAU1234@U?$__unwrap_iter_impl@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$00@Cr@std@@@Cr@std@@YAPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PAU2345@0@Z
+    ??$__rewrap_iter@PAUTransition@cctz@time_internal@absl@@PAU1234@U?$__unwrap_iter_impl@PAUTransition@cctz@time_internal@absl@@$00@Cr@std@@@Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@0@Z
+    ??$__rewrap_iter@PAUTransitionType@cctz@time_internal@absl@@PAU1234@U?$__unwrap_iter_impl@PAUTransitionType@cctz@time_internal@absl@@$00@Cr@std@@@Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@0@Z
+    ??$__rewrap_iter@PAUViableSubstitution@strings_internal@absl@@PAU123@U?$__unwrap_iter_impl@PAUViableSubstitution@strings_internal@absl@@$00@Cr@std@@@Cr@std@@YAPAUViableSubstitution@strings_internal@absl@@PAU234@0@Z
+    ??$__rewrap_iter@PAVFormatArgImpl@str_format_internal@absl@@PAV123@U?$__unwrap_iter_impl@PAVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@@Cr@std@@YAPAVFormatArgImpl@str_format_internal@absl@@PAV234@0@Z
+    ??$__rewrap_iter@PBVFormatArgImpl@str_format_internal@absl@@PBV123@U?$__unwrap_iter_impl@PBVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@@Cr@std@@YAPBVFormatArgImpl@str_format_internal@absl@@PBV234@0@Z
+    ??$__rewrap_iter@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@U?$__unwrap_iter_impl@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@23@@Cr@std@@YA?AV?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@01@V201@0@Z
+    ??$__rewrap_iter@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@U?$__unwrap_iter_impl@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@23@@Cr@std@@YA?AV?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@01@V201@0@Z
+    ??$__rewrap_iter@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@U?$__unwrap_iter_impl@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@$0A@@23@@Cr@std@@YA?AV?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@V201@0@Z
+    ??$__rewrap_iter@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@U?$__unwrap_iter_impl@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@$0A@@23@@Cr@std@@YA?AV?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@01@V201@0@Z
+    ??$__rewrap_iter@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@U?$__unwrap_iter_impl@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@$0A@@23@@Cr@std@@YA?AV?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@01@V201@0@Z
+    ??$__rewrap_iter@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@U?$__unwrap_iter_impl@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@$0A@@23@@Cr@std@@YA?AV?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@01@V201@0@Z
     ??$__to_address@$$CBVFormatArgImpl@str_format_internal@absl@@@Cr@std@@YAPBVFormatArgImpl@str_format_internal@absl@@PBV234@@Z
     ??$__to_address@PAPBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@@Z
     ??$__to_address@PAVCordzHandle@cord_internal@absl@@@Cr@std@@YAPAPAVCordzHandle@cord_internal@absl@@PAPAV234@@Z
@@ -549,11 +582,30 @@
     ??$__to_address@UTransitionType@cctz@time_internal@absl@@@Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@@Z
     ??$__to_address@UViableSubstitution@strings_internal@absl@@@Cr@std@@YAPAUViableSubstitution@strings_internal@absl@@PAU234@@Z
     ??$__to_address@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@YAPAVFormatArgImpl@str_format_internal@absl@@PAV234@@Z
-    ??$__unwrap_iter@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@$00@Cr@std@@@Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@@Z
-    ??$__unwrap_iter@PAUTransition@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PAUTransition@cctz@time_internal@absl@@$00@Cr@std@@@Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@@Z
-    ??$__unwrap_iter@PAUTransitionType@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PAUTransitionType@cctz@time_internal@absl@@$00@Cr@std@@@Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@@Z
-    ??$__unwrap_iter@PAVFormatArgImpl@str_format_internal@absl@@U?$__unwrap_iter_impl@PAVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@@Cr@std@@YAPAVFormatArgImpl@str_format_internal@absl@@PAV234@@Z
-    ??$__unwrap_iter@PBVFormatArgImpl@str_format_internal@absl@@U?$__unwrap_iter_impl@PBVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@@Cr@std@@YAPBVFormatArgImpl@str_format_internal@absl@@PBV234@@Z
+    ??$__uninitialized_allocator_copy@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@VFormatArgImpl@str_format_internal@absl@@V456@$0A@@Cr@std@@YAPAVFormatArgImpl@str_format_internal@absl@@AAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@01@PBV234@1PAV234@@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@PAVCordzHandle@cord_internal@absl@@@Cr@std@@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@23@V423@PAVCordzHandle@cord_internal@absl@@X@Cr@std@@YA?AV?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@01@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@01@V201@11@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@PBVCordzHandle@cord_internal@absl@@@Cr@std@@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@23@V423@PBVCordzHandle@cord_internal@absl@@X@Cr@std@@YA?AV?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@01@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@01@V201@11@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@V423@UConversionItem@ParsedFormatBase@str_format_internal@absl@@X@Cr@std@@YA?AV?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@V201@11@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@PAUTransition@cctz@time_internal@absl@@PAU4567@U4567@X@Cr@std@@YAPAUTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@01@PAU2345@11@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@23@V423@UTransition@cctz@time_internal@absl@@X@Cr@std@@YA?AV?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@01@AAV?$allocator@UTransition@cctz@time_internal@absl@@@01@V201@11@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@PAUTransitionType@cctz@time_internal@absl@@PAU4567@U4567@X@Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@PAU2345@11@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@23@V423@UTransitionType@cctz@time_internal@absl@@X@Cr@std@@YA?AV?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@01@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@V201@11@Z
+    ??$__uninitialized_allocator_move_if_noexcept@V?$allocator@UViableSubstitution@strings_internal@absl@@@Cr@std@@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@23@V423@UViableSubstitution@strings_internal@absl@@X@Cr@std@@YA?AV?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@01@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@V201@11@Z
+    ??$__unwrap_iter@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@@Z
+    ??$__unwrap_iter@PAPAVCordzHandle@cord_internal@absl@@U?$__unwrap_iter_impl@PAPAVCordzHandle@cord_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPAPAVCordzHandle@cord_internal@absl@@PAPAV234@@Z
+    ??$__unwrap_iter@PAPBVCordzHandle@cord_internal@absl@@U?$__unwrap_iter_impl@PAPBVCordzHandle@cord_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPAPBVCordzHandle@cord_internal@absl@@PAPBV234@@Z
+    ??$__unwrap_iter@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@U?$__unwrap_iter_impl@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PAU2345@@Z
+    ??$__unwrap_iter@PAUTransition@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PAUTransition@cctz@time_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@@Z
+    ??$__unwrap_iter@PAUTransitionType@cctz@time_internal@absl@@U?$__unwrap_iter_impl@PAUTransitionType@cctz@time_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@@Z
+    ??$__unwrap_iter@PAUViableSubstitution@strings_internal@absl@@U?$__unwrap_iter_impl@PAUViableSubstitution@strings_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPAUViableSubstitution@strings_internal@absl@@PAU234@@Z
+    ??$__unwrap_iter@PAVFormatArgImpl@str_format_internal@absl@@U?$__unwrap_iter_impl@PAVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPAVFormatArgImpl@str_format_internal@absl@@PAV234@@Z
+    ??$__unwrap_iter@PBVFormatArgImpl@str_format_internal@absl@@U?$__unwrap_iter_impl@PBVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@$0A@@Cr@std@@YAPBVFormatArgImpl@str_format_internal@absl@@PBV234@@Z
+    ??$__unwrap_iter@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@U?$__unwrap_iter_impl@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@23@$0A@@Cr@std@@YA?AV?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@01@V201@@Z
+    ??$__unwrap_iter@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@U?$__unwrap_iter_impl@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@23@$0A@@Cr@std@@YA?AV?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@01@V201@@Z
+    ??$__unwrap_iter@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@U?$__unwrap_iter_impl@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@$0A@@23@$0A@@Cr@std@@YA?AV?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@V201@@Z
+    ??$__unwrap_iter@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@U?$__unwrap_iter_impl@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@$0A@@23@$0A@@Cr@std@@YA?AV?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@01@V201@@Z
+    ??$__unwrap_iter@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@U?$__unwrap_iter_impl@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@$0A@@23@$0A@@Cr@std@@YA?AV?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@01@V201@@Z
+    ??$__unwrap_iter@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@U?$__unwrap_iter_impl@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@$0A@@23@$0A@@Cr@std@@YA?AV?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@01@V201@@Z
     ??$__upper_bound@AAUByCivilTime@Transition@cctz@time_internal@absl@@PBU2345@U2345@@Cr@std@@YAPBUTransition@cctz@time_internal@absl@@PBU2345@0ABU2345@AAUByCivilTime@2345@@Z
     ??$__upper_bound@AAUByUnixTime@Transition@cctz@time_internal@absl@@PBU2345@U2345@@Cr@std@@YAPBUTransition@cctz@time_internal@absl@@PBU2345@0ABU2345@AAUByUnixTime@2345@@Z
     ??$advance@PBUTransition@cctz@time_internal@absl@@H@?$_IterOps@U_ClassicAlgPolicy@Cr@std@@@Cr@std@@SAXAAPBUTransition@cctz@time_internal@absl@@H@Z
@@ -666,10 +718,26 @@
     ??$launder@$$CBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@YAPBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@01@PBU201@@Z
     ??$launder@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@YAPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@01@PAU201@@Z
     ??$lower_bound@PBUTransition@cctz@time_internal@absl@@U1234@UByUnixTime@1234@@Cr@std@@YAPBUTransition@cctz@time_internal@absl@@PBU2345@0ABU2345@UByUnixTime@2345@@Z
+    ??$make_pair@AAV?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@AAV?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@01@$$QAV301@@Z
+    ??$make_pair@AAV?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@AAV?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@01@$$QAV301@@Z
+    ??$make_pair@AAV?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@AAV?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@$$QAV301@@Z
+    ??$make_pair@AAV?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@AAV?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@01@$$QAV301@@Z
+    ??$make_pair@AAV?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@AAV?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@01@$$QAV301@@Z
+    ??$make_pair@AAV?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@AAV?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@01@$$QAV301@@Z
     ??$make_pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@Cr@std@@YA?AU?$pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@01@$$QAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@0@Z
+    ??$make_pair@PAPAVCordzHandle@cord_internal@absl@@PAPAV123@@Cr@std@@YA?AU?$pair@PAPAVCordzHandle@cord_internal@absl@@PAPAV123@@01@$$QAPAPAVCordzHandle@cord_internal@absl@@0@Z
+    ??$make_pair@PAPBVCordzHandle@cord_internal@absl@@PAPBV123@@Cr@std@@YA?AU?$pair@PAPBVCordzHandle@cord_internal@absl@@PAPBV123@@01@$$QAPAPBVCordzHandle@cord_internal@absl@@0@Z
+    ??$make_pair@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PAU1234@@Cr@std@@YA?AU?$pair@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PAU1234@@01@$$QAPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@0@Z
     ??$make_pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@Cr@std@@YA?AU?$pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@01@$$QAPAUTransition@cctz@time_internal@absl@@0@Z
     ??$make_pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@Cr@std@@YA?AU?$pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@01@$$QAPAUTransitionType@cctz@time_internal@absl@@0@Z
+    ??$make_pair@PAUViableSubstitution@strings_internal@absl@@PAU123@@Cr@std@@YA?AU?$pair@PAUViableSubstitution@strings_internal@absl@@PAU123@@01@$$QAPAUViableSubstitution@strings_internal@absl@@0@Z
     ??$make_pair@PBVFormatArgImpl@str_format_internal@absl@@PAV123@@Cr@std@@YA?AU?$pair@PBVFormatArgImpl@str_format_internal@absl@@PAV123@@01@$$QAPBVFormatArgImpl@str_format_internal@absl@@$$QAPAV345@@Z
+    ??$make_pair@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@$$QAV?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@01@0@Z
+    ??$make_pair@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@$$QAV?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@01@0@Z
+    ??$make_pair@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@$$QAV?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@0@Z
+    ??$make_pair@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@$$QAV?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@01@0@Z
+    ??$make_pair@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@$$QAV?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@01@0@Z
+    ??$make_pair@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@$$QAV?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@01@0@Z
     ??$make_unique@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@$$V@Cr@std@@YA?AV?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@Cr@std@@@01@XZ
     ??$make_unique@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@AAV12@@Cr@std@@YA?AV?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@Cr@std@@@01@AAV?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@Z
     ??$max_size@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@X@?$allocator_traits@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@SAIABV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@12@@Z
@@ -691,6 +759,12 @@
     ??$move@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@00@Z
     ??$move@PAUTransition@cctz@time_internal@absl@@PAU1234@@Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@00@Z
     ??$move@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@00@Z
+    ??$move@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AV?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@01@V201@00@Z
+    ??$move@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AV?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@01@V201@00@Z
+    ??$move@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AV?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@V201@00@Z
+    ??$move@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AV?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@01@V201@00@Z
+    ??$move@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AV?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@01@V201@00@Z
+    ??$move@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@Cr@std@@YA?AV?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@01@V201@00@Z
     ??$move_backward@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@00@Z
     ??$move_backward@PAUTransition@cctz@time_internal@absl@@PAU1234@@Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@00@Z
     ??$move_backward@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@00@Z
@@ -884,6 +958,12 @@
     ??0?$optional_data_dtor_base@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@$0A@@optional_internal@absl@@IAE@XZ
     ??0?$optional_data_dtor_base@VCord@absl@@$0A@@optional_internal@absl@@IAE@XZ
     ??0?$probe_seq@$0BA@@container_internal@absl@@QAE@II@Z
+    ??0?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@QAE@PAPAVCordzHandle@cord_internal@absl@@@Z
+    ??0?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@QAE@PAPBVCordzHandle@cord_internal@absl@@@Z
+    ??0?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@QAE@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Z
+    ??0?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@QAE@PAUTransition@cctz@time_internal@absl@@@Z
+    ??0?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@QAE@PAUTransitionType@cctz@time_internal@absl@@@Z
+    ??0?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@QAE@PAUViableSubstitution@strings_internal@absl@@@Z
     ??0?$unique_ptr@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@U?$default_delete@V?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@@Cr@std@@@Cr@std@@QAE@$$QAV012@@Z
     ??0?$unordered_map@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@QAE@XZ
     ??0?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@QAE@XZ
@@ -2483,11 +2563,6 @@
     ?__annotate_shrink@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@ABEXI@Z
     ?__append@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AAEXI@Z
     ?__append@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AAEXI@Z
-    ?__apply@?$__unwrap_iter_impl@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@$00@Cr@std@@SAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV45678@@Z
-    ?__apply@?$__unwrap_iter_impl@PAUTransition@cctz@time_internal@absl@@$00@Cr@std@@SAPAUTransition@cctz@time_internal@absl@@PAU4567@@Z
-    ?__apply@?$__unwrap_iter_impl@PAUTransitionType@cctz@time_internal@absl@@$00@Cr@std@@SAPAUTransitionType@cctz@time_internal@absl@@PAU4567@@Z
-    ?__apply@?$__unwrap_iter_impl@PAVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@SAPAVFormatArgImpl@str_format_internal@absl@@PAV456@@Z
-    ?__apply@?$__unwrap_iter_impl@PBVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@SAPBVFormatArgImpl@str_format_internal@absl@@PBV456@@Z
     ?__back_spare@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QBEIXZ
     ?__back_spare@?$deque@PBVImpl@time_zone@cctz@time_internal@absl@@V?$allocator@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QBEIXZ
     ?__base_destruct_at_end@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AAEXPAPAVCordzHandle@cord_internal@absl@@@Z
@@ -2650,6 +2725,21 @@
     ?__recommend@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@Cr@std@@@Cr@std@@ABEII@Z
     ?__recommend@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@ABEII@Z
     ?__rehash_unique@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@QAEXI@Z
+    ?__rewrap@?$__unwrap_iter_impl@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@$00@Cr@std@@SAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV45678@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PAPAVCordzHandle@cord_internal@absl@@$00@Cr@std@@SAPAPAVCordzHandle@cord_internal@absl@@PAPAV456@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PAPBVCordzHandle@cord_internal@absl@@$00@Cr@std@@SAPAPBVCordzHandle@cord_internal@absl@@PAPBV456@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$00@Cr@std@@SAPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PAU4567@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PAUTransition@cctz@time_internal@absl@@$00@Cr@std@@SAPAUTransition@cctz@time_internal@absl@@PAU4567@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PAUTransitionType@cctz@time_internal@absl@@$00@Cr@std@@SAPAUTransitionType@cctz@time_internal@absl@@PAU4567@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PAUViableSubstitution@strings_internal@absl@@$00@Cr@std@@SAPAUViableSubstitution@strings_internal@absl@@PAU456@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PAVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@SAPAVFormatArgImpl@str_format_internal@absl@@PAV456@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@PBVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@SAPBVFormatArgImpl@str_format_internal@absl@@PBV456@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@23@V423@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@23@V423@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@V423@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@23@V423@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@23@V423@0@Z
+    ?__rewrap@?$__unwrap_iter_impl@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@23@V423@0@Z
     ?__swap_out_circular_buffer@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AAEXAAU?$__split_buffer@PAVCordzHandle@cord_internal@absl@@AAV?$allocator@PAVCordzHandle@cord_internal@absl@@@Cr@std@@@23@@Z
     ?__swap_out_circular_buffer@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AAEXAAU?$__split_buffer@PBVCordzHandle@cord_internal@absl@@AAV?$allocator@PBVCordzHandle@cord_internal@absl@@@Cr@std@@@23@@Z
     ?__swap_out_circular_buffer@?$vector@UConversionItem@ParsedFormatBase@str_format_internal@absl@@V?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@@Cr@std@@AAEXAAU?$__split_buffer@UConversionItem@ParsedFormatBase@str_format_internal@absl@@AAV?$allocator@UConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@@23@@Z
@@ -2665,6 +2755,21 @@
     ?__throw_length_error@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@ABEXXZ
     ?__throw_length_error@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@Cr@std@@@Cr@std@@ABEXXZ
     ?__throw_length_error@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@ABEXXZ
+    ?__unwrap@?$__unwrap_iter_impl@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@$00@Cr@std@@SAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV45678@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PAPAVCordzHandle@cord_internal@absl@@$00@Cr@std@@SAPAPAVCordzHandle@cord_internal@absl@@PAPAV456@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PAPBVCordzHandle@cord_internal@absl@@$00@Cr@std@@SAPAPBVCordzHandle@cord_internal@absl@@PAPBV456@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@$00@Cr@std@@SAPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PAU4567@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PAUTransition@cctz@time_internal@absl@@$00@Cr@std@@SAPAUTransition@cctz@time_internal@absl@@PAU4567@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PAUTransitionType@cctz@time_internal@absl@@$00@Cr@std@@SAPAUTransitionType@cctz@time_internal@absl@@PAU4567@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PAUViableSubstitution@strings_internal@absl@@$00@Cr@std@@SAPAUViableSubstitution@strings_internal@absl@@PAU456@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PAVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@SAPAVFormatArgImpl@str_format_internal@absl@@PAV456@@Z
+    ?__unwrap@?$__unwrap_iter_impl@PBVFormatArgImpl@str_format_internal@absl@@$00@Cr@std@@SAPBVFormatArgImpl@str_format_internal@absl@@PBV456@@Z
+    ?__unwrap@?$__unwrap_iter_impl@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@23@V423@@Z
+    ?__unwrap@?$__unwrap_iter_impl@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@23@V423@@Z
+    ?__unwrap@?$__unwrap_iter_impl@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@V423@@Z
+    ?__unwrap@?$__unwrap_iter_impl@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@23@V423@@Z
+    ?__unwrap@?$__unwrap_iter_impl@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@23@V423@@Z
+    ?__unwrap@?$__unwrap_iter_impl@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@$0A@@Cr@std@@SA?AV?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@23@V423@@Z
     ?__upcast@?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@PAX@Cr@std@@@Cr@std@@QAEPAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@PAX@23@XZ
     ?__vallocate@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@AAEXI@Z
     ?__vdeallocate@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@AAEXXZ
@@ -2726,6 +2831,12 @@
     ?base@?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@QBEPAPAPBVImpl@time_zone@cctz@time_internal@absl@@XZ
     ?base@?$move_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@QBEPAUTransition@cctz@time_internal@absl@@XZ
     ?base@?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@QBEPAUTransitionType@cctz@time_internal@absl@@XZ
+    ?base@?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@QBEPAPAVCordzHandle@cord_internal@absl@@XZ
+    ?base@?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@QBEPAPBVCordzHandle@cord_internal@absl@@XZ
+    ?base@?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@QBEPAUConversionItem@ParsedFormatBase@str_format_internal@absl@@XZ
+    ?base@?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@QBEPAUTransition@cctz@time_internal@absl@@XZ
+    ?base@?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@QBEPAUTransitionType@cctz@time_internal@absl@@XZ
+    ?base@?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@QBEPAUViableSubstitution@strings_internal@absl@@XZ
     ?begin@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@QAEPAUPayload@status_internal@2@XZ
     ?begin@?$InlinedVector@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@Cr@std@@@absl@@QBEPBUPayload@status_internal@2@XZ
     ?begin@?$Span@$$CBI@absl@@QBEPBIXZ
diff --git a/third_party/abseil-cpp/symbols_x86_rel.def b/third_party/abseil-cpp/symbols_x86_rel.def
index 588b493..15ee27d 100644
--- a/third_party/abseil-cpp/symbols_x86_rel.def
+++ b/third_party/abseil-cpp/symbols_x86_rel.def
@@ -97,7 +97,6 @@
     ??$emplace@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QAE?AV?$__wrap_iter@PAUTransitionType@cctz@time_internal@absl@@@12@V?$__wrap_iter@PBUTransitionType@cctz@time_internal@absl@@@12@@Z
     ??$emplace_back@$$V@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QAEXXZ
     ??$emplace_back@$$V@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QAEXXZ
-    ??$emplace_back@AAVstring_view@absl@@ABV12@AAI@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@Cr@std@@@Cr@std@@QAEAAUViableSubstitution@strings_internal@absl@@AAVstring_view@5@ABV65@AAI@Z
     ??$find@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@QAE?AV?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@PAX@Cr@std@@@12@ABV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@12@@Z
     ??$find_first_non_full@X@container_internal@absl@@YA?AUFindInfo@01@PBW4ctrl_t@01@II@Z
     ??0?$BigUnsigned@$03@strings_internal@absl@@QAE@Vstring_view@2@@Z
@@ -862,8 +861,6 @@
     ?__append@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AAEXI@Z
     ?__append@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AAEXI@Z
     ?__deallocate_node@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@AAEXPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@PAX@Cr@std@@@23@@Z
-    ?__swap_out_circular_buffer@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AAEPAUTransition@cctz@time_internal@absl@@AAU?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@23@PAU4567@@Z
-    ?__swap_out_circular_buffer@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AAEPAUTransitionType@cctz@time_internal@absl@@AAU?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@23@PAU4567@@Z
     ?__vallocate@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@AAEXI@Z
     ?clear@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@QAEXXZ
     ?code@Status@absl@@QBE?AW4StatusCode@2@XZ
diff --git a/third_party/blink/common/DEPS b/third_party/blink/common/DEPS
index 81e1c1d..73a1297 100644
--- a/third_party/blink/common/DEPS
+++ b/third_party/blink/common/DEPS
@@ -22,6 +22,7 @@
     "+services/network/public/mojom/referrer_policy.mojom.h",
     "+services/network/public/mojom/web_sandbox_flags.mojom-shared.h",
     "+services/network/public/mojom/early_hints.mojom.h",
+    "+services/network/public/mojom/fetch_api.mojom.h",
     "+services/network/public/mojom/url_loader.mojom.h",
     "+services/network/public/mojom/url_loader_factory.mojom.h",
     "+services/network/public/mojom/url_response_head.mojom.h",
diff --git a/third_party/blink/common/interest_group/auction_config.cc b/third_party/blink/common/interest_group/auction_config.cc
index 6823f4c..16e0a84 100644
--- a/third_party/blink/common/interest_group/auction_config.cc
+++ b/third_party/blink/common/interest_group/auction_config.cc
@@ -17,19 +17,6 @@
 AuctionConfig::NonSharedParams& AuctionConfig::NonSharedParams::operator=(
     NonSharedParams&&) = default;
 
-bool AuctionConfig::NonSharedParams::operator==(
-    const NonSharedParams& other) const {
-  return std::tie(interest_group_buyers, auction_signals, seller_signals,
-                  seller_timeout, per_buyer_signals, per_buyer_timeouts,
-                  all_buyers_timeout, per_buyer_group_limits,
-                  all_buyers_group_limit, component_auctions) !=
-         std::tie(other.interest_group_buyers, other.auction_signals,
-                  other.seller_signals, other.seller_timeout,
-                  other.per_buyer_signals, other.per_buyer_timeouts,
-                  other.all_buyers_timeout, other.per_buyer_group_limits,
-                  other.all_buyers_group_limit, other.component_auctions);
-}
-
 AuctionConfig::AuctionConfig() = default;
 AuctionConfig::AuctionConfig(const AuctionConfig&) = default;
 AuctionConfig::AuctionConfig(AuctionConfig&&) = default;
@@ -38,16 +25,4 @@
 AuctionConfig& AuctionConfig::operator=(const AuctionConfig&) = default;
 AuctionConfig& AuctionConfig::operator=(AuctionConfig&&) = default;
 
-bool AuctionConfig::operator==(const AuctionConfig& other) const {
-  return std::tie(seller, decision_logic_url, trusted_scoring_signals_url,
-                  non_shared_params, seller_experiment_group_id,
-                  all_buyer_experiment_group_id,
-                  per_buyer_experiment_group_ids) !=
-         std::tie(other.seller, other.decision_logic_url,
-                  other.trusted_scoring_signals_url, other.non_shared_params,
-                  other.seller_experiment_group_id,
-                  other.all_buyer_experiment_group_id,
-                  other.per_buyer_experiment_group_ids);
-}
-
 }  // namespace blink
diff --git a/third_party/blink/common/interest_group/auction_config_mojom_traits_test.cc b/third_party/blink/common/interest_group/auction_config_mojom_traits_test.cc
index 0b38dbc8..38b45df1 100644
--- a/third_party/blink/common/interest_group/auction_config_mojom_traits_test.cc
+++ b/third_party/blink/common/interest_group/auction_config_mojom_traits_test.cc
@@ -19,6 +19,29 @@
 
 namespace blink {
 
+bool operator==(const AuctionConfig::NonSharedParams& a,
+                const AuctionConfig::NonSharedParams& b) {
+  return std::tie(a.interest_group_buyers, a.auction_signals, a.seller_signals,
+                  a.seller_timeout, a.per_buyer_signals, a.per_buyer_timeouts,
+                  a.all_buyers_timeout, a.per_buyer_group_limits,
+                  a.all_buyers_group_limit, a.component_auctions) ==
+         std::tie(b.interest_group_buyers, b.auction_signals, b.seller_signals,
+                  b.seller_timeout, b.per_buyer_signals, b.per_buyer_timeouts,
+                  b.all_buyers_timeout, b.per_buyer_group_limits,
+                  b.all_buyers_group_limit, b.component_auctions);
+}
+
+bool operator==(const AuctionConfig& a, const AuctionConfig& b) {
+  return std::tie(a.seller, a.decision_logic_url, a.trusted_scoring_signals_url,
+                  a.non_shared_params, a.seller_experiment_group_id,
+                  a.all_buyer_experiment_group_id,
+                  a.per_buyer_experiment_group_ids) ==
+         std::tie(b.seller, b.decision_logic_url, b.trusted_scoring_signals_url,
+                  b.non_shared_params, b.seller_experiment_group_id,
+                  b.all_buyer_experiment_group_id,
+                  b.per_buyer_experiment_group_ids);
+}
+
 namespace {
 
 // Creates a minimal valid AuctionConfig, with a seller and the passed in
@@ -70,8 +93,12 @@
       mojo::test::SerializeAndDeserialize<blink::mojom::AuctionAdConfig>(
           auction_config, auction_config_clone);
 
-  if (success)
+  if (success) {
     EXPECT_EQ(auction_config, auction_config_clone);
+    // This *should* be implied by the above, but let's check...
+    EXPECT_EQ(auction_config.non_shared_params,
+              auction_config_clone.non_shared_params);
+  }
   return success;
 }
 
diff --git a/third_party/blink/common/loader/network_utils.cc b/third_party/blink/common/loader/network_utils.cc
index fbd5272..525baff0 100644
--- a/third_party/blink/common/loader/network_utils.cc
+++ b/third_party/blink/common/loader/network_utils.cc
@@ -5,12 +5,22 @@
 #include "third_party/blink/public/common/loader/network_utils.h"
 
 #include "media/media_buildflags.h"
+#include "net/http/http_request_headers.h"
+#include "services/network/public/cpp/constants.h"
+#include "services/network/public/mojom/fetch_api.mojom.h"
 #include "third_party/blink/public/common/buildflags.h"
 #include "third_party/blink/public/common/features.h"
 
 namespace blink {
 namespace network_utils {
 
+namespace {
+
+constexpr char kStylesheetAcceptHeader[] = "text/css,*/*;q=0.1";
+constexpr char kWebBundleAcceptHeader[] = "application/webbundle;v=b2";
+
+}  // namespace
+
 bool AlwaysAccessNetwork(
     const scoped_refptr<net::HttpResponseHeaders>& headers) {
   if (!headers)
@@ -44,5 +54,26 @@
 #endif
 }
 
+void SetAcceptHeader(net::HttpRequestHeaders& headers,
+                     network::mojom::RequestDestination request_destination) {
+  if (request_destination == network::mojom::RequestDestination::kStyle ||
+      request_destination == network::mojom::RequestDestination::kXslt) {
+    headers.SetHeader(net::HttpRequestHeaders::kAccept,
+                      kStylesheetAcceptHeader);
+  } else if (request_destination ==
+             network::mojom::RequestDestination::kImage) {
+    headers.SetHeaderIfMissing(net::HttpRequestHeaders::kAccept,
+                               ImageAcceptHeader());
+  } else if (request_destination ==
+             network::mojom::RequestDestination::kWebBundle) {
+    headers.SetHeader(net::HttpRequestHeaders::kAccept, kWebBundleAcceptHeader);
+  } else {
+    // Calling SetHeaderIfMissing() instead of SetHeader() because JS can
+    // manually set an accept header on an XHR.
+    headers.SetHeaderIfMissing(net::HttpRequestHeaders::kAccept,
+                               network::kDefaultAcceptHeaderValue);
+  }
+}
+
 }  // namespace network_utils
 }  // namespace blink
diff --git a/third_party/blink/public/common/interest_group/auction_config.h b/third_party/blink/public/common/interest_group/auction_config.h
index 573d1af..092bd44 100644
--- a/third_party/blink/public/common/interest_group/auction_config.h
+++ b/third_party/blink/public/common/interest_group/auction_config.h
@@ -42,9 +42,6 @@
     NonSharedParams& operator=(const NonSharedParams&);
     NonSharedParams& operator=(NonSharedParams&&);
 
-    // Provided for testing.
-    bool operator==(const NonSharedParams& other) const;
-
     // Owners of interest groups allowed to participate in the auction.
     absl::optional<std::vector<url::Origin>> interest_group_buyers;
 
@@ -91,9 +88,6 @@
   AuctionConfig& operator=(const AuctionConfig&);
   AuctionConfig& operator=(AuctionConfig&&);
 
-  // Provided for testing.
-  bool operator==(const AuctionConfig& other) const;
-
   // Seller running the auction.
   url::Origin seller;
 
diff --git a/third_party/blink/public/common/interest_group/interest_group.h b/third_party/blink/public/common/interest_group/interest_group.h
index 2d64c87..4e840eb7 100644
--- a/third_party/blink/public/common/interest_group/interest_group.h
+++ b/third_party/blink/public/common/interest_group/interest_group.h
@@ -5,6 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_INTEREST_GROUP_INTEREST_GROUP_H_
 #define THIRD_PARTY_BLINK_PUBLIC_COMMON_INTEREST_GROUP_INTEREST_GROUP_H_
 
+#include <set>
 #include <string>
 #include <vector>
 
@@ -94,7 +95,7 @@
   absl::optional<std::string> user_bidding_signals;
   absl::optional<std::vector<InterestGroup::Ad>> ads, ad_components;
 
-  static_assert(__LINE__ == 97, R"(
+  static_assert(__LINE__ == 98, R"(
 If modifying InterestGroup fields, make sure to also modify:
 
 * IsValid(), EstimateSize(), and IsEqualForTesting() in this class
@@ -122,6 +123,26 @@
 )");
 };
 
+// A unique identifier for interest groups.
+struct InterestGroupKey {
+  InterestGroupKey(url::Origin o, std::string n)
+      : owner(std::move(o)), name(std::move(n)) {}
+  inline bool operator<(const InterestGroupKey& other) const {
+    return owner != other.owner ? owner < other.owner : name < other.name;
+  }
+  inline bool operator==(const InterestGroupKey& other) const {
+    return owner == other.owner && name == other.name;
+  }
+  url::Origin owner;
+  std::string name;
+};
+
+// A set of interest groups, identified by owner and name. Used to log which
+// interest groups bid in an auction. A sets is used to avoid double-counting
+// interest groups that bid in multiple components auctions in a component
+// auction.
+using InterestGroupSet = std::set<InterestGroupKey>;
+
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_PUBLIC_COMMON_INTEREST_GROUP_INTEREST_GROUP_H_
diff --git a/third_party/blink/public/common/loader/network_utils.h b/third_party/blink/public/common/loader/network_utils.h
index 9e87a88..e833412a 100644
--- a/third_party/blink/public/common/loader/network_utils.h
+++ b/third_party/blink/public/common/loader/network_utils.h
@@ -7,8 +7,13 @@
 
 #include "base/memory/scoped_refptr.h"
 #include "net/http/http_response_headers.h"
+#include "services/network/public/mojom/fetch_api.mojom-forward.h"
 #include "third_party/blink/public/common/common_export.h"
 
+namespace net {
+class HttpRequestHeaders;
+}  // namespace net
+
 namespace blink {
 namespace network_utils {
 
@@ -20,6 +25,11 @@
 // Returns the accept header for image resources.
 BLINK_COMMON_EXPORT const char* ImageAcceptHeader();
 
+// Sets or update Accept header based on `request_destination`.
+BLINK_COMMON_EXPORT void SetAcceptHeader(
+    net::HttpRequestHeaders& headers,
+    network::mojom::RequestDestination request_destination);
+
 }  // namespace network_utils
 }  // namespace blink
 
diff --git a/third_party/blink/renderer/core/css/css_selector.cc b/third_party/blink/renderer/core/css/css_selector.cc
index bb16700..fcd03fc 100644
--- a/third_party/blink/renderer/core/css/css_selector.cc
+++ b/third_party/blink/renderer/core/css/css_selector.cc
@@ -795,32 +795,6 @@
   }
 }
 
-bool CSSSelector::operator==(const CSSSelector& other) const {
-  const CSSSelector* sel1 = this;
-  const CSSSelector* sel2 = &other;
-
-  while (sel1 && sel2) {
-    if (sel1->Attribute() != sel2->Attribute() ||
-        sel1->Relation() != sel2->Relation() || sel1->match_ != sel2->match_ ||
-        sel1->Value() != sel2->Value() ||
-        sel1->GetPseudoType() != sel2->GetPseudoType() ||
-        sel1->Argument() != sel2->Argument()) {
-      return false;
-    }
-    if (sel1->match_ == kTag) {
-      if (sel1->TagQName() != sel2->TagQName())
-        return false;
-    }
-    sel1 = sel1->TagHistory();
-    sel2 = sel2->TagHistory();
-  }
-
-  if (sel1 || sel2)
-    return false;
-
-  return true;
-}
-
 static void SerializeIdentifierOrAny(const AtomicString& identifier,
                                      const AtomicString& any,
                                      StringBuilder& builder) {
diff --git a/third_party/blink/renderer/core/css/css_selector.h b/third_party/blink/renderer/core/css/css_selector.h
index 148ac714d..efd9e52 100644
--- a/third_party/blink/renderer/core/css/css_selector.h
+++ b/third_party/blink/renderer/core/css/css_selector.h
@@ -101,7 +101,8 @@
 
   String SelectorText() const;
 
-  bool operator==(const CSSSelector&) const;
+  bool operator==(const CSSSelector&) const = delete;
+  bool operator!=(const CSSSelector&) const = delete;
 
   static constexpr unsigned kIdSpecificity = 0x010000;
   static constexpr unsigned kClassLikeSpecificity = 0x000100;
diff --git a/third_party/blink/renderer/core/paint/cull_rect_updater.cc b/third_party/blink/renderer/core/paint/cull_rect_updater.cc
index 6e23fa4..894a8e2 100644
--- a/third_party/blink/renderer/core/paint/cull_rect_updater.cc
+++ b/third_party/blink/renderer/core/paint/cull_rect_updater.cc
@@ -79,6 +79,14 @@
       return true;
     }
 
+    // This avoids cull rect change of composited sticky elements on scroll.
+    if (RuntimeEnabledFeatures::ScrollUpdateOptimizationsEnabled() &&
+        properties->StickyTranslation() &&
+        properties->StickyTranslation()
+            ->RequiresCompositingForStickyPosition()) {
+      return true;
+    }
+
     // Cull rect mapping doesn't work under perspective in some cases.
     // See http://crbug.com/887558 for details.
     if (properties->Perspective()) {
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc
index 07223a1..eb781cb 100644
--- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc
@@ -745,8 +745,8 @@
   scrollable_area->SetScrollOffset(ScrollOffset(0, 1),
                                    mojom::blink::ScrollType::kProgrammatic);
   UpdateAllLifecyclePhasesExceptPaint();
-  EXPECT_TRUE(
-      GetDocument().View()->GetPaintArtifactCompositor()->NeedsUpdate());
+  EXPECT_EQ(!RuntimeEnabledFeatures::ScrollUpdateOptimizationsEnabled(),
+            GetDocument().View()->GetPaintArtifactCompositor()->NeedsUpdate());
   UpdateAllLifecyclePhasesForTest();
   EXPECT_EQ(ScrollOffset(0, 1), scrollable_area->GetScrollOffset());
 }
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
index b4d0269..4c2b6d3 100644
--- a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
+++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
@@ -748,8 +748,6 @@
         }
       }
 
-      // TODO(crbug.com/1117658): Implement direct update of StickyTranslation
-      // when we have maximum overlap for sticky elements.
       OnUpdateTransform(properties_->UpdateStickyTranslation(
           *context_.current.transform, std::move(state)));
     } else {
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc
index 5840de6..9addcb58 100644
--- a/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc
+++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc
@@ -6829,6 +6829,52 @@
 }
 
 TEST_P(PaintPropertyTreeBuilderTest,
+       SimpleStickyTranslationChangeDoesNotCausePacUpdate) {
+  ScopedScrollUpdateOptimizationsForTest scroll_optimizations(true);
+
+  SetBodyInnerHTML(R"HTML(
+    <style>::webkit-scrollbar { width: 0; height: 0 }</style>
+    <!-- position: relative and z-index: 1 are needed to make the scroller a
+     stacking context (otherwise scroll of a non-stacking-context containing
+     stacked descendant would cause PAC update).
+     TODO(wangxianzhu): Remove them when fixing crbug.com/1310586. -->
+    <div id="scroller" style="width: 200px; height: 200px; overflow: scroll;
+                              background: blue; position: relative; z-index: 1">
+      <div style="height: 300px"></div>
+      <div id="target" style="position: sticky; bottom: 0; height: 20px"></div>
+    </div>
+  )HTML");
+
+  auto* pac = GetDocument().View()->GetPaintArtifactCompositor();
+  ASSERT_TRUE(pac);
+
+  auto* properties = PaintPropertiesForElement("target");
+  ASSERT_TRUE(properties);
+  auto* sticky_translation = properties->StickyTranslation();
+  ASSERT_TRUE(sticky_translation);
+  EXPECT_EQ(gfx::Vector2dF(0, -120), sticky_translation->Translation2D());
+
+  auto* property_trees = GetChromeClient().layer_tree_host()->property_trees();
+  const auto* cc_transform_node =
+      property_trees->transform_tree().FindNodeFromElementId(
+          sticky_translation->GetCompositorElementId());
+  ASSERT_TRUE(cc_transform_node);
+  // We don't push the sticky offset to cc.
+  EXPECT_EQ(gfx::Vector2dF(), cc_transform_node->local.To2dTranslation());
+
+  GetDocument().getElementById("scroller")->setScrollTop(200);
+  UpdateAllLifecyclePhasesExceptPaint();
+
+  EXPECT_EQ(gfx::Vector2dF(), sticky_translation->Translation2D());
+  EXPECT_FALSE(pac->NeedsUpdate());
+  EXPECT_EQ(gfx::Vector2dF(), cc_transform_node->local.To2dTranslation());
+  EXPECT_TRUE(property_trees->transform_tree().needs_update());
+  EXPECT_TRUE(cc_transform_node->transform_changed);
+
+  UpdateAllLifecyclePhasesForTest();
+}
+
+TEST_P(PaintPropertyTreeBuilderTest,
        NonCompositedTransformChangeCausesPacUpdate) {
   SetBodyInnerHTML(R"HTML(
     <style>
diff --git a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc
index 0965def..0fc517c 100644
--- a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc
+++ b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc
@@ -579,7 +579,7 @@
 
   // Populate the output mailbox and callback.
   {
-    bool is_overlay_candidate = !!color_buffer_for_mailbox->gpu_memory_buffer;
+    bool is_overlay_candidate = color_buffer_for_mailbox->has_usage_scanout;
     *out_resource = viz::TransferableResource::MakeGL(
         color_buffer_for_mailbox->mailbox, GL_LINEAR, texture_target_,
         color_buffer_for_mailbox->produce_sync_token, size_,
@@ -826,6 +826,7 @@
     const gfx::ColorSpace& color_space,
     viz::ResourceFormat format,
     GLuint texture_id,
+    bool has_usage_scanout,
     std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer,
     gpu::Mailbox mailbox)
     : owning_thread_ref(base::PlatformThread::CurrentRef()),
@@ -834,6 +835,7 @@
       color_space(color_space),
       format(format),
       texture_id(texture_id),
+      has_usage_scanout(has_usage_scanout),
       gpu_memory_buffer(std::move(gpu_memory_buffer)),
       mailbox(mailbox) {}
 
@@ -1828,6 +1830,7 @@
   uint32_t usage = gpu::SHARED_IMAGE_USAGE_GLES2 |
                    gpu::SHARED_IMAGE_USAGE_GLES2_FRAMEBUFFER_HINT |
                    gpu::SHARED_IMAGE_USAGE_DISPLAY;
+  bool has_usage_scanout = false;
   GrSurfaceOrigin origin = opengl_flip_y_extension_
                                ? kTopLeft_GrSurfaceOrigin
                                : kBottomLeft_GrSurfaceOrigin;
@@ -1848,39 +1851,47 @@
     front_buffer_mailbox = mailboxes.front_buffer;
   } else {
     if (ShouldUseChromiumImage()) {
-      gfx::BufferFormat buffer_format;
-      if (allocate_alpha_channel_) {
-        buffer_format = use_half_float_storage_ ? gfx::BufferFormat::RGBA_F16
-                                                : gfx::BufferFormat::RGBA_8888;
-      } else {
-        DCHECK(!use_half_float_storage_);
-        buffer_format = gfx::BufferFormat::RGBX_8888;
+      if (!allocate_alpha_channel_ && have_alpha_channel_) {
+        // TODO(crbug.com/911176): RGB emulation is only used by the
+        // validating command decoder (for the passthrough command decoder,
+        // its implementation is pushed into ANGLE). In this path, and only
+        // this path, explicitly allocate a GpuMemoryBuffer and bind it to a
+        // SharedImage.
+        gfx::BufferFormat buffer_format = gfx::BufferFormat::RGBX_8888;
         if (gpu::IsImageFromGpuMemoryBufferFormatSupported(
                 gfx::BufferFormat::BGRX_8888,
                 ContextProvider()->GetCapabilities())) {
           buffer_format = gfx::BufferFormat::BGRX_8888;
         }
-      }
-      // TODO(crbug.com/911176): When RGB emulation is not needed, we should use
-      // the non-GMB CreateSharedImage with gpu::SHARED_IMAGE_USAGE_SCANOUT in
-      // order to allocate the GMB service-side and avoid a synchronous
-      // round-trip to the browser process here.
-      gfx::BufferUsage buffer_usage = gfx::BufferUsage::SCANOUT;
-      uint32_t additional_usage_flags = gpu::SHARED_IMAGE_USAGE_SCANOUT;
-      if (low_latency_enabled()) {
-        buffer_usage = gfx::BufferUsage::SCANOUT_FRONT_RENDERING;
-        additional_usage_flags = gpu::SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE;
-      }
-
-      if (gpu::IsImageFromGpuMemoryBufferFormatSupported(
-              buffer_format, ContextProvider()->GetCapabilities())) {
-        gpu_memory_buffer = gpu_memory_buffer_manager->CreateGpuMemoryBuffer(
-            size, buffer_format, buffer_usage, gpu::kNullSurfaceHandle,
-            nullptr);
-        if (gpu_memory_buffer) {
-          back_buffer_mailbox = sii->CreateSharedImage(
-              gpu_memory_buffer.get(), gpu_memory_buffer_manager, color_space_,
-              origin, kPremul_SkAlphaType, usage | additional_usage_flags);
+        gfx::BufferUsage buffer_usage = gfx::BufferUsage::SCANOUT;
+        uint32_t additional_usage_flags = gpu::SHARED_IMAGE_USAGE_SCANOUT;
+        if (low_latency_enabled()) {
+          buffer_usage = gfx::BufferUsage::SCANOUT_FRONT_RENDERING;
+          additional_usage_flags =
+              gpu::SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE;
+        }
+        if (gpu::IsImageFromGpuMemoryBufferFormatSupported(
+                buffer_format, ContextProvider()->GetCapabilities())) {
+          gpu_memory_buffer = gpu_memory_buffer_manager->CreateGpuMemoryBuffer(
+              size, buffer_format, buffer_usage, gpu::kNullSurfaceHandle,
+              nullptr);
+          if (gpu_memory_buffer) {
+            has_usage_scanout = true;
+            back_buffer_mailbox = sii->CreateSharedImage(
+                gpu_memory_buffer.get(), gpu_memory_buffer_manager,
+                color_space_, origin, kPremul_SkAlphaType,
+                usage | additional_usage_flags);
+          }
+        }
+      } else {
+        if (gpu::IsImageFromGpuMemoryBufferFormatSupported(
+                viz::BufferFormat(format),
+                ContextProvider()->GetCapabilities())) {
+          usage |= gpu::SHARED_IMAGE_USAGE_SCANOUT;
+          has_usage_scanout = true;
+          if (low_latency_enabled()) {
+            usage |= gpu::SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE;
+          }
         }
       }
     }
@@ -1911,7 +1922,7 @@
         front_buffer_mailbox.name);
     front_color_buffer_ = base::MakeRefCounted<ColorBuffer>(
         weak_factory_.GetWeakPtr(), size, color_space_, format, texture_id,
-        nullptr, front_buffer_mailbox);
+        /*has_usage_scanout=*/false, nullptr, front_buffer_mailbox);
   }
   // Import the backbuffer of swap chain or allocated SharedImage into GL.
   texture_id =
@@ -1940,7 +1951,7 @@
 
   return base::MakeRefCounted<ColorBuffer>(
       weak_factory_.GetWeakPtr(), size, color_space_, format, texture_id,
-      std::move(gpu_memory_buffer), back_buffer_mailbox);
+      has_usage_scanout, std::move(gpu_memory_buffer), back_buffer_mailbox);
 }
 
 void DrawingBuffer::AttachColorBufferToReadFramebuffer() {
diff --git a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.h b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.h
index f4e6c8d..890b0f10 100644
--- a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.h
+++ b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.h
@@ -414,6 +414,7 @@
                 const gfx::ColorSpace& color_space,
                 viz::ResourceFormat,
                 GLuint texture_id,
+                bool has_usage_scanout,
                 std::unique_ptr<gfx::GpuMemoryBuffer>,
                 gpu::Mailbox mailbox);
     ColorBuffer(const ColorBuffer&) = delete;
@@ -432,6 +433,7 @@
     const gfx::ColorSpace color_space;
     const viz::ResourceFormat format;
     const GLuint texture_id = 0;
+    const bool has_usage_scanout;
     std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer;
 
     // If we're emulating an RGB back buffer using an RGBA Chromium
diff --git a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_test.cc b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_test.cc
index 300a7a6..c154bc84 100644
--- a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_test.cc
+++ b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_test.cc
@@ -510,71 +510,6 @@
   EXPECT_EQ(0u, sii->shared_image_count());
 }
 
-TEST_F(DrawingBufferImageChromiumTest, AllocationFailure) {
-  GLES2InterfaceForTests* gl_ = drawing_buffer_->ContextGLForTests();
-  viz::TestGpuMemoryBufferManager* gmb_manager =
-      static_cast<viz::TestGpuMemoryBufferManager*>(
-          Platform::Current()->GetGpuMemoryBufferManager());
-  viz::TestSharedImageInterface* sii =
-      drawing_buffer_->SharedImageInterfaceForTests();
-
-  viz::TransferableResource resource1;
-  viz::ReleaseCallback release_callback1;
-  viz::TransferableResource resource2;
-  viz::ReleaseCallback release_callback2;
-  viz::TransferableResource resource3;
-  viz::ReleaseCallback release_callback3;
-
-  // Request a resource. A SharedImage should already be created. Everything
-  // works as expected.
-  EXPECT_CALL(*gl_, CreateAndTexStorage2DSharedImageCHROMIUMMock(_)).Times(1);
-  EXPECT_FALSE(drawing_buffer_->MarkContentsChanged());
-  EXPECT_TRUE(drawing_buffer_->PrepareTransferableResource(nullptr, &resource1,
-                                                           &release_callback1));
-  EXPECT_TRUE(resource1.is_overlay_candidate);
-  gpu::Mailbox mailbox1;
-  mailbox1.SetName(gl_->last_imported_shared_image()->name);
-  EXPECT_TRUE(sii->CheckSharedImageExists(mailbox1));
-  testing::Mock::VerifyAndClearExpectations(gl_);
-  VerifyStateWasRestored();
-
-  // Force GpuMemoryBuffer creation failure. Request another resource. It should
-  // still be provided, but this time with allowOverlay = false.
-  EXPECT_CALL(*gl_, CreateAndTexStorage2DSharedImageCHROMIUMMock(_)).Times(1);
-  gmb_manager->SetFailOnCreate(true);
-  EXPECT_TRUE(drawing_buffer_->MarkContentsChanged());
-  EXPECT_TRUE(drawing_buffer_->PrepareTransferableResource(nullptr, &resource2,
-                                                           &release_callback2));
-  EXPECT_FALSE(resource2.is_overlay_candidate);
-  gpu::Mailbox mailbox2;
-  mailbox2.SetName(gl_->last_imported_shared_image()->name);
-  EXPECT_TRUE(sii->CheckSharedImageExists(mailbox2));
-  VerifyStateWasRestored();
-
-  // Check that if GpuMemoryBuffer allocation starts working again, resources
-  // are correctly created with allowOverlay = true.
-  EXPECT_CALL(*gl_, CreateAndTexStorage2DSharedImageCHROMIUMMock(_)).Times(1);
-  gmb_manager->SetFailOnCreate(false);
-  EXPECT_TRUE(drawing_buffer_->MarkContentsChanged());
-  EXPECT_TRUE(drawing_buffer_->PrepareTransferableResource(nullptr, &resource3,
-                                                           &release_callback3));
-  EXPECT_TRUE(resource3.is_overlay_candidate);
-  gpu::Mailbox mailbox3;
-  mailbox3.SetName(gl_->last_imported_shared_image()->name);
-  EXPECT_TRUE(sii->CheckSharedImageExists(mailbox3));
-  testing::Mock::VerifyAndClearExpectations(gl_);
-  VerifyStateWasRestored();
-
-  std::move(release_callback1).Run(gpu::SyncToken(), false /* lostResource */);
-  std::move(release_callback2).Run(gpu::SyncToken(), false /* lostResource */);
-  std::move(release_callback3).Run(gpu::SyncToken(), false /* lostResource */);
-
-  drawing_buffer_->BeginDestruction();
-  EXPECT_FALSE(sii->CheckSharedImageExists(mailbox1));
-  EXPECT_FALSE(sii->CheckSharedImageExists(mailbox2));
-  EXPECT_FALSE(sii->CheckSharedImageExists(mailbox3));
-}
-
 class DepthStencilTrackingGLES2Interface
     : public gpu::gles2::GLES2InterfaceStub {
  public:
diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc
index 8682fa7..520f9ba7 100644
--- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc
+++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc
@@ -48,11 +48,10 @@
 GeometryMapper::SourceToDestinationProjection(
     const TransformPaintPropertyNode& source,
     const TransformPaintPropertyNode& destination) {
-  bool has_animation = false;
-  bool has_fixed = false;
+  ExtraProjectionResult extra_result;
   bool success = false;
-  return SourceToDestinationProjectionInternal(
-      source, destination, has_animation, has_fixed, success);
+  return SourceToDestinationProjectionInternal(source, destination,
+                                               extra_result, success);
 }
 
 // Returns flatten(destination_to_screen)^-1 * flatten(source_to_screen)
@@ -98,18 +97,17 @@
 GeometryMapper::SourceToDestinationProjectionInternal(
     const TransformPaintPropertyNode& source,
     const TransformPaintPropertyNode& destination,
-    bool& has_animation,
-    bool& has_fixed,
+    ExtraProjectionResult& extra_result,
     bool& success) {
-  has_animation = false;
-  has_fixed = false;
   success = true;
 
   if (&source == &destination)
     return Translation2DOrMatrix();
 
   if (source.Parent() && &destination == &source.Parent()->Unalias()) {
-    has_fixed = source.RequiresCompositingForFixedPosition();
+    extra_result.has_fixed = source.RequiresCompositingForFixedPosition();
+    if (RuntimeEnabledFeatures::ScrollUpdateOptimizationsEnabled())
+      extra_result.has_sticky = source.RequiresCompositingForStickyPosition();
     if (source.IsIdentityOr2DTranslation()) {
       // We always use full matrix for animating transforms.
       DCHECK(!source.HasActiveTransformAnimation());
@@ -119,7 +117,7 @@
     // equals to matrix if the origin is zero or if the matrix is just
     // identity or 2d translation.
     if (source.Origin().IsOrigin()) {
-      has_animation = source.HasActiveTransformAnimation();
+      extra_result.has_animation = source.HasActiveTransformAnimation();
       return Translation2DOrMatrix(source.Matrix());
     }
   }
@@ -134,7 +132,9 @@
   const auto& source_cache = source.GetTransformCache();
   const auto& destination_cache = destination.GetTransformCache();
 
-  has_fixed |= source_cache.has_fixed();
+  extra_result.has_fixed |= source_cache.has_fixed();
+  if (RuntimeEnabledFeatures::ScrollUpdateOptimizationsEnabled())
+    extra_result.has_sticky |= source_cache.has_sticky();
 
   // Case 1a (fast path of case 1b): check if source and destination are under
   // the same 2d translation root.
@@ -149,8 +149,9 @@
   // Even if destination may have invertible screen projection,
   // this formula is likely to be numerically more stable.
   if (source_cache.plane_root() == destination_cache.plane_root()) {
-    has_animation = source_cache.has_animation_to_plane_root() ||
-                    destination_cache.has_animation_to_plane_root();
+    extra_result.has_animation =
+        source_cache.has_animation_to_plane_root() ||
+        destination_cache.has_animation_to_plane_root();
     if (&source == destination_cache.plane_root()) {
       return Translation2DOrMatrix(destination_cache.from_plane_root());
     }
@@ -169,8 +170,8 @@
   // Screen transform data are updated lazily because they are rarely used.
   source.UpdateScreenTransform();
   destination.UpdateScreenTransform();
-  has_animation = source_cache.has_animation_to_screen() ||
-                  destination_cache.has_animation_to_screen();
+  extra_result.has_animation = source_cache.has_animation_to_screen() ||
+                               destination_cache.has_animation_to_screen();
   if (!destination_cache.projection_from_screen_is_valid()) {
     success = false;
     return Translation2DOrMatrix();
@@ -222,11 +223,10 @@
         inclusive_behavior, expand, success);
   }
 
-  bool has_animation = false;
-  bool has_fixed = false;
+  ExtraProjectionResult extra_result;
   const auto& translation_2d_or_matrix = SourceToDestinationProjectionInternal(
-      local_state.Transform(), ancestor_state.Transform(), has_animation,
-      has_fixed, success);
+      local_state.Transform(), ancestor_state.Transform(), extra_result,
+      success);
   if (!success) {
     // A failure implies either source-to-plane or destination-to-plane being
     // singular. A notable example of singular source-to-plane from valid CSS:
@@ -244,14 +244,18 @@
     return false;
   }
 
-  if (has_animation && expand == kExpandVisualRectForCompositingOverlap) {
-    // Assume during the animation the transform can map |rect_to_map| to
-    // anywhere. Ancestor clips will still apply.
+  if ((extra_result.has_animation || extra_result.has_sticky) &&
+      expand == kExpandVisualRectForCompositingOverlap) {
+    // Assume during the animation or the sticky translation can map
+    // |rect_to_map| to anywhere during animation or composited scroll.
+    // Ancestor clips will still apply.
     // TODO(crbug.com/1026653): Use animation bounds instead of infinite rect.
+    // TODO(crbug.com/1117658): Use sticky bounds instead of infinite rect.
     rect_to_map = InfiniteLooseFloatClipRect();
   } else {
     translation_2d_or_matrix.MapFloatClipRect(rect_to_map);
-    if (has_fixed && expand == kExpandVisualRectForCompositingOverlap) {
+    if (extra_result.has_fixed &&
+        expand == kExpandVisualRectForCompositingOverlap) {
       ExpandFixedBoundsInScroller(&local_state.Transform(),
                                   &ancestor_state.Transform(), rect_to_map);
       // This early return skips the clipping below because the expansion for
@@ -410,9 +414,12 @@
     if (inclusive_behavior != kInclusiveIntersect)
       cached_clip = clip_node->GetClipCache().GetCachedClip(clip_and_transform);
 
-    if (cached_clip && cached_clip->has_transform_animation &&
+    if (cached_clip &&
+        (cached_clip->has_transform_animation ||
+         cached_clip->has_sticky_transform) &&
         expand == kExpandVisualRectForCompositingOverlap) {
-      // Don't use cached clip if it's transformed by any animating transform.
+      // Don't use cached clip if it's transformed by any animating transform
+      // or sticky translation.
       cached_clip = nullptr;
     }
 
@@ -437,19 +444,18 @@
   // computing and memoizing clip rects as we go.
   for (auto it = intermediate_nodes.rbegin(); it != intermediate_nodes.rend();
        ++it) {
-    bool has_animation = false;
-    bool has_fixed = false;
+    ExtraProjectionResult extra_result;
     const auto& translation_2d_or_matrix =
         SourceToDestinationProjectionInternal(
             (*it)->LocalTransformSpace().Unalias(), ancestor_transform,
-            has_animation, has_fixed, success);
+            extra_result, success);
     if (!success) {
       success = true;
       return FloatClipRect(gfx::RectF());
     }
 
-    // Don't apply this clip if it's transformed by any animating transform.
-    if (has_animation && expand == kExpandVisualRectForCompositingOverlap)
+    if ((extra_result.has_animation || extra_result.has_sticky) &&
+        expand == kExpandVisualRectForCompositingOverlap)
       continue;
 
     // This is where we generate the roundedness and tightness of clip rect
@@ -463,7 +469,8 @@
       // Inclusive intersected clips are not cached at present.
       (*it)->GetClipCache().SetCachedClip(
           GeometryMapperClipCache::ClipCacheEntry{clip_and_transform, clip,
-                                                  has_animation});
+                                                  extra_result.has_animation,
+                                                  extra_result.has_sticky});
     }
   }
   // Clips that are inclusive intersected or expanded for animation are not
diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.h b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.h
index 910be166..ef2a8ec 100644
--- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.h
+++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.h
@@ -275,11 +275,16 @@
   // successful on return. See comments of the public functions for failure
   // conditions.
 
+  struct ExtraProjectionResult {
+    bool has_animation = false;
+    bool has_fixed = false;
+    bool has_sticky = false;
+  };
+
   static Translation2DOrMatrix SourceToDestinationProjectionInternal(
       const TransformPaintPropertyNode& source,
       const TransformPaintPropertyNode& destination,
-      bool& has_animation,
-      bool& has_fixed,
+      ExtraProjectionResult&,
       bool& success);
 
   static FloatClipRect LocalToAncestorClipRectInternal(
diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_clip_cache.h b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_clip_cache.h
index 2d5f706b..bd8454e90 100644
--- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_clip_cache.h
+++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_clip_cache.h
@@ -54,7 +54,9 @@
     const FloatClipRect clip_rect;
     // Whether there is any transform animation between the transform space
     // of the associated clip node and |clip_and_transform|.
-    const bool has_transform_animation;
+    const bool has_transform_animation = false;
+    // Similarly, for sticky transform.
+    const bool has_sticky_transform = false;
   };
 
   // Returns the clip visual rect  of the owning
diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc
index b101f838..20b066b 100644
--- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc
+++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc
@@ -57,6 +57,7 @@
   absl::optional<TransformationMatrix> expected_transform;
   FloatClipRect expected_clip;
   bool expected_clip_has_transform_animation = false;
+  bool expected_clip_has_sticky_transform = false;
   gfx::RectF expected_transformed_rect;
 };
 
@@ -130,10 +131,12 @@
   EXPECT_CLIP_RECT_EQ(expected_clip, cached_clip->clip_rect);
   EXPECT_EQ(expected_clip_has_transform_animation,
             cached_clip->has_transform_animation);
+  EXPECT_EQ(expected_clip_has_sticky_transform,
+            cached_clip->has_sticky_transform);
 }
 
 // See the data fields of GeometryMapperTest for variables that will be used in
-// this macro.
+// this function.
 void GeometryMapperTest::CheckMappings() {
   CheckLocalToAncestorVisualRect();
   CheckLocalToAncestorClipRect();
@@ -558,6 +561,31 @@
   CheckMappings();
 }
 
+TEST_P(GeometryMapperTest, ExpandVisualRectWithClipBeforeSticky) {
+  ScopedScrollUpdateOptimizationsForTest scroll_optimizations(true);
+
+  expected_transform = TransformationMatrix().Translate(0, 100);
+  auto transform = CreateTransform(t0(), *expected_transform, gfx::Point3F(),
+                                   CompositingReason::kStickyPosition);
+  auto clip = CreateClip(c0(), *transform, FloatRoundedRect(10, 10, 50, 50));
+  local_state.SetClip(*clip);
+  local_state.SetTransform(*transform);
+
+  input_rect = gfx::RectF(0, 0, 100, 100);
+  expected_visual_rect = FloatClipRect(input_rect);
+  expected_visual_rect.Intersect(clip->LayoutClipRect());
+  expected_visual_rect.Map(*expected_transform);
+  // The clip has sticky transform, so it doesn't apply to the visual rect.
+  expected_visual_rect_expanded_for_compositing = InfiniteLooseFloatClipRect();
+  EXPECT_FALSE(expected_visual_rect.IsTight());
+  expected_clip = clip->LayoutClipRect();
+  expected_clip.Map(*expected_transform);
+  EXPECT_FALSE(expected_clip.IsTight());
+  expected_clip_has_sticky_transform = true;
+  expected_transformed_rect = expected_transform->MapRect(input_rect);
+  CheckMappings();
+}
+
 TEST_P(GeometryMapperTest, ClipAfterTransform) {
   expected_transform = TransformationMatrix().Rotate(45);
   auto transform = CreateTransform(t0(), *expected_transform);
@@ -598,6 +626,31 @@
   CheckMappings();
 }
 
+TEST_P(GeometryMapperTest, ExpandVisualRectWithClipAfterSticky) {
+  ScopedScrollUpdateOptimizationsForTest scroll_optimizations(true);
+
+  expected_transform = TransformationMatrix().Translate(0, 100);
+  auto transform = CreateTransform(t0(), *expected_transform, gfx::Point3F(),
+                                   CompositingReason::kStickyPosition);
+  auto clip = CreateClip(c0(), t0(), FloatRoundedRect(10, 10, 200, 200));
+  local_state.SetClip(*clip);
+  local_state.SetTransform(*transform);
+
+  input_rect = gfx::RectF(0, 0, 100, 100);
+  expected_transformed_rect = expected_transform->MapRect(input_rect);
+  expected_visual_rect = FloatClipRect(input_rect);
+  expected_visual_rect.Map(*expected_transform);
+  expected_visual_rect.Intersect(clip->LayoutClipRect());
+  EXPECT_FALSE(expected_visual_rect.IsTight());
+  expected_clip = clip->LayoutClipRect();
+  EXPECT_TRUE(expected_clip.IsTight());
+  // The visual rect is expanded first to infinity because of the sticky
+  // transform, then clipped by the clip.
+  expected_visual_rect_expanded_for_compositing = expected_clip;
+  expected_visual_rect_expanded_for_compositing->ClearIsTight();
+  CheckMappings();
+}
+
 TEST_P(GeometryMapperTest, TwoClipsWithTransformBetween) {
   auto clip1 = CreateClip(c0(), t0(), FloatRoundedRect(10, 10, 200, 200));
   expected_transform = TransformationMatrix().Rotate(45);
@@ -623,12 +676,13 @@
   // to ancestor space.
   expected_visual_rect.Intersect(expected_clip);
   EXPECT_FALSE(expected_visual_rect.IsTight());
-
   CheckMappings();
 }
 
 TEST_P(GeometryMapperTest,
        ExpandVisualRectWithTwoClipsWithAnimatingTransformBetween) {
+  ScopedScrollUpdateOptimizationsForTest scroll_optimizations(true);
+
   auto clip1 = CreateClip(c0(), t0(), FloatRoundedRect(10, 10, 200, 200));
   expected_transform = TransformationMatrix().Rotate(45);
   auto transform = CreateAnimatingTransform(t0(), *expected_transform);
@@ -657,6 +711,38 @@
   CheckMappings();
 }
 
+TEST_P(GeometryMapperTest, ExpandVisualRectWithTwoClipsWithStickyBetween) {
+  ScopedScrollUpdateOptimizationsForTest scroll_optimizations(true);
+
+  auto clip1 = CreateClip(c0(), t0(), FloatRoundedRect(10, 10, 200, 200));
+  expected_transform = TransformationMatrix().Translate(0, 100);
+  auto transform = CreateTransform(t0(), *expected_transform, gfx::Point3F(),
+                                   CompositingReason::kStickyPosition);
+  auto clip2 =
+      CreateClip(*clip1, *transform, FloatRoundedRect(10, 10, 200, 200));
+  local_state.SetClip(*clip2);
+  local_state.SetTransform(*transform);
+
+  input_rect = gfx::RectF(0, 0, 100, 100);
+  expected_transformed_rect = expected_transform->MapRect(input_rect);
+
+  expected_clip = clip2->LayoutClipRect();
+  expected_clip.Map(*expected_transform);
+  expected_clip.Intersect(clip1->LayoutClipRect());
+  EXPECT_FALSE(expected_clip.IsTight());
+  expected_clip_has_sticky_transform = true;
+  expected_visual_rect = FloatClipRect(input_rect);
+  expected_visual_rect.Map(*expected_transform);
+  expected_visual_rect.Intersect(expected_clip);
+  EXPECT_FALSE(expected_visual_rect.IsTight());
+  // The visual rect is expanded to infinity because of the sticky transform,
+  // then clipped by clip1. clip2 doesn't apply because it's below the sticky
+  // transform.
+  expected_visual_rect_expanded_for_compositing = clip1->LayoutClipRect();
+  expected_visual_rect_expanded_for_compositing->ClearIsTight();
+  CheckMappings();
+}
+
 TEST_P(GeometryMapperTest, ExpandVisualRectForFixed) {
   auto above_viewport = CreateTransform(t0(), TransformationMatrix());
   auto viewport = CreateTransform(*above_viewport, TransformationMatrix());
diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache.cc b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache.cc
index 6ce2d41..338f230 100644
--- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache.cc
+++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache.cc
@@ -41,6 +41,9 @@
       node.UnaliasedParent()->GetTransformCache();
 
   has_fixed_ = node.RequiresCompositingForFixedPosition() || parent.has_fixed_;
+  has_sticky_ =
+      node.RequiresCompositingForStickyPosition() || parent.has_sticky_;
+
   // screen_transform_ will be updated only when needed.
   screen_transform_ = nullptr;
 
diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache.h b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache.h
index dff0f58..3f429a5 100644
--- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache.h
+++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_transform_cache.h
@@ -116,6 +116,7 @@
   }
 
   bool has_fixed() const { return has_fixed_; }
+  bool has_sticky() const { return has_sticky_; }
 
  private:
   friend class GeometryMapperTransformCacheTest;
@@ -195,21 +196,23 @@
   struct PlaneRootTransform {
     TransformationMatrix to_plane_root;
     TransformationMatrix from_plane_root;
-    const TransformPaintPropertyNode* plane_root;
-    bool has_animation;
+    const TransformPaintPropertyNode* plane_root = nullptr;
+    bool has_animation = false;
   };
   std::unique_ptr<PlaneRootTransform> plane_root_transform_;
 
   struct ScreenTransform {
     TransformationMatrix to_screen;
     TransformationMatrix projection_from_screen;
-    bool projection_from_screen_is_valid;
-    bool has_animation;
+    bool projection_from_screen_is_valid = false;
+    bool has_animation = false;
   };
   std::unique_ptr<ScreenTransform> screen_transform_;
 
   // Whether or not there is a fixed position transform to the root.
   bool has_fixed_ = false;
+  // Whether or not there is a sticky translation to the root.
+  bool has_sticky_ = false;
 
   unsigned cache_generation_ = s_global_generation - 1;
 };
diff --git a/third_party/blink/renderer/platform/graphics/paint/paint_property_node_test.cc b/third_party/blink/renderer/platform/graphics/paint/paint_property_node_test.cc
index bc3043c1..53119c7 100644
--- a/third_party/blink/renderer/platform/graphics/paint/paint_property_node_test.cc
+++ b/third_party/blink/renderer/platform/graphics/paint/paint_property_node_test.cc
@@ -7,6 +7,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/renderer/platform/graphics/paint/property_tree_state.h"
 #include "third_party/blink/renderer/platform/testing/paint_property_test_helpers.h"
+#include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h"
 
 namespace blink {
 
@@ -493,6 +494,27 @@
   ExpectUnchangedState();
 }
 
+TEST_F(PaintPropertyNodeTest, StickyTranslationChange) {
+  ScopedScrollUpdateOptimizationsForTest scroll_optimizations(true);
+
+  ResetAllChanged();
+  ExpectUnchangedState();
+  TransformPaintPropertyNode::State state{gfx::Vector2dF()};
+  state.direct_compositing_reasons = CompositingReason::kStickyPosition;
+  // Change compositing reasons only.
+  EXPECT_EQ(PaintPropertyChangeType::kChangedOnlyNonRerasterValues,
+            transform.child1->Update(*transform.ancestor, std::move(state)));
+
+  // Change sticky translation.
+  TransformPaintPropertyNode::State state1{gfx::Vector2dF(10, 20)};
+  state1.direct_compositing_reasons = CompositingReason::kStickyPosition;
+  EXPECT_EQ(PaintPropertyChangeType::kChangedOnlyCompositedValues,
+            transform.child1->Update(*transform.ancestor, std::move(state1)));
+
+  ResetAllChanged();
+  ExpectUnchangedState();
+}
+
 TEST_F(PaintPropertyNodeTest, TransformChangeOneChild) {
   ResetAllChanged();
   ExpectUnchangedState();
diff --git a/third_party/blink/renderer/platform/graphics/paint/transform_paint_property_node.cc b/third_party/blink/renderer/platform/graphics/paint/transform_paint_property_node.cc
index 9fd6b2e..6d8f4692 100644
--- a/third_party/blink/renderer/platform/graphics/paint/transform_paint_property_node.cc
+++ b/third_party/blink/renderer/platform/graphics/paint/transform_paint_property_node.cc
@@ -4,6 +4,8 @@
 
 #include "third_party/blink/renderer/platform/graphics/paint/transform_paint_property_node.h"
 
+#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
+
 namespace blink {
 
 PaintPropertyChangeType TransformPaintPropertyNode::State::ComputeChange(
@@ -68,6 +70,14 @@
                : PaintPropertyChangeType::kChangedOnlyCompositedValues;
   }
 
+  if (RuntimeEnabledFeatures::ScrollUpdateOptimizationsEnabled() &&
+      direct_compositing_reasons & CompositingReason::kStickyPosition) {
+    // The compositor handles sticky offset changes automatically.
+    DCHECK(transform_and_origin.ChangePreserves2dAxisAlignment(
+        other.transform_and_origin));
+    return PaintPropertyChangeType::kChangedOnlyCompositedValues;
+  }
+
   if (matrix_changed && !transform_and_origin.ChangePreserves2dAxisAlignment(
                             other.transform_and_origin)) {
     // An additional cc::EffectNode may be required if
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/request_conversion.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/request_conversion.cc
index 2ccb6bd..f58bf633 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/request_conversion.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/request_conversion.cc
@@ -12,7 +12,6 @@
 #include "net/filter/source_stream.h"
 #include "net/http/http_request_headers.h"
 #include "net/http/http_util.h"
-#include "services/network/public/cpp/constants.h"
 #include "services/network/public/cpp/optional_trust_token_params.h"
 #include "services/network/public/cpp/resource_request.h"
 #include "services/network/public/cpp/resource_request_body.h"
@@ -39,9 +38,6 @@
 namespace blink {
 namespace {
 
-constexpr char kStylesheetAcceptHeader[] = "text/css,*/*;q=0.1";
-constexpr char kWebBundleAcceptHeader[] = "application/webbundle;v=b2";
-
 // TODO(yhirano): Unify these with variables in
 // content/public/common/content_constants.h.
 constexpr char kCorsExemptPurposeHeaderName[] = "Purpose";
@@ -382,24 +378,7 @@
 
   network::mojom::RequestDestination request_destination =
       src.GetRequestDestination();
-  if (request_destination == network::mojom::RequestDestination::kStyle ||
-      request_destination == network::mojom::RequestDestination::kXslt) {
-    dest->headers.SetHeader(net::HttpRequestHeaders::kAccept,
-                            kStylesheetAcceptHeader);
-  } else if (request_destination ==
-             network::mojom::RequestDestination::kImage) {
-    dest->headers.SetHeaderIfMissing(net::HttpRequestHeaders::kAccept,
-                                     network_utils::ImageAcceptHeader());
-  } else if (request_destination ==
-             network::mojom::RequestDestination::kWebBundle) {
-    dest->headers.SetHeader(net::HttpRequestHeaders::kAccept,
-                            kWebBundleAcceptHeader);
-  } else {
-    // Calling SetHeaderIfMissing() instead of SetHeader() because JS can
-    // manually set an accept header on an XHR.
-    dest->headers.SetHeaderIfMissing(net::HttpRequestHeaders::kAccept,
-                                     network::kDefaultAcceptHeaderValue);
-  }
+  network_utils::SetAcceptHeader(dest->headers, request_destination);
 
   dest->original_destination = src.GetOriginalDestination();
 }
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index f160a1e..647317b1 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -2053,6 +2053,9 @@
       status: "stable",
     },
     {
+      name: "ScrollUpdateOptimizations",
+    },
+    {
       name: "SecureContextFixForSharedWorkers",
       status: "experimental",
     },
diff --git a/third_party/blink/tools/blink_tool.py b/third_party/blink/tools/blink_tool.py
index 09517e0..9a2d5b2 100755
--- a/third_party/blink/tools/blink_tool.py
+++ b/third_party/blink/tools/blink_tool.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env vpython
+#!/usr/bin/env vpython3
 # Copyright (c) 2011 Code Aurora Forum. All rights reserved.
 # Copyright (c) 2010 Google Inc. All rights reserved.
 # Copyright (c) 2009 Apple Inc. All rights reserved.
diff --git a/third_party/blink/tools/blinkpy/tool/commands/analyze_baselines.py b/third_party/blink/tools/blinkpy/tool/commands/analyze_baselines.py
index 1bd906965..d0532821 100644
--- a/third_party/blink/tools/blinkpy/tool/commands/analyze_baselines.py
+++ b/third_party/blink/tools/blinkpy/tool/commands/analyze_baselines.py
@@ -67,7 +67,7 @@
             name = self._port.output_filename(
                 test_name, self._port.BASELINE_SUFFIX, extension)
             results_by_directory = self._baseline_optimizer.read_results_by_directory(
-                name)
+                test_name, name)
             if results_by_directory:
                 self._write('%s:' % name)
                 self._baseline_optimizer.write_by_directory(
diff --git a/third_party/blink/tools/blinkpy/tool/commands/analyze_baselines_unittest.py b/third_party/blink/tools/blinkpy/tool/commands/analyze_baselines_unittest.py
index aa7b9fd..0b58693 100644
--- a/third_party/blink/tools/blinkpy/tool/commands/analyze_baselines_unittest.py
+++ b/third_party/blink/tools/blinkpy/tool/commands/analyze_baselines_unittest.py
@@ -10,7 +10,7 @@
 
 
 class _FakeOptimizer(BaselineOptimizer):
-    def read_results_by_directory(self, baseline_name):
+    def read_results_by_directory(self, test_name, baseline_name):
         if baseline_name.endswith('txt'):
             return {'web_tests/passes/text.html': '123456'}
         return {}
diff --git a/third_party/blink/tools/run_blink_wptserve.py b/third_party/blink/tools/run_blink_wptserve.py
index 47eaf160..2736a11 100755
--- a/third_party/blink/tools/run_blink_wptserve.py
+++ b/third_party/blink/tools/run_blink_wptserve.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env vpython
+#!/usr/bin/env vpython3
 # Copyright 2015 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.
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 0d3aaaae..eccdd44 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -282,7 +282,6 @@
 crbug.com/1343590 virtual/prefetch/http/tests/inspector-protocol/prefetch/* [ Pass ]
 
 # These tests are flaky with BFCache, which is enabled by default.
-crbug.com/1171298 virtual/plz-dedicated-worker/http/tests/inspector-protocol/network/interception-download.js [ Failure Pass ]
 crbug.com/1311546 http/tests/test-runner/back-forward.html [ Failure Pass ]
 
 # These tests require LazyEmbed, which is currently disabled by default.
@@ -3407,6 +3406,7 @@
 crbug.com/626703 [ Win ] virtual/partitioned-cookies/http/tests/inspector-protocol/network/disabled-cache-navigation.js [ Failure ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 [ Mac11 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/registered-property-interpolation-001.https.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-images/gradient/gradient-eval-004.html [ Failure ]
 crbug.com/626703 [ Win11 ] virtual/conversions-debug-mode/wpt_internal/attribution-reporting/trigger-data-sanitization.sub.https.html?source-type=navigation [ Failure Timeout ]
 crbug.com/626703 external/wpt/css/cssom/caretPositionFromPoint-with-transformation.html [ Timeout ]
@@ -7146,5 +7146,5 @@
 
 # Sheriff 2022-07-21
 crbug.com/1346043 crbug.com/626703 [ Win10.20h2 ] external/wpt/credential-management/fedcm-network-requests.sub.https.html [ Skip ]
-crbug.com/1346158 crbug.com/1346158 external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-window.html [ Pass Failure ]
-crbug.com/1310202 [ Mac11 ] wpt_internal/navigation-api/ordering-and-transition/navigate-cross-document-double.html [ Pass Failure ]
+crbug.com/1346158 crbug.com/1346158 external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-window.html [ Failure Pass ]
+crbug.com/1310202 [ Mac11 ] wpt_internal/navigation-api/ordering-and-transition/navigate-cross-document-double.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/external/Version b/third_party/blink/web_tests/external/Version
index 5fe059f6..08a9f30 100644
--- a/third_party/blink/web_tests/external/Version
+++ b/third_party/blink/web_tests/external/Version
@@ -1 +1 @@
-Version: b4c2c748711136ffd222d90a903b0599c8df4fe5
+Version: 7e3f3e1ad7be8b75e4c7a64fdc196b873c92f887
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
index af6f892..56a7654 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -816,7 +816,28 @@
          {}
         ]
        ]
-      }
+      },
+      "table-row-end-border-1-crash.html": [
+       "3947dbdadaa1b8a5c836cc82ac0fb3508eeb45e1",
+       [
+        null,
+        {}
+       ]
+      ],
+      "table-row-end-border-2-crash.html": [
+       "e5c37cbdcf6d00c5ece82bde1e66f3a1134d987a",
+       [
+        null,
+        {}
+       ]
+      ],
+      "table-row-end-padding-crash.html": [
+       "2fd7feb15dee1af0ca5ae077ad408b30eb138bb0",
+       [
+        null,
+        {}
+       ]
+      ]
      },
      "uncontained-oof-in-inline-after-break-000-crash.html": [
       "4d301e497749ddf0d2bfca3a5976a9877b45cff8",
@@ -316037,18 +316058,6 @@
         "c4449ca7c8a598e3712c8b24eb9e424775c19102",
         []
        ],
-       "evaluation-order-1-nothrow-worker-setup.js": [
-        "88fc22ba7f7e12881974010f3da28979bea31c65",
-        []
-       ],
-       "evaluation-order-1-worker-setup.js": [
-        "5ac90a2388a409726211987ec38100b25b529dfc",
-        []
-       ],
-       "evaluation-order-1-worker.js": [
-        "b583bf1ca627596b7e0cc1d20792625e18dda986",
-        []
-       ],
        "execution-timing": {
         "102.html": [
          "439023833f4b020004a7258de35739630c9a2b3d",
@@ -316327,6 +316336,58 @@
           "1a2b9404a7e3e245885445239bf78c3cda656bbc",
           []
          ],
+         "evaluation-order-1-nothrow-setup.js": [
+          "1b42e995937699bec3d693ac2efd06ae002e2314",
+          []
+         ],
+         "evaluation-order-1-nothrow.js": [
+          "e19d9b1b137bd5b128f4a5645b49d11a55338358",
+          []
+         ],
+         "evaluation-order-1-throw-setup.js": [
+          "651a494e5306edd1402be9382bef0642b62670a1",
+          []
+         ],
+         "evaluation-order-1-throw.js": [
+          "2451df1c15514f7e2c9115d2e9a5894b8d30ad70",
+          []
+         ],
+         "evaluation-order-2-setup.js": [
+          "46f7354538a5e711a267917a7090bf385c34ed75",
+          []
+         ],
+         "evaluation-order-2.1.mjs": [
+          "d6c2afa2f72283a68862723c7d1e8acabe9c2e93",
+          []
+         ],
+         "evaluation-order-2.2.mjs": [
+          "5c67c4f9a2558d0aaebd0d5016fcadb88af01a4e",
+          []
+         ],
+         "evaluation-order-3-setup.js": [
+          "edc046910e44198160bb0ae1f4d320ec8cf05ff4",
+          []
+         ],
+         "evaluation-order-3.1.mjs": [
+          "ef320632af75245a07c021dc228b56dd5128245c",
+          []
+         ],
+         "evaluation-order-3.2.mjs": [
+          "8ccb58120664d2bb8e5cd76d22c10e8b431166ad",
+          []
+         ],
+         "evaluation-order-4.1.mjs": [
+          "f3347c1d28eac466c6d6ec67c60b9f1261b08b38",
+          []
+         ],
+         "evaluation-order-4.2.mjs": [
+          "96a5cca3a63b46d8cff21ad4f64cb8c9cccf699d",
+          []
+         ],
+         "evaluation-order-setup.js": [
+          "d2e28935c437150b88f50b1c3b4a3834f66899b9",
+          []
+         ],
          "resolve-then-throw.js": [
           "a841eb780a050a82acb3cd496f4f7ad04a8f3a5b",
           []
@@ -316570,74 +316631,6 @@
          "373a5324455e1208bd97afd315775b5a488f0a8c",
          []
         ],
-        "evaluation-order-1-nothrow-worker-setup.mjs": [
-         "24cccd486be5d6ff0ff7580069104436c7a9b8c7",
-         []
-        ],
-        "evaluation-order-1-nothrow-worker.mjs": [
-         "4d3cf31a79c9f1f0c94250fc43168640b7498ab5",
-         []
-        ],
-        "evaluation-order-1-nothrow.mjs": [
-         "c1d35beb3e601c7196d8b46ed964f6fffd1aa2c1",
-         []
-        ],
-        "evaluation-order-1-worker-setup.mjs": [
-         "3971461d2ee4ba7d2f3c7561a925aa495b2eb49a",
-         []
-        ],
-        "evaluation-order-1-worker.mjs": [
-         "9be87c72227c3d3bab625f2b3a7883c62176969d",
-         []
-        ],
-        "evaluation-order-1.mjs": [
-         "7a43726635158e650d6b3977ff96ca27fcf8e184",
-         []
-        ],
-        "evaluation-order-2-import-worker-setup.mjs": [
-         "0cfdca65f08e96271d55618e07d52b2d2a8b4c27",
-         []
-        ],
-        "evaluation-order-2-import-worker.mjs": [
-         "3d9c9bb74973244909857aa73804bf1e18faf112",
-         []
-        ],
-        "evaluation-order-2.1.mjs": [
-         "d6c2afa2f72283a68862723c7d1e8acabe9c2e93",
-         []
-        ],
-        "evaluation-order-2.2.mjs": [
-         "5c67c4f9a2558d0aaebd0d5016fcadb88af01a4e",
-         []
-        ],
-        "evaluation-order-3-dynamic-worker-setup.mjs": [
-         "f202cff96a7926490a95717e76bb7461484a89e9",
-         []
-        ],
-        "evaluation-order-3-dynamic-worker.mjs": [
-         "79dabab10b39aa0fa970c64861760b9f9d2790f5",
-         []
-        ],
-        "evaluation-order-3.1.mjs": [
-         "ef320632af75245a07c021dc228b56dd5128245c",
-         []
-        ],
-        "evaluation-order-3.2.mjs": [
-         "8ccb58120664d2bb8e5cd76d22c10e8b431166ad",
-         []
-        ],
-        "evaluation-order-4.1.mjs": [
-         "f3347c1d28eac466c6d6ec67c60b9f1261b08b38",
-         []
-        ],
-        "evaluation-order-4.2.mjs": [
-         "96a5cca3a63b46d8cff21ad4f64cb8c9cccf699d",
-         []
-        ],
-        "evaluation-order-setup.mjs": [
-         "d3f22e9ee0f0bb00f1404c44469f8fd2c57b1bf3",
-         []
-        ],
         "execorder-dynamicordered2.js": [
          "d7115a2ac62c7582e4f79e70bdd2e457a0c031ef",
          []
@@ -403272,10 +403265,12 @@
       ]
      ],
      "modal-pseudo-class.html": [
-      "94b7b20e6276ca6912caa5b65e60053b935f5b8e",
+      "59dd2574b5912f8e72fd74e0f6e368f99b29562a",
       [
        null,
-       {}
+       {
+        "testdriver": true
+       }
       ]
      ],
      "nesting-parsing.html": [
@@ -476264,7 +476259,7 @@
         ]
        ],
        "files.html": [
-        "a4157a3d6baaa021bc7a403baa5842e5711db43a",
+        "43ebd71906a2f6685ad943cb8e4b1185c8360bc6",
         [
          null,
          {}
@@ -478217,7 +478212,7 @@
        ]
       ],
       "popup-hoverpopup-attribute.tentative.html": [
-       "51e026d85fd0bc009b3d533d6e2f3a3a193de3ce",
+       "3f1ce38c881574d45a2de8fa3b6cc1b32ebb8ff3",
        [
         null,
         {
@@ -478572,48 +478567,6 @@
          {}
         ]
        ],
-       "evaluation-order-1-nothrow-sharedworker.html": [
-        "9bfe5a1f312b69f5d11514a70ce43e42108677d8",
-        [
-         null,
-         {}
-        ]
-       ],
-       "evaluation-order-1-nothrow-worker.html": [
-        "4ddfb61d5078e9225d8aab3818a0842e9552d097",
-        [
-         null,
-         {}
-        ]
-       ],
-       "evaluation-order-1-nothrow.html": [
-        "b08372efd717aa55b6e5c3f9e79a56a1d39b2362",
-        [
-         null,
-         {}
-        ]
-       ],
-       "evaluation-order-1-sharedworker.html": [
-        "0ad18a8fba80ed1e15130b8ee5a52841ec672014",
-        [
-         null,
-         {}
-        ]
-       ],
-       "evaluation-order-1-worker.html": [
-        "7760e087c2dd229a9a74f69768d455930d540ae4",
-        [
-         null,
-         {}
-        ]
-       ],
-       "evaluation-order-1.html": [
-        "7bf7132081e32b955b38d4a115ebcd103cca6cea",
-        [
-         null,
-         {}
-        ]
-       ],
        "execution-timing": {
         "001.html": [
          "3f54f764f98dc5cff8274b91f56043b4d9170fdf",
@@ -480188,6 +480141,232 @@
            ]
           }
          ]
+        ],
+        "evaluation-order-1-nothrow-importScripts.any.js": [
+         "bacfc9fd04bdf3b9a66acd108982423f2246eb1f",
+         [
+          "html/semantics/scripting-1/the-script-element/microtasks/evaluation-order-1-nothrow-importScripts.any.sharedworker.html",
+          {
+           "script_metadata": [
+            [
+             "global",
+             "dedicatedworker,sharedworker"
+            ],
+            [
+             "script",
+             "./resources/evaluation-order-setup.js"
+            ]
+           ]
+          }
+         ],
+         [
+          "html/semantics/scripting-1/the-script-element/microtasks/evaluation-order-1-nothrow-importScripts.any.worker.html",
+          {
+           "script_metadata": [
+            [
+             "global",
+             "dedicatedworker,sharedworker"
+            ],
+            [
+             "script",
+             "./resources/evaluation-order-setup.js"
+            ]
+           ]
+          }
+         ]
+        ],
+        "evaluation-order-1-nothrow-static-import.any.js": [
+         "006eab7a7e06dfb17f963d864e3434a6bdbc7a26",
+         [
+          "html/semantics/scripting-1/the-script-element/microtasks/evaluation-order-1-nothrow-static-import.any.sharedworker-module.html",
+          {
+           "script_metadata": [
+            [
+             "global",
+             "dedicatedworker-module,sharedworker-module"
+            ],
+            [
+             "script",
+             "./resources/evaluation-order-setup.js"
+            ]
+           ]
+          }
+         ],
+         [
+          "html/semantics/scripting-1/the-script-element/microtasks/evaluation-order-1-nothrow-static-import.any.worker-module.html",
+          {
+           "script_metadata": [
+            [
+             "global",
+             "dedicatedworker-module,sharedworker-module"
+            ],
+            [
+             "script",
+             "./resources/evaluation-order-setup.js"
+            ]
+           ]
+          }
+         ]
+        ],
+        "evaluation-order-1-throw-importScripts.any.js": [
+         "0b42ea1e50178490a762649ce6219fcae4ef2453",
+         [
+          "html/semantics/scripting-1/the-script-element/microtasks/evaluation-order-1-throw-importScripts.any.sharedworker.html",
+          {
+           "script_metadata": [
+            [
+             "global",
+             "dedicatedworker,sharedworker"
+            ],
+            [
+             "script",
+             "./resources/evaluation-order-setup.js"
+            ]
+           ]
+          }
+         ],
+         [
+          "html/semantics/scripting-1/the-script-element/microtasks/evaluation-order-1-throw-importScripts.any.worker.html",
+          {
+           "script_metadata": [
+            [
+             "global",
+             "dedicatedworker,sharedworker"
+            ],
+            [
+             "script",
+             "./resources/evaluation-order-setup.js"
+            ]
+           ]
+          }
+         ]
+        ],
+        "evaluation-order-1-throw-static-import.any.js": [
+         "f6cc427c719be7514f4b1123af316dae1c3c9b17",
+         [
+          "html/semantics/scripting-1/the-script-element/microtasks/evaluation-order-1-throw-static-import.any.sharedworker-module.html",
+          {
+           "script_metadata": [
+            [
+             "global",
+             "dedicatedworker-module,sharedworker-module"
+            ],
+            [
+             "script",
+             "./resources/evaluation-order-setup.js"
+            ]
+           ]
+          }
+         ],
+         [
+          "html/semantics/scripting-1/the-script-element/microtasks/evaluation-order-1-throw-static-import.any.worker-module.html",
+          {
+           "script_metadata": [
+            [
+             "global",
+             "dedicatedworker-module,sharedworker-module"
+            ],
+            [
+             "script",
+             "./resources/evaluation-order-setup.js"
+            ]
+           ]
+          }
+         ]
+        ],
+        "evaluation-order-1.html": [
+         "4800ef81bc0287b67918ee01164d43c7e39525b1",
+         [
+          null,
+          {}
+         ]
+        ],
+        "evaluation-order-2.any.js": [
+         "bbc6474823553525310c663b08470f149a03a7fd",
+         [
+          "html/semantics/scripting-1/the-script-element/microtasks/evaluation-order-2.any.sharedworker-module.html",
+          {
+           "script_metadata": [
+            [
+             "global",
+             "dedicatedworker-module,sharedworker-module"
+            ],
+            [
+             "script",
+             "./resources/evaluation-order-setup.js"
+            ]
+           ]
+          }
+         ],
+         [
+          "html/semantics/scripting-1/the-script-element/microtasks/evaluation-order-2.any.worker-module.html",
+          {
+           "script_metadata": [
+            [
+             "global",
+             "dedicatedworker-module,sharedworker-module"
+            ],
+            [
+             "script",
+             "./resources/evaluation-order-setup.js"
+            ]
+           ]
+          }
+         ]
+        ],
+        "evaluation-order-2.html": [
+         "e55c2ecbed463604a2a4b35f231f3618b6d34311",
+         [
+          null,
+          {}
+         ]
+        ],
+        "evaluation-order-3.any.js": [
+         "19e94714e5ded1405107be9211926ad71659d506",
+         [
+          "html/semantics/scripting-1/the-script-element/microtasks/evaluation-order-3.any.sharedworker-module.html",
+          {
+           "script_metadata": [
+            [
+             "global",
+             "dedicatedworker-module,sharedworker-module"
+            ],
+            [
+             "script",
+             "./resources/evaluation-order-setup.js"
+            ]
+           ]
+          }
+         ],
+         [
+          "html/semantics/scripting-1/the-script-element/microtasks/evaluation-order-3.any.worker-module.html",
+          {
+           "script_metadata": [
+            [
+             "global",
+             "dedicatedworker-module,sharedworker-module"
+            ],
+            [
+             "script",
+             "./resources/evaluation-order-setup.js"
+            ]
+           ]
+          }
+         ]
+        ],
+        "evaluation-order-3.html": [
+         "ef351acd288a0a97e16ffe7db680fd683d7d29b6",
+         [
+          null,
+          {}
+         ]
+        ],
+        "evaluation-order-4.html": [
+         "f27678439df9853093077b5326c4b9eaab217c85",
+         [
+          null,
+          {}
+         ]
         ]
        },
        "module": {
@@ -480610,97 +480789,6 @@
           {}
          ]
         ],
-        "evaluation-order-1-nothrow-sharedworker.html": [
-         "77ece9e49226b9d5daf6d0b2a189be1fbdab4013",
-         [
-          null,
-          {}
-         ]
-        ],
-        "evaluation-order-1-nothrow-worker.html": [
-         "1b7ea09ebdd8cb6c35aefefe6b22b6495db735c9",
-         [
-          null,
-          {}
-         ]
-        ],
-        "evaluation-order-1-nothrow.html": [
-         "080f5ac3bdaa971232a7d668e57079179d64cdc4",
-         [
-          null,
-          {}
-         ]
-        ],
-        "evaluation-order-1-sharedworker.html": [
-         "cc7f0302bfce5dbf59b9a546fb369148ea75ff4e",
-         [
-          null,
-          {}
-         ]
-        ],
-        "evaluation-order-1-worker.html": [
-         "0325bb2a30da1e22f0a6e12e0dda17bf12c89f6c",
-         [
-          null,
-          {}
-         ]
-        ],
-        "evaluation-order-1.html": [
-         "728aded3301298ee02e4e5d55496ca68e009e45f",
-         [
-          null,
-          {}
-         ]
-        ],
-        "evaluation-order-2-import-sharedworker.html": [
-         "064563900216d543b3134401577dda4821027ebc",
-         [
-          null,
-          {}
-         ]
-        ],
-        "evaluation-order-2-import-worker.html": [
-         "83070191af9ad4b693e6ca3a1f2eaea53d8bad67",
-         [
-          null,
-          {}
-         ]
-        ],
-        "evaluation-order-2-import.html": [
-         "1db333cb1cdccc827cbd6439ddb3a5f3ac6784a8",
-         [
-          null,
-          {}
-         ]
-        ],
-        "evaluation-order-3-dynamic-sharedworker.html": [
-         "cd1f5edfa22d425fb8873adeb9493f399b2eda0f",
-         [
-          null,
-          {}
-         ]
-        ],
-        "evaluation-order-3-dynamic-worker.html": [
-         "49731bd4822d2abef8fd263bca98f2a2f398933c",
-         [
-          null,
-          {}
-         ]
-        ],
-        "evaluation-order-3-dynamic.html": [
-         "6306c0b5cf204d91b8ef126da6180e7c32784b8f",
-         [
-          null,
-          {}
-         ]
-        ],
-        "evaluation-order-4-tla.html": [
-         "da07faf42d611586a295bfa3e694f7bc29d070c0",
-         [
-          null,
-          {}
-         ]
-        ],
         "execorder.html": [
          "6a7513dc1361de0716584df8a5e7c8b3df2b69f3",
          [
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/files.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/files.html
index a4157a3..43ebd71 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/files.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/files.html
@@ -68,4 +68,16 @@
   assert_throws_js(TypeError, () => i1.files = [], "files cannot be set to an array");
   assert_throws_js(TypeError, () => i1.files = [new File([], "x")], "files cannot be set to an array (even when it contains File objects)");
 }, "setting <input type=file>.files");
+
+test(() => {
+  const i = document.createElement("input");
+  i.type = "file";
+
+  let dt = new DataTransfer();
+
+  const files = dt.files;
+  i.files = files;
+  assert_equals(i.files, files, "FileList should not be copied");
+  assert_equals(dt.files, files, "FileList can be shared across input / DataTransfer");
+}, "setting <input type=file>.files from DataTransfer");
 </script>
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/interception-download.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/interception-download.js
index 46415b0..46e164c0 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/network/interception-download.js
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/interception-download.js
@@ -11,20 +11,24 @@
     {urlPattern: '*', interceptionStage: 'HeadersReceived'}
   ]});
 
-  await dp.Network.onRequestIntercepted(event => {
-    const params = event.params;
-    testRunner.log(`Intercepted ${params.request.url}, download: ${params.isDownload}`);
-    dp.Network.continueInterceptedRequest({interceptionId: params.interceptionId});
-  });
 
   testRunner.log('Regular navigation: ');
-  await dp.Page.navigate({url: 'http://127.0.0.1:8000/devtools/network/resources/resource.php'});
+  dp.Page.navigate({url: 'http://127.0.0.1:8000/devtools/network/resources/resource.php'});
+  let {params} = await dp.Network.onceRequestIntercepted();
+  testRunner.log(`Intercepted ${params.request.url}, download: ${params.isDownload}`);
+  dp.Network.continueInterceptedRequest({interceptionId: params.interceptionId});
 
   testRunner.log('Download via content-disposition: ');
-  await dp.Page.navigate({url: 'http://127.0.0.1:8000/devtools/network/resources/resource.php?download=1'});
+  dp.Page.navigate({url: 'http://127.0.0.1:8000/devtools/network/resources/resource.php?download=1'});
+  ({params} = await dp.Network.onceRequestIntercepted());
+  testRunner.log(`Intercepted ${params.request.url}, download: ${params.isDownload}`);
+  dp.Network.continueInterceptedRequest({interceptionId: params.interceptionId});
 
   testRunner.log('Download via unhandled MIME type: ');
-  await dp.Page.navigate({url: 'http://127.0.0.1:8000/devtools/network/resources/resource.php?mime_type=application/octet-stream'});
+  dp.Page.navigate({url: 'http://127.0.0.1:8000/devtools/network/resources/resource.php?mime_type=application/octet-stream'});
+  ({params} = await dp.Network.onceRequestIntercepted());
+  testRunner.log(`Intercepted ${params.request.url}, download: ${params.isDownload}`);
+  dp.Network.continueInterceptedRequest({interceptionId: params.interceptionId});
 
   testRunner.log('Now downloading by clicking a link: ');
   session.evaluate(`
@@ -34,7 +38,9 @@
     document.body.appendChild(a);
     a.click();
   `);
-  await dp.Network.onceRequestIntercepted();
+  ({params} = await dp.Network.onceRequestIntercepted());
+  testRunner.log(`Intercepted ${params.request.url}, download: ${params.isDownload}`);
+  dp.Network.continueInterceptedRequest({interceptionId: params.interceptionId});
 
   testRunner.completeTest();
 })
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/forms/the-input-element/files-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/forms/the-input-element/files-expected.txt
new file mode 100644
index 0000000..ae5e069
--- /dev/null
+++ b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/forms/the-input-element/files-expected.txt
@@ -0,0 +1,27 @@
+This is a testharness.js-based test.
+PASS files for input type=hidden
+PASS files for input type=text
+PASS files for input type=search
+PASS files for input type=tel
+PASS files for input type=url
+PASS files for input type=email
+PASS files for input type=password
+PASS files for input type=date
+PASS files for input type=month
+PASS files for input type=week
+PASS files for input type=time
+PASS files for input type=datetime-local
+PASS files for input type=number
+PASS files for input type=range
+PASS files for input type=color
+PASS files for input type=checkbox
+PASS files for input type=radio
+PASS files for input type=submit
+PASS files for input type=image
+PASS files for input type=reset
+PASS files for input type=button
+PASS files for input type=file
+PASS setting <input type=file>.files
+FAIL setting <input type=file>.files from DataTransfer assert_equals: FileList can be shared across input / DataTransfer expected object "[object FileList]" but got object "[object FileList]"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/interception-download-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/interception-download-expected.txt
index 4b91ea1..c0f469d 100644
--- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/interception-download-expected.txt
+++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/interception-download-expected.txt
@@ -2,6 +2,7 @@
 Regular navigation: 
 Intercepted http://127.0.0.1:8000/devtools/network/resources/resource.php, download: false
 Download via content-disposition: 
+Intercepted http://127.0.0.1:8000/devtools/network/resources/resource.php?download=1, download: true
 Download via unhandled MIME type: 
 Intercepted http://127.0.0.1:8000/devtools/network/resources/resource.php?mime_type=application/octet-stream, download: true
 Now downloading by clicking a link: 
diff --git a/third_party/libwebp/README.chromium b/third_party/libwebp/README.chromium
index e1737946..c5445919 100644
--- a/third_party/libwebp/README.chromium
+++ b/third_party/libwebp/README.chromium
@@ -2,7 +2,7 @@
 Short Name: libwebp
 URL: https://chromium.googlesource.com/webm/libwebp
 Version: v1.2.3
-Revision: a8e366166ab57bb1b4aaf6739fc775515bc71b51
+Revision: 7366f7f394af26de814296152c50e673ed0a832f
 CPEPrefix: cpe:/a:webmproject:libwebp:1.2.3
 License: BSD
 License File: LICENSE
diff --git a/third_party/sqlite/README.chromium b/third_party/sqlite/README.chromium
index e9fd7ca..c98407e 100644
--- a/third_party/sqlite/README.chromium
+++ b/third_party/sqlite/README.chromium
@@ -1,7 +1,7 @@
 Name: sqlite
 URL: https://sqlite.org/
-Version: 3.39.1
-CPEPrefix: cpe:/a:sqlite:sqlite:3.39.1
+Version: 3.39.2
+CPEPrefix: cpe:/a:sqlite:sqlite:3.39.2
 Included In Release: Yes
 Security Critical: Yes
 License: Public domain
diff --git a/tools/fuchsia/local-sdk.py b/tools/fuchsia/local-sdk.py
index e0185d3..f9d15f0 100755
--- a/tools/fuchsia/local-sdk.py
+++ b/tools/fuchsia/local-sdk.py
@@ -91,7 +91,7 @@
 
     arch_output_dir = os.path.join(fuchsia_root, 'out', 'release-' + arch)
 
-    sdk_tarballs = ['core.tar.gz']
+    sdk_tarballs = ['core.tar.gz', 'core_testing.tar.gz']
 
     for sdk_tar in sdk_tarballs:
       sdk_tar_path = os.path.join(arch_output_dir, 'sdk', 'archive', sdk_tar)
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index a541261..4202bd8 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -60228,6 +60228,7 @@
   <int value="928900043" label="OmniboxLooseMaxLimitOnDedicatedRows:disabled"/>
   <int value="929462705" label="disable-link-disambiguation-popup"/>
   <int value="932468127" label="LauncherPulsingBlocksRefresh:enabled"/>
+  <int value="933696491" label="TailoredSecurityDesktopNotice:enabled"/>
   <int value="934139985" label="WallpaperWebUI:enabled"/>
   <int value="934236781" label="OmniboxSuggestionsRecyclerView:enabled"/>
   <int value="934292666" label="DownloadRename:enabled"/>
@@ -61337,6 +61338,7 @@
   <int value="1658656322" label="IncognitoDownloadsWarning:enabled"/>
   <int value="1659082220" label="EnableManualSaving:disabled"/>
   <int value="1659372520" label="WebXrRenderPath:disabled"/>
+  <int value="1659489775" label="TailoredSecurityDesktopNotice:disabled"/>
   <int value="1659969202" label="AlignWakeUps:disabled"/>
   <int value="1660002388" label="FilesWebDriveOffice:disabled"/>
   <int value="1660491118" label="AllowAmbientEQ:enabled"/>
@@ -70058,6 +70060,162 @@
   <int value="3" label="Disabled"/>
 </enum>
 
+<enum name="NotificationCatalogName">
+<!-- Defined in ash/constants/notifier_catalogs.h -->
+
+  <int value="0" label="None"/>
+  <int value="1" label="Test Catalog Name"/>
+  <int value="2" label="Management Transition"/>
+  <int value="3" label="Authpolicy Credentials Error"/>
+  <int value="4" label="Unauthorized Battery"/>
+  <int value="5" label="Non Wilco Charger"/>
+  <int value="6" label="Incompatible Dock"/>
+  <int value="7" label="Dock Error"/>
+  <int value="8" label="Dock Display Error"/>
+  <int value="9" label="Dock Thunderbolt Error"/>
+  <int value="10" label="Wilco Low Power Charger"/>
+  <int value="11" label="Deprecated Accelerator"/>
+  <int value="12" label="Shortcuts Changed"/>
+  <int value="13" label="Docked Magnifier Enabled"/>
+  <int value="14" label="High Contrast Enabled"/>
+  <int value="15" label="Full Screen Magnifier Enabled"/>
+  <int value="16" label="Accessibility Feature Disabled"/>
+  <int value="17" label="Display Error"/>
+  <int value="18" label="Display Change"/>
+  <int value="19" label="Dual Role"/>
+  <int value="20" label="EOL"/>
+  <int value="21" label="Pending EOL"/>
+  <int value="22" label="Hats"/>
+  <int value="23" label="Kerberos Ticket Expiry"/>
+  <int value="24" label="Mobile Data"/>
+  <int value="25" label="Multi Device"/>
+  <int value="26" label="Network Out Of Credits"/>
+  <int value="27" label="Network Connection Error"/>
+  <int value="28" label="Network VPN Connection Lost"/>
+  <int value="29" label="Network Cellular Activated"/>
+  <int value="30" label="Network Activation Error"/>
+  <int value="31" label="Password Expiry"/>
+  <int value="32" label="Device Account Signin Error"/>
+  <int value="33" label="Secondary Account Signin Error"/>
+  <int value="34" label="Sync Error"/>
+  <int value="35" label="Tether Potential Hotspot"/>
+  <int value="36" label="Tether Setup Required"/>
+  <int value="37" label="Tether Connection Error"/>
+  <int value="38" label="Screen Time Limit Updated"/>
+  <int value="39" label="Bedtime Updated"/>
+  <int value="40" label="Time Limit Override"/>
+  <int value="41" label="Screen Time Limit"/>
+  <int value="42" label="Bedtime Limit"/>
+  <int value="43" label="TPM Firmware Update"/>
+  <int value="44" label="U2F"/>
+  <int value="45" label="Release Notes"/>
+  <int value="46" label="SMS"/>
+  <int value="47" label="Assistant Notification"/>
+  <int value="48" label="Fast Pair"/>
+  <int value="49" label="Power Notifier"/>
+  <int value="50" label="Battery Notifier"/>
+  <int value="51" label="Microphone Mute"/>
+  <int value="52" label="Cast"/>
+  <int value="53" label="Session Length Timeout"/>
+  <int value="54" label="Locale Update"/>
+  <int value="55" label="Tracing"/>
+  <int value="56" label="Pcie Billboard Device"/>
+  <int value="57" label="Pcie Limited Performance"/>
+  <int value="58" label="Pcie Guest Mode"/>
+  <int value="59" label="Pcie Peripheral Blocked"/>
+  <int value="60" label="Detachable Base Requires Update"/>
+  <int value="61" label="Detachable Base Pairing Notification"/>
+  <int value="62" label="Firmware Update"/>
+  <int value="63" label="Peripheral Battery"/>
+  <int value="64" label="Bluetooth Pairing Request"/>
+  <int value="65" label="Bluetooth Paired Device"/>
+  <int value="66" label="Cellular Setup"/>
+  <int value="67" label="Screen Security"/>
+  <int value="68" label="Wifi Toggle"/>
+  <int value="69" label="USB Peripheral Invalid Dp Cable"/>
+  <int value="70" label="USB Peripheral Invalid USB4 Valid TBT Cable"/>
+  <int value="71" label="USB Peripheral Invalid USB4 Cable"/>
+  <int value="72" label="USB Peripheral Invalid TBT Cable"/>
+  <int value="73" label="USB Peripheral Speed Limiting Cable"/>
+  <int value="74" label="Gesture Education"/>
+  <int value="75" label="Update"/>
+  <int value="76" label="Arc Snapshot Reboot"/>
+  <int value="77" label="Phone Hub Tether Failed"/>
+  <int value="78" label="Caps Lock"/>
+  <int value="79" label="Night Light"/>
+  <int value="80" label="Plugin VM Uninstaller"/>
+  <int value="81" label="TPM Auto Update"/>
+  <int value="82" label="It2Me Confirmation"/>
+  <int value="83" label="HPS Notify"/>
+  <int value="84" label="Nearby Share"/>
+  <int value="85" label="Update Required"/>
+  <int value="86" label="File System Provider"/>
+  <int value="87" label="Easy Unlock Chromebook Added"/>
+  <int value="88" label="Easy Unlock Pairing Change"/>
+  <int value="89" label="Easy Unlock Pairing Change Applied"/>
+  <int value="90" label="Easy Unlock Smart Lock Sign In Removed"/>
+  <int value="91" label="System Proxy"/>
+  <int value="92" label="Dlp Policy"/>
+  <int value="93" label="Packet Capture"/>
+  <int value="94" label="Eche App Retry Connection"/>
+  <int value="95" label="Eche App Inactivity"/>
+  <int value="96" label="Eche App From Web Without Button"/>
+  <int value="97" label="Eche App Screen Lock"/>
+  <int value="98" label="Accessibility"/>
+  <int value="99" label="Projector"/>
+  <int value="100" label="Website Approval"/>
+  <int value="101" label="Arc Migration Guide"/>
+  <int value="102" label="Borealis Context"/>
+  <int value="103" label="Arc Provision"/>
+  <int value="104" label="Usb Printer"/>
+  <int value="105" label="Cups Print Job"/>
+  <int value="106" label="Arc Boot Error"/>
+  <int value="107" label="Device Command Reset"/>
+  <int value="108" label="Crostini Low Disk"/>
+  <int value="109" label="Screen Capture"/>
+  <int value="110" label="Low Disk"/>
+  <int value="111" label="Event Rewriter Deprecation"/>
+  <int value="112" label="VM Camera Mic"/>
+  <int value="113" label="Security Token"/>
+  <int value="114" label="Crostini Export Import"/>
+  <int value="115" label="Lacros Cannot Launch"/>
+  <int value="116" label="Request File System"/>
+  <int value="117" label="Network Portal Detector"/>
+  <int value="118" label="Crostini Package"/>
+  <int value="119" label="Crostini Upgrade Available"/>
+  <int value="120" label="Full Restore"/>
+  <int value="121" label="Adb Sideloading Disallowed"/>
+  <int value="122" label="Adb Sideloading Powerwash Planned"/>
+  <int value="123" label="Adb Sideloading Powerwash On Reboot"/>
+  <int value="124" label="App Time"/>
+  <int value="125" label="Cros USB Detector"/>
+  <int value="126" label="Powerwash Request"/>
+  <int value="127" label="Powerwash Request Error"/>
+  <int value="128" label="Camera Privacy Switch"/>
+  <int value="129" label="Auto Launch"/>
+  <int value="130" label="Password Change"/>
+  <int value="131" label="Announcement Notification"/>
+  <int value="132" label="Web Usb"/>
+  <int value="133" label="Background Crash"/>
+  <int value="134" label="Download Notification"/>
+  <int value="135" label="Adaptive Charging"/>
+  <int value="136" label="Managed Sim Lock"/>
+  <int value="137" label="Spoken Feedback Enabled"/>
+  <int value="138" label="Braille Display Connected"/>
+  <int value="139" label="Spoken Feedback Braille Enabled"/>
+  <int value="140" label="Switch Access Enabled"/>
+  <int value="141" label="Speech Recognition Files Downloaded"/>
+  <int value="142" label="Speech Recognition Files Failed"/>
+  <int value="143" label="Low Power Charger"/>
+  <int value="144" label="Low Power Adapter"/>
+  <int value="145" label="TPM Autoupdate Planned"/>
+  <int value="146" label="TPM Autoupdate On Reboot"/>
+  <int value="147" label="Privacy Indicators"/>
+  <int value="148" label="Tailored Security Disabled"/>
+  <int value="149" label="Tailored Security Enabled"/>
+  <int value="150" label="Tailored Security Promotion"/>
+</enum>
+
 <enum name="NotificationDatabaseStatus">
   <int value="0" label="OK"/>
   <int value="1" label="Not found error"/>
@@ -83730,6 +83888,11 @@
   <int value="3" label="Revoke tokens for primary and secondary accounts"/>
 </enum>
 
+<enum name="RgbKeyboardBacklightChangeType">
+  <int value="0" label="StaticBackgroundColorChanged"/>
+  <int value="1" label="RainbowModeSelected"/>
+</enum>
+
 <!--
   This must be kept current with RgbKeyboardCapabilities located in
   third_party/cros_system_api/dbus/rgbkbd/dbus-constants.h.
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml
index 88d7816..e55c2d4 100644
--- a/tools/metrics/histograms/metadata/ash/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -3174,7 +3174,7 @@
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
     Tracks the number of times a specific toast is shown to users. This metric
-    is recorded every time a new toast is shown.
+    is recorded every time a toast is shown.
   </summary>
 </histogram>
 
@@ -3187,6 +3187,22 @@
   </summary>
 </histogram>
 
+<histogram
+    name="Ash.NotifierFramework.{UnpinnedOrPinned}SystemNotification.Added"
+    enum="NotificationCatalogName" expires_after="2023-01-10">
+  <owner>kradtke@google.com</owner>
+  <owner>cros-status-area-eng@google.com</owner>
+  <summary>
+    Tracks the number of times a specific system notification is added to the
+    notification list. This metric is recorded every time the
+    `OnNotificationAdded` event is triggered for a system notification.
+  </summary>
+  <token key="UnpinnedOrPinned">
+    <variant name=""/>
+    <variant name="Pinned"/>
+  </token>
+</histogram>
+
 <histogram base="true" name="Ash.Overview.AnimationSmoothness.Close" units="%"
     expires_after="2023-04-10">
 <!-- Name completed by histogram_suffixes
diff --git a/tools/metrics/histograms/metadata/autofill/histograms.xml b/tools/metrics/histograms/metadata/autofill/histograms.xml
index 4298cec..6a993f5 100644
--- a/tools/metrics/histograms/metadata/autofill/histograms.xml
+++ b/tools/metrics/histograms/metadata/autofill/histograms.xml
@@ -1730,10 +1730,6 @@
 <histogram
     name="Autofill.IsValueNotAutofilledOverExistingValueSameAsSubmittedValue"
     enum="Boolean" expires_after="2022-12-25">
-  <obsolete>
-    Deprecated in July 2022. Subsumed by
-    Autofill.IsValueNotAutofilledOverExistingValueSameAsSubmittedValue2.
-  </obsolete>
   <owner>vidhanj@google.com</owner>
   <owner>koerber@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
@@ -1745,20 +1741,6 @@
   </summary>
 </histogram>
 
-<histogram
-    name="Autofill.IsValueNotAutofilledOverExistingValueSameAsSubmittedValue2"
-    enum="Boolean" expires_after="2022-12-25">
-  <owner>vidhanj@google.com</owner>
-  <owner>koerber@google.com</owner>
-  <owner>chrome-autofill-alerts@google.com</owner>
-  <summary>
-    This metric is recorderd on form submission for each field that had an
-    initial value on page load and was edited by the user later on. The result
-    of the equality comparison between the submitted field value and supposedly
-    autofillable value is emitted by this metric.
-  </summary>
-</histogram>
-
 <histogram name="Autofill.KeyMetrics.FillingAcceptance{AutofillFormType}"
     enum="BooleanAutofillFillingAcceptance" expires_after="2022-12-12">
   <owner>battre@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/chromeos/histograms.xml b/tools/metrics/histograms/metadata/chromeos/histograms.xml
index c5812a91..526e316 100644
--- a/tools/metrics/histograms/metadata/chromeos/histograms.xml
+++ b/tools/metrics/histograms/metadata/chromeos/histograms.xml
@@ -1394,6 +1394,26 @@
   </summary>
 </histogram>
 
+<histogram name="ChromeOS.RgbKeyboard.{Type}"
+    enum="RgbKeyboardBacklightChangeType" expires_after="2023-07-07">
+  <owner>michaelcheco@google.com</owner>
+  <owner>dpad@google.com</owner>
+  <owner>jimmyxgong@chromium.org</owner>
+  <owner>zentaro@chromium.org</owner>
+  <owner>cros-peripherals@google.com</owner>
+  <summary>Records the source of RGB backlight change for a device.</summary>
+<!-- This must be kept current with RgbKeyboardCapabilityType located in
+  tools/metrics/histograms/enums.xml. RgbKeyboardCapabilityType::None is omitted
+  since the backlight can not be changed on unsupported devices. -->
+
+  <token key="Type">
+    <variant name="FourZoneFifteenLed"/>
+    <variant name="FourZoneFortyLed"/>
+    <variant name="FourZoneTwelveLed"/>
+    <variant name="IndividualKey"/>
+  </token>
+</histogram>
+
 <histogram name="ChromeOS.SAML.APILogin" enum="ChromeOSSamlApiUsed"
     expires_after="2022-10-02">
   <owner>mslus@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/content/histograms.xml b/tools/metrics/histograms/metadata/content/histograms.xml
index 3a893b3..f20b05f 100644
--- a/tools/metrics/histograms/metadata/content/histograms.xml
+++ b/tools/metrics/histograms/metadata/content/histograms.xml
@@ -604,7 +604,7 @@
 </histogram>
 
 <histogram name="ContentSuggestions.Feed.BrokenNTPHierarchy"
-    enum="NTPBrokenViewHierarchyRelationship" expires_after="M102">
+    enum="NTPBrokenViewHierarchyRelationship" expires_after="M107">
   <owner>adamta@google.com</owner>
   <owner>sczs@chromium.org</owner>
   <owner>feed@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/service/histograms.xml b/tools/metrics/histograms/metadata/service/histograms.xml
index 2a016910..e704348 100644
--- a/tools/metrics/histograms/metadata/service/histograms.xml
+++ b/tools/metrics/histograms/metadata/service/histograms.xml
@@ -443,8 +443,8 @@
 
 <histogram
     name="ServiceWorker.LoadTiming.MainFrame.MainResource.FetchHandlerEndToResponseReceived"
-    units="ms" expires_after="2022-09-20">
-  <owner>bashi@chromium.org</owner>
+    units="ms" expires_after="2023-06-30">
+  <owner>yyanagisawa@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
     The time taken from (a) renderer process sends an IPC message to notify that
@@ -460,8 +460,8 @@
 
 <histogram
     name="ServiceWorker.LoadTiming.MainFrame.MainResource.FetchHandlerStartToFetchHandlerEnd"
-    units="ms" expires_after="2022-09-20">
-  <owner>bashi@chromium.org</owner>
+    units="ms" expires_after="2023-06-30">
+  <owner>yyanagisawa@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
     The time taken from (a) a fetch event is dispatched, to (b) respondWith() is
@@ -476,8 +476,8 @@
 
 <histogram
     name="ServiceWorker.LoadTiming.MainFrame.MainResource.ForwardServiceWorkerToWorkerReady2"
-    units="ms" expires_after="2022-09-20">
-  <owner>bashi@chromium.org</owner>
+    units="ms" expires_after="2023-06-30">
+  <owner>yyanagisawa@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
     The time taken from (a) a resource loading request is routed to service
@@ -755,8 +755,8 @@
 </histogram>
 
 <histogram name="ServiceWorker.StartTiming.Duration" units="ms"
-    expires_after="2022-09-01">
-  <owner>wanderview@chromium.org</owner>
+    expires_after="2023-06-30">
+  <owner>yyanagisawa@chromium.org</owner>
   <owner>asamidoi@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
@@ -773,8 +773,8 @@
 
 <histogram
     name="ServiceWorker.StartTiming.ReceivedStartWorkerToScriptEvaluationStart"
-    units="ms" expires_after="2022-09-01">
-  <owner>wanderview@chromium.org</owner>
+    units="ms" expires_after="2023-06-30">
+  <owner>yyanagisawa@chromium.org</owner>
   <owner>asamidoi@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
@@ -785,8 +785,8 @@
 </histogram>
 
 <histogram name="ServiceWorker.StartTiming.ScriptEvaluationEndToEnd" units="ms"
-    expires_after="2022-09-01">
-  <owner>wanderview@chromium.org</owner>
+    expires_after="2023-06-30">
+  <owner>yyanagisawa@chromium.org</owner>
   <owner>asamidoi@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
@@ -799,8 +799,8 @@
 
 <histogram
     name="ServiceWorker.StartTiming.ScriptEvaluationStartToScriptEvaluationEnd"
-    units="ms" expires_after="2022-09-01">
-  <owner>wanderview@chromium.org</owner>
+    units="ms" expires_after="2023-06-30">
+  <owner>yyanagisawa@chromium.org</owner>
   <owner>asamidoi@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
@@ -812,8 +812,8 @@
 
 <histogram
     name="ServiceWorker.StartTiming.SentStartWorkerToReceivedStartWorker"
-    units="ms" expires_after="2022-09-01">
-  <owner>wanderview@chromium.org</owner>
+    units="ms" expires_after="2023-06-30">
+  <owner>yyanagisawa@chromium.org</owner>
   <owner>asamidoi@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
@@ -838,8 +838,8 @@
 </histogram>
 
 <histogram name="ServiceWorker.StartTiming.StartToScriptEvaluationEnd"
-    units="ms" expires_after="2022-09-01">
-  <owner>wanderview@chromium.org</owner>
+    units="ms" expires_after="2023-06-30">
+  <owner>yyanagisawa@chromium.org</owner>
   <owner>asamidoi@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
@@ -866,8 +866,8 @@
 </histogram>
 
 <histogram name="ServiceWorker.StartTiming.StartToSentStartWorker" units="ms"
-    expires_after="2022-09-01">
-  <owner>wanderview@chromium.org</owner>
+    expires_after="2023-06-30">
+  <owner>yyanagisawa@chromium.org</owner>
   <owner>asamidoi@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
@@ -904,8 +904,8 @@
 
 <histogram
     name="ServiceWorker.StartWorker.StatusByPurpose_{ServiceWorkerEventType}"
-    enum="ServiceWorkerStatusCode" expires_after="2022-09-01">
-  <owner>wanderview@chromium.org</owner>
+    enum="ServiceWorkerStatusCode" expires_after="2023-06-30">
+  <owner>yyanagisawa@chromium.org</owner>
   <owner>asamidoi@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/webapps/histograms.xml b/tools/metrics/histograms/metadata/webapps/histograms.xml
index 8fb7eb2f..a73376603 100644
--- a/tools/metrics/histograms/metadata/webapps/histograms.xml
+++ b/tools/metrics/histograms/metadata/webapps/histograms.xml
@@ -820,13 +820,16 @@
 </histogram>
 
 <histogram name="Webapp.SystemApps.BadNavigate.Type" units="App ID"
-    expires_after="2021-09-01">
+    expires_after="2022-12-31">
   <owner>calamity@chromium.org</owner>
   <owner>qjw@chromium.org</owner>
   <summary>
     Records the type of System Web App that caused a bad navigation. This is
     used to trigger a Perfetto trace to provide more debugging information. See
     crbug.com/1201820 for more details.
+
+    Warning: this histogram was expired from 2021-09-01 to 2022-12-31, data may
+    be missing.
   </summary>
 </histogram>
 
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 0486f75c..b74d198 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -13,8 +13,8 @@
             "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux_arm/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell"
         },
         "mac": {
-            "hash": "7c79218878529041a7a0095c90d320311cfbe3df",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/c2235982559f7008e5384d5145e1febe571573cd/trace_processor_shell"
+            "hash": "5458a59bb8e3176f0ba012cfffdea0fa41a88149",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/361efbf9aab595e4dfa79ec48f242d9e722393c9/trace_processor_shell"
         },
         "mac_arm64": {
             "hash": "e1ad4861384b06d911a65f035317914b8cc975c6",
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml
index e15c6ad..e9f9cfea 100644
--- a/tools/traffic_annotation/summary/annotations.xml
+++ b/tools/traffic_annotation/summary/annotations.xml
@@ -226,7 +226,7 @@
  <item id="sanitized_image_source" added_in_milestone="86" content_hash_code="076ce826" os_list="linux,windows,chromeos" file_path="chrome/browser/ui/webui/sanitized_image_source.cc" />
  <item id="save_file_manager" added_in_milestone="62" content_hash_code="03610e73" os_list="linux,windows,chromeos,android" file_path="content/browser/download/save_file_manager.cc" />
  <item id="sct_auditing" added_in_milestone="87" content_hash_code="0298c98f" os_list="linux,windows,chromeos,android" file_path="chrome/browser/ssl/sct_reporting_service.cc" />
- <item id="search_prefetch_service" added_in_milestone="88" content_hash_code="077746c6" os_list="windows,linux,chromeos,android" file_path="chrome/browser/prefetch/search_prefetch/search_prefetch_request.cc" />
+ <item id="search_prefetch_service" added_in_milestone="88" content_hash_code="077746c6" os_list="windows,linux,chromeos,android" file_path="chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.cc" />
  <item id="security_key_socket" added_in_milestone="66" content_hash_code="00d1acb0" os_list="linux,windows,chromeos" file_path="remoting/host/security_key/security_key_socket.cc" />
  <item id="service_worker_navigation_preload" added_in_milestone="63" content_hash_code="0675faf7" os_list="linux,windows,chromeos,android" file_path="content/browser/service_worker/service_worker_fetch_dispatcher.cc" />
  <item id="service_worker_script_load" added_in_milestone="90" content_hash_code="035ab34f" os_list="linux,windows,chromeos,android" file_path="content/browser/service_worker/service_worker_new_script_fetcher.cc" />
diff --git a/ui/base/models/tree_model.cc b/ui/base/models/tree_model.cc
index 1111970..9f5bbce 100644
--- a/ui/base/models/tree_model.cc
+++ b/ui/base/models/tree_model.cc
@@ -12,8 +12,8 @@
   NOTREACHED();
 }
 
-int TreeModel::GetIconIndex(TreeModelNode* node) {
-  return -1;
+absl::optional<size_t> TreeModel::GetIconIndex(TreeModelNode* node) {
+  return absl::nullopt;
 }
 
 }  // namespace ui
diff --git a/ui/base/models/tree_model.h b/ui/base/models/tree_model.h
index baa357a..ae041886 100644
--- a/ui/base/models/tree_model.h
+++ b/ui/base/models/tree_model.h
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "base/component_export.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace ui {
 
@@ -92,10 +93,10 @@
   // this if you don't want to use the default folder icons.
   virtual void GetIcons(std::vector<ui::ImageModel>* icons) {}
 
-  // Returns the index of the icon to use for |node|. Return -1 to use the
+  // Returns the index of the icon to use for |node|. Return nullopt to use the
   // default icon. The index is relative to the list of icons returned from
   // GetIcons.
-  virtual int GetIconIndex(TreeModelNode* node);
+  virtual absl::optional<size_t> GetIconIndex(TreeModelNode* node);
 
  protected:
   virtual ~TreeModel() {}
diff --git a/ui/gfx/animation/BUILD.gn b/ui/gfx/animation/BUILD.gn
index 0485c22..b241d3c 100644
--- a/ui/gfx/animation/BUILD.gn
+++ b/ui/gfx/animation/BUILD.gn
@@ -45,15 +45,9 @@
     sources += [ "animation_win.cc" ]
   }
 
-  if (is_linux || is_chromeos_lacros) {
+  if (is_linux) {
     sources += [ "animation_linux.cc" ]
   }
-  if (is_linux || is_chromeos) {
-    sources += [
-      "animation_settings_provider_linux.cc",
-      "animation_settings_provider_linux.h",
-    ]
-  }
 
   if (!is_android) {
     sources += [
@@ -86,5 +80,9 @@
     deps += [ "//ui/gfx:gfx_jni_headers" ]
   }
 
+  if (is_linux) {
+    deps += [ "//ui/linux:linux_ui" ]
+  }
+
   defines = [ "ANIMATION_IMPLEMENTATION" ]
 }
diff --git a/ui/gfx/animation/animation.cc b/ui/gfx/animation/animation.cc
index e381b4fe..fc4b7e4 100644
--- a/ui/gfx/animation/animation.cc
+++ b/ui/gfx/animation/animation.cc
@@ -82,8 +82,8 @@
 
 gfx::Rect Animation::CurrentValueBetween(const gfx::Rect& start_bounds,
                                          const gfx::Rect& target_bounds) const {
-  return Tween::RectValueBetween(
-      GetCurrentValue(), start_bounds, target_bounds);
+  return Tween::RectValueBetween(GetCurrentValue(), start_bounds,
+                                 target_bounds);
 }
 
 void Animation::SetContainer(AnimationContainer* container) {
@@ -112,8 +112,8 @@
          RichAnimationRenderMode::FORCE_ENABLED;
 }
 
-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS_ASH) || \
-    BUILDFLAG(IS_IOS) || BUILDFLAG(IS_FUCHSIA)
+#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_IOS) || \
+    BUILDFLAG(IS_FUCHSIA)
 // static
 bool Animation::ShouldRenderRichAnimationImpl() {
   return true;
@@ -137,7 +137,7 @@
   prefers_reduced_motion_ = false;
 }
 #endif  // !BUILDFLAG(IS_ANDROID)
-#endif  // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS_ASH) ||
+#endif  // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) ||
         // BUILDFLAG(IS_IOS) || BUILDFLAG(IS_FUCHSIA)
 
 // static
diff --git a/ui/gfx/animation/animation_linux.cc b/ui/gfx/animation/animation_linux.cc
index 0bcce53..9216c40 100644
--- a/ui/gfx/animation/animation_linux.cc
+++ b/ui/gfx/animation/animation_linux.cc
@@ -4,17 +4,17 @@
 
 #include "ui/gfx/animation/animation.h"
 
-#include "ui/gfx/animation/animation_settings_provider_linux.h"
+#include "ui/linux/linux_ui.h"
 
 namespace gfx {
 
 namespace {
 
-// GTK only has a global setting for whether animations should be enabled.  So
-// use it for all of the specific settings that Chrome needs.
+// Linux toolkits only have a global setting for whether animations should be
+// enabled.  So use it for all of the specific settings that Chrome needs.
 bool AnimationsEnabled() {
-  auto* provider = AnimationSettingsProviderLinux::GetInstance();
-  return !provider || provider->AnimationsEnabled();
+  auto* linux_ui = ui::LinuxUi::instance();
+  return !linux_ui || linux_ui->AnimationsEnabled();
 }
 
 }  // namespace
diff --git a/ui/gfx/animation/animation_settings_provider_linux.cc b/ui/gfx/animation/animation_settings_provider_linux.cc
deleted file mode 100644
index 96a10c7..0000000
--- a/ui/gfx/animation/animation_settings_provider_linux.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2020 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 "ui/gfx/animation/animation_settings_provider_linux.h"
-
-namespace gfx {
-
-// static
-AnimationSettingsProviderLinux* AnimationSettingsProviderLinux::instance_ =
-    nullptr;
-
-// static
-AnimationSettingsProviderLinux* AnimationSettingsProviderLinux::GetInstance() {
-  return instance_;
-}
-
-// static
-void AnimationSettingsProviderLinux::SetInstance(
-    AnimationSettingsProviderLinux* instance) {
-  instance_ = instance;
-}
-
-AnimationSettingsProviderLinux::AnimationSettingsProviderLinux() = default;
-
-AnimationSettingsProviderLinux::~AnimationSettingsProviderLinux() = default;
-
-}  // namespace gfx
diff --git a/ui/gfx/animation/animation_settings_provider_linux.h b/ui/gfx/animation/animation_settings_provider_linux.h
deleted file mode 100644
index 36a28b8..0000000
--- a/ui/gfx/animation/animation_settings_provider_linux.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2020 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 UI_GFX_ANIMATION_ANIMATION_SETTINGS_PROVIDER_LINUX_H_
-#define UI_GFX_ANIMATION_ANIMATION_SETTINGS_PROVIDER_LINUX_H_
-
-#include "ui/gfx/animation/animation_export.h"
-
-namespace gfx {
-
-class ANIMATION_EXPORT AnimationSettingsProviderLinux {
- public:
-  AnimationSettingsProviderLinux(const AnimationSettingsProviderLinux&) =
-      delete;
-  AnimationSettingsProviderLinux& operator=(
-      const AnimationSettingsProviderLinux&) = delete;
-
-  virtual ~AnimationSettingsProviderLinux();
-
-  // Indicates if animations are enabled by the toolkit.
-  virtual bool AnimationsEnabled() const = 0;
-
-  static AnimationSettingsProviderLinux* GetInstance();
-
-  static void SetInstance(AnimationSettingsProviderLinux* instance);
-
- protected:
-  AnimationSettingsProviderLinux();
-
- private:
-  static AnimationSettingsProviderLinux* instance_;
-};
-
-}  // namespace gfx
-
-#endif  // UI_GFX_ANIMATION_ANIMATION_SETTINGS_PROVIDER_LINUX_H_
diff --git a/ui/gfx/render_text.cc b/ui/gfx/render_text.cc
index 69ee0aee..851249f 100644
--- a/ui/gfx/render_text.cc
+++ b/ui/gfx/render_text.cc
@@ -534,7 +534,7 @@
   if (directionality_mode_ == DIRECTIONALITY_FROM_TEXT)
     text_direction_ = base::i18n::UNKNOWN_DIRECTION;
 
-  obscured_reveal_index_ = -1;
+  obscured_reveal_index_ = absl::nullopt;
   OnTextAttributeChanged();
 }
 
@@ -542,7 +542,7 @@
   text_ += text;
   UpdateStyleLengths();
   cached_bounds_and_offset_valid_ = false;
-  obscured_reveal_index_ = -1;
+  obscured_reveal_index_ = absl::nullopt;
 
   // Invalidate the cached text direction if it depends on the text contents.
   if (directionality_mode_ == DIRECTIONALITY_FROM_TEXT)
@@ -589,13 +589,13 @@
 void RenderText::SetObscured(bool obscured) {
   if (obscured != obscured_) {
     obscured_ = obscured;
-    obscured_reveal_index_ = -1;
+    obscured_reveal_index_ = absl::nullopt;
     cached_bounds_and_offset_valid_ = false;
     OnTextAttributeChanged();
   }
 }
 
-void RenderText::SetObscuredRevealIndex(int index) {
+void RenderText::SetObscuredRevealIndex(absl::optional<size_t> index) {
   if (obscured_reveal_index_ != index) {
     obscured_reveal_index_ = index;
     cached_bounds_and_offset_valid_ = false;
@@ -1550,8 +1550,8 @@
   // Ensures the reveal index is at a codepoint boundary (e.g. not in a middle
   // of a surrogate pairs).
   size_t reveal_index = text_.size();
-  if (obscured_reveal_index_ != -1) {
-    reveal_index = base::checked_cast<size_t>(obscured_reveal_index_);
+  if (obscured_reveal_index_.has_value()) {
+    reveal_index = obscured_reveal_index_.value();
     // Move |reveal_index| to the beginning of the surrogate pair, if needed.
     if (reveal_index < text_.size())
       U16_SET_CP_START(text_.data(), 0, reveal_index);
diff --git a/ui/gfx/render_text.h b/ui/gfx/render_text.h
index 81ac620c..d6e7a79f 100644
--- a/ui/gfx/render_text.h
+++ b/ui/gfx/render_text.h
@@ -297,10 +297,10 @@
 
   // Makes a char in obscured text at |index| to be revealed. |index| should be
   // a UTF16 text index. If there is a previous revealed index, the previous one
-  // is cleared and only the last set index will be revealed. If |index| is -1
-  // or out of range, no char will be revealed. The revealed index is also
-  // cleared when SetText or SetObscured is called.
-  void SetObscuredRevealIndex(int index);
+  // is cleared and only the last set index will be revealed. If |index| is
+  // nullopt or out of range, no char will be revealed. The revealed index is
+  // also cleared when SetText or SetObscured is called.
+  void SetObscuredRevealIndex(absl::optional<size_t> index);
 
   // For obscured (password) fields, the extra spacing between glyphs.
   int obscured_glyph_spacing() const { return obscured_glyph_spacing_; }
@@ -968,7 +968,7 @@
   // A flag to obscure actual text with asterisks for password fields.
   bool obscured_ = false;
   // The index at which the char should be revealed in the obscured text.
-  int obscured_reveal_index_ = -1;
+  absl::optional<size_t> obscured_reveal_index_;
 
   // The maximum length of text to display, 0 forgoes a hard limit.
   size_t truncate_length_ = 0;
diff --git a/ui/gfx/render_text_unittest.cc b/ui/gfx/render_text_unittest.cc
index 7c2ce5f..ab7dfc85 100644
--- a/ui/gfx/render_text_unittest.cc
+++ b/ui/gfx/render_text_unittest.cc
@@ -1322,7 +1322,7 @@
             render_text->GetDisplayText());
 
   // Invalid reveal index.
-  render_text->RenderText::SetObscuredRevealIndex(-1);
+  render_text->RenderText::SetObscuredRevealIndex(absl::nullopt);
   EXPECT_EQ(no_seuss, render_text->GetDisplayText());
   render_text->RenderText::SetObscuredRevealIndex(seuss.length() + 1);
   EXPECT_EQ(no_seuss, render_text->GetDisplayText());
diff --git a/ui/linux/BUILD.gn b/ui/linux/BUILD.gn
index 48b78fe..436f05b 100644
--- a/ui/linux/BUILD.gn
+++ b/ui/linux/BUILD.gn
@@ -26,15 +26,8 @@
     "linux_ui_delegate_stub.cc",
     "status_icon_linux.cc",
   ]
-  deps = [
-    "//base",
-    "//build:chromecast_buildflags",
-    "//ui/gfx/animation",
-  ]
-  public_deps = [
-    "//printing/buildflags",
-    "//skia",
-  ]
+  deps = [ "//base" ]
+  public_deps = [ "//printing/buildflags" ]
 }
 
 source_set("linux_ui_impl") {
@@ -43,6 +36,7 @@
   public_deps = [ ":linux_ui" ]
   deps = [
     "//base",
+    "//skia",
     "//ui/gfx",
     "//ui/native_theme",
     "//ui/shell_dialogs",
diff --git a/ui/linux/linux_ui.cc b/ui/linux/linux_ui.cc
index bae51ee..ec285b1 100644
--- a/ui/linux/linux_ui.cc
+++ b/ui/linux/linux_ui.cc
@@ -28,8 +28,6 @@
 // static
 std::unique_ptr<LinuxUi> LinuxUi::SetInstance(
     std::unique_ptr<LinuxUi> instance) {
-  gfx::AnimationSettingsProviderLinux::SetInstance(instance.get());
-
   return std::exchange(GetLinuxUiInstance(), std::move(instance));
 }
 
diff --git a/ui/linux/linux_ui.h b/ui/linux/linux_ui.h
index e8be3f2e..dee9774 100644
--- a/ui/linux/linux_ui.h
+++ b/ui/linux/linux_ui.h
@@ -17,12 +17,12 @@
 #include "build/buildflag.h"
 #include "build/chromecast_buildflags.h"
 #include "printing/buildflags/buildflags.h"
-#include "third_party/skia/include/core/SkColor.h"
-#include "ui/gfx/animation/animation_settings_provider_linux.h"
 
 // The main entrypoint into Linux toolkit specific code. GTK/QT code should only
 // be executed behind this interface.
 
+using SkColor = uint32_t;
+
 namespace aura {
 class Window;
 }
@@ -59,8 +59,7 @@
 
 // Adapter class with targets to render like different toolkits. Set by any
 // project that wants to do linux desktop native rendering.
-class COMPONENT_EXPORT(LINUX_UI) LinuxUi
-    : public gfx::AnimationSettingsProviderLinux {
+class COMPONENT_EXPORT(LINUX_UI) LinuxUi {
  public:
   using UseSystemThemeCallback =
       base::RepeatingCallback<bool(aura::Window* window)>;
@@ -84,7 +83,7 @@
 
   LinuxUi(const LinuxUi&) = delete;
   LinuxUi& operator=(const LinuxUi&) = delete;
-  ~LinuxUi() override;
+  virtual ~LinuxUi();
 
   // Sets the dynamically loaded singleton that draws the desktop native UI.
   // Returns the old instance if any.
@@ -228,6 +227,9 @@
       int* weight_out,
       gfx::FontRenderParams* params_out) const = 0;
 
+  // Indicates if animations are enabled by the toolkit.
+  virtual bool AnimationsEnabled() const = 0;
+
  protected:
   struct CmdLineArgs {
     CmdLineArgs();
diff --git a/ui/message_center/public/cpp/notifier_id.cc b/ui/message_center/public/cpp/notifier_id.cc
index 81823ab..f7090579 100644
--- a/ui/message_center/public/cpp/notifier_id.cc
+++ b/ui/message_center/public/cpp/notifier_id.cc
@@ -9,7 +9,13 @@
 
 namespace message_center {
 
+#if BUILDFLAG(IS_CHROMEOS)
+NotifierId::NotifierId()
+    : type(NotifierType::SYSTEM_COMPONENT),
+      catalog_name(ash::NotificationCatalogName::kNone) {}
+#else
 NotifierId::NotifierId() : type(NotifierType::SYSTEM_COMPONENT) {}
+#endif  // IS_CHROMEOS
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 NotifierId::NotifierId(NotifierType type,
@@ -51,6 +57,13 @@
   if (type == NotifierType::WEB_PAGE)
     return url == other.url;
 
+#if BUILDFLAG(IS_CHROMEOS)
+  if (type == NotifierType::SYSTEM_COMPONENT &&
+      catalog_name != other.catalog_name) {
+    return false;
+  }
+#endif
+
   return id == other.id;
 }
 
diff --git a/ui/message_center/public/cpp/notifier_id.h b/ui/message_center/public/cpp/notifier_id.h
index 9ef65ce..2a646e80 100644
--- a/ui/message_center/public/cpp/notifier_id.h
+++ b/ui/message_center/public/cpp/notifier_id.h
@@ -15,7 +15,7 @@
 #include "ui/message_center/public/cpp/message_center_public_export.h"
 #include "url/gurl.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ash/constants/notifier_catalogs.h"
 #endif
 
@@ -70,7 +70,7 @@
   // The identifier of the app notifier. Empty if it's WEB_PAGE.
   std::string id;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+#if BUILDFLAG(IS_CHROMEOS)
   // Identifier for CrOS system notifications.
   ash::NotificationCatalogName catalog_name;
 #endif
diff --git a/ui/qt/BUILD.gn b/ui/qt/BUILD.gn
index 913f8b8..2382cd3 100644
--- a/ui/qt/BUILD.gn
+++ b/ui/qt/BUILD.gn
@@ -89,7 +89,6 @@
     ":qt_interface",
     "//base",
     "//printing/buildflags",
-    "//skia",
     "//ui/base/ime/linux",
     "//ui/color",
     "//ui/color:mixers",
@@ -99,6 +98,7 @@
     "//ui/shell_dialogs",
     "//ui/views",
   ]
+  public_deps = [ "//skia" ]
 
   sources = [
     "qt_ui.cc",
diff --git a/ui/views/controls/combobox/combobox.cc b/ui/views/controls/combobox/combobox.cc
index 63c8429c..d913ccb4 100644
--- a/ui/views/controls/combobox/combobox.cc
+++ b/ui/views/controls/combobox/combobox.cc
@@ -472,7 +472,7 @@
     node_data->SetDefaultActionVerb(ax::mojom::DefaultActionVerb::kOpen);
   }
   node_data->AddIntAttribute(ax::mojom::IntAttribute::kPosInSet,
-                             selected_index_.value());
+                             base::checked_cast<int>(selected_index_.value()));
   node_data->AddIntAttribute(ax::mojom::IntAttribute::kSetSize,
                              base::checked_cast<int>(model_->GetItemCount()));
 }
diff --git a/ui/views/controls/editable_combobox/editable_combobox.cc b/ui/views/controls/editable_combobox/editable_combobox.cc
index e94fafd..2acc0d9 100644
--- a/ui/views/controls/editable_combobox/editable_combobox.cc
+++ b/ui/views/controls/editable_combobox/editable_combobox.cc
@@ -418,15 +418,15 @@
   menu_model_->UpdateItemsShown();
 }
 
-int EditableCombobox::GetItemCountForTest() {
+size_t EditableCombobox::GetItemCountForTest() {
   return menu_model_->GetItemCount();
 }
 
-std::u16string EditableCombobox::GetItemForTest(int index) {
+std::u16string EditableCombobox::GetItemForTest(size_t index) {
   return menu_model_->GetItemTextAt(index, showing_password_text_);
 }
 
-ui::ImageModel EditableCombobox::GetIconForTest(int index) {
+ui::ImageModel EditableCombobox::GetIconForTest(size_t index) {
   return menu_model_->GetIconAt(index);
 }
 
@@ -492,7 +492,7 @@
   pre_target_handler_.reset();
 }
 
-void EditableCombobox::OnItemSelected(int index) {
+void EditableCombobox::OnItemSelected(size_t index) {
   // |textfield_| can hide the characters on its own so we read the actual
   // characters instead of gfx::RenderText::kPasswordReplacementChar characters.
   std::u16string selected_item_text =
diff --git a/ui/views/controls/editable_combobox/editable_combobox.h b/ui/views/controls/editable_combobox/editable_combobox.h
index df5143b..ef96793 100644
--- a/ui/views/controls/editable_combobox/editable_combobox.h
+++ b/ui/views/controls/editable_combobox/editable_combobox.h
@@ -110,9 +110,9 @@
 
   // Accessors of private members for tests.
   ui::ComboboxModel* GetComboboxModelForTest() { return combobox_model_.get(); }
-  int GetItemCountForTest();
-  std::u16string GetItemForTest(int index);
-  ui::ImageModel GetIconForTest(int index);
+  size_t GetItemCountForTest();
+  std::u16string GetItemForTest(size_t index);
+  ui::ImageModel GetIconForTest(size_t index);
   MenuRunner* GetMenuRunnerForTest() { return menu_runner_.get(); }
   Textfield* GetTextfieldForTest() { return textfield_; }
 
@@ -123,7 +123,7 @@
   void CloseMenu();
 
   // Called when an item is selected from the menu.
-  void OnItemSelected(int index);
+  void OnItemSelected(size_t index);
 
   // Notifies listener of new content and updates the menu items to show.
   void HandleNewContent(const std::u16string& new_content);
diff --git a/ui/views/controls/editable_combobox/editable_combobox_unittest.cc b/ui/views/controls/editable_combobox/editable_combobox_unittest.cc
index 0efa613a..7fe52c5 100644
--- a/ui/views/controls/editable_combobox/editable_combobox_unittest.cc
+++ b/ui/views/controls/editable_combobox/editable_combobox_unittest.cc
@@ -655,7 +655,7 @@
   combobox_->GetTextfieldForTest()->RequestFocus();
 
   SendKeyEvent(ui::VKEY_B);
-  ASSERT_EQ(3, combobox_->GetItemCountForTest());
+  ASSERT_EQ(3u, combobox_->GetItemCountForTest());
 
   SendKeyEvent(ui::VKEY_DOWN);
   SendKeyEvent(ui::VKEY_RETURN);
@@ -669,7 +669,7 @@
   dummy_focusable_view_->RequestFocus();
   ClickArrow();
   EXPECT_TRUE(IsMenuOpen());
-  ASSERT_EQ(2, combobox_->GetItemCountForTest());
+  ASSERT_EQ(2u, combobox_->GetItemCountForTest());
 }
 
 TEST_F(EditableComboboxTest, GetItemsWithoutFiltering) {
@@ -677,7 +677,7 @@
   InitEditableCombobox(items, /*filter_on_edit=*/false, /*show_on_empty=*/true);
 
   combobox_->SetText(u"z");
-  ASSERT_EQ(2, combobox_->GetItemCountForTest());
+  ASSERT_EQ(2u, combobox_->GetItemCountForTest());
   ASSERT_EQ(u"item0", combobox_->GetItemForTest(0));
   ASSERT_EQ(u"item1", combobox_->GetItemForTest(1));
 }
@@ -686,22 +686,22 @@
   std::vector<std::u16string> items = {u"abc", u"abd", u"bac", u"bad"};
   InitEditableCombobox(items, /*filter_on_edit=*/true, /*show_on_empty=*/true);
 
-  ASSERT_EQ(4, combobox_->GetItemCountForTest());
+  ASSERT_EQ(4u, combobox_->GetItemCountForTest());
   ASSERT_EQ(u"abc", combobox_->GetItemForTest(0));
   ASSERT_EQ(u"abd", combobox_->GetItemForTest(1));
   ASSERT_EQ(u"bac", combobox_->GetItemForTest(2));
   ASSERT_EQ(u"bad", combobox_->GetItemForTest(3));
 
   combobox_->SetText(u"b");
-  ASSERT_EQ(2, combobox_->GetItemCountForTest());
+  ASSERT_EQ(2u, combobox_->GetItemCountForTest());
   ASSERT_EQ(u"bac", combobox_->GetItemForTest(0));
   ASSERT_EQ(u"bad", combobox_->GetItemForTest(1));
 
   combobox_->SetText(u"bc");
-  ASSERT_EQ(0, combobox_->GetItemCountForTest());
+  ASSERT_EQ(0u, combobox_->GetItemCountForTest());
 
   combobox_->SetText(std::u16string());
-  ASSERT_EQ(4, combobox_->GetItemCountForTest());
+  ASSERT_EQ(4u, combobox_->GetItemCountForTest());
   ASSERT_EQ(u"abc", combobox_->GetItemForTest(0));
   ASSERT_EQ(u"abd", combobox_->GetItemForTest(1));
   ASSERT_EQ(u"bac", combobox_->GetItemForTest(2));
@@ -721,18 +721,18 @@
                        /*filter_on_edit=*/true,
                        /*show_on_empty=*/true);
 
-  ASSERT_EQ(2, combobox_->GetItemCountForTest());
+  ASSERT_EQ(2u, combobox_->GetItemCountForTest());
   EXPECT_EQ(16,
             combobox_->GetComboboxModelForTest()->GetIconAt(0).Size().width());
   EXPECT_EQ(20,
             combobox_->GetComboboxModelForTest()->GetIconAt(1).Size().width());
 
   combobox_->SetText(u"a");
-  ASSERT_EQ(1, combobox_->GetItemCountForTest());
+  ASSERT_EQ(1u, combobox_->GetItemCountForTest());
   EXPECT_EQ(16, combobox_->GetIconForTest(0).Size().width());
 
   combobox_->SetText(u"d");
-  ASSERT_EQ(1, combobox_->GetItemCountForTest());
+  ASSERT_EQ(1u, combobox_->GetItemCountForTest());
   EXPECT_EQ(20, combobox_->GetIconForTest(0).Size().width());
 }
 
@@ -740,18 +740,18 @@
   std::vector<std::u16string> items = {u"AbCd", u"aBcD", u"xyz"};
   InitEditableCombobox(items, /*filter_on_edit=*/true, /*show_on_empty=*/true);
 
-  ASSERT_EQ(3, combobox_->GetItemCountForTest());
+  ASSERT_EQ(3u, combobox_->GetItemCountForTest());
   ASSERT_EQ(u"AbCd", combobox_->GetItemForTest(0));
   ASSERT_EQ(u"aBcD", combobox_->GetItemForTest(1));
   ASSERT_EQ(u"xyz", combobox_->GetItemForTest(2));
 
   combobox_->SetText(u"abcd");
-  ASSERT_EQ(2, combobox_->GetItemCountForTest());
+  ASSERT_EQ(2u, combobox_->GetItemCountForTest());
   ASSERT_EQ(u"AbCd", combobox_->GetItemForTest(0));
   ASSERT_EQ(u"aBcD", combobox_->GetItemForTest(1));
 
   combobox_->SetText(u"ABCD");
-  ASSERT_EQ(2, combobox_->GetItemCountForTest());
+  ASSERT_EQ(2u, combobox_->GetItemCountForTest());
   ASSERT_EQ(u"AbCd", combobox_->GetItemForTest(0));
   ASSERT_EQ(u"aBcD", combobox_->GetItemForTest(1));
 }
@@ -761,9 +761,9 @@
   InitEditableCombobox(items, /*filter_on_edit=*/false,
                        /*show_on_empty=*/false);
 
-  ASSERT_EQ(0, combobox_->GetItemCountForTest());
+  ASSERT_EQ(0u, combobox_->GetItemCountForTest());
   combobox_->SetText(u"a");
-  ASSERT_EQ(2, combobox_->GetItemCountForTest());
+  ASSERT_EQ(2u, combobox_->GetItemCountForTest());
   ASSERT_EQ(u"item0", combobox_->GetItemForTest(0));
   ASSERT_EQ(u"item1", combobox_->GetItemForTest(1));
 }
@@ -797,7 +797,7 @@
   InitEditableCombobox(items, /*filter_on_edit=*/false, /*show_on_empty=*/true,
                        EditableCombobox::Type::kPassword);
 
-  ASSERT_EQ(2, combobox_->GetItemCountForTest());
+  ASSERT_EQ(2u, combobox_->GetItemCountForTest());
   ASSERT_EQ(std::u16string(5, gfx::RenderText::kPasswordReplacementChar),
             combobox_->GetItemForTest(0));
   ASSERT_EQ(std::u16string(5, gfx::RenderText::kPasswordReplacementChar),
@@ -926,7 +926,7 @@
 
 TEST_F(EditableComboboxDefaultTest, Default) {
   auto combobox = std::make_unique<EditableCombobox>();
-  EXPECT_EQ(0, combobox->GetItemCountForTest());
+  EXPECT_EQ(0u, combobox->GetItemCountForTest());
 }
 
 TEST_F(EditableComboboxDefaultTest, SetModel) {
@@ -935,7 +935,7 @@
   model->SetItemCount(42);
   auto combobox = std::make_unique<EditableCombobox>();
   combobox->SetModel(std::move(model));
-  EXPECT_EQ(42, combobox->GetItemCountForTest());
+  EXPECT_EQ(42u, combobox->GetItemCountForTest());
 }
 
 TEST_F(EditableComboboxDefaultTest, SetModelOverwrite) {
diff --git a/ui/views/controls/tabbed_pane/tabbed_pane.cc b/ui/views/controls/tabbed_pane/tabbed_pane.cc
index fa9a69ac..e33d31e 100644
--- a/ui/views/controls/tabbed_pane/tabbed_pane.cc
+++ b/ui/views/controls/tabbed_pane/tabbed_pane.cc
@@ -355,10 +355,11 @@
   const size_t selected_tab_index = GetSelectedTabIndex();
   DCHECK_NE(kNoSelectedTab, selected_tab_index);
   const size_t num_children = children().size();
-  // Clamping |delta| here ensures that even a large negative |delta| will not
-  // cause the addition in the next statement to wrap below 0.
-  delta %= static_cast<int>(num_children);
-  return GetTabAtIndex((selected_tab_index + num_children + delta) %
+  // Clamping |delta| here ensures that even a large negative |delta| will be
+  // positive after the addition in the next statement.
+  delta %= base::checked_cast<int>(num_children);
+  delta += static_cast<int>(num_children);
+  return GetTabAtIndex((selected_tab_index + static_cast<size_t>(delta)) %
                        num_children);
 }
 
@@ -530,8 +531,8 @@
   contents->GetViewAccessibility().OverrideRole(ax::mojom::Role::kTabPanel);
 
   tab_strip_->AddChildViewAt(std::make_unique<Tab>(this, title, contents.get()),
-                             static_cast<int>(index));
-  contents_->AddChildViewAt(std::move(contents), static_cast<int>(index));
+                             index);
+  contents_->AddChildViewAt(std::move(contents), index);
   if (!GetSelectedTab())
     SelectTabAt(index);
 
diff --git a/ui/views/controls/textfield/textfield.cc b/ui/views/controls/textfield/textfield.cc
index 4ec9776..5ac5429 100644
--- a/ui/views/controls/textfield/textfield.cc
+++ b/ui/views/controls/textfield/textfield.cc
@@ -971,14 +971,16 @@
 
   const gfx::Range range = GetSelectedRange();
   node_data->AddIntAttribute(ax::mojom::IntAttribute::kTextSelStart,
-                             range.start());
-  node_data->AddIntAttribute(ax::mojom::IntAttribute::kTextSelEnd, range.end());
+                             base::checked_cast<int32_t>(range.start()));
+  node_data->AddIntAttribute(ax::mojom::IntAttribute::kTextSelEnd,
+                             base::checked_cast<int32_t>(range.end()));
 }
 
 bool Textfield::HandleAccessibleAction(const ui::AXActionData& action_data) {
   if (action_data.action == ax::mojom::Action::kSetSelection) {
     DCHECK_EQ(action_data.anchor_node_id, action_data.focus_node_id);
-    const gfx::Range range(action_data.anchor_offset, action_data.focus_offset);
+    const gfx::Range range(static_cast<size_t>(action_data.anchor_offset),
+                           static_cast<size_t>(action_data.focus_offset));
     return SetEditableSelectionRange(range);
   }
 
@@ -1352,7 +1354,7 @@
     return 0;
   OnBeforeUserAction();
   skip_input_method_cancel_composition_ = true;
-  const uint32_t confirmed_text_length = model_->ConfirmCompositionText();
+  const size_t confirmed_text_length = model_->ConfirmCompositionText();
   skip_input_method_cancel_composition_ = false;
   UpdateAfterChange(TextChangeType::kUserTriggered, true);
   OnAfterUserAction();
@@ -1410,7 +1412,7 @@
   DoInsertChar(ch);
 
   if (text_input_type_ == ui::TEXT_INPUT_TYPE_PASSWORD) {
-    password_char_reveal_index_ = -1;
+    password_char_reveal_index_ = absl::nullopt;
     base::TimeDelta duration = GetPasswordRevealDuration(event);
     if (!duration.is_zero()) {
       const size_t change_offset = model_->GetCursorPosition();
@@ -2546,17 +2548,18 @@
   return (t != ui::TEXT_INPUT_TYPE_NONE && t != ui::TEXT_INPUT_TYPE_PASSWORD);
 }
 
-void Textfield::RevealPasswordChar(int index, base::TimeDelta duration) {
+void Textfield::RevealPasswordChar(absl::optional<size_t> index,
+                                   base::TimeDelta duration) {
   GetRenderText()->SetObscuredRevealIndex(index);
   SchedulePaint();
   password_char_reveal_index_ = index;
   UpdateCursorViewPosition();
 
-  if (index != -1) {
-    password_reveal_timer_.Start(
-        FROM_HERE, duration,
-        base::BindOnce(&Textfield::RevealPasswordChar,
-                       weak_ptr_factory_.GetWeakPtr(), -1, duration));
+  if (index.has_value()) {
+    password_reveal_timer_.Start(FROM_HERE, duration,
+                                 base::BindOnce(&Textfield::RevealPasswordChar,
+                                                weak_ptr_factory_.GetWeakPtr(),
+                                                absl::nullopt, duration));
   }
 }
 
diff --git a/ui/views/controls/textfield/textfield.h b/ui/views/controls/textfield/textfield.h
index dfd26fc..6688bcc 100644
--- a/ui/views/controls/textfield/textfield.h
+++ b/ui/views/controls/textfield/textfield.h
@@ -313,7 +313,9 @@
   // Set extra spacing placed between glyphs; used for obscured text styling.
   void SetObscuredGlyphSpacing(int spacing);
 
-  int GetPasswordCharRevealIndex() const { return password_char_reveal_index_; }
+  absl::optional<size_t> GetPasswordCharRevealIndex() const {
+    return password_char_reveal_index_;
+  }
 
   void SetExtraInsets(const gfx::Insets& insets);
 
@@ -619,9 +621,10 @@
   bool ImeEditingAllowed() const;
 
   // Reveals the password character at |index| for a set duration.
-  // If |index| is -1, the existing revealed character will be reset.
+  // If |index| is nullopt, the existing revealed character will be reset.
   // |duration| is the time to remain the password char to be visible.
-  void RevealPasswordChar(int index, base::TimeDelta duration);
+  void RevealPasswordChar(absl::optional<size_t> index,
+                          base::TimeDelta duration);
 
   void CreateTouchSelectionControllerAndNotifyIt();
 
@@ -776,7 +779,7 @@
       ui::TextInputClient::FOCUS_REASON_NONE;
 
   // The password char reveal index, for testing only.
-  int password_char_reveal_index_ = -1;
+  absl::optional<size_t> password_char_reveal_index_;
 
   // Extra insets, useful to make room for a button for example.
   gfx::Insets extra_insets_ = gfx::Insets();
diff --git a/ui/views/controls/textfield/textfield_model.cc b/ui/views/controls/textfield/textfield_model.cc
index b3202c3..8c67d53 100644
--- a/ui/views/controls/textfield/textfield_model.cc
+++ b/ui/views/controls/textfield/textfield_model.cc
@@ -364,8 +364,8 @@
                                   const gfx::Range& range) {
   DCHECK(render_text);
   DCHECK(range.IsValid());
-  uint32_t start = range.GetMin();
-  uint32_t end = range.GetMax();
+  size_t start = range.GetMin();
+  size_t end = range.GetMax();
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   // Swap |start| and |end| so that GetCaretBounds() can always return the same
   // value during conversion.
@@ -783,11 +783,11 @@
   render_text_->SetCompositionRange(range);
 }
 
-uint32_t TextfieldModel::ConfirmCompositionText() {
+size_t TextfieldModel::ConfirmCompositionText() {
   DCHECK(HasCompositionText());
   std::u16string composition =
       text().substr(composition_range_.start(), composition_range_.length());
-  uint32_t composition_length = composition_range_.length();
+  size_t composition_length = composition_range_.length();
   // TODO(oshima): current behavior on ChromeOS is a bit weird and not
   // sure exactly how this should work. Find out and fix if necessary.
   AddOrMergeEditHistory(std::make_unique<internal::InsertEdit>(
diff --git a/ui/views/controls/textfield/textfield_model.h b/ui/views/controls/textfield/textfield_model.h
index 01452147..614cb0b12 100644
--- a/ui/views/controls/textfield/textfield_model.h
+++ b/ui/views/controls/textfield/textfield_model.h
@@ -257,7 +257,7 @@
 
   // Converts current composition text into final content and returns the
   // length of the text committed.
-  uint32_t ConfirmCompositionText();
+  size_t ConfirmCompositionText();
 
   // Removes current composition text.
   void CancelCompositionText();
diff --git a/ui/views/controls/textfield/textfield_unittest.cc b/ui/views/controls/textfield/textfield_unittest.cc
index 4f5787c..5661569c 100644
--- a/ui/views/controls/textfield/textfield_unittest.cc
+++ b/ui/views/controls/textfield/textfield_unittest.cc
@@ -1472,15 +1472,15 @@
   EXPECT_EQ(ui::TEXT_INPUT_TYPE_PASSWORD, textfield_->GetTextInputType());
 
   SendKeyEvent(ui::VKEY_A);
-  EXPECT_EQ(-1, textfield_->GetPasswordCharRevealIndex());
+  EXPECT_FALSE(textfield_->GetPasswordCharRevealIndex().has_value());
   SendKeyEvent(kHebrewLetterSamekh, ui::EF_NONE, true /* from_vk */);
 #if !BUILDFLAG(IS_MAC)
   // Don't verifies the password character reveal on MacOS, because on MacOS,
   // the text insertion is not done through TextInputClient::InsertChar().
-  EXPECT_EQ(1, textfield_->GetPasswordCharRevealIndex());
+  EXPECT_EQ(1u, textfield_->GetPasswordCharRevealIndex());
 #endif
   SendKeyEvent(ui::VKEY_B);
-  EXPECT_EQ(-1, textfield_->GetPasswordCharRevealIndex());
+  EXPECT_FALSE(textfield_->GetPasswordCharRevealIndex().has_value());
 
   EXPECT_EQ(
       u"a\x05E1"
diff --git a/ui/views/controls/tree/tree_view.cc b/ui/views/controls/tree/tree_view.cc
index 79330a6..366cae99 100644
--- a/ui/views/controls/tree/tree_view.cc
+++ b/ui/views/controls/tree/tree_view.cc
@@ -652,7 +652,7 @@
 }
 
 size_t TreeView::GetRowCount() {
-  int row_count = root_.NumExpandedNodes();
+  size_t row_count = root_.NumExpandedNodes();
   if (!root_shown_)
     row_count--;
   return row_count;
@@ -679,7 +679,7 @@
 }
 
 std::u16string TreeView::GetTextForRow(size_t row) {
-  return GetNodeForRow(row)->GetTitle();
+  return GetNodeForRow(static_cast<int>(row))->GetTitle();
 }
 
 gfx::Point TreeView::GetKeyboardContextMenuLocation() {
@@ -976,12 +976,12 @@
 
     // Per the ARIA Spec, aria-posinset and aria-setsize are 1-based
     // not 0-based.
-    int pos_in_parent = node->parent()->GetIndexOf(node) + 1;
-    int sibling_size = static_cast<int>(node->parent()->children().size());
+    size_t pos_in_parent = node->parent()->GetIndexOf(node) + 1;
+    size_t sibling_size = node->parent()->children().size();
     data->AddIntAttribute(ax::mojom::IntAttribute::kPosInSet,
-                          int32_t{pos_in_parent});
+                          static_cast<int32_t>(pos_in_parent));
     data->AddIntAttribute(ax::mojom::IntAttribute::kSetSize,
-                          int32_t{sibling_size});
+                          static_cast<int32_t>(sibling_size));
   }
 
   int ignored_depth;
@@ -1183,9 +1183,9 @@
 void TreeView::PaintNodeIcon(gfx::Canvas* canvas,
                              InternalNode* node,
                              const gfx::Rect& bounds) {
-  int icon_index = model_->GetIconIndex(node->model_node());
+  absl::optional<size_t> icon_index = model_->GetIconIndex(node->model_node());
   int icon_x = kArrowRegionSize + kImagePadding;
-  if (icon_index == -1) {
+  if (!icon_index.has_value()) {
     // Flip just the |bounds| region of |canvas|.
     gfx::ScopedCanvas scoped_canvas(canvas);
     canvas->Translate(gfx::Vector2d(bounds.x(), 0));
@@ -1198,7 +1198,7 @@
                  gfx::Rect(0, bounds.y(), bounds.width(), bounds.height()));
   } else {
     const gfx::ImageSkia& icon =
-        icons_[icon_index].Rasterize(GetColorProvider());
+        icons_[icon_index.value()].Rasterize(GetColorProvider());
     icon_x += (open_icon_.Size().width() - icon.width()) / 2;
     if (base::i18n::IsRTL())
       icon_x = bounds.width() - icon_x - icon.width();
@@ -1310,8 +1310,10 @@
     size_t index_in_parent = tmp_node->parent()->GetIndexOf(tmp_node);
     (*depth)++;
     row++;  // For node.
-    for (size_t i = 0; i < index_in_parent; ++i)
-      row += tmp_node->parent()->children()[i]->NumExpandedNodes();
+    for (size_t i = 0; i < index_in_parent; ++i) {
+      row += static_cast<int>(
+          tmp_node->parent()->children()[i]->NumExpandedNodes());
+    }
     tmp_node = tmp_node->parent();
   }
   if (root_shown_) {
@@ -1376,7 +1378,8 @@
       size_t row_count = GetRowCount();
       int depth = 0;
       DCHECK(row_count);
-      InternalNode* node = GetNodeByRow(row_count - 1, &depth);
+      InternalNode* node =
+          GetNodeByRow(static_cast<int>(row_count - 1), &depth);
       SetSelectedNode(node->model_node());
     } else if (root_shown_) {
       SetSelectedNode(root_.model_node());
@@ -1483,8 +1486,8 @@
   accessibility_view_ = nullptr;
 }
 
-int TreeView::InternalNode::NumExpandedNodes() const {
-  int result = 1;  // For this.
+size_t TreeView::InternalNode::NumExpandedNodes() const {
+  size_t result = 1;  // For this.
   if (!is_expanded_)
     return result;
   for (const auto& child : children())
diff --git a/ui/views/controls/tree/tree_view.h b/ui/views/controls/tree/tree_view.h
index ae210296..0367896 100644
--- a/ui/views/controls/tree/tree_view.h
+++ b/ui/views/controls/tree/tree_view.h
@@ -276,7 +276,7 @@
     int text_width() const { return text_width_; }
 
     // Returns the total number of descendants (including this node).
-    int NumExpandedNodes() const;
+    size_t NumExpandedNodes() const;
 
     // Returns the max width of all descendants (including this node). |indent|
     // is how many pixels each child is indented and |depth| is the depth of
diff --git a/ui/views/layout/flex_layout.cc b/ui/views/layout/flex_layout.cc
index 2a54df34b..652bc27 100644
--- a/ui/views/layout/flex_layout.cc
+++ b/ui/views/layout/flex_layout.cc
@@ -1107,7 +1107,7 @@
   // this priority order.
   auto it = child_list.begin();
   while (it != child_list.end()) {
-    const int child_index = *it;
+    const size_t child_index = *it;
     FlexChildData& flex_child = data.child_data[child_index];
 
     // We don't care about weighted flex in this step.
diff --git a/ui/views/layout/table_layout.cc b/ui/views/layout/table_layout.cc
index 01e1f374..e314043 100644
--- a/ui/views/layout/table_layout.cc
+++ b/ui/views/layout/table_layout.cc
@@ -109,9 +109,9 @@
 int TotalSize(size_t start, size_t length, const std::vector<T>& elements) {
   DCHECK_GT(length, 0u);
   DCHECK_LE(start + length, elements.size());
-  const auto begin = elements.cbegin() + start;
+  const auto begin = elements.cbegin() + static_cast<ptrdiff_t>(start);
   return std::accumulate(
-      begin, begin + length, 0,
+      begin, begin + static_cast<ptrdiff_t>(length), 0,
       [](int size, const auto& elem) { return size + elem.size(); });
 }
 
@@ -456,8 +456,8 @@
 
     // Construct a ViewState for this `child`.
     const gfx::Size* span = child->GetProperty(kTableColAndRowSpanKey);
-    const size_t col_span = span ? span->width() : 1;
-    const size_t row_span = span ? span->height() : 1;
+    const size_t col_span = span ? static_cast<size_t>(span->width()) : 1;
+    const size_t row_span = span ? static_cast<size_t>(span->height()) : 1;
     LayoutAlignment* const child_h_align =
         child->GetProperty(kTableHorizAlignKey);
     const LayoutAlignment h_align =
@@ -589,8 +589,9 @@
   // Determine the number of resizable rows the view touches.
   size_t start_row = view_state.start_row;
   size_t max_row = view_state.start_row + view_state.row_span;
-  const int resizable_rows =
-      std::count_if(rows_.cbegin() + start_row, rows_.cbegin() + max_row,
+  const ptrdiff_t resizable_rows =
+      std::count_if(rows_.cbegin() + static_cast<ptrdiff_t>(start_row),
+                    rows_.cbegin() + static_cast<ptrdiff_t>(max_row),
                     [](const auto& row) { return row.resizable(); });
 
   const auto adjust_row = [&height](Row& row, int delta) {
@@ -603,7 +604,7 @@
 
   if (resizable_rows > 0) {
     // There are resizable rows, give the remaining height to them.
-    int row_delta = height / resizable_rows;
+    int row_delta = height / static_cast<int>(resizable_rows);
     for (size_t i = start_row; i < max_row; ++i) {
       if (rows_[i].resizable())
         adjust_row(rows_[i], row_delta);
@@ -611,7 +612,7 @@
   } else {
     // None of the rows are resizable, divvy the remaining height up equally
     // among all rows the view touches.
-    int row_delta = height / view_state.row_span;
+    int row_delta = height / static_cast<int>(view_state.row_span);
     for (size_t i = start_row; i < max_row; ++i)
       adjust_row(rows_[i], row_delta);
     view_state.remaining_height = 0;
@@ -666,7 +667,7 @@
   } else if (pref_size_columns > 0) {
     // None of the columns are resizable, distribute the width among those
     // that use the preferred size.
-    int column_delta = width / pref_size_columns;
+    int column_delta = width / static_cast<int>(pref_size_columns);
     for (size_t i = start_col; i < max_col; ++i) {
       if (columns_[i].size_type() == ColumnSize::kUsePreferred) {
         width -= column_delta;
@@ -830,7 +831,7 @@
       if (data.available == 0) {
         data.column->set_size(data.column->size() - data.delta);
         next_iteration_total_resize -= data.column->resize();
-        resize_data.erase(resize_data.begin() + (i - 1));
+        resize_data.erase(resize_data.begin() + static_cast<ptrdiff_t>(i - 1));
       }
     }
     DCHECK_LT(next_iteration_delta, total_delta);
@@ -843,10 +844,13 @@
 }
 
 bool TableLayout::CanUseMinimum(const ViewState& view_state) const {
-  const auto begin = columns_.cbegin() + view_state.start_col;
-  return std::all_of(begin, begin + view_state.col_span, [](const auto& col) {
-    return col.resizable() && col.size_type() != ColumnSize::kFixed;
-  });
+  const auto begin =
+      columns_.cbegin() + static_cast<ptrdiff_t>(view_state.start_col);
+  return std::all_of(begin, begin + static_cast<ptrdiff_t>(view_state.col_span),
+                     [](const auto& col) {
+                       return col.resizable() &&
+                              col.size_type() != ColumnSize::kFixed;
+                     });
 }
 
 }  // namespace views
diff --git a/ui/webui/resources/cr_elements/cr_tree/cr_tree.ts b/ui/webui/resources/cr_elements/cr_tree/cr_tree.ts
index 1e2619a..52cfbab 100644
--- a/ui/webui/resources/cr_elements/cr_tree/cr_tree.ts
+++ b/ui/webui/resources/cr_elements/cr_tree/cr_tree.ts
@@ -7,7 +7,7 @@
 
 import {getTemplate} from './cr_tree.html.js';
 import {CrTreeBaseElement} from './cr_tree_base.js';
-import {SELECTED_ATTR} from './cr_tree_item.js';
+import {CrTreeItemElement, SELECTED_ATTR} from './cr_tree_item.js';
 
 /**
  * @fileoverview cr-tree is a container for a tree structure. Items can be added
@@ -84,18 +84,11 @@
    * Initializes the element.
    */
   connectedCallback() {
-    // Make list focusable
-    if (!this.hasAttribute('tabindex')) {
-      this.tabIndex = 0;
-    }
-
     if (!this.hasAttribute('role')) {
       this.setAttribute('role', 'tree');
     }
 
     this.addEventListener('keydown', this.handleKeyDown.bind(this));
-    this.addEventListener('focus', this.onFocus.bind(this));
-    this.addEventListener('blur', this.onBlur.bind(this));
   }
 
   // CrTreeBase implementation:
@@ -142,6 +135,9 @@
         if (item.id) {
           this.setAttribute('aria-activedescendant', item.id);
         }
+        if (this.matches(':focus-within') || this.shadowRoot!.activeElement) {
+          (item as CrTreeItemElement).rowElement.focus();
+        }
       } else {
         this.removeAttribute('aria-activedescendant');
       }
@@ -151,15 +147,12 @@
     }
   }
 
-  // Event handlers:
-  // TODO(rbpotter): Figure out if there is a better way to handle tree:focus
-  // and tree[icon-visibility] styles from tree.css.
-  onFocus() {
-    this.setAttribute('tree-focused', 'true');
-  }
-
-  onBlur() {
-    this.setAttribute('tree-focused', 'false');
+  override addAt(child: CrTreeBaseElement, index: number) {
+    super.addAt(child, index);
+    // aria-owns doesn't work well for the tree because the treeitem role is
+    // set on the rowElement within cr-tree-item's shadow DOM. Set the size
+    // here, so the correct number of items is read.
+    this.setAttribute('aria-setsize', this.items.length.toString());
   }
 
   /**
diff --git a/ui/webui/resources/cr_elements/cr_tree/cr_tree_base.ts b/ui/webui/resources/cr_elements/cr_tree/cr_tree_base.ts
index 4edce25..de31f92 100644
--- a/ui/webui/resources/cr_elements/cr_tree/cr_tree_base.ts
+++ b/ui/webui/resources/cr_elements/cr_tree/cr_tree_base.ts
@@ -17,14 +17,14 @@
   }
 
   static get observedAttributes() {
-    return ['icon-visibility', 'tree-focused'];
+    return ['icon-visibility'];
   }
 
   detail: object = {};
   private parent_: CrTreeBaseElement|null = null;
 
   attributeChangedCallback(name: string, _oldValue: string, newValue: string) {
-    assert(name === 'icon-visibility' || name === 'tree-focused');
+    assert(name === 'icon-visibility');
     this.items.forEach(item => item.setAttribute(name, newValue));
   }
 
diff --git a/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.html b/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.html
index b86eb43..b60246b 100644
--- a/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.html
+++ b/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.html
@@ -71,7 +71,7 @@
   }
 
   :host([selected]) .tree-row:hover,
-  :host([selected][tree-focused=true]) .tree-row {
+  :host([selected]) .tree-row:focus {
     background-color: hsl(214, 91%, 89%);
     border-color: rgb(125, 162, 206);
   }
@@ -162,9 +162,10 @@
     }
   }
 </style>
-<div class="tree-row" part="row">
+<div class="tree-row" role="treeitem" aria-owns="tree-children"
+    aria-labelledby="label">
   <span class="expand-icon"></span>
   <span class="tree-label-icon"></span>
-  <span class="tree-label"></span>
+  <span class="tree-label" id="label"></span>
 </div>
-<div class="tree-children" role="group"></div>
+<div class="tree-children" id="tree-children" role="group"></div>
diff --git a/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.ts b/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.ts
index 269e2675..870be682 100644
--- a/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.ts
+++ b/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.ts
@@ -49,14 +49,13 @@
 
   private label_: string = '';
   private depth_: number = 0;
+  private rowElement_: HTMLElement|null = null;
 
   connectedCallback() {
-    const labelId =
-        'tree-item-label-autogen-id-' + treeItemAutoGeneratedIdCounter++;
-    this.labelElement.id = labelId;
-    this.setAttribute('aria-labelledby', labelId);
+    this.id = 'tree-item-autogen-id-' + treeItemAutoGeneratedIdCounter++;
     this.labelElement.textContent = this.label_;
     this.toggleAttribute(SELECTED_ATTR, false);
+    this.rowElement.setAttribute('aria-selected', 'false');
     this.addEventListener('click', this.handleClick.bind(this));
     this.addEventListener('mousedown', this.handleMouseDown.bind(this));
     this.addEventListener('dblclick', this.handleDblClick.bind(this));
@@ -80,21 +79,30 @@
   }
 
   private onSelectedChange_(selected: boolean) {
+    const rowElement = this.rowElement;
     if (selected) {
+      rowElement.setAttribute('tabIndex', '0');
       this.reveal();
       this.labelElement.scrollIntoViewIfNeeded();
       if (this.tree) {
         this.tree.selectedItem = this;
       }
+      rowElement.setAttribute('aria-selected', 'true');
     } else if (this.tree && this.tree.selectedItem === this) {
       this.tree.selectedItem = null;
+      rowElement.setAttribute('aria-selected', 'false');
+      rowElement.setAttribute('tabIndex', '-1');
+    } else {
+      rowElement.setAttribute('aria-selected', 'false');
+      rowElement.setAttribute('tabIndex', '-1');
     }
   }
 
   private onExpandedChange_(expanded: boolean) {
+    const rowElement = this.rowElement;
     if (expanded) {
       if (this.hasAttribute(MAY_HAVE_CHILDREN_ATTR)) {
-        this.setAttribute('aria-expanded', 'true');
+        rowElement.setAttribute('aria-expanded', 'true');
         this.dispatchEvent(new CustomEvent(
             'cr-tree-item-expand',
             {bubbles: true, composed: true, detail: true}));
@@ -109,9 +117,9 @@
       }
     }
     if (this.hasAttribute(MAY_HAVE_CHILDREN_ATTR)) {
-      this.setAttribute('aria-expanded', 'false');
+      rowElement.setAttribute('aria-expanded', 'false');
     } else {
-      this.removeAttribute('aria-expanded');
+      rowElement.removeAttribute('aria-expanded');
     }
     this.dispatchEvent(new CustomEvent(
         'cr-tree-item-collapse',
@@ -129,6 +137,7 @@
       const row = this.shadowRoot!.querySelector<HTMLElement>('.tree-row');
       assert(row);
       row.style.paddingInlineStart = rowDepth * INDENT_PX + 'px';
+      this.rowElement.setAttribute('aria-level', depth.toString());
       this.depth_ = depth;
       this.items.forEach(item => item.depth = depth + 1);
     }
@@ -159,7 +168,7 @@
     super.setHasChildren(hasChildren);
     if (hasChildren) {
       this.toggleAttribute(MAY_HAVE_CHILDREN_ATTR, true);
-      this.toggleAttribute('aria-expanded', this.expanded);
+      this.rowElement.toggleAttribute('aria-expanded', this.expanded);
     }
   }
 
@@ -222,9 +231,12 @@
   }
 
   get rowElement(): HTMLElement {
-    const rowEl = this.shadowRoot!.querySelector<HTMLElement>('.tree-row');
-    assert(rowEl);
-    return rowEl;
+    if (!this.rowElement_) {
+      this.rowElement_ =
+          this.shadowRoot!.querySelector<HTMLElement>('.tree-row');
+    }
+    assert(this.rowElement_);
+    return this.rowElement_;
   }
 
   /**