diff --git a/AUTHORS b/AUTHORS
index 72dfb77..3b1e5a31 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1590,6 +1590,7 @@
 Yuvanesh Natarajan <yuvanesh.n1@samsung.com>
 Zach Bjornson <zbbjornson@gmail.com>
 Zachary Capalbo <zach.geek@gmail.com>
+Zehan Li <synclzhhans@gmail.com>
 Zeno Albisser <zeno.albisser@digia.com>
 Zeqin Chen <talonchen@tencent.com>
 Zhanbang He <hezhanbang@gmail.com>
diff --git a/DEPS b/DEPS
index 46f9586..cbae77f 100644
--- a/DEPS
+++ b/DEPS
@@ -236,7 +236,7 @@
   #
   # CQ_INCLUDE_TRYBOTS=luci.chrome.try:lacros-amd64-generic-chrome-skylab
   # CQ_INCLUDE_TRYBOTS=luci.chrome.try:lacros-arm-generic-chrome-skylab
-  'lacros_sdk_version': '16023.0.0-1062828',
+  'lacros_sdk_version': '16026.0.0-1062924',
 
   # Generate location tag metadata to include in tests result data uploaded
   # to ResultDB. This isn't needed on some configs and the tool that generates
@@ -300,19 +300,19 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'src_internal_revision': 'a8d0d660e4e573f811962bfaeb3437067efd8d24',
+  'src_internal_revision': 'ca63fcaf7e7371805b35b08795cf529fae9fad80',
   # 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': 'c62380453c7269b528f6965e75d86b06b3418b86',
+  'skia_revision': '4815ec808aa5a80da74feafa651c262cfdf7e5b9',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '00eda7279f265f2a645ef0256059b583209075af',
+  'v8_revision': '5172b5da4316bd2e96fa1d3b962c6cf6782109be',
   # 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': '20b66890c9dbfbc17b31f62dde687ab104220e2e',
+  'angle_revision': 'd40d1a678bf857004273430b0b2137fd79921d86',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -380,7 +380,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
-  'crossbench_revision': '2dd4d6981c433ab7492612bdd9ce1ca7e8020692',
+  'crossbench_revision': '4759a97e9e355f2272bbc0a23c0e898605cfee71',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -396,7 +396,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': '3f7ce199f9933cd833d540816cbbd2d18f7ee82e',
+  'devtools_frontend_revision': 'd48cc94a9390f071930395fa2821dfbab8346c92',
   # 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.
@@ -420,7 +420,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': 'fc3f2e6f80bc245a8777d5b7dd6ff7f99761283d',
+  'dawn_revision': 'bda245ad94fff1d511f0e3425501e1f5e811918a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -1287,7 +1287,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    '4b3a741b66f813fd8071530c4508b10cc1b9423d',
+    '510ef651e3e8e9c22d0a5de4781705e110c5f7dd',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -1430,7 +1430,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'voAce056Hap1DwN0J5LHIYIfa4h0s5UidH22JwVjf_oC',
+          'version': 'O6xtklrnuuDKGxYwysxYzU7fNkVdoulFOyXlzjOHDhQC',
       },
     ],
     'condition': 'checkout_android and non_git_source',
@@ -1501,7 +1501,7 @@
       'packages': [
           {
                'package': 'chromium/third_party/android_build_tools/error_prone',
-               'version': 'YYa_g0mrETe0GrN2UsP2xRXNjCb1udBz0c7yp0WFiOkC',
+               'version': 'iksKTcNa8fCfCXLvYa9Og9yhPWH8iTk7xbESPSw243QC',
           },
       ],
       'condition': 'checkout_android and non_git_source',
@@ -1523,7 +1523,7 @@
       'packages': [
           {
                'package': 'chromium/third_party/android_build_tools/lint',
-               'version': '0j6PgTJxbBi5tTD1TAeLuyhU5iSUjgiXdpEhVCDtxC4C',
+               'version': '0NjBV6ny4NFaPqwbcGq1QIWTxKd77cPGUBMo_piBTn0C',
           },
       ],
       'condition': 'checkout_android and non_git_source',
@@ -1534,7 +1534,7 @@
       'packages': [
           {
                'package': 'chromium/third_party/android_build_tools/manifest_merger',
-               'version': '2bcaX6fJS6WildBm3bMUKnbKuGk-TIiSBKQ9P9Q4O18C',
+               'version': 'sa8Vo-ZxAsdWEoHTyymObnW4P7_yyEc7_fIpOF0A8VYC',
           },
       ],
       'condition': 'checkout_android and non_git_source',
@@ -1766,7 +1766,7 @@
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
 
   'src/third_party/devtools-frontend-internal': {
-      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + 'a09d12b0b37bd89cb583a7b9ae09f74a0a234669',
+      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '4b9aa182a530cecd10387e6feb4e0e00c66b9b12',
     'condition': 'checkout_src_internal',
   },
 
@@ -2001,7 +2001,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/kotlin_stdlib',
-              'version': 'LMJjbmSFmDJZv0uq8bqoMKAipQ-s3tkZ2SEDyagW3L8C',
+              'version': 'b48PGccyaRl9kI3MLdJ36I-z5Zcj9NOCjsUg02Bl-EIC',
           },
       ],
       'condition': 'checkout_android and non_git_source',
@@ -2252,7 +2252,7 @@
     Var('pdfium_git') + '/pdfium.git' + '@' +  Var('pdfium_revision'),
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'bea7f2f92cb9ecf6923ecea52120c312840494a0',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '7eb1a22d053b93c127020cf373d14d4e2ad8b805',
 
   'src/base/tracing/test/data': {
     'bucket': 'perfetto',
@@ -4299,7 +4299,7 @@
 
   'src/components/autofill/core/browser/form_parsing/internal_resources': {
       'url': Var('chrome_git') + '/chrome/components/autofill_regex_patterns.git' + '@' +
-        '8d1f2ac92088e96479b7c81f5e7f56abce5e0152',
+        '47aa652f62d6b1a3f0f3cffb2b1327ef6f4caf14',
       'condition': 'checkout_src_internal',
   },
 
@@ -4382,7 +4382,7 @@
 
   'src/ios_internal':  {
       'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' +
-        '0b6564166940fa48dc3a219f6d4eda6e3188f8e3',
+        '2091388e503d97e226e4033bd616b11f5c2e19c8',
       'condition': 'checkout_ios and checkout_src_internal',
   },
 
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwPermissionQueryApiTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwPermissionQueryApiTest.java
index 87b64c1..de3c870b 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwPermissionQueryApiTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwPermissionQueryApiTest.java
@@ -17,13 +17,14 @@
 
 import org.chromium.android_webview.AwContents;
 import org.chromium.android_webview.AwGeolocationPermissions;
+import org.chromium.android_webview.common.AwFeatures;
 import org.chromium.android_webview.test.TestWebMessageListener.Data;
 import org.chromium.android_webview.test.util.CommonResources;
 import org.chromium.base.ResettersForTesting;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.test.util.Batch;
-import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
+import org.chromium.base.test.util.Features;
 import org.chromium.content_public.common.ContentFeatures;
 import org.chromium.device.geolocation.LocationProviderOverrider;
 import org.chromium.device.geolocation.MockLocationProvider;
@@ -39,7 +40,7 @@
  */
 @RunWith(Parameterized.class)
 @UseParametersRunnerFactory(AwJUnit4ClassRunnerWithParameters.Factory.class)
-@CommandLineFlags.Add({"enable-features=" + ContentFeatures.WEB_PERMISSIONS_API})
+@Features.EnableFeatures({ContentFeatures.WEB_PERMISSIONS_API, AwFeatures.WEBVIEW_AUTO_SAA})
 @Batch(Batch.PER_CLASS)
 public class AwPermissionQueryApiTest extends AwParameterizedTest {
 
@@ -185,6 +186,12 @@
         runTestCase("geolocation", "prompt");
         runTestCase("microphone", "prompt");
         runTestCase("midi-sysex", "prompt", "{\"name\": \"midi\", \"sysex\": true}");
+        runTestCase("storage-access", "prompt");
+        runTestCase(
+                "top-level-storage-access",
+                "prompt",
+                "{\"name\": \"top-level-storage-access\", \"requestedOrigin\":"
+                        + " \"https://example.com\"}");
     }
 
     @Test
@@ -198,7 +205,6 @@
         runTestCase("payment-handler", "denied");
         runTestCase("persistent-storage", "denied");
         runTestCase("screen-wake-lock", "denied");
-        runTestCase("storage-access", "denied");
         runTestCase("window-management", "denied");
         runTestCase("background-fetch", "denied");
         runTestCase("screen-wake-lock", "denied");
@@ -208,11 +214,6 @@
         runTestCase("periodic-background-sync", "denied");
         runTestCase("keyboard-lock", "denied");
         runTestCase("push", "denied", "{\"name\": \"push\", \"userVisibleOnly\": true}");
-        runTestCase(
-                "top-level-storage-access",
-                "denied",
-                "{\"name\": \"top-level-storage-access\", \"requestedOrigin\":"
-                        + " \"https://example.com\"}");
         runTestCase("pointer-lock", "denied");
         runTestCase(
                 "fullscreen",
diff --git a/ash/accelerators/keyboard_code_util.cc b/ash/accelerators/keyboard_code_util.cc
index dec8d1c5..9cffdb30 100644
--- a/ash/accelerators/keyboard_code_util.cc
+++ b/ash/accelerators/keyboard_code_util.cc
@@ -140,6 +140,8 @@
       return &ash::kKsvArrowLeftIcon;
     case ui::VKEY_RIGHT:
       return &ash::kKsvArrowRightIcon;
+    case ui::VKEY_ACCESSIBILITY:
+      return &ash::kKsAccessibilityIcon;
     case ui::VKEY_PRIVACY_SCREEN_TOGGLE:
       return &ash::kKsvPrivacyScreenToggleIcon;
     case ui::VKEY_SNAPSHOT:
diff --git a/ash/public/cpp/app_list/app_list_types.cc b/ash/public/cpp/app_list/app_list_types.cc
index d3df1d3..601da86 100644
--- a/ash/public/cpp/app_list/app_list_types.cc
+++ b/ash/public/cpp/app_list/app_list_types.cc
@@ -528,6 +528,9 @@
       return &kKsKeyboardBrightnessUpIcon;
     case kKeyboardShortcutKeyboardBacklightToggle:
       return &kKsKeyboardBrightnessToggleIcon;
+    // Accessibility.
+    case kKeyboardShortcutAccessibility:
+      return &kKsAccessibilityIcon;
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
     case kKeyboardShortcutKeyboardRightAlt:
       return &kRightAltInternalIcon;
diff --git a/ash/public/cpp/app_list/app_list_types.h b/ash/public/cpp/app_list/app_list_types.h
index e6f658f..394ad69 100644
--- a/ash/public/cpp/app_list/app_list_types.h
+++ b/ash/public/cpp/app_list/app_list_types.h
@@ -685,6 +685,7 @@
     kKeyboardShortcutKeyboardBrightnessDown,
     kKeyboardShortcutKeyboardBrightnessUp,
     kKeyboardShortcutKeyboardRightAlt,
+    kKeyboardShortcutAccessibility,
   };
 
   // Only used for SearchResultTextItemType kString
diff --git a/ash/public/cpp/external_arc/message_center/arc_notification_content_view.cc b/ash/public/cpp/external_arc/message_center/arc_notification_content_view.cc
index 06b6897..7d25998 100644
--- a/ash/public/cpp/external_arc/message_center/arc_notification_content_view.cc
+++ b/ash/public/cpp/external_arc/message_center/arc_notification_content_view.cc
@@ -310,6 +310,7 @@
       OnNotificationSurfaceAdded(surface);
   }
 
+  UpdateAccessibleRole();
   // Creates the control_buttons_view_, which collects all control buttons into
   // a horizontal box.
   control_buttons_view_.set_owned_by_client();
@@ -321,8 +322,6 @@
   // See the comment in this method and --show-overdraw-feedback for detail.
   layer()->SetFillsBoundsOpaquely(false);
   UpdatePreferredSize();
-
-  UpdateAccessibleRole();
 }
 
 ArcNotificationContentView::~ArcNotificationContentView() {
@@ -347,7 +346,8 @@
       notification.should_show_snooze_button());
   UpdateControlButtonsVisibility();
 
-  accessible_name_ = message_view_->CreateAccessibleName(notification);
+  GetViewAccessibility().SetName(
+      message_view_->CreateAccessibleName(notification));
   UpdateSnapshot();
 }
 
@@ -836,7 +836,6 @@
         l10n_util::GetStringUTF8(
             IDS_MESSAGE_NOTIFICATION_SETTINGS_BUTTON_ACCESSIBLE_NAME));
   }
-  node_data->SetNameChecked(accessible_name_);
 }
 
 void ArcNotificationContentView::OnAccessibilityEvent(ax::mojom::Event event) {
diff --git a/ash/public/cpp/external_arc/message_center/arc_notification_content_view.h b/ash/public/cpp/external_arc/message_center/arc_notification_content_view.h
index f460392..5a32c42e4 100644
--- a/ash/public/cpp/external_arc/message_center/arc_notification_content_view.h
+++ b/ash/public/cpp/external_arc/message_center/arc_notification_content_view.h
@@ -203,8 +203,6 @@
   // Widget which this view tree is currently attached to.
   raw_ptr<views::Widget> attached_widget_ = nullptr;
 
-  std::u16string accessible_name_;
-
   // If it's true, the surface gets active when attached to this view.
   bool activate_on_attach_ = false;
 
diff --git a/ash/public/cpp/external_arc/message_center/arc_notification_content_view_unittest.cc b/ash/public/cpp/external_arc/message_center/arc_notification_content_view_unittest.cc
index 7ade07c..d657b9d 100644
--- a/ash/public/cpp/external_arc/message_center/arc_notification_content_view_unittest.cc
+++ b/ash/public/cpp/external_arc/message_center/arc_notification_content_view_unittest.cc
@@ -823,6 +823,20 @@
   content_view->GetViewAccessibility().GetAccessibleNodeData(&data);
   EXPECT_EQ(data.role, ax::mojom::Role::kButton);
 
+  auto notification_message = std::make_unique<Notification>(
+      message_center::NOTIFICATION_TYPE_SIMPLE,
+      notification_item->GetNotificationId(), u"item_title", u"item_message",
+      ui::ImageModel(), u"arc", GURL(),
+      message_center::NotifierId(message_center::NotifierType::ARC_APPLICATION,
+                                 "ARC_NOTIFICATION"),
+      message_center::RichNotificationData(), nullptr);
+
+  content_view->Update(*notification_message);
+  data = ui::AXNodeData();
+  content_view->GetViewAccessibility().GetAccessibleNodeData(&data);
+
+  EXPECT_EQ(u"item_title\nitem_message",
+            data.GetString16Attribute(ax::mojom::StringAttribute::kName));
   CloseNotificationView();
 }
 
diff --git a/ash/resources/vector_icons/BUILD.gn b/ash/resources/vector_icons/BUILD.gn
index 25ae777..fc2aa27 100644
--- a/ash/resources/vector_icons/BUILD.gn
+++ b/ash/resources/vector_icons/BUILD.gn
@@ -184,6 +184,7 @@
     "ime_menu_on_screen_keyboard.icon",
     "ime_menu_write.icon",
     "ink_pen.icon",
+    "ks_accessibility.icon",
     "ks_all_apps.icon",
     "ks_assistant.icon",
     "ks_browser_search.icon",
diff --git a/ash/resources/vector_icons/ks_accessibility.icon b/ash/resources/vector_icons/ks_accessibility.icon
new file mode 100644
index 0000000..c74b8ba1
--- /dev/null
+++ b/ash/resources/vector_icons/ks_accessibility.icon
@@ -0,0 +1,30 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 20,
+FILL_RULE_NONZERO,
+MOVE_TO, 10, 5.46f,
+R_ARC_TO, 1.8f, 1.8f, 0, 0, 1, -1.29f, -0.52f,
+R_ARC_TO, 1.79f, 1.79f, 0, 0, 1, -0.54f, -1.31f,
+R_CUBIC_TO, 0, -0.5f, 0.18f, -0.92f, 0.54f, -1.27f,
+ARC_TO, 1.76f, 1.76f, 0, 0, 1, 10, 1.81f,
+R_CUBIC_TO, 0.5f, 0, 0.93f, 0.18f, 1.29f, 0.54f,
+R_CUBIC_TO, 0.36f, 0.35f, 0.54f, 0.78f, 0.54f, 1.29f,
+R_CUBIC_TO, 0, 0.5f, -0.18f, 0.93f, -0.54f, 1.29f,
+R_ARC_TO, 1.8f, 1.8f, 0, 0, 1, -1.29f, 0.52f,
+CLOSE,
+MOVE_TO, 7.42f, 17.81f,
+V_LINE_TO, 8.38f,
+H_LINE_TO, 3,
+V_LINE_TO, 6.71f,
+R_H_LINE_TO, 14,
+R_V_LINE_TO, 1.67f,
+R_H_LINE_TO, -4.42f,
+R_V_LINE_TO, 9.44f,
+R_H_LINE_TO, -1.65f,
+R_LINE_TO, -0.19f, -4.65f,
+H_LINE_TO, 9.27f,
+R_LINE_TO, -0.21f, 4.65f,
+H_LINE_TO, 7.42f,
+CLOSE
diff --git a/ash/webui/recorder_app_ui/resources/components/cra/cra-icon-button.ts b/ash/webui/recorder_app_ui/resources/components/cra/cra-icon-button.ts
index 111c6b2..394cfc6 100644
--- a/ash/webui/recorder_app_ui/resources/components/cra/cra-icon-button.ts
+++ b/ash/webui/recorder_app_ui/resources/components/cra/cra-icon-button.ts
@@ -67,6 +67,25 @@
       }
     `,
   ];
+
+  get buttonElement(): HTMLElement|null {
+    return (
+      this.shadowRoot?.querySelector('md-icon-button') ??
+      this.shadowRoot?.querySelector('md-filled-icon-button') ??
+      this.shadowRoot?.querySelector('md-filled-tonal-icon-button') ?? null
+    );
+  }
+
+  override focus(): void {
+    // Need to manually delegate the focus() call to the inner button,
+    // otherwise the :focus-visible state won't be correct and the focus ring
+    // would always be shown.
+    this.buttonElement?.focus();
+  }
+
+  override blur(): void {
+    this.buttonElement?.blur();
+  }
 }
 
 window.customElements.define('cra-icon-button', CraIconButton);
diff --git a/ash/webui/recorder_app_ui/resources/components/recording-file-list-item.ts b/ash/webui/recorder_app_ui/resources/components/recording-file-list-item.ts
index f590d9a..dc05e101 100644
--- a/ash/webui/recorder_app_ui/resources/components/recording-file-list-item.ts
+++ b/ash/webui/recorder_app_ui/resources/components/recording-file-list-item.ts
@@ -464,6 +464,7 @@
           <cra-icon-button
             buttonstyle="floating"
             ?disabled=${!this.menuShown.value}
+            aria-hidden=${!this.menuShown.value}
             @click=${this.onShowRecordingInfoClick}
             aria-label=${i18n.playbackMenuShowDetailOption}
           >
@@ -472,6 +473,7 @@
           <cra-icon-button
             buttonstyle="floating"
             ?disabled=${!this.menuShown.value}
+            aria-hidden=${!this.menuShown.value}
             @click=${this.onExportRecordingClick}
             aria-label=${i18n.playbackMenuExportOption}
           >
@@ -480,6 +482,7 @@
           <cra-icon-button
             buttonstyle="floating"
             ?disabled=${!this.menuShown.value}
+            aria-hidden=${!this.menuShown.value}
             @click=${this.onDeleteRecordingClick}
             aria-label=${i18n.playbackMenuDeleteOption}
           >
diff --git a/ash/webui/recorder_app_ui/resources/components/recording-search-box.ts b/ash/webui/recorder_app_ui/resources/components/recording-search-box.ts
index 71e679e..c0c19a7 100644
--- a/ash/webui/recorder_app_ui/resources/components/recording-search-box.ts
+++ b/ash/webui/recorder_app_ui/resources/components/recording-search-box.ts
@@ -22,20 +22,35 @@
 import {ReactiveLitElement} from '../core/reactive/lit.js';
 import {computed, signal} from '../core/reactive/signal.js';
 import {assertExists} from '../core/utils/assert.js';
+import {AsyncJobQueue} from '../core/utils/async_job_queue.js';
+
+import {CraIconButton} from './cra/cra-icon-button.js';
 
 export class RecordingSearchBox extends ReactiveLitElement {
   static override styles = css`
+    :host {
+      --icon-button-width: 48px;
+      --textfield-width: 224px;
+    }
+
     #container {
       align-items: center;
       display: flex;
 
       & > cra-icon-button {
-        transition: visibility 200ms step-end allow-discrete;
+        transition:
+          opacity 150ms 50ms var(--cros-ref-motion-easing-standard-decelerate),
+          transform 200ms var(--cros-ref-motion-easing-standard);
       }
 
       &.opened > cra-icon-button {
-        transition: visibility 200ms step-start allow-discrete;
-        visibility: hidden;
+        opacity: 0;
+        transform: translateX(
+          calc(-1 * (var(--textfield-width) - var(--icon-button-width)))
+        );
+        transition:
+          opacity 50ms var(--cros-ref-motion-easing-standard-accelerate),
+          transform 200ms var(--cros-ref-motion-easing-standard);
       }
     }
 
@@ -55,15 +70,15 @@
        */
       opacity: 0;
       transition:
-        width 200ms ease,
-        opacity 200ms step-end;
+        opacity 50ms var(--cros-ref-motion-easing-standard-accelerate),
+        width 200ms var(--cros-ref-motion-easing-standard);
       width: 48px;
 
       #container.opened & {
         opacity: 1;
         transition:
-          width 200ms ease,
-          opacity 200ms step-start;
+          opacity 150ms 50ms var(--cros-ref-motion-easing-standard-decelerate),
+          width 200ms var(--cros-ref-motion-easing-standard);
         width: 224px;
       }
     }
@@ -77,15 +92,22 @@
     () => this.opened.value && this.query.value.trim().length !== 0,
   );
 
-  private readonly textFieldRef = createRef<Textfield>();
+  private readonly textfieldRef = createRef<Textfield>();
 
-  private async openSearchBox() {
+  private readonly searchButtonRef = createRef<CraIconButton>();
+
+  private readonly autofocusQueue = new AsyncJobQueue('keepLatest');
+
+  private openSearchBox() {
     this.opened.value = true;
-    // Similar to recording-title, it requires 3 updates for focus to work.
-    await this.updateComplete;
-    await this.updateComplete;
-    await this.updateComplete;
-    this.textFieldRef.value?.focusTextfield();
+    const textfield = assertExists(this.textfieldRef.value);
+    this.autofocusQueue.push(async () => {
+      // Wait for self update so the disabled state is updated on the textfield,
+      // and the textfield to update so the underlying textfield is focusable.
+      await this.updateComplete;
+      await textfield.updateComplete;
+      textfield.focusTextfield();
+    });
   }
 
   private updateQuery(newQuery: string) {
@@ -95,14 +117,22 @@
 
   private clearSearchBox() {
     this.updateQuery('');
-    if (this.textFieldRef.value !== undefined) {
-      this.textFieldRef.value.value = '';
+    if (this.textfieldRef.value !== undefined) {
+      this.textfieldRef.value.value = '';
     }
   }
 
   private closeSearchBox() {
     this.opened.value = false;
     this.clearSearchBox();
+    const searchButton = assertExists(this.searchButtonRef.value);
+    this.autofocusQueue.push(async () => {
+      // Wait for self update so the disabled state is updated on the search
+      // button, and the button to update so it's focusable.
+      await this.updateComplete;
+      await searchButton.updateComplete;
+      searchButton.focus();
+    });
   }
 
   private onFocusOut() {
@@ -123,14 +153,17 @@
   }
 
   private onInputUpdated() {
-    this.updateQuery(assertExists(this.textFieldRef.value).value);
+    this.updateQuery(assertExists(this.textfieldRef.value).value);
   }
 
   override render(): RenderResult {
     const searchButton = html`<cra-icon-button
       buttonstyle="floating"
       @click=${this.openSearchBox}
+      ?disabled=${this.opened.value}
+      aria-hidden=${this.opened.value}
       aria-label=${i18n.recordingListSearchButtonTooltip}
+      ${ref(this.searchButtonRef)}
     >
       <cra-icon slot="icon" name="search"></cra-icon>
     </cra-icon-button>`;
@@ -152,13 +185,14 @@
     // after the transition is completed.
     const searchBox = html`<cros-textfield
       ?disabled=${!this.opened.value}
+      aria-hidden=${!this.opened.value}
       placeholder=${i18n.recordingListSearchBoxPlaceholder}
       shaded
       type="text"
       @focusout=${this.onFocusOut}
       @keydown=${this.onKeyDown}
       @input=${this.onInputUpdated}
-      ${ref(this.textFieldRef)}
+      ${ref(this.textfieldRef)}
     >
       <cra-icon-button
         ?disabled=${!this.opened.value}
diff --git a/base/check.h b/base/check.h
index 217ffaf0..6c1e329 100644
--- a/base/check.h
+++ b/base/check.h
@@ -208,7 +208,7 @@
 #if defined(OFFICIAL_BUILD) && !DCHECK_IS_ON()
 // Note that this uses IMMEDIATE_CRASH_ALWAYS_INLINE to force-inline in debug
 // mode as well. See LoggingTest.CheckCausesDistinctBreakpoints.
-[[noreturn]] IMMEDIATE_CRASH_ALWAYS_INLINE void CheckFailure() {
+[[noreturn]] NOMERGE IMMEDIATE_CRASH_ALWAYS_INLINE void CheckFailure() {
   base::ImmediateCrash();
 }
 
diff --git a/base/notreached.h b/base/notreached.h
index 9591c6c..7a490ac 100644
--- a/base/notreached.h
+++ b/base/notreached.h
@@ -7,6 +7,7 @@
 
 #include "base/base_export.h"
 #include "base/check.h"
+#include "base/compiler_specific.h"
 #include "base/dcheck_is_on.h"
 #include "base/logging_buildflags.h"
 
@@ -36,7 +37,7 @@
 // This function is used to be able to detect NOTREACHED() failures in stack
 // traces where this symbol is preserved (even if inlined). Its implementation
 // matches logging::CheckFailure() but intentionally uses a different signature.
-[[noreturn]] IMMEDIATE_CRASH_ALWAYS_INLINE void NotReachedFailure() {
+[[noreturn]] NOMERGE IMMEDIATE_CRASH_ALWAYS_INLINE void NotReachedFailure() {
   base::ImmediateCrash();
 }
 
diff --git a/base/time/time_win.cc b/base/time/time_win.cc
index e6a0fe22..c2d4e3b3 100644
--- a/base/time/time_win.cc
+++ b/base/time/time_win.cc
@@ -553,8 +553,8 @@
   // counter will cause Windows to provide an alternate QPC implementation that
   // works, but is expensive to use.
   //
-  // Otherwise, Now uses the high-resolution QPC clock. As of 21 August 2015,
-  // ~72% of users fall within this category.
+  // Otherwise, Now uses the high-resolution QPC clock. As of 9 September 2024,
+  // ~97% of users fall within this category.
   CPU cpu;
   const TimeTicksNowFunction now_function =
       (ticks_per_sec.QuadPart <= 0 || !cpu.has_non_stop_time_stamp_counter())
diff --git a/build/android/pylib/local/device/local_device_gtest_run.py b/build/android/pylib/local/device/local_device_gtest_run.py
index 47379b0e..e497860 100644
--- a/build/android/pylib/local/device/local_device_gtest_run.py
+++ b/build/android/pylib/local/device/local_device_gtest_run.py
@@ -31,6 +31,7 @@
 from pylib.local.device import local_device_test_run
 from pylib.symbols import stack_symbolizer
 from pylib.utils import code_coverage_utils
+from pylib.utils import device_dependencies
 from pylib.utils import google_storage_helper
 from pylib.utils import logdog_helper
 from py_trace_event import trace_event
@@ -456,19 +457,18 @@
         device_root = self._delegate.GetTestDataRoot(dev)
         if self._env.force_main_user:
           device_root = dev.ResolveSpecialPath(device_root)
-        host_device_tuples_substituted = [
-            (h, local_device_test_run.SubstituteDeviceRoot(d, device_root))
-            for h, d in host_device_tuples]
+        resolved_host_device_tuples = device_dependencies.SubstituteDeviceRoot(
+            host_device_tuples, device_root)
         dev.PlaceNomediaFile(device_root)
         dev.PushChangedFiles(
-            host_device_tuples_substituted,
+            resolved_host_device_tuples,
             delete_device_stale=True,
             as_root=self._env.force_main_user,
             # Some gtest suites, e.g. unit_tests, have data dependencies that
             # can take longer than the default timeout to push. See
             # crbug.com/791632 for context.
             timeout=600 * math.ceil(_GetDeviceTimeoutMultiplier() / 10))
-        if not host_device_tuples:
+        if not resolved_host_device_tuples:
           dev.RemovePath(device_root,
                          force=True,
                          recursive=True,
diff --git a/build/android/pylib/local/device/local_device_instrumentation_test_run.py b/build/android/pylib/local/device/local_device_instrumentation_test_run.py
index d36cc50cc..ab7f477 100644
--- a/build/android/pylib/local/device/local_device_instrumentation_test_run.py
+++ b/build/android/pylib/local/device/local_device_instrumentation_test_run.py
@@ -41,9 +41,9 @@
 from pylib.symbols import stack_symbolizer
 from pylib.utils import chrome_proxy_utils
 from pylib.utils import code_coverage_utils
+from pylib.utils import device_dependencies
 from pylib.utils import gold_utils
 from pylib.utils import instrumentation_tracing
-from pylib.utils.device_dependencies import DevicePathComponentsFor
 from py_trace_event import trace_event
 from py_trace_event import trace_time
 from py_utils import contextlib_ext
@@ -579,18 +579,16 @@
         # commands. Don't resolve if the path is passed to app through flags.
         if self._env.force_main_user:
           device_root = device.ResolveSpecialPath(device_root)
-        host_device_tuples_substituted = [
-            (h, local_device_test_run.SubstituteDeviceRoot(d, device_root))
-            for h, d in host_device_tuples
-        ]
+        resolved_host_device_tuples = device_dependencies.SubstituteDeviceRoot(
+            host_device_tuples, device_root)
         logging.info('Pushing data dependencies.')
-        for h, d in host_device_tuples_substituted:
+        for h, d in resolved_host_device_tuples:
           logging.debug('  %r -> %r', h, d)
         dev.PlaceNomediaFile(device_root)
-        dev.PushChangedFiles(host_device_tuples_substituted,
+        dev.PushChangedFiles(resolved_host_device_tuples,
                              delete_device_stale=True,
                              as_root=self._env.force_main_user)
-        if not host_device_tuples_substituted:
+        if not resolved_host_device_tuples:
           dev.RunShellCommand(['rm', '-rf', device_root],
                               check_return=True,
                               as_root=self._env.force_main_user)
@@ -607,8 +605,9 @@
           webview_flags.append('--webview-verbose-logging')
 
         def _get_variations_seed_path_arg(seed_path):
-          seed_path_components = DevicePathComponentsFor(seed_path)
-          test_seed_path = local_device_test_run.SubstituteDeviceRoot(
+          seed_path_components = device_dependencies.DevicePathComponentsFor(
+              seed_path)
+          test_seed_path = device_dependencies.SubstituteDeviceRootSingle(
               seed_path_components, test_data_root_dir)
           return '--variations-test-seed-path={0}'.format(test_seed_path)
 
diff --git a/build/android/pylib/local/device/local_device_test_run.py b/build/android/pylib/local/device/local_device_test_run.py
index 0c03897..add1ea61 100644
--- a/build/android/pylib/local/device/local_device_test_run.py
+++ b/build/android/pylib/local/device/local_device_test_run.py
@@ -5,7 +5,7 @@
 import fnmatch
 import hashlib
 import logging
-import posixpath
+import os
 import signal
 try:
   import _thread as thread
@@ -23,6 +23,7 @@
 from pylib.base import test_collection
 from pylib.base import test_exception
 from pylib.base import test_run
+from pylib.utils import device_dependencies
 from pylib.local.device import local_device_environment
 
 from lib.proto import exception_recorder
@@ -33,14 +34,6 @@
   '  Your test may not have run.')
 
 
-def SubstituteDeviceRoot(device_path, device_root):
-  if not device_path:
-    return device_root
-  if isinstance(device_path, list):
-    return posixpath.join(*(p if p else device_root for p in device_path))
-  return device_path
-
-
 class TestsTerminated(Exception):
   pass
 
@@ -382,6 +375,16 @@
     ret.sort()
     return ret
 
+  def GetDataDepsForListing(self):
+    device_root = '$CHROMIUM_TESTS_ROOT'
+    host_device_tuples = self._test_instance.GetDataDependencies()
+    host_device_tuples = device_dependencies.SubstituteDeviceRoot(
+        host_device_tuples, device_root)
+    host_device_tuples = device_dependencies.ExpandDataDependencies(
+        host_device_tuples)
+
+    return sorted(f'{d} <- {os.path.relpath(h)}' for h, d in host_device_tuples)
+
   def _GetTests(self):
     raise NotImplementedError
 
diff --git a/build/android/pylib/local/device/local_device_test_run_test.py b/build/android/pylib/local/device/local_device_test_run_test.py
index 5f0068a..f77ec6b 100755
--- a/build/android/pylib/local/device/local_device_test_run_test.py
+++ b/build/android/pylib/local/device/local_device_test_run_test.py
@@ -14,32 +14,6 @@
 import mock  # pylint: disable=import-error
 
 
-class SubstituteDeviceRootTest(unittest.TestCase):
-
-  def testNoneDevicePath(self):
-    self.assertEqual(
-        '/fake/device/root',
-        local_device_test_run.SubstituteDeviceRoot(None, '/fake/device/root'))
-
-  def testStringDevicePath(self):
-    self.assertEqual(
-        '/another/fake/device/path',
-        local_device_test_run.SubstituteDeviceRoot('/another/fake/device/path',
-                                                   '/fake/device/root'))
-
-  def testListWithNoneDevicePath(self):
-    self.assertEqual(
-        '/fake/device/root/subpath',
-        local_device_test_run.SubstituteDeviceRoot([None, 'subpath'],
-                                                   '/fake/device/root'))
-
-  def testListWithoutNoneDevicePath(self):
-    self.assertEqual(
-        '/another/fake/device/path',
-        local_device_test_run.SubstituteDeviceRoot(
-            ['/', 'another', 'fake', 'device', 'path'], '/fake/device/root'))
-
-
 class TestLocalDeviceTestRun(local_device_test_run.LocalDeviceTestRun):
 
   # pylint: disable=abstract-method
diff --git a/build/android/pylib/utils/device_dependencies.py b/build/android/pylib/utils/device_dependencies.py
index 6be0cd6..d554d2b 100644
--- a/build/android/pylib/utils/device_dependencies.py
+++ b/build/android/pylib/utils/device_dependencies.py
@@ -2,7 +2,9 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import glob
 import os
+import posixpath
 import re
 
 from pylib import constants
@@ -143,3 +145,29 @@
   # whether other files could be filtered as well.
   return [(f, DevicePathComponentsFor(f, output_directory))
           for f in filtered_abs_host_files]
+
+
+def SubstituteDeviceRootSingle(device_path, device_root):
+  if not device_path:
+    return device_root
+  if isinstance(device_path, list):
+    return posixpath.join(*(p if p else device_root for p in device_path))
+  return device_path
+
+
+def SubstituteDeviceRoot(host_device_tuples, device_root):
+  return [(h, SubstituteDeviceRootSingle(d, device_root))
+          for h, d in host_device_tuples]
+
+
+def ExpandDataDependencies(host_device_tuples):
+  ret = []
+  for h, d in host_device_tuples:
+    if os.path.isdir(h):
+      for subpath in glob.glob(f'{h}/**', recursive=True):
+        if not os.path.isdir(subpath):
+          new_part = subpath[len(h):]
+          ret.append((subpath, d + new_part))
+    else:
+      ret.append((h, d))
+  return ret
diff --git a/build/android/pylib/utils/device_dependencies_test.py b/build/android/pylib/utils/device_dependencies_test.py
index 2ff937ee..136ebd5 100755
--- a/build/android/pylib/utils/device_dependencies_test.py
+++ b/build/android/pylib/utils/device_dependencies_test.py
@@ -48,5 +48,32 @@
                          test_path, output_directory))
 
 
+class SubstituteDeviceRootTest(unittest.TestCase):
+
+  def testNoneDevicePath(self):
+    self.assertEqual(
+        '/fake/device/root',
+        device_dependencies.SubstituteDeviceRootSingle(None,
+                                                       '/fake/device/root'))
+
+  def testStringDevicePath(self):
+    self.assertEqual(
+        '/another/fake/device/path',
+        device_dependencies.SubstituteDeviceRootSingle(
+            '/another/fake/device/path', '/fake/device/root'))
+
+  def testListWithNoneDevicePath(self):
+    self.assertEqual(
+        '/fake/device/root/subpath',
+        device_dependencies.SubstituteDeviceRootSingle([None, 'subpath'],
+                                                       '/fake/device/root'))
+
+  def testListWithoutNoneDevicePath(self):
+    self.assertEqual(
+        '/another/fake/device/path',
+        device_dependencies.SubstituteDeviceRootSingle(
+            ['/', 'another', 'fake', 'device', 'path'], '/fake/device/root'))
+
+
 if __name__ == '__main__':
   unittest.main()
diff --git a/build/android/test_runner.py b/build/android/test_runner.py
index 47292b2..d053935bb 100755
--- a/build/android/test_runner.py
+++ b/build/android/test_runner.py
@@ -323,12 +323,14 @@
       '--enable-device-cache',
       action='store_true',
       help='Cache device state to disk between runs')
-  parser.add_argument(
-      '--skip-clear-data',
-      action='store_true',
-      help='Do not wipe app data between tests. Use this to '
-           'speed up local development and never on bots '
-                     '(increases flakiness)')
+  parser.add_argument('--list-data',
+                      action='store_true',
+                      help='List files pushed to device and exit.')
+  parser.add_argument('--skip-clear-data',
+                      action='store_true',
+                      help='Do not wipe app data between tests. Use this to '
+                      'speed up local development and never on bots '
+                      '(increases flakiness)')
   parser.add_argument(
       '--recover-devices',
       action='store_true',
@@ -1219,6 +1221,15 @@
           args.command))
       return 1
 
+  if getattr(args, 'list_data', False):
+    with out_manager, env, test_instance, test_run:
+      data_deps = test_run.GetDataDepsForListing()
+
+    print('There are {} data files:'.format(len(data_deps)))
+    for d in data_deps:
+      print(d)
+    return 0
+
   ### Run.
   with out_manager, json_finalizer():
     # |raw_logs_fh| is only used by Robolectric tests.
diff --git a/build/config/BUILDCONFIG.gn b/build/config/BUILDCONFIG.gn
index d1a6654..c9a3ce4 100644
--- a/build/config/BUILDCONFIG.gn
+++ b/build/config/BUILDCONFIG.gn
@@ -348,6 +348,7 @@
   "//build/config/compiler:default_optimization",
   "//build/config/compiler:default_stack_frames",
   "//build/config/compiler:default_symbols",
+  "//build/config/compiler:libcxx_hardening",
   "//build/config/compiler:libcxx_module",
   "//build/config/compiler:no_exceptions",
   "//build/config/compiler:no_rtti",
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 854a48d..2f0e0c4 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -1076,32 +1076,6 @@
     ]
   }
 
-  # Normally, this would be defined in the `runtime_library` config but NaCl
-  # saigo libc++ does not use the custom hermetic libc++. Unfortunately, there
-  # isn't really a better config to add this define for the define to
-  # consistently apply in both Chromium and non-Chromium code *and* non-NaCl
-  # and NaCl code.
-  #
-  # TODO(crbug.com/40511454): Move this back to the `runtime_library`
-  # config when NaCl is removed.
-  if (use_safe_libcxx) {
-    # TODO(crbug.com/40275904): Switch saigo to hardened mode once
-    # it's rolled in.
-    if (is_nacl_saigo) {
-      defines += [ "_LIBCPP_ENABLE_ASSERTIONS=1" ]
-    } else {
-      defines += [ "_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE" ]
-    }
-  } else {
-    defines += [ "_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_NONE" ]
-  }
-
-  # Enable libstdc++ hardening lightweight assertions. Those have a low
-  # performance penalty but are considered a bare minimum for security.
-  if (use_safe_libstdcxx) {
-    defines += [ "_GLIBCXX_ASSERTIONS=1" ]
-  }
-
   # 64-bit Android sometimes defines __ARM_NEON but not __ARM_NEON__.
   # 32-bit Android builds and macOS, however, define __ARM_NEON__,
   # and code typically checks for this.
@@ -1113,6 +1087,34 @@
   }
 }
 
+config("libcxx_hardening") {
+  # Normally, this would be defined in the `runtime_library` config but NaCl
+  # saigo libc++ does not use the custom hermetic libc++. Unfortunately, there
+  # isn't really a better config to add this define for the define to
+  # consistently apply in both Chromium and non-Chromium code *and* non-NaCl and
+  # NaCl code.
+  #
+  # TODO(crbug.com/40511454): Move this back to the `runtime_library` config
+  # when NaCl is removed.
+  if (use_safe_libcxx) {
+    # TODO(crbug.com/40275904): Switch saigo to hardened mode once it's rolled
+    # in.
+    if (is_nacl_saigo) {
+      defines = [ "_LIBCPP_ENABLE_ASSERTIONS=1" ]
+    } else {
+      defines = [ "_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE" ]
+    }
+  } else {
+    defines = [ "_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_NONE" ]
+  }
+
+  # Enable libstdc++ hardening lightweight assertions. Those have a low
+  # performance penalty but are considered a bare minimum for security.
+  if (use_safe_libstdcxx) {
+    defines += [ "_GLIBCXX_ASSERTIONS=1" ]
+  }
+}
+
 # The BUILDCONFIG file sets this config on targets by default, which means when
 # building with ThinLTO, no optimization is performed in the link step.
 config("thinlto_optimize_default") {
@@ -1907,7 +1909,8 @@
 
     cflags_cc += [
       # Disables for C++ only
-      "-Wno-invalid-offsetof",  # offsetof on non-standard-layout type (crbug.com/40285259)
+      "-Wno-invalid-offsetof",  # offsetof on non-standard-layout type
+                                # (crbug.com/40285259)
     ]
 
     if (!is_nacl || is_nacl_saigo) {
diff --git a/build/config/siso/proto_linux.star b/build/config/siso/proto_linux.star
index b1968a4..4ae92c0 100644
--- a/build/config/siso/proto_linux.star
+++ b/build/config/siso/proto_linux.star
@@ -10,12 +10,7 @@
 load("./protoc_wrapper.star", "protoc_wrapper")
 
 def __filegroups(ctx):
-    return {
-        "third_party/protobuf/python/google:pyprotolib": {
-            "type": "glob",
-            "includes": ["*.py"],
-        },
-    }
+    return {}
 
 def __protoc_wrapper(ctx, cmd):
     inputs = protoc_wrapper.scandeps(ctx, cmd.args)
@@ -27,11 +22,6 @@
 
 def __step_config(ctx, step_config):
     remote_run = True  # Turn this to False when you do file access trace.
-    step_config["input_deps"].update({
-        "third_party/dom_distiller_js/protoc_plugins/util/plugin_protos.py": [
-            "third_party/protobuf/python/google:pyprotolib",
-        ],
-    })
     step_config["rules"].extend([
         {
             "name": "proto/protoc_wrapper",
diff --git a/chrome/VERSION b/chrome/VERSION
index d868542..c29e1526 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=130
 MINOR=0
-BUILD=6710
+BUILD=6711
 PATCH=0
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
index e0c0e4b4..6209077 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
@@ -44,7 +44,9 @@
 
 import static org.chromium.chrome.browser.flags.ChromeFeatureList.DATA_SHARING;
 import static org.chromium.chrome.browser.flags.ChromeFeatureList.NAV_BAR_COLOR_MATCHES_TAB_BACKGROUND;
+import static org.chromium.chrome.browser.flags.ChromeFeatureList.TAB_GROUP_PANE_ANDROID;
 import static org.chromium.chrome.browser.flags.ChromeFeatureList.TAB_GROUP_PARITY_ANDROID;
+import static org.chromium.chrome.browser.flags.ChromeFeatureList.TAB_GROUP_SYNC_ANDROID;
 import static org.chromium.chrome.browser.ntp.HomeSurfaceTestUtils.createTabStatesAndMetadataFile;
 import static org.chromium.chrome.browser.ntp.HomeSurfaceTestUtils.createThumbnailBitmapAndWriteToFile;
 import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.addBlankTabs;
@@ -1987,10 +1989,15 @@
     @Test
     @MediumTest
     @Feature({"RenderTest"})
-    @EnableFeatures({DATA_SHARING, TAB_GROUP_PARITY_ANDROID})
+    @EnableFeatures({
+        DATA_SHARING,
+        TAB_GROUP_PARITY_ANDROID,
+        TAB_GROUP_SYNC_ANDROID,
+        TAB_GROUP_PANE_ANDROID
+    })
     @RequiresRestart("Group creation modal dialog is sometimes persistent when dismissing")
     @ParameterAnnotations.UseMethodParameter(NightModeTestUtils.NightModeParams.class)
-    @DisabledTest(message = "crbug.com/362762206")
+    @DisabledTest(message = "crbug.com/362762206, see also crbug.com/360072870")
     public void testRenderDialog_TwoRows_Portrait(boolean nightModeEnabled) throws Exception {
         final ChromeTabbedActivity cta = sActivityTestRule.getActivity();
         prepareTabsWithThumbnail(sActivityTestRule, 3, 0, "about:blank");
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
index 6756acd..f16dcbd 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
@@ -121,6 +121,7 @@
 import org.chromium.chrome.browser.media.FullscreenVideoPictureInPictureController;
 import org.chromium.chrome.browser.metrics.LaunchMetrics;
 import org.chromium.chrome.browser.metrics.LegacyTabStartupMetricsTracker;
+import org.chromium.chrome.browser.metrics.SimpleStartupForegroundSessionDetector;
 import org.chromium.chrome.browser.metrics.StartupMetricsTracker;
 import org.chromium.chrome.browser.metrics.UmaActivityObserver;
 import org.chromium.chrome.browser.modaldialog.TabModalLifetimeHandler;
@@ -1155,7 +1156,9 @@
         if (isMainIntentLaunch) {
             RecordHistogram.recordBooleanHistogram(
                     "Startup.Android.MainIntentIsColdStart",
-                    ColdStartTracker.wasColdOnFirstActivityCreationOrNow());
+                    ColdStartTracker.wasColdOnFirstActivityCreationOrNow()
+                            && SimpleStartupForegroundSessionDetector
+                                    .runningCleanForegroundSession());
         }
 
         Tab tab = getActivityTab();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
index fa13bd8..409b133 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
@@ -198,7 +198,6 @@
     private final ObservableSupplier<EdgeToEdgeController> mEdgeToEdgeControllerSupplier;
     private @Nullable AppHeaderCoordinator mAppHeaderCoordinator;
     private final ManualFillingComponentSupplier mManualFillingComponentSupplier;
-    private @Nullable ChoiceDialogCoordinator mChoiceDialogCoordinator;
     private @NonNull DataSharingTabManager mDataSharingTabManager;
     private @NonNull DataSharingTabSwitcherDelegate mDataSharingTabSwitcherDelegate;
     private final OneshotSupplierImpl<TabGroupModelFilter> mOneshotFilterSupplier =
@@ -1236,9 +1235,7 @@
      */
     private boolean maybeShowRequiredPromptsAndPromos(Profile profile, boolean intentWithEffect) {
         if (SearchEnginesFeatures.isEnabled(SearchEnginesFeatures.CLAY_BLOCKING)) {
-            mChoiceDialogCoordinator =
-                    ChoiceDialogCoordinator.maybeShow(mActivity, mModalDialogManagerSupplier.get());
-            if (mChoiceDialogCoordinator != null) {
+            if (ChoiceDialogCoordinator.maybeShow(mActivity, mModalDialogManagerSupplier.get())) {
                 return true;
             }
         }
diff --git a/chrome/android/profiles/arm.newest.txt b/chrome/android/profiles/arm.newest.txt
index 306c2e4..4e43751 100644
--- a/chrome/android/profiles/arm.newest.txt
+++ b/chrome/android/profiles/arm.newest.txt
@@ -1 +1 @@
-chromeos-chrome-arm-130.0.6708.0_rc-r1-merged.afdo.bz2
+chromeos-chrome-arm-130.0.6709.0_rc-r1-merged.afdo.bz2
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index b57a192..7c85593 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -2083,6 +2083,7 @@
     "//components/enterprise/common/proto:legacy_tech_events_proto",
     "//components/enterprise/content",
     "//components/enterprise/device_trust",
+    "//components/enterprise/obfuscation/core:enterprise_obfuscation",
     "//components/error_page/common",
     "//components/error_page/content/browser",
     "//components/facilitated_payments/core/features",
@@ -4278,6 +4279,7 @@
       "//chrome/browser/ui/webui/searchbox",
       "//chrome/browser/ui/webui/signin",
       "//chrome/browser/ui/webui/signin:impl",
+      "//chrome/browser/ui/webui/signin/batch_upload:mojo_bindings",
       "//chrome/browser/ui/webui/top_chrome",
       "//chrome/browser/ui/webui/top_chrome:impl",
       "//chrome/browser/web_applications",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index aff9f73..a1d962e 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -10986,13 +10986,6 @@
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 #if !BUILDFLAG(IS_ANDROID)
-    {"password-generation-strong-label-experiment",
-     flag_descriptions::kPasswordGenerationStrongLabelExperimentName,
-     flag_descriptions::kPasswordGenerationStrongLabelExperimentDescription,
-     kOsDesktop, FEATURE_VALUE_TYPE(blink::features::kPasswordStrongLabel)},
-#endif
-
-#if !BUILDFLAG(IS_ANDROID)
     {"trusted-vault-frequent-degraded-recoverability-polling",
      flag_descriptions::kTrustedVaultFrequentDegradedRecoverabilityPollingName,
      flag_descriptions::
diff --git a/chrome/browser/apps/app_service/BUILD.gn b/chrome/browser/apps/app_service/BUILD.gn
index 55531a0..46fa97d 100644
--- a/chrome/browser/apps/app_service/BUILD.gn
+++ b/chrome/browser/apps/app_service/BUILD.gn
@@ -287,7 +287,6 @@
       "//chrome/browser/metrics/structured:features",
       "//chrome/browser/resources",
       "//chrome/browser/ui/ash/multi_user",
-      "//chrome/browser/ui/ash/session",
       "//chrome/browser/ui/ash/shelf",
       "//chrome/browser/ui/ash/shelf/app_service",
       "//chrome/browser/ui/ash/system_web_apps",
diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn
index 4f07ecd..90e8eea 100644
--- a/chrome/browser/ash/BUILD.gn
+++ b/chrome/browser/ash/BUILD.gn
@@ -260,7 +260,6 @@
     "//chromeos/ash/components/osauth/public",
     "//chromeos/ash/components/phonehub",
     "//chromeos/ash/components/phonehub/proto",
-    "//chromeos/ash/components/policy",
     "//chromeos/ash/components/proximity_auth",
     "//chromeos/ash/components/quick_start:quick_start",
     "//chromeos/ash/components/quick_start:test_support",
@@ -1351,7 +1350,6 @@
     "//chromeos/ash/components/phonehub:debug",
     "//chromeos/ash/components/phonehub:test_support",
     "//chromeos/ash/components/phonehub/proto",
-    "//chromeos/ash/components/policy",
     "//chromeos/ash/components/proximity_auth",
     "//chromeos/ash/components/proximity_auth:test_support",
     "//chromeos/ash/components/report:fresnel_service_proto",
diff --git a/chrome/browser/ash/account_manager/BUILD.gn b/chrome/browser/ash/account_manager/BUILD.gn
index 61b785f..fce166841 100644
--- a/chrome/browser/ash/account_manager/BUILD.gn
+++ b/chrome/browser/ash/account_manager/BUILD.gn
@@ -49,7 +49,6 @@
     "//chrome/browser/ash/crosapi:browser_util",
     "//chrome/browser/ash/login/session",
     "//chrome/browser/ash/net",
-    "//chrome/browser/ui/webui/ash/edu_coexistence",
     "//chromeos/ash/components/browser_context_helper",
     "//chromeos/components/mgs",
     "//components/user_manager",
diff --git a/chrome/browser/ash/app_list/search/keyboard_shortcut_result.cc b/chrome/browser/ash/app_list/search/keyboard_shortcut_result.cc
index 8218ba0..3e69d9a 100644
--- a/chrome/browser/ash/app_list/search/keyboard_shortcut_result.cc
+++ b/chrome/browser/ash/app_list/search/keyboard_shortcut_result.cc
@@ -136,6 +136,8 @@
       return IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_OPEN_LAUNCHER;
     case ash::SearchResultTextItem::kKeyboardShortcutSearch:
       return IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_OPEN_SEARCH;
+    case ash::SearchResultTextItem::kKeyboardShortcutAccessibility:
+      return IDS_SHORTCUT_CUSTOMIZATION_ICON_LABEL_ACCESSIBILITY;
     case ash::SearchResultTextItem::kKeyboardShortcutKeyboardRightAlt:
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
       return IDS_KEYBOARD_RIGHT_ALT_LABEL;
@@ -266,6 +268,8 @@
       return IconCode::kKeyboardShortcutInputModeChange;
     case (KeyboardCode::VKEY_MICROPHONE_MUTE_TOGGLE):
       return IconCode::kKeyboardShortcutMicrophone;
+    case (KeyboardCode::VKEY_ACCESSIBILITY):
+      return IconCode::kKeyboardShortcutAccessibility;
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
     case (KeyboardCode::VKEY_RIGHT_ALT):
       return IconCode::kKeyboardShortcutKeyboardRightAlt;
@@ -281,7 +285,8 @@
 KeyboardShortcutResult::GetIconCodeByKeyString(std::u16string_view key_string) {
   static constexpr auto kIconCodes = base::MakeFixedFlatMap<std::u16string_view,
                                                             IconCode>(
-      {{u"ArrowDown", IconCode::kKeyboardShortcutDown},
+      {{u"Accessibility", IconCode::kKeyboardShortcutAccessibility},
+       {u"ArrowDown", IconCode::kKeyboardShortcutDown},
        {u"ArrowLeft", IconCode::kKeyboardShortcutLeft},
        {u"ArrowRight", IconCode::kKeyboardShortcutRight},
        {u"ArrowUp", IconCode::kKeyboardShortcutUp},
diff --git a/chrome/browser/ash/app_mode/BUILD.gn b/chrome/browser/ash/app_mode/BUILD.gn
index 65a8cab..895738e 100644
--- a/chrome/browser/ash/app_mode/BUILD.gn
+++ b/chrome/browser/ash/app_mode/BUILD.gn
@@ -78,7 +78,6 @@
     "//chromeos/ash/components/kiosk/vision",
     "//chromeos/ash/components/login/auth",
     "//chromeos/ash/components/network",
-    "//chromeos/ash/components/policy",
     "//chromeos/ash/components/settings",
     "//chromeos/crosapi/mojom",
     "//chromeos/crosapi/mojom:mojom_shared_cpp_sources",
@@ -119,7 +118,6 @@
     "//chrome/browser/chromeos/app_mode",
     "//chrome/browser/image_decoder",
     "//chrome/browser/profiles:profile",
-    "//chrome/browser/ui/webui/ash/login",
     "//chrome/common:constants",
     "//chromeos/ash/components/cryptohome",
     "//chromeos/ash/components/cryptohome:public",
@@ -151,7 +149,6 @@
     "//chrome/browser/ash/policy/handlers",
     "//chrome/browser/ash/policy/remote_commands/crd",
     "//chrome/browser/chromeos/app_mode",
-    "//chrome/browser/ui/webui/ash/login",
   ]
 }
 
@@ -174,7 +171,6 @@
   public_deps = [
     "//chrome/browser/ash/app_mode",
     "//chrome/browser/ash/login/app_mode",
-    "//chromeos/ash/components/policy",
     "//extensions:test_support",
     "//extensions/common",
     "//net:test_support",
diff --git a/chrome/browser/ash/app_mode/auto_sleep/BUILD.gn b/chrome/browser/ash/app_mode/auto_sleep/BUILD.gn
index 85d0a0f..893912c 100644
--- a/chrome/browser/ash/app_mode/auto_sleep/BUILD.gn
+++ b/chrome/browser/ash/app_mode/auto_sleep/BUILD.gn
@@ -18,7 +18,7 @@
   public_deps = [
     "//base",
     "//chrome/browser:browser_public_dependencies",
-    "//chromeos/ash/components/policy",
+    "//chromeos/ash/components/policy/weekly_time",
     "//chromeos/ash/components/settings",
     "//chromeos/dbus/power",
     "//components/prefs",
@@ -43,8 +43,8 @@
     "fake_repeating_time_interval_task_executor.h",
   ]
   public_deps = [
-    "//chrome/browser/ash/app_mode/auto_sleep",
-    "//chromeos/ash/components/policy",
+    ":auto_sleep",
+    "//chromeos/ash/components/policy/weekly_time",
     "//extensions:test_support",
     "//extensions/common",
     "//net:test_support",
@@ -65,13 +65,13 @@
     "repeating_time_interval_task_executor_unittest.cc",
   ]
   deps = [
+    ":auto_sleep",
+    ":test_support",
     "//base",
     "//base/test:test_support",
-    "//chrome/browser/ash/app_mode/auto_sleep",
-    "//chrome/browser/ash/app_mode/auto_sleep:test_support",
     "//chrome/common:constants",
     "//chrome/test:test_support",
-    "//chromeos/ash/components/policy",
+    "//chromeos/ash/components/policy/weekly_time",
     "//chromeos/ash/components/settings",
     "//chromeos/dbus/power",
     "//content/test:test_support",
diff --git a/chrome/browser/ash/arc/optin/BUILD.gn b/chrome/browser/ash/arc/optin/BUILD.gn
index f56d3b2..021dcb7 100644
--- a/chrome/browser/ash/arc/optin/BUILD.gn
+++ b/chrome/browser/ash/arc/optin/BUILD.gn
@@ -28,7 +28,6 @@
     "//base",
     "//chrome/browser:browser_process",
     "//chrome/browser/ash/settings",
-    "//chrome/browser/ui/webui/ash/login",
     "//components/metrics",
     "//components/prefs",
     "//third_party/nearby:presence_types",
diff --git a/chrome/browser/ash/auth/BUILD.gn b/chrome/browser/ash/auth/BUILD.gn
index 6a80f568..c260362 100644
--- a/chrome/browser/ash/auth/BUILD.gn
+++ b/chrome/browser/ash/auth/BUILD.gn
@@ -30,6 +30,8 @@
     "//chrome/browser/profiles:profile",
     "//chrome/browser/ui/webui/ash/settings/pages/privacy",
     "//chromeos/ash/components/cryptohome",
+    "//chromeos/ash/components/dbus/userdataauth",
+    "//chromeos/ash/components/dbus/userdataauth:userdataauth_proto",
     "//chromeos/ash/components/login/auth",
     "//components/account_id",
     "//components/prefs",
diff --git a/chrome/browser/ash/camera_mic/BUILD.gn b/chrome/browser/ash/camera_mic/BUILD.gn
index 21653bf..07fd0a1 100644
--- a/chrome/browser/ash/camera_mic/BUILD.gn
+++ b/chrome/browser/ash/camera_mic/BUILD.gn
@@ -32,7 +32,6 @@
     "//chrome/browser/ash/borealis",
     "//chrome/browser/ash/login/session",
     "//chrome/browser/ash/plugin_vm",
-    "//chrome/browser/ui/ash/media_client",
     "//chrome/browser/ui/webui/ash/settings/app_management",
     "//components/vector_icons",
     "//content/public/browser",
@@ -47,7 +46,6 @@
     # so initroducing an Observer should resolve the dependency on
     # c/b/ash/login/session.
     "//chrome/browser/ash/login/session",
-    "//chrome/browser/ui/ash/media_client",
   ]
 }
 
@@ -57,13 +55,13 @@
   sources = [ "vm_camera_mic_manager_unittest.cc" ]
 
   deps = [
+    ":camera_mic",
     "//ash",
     "//ash:test_support",
     "//ash/constants",
     "//base",
     "//base/test:test_support",
     "//chrome/browser",
-    "//chrome/browser/ash/camera_mic",
     "//chrome/browser/ash/login/users:test_support",
     "//chrome/test:test_support",
     "//components/account_id",
diff --git a/chrome/browser/ash/customization/BUILD.gn b/chrome/browser/ash/customization/BUILD.gn
index 743f0ff..30e7f734 100644
--- a/chrome/browser/ash/customization/BUILD.gn
+++ b/chrome/browser/ash/customization/BUILD.gn
@@ -27,14 +27,11 @@
     "//chrome/browser/ash/login/users/avatar",
     "//chrome/browser/ash/net",
     "//chrome/browser/profiles",
-    "//chrome/browser/ui/webui/ash/login",
     "//chrome/common",
     "//chromeos/ash/components/system",
     "//components/pref_registry",
     "//content/public/browser",
   ]
-
-  allow_circular_includes_from = [ "//chrome/browser/ui/webui/ash/login" ]
 }
 
 source_set("browser_tests") {
diff --git a/chrome/browser/ash/extensions/BUILD.gn b/chrome/browser/ash/extensions/BUILD.gn
index 2ddbeba..79961da 100644
--- a/chrome/browser/ash/extensions/BUILD.gn
+++ b/chrome/browser/ash/extensions/BUILD.gn
@@ -72,7 +72,6 @@
     "//chrome/browser/profiles:profile",
     "//chrome/browser/resources/chromeos:app_icon_resources",
     "//chrome/browser/ui/ash/keyboard",
-    "//chrome/browser/ui/ash/media_client",
     "//chrome/browser/ui/ash/multi_user",
     "//chrome/browser/web_applications",
     "//chrome/common",
@@ -96,7 +95,6 @@
     "//chrome/browser/ash/app_list/search",
     "//chrome/browser/ash/login/demo_mode",
     "//chrome/browser/ash/policy/core",
-    "//chrome/browser/ui/ash/media_client",
   ]
 }
 
diff --git a/chrome/browser/ash/file_system_provider/BUILD.gn b/chrome/browser/ash/file_system_provider/BUILD.gn
index 84132ec..a8a0a16f 100644
--- a/chrome/browser/ash/file_system_provider/BUILD.gn
+++ b/chrome/browser/ash/file_system_provider/BUILD.gn
@@ -84,7 +84,6 @@
     "//chrome/browser/profiles",
     "//chrome/browser/profiles:profile",
     "//chrome/browser/ui/ash/multi_user",
-    "//chrome/browser/ui/webui/ash/smb_shares",
     "//chrome/common",
     "//chromeos/constants",
     "//components/pref_registry",
@@ -108,7 +107,6 @@
     "//chrome/browser/ash/policy/dlp",
     "//chrome/browser/ash/smb_client",
     "//chrome/browser/ash/system_web_apps/apps",
-    "//chrome/browser/ui/webui/ash/smb_shares",
   ]
 }
 
diff --git a/chrome/browser/ash/input_device_settings/peripherals_app_delegate_impl.cc b/chrome/browser/ash/input_device_settings/peripherals_app_delegate_impl.cc
index aed293ec..c453af06 100644
--- a/chrome/browser/ash/input_device_settings/peripherals_app_delegate_impl.cc
+++ b/chrome/browser/ash/input_device_settings/peripherals_app_delegate_impl.cc
@@ -15,6 +15,7 @@
 #include "chrome/browser/profiles/profile_manager.h"
 #include "components/services/app_service/public/cpp/package_id.h"
 #include "components/version_info/version_info.h"
+#include "google_apis/google_api_keys.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "services/network/public/cpp/simple_url_loader.h"
 #include "ui/base/webui/web_ui_util.h"
@@ -105,6 +106,15 @@
 void PeripheralsAppDelegateImpl::GetCompanionAppInfo(
     const std::string& device_key,
     GetCompanionAppInfoCallback callback) {
+  // Ensure that the build uses the Google-internal file containing the
+  // official API keys, which are required to make queries to the Almanac.
+  if (!google_apis::IsGoogleChromeAPIKeyUsed() && !is_testing_) {
+    LOG(ERROR) << "Invalid API key or missing internal file. Cannot make "
+                  "queries to Almanac. Device key: "
+               << device_key;
+    return;
+  }
+
   Profile* active_user_profile = GetActiveUserProfile();
   device_info_manager_ =
       std::make_unique<apps::DeviceInfoManager>(active_user_profile);
@@ -151,7 +161,7 @@
   apps::AppInstallIcon app_install_icon{
       .url = GURL(icon.url()),
       .width_in_pixels = icon.width_in_pixels(),
-      .mime_type = "image/svg+xml",
+      .mime_type = icon.mime_type(),
       .is_masking_allowed = icon.is_masking_allowed()};
   // Callback execution is not critical if object is deleted before icon load.
   // This should rarely occur as the InputDeviceSettingsController, the primary
diff --git a/chrome/browser/ash/input_method/BUILD.gn b/chrome/browser/ash/input_method/BUILD.gn
index 555710a..07c21d3 100644
--- a/chrome/browser/ash/input_method/BUILD.gn
+++ b/chrome/browser/ash/input_method/BUILD.gn
@@ -203,7 +203,6 @@
     "//chrome/browser/ash/magic_boost",
     "//chrome/browser/ash/profiles",
     "//chrome/browser/feedback",
-    "//chrome/browser/ui/ash/login",
     "//chrome/browser/ui/aura/accessibility",
     "//chrome/browser/ui/webui/ash/settings/search",
     "//chrome/browser/web_applications",
diff --git a/chrome/browser/ash/login/BUILD.gn b/chrome/browser/ash/login/BUILD.gn
index 8c1a00f..83e2b16 100644
--- a/chrome/browser/ash/login/BUILD.gn
+++ b/chrome/browser/ash/login/BUILD.gn
@@ -168,11 +168,7 @@
     "//chrome/browser/profiles",
     "//chrome/browser/sync",
     "//chrome/browser/ui/ash/input_method",
-    "//chrome/browser/ui/ash/login",
     "//chrome/browser/ui/aura/accessibility",
-    "//chrome/browser/ui/webui/ash/login",
-    "//chrome/browser/ui/webui/ash/login/osauth",
-    "//chrome/browser/ui/webui/ash/login/testapi",
     "//chrome/common",
     "//chrome/common:channel_info",
     "//chrome/common:chrome_features",
@@ -274,10 +270,6 @@
     "//chrome/browser/ash/policy/handlers",
     "//chrome/browser/ash/system",
     "//chrome/browser/sync",
-    "//chrome/browser/ui/ash/login",
-    "//chrome/browser/ui/webui/ash/login",
-    "//chrome/browser/ui/webui/ash/login/osauth",
-    "//chrome/browser/ui/webui/ash/login/testapi",
   ]
 }
 
diff --git a/chrome/browser/ash/login/app_mode/BUILD.gn b/chrome/browser/ash/login/app_mode/BUILD.gn
index bd778e2..29f4b620 100644
--- a/chrome/browser/ash/login/app_mode/BUILD.gn
+++ b/chrome/browser/ash/login/app_mode/BUILD.gn
@@ -20,7 +20,6 @@
     "//ash/public/cpp",
     "//base",
     "//chrome/browser:browser_public_dependencies",
-    "//chrome/browser/ui/webui/ash/login",
   ]
 
   deps = [
diff --git a/chrome/browser/ash/login/enrollment/BUILD.gn b/chrome/browser/ash/login/enrollment/BUILD.gn
index 2b84bebf..144d0be6 100644
--- a/chrome/browser/ash/login/enrollment/BUILD.gn
+++ b/chrome/browser/ash/login/enrollment/BUILD.gn
@@ -25,7 +25,6 @@
     "//chrome/browser:browser_public_dependencies",
     "//chrome/browser/ash/login/",
     "//chrome/browser/ash/login/screens",
-    "//chrome/browser/ui/webui/ash/login",
     "//chromeos/ash/components/network",
     "//chromeos/dbus/tpm_manager",
     "//chromeos/dbus/tpm_manager:tpm_manager_proto",
@@ -59,7 +58,6 @@
   allow_circular_includes_from = [
     "//chrome/browser/ash/login/",
     "//chrome/browser/ash/login/demo_mode",
-    "//chrome/browser/ui/webui/ash/login",
   ]
 }
 
diff --git a/chrome/browser/ash/login/enrollment/enrollment_embedded_policy_server_browsertest.cc b/chrome/browser/ash/login/enrollment/enrollment_embedded_policy_server_browsertest.cc
index 7a1516d..a0d439d 100644
--- a/chrome/browser/ash/login/enrollment/enrollment_embedded_policy_server_browsertest.cc
+++ b/chrome/browser/ash/login/enrollment/enrollment_embedded_policy_server_browsertest.cc
@@ -1420,6 +1420,50 @@
   KioskSessionInitializedWaiter().Wait();
 }
 
+// Making sure the Kiosk flow still works when configured together with the
+// feature that allows to skip the gaia screen by reusing the credentials used
+// during the enrollment.
+class KioskEnrollmentTestWithAddUserFlowEnabled : public KioskEnrollmentTest {
+ public:
+  KioskEnrollmentTestWithAddUserFlowEnabled() {
+    feature_list_.InitAndEnableFeature(features::kOobeAddUserDuringEnrollment);
+  }
+
+ protected:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_F(
+    KioskEnrollmentTestWithAddUserFlowEnabled,
+    ManualEnrollmentAutolaunchKioskAppWithAddUserAfterEnrollment) {
+  TriggerEnrollmentAndSignInSuccessfully();
+
+  enrollment_ui_.WaitForStep(test::ui::kEnrollmentStepSuccess);
+  EXPECT_TRUE(StartupUtils::IsDeviceRegistered());
+  EXPECT_TRUE(InstallAttributes::Get()->IsCloudManaged());
+
+  ScopedDeviceSettings settings;
+
+  SetupAutoLaunchApp(settings.owner_settings_service());
+  enrollment_screen()->OnConfirmationClosed();
+
+  // TODO(b/362725459) Once the cleanup is implemented, we should expect
+  // here the user_context to not be saved.
+  UserContext* user_context =
+      LoginDisplayHost::default_host()->GetWizardContext()->user_context.get();
+  EXPECT_TRUE(user_context);
+  EXPECT_EQ(user_context->GetAccountId().GetUserEmail(),
+            FakeGaiaMixin::kFakeUserEmail);
+  EXPECT_EQ(user_context->GetGaiaID(), FakeGaiaMixin::kFakeUserGaiaId);
+  EXPECT_TRUE(user_context->GetPassword());
+  EXPECT_EQ(user_context->GetPassword().value(),
+            PasswordInput(FakeGaiaMixin::kFakeUserPassword));
+  EXPECT_EQ(user_context->GetRefreshToken(), FakeGaiaMixin::kFakeRefreshToken);
+
+  // Wait for app to be launched.
+  KioskSessionInitializedWaiter().Wait();
+}
+
 // Test suite for a feature that allows to skip the Gaia screen by reusing the
 // credentials saved during enrollment. It depends on the
 // EnrollmentEmbeddedPolicyServerBase for a successful enrollment and the fake
diff --git a/chrome/browser/ash/login/lock/BUILD.gn b/chrome/browser/ash/login/lock/BUILD.gn
index c0bf8855..f60999a4f 100644
--- a/chrome/browser/ash/login/lock/BUILD.gn
+++ b/chrome/browser/ash/login/lock/BUILD.gn
@@ -51,9 +51,6 @@
     "//chrome/browser/ash/system",
     "//chrome/browser/extensions",
     "//chrome/browser/profiles:profile",
-    "//chrome/browser/ui/ash/login",
-    "//chrome/browser/ui/ash/session",
-    "//chrome/browser/ui/ash/wallpaper",
     "//chrome/common:constants",
     "//chrome/common:non_code_constants",
     "//chromeos/ash/components/browser_context_helper",
@@ -78,10 +75,8 @@
     "//chrome/browser/ash/extensions/autotest_private",
     "//chrome/browser/ash/extensions/file_manager",
     "//chrome/browser/ash/input_method",
-    "//chrome/browser/ui/ash/login",
     "//chrome/browser/ash/login",
     "//chrome/browser/ash/login/session",
-    "//chrome/browser/ui/ash/session",
     "//chrome/browser/extensions",
   ]
 }
diff --git a/chrome/browser/ash/login/screens/BUILD.gn b/chrome/browser/ash/login/screens/BUILD.gn
index 3d3869e..a59df9d 100644
--- a/chrome/browser/ash/login/screens/BUILD.gn
+++ b/chrome/browser/ash/login/screens/BUILD.gn
@@ -179,8 +179,6 @@
     "//chrome/browser/ash/policy/core",
     "//chrome/browser/profiles:profile",
     "//chrome/browser/ui/ash/keyboard",
-    "//chrome/browser/ui/ash/system",
-    "//chrome/browser/ui/webui/ash/login",
     "//chrome/browser/ui/webui/ash/login/mojom",
     "//chromeos/ash/components/cryptohome",
     "//chromeos/ash/components/dbus/arc",
@@ -272,9 +270,7 @@
     "//chrome/browser/ui/ash/multi_user",
     "//chrome/browser/ui/webui/ash/internet",
     "//chrome/browser/ui/webui/ash/login/testapi",
-    "//chrome/browser/ui/webui/ash/settings",
     "//chrome/browser/ui/webui/ash/system_web_dialog",
-    "//chrome/browser/ui/webui/signin/ash",
     "//chrome/common",
     "//chrome/common:channel_info",
     "//chrome/common:chrome_features",
@@ -349,7 +345,6 @@
     "//chrome/browser/ash/login/session",
     "//chrome/browser/ash/login/ui",
     "//chrome/browser/ash/policy/handlers",
-    "//chrome/browser/ui/webui/ash/login",
     "//chrome/browser/ui/webui/ash/login/testapi",
   ]
 }
diff --git a/chrome/browser/ash/login/screens/osauth/BUILD.gn b/chrome/browser/ash/login/screens/osauth/BUILD.gn
index 9109760..f4fcabb0 100644
--- a/chrome/browser/ash/login/screens/osauth/BUILD.gn
+++ b/chrome/browser/ash/login/screens/osauth/BUILD.gn
@@ -53,8 +53,6 @@
     "//chrome/browser/ash/login/quick_unlock",
     "//chrome/browser/ash/login/ui",
     "//chrome/browser/profiles:profile",
-    "//chrome/browser/ui/webui/ash/login",
-    "//chrome/browser/ui/webui/ash/login/osauth",
     "//chromeos/ash/components/cryptohome",
     "//chromeos/ash/components/cryptohome:public",
     "//chromeos/ash/components/dbus/session_manager",
@@ -70,7 +68,6 @@
   allow_circular_includes_from = [
     "//chrome/browser/ash/login",
     "//chrome/browser/ash/login/ui",
-    "//chrome/browser/ui/webui/ash/login",
   ]
 }
 
diff --git a/chrome/browser/ash/login/session/BUILD.gn b/chrome/browser/ash/login/session/BUILD.gn
index a7444dba..e1ce880 100644
--- a/chrome/browser/ash/login/session/BUILD.gn
+++ b/chrome/browser/ash/login/session/BUILD.gn
@@ -68,8 +68,6 @@
     "//chrome/browser/google",
     "//chrome/browser/scalable_iph:scalable_iph_factory",
     "//chrome/browser/screen_ai:screen_ai_dlc_installer",
-    "//chrome/browser/ui/ash/media_client",
-    "//chrome/browser/ui/webui/ash/login",
     "//chrome/browser/ui/webui/ash/shimless_rma_dialog",
     "//chrome/common",
     "//chrome/common:channel_info",
@@ -138,7 +136,6 @@
     "//chrome/browser/ash/kerberos",
     "//chrome/browser/ash/policy/core",
     "//chrome/browser/ash/settings",
-    "//chrome/browser/ui/webui/ash/login",
   ]
 }
 
diff --git a/chrome/browser/ash/login/signin/BUILD.gn b/chrome/browser/ash/login/signin/BUILD.gn
index 322cc0d..e153d9e8 100644
--- a/chrome/browser/ash/login/signin/BUILD.gn
+++ b/chrome/browser/ash/login/signin/BUILD.gn
@@ -74,8 +74,6 @@
     "//chrome/browser/sync",
     "//chrome/browser/sync:factories",
     "//chrome/browser/ui/ash/multi_user",
-    "//chrome/browser/ui/webui/ash/login",
-    "//chrome/browser/ui/webui/signin/ash",
     "//chrome/common",
     "//chrome/common:constants",
     "//chromeos/ash/components/account_manager",
@@ -97,7 +95,6 @@
   allow_circular_includes_from = [
     "//chrome/browser/ash/login",
     "//chrome/browser/ash/login/session",
-    "//chrome/browser/ui/webui/ash/login",
   ]
 }
 
diff --git a/chrome/browser/ash/login/smart_lock/BUILD.gn b/chrome/browser/ash/login/smart_lock/BUILD.gn
index 6eb027f..25d4b442 100644
--- a/chrome/browser/ash/login/smart_lock/BUILD.gn
+++ b/chrome/browser/ash/login/smart_lock/BUILD.gn
@@ -49,7 +49,6 @@
     "//chrome/browser/ash/multidevice_setup",
     "//chrome/browser/ash/profiles",
     "//chrome/browser/ash/secure_channel",
-    "//chrome/browser/ui/webui/ash/multidevice_setup",
     "//chrome/common",
     "//chrome/common:constants",
     "//chrome/common:non_code_constants",
diff --git a/chrome/browser/ash/login/ui/BUILD.gn b/chrome/browser/ash/login/ui/BUILD.gn
index 7bb119b..50f6ccd 100644
--- a/chrome/browser/ash/login/ui/BUILD.gn
+++ b/chrome/browser/ash/login/ui/BUILD.gn
@@ -56,8 +56,6 @@
     "//chrome/browser/ash/customization",
     "//chrome/browser/ash/login/oobe_quick_start",
     "//chrome/browser/ui/ash/keyboard",
-    "//chrome/browser/ui/ash/login",
-    "//chrome/browser/ui/webui/ash/login",
     "//chromeos/ash/components/audio",
     "//chromeos/ash/components/dbus/session_manager",
     "//chromeos/ash/components/login/auth",
@@ -117,7 +115,6 @@
     "//chrome/browser/ui/views/toolbar",
     "//chrome/browser/ui/webui/ash/diagnostics_dialog",
     "//chrome/browser/ui/webui/ash/internet",
-    "//chrome/browser/ui/webui/ash/login/testapi",
     "//chrome/common:constants",
     "//chrome/common:non_code_constants",
     "//chromeos/ash/components/attestation",
@@ -164,14 +161,11 @@
     "//chrome/browser/ash/arc",
     "//chrome/browser/ash/arc/optin",
     "//chrome/browser/ash/login/session",
-    "//chrome/browser/ui/ash/login",
     "//chrome/browser/ash/net",
     "//chrome/browser/ash/policy/enrollment",
     "//chrome/browser/ash/policy/handlers",
     "//chrome/browser/ash/policy/remote_commands/crd",
     "//chrome/browser/ash/system",
-    "//chrome/browser/ui/webui/ash/login",
-    "//chrome/browser/ui/webui/ash/login/testapi",
   ]
 }
 
diff --git a/chrome/browser/ash/login/users/BUILD.gn b/chrome/browser/ash/login/users/BUILD.gn
index bb99c7a..acf6b27 100644
--- a/chrome/browser/ash/login/users/BUILD.gn
+++ b/chrome/browser/ash/login/users/BUILD.gn
@@ -50,7 +50,6 @@
     "//chrome/browser/ash/settings",
     "//chrome/browser/extensions",
     "//chrome/browser/policy:onc",
-    "//chrome/browser/ui/webui/ash/login",
     "//chrome/common:chrome_features",
     "//chrome/common:constants",
     "//chrome/common:non_code_constants",
@@ -81,7 +80,6 @@
   allow_circular_includes_from = [
     "//chrome/browser/ash/login",
     "//chrome/browser/ash/policy/core",
-    "//chrome/browser/ui/webui/ash/login",
   ]
 }
 
diff --git a/chrome/browser/ash/multidevice_setup/BUILD.gn b/chrome/browser/ash/multidevice_setup/BUILD.gn
index ae51c45..31d8669 100644
--- a/chrome/browser/ash/multidevice_setup/BUILD.gn
+++ b/chrome/browser/ash/multidevice_setup/BUILD.gn
@@ -30,7 +30,6 @@
     "//chrome/browser/ash/login/quick_unlock",
     "//chrome/browser/ash/profiles",
     "//chrome/browser/profiles:profile",
-    "//chrome/browser/ui/webui/ash/login",
     "//chromeos/ash/components/multidevice/logging",
     "//chromeos/ash/components/osauth/public",
     "//chromeos/ash/services/multidevice_setup",
@@ -47,6 +46,5 @@
   allow_circular_includes_from = [
     "//chrome/browser/ash/android_sms",
     "//chrome/browser/ash/login",
-    "//chrome/browser/ui/webui/ash/login",
   ]
 }
diff --git a/chrome/browser/ash/phonehub/BUILD.gn b/chrome/browser/ash/phonehub/BUILD.gn
index 0452a16..4cbd135 100644
--- a/chrome/browser/ash/phonehub/BUILD.gn
+++ b/chrome/browser/ash/phonehub/BUILD.gn
@@ -48,7 +48,6 @@
     "//chrome/browser/favicon",
     "//chrome/browser/sync",
     "//chrome/browser/sync:factories",
-    "//chrome/browser/ui/webui/ash/multidevice_setup",
     "//chromeos/ash/components/multidevice",
     "//chromeos/ash/components/multidevice/logging",
     "//chromeos/ash/services/multidevice_setup/public/cpp:prefs",
diff --git a/chrome/browser/ash/policy/core/BUILD.gn b/chrome/browser/ash/policy/core/BUILD.gn
index 1586d674..c516ae8 100644
--- a/chrome/browser/ash/policy/core/BUILD.gn
+++ b/chrome/browser/ash/policy/core/BUILD.gn
@@ -99,7 +99,6 @@
     "//chromeos/ash/components/dbus/userdataauth:userdataauth_proto",
     "//chromeos/ash/components/install_attributes",
     "//chromeos/ash/components/network",
-    "//chromeos/ash/components/policy",
     "//chromeos/ash/components/settings",
     "//chromeos/ash/components/system",
     "//chromeos/constants",
@@ -250,7 +249,7 @@
     "//chromeos/ash/components/dbus/userdataauth",
     "//chromeos/ash/components/install_attributes",
     "//chromeos/ash/components/install_attributes:test_support",
-    "//chromeos/ash/components/policy",
+    "//chromeos/ash/components/policy/weekly_time",
     "//chromeos/ash/components/settings",
     "//chromeos/ash/components/system",
     "//chromeos/components/onc:test_support",
diff --git a/chrome/browser/ash/policy/handlers/BUILD.gn b/chrome/browser/ash/policy/handlers/BUILD.gn
index fa4bbc93..339b1e2 100644
--- a/chrome/browser/ash/policy/handlers/BUILD.gn
+++ b/chrome/browser/ash/policy/handlers/BUILD.gn
@@ -72,7 +72,6 @@
     "//chrome/browser/ash/profiles",
     "//chrome/browser/ash/settings",
     "//chrome/browser/profiles:profile",
-    "//chrome/browser/ui/webui/ash/login",
     "//chrome/browser/web_applications",
     "//chrome/common:chrome_features",
     "//chrome/common:constants",
diff --git a/chrome/browser/ash/policy/off_hours/BUILD.gn b/chrome/browser/ash/policy/off_hours/BUILD.gn
index 4bea82a..c6899c5 100644
--- a/chrome/browser/ash/policy/off_hours/BUILD.gn
+++ b/chrome/browser/ash/policy/off_hours/BUILD.gn
@@ -23,7 +23,7 @@
     "//chrome/browser/ash/settings",
     "//chromeos/ash/components/dbus",
     "//chromeos/ash/components/dbus/system_clock",
-    "//chromeos/ash/components/policy",
+    "//chromeos/ash/components/policy/weekly_time",
     "//components/policy/proto",
     "//components/prefs",
     "//components/user_manager",
@@ -51,7 +51,7 @@
     "//chrome/browser/ash/login/users:test_support",
     "//chrome/browser/ash/settings:test_support",
     "//chromeos/ash/components/dbus/system_clock",
-    "//chromeos/ash/components/policy",
+    "//chromeos/ash/components/policy/weekly_time",
     "//components/policy/proto",
     "//components/user_manager",
     "//testing/gtest",
diff --git a/chrome/browser/ash/policy/skyvault/BUILD.gn b/chrome/browser/ash/policy/skyvault/BUILD.gn
index 2272ebe..ae447ad9 100644
--- a/chrome/browser/ash/policy/skyvault/BUILD.gn
+++ b/chrome/browser/ash/policy/skyvault/BUILD.gn
@@ -52,7 +52,6 @@
     "//chrome/browser/ash/policy/core",
     "//chrome/browser/chromeos/extensions/login_screen/login/cleanup",
     "//chrome/browser/profiles:profile",
-    "//chrome/browser/ui/webui/ash/skyvault",
     "//chrome/common:chrome_features",
     "//chrome/common:constants",
     "//chromeos/ash/components/browser_context_helper",
@@ -80,7 +79,6 @@
     "//chrome/browser/ash/file_manager",
     "//chrome/browser/ash/guest_os/public",
     "//chrome/browser/ash/policy/core",
-    "//chrome/browser/ui/webui/ash/skyvault",
   ]
 }
 
diff --git a/chrome/browser/ash/policy/skyvault/file_location_utils.cc b/chrome/browser/ash/policy/skyvault/file_location_utils.cc
index 07fc736d..cf1523f01 100644
--- a/chrome/browser/ash/policy/skyvault/file_location_utils.cc
+++ b/chrome/browser/ash/policy/skyvault/file_location_utils.cc
@@ -15,11 +15,7 @@
 
 namespace {
 
-base::FilePath GetODFSPath() {
-  Profile* profile = ProfileManager::GetPrimaryUserProfile();
-  return profile ? ash::cloud_upload::GetODFSFuseboxMount(profile)
-                 : base::FilePath();
-}
+constexpr char kOdfsVirtualPath[] = "/odfs-virtual-path";
 
 base::FilePath GetDriveFsMountPointPath() {
   Profile* profile = ProfileManager::GetPrimaryUserProfile();
@@ -42,6 +38,10 @@
 
 }  // namespace
 
+base::FilePath GetODFSVirtualPath() {
+  return base::FilePath(kOdfsVirtualPath);
+}
+
 // The location string may have Google Drive or Microsoft Drive placeholders,
 // but only in the beginning, so checking that if found - at start.
 bool IsValidLocationString(const std::string& str) {
@@ -87,12 +87,8 @@
 
   const size_t one_drive_position = path_str.find(kOneDrivePolicyVariableName);
   if (one_drive_position != std::string::npos) {
-    const base::FilePath one_drive_path = GetODFSPath();
-    if (one_drive_path.empty()) {
-      // Returning default if OneDrive can't be found.
-      return base::FilePath();
-    }
-
+    // Never empty.
+    const base::FilePath one_drive_path = GetODFSVirtualPath();
     std::string result_str = path_str;
     const base::FilePath resolved =
         base::FilePath(result_str.replace(one_drive_position,
diff --git a/chrome/browser/ash/policy/skyvault/file_location_utils.h b/chrome/browser/ash/policy/skyvault/file_location_utils.h
index 2f27ed5e..e3c971ef6 100644
--- a/chrome/browser/ash/policy/skyvault/file_location_utils.h
+++ b/chrome/browser/ash/policy/skyvault/file_location_utils.h
@@ -11,6 +11,10 @@
 
 namespace policy::local_user_files {
 
+// Returns a virtual path for files that should be uploaded to OneDrive, like
+// screenshots. The path is used only in case if policy enforcement.
+base::FilePath GetODFSVirtualPath();
+
 // Returns true if `str` is a valid location string with optional placeholders.
 bool IsValidLocationString(const std::string& str);
 
diff --git a/chrome/browser/ash/policy/skyvault/file_location_utils_browsertest.cc b/chrome/browser/ash/policy/skyvault/file_location_utils_browsertest.cc
index af27701..60fb6bbe 100644
--- a/chrome/browser/ash/policy/skyvault/file_location_utils_browsertest.cc
+++ b/chrome/browser/ash/policy/skyvault/file_location_utils_browsertest.cc
@@ -6,13 +6,8 @@
 
 #include "chrome/browser/ash/drive/drive_integration_service.h"
 #include "chrome/browser/ash/file_manager/path_util.h"
-#include "chrome/browser/ash/file_manager/volume_manager.h"
-#include "chrome/browser/ash/file_system_provider/fake_extension_provider.h"
-#include "chrome/browser/ash/file_system_provider/service.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_util.h"
-#include "chrome/common/extensions/extension_constants.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "content/public/test/browser_test.h"
 
@@ -20,40 +15,6 @@
 
 namespace policy::local_user_files {
 
-namespace {
-
-void MountODFS(Profile* profile) {
-  auto fake_provider = ash::file_system_provider::FakeExtensionProvider::Create(
-      extension_misc::kODFSExtensionId);
-  auto* service = ash::file_system_provider::Service::Get(profile);
-  service->RegisterProvider(std::move(fake_provider));
-  ash::file_system_provider::ProviderId provider_id =
-      ash::file_system_provider::ProviderId::CreateFromExtensionId(
-          extension_misc::kODFSExtensionId);
-  ash::file_system_provider::MountOptions options("odfs", "ODFS");
-  ASSERT_EQ(base::File::FILE_OK,
-            service->MountFileSystem(provider_id, options));
-}
-
-void UnmountODFS(Profile* profile) {
-  const auto odfs_info = ash::cloud_upload::GetODFSInfo(profile);
-  ASSERT_TRUE(odfs_info);
-
-  file_manager::VolumeManager* volume_manager =
-      file_manager::VolumeManager::Get(profile);
-  ASSERT_TRUE(volume_manager);
-
-  for (const auto& volume : volume_manager->GetVolumeList()) {
-    if (volume->volume_label() == odfs_info->display_name()) {
-      volume_manager->RemoveVolumeForTesting(volume->volume_id());
-      return;
-    }
-  }
-  FAIL() << "Not able to unmount ODFS";
-}
-
-}  // namespace
-
 IN_PROC_BROWSER_TEST_F(FileLocationUtilsTest, ResolveGoogleDrive) {
   auto* drive_integration_service =
       drive::DriveIntegrationServiceFactory::FindForProfile(
@@ -68,13 +29,8 @@
 }
 
 IN_PROC_BROWSER_TEST_F(FileLocationUtilsTest, ResolveODFS) {
-  MountODFS(browser()->profile());
-  ASSERT_FALSE(
-      ash::cloud_upload::GetODFSFuseboxMount(browser()->profile()).empty());
-  EXPECT_EQ(ash::cloud_upload::GetODFSFuseboxMount(browser()->profile()),
-            ResolvePath("${microsoft_onedrive}"));
-  UnmountODFS(browser()->profile());
-  EXPECT_EQ(base::FilePath(), ResolvePath("${microsoft_onedrive}"));
+  // Even without mounted ODFS, it should be resolved to the virtual path.
+  EXPECT_EQ(GetODFSVirtualPath(), ResolvePath("${microsoft_onedrive}"));
 }
 
 IN_PROC_BROWSER_TEST_F(FileLocationUtilsTest, ResolveRegular) {
diff --git a/chrome/browser/ash/profiles/BUILD.gn b/chrome/browser/ash/profiles/BUILD.gn
index 150f026f..4a02188 100644
--- a/chrome/browser/ash/profiles/BUILD.gn
+++ b/chrome/browser/ash/profiles/BUILD.gn
@@ -53,12 +53,10 @@
     "//chrome/browser/ash/login/enrollment",
     "//chrome/browser/ash/login/session",
     "//chrome/browser/ash/login/ui",
-    "//chrome/browser/ui/webui/ash/login",
   ]
   allow_circular_includes_from = [
     "//chrome/browser/ash/login/enrollment",
     "//chrome/browser/ash/login/ui",
     "//chrome/browser/ash/login/session",
-    "//chrome/browser/ui/webui/ash/login",
   ]
 }
diff --git a/chrome/browser/ash/system_web_apps/apps/help_app/BUILD.gn b/chrome/browser/ash/system_web_apps/apps/help_app/BUILD.gn
index 365c64b2..be8e00b 100644
--- a/chrome/browser/ash/system_web_apps/apps/help_app/BUILD.gn
+++ b/chrome/browser/ash/system_web_apps/apps/help_app/BUILD.gn
@@ -110,6 +110,7 @@
     "//chrome/browser/ash/system_web_apps",
     "//chrome/browser/ash/system_web_apps/test_support:test_support_ui",
     "//chrome/browser/ui/ash",
+    "//chrome/browser/ui/ash/system",
     "//chrome/browser/ui/webui/ash/system_web_dialog",
     "//chrome/browser/web_applications",
     "//chrome/common",
diff --git a/chrome/browser/autofill/form_structure_browsertest.cc b/chrome/browser/autofill/form_structure_browsertest.cc
index a7ffafc..4e67c61 100644
--- a/chrome/browser/autofill/form_structure_browsertest.cc
+++ b/chrome/browser/autofill/form_structure_browsertest.cc
@@ -297,7 +297,7 @@
 #endif
 IN_PROC_BROWSER_TEST_P(FormStructureBrowserTest, MAYBE_DataDrivenHeuristics) {
 #if !BUILDFLAG(USE_INTERNAL_AUTOFILL_PATTERNS)
-  if (GetActiveHeuristicSource() != HeuristicSource::kLegacy) {
+  if (GetActiveHeuristicSource() != HeuristicSource::kLegacyRegexes) {
     GTEST_SKIP() << "DataDrivenHeuristics tests are only supported with legacy "
                     "parsing patterns";
   }
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc
index 90ef2c0..6cb8237b 100644
--- a/chrome/browser/chrome_browser_interface_binders.cc
+++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -494,6 +494,12 @@
 #include "ui/webui/resources/cr_components/certificate_manager/certificate_manager_v2.mojom.h"
 #endif  // BUILDFLAG(CHROME_ROOT_STORE_CERT_MANAGEMENT_UI)
 
+#if BUILDFLAG(ENABLE_DICE_SUPPORT)
+#include "chrome/browser/ui/webui/signin/batch_upload/batch_upload.mojom.h"
+#include "chrome/browser/ui/webui/signin/batch_upload_ui.h"
+#include "components/signin/public/base/signin_switches.h"
+#endif  // BUILDFLAG(ENABLE_DICE_SUPPORT)
+
 namespace chrome::internal {
 
 using content::RegisterWebUIControllerInterfaceBinder;
@@ -1846,6 +1852,13 @@
   }
 #endif
 
+#if BUILDFLAG(ENABLE_DICE_SUPPORT)
+  if (base::FeatureList::IsEnabled(switches::kBatchUploadDesktop)) {
+    RegisterWebUIControllerInterfaceBinder<
+        batch_upload::mojom::PageHandlerFactory, BatchUploadUI>(map);
+  }
+#endif  // BUILDFLAG(ENABLE_DICE_SUPPORT)
+
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   if (ash::features::IsFocusModeEnabled()) {
     RegisterWebUIControllerInterfaceBinder<
diff --git a/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingTabManager.java b/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingTabManager.java
index 0cacf04..7066c321 100644
--- a/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingTabManager.java
+++ b/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingTabManager.java
@@ -497,7 +497,8 @@
         DataSharingService dataSharingService = DataSharingServiceFactory.getForProfile(profile);
 
         SavedTabGroup existingGroup = tabGroupService.getGroup(localTabGroupId);
-        if (existingGroup != null && existingGroup.collaborationId != null) {
+        assert existingGroup != null : "Group not found in TabGroupSyncService.";
+        if (existingGroup.collaborationId != null) {
             dataSharingService.ensureGroupVisibility(
                     existingGroup.collaborationId,
                     (result) -> {
diff --git a/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingTabManagerUnitTest.java b/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingTabManagerUnitTest.java
index b3e179c..4485bfa 100644
--- a/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingTabManagerUnitTest.java
+++ b/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingTabManagerUnitTest.java
@@ -354,6 +354,9 @@
                 .when(mDistillerUrlUtilsJniMock)
                 .getOriginalUrlFromDistillerUrl(any(String.class));
 
+        mSavedTabGroup.collaborationId = null;
+        doReturn(mSavedTabGroup).when(mTabGroupSyncService).getGroup(LOCAL_ID);
+
         mDataSharingTabManager.createGroupFlow(
                 mActivity, TEST_GROUP_DISPLAY_NAME, LOCAL_ID, mCreateGroupFinishedCallback);
 
diff --git a/chrome/browser/device_reauth/chromeos/authenticator_chromeos.cc b/chrome/browser/device_reauth/chromeos/authenticator_chromeos.cc
index 304d72ba..6dca454 100644
--- a/chrome/browser/device_reauth/chromeos/authenticator_chromeos.cc
+++ b/chrome/browser/device_reauth/chromeos/authenticator_chromeos.cc
@@ -4,17 +4,11 @@
 
 #include "chrome/browser/device_reauth/chromeos/authenticator_chromeos.h"
 
-#include "ash/constants/ash_pref_names.h"
-#include "base/containers/contains.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/chromeos_buildflags.h"
-#include "chrome/browser/profiles/profile_manager.h"
-#include "components/prefs/pref_service.h"
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "ash/constants/ash_features.h"
 #include "ash/public/cpp/in_session_auth_dialog_controller.h"
-#include "chrome/browser/ash/auth/legacy_fingerprint_engine.h"
 #include "chromeos/ash/components/osauth/public/common_types.h"
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
@@ -33,11 +27,6 @@
   // its own auth timeout
   std::move(callback).Run(success);
 }
-
-bool HasFingerprintRecord(const PrefService& pref_service) {
-  return pref_service.GetInteger(ash::prefs::kQuickUnlockFingerprintRecord) !=
-         0;
-}
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
@@ -94,29 +83,3 @@
   }
 #endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
 }
-
-BiometricsStatusChromeOS AuthenticatorChromeOS::CheckIfBiometricsAvailable() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  if (!ash::features::IsBiometricsInPasswordManagerEnabled()) {
-    return BiometricsStatusChromeOS::kUnavailable;
-  }
-  const PrefService& prefs =
-      *ProfileManager::GetActiveUserProfile()->GetPrefs();
-
-  // No need for an AuthPerformer since we don't intent to perform
-  // authentication here.
-  ash::LegacyFingerprintEngine fp_engine(nullptr);
-  bool is_fingerprint_enabled = fp_engine.IsFingerprintEnabled(
-      prefs, ash::LegacyFingerprintEngine::Purpose::kAny);
-
-  if (!is_fingerprint_enabled) {
-    return BiometricsStatusChromeOS::kUnavailable;
-  }
-
-  return HasFingerprintRecord(prefs)
-             ? BiometricsStatusChromeOS::kAvailable
-             : BiometricsStatusChromeOS::kNotConfiguredForUser;
-#else
-  return BiometricsStatusChromeOS::kUnavailable;
-#endif
-}
diff --git a/chrome/browser/device_reauth/chromeos/authenticator_chromeos.h b/chrome/browser/device_reauth/chromeos/authenticator_chromeos.h
index 3b42ede2..937f092 100644
--- a/chrome/browser/device_reauth/chromeos/authenticator_chromeos.h
+++ b/chrome/browser/device_reauth/chromeos/authenticator_chromeos.h
@@ -8,26 +8,13 @@
 #include "base/functional/callback.h"
 #include "base/functional/callback_forward.h"
 
-// Enum specifying possible states of biometric authentication availability on
-// ChromeOS. These values are persisted to logs. Entries should not be
-// renumbered and numeric values should never be reused.
-enum class BiometricsStatusChromeOS {
-  kAvailable = 1,
-  kUnavailable = 2,
-  kNotConfiguredForUser = 3,
-  kMaxValue = kNotConfiguredForUser,
-};
-
 // This interface is need to simplify testing as chromeos authentication happens
 // through free function which is hard to mock.
 class AuthenticatorChromeOSInterface {
  public:
-  using AvailabilityCallback =
-      base::OnceCallback<void(BiometricsStatusChromeOS)>;
   virtual ~AuthenticatorChromeOSInterface() = default;
   virtual void AuthenticateUser(const std::u16string& message,
                                 base::OnceCallback<void(bool)> callback) = 0;
-  virtual BiometricsStatusChromeOS CheckIfBiometricsAvailable() = 0;
 };
 
 // Implementation of the interface that handles communication with the OS.
@@ -42,9 +29,5 @@
   void AuthenticateUser(
       const std::u16string& message,
       base::OnceCallback<void(bool)> result_callback) override;
-
-  // Returns the status for biometric authentication availability on the
-  // chromebook.
-  BiometricsStatusChromeOS CheckIfBiometricsAvailable() override;
 };
 #endif  // CHROME_BROWSER_DEVICE_REAUTH_CHROMEOS_AUTHENTICATOR_CHROMEOS_H_
diff --git a/chrome/browser/device_reauth/chromeos/device_authenticator_chromeos.cc b/chrome/browser/device_reauth/chromeos/device_authenticator_chromeos.cc
index 7afb342..a70e3ed 100644
--- a/chrome/browser/device_reauth/chromeos/device_authenticator_chromeos.cc
+++ b/chrome/browser/device_reauth/chromeos/device_authenticator_chromeos.cc
@@ -7,10 +7,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/notreached.h"
 #include "base/task/sequenced_task_runner.h"
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/profiles/profile.h"
-#include "components/password_manager/core/common/password_manager_pref_names.h"
-#include "components/prefs/pref_service.h"
 
 DeviceAuthenticatorChromeOS::DeviceAuthenticatorChromeOS(
     std::unique_ptr<AuthenticatorChromeOSInterface> authenticator,
@@ -24,30 +20,17 @@
 DeviceAuthenticatorChromeOS::~DeviceAuthenticatorChromeOS() = default;
 
 bool DeviceAuthenticatorChromeOS::CanAuthenticateWithBiometrics() {
-  BiometricsStatusChromeOS status =
-      authenticator_->CheckIfBiometricsAvailable();
-  bool is_available = status == BiometricsStatusChromeOS::kAvailable;
-
-  CHECK(g_browser_process);
-  CHECK(g_browser_process->local_state());
-
-  if (is_available) {
-    // If biometrics is available, we should record that at one point in time
-    // biometrics was available on this device. This will never be set to false
-    // after setting to true here as we only record this when biometrics is
-    // available.
-    g_browser_process->local_state()->SetBoolean(
-        password_manager::prefs::kHadBiometricsAvailable, /*value=*/true);
-  }
-  return is_available;
+  // TODO(crbug.com/40265846): Add implementation of the biometric
+  // authentication.
+  NOTIMPLEMENTED();
+  return false;
 }
 
 bool DeviceAuthenticatorChromeOS::CanAuthenticateWithBiometricOrScreenLock() {
-  // We check if we can authenticate strictly with biometrics first as this
-  // function has important side effects such as logging metrics related to how
-  // often users have biometrics available, and setting a pref that denotes that
-  // at one point biometrics was available on this device.
-  return CanAuthenticateWithBiometrics();
+  // TODO(crbug.com/40265846): Add implementation of the biometric or screen
+  // lock authentication.
+  NOTIMPLEMENTED();
+  return false;
 }
 
 void DeviceAuthenticatorChromeOS::AuthenticateWithMessage(
diff --git a/chrome/browser/device_reauth/chromeos/device_authenticator_chromeos_unittest.cc b/chrome/browser/device_reauth/chromeos/device_authenticator_chromeos_unittest.cc
index c089201..304551e7 100644
--- a/chrome/browser/device_reauth/chromeos/device_authenticator_chromeos_unittest.cc
+++ b/chrome/browser/device_reauth/chromeos/device_authenticator_chromeos_unittest.cc
@@ -4,19 +4,14 @@
 
 #include "chrome/browser/device_reauth/chromeos/device_authenticator_chromeos.h"
 
-#include "ash/constants/ash_features.h"
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/mock_callback.h"
-#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/time/time.h"
-#include "chrome/test/base/scoped_testing_local_state.h"
-#include "chrome/test/base/testing_browser_process.h"
 #include "components/device_reauth/device_reauth_metrics_util.h"
-#include "components/password_manager/core/common/password_manager_pref_names.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -24,7 +19,6 @@
 
 using device_reauth::DeviceAuthenticator;
 using device_reauth::ReauthResult;
-using ::testing::Return;
 
 class MockSystemAuthenticator : public AuthenticatorChromeOSInterface {
  public:
@@ -33,24 +27,21 @@
               (const std::u16string& message,
                base::OnceCallback<void(bool)> callback),
               (override));
-  MOCK_METHOD(BiometricsStatusChromeOS,
-              CheckIfBiometricsAvailable,
-              (),
-              (override));
 };
 
 constexpr base::TimeDelta kAuthValidityPeriod = base::Seconds(60);
 constexpr char kHistogramName[] =
     "PasswordManager.ReauthToAccessPasswordInSettings";
 
+}  // namespace
+
 class DeviceAuthenticatorChromeOSTest : public testing::Test {
  public:
   DeviceAuthenticatorChromeOSTest()
       : device_authenticator_params_(
             kAuthValidityPeriod,
             device_reauth::DeviceAuthSource::kPasswordManager,
-            kHistogramName),
-        testing_local_state_(TestingBrowserProcess::GetGlobal()) {}
+            kHistogramName) {}
   void SetUp() override {
     std::unique_ptr<MockSystemAuthenticator> system_authenticator =
         std::make_unique<MockSystemAuthenticator>();
@@ -65,8 +56,6 @@
     return *system_authenticator_;
   }
 
-  ScopedTestingLocalState& local_state() { return testing_local_state_; }
-
   base::test::TaskEnvironment& task_environment() { return task_environment_; }
 
   base::HistogramTester& histogram_tester() { return histogram_tester_; }
@@ -86,7 +75,6 @@
   base::test::TaskEnvironment task_environment_{
       base::test::TaskEnvironment::TimeSource::MOCK_TIME};
   std::unique_ptr<DeviceAuthenticatorChromeOS> authenticator_;
-  ScopedTestingLocalState testing_local_state_;
   base::HistogramTester histogram_tester_;
 
   // This is owned by the authenticator.
@@ -192,72 +180,3 @@
   histogram_tester().ExpectUniqueSample(kHistogramName, ReauthResult::kFailure,
                                         1);
 }
-
-// Verifies that the caching mechanism for BiometricsAvailable works.
-struct TestCase {
-  const char* description;
-  BiometricsStatusChromeOS availability;
-  bool expected_result;
-  bool enable_feature;
-};
-
-class DeviceAuthenticatorChromeOSTestAvailability
-    : public DeviceAuthenticatorChromeOSTest,
-      public testing::WithParamInterface<TestCase> {
- public:
-  void SetBiometricFeatureValue(bool value) {
-    if (value) {
-      scoped_feature_list_.InitAndEnableFeature(
-          ash::features::kBiometricsInPasswordManager);
-    } else {
-      scoped_feature_list_.InitAndDisableFeature(
-          ash::features::kBiometricsInPasswordManager);
-    }
-  }
-
- private:
-  base::test::ScopedFeatureList scoped_feature_list_;
-};
-
-TEST_P(DeviceAuthenticatorChromeOSTestAvailability, AvailabilityCheck) {
-  TestCase test_case = GetParam();
-  SCOPED_TRACE(test_case.description);
-  EXPECT_CALL(system_authenticator(), CheckIfBiometricsAvailable)
-      .WillOnce(Return(test_case.availability));
-  SetBiometricFeatureValue(test_case.enable_feature);
-  EXPECT_EQ(test_case.expected_result,
-            authenticator()->CanAuthenticateWithBiometrics());
-  EXPECT_EQ(test_case.expected_result,
-            local_state().Get()->GetBoolean(
-                password_manager::prefs::kHadBiometricsAvailable));
-}
-
-INSTANTIATE_TEST_SUITE_P(
-    All,
-    DeviceAuthenticatorChromeOSTestAvailability,
-    ::testing::Values(
-        TestCase{
-            .description = "kAvailable",
-            .availability = BiometricsStatusChromeOS::kAvailable,
-            .expected_result = true,
-            .enable_feature = true,
-        },
-        TestCase{
-            .description = "kUnavailable",
-            .availability = BiometricsStatusChromeOS::kUnavailable,
-            .expected_result = false,
-            .enable_feature = true,
-        },
-        TestCase{
-            .description = "kNotConfiguredForUser",
-            .availability = BiometricsStatusChromeOS::kNotConfiguredForUser,
-            .expected_result = false,
-            .enable_feature = true,
-        },
-        TestCase{
-            .description = "Feature not enabled",
-            .availability = BiometricsStatusChromeOS::kUnavailable,
-            .expected_result = false,
-            .enable_feature = true,
-        }));
-}  // namespace
diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc
index b9e1ce0..9dcb675 100644
--- a/chrome/browser/download/chrome_download_manager_delegate.cc
+++ b/chrome/browser/download/chrome_download_manager_delegate.cc
@@ -151,6 +151,7 @@
 #include "chrome/browser/safe_browsing/download_protection/deep_scanning_request.h"
 #include "chrome/browser/safe_browsing/download_protection/download_protection_service.h"
 #include "chrome/browser/safe_browsing/download_protection/download_protection_util.h"
+#include "components/enterprise/obfuscation/core/utils.h"
 #endif
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -901,6 +902,34 @@
   return true;
 }
 
+bool ChromeDownloadManagerDelegate::ShouldObfuscateDownload(
+    download::DownloadItem* item) {
+#if BUILDFLAG(FULL_SAFE_BROWSING)
+  if (!base::FeatureList::IsEnabled(
+          enterprise_obfuscation::kEnterpriseFileObfuscation)) {
+    return false;
+  }
+
+  // Skip obfuscation for chrome-initiated downloads.
+  if (item && !item->RequireSafetyChecks()) {
+    return false;
+  }
+
+  // Skip obfuscation if there are no matching connector policies and for
+  // report-only scans.
+  Profile* profile = Profile::FromBrowserContext(
+      content::DownloadItemUtils::GetBrowserContext(item));
+  if (profile) {
+    auto settings =
+        safe_browsing::DeepScanningRequest::ShouldUploadBinary(item);
+    return settings.has_value() &&
+           settings.value().block_until_verdict ==
+               enterprise_connectors::BlockUntilVerdict::kBlock;
+  }
+#endif
+  return false;
+}
+
 bool ChromeDownloadManagerDelegate::InterceptDownloadIfApplicable(
     const GURL& url,
     const std::string& user_agent,
diff --git a/chrome/browser/download/chrome_download_manager_delegate.h b/chrome/browser/download/chrome_download_manager_delegate.h
index 2c99baa2..5fad334 100644
--- a/chrome/browser/download/chrome_download_manager_delegate.h
+++ b/chrome/browser/download/chrome_download_manager_delegate.h
@@ -112,6 +112,7 @@
   bool ShouldOpenDownload(
       download::DownloadItem* item,
       content::DownloadOpenDelayedCallback callback) override;
+  bool ShouldObfuscateDownload(download::DownloadItem* item) override;
   bool InterceptDownloadIfApplicable(
       const GURL& url,
       const std::string& user_agent,
diff --git a/chrome/browser/download/chrome_download_manager_delegate_unittest.cc b/chrome/browser/download/chrome_download_manager_delegate_unittest.cc
index c180843..f52ba93 100644
--- a/chrome/browser/download/chrome_download_manager_delegate_unittest.cc
+++ b/chrome/browser/download/chrome_download_manager_delegate_unittest.cc
@@ -78,6 +78,7 @@
 #include "chrome/browser/safe_browsing/download_protection/download_protection_service.h"
 #include "chrome/browser/safe_browsing/download_protection/download_protection_util.h"
 #include "chrome/browser/safe_browsing/test_safe_browsing_service.h"
+#include "components/enterprise/obfuscation/core/utils.h"
 #include "components/safe_browsing/core/common/features.h"
 #include "components/safe_browsing/core/common/proto/csd.pb.h"
 #include "components/safe_browsing/core/common/safe_browsing_prefs.h"
@@ -2492,6 +2493,66 @@
   policy::SetDMTokenForTesting(policy::DMToken::CreateEmptyToken());
 }
 #endif  // !BUILDFLAG(IS_WIN)
+
+TEST_F(ChromeDownloadManagerDelegateTestWithSafeBrowsing,
+       ShouldObfuscateDownload) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeature(
+      enterprise_obfuscation::kEnterpriseFileObfuscation);
+
+  std::unique_ptr<download::MockDownloadItem> download_item =
+      CreateActiveDownloadItem(0);
+
+  // Chrome-initiated download
+  EXPECT_CALL(*download_item, RequireSafetyChecks())
+      .WillRepeatedly(Return(false));
+  EXPECT_FALSE(delegate()->ShouldObfuscateDownload(download_item.get()));
+
+  // User-initiated download, no matching connector policies
+  EXPECT_CALL(*download_item, RequireSafetyChecks())
+      .WillRepeatedly(Return(true));
+  EXPECT_CALL(*delegate(), GetDownloadProtectionService())
+      .WillRepeatedly(Return(nullptr));
+  EXPECT_FALSE(delegate()->ShouldObfuscateDownload(download_item.get()));
+
+  // User-initiated download, matching connector policies
+  auto mock_protection_service =
+      std::make_unique<::testing::StrictMock<TestDownloadProtectionService>>();
+  EXPECT_CALL(*delegate(), GetDownloadProtectionService())
+      .WillRepeatedly(Return(mock_protection_service.get()));
+
+  policy::SetDMTokenForTesting(policy::DMToken::CreateValidToken("dm_token"));
+  enterprise_connectors::test::SetAnalysisConnector(
+      pref_service(), enterprise_connectors::FILE_DOWNLOADED,
+      R"({
+        "service_provider": "google",
+        "enable": [
+          {
+            "url_list": ["*"],
+            "tags": ["malware", "dlp"]
+          }
+        ],
+        "block_until_verdict": 1
+      })");
+
+  EXPECT_TRUE(delegate()->ShouldObfuscateDownload(download_item.get()));
+
+  // User-initiated download, matching connector policies, but report-only
+  enterprise_connectors::test::SetAnalysisConnector(
+      pref_service(), enterprise_connectors::FILE_DOWNLOADED,
+      R"({
+        "service_provider": "google",
+        "enable": [
+          {
+            "url_list": ["*"],
+            "tags": ["malware", "dlp"]
+          }
+        ],
+        "block_until_verdict": 0
+      })");
+
+  EXPECT_FALSE(delegate()->ShouldObfuscateDownload(download_item.get()));
+}
 #endif  // FULL_SAFE_BROWSING
 
 #if BUILDFLAG(IS_ANDROID)
diff --git a/chrome/browser/download/download_browsertest.cc b/chrome/browser/download/download_browsertest.cc
index 38c98fe..f9b0d9c 100644
--- a/chrome/browser/download/download_browsertest.cc
+++ b/chrome/browser/download/download_browsertest.cc
@@ -138,7 +138,6 @@
 #include "content/public/test/test_file_error_injector.h"
 #include "content/public/test/test_navigation_observer.h"
 #include "content/public/test/url_loader_interceptor.h"
-#include "content/public/test/url_loader_monitor.h"
 #include "extensions/browser/extension_dialog_auto_confirm.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extension_system.h"
@@ -193,7 +192,6 @@
 using content::BrowserThread;
 using content::DownloadManager;
 using content::URLLoaderInterceptor;
-using content::URLLoaderMonitor;
 using content::WebContents;
 using download::DownloadItem;
 using download::DownloadUrlParameters;
@@ -1265,9 +1263,10 @@
 }
 
 // This test verifies when fenced frame untrusted network is disabled
-// immediately after user right clicks and before "Save Image As..." is
-// selected, the download request is blocked.
-IN_PROC_BROWSER_TEST_F(FencedFrameDownloadTest, NetworkCutoffBlockSaveImageAs) {
+// immediately after user right clicks and selects "Save Image As...", the
+// download request is interrupted.
+IN_PROC_BROWSER_TEST_F(FencedFrameDownloadTest,
+                       NetworkCutoffInterruptSaveImageAs) {
   // Disable SafeBrowsing for testing.
   browser()->profile()->GetPrefs()->SetBoolean(prefs::kSafeBrowsingEnabled,
                                                false);
@@ -1311,13 +1310,11 @@
           )"));
       }));
 
-  // Get the src URL of the image element.
-  GURL image_src =
-      GURL(EvalJs(fenced_frame_rfh, "document.getElementById('image').src")
-               .ExtractString());
-
-  // Monitor requests to this URL.
-  URLLoaderMonitor monitor({image_src});
+  // Create observer for the download.
+  auto download_observer =
+      std::make_unique<content::DownloadTestObserverInterrupted>(
+          DownloadManagerForBrowser(browser()), 1,
+          content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_IGNORE);
 
   // Click inside the fenced frame.
   const gfx::PointF image_element(15, 15);
@@ -1329,10 +1326,15 @@
   // Wait for the context menu to be shown.
   context_menu_waiter.WaitForMenuOpenAndClose();
 
-  // The download request should be blocked.
-  EXPECT_EQ(monitor.WaitForRequestCompletion(image_src).error_code,
-            net::ERR_NETWORK_ACCESS_REVOKED);
-  EXPECT_TRUE(VerifyNoDownloads());
+  // The download request should be interrupted.
+  download_observer->WaitForFinished();
+
+  std::vector<raw_ptr<DownloadItem, VectorExperimental>> download_items;
+  GetDownloads(browser(), &download_items);
+  ASSERT_EQ(download_items.size(), 1UL);
+  ASSERT_EQ(download_items[0]->GetState(), DownloadItem::INTERRUPTED);
+  EXPECT_EQ(download_items[0]->GetLastReason(),
+            download::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED);
 
   // Navigate away to avoid flakiness.
   EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("about:blank")));
diff --git a/chrome/browser/enterprise/data_protection/clipboard_browsertest.cc b/chrome/browser/enterprise/data_protection/clipboard_browsertest.cc
index 7bc0575..0c25389f 100644
--- a/chrome/browser/enterprise/data_protection/clipboard_browsertest.cc
+++ b/chrome/browser/enterprise/data_protection/clipboard_browsertest.cc
@@ -31,6 +31,13 @@
 
 namespace {
 
+// TODO(crbug.com/360052665): Flaky on Mac
+#if BUILDFLAG(IS_MAC)
+#define MAYBE(x) DISABLED_##x
+#else
+#define MAYBE(x) x
+#endif
+
 // Browser tests that test data protection integration with Chrome's clipboard
 // logic. If a browser test you're adding is specific to a single
 // function/class, consider using a browsertest.cc file specific to that code.
@@ -110,7 +117,7 @@
 }  // namespace
 
 IN_PROC_BROWSER_TEST_F(DataProtectionClipboardBrowserTest,
-                       CopyBlockedByDataControls) {
+                       MAYBE(CopyBlockedByDataControls)) {
   data_controls::SetDataControls(browser()->profile()->GetPrefs(), {R"({
                     "sources": { "urls": ["*"] },
                     "restrictions": [
@@ -147,7 +154,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(DataProtectionClipboardBrowserTest,
-                       CopyWarnedByDataControls_Cancel) {
+                       MAYBE(CopyWarnedByDataControls_Cancel)) {
   data_controls::SetDataControls(browser()->profile()->GetPrefs(), {R"({
                     "sources": { "urls": ["*"] },
                     "restrictions": [
@@ -184,7 +191,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(DataProtectionClipboardBrowserTest,
-                       CopyWarnedByDataControls_Bypass) {
+                       MAYBE(CopyWarnedByDataControls_Bypass)) {
   data_controls::SetDataControls(browser()->profile()->GetPrefs(), {R"({
                     "sources": { "urls": ["*"] },
                     "restrictions": [
@@ -222,7 +229,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(DataProtectionClipboardBrowserTest,
-                       CopyAllowedByDataControls) {
+                       MAYBE(CopyAllowedByDataControls)) {
   data_controls::SetDataControls(browser()->profile()->GetPrefs(), {R"({
                     "sources": { "urls": ["google.com"] },
                     "restrictions": [
@@ -247,7 +254,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(DataProtectionClipboardBrowserTest,
-                       PasteBlockedByDataControls) {
+                       MAYBE(PasteBlockedByDataControls)) {
   data_controls::SetDataControls(browser()->profile()->GetPrefs(), {R"({
                     "destinations": { "urls": ["*"] },
                     "restrictions": [
@@ -276,7 +283,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(DataProtectionClipboardBrowserTest,
-                       PasteWarnedByDataControls_Cancel) {
+                       MAYBE(PasteWarnedByDataControls_Cancel)) {
   data_controls::SetDataControls(browser()->profile()->GetPrefs(), {R"({
                     "destinations": { "urls": ["*"] },
                     "restrictions": [
@@ -305,7 +312,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(DataProtectionClipboardBrowserTest,
-                       PasteWarnedByDataControls_Bypass) {
+                       MAYBE(PasteWarnedByDataControls_Bypass)) {
   data_controls::SetDataControls(browser()->profile()->GetPrefs(), {R"({
                     "destinations": { "urls": ["*"] },
                     "restrictions": [
@@ -334,7 +341,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(DataProtectionClipboardBrowserTest,
-                       PasteAllowedByDataControls) {
+                       MAYBE(PasteAllowedByDataControls)) {
   data_controls::SetDataControls(browser()->profile()->GetPrefs(), {R"({
                     "destinations": { "urls": ["google.com"] },
                     "restrictions": [
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn
index 2859f3c..a48702c 100644
--- a/chrome/browser/extensions/BUILD.gn
+++ b/chrome/browser/extensions/BUILD.gn
@@ -1268,7 +1268,6 @@
       "//chrome/browser/ui/ash/media_client",
       "//chrome/browser/ui/ash/shelf/app_service",
       "//chrome/browser/ui/ash/thumbnail_loader",
-      "//chrome/browser/ui/webui/ash/login",
       "//chrome/browser/ui/webui/ash/settings/pages/a11y",
       "//chromeos/ash/components/attestation",
       "//chromeos/ash/components/browser_context_helper",
@@ -1368,7 +1367,6 @@
       "//chrome/browser/ash/system_logs",
       "//chrome/browser/ui/ash/shelf/app_service",
       "//chrome/browser/ui/ash/thumbnail_loader",
-      "//chrome/browser/ui/webui/ash/login",
       "//chrome/browser/ui/webui/ash/settings/pages/a11y",
     ]
 
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index b934e186..522b78e 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -3196,8 +3196,8 @@
   },
   {
     "name": "enable-external-keyboards-in-diagnostics-app",
-    "owners": [ "jimmyxgong@chromium.org", "michaelcheco@chromium.org", "cros-peripherals@google.com" ],
-    "expiry_milestone": 140
+    "owners": [ "//ash/webui/diagnostics_ui/OWNERS" ],
+    "expiry_milestone": 160
   },
   {
     "name": "enable-fake-keyboard-heuristic",
@@ -3423,7 +3423,7 @@
   {
     "name": "enable-input-in-diagnostics-app",
     "owners": [ "//ash/webui/diagnostics_ui/OWNERS" ],
-    "expiry_milestone": 130
+    "expiry_milestone": 160
   },
   {
     "name": "enable-instant-start",
@@ -4141,8 +4141,8 @@
   },
   {
     "name": "enable-touchpads-in-diagnostics-app",
-    "owners": [ "jimmyxgong@chromium.org", "michaelcheco@chromium.org", "cros-peripherals@google.com" ],
-    "expiry_milestone": 130
+    "owners": [ "//ash/webui/diagnostics_ui/OWNERS" ],
+    "expiry_milestone": 160
   },
   {
     "name": "enable-touchscreen-calibration",
@@ -4158,8 +4158,8 @@
   },
   {
     "name": "enable-touchscreens-in-diagnostics-app",
-    "owners": [ "jimmyxgong@chromium.org", "michaelcheco@chromium.org", "cros-peripherals@google.com" ],
-    "expiry_milestone": 130
+    "owners": [ "//ash/webui/diagnostics_ui/OWNERS" ],
+    "expiry_milestone": 160
   },
   {
     "name": "enable-trait-collection-registration",
@@ -7020,11 +7020,6 @@
     "expiry_milestone": 130
   },
   {
-    "name": "password-generation-strong-label-experiment",
-    "owners": ["rgod@google.com", "chrome-password-manager-team@google.com"],
-    "expiry_milestone": 130
-  },
-  {
     "name": "password-manager-detect-username-in-uff",
     "owners": [
       "vincb@google.com",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 56cbad2..425d96e 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -2957,12 +2957,6 @@
     "Enables different experiments that modify content and behavior of the "
     "existing generated password suggestion dropdown.";
 
-const char kPasswordGenerationStrongLabelExperimentName[] =
-    "Password generation strong label experiment";
-const char kPasswordGenerationStrongLabelExperimentDescription[] =
-    "Enables adding a 'Strong password' label inside the sign-up password "
-    "field in the password generation flow.";
-
 const char kPasswordManagerShowSuggestionsOnAutofocusName[] =
     "Showing password suggestions on autofocused password forms";
 const char kPasswordManagerShowSuggestionsOnAutofocusDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 231fcc3..1f7013d 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1708,9 +1708,6 @@
 extern const char kPasswordGenerationExperimentName[];
 extern const char kPasswordGenerationExperimentDescription[];
 
-extern const char kPasswordGenerationStrongLabelExperimentName[];
-extern const char kPasswordGenerationStrongLabelExperimentDescription[];
-
 extern const char kPasswordManagerShowSuggestionsOnAutofocusName[];
 extern const char kPasswordManagerShowSuggestionsOnAutofocusDescription[];
 
diff --git a/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc b/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc
index 8adc79a..cc07e229 100644
--- a/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc
+++ b/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc
@@ -7,6 +7,7 @@
 #include <tuple>
 
 #include "base/json/json_reader.h"
+#include "base/logging.h"
 #include "base/strings/string_tokenizer.h"
 #include "base/strings/stringprintf.h"
 #include "base/test/trace_event_analyzer.h"
@@ -45,7 +46,7 @@
 static const char kGetFrameEventName[] =
     "WebMediaPlayerMSCompositor::GetCurrentFrame";
 static const char kVideoResourceEventName[] =
-    "VideoResourceUpdater::ObtainFrameResources";
+    "VideoResourceUpdater::ObtainFrameResource";
 static const char kVsyncEventName[] = "Display::DrawAndSwap";
 
 // VideoFrameSubmitter dumps the delay from the handover of a decoded remote
@@ -232,8 +233,10 @@
     TraceEventVector start_render_events;
     FindEvents(analyzer, kStartRenderEventName, match_process_id,
                &start_render_events);
-    if (start_render_events.empty())
+    if (start_render_events.empty()) {
+      DLOG(WARNING) << "No " << kStartRenderEventName << " events";
       return false;
+    }
 
     // We are only interested in vsync events coming after the first render
     // event. Earlier ones are already missed.
@@ -243,8 +246,10 @@
     TraceEventVector vsync_events;
     FindEvents(analyzer, kVsyncEventName, after_first_render_event,
                &vsync_events);
-    if (vsync_events.empty())
+    if (vsync_events.empty()) {
+      DLOG(WARNING) << "No " << kVsyncEventName << " events";
       return false;
+    }
 
     size_t found_vsync_index = 0;
     size_t skipped_frame_count = 0;
@@ -308,8 +313,10 @@
       total_durations_.push_back(total_duration);
     }
 
-    if (start_render_events.size() == skipped_frame_count)
+    if (start_render_events.size() == skipped_frame_count) {
+      DLOG(WARNING) << "All frames skipped";
       return false;
+    }
 
     // Calculate the percentage by dividing by the number of frames received.
     skipped_frame_percentage_ =
diff --git a/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/OWNERS b/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/OWNERS
index 61b5e28..08850f4 100644
--- a/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/OWNERS
+++ b/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/OWNERS
@@ -1,2 +1,2 @@
 per-file *.mojom=set noparent
-per-file *.mojom=file://ipc/SECURITY_OWNERS
\ No newline at end of file
+per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler.cc b/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler.cc
index 8298935..31ae01b 100644
--- a/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler.cc
+++ b/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler.cc
@@ -65,8 +65,7 @@
 history::mojom::TabPtr TabToMojom(const URLVisitAggregate::Tab& tab,
                                   base::Time last_active = base::Time()) {
   auto tab_mojom = history::mojom::Tab::New();
-  tab_mojom->device_type =
-      history::mojom::DeviceType(static_cast<int>(tab.visit.device_type));
+  tab_mojom->form_factor = tab.visit.device_type;
   tab_mojom->session_name = tab.session_name;
 
   base::Value::Dict dictionary;
@@ -79,10 +78,14 @@
 
 // Helper method to create mojom tab objects from HistoryEntry objects.
 history::mojom::TabPtr HistoryEntryVisitToMojom(
-    const history::AnnotatedVisit& visit) {
+    const history::AnnotatedVisit& visit,
+    const std::optional<std::string>& client_name,
+    syncer::DeviceInfo::FormFactor device_type) {
   auto tab_mojom = history::mojom::Tab::New();
-  tab_mojom->device_type =
-      history::mojom::DeviceType(history::mojom::DeviceType::kUnknown);
+  tab_mojom->form_factor = device_type;
+  if (client_name) {
+    tab_mojom->session_name = client_name.value();
+  }
 
   base::Value::Dict dictionary;
   NewTabUI::SetUrlTitleAndDirection(&dictionary, visit.url_row.title(),
@@ -379,11 +382,12 @@
             URLVisitAggregateDataType::kTab);
       }
     } else {
-      const history::AnnotatedVisit* visit =
-          visited_url_ranking::GetHistoryEntryVisitIfExists(
-              url_visit_aggregate);
-      if (visit) {
-        auto history_tab_mojom = HistoryEntryVisitToMojom(*visit);
+      const URLVisitAggregate::HistoryData* history_data =
+          GetHistoryDataIfExists(url_visit_aggregate);
+      if (history_data) {
+        auto history_tab_mojom = HistoryEntryVisitToMojom(
+            history_data->last_visited, history_data->visit.client_name,
+            history_data->visit.device_type);
         history_tab_mojom->url =
             **url_visit_aggregate.GetAssociatedURLs().begin();
         history_tab_mojom->url_key = url_visit_aggregate.url_key;
diff --git a/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler_unittest.cc b/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler_unittest.cc
index 3a03738f..39fdb5345e 100644
--- a/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler_unittest.cc
+++ b/chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler_unittest.cc
@@ -255,7 +255,7 @@
   auto tabs_mojom = RunGetTabs();
   ASSERT_EQ(2u, tabs_mojom.size());
   for (const auto& tab_mojom : tabs_mojom) {
-    ASSERT_EQ(history::mojom::DeviceType::kUnknown, tab_mojom->device_type);
+    ASSERT_EQ(syncer::DeviceInfo::FormFactor::kUnknown, tab_mojom->form_factor);
     ASSERT_EQ("sample_title", tab_mojom->title);
     ASSERT_EQ(GURL(visited_url_ranking::kSampleSearchUrl), tab_mojom->url);
   }
diff --git a/chrome/browser/password_manager/android/all_passwords_bottom_sheet_controller.cc b/chrome/browser/password_manager/android/all_passwords_bottom_sheet_controller.cc
index a25ff997..3d218641 100644
--- a/chrome/browser/password_manager/android/all_passwords_bottom_sheet_controller.cc
+++ b/chrome/browser/password_manager/android/all_passwords_bottom_sheet_controller.cc
@@ -4,9 +4,11 @@
 
 #include "chrome/browser/password_manager/android/all_passwords_bottom_sheet_controller.h"
 
+#include <memory>
 #include <vector>
 
 #include "base/feature_list.h"
+#include "chrome/browser/password_manager/android/access_loss/password_access_loss_warning_bridge_impl.h"
 #include "chrome/browser/password_manager/android/local_passwords_migration_warning_util.h"
 #include "chrome/browser/password_manager/chrome_password_manager_client.h"
 #include "chrome/browser/plus_addresses/plus_address_service_factory.h"
@@ -16,6 +18,7 @@
 #include "chrome/browser/ui/android/passwords/all_passwords_bottom_sheet_view_impl.h"
 #include "components/device_reauth/device_authenticator.h"
 #include "components/password_manager/content/browser/content_password_manager_driver.h"
+#include "components/password_manager/core/browser/features/password_features.h"
 #include "components/password_manager/core/browser/password_form.h"
 #include "components/password_manager/core/browser/password_manager_client.h"
 #include "components/password_manager/core/browser/password_manager_driver.h"
@@ -43,7 +46,8 @@
     PasswordManagerClient* client,
     PasswordReuseDetectionManagerClient*
         password_reuse_detection_manager_client,
-    ShowMigrationWarningCallback show_migration_warning_callback)
+    ShowMigrationWarningCallback show_migration_warning_callback,
+    std::unique_ptr<PasswordAccessLossWarningBridge> access_loss_warning_bridge)
     : view_(std::move(view)),
       web_contents_(web_contents),
       profile_store_(profile_store),
@@ -56,6 +60,7 @@
           password_reuse_detection_manager_client),
       show_migration_warning_callback_(
           std::move(show_migration_warning_callback)),
+      access_loss_warning_bridge_(std::move(access_loss_warning_bridge)),
       plus_address_service_(PlusAddressServiceFactory::GetForBrowserContext(
           web_contents_->GetBrowserContext())) {}
 
@@ -73,6 +78,8 @@
       focused_field_type_(focused_field_type),
       show_migration_warning_callback_(
           base::BindRepeating(&local_password_migration::ShowWarning)),
+      access_loss_warning_bridge_(
+          std::make_unique<PasswordAccessLossWarningBridgeImpl>()),
       plus_address_service_(PlusAddressServiceFactory::GetForBrowserContext(
           web_contents_->GetBrowserContext())) {
   CHECK(web_contents_);
@@ -174,6 +181,8 @@
             kAllPasswords);
   }
 
+  TryToShowAccessLossWarningSheet();
+
   // Consumes the dismissal callback to destroy the native controller and java
   // controller after the user selects a credential.
   OnDismiss();
@@ -204,6 +213,7 @@
 
   if (auth_succeeded) {
     FillPassword(password);
+    TryToShowAccessLossWarningSheet();
   }
 
   // Consumes the dismissal callback to destroy the native controller and java
@@ -233,3 +243,18 @@
   }
   view_->Show(std::move(results[0]), focused_field_type_);
 }
+
+void AllPasswordsBottomSheetController::TryToShowAccessLossWarningSheet() {
+  if (!base::FeatureList::IsEnabled(
+          password_manager::features::
+              kUnifiedPasswordManagerLocalPasswordsAndroidAccessLossWarning)) {
+    return;
+  }
+  Profile* profile =
+      Profile::FromBrowserContext(web_contents_->GetBrowserContext());
+  if (profile && access_loss_warning_bridge_->ShouldShowAccessLossNoticeSheet(
+                     profile->GetPrefs())) {
+    access_loss_warning_bridge_->MaybeShowAccessLossNoticeSheet(
+        profile->GetPrefs(), web_contents_->GetTopLevelNativeWindow(), profile);
+  }
+}
diff --git a/chrome/browser/password_manager/android/all_passwords_bottom_sheet_controller.h b/chrome/browser/password_manager/android/all_passwords_bottom_sheet_controller.h
index 8004467..01ac41c1 100644
--- a/chrome/browser/password_manager/android/all_passwords_bottom_sheet_controller.h
+++ b/chrome/browser/password_manager/android/all_passwords_bottom_sheet_controller.h
@@ -11,6 +11,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/types/pass_key.h"
 #include "base/types/strong_alias.h"
+#include "chrome/browser/password_manager/android/access_loss/password_access_loss_warning_bridge.h"
 #include "components/autofill/core/common/mojom/autofill_types.mojom-forward.h"
 #include "components/device_reauth/device_authenticator.h"
 #include "components/password_manager/core/browser/password_manager_metrics_util.h"
@@ -61,7 +62,9 @@
       password_manager::PasswordManagerClient* client,
       safe_browsing::PasswordReuseDetectionManagerClient*
           password_reuse_detection_manager_client,
-      ShowMigrationWarningCallback show_migration_warning_callback);
+      ShowMigrationWarningCallback show_migration_warning_callback,
+      std::unique_ptr<PasswordAccessLossWarningBridge>
+          access_loss_warning_bridge);
 
   AllPasswordsBottomSheetController(
       content::WebContents* web_contents,
@@ -117,6 +120,10 @@
       std::vector<std::vector<std::unique_ptr<password_manager::PasswordForm>>>
           results);
 
+  // Shows the access loss warning sheet if needed. It's used after filling a
+  // credential.
+  void TryToShowAccessLossWarningSheet();
+
   // The controller takes |view_| ownership.
   std::unique_ptr<AllPasswordsBottomSheetView> view_;
 
@@ -161,6 +168,10 @@
   // to facilitate testing.
   ShowMigrationWarningCallback show_migration_warning_callback_;
 
+  // Bridge that is used to show the password access loss warning if it's needed
+  // after filling a credential.
+  std::unique_ptr<PasswordAccessLossWarningBridge> access_loss_warning_bridge_;
+
   // `PlusAddressService` is used to check which credentials have a plus address
   // as a username.
   raw_ptr<const plus_addresses::PlusAddressService> plus_address_service_;
diff --git a/chrome/browser/password_manager/android/all_passwords_bottom_sheet_controller_unittest.cc b/chrome/browser/password_manager/android/all_passwords_bottom_sheet_controller_unittest.cc
index 55d5cfb..620d706 100644
--- a/chrome/browser/password_manager/android/all_passwords_bottom_sheet_controller_unittest.cc
+++ b/chrome/browser/password_manager/android/all_passwords_bottom_sheet_controller_unittest.cc
@@ -10,6 +10,7 @@
 #include "base/test/mock_callback.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/types/pass_key.h"
+#include "chrome/browser/password_manager/android/access_loss/mock_password_access_loss_warning_bridge.h"
 #include "chrome/browser/password_manager/password_manager_test_util.h"
 #include "chrome/browser/plus_addresses/plus_address_service_factory.h"
 #include "chrome/browser/ui/android/passwords/all_passwords_bottom_sheet_view.h"
@@ -158,6 +159,9 @@
     std::unique_ptr<MockAllPasswordsBottomSheetView> mock_view_unique_ptr =
         std::make_unique<MockAllPasswordsBottomSheetView>();
     mock_view_ = mock_view_unique_ptr.get();
+    auto access_loss_bridge =
+        std::make_unique<MockPasswordAccessLossWarningBridge>();
+    mock_access_loss_warning_bridge_ = access_loss_bridge.get();
     all_passwords_controller_ =
         std::make_unique<AllPasswordsBottomSheetController>(
             base::PassKey<AllPasswordsBottomSheetControllerTest>(),
@@ -166,7 +170,8 @@
             dissmissal_callback_.Get(), focused_field_type,
             mock_pwd_manager_client_.get(),
             mock_pwd_reuse_detection_manager_client_.get(),
-            show_migration_warning_callback_.Get());
+            show_migration_warning_callback_.Get(),
+            std::move(access_loss_bridge));
   }
 
   std::unique_ptr<KeyedService> PlusAddressServiceTestFactory(
@@ -215,6 +220,10 @@
     return show_migration_warning_callback_;
   }
 
+  MockPasswordAccessLossWarningBridge* mock_access_loss_warning_bridge() {
+    return mock_access_loss_warning_bridge_;
+  }
+
  protected:
   plus_addresses::test::PlusAddressTestEnvironment plus_environment_;
 
@@ -234,6 +243,7 @@
       AllPasswordsBottomSheetController::ShowMigrationWarningCallback>
       show_migration_warning_callback_;
   base::test::ScopedFeatureList scoped_feature_list_;
+  raw_ptr<MockPasswordAccessLossWarningBridge> mock_access_loss_warning_bridge_;
 };
 
 TEST_F(AllPasswordsBottomSheetControllerTest, Show) {
@@ -435,12 +445,6 @@
 
 TEST_F(AllPasswordsBottomSheetControllerTest,
        ShowMigrationWarningOnPasswordFillIfEnabled) {
-  // TODO(crbug.com/40932864): Migration warning isn't reached if authenticator
-  // is present.
-  if (base::android::BuildInfo::GetInstance()->is_automotive()) {
-    GTEST_SKIP();
-  }
-
   base::test::ScopedFeatureList scoped_feature_list(
       password_manager::features::
           kUnifiedPasswordManagerLocalPasswordsMigrationWarning);
@@ -466,6 +470,87 @@
 }
 
 TEST_F(AllPasswordsBottomSheetControllerTest,
+       ShowAccessLossWarningOnUsernameFillIfEnabled) {
+  base::test::ScopedFeatureList scoped_feature_list(
+      password_manager::features::
+          kUnifiedPasswordManagerLocalPasswordsAndroidAccessLossWarning);
+  createAllPasswordsController(FocusedFieldType::kFillableUsernameField);
+  EXPECT_CALL(*mock_access_loss_warning_bridge(),
+              ShouldShowAccessLossNoticeSheet(profile()->GetPrefs()))
+      .WillRepeatedly(testing::Return(true));
+  EXPECT_CALL(
+      *mock_access_loss_warning_bridge(),
+      MaybeShowAccessLossNoticeSheet(profile()->GetPrefs(), _, profile()));
+  all_passwords_controller()->OnCredentialSelected(
+      kUsername1, kPassword, RequestsToFillPassword(false));
+}
+
+TEST_F(AllPasswordsBottomSheetControllerTest,
+       ShowAccessLossWarningAfterReauthOnPasswordFillIfEnabled) {
+  auto mock_authenticator =
+      std::make_unique<device_reauth::MockDeviceAuthenticator>();
+  EXPECT_CALL(*mock_authenticator, AuthenticateWithMessage)
+      .WillOnce([](const std::u16string&,
+                   device_reauth::DeviceAuthenticator::AuthenticateCallback
+                       callback) { std::move(callback).Run(true); });
+  EXPECT_CALL(client(), GetDeviceAuthenticator)
+      .WillOnce(Return(testing::ByMove(std::move(mock_authenticator))));
+  EXPECT_CALL(client(), IsReauthBeforeFillingRequired).WillOnce(Return(true));
+
+  base::test::ScopedFeatureList scoped_feature_list(
+      password_manager::features::
+          kUnifiedPasswordManagerLocalPasswordsAndroidAccessLossWarning);
+  createAllPasswordsController(FocusedFieldType::kFillablePasswordField);
+  EXPECT_CALL(*mock_access_loss_warning_bridge(),
+              ShouldShowAccessLossNoticeSheet(profile()->GetPrefs()))
+      .WillRepeatedly(testing::Return(true));
+  EXPECT_CALL(
+      *mock_access_loss_warning_bridge(),
+      MaybeShowAccessLossNoticeSheet(profile()->GetPrefs(), _, profile()));
+  all_passwords_controller()->OnCredentialSelected(
+      kUsername1, kPassword, RequestsToFillPassword(true));
+}
+
+TEST_F(AllPasswordsBottomSheetControllerTest,
+       ShowAccessLossWarningWithoutReauthOnPasswordFillIfEnabled) {
+  // Skipped for automotive because reauthentication is always needed there.
+  if (base::android::BuildInfo::GetInstance()->is_automotive()) {
+    GTEST_SKIP();
+  }
+
+  base::test::ScopedFeatureList scoped_feature_list(
+      password_manager::features::
+          kUnifiedPasswordManagerLocalPasswordsAndroidAccessLossWarning);
+  createAllPasswordsController(FocusedFieldType::kFillablePasswordField);
+  EXPECT_CALL(*mock_access_loss_warning_bridge(),
+              ShouldShowAccessLossNoticeSheet(profile()->GetPrefs()))
+      .WillRepeatedly(testing::Return(true));
+  EXPECT_CALL(
+      *mock_access_loss_warning_bridge(),
+      MaybeShowAccessLossNoticeSheet(profile()->GetPrefs(), _, profile()));
+  all_passwords_controller()->OnCredentialSelected(
+      kUsername1, kPassword, RequestsToFillPassword(true));
+}
+
+TEST_F(AllPasswordsBottomSheetControllerTest,
+       DoesntTriggersAccessLossWarningIfDisabled) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndDisableFeature(
+      password_manager::features::
+          kUnifiedPasswordManagerLocalPasswordsAndroidAccessLossWarning);
+  createAllPasswordsController(FocusedFieldType::kFillableUsernameField);
+  EXPECT_CALL(*mock_access_loss_warning_bridge(),
+              ShouldShowAccessLossNoticeSheet(profile()->GetPrefs()))
+      .WillRepeatedly(testing::Return(true));
+  EXPECT_CALL(
+      *mock_access_loss_warning_bridge(),
+      MaybeShowAccessLossNoticeSheet(profile()->GetPrefs(), _, profile()))
+      .Times(0);
+  all_passwords_controller()->OnCredentialSelected(
+      kUsername1, kPassword, RequestsToFillPassword(false));
+}
+
+TEST_F(AllPasswordsBottomSheetControllerTest,
        IsPlusAddress_ManualFallbackDisabled) {
   scoped_feature_list_.Reset();
   scoped_feature_list_.InitWithFeatures(
diff --git a/chrome/browser/policy/BUILD.gn b/chrome/browser/policy/BUILD.gn
index 595517a..8d0e0859 100644
--- a/chrome/browser/policy/BUILD.gn
+++ b/chrome/browser/policy/BUILD.gn
@@ -97,7 +97,6 @@
       "//chrome/browser/ash/login/session",
       "//chrome/browser/ash/policy/core",
       "//chrome/browser/ash/profiles",
-      "//chrome/browser/ui/webui/ash/login",
       "//chromeos/ash/components/install_attributes",
       "//chromeos/ash/components/network",
       "//chromeos/ash/components/settings",
@@ -109,7 +108,6 @@
     allow_circular_includes_from = [
       "//chrome/browser/ash/login",
       "//chrome/browser/ash/policy/core",
-      "//chrome/browser/ui/webui/ash/login",
     ]
   }
 }
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_notice_service.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_notice_service.cc
index b184a3b..0fcec8e 100644
--- a/chrome/browser/privacy_sandbox/privacy_sandbox_notice_service.cc
+++ b/chrome/browser/privacy_sandbox/privacy_sandbox_notice_service.cc
@@ -22,6 +22,21 @@
   return base::ValueToTime(prefs->GetValue(pref_name)).value_or(base::Time());
 }
 
+// If prefs from any surface are previously set, we should not set new prefs
+// from the migration.
+bool ShouldSetMigrationPrefs(
+    PrefService* prefs,
+    PrivacySandboxNoticeStorage* notice_storage,
+    const std::vector<std::string_view>& notice_names) {
+  for (const auto& notice_name : notice_names) {
+    auto notice_data = notice_storage->ReadNoticeData(prefs, notice_name);
+    if (notice_data && notice_data.has_value()) {
+      return false;
+    }
+  }
+  return true;
+}
+
 }  // namespace
 
 PrivacySandboxNoticeService::PrivacySandboxNoticeService(
@@ -48,55 +63,128 @@
 }
 
 // TODO(crbug.com/333406690): Remove this once the old privacy sandbox prefs are
-// migrated to the new data model.
+// migrated to the new data model. Old prefs don't differentiate between CCT and
+// BrApp, so all Clank related prefs will be classified as BrApp.
 void PrivacySandboxNoticeService::MigratePrivacySandboxPrefsToDataModel() {
   // TopicsConsentModal
   {
-// TODO(crbug.com/352577199): Once CCTs are refactored using the storage
-// service, change this migration code to take into account CCTs.
 #if BUILDFLAG(IS_ANDROID)
     std::string topics_notice_name = kTopicsConsentModalClankBrApp;
 #else
     std::string topics_notice_name = kTopicsConsentModal;
 #endif  // BUILDFLAG(IS_ANDROID)
 
-    const auto consent_update_time = GetTimeFromPref(
-        pref_service_, prefs::kPrivacySandboxTopicsConsentLastUpdateTime);
-    // Topics can be updated through the settings (kSettings) page or a notice
-    // (kConfirmation).
-    const auto* update_reason = pref_service_->GetUserPrefValue(
-        prefs::kPrivacySandboxTopicsConsentLastUpdateReason);
+    if (ShouldSetMigrationPrefs(
+            pref_service_, notice_storage_.get(),
+            {kTopicsConsentModal, kTopicsConsentModalClankBrApp,
+             kTopicsConsentModalClankCCT})) {
+      const auto consent_update_time = GetTimeFromPref(
+          pref_service_, prefs::kPrivacySandboxTopicsConsentLastUpdateTime);
+      // Topics can be updated through the settings (kSettings) page or a notice
+      // (kConfirmation).
+      const auto* update_reason = pref_service_->GetUserPrefValue(
+          prefs::kPrivacySandboxTopicsConsentLastUpdateReason);
 
-    // Only prefs set from updating a notice are migrated. If the
-    // `update_reason` isn't set at all we will leave the pref settings to their
-    // default values.
-    if (update_reason &&
-        static_cast<TopicsConsentUpdateSource>(update_reason->GetInt()) ==
-            TopicsConsentUpdateSource::kConfirmation) {
-      // We need to use kPrivacySandboxTopicsConsentGiven as it stores the
-      // consent status of the user ignoring overrides.
-      auto* consent_decision_given = pref_service_->GetUserPrefValue(
-          prefs::kPrivacySandboxTopicsConsentGiven);
-      if (consent_decision_given) {
+      // Only prefs set from updating a notice are migrated. If the
+      // `update_reason` isn't set at all we will leave the pref settings to
+      // their default values.
+      if (update_reason &&
+          static_cast<TopicsConsentUpdateSource>(update_reason->GetInt()) ==
+              TopicsConsentUpdateSource::kConfirmation) {
+        // We need to use kPrivacySandboxTopicsConsentGiven as it stores the
+        // consent status of the user ignoring overrides.
+        auto* consent_decision_given = pref_service_->GetUserPrefValue(
+            prefs::kPrivacySandboxTopicsConsentGiven);
+        if (consent_decision_given) {
+          PrivacySandboxNoticeData notice_data;
+          notice_data.notice_action_taken = consent_decision_given->GetBool()
+                                                ? NoticeActionTaken::kOptIn
+                                                : NoticeActionTaken::kOptOut;
+          notice_data.notice_action_taken_time = consent_update_time;
+          notice_storage_->MigratePrivacySandboxNoticeData(
+              pref_service_, notice_data, topics_notice_name);
+        }
+      } else if (update_reason && static_cast<TopicsConsentUpdateSource>(
+                                      update_reason->GetInt()) ==
+                                      TopicsConsentUpdateSource::kSettings) {
+        // Prefs set by settings are mapped to 'kUnknownActionPreMigration'
+        // since it's unknown what action the user took on a notice, if any
         PrivacySandboxNoticeData notice_data;
-        notice_data.notice_action_taken = consent_decision_given->GetBool()
-                                              ? NoticeActionTaken::kOptIn
-                                              : NoticeActionTaken::kOptOut;
-        notice_data.notice_action_taken_time = consent_update_time;
+        notice_data.notice_action_taken =
+            NoticeActionTaken::kUnknownActionPreMigration;
+        notice_data.notice_action_taken_time = base::Time();
         notice_storage_->MigratePrivacySandboxNoticeData(
             pref_service_, notice_data, topics_notice_name);
       }
-    } else if (update_reason && static_cast<TopicsConsentUpdateSource>(
-                                    update_reason->GetInt()) ==
-                                    TopicsConsentUpdateSource::kSettings) {
-      // Prefs set by settings are mapped to 'kUnknownActionPreMigration'
-      // since it's unknown what action the user took on a notice, if any
-      PrivacySandboxNoticeData notice_data;
-      notice_data.notice_action_taken =
-          NoticeActionTaken::kUnknownActionPreMigration;
-      notice_data.notice_action_taken_time = base::Time();
-      notice_storage_->MigratePrivacySandboxNoticeData(
-          pref_service_, notice_data, topics_notice_name);
+    }
+  }
+
+  // ProtectedAudienceMeasurementNoticeModal
+  {
+#if BUILDFLAG(IS_ANDROID)
+    std::string pam_notice_name =
+        kProtectedAudienceMeasurementNoticeModalClankBrApp;
+#else
+    std::string pam_notice_name = kProtectedAudienceMeasurementNoticeModal;
+#endif  // BUILDFLAG(IS_ANDROID)
+
+    if (ShouldSetMigrationPrefs(
+            pref_service_, notice_storage_.get(),
+            {kProtectedAudienceMeasurementNoticeModal,
+             kProtectedAudienceMeasurementNoticeModalClankBrApp,
+             kProtectedAudienceMeasurementNoticeModalClankCCT})) {
+      auto* notice_acknowledged = pref_service_->GetUserPrefValue(
+          prefs::kPrivacySandboxM1EEANoticeAcknowledged);
+      if (notice_acknowledged && notice_acknowledged->GetBool()) {
+        PrivacySandboxNoticeData notice_data;
+        notice_data.notice_action_taken = NoticeActionTaken::kAck;
+        notice_storage_->MigratePrivacySandboxNoticeData(
+            pref_service_, notice_data, pam_notice_name);
+      }
+    }
+  }
+
+  // ThreeAdsAPIsNoticeModal
+  {
+#if BUILDFLAG(IS_ANDROID)
+    std::string three_ads_apis_notice_name = kThreeAdsAPIsNoticeModalClankBrApp;
+#else
+    std::string three_ads_apis_notice_name = kThreeAdsAPIsNoticeModal;
+#endif  // BUILDFLAG(IS_ANDROID)
+    if (ShouldSetMigrationPrefs(
+            pref_service_, notice_storage_.get(),
+            {kThreeAdsAPIsNoticeModal, kThreeAdsAPIsNoticeModalClankBrApp,
+             kThreeAdsAPIsNoticeModalClankCCT})) {
+      auto* notice_acknowledged = pref_service_->GetUserPrefValue(
+          prefs::kPrivacySandboxM1RowNoticeAcknowledged);
+      if (notice_acknowledged && notice_acknowledged->GetBool()) {
+        PrivacySandboxNoticeData notice_data;
+        notice_data.notice_action_taken = NoticeActionTaken::kAck;
+        notice_storage_->MigratePrivacySandboxNoticeData(
+            pref_service_, notice_data, three_ads_apis_notice_name);
+      }
+    }
+  }
+
+  // MeasurementNoticeModal
+  {
+#if BUILDFLAG(IS_ANDROID)
+    std::string measurement_notice_name = kMeasurementNoticeModalClankBrApp;
+#else
+    std::string measurement_notice_name = kMeasurementNoticeModal;
+#endif  // BUILDFLAG(IS_ANDROID)
+    if (ShouldSetMigrationPrefs(
+            pref_service_, notice_storage_.get(),
+            {kMeasurementNoticeModal, kMeasurementNoticeModalClankBrApp,
+             kMeasurementNoticeModalClankCCT})) {
+      auto* notice_acknowledged = pref_service_->GetUserPrefValue(
+          prefs::kPrivacySandboxM1RestrictedNoticeAcknowledged);
+      if (notice_acknowledged && notice_acknowledged->GetBool()) {
+        PrivacySandboxNoticeData notice_data;
+        notice_data.notice_action_taken = NoticeActionTaken::kAck;
+        notice_storage_->MigratePrivacySandboxNoticeData(
+            pref_service_, notice_data, measurement_notice_name);
+      }
     }
   }
 }
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_notice_service_unittest.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_notice_service_unittest.cc
index 9a5cda3..0e67e57 100644
--- a/chrome/browser/privacy_sandbox/privacy_sandbox_notice_service_unittest.cc
+++ b/chrome/browser/privacy_sandbox/privacy_sandbox_notice_service_unittest.cc
@@ -34,6 +34,30 @@
 #endif
   }
 
+  std::string GetProtectedAudienceMeasurementNoticeName() {
+#if BUILDFLAG(IS_ANDROID)
+    return kProtectedAudienceMeasurementNoticeModalClankBrApp;
+#else
+    return kProtectedAudienceMeasurementNoticeModal;
+#endif
+  }
+
+  std::string GetThreeAdsAPIsNoticeName() {
+#if BUILDFLAG(IS_ANDROID)
+    return kThreeAdsAPIsNoticeModalClankBrApp;
+#else
+    return kThreeAdsAPIsNoticeModal;
+#endif
+  }
+
+  std::string GetMeasurementNoticeName() {
+#if BUILDFLAG(IS_ANDROID)
+    return kMeasurementNoticeModalClankBrApp;
+#else
+    return kMeasurementNoticeModal;
+#endif
+  }
+
   TestingPrefServiceSimple* prefs() { return &prefs_; }
 
  private:
@@ -104,5 +128,311 @@
             base::Time::FromMillisecondsSinceUnixEpoch(100));
 }
 
+// Clank specific tests.
+#if BUILDFLAG(IS_ANDROID)
+TEST_F(PrivacySandboxNoticeServiceTest,
+       DuringMigrationClankBrAppPrefsNotSetWhenTopicsSetFromCCT) {
+  /* Set old prefs. */
+  prefs()->SetInteger(
+      prefs::kPrivacySandboxTopicsConsentLastUpdateReason,
+      static_cast<int>(TopicsConsentUpdateSource::kConfirmation));
+  prefs()->SetBoolean(prefs::kPrivacySandboxTopicsConsentGiven, false);
+  prefs()->SetTime(prefs::kPrivacySandboxTopicsConsentLastUpdateTime,
+                   base::Time::FromMillisecondsSinceUnixEpoch(100));
+
+  /* Set new CCT prefs. */
+  PrivacySandboxNoticeStorage notice_storage;
+  notice_storage.SetNoticeShown(prefs(), kTopicsConsentModalClankCCT,
+                                base::Time::Now());
+  const auto result =
+      notice_storage.ReadNoticeData(prefs(), GetTopicsNoticeName());
+
+  /* Migration code. */
+  auto notice_service = PrivacySandboxNoticeService(prefs());
+  EXPECT_EQ(result, std::nullopt);
+}
+
+TEST_F(PrivacySandboxNoticeServiceTest,
+       DuringMigrationBrAppPrefsNotSetWhenTopicsSetFromDesktop) {
+  /* Set old prefs. */
+  prefs()->SetInteger(
+      prefs::kPrivacySandboxTopicsConsentLastUpdateReason,
+      static_cast<int>(TopicsConsentUpdateSource::kConfirmation));
+  prefs()->SetBoolean(prefs::kPrivacySandboxTopicsConsentGiven, false);
+  prefs()->SetTime(prefs::kPrivacySandboxTopicsConsentLastUpdateTime,
+                   base::Time::FromMillisecondsSinceUnixEpoch(100));
+
+  /* Set new CCT prefs. */
+  PrivacySandboxNoticeStorage notice_storage;
+  notice_storage.SetNoticeShown(prefs(), kTopicsConsentModal,
+                                base::Time::Now());
+  const auto result =
+      notice_storage.ReadNoticeData(prefs(), GetTopicsNoticeName());
+
+  /* Migration code. */
+  auto notice_service = PrivacySandboxNoticeService(prefs());
+  EXPECT_EQ(result, std::nullopt);
+}
+#endif  // BUILDFLAG(IS_ANDROID)
+
+#if !BUILDFLAG(IS_ANDROID)
+TEST_F(PrivacySandboxNoticeServiceTest,
+       DuringMigrationDesktopPrefsNotSetWhenTopicsSetFromBrApp) {
+  /* Set old prefs. */
+  prefs()->SetInteger(
+      prefs::kPrivacySandboxTopicsConsentLastUpdateReason,
+      static_cast<int>(TopicsConsentUpdateSource::kConfirmation));
+  prefs()->SetBoolean(prefs::kPrivacySandboxTopicsConsentGiven, false);
+  prefs()->SetTime(prefs::kPrivacySandboxTopicsConsentLastUpdateTime,
+                   base::Time::FromMillisecondsSinceUnixEpoch(100));
+
+  /* Set new prefs. */
+  PrivacySandboxNoticeStorage notice_storage;
+  notice_storage.SetNoticeShown(prefs(), kTopicsConsentModalClankBrApp,
+                                base::Time::Now());
+  const auto result =
+      notice_storage.ReadNoticeData(prefs(), GetTopicsNoticeName());
+
+  /* Migration code. */
+  auto notice_service = PrivacySandboxNoticeService(prefs());
+  EXPECT_EQ(result, std::nullopt);
+}
+
+#endif  // !BUILDFLAG(IS_ANDROID)
+
+TEST_F(PrivacySandboxNoticeServiceTest,
+       PrefsNotSetWhenMigratedFromProtectedAudienceMeasurementWithNoAck) {
+  auto notice_service = privacy_sandbox::PrivacySandboxNoticeService(prefs());
+  const auto result = notice_service.GetNoticeStorage()->ReadNoticeData(
+      prefs(), GetProtectedAudienceMeasurementNoticeName());
+  EXPECT_EQ(result, std::nullopt);
+}
+
+TEST_F(PrivacySandboxNoticeServiceTest,
+       NoticeActionSetWhenMigratedFromProtectedAudienceMeasurementWithAck) {
+  prefs()->SetBoolean(prefs::kPrivacySandboxM1EEANoticeAcknowledged, true);
+  auto notice_service = PrivacySandboxNoticeService(prefs());
+  const auto result = notice_service.GetNoticeStorage()->ReadNoticeData(
+      prefs(), GetProtectedAudienceMeasurementNoticeName());
+  EXPECT_EQ(result->schema_version, 1);
+  EXPECT_EQ(result->notice_action_taken, NoticeActionTaken::kAck);
+  EXPECT_EQ(result->notice_action_taken_time, base::Time());
+}
+
+// Clank specific tests.
+#if BUILDFLAG(IS_ANDROID)
+TEST_F(
+    PrivacySandboxNoticeServiceTest,
+    DuringMigrationClankBrAppPrefsNotSetWhenProtectedAudienceMeasurementSetFromCCT) {
+  /* Set old prefs. */
+  prefs()->SetBoolean(prefs::kPrivacySandboxM1EEANoticeAcknowledged, true);
+
+  /* Set new CCT prefs. */
+  PrivacySandboxNoticeStorage notice_storage;
+  notice_storage.SetNoticeShown(
+      prefs(), kProtectedAudienceMeasurementNoticeModalClankCCT,
+      base::Time::Now());
+  const auto result = notice_storage.ReadNoticeData(
+      prefs(), GetProtectedAudienceMeasurementNoticeName());
+
+  /* Migration code. */
+  auto notice_service = PrivacySandboxNoticeService(prefs());
+  EXPECT_EQ(result, std::nullopt);
+}
+
+TEST_F(
+    PrivacySandboxNoticeServiceTest,
+    DuringMigrationPrefsNotSetWhenProtectedAudienceMeasurementSetFromDesktop) {
+  /* Set old prefs. */
+  prefs()->SetBoolean(prefs::kPrivacySandboxM1EEANoticeAcknowledged, true);
+
+  /* Set new prefs. */
+  PrivacySandboxNoticeStorage notice_storage;
+  notice_storage.SetNoticeShown(
+      prefs(), kProtectedAudienceMeasurementNoticeModal, base::Time::Now());
+  const auto result = notice_storage.ReadNoticeData(
+      prefs(), GetProtectedAudienceMeasurementNoticeName());
+
+  /* Migration code. */
+  auto notice_service = PrivacySandboxNoticeService(prefs());
+  EXPECT_EQ(result, std::nullopt);
+}
+#endif  // BUILDFLAG(IS_ANDROID)
+
+#if !BUILDFLAG(IS_ANDROID)
+TEST_F(
+    PrivacySandboxNoticeServiceTest,
+    DuringMigrationDesktopPrefsNotSetWhenProtectedAudienceMeasurementSetFromBrApp) {
+  /* Set old prefs. */
+  prefs()->SetBoolean(prefs::kPrivacySandboxM1EEANoticeAcknowledged, true);
+
+  /* Set new prefs. */
+  PrivacySandboxNoticeStorage notice_storage;
+  notice_storage.SetNoticeShown(
+      prefs(), kProtectedAudienceMeasurementNoticeModalClankBrApp,
+      base::Time::Now());
+  const auto result = notice_storage.ReadNoticeData(
+      prefs(), GetProtectedAudienceMeasurementNoticeName());
+
+  /* Migration code. */
+  auto notice_service = PrivacySandboxNoticeService(prefs());
+  EXPECT_EQ(result, std::nullopt);
+}
+#endif  // !BUILDFLAG(IS_ANDROID)
+
+TEST_F(PrivacySandboxNoticeServiceTest,
+       PrefsNotSetWhenMigratedFromThreeAdsAPIsWithNoAck) {
+  auto notice_service = privacy_sandbox::PrivacySandboxNoticeService(prefs());
+  const auto result = notice_service.GetNoticeStorage()->ReadNoticeData(
+      prefs(), GetThreeAdsAPIsNoticeName());
+  EXPECT_EQ(result, std::nullopt);
+}
+
+TEST_F(PrivacySandboxNoticeServiceTest,
+       NoticeActionSetWhenMigratedFromThreeAdsAPIsWithAck) {
+  prefs()->SetBoolean(prefs::kPrivacySandboxM1RowNoticeAcknowledged, true);
+  auto notice_service = PrivacySandboxNoticeService(prefs());
+  const auto result = notice_service.GetNoticeStorage()->ReadNoticeData(
+      prefs(), GetThreeAdsAPIsNoticeName());
+  EXPECT_EQ(result->schema_version, 1);
+  EXPECT_EQ(result->notice_action_taken, NoticeActionTaken::kAck);
+  EXPECT_EQ(result->notice_action_taken_time, base::Time());
+}
+
+// Clank specific tests.
+#if BUILDFLAG(IS_ANDROID)
+TEST_F(PrivacySandboxNoticeServiceTest,
+       DuringMigrationClankBrAppPrefsNotSetWhenThreeAdsAPIsSetFromCCT) {
+  /* Set old prefs. */
+  prefs()->SetBoolean(prefs::kPrivacySandboxM1RowNoticeAcknowledged, true);
+
+  /* Set new CCT prefs. */
+  PrivacySandboxNoticeStorage notice_storage;
+  notice_storage.SetNoticeShown(prefs(), kThreeAdsAPIsNoticeModalClankCCT,
+                                base::Time::Now());
+  const auto result =
+      notice_storage.ReadNoticeData(prefs(), GetThreeAdsAPIsNoticeName());
+
+  /* Migration code. */
+  auto notice_service = PrivacySandboxNoticeService(prefs());
+  EXPECT_EQ(result, std::nullopt);
+}
+
+TEST_F(PrivacySandboxNoticeServiceTest,
+       DuringMigrationPrefsNotSetWhenThreeAdsAPIsSetFromDesktop) {
+  /* Set old prefs. */
+  prefs()->SetBoolean(prefs::kPrivacySandboxM1RowNoticeAcknowledged, true);
+
+  /* Set new CCT prefs. */
+  PrivacySandboxNoticeStorage notice_storage;
+  notice_storage.SetNoticeShown(prefs(), kThreeAdsAPIsNoticeModal,
+                                base::Time::Now());
+  const auto result =
+      notice_storage.ReadNoticeData(prefs(), GetThreeAdsAPIsNoticeName());
+
+  /* Migration code. */
+  auto notice_service = PrivacySandboxNoticeService(prefs());
+  EXPECT_EQ(result, std::nullopt);
+}
+#endif  // BUILDFLAG(IS_ANDROID)
+
+#if !BUILDFLAG(IS_ANDROID)
+TEST_F(PrivacySandboxNoticeServiceTest,
+       DuringMigrationDesktopPrefsNotSetWhenThreeAdsAPIsSetFromBrApp) {
+  /* Set old prefs. */
+  prefs()->SetBoolean(prefs::kPrivacySandboxM1RowNoticeAcknowledged, true);
+
+  /* Set new CCT prefs. */
+  PrivacySandboxNoticeStorage notice_storage;
+  notice_storage.SetNoticeShown(prefs(), kThreeAdsAPIsNoticeModalClankBrApp,
+                                base::Time::Now());
+  const auto result =
+      notice_storage.ReadNoticeData(prefs(), GetThreeAdsAPIsNoticeName());
+
+  /* Migration code. */
+  auto notice_service = PrivacySandboxNoticeService(prefs());
+  EXPECT_EQ(result, std::nullopt);
+}
+#endif  // !BUILDFLAG(IS_ANDROID)
+
+TEST_F(PrivacySandboxNoticeServiceTest,
+       PrefsNotSetWhenMigratedFromMeasurementWithNoAck) {
+  auto notice_service = privacy_sandbox::PrivacySandboxNoticeService(prefs());
+  const auto result = notice_service.GetNoticeStorage()->ReadNoticeData(
+      prefs(), GetMeasurementNoticeName());
+  EXPECT_EQ(result, std::nullopt);
+}
+
+TEST_F(PrivacySandboxNoticeServiceTest,
+       NoticeActionSetWhenMigratedFromMeasurementWithAck) {
+  prefs()->SetBoolean(prefs::kPrivacySandboxM1RestrictedNoticeAcknowledged,
+                      true);
+  auto notice_service = PrivacySandboxNoticeService(prefs());
+  const auto result = notice_service.GetNoticeStorage()->ReadNoticeData(
+      prefs(), GetMeasurementNoticeName());
+  EXPECT_EQ(result->schema_version, 1);
+  EXPECT_EQ(result->notice_action_taken, NoticeActionTaken::kAck);
+  EXPECT_EQ(result->notice_action_taken_time, base::Time());
+}
+
+// Clank specific tests.
+#if BUILDFLAG(IS_ANDROID)
+TEST_F(PrivacySandboxNoticeServiceTest,
+       DuringMigrationClankBrAppPrefsNotSetWhenMeasurementSetFromCCT) {
+  /* Set old prefs. */
+  prefs()->SetBoolean(prefs::kPrivacySandboxM1RestrictedNoticeAcknowledged,
+                      true);
+
+  /* Set new CCT prefs. */
+  PrivacySandboxNoticeStorage notice_storage;
+  notice_storage.SetNoticeShown(prefs(), kMeasurementNoticeModalClankCCT,
+                                base::Time::Now());
+  const auto result =
+      notice_storage.ReadNoticeData(prefs(), GetMeasurementNoticeName());
+
+  /* Migration code. */
+  auto notice_service = PrivacySandboxNoticeService(prefs());
+  EXPECT_EQ(result, std::nullopt);
+}
+
+TEST_F(PrivacySandboxNoticeServiceTest,
+       DuringMigrationPrefsNotSetWhenMeasurementSetFromDesktop) {
+  /* Set old prefs. */
+  prefs()->SetBoolean(prefs::kPrivacySandboxM1RestrictedNoticeAcknowledged,
+                      true);
+
+  /* Set new CCT prefs. */
+  PrivacySandboxNoticeStorage notice_storage;
+  notice_storage.SetNoticeShown(prefs(), kMeasurementNoticeModal,
+                                base::Time::Now());
+  const auto result =
+      notice_storage.ReadNoticeData(prefs(), GetMeasurementNoticeName());
+
+  /* Migration code. */
+  auto notice_service = PrivacySandboxNoticeService(prefs());
+  EXPECT_EQ(result, std::nullopt);
+}
+#endif  // BUILDFLAG(IS_ANDROID)
+
+#if !BUILDFLAG(IS_ANDROID)
+TEST_F(PrivacySandboxNoticeServiceTest,
+       DuringMigrationDesktopPrefsNotSetWhenMeasurementSetFromBrApp) {
+  /* Set old prefs. */
+  prefs()->SetBoolean(prefs::kPrivacySandboxM1RestrictedNoticeAcknowledged,
+                      true);
+
+  /* Set new CCT prefs. */
+  PrivacySandboxNoticeStorage notice_storage;
+  notice_storage.SetNoticeShown(prefs(), kMeasurementNoticeModalClankBrApp,
+                                base::Time::Now());
+  const auto result =
+      notice_storage.ReadNoticeData(prefs(), GetMeasurementNoticeName());
+
+  /* Migration code. */
+  auto notice_service = PrivacySandboxNoticeService(prefs());
+  EXPECT_EQ(result, std::nullopt);
+}
+#endif  // !BUILDFLAG(IS_ANDROID)
+
 }  // namespace
 }  // namespace privacy_sandbox
diff --git a/chrome/browser/profiles/batch_upload/batch_upload_browsertest.cc b/chrome/browser/profiles/batch_upload/batch_upload_browsertest.cc
index fd5c841..9dadea6 100644
--- a/chrome/browser/profiles/batch_upload/batch_upload_browsertest.cc
+++ b/chrome/browser/profiles/batch_upload/batch_upload_browsertest.cc
@@ -7,9 +7,11 @@
 #include "chrome/browser/profiles/batch_upload/batch_upload_service.h"
 #include "chrome/browser/profiles/batch_upload/batch_upload_service_factory.h"
 #include "chrome/browser/ui/browser.h"
+#include "chrome/common/webui_url_constants.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "components/signin/public/base/signin_switches.h"
 #include "content/public/test/browser_test.h"
+#include "content/public/test/test_navigation_observer.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 class BatchUploadWithFeatureOffBrowserTest : public InProcessBrowserTest {
@@ -31,6 +33,23 @@
 // TODO(b/359146556): Provide more meaningful tests when dummy implementations
 // are removed and the actual data providers are implemented.
 class BatchUploadBrowserTest : public InProcessBrowserTest {
+ public:
+  // Opens the batch upload dialog using `batch_upload_service` in `browser.
+  // Waits for the batch upload url to load if opening the view was successful.
+  bool OpenBatchUpload(BatchUploadService* batch_upload_service,
+                       Browser* browser) {
+    content::TestNavigationObserver observer{
+        GURL(chrome::kChromeUIBatchUploadURL)};
+    observer.StartWatchingNewWebContents();
+
+    bool is_opened = batch_upload_service->OpenBatchUpload(browser);
+    if (is_opened) {
+      observer.Wait();
+    }
+
+    return is_opened;
+  }
+
  private:
   base::test::ScopedFeatureList scoped_feature_list_{
       switches::kBatchUploadDesktop};
@@ -41,7 +60,7 @@
       BatchUploadServiceFactory::GetForProfile(browser()->profile());
   ASSERT_TRUE(batch_upload);
 
-  EXPECT_TRUE(batch_upload->OpenBatchUpload(browser()));
+  EXPECT_TRUE(OpenBatchUpload(batch_upload, browser()));
 }
 
 IN_PROC_BROWSER_TEST_F(
@@ -55,17 +74,17 @@
   ASSERT_TRUE(batch_upload);
 
   // Second browser opens dialog.
-  EXPECT_TRUE(batch_upload->OpenBatchUpload(browser_2));
+  EXPECT_TRUE(OpenBatchUpload(batch_upload, browser_2));
 
   // Trying to open a dialog while it is still opened on another browser fails.
   // Only one batch upload dialog should be shown at a time per profile.
-  EXPECT_FALSE(batch_upload->OpenBatchUpload(browser()));
+  EXPECT_FALSE(OpenBatchUpload(batch_upload, browser()));
 
   // Closing the browser that is displaying the dialog.
   CloseBrowserSynchronously(browser_2);
 
   // We can now display the dialog on the other browser.
-  EXPECT_TRUE(batch_upload->OpenBatchUpload(browser()));
+  EXPECT_TRUE(OpenBatchUpload(batch_upload, browser()));
 }
 
 IN_PROC_BROWSER_TEST_F(BatchUploadBrowserTest,
diff --git a/chrome/browser/profiles/profile_keyed_service_browsertest.cc b/chrome/browser/profiles/profile_keyed_service_browsertest.cc
index 2131e30c..32e71a16 100644
--- a/chrome/browser/profiles/profile_keyed_service_browsertest.cc
+++ b/chrome/browser/profiles/profile_keyed_service_browsertest.cc
@@ -17,6 +17,7 @@
 #include "chrome/common/chrome_features.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/profile_waiter.h"
+#include "components/commerce/core/commerce_feature_list.h"
 #include "components/enterprise/buildflags/buildflags.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "components/keyed_service/core/dependency_graph.h"
@@ -594,6 +595,10 @@
   };
   // clang-format on
 
+  if (base::FeatureList::IsEnabled(commerce::kProductSpecifications)) {
+    guest_active_services.insert("ProductSpecificationsService");
+  }
+
   Profile* guest_profile =
       CreateProfileAndWaitForAllTasks(ProfileManager::GetGuestProfilePath());
   ASSERT_FALSE(guest_profile->IsOffTheRecord());
diff --git a/chrome/browser/resources/BUILD.gn b/chrome/browser/resources/BUILD.gn
index 752699a..745ab36b 100644
--- a/chrome/browser/resources/BUILD.gn
+++ b/chrome/browser/resources/BUILD.gn
@@ -138,6 +138,10 @@
     ]
   }
 
+  if (enable_dice_support) {
+    public_deps += [ "signin/batch_upload:resources" ]
+  }
+
   if (enable_webui_tab_strip) {
     public_deps += [ "tab_strip:resources" ]
   }
diff --git a/chrome/browser/resources/new_tab_page/modules/v2/most_relevant_tab_resumption/module.ts b/chrome/browser/resources/new_tab_page/modules/v2/most_relevant_tab_resumption/module.ts
index 9f4346aa..385564c 100644
--- a/chrome/browser/resources/new_tab_page/modules/v2/most_relevant_tab_resumption/module.ts
+++ b/chrome/browser/resources/new_tab_page/modules/v2/most_relevant_tab_resumption/module.ts
@@ -13,7 +13,7 @@
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import type {Tab} from '../../../history_types.mojom-webui.js';
-import {DeviceType} from '../../../history_types.mojom-webui.js';
+import {FormFactor} from '../../../history_types.mojom-webui.js';
 import {I18nMixin, loadTimeData} from '../../../i18n_setup.js';
 import {ScoredURLUserAction} from '../../../most_relevant_tab_resumption.mojom-webui.js';
 import type {InfoDialogElement} from '../../info_dialog.js';
@@ -192,18 +192,18 @@
   }
 
   private computeIcon_(tab: Tab): string {
-    switch (tab.deviceType) {
-      case DeviceType.kDesktop:
+    switch (tab.formFactor) {
+      case FormFactor.kDesktop:
         return 'tab_resumption:computer';
-      case DeviceType.kPhone:
+      case FormFactor.kPhone:
         return 'tab_resumption:phone';
-      case DeviceType.kTablet:
+      case FormFactor.kTablet:
         return 'tab_resumption:tablet';
-      case DeviceType.kAutomotive:
+      case FormFactor.kAutomotive:
         return 'tab_resumption:automotive';
-      case DeviceType.kWearable:
+      case FormFactor.kWearable:
         return 'tab_resumption:wearable';
-      case DeviceType.kTv:
+      case FormFactor.kTv:
         return 'tab_resumption:tv';
       default:
         return 'tab_resumption:globe';
diff --git a/chrome/browser/resources/signin/batch_upload/BUILD.gn b/chrome/browser/resources/signin/batch_upload/BUILD.gn
new file mode 100644
index 0000000..caa87b3e
--- /dev/null
+++ b/chrome/browser/resources/signin/batch_upload/BUILD.gn
@@ -0,0 +1,28 @@
+import("//ui/webui/resources/tools/build_webui.gni")
+
+build_webui("build") {
+  grd_prefix = "batch_upload"
+
+  static_files = [ "batch_upload.html" ]
+
+  non_web_component_files = [
+    "batch_upload_app.ts",
+    "batch_upload_app.html.ts",
+    "browser_proxy.ts",
+  ]
+
+  css_files = [ "batch_upload_app.css" ]
+
+  webui_context_type = "trusted"
+
+  ts_deps = [
+    "//third_party/lit/v3_0:build_ts",
+    "//ui/webui/resources/js:build_ts",
+    "//ui/webui/resources/mojo:build_ts",
+  ]
+
+  mojo_files_deps = [
+    "//chrome/browser/ui/webui/signin/batch_upload:mojo_bindings_ts__generator",
+  ]
+  mojo_files = [ "$root_gen_dir/chrome/browser/ui/webui/signin/batch_upload/batch_upload.mojom-webui.ts" ]
+}
diff --git a/chrome/browser/resources/signin/batch_upload/OWNERS b/chrome/browser/resources/signin/batch_upload/OWNERS
new file mode 100644
index 0000000..abcdb8d0
--- /dev/null
+++ b/chrome/browser/resources/signin/batch_upload/OWNERS
@@ -0,0 +1 @@
+file://components/signin/OWNERS
diff --git a/chrome/browser/resources/signin/batch_upload/batch_upload.html b/chrome/browser/resources/signin/batch_upload/batch_upload.html
new file mode 100644
index 0000000..8088bb5
--- /dev/null
+++ b/chrome/browser/resources/signin/batch_upload/batch_upload.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<html dir="$i18n{textdirection}" lang="$i18n{language}">
+<head>
+  <meta charset="utf-8">
+  <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css">
+  <style>
+    body {
+      height: 100vh;
+      margin: 0;
+      width: 100vw;
+    }
+  </style>
+</head>
+<body>
+  <batch-upload-app></batch-upload-app>
+  <script type="module" src="batch_upload_app.js"></script>
+</body>
+</html>
diff --git a/chrome/browser/resources/signin/batch_upload/batch_upload_app.css b/chrome/browser/resources/signin/batch_upload/batch_upload_app.css
new file mode 100644
index 0000000..b77e2e5
--- /dev/null
+++ b/chrome/browser/resources/signin/batch_upload/batch_upload_app.css
@@ -0,0 +1,12 @@
+/* Copyright 2024 The Chromium Authors
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file. */
+
+/* #css_wrapper_metadata_start
+ * #type=style-lit
+ * #scheme=relative
+ * #css_wrapper_metadata_end */
+
+#example-div {
+  color: blue;
+}
diff --git a/chrome/browser/resources/signin/batch_upload/batch_upload_app.html.ts b/chrome/browser/resources/signin/batch_upload/batch_upload_app.html.ts
new file mode 100644
index 0000000..1e4de0ee
--- /dev/null
+++ b/chrome/browser/resources/signin/batch_upload/batch_upload_app.html.ts
@@ -0,0 +1,14 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {html} from '//resources/lit/v3_0/lit.rollup.js';
+
+import type {BatchUploadAppElement} from './batch_upload_app.js';
+
+export function getHtml(this: BatchUploadAppElement) {
+  return html`
+<h1>Hello World</h1>
+<div id="example-div">${this.message_}</div>
+<cr-button @click=${this.close_}>Close</cr-button>`;
+}
diff --git a/chrome/browser/resources/signin/batch_upload/batch_upload_app.ts b/chrome/browser/resources/signin/batch_upload/batch_upload_app.ts
new file mode 100644
index 0000000..2ab035cc
--- /dev/null
+++ b/chrome/browser/resources/signin/batch_upload/batch_upload_app.ts
@@ -0,0 +1,59 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './strings.m.js';
+import '//resources/cr_elements/cr_button/cr_button.js';
+
+import {loadTimeData} from '//resources/js/load_time_data.js';
+import {CrLitElement} from '//resources/lit/v3_0/lit.rollup.js';
+
+import {getCss} from './batch_upload_app.css.js';
+import {getHtml} from './batch_upload_app.html.js';
+import {BatchUploadBrowserProxyImpl} from './browser_proxy.js';
+import type {BatchUploadBrowserProxy} from './browser_proxy.js';
+
+export class BatchUploadAppElement extends CrLitElement {
+  static get is() {
+    return 'batch-upload-app';
+  }
+
+  static override get styles() {
+    return getCss();
+  }
+
+  override render() {
+    return getHtml.bind(this)();
+  }
+
+  static override get properties() {
+    return {
+      message_: {type: String},
+    };
+  }
+
+  private batchUploadBrowserProxy_: BatchUploadBrowserProxy =
+      BatchUploadBrowserProxyImpl.getInstance();
+  protected message_: string = loadTimeData.getString('message');
+
+  override connectedCallback() {
+    super.connectedCallback();
+    this.batchUploadBrowserProxy_.handler.updateViewHeight(300);
+    this.batchUploadBrowserProxy_.callbackRouter.sendData.addListener(
+        (data: string) => {
+          this.message_ = data;
+        });
+  }
+
+  protected close_() {
+    this.batchUploadBrowserProxy_.handler.close();
+  }
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'batch-upload-app': BatchUploadAppElement;
+  }
+}
+
+customElements.define(BatchUploadAppElement.is, BatchUploadAppElement);
diff --git a/chrome/browser/resources/signin/batch_upload/browser_proxy.ts b/chrome/browser/resources/signin/batch_upload/browser_proxy.ts
new file mode 100644
index 0000000..ae26094f
--- /dev/null
+++ b/chrome/browser/resources/signin/batch_upload/browser_proxy.ts
@@ -0,0 +1,35 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {PageCallbackRouter, PageHandlerFactory, PageHandlerRemote} from './batch_upload.mojom-webui.js';
+import type {PageHandlerInterface} from './batch_upload.mojom-webui.js';
+
+// Exporting the interface helps when creating a TestBrowserProxy wrapper.
+export interface BatchUploadBrowserProxy {
+  callbackRouter: PageCallbackRouter;
+  handler: PageHandlerInterface;
+}
+
+export class BatchUploadBrowserProxyImpl implements BatchUploadBrowserProxy {
+  callbackRouter: PageCallbackRouter;
+  handler: PageHandlerInterface;
+
+  private constructor() {
+    this.callbackRouter = new PageCallbackRouter();
+    this.handler = new PageHandlerRemote();
+    PageHandlerFactory.getRemote().createBatchUploadHandler(
+        this.callbackRouter.$.bindNewPipeAndPassRemote(),
+        (this.handler as PageHandlerRemote).$.bindNewPipeAndPassReceiver());
+  }
+
+  static getInstance(): BatchUploadBrowserProxy {
+    return instance || (instance = new BatchUploadBrowserProxyImpl());
+  }
+
+  static setInstance(proxy: BatchUploadBrowserProxy) {
+    instance = proxy;
+  }
+}
+
+let instance: BatchUploadBrowserProxy|null = null;
diff --git a/chrome/browser/search_engines/android/BUILD.gn b/chrome/browser/search_engines/android/BUILD.gn
index 6ad785c..d3d0520 100644
--- a/chrome/browser/search_engines/android/BUILD.gn
+++ b/chrome/browser/search_engines/android/BUILD.gn
@@ -18,6 +18,7 @@
     "java/src/org/chromium/chrome/browser/search_engines/SogouPromoDialog.java",
     "java/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceFactory.java",
     "java/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceDialogCoordinator.java",
+    "java/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceDialogMediator.java",
     "java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapter.java",
     "java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineSettings.java",
   ]
@@ -100,6 +101,7 @@
     "//components/search_engines/android:java",
     "//components/search_engines/android:test_utils_java",
     "//third_party/android_deps:guava_android_java",
+    "//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",
@@ -122,6 +124,7 @@
     "//base:base_java_test_support",
     "//chrome/browser/flags:java",
     "//chrome/test/android:chrome_java_unit_test_support",
+    "//components/search_engines/android:delegate_java",
     "//components/search_engines/android:java",
     "//components/search_engines/android:test_utils_java",
     "//content/public/test/android:content_java_test_support",
diff --git a/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceDialogCoordinator.java b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceDialogCoordinator.java
index 21cafd2..c307ca97 100644
--- a/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceDialogCoordinator.java
+++ b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceDialogCoordinator.java
@@ -4,152 +4,129 @@
 
 package org.chromium.chrome.browser.search_engines.choice_screen;
 
+import android.annotation.SuppressLint;
 import android.content.Context;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.TextView;
 
 import androidx.activity.OnBackPressedCallback;
-import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
 
-import org.chromium.base.Promise;
-import org.chromium.base.ThreadUtils;
-import org.chromium.base.supplier.Supplier;
+import org.chromium.base.Callback;
 import org.chromium.chrome.browser.search_engines.R;
+import org.chromium.chrome.browser.search_engines.choice_screen.ChoiceDialogMediator.DialogType;
 import org.chromium.components.search_engines.SearchEngineChoiceService;
 import org.chromium.ui.modaldialog.DialogDismissalCause;
 import org.chromium.ui.modaldialog.ModalDialogManager;
+import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogManagerObserver;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
 import org.chromium.ui.modelutil.PropertyModel;
 import org.chromium.ui.widget.ButtonCompat;
 
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.concurrent.TimeoutException;
+import java.util.function.Function;
 
 /**
  * Entry point to show a blocking choice dialog inviting users to finish their default app & search
  * engine choice in Android settings.
  */
-public class ChoiceDialogCoordinator {
-    @IntDef({DialogType.CHOICE_LAUNCH, DialogType.CHOICE_CONFIRM})
-    @Retention(RetentionPolicy.SOURCE)
-    private @interface DialogType {
-        int CHOICE_LAUNCH = 0;
-        int CHOICE_CONFIRM = 1;
+public class ChoiceDialogCoordinator implements ChoiceDialogMediator.Delegate {
+
+    // TODO(b/365100489): Refactor this coordinator to implement the dialog's custom view fully
+    // using the standard chromium MVC patterns. This class is a temporary shortcut.
+    interface ViewHolder {
+        View getView();
+
+        void updateViewForType(
+                @DialogType int dialogType, Callback<Integer> actionButtonClickCallback);
     }
 
-    private final Context mContext;
-    private final ModalDialogManager mModalDialogManager;
-    private final View mView;
+    private final ViewHolder mViewHolder;
+    private final ChoiceDialogMediator mMediator;
     private final PropertyModel mModel;
+    private final ModalDialogManager mModalDialogManager;
+
+    private final ModalDialogManagerObserver mDialogAddedObserver =
+            new ModalDialogManagerObserver() {
+                @Override
+                public void onDialogAdded(PropertyModel model) {
+                    if (model != mModel) return;
+
+                    mMediator.onDialogAdded();
+                }
+
+                @Override
+                public void onDialogDismissed(PropertyModel model) {
+                    if (model != mModel) return;
+
+                    // TODO(b/365100489): Look into moving this (and maybe action button click?) to
+                    // the `ModalDialogProperties.CONTROLLER` instead.
+                    mMediator.onDialogDismissed();
+                }
+            };
+
     private final OnBackPressedCallback mEmptyBackPressedCallback =
             new OnBackPressedCallback(true) {
                 @Override
                 public void handleOnBackPressed() {}
             };
-    private @DialogType int mType = DialogType.CHOICE_LAUNCH;
 
-    public static ChoiceDialogCoordinator maybeShow(
-            Context context, ModalDialogManager modalDialogManager) {
-        return maybeShowInternal(() -> new ChoiceDialogCoordinator(context, modalDialogManager));
+    public static boolean maybeShow(Context context, ModalDialogManager modalDialogManager) {
+        return maybeShowInternal(
+                searchEngineChoiceService ->
+                        new ChoiceDialogCoordinator(
+                                new ViewHolderImpl(context),
+                                modalDialogManager,
+                                searchEngineChoiceService));
     }
 
     @VisibleForTesting
-    static ChoiceDialogCoordinator maybeShowInternal(
-            Supplier<ChoiceDialogCoordinator> coordinatorSupplier) {
+    static boolean maybeShowInternal(
+            Function<SearchEngineChoiceService, ChoiceDialogCoordinator> coordinatorFactory) {
         var searchEngineChoiceService = SearchEngineChoiceService.getInstance();
         if (searchEngineChoiceService == null
                 || !searchEngineChoiceService.isDeviceChoiceDialogEligible()) {
-            return null;
+            return false;
         }
 
-        var coordinator = coordinatorSupplier.get();
-        withUiThreadTimeout(searchEngineChoiceService.shouldShowDeviceChoiceDialog(), 1000)
-                .then(
-                        shouldShow -> {
-                            if (shouldShow) coordinator.show();
-                        },
-                        unused -> {
-                            /* timeout*/
-                        });
+        coordinatorFactory.apply(searchEngineChoiceService);
 
-        return coordinator;
-    }
-
-    /** Constructs and shows the dialog. */
-    public void show() {
-        mModalDialogManager.showDialog(
-                mModel,
-                ModalDialogManager.ModalDialogType.APP,
-                ModalDialogManager.ModalDialogPriority.VERY_HIGH);
+        return true;
     }
 
     @VisibleForTesting
-    ChoiceDialogCoordinator(Context context, ModalDialogManager modalDialogManager) {
-        mContext = context;
-        mModalDialogManager = modalDialogManager;
-        mView = LayoutInflater.from(context).inflate(R.layout.blocking_choice_dialog, null);
+    ChoiceDialogCoordinator(
+            ViewHolder viewHolder,
+            ModalDialogManager modalDialogManager,
+            @NonNull SearchEngineChoiceService searchEngineChoiceService) {
+        mViewHolder = viewHolder;
         mModel =
                 new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS)
-                        .with(ModalDialogProperties.CUSTOM_VIEW, mView)
-                        .with(ModalDialogProperties.CONTROLLER, createController())
+                        .with(ModalDialogProperties.CUSTOM_VIEW, mViewHolder.getView())
+                        .with(
+                                ModalDialogProperties.CONTROLLER,
+                                new ModalDialogProperties.Controller() {
+                                    @Override
+                                    public void onClick(PropertyModel model, int buttonType) {}
+
+                                    @Override
+                                    public void onDismiss(
+                                            PropertyModel model, int dismissalCause) {}
+                                })
                         .build();
+        mModalDialogManager = modalDialogManager;
+        mMediator = new ChoiceDialogMediator(searchEngineChoiceService);
 
-        prepareView();
-        ButtonCompat button = mView.findViewById(R.id.choice_dialog_button);
-        button.setOnClickListener(
-                view -> {
-                    // TODO(b/355054464): Remove after play api is ready and add test for the logic.
-                    switch (mType) {
-                        case DialogType.CHOICE_LAUNCH -> advance();
-                        case DialogType.CHOICE_CONFIRM -> mModalDialogManager.dismissDialog(
-                                mModel, DialogDismissalCause.ACTION_ON_CONTENT);
-                    }
-                });
+        mMediator.startObserving(/* delegate= */ this);
     }
 
-    private static <T> Promise<T> withUiThreadTimeout(Promise<T> promise, long delayMillis) {
-        if (!promise.isPending()) return promise;
+    @Override
+    public void updateDialogType(@DialogType int dialogType) {
+        mViewHolder.updateViewForType(dialogType, mMediator::onActionButtonClick);
 
-        Promise<T> timeoutPromise = new Promise<>();
-        promise.then(timeoutPromise::fulfill, timeoutPromise::reject);
-        ThreadUtils.postOnUiThreadDelayed(
-                () -> {
-                    if (timeoutPromise.isPending()) {
-                        timeoutPromise.reject(new TimeoutException());
-                    }
-                },
-                delayMillis);
-        return timeoutPromise;
-    }
-
-    private ModalDialogProperties.Controller createController() {
-        return new ModalDialogProperties.Controller() {
-            @Override
-            public void onClick(PropertyModel model, int buttonType) {}
-
-            @Override
-            public void onDismiss(PropertyModel model, int dismissalCause) {
-                assert mType == DialogType.CHOICE_CONFIRM
-                        || dismissalCause == DialogDismissalCause.ACTIVITY_DESTROYED;
-            }
-        };
-    }
-
-    private void prepareView() {
-        View illustration = mView.findViewById(R.id.illustration);
-        TextView title = mView.findViewById(R.id.choice_dialog_title);
-        TextView message = mView.findViewById(R.id.choice_dialog_message);
-        ButtonCompat button = mView.findViewById(R.id.choice_dialog_button);
-        switch (mType) {
+        switch (dialogType) {
             case DialogType.CHOICE_LAUNCH -> {
-                illustration.setBackgroundResource(R.drawable.blocking_choice_dialog_illustration);
-                title.setText(R.string.blocking_choice_dialog_first_title);
-                message.setText(R.string.blocking_choice_dialog_first_message);
-                button.setText(mContext.getString(R.string.blocking_choice_dialog_first_button));
-
                 mModel.set(ModalDialogProperties.CANCEL_ON_TOUCH_OUTSIDE, false);
                 mModel.set(
                         ModalDialogProperties.APP_MODAL_DIALOG_BACK_PRESS_HANDLER,
@@ -158,24 +135,76 @@
                         mEmptyBackPressedCallback);
             }
             case DialogType.CHOICE_CONFIRM -> {
-                illustration.setBackgroundResource(R.drawable.blocking_choice_dialog_illustration);
-                title.setText(R.string.blocking_choice_dialog_second_title);
-                message.setText(R.string.blocking_choice_dialog_second_message);
-                button.setText(mContext.getString(R.string.blocking_choice_dialog_second_button));
-
                 mModel.set(ModalDialogProperties.CANCEL_ON_TOUCH_OUTSIDE, true);
                 mEmptyBackPressedCallback.remove();
             }
-            default -> throw new IllegalArgumentException("Invalid DialogType: " + mType);
+            case DialogType.UNKNOWN -> throw new IllegalStateException();
         }
     }
 
-    public void advance() {
-        if (mType == DialogType.CHOICE_CONFIRM) {
-            return;
+    @Override
+    public void showDialog() {
+        mModalDialogManager.addObserver(mDialogAddedObserver);
+        mModalDialogManager.showDialog(
+                mModel,
+                ModalDialogManager.ModalDialogType.APP,
+                ModalDialogManager.ModalDialogPriority.VERY_HIGH);
+    }
+
+    @Override
+    public void dismissDialog() {
+        mModalDialogManager.dismissDialog(mModel, DialogDismissalCause.UNKNOWN);
+    }
+
+    @Override
+    public void onMediatorDestroyed() {
+        mModalDialogManager.removeObserver(mDialogAddedObserver);
+    }
+
+    private static class ViewHolderImpl implements ViewHolder {
+        private final View mView;
+
+        @SuppressLint("InflateParams")
+        ViewHolderImpl(Context context) {
+            mView = LayoutInflater.from(context).inflate(R.layout.blocking_choice_dialog, null);
         }
 
-        mType = DialogType.CHOICE_CONFIRM;
-        prepareView();
+        @Override
+        public View getView() {
+            return mView;
+        }
+
+        @Override
+        public void updateViewForType(
+                @DialogType int dialogType, Callback<Integer> actionButtonClickCallback) {
+            View illustration = mView.findViewById(R.id.illustration);
+            TextView title = mView.findViewById(R.id.choice_dialog_title);
+            TextView message = mView.findViewById(R.id.choice_dialog_message);
+            ButtonCompat button = mView.findViewById(R.id.choice_dialog_button);
+
+            switch (dialogType) {
+                case DialogType.CHOICE_LAUNCH -> {
+                    illustration.setBackgroundResource(
+                            R.drawable.blocking_choice_dialog_illustration);
+                    title.setText(R.string.blocking_choice_dialog_first_title);
+                    message.setText(R.string.blocking_choice_dialog_first_message);
+                    button.setText(
+                            mView.getContext()
+                                    .getString(R.string.blocking_choice_dialog_first_button));
+                }
+                case DialogType.CHOICE_CONFIRM -> {
+                    illustration.setBackgroundResource(
+                            R.drawable.blocking_choice_dialog_illustration);
+                    title.setText(R.string.blocking_choice_dialog_second_title);
+                    message.setText(R.string.blocking_choice_dialog_second_message);
+                    button.setText(
+                            mView.getContext()
+                                    .getString(R.string.blocking_choice_dialog_second_button));
+                }
+                case DialogType.UNKNOWN -> throw new IllegalStateException();
+            }
+
+            button.setOnClickListener(ignored -> actionButtonClickCallback.onResult(dialogType));
+        }
     }
 }
diff --git a/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceDialogMediator.java b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceDialogMediator.java
new file mode 100644
index 0000000..6f06911
--- /dev/null
+++ b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceDialogMediator.java
@@ -0,0 +1,174 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.search_engines.choice_screen;
+
+import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import org.chromium.base.Callback;
+import org.chromium.base.Log;
+import org.chromium.base.supplier.ObservableSupplier;
+import org.chromium.components.search_engines.SearchEngineChoiceService;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+class ChoiceDialogMediator {
+    @IntDef({DialogType.UNKNOWN, DialogType.CHOICE_LAUNCH, DialogType.CHOICE_CONFIRM})
+    @Retention(RetentionPolicy.SOURCE)
+    @interface DialogType {
+        int UNKNOWN = 0;
+        int CHOICE_LAUNCH = 1;
+        int CHOICE_CONFIRM = 2;
+    }
+
+    /** See {@link #startObserving}. */
+    interface Delegate {
+        /** Rebuilds the view tp match the requested {@code dialogType}. */
+        void updateDialogType(@DialogType int dialogType);
+
+        /** Triggers the dialog to be shown. */
+        void showDialog();
+
+        /** Dismisses the dialog, whether it's currently shown or pending to be shown. */
+        void dismissDialog();
+
+        /**
+         * To be called when the mediator is getting destroyed. It does not want to get new updates
+         * about clicks, dialog events, etc.
+         */
+        void onMediatorDestroyed();
+    }
+
+    private static final String TAG = "ChoiceDialogMediator";
+
+    private final SearchEngineChoiceService mSearchEngineChoiceService;
+    private final ObservableSupplier<Boolean> mIsDeviceChoiceRequiredSupplier;
+    private final Callback<Boolean> mIsDeviceChoiceRequiredObserver;
+
+    private @DialogType int mDialogType = DialogType.UNKNOWN;
+    private boolean mIsDialogShown;
+
+    private @Nullable Delegate mDelegate;
+
+    /**
+     * Constructs the mediator for the device choice dialog. To become active and start piloting the
+     * dialog, call {@link #startObserving}.
+     *
+     * @param searchEngineChoiceService The service backing the dialog. It is used to determine
+     *     whether it needs to be shown, process user actions, etc.
+     */
+    ChoiceDialogMediator(SearchEngineChoiceService searchEngineChoiceService) {
+        mSearchEngineChoiceService = searchEngineChoiceService;
+        mIsDeviceChoiceRequiredSupplier =
+                searchEngineChoiceService.getIsDeviceChoiceRequiredSupplier();
+
+        // Need to store the lambda reference. As it changes on subsequent calls, it would otherwise
+        // be impossible to remove the observer.
+        mIsDeviceChoiceRequiredObserver = this::onIsDeviceChoiceRequiredChanged;
+    }
+
+    /**
+     * Makes the dialog subscribe to changes from the service.
+     *
+     * @param delegate processes state changes communicated by the mediator and updates the state of
+     *     the UI.
+     */
+    void startObserving(@NonNull Delegate delegate) {
+        assert mDelegate == null;
+        mDelegate = delegate;
+
+        mIsDeviceChoiceRequiredSupplier.addObserver(mIsDeviceChoiceRequiredObserver);
+    }
+
+    private void destroy() {
+        if (mDelegate == null) return;
+
+        // Prevent re-entry.
+        var delegate = mDelegate;
+        mDelegate = null;
+
+        mIsDeviceChoiceRequiredSupplier.removeObserver(mIsDeviceChoiceRequiredObserver);
+        mDialogType = DialogType.UNKNOWN;
+
+        delegate.onMediatorDestroyed();
+    }
+
+    /**
+     * Method to call when the primary action button of the dialog is tapped.
+     *
+     * @param dialogType type of the dialog at the moment the button was wired up.
+     */
+    void onActionButtonClick(@DialogType int dialogType) {
+        assert mDelegate != null;
+
+        switch (dialogType) {
+            case DialogType.CHOICE_LAUNCH -> mSearchEngineChoiceService.launchDeviceChoiceScreens();
+            case DialogType.CHOICE_CONFIRM -> mDelegate.dismissDialog();
+            case DialogType.UNKNOWN -> throw new IllegalStateException();
+        }
+    }
+
+    /** Method to call when the dialog is actually shown. */
+    void onDialogAdded() {
+        mIsDialogShown = true;
+        mSearchEngineChoiceService.notifyDeviceChoiceBlockShown();
+    }
+
+    void onDialogDismissed() {
+        mIsDialogShown = false;
+        destroy();
+    }
+
+    private void onIsDeviceChoiceRequiredChanged(@Nullable Boolean isDeviceChoiceRequired) {
+        assert mDelegate != null;
+
+        if (Boolean.TRUE.equals(isDeviceChoiceRequired)) {
+            // We expect it to happen only as the very first notification we get. Other values as
+            // first notification lead to skipping the dialog entirely.
+            assert !mIsDialogShown;
+            mDialogType = DialogType.CHOICE_LAUNCH;
+            mDelegate.updateDialogType(DialogType.CHOICE_LAUNCH);
+            mDelegate.showDialog();
+            return;
+        }
+
+        // `isDeviceChoiceRequired` being null indicates that the backend was disconnected, and
+        // false indicates that blocking the user is not necessary anymore. In both cases we'll want
+        // to unblock the user, but based on which state the UI is in, we may show some confirmation
+        // message or not.
+
+        if (mIsDialogShown
+                && Boolean.FALSE.equals(isDeviceChoiceRequired)
+                && mDialogType == DialogType.CHOICE_LAUNCH) {
+            // This is the normal flow, showing confirmation after the choice has been made.
+            mDialogType = DialogType.CHOICE_CONFIRM;
+            mDelegate.updateDialogType(DialogType.CHOICE_CONFIRM);
+            mSearchEngineChoiceService.notifyDeviceChoiceBlockCleared();
+            return;
+        }
+
+        if (mIsDialogShown && mDialogType == DialogType.CHOICE_CONFIRM) {
+            // The backend is sending us some updates while we are showing the confirmation UI. We
+            // are not blocking anyway and the user can proceed, so don't do anything about it.
+            return;
+        }
+
+        // If we get here, this is some sort of error state. Shutdown everything.
+        // Indicates that the backend was disconnected. This would make the dialog
+        // non-functional, so let's dismiss it and let the user proceed to Chrome.
+        // TODO(b/355201070): Add UMA recording.
+        Log.w(
+                TAG,
+                "Unexpected backend update received. State: "
+                        + "{mIsDialogShown=%b, mDialogType=%s, isDeviceChoiceRequired=%s}",
+                mIsDialogShown,
+                mDialogType,
+                isDeviceChoiceRequired);
+        mDelegate.dismissDialog();
+        destroy();
+    }
+}
diff --git a/chrome/browser/search_engines/android/javatests/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceScreenRenderTest.java b/chrome/browser/search_engines/android/javatests/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceScreenRenderTest.java
index f62f0e1b..d73305b 100644
--- a/chrome/browser/search_engines/android/javatests/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceScreenRenderTest.java
+++ b/chrome/browser/search_engines/android/javatests/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceScreenRenderTest.java
@@ -26,6 +26,7 @@
 import org.mockito.junit.MockitoRule;
 import org.mockito.quality.Strictness;
 
+import org.chromium.base.FeatureList;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.test.BaseActivityTestRule;
 import org.chromium.base.test.util.Batch;
@@ -35,6 +36,8 @@
 import org.chromium.chrome.browser.search_engines.R;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.ChromeRenderTestRule;
+import org.chromium.components.search_engines.FakeSearchEngineCountryDelegate;
+import org.chromium.components.search_engines.SearchEngineChoiceService;
 import org.chromium.components.search_engines.SearchEnginesFeatures;
 import org.chromium.ui.modaldialog.ModalDialogManager;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
@@ -58,25 +61,25 @@
             MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
 
     private ModalDialogManager mDialogManager;
-    private ChoiceDialogCoordinator mChoiceDialogCoordinator;
 
     @Before
     public void setUp() {
+        FeatureList.setDisableNativeForTesting(true);
         mActivityTestRule.launchActivity(null);
         mDialogManager = mActivityTestRule.getActivity().getModalDialogManager();
         ThreadUtils.runOnUiThreadBlocking(
-                () -> {
-                    mChoiceDialogCoordinator =
-                            new ChoiceDialogCoordinator(
-                                    mActivityTestRule.getActivity(), mDialogManager);
-                });
+                () ->
+                        SearchEngineChoiceService.setInstanceForTests(
+                                new SearchEngineChoiceService(
+                                        new FakeSearchEngineCountryDelegate(
+                                                /* enableLogging= */ false))));
     }
 
     @Test
     @LargeTest
     @Feature("RenderTest")
     public void testFirstChoiceScreenBlockingDialog() throws Exception {
-        ThreadUtils.runOnUiThreadBlocking(mChoiceDialogCoordinator::show);
+        ThreadUtils.runOnUiThreadBlocking(this::showDialog);
 
         mRenderTestRule.render(getDialogView(), "first_choice_screen_blocking_dialog");
     }
@@ -84,7 +87,7 @@
     @Test
     @LargeTest
     public void testFirstChoiceScreenBlockingDialogButton() {
-        ThreadUtils.runOnUiThreadBlocking(mChoiceDialogCoordinator::show);
+        ThreadUtils.runOnUiThreadBlocking(this::showDialog);
 
         onView(withId(R.id.choice_dialog_button)).inRoot(isDialog()).perform(click());
 
@@ -98,7 +101,7 @@
     @Feature("RenderTest")
     @DisabledTest(message = "b/355054464: UI is not final yet.")
     public void testSecondChoiceScreenDialog() throws Exception {
-        ThreadUtils.runOnUiThreadBlocking(mChoiceDialogCoordinator::show);
+        ThreadUtils.runOnUiThreadBlocking(this::showDialog);
 
         onView(withId(R.id.choice_dialog_button)).inRoot(isDialog()).perform(click());
 
@@ -113,4 +116,8 @@
                     return dialogModel.get(ModalDialogProperties.CUSTOM_VIEW);
                 });
     }
+
+    private void showDialog() {
+        ChoiceDialogCoordinator.maybeShow(mActivityTestRule.getActivity(), mDialogManager);
+    }
 }
diff --git a/chrome/browser/search_engines/android/junit/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceDialogCoordinatorUnitTest.java b/chrome/browser/search_engines/android/junit/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceDialogCoordinatorUnitTest.java
index 9bf7b60b..698ad6e6 100644
--- a/chrome/browser/search_engines/android/junit/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceDialogCoordinatorUnitTest.java
+++ b/chrome/browser/search_engines/android/junit/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceDialogCoordinatorUnitTest.java
@@ -4,9 +4,13 @@
 
 package org.chromium.chrome.browser.search_engines.choice_screen;
 
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.lenient;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.robolectric.Shadows.shadowOf;
@@ -17,109 +21,247 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
 import org.mockito.quality.Strictness;
 
-import org.chromium.base.Promise;
+import org.chromium.base.Callback;
+import org.chromium.base.supplier.ObservableSupplierImpl;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.base.test.util.Features;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.search_engines.choice_screen.ChoiceDialogMediator.DialogType;
 import org.chromium.components.search_engines.SearchEngineChoiceService;
 import org.chromium.components.search_engines.SearchEnginesFeatures;
+import org.chromium.ui.modaldialog.DialogDismissalCause;
+import org.chromium.ui.modaldialog.ModalDialogManager;
+import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogManagerObserver;
+import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogPriority;
+import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogType;
+import org.chromium.ui.modelutil.PropertyModel;
 
 @RunWith(BaseRobolectricTestRunner.class)
-@Features.EnableFeatures({
-    ChromeFeatureList.SEARCH_ENGINE_CHOICE,
-    SearchEnginesFeatures.CLAY_BLOCKING
-})
+@Features.EnableFeatures({SearchEnginesFeatures.CLAY_BLOCKING})
 public class ChoiceDialogCoordinatorUnitTest {
     public @Rule MockitoRule mMockitoRule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
 
-    private @Mock ChoiceDialogCoordinator mDialogCoordinator;
+    private @Mock ChoiceDialogCoordinator.ViewHolder mViewHolder;
+    private @Mock ModalDialogManager mModalDialogManager;
     private @Mock SearchEngineChoiceService mSearchEngineChoiceService;
+    private @Captor ArgumentCaptor<Callback<Integer>> mActionButtonCallbackCaptor;
 
     @Before
     public void setUp() {
         SearchEngineChoiceService.setInstanceForTests(mSearchEngineChoiceService);
+        setUpDialogObserverCapture();
     }
 
     @Test
-    public void testShouldShowDeviceChoiceDialog() {
+    public void testMaybeShow() {
         doReturn(true).when(mSearchEngineChoiceService).isDeviceChoiceDialogEligible();
-        doReturn(Promise.fulfilled(true))
+        doReturn(new ObservableSupplierImpl<>(true))
                 .when(mSearchEngineChoiceService)
-                .shouldShowDeviceChoiceDialog();
+                .getIsDeviceChoiceRequiredSupplier();
 
-        assertNotNull(ChoiceDialogCoordinator.maybeShowInternal(() -> mDialogCoordinator));
+        assertTrue(ChoiceDialogCoordinator.maybeShowInternal(this::createCoordinatorWithMocks));
+
         shadowOf(Looper.getMainLooper()).idle();
-        verify(mDialogCoordinator).show();
+        verify(mModalDialogManager)
+                .showDialog(any(), eq(ModalDialogType.APP), eq(ModalDialogPriority.VERY_HIGH));
+        verify(mSearchEngineChoiceService).notifyDeviceChoiceBlockShown();
     }
 
     @Test
-    @Features.EnableFeatures({SearchEnginesFeatures.CLAY_BLOCKING})
-    public void testShouldShowDeviceChoiceDialog_doesNotShowWhenNotEligible() {
+    public void testMaybeShow_doesNotShowWhenNotEligible() {
         doReturn(false).when(mSearchEngineChoiceService).isDeviceChoiceDialogEligible();
 
-        assertNull(ChoiceDialogCoordinator.maybeShowInternal(() -> mDialogCoordinator));
+        assertFalse(ChoiceDialogCoordinator.maybeShowInternal(this::createCoordinatorWithMocks));
+
         shadowOf(Looper.getMainLooper()).idle();
-        verify(mDialogCoordinator, never()).show();
+        verify(mModalDialogManager, never()).showDialog(any(), anyInt(), anyInt());
+        verify(mSearchEngineChoiceService, never()).notifyDeviceChoiceBlockShown();
+        verify(mSearchEngineChoiceService, never()).notifyDeviceChoiceBlockCleared();
     }
 
     @Test
-    public void testShouldShowDeviceChoiceDialog_doesNotShowWhenShouldNot() {
+    public void testMaybeShow_doesNotShowWhenNotRequired() {
         doReturn(true).when(mSearchEngineChoiceService).isDeviceChoiceDialogEligible();
-        doReturn(Promise.fulfilled(false))
+        doReturn(new ObservableSupplierImpl<>(false))
                 .when(mSearchEngineChoiceService)
-                .shouldShowDeviceChoiceDialog();
+                .getIsDeviceChoiceRequiredSupplier();
 
-        assertNotNull(ChoiceDialogCoordinator.maybeShowInternal(() -> mDialogCoordinator));
+        assertTrue(ChoiceDialogCoordinator.maybeShowInternal(this::createCoordinatorWithMocks));
+
         shadowOf(Looper.getMainLooper()).idle();
-        verify(mDialogCoordinator, never()).show();
+        verify(mModalDialogManager, never()).showDialog(any(), anyInt(), anyInt());
+        verify(mSearchEngineChoiceService, never()).notifyDeviceChoiceBlockShown();
+        verify(mSearchEngineChoiceService, never()).notifyDeviceChoiceBlockCleared();
     }
 
     @Test
-    public void testShouldShowDeviceChoiceDialog_showsAfterDelayedApproval() {
-        var pendingPromise = new Promise<Boolean>();
+    public void testMaybeShow_showsAfterDelayedApproval() {
+        var pendingSupplier = new ObservableSupplierImpl<Boolean>(null);
+        doReturn(pendingSupplier)
+                .when(mSearchEngineChoiceService)
+                .getIsDeviceChoiceRequiredSupplier();
         doReturn(true).when(mSearchEngineChoiceService).isDeviceChoiceDialogEligible();
-        doReturn(pendingPromise).when(mSearchEngineChoiceService).shouldShowDeviceChoiceDialog();
 
-        assertNotNull(ChoiceDialogCoordinator.maybeShowInternal(() -> mDialogCoordinator));
-        shadowOf(Looper.getMainLooper()).idle();
-        verify(mDialogCoordinator, never()).show();
+        assertTrue(ChoiceDialogCoordinator.maybeShowInternal(this::createCoordinatorWithMocks));
+        assertTrue(pendingSupplier.hasObservers()); // The dialog started observing.
 
-        pendingPromise.fulfill(true);
         shadowOf(Looper.getMainLooper()).idle();
-        verify(mDialogCoordinator).show();
+        verify(mModalDialogManager, never()).showDialog(any(), anyInt(), anyInt());
+        verify(mSearchEngineChoiceService, never()).notifyDeviceChoiceBlockShown();
+
+        pendingSupplier.set(true);
+
+        shadowOf(Looper.getMainLooper()).idle();
+        verify(mModalDialogManager)
+                .showDialog(any(), eq(ModalDialogType.APP), eq(ModalDialogPriority.VERY_HIGH));
+        verify(mSearchEngineChoiceService).notifyDeviceChoiceBlockShown();
+        verify(mSearchEngineChoiceService, never()).notifyDeviceChoiceBlockCleared();
     }
 
     @Test
-    public void testShouldShowDeviceChoiceDialog_doesNotShowAfterDelayedDisapproval() {
-        var pendingPromise = new Promise<Boolean>();
+    public void testMaybeShow_doesNotShowAfterDelayedDisapproval() {
+        var pendingSupplier = new ObservableSupplierImpl<Boolean>(null);
+        doReturn(pendingSupplier)
+                .when(mSearchEngineChoiceService)
+                .getIsDeviceChoiceRequiredSupplier();
         doReturn(true).when(mSearchEngineChoiceService).isDeviceChoiceDialogEligible();
-        doReturn(pendingPromise).when(mSearchEngineChoiceService).shouldShowDeviceChoiceDialog();
 
-        assertNotNull(ChoiceDialogCoordinator.maybeShowInternal(() -> mDialogCoordinator));
-        shadowOf(Looper.getMainLooper()).idle();
-        verify(mDialogCoordinator, never()).show();
+        assertTrue(ChoiceDialogCoordinator.maybeShowInternal(this::createCoordinatorWithMocks));
+        assertTrue(pendingSupplier.hasObservers()); // The dialog started observing.
 
-        pendingPromise.fulfill(false);
         shadowOf(Looper.getMainLooper()).idle();
-        verify(mDialogCoordinator, never()).show();
+        verify(mModalDialogManager, never()).showDialog(any(), anyInt(), anyInt());
+
+        pendingSupplier.set(false);
+
+        shadowOf(Looper.getMainLooper()).idle();
+        verify(mModalDialogManager, never()).showDialog(any(), anyInt(), anyInt());
+        verify(mSearchEngineChoiceService, never()).notifyDeviceChoiceBlockShown();
+        verify(mSearchEngineChoiceService, never()).notifyDeviceChoiceBlockCleared();
+        assertFalse(pendingSupplier.hasObservers()); // The dialog stopped observing.
     }
 
     @Test
-    public void testShouldShowDeviceChoiceDialog_doesNotShowAfterTimeout() {
-        var pendingPromise = new Promise<Boolean>();
+    public void testMaybeShow_unblocksDialogAfterFalseReceived() {
+        var pendingSupplier = new ObservableSupplierImpl<>(true);
+        doReturn(pendingSupplier)
+                .when(mSearchEngineChoiceService)
+                .getIsDeviceChoiceRequiredSupplier();
         doReturn(true).when(mSearchEngineChoiceService).isDeviceChoiceDialogEligible();
-        doReturn(pendingPromise).when(mSearchEngineChoiceService).shouldShowDeviceChoiceDialog();
 
-        assertNotNull(ChoiceDialogCoordinator.maybeShowInternal(() -> mDialogCoordinator));
+        assertTrue(ChoiceDialogCoordinator.maybeShowInternal(this::createCoordinatorWithMocks));
+        assertTrue(pendingSupplier.hasObservers()); // The dialog started observing.
+
         shadowOf(Looper.getMainLooper()).idle();
-        verify(mDialogCoordinator, never()).show();
+        verify(mModalDialogManager)
+                .showDialog(any(), eq(ModalDialogType.APP), eq(ModalDialogPriority.VERY_HIGH));
+        verify(mSearchEngineChoiceService).notifyDeviceChoiceBlockShown();
+        verify(mViewHolder).updateViewForType(eq(DialogType.CHOICE_LAUNCH), any());
 
-        shadowOf(Looper.getMainLooper()).runToEndOfTasks(); // Advance past the timeout delay.
-        verify(mDialogCoordinator, never()).show();
+        pendingSupplier.set(false);
+
+        shadowOf(Looper.getMainLooper()).idle();
+        verify(mSearchEngineChoiceService).notifyDeviceChoiceBlockCleared();
+        verify(mViewHolder)
+                .updateViewForType(
+                        eq(DialogType.CHOICE_CONFIRM), mActionButtonCallbackCaptor.capture());
+
+        mActionButtonCallbackCaptor.getValue().onResult(DialogType.CHOICE_CONFIRM);
+
+        verify(mModalDialogManager).dismissDialog(any(), eq(DialogDismissalCause.UNKNOWN));
+        assertFalse(pendingSupplier.hasObservers()); // The dialog stopped observing.
+    }
+
+    @Test
+    public void testMaybeShow_dismissesDialogAfterNullReceived() {
+        var pendingSupplier = new ObservableSupplierImpl<>(true);
+        doReturn(pendingSupplier)
+                .when(mSearchEngineChoiceService)
+                .getIsDeviceChoiceRequiredSupplier();
+        doReturn(true).when(mSearchEngineChoiceService).isDeviceChoiceDialogEligible();
+
+        assertTrue(ChoiceDialogCoordinator.maybeShowInternal(this::createCoordinatorWithMocks));
+        assertTrue(pendingSupplier.hasObservers()); // The dialog started observing.
+
+        shadowOf(Looper.getMainLooper()).idle();
+        verify(mModalDialogManager)
+                .showDialog(any(), eq(ModalDialogType.APP), eq(ModalDialogPriority.VERY_HIGH));
+        verify(mSearchEngineChoiceService).notifyDeviceChoiceBlockShown();
+        verify(mViewHolder).updateViewForType(eq(DialogType.CHOICE_LAUNCH), any());
+
+        pendingSupplier.set(null);
+
+        shadowOf(Looper.getMainLooper()).idle();
+        verify(mModalDialogManager).dismissDialog(any(), eq(DialogDismissalCause.UNKNOWN));
+        verify(mSearchEngineChoiceService, never()).notifyDeviceChoiceBlockCleared();
+        assertFalse(pendingSupplier.hasObservers()); // The dialog stopped observing.
+    }
+
+    private ChoiceDialogCoordinator createCoordinatorWithMocks(
+            SearchEngineChoiceService searchEngineChoiceService) {
+        return new ChoiceDialogCoordinator(
+                mViewHolder, mModalDialogManager, searchEngineChoiceService);
+    }
+
+    /**
+     * Sets up the {@link #mModalDialogManager} to notify the first observer that gets registered on
+     * it of {@link ModalDialogManagerObserver#onDialogAdded} and {@link
+     * ModalDialogManagerObserver#onDialogDismissed} events.
+     */
+    private void setUpDialogObserverCapture() {
+        final ModalDialogManagerObserver[] capturedDialogObserverHolder = {null};
+
+        lenient()
+                .doAnswer(
+                        invocationOnMock -> {
+                            capturedDialogObserverHolder[0] =
+                                    invocationOnMock.getArgument(
+                                            0, ModalDialogManagerObserver.class);
+                            return null;
+                        })
+                .when(mModalDialogManager)
+                .addObserver(any());
+
+        lenient()
+                .doAnswer(
+                        invocationOnMock -> {
+                            if (capturedDialogObserverHolder[0]
+                                    != invocationOnMock.getArgument(0)) {
+                                capturedDialogObserverHolder[0] = null;
+                            }
+                            return null;
+                        })
+                .when(mModalDialogManager)
+                .removeObserver(any());
+
+        lenient()
+                .doAnswer(
+                        invocationOnMock -> {
+                            if (capturedDialogObserverHolder[0] != null) {
+                                capturedDialogObserverHolder[0].onDialogAdded(
+                                        invocationOnMock.getArgument(0, PropertyModel.class));
+                            }
+                            return null;
+                        })
+                .when(mModalDialogManager)
+                .showDialog(any(), anyInt(), anyInt());
+
+        lenient()
+                .doAnswer(
+                        invocationOnMock -> {
+                            if (capturedDialogObserverHolder[0] != null) {
+                                capturedDialogObserverHolder[0].onDialogDismissed(
+                                        invocationOnMock.getArgument(0, PropertyModel.class));
+                            }
+                            return null;
+                        })
+                .when(mModalDialogManager)
+                .dismissDialog(any(), anyInt());
     }
 }
diff --git a/chrome/browser/supervised_user/android/supervised_user_web_content_handler_impl.cc b/chrome/browser/supervised_user/android/supervised_user_web_content_handler_impl.cc
index a46098a..9ee64db 100644
--- a/chrome/browser/supervised_user/android/supervised_user_web_content_handler_impl.cc
+++ b/chrome/browser/supervised_user/android/supervised_user_web_content_handler_impl.cc
@@ -34,7 +34,7 @@
 
 SupervisedUserWebContentHandlerImpl::SupervisedUserWebContentHandlerImpl(
     content::WebContents* web_contents,
-    int frame_id,
+    content::FrameTreeNodeId frame_id,
     int64_t interstitial_navigation_id)
     : ChromeSupervisedUserWebContentHandlerBase(web_contents,
                                                 frame_id,
diff --git a/chrome/browser/supervised_user/android/supervised_user_web_content_handler_impl.h b/chrome/browser/supervised_user/android/supervised_user_web_content_handler_impl.h
index 563a71e6..b833bd4 100644
--- a/chrome/browser/supervised_user/android/supervised_user_web_content_handler_impl.h
+++ b/chrome/browser/supervised_user/android/supervised_user_web_content_handler_impl.h
@@ -11,6 +11,7 @@
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/supervised_user/chrome_supervised_user_web_content_handler_base.h"
 #include "components/supervised_user/core/browser/web_content_handler.h"
+#include "content/public/browser/frame_tree_node_id.h"
 
 enum class AndroidLocalWebApprovalFlowOutcome;
 
@@ -23,7 +24,7 @@
     : public ChromeSupervisedUserWebContentHandlerBase {
  public:
   SupervisedUserWebContentHandlerImpl(content::WebContents* web_contents,
-                                      int frame_id,
+                                      content::FrameTreeNodeId frame_id,
                                       int64_t interstitial_navigation_id);
 
   SupervisedUserWebContentHandlerImpl(
diff --git a/chrome/browser/supervised_user/android/supervised_user_web_content_handler_impl_unittest.cc b/chrome/browser/supervised_user/android/supervised_user_web_content_handler_impl_unittest.cc
index 4c72ba7a..c8185b5 100644
--- a/chrome/browser/supervised_user/android/supervised_user_web_content_handler_impl_unittest.cc
+++ b/chrome/browser/supervised_user/android/supervised_user_web_content_handler_impl_unittest.cc
@@ -72,7 +72,7 @@
           content::WebContents::CreateParams(GetProfilePtr()));
   SupervisedUserWebContentHandlerImpl web_content_handler =
       SupervisedUserWebContentHandlerImpl(web_contents.get(),
-                                          /*frame_id=*/0,
+                                          content::FrameTreeNodeId(),
                                           /*interstitial_navigation_id=*/0);
 
   web_content_handler.OnLocalApprovalRequestCompleted(
@@ -109,7 +109,7 @@
           content::WebContents::CreateParams(GetProfilePtr()));
   SupervisedUserWebContentHandlerImpl web_content_handler =
       SupervisedUserWebContentHandlerImpl(web_contents.get(),
-                                          /*frame_id=*/0,
+                                          content::FrameTreeNodeId(),
                                           /*interstitial_navigation_id=*/0);
 
   // Receive a request canceled by the parent.
@@ -144,7 +144,7 @@
           content::WebContents::CreateParams(GetProfilePtr()));
   SupervisedUserWebContentHandlerImpl web_content_handler =
       SupervisedUserWebContentHandlerImpl(web_contents.get(),
-                                          /*frame_id=*/0,
+                                          content::FrameTreeNodeId(),
                                           /*interstitial_navigation_id=*/0);
 
   // Receive a request accepted by the parent with a total duration of 5
diff --git a/chrome/browser/supervised_user/chromeos/supervised_user_web_content_handler_impl.cc b/chrome/browser/supervised_user/chromeos/supervised_user_web_content_handler_impl.cc
index 81919e1..9b181f1 100644
--- a/chrome/browser/supervised_user/chromeos/supervised_user_web_content_handler_impl.cc
+++ b/chrome/browser/supervised_user/chromeos/supervised_user_web_content_handler_impl.cc
@@ -87,7 +87,7 @@
     content::WebContents* web_contents,
     const GURL& url,
     favicon::LargeIconService& large_icon_service,
-    int frame_id,
+    content::FrameTreeNodeId frame_id,
     int64_t interstitial_navigation_id)
     : ChromeSupervisedUserWebContentHandlerBase(web_contents,
                                                 frame_id,
diff --git a/chrome/browser/supervised_user/chromeos/supervised_user_web_content_handler_impl.h b/chrome/browser/supervised_user/chromeos/supervised_user_web_content_handler_impl.h
index 1e1c548..15f6a7f3 100644
--- a/chrome/browser/supervised_user/chromeos/supervised_user_web_content_handler_impl.h
+++ b/chrome/browser/supervised_user/chromeos/supervised_user_web_content_handler_impl.h
@@ -12,6 +12,7 @@
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/supervised_user/chrome_supervised_user_web_content_handler_base.h"
 #include "chromeos/crosapi/mojom/parent_access.mojom.h"
+#include "content/public/browser/frame_tree_node_id.h"
 #include "ui/gfx/image/image_skia.h"
 #include "url/gurl.h"
 
@@ -35,7 +36,7 @@
       content::WebContents* web_contents,
       const GURL& url,
       favicon::LargeIconService& large_icon_service,
-      int frame_id,
+      content::FrameTreeNodeId frame_id,
       int64_t interstitial_navigation_id);
 
   SupervisedUserWebContentHandlerImpl(
diff --git a/chrome/browser/supervised_user/chromeos/supervised_user_web_content_handler_impl_unittest.cc b/chrome/browser/supervised_user/chromeos/supervised_user_web_content_handler_impl_unittest.cc
index 15976f9..b4530638 100644
--- a/chrome/browser/supervised_user/chromeos/supervised_user_web_content_handler_impl_unittest.cc
+++ b/chrome/browser/supervised_user/chromeos/supervised_user_web_content_handler_impl_unittest.cc
@@ -87,8 +87,8 @@
       content::WebContents::Create(
           content::WebContents::CreateParams(GetProfilePtr()));
   SupervisedUserWebContentHandlerImpl web_content_handler(
-      web_contents.get(), url, large_icon_service(),
-      /*frame_id=*/0, /*interstitial_navigation_id=*/0);
+      web_contents.get(), url, large_icon_service(), content::FrameTreeNodeId(),
+      /*interstitial_navigation_id=*/0);
 
   web_content_handler.OnLocalApprovalRequestCompleted(
       supervisedUserSettingsServiceMock, url, start_time, std::move(result));
@@ -130,8 +130,8 @@
       content::WebContents::Create(
           content::WebContents::CreateParams(GetProfilePtr()));
   SupervisedUserWebContentHandlerImpl web_content_handler(
-      web_contents.get(), url, large_icon_service(),
-      /*frame_id=*/0, /*interstitial_navigation_id=*/0);
+      web_contents.get(), url, large_icon_service(), content::FrameTreeNodeId(),
+      /*interstitial_navigation_id=*/0);
 
   web_content_handler.OnLocalApprovalRequestCompleted(
       supervisedUserSettingsServiceMock, url, start_time, std::move(result));
@@ -173,8 +173,8 @@
       content::WebContents::Create(
           content::WebContents::CreateParams(GetProfilePtr()));
   SupervisedUserWebContentHandlerImpl web_content_handler(
-      web_contents.get(), url, large_icon_service(),
-      /*frame_id=*/0, /*interstitial_navigation_id=*/0);
+      web_contents.get(), url, large_icon_service(), content::FrameTreeNodeId(),
+      /*interstitial_navigation_id=*/0);
 
   web_content_handler.OnLocalApprovalRequestCompleted(
       supervisedUserSettingsServiceMock, url, start_time, std::move(result));
@@ -214,8 +214,8 @@
       content::WebContents::Create(
           content::WebContents::CreateParams(GetProfilePtr()));
   SupervisedUserWebContentHandlerImpl web_content_handler(
-      web_contents.get(), url, large_icon_service(),
-      /*frame_id=*/0, /*interstitial_navigation_id=*/0);
+      web_contents.get(), url, large_icon_service(), content::FrameTreeNodeId(),
+      /*interstitial_navigation_id=*/0);
 
   web_content_handler.OnLocalApprovalRequestCompleted(
       supervisedUserSettingsServiceMock, url, start_time, std::move(result));
diff --git a/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc b/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc
index 08eb8b7..8af68d1 100644
--- a/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc
+++ b/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc
@@ -1246,7 +1246,7 @@
   const std::vector<content::FrameTreeNodeId> blocked_frames =
       GetBlockedFrames();
   ASSERT_EQ(blocked_frames.size(), 1u);
-  const int blocked_frame = blocked_frames[0];
+  const content::FrameTreeNodeId blocked_frame = blocked_frames[0];
   EXPECT_TRUE(IsLocalApprovalsButtonBeingShown(blocked_frame));
   EXPECT_TRUE(IsRemoteApprovalsButtonBeingShown(blocked_frame));
   CheckPreferredApprovalButton(blocked_frame);
@@ -1295,7 +1295,7 @@
   const std::vector<content::FrameTreeNodeId> blocked_frames =
       GetBlockedFrames();
   ASSERT_EQ(blocked_frames.size(), 1u);
-  const int blocked_frame = blocked_frames[0];
+  const content::FrameTreeNodeId blocked_frame = blocked_frames[0];
   EXPECT_TRUE(IsInterstitialBeingShownInFrame(blocked_frame));
   EXPECT_TRUE(IsLocalApprovalsButtonBeingShown(blocked_frame));
   EXPECT_TRUE(IsRemoteApprovalsButtonBeingShown(blocked_frame));
@@ -1342,7 +1342,7 @@
   const std::vector<content::FrameTreeNodeId> blocked_frames =
       GetBlockedFrames();
   ASSERT_EQ(blocked_frames.size(), 1u);
-  const int blocked_frame = blocked_frames[0];
+  const content::FrameTreeNodeId blocked_frame = blocked_frames[0];
   EXPECT_TRUE(IsLocalApprovalsButtonBeingShown(blocked_frame));
   EXPECT_TRUE(IsRemoteApprovalsButtonBeingShown(blocked_frame));
 
diff --git a/chrome/browser/sync/test/integration/local_sync_test.cc b/chrome/browser/sync/test/integration/local_sync_test.cc
index 6adfa28aa2..33bdec9 100644
--- a/chrome/browser/sync/test/integration/local_sync_test.cc
+++ b/chrome/browser/sync/test/integration/local_sync_test.cc
@@ -18,6 +18,7 @@
 #include "chrome/browser/ui/ui_features.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "components/browser_sync/browser_sync_switches.h"
+#include "components/commerce/core/commerce_feature_list.h"
 #include "components/power_bookmarks/core/power_bookmark_features.h"
 #include "components/sync/base/command_line_switches.h"
 #include "components/sync/base/data_type.h"
@@ -131,6 +132,10 @@
     expected_active_data_types.Put(syncer::AUTOFILL_WALLET_CREDENTIAL);
   }
 
+  if (base::FeatureList::IsEnabled(commerce::kProductSpecifications)) {
+    expected_active_data_types.Put(syncer::PRODUCT_COMPARISON);
+  }
+
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
   // Apps sync is controlled by a dedicated preference on Lacros,
   // corresponding to the Apps toggle in OS Sync settings. we remove
diff --git a/chrome/browser/tpcd/metadata/devtools_observer_browsertest.cc b/chrome/browser/tpcd/metadata/devtools_observer_browsertest.cc
index 7bad33ef4..6b01455 100644
--- a/chrome/browser/tpcd/metadata/devtools_observer_browsertest.cc
+++ b/chrome/browser/tpcd/metadata/devtools_observer_browsertest.cc
@@ -23,6 +23,7 @@
 #include "content/public/browser/cookie_access_details.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/test_devtools_protocol_client.h"
+#include "net/base/features.h"
 #include "net/dns/mock_host_resolver.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "services/network/public/cpp/features.h"
@@ -40,7 +41,8 @@
       public content::TestDevToolsProtocolClient {
  public:
   explicit TpcdMetadataDevtoolsObserverBrowserTest(
-      bool enable_metadata_feature = true)
+      bool enable_metadata_feature = true,
+      bool enable_staged_control = true)
       : https_server_(net::EmbeddedTestServer::TYPE_HTTPS) {
     enabled_features_.push_back(
         {content_settings::features::kTrackingProtection3pcd, {}});
@@ -53,6 +55,11 @@
       disabled_features_.push_back(net::features::kTpcdMetadataGrants);
     }
 
+    enable_staged_control_ = enable_staged_control;
+    if (!enable_staged_control) {
+      disabled_features_.push_back(net::features::kTpcdMetadataStageControl);
+    }
+
     feature_list_.InitWithFeaturesAndParameters(enabled_features_,
                                                 disabled_features_);
   }
@@ -80,12 +87,19 @@
     const std::string third_party_pattern_spec_2 = "c.test";
 
     Metadata metadata;
+    // If staged control is enabled, DTRP values must be set to 0 to avoid
+    // flakiness if the entry is dropped. If staged control is disabled, the
+    // values can be tested.
+    std::optional<uint32_t> dtrp =
+        enable_staged_control_ ? std::nullopt : std::make_optional(50u);
+    std::optional<uint32_t> dtrp_override =
+        enable_staged_control_ ? std::nullopt : std::make_optional(20u);
     tpcd::metadata::helpers::AddEntryToMetadata(
         metadata, third_party_pattern_spec_1, first_party_pattern_spec,
-        Parser::kSource1pDt, /*dtrp=*/50u);
+        Parser::kSource1pDt, dtrp);
     tpcd::metadata::helpers::AddEntryToMetadata(
         metadata, third_party_pattern_spec_2, first_party_pattern_spec,
-        Parser::kSource3pDt, /*dtrp=*/50u, /*dtrp_override=*/20u);
+        Parser::kSource3pDt, dtrp, dtrp_override);
     tpcd::metadata::Parser::GetInstance()->ParseMetadata(
         metadata.SerializeAsString());
 
@@ -197,6 +211,7 @@
             std::move(details)));
   }
 
+  bool enable_staged_control_ = true;
   base::test::ScopedFeatureList feature_list_;
   std::vector<base::test::FeatureRefAndParams> enabled_features_;
   std::vector<base::test::FeatureRef> disabled_features_;
@@ -204,9 +219,29 @@
   raw_ptr<TpcdMetadataDevtoolsObserver> devtools_observer_ = nullptr;
 };
 
-// TODO(https://crbug.com/341211478): Flaky.
 IN_PROC_BROWSER_TEST_F(TpcdMetadataDevtoolsObserverBrowserTest,
-                       DISABLED_EmitsDevtoolsIssues) {
+                       EmitsDevtoolsIssues) {
+  AddCookieAccess("a.test", "b.test", /*is_ad_tagged=*/false);
+  WaitForIssueAndCheck({"b.test"}, 0u, true);
+
+  AddCookieAccess("a.test", "c.test", /*is_ad_tagged=*/false);
+  WaitForIssueAndCheck({"c.test"}, 0u, false);
+}
+
+// Setting the DTRP values in the issue needs to be tested with the flag off.
+// Otherwise, a non-zero DTRP value might filter the entry and the issue will
+// never fire.
+class TpcdMetadataDevtoolsObserverDtrpDisabledBrowserTest
+    : public TpcdMetadataDevtoolsObserverBrowserTest {
+ public:
+  TpcdMetadataDevtoolsObserverDtrpDisabledBrowserTest()
+      : TpcdMetadataDevtoolsObserverBrowserTest(
+            /*enable_metadata_feature=*/true,
+            /*enable_staged_control=*/false) {}
+};
+
+IN_PROC_BROWSER_TEST_F(TpcdMetadataDevtoolsObserverDtrpDisabledBrowserTest,
+                       EmitsDevtoolsIssuesWithDtrpValues) {
   AddCookieAccess("a.test", "b.test", /*is_ad_tagged=*/false);
   WaitForIssueAndCheck({"b.test"}, 50u, true);
 
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index eda9dbe8..dbbf9a5 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -3527,6 +3527,10 @@
         "views/profiles/profile_picker_dice_sign_in_toolbar.h",
         "views/promos/autofill_bubble_signin_promo_view.cc",
         "views/promos/autofill_bubble_signin_promo_view.h",
+        "webui/signin/batch_upload_handler.cc",
+        "webui/signin/batch_upload_handler.h",
+        "webui/signin/batch_upload_ui.cc",
+        "webui/signin/batch_upload_ui.h",
         "webui/signin/dice_web_signin_intercept_handler.cc",
         "webui/signin/dice_web_signin_intercept_handler.h",
         "webui/signin/dice_web_signin_intercept_ui.cc",
@@ -3552,6 +3556,8 @@
         "webui/welcome/welcome_ui.cc",
         "webui/welcome/welcome_ui.h",
       ]
+
+      deps += [ "webui/signin/batch_upload:mojo_bindings" ]
     }
   }
 
@@ -3986,6 +3992,9 @@
       "autofill/autofill_field_promo_controller_impl.cc",
       "autofill/autofill_field_promo_controller_impl.h",
       "autofill/autofill_field_promo_view.h",
+      "autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_controller.h",
+      "autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_controller_impl.cc",
+      "autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_controller_impl.h",
       "autofill/delete_address_profile_dialog_controller.h",
       "autofill/delete_address_profile_dialog_controller_impl.cc",
       "autofill/delete_address_profile_dialog_controller_impl.h",
@@ -4077,6 +4086,8 @@
       "views/autofill/autofill_field_promo_view_impl.cc",
       "views/autofill/autofill_field_promo_view_impl.h",
       "views/autofill/autofill_location_bar_bubble.h",
+      "views/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_bubble_view.cc",
+      "views/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_bubble_view.h",
       "views/autofill/delete_address_profile_dialog_view.cc",
       "views/autofill/edit_address_profile_view.cc",
       "views/autofill/edit_address_profile_view.h",
diff --git a/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationBottomSheetContent.java b/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationBottomSheetContent.java
index 9496272c..daf3d4fc 100644
--- a/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationBottomSheetContent.java
+++ b/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationBottomSheetContent.java
@@ -40,8 +40,6 @@
     // The button to cancel the plus address creation dialog. Only visible on
     // first use, i.e., when there is a notice screen.
     private final Button mPlusAddressCancelButton;
-    // Whether we are showing a notice.
-    private final boolean mShowingNotice;
     private PlusAddressCreationDelegate mDelegate;
 
     /**
@@ -53,11 +51,9 @@
     public PlusAddressCreationBottomSheetContent(
             Activity activity,
             BottomSheetController bottomSheetController,
-            PlusAddressCreationNormalStateInfo info,
-            boolean refreshSupported) {
+            PlusAddressCreationNormalStateInfo info) {
         mBottomSheetController = bottomSheetController;
 
-        mShowingNotice = !info.getNotice().isEmpty();
         View layout =
                 LayoutInflater.from(activity)
                         .inflate(R.layout.plus_address_creation_prompt, /* root= */ null);
@@ -97,30 +93,16 @@
         plusAddressErrorReportView.setMovementMethod(LinkMovementMethod.getInstance());
         plusAddressErrorReportView.setVisibility(View.GONE);
 
+        mProposedPlusAddress.setTypeface(Typeface.MONOSPACE);
+
         mPlusAddressConfirmButton.setText(info.getConfirmText());
         mPlusAddressConfirmButton.setOnClickListener(
                 (View _view) -> {
-                    showConfirmationLoadingState();
                     mDelegate.onConfirmRequested();
                 });
 
-        mProposedPlusAddress.setTypeface(Typeface.MONOSPACE);
-        if (refreshSupported) {
-            mRefreshIcon.setVisibility(View.VISIBLE);
-            mRefreshIcon.setOnClickListener(
-                    v -> {
-                        if (mPlusAddressConfirmButton.isEnabled()) {
-                            mDelegate.onRefreshClicked();
-                        }
-                    });
-        }
-
-        if (mShowingNotice) {
-            mPlusAddressCancelButton.setText(info.getCancelText());
-            mPlusAddressCancelButton.setOnClickListener((unused) -> mDelegate.onCanceled());
-        } else {
-            mPlusAddressCancelButton.setVisibility(View.GONE);
-        }
+        mPlusAddressCancelButton.setText(info.getCancelText());
+        mPlusAddressCancelButton.setOnClickListener(unused -> mDelegate.onCanceled());
 
         // Apply RTL layout changes.
         int layoutDirection =
@@ -142,10 +124,31 @@
         mProposedPlusAddress.setText(proposedPlusAddress);
     }
 
+    void setRefreshIconEnabled(boolean enabled) {
+        mRefreshIcon.setEnabled(enabled);
+        if (enabled) {
+            mRefreshIcon.setOnClickListener(unused -> mDelegate.onRefreshClicked());
+        } else {
+            mRefreshIcon.setOnClickListener(null);
+        }
+    }
+
+    void setRefreshIconVisible(boolean visible) {
+        mRefreshIcon.setVisibility(visible ? View.VISIBLE : View.GONE);
+    }
+
     void setConfirmButtonEnabled(boolean enabled) {
         mPlusAddressConfirmButton.setEnabled(enabled);
     }
 
+    void setConfirmButtonVisible(boolean visible) {
+        mPlusAddressConfirmButton.setVisibility(visible ? View.VISIBLE : View.GONE);
+    }
+
+    void setCancelButtonVisible(boolean visible) {
+        mPlusAddressCancelButton.setVisibility(visible ? View.VISIBLE : View.GONE);
+    }
+
     /** Sets the delegate listening for actions the user performs on this bottom sheet. */
     void setDelegate(PlusAddressCreationDelegate delegate) {
         mDelegate = delegate;
@@ -153,11 +156,6 @@
 
     /** Adjusts the UI to show the loading state for confirming the proposed plus address. */
     public void showConfirmationLoadingState() {
-        // This also changes the color of the refresh icon to disabled.
-        mRefreshIcon.setEnabled(false);
-
-        // Hide the buttons.
-        mPlusAddressConfirmButton.setVisibility(View.GONE);
         mPlusAddressCancelButton.setVisibility(View.GONE);
 
         showLoadingIndicator();
@@ -181,11 +179,6 @@
 
             hideLoadingIndicator();
 
-            // Disable Confirm button if attempts to Confirm() fail.
-            mPlusAddressConfirmButton.setVisibility(View.VISIBLE);
-            if (mShowingNotice) {
-                mPlusAddressCancelButton.setVisibility(View.VISIBLE);
-            }
             return;
         }
 
@@ -208,10 +201,6 @@
         cancelButton.setText(errorStateInfo.getCancelText());
     }
 
-    public void hideRefreshButton() {
-        mRefreshIcon.setVisibility(View.GONE);
-    }
-
     // BottomSheetContent implementation follows:
     @Override
     public View getContentView() {
diff --git a/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationCoordinator.java b/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationCoordinator.java
index f165b90..2c3cdfe 100644
--- a/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationCoordinator.java
+++ b/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationCoordinator.java
@@ -5,9 +5,14 @@
 package org.chromium.chrome.browser.ui.plus_addresses;
 
 import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.ALL_KEYS;
+import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.CANCEL_BUTTON_VISIBLE;
 import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.CONFIRM_BUTTON_ENABLED;
+import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.CONFIRM_BUTTON_VISIBLE;
 import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.DELEGATE;
 import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.PROPOSED_PLUS_ADDRESS;
+import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.REFRESH_ICON_ENABLED;
+import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.REFRESH_ICON_VISIBLE;
+import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.SHOW_ONBOARDING_NOTICE;
 import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.VISIBLE;
 
 import android.app.Activity;
@@ -42,10 +47,10 @@
                         tabModel,
                         tabModelSelector,
                         bridge);
-        PropertyModel model = createDefaultModel(mMediator);
+        PropertyModel model =
+                createDefaultModel(mMediator, !info.getNotice().isEmpty(), refreshSupported);
         PlusAddressCreationBottomSheetContent bottomSheetContent =
-                new PlusAddressCreationBottomSheetContent(
-                        activity, bottomSheetController, info, refreshSupported);
+                new PlusAddressCreationBottomSheetContent(activity, bottomSheetController, info);
 
         mMediator.setModel(model);
         mMediator.setBottomSheetContent(bottomSheetContent);
@@ -87,12 +92,20 @@
         mMediator = mediator;
     }
 
-    static PropertyModel createDefaultModel(PlusAddressCreationDelegate delegate) {
+    static PropertyModel createDefaultModel(
+            PlusAddressCreationDelegate delegate,
+            boolean showOnboardingNotice,
+            boolean refreshSupported) {
         return new PropertyModel.Builder(ALL_KEYS)
+                .with(DELEGATE, delegate)
+                .with(SHOW_ONBOARDING_NOTICE, showOnboardingNotice)
                 .with(VISIBLE, false)
                 .with(PROPOSED_PLUS_ADDRESS, "")
-                .with(DELEGATE, delegate)
+                .with(REFRESH_ICON_ENABLED, false)
+                .with(REFRESH_ICON_VISIBLE, refreshSupported)
                 .with(CONFIRM_BUTTON_ENABLED, false)
+                .with(CONFIRM_BUTTON_VISIBLE, true)
+                .with(CANCEL_BUTTON_VISIBLE, showOnboardingNotice)
                 .build();
     }
 }
diff --git a/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationMediator.java b/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationMediator.java
index 449ea3e..6ab47e53 100644
--- a/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationMediator.java
+++ b/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationMediator.java
@@ -4,8 +4,13 @@
 
 package org.chromium.chrome.browser.ui.plus_addresses;
 
+import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.CANCEL_BUTTON_VISIBLE;
 import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.CONFIRM_BUTTON_ENABLED;
+import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.CONFIRM_BUTTON_VISIBLE;
 import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.PROPOSED_PLUS_ADDRESS;
+import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.REFRESH_ICON_ENABLED;
+import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.REFRESH_ICON_VISIBLE;
+import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.SHOW_ONBOARDING_NOTICE;
 import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.VISIBLE;
 
 import android.content.Context;
@@ -100,16 +105,23 @@
 
     void updateProposedPlusAddress(String plusAddress) {
         mModel.set(PROPOSED_PLUS_ADDRESS, plusAddress);
+        mModel.set(REFRESH_ICON_ENABLED, true);
         mModel.set(CONFIRM_BUTTON_ENABLED, true);
     }
 
     void showError(@Nullable PlusAddressCreationErrorStateInfo errorStateInfo) {
-        mModel.set(CONFIRM_BUTTON_ENABLED, false);
+        if (errorStateInfo == null) {
+            mModel.set(CONFIRM_BUTTON_ENABLED, false);
+            mModel.set(CONFIRM_BUTTON_VISIBLE, true);
+            if (mModel.get(SHOW_ONBOARDING_NOTICE)) {
+                mModel.set(CANCEL_BUTTON_VISIBLE, true);
+            }
+        }
         mBottomSheetContent.showError(errorStateInfo);
     }
 
     void hideRefreshButton() {
-        mBottomSheetContent.hideRefreshButton();
+        mModel.set(REFRESH_ICON_VISIBLE, false);
     }
 
     /** Hide the bottom sheet (if showing) and clean up observers. */
@@ -127,14 +139,18 @@
                 PROPOSED_PLUS_ADDRESS,
                 mContext.getString(
                         R.string.plus_address_model_refresh_temporary_label_content_android));
+        mModel.set(REFRESH_ICON_ENABLED, false);
         mModel.set(CONFIRM_BUTTON_ENABLED, false);
         mBridge.onRefreshClicked();
     }
 
     @Override
     public void onConfirmRequested() {
-        mBottomSheetContent.showConfirmationLoadingState();
+        mModel.set(REFRESH_ICON_ENABLED, false);
         mModel.set(CONFIRM_BUTTON_ENABLED, false);
+        mModel.set(CONFIRM_BUTTON_VISIBLE, false);
+        mModel.set(CANCEL_BUTTON_VISIBLE, false);
+        mBottomSheetContent.showConfirmationLoadingState();
         mBridge.onConfirmRequested();
     }
 
diff --git a/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationProperties.java b/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationProperties.java
index c1b0d43c..63cdd99 100644
--- a/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationProperties.java
+++ b/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationProperties.java
@@ -5,22 +5,41 @@
 package org.chromium.chrome.browser.ui.plus_addresses;
 
 import org.chromium.ui.modelutil.PropertyKey;
+import org.chromium.ui.modelutil.PropertyModel.ReadableBooleanPropertyKey;
 import org.chromium.ui.modelutil.PropertyModel.ReadableObjectPropertyKey;
 import org.chromium.ui.modelutil.PropertyModel.WritableBooleanPropertyKey;
 import org.chromium.ui.modelutil.PropertyModel.WritableObjectPropertyKey;
 
 /** Defines the data model for the {@code PlusAddressCreationView}. */
 class PlusAddressCreationProperties {
+    static final ReadableObjectPropertyKey<PlusAddressCreationDelegate> DELEGATE =
+            new ReadableObjectPropertyKey<>("delegate");
+    static final ReadableBooleanPropertyKey SHOW_ONBOARDING_NOTICE =
+            new ReadableBooleanPropertyKey("show_onboarding_notice");
     static final WritableBooleanPropertyKey VISIBLE = new WritableBooleanPropertyKey("visible");
     static final WritableObjectPropertyKey<String> PROPOSED_PLUS_ADDRESS =
             new WritableObjectPropertyKey<>("proposed_plus_address");
-    static final ReadableObjectPropertyKey<PlusAddressCreationDelegate> DELEGATE =
-            new ReadableObjectPropertyKey<>("delegate");
+    static final WritableBooleanPropertyKey REFRESH_ICON_ENABLED =
+            new WritableBooleanPropertyKey("refresh_icon_enabled");
+    static final WritableBooleanPropertyKey REFRESH_ICON_VISIBLE =
+            new WritableBooleanPropertyKey("refresh_icon_visible");
     static final WritableBooleanPropertyKey CONFIRM_BUTTON_ENABLED =
             new WritableBooleanPropertyKey("confirm_button_enabled");
+    static final WritableBooleanPropertyKey CONFIRM_BUTTON_VISIBLE =
+            new WritableBooleanPropertyKey("confirm_button_visible");
+    static final WritableBooleanPropertyKey CANCEL_BUTTON_VISIBLE =
+            new WritableBooleanPropertyKey("cancel_button_visible");
 
     static final PropertyKey[] ALL_KEYS = {
-        VISIBLE, PROPOSED_PLUS_ADDRESS, DELEGATE, CONFIRM_BUTTON_ENABLED,
+        DELEGATE,
+        SHOW_ONBOARDING_NOTICE,
+        VISIBLE,
+        PROPOSED_PLUS_ADDRESS,
+        REFRESH_ICON_ENABLED,
+        REFRESH_ICON_VISIBLE,
+        CONFIRM_BUTTON_ENABLED,
+        CONFIRM_BUTTON_VISIBLE,
+        CANCEL_BUTTON_VISIBLE,
     };
 
     private PlusAddressCreationProperties() {}
diff --git a/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationViewBinder.java b/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationViewBinder.java
index 56859b31..2afdc75 100644
--- a/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationViewBinder.java
+++ b/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationViewBinder.java
@@ -4,9 +4,14 @@
 
 package org.chromium.chrome.browser.ui.plus_addresses;
 
+import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.CANCEL_BUTTON_VISIBLE;
 import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.CONFIRM_BUTTON_ENABLED;
+import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.CONFIRM_BUTTON_VISIBLE;
 import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.DELEGATE;
 import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.PROPOSED_PLUS_ADDRESS;
+import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.REFRESH_ICON_ENABLED;
+import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.REFRESH_ICON_VISIBLE;
+import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.SHOW_ONBOARDING_NOTICE;
 import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.VISIBLE;
 
 import org.chromium.ui.modelutil.PropertyKey;
@@ -19,14 +24,24 @@
             PropertyModel model,
             PlusAddressCreationBottomSheetContent view,
             PropertyKey propertyKey) {
-        if (propertyKey == VISIBLE) {
+        if (propertyKey == DELEGATE) {
+            view.setDelegate(model.get(DELEGATE));
+        } else if (propertyKey == SHOW_ONBOARDING_NOTICE) {
+            // This property doesn't require any binding logic.
+        } else if (propertyKey == VISIBLE) {
             view.setVisible(model.get(VISIBLE));
         } else if (propertyKey == PROPOSED_PLUS_ADDRESS) {
             view.setProposedPlusAddress(model.get(PROPOSED_PLUS_ADDRESS));
-        } else if (propertyKey == DELEGATE) {
-            view.setDelegate(model.get(DELEGATE));
+        } else if (propertyKey == REFRESH_ICON_ENABLED) {
+            view.setRefreshIconEnabled(model.get(REFRESH_ICON_ENABLED));
+        } else if (propertyKey == REFRESH_ICON_VISIBLE) {
+            view.setRefreshIconVisible(model.get(REFRESH_ICON_VISIBLE));
         } else if (propertyKey == CONFIRM_BUTTON_ENABLED) {
             view.setConfirmButtonEnabled(model.get(CONFIRM_BUTTON_ENABLED));
+        } else if (propertyKey == CONFIRM_BUTTON_VISIBLE) {
+            view.setConfirmButtonVisible(model.get(CONFIRM_BUTTON_VISIBLE));
+        } else if (propertyKey == CANCEL_BUTTON_VISIBLE) {
+            view.setCancelButtonVisible(model.get(CANCEL_BUTTON_VISIBLE));
         } else {
             assert false : "Every possible property update needs to be handled!";
         }
diff --git a/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusProfile.java b/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusProfile.java
index b9e07b93..2e32e0ea 100644
--- a/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusProfile.java
+++ b/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusProfile.java
@@ -24,7 +24,7 @@
     @CalledByNative
     public PlusProfile(
             @JniType("std::string") String plusAddress,
-            @JniType("std::string") String displayName,
+            @JniType("std::u16string") String displayName,
             @JniType("std::string") String origin) {
         mPlusAddress = plusAddress;
         mDisplayName = displayName;
diff --git a/chrome/browser/ui/android/plus_addresses/junit/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationBottomSheetContentTest.java b/chrome/browser/ui/android/plus_addresses/junit/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationBottomSheetContentTest.java
index 1648035..ae3d73c3 100644
--- a/chrome/browser/ui/android/plus_addresses/junit/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationBottomSheetContentTest.java
+++ b/chrome/browser/ui/android/plus_addresses/junit/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationBottomSheetContentTest.java
@@ -7,14 +7,12 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 
 import android.app.Activity;
 import android.text.style.ClickableSpan;
 import android.view.View;
 import android.widget.Button;
-import android.widget.ImageView;
 import android.widget.TextView;
 
 import androidx.test.filters.SmallTest;
@@ -29,7 +27,6 @@
 import org.robolectric.Robolectric;
 import org.robolectric.annotation.Config;
 import org.robolectric.annotation.LooperMode;
-import org.robolectric.shadows.ShadowLooper;
 import org.robolectric.shadows.ShadowView;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
@@ -37,12 +34,9 @@
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent.HeightMode;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 import org.chromium.ui.base.TestActivity;
-import org.chromium.ui.widget.LoadingView;
 import org.chromium.ui.widget.TextViewWithClickableSpans;
 import org.chromium.url.GURL;
 
-import java.util.concurrent.TimeoutException;
-
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(
         manifest = Config.NONE,
@@ -73,7 +67,6 @@
                     /* errorReportUrl= */ new GURL("bug.com"));
     private static final String MODAL_PROPOSED_PLUS_ADDRESS = "plus+1@plus.plus";
     private static final String MODAL_FORMATTED_ERROR_MESSAGE = "error! test link";
-    private static final boolean REFRESH_SUPPORTED = true;
     private static final PlusAddressCreationErrorStateInfo RESERVE_ERROR_STATE =
             new PlusAddressCreationErrorStateInfo("Title", "Description", "Ok", "Cancel");
 
@@ -87,15 +80,9 @@
     @Before
     public void setUp() {
         mActivity = Robolectric.setupActivity(TestActivity.class);
-        // Disabling animations is necessary to avoid running into issues with
-        // delayed hiding of loading views.
-        LoadingView.setDisableAnimationForTest(true);
         mBottomSheetContent =
                 new PlusAddressCreationBottomSheetContent(
-                        mActivity,
-                        mBottomSheetController,
-                        FIRST_TIME_USAGE_INFO,
-                        REFRESH_SUPPORTED);
+                        mActivity, mBottomSheetController, FIRST_TIME_USAGE_INFO);
         mBottomSheetContent.setDelegate(mDelegate);
     }
 
@@ -125,74 +112,6 @@
 
     @Test
     @SmallTest
-    public void testRefreshButton_RefreshSupported() {
-        ImageView refreshIcon =
-                mBottomSheetContent.getContentView().findViewById(R.id.refresh_plus_address_icon);
-        assertEquals(refreshIcon.getVisibility(), View.VISIBLE);
-
-        mBottomSheetContent.hideRefreshButton();
-        assertEquals(refreshIcon.getVisibility(), View.GONE);
-    }
-
-    @Test
-    @SmallTest
-    public void testRefreshButton_RefreshNotSupported() {
-        PlusAddressCreationBottomSheetContent bottomSheetContent =
-                new PlusAddressCreationBottomSheetContent(
-                        mActivity,
-                        mBottomSheetController,
-                        FIRST_TIME_USAGE_INFO,
-                        /* refreshSupported= */ false);
-        ImageView refreshIcon =
-                bottomSheetContent.getContentView().findViewById(R.id.refresh_plus_address_icon);
-        assertEquals(refreshIcon.getVisibility(), View.GONE);
-    }
-
-    @Test
-    @SmallTest
-    public void testFirstTimeUsage() {
-        TextView firstTimeNotice =
-                mBottomSheetContent
-                        .getContentView()
-                        .findViewById(R.id.plus_address_first_time_use_notice);
-        Button cancelButton =
-                mBottomSheetContent.getContentView().findViewById(R.id.plus_address_cancel_button);
-        assertEquals(firstTimeNotice.getVisibility(), View.VISIBLE);
-        assertEquals(cancelButton.getVisibility(), View.VISIBLE);
-
-        cancelButton.callOnClick();
-        verify(mDelegate).onCanceled();
-    }
-
-    @Test
-    @SmallTest
-    public void testSecondTimeUsage() {
-        PlusAddressCreationBottomSheetContent bottomSheetContent =
-                new PlusAddressCreationBottomSheetContent(
-                        mActivity, mBottomSheetController, INFO, /* refreshSupported= */ false);
-        TextView firstTimeNotice =
-                bottomSheetContent
-                        .getContentView()
-                        .findViewById(R.id.plus_address_first_time_use_notice);
-        Button cancelButton =
-                bottomSheetContent.getContentView().findViewById(R.id.plus_address_cancel_button);
-        assertEquals(firstTimeNotice.getVisibility(), View.GONE);
-        assertEquals(cancelButton.getVisibility(), View.GONE);
-    }
-
-    @Test
-    @SmallTest
-    public void testRefreshButton_HideRefreshButton() {
-        ImageView refreshIcon =
-                mBottomSheetContent.getContentView().findViewById(R.id.refresh_plus_address_icon);
-        assertEquals(refreshIcon.getVisibility(), View.VISIBLE);
-
-        mBottomSheetContent.hideRefreshButton();
-        assertEquals(refreshIcon.getVisibility(), View.GONE);
-    }
-
-    @Test
-    @SmallTest
     public void testConfirmButton_disabledByDefault() {
         Button modalConfirmButton =
                 mBottomSheetContent.getContentView().findViewById(R.id.plus_address_confirm_button);
@@ -280,58 +199,6 @@
 
     @Test
     @SmallTest
-    public void testOnConfirmButtonClicked_setsRefreshIconToDisabledColor() {
-        Button modalConfirmButton =
-                mBottomSheetContent.getContentView().findViewById(R.id.plus_address_confirm_button);
-        modalConfirmButton.callOnClick();
-
-        ImageView refreshIcon =
-                mBottomSheetContent.getContentView().findViewById(R.id.refresh_plus_address_icon);
-        assertFalse(refreshIcon.isEnabled());
-
-        verify(mDelegate).onConfirmRequested();
-
-        // Clicking the refresh icon while the confirmation is ongoing does not
-        // call the delegate.
-        refreshIcon.callOnClick();
-        verify(mDelegate, never()).onRefreshClicked();
-    }
-
-    @Test
-    @SmallTest
-    public void testOnConfirmButtonClicked_showsLoadingIndicator() throws TimeoutException {
-        LoadingView loadingView =
-                mBottomSheetContent
-                        .getContentView()
-                        .findViewById(R.id.plus_address_creation_loading_view);
-
-        // Before clicking confirm, there is no loading indicator, but both
-        // a confirmation and a cancel button.
-        assertEquals(loadingView.getVisibility(), View.GONE);
-        Button modalConfirmButton =
-                mBottomSheetContent.getContentView().findViewById(R.id.plus_address_confirm_button);
-        Button modalCancelButton =
-                mBottomSheetContent.getContentView().findViewById(R.id.plus_address_cancel_button);
-        assertEquals(modalConfirmButton.getVisibility(), View.VISIBLE);
-        assertEquals(modalCancelButton.getVisibility(), View.VISIBLE);
-
-        // Show the loading indicator and hide the buttons once we click the confirm button.
-        modalConfirmButton.callOnClick();
-        verify(mDelegate).onConfirmRequested();
-        assertEquals(modalConfirmButton.getVisibility(), View.GONE);
-        assertEquals(modalCancelButton.getVisibility(), View.GONE);
-        assertEquals(loadingView.getVisibility(), View.VISIBLE);
-
-        // Hide the loading indicator and resurface the buttons if we show an error.
-        mBottomSheetContent.showError(/* errorStateInfo= */ null);
-        ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
-        assertEquals(loadingView.getVisibility(), View.GONE);
-        assertEquals(modalConfirmButton.getVisibility(), View.VISIBLE);
-        assertEquals(modalCancelButton.getVisibility(), View.VISIBLE);
-    }
-
-    @Test
-    @SmallTest
     public void testBottomSheetOverriddenAttributes() {
         assertEquals(mBottomSheetContent.getToolbarView(), null);
         assertEquals(mBottomSheetContent.getPriority(), ContentPriority.HIGH);
diff --git a/chrome/browser/ui/android/plus_addresses/junit/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationMediatorTest.java b/chrome/browser/ui/android/plus_addresses/junit/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationMediatorTest.java
index e6956e34..e8badfb 100644
--- a/chrome/browser/ui/android/plus_addresses/junit/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationMediatorTest.java
+++ b/chrome/browser/ui/android/plus_addresses/junit/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationMediatorTest.java
@@ -13,6 +13,7 @@
 import static org.mockito.Mockito.verify;
 
 import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.PROPOSED_PLUS_ADDRESS;
+import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.REFRESH_ICON_VISIBLE;
 import static org.chromium.chrome.browser.ui.plus_addresses.PlusAddressCreationProperties.VISIBLE;
 
 import android.app.Activity;
@@ -66,7 +67,9 @@
     @Before
     public void setUp() {
         Activity activity = Robolectric.setupActivity(TestActivity.class);
-        mModel = PlusAddressCreationCoordinator.createDefaultModel(mDelegate);
+        mModel =
+                PlusAddressCreationCoordinator.createDefaultModel(
+                        mDelegate, /* showOnboardingNotice= */ true, /* refreshSupported= */ true);
         mMediator =
                 new PlusAddressCreationMediator(
                         activity,
@@ -107,10 +110,9 @@
         verify(mBottomSheetContent).showError(eq(ERROR_STATE));
     }
 
-    @Test
     public void testHideRefreshButton_callsBottomSheetHideRefreshButton() {
         mMediator.hideRefreshButton();
-        verify(mBottomSheetContent).hideRefreshButton();
+        assertFalse(mModel.get(REFRESH_ICON_VISIBLE));
     }
 
     @Test
diff --git a/chrome/browser/ui/android/plus_addresses/junit/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationModuleTest.java b/chrome/browser/ui/android/plus_addresses/junit/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationModuleTest.java
index ede3a4d..b675b0b 100644
--- a/chrome/browser/ui/android/plus_addresses/junit/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationModuleTest.java
+++ b/chrome/browser/ui/android/plus_addresses/junit/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationModuleTest.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.ui.plus_addresses;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
@@ -13,8 +14,10 @@
 import static org.mockito.Mockito.verify;
 
 import android.app.Activity;
+import android.view.View;
 import android.widget.Button;
 import android.widget.ImageView;
+import android.widget.TextView;
 
 import androidx.test.filters.SmallTest;
 
@@ -31,6 +34,7 @@
 import org.robolectric.Robolectric;
 import org.robolectric.annotation.Config;
 import org.robolectric.annotation.LooperMode;
+import org.robolectric.shadows.ShadowLooper;
 import org.robolectric.shadows.ShadowView;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
@@ -43,12 +47,14 @@
 import org.chromium.ui.widget.LoadingView;
 import org.chromium.url.GURL;
 
+import java.util.concurrent.TimeoutException;
+
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(
         manifest = Config.NONE,
         shadows = {ShadowView.class})
-@Batch(Batch.UNIT_TESTS)
 @LooperMode(LooperMode.Mode.LEGACY)
+@Batch(Batch.UNIT_TESTS)
 public class PlusAddressCreationModuleTest {
     private static final PlusAddressCreationNormalStateInfo FIRST_TIME_USAGE_INFO =
             new PlusAddressCreationNormalStateInfo(
@@ -61,6 +67,17 @@
                     /* errorReportInstruction= */ "error! <link>test link</link>",
                     /* learnMoreUrl= */ new GURL("learn.more.com"),
                     /* errorReportUrl= */ new GURL("bug.com"));
+    private static final PlusAddressCreationNormalStateInfo SECOND_TIME_USAGE_INFO =
+            new PlusAddressCreationNormalStateInfo(
+                    /* title= */ "lorem ipsum title",
+                    /* description= */ "lorem ipsum description",
+                    /* notice= */ "",
+                    /* proposedPlusAddressPlaceholder= */ "placeholder",
+                    /* confirmText= */ "ok",
+                    /* cancelText= */ "",
+                    /* errorReportInstruction= */ "error! <link>test link</link>",
+                    /* learnMoreUrl= */ new GURL("learn.more.com"),
+                    /* errorReportUrl= */ new GURL("bug.com"));
 
     @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
 
@@ -78,6 +95,8 @@
     @Before
     public void setUp() {
         mActivity = Robolectric.setupActivity(TestActivity.class);
+        // Disabling animations is necessary to avoid running into issues with
+        // delayed hiding of loading views.
         LoadingView.setDisableAnimationForTest(true);
         mCoordinator =
                 new PlusAddressCreationCoordinator(
@@ -114,8 +133,8 @@
         Button confirmButton = view.getContentView().findViewById(R.id.plus_address_confirm_button);
         ImageView refreshIcon = view.getContentView().findViewById(R.id.refresh_plus_address_icon);
 
+        assertFalse(refreshIcon.isEnabled());
         assertFalse(confirmButton.isEnabled());
-        assertTrue(refreshIcon.isEnabled());
         refreshIcon.performClick();
         verify(mBridge, times(0)).onRefreshClicked();
 
@@ -127,14 +146,14 @@
         // Refresh the plus address first time.
         refreshIcon.performClick();
         assertFalse(confirmButton.isEnabled());
-        assertTrue(refreshIcon.isEnabled());
+        assertFalse(refreshIcon.isEnabled());
         verify(mBridge).onRefreshClicked();
 
         // Simulate that the plus address was reserved and refresh the plus address again.
         mCoordinator.updateProposedPlusAddress("example@gmail.com");
         refreshIcon.performClick();
         assertFalse(confirmButton.isEnabled());
-        assertTrue(refreshIcon.isEnabled());
+        assertFalse(refreshIcon.isEnabled());
         verify(mBridge, times(2)).onRefreshClicked();
     }
 
@@ -155,6 +174,18 @@
 
     @Test
     @SmallTest
+    public void testRefreshButton_hideRefreshButton() {
+        PlusAddressCreationBottomSheetContent view = openBottomSheet();
+
+        ImageView refreshIcon = view.getContentView().findViewById(R.id.refresh_plus_address_icon);
+        assertEquals(refreshIcon.getVisibility(), View.VISIBLE);
+
+        mCoordinator.hideRefreshButton();
+        assertEquals(refreshIcon.getVisibility(), View.GONE);
+    }
+
+    @Test
+    @SmallTest
     public void testLegacyErrorHandling_confirmDisabledIfConfirmRequestFails() {
         PlusAddressCreationBottomSheetContent view = openBottomSheet();
         Button modalConfirmButton =
@@ -168,4 +199,116 @@
         mCoordinator.showError(/* errorStateInfo= */ null);
         assertFalse(modalConfirmButton.isEnabled());
     }
+
+    @Test
+    @SmallTest
+    public void testConfirmButton_disablesRefreshIcon() throws TimeoutException {
+        PlusAddressCreationBottomSheetContent view = openBottomSheet();
+
+        ImageView refreshIcon = view.getContentView().findViewById(R.id.refresh_plus_address_icon);
+        Button confirmButton = view.getContentView().findViewById(R.id.plus_address_confirm_button);
+
+        mCoordinator.updateProposedPlusAddress("example@gmail.com");
+        assertTrue(refreshIcon.isEnabled());
+        assertTrue(confirmButton.isEnabled());
+
+        confirmButton.performClick();
+        verify(mBridge).onConfirmRequested();
+        assertFalse(refreshIcon.isEnabled());
+        assertFalse(confirmButton.isEnabled());
+    }
+
+    @Test
+    @SmallTest
+    public void testFirstTimeUsage_confirm_showError_close() throws TimeoutException {
+        PlusAddressCreationBottomSheetContent view = openBottomSheet();
+
+        // Before clicking confirm, there is no loading indicator, but both
+        // a confirmation and a cancel button.
+        TextView firstTimeNotice =
+                view.getContentView().findViewById(R.id.plus_address_first_time_use_notice);
+        LoadingView loadingView =
+                view.getContentView().findViewById(R.id.plus_address_creation_loading_view);
+        Button modalConfirmButton =
+                view.getContentView().findViewById(R.id.plus_address_confirm_button);
+        Button modalCancelButton =
+                view.getContentView().findViewById(R.id.plus_address_cancel_button);
+        assertEquals(firstTimeNotice.getVisibility(), View.VISIBLE);
+        assertEquals(loadingView.getVisibility(), View.GONE);
+        assertEquals(modalConfirmButton.getVisibility(), View.VISIBLE);
+        assertEquals(modalCancelButton.getVisibility(), View.VISIBLE);
+
+        // Show the loading indicator and hide the buttons once we click the confirm button.
+        modalConfirmButton.performClick();
+        verify(mBridge).onConfirmRequested();
+        assertEquals(firstTimeNotice.getVisibility(), View.VISIBLE);
+        assertEquals(modalConfirmButton.getVisibility(), View.GONE);
+        assertEquals(modalCancelButton.getVisibility(), View.GONE);
+        assertEquals(loadingView.getVisibility(), View.VISIBLE);
+
+        // Hide the loading indicator and resurface the buttons if we show an error.
+        mCoordinator.showError(/* errorStateInfo= */ null);
+        ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+        assertEquals(firstTimeNotice.getVisibility(), View.VISIBLE);
+        assertEquals(loadingView.getVisibility(), View.GONE);
+        assertEquals(modalConfirmButton.getVisibility(), View.VISIBLE);
+        assertFalse(modalConfirmButton.isEnabled());
+        assertEquals(modalCancelButton.getVisibility(), View.VISIBLE);
+        assertTrue(modalCancelButton.isEnabled());
+
+        modalCancelButton.performClick();
+        verify(mBridge).onCanceled();
+    }
+
+    @Test
+    @SmallTest
+    public void testSecondTimeUsage_confirm_showError_close() {
+        PlusAddressCreationCoordinator coordinator =
+                new PlusAddressCreationCoordinator(
+                        mActivity,
+                        mBottomSheetController,
+                        mLayoutStateProvider,
+                        mTabModel,
+                        mTabModelSelector,
+                        mBridge,
+                        SECOND_TIME_USAGE_INFO,
+                        /* refreshSupported= */ true);
+        reset(mBottomSheetController);
+
+        coordinator.requestShowContent();
+        verify(mBottomSheetController).requestShowContent(mViewCaptor.capture(), eq(true));
+
+        PlusAddressCreationBottomSheetContent view = mViewCaptor.getValue();
+        assertNotNull(view);
+
+        TextView firstTimeNotice =
+                view.getContentView().findViewById(R.id.plus_address_first_time_use_notice);
+        LoadingView loadingView =
+                view.getContentView().findViewById(R.id.plus_address_creation_loading_view);
+        Button modalConfirmButton =
+                view.getContentView().findViewById(R.id.plus_address_confirm_button);
+        Button modalCancelButton =
+                view.getContentView().findViewById(R.id.plus_address_cancel_button);
+        assertEquals(firstTimeNotice.getVisibility(), View.GONE);
+        assertEquals(loadingView.getVisibility(), View.GONE);
+        assertEquals(modalConfirmButton.getVisibility(), View.VISIBLE);
+        assertEquals(modalCancelButton.getVisibility(), View.GONE);
+
+        // Show the loading indicator and hide the buttons once we click the confirm button.
+        modalConfirmButton.performClick();
+        verify(mBridge).onConfirmRequested();
+        assertEquals(firstTimeNotice.getVisibility(), View.GONE);
+        assertEquals(loadingView.getVisibility(), View.VISIBLE);
+        assertEquals(modalConfirmButton.getVisibility(), View.GONE);
+        assertEquals(modalCancelButton.getVisibility(), View.GONE);
+
+        // Hide the loading indicator and resurface the buttons if we show an error.
+        coordinator.showError(/* errorStateInfo= */ null);
+        ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+        assertEquals(firstTimeNotice.getVisibility(), View.GONE);
+        assertEquals(loadingView.getVisibility(), View.GONE);
+        assertEquals(modalConfirmButton.getVisibility(), View.VISIBLE);
+        assertFalse(modalConfirmButton.isEnabled());
+        assertEquals(modalCancelButton.getVisibility(), View.GONE);
+    }
 }
diff --git a/chrome/browser/ui/ash/capture_mode/chrome_capture_mode_delegate.cc b/chrome/browser/ui/ash/capture_mode/chrome_capture_mode_delegate.cc
index 9cba9b7..4ab9cfc1 100644
--- a/chrome/browser/ui/ash/capture_mode/chrome_capture_mode_delegate.cc
+++ b/chrome/browser/ui/ash/capture_mode/chrome_capture_mode_delegate.cc
@@ -283,9 +283,7 @@
 }
 
 base::FilePath ChromeCaptureModeDelegate::GetOneDriveMountPointPath() const {
-  Profile* profile = ProfileManager::GetPrimaryUserProfile();
-  return profile ? ash::cloud_upload::GetODFSFuseboxMount(profile)
-                 : base::FilePath();
+  return policy::local_user_files::GetODFSVirtualPath();
 }
 
 ChromeCaptureModeDelegate::PolicyCapturePath
diff --git a/chrome/browser/ui/ash/login/BUILD.gn b/chrome/browser/ui/ash/login/BUILD.gn
index c26c87d..320e8cc 100644
--- a/chrome/browser/ui/ash/login/BUILD.gn
+++ b/chrome/browser/ui/ash/login/BUILD.gn
@@ -23,12 +23,23 @@
     "//ash/webui/settings/public/constants:mojom",
     "//chrome/browser:browser_public_dependencies",
     "//chrome/browser/ash/child_accounts/parent_access_code",
+    "//chrome/browser/ash/input_method",
+    "//chrome/browser/ash/login",
+    "//chrome/browser/ash/login/lock",
+    "//chrome/browser/ash/login/ui",
     "//chrome/common",
     "//chromeos/ash/components/install_attributes",
     "//chromeos/ash/components/settings",
     "//components/session_manager/core",
     "//ui/base/ime/ash",
   ]
+
+  allow_circular_includes_from = [
+    "//chrome/browser/ash/input_method",
+    "//chrome/browser/ash/login",
+    "//chrome/browser/ash/login/lock",
+    "//chrome/browser/ash/login/ui",
+  ]
 }
 
 static_library("test_support") {
diff --git a/chrome/browser/ui/ash/media_client/BUILD.gn b/chrome/browser/ui/ash/media_client/BUILD.gn
index dc345146..e87c84c 100644
--- a/chrome/browser/ui/ash/media_client/BUILD.gn
+++ b/chrome/browser/ui/ash/media_client/BUILD.gn
@@ -27,6 +27,9 @@
     "//ash/strings",
     "//chrome/app:generated_resources",
     "//chrome/browser:browser_public_dependencies",
+    "//chrome/browser/ash/camera_mic",
+    "//chrome/browser/ash/extensions",
+    "//chrome/browser/ash/login/session",
     "//chrome/browser/ash/profiles",
     "//chrome/browser/picture_in_picture",
     "//components/account_id",
@@ -39,6 +42,8 @@
     "//services/media_session/public/mojom",
     "//ui/message_center/public/cpp",
   ]
+
+  allow_circular_includes_from = [ "//chrome/browser/ash/login/session" ]
 }
 
 source_set("unit_tests") {
diff --git a/chrome/browser/ui/ash/session/BUILD.gn b/chrome/browser/ui/ash/session/BUILD.gn
index 7552f79a..98b85e1 100644
--- a/chrome/browser/ui/ash/session/BUILD.gn
+++ b/chrome/browser/ui/ash/session/BUILD.gn
@@ -21,9 +21,11 @@
     "//ash/public/cpp",
     "//base",
     "//chrome/browser:browser_process",
+    "//chrome/browser/apps/app_service",
     "//chrome/browser/ash/crosapi:browser_util",
     "//chrome/browser/ash/floating_workspace",
     "//chrome/browser/ash/login/demo_mode",
+    "//chrome/browser/ash/login/lock",
     "//chrome/browser/ash/login/ui",
     "//chrome/browser/ash/policy/off_hours",
     "//chrome/browser/ash/profiles",
@@ -33,7 +35,6 @@
     "//chrome/browser/profiles:profile",
     "//chrome/browser/ui/ash/multi_user",
     "//chrome/browser/ui/ash/shelf",
-    "//chrome/browser/ui/webui/ash/settings/pages/multidevice",
     "//chrome/common",
     "//chromeos/ash/components/assistant:buildflags",
     "//chromeos/ash/components/dbus/session_manager",
@@ -52,9 +53,10 @@
   ]
 
   allow_circular_includes_from = [
+    "//chrome/browser/apps/app_service",
+    "//chrome/browser/ash/login/lock",
     "//chrome/browser/ui/ash/multi_user",
     "//chrome/browser/ui/ash/shelf",
-    "//chrome/browser/ui/webui/ash/settings/pages/multidevice",
   ]
 }
 
diff --git a/chrome/browser/ui/ash/system/BUILD.gn b/chrome/browser/ui/ash/system/BUILD.gn
index 9e109f2..3c4a2bfd 100644
--- a/chrome/browser/ui/ash/system/BUILD.gn
+++ b/chrome/browser/ui/ash/system/BUILD.gn
@@ -24,6 +24,7 @@
     "//chrome/browser/ash/eol",
     "//chrome/browser/ash/login",
     "//chrome/browser/ash/login/demo_mode",
+    "//chrome/browser/ash/login/screens",
     "//chrome/browser/ash/login/session",
     "//chrome/browser/ash/login/ui",
     "//chrome/browser/ash/policy/core",
@@ -57,6 +58,7 @@
     "//chrome/browser/ash/eol",
     "//chrome/browser/ash/login",
     "//chrome/browser/ash/login/demo_mode",
+    "//chrome/browser/ash/login/screens",
     "//chrome/browser/ash/login/session",
     "//chrome/browser/ash/login/ui",
     "//chrome/browser/ash/policy/handlers",
diff --git a/chrome/browser/ui/ash/wallpaper/BUILD.gn b/chrome/browser/ui/ash/wallpaper/BUILD.gn
index 70f28fa..c8fbdae8 100644
--- a/chrome/browser/ui/ash/wallpaper/BUILD.gn
+++ b/chrome/browser/ui/ash/wallpaper/BUILD.gn
@@ -28,6 +28,7 @@
     "//chrome/browser/ash/drive",
     "//chrome/browser/ash/file_manager",
     "//chrome/browser/ash/login",
+    "//chrome/browser/ash/login/lock",
     "//chrome/browser/ash/login/ui",
     "//chrome/browser/ash/policy/external_data/handlers",
     "//chrome/browser/ash/system_web_apps/apps/personalization_app",
@@ -37,7 +38,6 @@
     "//chrome/browser/sync",
     "//chrome/browser/ui/ash/login",
     "//chrome/browser/ui/ash/system_web_apps",
-    "//chrome/browser/ui/webui/ash/settings",
     "//chrome/common",
     "//chromeos/ash/components/cryptohome",
     "//chromeos/ash/components/settings",
@@ -55,6 +55,7 @@
 
   allow_circular_includes_from = [
     "//chrome/browser/ash/arc/wallpaper",
+    "//chrome/browser/ash/login/lock",
     "//chrome/browser/ash/login/ui",
     "//chrome/browser/ash/policy/external_data/handlers",
     "//chrome/browser/ash/system_web_apps/apps/personalization_app",
diff --git a/chrome/browser/ui/autofill/autofill_bubble_handler.h b/chrome/browser/ui/autofill/autofill_bubble_handler.h
index 2deabf9..e617bff 100644
--- a/chrome/browser/ui/autofill/autofill_bubble_handler.h
+++ b/chrome/browser/ui/autofill/autofill_bubble_handler.h
@@ -16,6 +16,7 @@
 class LocalCardMigrationBubbleController;
 class OfferNotificationBubbleController;
 class SaveAddressBubbleController;
+class SaveAutofillPredictionImprovementsController;
 class UpdateAddressBubbleController;
 class AddNewAddressBubbleController;
 class SaveCardBubbleController;
@@ -61,6 +62,10 @@
       OfferNotificationBubbleController* controller,
       bool is_user_gesture) = 0;
 
+  virtual AutofillBubbleBase* ShowSaveAutofillPredictionImprovementsBubble(
+      content::WebContents* web_contents,
+      SaveAutofillPredictionImprovementsController* controller) = 0;
+
   // Opens a save address bubble. The bubble's lifecycle is controlled by its
   // widget, and the controller must handle the widget closing to invalidate
   // the returned pointer, see `SaveAddressBubbleController::OnBubbleClosed()`.
diff --git a/chrome/browser/ui/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_controller.h b/chrome/browser/ui/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_controller.h
new file mode 100644
index 0000000..2e44ee5
--- /dev/null
+++ b/chrome/browser/ui/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_controller.h
@@ -0,0 +1,56 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_PREDICTION_IMPROVEMENTS_SAVE_AUTOFILL_PREDICTION_IMPROVEMENTS_CONTROLLER_H_
+#define CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_PREDICTION_IMPROVEMENTS_SAVE_AUTOFILL_PREDICTION_IMPROVEMENTS_CONTROLLER_H_
+
+#include "base/memory/weak_ptr.h"
+#include "content/public/browser/web_contents.h"
+
+namespace autofill {
+
+// Interface that exposes controller functionality to save prediction
+// improvements bubble.
+class SaveAutofillPredictionImprovementsController {
+ public:
+  enum class PredictionImprovementsBubbleClosedReason {
+    // Bubble closed reason not specified.
+    kUnknown,
+    // The user explicitly accepted the bubble.
+    kAccepted,
+    // The user explicitly cancelled the bubble.
+    kCancelled,
+    // The user explicitly closed the bubble (via the close button or the ESC).
+    kClosed,
+    // The bubble was not interacted with.
+    kNotInteracted,
+    // The bubble lost focus and was closed.
+    kLostFocus,
+  };
+  SaveAutofillPredictionImprovementsController() = default;
+  SaveAutofillPredictionImprovementsController(
+      const SaveAutofillPredictionImprovementsController&) = delete;
+  SaveAutofillPredictionImprovementsController& operator=(
+      const SaveAutofillPredictionImprovementsController&) = delete;
+  virtual ~SaveAutofillPredictionImprovementsController() = default;
+
+  static SaveAutofillPredictionImprovementsController* GetOrCreate(
+      content::WebContents* web_contents);
+
+  // Shows a save improved predictions bubble which the user can accept or
+  // decline.
+  virtual void OfferSave() = 0;
+  // Called when the user accepts to save prediction improvements.
+  virtual void OnSaveButtonClicked() = 0;
+  // Called when the prediction improvements bubble is closed.
+  virtual void OnBubbleClosed(
+      PredictionImprovementsBubbleClosedReason closed_reason) = 0;
+
+  virtual base::WeakPtr<SaveAutofillPredictionImprovementsController>
+  GetWeakPtr() = 0;
+};
+
+}  // namespace autofill
+
+#endif  // CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_PREDICTION_IMPROVEMENTS_SAVE_AUTOFILL_PREDICTION_IMPROVEMENTS_CONTROLLER_H_
diff --git a/chrome/browser/ui/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_controller_impl.cc b/chrome/browser/ui/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_controller_impl.cc
new file mode 100644
index 0000000..5c1f1ad
--- /dev/null
+++ b/chrome/browser/ui/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_controller_impl.cc
@@ -0,0 +1,84 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_controller_impl.h"
+
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/ui/autofill/autofill_bubble_base.h"
+#include "chrome/browser/ui/autofill/autofill_bubble_controller_base.h"
+#include "chrome/browser/ui/autofill/autofill_bubble_handler.h"
+#include "chrome/browser/ui/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_controller.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/ui/browser_window.h"
+#include "content/public/browser/navigation_handle.h"
+
+namespace autofill {
+
+SaveAutofillPredictionImprovementsControllerImpl::
+    SaveAutofillPredictionImprovementsControllerImpl(
+        content::WebContents* web_contents)
+    : AutofillBubbleControllerBase(web_contents),
+      content::WebContentsUserData<
+          SaveAutofillPredictionImprovementsControllerImpl>(*web_contents) {}
+
+SaveAutofillPredictionImprovementsControllerImpl::
+    ~SaveAutofillPredictionImprovementsControllerImpl() = default;
+
+// static
+SaveAutofillPredictionImprovementsController*
+SaveAutofillPredictionImprovementsController::GetOrCreate(
+    content::WebContents* web_contents) {
+  if (!web_contents) {
+    return nullptr;
+  }
+
+  SaveAutofillPredictionImprovementsControllerImpl::CreateForWebContents(
+      web_contents);
+  return SaveAutofillPredictionImprovementsControllerImpl::FromWebContents(
+      web_contents);
+}
+
+void SaveAutofillPredictionImprovementsControllerImpl::OfferSave() {
+  // Don't show the bubble if it's already visible.
+  if (bubble_view()) {
+    return;
+  }
+
+  DoShowBubble();
+}
+
+void SaveAutofillPredictionImprovementsControllerImpl::OnSaveButtonClicked() {}
+
+void SaveAutofillPredictionImprovementsControllerImpl::OnBubbleClosed(
+    SaveAutofillPredictionImprovementsController::
+        PredictionImprovementsBubbleClosedReason closed_reason) {
+  set_bubble_view(nullptr);
+  UpdatePageActionIcon();
+}
+
+PageActionIconType
+SaveAutofillPredictionImprovementsControllerImpl::GetPageActionIconType() {
+  // TODO(crbug.com/362227379): Update icon.
+  return PageActionIconType::kAutofillAddress;
+}
+
+void SaveAutofillPredictionImprovementsControllerImpl::DoShowBubble() {
+  Browser* browser = chrome::FindBrowserWithTab(web_contents());
+  set_bubble_view(
+      browser->window()
+          ->GetAutofillBubbleHandler()
+          ->ShowSaveAutofillPredictionImprovementsBubble(web_contents(), this));
+  CHECK(bubble_view());
+}
+
+base::WeakPtr<SaveAutofillPredictionImprovementsController>
+SaveAutofillPredictionImprovementsControllerImpl::GetWeakPtr() {
+  return weak_ptr_factory_.GetWeakPtr();
+}
+
+WEB_CONTENTS_USER_DATA_KEY_IMPL(
+    SaveAutofillPredictionImprovementsControllerImpl);
+
+}  // namespace autofill
diff --git a/chrome/browser/ui/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_controller_impl.h b/chrome/browser/ui/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_controller_impl.h
new file mode 100644
index 0000000..3e10722
--- /dev/null
+++ b/chrome/browser/ui/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_controller_impl.h
@@ -0,0 +1,64 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_PREDICTION_IMPROVEMENTS_SAVE_AUTOFILL_PREDICTION_IMPROVEMENTS_CONTROLLER_IMPL_H_
+#define CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_PREDICTION_IMPROVEMENTS_SAVE_AUTOFILL_PREDICTION_IMPROVEMENTS_CONTROLLER_IMPL_H_
+
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/ui/autofill/autofill_bubble_controller_base.h"
+#include "chrome/browser/ui/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_controller.h"
+#include "content/public/browser/web_contents_observer.h"
+#include "content/public/browser/web_contents_user_data.h"
+
+namespace autofill {
+
+// Implementation of per-tab class to control the save prediction improvements
+// bubble.
+class SaveAutofillPredictionImprovementsControllerImpl
+    : public AutofillBubbleControllerBase,
+      public SaveAutofillPredictionImprovementsController,
+      public content::WebContentsUserData<
+          SaveAutofillPredictionImprovementsControllerImpl> {
+ public:
+  SaveAutofillPredictionImprovementsControllerImpl(
+      const SaveAutofillPredictionImprovementsControllerImpl&) = delete;
+  SaveAutofillPredictionImprovementsControllerImpl& operator=(
+      const SaveAutofillPredictionImprovementsControllerImpl&) = delete;
+  ~SaveAutofillPredictionImprovementsControllerImpl() override;
+
+  // SaveAutofillPredictionImprovementsController:
+  void OfferSave() override;
+  void OnSaveButtonClicked() override;
+  void OnBubbleClosed(
+      SaveAutofillPredictionImprovementsController::
+          PredictionImprovementsBubbleClosedReason closed_reason) override;
+  base::WeakPtr<SaveAutofillPredictionImprovementsController> GetWeakPtr()
+      override;
+
+ protected:
+  explicit SaveAutofillPredictionImprovementsControllerImpl(
+      content::WebContents* web_contents);
+
+  // AutofillBubbleControllerBase::
+  PageActionIconType GetPageActionIconType() override;
+  void DoShowBubble() override;
+
+ private:
+  friend class content::WebContentsUserData<
+      SaveAutofillPredictionImprovementsControllerImpl>;
+  friend class SaveAutofillPredictionImprovementsControllerImplTest;
+
+  void ShowBubble();
+
+  // Weak pointer factory for this save prediction improvements bubble
+  // controller.
+  base::WeakPtrFactory<SaveAutofillPredictionImprovementsControllerImpl>
+      weak_ptr_factory_{this};
+
+  WEB_CONTENTS_USER_DATA_KEY_DECL();
+};
+
+}  // namespace autofill
+
+#endif  // CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_PREDICTION_IMPROVEMENTS_SAVE_AUTOFILL_PREDICTION_IMPROVEMENTS_CONTROLLER_IMPL_H_
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc
index b7fe032c..318441f 100644
--- a/chrome/browser/ui/autofill/chrome_autofill_client.cc
+++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -58,6 +58,7 @@
 #include "chrome/browser/ui/page_info/page_info_dialog.h"
 #include "chrome/browser/ui/passwords/ui_utils.h"
 #include "chrome/browser/ui/plus_addresses/plus_address_creation_controller.h"
+#include "chrome/browser/ui/plus_addresses/plus_address_error_dialog.h"
 #include "chrome/browser/ui/singleton_tabs.h"
 #include "chrome/browser/webdata_services/web_data_service_factory.h"
 #include "chrome/common/channel_info.h"
@@ -138,11 +139,13 @@
 #include "components/strings/grit/components_strings.h"
 #else  // !BUILDFLAG(IS_ANDROID)
 #include "chrome/browser/autofill_prediction_improvements/chrome_autofill_prediction_improvements_client.h"
+#include "chrome/browser/ui/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_controller.h"
 #include "chrome/browser/ui/autofill/delete_address_profile_dialog_controller_impl.h"
 #include "chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
 #include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/ui/plus_addresses/plus_address_error_dialog.h"
 #include "chrome/browser/ui/tabs/public/tab_features.h"  // nogncheck
 #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
 #include "components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_features.h"
@@ -300,6 +303,26 @@
   controller->OfferCreation(main_frame_origin, std::move(callback));
 }
 
+void ChromeAutofillClient::ShowPlusAddressError(
+    PlusAddressErrorDialogType error_dialog_type,
+    base::OnceClosure on_accepted) {
+#if !BUILDFLAG(IS_ANDROID)
+  plus_addresses::ShowInlineCreationErrorDialog(
+      web_contents(), error_dialog_type, std::move(on_accepted));
+#endif
+}
+
+void ChromeAutofillClient::ShowPlusAddressAffiliationError(
+    std::u16string affiliated_domain,
+    std::u16string affiliated_plus_address,
+    base::OnceClosure on_accepted) {
+#if !BUILDFLAG(IS_ANDROID)
+  plus_addresses::ShowInlineCreationAffiliationErrorDialog(
+      web_contents(), std::move(affiliated_domain),
+      std::move(affiliated_plus_address), std::move(on_accepted));
+#endif
+}
+
 PrefService* ChromeAutofillClient::GetPrefs() {
   return const_cast<PrefService*>(std::as_const(*this).GetPrefs());
 }
@@ -764,6 +787,15 @@
 #endif  // !BUILDFLAG(IS_ANDROID)
 }
 
+void ChromeAutofillClient::ShowSaveAutofillPredictionImprovementsBubble() {
+#if !BUILDFLAG(IS_ANDROID)
+  if (SaveAutofillPredictionImprovementsController* controller =
+          SaveAutofillPredictionImprovementsController::GetOrCreate(
+              web_contents())) {
+    controller->OfferSave();
+  }
+#endif  // !BUILDFLAG(IS_ANDROID)
+}
 ChromeAutofillClient::ChromeAutofillClient(content::WebContents* web_contents)
     : ContentAutofillClient(web_contents),
       content::WebContentsObserver(web_contents),
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.h b/chrome/browser/ui/autofill/chrome_autofill_client.h
index 4e6f701a..dd9658de 100644
--- a/chrome/browser/ui/autofill/chrome_autofill_client.h
+++ b/chrome/browser/ui/autofill/chrome_autofill_client.h
@@ -98,6 +98,11 @@
   GetAutofillPredictionImprovementsDelegate() override;
   void OfferPlusAddressCreation(const url::Origin& main_frame_origin,
                                 PlusAddressCallback callback) override;
+  void ShowPlusAddressError(PlusAddressErrorDialogType error_dialog_type,
+                            base::OnceClosure on_accepted) override;
+  void ShowPlusAddressAffiliationError(std::u16string affiliated_domain,
+                                       std::u16string affiliated_plus_address,
+                                       base::OnceClosure on_accepted) override;
   PrefService* GetPrefs() override;
   const PrefService* GetPrefs() const override;
   syncer::SyncService* GetSyncService() override;
@@ -162,6 +167,7 @@
       const FormFieldData& field) override;
   void HideAutofillFieldIphForManualFallbackFeature() override;
   void NotifyAutofillManualFallbackUsed() override;
+  void ShowSaveAutofillPredictionImprovementsBubble() override;
   void set_test_addresses(std::vector<AutofillProfile> test_addresses) override;
   base::span<const AutofillProfile> GetTestAddresses() const override;
   PasswordFormClassification ClassifyAsPasswordForm(
diff --git a/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.cc b/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.cc
index 7f521b2..84fb3c65 100644
--- a/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.cc
+++ b/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/ui/autofill/test/test_autofill_bubble_handler.h"
 
 #include "chrome/browser/ui/autofill/add_new_address_bubble_controller.h"
+#include "chrome/browser/ui/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_controller.h"
 #include "chrome/browser/ui/autofill/payments/save_iban_ui.h"
 #include "chrome/browser/ui/autofill/save_address_bubble_controller.h"
 #include "chrome/browser/ui/autofill/update_address_bubble_controller.h"
@@ -63,6 +64,17 @@
   return save_address_profile_bubble_view_.get();
 }
 
+AutofillBubbleBase*
+TestAutofillBubbleHandler::ShowSaveAutofillPredictionImprovementsBubble(
+    content::WebContents* contents,
+    SaveAutofillPredictionImprovementsController* controller) {
+  if (!save_autofill_prediction_improvements_bubble_view_) {
+    save_autofill_prediction_improvements_bubble_view_ =
+        std::make_unique<TestAutofillBubble>();
+  }
+  return save_autofill_prediction_improvements_bubble_view_.get();
+}
+
 AutofillBubbleBase* TestAutofillBubbleHandler::ShowUpdateAddressProfileBubble(
     content::WebContents* contents,
     std::unique_ptr<UpdateAddressBubbleController> controller,
diff --git a/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.h b/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.h
index d06439f..4843271 100644
--- a/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.h
+++ b/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.h
@@ -46,6 +46,9 @@
       content::WebContents* contents,
       OfferNotificationBubbleController* controller,
       bool is_user_gesture) override;
+  AutofillBubbleBase* ShowSaveAutofillPredictionImprovementsBubble(
+      content::WebContents* web_contents,
+      SaveAutofillPredictionImprovementsController* controller) override;
   AutofillBubbleBase* ShowSaveAddressProfileBubble(
       content::WebContents* contents,
       std::unique_ptr<SaveAddressBubbleController> controller,
@@ -88,6 +91,8 @@
   std::unique_ptr<TestAutofillBubble> iban_bubble_view_;
   std::unique_ptr<TestAutofillBubble> save_address_profile_bubble_view_;
   std::unique_ptr<TestAutofillBubble> update_address_profile_bubble_view_;
+  std::unique_ptr<TestAutofillBubble>
+      save_autofill_prediction_improvements_bubble_view_;
   std::unique_ptr<TestAutofillBubble> add_new_address_profile_bubble_view_;
   std::unique_ptr<TestAutofillBubble> edit_address_profile_bubble_view_;
   std::unique_ptr<TestAutofillBubble> virtual_card_manual_fallback_bubble_view_;
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
index 217f3e60..4932f68 100644
--- a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
+++ b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
@@ -271,10 +271,24 @@
   return this;
 }
 
-void ContentSettingSimpleBubbleModel::SetTitle() {
+bool ContentSettingSimpleBubbleModel::IsContentAllowed() {
   PageSpecificContentSettings* content_settings =
       PageSpecificContentSettings::GetForFrame(&GetPage().GetMainDocument());
 
+  if (content_type() == ContentSettingsType::COOKIES) {
+    ContentSetting setting;
+    GetSettingManagedByUser(web_contents()->GetLastCommittedURL(),
+                            content_type(), GetProfile(), &setting);
+    // We check the content setting here as well because 3PC access influences
+    // the allowed/blocked status even though the icon is meant for 1PC control.
+    return content_settings->IsContentAllowed(content_type()) &&
+           setting == CONTENT_SETTING_ALLOW;
+  }
+  return content_settings->IsContentAllowed(content_type()) &&
+         !content_settings->IsContentBlocked(content_type());
+}
+
+void ContentSettingSimpleBubbleModel::SetTitle() {
   static const ContentSettingsTypeIdEntry kBlockedTitleIDs[] = {
       {ContentSettingsType::COOKIES, IDS_BLOCKED_ON_DEVICE_SITE_DATA_TITLE},
       {ContentSettingsType::IMAGES, IDS_BLOCKED_IMAGES_TITLE},
@@ -297,8 +311,7 @@
   };
   const ContentSettingsTypeIdEntry* title_ids = kBlockedTitleIDs;
   size_t num_title_ids = std::size(kBlockedTitleIDs);
-  if (content_settings->IsContentAllowed(content_type()) &&
-      !content_settings->IsContentBlocked(content_type())) {
+  if (IsContentAllowed()) {
     title_ids = kAccessedTitleIDs;
     num_title_ids = std::size(kAccessedTitleIDs);
   }
@@ -308,9 +321,6 @@
 }
 
 void ContentSettingSimpleBubbleModel::SetMessage() {
-  PageSpecificContentSettings* content_settings =
-      PageSpecificContentSettings::GetForFrame(&GetPage().GetMainDocument());
-
   // TODO(crbug.com/40633805): Make the two arrays below static again once
   // we no longer need to check base::FeatureList.
   const ContentSettingsTypeIdEntry kBlockedMessageIDs[] = {
@@ -343,8 +353,7 @@
   };
   const ContentSettingsTypeIdEntry* message_ids = kBlockedMessageIDs;
   size_t num_message_ids = std::size(kBlockedMessageIDs);
-  if (content_settings->IsContentAllowed(content_type()) &&
-      !content_settings->IsContentBlocked(content_type())) {
+  if (IsContentAllowed()) {
     message_ids = kAccessedMessageIDs;
     num_message_ids = std::size(kAccessedMessageIDs);
   }
@@ -608,10 +617,7 @@
 void ContentSettingSingleRadioGroup::SetRadioGroup() {
   const GURL& url = web_contents()->GetURL();
   const std::u16string& display_url = GetUrlForDisplay(GetProfile(), url);
-
-  PageSpecificContentSettings* content_settings =
-      PageSpecificContentSettings::GetForFrame(&GetPage().GetMainDocument());
-  bool allowed = !content_settings->IsContentBlocked(content_type());
+  bool allowed = IsContentAllowed();
 
   // For the frame busting case the content is blocked but its content type is
   // popup, and the popup PageSpecificContentSettings is unaware of the frame
@@ -620,7 +626,9 @@
   if (content_type() == ContentSettingsType::POPUPS)
     allowed = false;
 
-  DCHECK(!allowed || content_settings->IsContentAllowed(content_type()));
+  DCHECK(!allowed ||
+         PageSpecificContentSettings::GetForFrame(&GetPage().GetMainDocument())
+             ->IsContentAllowed(content_type()));
 
   RadioGroup radio_group;
   radio_group.url = url;
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model.h b/chrome/browser/ui/content_settings/content_setting_bubble_model.h
index 108c49b..8231c1e 100644
--- a/chrome/browser/ui/content_settings/content_setting_bubble_model.h
+++ b/chrome/browser/ui/content_settings/content_setting_bubble_model.h
@@ -322,6 +322,9 @@
   // ContentSettingBubbleModel implementation.
   ContentSettingSimpleBubbleModel* AsSimpleBubbleModel() override;
 
+ protected:
+  bool IsContentAllowed();
+
  private:
   FRIEND_TEST_ALL_PREFIXES(FramebustBlockBrowserTest, ManageButtonClicked);
 
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc b/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc
index d16c048..a3363d9f 100644
--- a/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc
+++ b/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc
@@ -15,6 +15,7 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
+#include "chrome/browser/content_settings/cookie_settings_factory.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/content_settings/page_specific_content_settings_delegate.h"
 #include "chrome/browser/history/history_service_factory.h"
@@ -37,6 +38,7 @@
 #include "components/blocked_content/popup_blocker.h"
 #include "components/blocked_content/popup_blocker_tab_helper.h"
 #include "components/content_settings/browser/page_specific_content_settings.h"
+#include "components/content_settings/core/browser/cookie_settings.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/content_settings/core/common/content_settings.h"
 #include "components/content_settings/core/common/content_settings_types.h"
@@ -118,50 +120,94 @@
   EXPECT_FALSE(bubble_content.manage_text.empty());
 }
 
-TEST_F(ContentSettingBubbleModelTest, Cookies) {
-  WebContentsTester::For(web_contents())->
-      NavigateAndCommit(GURL("https://www.example.com"));
-  PageSpecificContentSettings* content_settings =
-      PageSpecificContentSettings::GetForFrame(
-          web_contents()->GetPrimaryMainFrame());
-  content_settings->OnContentBlocked(ContentSettingsType::COOKIES);
-
-  std::unique_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
-      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
-          nullptr, web_contents(), ContentSettingsType::COOKIES));
-  const ContentSettingBubbleModel::BubbleContent& bubble_content =
-      content_setting_bubble_model->bubble_content();
-  std::u16string title = bubble_content.title;
-  EXPECT_FALSE(title.empty());
-  ASSERT_EQ(2U, bubble_content.radio_group.radio_items.size());
+void VerifyBubbleContent(
+    ContentSetting site_setting,
+    const ContentSettingBubbleModel::BubbleContent& bubble_content) {
+  EXPECT_FALSE(bubble_content.title.empty());
+  ASSERT_EQ(bubble_content.radio_group.radio_items.size(), 2u);
+  if (site_setting == CONTENT_SETTING_BLOCK) {
+    EXPECT_EQ(
+        bubble_content.radio_group.radio_items[0],
+        l10n_util::GetStringUTF16(IDS_BLOCKED_ON_DEVICE_SITE_DATA_UNBLOCK));
+    EXPECT_EQ(
+        bubble_content.radio_group.radio_items[1],
+        l10n_util::GetStringUTF16(IDS_BLOCKED_ON_DEVICE_SITE_DATA_NO_ACTION));
+    EXPECT_EQ(bubble_content.title,
+              l10n_util::GetStringUTF16(IDS_BLOCKED_ON_DEVICE_SITE_DATA_TITLE));
+  } else {
+    EXPECT_EQ(
+        bubble_content.radio_group.radio_items[0],
+        l10n_util::GetStringUTF16(IDS_ALLOWED_ON_DEVICE_SITE_DATA_NO_ACTION));
+    EXPECT_EQ(bubble_content.radio_group.radio_items[1],
+              l10n_util::GetStringUTF16(IDS_ALLOWED_ON_DEVICE_SITE_DATA_BLOCK));
+    EXPECT_EQ(
+        bubble_content.title,
+        l10n_util::GetStringUTF16(IDS_ACCESSED_ON_DEVICE_SITE_DATA_TITLE));
+  }
   EXPECT_TRUE(bubble_content.custom_link.empty());
   EXPECT_FALSE(bubble_content.custom_link_enabled);
   EXPECT_FALSE(bubble_content.manage_text.empty());
-
-  WebContentsTester::For(web_contents())
-      ->NavigateAndCommit(GURL("https://www.example.com"));
-  content_settings = PageSpecificContentSettings::GetForFrame(
-      web_contents()->GetPrimaryMainFrame());
-  content_settings->OnContentAllowed(ContentSettingsType::COOKIES);
-  content_setting_bubble_model =
-      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
-          nullptr, web_contents(), ContentSettingsType::COOKIES);
-  const ContentSettingBubbleModel::BubbleContent& bubble_content_2 =
-      content_setting_bubble_model->bubble_content();
-
-  EXPECT_FALSE(bubble_content_2.title.empty());
-  EXPECT_NE(title, bubble_content_2.title);
-  ASSERT_EQ(2U, bubble_content_2.radio_group.radio_items.size());
-  EXPECT_EQ(
-      bubble_content_2.radio_group.radio_items[0],
-      l10n_util::GetStringUTF16(IDS_ALLOWED_ON_DEVICE_SITE_DATA_NO_ACTION));
-  EXPECT_EQ(bubble_content_2.radio_group.radio_items[1],
-            l10n_util::GetStringUTF16(IDS_ALLOWED_ON_DEVICE_SITE_DATA_BLOCK));
-  EXPECT_TRUE(bubble_content_2.custom_link.empty());
-  EXPECT_FALSE(bubble_content_2.custom_link_enabled);
-  EXPECT_FALSE(bubble_content_2.manage_text.empty());
 }
 
+TEST_F(ContentSettingBubbleModelTest,
+       CookiesContentSettingReflectedWhenCookiesBlocked) {
+  const std::string url = "https://www.example.com";
+  auto cookie_settings = CookieSettingsFactory::GetForProfile(profile());
+  cookie_settings->SetDefaultCookieSetting(CONTENT_SETTING_BLOCK);
+  WebContentsTester::For(web_contents())->NavigateAndCommit(GURL(url));
+  auto* content_settings = PageSpecificContentSettings::GetForFrame(
+      web_contents()->GetPrimaryMainFrame());
+
+  content_settings->OnContentBlocked(ContentSettingsType::COOKIES);
+  VerifyBubbleContent(
+      CONTENT_SETTING_BLOCK,
+      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
+          nullptr, web_contents(), ContentSettingsType::COOKIES)
+          ->bubble_content());
+}
+
+class CookiesContentSettingBubbleModelTest
+    : public ContentSettingBubbleModelTest,
+      public testing::WithParamInterface<
+          std::tuple<ContentSetting, ContentSetting>> {};
+
+TEST_P(CookiesContentSettingBubbleModelTest,
+       BubbleShowsSiteSettingWhenDifferentFromDefaultSetting) {
+  const std::string url = "https://www.example.com";
+  ContentSetting site_setting = std::get<1>(GetParam());
+  auto cookie_settings = CookieSettingsFactory::GetForProfile(profile());
+  cookie_settings->SetDefaultCookieSetting(std::get<0>(GetParam()));
+  cookie_settings->SetCookieSetting(GURL(url), site_setting);
+  WebContentsTester::For(web_contents())->NavigateAndCommit(GURL(url));
+  auto* content_settings = PageSpecificContentSettings::GetForFrame(
+      web_contents()->GetPrimaryMainFrame());
+
+  // Even if cookies are blocked on the 1P site, it's still possible for
+  // OnContentAllowed() to be called due to 3PC being allowed by the default
+  // content setting. This should NOT change how we render the 1PC bubble.
+  content_settings->OnContentAllowed(ContentSettingsType::COOKIES);
+  VerifyBubbleContent(
+      site_setting, ContentSettingBubbleModel::CreateContentSettingBubbleModel(
+                        nullptr, web_contents(), ContentSettingsType::COOKIES)
+                        ->bubble_content());
+
+  // Even if cookies are allowed on the 1P site, it's still possible for
+  // OnContentBlocked() to be called due to 3PC being blocked by the default
+  // content setting. This should NOT change how we render the 1PC bubble.
+  content_settings->OnContentBlocked(ContentSettingsType::COOKIES);
+  VerifyBubbleContent(
+      site_setting, ContentSettingBubbleModel::CreateContentSettingBubbleModel(
+                        nullptr, web_contents(), ContentSettingsType::COOKIES)
+                        ->bubble_content());
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    CookiesContentSettingBubbleModelTests,
+    CookiesContentSettingBubbleModelTest,
+    testing::Values(
+        std::make_tuple(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK),
+        std::make_tuple(CONTENT_SETTING_BLOCK, CONTENT_SETTING_ALLOW)));
+
 TEST_F(ContentSettingBubbleModelTest, MediastreamMicAndCamera) {
   WebContentsTester::For(web_contents())
       ->NavigateAndCommit(GURL("https://www.example.com"));
diff --git a/chrome/browser/ui/content_settings/content_setting_image_model.cc b/chrome/browser/ui/content_settings/content_setting_image_model.cc
index c4fe984c..f035262 100644
--- a/chrome/browser/ui/content_settings/content_setting_image_model.cc
+++ b/chrome/browser/ui/content_settings/content_setting_image_model.cc
@@ -573,18 +573,22 @@
   auto* map = HostContentSettingsMapFactory::GetForProfile(profile);
 
   if (type == ContentSettingsType::COOKIES) {
-    // Don't show the cookie page action if:
-    // 1. Cookies are allowed due to the default cookies content setting
-    // 2. Cookies are blocked due to a non-cookies content setting source
-    // 3. Third-party cookies are blocked
-    if ((is_allowed &&
-         map->GetDefaultContentSetting(type) != CONTENT_SETTING_BLOCK) ||
-        (is_blocked &&
-         map->GetContentSetting(web_contents->GetLastCommittedURL(),
-                                web_contents->GetLastCommittedURL(),
-                                type) != CONTENT_SETTING_BLOCK) ||
-        CookieSettingsFactory::GetForProfile(profile)
-            ->ShouldBlockThirdPartyCookies()) {
+    auto cookie_settings = CookieSettingsFactory::GetForProfile(profile);
+    const auto& url = web_contents->GetLastCommittedURL();
+    bool blocked_via_setting = cookie_settings->GetCookieSetting(
+                                   url, net::SiteForCookies::FromUrl(url), url,
+                                   {}) == CONTENT_SETTING_BLOCK;
+    // We check the cookie setting here as well because 3PC access influences
+    // the allowed/blocked status even though the icon is meant for 1PC control.
+    is_blocked = is_blocked && blocked_via_setting;
+    // True if the user blocked 1PCs by default but allowed them for this site.
+    bool allowed_for_site =
+        is_allowed && !blocked_via_setting &&
+        map->GetDefaultContentSetting(type) == CONTENT_SETTING_BLOCK;
+    // Only show the cookie page action if 1PCs are allowed via site-level
+    // exception on the current site OR blocked AND 3PCs are allowed.
+    if ((!allowed_for_site && !is_blocked) ||
+        cookie_settings->ShouldBlockThirdPartyCookies()) {
       return false;
     }
   }
@@ -594,7 +598,7 @@
     explanation_id = 0;
   }
 
-  SetIcon(type, content_settings->IsContentBlocked(type));
+  SetIcon(type, is_blocked);
   set_explanatory_string_id(explanation_id);
   DCHECK(tooltip_id);
   set_tooltip(l10n_util::GetStringUTF16(tooltip_id));
diff --git a/chrome/browser/ui/content_settings/content_setting_image_model_unittest.cc b/chrome/browser/ui/content_settings/content_setting_image_model_unittest.cc
index e0a5115..638b45d 100644
--- a/chrome/browser/ui/content_settings/content_setting_image_model_unittest.cc
+++ b/chrome/browser/ui/content_settings/content_setting_image_model_unittest.cc
@@ -219,9 +219,13 @@
   PageSpecificContentSettings::CreateForWebContents(
       web_contents(),
       std::make_unique<PageSpecificContentSettingsDelegate>(web_contents()));
-  HostContentSettingsMapFactory::GetForProfile(profile())
-      ->SetDefaultContentSetting(ContentSettingsType::COOKIES,
-                                 CONTENT_SETTING_BLOCK);
+  auto* content_settings =
+      HostContentSettingsMapFactory::GetForProfile(profile());
+  content_settings->SetDefaultContentSetting(ContentSettingsType::COOKIES,
+                                             CONTENT_SETTING_BLOCK);
+  content_settings->SetContentSettingDefaultScope(
+      web_contents()->GetLastCommittedURL(), GURL(),
+      ContentSettingsType::COOKIES, CONTENT_SETTING_ALLOW);
   auto content_setting_image_model =
       ContentSettingImageModel::CreateForContentType(
           ContentSettingImageModel::ImageType::COOKIES);
diff --git a/chrome/browser/ui/plus_addresses/plus_address_error_dialog.cc b/chrome/browser/ui/plus_addresses/plus_address_error_dialog.cc
index 54223ef..401978b 100644
--- a/chrome/browser/ui/plus_addresses/plus_address_error_dialog.cc
+++ b/chrome/browser/ui/plus_addresses/plus_address_error_dialog.cc
@@ -50,7 +50,10 @@
 }
 
 void ShowInlineCreationErrorDialog(content::WebContents* web_contents,
+                                   PlusAddressErrorDialogType error_dialog_type,
                                    base::OnceClosure on_accepted) {
+  // TODO(crbug.com/362445807): Differentiate dialog design based on
+  // `error_dialog_type`.
   constrained_window::ShowWebModal(
       ui::DialogModel::Builder()
           .SetTitle(l10n_util::GetStringUTF16(
diff --git a/chrome/browser/ui/plus_addresses/plus_address_error_dialog.h b/chrome/browser/ui/plus_addresses/plus_address_error_dialog.h
index 8ba60d11..dcdbfad 100644
--- a/chrome/browser/ui/plus_addresses/plus_address_error_dialog.h
+++ b/chrome/browser/ui/plus_addresses/plus_address_error_dialog.h
@@ -8,6 +8,7 @@
 #include <string>
 
 #include "base/functional/callback_forward.h"
+#include "components/autofill/core/browser/autofill_client.h"
 #include "ui/base/interaction/element_identifier.h"
 
 namespace content {
@@ -30,7 +31,10 @@
 
 // Shows a tab-modal error dialog that offers trying again and runs
 // `on_accepted` if the user chooses to do so.
+using PlusAddressErrorDialogType =
+    autofill::AutofillClient::PlusAddressErrorDialogType;
 void ShowInlineCreationErrorDialog(content::WebContents* web_contents,
+                                   PlusAddressErrorDialogType error_dialog_type,
                                    base::OnceClosure on_accepted);
 
 }  // namespace plus_addresses
diff --git a/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.cc b/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.cc
index 440e947..55fe26f 100644
--- a/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.cc
+++ b/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.cc
@@ -10,10 +10,12 @@
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/autofill/autofill_bubble_base.h"
+#include "chrome/browser/ui/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_controller.h"
 #include "chrome/browser/ui/autofill/payments/save_card_ui.h"
 #include "chrome/browser/ui/autofill/payments/save_iban_ui.h"
 #include "chrome/browser/ui/browser_commands.h"
 #include "chrome/browser/ui/views/autofill/add_new_address_bubble_view.h"
+#include "chrome/browser/ui/views/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_bubble_view.h"
 #include "chrome/browser/ui/views/autofill/payments/local_card_migration_bubble_views.h"
 #include "chrome/browser/ui/views/autofill/payments/local_card_migration_icon_view.h"
 #include "chrome/browser/ui/views/autofill/payments/manage_saved_iban_bubble_view.h"
@@ -234,6 +236,28 @@
       is_user_gesture);
 }
 
+AutofillBubbleBase*
+AutofillBubbleHandlerImpl::ShowSaveAutofillPredictionImprovementsBubble(
+    content::WebContents* web_contents,
+    SaveAutofillPredictionImprovementsController* controller) {
+  views::View* anchor_view = toolbar_button_provider_->GetAnchorView(
+      PageActionIconType::kAutofillAddress);
+  PageActionIconView* icon_view =
+      toolbar_button_provider_->GetPageActionIconView(
+          PageActionIconType::kAutofillAddress);
+  auto bubble = std::make_unique<SaveAutofillPredictionImprovementsBubbleView>(
+      anchor_view, web_contents, controller);
+  SaveAutofillPredictionImprovementsBubbleView* bubble_ptr = bubble.get();
+  views::BubbleDialogDelegateView::CreateBubble(std::move(bubble));
+
+  if (!views::Button::AsButton(anchor_view)) {
+    bubble_ptr->SetHighlightedButton(icon_view);
+  }
+  bubble_ptr->ShowForReason(LocationBarBubbleDelegateView::AUTOMATIC);
+
+  return bubble_ptr;
+}
+
 AutofillBubbleBase* AutofillBubbleHandlerImpl::ShowUpdateAddressProfileBubble(
     content::WebContents* web_contents,
     std::unique_ptr<UpdateAddressBubbleController> controller,
diff --git a/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.h b/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.h
index 0de665a..0a080f6 100644
--- a/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.h
+++ b/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.h
@@ -60,6 +60,9 @@
       content::WebContents* contents,
       OfferNotificationBubbleController* controller,
       bool is_user_gesture) override;
+  AutofillBubbleBase* ShowSaveAutofillPredictionImprovementsBubble(
+      content::WebContents* web_contents,
+      SaveAutofillPredictionImprovementsController* controller) override;
   AutofillBubbleBase* ShowSaveAddressProfileBubble(
       content::WebContents* web_contents,
       std::unique_ptr<SaveAddressBubbleController> controller,
diff --git a/chrome/browser/ui/views/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_bubble_view.cc b/chrome/browser/ui/views/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_bubble_view.cc
new file mode 100644
index 0000000..58a2289
--- /dev/null
+++ b/chrome/browser/ui/views/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_bubble_view.cc
@@ -0,0 +1,95 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/views/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_bubble_view.h"
+
+#include "chrome/browser/ui/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_controller.h"
+#include "chrome/browser/ui/views/chrome_layout_provider.h"
+#include "ui/base/metadata/metadata_impl_macros.h"
+#include "ui/base/ui_base_types.h"
+#include "ui/views/accessibility/view_accessibility.h"
+#include "ui/views/controls/label.h"
+
+namespace autofill {
+
+namespace {
+SaveAutofillPredictionImprovementsController::
+    PredictionImprovementsBubbleClosedReason
+    GetPredictionImprovementsBubbleClosedReasonFromWidget(
+        const views::Widget* widget) {
+  DCHECK(widget);
+  if (!widget->IsClosed()) {
+    return SaveAutofillPredictionImprovementsController::
+        PredictionImprovementsBubbleClosedReason::kUnknown;
+  }
+
+  switch (widget->closed_reason()) {
+    case views::Widget::ClosedReason::kUnspecified:
+      return SaveAutofillPredictionImprovementsController::
+          PredictionImprovementsBubbleClosedReason::kNotInteracted;
+    case views::Widget::ClosedReason::kEscKeyPressed:
+    case views::Widget::ClosedReason::kCloseButtonClicked:
+      return SaveAutofillPredictionImprovementsController::
+          PredictionImprovementsBubbleClosedReason::kClosed;
+    case views::Widget::ClosedReason::kLostFocus:
+      return SaveAutofillPredictionImprovementsController::
+          PredictionImprovementsBubbleClosedReason::kLostFocus;
+    case views::Widget::ClosedReason::kAcceptButtonClicked:
+      return SaveAutofillPredictionImprovementsController::
+          PredictionImprovementsBubbleClosedReason::kAccepted;
+    case views::Widget::ClosedReason::kCancelButtonClicked:
+      return SaveAutofillPredictionImprovementsController::
+          PredictionImprovementsBubbleClosedReason::kCancelled;
+  }
+}
+}  // namespace
+
+SaveAutofillPredictionImprovementsBubbleView::
+    SaveAutofillPredictionImprovementsBubbleView(
+        views::View* anchor_view,
+        content::WebContents* web_contents,
+        SaveAutofillPredictionImprovementsController* controller)
+    : AutofillLocationBarBubble(anchor_view, web_contents),
+      controller_(controller->GetWeakPtr()) {
+  set_fixed_width(views::LayoutProvider::Get()->GetDistanceMetric(
+      views::DISTANCE_BUBBLE_PREFERRED_WIDTH));
+  SetLayoutManager(std::make_unique<views::BoxLayout>(
+      views::BoxLayout::Orientation::kVertical));
+  set_margins(ChromeLayoutProvider::Get()->GetDialogInsetsForContentType(
+      views::DialogContentType::kText, views::DialogContentType::kText));
+  auto description = std::make_unique<views::Label>(
+      u"Description", views::style::CONTEXT_DIALOG_BODY_TEXT,
+      views::style::STYLE_SECONDARY);
+  AddChildView(std::move(description));
+}
+
+void SaveAutofillPredictionImprovementsBubbleView::Hide() {
+  CloseBubble();
+  if (controller_) {
+    controller_->OnBubbleClosed(
+        GetPredictionImprovementsBubbleClosedReasonFromWidget(GetWidget()));
+  }
+  controller_ = nullptr;
+}
+
+void SaveAutofillPredictionImprovementsBubbleView::AddedToWidget() {
+  GetBubbleFrameView()->SetTitleView(
+      std::make_unique<views::Label>(u"Prediction improvements"));
+}
+
+void SaveAutofillPredictionImprovementsBubbleView::WindowClosing() {
+  CloseBubble();
+  if (controller_) {
+    controller_->OnBubbleClosed(
+        GetPredictionImprovementsBubbleClosedReasonFromWidget(GetWidget()));
+  }
+  controller_ = nullptr;
+}
+
+SaveAutofillPredictionImprovementsBubbleView::
+    ~SaveAutofillPredictionImprovementsBubbleView() = default;
+
+BEGIN_METADATA(SaveAutofillPredictionImprovementsBubbleView)
+END_METADATA
+}  // namespace autofill
diff --git a/chrome/browser/ui/views/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_bubble_view.h b/chrome/browser/ui/views/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_bubble_view.h
new file mode 100644
index 0000000..e7d1e1b
--- /dev/null
+++ b/chrome/browser/ui/views/autofill/autofill_prediction_improvements/save_autofill_prediction_improvements_bubble_view.h
@@ -0,0 +1,48 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_VIEWS_AUTOFILL_AUTOFILL_PREDICTION_IMPROVEMENTS_SAVE_AUTOFILL_PREDICTION_IMPROVEMENTS_BUBBLE_VIEW_H_
+#define CHROME_BROWSER_UI_VIEWS_AUTOFILL_AUTOFILL_PREDICTION_IMPROVEMENTS_SAVE_AUTOFILL_PREDICTION_IMPROVEMENTS_BUBBLE_VIEW_H_
+
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/ui/autofill/autofill_bubble_base.h"
+#include "chrome/browser/ui/views/autofill/autofill_location_bar_bubble.h"
+#include "ui/base/metadata/metadata_header_macros.h"
+
+namespace autofill {
+
+class SaveAutofillPredictionImprovementsController;
+
+// This class displays a bubble to prompt the user whether they want to store
+// improved predictions.
+class SaveAutofillPredictionImprovementsBubbleView
+    : public AutofillLocationBarBubble {
+  METADATA_HEADER(SaveAutofillPredictionImprovementsBubbleView, views::View)
+
+ public:
+  SaveAutofillPredictionImprovementsBubbleView(
+      views::View* anchor_view,
+      content::WebContents* web_contents,
+      SaveAutofillPredictionImprovementsController* controller);
+
+  SaveAutofillPredictionImprovementsBubbleView(
+      const SaveAutofillPredictionImprovementsBubbleView&) = delete;
+  SaveAutofillPredictionImprovementsBubbleView& operator=(
+      const SaveAutofillPredictionImprovementsBubbleView&) = delete;
+  ~SaveAutofillPredictionImprovementsBubbleView() override;
+
+  // AutofillBubbleBase:
+  void Hide() override;
+
+  // LocationBarBubbleDelegateView:
+  void AddedToWidget() override;
+  void WindowClosing() override;
+
+ private:
+  base::WeakPtr<SaveAutofillPredictionImprovementsController> controller_;
+};
+
+}  // namespace autofill
+
+#endif  // CHROME_BROWSER_UI_VIEWS_AUTOFILL_AUTOFILL_PREDICTION_IMPROVEMENTS_SAVE_AUTOFILL_PREDICTION_IMPROVEMENTS_BUBBLE_VIEW_H_
diff --git a/chrome/browser/ui/views/commerce/product_specifications_button.cc b/chrome/browser/ui/views/commerce/product_specifications_button.cc
index 3fbeefd46..9f014a65 100644
--- a/chrome/browser/ui/views/commerce/product_specifications_button.cc
+++ b/chrome/browser/ui/views/commerce/product_specifications_button.cc
@@ -108,6 +108,9 @@
   SetLayoutManager(std::make_unique<views::FlexLayout>());
 
   UpdateColors();
+
+  // Button is not visible by default to avoid grabbing focus.
+  SetVisible(false);
 }
 
 ProductSpecificationsButton::~ProductSpecificationsButton() = default;
@@ -137,9 +140,14 @@
   // If the button went from shown -> hidden, unblock the tab strip from
   // showing other modal UIs. Compare to 0.5 to distinguish between show/hide
   // while avoiding potentially inexact float comparison to 0.0.
+  // When hiding animation finishes, set the button to not visible to avoid
+  // grabbing focus.
   if (animation == &expansion_animation_ &&
-      animation->GetCurrentValue() < 0.5 && scoped_tab_strip_modal_ui_) {
-    scoped_tab_strip_modal_ui_.reset();
+      animation->GetCurrentValue() < 0.5) {
+    SetVisible(false);
+    if (scoped_tab_strip_modal_ui_) {
+      scoped_tab_strip_modal_ui_.reset();
+    }
   }
 }
 
@@ -153,6 +161,7 @@
   if (expansion_animation_.IsShowing()) {
     return;
   }
+
   if (locked_expansion_view_->IsMouseHovered()) {
     SetLockedExpansionMode(LockedExpansionMode::kWillShow);
   }
@@ -220,6 +229,7 @@
       FROM_HERE, delay, this,
       &ProductSpecificationsButton::ShowOpacityAnimation);
 
+  SetVisible(true);
   expansion_animation_.Show();
 
   hide_button_timer_.Start(FROM_HERE, kShowDuration, this,
diff --git a/chrome/browser/ui/views/permissions/embedded_permission_prompt_interactive_uitest.cc b/chrome/browser/ui/views/permissions/embedded_permission_prompt_interactive_uitest.cc
index 2297abe..46e002c 100644
--- a/chrome/browser/ui/views/permissions/embedded_permission_prompt_interactive_uitest.cc
+++ b/chrome/browser/ui/views/permissions/embedded_permission_prompt_interactive_uitest.cc
@@ -802,10 +802,8 @@
   }
 }
 
-// (crbug.com/362684605, andypaicu): this test causes a deterministic failure in
-// an entirely different test.
 IN_PROC_BROWSER_TEST_F(EmbeddedPermissionPromptPositioningInteractiveTest,
-                       DISABLED_TestPositionUsingZoom) {
+                       MAYBE_TestPositionUsingZoom) {
   RunTestSequence(InstrumentTab(kWebContentsElementId),
                   NavigateWebContents(kWebContentsElementId, GetURL()),
                   ExecuteJs(kWebContentsElementId, "setFontSizeSmall"));
diff --git a/chrome/browser/ui/views/profiles/batch_upload_dialog_view.cc b/chrome/browser/ui/views/profiles/batch_upload_dialog_view.cc
index a3f71ae..f526d1c5f 100644
--- a/chrome/browser/ui/views/profiles/batch_upload_dialog_view.cc
+++ b/chrome/browser/ui/views/profiles/batch_upload_dialog_view.cc
@@ -6,14 +6,108 @@
 
 #include "base/functional/callback.h"
 #include "base/memory/ptr_util.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/profiles/batch_upload_ui_delegate.h"
+#include "chrome/browser/ui/webui/signin/batch_upload_ui.h"
+#include "chrome/common/webui_url_constants.h"
 #include "components/constrained_window/constrained_window_views.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/gfx/native_widget_types.h"
+#include "ui/views/controls/webview/webview.h"
+#include "ui/views/layout/fill_layout.h"
 #include "ui/views/widget/widget.h"
 
+namespace {
+
+constexpr int kBatchUploadDialogFixedWidth = 512;
+constexpr int kBatchUploadDialogMaxHeight = 628;
+
+BatchUploadUI* GetBatchUploadUI(views::WebView* web_view) {
+  return web_view->GetWebContents()
+      ->GetWebUI()
+      ->GetController()
+      ->GetAs<BatchUploadUI>();
+}
+
+}  // namespace
+
 BatchUploadDialogView::~BatchUploadDialogView() {
+  // Makes sure that everything is cleaned up if it was not done before.
+  OnClose();
+}
+
+// static
+BatchUploadDialogView* BatchUploadDialogView::CreateBatchUploadDialogView(
+    Browser& browser,
+    const std::vector<raw_ptr<const BatchUploadDataProvider>>&
+        data_providers_list,
+    SelectedDataTypeItemsCallback complete_callback) {
+  std::unique_ptr<BatchUploadDialogView> dialog_view = base::WrapUnique(
+      new BatchUploadDialogView(browser.profile(), data_providers_list,
+                                std::move(complete_callback)));
+  BatchUploadDialogView* dialog_view_ptr = dialog_view.get();
+
+  gfx::NativeWindow window = browser.tab_strip_model()
+                                 ->GetActiveWebContents()
+                                 ->GetTopLevelNativeWindow();
+
+  constrained_window::CreateBrowserModalDialogViews(std::move(dialog_view),
+                                                    window);
+  return dialog_view_ptr;
+}
+
+BatchUploadDialogView::BatchUploadDialogView(
+    Profile* profile,
+    const std::vector<raw_ptr<const BatchUploadDataProvider>>&
+        data_providers_list,
+    SelectedDataTypeItemsCallback complete_callback)
+    : complete_callback_(std::move(complete_callback)) {
+  // Temporary hardcoded name - to be moved to webui implementation.
+  SetTitle(u"Save data to account");
+  SetModalType(ui::mojom::ModalType::kWindow);
+  // No native buttons.
+  SetButtons(static_cast<int>(ui::mojom::DialogButton::kNone));
+  // No close (x) top right button.
+  SetShowCloseButton(false);
+
+  // Setting a close callback to make sure every time the view is being closed,
+  // that all necessary data are cleared. The view and underlying child views
+  // may be destroyed asynchronosly.
+  SetCloseCallback(
+      base::BindOnce(&BatchUploadDialogView::OnClose, base::Unretained(this)));
+
+  // Create the web view in the native bubble.
+  std::unique_ptr<views::WebView> web_view =
+      std::make_unique<views::WebView>(profile);
+  web_view->LoadInitialURL(GURL(chrome::kChromeUIBatchUploadURL));
+  web_view_ = web_view.get();
+
+  BatchUploadUI* web_ui = GetBatchUploadUI(web_view_);
+  CHECK(web_ui);
+
+  // Initializes the UI that will initialize the handler when ready.
+  web_ui->Initialize(
+      data_providers_list,
+      base::BindRepeating(&BatchUploadDialogView::SetHeightAndShowWidget,
+                          base::Unretained(this)),
+      base::BindOnce(&BatchUploadDialogView::OnDialogSelectionMade,
+                     base::Unretained(this)));
+
+  AddChildView(std::move(web_view));
+
+  SetLayoutManager(std::make_unique<views::FillLayout>());
+}
+
+void BatchUploadDialogView::OnClose() {
+  // `complete_callback_` will destroy data owned by the service/controller
+  // passed to the UI and handler. We need to make sure those are cleared if the
+  // UI is still alive, before clearing the service/controller.
+  BatchUploadUI* web_ui = GetBatchUploadUI(web_view_);
+  if (web_ui) {
+    web_ui->Clear();
+  }
+
   // If the view was closed without a user action, run the callback as if it was
   // cancelled (empty result).
   if (complete_callback_) {
@@ -21,35 +115,28 @@
   }
 }
 
-// static
-void BatchUploadDialogView::CreateBatchUploadDialogView(
-    Browser& browser,
-    const std::vector<raw_ptr<const BatchUploadDataProvider>>&
-        data_providers_list,
-    SelectedDataTypeItemsCallback complete_callback) {
-  std::unique_ptr<BatchUploadDialogView> dialog_view =
-      base::WrapUnique(new BatchUploadDialogView(data_providers_list,
-                                                 std::move(complete_callback)));
-
-  gfx::NativeWindow window = browser.tab_strip_model()
-                                 ->GetActiveWebContents()
-                                 ->GetTopLevelNativeWindow();
-
-  views::Widget* widget = constrained_window::CreateBrowserModalDialogViews(
-      std::move(dialog_view), window);
-  widget->Show();
+void BatchUploadDialogView::OnDialogSelectionMade(
+    const base::flat_map<BatchUploadDataType,
+                         std::vector<BatchUploadDataItemModel::Id>>&
+        selected_map) {
+  // Take ownership of the callback, as closing the widget will attempt to
+  // execute it with an empty map.
+  SelectedDataTypeItemsCallback complete_callback(
+      std::move(complete_callback_));
+  // The widget should be closed before running the callback as the ui and
+  // handler contain data that will be destroyed when `complete_callback`
+  // executes.
+  GetWidget()->Close();
+  std::move(complete_callback).Run(selected_map);
 }
 
-BatchUploadDialogView::BatchUploadDialogView(
-    const std::vector<raw_ptr<const BatchUploadDataProvider>>&
-        data_providers_list,
-    SelectedDataTypeItemsCallback complete_callback)
-    : complete_callback_(std::move(complete_callback)) {
-  // Temporary hardcoded name.
-  SetTitle(u"Save data to account");
-  SetModalType(ui::mojom::ModalType::kWindow);
-  // Temporary.
-  SetShowCloseButton(true);
+void BatchUploadDialogView::SetHeightAndShowWidget(int height) {
+  // Beyond `kBatchUploadDialogMaxHeight`, the dialog will show a scrollbar.
+  web_view_->SetPreferredSize(
+      gfx::Size(kBatchUploadDialogFixedWidth,
+                std::min(height, kBatchUploadDialogMaxHeight)));
+  GetWidget()->SetSize(GetWidget()->non_client_view()->GetPreferredSize());
+  GetWidget()->Show();
 }
 
 // BatchUploadUIDelegate -------------------------------------------------------
diff --git a/chrome/browser/ui/views/profiles/batch_upload_dialog_view.h b/chrome/browser/ui/views/profiles/batch_upload_dialog_view.h
index 47c3661..cae5737 100644
--- a/chrome/browser/ui/views/profiles/batch_upload_dialog_view.h
+++ b/chrome/browser/ui/views/profiles/batch_upload_dialog_view.h
@@ -9,9 +9,17 @@
 #include "ui/views/window/dialog_delegate.h"
 
 class Browser;
+class Profile;
 
-class BatchUploadDialogViewTest;
+class BatchUploadDialogViewBrowserTest;
 
+namespace views {
+class WebView;
+}  // namespace views
+
+// Native dialog view that holds the web ui component for the Batch Upload ui.
+// It needs to adapt the height size based on the web ui content that is
+// displayed, which is dynamic.
 class BatchUploadDialogView : public views::DialogDelegateView {
   METADATA_HEADER(BatchUploadDialogView, views::DialogDelegateView)
 
@@ -20,24 +28,47 @@
   BatchUploadDialogView& operator=(const BatchUploadDialogView& other) = delete;
   ~BatchUploadDialogView() override;
 
-  static void CreateBatchUploadDialogView(
+  // Creates the dialog view and registers as a modal view.
+  // The created dialog view is owned by the views system.
+  static BatchUploadDialogView* CreateBatchUploadDialogView(
       Browser& browser,
       const std::vector<raw_ptr<const BatchUploadDataProvider>>&
           data_providers_list,
       SelectedDataTypeItemsCallback complete_callback);
 
  private:
-  FRIEND_TEST_ALL_PREFIXES(BatchUploadDialogViewTest,
-                           OpenBatchUploadDialogViewWithClose);
-  FRIEND_TEST_ALL_PREFIXES(BatchUploadDialogViewTest,
-                           OpenBatchUploadDialogWithViewDestroyed);
+  friend class BatchUploadDialogViewBrowserTest;
+
+  FRIEND_TEST_ALL_PREFIXES(BatchUploadDialogViewBrowserTest,
+                           OpenBatchUploadDialogViewWithCloseAction);
+  FRIEND_TEST_ALL_PREFIXES(BatchUploadDialogViewBrowserTest,
+                           OpenBatchUploadDialogViewWithDestroyed);
 
   explicit BatchUploadDialogView(
+      Profile* profile,
       const std::vector<raw_ptr<const BatchUploadDataProvider>>&
           data_providers_list,
       SelectedDataTypeItemsCallback complete_callback);
 
+  // Callback to properly resize the view based on the loaded web ui content.
+  // Also shows the widget.
+  void SetHeightAndShowWidget(int height);
+
+  // Callback to receive the selected items from the web ui view.
+  // Empty list means the dialog was closed without a move item request.
+  void OnDialogSelectionMade(
+      const base::flat_map<BatchUploadDataType,
+                           std::vector<BatchUploadDataItemModel::Id>>&
+          selected_map);
+
+  // Callback used as a clearing method whenever the view is being closed. Used
+  // to clear any data until the view is actually closed, given that closing the
+  // view fully is asynchronous.
+  void OnClose();
+
   SelectedDataTypeItemsCallback complete_callback_;
+
+  raw_ptr<views::WebView> web_view_;
 };
 
 #endif  // CHROME_BROWSER_UI_VIEWS_PROFILES_BATCH_UPLOAD_DIALOG_VIEW_H_
diff --git a/chrome/browser/ui/views/profiles/batch_upload_dialog_view_browsertest.cc b/chrome/browser/ui/views/profiles/batch_upload_dialog_view_browsertest.cc
new file mode 100644
index 0000000..15b6b63
--- /dev/null
+++ b/chrome/browser/ui/views/profiles/batch_upload_dialog_view_browsertest.cc
@@ -0,0 +1,120 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/views/profiles/batch_upload_dialog_view.h"
+
+#include "base/functional/callback.h"
+#include "base/functional/callback_helpers.h"
+#include "base/memory/ptr_util.h"
+#include "base/test/mock_callback.h"
+#include "chrome/browser/profiles/batch_upload/batch_upload_controller.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/common/webui_url_constants.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "components/signin/public/base/signin_switches.h"
+#include "content/public/test/browser_task_environment.h"
+#include "content/public/test/browser_test.h"
+#include "content/public/test/test_navigation_observer.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace {
+
+constexpr base::flat_map<BatchUploadDataType,
+                         std::vector<BatchUploadDataItemModel::Id>>
+    kEmptySelectedMap;
+
+const std::u16string kBatchUploadTitle = u"Save data to account";
+
+class BatchUploadDataProviderFake : public BatchUploadDataProvider {
+ public:
+  explicit BatchUploadDataProviderFake(BatchUploadDataType type)
+      : BatchUploadDataProvider(type) {}
+
+  void SetHasLocalData(bool has_local_data) {
+    has_local_data_ = has_local_data;
+  }
+
+  bool HasLocalData() const override { return has_local_data_; }
+
+  BatchUploadDataContainer GetLocalData() const override {
+    BatchUploadDataContainer container(/*section_name_id=*/123,
+                                       /*dialog_subtitle_id=*/456);
+    if (has_local_data_) {
+      // Add an arbitrary item.
+      container.items.push_back({.id = BatchUploadDataItemModel::Id(123),
+                                 .title = "data_title",
+                                 .subtitle = "data_subtitle"});
+    }
+    return container;
+  }
+
+  bool MoveToAccountStorage(const std::vector<BatchUploadDataItemModel::Id>&
+                                item_ids_to_move) override {
+    return true;
+  }
+
+ private:
+  bool has_local_data_ = false;
+};
+
+}  // namespace
+
+class BatchUploadDialogViewBrowserTest : public InProcessBrowserTest {
+ public:
+  BatchUploadDialogView* CreateBatchUploadDialogView(
+      Profile* profile,
+      const std::vector<raw_ptr<const BatchUploadDataProvider>>&
+          data_providers_list,
+      SelectedDataTypeItemsCallback complete_callback) {
+    content::TestNavigationObserver observer{
+        GURL(chrome::kChromeUIBatchUploadURL)};
+    observer.StartWatchingNewWebContents();
+
+    BatchUploadDialogView* dialog_view =
+        BatchUploadDialogView::CreateBatchUploadDialogView(
+            *browser(), data_providers_list, std::move(complete_callback));
+
+    observer.Wait();
+
+    return dialog_view;
+  }
+
+ private:
+  // Needed to make sure the mojo binders are set.
+  base::test::ScopedFeatureList scoped_feature_list_{
+      switches::kBatchUploadDesktop};
+};
+
+IN_PROC_BROWSER_TEST_F(BatchUploadDialogViewBrowserTest,
+                       OpenBatchUploadDialogViewWithCloseAction) {
+  base::MockCallback<SelectedDataTypeItemsCallback> mock_callback;
+
+  BatchUploadDataProviderFake fake_provider(BatchUploadDataType::kPasswords);
+  fake_provider.SetHasLocalData(true);
+  BatchUploadDialogView* dialog_view = CreateBatchUploadDialogView(
+      browser()->profile(), {&fake_provider}, mock_callback.Get());
+  EXPECT_EQ(dialog_view->GetWindowTitle(), kBatchUploadTitle);
+
+  EXPECT_CALL(mock_callback, Run(kEmptySelectedMap)).Times(1);
+  dialog_view->OnDialogSelectionMade({});
+}
+
+IN_PROC_BROWSER_TEST_F(BatchUploadDialogViewBrowserTest,
+                       OpenBatchUploadDialogViewWithDestroyed) {
+  base::MockCallback<SelectedDataTypeItemsCallback> mock_callback;
+
+  EXPECT_CALL(mock_callback, Run(kEmptySelectedMap)).Times(1);
+  {
+    BatchUploadDataProviderFake fake_provider(BatchUploadDataType::kPasswords);
+    fake_provider.SetHasLocalData(true);
+    BatchUploadDialogView* dialog_view = CreateBatchUploadDialogView(
+        browser()->profile(), {&fake_provider}, mock_callback.Get());
+    EXPECT_EQ(dialog_view->GetWindowTitle(), kBatchUploadTitle);
+
+    // Simulate the widget closing without user action.
+    views::Widget* widget = dialog_view->GetWidget();
+    ASSERT_TRUE(widget);
+    widget->Close();
+  }
+}
diff --git a/chrome/browser/ui/views/profiles/batch_upload_dialog_view_pixel_browsertest.cc b/chrome/browser/ui/views/profiles/batch_upload_dialog_view_pixel_browsertest.cc
index 8659d0f..6e9668e0 100644
--- a/chrome/browser/ui/views/profiles/batch_upload_dialog_view_pixel_browsertest.cc
+++ b/chrome/browser/ui/views/profiles/batch_upload_dialog_view_pixel_browsertest.cc
@@ -4,15 +4,54 @@
 
 #include <string>
 
+#include "chrome/browser/profiles/batch_upload/batch_upload_controller.h"
+#include "chrome/browser/profiles/batch_upload/batch_upload_data_provider.h"
 #include "chrome/browser/ui/test/test_browser_dialog.h"
 #include "chrome/browser/ui/views/profiles/batch_upload_dialog_view.h"
+#include "chrome/common/webui_url_constants.h"
 #include "components/signin/public/base/signin_switches.h"
 #include "content/public/test/browser_test.h"
+#include "content/public/test/test_navigation_observer.h"
 #include "ui/base/ui_base_switches.h"
 #include "ui/views/widget/any_widget_observer.h"
 
 namespace {
 
+// Testing implementation of `BatchUploadDataProvider`.
+// TODO(b/362733052): Separate into its own file to be used by
+// other tests with more useful functions for testing.
+class BatchUploadDataProviderFake : public BatchUploadDataProvider {
+ public:
+  explicit BatchUploadDataProviderFake(BatchUploadDataType type)
+      : BatchUploadDataProvider(type) {}
+
+  void SetHasLocalData(bool has_local_data) {
+    has_local_data_ = has_local_data;
+  }
+
+  bool HasLocalData() const override { return has_local_data_; }
+
+  BatchUploadDataContainer GetLocalData() const override {
+    BatchUploadDataContainer container(/*section_name_id=*/123,
+                                       /*dialog_subtitle_id=*/456);
+    if (has_local_data_) {
+      // Add an arbitrary item.
+      container.items.push_back({.id = BatchUploadDataItemModel::Id(123),
+                                 .title = "data_title",
+                                 .subtitle = "data_subtitle"});
+    }
+    return container;
+  }
+
+  bool MoveToAccountStorage(const std::vector<BatchUploadDataItemModel::Id>&
+                                item_ids_to_move) override {
+    return true;
+  }
+
+ private:
+  bool has_local_data_ = false;
+};
+
 struct TestParam {
   std::string test_suffix = "";
   bool use_dark_theme = false;
@@ -36,6 +75,9 @@
     : public DialogBrowserTest,
       public testing::WithParamInterface<TestParam> {
  public:
+  BatchUploadDialogViewPixelTest()
+      : fake_provider_(BatchUploadDataType::kPasswords) {}
+
   // DialogBrowserTest:
   void SetUpCommandLine(base::CommandLine* command_line) override {
     if (GetParam().use_dark_theme) {
@@ -44,15 +86,25 @@
   }
 
   void ShowUi(const std::string& name) override {
+    content::TestNavigationObserver observer{
+        GURL(chrome::kChromeUIBatchUploadURL)};
+    observer.StartWatchingNewWebContents();
     views::NamedWidgetShownWaiter widget_waiter(
         views::test::AnyWidgetTestPasskey{}, "BatchUploadDialogView");
 
-    BatchUploadDialogView::CreateBatchUploadDialogView(*browser(), {},
-                                                       base::DoNothing());
+    fake_provider_.SetHasLocalData(true);
+
+    BatchUploadDialogView::CreateBatchUploadDialogView(
+        *browser(), /*data_providers_list=*/{&fake_provider_},
+        /*complete_callback*/ base::DoNothing());
 
     widget_waiter.WaitIfNeededAndGet();
+    observer.Wait();
   }
 
+ private:
+  BatchUploadDataProviderFake fake_provider_;
+
   base::test::ScopedFeatureList scoped_feature_list_{
       switches::kBatchUploadDesktop};
 };
diff --git a/chrome/browser/ui/views/profiles/batch_upload_dialog_view_unittest.cc b/chrome/browser/ui/views/profiles/batch_upload_dialog_view_unittest.cc
deleted file mode 100644
index 9232a6f..0000000
--- a/chrome/browser/ui/views/profiles/batch_upload_dialog_view_unittest.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/views/profiles/batch_upload_dialog_view.h"
-
-#include "base/functional/callback.h"
-#include "base/test/mock_callback.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-constexpr base::flat_map<BatchUploadDataType,
-                         std::vector<BatchUploadDataItemModel::Id>>
-    kEmptySelectedMap;
-
-const std::u16string kBatchUploadTitle = u"Save data to account";
-
-}  // namespace
-
-class BatchUploadDialogViewTest : public testing::Test {};
-
-TEST_F(BatchUploadDialogViewTest, OpenBatchUploadDialogViewWithClose) {
-  base::MockCallback<SelectedDataTypeItemsCallback> mock_callback;
-
-  BatchUploadDialogView dialog_view({}, mock_callback.Get());
-  EXPECT_EQ(dialog_view.GetWindowTitle(), kBatchUploadTitle);
-
-  EXPECT_CALL(mock_callback, Run(kEmptySelectedMap)).Times(1);
-  dialog_view.Close();
-}
-
-TEST_F(BatchUploadDialogViewTest, OpenBatchUploadDialogWithViewDestroyed) {
-  base::MockCallback<SelectedDataTypeItemsCallback> mock_callback;
-
-  EXPECT_CALL(mock_callback, Run(kEmptySelectedMap)).Times(1);
-  {
-    BatchUploadDialogView dialog_view({}, mock_callback.Get());
-    EXPECT_EQ(dialog_view.GetWindowTitle(), kBatchUploadTitle);
-  }
-}
diff --git a/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop.cc b/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop.cc
index 11963ad..eda127d 100644
--- a/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop.cc
+++ b/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop.cc
@@ -802,6 +802,15 @@
         delegate_->GetWebContents(), this);
   }
 
+  // Position the pop-up window such that the top of the pop-up window lines up
+  // with the top of the button mode loading modal. This helps cover the loading
+  // modal and direct user attention to the pop-up window. Note that this change
+  // does not apply to other pop-up windows such as use other account, instead
+  // they will be shown centred.
+  if (rp_mode == blink::mojom::RpMode::kButton && state_ == State::LOADING) {
+    popup_window_->SetCustomYPosition(web_contents()->GetViewBounds().y());
+  }
+
   // The modal should not be hidden when the pop-up window is displayed for
   // better UX.
   if (GetDialogType() != DialogType::MODAL) {
diff --git a/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop_unittest.cc b/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop_unittest.cc
index b1666d8d..bca8731 100644
--- a/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop_unittest.cc
+++ b/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop_unittest.cc
@@ -180,6 +180,7 @@
   }
 
   MOCK_METHOD(void, ResizeAndFocusPopupWindow, (), (override));
+  MOCK_METHOD(void, SetCustomYPosition, (int y), (override));
 };
 
 // Test FedCmAccountSelectionView which uses TestAccountSelectionView.
@@ -2471,3 +2472,45 @@
   EXPECT_EQ(FedCmAccountSelectionView::State::MULTI_ACCOUNT_PICKER,
             controller->state_);
 }
+
+// Tests that a login to IDP pop-up opened during a button flow sets a custom Y
+// position. This is so that the pop-up covers the loading modal dialog to
+// direct user attention towards the pop-up.
+TEST_F(FedCmAccountSelectionViewDesktopTest,
+       ButtonFlowLoadingDialogSetsCustomYPosition) {
+  auto controller = CreateAndShowLoadingDialog();
+
+  // Open login to IDP pop-up and expect it to call `SetCustomYPosition`.
+  auto popup_window = std::make_unique<MockFedCmModalDialogView>(
+      test_web_contents_.get(), controller.get());
+  EXPECT_CALL(*popup_window, ShowPopupWindow).Times(1);
+  EXPECT_CALL(*popup_window, SetCustomYPosition).Times(1);
+  controller->SetIdpSigninPopupWindowForTesting(std::move(popup_window));
+  controller->ShowModalDialog(GURL(u"https://example.com"),
+                              blink::mojom::RpMode::kButton);
+
+  // Reset the widget explicitly since no widget was shown. Otherwise, the test
+  // will complain that a widget is still open.
+  dialog_widget_.reset();
+}
+
+// Tests that a use other account pop-up opened during a button flow does not
+// set a custom Y position.
+TEST_F(FedCmAccountSelectionViewDesktopTest,
+       ButtonFlowUseOtherAccountPopupDoesNotSetCustomYPosition) {
+  std::unique_ptr<TestFedCmAccountSelectionView> controller =
+      CreateAndShow(accounts_, SignInMode::kExplicit);
+
+  // Open use other account pop-up and expect it to call `SetCustomYPosition`.
+  auto popup_window = std::make_unique<MockFedCmModalDialogView>(
+      test_web_contents_.get(), controller.get());
+  EXPECT_CALL(*popup_window, ShowPopupWindow).Times(1);
+  EXPECT_CALL(*popup_window, SetCustomYPosition).Times(0);
+  controller->SetIdpSigninPopupWindowForTesting(std::move(popup_window));
+  controller->ShowModalDialog(GURL(u"https://example.com"),
+                              blink::mojom::RpMode::kButton);
+
+  // Reset the widget explicitly since no widget was shown. Otherwise, the test
+  // will complain that a widget is still open.
+  dialog_widget_.reset();
+}
diff --git a/chrome/browser/ui/views/webid/fedcm_modal_dialog_view.cc b/chrome/browser/ui/views/webid/fedcm_modal_dialog_view.cc
index 5c18d66c..a9c28ce 100644
--- a/chrome/browser/ui/views/webid/fedcm_modal_dialog_view.cc
+++ b/chrome/browser/ui/views/webid/fedcm_modal_dialog_view.cc
@@ -99,9 +99,13 @@
 void FedCmModalDialogView::ResizeAndFocusPopupWindow() {
   CHECK(popup_window_);
 
-  popup_window_->GetDelegate()->SetContentsBounds(
-      popup_window_,
-      ComputePopupWindowBounds(source_window_->GetContainerBounds()));
+  gfx::Rect popup_window_bounds =
+      ComputePopupWindowBounds(source_window_->GetContainerBounds());
+  if (custom_y_position_) {
+    popup_window_bounds.set_y(*custom_y_position_);
+  }
+  popup_window_->GetDelegate()->SetContentsBounds(popup_window_,
+                                                  popup_window_bounds);
   popup_window_->GetDelegate()->ActivateContents(popup_window_);
 }
 
@@ -121,6 +125,10 @@
       FedCmModalDialogView::ClosePopupWindowReason::kPopupWindowDestroyed);
 }
 
+void FedCmModalDialogView::SetCustomYPosition(int y) {
+  custom_y_position_ = y;
+}
+
 FedCmModalDialogView::Observer* FedCmModalDialogView::GetObserverForTesting() {
   return observer_;
 }
diff --git a/chrome/browser/ui/views/webid/fedcm_modal_dialog_view.h b/chrome/browser/ui/views/webid/fedcm_modal_dialog_view.h
index 38041f4..32f81d5 100644
--- a/chrome/browser/ui/views/webid/fedcm_modal_dialog_view.h
+++ b/chrome/browser/ui/views/webid/fedcm_modal_dialog_view.h
@@ -5,6 +5,8 @@
 #ifndef CHROME_BROWSER_UI_VIEWS_WEBID_FEDCM_MODAL_DIALOG_VIEW_H_
 #define CHROME_BROWSER_UI_VIEWS_WEBID_FEDCM_MODAL_DIALOG_VIEW_H_
 
+#include <optional>
+
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "content/public/browser/web_contents_delegate.h"
@@ -56,6 +58,7 @@
   virtual content::WebContents* ShowPopupWindow(const GURL& url);
   virtual void ClosePopupWindow();
   virtual void ResizeAndFocusPopupWindow();
+  virtual void SetCustomYPosition(int y);
 
   // content::WebContentsObserver
   void WebContentsDestroyed() override;
@@ -68,6 +71,11 @@
   raw_ptr<content::WebContents> popup_window_{nullptr};
   raw_ptr<Observer> observer_{nullptr};
 
+  // If set, this will be the y-coordinate position of the pop-up window.
+  // Otherwise, the pop-up window is centred vertically and horizontally. Used
+  // to position the pop-up window directly over the button mode modal dialog.
+  std::optional<int> custom_y_position_;
+
   base::WeakPtrFactory<FedCmModalDialogView> weak_ptr_factory_{this};
 };
 
diff --git a/chrome/browser/ui/views/webid/fedcm_modal_dialog_view_unittest.cc b/chrome/browser/ui/views/webid/fedcm_modal_dialog_view_unittest.cc
index 19c90dbf..b37bb84 100644
--- a/chrome/browser/ui/views/webid/fedcm_modal_dialog_view_unittest.cc
+++ b/chrome/browser/ui/views/webid/fedcm_modal_dialog_view_unittest.cc
@@ -52,15 +52,22 @@
     return source;
   }
 
+  void SetContentsBounds(content::WebContents* source,
+                         const gfx::Rect& bounds) override {
+    bounds_ = bounds;
+  }
+
   void SetShouldReturnNullPopupWindow(bool should_return_null_popup_window) {
     should_return_null_popup_window_ = should_return_null_popup_window;
   }
 
   int opened() const { return opened_; }
+  gfx::Rect bounds() const { return bounds_; }
 
  private:
   int opened_ = 0;
   bool should_return_null_popup_window_{false};
+  gfx::Rect bounds_;
 };
 
 }  // namespace
@@ -77,7 +84,6 @@
   content::WebContents* web_contents =
       popup_window_view->ShowPopupWindow(GURL(u"https://example.com"));
 
-  base::RunLoop().RunUntilIdle();
   EXPECT_EQ(1, delegate.opened());
   ASSERT_TRUE(web_contents);
   histogram_tester_.ExpectUniqueSample(
@@ -98,7 +104,6 @@
   content::WebContents* web_contents =
       popup_window_view->ShowPopupWindow(GURL(u"invalid"));
 
-  base::RunLoop().RunUntilIdle();
   EXPECT_EQ(0, delegate.opened());
   ASSERT_FALSE(web_contents);
   histogram_tester_.ExpectUniqueSample(
@@ -125,7 +130,6 @@
   content::WebContents* web_contents =
       popup_window_view->ShowPopupWindow(GURL(u"https://example.com"));
 
-  base::RunLoop().RunUntilIdle();
   EXPECT_EQ(0, delegate.opened());
   ASSERT_FALSE(web_contents);
   histogram_tester_.ExpectUniqueSample(
@@ -145,7 +149,6 @@
   content::WebContents* web_contents =
       popup_window->ShowPopupWindow(GURL(u"https://example.com"));
 
-  base::RunLoop().RunUntilIdle();
   EXPECT_EQ(1, delegate.opened());
   ASSERT_TRUE(web_contents);
 
@@ -172,7 +175,6 @@
   content::WebContents* web_contents =
       popup_window->ShowPopupWindow(GURL(u"https://example.com"));
 
-  base::RunLoop().RunUntilIdle();
   EXPECT_EQ(1, delegate.opened());
   ASSERT_TRUE(web_contents);
 
@@ -188,3 +190,22 @@
           FedCmModalDialogView::ClosePopupWindowReason::kPopupWindowDestroyed),
       1);
 }
+
+TEST_F(FedCmModalDialogViewTest, ShowPopupWindowWithCustomYPosition) {
+  // Override the delegate to test that OpenURLFromTab gets called.
+  TestDelegate delegate(web_contents());
+
+  std::unique_ptr<FedCmModalDialogView> popup_window_view =
+      std::make_unique<FedCmModalDialogView>(web_contents(),
+                                             /*observer=*/nullptr);
+
+  int custom_y_position = 1;
+  popup_window_view->SetCustomYPosition(custom_y_position);
+
+  content::WebContents* web_contents =
+      popup_window_view->ShowPopupWindow(GURL(u"https://example.com"));
+
+  EXPECT_EQ(1, delegate.opened());
+  ASSERT_TRUE(web_contents);
+  EXPECT_EQ(custom_y_position, delegate.bounds().y());
+}
diff --git a/chrome/browser/ui/webui/ash/edu_coexistence/BUILD.gn b/chrome/browser/ui/webui/ash/edu_coexistence/BUILD.gn
index 70bfceac..0f3ff1b1 100644
--- a/chrome/browser/ui/webui/ash/edu_coexistence/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/edu_coexistence/BUILD.gn
@@ -20,6 +20,7 @@
   deps = [
     "//ash/constants",
     "//chrome/browser:browser_process",
+    "//chrome/browser/ash/account_manager",
     "//chrome/browser/ash/child_accounts",
     "//chrome/browser/ash/login",
     "//chrome/browser/ash/policy/core",
@@ -36,6 +37,8 @@
     "//net",
     "//ui/base",
   ]
+
+  allow_circular_includes_from = [ "//chrome/browser/ash/account_manager" ]
 }
 
 source_set("browser_tests") {
diff --git a/chrome/browser/ui/webui/ash/extended_updates/BUILD.gn b/chrome/browser/ui/webui/ash/extended_updates/BUILD.gn
index bb4f707e..398b867 100644
--- a/chrome/browser/ui/webui/ash/extended_updates/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/extended_updates/BUILD.gn
@@ -43,6 +43,7 @@
     "//chrome/browser/profiles:profile",
     "//chrome/browser/resources/ash/extended_updates:resources",
     "//chrome/browser/ui/webui",
+    "//chrome/browser/ui/webui/ash/login",
     "//chrome/common",
     "//components/services/app_service",
     "//content/public/common",
diff --git a/chrome/browser/ui/webui/ash/lock_screen_reauth/BUILD.gn b/chrome/browser/ui/webui/ash/lock_screen_reauth/BUILD.gn
index 8d99b84..5673019f 100644
--- a/chrome/browser/ui/webui/ash/lock_screen_reauth/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/lock_screen_reauth/BUILD.gn
@@ -67,6 +67,7 @@
     "//chrome/browser/ui/ash/login",
     "//chrome/browser/ui/webui",
     "//chrome/browser/ui/webui/ash/internet",
+    "//chrome/browser/ui/webui/ash/login",
     "//chrome/common:chrome_features",
     "//chrome/common:constants",
     "//chromeos/ash/components/login/auth",
diff --git a/chrome/browser/ui/webui/ash/login/BUILD.gn b/chrome/browser/ui/webui/ash/login/BUILD.gn
index 7448840..b027c61 100644
--- a/chrome/browser/ui/webui/ash/login/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/login/BUILD.gn
@@ -249,13 +249,30 @@
     "//chrome/app/theme:chrome_unscaled_resources",
     "//chrome/browser:browser_process",
     "//chrome/browser:resources",
+    "//chrome/browser/ash/app_mode",
+    "//chrome/browser/ash/arc/optin",
     "//chrome/browser/ash/crosapi:browser_util",
+    "//chrome/browser/ash/customization",
     "//chrome/browser/ash/drive",
+    "//chrome/browser/ash/login",
+    "//chrome/browser/ash/login/app_mode",
+    "//chrome/browser/ash/login/enrollment",
     "//chrome/browser/ash/login/quick_unlock",
     "//chrome/browser/ash/login/saml",
+    "//chrome/browser/ash/login/screens",
+    "//chrome/browser/ash/login/screens/osauth",
+    "//chrome/browser/ash/login/session",
+    "//chrome/browser/ash/login/signin",
+    "//chrome/browser/ash/login/ui",
+    "//chrome/browser/ash/login/users",
+    "//chrome/browser/ash/multidevice_setup",
     "//chrome/browser/ash/policy/core",
+    "//chrome/browser/ash/policy/handlers",
     "//chrome/browser/ash/profiles",
+    "//chrome/browser/ash/profiles:signin_profile_handler",
     "//chrome/browser/ash/system",
+    "//chrome/browser/extensions",
+    "//chrome/browser/policy:onc",
     "//chrome/browser/profiles:profile",
     "//chrome/browser/resources:component_extension_resources",
     "//chrome/browser/resources/chromeos/assistant_optin:resources",
@@ -322,6 +339,16 @@
   ]
 
   allow_circular_includes_from = [
+    "//chrome/browser/ash/arc/optin",
+    "//chrome/browser/ash/customization",
+    "//chrome/browser/ash/login",
+    "//chrome/browser/ash/login/app_mode",
+    "//chrome/browser/ash/login/enrollment",
+    "//chrome/browser/ash/login/screens",
+    "//chrome/browser/ash/login/screens/osauth",
+    "//chrome/browser/ash/login/session",
+    "//chrome/browser/ash/login/ui",
+    "//chrome/browser/ash/policy/handlers",
     "//chrome/browser/ash/system",
     "//chrome/browser/ui/ash/login",
     "//chrome/browser/ui/webui/ash/login/debug",
diff --git a/chrome/browser/ui/webui/ash/login/osauth/BUILD.gn b/chrome/browser/ui/webui/ash/login/osauth/BUILD.gn
index 011aad2..f0f3299 100644
--- a/chrome/browser/ui/webui/ash/login/osauth/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/login/osauth/BUILD.gn
@@ -22,7 +22,14 @@
 
   deps = [
     "//chrome/app:generated_resources",
+    "//chrome/browser/ash/login",
+    "//chrome/browser/ash/login/screens/osauth",
     "//components/login",
     "//ui/chromeos",
   ]
+
+  allow_circular_includes_from = [
+    "//chrome/browser/ash/login",
+    "//chrome/browser/ash/login/screens/osauth",
+  ]
 }
diff --git a/chrome/browser/ui/webui/ash/login/testapi/BUILD.gn b/chrome/browser/ui/webui/ash/login/testapi/BUILD.gn
index d44b995..b7c9093a 100644
--- a/chrome/browser/ui/webui/ash/login/testapi/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/login/testapi/BUILD.gn
@@ -25,7 +25,9 @@
     "//ash/public/mojom:input_device_settings",
     "//build:branding_buildflags",
     "//chrome/browser:browser_process",
+    "//chrome/browser/ash/login",
     "//chrome/browser/ash/login/quick_unlock",
+    "//chrome/browser/ash/login/ui",
     "//chrome/browser/ash/policy/core",
     "//chrome/browser/ash/policy/enrollment",
     "//chrome/browser/ui/ash/login",
diff --git a/chrome/browser/ui/webui/ash/multidevice_setup/BUILD.gn b/chrome/browser/ui/webui/ash/multidevice_setup/BUILD.gn
index f2921a284..ca373ca 100644
--- a/chrome/browser/ui/webui/ash/multidevice_setup/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/multidevice_setup/BUILD.gn
@@ -36,8 +36,10 @@
     "//ash/webui/settings/public/constants:mojom",
     "//chrome/app:generated_resources",
     "//chrome/browser:resources",
+    "//chrome/browser/ash/login/smart_lock",
     "//chrome/browser/ash/login/ui",
     "//chrome/browser/ash/multidevice_setup",
+    "//chrome/browser/ash/phonehub",
     "//chrome/browser/ash/profiles",
     "//chrome/browser/profiles:profile",
     "//chrome/browser/resources/chromeos:multidevice_setup_resources",
@@ -58,5 +60,9 @@
     "//ui/wm",
   ]
 
-  allow_circular_includes_from = [ "//chrome/browser/ui/webui/ash/login" ]
+  allow_circular_includes_from = [
+    "//chrome/browser/ash/login/smart_lock",
+    "//chrome/browser/ash/phonehub",
+    "//chrome/browser/ui/webui/ash/login",
+  ]
 }
diff --git a/chrome/browser/ui/webui/ash/settings/BUILD.gn b/chrome/browser/ui/webui/ash/settings/BUILD.gn
index d4ef631b..5942d9b 100644
--- a/chrome/browser/ui/webui/ash/settings/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/settings/BUILD.gn
@@ -67,12 +67,14 @@
     "//chrome/browser/ash/arc",
     "//chrome/browser/ash/drive",
     "//chrome/browser/ash/login/quick_unlock",
+    "//chrome/browser/ash/login/screens",
     "//chrome/browser/ash/system_web_apps/apps/personalization_app",
     "//chrome/browser/nearby_sharing/common",
     "//chrome/browser/nearby_sharing/contacts",
     "//chrome/browser/profiles:profile",
     "//chrome/browser/resources/ash/settings:resources",
     "//chrome/browser/resources/settings_shared:resources",
+    "//chrome/browser/ui/ash/wallpaper",
     "//chrome/browser/ui/webui",
     "//chrome/browser/ui/webui/ash/settings/pages/apps",
     "//chrome/browser/ui/webui/ash/settings/pages/date_time",
@@ -104,6 +106,8 @@
   ]
 
   allow_circular_includes_from = [
+    "//chrome/browser/ash/login/screens",
+    "//chrome/browser/ui/ash/wallpaper",
     "//chrome/browser/ui/webui/ash/settings/pages/device",
     "//chrome/browser/ui/webui/ash/settings/pages/languages",
     "//chrome/browser/ui/webui/ash/settings/pages/main",
diff --git a/chrome/browser/ui/webui/ash/settings/pages/multidevice/BUILD.gn b/chrome/browser/ui/webui/ash/settings/pages/multidevice/BUILD.gn
index 3dd2af2..48220c0 100644
--- a/chrome/browser/ui/webui/ash/settings/pages/multidevice/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/settings/pages/multidevice/BUILD.gn
@@ -37,6 +37,7 @@
     "//chrome/browser/ash/phonehub",
     "//chrome/browser/nearby_sharing/common",
     "//chrome/browser/profiles:profile",
+    "//chrome/browser/ui/ash/session",
     "//chrome/browser/ui/webui",
     "//chrome/browser/ui/webui/ash/multidevice_setup",
     "//chrome/browser/ui/webui/ash/settings/search",
diff --git a/chrome/browser/ui/webui/ash/skyvault/BUILD.gn b/chrome/browser/ui/webui/ash/skyvault/BUILD.gn
index a46e8c1..5c381b7 100644
--- a/chrome/browser/ui/webui/ash/skyvault/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/skyvault/BUILD.gn
@@ -32,6 +32,7 @@
   deps = [
     ":mojo_bindings",
     "//base",
+    "//chrome/browser/ash/policy/skyvault",
     "//chrome/browser/profiles:profile",
     "//chrome/browser/resources/chromeos/skyvault:resources",
     "//chrome/browser/ui/webui",
@@ -44,6 +45,8 @@
     "//ui/webui",
     "//url",
   ]
+
+  allow_circular_includes_from = [ "//chrome/browser/ash/policy/skyvault" ]
 }
 
 source_set("browser_tests") {
diff --git a/chrome/browser/ui/webui/ash/smb_shares/BUILD.gn b/chrome/browser/ui/webui/ash/smb_shares/BUILD.gn
index 702b331..0ad993b3 100644
--- a/chrome/browser/ui/webui/ash/smb_shares/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/smb_shares/BUILD.gn
@@ -27,6 +27,7 @@
     "//ash/webui/common:trusted_types_util",
     "//chrome/app:generated_resources",
     "//chrome/browser:resources",
+    "//chrome/browser/ash/file_system_provider",
     "//chrome/browser/ash/profiles",
     "//chrome/browser/ash/smb_client",
     "//chrome/browser/profiles:profile",
diff --git a/chrome/browser/ui/webui/certificate_manager/client_cert_sources.cc b/chrome/browser/ui/webui/certificate_manager/client_cert_sources.cc
index 4408f6d..8176e1f9 100644
--- a/chrome/browser/ui/webui/certificate_manager/client_cert_sources.cc
+++ b/chrome/browser/ui/webui/certificate_manager/client_cert_sources.cc
@@ -4,6 +4,8 @@
 
 #include "chrome/browser/ui/webui/certificate_manager/client_cert_sources.h"
 
+#include <map>
+
 #include "base/files/file_util.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
@@ -66,23 +68,38 @@
 
 namespace {
 
-// A certificate loader that wraps a ClientCertStore. Read-only.
-// Lifetimes note: The callback will not be called if the ClientCertStoreLoader
-// (and thus, the ClientCertStore) is destroyed first.
+class ClientCertStoreFactory {
+ public:
+  virtual ~ClientCertStoreFactory() = default;
+  virtual std::unique_ptr<net::ClientCertStore> CreateClientCertStore() = 0;
+};
+
+// A certificate loader that wraps a ClientCertStoreFactory. Read-only.
 class ClientCertStoreLoader {
  public:
-  explicit ClientCertStoreLoader(std::unique_ptr<net::ClientCertStore> store)
-      : store_(std::move(store)) {}
+  explicit ClientCertStoreLoader(
+      std::unique_ptr<ClientCertStoreFactory> factory)
+      : factory_(std::move(factory)) {}
 
+  // Lifetimes note: The callback will not be called if the
+  // ClientCertStoreLoader (and thus, the ClientCertStore handle held by
+  // `active_requests_`) is destroyed first.
   void GetCerts(base::OnceCallback<void(net::CertificateList)> callback) {
-    store_->GetClientCerts(
+    std::unique_ptr<net::ClientCertStore> store =
+        factory_->CreateClientCertStore();
+    net::ClientCertStore* store_ptr = store.get();
+    active_requests_[store_ptr] = std::move(store);
+    // Unretained is safe as the callback is not run if `active_requests_` is
+    // destroyed.
+    store_ptr->GetClientCerts(
         base::MakeRefCounted<net::SSLCertRequestInfo>(),
         base::BindOnce(&ClientCertStoreLoader::HandleClientCertsResult,
-                       std::move(callback)));
+                       base::Unretained(this), store_ptr, std::move(callback)));
   }
 
  private:
-  static void HandleClientCertsResult(
+  void HandleClientCertsResult(
+      net::ClientCertStore* store,
       base::OnceCallback<void(net::CertificateList)> callback,
       net::ClientCertIdentityList identities) {
     net::CertificateList certs;
@@ -90,25 +107,51 @@
     for (const auto& identity : identities) {
       certs.push_back(identity->certificate());
     }
+    active_requests_.erase(store);
     std::move(callback).Run(std::move(certs));
   }
 
-  std::unique_ptr<net::ClientCertStore> store_;
+  std::unique_ptr<ClientCertStoreFactory> factory_;
+  std::map<net::ClientCertStore*, std::unique_ptr<net::ClientCertStore>>
+      active_requests_;
 };
 
+#if BUILDFLAG(USE_NSS_CERTS)
+class ClientCertStoreFactoryNSS : public ClientCertStoreFactory {
+ public:
+  std::unique_ptr<net::ClientCertStore> CreateClientCertStore() override {
+    return std::make_unique<net::ClientCertStoreNSS>(
+        base::BindRepeating(&CreateCryptoModuleBlockingPasswordDelegate,
+                            kCryptoModulePasswordClientAuth));
+  }
+};
+#elif BUILDFLAG(IS_WIN)
+class ClientCertStoreFactoryWin : public ClientCertStoreFactory {
+ public:
+  std::unique_ptr<net::ClientCertStore> CreateClientCertStore() override {
+    return std::make_unique<net::ClientCertStoreWin>();
+  }
+};
+#elif BUILDFLAG(IS_MAC)
+class ClientCertStoreFactoryMac : public ClientCertStoreFactory {
+ public:
+  std::unique_ptr<net::ClientCertStore> CreateClientCertStore() override {
+    return std::make_unique<net::ClientCertStoreMac>();
+  }
+};
+#endif
+
 std::unique_ptr<ClientCertStoreLoader> CreatePlatformClientCertLoader() {
   // TODO(crbug.com/40928765): use ClientCertStoreKcer on IS_CHROMEOS_ASH build
 #if BUILDFLAG(USE_NSS_CERTS)
   return std::make_unique<ClientCertStoreLoader>(
-      std::make_unique<net::ClientCertStoreNSS>(
-          base::BindRepeating(&CreateCryptoModuleBlockingPasswordDelegate,
-                              kCryptoModulePasswordClientAuth)));
+      std::make_unique<ClientCertStoreFactoryNSS>());
 #elif BUILDFLAG(IS_WIN)
   return std::make_unique<ClientCertStoreLoader>(
-      std::make_unique<net::ClientCertStoreWin>());
+      std::make_unique<ClientCertStoreFactoryWin>());
 #elif BUILDFLAG(IS_MAC)
   return std::make_unique<ClientCertStoreLoader>(
-      std::make_unique<net::ClientCertStoreMac>());
+      std::make_unique<ClientCertStoreFactoryMac>());
 #else
   return nullptr;
 #endif
@@ -130,6 +173,22 @@
   }
 };
 
+class ClientCertStoreFactoryProvisioned : public ClientCertStoreFactory {
+ public:
+  explicit ClientCertStoreFactoryProvisioned(
+      client_certificates::CertificateProvisioningService* provisioning_service)
+      : provisioning_service_(provisioning_service) {}
+
+  std::unique_ptr<net::ClientCertStore> CreateClientCertStore() override {
+    return client_certificates::ClientCertificatesService::Create(
+        provisioning_service_, std::make_unique<NullClientCertStore>());
+  }
+
+ private:
+  raw_ptr<client_certificates::CertificateProvisioningService>
+      provisioning_service_;
+};
+
 std::unique_ptr<ClientCertStoreLoader> CreateProvisionedClientCertLoader(
     Profile* profile) {
   if (!profile || !client_certificates::features::
@@ -144,8 +203,8 @@
   }
 
   return std::make_unique<ClientCertStoreLoader>(
-      client_certificates::ClientCertificatesService::Create(
-          provisioning_service, std::make_unique<NullClientCertStore>()));
+      std::make_unique<ClientCertStoreFactoryProvisioned>(
+          provisioning_service));
 }
 #endif
 
diff --git a/chrome/browser/ui/webui/certificate_manager/client_cert_sources_unittest.cc b/chrome/browser/ui/webui/certificate_manager/client_cert_sources_unittest.cc
new file mode 100644
index 0000000..dcdce125
--- /dev/null
+++ b/chrome/browser/ui/webui/certificate_manager/client_cert_sources_unittest.cc
@@ -0,0 +1,30 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/certificate_manager/client_cert_sources.h"
+
+#include "base/test/test_future.h"
+#include "chrome/test/base/testing_profile.h"
+#include "content/public/test/browser_task_environment.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+TEST(ClientCertSourcesUnitTest, ClientCertStoreLoaderSimultaneousCalls) {
+  content::BrowserTaskEnvironment task_environment;
+  TestingProfile profile;
+  mojo::Remote<certificate_manager_v2::mojom::CertificateManagerPage>
+      fake_page_remote;
+
+  std::unique_ptr<CertificateManagerPageHandler::CertSource> cert_source =
+      CreatePlatformClientCertSource(&fake_page_remote, &profile);
+  base::test::TestFuture<
+      std::vector<certificate_manager_v2::mojom::SummaryCertInfoPtr>>
+      get_certs_waiter1;
+  base::test::TestFuture<
+      std::vector<certificate_manager_v2::mojom::SummaryCertInfoPtr>>
+      get_certs_waiter2;
+  cert_source->GetCertificateInfos(get_certs_waiter1.GetCallback());
+  cert_source->GetCertificateInfos(get_certs_waiter2.GetCallback());
+  EXPECT_TRUE(get_certs_waiter1.Wait());
+  EXPECT_TRUE(get_certs_waiter2.Wait());
+}
diff --git a/chrome/browser/ui/webui/chrome_web_ui_configs.cc b/chrome/browser/ui/webui/chrome_web_ui_configs.cc
index 296e679..852739b 100644
--- a/chrome/browser/ui/webui/chrome_web_ui_configs.cc
+++ b/chrome/browser/ui/webui/chrome_web_ui_configs.cc
@@ -72,6 +72,10 @@
 #include "chrome/browser/ui/webui/whats_new/whats_new_ui.h"
 #endif
 
+#if BUILDFLAG(ENABLE_DICE_SUPPORT)
+#include "chrome/browser/ui/webui/signin/batch_upload_ui.h"
+#endif  // BUILDFLAG(ENABLE_DICE_SUPPORT)
+
 void RegisterChromeWebUIConfigs() {
   // Don't add calls to `AddWebUIConfig()` for Ash-specific WebUIs here. Add
   // them in chrome_web_ui_configs_chromeos.cc.
@@ -146,4 +150,8 @@
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
   map.AddWebUIConfig(std::make_unique<WhatsNewUIConfig>());
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+
+#if BUILDFLAG(ENABLE_DICE_SUPPORT)
+  map.AddWebUIConfig(std::make_unique<BatchUploadUIConfig>());
+#endif  // BUILDFLAG(ENABLE_DICE_SUPPORT)
 }
diff --git a/chrome/browser/ui/webui/signin/ash/BUILD.gn b/chrome/browser/ui/webui/signin/ash/BUILD.gn
index c63ed0f..1a004c9 100644
--- a/chrome/browser/ui/webui/signin/ash/BUILD.gn
+++ b/chrome/browser/ui/webui/signin/ash/BUILD.gn
@@ -34,6 +34,8 @@
     "//chrome/browser:primitives",
     "//chrome/browser/ash/account_manager",
     "//chrome/browser/ash/arc/auth",
+    "//chrome/browser/ash/login/screens",
+    "//chrome/browser/ash/login/signin",
     "//chrome/browser/image_fetcher",
     "//chrome/browser/profiles",
     "//chrome/browser/profiles:profile",
@@ -63,6 +65,8 @@
   allow_circular_includes_from = [
     "//chrome/browser/ash/account_manager",
     "//chrome/browser/ash/arc/auth",
+    "//chrome/browser/ash/login/screens",
+    "//chrome/browser/ash/login/signin",
     "//chrome/browser/ui/webui/ash/edu_coexistence",
   ]
 }
diff --git a/chrome/browser/ui/webui/signin/batch_upload/BUILD.gn b/chrome/browser/ui/webui/signin/batch_upload/BUILD.gn
new file mode 100644
index 0000000..64911466
--- /dev/null
+++ b/chrome/browser/ui/webui/signin/batch_upload/BUILD.gn
@@ -0,0 +1,6 @@
+import("//mojo/public/tools/bindings/mojom.gni")
+
+mojom("mojo_bindings") {
+  sources = [ "batch_upload.mojom" ]
+  webui_module_path = "/"
+}
diff --git a/chrome/browser/ui/webui/signin/batch_upload/OWNERS b/chrome/browser/ui/webui/signin/batch_upload/OWNERS
new file mode 100644
index 0000000..08850f4
--- /dev/null
+++ b/chrome/browser/ui/webui/signin/batch_upload/OWNERS
@@ -0,0 +1,2 @@
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chrome/browser/ui/webui/signin/batch_upload/batch_upload.mojom b/chrome/browser/ui/webui/signin/batch_upload/batch_upload.mojom
new file mode 100644
index 0000000..b82cce1
--- /dev/null
+++ b/chrome/browser/ui/webui/signin/batch_upload/batch_upload.mojom
@@ -0,0 +1,32 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module batch_upload.mojom;
+
+// Factory ensures that the BatchUploadPage and BatchUploadHandler interfaces
+// are always created together without requiring an initialization call from the
+// WebUI to the handler.
+interface PageHandlerFactory {
+  // Creates both the `page `and `handler` to be used for communication between
+  // the Browser and the Renderer.
+  CreateBatchUploadHandler(pending_remote<Page> page,
+                           pending_receiver<PageHandler> handler);
+};
+
+// Called from TS side of chrome://batch-upload (Renderer -> Browser)
+interface PageHandler {
+  // Updates the native view of the dialog based on the current `height` of the
+  // web content view. Height of the content view is dynamic and may increase or
+  // decrease with user actions on the web view.
+  UpdateViewHeight(uint32 height);
+
+  // Reaction to clicking on the `Close` button on the web content view.
+  Close();
+};
+
+// Called from C++ side of chrome://batch-upload. (Browser -> Renderer)
+interface Page {
+  // Sending `data` to be displayed in the web content view.
+  SendData(string data);
+};
diff --git a/chrome/browser/ui/webui/signin/batch_upload_handler.cc b/chrome/browser/ui/webui/signin/batch_upload_handler.cc
new file mode 100644
index 0000000..fc7af792
--- /dev/null
+++ b/chrome/browser/ui/webui/signin/batch_upload_handler.cc
@@ -0,0 +1,40 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/signin/batch_upload_handler.h"
+
+#include "chrome/browser/profiles/batch_upload/batch_upload_data_provider.h"
+
+BatchUploadHandler::BatchUploadHandler(
+    mojo::PendingReceiver<batch_upload::mojom::PageHandler> receiver,
+    mojo::PendingRemote<batch_upload::mojom::Page> page,
+    const std::vector<raw_ptr<const BatchUploadDataProvider>>&
+        data_providers_list,
+    base::RepeatingCallback<void(int)> update_view_height_callback,
+    SelectedDataTypeItemsCallback completion_callback)
+    : data_providers_list_(data_providers_list),
+      update_view_height_callback_(update_view_height_callback),
+      completion_callback_(std::move(completion_callback)),
+      receiver_(this, std::move(receiver)),
+      page_(std::move(page)) {
+  // Temporary code; should expand to show all the data in
+  // `data_providers_list_`.
+  CHECK(!data_providers_list_.empty());
+  BatchUploadDataContainer container = data_providers_list_[0]->GetLocalData();
+  CHECK(!container.items.empty());
+  page_->SendData(container.items[0].title);
+}
+
+BatchUploadHandler::~BatchUploadHandler() = default;
+
+void BatchUploadHandler::UpdateViewHeight(uint32_t height) {
+  update_view_height_callback_.Run(height);
+}
+
+void BatchUploadHandler::Close() {
+  // Clear the data as after `completion_callback_` is done, the data owners
+  // will be destroyed.
+  data_providers_list_.clear();
+  std::move(completion_callback_).Run({});
+}
diff --git a/chrome/browser/ui/webui/signin/batch_upload_handler.h b/chrome/browser/ui/webui/signin/batch_upload_handler.h
new file mode 100644
index 0000000..84a0cfb
--- /dev/null
+++ b/chrome/browser/ui/webui/signin/batch_upload_handler.h
@@ -0,0 +1,48 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_BATCH_UPLOAD_HANDLER_H_
+#define CHROME_BROWSER_UI_WEBUI_SIGNIN_BATCH_UPLOAD_HANDLER_H_
+
+#include <string>
+
+#include "base/functional/callback.h"
+#include "chrome/browser/profiles/batch_upload/batch_upload_delegate.h"
+#include "chrome/browser/ui/webui/signin/batch_upload/batch_upload.mojom.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
+
+// WebUI message handler for the Batch Upload dialog bubble.
+class BatchUploadHandler : public batch_upload::mojom::PageHandler {
+ public:
+  // Initializes the handler with the mojo handlers and the needed information
+  // to be displayed as well as callbacks to the main native view.
+  BatchUploadHandler(
+      mojo::PendingReceiver<batch_upload::mojom::PageHandler> receiver,
+      mojo::PendingRemote<batch_upload::mojom::Page> page,
+      const std::vector<raw_ptr<const BatchUploadDataProvider>>&
+          data_providers_list,
+      base::RepeatingCallback<void(int)> update_view_height_callback,
+      SelectedDataTypeItemsCallback completion_callback);
+  ~BatchUploadHandler() override;
+
+  BatchUploadHandler(const BatchUploadHandler&) = delete;
+  BatchUploadHandler& operator=(const BatchUploadHandler&) = delete;
+
+  // batch_upload::mojom::PageHandler:
+  void UpdateViewHeight(uint32_t height) override;
+  void Close() override;
+
+ private:
+  std::vector<raw_ptr<const BatchUploadDataProvider>> data_providers_list_;
+  base::RepeatingCallback<void(int)> update_view_height_callback_;
+  SelectedDataTypeItemsCallback completion_callback_;
+
+  // Allows handling received messages from the web ui page.
+  mojo::Receiver<batch_upload::mojom::PageHandler> receiver_;
+  // Interface to send information to the web ui page.
+  mojo::Remote<batch_upload::mojom::Page> page_;
+};
+
+#endif  // CHROME_BROWSER_UI_WEBUI_SIGNIN_BATCH_UPLOAD_HANDLER_H_
diff --git a/chrome/browser/ui/webui/signin/batch_upload_ui.cc b/chrome/browser/ui/webui/signin/batch_upload_ui.cc
new file mode 100644
index 0000000..f8d9cb6
--- /dev/null
+++ b/chrome/browser/ui/webui/signin/batch_upload_ui.cc
@@ -0,0 +1,78 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifdef UNSAFE_BUFFERS_BUILD
+// TODO(crbug.com/ABC): Remove this and convert code to safer constructs.
+#pragma allow_unsafe_buffers
+#endif
+
+#include "chrome/browser/ui/webui/signin/batch_upload_ui.h"
+
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/signin/batch_upload_handler.h"
+#include "chrome/browser/ui/webui/webui_util.h"
+#include "chrome/common/webui_url_constants.h"
+#include "chrome/grit/batch_upload_resources.h"
+#include "chrome/grit/batch_upload_resources_map.h"
+#include "content/public/browser/web_ui_data_source.h"
+
+BatchUploadUI::BatchUploadUI(content::WebUI* web_ui)
+    : ui::MojoWebUIController(web_ui, true) {
+  // Set up the chrome://batch-upload source.
+  content::WebUIDataSource* source = content::WebUIDataSource::CreateAndAdd(
+      Profile::FromWebUI(web_ui), chrome::kChromeUIBatchUploadHost);
+
+  // Add required resources.
+  webui::SetupWebUIDataSource(
+      source, base::make_span(kBatchUploadResources, kBatchUploadResourcesSize),
+      IDR_BATCH_UPLOAD_BATCH_UPLOAD_HTML);
+
+  // Temporary code.
+  source->AddString("message", "Hello World!");
+}
+
+BatchUploadUI::~BatchUploadUI() = default;
+
+WEB_UI_CONTROLLER_TYPE_IMPL(BatchUploadUI)
+
+void BatchUploadUI::Initialize(
+    const std::vector<raw_ptr<const BatchUploadDataProvider>>&
+        data_providers_list,
+    base::RepeatingCallback<void(int)> update_view_height_callback,
+    SelectedDataTypeItemsCallback completion_callback) {
+  initialize_handler_callback_ = base::BindOnce(
+      &BatchUploadUI::OnMojoHandlersReady, base::Unretained(this),
+      data_providers_list, update_view_height_callback,
+      std::move(completion_callback));
+}
+
+void BatchUploadUI::Clear() {
+  handler_.reset();
+}
+
+void BatchUploadUI::BindInterface(
+    mojo::PendingReceiver<batch_upload::mojom::PageHandlerFactory> receiver) {
+  page_factory_receiver_.reset();
+  page_factory_receiver_.Bind(std::move(receiver));
+}
+
+void BatchUploadUI::CreateBatchUploadHandler(
+    mojo::PendingRemote<batch_upload::mojom::Page> page,
+    mojo::PendingReceiver<batch_upload::mojom::PageHandler> receiver) {
+  CHECK(initialize_handler_callback_);
+  std::move(initialize_handler_callback_)
+      .Run(std::move(page), std::move(receiver));
+}
+
+void BatchUploadUI::OnMojoHandlersReady(
+    std::vector<raw_ptr<const BatchUploadDataProvider>> data_providers_list,
+    base::RepeatingCallback<void(int)> update_view_height_callback,
+    SelectedDataTypeItemsCallback completion_callback,
+    mojo::PendingRemote<batch_upload::mojom::Page> page,
+    mojo::PendingReceiver<batch_upload::mojom::PageHandler> receiver) {
+  CHECK(!handler_);
+  handler_ = std::make_unique<BatchUploadHandler>(
+      std::move(receiver), std::move(page), data_providers_list,
+      update_view_height_callback, std::move(completion_callback));
+}
diff --git a/chrome/browser/ui/webui/signin/batch_upload_ui.h b/chrome/browser/ui/webui/signin/batch_upload_ui.h
new file mode 100644
index 0000000..b3f0015
--- /dev/null
+++ b/chrome/browser/ui/webui/signin/batch_upload_ui.h
@@ -0,0 +1,88 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_BATCH_UPLOAD_UI_H_
+#define CHROME_BROWSER_UI_WEBUI_SIGNIN_BATCH_UPLOAD_UI_H_
+
+#include "base/functional/callback.h"
+#include "chrome/browser/profiles/batch_upload/batch_upload_delegate.h"
+#include "chrome/browser/ui/webui/signin/batch_upload/batch_upload.mojom.h"
+#include "chrome/common/webui_url_constants.h"
+#include "content/public/browser/webui_config.h"
+#include "content/public/common/url_constants.h"
+#include "ui/webui/mojo_web_ui_controller.h"
+
+namespace content {
+class WebUI;
+}
+
+class BatchUploadHandler;
+class BatchUploadUI;
+
+class BatchUploadUIConfig : public content::DefaultWebUIConfig<BatchUploadUI> {
+ public:
+  BatchUploadUIConfig()
+      : DefaultWebUIConfig(content::kChromeUIScheme,
+                           chrome::kChromeUIBatchUploadHost) {}
+};
+
+class BatchUploadUI : public ui::MojoWebUIController,
+                      public batch_upload::mojom::PageHandlerFactory {
+ public:
+  explicit BatchUploadUI(content::WebUI* web_ui);
+  ~BatchUploadUI() override;
+
+  BatchUploadUI(const BatchUploadUI&) = delete;
+  BatchUploadUI& operator=(const BatchUploadUI&) = delete;
+
+  // Prepares the information to be given to the handler once ready.
+  void Initialize(
+      const std::vector<raw_ptr<const BatchUploadDataProvider>>&
+          data_providers_list,
+      base::RepeatingCallback<void(int)> update_view_height_callback,
+      SelectedDataTypeItemsCallback completion_callback);
+
+  // Clears the state of the UI to avoid keeping data coupled to the
+  // browser/profile.
+  void Clear();
+
+  // Instantiates the implementor of the
+  // `batch_upload::mojom::PageHandlerFactory` mojo interface passing the
+  // pending receiver that will be internally bound.
+  void BindInterface(
+      mojo::PendingReceiver<batch_upload::mojom::PageHandlerFactory> receiver);
+
+ private:
+  // batch_upload::mojom::BatchUploadHandlerFactory:
+  void CreateBatchUploadHandler(
+      mojo::PendingRemote<batch_upload::mojom::Page> page,
+      mojo::PendingReceiver<batch_upload::mojom::PageHandler> receiver)
+      override;
+
+  // Callback awaiting `CreateBatchUploadHandler` to create the handlers with
+  // all the needed information to display.
+  void OnMojoHandlersReady(
+      std::vector<raw_ptr<const BatchUploadDataProvider>> data_providers_list,
+      base::RepeatingCallback<void(int)> update_view_height_callback,
+      SelectedDataTypeItemsCallback completion_callback,
+      mojo::PendingRemote<batch_upload::mojom::Page> page,
+      mojo::PendingReceiver<batch_upload::mojom::PageHandler> receiver);
+
+  // Callback that temporarily holds the information to be passed onto the
+  // handler. The callback is called once the mojo handlers are available.
+  base::OnceCallback<void(
+      mojo::PendingRemote<batch_upload::mojom::Page>,
+      mojo::PendingReceiver<batch_upload::mojom::PageHandler>)>
+      initialize_handler_callback_;
+
+  // Handler implementing Mojo interface to communicate with the WebUI.
+  std::unique_ptr<BatchUploadHandler> handler_;
+
+  mojo::Receiver<batch_upload::mojom::PageHandlerFactory>
+      page_factory_receiver_{this};
+
+  WEB_UI_CONTROLLER_TYPE_DECL();
+};
+
+#endif  // CHROME_BROWSER_UI_WEBUI_SIGNIN_BATCH_UPLOAD_UI_H_
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 1a490657..621fb97 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1725955170-1f974c4967bf97ffbd9f006901c0dde3e40d97db-9e6b42c5873faef3acb0b5bdca35c994a984872b.profdata
+chrome-mac-arm-main-1725976683-60b7945944da416c5f36317716dffa71371cba11-8a32de3afb49dda0f98c1695c988b90dcd256661.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 961c4df0..8ebac81 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1725947398-956f28580dc306961887efea1e61e8b2f3b41818-ed0bc104aede846280d04320fdb2dfbedb480a4e.profdata
+chrome-mac-main-1725969564-5c59eb862e12fe8838a80ee911496fcc69306aa5-4af0941c421ce5681598c40547bab2f75fc187c6.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 5da8f10..9f6d49c 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1725947398-932c355c6c1ba6e2212320723c624b7bd761ff91-ed0bc104aede846280d04320fdb2dfbedb480a4e.profdata
+chrome-win32-main-1725969564-1f1009a63ba8233f13b32371a437dca2af0d8605-4af0941c421ce5681598c40547bab2f75fc187c6.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index c282025..3f94b3a 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1725947398-9398a67a1d0630bd92cbba6502279619710822e1-ed0bc104aede846280d04320fdb2dfbedb480a4e.profdata
+chrome-win64-main-1725969564-a93dfb4d9f40fa78d7bf73d692daf55a5364513b-4af0941c421ce5681598c40547bab2f75fc187c6.profdata
diff --git a/chrome/chrome_paks.gni b/chrome/chrome_paks.gni
index fcdee27..8e6a240 100644
--- a/chrome/chrome_paks.gni
+++ b/chrome/chrome_paks.gni
@@ -505,6 +505,11 @@
       sources += [ "$root_gen_dir/chrome/compose_resources.pak" ]
       deps += [ "//chrome/browser/resources/compose:resources" ]
     }
+
+    if (enable_dice_support) {
+      sources += [ "$root_gen_dir/chrome/batch_upload_resources.pak" ]
+      deps += [ "//chrome/browser/resources/signin/batch_upload:resources" ]
+    }
   }
 }
 
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h
index 822cda35..077fc30 100644
--- a/chrome/common/webui_url_constants.h
+++ b/chrome/common/webui_url_constants.h
@@ -20,6 +20,7 @@
 #include "build/chromeos_buildflags.h"
 #include "chrome/common/buildflags.h"
 #include "components/lens/buildflags.h"
+#include "components/signin/public/base/signin_buildflags.h"
 #include "content/public/common/url_constants.h"
 #include "media/media_buildflags.h"
 #include "printing/buildflags/buildflags.h"
@@ -49,6 +50,10 @@
 inline constexpr char kChromeUIAppsWithForceInstalledDeprecationDialogURL[] =
     "chrome://apps?showForceInstallDialog=";
 inline constexpr char kChromeUIAutofillInternalsHost[] = "autofill-internals";
+#if BUILDFLAG(ENABLE_DICE_SUPPORT)
+inline constexpr char kChromeUIBatchUploadHost[] = "batch-upload";
+inline constexpr char kChromeUIBatchUploadURL[] = "chrome://batch-upload/";
+#endif
 inline constexpr char kChromeUIBluetoothInternalsHost[] = "bluetooth-internals";
 inline constexpr char kChromeUIBluetoothInternalsURL[] =
     "chrome://bluetooth-internals";
diff --git a/chrome/installer/gcapi_mac/BUILD.gn b/chrome/installer/gcapi_mac/BUILD.gn
index 6c37f7f..be20916 100644
--- a/chrome/installer/gcapi_mac/BUILD.gn
+++ b/chrome/installer/gcapi_mac/BUILD.gn
@@ -7,10 +7,9 @@
 assert(is_mac)
 
 config("gcapi_config") {
-  # gcapi can be bundled with installers of other software, which might run
-  # on older macOS versions than chrome itself. To not making a dependency on
-  # gcapi a problem for these installers, make it target a very old version
-  # of macOS.
+  # gcapi can be bundled with installers of other software, which might run on
+  # older macOS versions than chrome itself. To not making a dependency on gcapi
+  # a problem for these installers, make it target a very old version of macOS.
   min_version = "10.12"
   cflags = [
     "-isysroot",
@@ -51,10 +50,27 @@
   configs += [ ":gcapi_config" ]
 
   # Every executable by default links to a hermetic libc++, so that we can
-  # guarantee the capability of the standard library. Neither gcapi_lib
-  # nor gcapi_example contain any significant use of the standard library
-  # and gcapi_lib is supposed to be redistributable to partners who don't
-  # want to link our hermetic libc++, so set no_default_deps to not link to
-  # our hermetic libc++.
+  # guarantee the capability of the standard library. Neither gcapi_lib nor
+  # gcapi_example contain any significant use of the standard library and
+  # gcapi_lib is supposed to be redistributable to partners who don't want to
+  # link our hermetic libc++, so set no_default_deps to not link to our hermetic
+  # libc++.
   no_default_deps = true
+
+  # libcxx_hardening used with libc++ in the macOS 15 SDK defines a
+  # _LIBCPP_ASSERTION_HANDLER that expands to a 1-argument form of
+  # __builtin_verbose_trap. This is the form understood by Apple clang 16, which
+  # is part of Xcode 16 that embeds the macOS 15 SDK, but not the form
+  # implemented by open-source clang, which has a 2-argument
+  # __builtin_verbose_trap. Because this target uses the system’s libc++ but
+  # Chrome’s compiler, this incompatibilty makes it impossible to use the
+  # “extensive” libc++ hardening mode.
+  #
+  # TODO: Remove this in the future, when the OS SDK’s libc++ contemplates the
+  # 2-argument form of __builtin_verbose_trap.
+  mac_sdk_version_pieces = string_split(mac_sdk_version, ".")
+  mac_sdk_version_major = mac_sdk_version_pieces[0]
+  if (mac_sdk_version_major == "15") {
+    configs -= [ "//build/config/compiler:libcxx_hardening" ]
+  }
 }
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 1b175ea..9f65537 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -4638,6 +4638,7 @@
           "../browser/ui/views/frame/opaque_browser_frame_view_browsertest.cc",
           "../browser/ui/views/performance_controls/battery_saver_button_browsertest.cc",
           "../browser/ui/views/policy/enterprise_startup_dialog_view_browsertest.cc",
+          "../browser/ui/views/profiles/batch_upload_dialog_view_browsertest.cc",
           "../browser/ui/views/profiles/batch_upload_dialog_view_pixel_browsertest.cc",
           "../browser/ui/views/profiles/dice_web_signin_interception_bubble_view_browsertest.cc",
           "../browser/ui/views/profiles/dice_web_signin_interception_bubble_view_pixel_browsertest.cc",
@@ -6508,6 +6509,12 @@
     sources += [ "../common/net/x509_certificate_model_unittest.cc" ]
   }
 
+  if (chrome_root_store_cert_management_ui) {
+    sources += [
+      "../browser/ui/webui/certificate_manager/client_cert_sources_unittest.cc",
+    ]
+  }
+
   if (toolkit_views) {
     sources += [
       "../browser/bookmarks/bookmark_expanded_state_tracker_unittest.cc",
@@ -6755,6 +6762,7 @@
     "//components/enterprise/common/proto:connectors_proto",
     "//components/enterprise/common/proto:extensions_workflow_events_proto",
     "//components/enterprise/common/proto:legacy_tech_events_proto",
+    "//components/enterprise/obfuscation/core:enterprise_obfuscation",
     "//components/favicon/core/test:test_support",
     "//components/feature_engagement/public",
     "//components/feed/core/v2:feed_core_stubs",
@@ -7332,7 +7340,6 @@
       "../browser/ui/autofill/autofill_bubble_signin_promo_controller_unittest.cc",
       "../browser/ui/startup/first_run_service_unittest.cc",
       "../browser/ui/startup/startup_browser_policy_unittest.cc",
-      "../browser/ui/views/profiles/batch_upload_dialog_view_unittest.cc",
       "../browser/ui/views/profiles/dice_web_signin_interception_bubble_view_unittest.cc",
       "../browser/ui/webui/signin/dice_web_signin_intercept_handler_unittest.cc",
     ]
diff --git a/chrome/test/data/webui/new_tab_page/modules/v2/most_relevant_tab_resumption/module_test.ts b/chrome/test/data/webui/new_tab_page/modules/v2/most_relevant_tab_resumption/module_test.ts
index 416c212..a842b85 100644
--- a/chrome/test/data/webui/new_tab_page/modules/v2/most_relevant_tab_resumption/module_test.ts
+++ b/chrome/test/data/webui/new_tab_page/modules/v2/most_relevant_tab_resumption/module_test.ts
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import type {Tab} from 'chrome://new-tab-page/history_types.mojom-webui.js';
-import {DecorationType, DeviceType} from 'chrome://new-tab-page/history_types.mojom-webui.js';
+import {DecorationType, FormFactor} from 'chrome://new-tab-page/history_types.mojom-webui.js';
 import type {DismissModuleElementEvent, DismissModuleInstanceEvent, MostRelevantTabResumptionModuleElement} from 'chrome://new-tab-page/lazy_load.js';
 import {mostRelevantTabResumptionDescriptor, MostRelevantTabResumptionProxyImpl} from 'chrome://new-tab-page/lazy_load.js';
 import {PageHandlerRemote, ScoredURLUserAction} from 'chrome://new-tab-page/most_relevant_tab_resumption.mojom-webui.js';
@@ -32,7 +32,7 @@
           type: DecorationType.kVisitedXAgo,
           displayString: 'You visited 0 seconds ago',
         },
-        deviceType: DeviceType.kDesktop,
+        formFactor: FormFactor.kDesktop,
         sessionName: 'Test Device',
         url: {url: 'https://www.foo.com'},
         urlKey: '',
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index 1d91bd5..fab72c0 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-16026.0.0-1062912
\ No newline at end of file
+16026.0.0-1062924
\ No newline at end of file
diff --git a/chromeos/ash/components/policy/BUILD.gn b/chromeos/ash/components/policy/BUILD.gn
index 5137f83..f5a0094 100644
--- a/chromeos/ash/components/policy/BUILD.gn
+++ b/chromeos/ash/components/policy/BUILD.gn
@@ -14,10 +14,7 @@
 
   sources = []
 
-  public_deps = [
-    "restriction_schedule",
-    "weekly_time",
-  ]
+  public_deps = [ "restriction_schedule" ]
 
   deps = []
 }
diff --git a/chromeos/ash/components/report/BUILD.gn b/chromeos/ash/components/report/BUILD.gn
index 217351e..e6d72d44 100644
--- a/chromeos/ash/components/report/BUILD.gn
+++ b/chromeos/ash/components/report/BUILD.gn
@@ -41,7 +41,7 @@
     ":fresnel_service_proto",
     "//base",
     "//chromeos/ash/components/dbus/private_computing:private_computing_proto",
-    "//chromeos/ash/components/policy",
+    "//chromeos/ash/components/policy/weekly_time",
     "//chromeos/ash/components/system",
     "//components/prefs:prefs",
     "//components/version_info",
diff --git a/clank b/clank
index 4b3a741..510ef65 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit 4b3a741b66f813fd8071530c4508b10cc1b9423d
+Subproject commit 510ef651e3e8e9c22d0a5de4781705e110c5f7dd
diff --git a/components/autofill/content/renderer/password_autofill_agent.cc b/components/autofill/content/renderer/password_autofill_agent.cc
index 145b98c..2c22eed 100644
--- a/components/autofill/content/renderer/password_autofill_agent.cc
+++ b/components/autofill/content/renderer/password_autofill_agent.cc
@@ -58,7 +58,6 @@
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
 #include "third_party/blink/public/common/features.h"
-#include "third_party/blink/public/common/features_generated.h"
 #include "third_party/blink/public/common/input/web_input_event.h"
 #include "third_party/blink/public/platform/web_security_origin.h"
 #include "third_party/blink/public/platform/web_vector.h"
@@ -1065,10 +1064,6 @@
     if (!element) {
       continue;
     }
-    if (preview_info.is_password &&
-        base::FeatureList::IsEnabled(blink::features::kPasswordStrongLabel)) {
-      element.SetShouldShowStrongPasswordLabel(false);
-    }
     element.SetSuggestedValue(WebString());
     element.SetAutofillState(preview_info.autofill_state);
   }
diff --git a/components/autofill/content/renderer/password_generation_agent.cc b/components/autofill/content/renderer/password_generation_agent.cc
index bcee08a0..5a63f980 100644
--- a/components/autofill/content/renderer/password_generation_agent.cc
+++ b/components/autofill/content/renderer/password_generation_agent.cc
@@ -27,7 +27,6 @@
 #include "google_apis/gaia/gaia_urls.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
 #include "third_party/blink/public/common/features.h"
-#include "third_party/blink/public/common/features_generated.h"
 #include "third_party/blink/public/platform/web_security_origin.h"
 #include "third_party/blink/public/platform/web_vector.h"
 #include "third_party/blink/public/web/web_document.h"
@@ -89,17 +88,11 @@
 
 void PreviewGeneratedValue(WebInputElement& input_element,
                            const blink::WebString& value) {
-  if (base::FeatureList::IsEnabled(blink::features::kPasswordStrongLabel)) {
-    input_element.SetShouldShowStrongPasswordLabel(true);
-  }
   input_element.SetShouldRevealPassword(true);
   input_element.SetSuggestedValue(value);
 }
 
 void ClearPreviewedValue(WebInputElement& input_element) {
-  if (base::FeatureList::IsEnabled(blink::features::kPasswordStrongLabel)) {
-    input_element.SetShouldShowStrongPasswordLabel(false);
-  }
   input_element.SetShouldRevealPassword(false);
   input_element.SetSuggestedValue(blink::WebString());
 }
diff --git a/components/autofill/core/browser/address_data_manager.cc b/components/autofill/core/browser/address_data_manager.cc
index 06cdd44..a87022a3 100644
--- a/components/autofill/core/browser/address_data_manager.cc
+++ b/components/autofill/core/browser/address_data_manager.cc
@@ -358,8 +358,7 @@
     return;
   }
   CancelPendingQuery(pending_profile_query_);
-  pending_profile_query_ =
-      webdata_service_->GetAutofillProfiles(/*record_type=*/std::nullopt, this);
+  pending_profile_query_ = webdata_service_->GetAutofillProfiles(this);
 }
 
 void AddressDataManager::RecordUseOf(const AutofillProfile& profile) {
diff --git a/components/autofill/core/browser/autofill_client.cc b/components/autofill/core/browser/autofill_client.cc
index fe4dbde1..4fb5a27a 100644
--- a/components/autofill/core/browser/autofill_client.cc
+++ b/components/autofill/core/browser/autofill_client.cc
@@ -86,6 +86,15 @@
     const url::Origin& main_frame_origin,
     PlusAddressCallback callback) {}
 
+void AutofillClient::ShowPlusAddressError(
+    PlusAddressErrorDialogType error_dialog_type,
+    base::OnceClosure on_accepted) {}
+
+void AutofillClient::ShowPlusAddressAffiliationError(
+    std::u16string affiliated_domain,
+    std::u16string affiliated_plus_address,
+    base::OnceClosure on_accepted) {}
+
 payments::PaymentsAutofillClient* AutofillClient::GetPaymentsAutofillClient() {
   return nullptr;
 }
@@ -146,6 +155,8 @@
 
 void AutofillClient::NotifyAutofillManualFallbackUsed() {}
 
+void AutofillClient::ShowSaveAutofillPredictionImprovementsBubble() {}
+
 std::optional<AutofillClient::PopupScreenLocation>
 AutofillClient::GetPopupScreenLocation() const {
   NOTIMPLEMENTED();
diff --git a/components/autofill/core/browser/autofill_client.h b/components/autofill/core/browser/autofill_client.h
index 7aec68c..a8654048 100644
--- a/components/autofill/core/browser/autofill_client.h
+++ b/components/autofill/core/browser/autofill_client.h
@@ -248,11 +248,32 @@
   // the window of this tab.
   virtual AutofillPlusAddressDelegate* GetPlusAddressDelegate();
 
-  // Orchestrates UI for enterprise plus address creation; no-op except on
-  // supported platforms.
+  // TODO(crbug.com/365494310): Move these methods to a plus-address-specific
+  // client class.
+
+  // Orchestrates UI for enterprise plus address creation; no-op
+  // except on supported platforms.
   virtual void OfferPlusAddressCreation(const url::Origin& main_frame_origin,
                                         PlusAddressCallback callback);
 
+  enum class PlusAddressErrorDialogType {
+    kGenericError,
+    // The quota for plus address creation is exhausted (account-wide or
+    // site-specific).
+    kQuotaExhausted
+  };
+  // Shows UI to inform the user about a plus address error (apart from
+  // affiliation errors).
+  virtual void ShowPlusAddressError(
+      PlusAddressErrorDialogType error_dialog_type,
+      base::OnceClosure on_accepted);
+
+  // Shows UI to inform the user about a plus address affiliation error.
+  virtual void ShowPlusAddressAffiliationError(
+      std::u16string affiliated_domain,
+      std::u16string affiliated_plus_address,
+      base::OnceClosure on_accepted);
+
   // Gets the preferences associated with the client.
   virtual PrefService* GetPrefs() = 0;
   virtual const PrefService* GetPrefs() const = 0;
@@ -466,6 +487,10 @@
   // Notifies the IPH code that the manual fallback feature was used.
   virtual void NotifyAutofillManualFallbackUsed();
 
+  // Shows a bubble asking whether the user wants to save prediction
+  // improvements data.
+  virtual void ShowSaveAutofillPredictionImprovementsBubble();
+
   // Stores test addresses provided by devtools and used to help developers
   // debug their forms with a list of well formatted addresses. Differently from
   // other `AutofillProfile`s/addresses, this list is stored in the client,
diff --git a/components/autofill/core/browser/autofill_external_delegate.cc b/components/autofill/core/browser/autofill_external_delegate.cc
index 99f653e9..2cabaec6 100644
--- a/components/autofill/core/browser/autofill_external_delegate.cc
+++ b/components/autofill/core/browser/autofill_external_delegate.cc
@@ -18,6 +18,7 @@
 #include "base/containers/fixed_flat_set.h"
 #include "base/feature_list.h"
 #include "base/functional/bind.h"
+#include "base/functional/callback_forward.h"
 #include "base/i18n/case_conversion.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/notreached.h"
@@ -413,6 +414,27 @@
       GetWeakPtr(), *session_id);
 }
 
+base::RepeatingCallback<void(const std::u16string&)>
+AutofillExternalDelegate::CreateSingleFieldFillCallback(
+    SuggestionType suggestion_type,
+    std::optional<FieldType> field_type_used) {
+  return base::BindRepeating(
+      [](base::WeakPtr<AutofillExternalDelegate> self, const FormData& form,
+         const FormFieldData& field, SuggestionType suggestion_type,
+         std::optional<FieldType> field_type_used,
+         const std::u16string& value) {
+        if (!self) {
+          return;
+        }
+        self->manager_->FillOrPreviewField(mojom::ActionPersistence::kFill,
+                                           mojom::FieldActionType::kReplaceAll,
+                                           form, field, value, suggestion_type,
+                                           field_type_used);
+      },
+      GetWeakPtr(), query_form_, query_field_, suggestion_type,
+      field_type_used);
+}
+
 SuggestionType
 AutofillExternalDelegate::GetLastAcceptedSuggestionToFillForSection(
     const Section& section) const {
@@ -702,22 +724,6 @@
   base::UmaHistogramEnumeration("Autofill.Suggestions.AcceptedType",
                                 suggestion.type);
 
-  auto create_fill_plus_address_callback = [&](SuggestionType suggestion_type) {
-    return base::BindOnce(
-        [](base::WeakPtr<AutofillExternalDelegate> delegate,
-           const FormData& form, const FormFieldData& field,
-           SuggestionType suggestion_type, const std::string& plus_address) {
-          if (delegate) {
-            delegate->manager_->FillOrPreviewField(
-                mojom::ActionPersistence::kFill,
-                mojom::FieldActionType::kReplaceAll, form, field,
-                base::UTF8ToUTF16(plus_address), suggestion_type,
-                EMAIL_ADDRESS);
-          }
-        },
-        GetWeakPtr(), query_form_, query_field_, suggestion_type);
-  };
-
   switch (suggestion.type) {
     case SuggestionType::kAddressEntry:
     case SuggestionType::kFillFullAddress:
@@ -795,32 +801,13 @@
       }
       manager_->client().OfferPlusAddressCreation(
           manager_->client().GetLastCommittedPrimaryMainFrameOrigin(),
-          create_fill_plus_address_callback(
-              SuggestionType::kCreateNewPlusAddress));
+          CreatePlusAddressCallback(SuggestionType::kCreateNewPlusAddress));
       break;
     }
     case SuggestionType::kCreateNewPlusAddressInline:
-      if (AutofillPlusAddressDelegate* plus_address_delegate =
-              manager_->client().GetPlusAddressDelegate()) {
-        base::span<const Suggestion> suggestions =
-            manager_->client().GetAutofillSuggestions();
-        // TODO(crbug.com/362445807): Change the signature of
-        // DidAcceptSuggestion to pass all suggestions and an index of the
-        // currently focused one.
-        auto it = std::ranges::find(suggestions, suggestion);
-        CHECK(it != suggestions.end());
-
-        plus_address_delegate->OnAcceptedInlineSuggestion(
-            manager_->client().GetLastCommittedPrimaryMainFrameOrigin(),
-            suggestions,
-            /*current_suggestion_index=*/it - suggestions.begin(),
-            CreateUpdateSuggestionsCallback(), CreateHideSuggestionsCallback(),
-            create_fill_plus_address_callback(
-                SuggestionType::kCreateNewPlusAddressInline));
-        // The delegate is responsible for hiding the popup.
-        return;
-      }
-      break;
+      DidAcceptCreateNewPlusAddressInlineSuggestion(suggestion);
+      // The delegate handles hiding the popup.
+      return;
     case SuggestionType::kPlusAddressError:
       break;
     case SuggestionType::kComposeResumeNudge:
@@ -1657,4 +1644,64 @@
   }
 }
 
+PlusAddressCallback AutofillExternalDelegate::CreatePlusAddressCallback(
+    SuggestionType suggestion_type) {
+  return base::BindRepeating(
+             [](const std::string& s) { return base::UTF8ToUTF16(s); })
+      .Then(CreateSingleFieldFillCallback(suggestion_type, EMAIL_ADDRESS));
+}
+
+void AutofillExternalDelegate::DidAcceptCreateNewPlusAddressInlineSuggestion(
+    const Suggestion& suggestion) {
+  AutofillPlusAddressDelegate* delegate =
+      manager_->client().GetPlusAddressDelegate();
+  if (!delegate) {
+    return;
+  }
+
+  base::span<const Suggestion> suggestions =
+      manager_->client().GetAutofillSuggestions();
+  // TODO(crbug.com/362445807): Change the signature of DidAcceptSuggestion to
+  // pass all suggestions and an index of the currently focused one.
+  auto it = std::ranges::find(suggestions, suggestion);
+  CHECK(it != suggestions.end());
+
+  auto show_affiliation_error = base::BindOnce(
+      [](base::WeakPtr<AutofillExternalDelegate> self,
+         base::OnceCallback<void(const std::u16string&)> fill_callback,
+         std::u16string affiliated_domain,
+         std::u16string affiliated_plus_address) {
+        if (!self) {
+          return;
+        }
+        base::OnceClosure bound_fill_callback =
+            base::BindOnce(std::move(fill_callback), affiliated_plus_address);
+        self->manager_->client().ShowPlusAddressAffiliationError(
+            std::move(affiliated_domain), std::move(affiliated_plus_address),
+            std::move(bound_fill_callback));
+      },
+      GetWeakPtr(),
+      CreateSingleFieldFillCallback(SuggestionType::kCreateNewPlusAddressInline,
+                                    /*field_type_used=*/EMAIL_ADDRESS));
+
+  auto show_error = base::BindOnce(
+      [](base::WeakPtr<AutofillExternalDelegate> self,
+         AutofillClient::PlusAddressErrorDialogType error_dialog_type,
+         base::OnceClosure on_accepted) {
+        if (!self) {
+          return;
+        }
+        self->manager_->client().ShowPlusAddressError(error_dialog_type,
+                                                      std::move(on_accepted));
+      },
+      GetWeakPtr());
+
+  delegate->OnAcceptedInlineSuggestion(
+      manager_->client().GetLastCommittedPrimaryMainFrameOrigin(), suggestions,
+      /*current_suggestion_index=*/it - suggestions.begin(),
+      CreateUpdateSuggestionsCallback(), CreateHideSuggestionsCallback(),
+      CreatePlusAddressCallback(SuggestionType::kCreateNewPlusAddressInline),
+      std::move(show_affiliation_error), std::move(show_error));
+}
+
 }  // namespace autofill
diff --git a/components/autofill/core/browser/autofill_external_delegate.h b/components/autofill/core/browser/autofill_external_delegate.h
index e3b3527..28ed4d84 100644
--- a/components/autofill/core/browser/autofill_external_delegate.h
+++ b/components/autofill/core/browser/autofill_external_delegate.h
@@ -181,6 +181,12 @@
   base::OnceCallback<void(SuggestionHidingReason)>
   CreateHideSuggestionsCallback();
 
+  // Creates a callback that, when run, fills the field that was last queried
+  // when the callback was created.
+  base::RepeatingCallback<void(const std::u16string&)>
+  CreateSingleFieldFillCallback(SuggestionType suggestion_type,
+                                std::optional<FieldType> field_type_used);
+
   // Private handler for DidAcceptSuggestions for address related suggestions.
   void DidAcceptAddressSuggestion(const Suggestion& suggestion,
                                   const SuggestionMetadata& metadata);
@@ -189,6 +195,15 @@
   void DidAcceptPaymentsSuggestion(const Suggestion& suggestion,
                                    const SuggestionMetadata& metadata);
 
+  // Creates a specialized version of a single field fill callback that converts
+  // the argument from UTF8 to UTF16 and set `EMAIL_ADDRESS` as the filled type.
+  PlusAddressCallback CreatePlusAddressCallback(SuggestionType suggestion_type);
+
+  // Informs the `AutofillPlusAddress` delegate and passes callbacks for
+  // hiding/updating suggestions UI and filling.
+  void DidAcceptCreateNewPlusAddressInlineSuggestion(
+      const Suggestion& suggestion);
+
   // Shows the address editor to the user. The Autofill profile to edit is
   // determined by passed `guid`.
   void ShowEditAddressProfileDialog(const std::string& guid);
diff --git a/components/autofill/core/browser/autofill_external_delegate_unittest.cc b/components/autofill/core/browser/autofill_external_delegate_unittest.cc
index c6638d2..0e13224 100644
--- a/components/autofill/core/browser/autofill_external_delegate_unittest.cc
+++ b/components/autofill/core/browser/autofill_external_delegate_unittest.cc
@@ -260,6 +260,14 @@
               OfferPlusAddressCreation,
               (const url::Origin&, PlusAddressCallback),
               (override));
+  MOCK_METHOD(void,
+              ShowPlusAddressAffiliationError,
+              (std::u16string, std::u16string, base::OnceClosure),
+              (override));
+  MOCK_METHOD(void,
+              ShowPlusAddressError,
+              (AutofillClient::PlusAddressErrorDialogType, base::OnceClosure),
+              (override));
   MOCK_METHOD(AutofillComposeDelegate*, GetComposeDelegate, (), (override));
   MOCK_METHOD(void,
               ShowEditAddressProfileDialog,
@@ -2499,20 +2507,23 @@
 
     // `MoveArg` only supports moving out a single argument and cannot be
     // combined via `DoAll` - therefore use a helper.
-    EXPECT_CALL(
-        plus_address_delegate(),
-        OnAcceptedInlineSuggestion(_, base::span<const Suggestion>(suggestions),
-                                   /*current_suggestion_index=*/0, _, _, _))
-        .WillOnce([&](const url::Origin& primary_main_frame_origin,
-                      base::span<const Suggestion> current_suggestions,
-                      size_t current_suggestion_index,
-                      UpdateSuggestionsCallback update_suggestions_callback,
-                      HideSuggestionsCallback hide_suggestions_callback,
-                      PlusAddressCallback fill_field_callback) {
-          update_callback = std::move(update_suggestions_callback);
-          hide_callback = std::move(hide_suggestions_callback);
-          filling_callback = std::move(fill_field_callback);
-        });
+    EXPECT_CALL(plus_address_delegate(),
+                OnAcceptedInlineSuggestion(
+                    _, base::span<const Suggestion>(suggestions),
+                    /*current_suggestion_index=*/0, _, _, _, _, _))
+        .WillOnce(
+            [&](const url::Origin& primary_main_frame_origin,
+                base::span<const Suggestion> current_suggestions,
+                size_t current_suggestion_index,
+                UpdateSuggestionsCallback update_suggestions_callback,
+                HideSuggestionsCallback hide_suggestions_callback,
+                PlusAddressCallback fill_field_callback,
+                AutofillPlusAddressDelegate::ShowAffiliationErrorDialogCallback,
+                AutofillPlusAddressDelegate::ShowErrorDialogCallback) {
+              update_callback = std::move(update_suggestions_callback);
+              hide_callback = std::move(hide_suggestions_callback);
+              filling_callback = std::move(fill_field_callback);
+            });
     EXPECT_CALL(client(),
                 UpdateAutofillSuggestions(
                     updated_suggestions, FillingProduct::kPlusAddresses,
@@ -2547,6 +2558,95 @@
   std::move(filling_callback).Run(base::UTF16ToUTF8(plus_address));
 }
 
+// Tests that `OnAcceptedInlineSuggestion` gets passed a
+// `ShowAffiliationErrorDialogCallback` that, when run, triggers showing a plus
+// address affiliation error dialog in `AutofillClient`. If that dialog is
+// accepted, the affiliated plus address is filled.
+TEST_F(AutofillExternalDelegateUnitTest,
+       PlusAddressInlineAcceptedAffiliationError) {
+  IssueOnQuery();
+
+  const std::u16string plus_address = u"test+plus@test.example";
+  std::vector<Suggestion> suggestions;
+  suggestions.emplace_back(/*main_text=*/u"Create plus address",
+                           SuggestionType::kCreateNewPlusAddressInline);
+  suggestions.back().payload = Suggestion::PlusAddressPayload(plus_address);
+  OnSuggestionsReturned(queried_field().global_id(), suggestions);
+  ON_CALL(client(), GetAutofillSuggestions)
+      .WillByDefault(Return(base::span<const Suggestion>(suggestions)));
+  client().set_suggestion_ui_session_id(
+      AutofillClient::SuggestionUiSessionId(123));
+
+  const std::u16string affiliated_domain = u"https://bar.com";
+  const std::u16string affiliated_plus_address = u"foo@bar.com";
+
+  AutofillPlusAddressDelegate::ShowAffiliationErrorDialogCallback
+      show_affiliation_error_callback;
+  {
+    EXPECT_CALL(plus_address_delegate(),
+                OnAcceptedInlineSuggestion(
+                    _, base::span<const Suggestion>(suggestions),
+                    /*current_suggestion_index=*/0, _, _, _, _, _))
+        .WillOnce(MoveArg<6>(&show_affiliation_error_callback));
+    // Simulate accepting the dialog.
+    EXPECT_CALL(client(), ShowPlusAddressAffiliationError(
+                              affiliated_domain, affiliated_plus_address, _))
+        .WillOnce(RunOnceCallback<2>());
+    EXPECT_CALL(manager(),
+                FillOrPreviewField(mojom::ActionPersistence::kFill,
+                                   mojom::FieldActionType::kReplaceAll,
+                                   HasQueriedFormId(), HasQueriedFieldId(),
+                                   affiliated_plus_address,
+                                   SuggestionType::kCreateNewPlusAddressInline,
+                                   std::optional(EMAIL_ADDRESS)));
+  }
+
+  external_delegate().DidAcceptSuggestion(suggestions[0],
+                                          SuggestionPosition{.row = 0});
+  ASSERT_TRUE(show_affiliation_error_callback);
+  // Simulate showing the affiliation error dialog.
+  std::move(show_affiliation_error_callback)
+      .Run(affiliated_domain, affiliated_plus_address);
+}
+
+// Tests that `OnAcceptedInlineSuggestion` gets passed a
+// `ShowErrorDialogCallback` that, when run, triggers showing a plus address
+// error dialog in `AutofillClient`.
+TEST_F(AutofillExternalDelegateUnitTest, PlusAddressInlineAcceptedQuotaError) {
+  IssueOnQuery();
+
+  const std::u16string plus_address = u"test+plus@test.example";
+  std::vector<Suggestion> suggestions;
+  suggestions.emplace_back(/*main_text=*/u"Create plus address",
+                           SuggestionType::kCreateNewPlusAddressInline);
+  suggestions.back().payload = Suggestion::PlusAddressPayload(plus_address);
+  OnSuggestionsReturned(queried_field().global_id(), suggestions);
+  ON_CALL(client(), GetAutofillSuggestions)
+      .WillByDefault(Return(base::span<const Suggestion>(suggestions)));
+  client().set_suggestion_ui_session_id(
+      AutofillClient::SuggestionUiSessionId(123));
+
+  AutofillPlusAddressDelegate::ShowErrorDialogCallback show_error_callback;
+  {
+    EXPECT_CALL(plus_address_delegate(),
+                OnAcceptedInlineSuggestion(
+                    _, base::span<const Suggestion>(suggestions),
+                    /*current_suggestion_index=*/0, _, _, _, _, _))
+        .WillOnce(MoveArg<7>(&show_error_callback));
+    EXPECT_CALL(
+        client(),
+        ShowPlusAddressError(
+            AutofillClient::PlusAddressErrorDialogType::kQuotaExhausted, _));
+  }
+
+  external_delegate().DidAcceptSuggestion(suggestions[0],
+                                          SuggestionPosition{.row = 0});
+  ASSERT_TRUE(show_error_callback);
+  std::move(show_error_callback)
+      .Run(AutofillClient::PlusAddressErrorDialogType::kQuotaExhausted,
+           base::DoNothing());
+}
+
 TEST_F(
     AutofillExternalDelegateUnitTest,
     PredictionImprovements_DidPerformButtonAction_ThumbsUpFeedbackIsForwardedToDelegate) {
diff --git a/components/autofill/core/browser/autofill_plus_address_delegate.h b/components/autofill/core/browser/autofill_plus_address_delegate.h
index f4f55f47..c7bf0a03 100644
--- a/components/autofill/core/browser/autofill_plus_address_delegate.h
+++ b/components/autofill/core/browser/autofill_plus_address_delegate.h
@@ -134,6 +134,13 @@
 
   using HideSuggestionsCallback =
       base::OnceCallback<void(SuggestionHidingReason)>;
+  using PlusAddressErrorDialogType = AutofillClient::PlusAddressErrorDialogType;
+  using ShowErrorDialogCallback =
+      base::OnceCallback<void(PlusAddressErrorDialogType, base::OnceClosure)>;
+  // A callback to inform the user that there is an affiliated domain (first
+  // parameter) with an existing plus address (second parameter).
+  using ShowAffiliationErrorDialogCallback =
+      base::OnceCallback<void(std::u16string, std::u16string)>;
   // Attempts to create the plus address in
   // `current_suggestions[current_suggestion_index]` for
   // `primary_main_frame_origin`.
@@ -143,7 +150,9 @@
       size_t current_suggestion_index,
       UpdateSuggestionsCallback update_suggestions_callback,
       HideSuggestionsCallback hide_suggestions_callback,
-      PlusAddressCallback fill_field_callback) = 0;
+      PlusAddressCallback fill_field_callback,
+      ShowAffiliationErrorDialogCallback show_affiliation_error_dialog,
+      ShowErrorDialogCallback show_error_dialog) = 0;
 };
 
 }  // namespace autofill
diff --git a/components/autofill/core/browser/browser_autofill_manager_unittest.cc b/components/autofill/core/browser/browser_autofill_manager_unittest.cc
index e73639e..159a79c 100644
--- a/components/autofill/core/browser/browser_autofill_manager_unittest.cc
+++ b/components/autofill/core/browser/browser_autofill_manager_unittest.cc
@@ -3752,18 +3752,16 @@
       size_t field_signature_rank = 1) {
     std::vector<AutofillField::FieldLogEventType> expected_events;
 #if BUILDFLAG(USE_INTERNAL_AUTOFILL_PATTERNS)
-    // Default pattern.
     expected_events.push_back(HeuristicPredictionFieldLogEvent{
         .field_type = heuristic_type,
-        .heuristic_source = HeuristicSource::kDefault,
+        .heuristic_source = HeuristicSource::kDefaultRegexes,
         .is_active_heuristic_source = true,
         .rank_in_field_signature_group = field_signature_rank,
     });
 #else
-    // Legacy pattern.
     expected_events.push_back(HeuristicPredictionFieldLogEvent{
         .field_type = heuristic_type,
-        .heuristic_source = HeuristicSource::kLegacy,
+        .heuristic_source = HeuristicSource::kLegacyRegexes,
         .is_active_heuristic_source = true,
         .rank_in_field_signature_group = field_signature_rank,
     });
diff --git a/components/autofill/core/browser/form_parsing/address_field_parser.cc b/components/autofill/core/browser/form_parsing/address_field_parser.cc
index 827ce72..97ba297b 100644
--- a/components/autofill/core/browser/form_parsing/address_field_parser.cc
+++ b/components/autofill/core/browser/form_parsing/address_field_parser.cc
@@ -26,12 +26,12 @@
 
 base::span<const MatchPatternRef> GetMatchPatterns(std::string_view name,
                                                    ParsingContext& context) {
-  return GetMatchPatterns(name, context.page_language, context.pattern_source);
+  return GetMatchPatterns(name, context.page_language, context.pattern_file);
 }
 
 base::span<const MatchPatternRef> GetMatchPatterns(FieldType type,
                                                    ParsingContext& context) {
-  return GetMatchPatterns(type, context.page_language, context.pattern_source);
+  return GetMatchPatterns(type, context.page_language, context.pattern_file);
 }
 
 bool SetFieldAndAdvanceCursor(AutofillScanner* scanner,
@@ -847,7 +847,7 @@
 
   base::span<const MatchPatternRef> dependent_locality_patterns =
       GetMatchPatterns(ADDRESS_HOME_DEPENDENT_LOCALITY, context.page_language,
-                       context.pattern_source);
+                       context.pattern_file);
   return ParseNameAndLabelSeparately(
       context, scanner, dependent_locality_patterns, &dependent_locality_,
       "ADDRESS_HOME_DEPENDENT_LOCALITY");
@@ -1007,14 +1007,14 @@
   if (!between_streets_line_1_) {
     base::span<const MatchPatternRef> between_streets_patterns_line_1 =
         GetMatchPatterns("BETWEEN_STREETS_LINE_1", context.page_language,
-                         context.pattern_source);
+                         context.pattern_file);
     return ParseNameAndLabelSeparately(
         context, scanner, between_streets_patterns_line_1,
         &between_streets_line_1_, "BETWEEN_STREETS_LINE_1");
   } else if (!between_streets_line_2_) {
     base::span<const MatchPatternRef> between_streets_patterns_line_2 =
         GetMatchPatterns("BETWEEN_STREETS_LINE_2", context.page_language,
-                         context.pattern_source);
+                         context.pattern_file);
     return ParseNameAndLabelSeparately(
         context, scanner, between_streets_patterns_line_2,
         &between_streets_line_2_, "BETWEEN_STREETS_LINE_2");
diff --git a/components/autofill/core/browser/form_parsing/address_field_parser_ng.cc b/components/autofill/core/browser/form_parsing/address_field_parser_ng.cc
index 926f4d4..7ecbc92 100644
--- a/components/autofill/core/browser/form_parsing/address_field_parser_ng.cc
+++ b/components/autofill/core/browser/form_parsing/address_field_parser_ng.cc
@@ -355,7 +355,7 @@
 base::span<const MatchPatternRef> AddressFieldParserNG::GetMatchPatterns(
     std::string_view name) {
   return ::autofill::GetMatchPatterns(name, context_->page_language,
-                                      context_->pattern_source);
+                                      context_->pattern_file);
 }
 
 std::optional<double> AddressFieldParserNG::FindScoreOfBestMatchingRule(
diff --git a/components/autofill/core/browser/form_parsing/credit_card_field_parser.cc b/components/autofill/core/browser/form_parsing/credit_card_field_parser.cc
index c93649c..536d283 100644
--- a/components/autofill/core/browser/form_parsing/credit_card_field_parser.cc
+++ b/components/autofill/core/browser/form_parsing/credit_card_field_parser.cc
@@ -36,12 +36,12 @@
 
 base::span<const MatchPatternRef> GetMatchPatterns(std::string_view name,
                                                    ParsingContext& context) {
-  return GetMatchPatterns(name, context.page_language, context.pattern_source);
+  return GetMatchPatterns(name, context.page_language, context.pattern_file);
 }
 
 base::span<const MatchPatternRef> GetMatchPatterns(FieldType type,
                                                    ParsingContext& context) {
-  return GetMatchPatterns(type, context.page_language, context.pattern_source);
+  return GetMatchPatterns(type, context.page_language, context.pattern_file);
 }
 
 // Returns true if a field that has |max_length| can fit the data for a field of
diff --git a/components/autofill/core/browser/form_parsing/email_field_parser.cc b/components/autofill/core/browser/form_parsing/email_field_parser.cc
index a8f72d9..ab93131 100644
--- a/components/autofill/core/browser/form_parsing/email_field_parser.cc
+++ b/components/autofill/core/browser/form_parsing/email_field_parser.cc
@@ -21,7 +21,7 @@
   raw_ptr<AutofillField> field;
 
   base::span<const MatchPatternRef> email_patterns = GetMatchPatterns(
-      "EMAIL_ADDRESS", context.page_language, context.pattern_source);
+      "EMAIL_ADDRESS", context.page_language, context.pattern_file);
   if (ParseField(context, scanner, email_patterns, &field, "EMAIL_ADDRESS")) {
     return std::make_unique<EmailFieldParser>(field);
   }
diff --git a/components/autofill/core/browser/form_parsing/form_field_parser.cc b/components/autofill/core/browser/form_parsing/form_field_parser.cc
index 297f603..53915ef 100644
--- a/components/autofill/core/browser/form_parsing/form_field_parser.cc
+++ b/components/autofill/core/browser/form_parsing/form_field_parser.cc
@@ -87,12 +87,12 @@
 
 ParsingContext::ParsingContext(GeoIpCountryCode client_country,
                                LanguageCode page_language,
-                               PatternSource pattern_source,
+                               PatternFile pattern_file,
                                DenseSet<RegexFeature> active_features,
                                LogManager* log_manager)
     : client_country(std::move(client_country)),
       page_language(std::move(page_language)),
-      pattern_source(pattern_source),
+      pattern_file(pattern_file),
       active_features(active_features),
       regex_cache(GetAutofillRegexCache()),
       log_manager(log_manager) {
diff --git a/components/autofill/core/browser/form_parsing/form_field_parser.h b/components/autofill/core/browser/form_parsing/form_field_parser.h
index 9ed5979..1972450 100644
--- a/components/autofill/core/browser/form_parsing/form_field_parser.h
+++ b/components/autofill/core/browser/form_parsing/form_field_parser.h
@@ -87,7 +87,7 @@
 struct ParsingContext {
   ParsingContext(GeoIpCountryCode client_country,
                  LanguageCode page_language,
-                 PatternSource pattern_source,
+                 PatternFile pattern_file,
                  DenseSet<RegexFeature> active_features = {},
                  LogManager* log_manager = nullptr);
   ParsingContext(const ParsingContext&) = delete;
@@ -96,9 +96,9 @@
 
   const GeoIpCountryCode client_country;
   const LanguageCode page_language;
-  // Mutable so that the caches can be reused across different pattern sources
+  // Mutable so that the caches can be reused across different pattern files
   // and active features. Since the cache works at a regex level, this is safe.
-  PatternSource pattern_source;
+  PatternFile pattern_file;
   DenseSet<RegexFeature> active_features;
 
   // Cache for autofill features that are tested on hot code paths. Testing
diff --git a/components/autofill/core/browser/form_parsing/form_field_parser_unittest.cc b/components/autofill/core/browser/form_parsing/form_field_parser_unittest.cc
index 957ef49..4615bad6 100644
--- a/components/autofill/core/browser/form_parsing/form_field_parser_unittest.cc
+++ b/components/autofill/core/browser/form_parsing/form_field_parser_unittest.cc
@@ -36,7 +36,7 @@
   int ParseFormFields(GeoIpCountryCode client_country = GeoIpCountryCode(""),
                       LanguageCode language = LanguageCode("")) {
     ParsingContext context(client_country, language,
-                           GetActivePatternSource().value());
+                           GetActivePatternFile().value());
     FormFieldParser::ParseFormFields(context, fields_,
                                      /*is_form_tag=*/true,
                                      field_candidates_map_);
@@ -46,7 +46,7 @@
   // Like `ParseFormFields()`, but using `ParseSingleFieldForms()` instead.
   int ParseSingleFieldForms() {
     ParsingContext context(GeoIpCountryCode(""), LanguageCode(""),
-                           GetActivePatternSource().value());
+                           GetActivePatternFile().value());
     FormFieldParser::ParseSingleFieldForms(context, fields_,
                                            field_candidates_map_);
     return field_candidates_map_.size();
@@ -54,7 +54,7 @@
 
   int ParseStandaloneCVCFields() {
     ParsingContext context(GeoIpCountryCode(""), LanguageCode(""),
-                           GetActivePatternSource().value());
+                           GetActivePatternFile().value());
     FormFieldParser::ParseStandaloneCVCFields(context, fields_,
                                               field_candidates_map_);
     return field_candidates_map_.size();
@@ -62,7 +62,7 @@
 
   int ParseStandaloneEmailFields() {
     ParsingContext context(GeoIpCountryCode(""), LanguageCode(""),
-                           GetActivePatternSource().value());
+                           GetActivePatternFile().value());
     FormFieldParser::ParseStandaloneEmailFields(context, fields_,
                                                 field_candidates_map_);
     return field_candidates_map_.size();
@@ -125,14 +125,14 @@
   field.set_parseable_label(label);
   for (const auto& pattern : positive_patterns) {
     ParsingContext context(GeoIpCountryCode(""), LanguageCode(""),
-                           GetActivePatternSource().value());
+                           GetActivePatternFile().value());
     SCOPED_TRACE("positive_pattern = " + base::UTF16ToUTF8(pattern));
     EXPECT_TRUE(FormFieldParser::MatchForTesting(context, &field, pattern,
                                                  {MatchAttribute::kLabel}));
   }
   for (const auto& pattern : negative_patterns) {
     ParsingContext context(GeoIpCountryCode(""), LanguageCode(""),
-                           GetActivePatternSource().value());
+                           GetActivePatternFile().value());
     SCOPED_TRACE("negative_pattern = " + base::UTF16ToUTF8(pattern));
     EXPECT_FALSE(FormFieldParser::MatchForTesting(context, &field, pattern,
                                                   {MatchAttribute::kLabel}));
@@ -173,7 +173,7 @@
     feature_list.InitAndEnableFeature(
         features::kAutofillEnableSupportForParsingWithSharedLabels);
     ParsingContext context(GeoIpCountryCode(""), LanguageCode(""),
-                           GetActivePatternSource().value());
+                           GetActivePatternFile().value());
     EXPECT_TRUE(FormFieldParser::MatchForTesting(
         context, autofill_field, u"First Name", {MatchAttribute::kLabel}));
   }
@@ -182,7 +182,7 @@
     feature_list.InitAndDisableFeature(
         features::kAutofillEnableSupportForParsingWithSharedLabels);
     ParsingContext context(GeoIpCountryCode(""), LanguageCode(""),
-                           GetActivePatternSource().value());
+                           GetActivePatternFile().value());
     EXPECT_FALSE(FormFieldParser::MatchForTesting(
         context, autofill_field, u"First Name", {MatchAttribute::kLabel}));
   }
diff --git a/components/autofill/core/browser/form_parsing/iban_field_parser.cc b/components/autofill/core/browser/form_parsing/iban_field_parser.cc
index 070dbc6..49c8ea1 100644
--- a/components/autofill/core/browser/form_parsing/iban_field_parser.cc
+++ b/components/autofill/core/browser/form_parsing/iban_field_parser.cc
@@ -16,8 +16,8 @@
     ParsingContext& context,
     AutofillScanner* scanner) {
   raw_ptr<AutofillField> field;
-  base::span<const MatchPatternRef> iban_patterns = GetMatchPatterns(
-      IBAN_VALUE, context.page_language, context.pattern_source);
+  base::span<const MatchPatternRef> iban_patterns =
+      GetMatchPatterns(IBAN_VALUE, context.page_language, context.pattern_file);
   if (ParseField(context, scanner, iban_patterns, &field, "IBAN_VALUE")) {
     return std::make_unique<IbanFieldParser>(field);
   }
diff --git a/components/autofill/core/browser/form_parsing/internal_resources b/components/autofill/core/browser/form_parsing/internal_resources
index 8d1f2ac92..47aa652 160000
--- a/components/autofill/core/browser/form_parsing/internal_resources
+++ b/components/autofill/core/browser/form_parsing/internal_resources
@@ -1 +1 @@
-Subproject commit 8d1f2ac92088e96479b7c81f5e7f56abce5e0152
+Subproject commit 47aa652f62d6b1a3f0f3cffb2b1327ef6f4caf14
diff --git a/components/autofill/core/browser/form_parsing/merchant_promo_code_field_parser.cc b/components/autofill/core/browser/form_parsing/merchant_promo_code_field_parser.cc
index 0f1ace9..8b9ab24 100644
--- a/components/autofill/core/browser/form_parsing/merchant_promo_code_field_parser.cc
+++ b/components/autofill/core/browser/form_parsing/merchant_promo_code_field_parser.cc
@@ -18,7 +18,7 @@
   raw_ptr<AutofillField> field;
   base::span<const MatchPatternRef> merchant_promo_code_patterns =
       GetMatchPatterns("MERCHANT_PROMO_CODE", context.page_language,
-                       context.pattern_source);
+                       context.pattern_file);
   if (ParseField(context, scanner, merchant_promo_code_patterns, &field,
                  "MERCHANT_PROMO_CODE")) {
     return std::make_unique<MerchantPromoCodeFieldParser>(field);
diff --git a/components/autofill/core/browser/form_parsing/name_field_parser.cc b/components/autofill/core/browser/form_parsing/name_field_parser.cc
index 3db42b0..0a46d3f 100644
--- a/components/autofill/core/browser/form_parsing/name_field_parser.cc
+++ b/components/autofill/core/browser/form_parsing/name_field_parser.cc
@@ -23,7 +23,7 @@
 
 base::span<const MatchPatternRef> GetMatchPatterns(std::string_view name,
                                                    ParsingContext& context) {
-  return GetMatchPatterns(name, context.page_language, context.pattern_source);
+  return GetMatchPatterns(name, context.page_language, context.pattern_file);
 }
 
 // A form field that can parse a full name field.
diff --git a/components/autofill/core/browser/form_parsing/name_field_parser_unittest.cc b/components/autofill/core/browser/form_parsing/name_field_parser_unittest.cc
index c34dab85..6a5b690 100644
--- a/components/autofill/core/browser/form_parsing/name_field_parser_unittest.cc
+++ b/components/autofill/core/browser/form_parsing/name_field_parser_unittest.cc
@@ -21,7 +21,7 @@
 bool MatchesPattern(std::u16string_view input, std::string_view pattern_name) {
   static base::NoDestructor<AutofillRegexCache> cache(ThreadSafe(true));
   base::span<const MatchPatternRef> patterns = GetMatchPatterns(
-      pattern_name, /*language_code=*/std::nullopt, *GetActivePatternSource());
+      pattern_name, /*language_code=*/std::nullopt, *GetActivePatternFile());
   return std::ranges::any_of(patterns, [&](MatchPatternRef pattern_ref) {
     return MatchesRegex(
         input, *cache->GetRegexPattern((*pattern_ref).positive_pattern));
diff --git a/components/autofill/core/browser/form_parsing/numeric_quantity_field_parser.cc b/components/autofill/core/browser/form_parsing/numeric_quantity_field_parser.cc
index 50ef30f..b1d0c89 100644
--- a/components/autofill/core/browser/form_parsing/numeric_quantity_field_parser.cc
+++ b/components/autofill/core/browser/form_parsing/numeric_quantity_field_parser.cc
@@ -17,7 +17,7 @@
     AutofillScanner* scanner) {
   raw_ptr<AutofillField> field;
   base::span<const MatchPatternRef> quantity_patterns = GetMatchPatterns(
-      "NUMERIC_QUANTITY", context.page_language, context.pattern_source);
+      "NUMERIC_QUANTITY", context.page_language, context.pattern_file);
   if (ParseField(context, scanner, quantity_patterns, &field,
                  "NUMERIC_QUANTITY")) {
     return base::WrapUnique(new NumericQuantityFieldParser(field));
diff --git a/components/autofill/core/browser/form_parsing/parsing_test_utils.cc b/components/autofill/core/browser/form_parsing/parsing_test_utils.cc
index a0b0758..68dd373 100644
--- a/components/autofill/core/browser/form_parsing/parsing_test_utils.cc
+++ b/components/autofill/core/browser/form_parsing/parsing_test_utils.cc
@@ -74,7 +74,7 @@
   UpdateRanks(fields_);
   AutofillScanner scanner(fields_);
   ParsingContext context(client_country, page_language,
-                         *GetActivePatternSource());
+                         *GetActivePatternFile());
   std::unique_ptr<FormFieldParser> field = Parse(context, &scanner);
 
   if (parse_result == ParseResult::kNotParsed) {
@@ -94,7 +94,7 @@
     const LanguageCode& page_language) {
   UpdateRanks(fields_);
   ParsingContext context(client_country, page_language,
-                         *GetActivePatternSource());
+                         *GetActivePatternFile());
   AutofillScanner scanner(fields_);
   while (!scanner.IsEnd()) {
     // An empty page_language means the language is unknown and patterns of
diff --git a/components/autofill/core/browser/form_parsing/phone_field_parser.cc b/components/autofill/core/browser/form_parsing/phone_field_parser.cc
index a2e682d..810a1fe 100644
--- a/components/autofill/core/browser/form_parsing/phone_field_parser.cc
+++ b/components/autofill/core/browser/form_parsing/phone_field_parser.cc
@@ -377,7 +377,7 @@
                                        const bool is_country_code_field,
                                        const std::string& json_field_type) {
   base::span<const MatchPatternRef> patterns = GetMatchPatterns(
-      json_field_type, context.page_language, context.pattern_source);
+      json_field_type, context.page_language, context.pattern_file);
 
   // Phone country code fields can be discovered via the generic "PHONE" regex
   // (see e.g. the "Phone: <cc> <ac>:3 - <phone>:3 - <suffix>:4" grammar rule).
diff --git a/components/autofill/core/browser/form_parsing/phone_field_parser_unittest.cc b/components/autofill/core/browser/form_parsing/phone_field_parser_unittest.cc
index 0a816d4..785559f 100644
--- a/components/autofill/core/browser/form_parsing/phone_field_parser_unittest.cc
+++ b/components/autofill/core/browser/form_parsing/phone_field_parser_unittest.cc
@@ -129,7 +129,7 @@
   // Parse.
   AutofillScanner scanner(list_);
   ParsingContext context(GeoIpCountryCode(""), LanguageCode(""),
-                         *GetActivePatternSource());
+                         *GetActivePatternFile());
   field_ = Parse(context, &scanner);
   ASSERT_EQ(expect_success, field_.get() != nullptr);
 
diff --git a/components/autofill/core/browser/form_parsing/price_field_parser.cc b/components/autofill/core/browser/form_parsing/price_field_parser.cc
index 510b320..6ea9f5392 100644
--- a/components/autofill/core/browser/form_parsing/price_field_parser.cc
+++ b/components/autofill/core/browser/form_parsing/price_field_parser.cc
@@ -17,7 +17,7 @@
     AutofillScanner* scanner) {
   raw_ptr<AutofillField> field;
   base::span<const MatchPatternRef> price_patterns =
-      GetMatchPatterns("PRICE", context.page_language, context.pattern_source);
+      GetMatchPatterns("PRICE", context.page_language, context.pattern_file);
   if (ParseField(context, scanner, price_patterns, &field, "PRICE")) {
     return std::make_unique<PriceFieldParser>(field);
   }
diff --git a/components/autofill/core/browser/form_parsing/regex_patterns.cc b/components/autofill/core/browser/form_parsing/regex_patterns.cc
index 37e8e6a..d71d11c 100644
--- a/components/autofill/core/browser/form_parsing/regex_patterns.cc
+++ b/components/autofill/core/browser/form_parsing/regex_patterns.cc
@@ -15,29 +15,29 @@
 namespace {
 
 // Returns the span of MatchPatternRefs for the given pattern name, language
-// code, and pattern source.
+// code, and pattern file.
 //
-// Hits a CHECK if the given pattern source contains no patterns for the given
+// Hits a CHECK if the given pattern file contains no patterns for the given
 // name.
 //
 // Falls back to the union of all patterns of a the given name in the given
-// pattern source if there are no patterns for the given language.
+// pattern file if there are no patterns for the given language.
 base::span<const MatchPatternRef> GetMatchPatterns(
     std::string_view name,
     std::string_view language_code,
-    PatternSource pattern_source) {
+    PatternFile pattern_file) {
   auto it = kPatternMap.find(std::make_pair(name, language_code));
   if (!language_code.empty() && it == kPatternMap.end())
     it = kPatternMap.find(std::make_pair(name, ""));
   CHECK(it != kPatternMap.end());
-  switch (pattern_source) {
+  switch (pattern_file) {
 #if !BUILDFLAG(USE_INTERNAL_AUTOFILL_PATTERNS)
-    case PatternSource::kLegacy:
+    case PatternFile::kLegacy:
       return it->second[0];
 #else
-    case PatternSource::kDefault:
+    case PatternFile::kDefault:
       return it->second[0];
-    case PatternSource::kPredictionImprovements:
+    case PatternFile::kPredictionImprovements:
       return it->second[1];
 #endif
   }
@@ -46,24 +46,24 @@
 
 }  // namespace
 
-std::optional<PatternSource> GetActivePatternSource() {
-  return HeuristicSourceToPatternSource(GetActiveHeuristicSource());
+std::optional<PatternFile> GetActivePatternFile() {
+  return HeuristicSourceToPatternFile(GetActiveHeuristicSource());
 }
 
 base::span<const MatchPatternRef> GetMatchPatterns(
     std::string_view name,
     std::optional<LanguageCode> language_code,
-    PatternSource pattern_source) {
-  return language_code ? GetMatchPatterns(name, **language_code, pattern_source)
-                       : GetMatchPatterns(name, "", pattern_source);
+    PatternFile pattern_file) {
+  return language_code ? GetMatchPatterns(name, **language_code, pattern_file)
+                       : GetMatchPatterns(name, "", pattern_file);
 }
 
 base::span<const MatchPatternRef> GetMatchPatterns(
     FieldType type,
     std::optional<LanguageCode> language_code,
-    PatternSource pattern_source) {
+    PatternFile pattern_file) {
   return GetMatchPatterns(FieldTypeToStringView(type), language_code,
-                          pattern_source);
+                          pattern_file);
 }
 
 bool IsSupportedLanguageCode(LanguageCode language_code) {
diff --git a/components/autofill/core/browser/form_parsing/regex_patterns.h b/components/autofill/core/browser/form_parsing/regex_patterns.h
index b901066..fc70742 100644
--- a/components/autofill/core/browser/form_parsing/regex_patterns.h
+++ b/components/autofill/core/browser/form_parsing/regex_patterns.h
@@ -70,9 +70,7 @@
 
 // The different sets of patterns available for parsing.
 // Each enum constant corresponds to a JSON file.
-// When adding a new value, it's require to add it to
-// `HeuristicSource` as well.
-enum class PatternSource : uint8_t {
+enum class PatternFile : uint8_t {
 #if !BUILDFLAG(USE_INTERNAL_AUTOFILL_PATTERNS)
   // Patterns whose stability is above suspicion.
   kLegacy,
@@ -84,10 +82,9 @@
 #endif
 };
 
-// The active pattern and the available patterns depend on the build config and
-// the Finch config. If the active `HeuristicSource` is not a `PatternSource`,
-// then a nullopt is returned.
-std::optional<PatternSource> GetActivePatternSource();
+// The active file depend on the build config and enabled features. If the
+// active `HeuristicSource` is not based on a JSON file, nullopt is returned.
+std::optional<PatternFile> GetActivePatternFile();
 
 // Looks up the patterns for the given name and language.
 // The name is typically a field type.
@@ -102,12 +99,12 @@
 base::span<const MatchPatternRef> GetMatchPatterns(
     std::string_view name,
     std::optional<LanguageCode> language_code,
-    PatternSource pattern_source);
+    PatternFile pattern_file);
 
 base::span<const MatchPatternRef> GetMatchPatterns(
     FieldType type,
     std::optional<LanguageCode> language_code,
-    PatternSource pattern_source);
+    PatternFile pattern_file);
 
 // Returns true iff there at least one pattern for some PatternSource and
 // pattern name.
diff --git a/components/autofill/core/browser/form_parsing/regex_patterns_unittest.cc b/components/autofill/core/browser/form_parsing/regex_patterns_unittest.cc
index 7221cd2d..fd757da2 100644
--- a/components/autofill/core/browser/form_parsing/regex_patterns_unittest.cc
+++ b/components/autofill/core/browser/form_parsing/regex_patterns_unittest.cc
@@ -84,19 +84,19 @@
   return s == nullptr || s[0] == '\0';
 }
 
-// The parameter is the PatternSource to pass to GetMatchPatterns().
-class RegexPatternsTest : public testing::TestWithParam<PatternSource> {
+// The parameter is the PatternFile to pass to GetMatchPatterns().
+class RegexPatternsTest : public testing::TestWithParam<PatternFile> {
  public:
-  PatternSource pattern_source() const { return GetParam(); }
+  PatternFile pattern_file() const { return GetParam(); }
 };
 
 INSTANTIATE_TEST_SUITE_P(RegexPatternsTest,
                          RegexPatternsTest,
                          ::testing::Values(
 #if !BUILDFLAG(USE_INTERNAL_AUTOFILL_PATTERNS)
-                             PatternSource::kLegacy
+                             PatternFile::kLegacy
 #else
-                             PatternSource::kDefault
+                             PatternFile::kDefault
 #endif
                              ));
 
@@ -172,15 +172,15 @@
   std::vector<MatchPatternRef> expected;
   for (const std::string& lang : kLanguagesOfPattern) {
     const auto& patterns =
-        GetMatchPatterns(kSomeName, LanguageCode(lang), pattern_source());
+        GetMatchPatterns(kSomeName, LanguageCode(lang), pattern_file());
     expected.insert(expected.end(), patterns.begin(), patterns.end());
   }
   std::erase_if(expected,
                 [](auto p) { return test_api(p).is_supplementary(); });
 
-  EXPECT_THAT(GetMatchPatterns(kSomeName, std::nullopt, pattern_source()),
+  EXPECT_THAT(GetMatchPatterns(kSomeName, std::nullopt, pattern_file()),
               UnorderedElementsAreArray(expected));
-  EXPECT_THAT(GetMatchPatterns(kSomeName, std::nullopt, pattern_source()),
+  EXPECT_THAT(GetMatchPatterns(kSomeName, std::nullopt, pattern_file()),
               Each(Not(IsSupplementary)));
 }
 
@@ -189,10 +189,9 @@
 TEST_P(RegexPatternsTest, FallbackToPseudoLanguageIfLanguageDoesNotExist) {
   const std::string kSomeName = "ADDRESS_LINE_1";
   const LanguageCode kNonexistingLanguage("foo");
-  EXPECT_THAT(
-      GetMatchPatterns(kSomeName, kNonexistingLanguage, pattern_source()),
-      ElementsAreArray(
-          GetMatchPatterns(kSomeName, std::nullopt, pattern_source())));
+  EXPECT_THAT(GetMatchPatterns(kSomeName, kNonexistingLanguage, pattern_file()),
+              ElementsAreArray(
+                  GetMatchPatterns(kSomeName, std::nullopt, pattern_file())));
 }
 
 // Tests that for a given pattern name, the non-English languages are
@@ -201,9 +200,9 @@
        EnglishPatternsAreAddedToOtherLanguagesAsSupplementaryPatterns) {
   const std::string kSomeName = "ADDRESS_LINE_1";
   auto de_patterns =
-      GetMatchPatterns(kSomeName, LanguageCode("de"), pattern_source());
+      GetMatchPatterns(kSomeName, LanguageCode("de"), pattern_file());
   auto en_patterns =
-      GetMatchPatterns(kSomeName, LanguageCode("en"), pattern_source());
+      GetMatchPatterns(kSomeName, LanguageCode("en"), pattern_file());
   ASSERT_FALSE(de_patterns.empty());
   ASSERT_FALSE(en_patterns.empty());
 
@@ -226,7 +225,7 @@
 struct PatternTestCase {
   // The set of patterns. In non-branded builds, only the default set is
   // supported.
-  PatternSource pattern_source;
+  PatternFile pattern_file;
   // Reference to the pattern name in the resources/regex_patterns.json file.
   const char* pattern_name;
   // Language selector for the pattern, refers to the detected language of a
@@ -247,9 +246,8 @@
     EXPECT_THAT(sample,
                 MatchesAny(GetMatchPatterns(test_case.pattern_name,
                                             LanguageCode(test_case.language),
-                                            test_case.pattern_source)))
-        << "pattern_source=" << static_cast<int>(test_case.pattern_source)
-        << ","
+                                            test_case.pattern_file)))
+        << "pattern_source=" << static_cast<int>(test_case.pattern_file) << ","
         << "pattern_name=" << test_case.pattern_name << ","
         << "language=" << test_case.language;
   }
@@ -258,98 +256,135 @@
     EXPECT_THAT(sample,
                 Not(MatchesAny(GetMatchPatterns(
                     test_case.pattern_name, LanguageCode(test_case.language),
-                    test_case.pattern_source))))
+                    test_case.pattern_file))))
         << "pattern_name=" << test_case.pattern_name << ","
         << "language=" << test_case.language;
   }
 }
 
-INSTANTIATE_TEST_SUITE_P(
-    RegexPatternsTest,
-    RegexPatternsTestWithSamples,
-    testing::Values(
+INSTANTIATE_TEST_SUITE_P(RegexPatternsTest,
+                         RegexPatternsTestWithSamples,
+                         testing::Values(
 #if !BUILDFLAG(USE_INTERNAL_AUTOFILL_PATTERNS)
-        PatternTestCase{.pattern_source = PatternSource::kLegacy,
-                        .pattern_name = "PATTERN_SOURCE_DUMMY",
-                        .language = "en",
-                        .positive_samples = {"legacy"},
-                        .negative_samples = {"default", "experimental"}}
+                             PatternTestCase {
+                               .pattern_file = PatternFile::kLegacy,
+                               .pattern_name = "PATTERN_SOURCE_DUMMY",
+                               .language = "en", .positive_samples = {"legacy"},
+                               .negative_samples = {
+                                 "default",
+                                 "experimental"
+                               }
+                             }
 #else
-        PatternTestCase{.pattern_source = PatternSource::kDefault,
-                        .pattern_name = "PATTERN_SOURCE_DUMMY",
-                        .language = "en",
-                        .positive_samples = {"default"},
-                        .negative_samples = {"legacy", "experimental"}},
-        PatternTestCase{
-            .pattern_source = PatternSource::kDefault,
-            .pattern_name = "CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR",
-            .language = "en",
-            .positive_samples =
-                {"mm / yy", "mm/ yy", "mm /yy", "mm/yy", "mm - yy", "mm- yy",
-                 "mm -yy", "mm-yy", "mmyy",
-                 // Complex two year cases
-                 "Expiration Date (MM / YY)", "Expiration Date (MM/YY)",
-                 "Expiration Date (MM - YY)", "Expiration Date (MM-YY)",
-                 "Expiration Date MM / YY", "Expiration Date MM/YY",
-                 "Expiration Date MM - YY", "Expiration Date MM-YY",
-                 "expiration date yy", "Exp Date     (MM / YY)"},
-            .negative_samples =
-                {"", "Look, ma' -- an invalid string!", "mmfavouritewordyy",
-                 "mm a yy", "mm a yyyy",
-                 // Simple four year cases
-                 "mm / yyyy", "mm/ yyyy", "mm /yyyy", "mm/yyyy", "mm - yyyy",
-                 "mm- yyyy", "mm -yyyy", "mm-yyyy", "mmyyyy",
-                 // Complex four year cases
-                 "Expiration Date (MM / YYYY)", "Expiration Date (MM/YYYY)",
-                 "Expiration Date (MM - YYYY)", "Expiration Date (MM-YYYY)",
-                 "Expiration Date MM / YYYY", "Expiration Date MM/YYYY",
-                 "Expiration Date MM - YYYY", "Expiration Date MM-YYYY",
-                 "expiration date yyyy", "Exp Date     (MM / YYYY)"}},
-        PatternTestCase{
-            .pattern_source = PatternSource::kDefault,
-            .pattern_name = "CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR",
-            .language = "en",
-            .positive_samples =
-                {// Simple four year cases
-                 "mm / yyyy", "mm/ yyyy", "mm /yyyy", "mm/yyyy", "mm - yyyy",
-                 "mm- yyyy", "mm -yyyy", "mm-yyyy", "mmyyyy",
-                 // Complex four year cases
-                 "Expiration Date (MM / YYYY)", "Expiration Date (MM/YYYY)",
-                 "Expiration Date (MM - YYYY)", "Expiration Date (MM-YYYY)",
-                 "Expiration Date MM / YYYY", "Expiration Date MM/YYYY",
-                 "Expiration Date MM - YYYY", "Expiration Date MM-YYYY",
-                 "expiration date yyyy", "Exp Date     (MM / YYYY)"},
-            .negative_samples =
-                {"", "Look, ma' -- an invalid string!", "mmfavouritewordyy",
-                 "mm a yy", "mm a yyyy",
-                 // Simple two year cases
-                 "mm / yy", "mm/ yy", "mm /yy", "mm/yy", "mm - yy", "mm- yy",
-                 "mm -yy", "mm-yy", "mmyy",
-                 // Complex two year cases
-                 "Expiration Date (MM / YY)", "Expiration Date (MM/YY)",
-                 "Expiration Date (MM - YY)", "Expiration Date (MM-YY)",
-                 "Expiration Date MM / YY", "Expiration Date MM/YY",
-                 "Expiration Date MM - YY", "Expiration Date MM-YY",
-                 "expiration date yy", "Exp Date     (MM / YY)"}},
-        PatternTestCase{.pattern_source = PatternSource::kDefault,
-                        .pattern_name = "ZIP_CODE",
-                        .language = "en",
-                        .positive_samples = {"Zip code", "postal code"},
-                        .negative_samples =
-                            {// Not matching for "en" language:
-                             "postleitzahl",
-                             // Not referring to a ZIP code:
-                             "Supported file formats: .docx, .rar, .zip."}},
-        PatternTestCase{.pattern_source = PatternSource::kDefault,
-                        .pattern_name = "ZIP_CODE",
-                        .language = "de",
-                        .positive_samples =
-                            {// Inherited from "en":
-                             "Zip code", "postal code",
-                             // Specifically added for "de":
-                             "postleitzahl"}}
+                             PatternTestCase{
+                                 .pattern_file = PatternFile::kDefault,
+                                 .pattern_name = "PATTERN_SOURCE_DUMMY",
+                                 .language = "en",
+                                 .positive_samples = {"default"},
+                                 .negative_samples = {"legacy",
+                                                      "experimental"}},
+                             PatternTestCase{
+                                 .pattern_file = PatternFile::kDefault,
+                                 .pattern_name =
+                                     "CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR",
+                                 .language = "en",
+                                 .positive_samples =
+                                     {"mm / yy", "mm/ yy", "mm /yy", "mm/yy",
+                                      "mm - yy", "mm- yy", "mm -yy", "mm-yy",
+                                      "mmyy",
+                                      // Complex two year cases
+                                      "Expiration Date (MM / YY)",
+                                      "Expiration Date (MM/YY)",
+                                      "Expiration Date (MM - YY)",
+                                      "Expiration Date (MM-YY)",
+                                      "Expiration Date MM / YY",
+                                      "Expiration Date MM/YY",
+                                      "Expiration Date MM - YY",
+                                      "Expiration Date MM-YY",
+                                      "expiration date yy",
+                                      "Exp Date     (MM / YY)"},
+                                 .negative_samples =
+                                     {"", "Look, ma' -- an invalid string!",
+                                      "mmfavouritewordyy", "mm a yy",
+                                      "mm a yyyy",
+                                      // Simple four year cases
+                                      "mm / yyyy", "mm/ yyyy", "mm /yyyy",
+                                      "mm/yyyy", "mm - yyyy", "mm- yyyy",
+                                      "mm -yyyy", "mm-yyyy", "mmyyyy",
+                                      // Complex four year cases
+                                      "Expiration Date (MM / YYYY)",
+                                      "Expiration Date (MM/YYYY)",
+                                      "Expiration Date (MM - YYYY)",
+                                      "Expiration Date (MM-YYYY)",
+                                      "Expiration Date MM / YYYY",
+                                      "Expiration Date MM/YYYY",
+                                      "Expiration Date MM - YYYY",
+                                      "Expiration Date MM-YYYY",
+                                      "expiration date yyyy",
+                                      "Exp Date     (MM / YYYY)"}},
+                             PatternTestCase{
+                                 .pattern_file = PatternFile::kDefault,
+                                 .pattern_name =
+                                     "CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR",
+                                 .language = "en",
+                                 .positive_samples =
+                                     {// Simple four year cases
+                                      "mm / yyyy", "mm/ yyyy", "mm /yyyy",
+                                      "mm/yyyy", "mm - yyyy", "mm- yyyy",
+                                      "mm -yyyy", "mm-yyyy", "mmyyyy",
+                                      // Complex four year cases
+                                      "Expiration Date (MM / YYYY)",
+                                      "Expiration Date (MM/YYYY)",
+                                      "Expiration Date (MM - YYYY)",
+                                      "Expiration Date (MM-YYYY)",
+                                      "Expiration Date MM / YYYY",
+                                      "Expiration Date MM/YYYY",
+                                      "Expiration Date MM - YYYY",
+                                      "Expiration Date MM-YYYY",
+                                      "expiration date yyyy",
+                                      "Exp Date     (MM / YYYY)"},
+                                 .negative_samples =
+                                     {"", "Look, ma' -- an invalid string!",
+                                      "mmfavouritewordyy", "mm a yy",
+                                      "mm a yyyy",
+                                      // Simple two year cases
+                                      "mm / yy", "mm/ yy", "mm /yy", "mm/yy",
+                                      "mm - yy", "mm- yy", "mm -yy", "mm-yy",
+                                      "mmyy",
+                                      // Complex two year cases
+                                      "Expiration Date (MM / YY)",
+                                      "Expiration Date (MM/YY)",
+                                      "Expiration Date (MM - YY)",
+                                      "Expiration Date (MM-YY)",
+                                      "Expiration Date MM / YY",
+                                      "Expiration Date MM/YY",
+                                      "Expiration Date MM - YY",
+                                      "Expiration Date MM-YY",
+                                      "expiration date yy",
+                                      "Exp Date     (MM / YY)"}},
+                             PatternTestCase{
+                                 .pattern_file = PatternFile::kDefault,
+                                 .pattern_name = "ZIP_CODE",
+                                 .language = "en",
+                                 .positive_samples = {"Zip code",
+                                                      "postal code"},
+                                 .negative_samples =
+                                     {// Not matching for "en" language:
+                                      "postleitzahl",
+                                      // Not referring to a ZIP code:
+                                      "Supported file formats: .docx, .rar, "
+                                      ".zip."}},
+                             PatternTestCase{
+                                 .pattern_file = PatternFile::kDefault,
+                                 .pattern_name = "ZIP_CODE",
+                                 .language = "de",
+                                 .positive_samples =
+                                     {// Inherited from "en":
+                                      "Zip code", "postal code",
+                                      // Specifically added for "de":
+                                      "postleitzahl"}}
 #endif
-        ));
+                             ));
 
 }  // namespace
 }  // namespace autofill
diff --git a/components/autofill/core/browser/form_parsing/search_field_parser.cc b/components/autofill/core/browser/form_parsing/search_field_parser.cc
index 5f30e71..58d000d2 100644
--- a/components/autofill/core/browser/form_parsing/search_field_parser.cc
+++ b/components/autofill/core/browser/form_parsing/search_field_parser.cc
@@ -17,7 +17,7 @@
     AutofillScanner* scanner) {
   raw_ptr<AutofillField> field;
   base::span<const MatchPatternRef> patterns = GetMatchPatterns(
-      SEARCH_TERM, context.page_language, context.pattern_source);
+      SEARCH_TERM, context.page_language, context.pattern_file);
   if (ParseField(context, scanner, patterns, &field, "SEARCH_TERM")) {
     return std::make_unique<SearchFieldParser>(field);
   }
diff --git a/components/autofill/core/browser/form_parsing/standalone_cvc_field_parser.cc b/components/autofill/core/browser/form_parsing/standalone_cvc_field_parser.cc
index d0043b8..564b79ef 100644
--- a/components/autofill/core/browser/form_parsing/standalone_cvc_field_parser.cc
+++ b/components/autofill/core/browser/form_parsing/standalone_cvc_field_parser.cc
@@ -31,7 +31,7 @@
   raw_ptr<AutofillField> field;
   base::span<const MatchPatternRef> cvc_patterns =
       GetMatchPatterns(CREDIT_CARD_VERIFICATION_CODE, context.page_language,
-                       context.pattern_source);
+                       context.pattern_file);
 
   if (ParseField(context, scanner, cvc_patterns, &field,
                  "CREDIT_CARD_VERIFICATION_CODE(standalone)")) {
@@ -51,7 +51,7 @@
   }
 
   base::span<const MatchPatternRef> gift_card_patterns = GetMatchPatterns(
-      "GIFT_CARD", context.page_language, context.pattern_source);
+      "GIFT_CARD", context.page_language, context.pattern_file);
 
   size_t saved_cursor = scanner->SaveCursor();
   const bool gift_card_match =
diff --git a/components/autofill/core/browser/form_parsing/travel_field_parser.cc b/components/autofill/core/browser/form_parsing/travel_field_parser.cc
index 3aa6fd1..491b874 100644
--- a/components/autofill/core/browser/form_parsing/travel_field_parser.cc
+++ b/components/autofill/core/browser/form_parsing/travel_field_parser.cc
@@ -16,7 +16,7 @@
 namespace {
 base::span<const MatchPatternRef> GetMatchPatterns(std::string_view name,
                                                    ParsingContext& context) {
-  return GetMatchPatterns(name, context.page_language, context.pattern_source);
+  return GetMatchPatterns(name, context.page_language, context.pattern_file);
 }
 }  // namespace
 
diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc
index 56f39e41..7e9c6e8 100644
--- a/components/autofill/core/browser/form_structure.cc
+++ b/components/autofill/core/browser/form_structure.cc
@@ -195,22 +195,22 @@
       base::FeatureList::IsEnabled(features::kAutofillPageLanguageDetection)
           ? current_page_language_
           : LanguageCode();
-  // The `PatternSource` parameter is overwritten again immediately before
+  // The `PatternFile` parameter is overwritten again immediately before
   // parsing and doesn't matter here.
   ParsingContext context(client_country_, page_language,
 #if BUILDFLAG(USE_INTERNAL_AUTOFILL_PATTERNS)
-                         PatternSource::kDefault,
+                         PatternFile::kDefault,
 #else
-                         PatternSource::kLegacy,
+                         PatternFile::kLegacy,
 #endif
                          GetActiveRegexFeatures(), log_manager);
 
   // The active heuristic source might not be a pattern source.
   std::optional<FieldCandidatesMap> active_predictions;
   HeuristicSource active_heuristic_source = GetActiveHeuristicSource();
-  if (std::optional<PatternSource> pattern_source =
-          HeuristicSourceToPatternSource(active_heuristic_source)) {
-    context.pattern_source = *pattern_source;
+  if (std::optional<PatternFile> pattern_file =
+          HeuristicSourceToPatternFile(active_heuristic_source)) {
+    context.pattern_file = *pattern_file;
     active_predictions = ParseFieldTypesWithPatterns(context);
     AssignBestFieldTypes(*active_predictions, active_heuristic_source);
   }
@@ -252,15 +252,15 @@
     std::optional<FieldCandidatesMap> active_predictions,
     ParsingContext& context) {
 #if BUILDFLAG(USE_INTERNAL_AUTOFILL_PATTERNS)
-  if (GetActiveHeuristicSource() == HeuristicSource::kDefault) {
+  if (GetActiveHeuristicSource() == HeuristicSource::kDefaultRegexes) {
     return;
   }
   // When a non-default source is active, shadow predictions between this
   // non-default source and default are emitted. Compute default predictions.
-  context.pattern_source = PatternSource::kDefault;
+  context.pattern_file = PatternFile::kDefault;
   context.active_features.clear();
   AssignBestFieldTypes(ParseFieldTypesWithPatterns(context),
-                       HeuristicSource::kDefault);
+                       HeuristicSource::kDefaultRegexes);
 #endif
 }
 
diff --git a/components/autofill/core/browser/form_structure_rationalization_engine.cc b/components/autofill/core/browser/form_structure_rationalization_engine.cc
index 6b29fa2..7bb8c76 100644
--- a/components/autofill/core/browser/form_structure_rationalization_engine.cc
+++ b/components/autofill/core/browser/form_structure_rationalization_engine.cc
@@ -169,7 +169,7 @@
   if (condition.regex_reference_match.has_value()) {
     base::span<const MatchPatternRef> patterns =
         GetMatchPatterns(condition.regex_reference_match.value(),
-                         context.page_language, context.pattern_source);
+                         context.page_language, context.pattern_file);
     if (!FormFieldParser::FieldMatchesMatchPatternRef(context, patterns,
                                                       field)) {
       return false;
diff --git a/components/autofill/core/browser/form_structure_rationalization_engine_unittest.cc b/components/autofill/core/browser/form_structure_rationalization_engine_unittest.cc
index 9ef6fb4..1d93237 100644
--- a/components/autofill/core/browser/form_structure_rationalization_engine_unittest.cc
+++ b/components/autofill/core/browser/form_structure_rationalization_engine_unittest.cc
@@ -56,11 +56,11 @@
   return server_types;
 }
 
-PatternSource GetPatternSource() {
+PatternFile GetPatternFile() {
 #if BUILDFLAG(USE_INTERNAL_AUTOFILL_PATTERNS)
-  return PatternSource::kDefault;
+  return PatternFile::kDefault;
 #else
-  return PatternSource::kLegacy;
+  return PatternFile::kLegacy;
 #endif
 }
 
@@ -133,9 +133,9 @@
   GeoIpCountryCode kMX = GeoIpCountryCode("MX");
   GeoIpCountryCode kBR = GeoIpCountryCode("BR");
   GeoIpCountryCode kUS = GeoIpCountryCode("US");
-  ParsingContext kMXContext(kMX, LanguageCode("es"), GetPatternSource());
-  ParsingContext kBRContext(kBR, LanguageCode("pt"), GetPatternSource());
-  ParsingContext kUSContext(kUS, LanguageCode("en"), GetPatternSource());
+  ParsingContext kMXContext(kMX, LanguageCode("es"), GetPatternFile());
+  ParsingContext kBRContext(kBR, LanguageCode("pt"), GetPatternFile());
+  ParsingContext kUSContext(kUS, LanguageCode("en"), GetPatternFile());
 
   EnvironmentCondition no_country_required =
       EnvironmentConditionBuilder().Build();
@@ -160,7 +160,7 @@
      IsEnvironmentConditionFulfilled_CheckExperiment) {
   using internal::IsEnvironmentConditionFulfilled;
   GeoIpCountryCode kMX = GeoIpCountryCode("MX");
-  ParsingContext kMXContext(kMX, LanguageCode("es"), GetPatternSource());
+  ParsingContext kMXContext(kMX, LanguageCode("es"), GetPatternFile());
 
   EnvironmentCondition no_experiment_required =
       EnvironmentConditionBuilder().Build();
@@ -194,7 +194,7 @@
      IsFieldConditionFulfilledIgnoringLocation_CheckPossibleTypes) {
   using internal::IsFieldConditionFulfilledIgnoringLocation;
   GeoIpCountryCode kMX = GeoIpCountryCode("MX");
-  ParsingContext kMXContext(kMX, LanguageCode("es"), GetPatternSource());
+  ParsingContext kMXContext(kMX, LanguageCode("es"), GetPatternFile());
 
   FieldCondition no_possible_types_required = {};
   FieldCondition requires_address_line1_type = {
@@ -233,7 +233,7 @@
      IsFieldConditionFulfilledIgnoringLocation_CheckRegex) {
   using internal::IsFieldConditionFulfilledIgnoringLocation;
   GeoIpCountryCode kMX = GeoIpCountryCode("MX");
-  ParsingContext kMXContext(kMX, LanguageCode("es"), GetPatternSource());
+  ParsingContext kMXContext(kMX, LanguageCode("es"), GetPatternFile());
 
   FieldCondition no_regex_match_required = {};
   FieldCondition requires_dependent_locality_match = {
@@ -299,7 +299,7 @@
   });
 
   GeoIpCountryCode kMX = GeoIpCountryCode("MX");
-  ParsingContext kMXContext(kMX, LanguageCode("es"), GetPatternSource());
+  ParsingContext kMXContext(kMX, LanguageCode("es"), GetPatternFile());
   internal::ApplyRuleIfApplicable(kMXContext, CreateTestRule(), fields);
 
   EXPECT_THAT(
@@ -328,7 +328,7 @@
   });
 
   GeoIpCountryCode kMX = GeoIpCountryCode("MX");
-  ParsingContext kMXContext(kMX, LanguageCode("es"), GetPatternSource());
+  ParsingContext kMXContext(kMX, LanguageCode("es"), GetPatternFile());
   internal::ApplyRuleIfApplicable(kMXContext, CreateTestRule(), fields);
 
   EXPECT_THAT(
@@ -357,7 +357,7 @@
   });
 
   GeoIpCountryCode kMX = GeoIpCountryCode("MX");
-  ParsingContext kMXContext(kMX, LanguageCode("es"), GetPatternSource());
+  ParsingContext kMXContext(kMX, LanguageCode("es"), GetPatternFile());
   internal::ApplyRuleIfApplicable(kMXContext, CreateTestRule(), fields);
 
   EXPECT_THAT(
@@ -389,7 +389,7 @@
   });
 
   GeoIpCountryCode kMX = GeoIpCountryCode("MX");
-  ParsingContext kMXContext(kMX, LanguageCode("es"), GetPatternSource());
+  ParsingContext kMXContext(kMX, LanguageCode("es"), GetPatternFile());
   internal::ApplyRuleIfApplicable(kMXContext, CreateTestRule(), fields);
 
   EXPECT_THAT(GetTypes(fields),
@@ -419,7 +419,7 @@
   });
 
   GeoIpCountryCode kMX = GeoIpCountryCode("MX");
-  ParsingContext kMXContext(kMX, LanguageCode("es"), GetPatternSource());
+  ParsingContext kMXContext(kMX, LanguageCode("es"), GetPatternFile());
   internal::ApplyRuleIfApplicable(kMXContext, CreateTestRule(), fields);
 
   EXPECT_THAT(
@@ -448,7 +448,7 @@
   });
 
   GeoIpCountryCode kDE = GeoIpCountryCode("DE");
-  ParsingContext kDEContext(kDE, LanguageCode("de"), GetPatternSource());
+  ParsingContext kDEContext(kDE, LanguageCode("de"), GetPatternFile());
   ApplyRationalizationEngineRules(kDEContext, fields, nullptr);
 
   EXPECT_THAT(GetTypes(fields),
@@ -477,7 +477,7 @@
   });
 
   GeoIpCountryCode kPL = GeoIpCountryCode("PL");
-  ParsingContext kPLContext(kPL, LanguageCode("pl"), GetPatternSource());
+  ParsingContext kPLContext(kPL, LanguageCode("pl"), GetPatternFile());
   ApplyRationalizationEngineRules(kPLContext, fields, nullptr);
 
   EXPECT_THAT(GetTypes(fields),
@@ -506,7 +506,7 @@
   });
 
   GeoIpCountryCode kPL = GeoIpCountryCode("PL");
-  ParsingContext kPLContext(kPL, LanguageCode("pl"), GetPatternSource());
+  ParsingContext kPLContext(kPL, LanguageCode("pl"), GetPatternFile());
   ApplyRationalizationEngineRules(kPLContext, fields, nullptr);
 
   EXPECT_THAT(GetTypes(fields),
@@ -532,7 +532,7 @@
   });
 
   GeoIpCountryCode kPL = GeoIpCountryCode("PL");
-  ParsingContext kPLContext(kPL, LanguageCode("pl"), GetPatternSource());
+  ParsingContext kPLContext(kPL, LanguageCode("pl"), GetPatternFile());
   ApplyRationalizationEngineRules(kPLContext, fields, nullptr);
 
   EXPECT_THAT(GetTypes(fields),
@@ -558,7 +558,7 @@
   });
 
   GeoIpCountryCode kPL = GeoIpCountryCode("PL");
-  ParsingContext kPLContext(kPL, LanguageCode("pl"), GetPatternSource());
+  ParsingContext kPLContext(kPL, LanguageCode("pl"), GetPatternFile());
   ApplyRationalizationEngineRules(kPLContext, fields, nullptr);
 
   EXPECT_THAT(GetTypes(fields),
@@ -585,7 +585,7 @@
   });
 
   GeoIpCountryCode kIT = GeoIpCountryCode("IT");
-  ParsingContext kITContext(kIT, LanguageCode("it"), GetPatternSource());
+  ParsingContext kITContext(kIT, LanguageCode("it"), GetPatternFile());
   ApplyRationalizationEngineRules(kITContext, fields, nullptr);
 
   EXPECT_THAT(GetTypes(fields),
@@ -611,7 +611,7 @@
   });
 
   GeoIpCountryCode kIT = GeoIpCountryCode("IT");
-  ParsingContext kITContext(kIT, LanguageCode("it"), GetPatternSource());
+  ParsingContext kITContext(kIT, LanguageCode("it"), GetPatternFile());
   ApplyRationalizationEngineRules(kITContext, fields, nullptr);
 
   EXPECT_THAT(
diff --git a/components/autofill/core/browser/form_structure_rationalizer.cc b/components/autofill/core/browser/form_structure_rationalizer.cc
index f841457..3b29b46 100644
--- a/components/autofill/core/browser/form_structure_rationalizer.cc
+++ b/components/autofill/core/browser/form_structure_rationalizer.cc
@@ -1040,9 +1040,9 @@
     LogManager* log_manager) {
   ParsingContext context(client_country, language_code,
 #if BUILDFLAG(USE_INTERNAL_AUTOFILL_PATTERNS)
-                         PatternSource::kDefault,
+                         PatternFile::kDefault,
 #else
-                         PatternSource::kLegacy,
+                         PatternFile::kLegacy,
 #endif
                          GetActiveRegexFeatures());
 
diff --git a/components/autofill/core/browser/form_structure_test_api.h b/components/autofill/core/browser/form_structure_test_api.h
index 79cfa4b..9ead988 100644
--- a/components/autofill/core/browser/form_structure_test_api.h
+++ b/components/autofill/core/browser/form_structure_test_api.h
@@ -37,7 +37,7 @@
   // Set the heuristic and server types for each field. The `heuristic_types`
   // and `server_types` vectors must be aligned with the indices of the fields
   // in the form. For each field in `heuristic_types` there must be exactly one
-  // `GetActivePatternSource()` prediction and any number of alternative
+  // `GetActivePatternFile()` prediction and any number of alternative
   // predictions.
   void SetFieldTypes(
       const std::vector<std::vector<std::pair<HeuristicSource, FieldType>>>&
diff --git a/components/autofill/core/browser/heuristic_classification_unittests.cc b/components/autofill/core/browser/heuristic_classification_unittests.cc
index 183189a3..01d33e8 100644
--- a/components/autofill/core/browser/heuristic_classification_unittests.cc
+++ b/components/autofill/core/browser/heuristic_classification_unittests.cc
@@ -518,7 +518,7 @@
              "to execute these tests.";
     }
 #if !BUILDFLAG(USE_INTERNAL_AUTOFILL_PATTERNS)
-    ASSERT_NE(GetActiveHeuristicSource(), HeuristicSource::kLegacy)
+    ASSERT_NE(GetActiveHeuristicSource(), HeuristicSource::kLegacyRegexes)
         << "Internal tests are only supported with internal parsing patterns";
 #endif
     ASSERT_GE(TestTimeouts::test_launcher_timeout().InSeconds(), 100)
diff --git a/components/autofill/core/browser/heuristic_source.cc b/components/autofill/core/browser/heuristic_source.cc
index 106400c..02283853 100644
--- a/components/autofill/core/browser/heuristic_source.cc
+++ b/components/autofill/core/browser/heuristic_source.cc
@@ -19,25 +19,26 @@
     return HeuristicSource::kMachineLearning;
   }
 #if BUILDFLAG(USE_INTERNAL_AUTOFILL_PATTERNS)
-  return GetActiveRegexFeatures().empty() ? HeuristicSource::kDefault
-                                          : HeuristicSource::kExperimental;
+  return GetActiveRegexFeatures().empty()
+             ? HeuristicSource::kDefaultRegexes
+             : HeuristicSource::kExperimentalRegexes;
 #else
-  return HeuristicSource::kLegacy;
+  return HeuristicSource::kLegacyRegexes;
 #endif
 }
 
-std::optional<PatternSource> HeuristicSourceToPatternSource(
+std::optional<PatternFile> HeuristicSourceToPatternFile(
     HeuristicSource source) {
   switch (source) {
 #if !BUILDFLAG(USE_INTERNAL_AUTOFILL_PATTERNS)
-    case HeuristicSource::kLegacy:
-      return PatternSource::kLegacy;
+    case HeuristicSource::kLegacyRegexes:
+      return PatternFile::kLegacy;
 #else
-    case HeuristicSource::kDefault:
-    case HeuristicSource::kExperimental:
-      return PatternSource::kDefault;
-    case HeuristicSource::kPredictionImprovements:
-      return PatternSource::kPredictionImprovements;
+    case HeuristicSource::kDefaultRegexes:
+    case HeuristicSource::kExperimentalRegexes:
+      return PatternFile::kDefault;
+    case HeuristicSource::kPredictionImprovementRegexes:
+      return PatternFile::kPredictionImprovements;
 #endif
     case autofill::HeuristicSource::kMachineLearning:
       return std::nullopt;
diff --git a/components/autofill/core/browser/heuristic_source.h b/components/autofill/core/browser/heuristic_source.h
index 202d3cb..442142b7 100644
--- a/components/autofill/core/browser/heuristic_source.h
+++ b/components/autofill/core/browser/heuristic_source.h
@@ -11,25 +11,18 @@
 
 namespace autofill {
 
-// The different sets of heuristic sources that are available.
-// Local heuristics can either be regex or machine learning model.
+// The different ways to compute heuristic predictions.
 // At field level, heuristic predictions are associated to a HeuristicSource,
 // describing which mechanism computed them.
-// At parsing level, only the set of regexes used is relevant. There, the code
-// is parameterized by a PatternSource (a subset of HeuristicSource).
-// When adding a new value to PatternSource, add it to HeuristicSource
-// as well. When adding a new value to HeuristicSource, it's required to account
-// for it in `GetActiveHeuristicSource()`, `GetNonActiveHeuristicSources()`
-// and `HeuristicToPatternSource()`.
 enum class HeuristicSource {
-// Same values used in `PatternSource` with additional value
-// for the ML model.
 #if !BUILDFLAG(USE_INTERNAL_AUTOFILL_PATTERNS)
-  kLegacy,
+  kLegacyRegexes,
 #else
-  kDefault,
-  kExperimental,
-  kPredictionImprovements,
+  kDefaultRegexes,
+  // Corresponds to regexes from the default file, but with at least one
+  // `RegexFeature` enabled.
+  kExperimentalRegexes,
+  kPredictionImprovementRegexes,
 #endif
   kMachineLearning,
   kMaxValue = kMachineLearning
@@ -38,10 +31,9 @@
 // The active heuristic sources depend on the build config and Finch configs.
 HeuristicSource GetActiveHeuristicSource();
 
-// Converts a `HeuristicSource` to `PatternSource`. If the passed
-// source is not a `PatternSource` then a nullopt is returned.
-std::optional<PatternSource> HeuristicSourceToPatternSource(
-    HeuristicSource source);
+// Converts a `HeuristicSource` the corresponding `PatternFile`, in case the
+// `source` is using regexes. Otherwise, nullopt is returned.
+std::optional<PatternFile> HeuristicSourceToPatternFile(HeuristicSource source);
 
 }  // namespace autofill
 
diff --git a/components/autofill/core/browser/heuristic_source_unittest.cc b/components/autofill/core/browser/heuristic_source_unittest.cc
index 8afa0f6e..ff9a1d8 100644
--- a/components/autofill/core/browser/heuristic_source_unittest.cc
+++ b/components/autofill/core/browser/heuristic_source_unittest.cc
@@ -15,10 +15,9 @@
 // Depending on `kAutofillModelPredictions`, the active heuristic source will
 // differ.
 //
-// Currently, the available heuristic sources are the ML model and
-// the pattern sources. If the model predictions are disabled, then
-// only pattern sources are used. If model predictions are enabled,
-// `kMachineLearning` is also considered. Depending on
+// Currently, the available heuristic sources are the ML model and regexes.
+// If the model predictions are disabled, then only regexes are used. If model
+// predictions are enabled, `kMachineLearning` is also considered. Depending on
 // `kAutofillModelPredictionsAreActive`, use  `kMachineLearning`
 // as the active heuristic source.
 
@@ -65,7 +64,7 @@
 // instances.
 #if !BUILDFLAG(USE_INTERNAL_AUTOFILL_PATTERNS)
         HeuristicSourceParams{
-            .expected_active_source = HeuristicSource::kLegacy},
+            .expected_active_source = HeuristicSource::kLegacyRegexes},
 
         HeuristicSourceParams{
             .model_predictions_feature = true,
@@ -73,7 +72,7 @@
 
         HeuristicSourceParams{
             .model_predictions_feature = false,
-            .expected_active_source = HeuristicSource::kLegacy}
+            .expected_active_source = HeuristicSource::kLegacyRegexes}
 #else
         HeuristicSourceParams{
             .model_predictions_feature = true,
@@ -81,9 +80,9 @@
 
         HeuristicSourceParams{
             .model_predictions_feature = false,
-            .expected_active_source = HeuristicSource::kDefault},
+            .expected_active_source = HeuristicSource::kDefaultRegexes},
         HeuristicSourceParams{
-            .expected_active_source = HeuristicSource::kDefault}
+            .expected_active_source = HeuristicSource::kDefaultRegexes}
 #endif
         ));
 
diff --git a/components/autofill/core/browser/metrics/autofill_metrics.cc b/components/autofill/core/browser/metrics/autofill_metrics.cc
index 6330efe..4ccd9bc 100644
--- a/components/autofill/core/browser/metrics/autofill_metrics.cc
+++ b/components/autofill/core/browser/metrics/autofill_metrics.cc
@@ -2383,17 +2383,17 @@
             absl::get_if<HeuristicPredictionFieldLogEvent>(&log_event)) {
       switch (event->heuristic_source) {
 #if !BUILDFLAG(USE_INTERNAL_AUTOFILL_PATTERNS)
-        case HeuristicSource::kLegacy:
+        case HeuristicSource::kLegacyRegexes:
           heuristic_legacy_type = event->field_type;
           break;
 #else
-        case HeuristicSource::kDefault:
+        case HeuristicSource::kDefaultRegexes:
           heuristic_default_type = event->field_type;
           break;
-        case HeuristicSource::kExperimental:
+        case HeuristicSource::kExperimentalRegexes:
           heuristic_experimental_type = event->field_type;
           break;
-        case HeuristicSource::kPredictionImprovements:
+        case HeuristicSource::kPredictionImprovementRegexes:
           // Prediction improvements are currently ignored for Autofill based
           // UKM logging.
           break;
diff --git a/components/autofill/core/browser/metrics/shadow_prediction_metrics.cc b/components/autofill/core/browser/metrics/shadow_prediction_metrics.cc
index dc6d5be..c0a298c 100644
--- a/components/autofill/core/browser/metrics/shadow_prediction_metrics.cc
+++ b/components/autofill/core/browser/metrics/shadow_prediction_metrics.cc
@@ -43,7 +43,7 @@
 void LogRegexShadowPredictions(const AutofillField& field,
                                HeuristicSource active_source) {
 #if BUILDFLAG(USE_INTERNAL_AUTOFILL_PATTERNS)
-  if (active_source == HeuristicSource::kDefault) {
+  if (active_source == HeuristicSource::kDefaultRegexes) {
     base::UmaHistogramSparse(
         "Autofill.ShadowPredictions.DefaultHeuristicToDefaultServer",
         GetShadowPrediction(field.heuristic_type(), field.server_type(),
@@ -53,12 +53,12 @@
   // If the experimental source is active, emit shadow predictions against the
   // default patterns. `FormStructure::DetermineNonActiveHeuristicTypes()`
   // ensures that they were computed.
-  if (active_source == HeuristicSource::kExperimental) {
+  if (active_source == HeuristicSource::kExperimentalRegexes) {
     base::UmaHistogramSparse(
         "Autofill.ShadowPredictions.ExperimentalToDefault",
         GetShadowPrediction(
-            field.heuristic_type(HeuristicSource::kDefault),
-            field.heuristic_type(HeuristicSource::kExperimental),
+            field.heuristic_type(HeuristicSource::kDefaultRegexes),
+            field.heuristic_type(HeuristicSource::kExperimentalRegexes),
             field.possible_types()));
   }
 #endif
@@ -80,7 +80,7 @@
   base::UmaHistogramSparse(
       "Autofill.ShadowPredictions.DefaultPatternSourceToMLModel",
       GetShadowPrediction(
-          field.heuristic_type(HeuristicSource::kDefault),
+          field.heuristic_type(HeuristicSource::kDefaultRegexes),
           field.heuristic_type(HeuristicSource::kMachineLearning),
           submitted_types));
 #endif  // BUILDFLAG(USE_INTERNAL_AUTOFILL_PATTERNS)
diff --git a/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc b/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc
index d68f09a84..bc98a95 100644
--- a/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc
+++ b/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc
@@ -122,7 +122,7 @@
                                /*server_types=*/{NAME_FULL, EMAIL_ADDRESS});
 
   base::HistogramTester histogram_tester;
-  LogShadowPredictions(form, HeuristicSource::kDefault);
+  LogShadowPredictions(form, HeuristicSource::kDefaultRegexes);
 
   EXPECT_THAT(histogram_tester.GetAllSamples(
                   "Autofill.ShadowPredictions.ExperimentalToDefault"),
@@ -136,18 +136,18 @@
   FormStructure form(FormData{});
   test_api(form).PushField().set_possible_types({NAME_FULL});
   test_api(form).PushField().set_possible_types({EMAIL_ADDRESS});
-  test_api(form).SetFieldTypes(/*heuristic_types=*/
-                               {{{HeuristicSource::kDefault, NAME_FULL},
-                                 {HeuristicSource::kExperimental, NAME_FULL}},
-                                {{HeuristicSource::kDefault, SEARCH_TERM},
-                                 {HeuristicSource::kExperimental,
-                                  EMAIL_ADDRESS}}},
-                               {NAME_FULL, EMAIL_ADDRESS});
+  test_api(form)
+      .SetFieldTypes(/*heuristic_types=*/
+                     {{{HeuristicSource::kDefaultRegexes, NAME_FULL},
+                       {HeuristicSource::kExperimentalRegexes, NAME_FULL}},
+                      {{HeuristicSource::kDefaultRegexes, SEARCH_TERM},
+                       {HeuristicSource::kExperimentalRegexes, EMAIL_ADDRESS}}},
+                     {NAME_FULL, EMAIL_ADDRESS});
 
   base::HistogramTester histogram_tester;
   // Shadow predictions between default and experiment are only emitted if
   // experimental is active.
-  LogShadowPredictions(form, HeuristicSource::kExperimental);
+  LogShadowPredictions(form, HeuristicSource::kExperimentalRegexes);
 
   EXPECT_THAT(
       histogram_tester.GetAllSamples(
@@ -167,7 +167,7 @@
                                /*server_types=*/{NAME_FULL, EMAIL_ADDRESS});
 
   base::HistogramTester histogram_tester;
-  LogShadowPredictions(form, HeuristicSource::kDefault);
+  LogShadowPredictions(form, HeuristicSource::kDefaultRegexes);
 
   EXPECT_THAT(
       histogram_tester.GetAllSamples(
diff --git a/components/autofill/core/browser/mock_autofill_plus_address_delegate.h b/components/autofill/core/browser/mock_autofill_plus_address_delegate.h
index 0c728310..46bcb646 100644
--- a/components/autofill/core/browser/mock_autofill_plus_address_delegate.h
+++ b/components/autofill/core/browser/mock_autofill_plus_address_delegate.h
@@ -69,7 +69,9 @@
                size_t,
                UpdateSuggestionsCallback,
                HideSuggestionsCallback,
-               PlusAddressCallback),
+               PlusAddressCallback,
+               ShowAffiliationErrorDialogCallback,
+               ShowErrorDialogCallback),
               (override));
 };
 
diff --git a/components/autofill/core/browser/webdata/addresses/address_autofill_table.cc b/components/autofill/core/browser/webdata/addresses/address_autofill_table.cc
index e1b3240b..3baf43c 100644
--- a/components/autofill/core/browser/webdata/addresses/address_autofill_table.cc
+++ b/components/autofill/core/browser/webdata/addresses/address_autofill_table.cc
@@ -14,6 +14,7 @@
 
 #include "base/notreached.h"
 #include "base/strings/strcat.h"
+#include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/time/time.h"
 #include "base/uuid.h"
@@ -667,14 +668,14 @@
 }
 
 bool AddressAutofillTable::RemoveAllAutofillProfiles(
-    AutofillProfile::RecordType record_type) {
+    DenseSet<AutofillProfile::RecordType> record_types) {
   sql::Transaction transaction(db());
   std::vector<AutofillProfile> profiles;
   // TODO(crbug.com/40100455): Since the `kAddressTypeTokensTable` doesn't have
   // a `kRecordType` column, it's non-trivial to remove the correct entries from
   // that table. For simplicity, the current implementation fetches all profiles
   // to remove and removes them manually. Rewrite to a DELETE SQL query.
-  if (!GetAutofillProfiles(record_type, profiles)) {
+  if (!GetAutofillProfiles(record_types, profiles)) {
     return false;
   }
   return transaction.Begin() &&
@@ -722,18 +723,21 @@
 }
 
 bool AddressAutofillTable::GetAutofillProfiles(
-    std::optional<AutofillProfile::RecordType> record_type,
+    DenseSet<AutofillProfile::RecordType> record_types,
     std::vector<AutofillProfile>& profiles) const {
   profiles.clear();
 
   sql::Statement s;
-  if (record_type) {
-    SelectBuilder(db(), s, kAddressesTable, {kGuid},
-                  base::StrCat({"WHERE ", kRecordType, " = ?"}));
-    s.BindInt(0, static_cast<int>(*record_type));
-  } else {
-    SelectBuilder(db(), s, kAddressesTable, {kGuid});
+  const std::string placeholders =
+      base::JoinString(std::vector<std::string>(record_types.size(), "?"), ",");
+  SelectBuilder(
+      db(), s, kAddressesTable, {kGuid},
+      base::StrCat({"WHERE ", kRecordType, " IN (", placeholders, ")"}));
+  size_t index = 0;
+  for (AutofillProfile::RecordType record_type : record_types) {
+    s.BindInt(index++, static_cast<int>(record_type));
   }
+
   while (s.Step()) {
     std::string guid = s.ColumnString(0);
     std::optional<AutofillProfile> profile = GetAutofillProfile(guid);
diff --git a/components/autofill/core/browser/webdata/addresses/address_autofill_table.h b/components/autofill/core/browser/webdata/addresses/address_autofill_table.h
index 11023e6..1ec52bd 100644
--- a/components/autofill/core/browser/webdata/addresses/address_autofill_table.h
+++ b/components/autofill/core/browser/webdata/addresses/address_autofill_table.h
@@ -13,6 +13,7 @@
 #include <vector>
 
 #include "components/autofill/core/browser/data_model/autofill_profile.h"
+#include "components/autofill/core/common/dense_set.h"
 #include "components/webdata/common/web_database_table.h"
 
 class WebDatabase;
@@ -93,19 +94,18 @@
   // indicates where the profile was synced from.
   bool RemoveAutofillProfile(const std::string& guid);
 
-  // Removes all profiles from the given `record_type`.
-  bool RemoveAllAutofillProfiles(AutofillProfile::RecordType record_type);
+  // Removes all profiles of the given `record_types`.
+  bool RemoveAllAutofillProfiles(
+      DenseSet<AutofillProfile::RecordType> record_types);
 
   // Retrieves a profile with guid `guid`.
   std::optional<AutofillProfile> GetAutofillProfile(
       const std::string& guid) const;
 
   // Retrieves profiles in the database. They are returned in unspecified order.
-  // The `record_type` specifies if profiles from the legacy or the remote
-  // backend should be retrieved. If nullopt, all profiles are returned.
-  bool GetAutofillProfiles(
-      std::optional<AutofillProfile::RecordType> record_type,
-      std::vector<AutofillProfile>& profiles) const;
+  // `record_types` specifies which record types to consider.
+  bool GetAutofillProfiles(DenseSet<AutofillProfile::RecordType> record_types,
+                           std::vector<AutofillProfile>& profiles) const;
 
   // Table migration functions. NB: These do not and should not rely on other
   // functions in this class. The implementation of a function such as
diff --git a/components/autofill/core/browser/webdata/addresses/address_autofill_table_unittest.cc b/components/autofill/core/browser/webdata/addresses/address_autofill_table_unittest.cc
index dbe392e..e76c529 100644
--- a/components/autofill/core/browser/webdata/addresses/address_autofill_table_unittest.cc
+++ b/components/autofill/core/browser/webdata/addresses/address_autofill_table_unittest.cc
@@ -165,7 +165,7 @@
   // Remove the profile and expect that no profiles remain.
   EXPECT_TRUE(table_.RemoveAutofillProfile(home_profile.guid()));
   std::vector<AutofillProfile> profiles;
-  EXPECT_TRUE(table_.GetAutofillProfiles(record_type(), profiles));
+  EXPECT_TRUE(table_.GetAutofillProfiles({record_type()}, profiles));
   EXPECT_TRUE(profiles.empty());
 }
 
@@ -183,13 +183,13 @@
 
   std::vector<AutofillProfile> profiles;
   EXPECT_TRUE(table_.GetAutofillProfiles(
-      AutofillProfile::RecordType::kLocalOrSyncable, profiles));
+      {AutofillProfile::RecordType::kLocalOrSyncable}, profiles));
   EXPECT_THAT(profiles, UnorderedElementsAre(local_profile));
-  EXPECT_TRUE(table_.GetAutofillProfiles(AutofillProfile::RecordType::kAccount,
-                                         profiles));
+  EXPECT_TRUE(table_.GetAutofillProfiles(
+      {AutofillProfile::RecordType::kAccount}, profiles));
   EXPECT_THAT(profiles, UnorderedElementsAre(account_profile));
-  EXPECT_TRUE(
-      table_.GetAutofillProfiles(/*record_type=*/std::nullopt, profiles));
+  EXPECT_TRUE(table_.GetAutofillProfiles(
+      DenseSet<AutofillProfile::RecordType>::all(), profiles));
   EXPECT_THAT(profiles, UnorderedElementsAre(local_profile, account_profile));
 }
 
@@ -203,11 +203,11 @@
       AutofillProfile(AutofillProfile::RecordType::kAccount,
                       i18n_model_definition::kLegacyHierarchyCountryCode)));
 
-  EXPECT_TRUE(table_.RemoveAllAutofillProfiles(record_type()));
+  EXPECT_TRUE(table_.RemoveAllAutofillProfiles({record_type()}));
 
   // Expect that the profiles from `record_type()` are gone.
   std::vector<AutofillProfile> profiles;
-  ASSERT_TRUE(table_.GetAutofillProfiles(record_type(), profiles));
+  ASSERT_TRUE(table_.GetAutofillProfiles({record_type()}, profiles));
   EXPECT_TRUE(profiles.empty());
 
   // Expect that the profile from the opposite record_type remains.
@@ -215,7 +215,7 @@
       record_type() == AutofillProfile::RecordType::kAccount
           ? AutofillProfile::RecordType::kLocalOrSyncable
           : AutofillProfile::RecordType::kAccount;
-  ASSERT_TRUE(table_.GetAutofillProfiles(other_record_type, profiles));
+  ASSERT_TRUE(table_.GetAutofillProfiles({other_record_type}, profiles));
   EXPECT_EQ(profiles.size(), 1u);
 }
 
diff --git a/components/autofill/core/browser/webdata/addresses/autofill_profile_sync_bridge.cc b/components/autofill/core/browser/webdata/addresses/autofill_profile_sync_bridge.cc
index f8e8da7..216d372 100644
--- a/components/autofill/core/browser/webdata/addresses/autofill_profile_sync_bridge.cc
+++ b/components/autofill/core/browser/webdata/addresses/autofill_profile_sync_bridge.cc
@@ -166,7 +166,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   std::vector<AutofillProfile> entries;
   if (!GetAutofillTable()->GetAutofillProfiles(
-          AutofillProfile::RecordType::kLocalOrSyncable, entries)) {
+          {AutofillProfile::RecordType::kLocalOrSyncable}, entries)) {
     change_processor()->ReportError(
         {FROM_HERE, "Failed to load entries from table."});
     return nullptr;
@@ -190,7 +190,7 @@
 
   std::vector<AutofillProfile> entries;
   if (!GetAutofillTable()->GetAutofillProfiles(
-          AutofillProfile::RecordType::kLocalOrSyncable, entries)) {
+          {AutofillProfile::RecordType::kLocalOrSyncable}, entries)) {
     change_processor()->ReportError(
         {FROM_HERE, "Failed to load entries from table."});
     return nullptr;
diff --git a/components/autofill/core/browser/webdata/addresses/autofill_profile_sync_difference_tracker.cc b/components/autofill/core/browser/webdata/addresses/autofill_profile_sync_difference_tracker.cc
index d4d69440..e8b6cdcc 100644
--- a/components/autofill/core/browser/webdata/addresses/autofill_profile_sync_difference_tracker.cc
+++ b/components/autofill/core/browser/webdata/addresses/autofill_profile_sync_difference_tracker.cc
@@ -217,7 +217,7 @@
 
   std::vector<AutofillProfile> entries;
   if (!table_->GetAutofillProfiles(
-          AutofillProfile::RecordType::kLocalOrSyncable, entries)) {
+          {AutofillProfile::RecordType::kLocalOrSyncable}, entries)) {
     return false;
   }
 
diff --git a/components/autofill/core/browser/webdata/addresses/autofill_profile_sync_difference_tracker_unittest.cc b/components/autofill/core/browser/webdata/addresses/autofill_profile_sync_difference_tracker_unittest.cc
index 6654fad..8708e85 100644
--- a/components/autofill/core/browser/webdata/addresses/autofill_profile_sync_difference_tracker_unittest.cc
+++ b/components/autofill/core/browser/webdata/addresses/autofill_profile_sync_difference_tracker_unittest.cc
@@ -89,7 +89,7 @@
     std::vector<AutofillProfile> profiles;
     // Meant as an assertion but I cannot use ASSERT_TRUE in non-void function.
     EXPECT_TRUE(table()->GetAutofillProfiles(
-        AutofillProfile::RecordType::kLocalOrSyncable, profiles));
+        {AutofillProfile::RecordType::kLocalOrSyncable}, profiles));
     return profiles;
   }
 
diff --git a/components/autofill/core/browser/webdata/addresses/contact_info_sync_bridge.cc b/components/autofill/core/browser/webdata/addresses/contact_info_sync_bridge.cc
index 7bd12d4..d87e2e0 100644
--- a/components/autofill/core/browser/webdata/addresses/contact_info_sync_bridge.cc
+++ b/components/autofill/core/browser/webdata/addresses/contact_info_sync_bridge.cc
@@ -7,8 +7,10 @@
 #include "base/check.h"
 #include "base/ranges/algorithm.h"
 #include "base/uuid.h"
+#include "components/autofill/core/browser/data_model/autofill_profile.h"
 #include "components/autofill/core/browser/webdata/addresses/contact_info_sync_util.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
+#include "components/autofill/core/common/dense_set.h"
 #include "components/sync/base/data_type.h"
 #include "components/sync/base/deletion_origin.h"
 #include "components/sync/base/features.h"
@@ -23,6 +25,13 @@
 // The address of this variable is used as the user data key.
 static int kContactInfoSyncBridgeUserDataKey = 0;
 
+// Different types of account profiles exist, all of which are synced through
+// CONTACT_INFO.
+DenseSet<AutofillProfile::RecordType> kAccountRecordTypes = {
+    AutofillProfile::RecordType::kAccount,
+    AutofillProfile::RecordType::kAccountHome,
+    AutofillProfile::RecordType::kAccountWork};
+
 }  // namespace
 
 ContactInfoSyncBridge::ContactInfoSyncBridge(
@@ -208,8 +217,7 @@
 
 void ContactInfoSyncBridge::ApplyDisableSyncChanges(
     std::unique_ptr<syncer::MetadataChangeList> delete_metadata_change_list) {
-  if (!GetAutofillTable()->RemoveAllAutofillProfiles(
-          AutofillProfile::RecordType::kAccount)) {
+  if (!GetAutofillTable()->RemoveAllAutofillProfiles(kAccountRecordTypes)) {
     change_processor()->ReportError(
         {FROM_HERE, "Failed to delete profiles from table."});
   }
@@ -284,8 +292,7 @@
 ContactInfoSyncBridge::GetDataAndFilter(
     base::RepeatingCallback<bool(const std::string&)> filter) {
   std::vector<AutofillProfile> profiles;
-  if (!GetAutofillTable()->GetAutofillProfiles(
-          AutofillProfile::RecordType::kAccount, profiles)) {
+  if (!GetAutofillTable()->GetAutofillProfiles(kAccountRecordTypes, profiles)) {
     change_processor()->ReportError(
         {FROM_HERE, "Failed to load profiles from table."});
     return nullptr;
diff --git a/components/autofill/core/browser/webdata/addresses/contact_info_sync_bridge_unittest.cc b/components/autofill/core/browser/webdata/addresses/contact_info_sync_bridge_unittest.cc
index e3829483..8037fec2 100644
--- a/components/autofill/core/browser/webdata/addresses/contact_info_sync_bridge_unittest.cc
+++ b/components/autofill/core/browser/webdata/addresses/contact_info_sync_bridge_unittest.cc
@@ -119,7 +119,7 @@
   std::vector<AutofillProfile> GetAllDataFromTable() {
     std::vector<AutofillProfile> profiles;
     EXPECT_TRUE(table_.GetAutofillProfiles(
-        AutofillProfile::RecordType::kAccount, profiles));
+        {AutofillProfile::RecordType::kAccount}, profiles));
     return profiles;
   }
 
diff --git a/components/autofill/core/browser/webdata/addresses/contact_info_sync_util.cc b/components/autofill/core/browser/webdata/addresses/contact_info_sync_util.cc
index 7afcb04..5c973c1b 100644
--- a/components/autofill/core/browser/webdata/addresses/contact_info_sync_util.cc
+++ b/components/autofill/core/browser/webdata/addresses/contact_info_sync_util.cc
@@ -21,6 +21,33 @@
 
 using sync_pb::ContactInfoSpecifics;
 
+ContactInfoSpecifics::AddressType RecordTypeToAddressType(
+    AutofillProfile::RecordType record_type) {
+  switch (record_type) {
+    case AutofillProfile::RecordType::kLocalOrSyncable:
+      // Local profiles are not synced through CONTACT_INFO.
+      NOTREACHED();
+    case AutofillProfile::RecordType::kAccount:
+      return ContactInfoSpecifics::REGULAR;
+    case AutofillProfile::RecordType::kAccountHome:
+      return ContactInfoSpecifics::HOME;
+    case AutofillProfile::RecordType::kAccountWork:
+      return ContactInfoSpecifics::WORK;
+  }
+}
+
+AutofillProfile::RecordType AddressTypeToRecordType(
+    ContactInfoSpecifics::AddressType record_type) {
+  switch (record_type) {
+    case ContactInfoSpecifics::REGULAR:
+      return AutofillProfile::RecordType::kAccount;
+    case ContactInfoSpecifics::HOME:
+      return AutofillProfile::RecordType::kAccountHome;
+    case ContactInfoSpecifics::WORK:
+      return AutofillProfile::RecordType::kAccountWork;
+  }
+}
+
 // Converts the verification status representation used in AutofillProfile to
 // the one used in ContactInfoSpecifics.
 ContactInfoSpecifics::VerificationStatus
@@ -179,6 +206,7 @@
   sync_pb::ContactInfoSpecifics specifics = base_contact_info_specifics;
 
   specifics.set_guid(profile.guid());
+  specifics.set_address_type(RecordTypeToAddressType(profile.record_type()));
   specifics.set_use_count(profile.use_count());
   specifics.set_use_date_unix_epoch_seconds(
       (profile.use_date() - base::Time::UnixEpoch()).InSeconds());
@@ -305,7 +333,7 @@
       CountryNames::GetInstance()->GetCountryCode(country_name_or_code);
 
   AutofillProfile profile(specifics.guid(),
-                          AutofillProfile::RecordType::kAccount,
+                          AddressTypeToRecordType(specifics.address_type()),
                           AddressCountryCode(country_code));
 
   profile.set_use_count(specifics.use_count());
@@ -396,6 +424,7 @@
       sync_pb::ContactInfoSpecifics(contact_info_specifics);
 
   trimmed_specifics.clear_guid();
+  trimmed_specifics.clear_address_type();
   trimmed_specifics.clear_use_count();
   trimmed_specifics.clear_use_date_unix_epoch_seconds();
   if (base::FeatureList::IsEnabled(features::kAutofillTrackMultipleUseDates)) {
diff --git a/components/autofill/core/browser/webdata/addresses/contact_info_sync_util_unittest.cc b/components/autofill/core/browser/webdata/addresses/contact_info_sync_util_unittest.cc
index 16a8003..a7a7247 100644
--- a/components/autofill/core/browser/webdata/addresses/contact_info_sync_util_unittest.cc
+++ b/components/autofill/core/browser/webdata/addresses/contact_info_sync_util_unittest.cc
@@ -327,6 +327,7 @@
   ContactInfoSpecifics specifics;
 
   specifics.set_guid(kGuid);
+  specifics.set_address_type(ContactInfoSpecifics::REGULAR);
   specifics.set_use_count(123);
   specifics.set_use_date_unix_epoch_seconds(kUseDate.ToTimeT());
   specifics.set_use_date2_unix_epoch_seconds(kUseDate2.ToTimeT());
@@ -762,6 +763,27 @@
             nullptr);
 }
 
+// Tests that H/W record types are converted to
+// ContactInfoSpecifics::address_type correctly.
+TEST_F(ContactInfoSyncUtilTest,
+       CreateContactInfoEntityDataFromAutofillProfile_HWRecordTypes) {
+  AutofillProfile profile = ConstructBaseProfile();
+
+  test_api(profile).set_record_type(AutofillProfile::RecordType::kAccountHome);
+  EXPECT_EQ(CreateContactInfoEntityDataFromAutofillProfile(
+                profile, /*base_contact_info_specifics=*/{})
+                ->specifics.contact_info()
+                .address_type(),
+            ContactInfoSpecifics::HOME);
+
+  test_api(profile).set_record_type(AutofillProfile::RecordType::kAccountWork);
+  EXPECT_EQ(CreateContactInfoEntityDataFromAutofillProfile(
+                profile, /*base_contact_info_specifics=*/{})
+                ->specifics.contact_info()
+                .address_type(),
+            ContactInfoSpecifics::WORK);
+}
+
 // Test that supported fields and nested messages are successfully trimmed.
 TEST_F(ContactInfoSyncUtilTest, TrimAllSupportedFieldsFromRemoteSpecifics) {
   sync_pb::ContactInfoSpecifics contact_info_specifics;
@@ -852,6 +874,23 @@
       CreateAutofillProfileFromContactInfoSpecifics(specifics).has_value());
 }
 
+// Tests that H/W address types are converted to
+// AutofillProfile::RecordType correctly.
+TEST_F(ContactInfoSyncUtilTest,
+       CreateAutofillProfileFromContactInfoSpecifics_AddressTypes) {
+  ContactInfoSpecifics specifics = ConstructBaseSpecifics();
+
+  specifics.set_address_type(ContactInfoSpecifics::HOME);
+  EXPECT_EQ(
+      CreateAutofillProfileFromContactInfoSpecifics(specifics)->record_type(),
+      AutofillProfile::RecordType::kAccountHome);
+
+  specifics.set_address_type(ContactInfoSpecifics::WORK);
+  EXPECT_EQ(
+      CreateAutofillProfileFromContactInfoSpecifics(specifics)->record_type(),
+      AutofillProfile::RecordType::kAccountWork);
+}
+
 // Tests that if a token's `value` changes by external means, its observations
 // are reset.
 TEST_F(ContactInfoSyncUtilTest, ObservationResetting) {
diff --git a/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc b/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc
index dcc7c7b..8b7cc39 100644
--- a/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc
+++ b/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc
@@ -33,6 +33,7 @@
 #include "components/autofill/core/browser/webdata/autofill_webdata_service_observer.h"
 #include "components/autofill/core/browser/webdata/payments/payments_autofill_table.h"
 #include "components/autofill/core/common/autofill_clock.h"
+#include "components/autofill/core/common/dense_set.h"
 #include "components/autofill/core/common/form_field_data.h"
 #include "components/sync/base/data_type.h"
 #include "components/webdata/common/web_database_backend.h"
@@ -431,12 +432,11 @@
 }
 
 std::unique_ptr<WDTypedResult> AutofillWebDataBackendImpl::GetAutofillProfiles(
-    std::optional<AutofillProfile::RecordType> record_type,
     WebDatabase* db) {
   DCHECK(owning_task_runner()->RunsTasksInCurrentSequence());
   std::vector<AutofillProfile> profiles;
-  AddressAutofillTable::FromWebDatabase(db)->GetAutofillProfiles(record_type,
-                                                                 profiles);
+  AddressAutofillTable::FromWebDatabase(db)->GetAutofillProfiles(
+      DenseSet<AutofillProfile::RecordType>::all(), profiles);
   return std::make_unique<WDResult<std::vector<AutofillProfile>>>(
       AUTOFILL_PROFILES_RESULT, std::move(profiles));
 }
diff --git a/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.h b/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.h
index 84c40e9..b1c3a606 100644
--- a/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.h
+++ b/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.h
@@ -129,7 +129,6 @@
 
   // Returns the Autofill profiles from the web database.
   std::unique_ptr<WDTypedResult> GetAutofillProfiles(
-      std::optional<AutofillProfile::RecordType> record_type,
       WebDatabase* db);
 
   // Returns the number of values such that all for autofill entries with that
diff --git a/components/autofill/core/browser/webdata/autofill_webdata_service.cc b/components/autofill/core/browser/webdata/autofill_webdata_service.cc
index 7a85362..b7204445 100644
--- a/components/autofill/core/browser/webdata/autofill_webdata_service.cc
+++ b/components/autofill/core/browser/webdata/autofill_webdata_service.cc
@@ -113,12 +113,11 @@
 }
 
 WebDataServiceBase::Handle AutofillWebDataService::GetAutofillProfiles(
-    std::optional<AutofillProfile::RecordType> record_type,
     WebDataServiceConsumer* consumer) {
   return wdbs_->ScheduleDBTaskWithResult(
       FROM_HERE,
       base::BindOnce(&AutofillWebDataBackendImpl::GetAutofillProfiles,
-                     autofill_backend_, record_type),
+                     autofill_backend_),
       consumer);
 }
 
diff --git a/components/autofill/core/browser/webdata/autofill_webdata_service.h b/components/autofill/core/browser/webdata/autofill_webdata_service.h
index 1040cda..9ad8539 100644
--- a/components/autofill/core/browser/webdata/autofill_webdata_service.h
+++ b/components/autofill/core/browser/webdata/autofill_webdata_service.h
@@ -5,7 +5,6 @@
 #ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_WEBDATA_SERVICE_H_
 #define COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_WEBDATA_SERVICE_H_
 
-#include <optional>
 #include <string>
 #include <vector>
 
@@ -84,10 +83,7 @@
   // Initiates the request for Autofill profiles. The method
   // OnWebDataServiceRequestDone of |consumer| gets called when the request is
   // finished, with the profiles included in the argument |result|.
-  // TODO(crbug.com/40100455): Remove once browsing data removal doesn't depend
-  // on the webdata service directly anymore.
   WebDataServiceBase::Handle GetAutofillProfiles(
-      std::optional<AutofillProfile::RecordType> record_type,
       WebDataServiceConsumer* consumer);
 
   // Schedules a task to count the number of unique autofill values contained
diff --git a/components/autofill/core/browser/webdata/web_data_service_unittest.cc b/components/autofill/core/browser/webdata/web_data_service_unittest.cc
index 24a7879..27ab296 100644
--- a/components/autofill/core/browser/webdata/web_data_service_unittest.cc
+++ b/components/autofill/core/browser/webdata/web_data_service_unittest.cc
@@ -267,8 +267,7 @@
 
   // Check that it was added.
   AutofillWebDataServiceWaiter<std::vector<AutofillProfile>> consumer;
-  wds_->GetAutofillProfiles(AutofillProfile::RecordType::kLocalOrSyncable,
-                            &consumer);
+  wds_->GetAutofillProfiles(&consumer);
   EXPECT_THAT(consumer.result(), UnorderedElementsAre(profile));
 }
 
@@ -283,8 +282,7 @@
 
   // Check that it was added.
   AutofillWebDataServiceWaiter<std::vector<AutofillProfile>> consumer;
-  wds_->GetAutofillProfiles(AutofillProfile::RecordType::kLocalOrSyncable,
-                            &consumer);
+  wds_->GetAutofillProfiles(&consumer);
   EXPECT_THAT(consumer.result(), UnorderedElementsAre(profile));
 
   // Check that GUID-based notification was sent.
@@ -299,8 +297,7 @@
 
   // Check that it was removed.
   AutofillWebDataServiceWaiter<std::vector<AutofillProfile>> consumer2;
-  wds_->GetAutofillProfiles(AutofillProfile::RecordType::kLocalOrSyncable,
-                            &consumer2);
+  wds_->GetAutofillProfiles(&consumer2);
   ASSERT_TRUE(consumer2.result().empty());
 }
 
@@ -323,8 +320,7 @@
 
   // Check that they were added.
   AutofillWebDataServiceWaiter<std::vector<AutofillProfile>> consumer;
-  wds_->GetAutofillProfiles(AutofillProfile::RecordType::kLocalOrSyncable,
-                            &consumer);
+  wds_->GetAutofillProfiles(&consumer);
   EXPECT_THAT(consumer.result(), UnorderedElementsAre(profile1, profile2));
 
   AutofillProfile profile2_changed(profile2);
@@ -340,8 +336,7 @@
 
   // Check that the updates were made.
   AutofillWebDataServiceWaiter<std::vector<AutofillProfile>> consumer2;
-  wds_->GetAutofillProfiles(AutofillProfile::RecordType::kLocalOrSyncable,
-                            &consumer2);
+  wds_->GetAutofillProfiles(&consumer2);
   EXPECT_THAT(consumer2.result(),
               UnorderedElementsAre(profile1, profile2_changed));
 }
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc
index e57b2d5..b281520 100644
--- a/components/autofill/core/common/autofill_features.cc
+++ b/components/autofill/core/common/autofill_features.cc
@@ -213,7 +213,7 @@
 // Controls if Autofill executes the parser for the prediction improvements.
 // TODO(crbug.com/345170058) Remove once launched.
 BASE_FEATURE(kAutofillEnableImprovedPredictionParser,
-             "AutofilEnableImprovedPredictionParser",
+             "AutofillEnableImprovedPredictionParser",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
 // When enabled, the precedence is given to the field label over the name when
diff --git a/components/autofill/ios/browser/BUILD.gn b/components/autofill/ios/browser/BUILD.gn
index e187d5ee..3d0a790 100644
--- a/components/autofill/ios/browser/BUILD.gn
+++ b/components/autofill/ios/browser/BUILD.gn
@@ -94,6 +94,7 @@
 
   deps = [
     "//components/autofill/ios/form_util:fill_js_dependencies",
+    "//components/autofill/ios/form_util:fill_js_namespace",
     "//ios/web/public/js_messaging:frame_id",
     "//ios/web/public/js_messaging:gcrweb",
     "//ios/web/public/js_messaging:util_scripts",
diff --git a/components/autofill/ios/form_util/BUILD.gn b/components/autofill/ios/form_util/BUILD.gn
index 5367e47a9..b99f239 100644
--- a/components/autofill/ios/form_util/BUILD.gn
+++ b/components/autofill/ios/form_util/BUILD.gn
@@ -36,6 +36,7 @@
   ]
   deps = [
     ":autofill_form_features",
+    ":cross_content_world_util_feature",
     ":fill_js",
     ":form_js",
     "//base",
@@ -103,8 +104,6 @@
 
 compile_ts("fill_js_dependencies") {
   sources = [
-    "resources/create_fill_namespace.ts",
-    "resources/fill_constants.ts",
     "resources/fill_element_inference.ts",
     "resources/fill_element_inference_util.ts",
     "resources/fill_util.ts",
@@ -112,17 +111,29 @@
 
   deps = [
     ":autofill_form_features_ts",
+    ":fill_js_namespace",
     "//ios/web/public/js_messaging:gcrweb",
     "//ios/web/public/js_messaging:util_scripts",
   ]
 }
 
+compile_ts("fill_js_namespace") {
+  sources = [
+    "resources/create_fill_namespace.ts",
+    "resources/fill_constants.ts",
+  ]
+
+  deps = [ "//ios/web/public/js_messaging:gcrweb" ]
+}
+
 optimize_ts("fill_js") {
   sources = [ "resources/fill.ts" ]
 
   deps = [
     ":child_frame_registration_ts_lib",
     ":fill_js_dependencies",
+    ":fill_js_namespace",
+    "//ios/web/public/js_messaging:frame_id",
     "//ios/web/public/js_messaging:gcrweb",
   ]
 }
@@ -131,7 +142,7 @@
   sources = [ "resources/form.ts" ]
 
   deps = [
-    "//components/autofill/ios/form_util:fill_js_dependencies",
+    "//components/autofill/ios/form_util:fill_js_namespace",
     "//ios/web/public/js_messaging:gcrweb",
     "//ios/web/public/js_messaging:util_scripts",
   ]
@@ -146,6 +157,30 @@
   ]
 }
 
+source_set("cross_content_world_util_feature") {
+  sources = [
+    "cross_content_world_util_java_script_feature.h",
+    "cross_content_world_util_java_script_feature.mm",
+  ]
+
+  deps = [
+    ":cross_content_world_js",
+    "//base",
+    "//ios/web/public/js_messaging",
+    "//ios/web/public/js_messaging:content_world_header",
+  ]
+  configs += [ "//build/config/compiler:wexit_time_destructors" ]
+}
+
+optimize_ts("cross_content_world_js") {
+  sources = [ "resources/cross_content_world_fill_util.ts" ]
+
+  deps = [
+    ":fill_js_namespace",
+    "//ios/web/public/js_messaging:gcrweb",
+  ]
+}
+
 source_set("test_support") {
   testonly = true
   sources = [
diff --git a/components/autofill/ios/form_util/cross_content_world_util_java_script_feature.h b/components/autofill/ios/form_util/cross_content_world_util_java_script_feature.h
new file mode 100644
index 0000000..7de0210
--- /dev/null
+++ b/components/autofill/ios/form_util/cross_content_world_util_java_script_feature.h
@@ -0,0 +1,35 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_AUTOFILL_IOS_FORM_UTIL_CROSS_CONTENT_WORLD_UTIL_JAVA_SCRIPT_FEATURE_H_
+#define COMPONENTS_AUTOFILL_IOS_FORM_UTIL_CROSS_CONTENT_WORLD_UTIL_JAVA_SCRIPT_FEATURE_H_
+
+#import "base/no_destructor.h"
+#import "ios/web/public/js_messaging/java_script_feature.h"
+
+namespace autofill {
+
+// Injects Autofill utils that need to live both in the page and the isolated
+// content world.
+class CrossContentWorldUtilJavaScriptFeature : public web::JavaScriptFeature {
+ public:
+  // This feature holds no state, so only a single static instance is ever
+  // needed.
+  static CrossContentWorldUtilJavaScriptFeature* GetInstance();
+
+ private:
+  friend class base::NoDestructor<CrossContentWorldUtilJavaScriptFeature>;
+
+  CrossContentWorldUtilJavaScriptFeature();
+  ~CrossContentWorldUtilJavaScriptFeature() override;
+
+  CrossContentWorldUtilJavaScriptFeature(
+      const CrossContentWorldUtilJavaScriptFeature&) = delete;
+  CrossContentWorldUtilJavaScriptFeature& operator=(
+      const CrossContentWorldUtilJavaScriptFeature&) = delete;
+};
+
+}  // namespace autofill
+
+#endif  // COMPONENTS_AUTOFILL_IOS_FORM_UTIL_CROSS_CONTENT_WORLD_UTIL_JAVA_SCRIPT_FEATURE_H_
diff --git a/components/autofill/ios/form_util/cross_content_world_util_java_script_feature.mm b/components/autofill/ios/form_util/cross_content_world_util_java_script_feature.mm
new file mode 100644
index 0000000..1b35d3c
--- /dev/null
+++ b/components/autofill/ios/form_util/cross_content_world_util_java_script_feature.mm
@@ -0,0 +1,38 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "components/autofill/ios/form_util/cross_content_world_util_java_script_feature.h"
+
+#import "ios/web/public/js_messaging/content_world.h"
+#import "ios/web/public/js_messaging/java_script_feature_util.h"
+
+namespace {
+
+const char kFillScriptName[] = "cross_content_world_fill_util";
+
+}
+
+namespace autofill {
+
+// static
+CrossContentWorldUtilJavaScriptFeature*
+CrossContentWorldUtilJavaScriptFeature::GetInstance() {
+  static base::NoDestructor<CrossContentWorldUtilJavaScriptFeature> instance;
+  return instance.get();
+}
+
+CrossContentWorldUtilJavaScriptFeature::CrossContentWorldUtilJavaScriptFeature()
+    : web::JavaScriptFeature(
+          web::ContentWorld::kAllContentWorlds,
+          {FeatureScript::CreateWithFilename(
+              kFillScriptName,
+              FeatureScript::InjectionTime::kDocumentStart,
+              FeatureScript::TargetFrames::kAllFrames,
+              FeatureScript::ReinjectionBehavior::kInjectOncePerWindow)},
+          {web::java_script_features::GetBaseJavaScriptFeature()}) {}
+
+CrossContentWorldUtilJavaScriptFeature::
+    ~CrossContentWorldUtilJavaScriptFeature() = default;
+
+}  // namespace autofill
diff --git a/components/autofill/ios/form_util/form_util_java_script_feature.mm b/components/autofill/ios/form_util/form_util_java_script_feature.mm
index b919566..617698e 100644
--- a/components/autofill/ios/form_util/form_util_java_script_feature.mm
+++ b/components/autofill/ios/form_util/form_util_java_script_feature.mm
@@ -7,6 +7,7 @@
 #include "base/no_destructor.h"
 #include "base/values.h"
 #import "components/autofill/ios/common/javascript_feature_util.h"
+#import "components/autofill/ios/form_util/cross_content_world_util_java_script_feature.h"
 #import "ios/web/public/js_messaging/java_script_feature_util.h"
 
 namespace {
@@ -41,8 +42,11 @@
                FeatureScript::InjectionTime::kDocumentStart,
                FeatureScript::TargetFrames::kAllFrames,
                FeatureScript::ReinjectionBehavior::kInjectOncePerWindow)},
-          {web::java_script_features::GetCommonJavaScriptFeature(),
-           web::java_script_features::GetMessageJavaScriptFeature()}) {}
+          {
+              web::java_script_features::GetCommonJavaScriptFeature(),
+              web::java_script_features::GetMessageJavaScriptFeature(),
+              CrossContentWorldUtilJavaScriptFeature::GetInstance(),
+          }) {}
 
 FormUtilJavaScriptFeature::~FormUtilJavaScriptFeature() = default;
 
diff --git a/components/autofill/ios/form_util/resources/create_fill_namespace.ts b/components/autofill/ios/form_util/resources/create_fill_namespace.ts
index 48d0601..24ac6dc 100644
--- a/components/autofill/ios/form_util/resources/create_fill_namespace.ts
+++ b/components/autofill/ios/form_util/resources/create_fill_namespace.ts
@@ -4,14 +4,34 @@
 
 import {gCrWeb} from '//ios/web/public/js_messaging/resources/gcrweb.js';
 
-/**
- * Namespace for this file. It depends on |gCrWeb| having already been
- * injected. String 'fill' is used in |gCrWeb['fill']| as it needs to be
- * accessed in Objective-C code.
- */
-gCrWeb.fill = {};
+// Add type extensions needed for other scripts defining the fill namespace.
+declare global {
+  // Defines an additional property, `angular`, on the Window object.
+  // The code below assumes that this property exists within the object.
+  interface Window {
+    angular: any;
+  }
 
-// Store fill namespace object in a global __gCrWeb object referenced by a
-// string, so it does not get renamed by closure compiler during the
-// minification.
-gCrWeb['fill'] = gCrWeb.fill;
+  // Extends the Document object to add the ability to access its
+  // properties via the [] notation and defines a property that is
+  // assumed to exist within the object.
+  interface Document {
+    [key: symbol]: number;
+
+    __gCrWebURLNormalizer: HTMLAnchorElement;
+  }
+}
+
+if (!gCrWeb.fill) {
+  /**
+   * Namespace for this file. It depends on |gCrWeb| having already been
+   * injected. String 'fill' is used in |gCrWeb['fill']| as it needs to be
+   * accessed in Objective-C code.
+   */
+  gCrWeb.fill = {};
+
+  // Store fill namespace object in a global __gCrWeb object referenced by a
+  // string, so it does not get renamed by closure compiler during the
+  // minification.
+  gCrWeb['fill'] = gCrWeb.fill;
+}
diff --git a/components/autofill/ios/form_util/resources/cross_content_world_fill_util.ts b/components/autofill/ios/form_util/resources/cross_content_world_fill_util.ts
new file mode 100644
index 0000000..5b5163a
--- /dev/null
+++ b/components/autofill/ios/form_util/resources/cross_content_world_fill_util.ts
@@ -0,0 +1,39 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview Adds functions to the fill namespace that need to be injected
+ * both in the page and isolated content worlds.
+ */
+
+import '//components/autofill/ios/form_util/resources/create_fill_namespace.js';
+
+import * as fillConstants from '//components/autofill/ios/form_util/resources/fill_constants.js';
+import {gCrWeb} from '//ios/web/public/js_messaging/resources/gcrweb.js';
+
+
+/**
+ * @param element Form or form input element.
+ * @return Unique stable ID converted to string..
+ */
+gCrWeb.fill.getUniqueID = function(element: any): string {
+  // `setUniqueIDIfNeeded` is only available in the isolated content world.
+  // Check before invoking it as this script is injected into the page content
+  // world as well.
+  if (gCrWeb.fill.setUniqueIDIfNeeded) {
+    gCrWeb.fill.setUniqueIDIfNeeded(element);
+  }
+
+  try {
+    const uniqueID = gCrWeb.fill.ID_SYMBOL;
+    if (typeof element[uniqueID] !== 'undefined' &&
+        !isNaN(element[uniqueID]!)) {
+      return element[uniqueID].toString();
+    } else {
+      return fillConstants.RENDERER_ID_NOT_SET;
+    }
+  } catch (e) {
+    return fillConstants.RENDERER_ID_NOT_SET;
+  }
+};
diff --git a/components/autofill/ios/form_util/resources/fill.ts b/components/autofill/ios/form_util/resources/fill.ts
index 65873d7..d648d1a 100644
--- a/components/autofill/ios/form_util/resources/fill.ts
+++ b/components/autofill/ios/form_util/resources/fill.ts
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import '//components/autofill/ios/form_util/resources/create_fill_namespace.js';
 import '//components/autofill/ios/form_util/resources/fill_util.js';
 
 import {registerChildFrame} from '//components/autofill/ios/form_util/resources/child_frame_registration_lib.js';
diff --git a/components/autofill/ios/form_util/resources/fill_util.ts b/components/autofill/ios/form_util/resources/fill_util.ts
index 9b519e2..39feffa 100644
--- a/components/autofill/ios/form_util/resources/fill_util.ts
+++ b/components/autofill/ios/form_util/resources/fill_util.ts
@@ -2,32 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import '//components/autofill/ios/form_util/resources/create_fill_namespace.js';
+
 import * as fillConstants from '//components/autofill/ios/form_util/resources/fill_constants.js';
 import {findChildText} from '//components/autofill/ios/form_util/resources/fill_element_inference_util.js';
 import {gCrWeb} from '//ios/web/public/js_messaging/resources/gcrweb.js';
 import {trim} from '//ios/web/public/js_messaging/resources/utils.js';
 
-declare global {
-    // Defines an additional property, `angular`, on the Window object.
-    // The code below assumes that this property exists within the object.
-    interface Window {
-        angular: any;
-    }
-
-    // Extends the Document object to add the ability to access its
-    // properties via the [] notation and defines a property that is
-    // assumed to exist within the object.
-    interface Document {
-      [key: symbol]: number;
-
-      __gCrWebURLNormalizer: HTMLAnchorElement;
-    }
-}
-
 // Extends the Element to add the ability to access its properties
 // via the [] notation.
 declare interface IndexableElement extends Element {
-    [key: symbol]: number;
+  [key: symbol]: number;
 }
 
 declare interface AutofillFormFieldData {
@@ -690,7 +675,7 @@
 /**
  * @param element Form or form input element.
  */
-function setUniqueIDIfNeeded(element: IndexableElement): void {
+gCrWeb.fill.setUniqueIDIfNeeded = function(element: IndexableElement): void {
   try {
     const uniqueID = gCrWeb.fill.ID_SYMBOL;
     if (typeof element[uniqueID] === 'undefined') {
@@ -702,25 +687,6 @@
     }
   } catch (e) {
   }
-}
-
-/**
- * @param element Form or form input element.
- * @return Unique stable ID converted to string..
- */
-gCrWeb.fill.getUniqueID = function(element: any): string {
-  setUniqueIDIfNeeded(element);
-  try {
-    const uniqueID = gCrWeb.fill.ID_SYMBOL;
-    if (typeof element[uniqueID]! !== 'undefined' &&
-        !isNaN(element[uniqueID]!)) {
-      return element[uniqueID].toString();
-    } else {
-      return fillConstants.RENDERER_ID_NOT_SET;
-    }
-  } catch (e) {
-    return fillConstants.RENDERER_ID_NOT_SET;
-  }
 };
 
 /**
diff --git a/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager.cc b/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager.cc
index 2c7f3a53..2d64363 100644
--- a/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager.cc
+++ b/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager.cc
@@ -75,6 +75,16 @@
   return {loading_suggestion};
 }
 
+// Creates a suggestion shown when retrieving prediction improvements wasn't
+// successful.
+std::vector<autofill::Suggestion> CreateErrorSuggestion() {
+  // TODO(crbug.com/361434879): Add hardcoded string to an appropriate grd file.
+  autofill::Suggestion error_suggestion(
+      u"Error", autofill::SuggestionType::kAutocompleteEntry);
+  error_suggestion.is_acceptable = false;
+  return {error_suggestion};
+}
+
 }  // namespace
 
 AutofillPredictionImprovementsManager::AutofillPredictionImprovementsManager(
@@ -106,6 +116,19 @@
 
   autofill::Suggestion suggestion(
       predicted_value, autofill::SuggestionType::kFillPredictionImprovements);
+  auto payload = autofill::Suggestion::PredictionImprovementsPayload(
+      GetValuesToFill(), GetFieldTypesToFill(), kIgnoreableSkipReasons);
+  // Add a `kFillPredictionImprovements` suggestion with a separator to
+  // `suggestion.children` before the field-by-field filling entries.
+  {
+    // TODO(crbug.com/361434879): Add hardcoded string to an appropriate grd
+    // file.
+    autofill::Suggestion fill_all_child(
+        u"Fill all", autofill::SuggestionType::kFillPredictionImprovements);
+    fill_all_child.payload = payload;
+    suggestion.children.emplace_back(fill_all_child);
+    suggestion.children.emplace_back(autofill::SuggestionType::kSeparator);
+  }
   // Add the child suggestion for the triggering field on top.
   suggestion.children.emplace_back(
       CreateChildSuggestionForFilling(*filled_field));
@@ -126,9 +149,11 @@
     // file.
     suggestion.labels.back().emplace_back(u"& more");
   }
-  suggestion.payload = autofill::Suggestion::PredictionImprovementsPayload(
-      GetValuesToFill(), GetFieldTypesToFill(), kIgnoreableSkipReasons);
-  return {suggestion};
+  autofill::Suggestion feedback_suggestion(
+      autofill::SuggestionType::kPredictionImprovementsFeedback);
+  feedback_suggestion.is_acceptable = false;
+  suggestion.payload = payload;
+  return {suggestion, feedback_suggestion};
 }
 
 std::vector<autofill::Suggestion>
@@ -200,9 +225,7 @@
         const autofill::FormData& form,
         const autofill::FormFieldData& trigger_field) {
   if (!ShouldProvidePredictionImprovements(client_->GetLastCommittedURL())) {
-    // TODO(crbug.com/359440030): Add error handling (could not extract improved
-    // predictions).
-    UpdateSuggestions(/*suggestions=*/{});
+    UpdateSuggestions(CreateErrorSuggestion());
     return;
   }
   client_->GetAXTree(
@@ -226,8 +249,7 @@
     const autofill::FormFieldData& trigger_field,
     base::expected<autofill::FormData, bool> improved_predictions) {
   if (!improved_predictions.has_value()) {
-    // TODO(crbug.com/359440030): Add error handling.
-    UpdateSuggestions(/*suggestions=*/{});
+    UpdateSuggestions(CreateErrorSuggestion());
     return;
   }
 
diff --git a/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager_unittest.cc b/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager_unittest.cc
index 9ae5b69..2edd915d2 100644
--- a/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager_unittest.cc
+++ b/components/autofill_prediction_improvements/core/browser/autofill_prediction_improvements_manager_unittest.cc
@@ -19,6 +19,8 @@
 namespace autofill_prediction_improvements {
 namespace {
 
+using ::autofill::Suggestion;
+using ::autofill::SuggestionType;
 using ::testing::_;
 using ::testing::ElementsAre;
 using ::testing::Eq;
@@ -30,6 +32,11 @@
 using ::testing::ReturnRef;
 using ::testing::SaveArg;
 
+MATCHER_P(HasType, expected_type, "") {
+  EXPECT_THAT(arg, Field(&Suggestion::type, Eq(expected_type)));
+  return true;
+}
+
 class MockAutofillPredictionImprovementsClient
     : public AutofillPredictionImprovementsClient {
  public:
@@ -139,8 +146,8 @@
   base::MockCallback<autofill::AutofillPredictionImprovementsDelegate::
                          UpdateSuggestionsCallback>
       update_suggestions_callback;
-  std::vector<autofill::Suggestion> loading_suggestion;
-  std::vector<autofill::Suggestion> filling_suggestion;
+  std::vector<Suggestion> loading_suggestion;
+  std::vector<Suggestion> filling_suggestion;
 
   {
     InSequence s;
@@ -159,29 +166,32 @@
   std::move(axtree_received_callback).Run({});
   std::move(predictions_received_callback).Run(filled_form);
 
-  EXPECT_THAT(
-      loading_suggestion,
-      ElementsAre(Field(
-          &autofill::Suggestion::type,
-          Eq(autofill::SuggestionType::kPredictionImprovementsLoadingState))));
-  ASSERT_THAT(filling_suggestion,
-              ElementsAre(Field(
-                  &autofill::Suggestion::type,
-                  Eq(autofill::SuggestionType::kFillPredictionImprovements))));
-  autofill::Suggestion::PredictionImprovementsPayload filling_payload =
+  EXPECT_THAT(loading_suggestion,
+              ElementsAre(HasType(
+                  SuggestionType::kPredictionImprovementsLoadingState)));
+  ASSERT_THAT(
+      filling_suggestion,
+      ElementsAre(HasType(SuggestionType::kFillPredictionImprovements),
+                  HasType(SuggestionType::kPredictionImprovementsFeedback)));
+  const Suggestion::PredictionImprovementsPayload filling_payload =
       filling_suggestion[0]
-          .GetPayload<autofill::Suggestion::PredictionImprovementsPayload>();
+          .GetPayload<Suggestion::PredictionImprovementsPayload>();
   const autofill::FormFieldData& filled_field = filled_form.fields().front();
   EXPECT_THAT(
       filling_payload.values_to_fill,
       ElementsAre(Pair(filled_field.global_id(), filled_field.value())));
+  EXPECT_THAT(
+      filling_suggestion[0].children,
+      ElementsAre(HasType(SuggestionType::kFillPredictionImprovements),
+                  HasType(SuggestionType::kSeparator),
+                  HasType(SuggestionType::kFillPredictionImprovements)));
 }
 
 // Tests that no suggestions are added to `address_suggestions` if
 // `should_add_trigger_suggestion` is `false`.
 TEST_F(AutofillPredictionImprovementsManagerTest,
        MaybeUpdateSuggestionsDoesNotUpdateIfItShouldNot) {
-  std::vector<autofill::Suggestion> address_suggestions;
+  std::vector<Suggestion> address_suggestions;
   autofill::FormFieldData field;
   EXPECT_FALSE(manager_->MaybeUpdateSuggestions(
       address_suggestions, field, /*should_add_trigger_suggestion=*/false));
@@ -192,15 +202,13 @@
 // `MaybeUpdateSuggestions()`.
 TEST_F(AutofillPredictionImprovementsManagerTest,
        MaybeUpdateSuggestionsOnEmptyAddressSuggestionsAddsTriggerSuggestion) {
-  std::vector<autofill::Suggestion> address_suggestions;
+  std::vector<Suggestion> address_suggestions;
   autofill::FormFieldData field;
   EXPECT_TRUE(manager_->MaybeUpdateSuggestions(
       address_suggestions, field, /*should_add_trigger_suggestion=*/true));
   EXPECT_THAT(
       address_suggestions,
-      ElementsAre(Field(
-          &autofill::Suggestion::type,
-          Eq(autofill::SuggestionType::kRetrievePredictionImprovements))));
+      ElementsAre(HasType(SuggestionType::kRetrievePredictionImprovements)));
 }
 
 // Tests that `address_suggestions` contains the
@@ -211,29 +219,22 @@
 TEST_F(
     AutofillPredictionImprovementsManagerTest,
     MaybeUpdateSuggestionsOnAddressSuggestionsIncludingUndoOrClearAddsTriggerSuggestion) {
-  std::vector<autofill::Suggestion> address_suggestions = {
-      autofill::Suggestion(autofill::SuggestionType::kAddressEntry),
-      autofill::Suggestion(autofill::SuggestionType::kSeparator),
-      autofill::Suggestion(autofill::SuggestionType::kUndoOrClear),
-      autofill::Suggestion(autofill::SuggestionType::kManageAddress)};
+  std::vector<Suggestion> address_suggestions = {
+      Suggestion(SuggestionType::kAddressEntry),
+      Suggestion(SuggestionType::kSeparator),
+      Suggestion(SuggestionType::kUndoOrClear),
+      Suggestion(SuggestionType::kManageAddress)};
   autofill::FormFieldData field;
   EXPECT_TRUE(manager_->MaybeUpdateSuggestions(
       address_suggestions, field, /*should_add_trigger_suggestion=*/true));
   EXPECT_THAT(
       address_suggestions,
-      ElementsAre(
-          Field(&autofill::Suggestion::type,
-                Eq(autofill::SuggestionType::kAddressEntry)),
-          Field(&autofill::Suggestion::type,
-                Eq(autofill::SuggestionType::kSeparator)),
-          Field(&autofill::Suggestion::type,
-                Eq(autofill::SuggestionType::kRetrievePredictionImprovements)),
-          Field(&autofill::Suggestion::type,
-                Eq(autofill::SuggestionType::kSeparator)),
-          Field(&autofill::Suggestion::type,
-                Eq(autofill::SuggestionType::kUndoOrClear)),
-          Field(&autofill::Suggestion::type,
-                Eq(autofill::SuggestionType::kManageAddress))));
+      ElementsAre(HasType(SuggestionType::kAddressEntry),
+                  HasType(SuggestionType::kSeparator),
+                  HasType(SuggestionType::kRetrievePredictionImprovements),
+                  HasType(SuggestionType::kSeparator),
+                  HasType(SuggestionType::kUndoOrClear),
+                  HasType(SuggestionType::kManageAddress)));
 }
 
 // Tests that `address_suggestions` contains the
@@ -244,26 +245,20 @@
 // autofilled.
 TEST_F(AutofillPredictionImprovementsManagerTest,
        MaybeUpdateSuggestionsOnAddressSuggestionsAddsTriggerSuggestion) {
-  std::vector<autofill::Suggestion> address_suggestions = {
-      autofill::Suggestion(autofill::SuggestionType::kAddressEntry),
-      autofill::Suggestion(autofill::SuggestionType::kSeparator),
-      autofill::Suggestion(autofill::SuggestionType::kManageAddress)};
+  std::vector<Suggestion> address_suggestions = {
+      Suggestion(SuggestionType::kAddressEntry),
+      Suggestion(SuggestionType::kSeparator),
+      Suggestion(SuggestionType::kManageAddress)};
   autofill::FormFieldData field;
   EXPECT_TRUE(manager_->MaybeUpdateSuggestions(
       address_suggestions, field, /*should_add_trigger_suggestion=*/true));
   EXPECT_THAT(
       address_suggestions,
-      ElementsAre(
-          Field(&autofill::Suggestion::type,
-                Eq(autofill::SuggestionType::kAddressEntry)),
-          Field(&autofill::Suggestion::type,
-                Eq(autofill::SuggestionType::kSeparator)),
-          Field(&autofill::Suggestion::type,
-                Eq(autofill::SuggestionType::kRetrievePredictionImprovements)),
-          Field(&autofill::Suggestion::type,
-                Eq(autofill::SuggestionType::kSeparator)),
-          Field(&autofill::Suggestion::type,
-                Eq(autofill::SuggestionType::kManageAddress))));
+      ElementsAre(HasType(SuggestionType::kAddressEntry),
+                  HasType(SuggestionType::kSeparator),
+                  HasType(SuggestionType::kRetrievePredictionImprovements),
+                  HasType(SuggestionType::kSeparator),
+                  HasType(SuggestionType::kManageAddress)));
 }
 
 class ShouldProvideAutofillPredictionImprovementsTest
@@ -285,10 +280,28 @@
        DoesNotExtractImprovedPredictionsIfFlagDisabled) {
   feature_.InitAndDisableFeature(kAutofillPredictionImprovements);
   AutofillPredictionImprovementsManager manager{&client_, &decider_};
+  base::MockCallback<autofill::AutofillPredictionImprovementsDelegate::
+                         UpdateSuggestionsCallback>
+      update_suggestions_callback;
+  std::vector<Suggestion> loading_suggestion;
+  std::vector<Suggestion> error_suggestion;
   EXPECT_CALL(client_, GetAXTree).Times(0);
-  manager.OnClickedTriggerSuggestion(
-      form_, form_.fields().front(),
-      /*update_suggestions_callback=*/base::DoNothing());
+  {
+    InSequence s;
+    EXPECT_CALL(update_suggestions_callback, Run)
+        .WillOnce(SaveArg<0>(&loading_suggestion));
+    EXPECT_CALL(update_suggestions_callback, Run)
+        .WillOnce(SaveArg<0>(&error_suggestion));
+  }
+
+  manager.OnClickedTriggerSuggestion(form_, form_.fields().front(),
+                                     update_suggestions_callback.Get());
+
+  EXPECT_THAT(loading_suggestion,
+              ElementsAre(HasType(
+                  SuggestionType::kPredictionImprovementsLoadingState)));
+  EXPECT_THAT(error_suggestion,
+              ElementsAre(HasType(SuggestionType::kAutocompleteEntry)));
 }
 
 TEST_F(ShouldProvideAutofillPredictionImprovementsTest,
@@ -296,10 +309,28 @@
   feature_.InitAndEnableFeatureWithParameters(kAutofillPredictionImprovements,
                                               {{"skip_allowlist", "true"}});
   AutofillPredictionImprovementsManager manager{&client_, nullptr};
+  base::MockCallback<autofill::AutofillPredictionImprovementsDelegate::
+                         UpdateSuggestionsCallback>
+      update_suggestions_callback;
+  std::vector<Suggestion> loading_suggestion;
+  std::vector<Suggestion> error_suggestion;
   EXPECT_CALL(client_, GetAXTree).Times(0);
-  manager.OnClickedTriggerSuggestion(
-      form_, form_.fields().front(),
-      /*update_suggestions_callback=*/base::DoNothing());
+  {
+    InSequence s;
+    EXPECT_CALL(update_suggestions_callback, Run)
+        .WillOnce(SaveArg<0>(&loading_suggestion));
+    EXPECT_CALL(update_suggestions_callback, Run)
+        .WillOnce(SaveArg<0>(&error_suggestion));
+  }
+
+  manager.OnClickedTriggerSuggestion(form_, form_.fields().front(),
+                                     update_suggestions_callback.Get());
+
+  EXPECT_THAT(loading_suggestion,
+              ElementsAre(HasType(
+                  SuggestionType::kPredictionImprovementsLoadingState)));
+  EXPECT_THAT(error_suggestion,
+              ElementsAre(HasType(SuggestionType::kAutocompleteEntry)));
 }
 
 TEST_F(ShouldProvideAutofillPredictionImprovementsTest,
@@ -307,10 +338,20 @@
   feature_.InitAndEnableFeatureWithParameters(kAutofillPredictionImprovements,
                                               {{"skip_allowlist", "true"}});
   AutofillPredictionImprovementsManager manager{&client_, &decider_};
+  base::MockCallback<autofill::AutofillPredictionImprovementsDelegate::
+                         UpdateSuggestionsCallback>
+      update_suggestions_callback;
+  std::vector<Suggestion> loading_suggestion;
   EXPECT_CALL(client_, GetAXTree);
-  manager.OnClickedTriggerSuggestion(
-      form_, form_.fields().front(),
-      /*update_suggestions_callback=*/base::DoNothing());
+  EXPECT_CALL(update_suggestions_callback, Run)
+      .WillOnce(SaveArg<0>(&loading_suggestion));
+
+  manager.OnClickedTriggerSuggestion(form_, form_.fields().front(),
+                                     update_suggestions_callback.Get());
+
+  EXPECT_THAT(loading_suggestion,
+              ElementsAre(HasType(
+                  SuggestionType::kPredictionImprovementsLoadingState)));
 }
 
 TEST_F(ShouldProvideAutofillPredictionImprovementsTest,
@@ -321,10 +362,28 @@
   ON_CALL(decider_, CanApplyOptimization(_, _, nullptr))
       .WillByDefault(
           Return(optimization_guide::OptimizationGuideDecision::kFalse));
+  base::MockCallback<autofill::AutofillPredictionImprovementsDelegate::
+                         UpdateSuggestionsCallback>
+      update_suggestions_callback;
+  std::vector<Suggestion> loading_suggestion;
+  std::vector<Suggestion> error_suggestion;
   EXPECT_CALL(client_, GetAXTree).Times(0);
-  manager.OnClickedTriggerSuggestion(
-      form_, form_.fields().front(),
-      /*update_suggestions_callback=*/base::DoNothing());
+  {
+    InSequence s;
+    EXPECT_CALL(update_suggestions_callback, Run)
+        .WillOnce(SaveArg<0>(&loading_suggestion));
+    EXPECT_CALL(update_suggestions_callback, Run)
+        .WillOnce(SaveArg<0>(&error_suggestion));
+  }
+
+  manager.OnClickedTriggerSuggestion(form_, form_.fields().front(),
+                                     update_suggestions_callback.Get());
+
+  EXPECT_THAT(loading_suggestion,
+              ElementsAre(HasType(
+                  SuggestionType::kPredictionImprovementsLoadingState)));
+  EXPECT_THAT(error_suggestion,
+              ElementsAre(HasType(SuggestionType::kAutocompleteEntry)));
 }
 
 TEST_F(ShouldProvideAutofillPredictionImprovementsTest,
@@ -335,10 +394,20 @@
   ON_CALL(decider_, CanApplyOptimization(_, _, nullptr))
       .WillByDefault(
           Return(optimization_guide::OptimizationGuideDecision::kTrue));
+  base::MockCallback<autofill::AutofillPredictionImprovementsDelegate::
+                         UpdateSuggestionsCallback>
+      update_suggestions_callback;
+  std::vector<Suggestion> loading_suggestion;
   EXPECT_CALL(client_, GetAXTree);
-  manager.OnClickedTriggerSuggestion(
-      form_, form_.fields().front(),
-      /*update_suggestions_callback=*/base::DoNothing());
+  EXPECT_CALL(update_suggestions_callback, Run)
+      .WillOnce(SaveArg<0>(&loading_suggestion));
+
+  manager.OnClickedTriggerSuggestion(form_, form_.fields().front(),
+                                     update_suggestions_callback.Get());
+
+  EXPECT_THAT(loading_suggestion,
+              ElementsAre(HasType(
+                  SuggestionType::kPredictionImprovementsLoadingState)));
 }
 
 }  // namespace
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json
index b6f96fc..6175852 100644
--- a/components/certificate_transparency/data/log_list.json
+++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@
 {
-  "version": "45.7",
-  "log_list_timestamp": "2024-09-05T12:55:42Z",
+  "version": "45.8",
+  "log_list_timestamp": "2024-09-10T12:56:14Z",
   "operators": [
     {
       "name": "Google",
diff --git a/components/download/public/common/download_save_info.h b/components/download/public/common/download_save_info.h
index 68bb67e..435637f 100644
--- a/components/download/public/common/download_save_info.h
+++ b/components/download/public/common/download_save_info.h
@@ -92,6 +92,9 @@
 
   // Whether the file should be stored in memory.
   bool use_in_memory_file = false;
+
+  // Whether the file contents need to be obfuscated.
+  bool needs_obfuscation = false;
 };
 
 }  // namespace download
diff --git a/components/history/core/browser/mojom/BUILD.gn b/components/history/core/browser/mojom/BUILD.gn
index adaa3eda..c2b83357 100644
--- a/components/history/core/browser/mojom/BUILD.gn
+++ b/components/history/core/browser/mojom/BUILD.gn
@@ -13,4 +13,20 @@
   ]
 
   webui_module_path = ""
+
+  cpp_typemaps = [
+    {
+      types = [
+        {
+          mojom = "history.mojom.FormFactor"
+          cpp = "::syncer::DeviceInfo::FormFactor"
+        },
+      ]
+      traits_headers = [
+        "//components/sync_device_info/device_info.h",
+        "history_types_mojom_traits.h",
+      ]
+      traits_public_deps = [ "//components/sync_device_info" ]
+    },
+  ]
 }
diff --git a/components/history/core/browser/mojom/OWNERS b/components/history/core/browser/mojom/OWNERS
index 61b5e28..f486cf5 100644
--- a/components/history/core/browser/mojom/OWNERS
+++ b/components/history/core/browser/mojom/OWNERS
@@ -1,2 +1,5 @@
 per-file *.mojom=set noparent
-per-file *.mojom=file://ipc/SECURITY_OWNERS
\ No newline at end of file
+per-file *.mojom=file://ipc/SECURITY_OWNERS
+
+per-file *_mojom_traits*.*=set noparent
+per-file *_mojom_traits*.*=file://ipc/SECURITY_OWNERS
diff --git a/components/history/core/browser/mojom/history_types.mojom b/components/history/core/browser/mojom/history_types.mojom
index 5ce381c2..78d52c4 100644
--- a/components/history/core/browser/mojom/history_types.mojom
+++ b/components/history/core/browser/mojom/history_types.mojom
@@ -7,15 +7,15 @@
 import "mojo/public/mojom/base/time.mojom";
 import "url/mojom/url.mojom";
 
-// Device Types.
-enum DeviceType {
-  kUnknown,
-  kDesktop,
-  kPhone,
-  kTablet,
-  kAutomotive,
-  kWearable,
-  kTv,
+// Device form factors. See also `syncer::FormFactor`.
+enum FormFactor {
+  kUnknown = 0,
+  kDesktop = 1,
+  kPhone = 2,
+  kTablet = 3,
+  kAutomotive = 4,
+  kWearable = 5,
+  kTv = 6,
 };
 
 // Reasons for showing tab in Tab Resumption module.
@@ -34,7 +34,7 @@
 struct Tab {
   // Type of device for displaying device icon
   // See components/sync_device_info/device_info.h
-  DeviceType device_type;
+  FormFactor form_factor;
 
   // Name of session to be displayed on surfaces such as NTP.
   string? session_name;
diff --git a/components/history/core/browser/mojom/history_types_mojom_traits.h b/components/history/core/browser/mojom/history_types_mojom_traits.h
new file mode 100644
index 0000000..6f331de
--- /dev/null
+++ b/components/history/core/browser/mojom/history_types_mojom_traits.h
@@ -0,0 +1,64 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_HISTORY_CORE_BROWSER_MOJOM_HISTORY_TYPES_MOJOM_TRAITS_H_
+#define COMPONENTS_HISTORY_CORE_BROWSER_MOJOM_HISTORY_TYPES_MOJOM_TRAITS_H_
+
+#include "base/containers/fixed_flat_map.h"
+#include "components/history/core/browser/mojom/history_types.mojom.h"
+#include "components/sync_device_info/device_info.h"
+
+namespace mojo {
+
+template <>
+struct EnumTraits<history::mojom::FormFactor, syncer::DeviceInfo::FormFactor> {
+  static history::mojom::FormFactor ToMojom(
+      syncer::DeviceInfo::FormFactor input) {
+    static constexpr auto form_factor_map =
+        base::MakeFixedFlatMap<syncer::DeviceInfo::FormFactor,
+                               history::mojom::FormFactor>(
+            {{syncer::DeviceInfo::FormFactor::kUnknown,
+              history::mojom::FormFactor::kUnknown},
+             {syncer::DeviceInfo::FormFactor::kDesktop,
+              history::mojom::FormFactor::kDesktop},
+             {syncer::DeviceInfo::FormFactor::kPhone,
+              history::mojom::FormFactor::kPhone},
+             {syncer::DeviceInfo::FormFactor::kTablet,
+              history::mojom::FormFactor::kTablet},
+             {syncer::DeviceInfo::FormFactor::kAutomotive,
+              history::mojom::FormFactor::kAutomotive},
+             {syncer::DeviceInfo::FormFactor::kWearable,
+              history::mojom::FormFactor::kWearable},
+             {syncer::DeviceInfo::FormFactor::kTv,
+              history::mojom::FormFactor::kTv}});
+    return form_factor_map.at(input);
+  }
+
+  static bool FromMojom(history::mojom::FormFactor input,
+                        syncer::DeviceInfo::FormFactor* out) {
+    static constexpr auto form_factor_map =
+        base::MakeFixedFlatMap<history::mojom::FormFactor,
+                               syncer::DeviceInfo::FormFactor>(
+            {{history::mojom::FormFactor::kUnknown,
+              syncer::DeviceInfo::FormFactor::kUnknown},
+             {history::mojom::FormFactor::kDesktop,
+              syncer::DeviceInfo::FormFactor::kDesktop},
+             {history::mojom::FormFactor::kPhone,
+              syncer::DeviceInfo::FormFactor::kPhone},
+             {history::mojom::FormFactor::kTablet,
+              syncer::DeviceInfo::FormFactor::kTablet},
+             {history::mojom::FormFactor::kAutomotive,
+              syncer::DeviceInfo::FormFactor::kAutomotive},
+             {history::mojom::FormFactor::kWearable,
+              syncer::DeviceInfo::FormFactor::kWearable},
+             {history::mojom::FormFactor::kTv,
+              syncer::DeviceInfo::FormFactor::kTv}});
+    *out = form_factor_map.at(input);
+    return true;
+  }
+};
+
+}  // namespace mojo
+
+#endif  // COMPONENTS_HISTORY_CORE_BROWSER_MOJOM_HISTORY_TYPES_MOJOM_TRAITS_H_
diff --git a/components/network_session_configurator/browser/network_session_configurator.cc b/components/network_session_configurator/browser/network_session_configurator.cc
index 7a0a412..ccabfd2 100644
--- a/components/network_session_configurator/browser/network_session_configurator.cc
+++ b/components/network_session_configurator/browser/network_session_configurator.cc
@@ -485,6 +485,14 @@
       "true");
 }
 
+bool IgnoreIpMatchingWhenFindingExistingSessions(
+    const VariationParameters& quic_trial_params) {
+  return base::EqualsCaseInsensitiveASCII(
+      GetVariationParam(quic_trial_params,
+                        "ignore_ip_matching_when_finding_existing_sessions"),
+      "true");
+}
+
 void SetQuicFlags(const VariationParameters& quic_trial_params) {
   std::string flags_list =
       GetVariationParam(quic_trial_params, "set_quic_flags");
@@ -702,6 +710,8 @@
     quic_params->enable_origin_frame = IsOriginFrameEnabled(quic_trial_params);
     quic_params->skip_dns_with_origin_frame =
         IsDnsSkippedWithOriginFrame(quic_trial_params);
+    quic_params->ignore_ip_matching_when_finding_existing_sessions =
+        IgnoreIpMatchingWhenFindingExistingSessions(quic_trial_params);
     SetQuicFlags(quic_trial_params);
   }
 
diff --git a/components/network_session_configurator/browser/network_session_configurator_unittest.cc b/components/network_session_configurator/browser/network_session_configurator_unittest.cc
index d1754f7..8a90b34 100644
--- a/components/network_session_configurator/browser/network_session_configurator_unittest.cc
+++ b/components/network_session_configurator/browser/network_session_configurator_unittest.cc
@@ -108,6 +108,7 @@
   EXPECT_FALSE(quic_params_.report_ecn);
   EXPECT_FALSE(quic_params_.enable_origin_frame);
   EXPECT_FALSE(quic_params_.skip_dns_with_origin_frame);
+  EXPECT_FALSE(quic_params_.ignore_ip_matching_when_finding_existing_sessions);
 }
 
 TEST_F(NetworkSessionConfiguratorTest, Http2FieldTrialGroupNameDoesNotMatter) {
@@ -357,6 +358,32 @@
 }
 
 TEST_F(NetworkSessionConfiguratorTest,
+       IgnoreIpMatchingWhenFindingExistingSessions) {
+  std::map<std::string, std::string> field_trial_params;
+  field_trial_params["ignore_ip_matching_when_finding_existing_sessions"] =
+      "true";
+  base::AssociateFieldTrialParams("QUIC", "Enabled", field_trial_params);
+  base::FieldTrialList::CreateFieldTrial("QUIC", "Enabled");
+
+  ParseFieldTrials();
+
+  EXPECT_TRUE(quic_params_.ignore_ip_matching_when_finding_existing_sessions);
+}
+
+TEST_F(NetworkSessionConfiguratorTest,
+       DonotIgnoreIpMatchingWhenFindingExistingSessions) {
+  std::map<std::string, std::string> field_trial_params;
+  field_trial_params["ignore_ip_matching_when_finding_existing_sessions"] =
+      "false";
+  base::AssociateFieldTrialParams("QUIC", "Enabled", field_trial_params);
+  base::FieldTrialList::CreateFieldTrial("QUIC", "Enabled");
+
+  ParseFieldTrials();
+
+  EXPECT_FALSE(quic_params_.ignore_ip_matching_when_finding_existing_sessions);
+}
+
+TEST_F(NetworkSessionConfiguratorTest,
        QuicIdleConnectionTimeoutSecondsFieldTrialParams) {
   std::map<std::string, std::string> field_trial_params;
   field_trial_params["idle_connection_timeout_seconds"] = "300";
diff --git a/components/password_manager/content/browser/content_credential_manager.cc b/components/password_manager/content/browser/content_credential_manager.cc
index 4fe73713..5d32711 100644
--- a/components/password_manager/content/browser/content_credential_manager.cc
+++ b/components/password_manager/content/browser/content_credential_manager.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/functional/bind.h"
+#include "mojo/public/cpp/bindings/message.h"
 
 namespace password_manager {
 
@@ -20,7 +21,10 @@
 
 void ContentCredentialManager::BindRequest(
     mojo::PendingReceiver<blink::mojom::CredentialManager> receiver) {
-  DCHECK(!receiver_.is_bound());
+  if (receiver_.is_bound()) {
+    mojo::ReportBadMessage("CredentialManager is already bound.");
+    return;
+  }
   receiver_.Bind(std::move(receiver));
 
   // The browser side will close the message pipe on DidFinishNavigation before
diff --git a/components/password_manager/ios/BUILD.gn b/components/password_manager/ios/BUILD.gn
index b415641e..ef6d9774 100644
--- a/components/password_manager/ios/BUILD.gn
+++ b/components/password_manager/ios/BUILD.gn
@@ -96,6 +96,7 @@
 
   deps = [
     "//components/autofill/ios/form_util:fill_js_dependencies",
+    "//components/autofill/ios/form_util:fill_js_namespace",
     "//ios/web/public/js_messaging:gcrweb",
   ]
 }
diff --git a/components/permissions/prediction_service/BUILD.gn b/components/permissions/prediction_service/BUILD.gn
index ea28d10..e483dae 100644
--- a/components/permissions/prediction_service/BUILD.gn
+++ b/components/permissions/prediction_service/BUILD.gn
@@ -7,6 +7,7 @@
 
 proto_library("prediction_service_messages_proto") {
   sources = [
+    "prediction_model_handshake.proto",
     "prediction_model_metadata.proto",
     "prediction_service_messages.proto",
   ]
diff --git a/components/permissions/prediction_service/prediction_model_handshake.proto b/components/permissions/prediction_service/prediction_model_handshake.proto
new file mode 100644
index 0000000..5e01ce91
--- /dev/null
+++ b/components/permissions/prediction_service/prediction_model_handshake.proto
@@ -0,0 +1,19 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+syntax = "proto3";
+
+option optimize_for = LITE_RUNTIME;
+
+package permissions;
+
+// This message is used to provide the backed info about the Chrome client. The
+// backend can use this information to select a model which needs to be sent to
+// the client.
+message WebPermissionPredictionsClientInfo {
+  // The chrome milestone version.
+  // For example a Chrome client with version 128.0.6613.115 will have 128 as
+  // the milestone.
+  optional int32 milestone = 1;
+}
diff --git a/components/plus_addresses/features.cc b/components/plus_addresses/features.cc
index 44d475d..544dfe35 100644
--- a/components/plus_addresses/features.cc
+++ b/components/plus_addresses/features.cc
@@ -139,6 +139,13 @@
              base::FEATURE_DISABLED_BY_DEFAULT);
 #endif  // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
 
+// When enabled, creation suggestions do not contain a label prior to the user
+// acknowledging the notice. When labels are shown, they contain information
+// about the forwarding address.
+BASE_FEATURE(kPlusAddressSuggestionRedesign,
+             "PlusAddressSuggestionRedesign",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 // When enabled, the plus address creation dialogs or bottom sheets include
 // extended feature description and usage notice.
 BASE_FEATURE(kPlusAddressUserOnboardingEnabled,
diff --git a/components/plus_addresses/features.h b/components/plus_addresses/features.h
index a8478d9..4a386fa 100644
--- a/components/plus_addresses/features.h
+++ b/components/plus_addresses/features.h
@@ -95,6 +95,9 @@
 #endif  // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
 
 COMPONENT_EXPORT(PLUS_ADDRESSES_FEATURES)
+BASE_DECLARE_FEATURE(kPlusAddressSuggestionRedesign);
+
+COMPONENT_EXPORT(PLUS_ADDRESSES_FEATURES)
 BASE_DECLARE_FEATURE(kPlusAddressUserOnboardingEnabled);
 
 }  // namespace plus_addresses::features
diff --git a/components/plus_addresses/plus_address_service.cc b/components/plus_addresses/plus_address_service.cc
index 9db1eb8b..2660aeb 100644
--- a/components/plus_addresses/plus_address_service.cc
+++ b/components/plus_addresses/plus_address_service.cc
@@ -35,6 +35,7 @@
 #include "components/plus_addresses/plus_address_preallocator.h"
 #include "components/plus_addresses/plus_address_suggestion_generator.h"
 #include "components/plus_addresses/plus_address_types.h"
+#include "components/plus_addresses/plus_address_ui_utils.h"
 #include "components/plus_addresses/settings/plus_address_setting_service.h"
 #include "components/plus_addresses/webdata/plus_address_sync_util.h"
 #include "components/plus_addresses/webdata/plus_address_webdata_service.h"
@@ -122,6 +123,13 @@
   return excluded_sites.contains(GetEtldPlusOne(origin));
 }
 
+// Returns whether `error` indicates an exhausted plus address quota.
+bool IsQuotaError(const PlusAddressRequestError& error) {
+  return error.type() == PlusAddressRequestErrorType::kNetworkError &&
+         error.http_response_code().value_or(net::HTTP_REQUEST_TIMEOUT) ==
+             net::HTTP_TOO_MANY_REQUESTS;
+}
+
 }  // namespace
 
 PlusAddressService::PlusAddressService(
@@ -640,12 +648,15 @@
     size_t current_suggestion_index,
     UpdateSuggestionsCallback update_suggestions_callback,
     HideSuggestionsCallback hide_suggestions_callback,
-    PlusAddressCallback fill_field_callback) {
+    PlusAddressCallback fill_field_callback,
+    ShowAffiliationErrorDialogCallback show_affiliation_error_dialog,
+    ShowErrorDialogCallback show_error_dialog) {
   // TODO(crbug.com/362445807): Record metrics.
   const std::u16string suggested_address =
       current_suggestions[current_suggestion_index]
           .GetPayload<Suggestion::PlusAddressPayload>()
           .address.value();
+  PlusAddress requested_plus_address(base::UTF16ToUTF8(suggested_address));
 
   // First, update the suggestions to show a loading state.
   std::vector<Suggestion> updated_suggestions(current_suggestions.begin(),
@@ -661,22 +672,41 @@
   PlusAddressRequestCallback callback = base::BindOnce(
       [](HideSuggestionsCallback hide_callback,
          PlusAddressCallback fill_callback,
+         ShowAffiliationErrorDialogCallback show_affiliation_error,
+         ShowErrorDialogCallback show_error,
+         const PlusAddress& requested_address,
          const PlusProfileOrError& profile_or_error) {
         // Always hide the popup.
         std::move(hide_callback)
             .Run(autofill::SuggestionHidingReason::kAcceptSuggestion);
         if (!profile_or_error.has_value()) {
-          // TODO(crbug.com/362445807): Handle errors during creation.
+          if (IsQuotaError(profile_or_error.error())) {
+            std::move(show_error)
+                .Run(PlusAddressErrorDialogType::kQuotaExhausted,
+                     /*on_accepted=*/base::DoNothing());
+            return;
+          }
+          // TODO(crbug.com/362445807): Pass a callback that re-shows the
+          // popup. Add tests for that case.
+          std::move(show_error)
+              .Run(PlusAddressErrorDialogType::kGenericError,
+                   /*on_accepted=*/base::DoNothing());
+          return;
         }
-        // TODO(crbug.com/362445807): Handle the case in which the returned
-        // plus address is not the requested one.
+        if (requested_address != profile_or_error->plus_address) {
+          std::move(show_affiliation_error)
+              .Run(GetOriginForDisplay(*profile_or_error),
+                   base::UTF8ToUTF16(profile_or_error->plus_address.value()));
+          return;
+        }
 
         std::move(fill_callback).Run(profile_or_error->plus_address.value());
       },
-      std::move(hide_suggestions_callback), std::move(fill_field_callback));
+      std::move(hide_suggestions_callback), std::move(fill_field_callback),
+      std::move(show_affiliation_error_dialog), std::move(show_error_dialog),
+      requested_plus_address);
   ConfirmPlusAddress(primary_main_frame_origin,
-                     PlusAddress(base::UTF16ToUTF8(suggested_address)),
-                     std::move(callback));
+                     std::move(requested_plus_address), std::move(callback));
 }
 
 }  // namespace plus_addresses
diff --git a/components/plus_addresses/plus_address_service.h b/components/plus_addresses/plus_address_service.h
index ffaeec7e..9cf1cb14 100644
--- a/components/plus_addresses/plus_address_service.h
+++ b/components/plus_addresses/plus_address_service.h
@@ -132,7 +132,9 @@
       size_t current_suggestion_index,
       UpdateSuggestionsCallback update_suggestions_callback,
       HideSuggestionsCallback hide_suggestions_callback,
-      PlusAddressCallback fill_field_callback) override;
+      PlusAddressCallback fill_field_callback,
+      ShowAffiliationErrorDialogCallback show_affiliation_error_dialog,
+      ShowErrorDialogCallback show_error_dialog) override;
 
   // PlusAddressWebDataService::Observer:
   void OnWebDataChangedBySync(
diff --git a/components/plus_addresses/plus_address_service_unittest.cc b/components/plus_addresses/plus_address_service_unittest.cc
index 061b445..adb9c1a 100644
--- a/components/plus_addresses/plus_address_service_unittest.cc
+++ b/components/plus_addresses/plus_address_service_unittest.cc
@@ -83,6 +83,7 @@
 using ::testing::_;
 using ::testing::AllOf;
 using ::testing::ElementsAre;
+using ::testing::Eq;
 using ::testing::Field;
 using ::testing::InSequence;
 using ::testing::IsEmpty;
@@ -711,12 +712,111 @@
   service().OnAcceptedInlineSuggestion(
       url::Origin::Create(GURL("https://foo.com")), current_suggestions,
       /*current_suggestion_index=*/0, update_callback.Get(),
-      hide_callback.Get(), fill_callback.Get());
+      hide_callback.Get(), fill_callback.Get(),
+      /*show_affiliation_error_dialog=*/base::DoNothing(),
+      /*show_error_dialog=*/base::DoNothing());
   check.Call();
 
   url_loader_factory().SimulateResponseForPendingRequest(
       kCreatePlusAddressEndpoint, test::MakeCreationResponse(profile));
 }
+
+// Tests that when the server call to create a plus address from an inline
+// suggestion returns with an affiliation error, a call is made to show an error
+// dialog.
+TEST_F(PlusAddressServiceRequestsTest,
+       OnAcceptedInlineSuggestionAffiliationError) {
+  base::test::ScopedFeatureList feature_list{
+      features::kPlusAddressInlineCreation};
+  base::MockCallback<PlusAddressService::UpdateSuggestionsCallback>
+      update_callback;
+  base::MockCallback<PlusAddressService::HideSuggestionsCallback> hide_callback;
+  base::MockCallback<PlusAddressService::ShowAffiliationErrorDialogCallback>
+      show_affiliation_error_callback;
+
+  PlusProfile profile = test::CreatePlusProfile();
+  PlusProfile affiliated_profile = test::CreatePlusProfile2();
+
+  Suggestion inline_suggestion(SuggestionType::kCreateNewPlusAddressInline);
+  inline_suggestion.payload =
+      Suggestion::PlusAddressPayload(base::UTF8ToUTF16(*profile.plus_address));
+  std::vector<Suggestion> current_suggestions = {std::move(inline_suggestion)};
+
+  MockFunction<void()> check;
+  {
+    InSequence s;
+
+    EXPECT_CALL(update_callback, Run(ElementsAre(IsCreateInlineSuggestion(
+                                         /*has_proposed_address=*/true)),
+                                     AutofillSuggestionTriggerSource::
+                                         kPlusAddressUpdatedInBrowserProcess));
+    EXPECT_CALL(check, Call);
+    EXPECT_CALL(hide_callback,
+                Run(autofill::SuggestionHidingReason::kAcceptSuggestion));
+    EXPECT_CALL(show_affiliation_error_callback,
+                Run(Eq(u"bar.com"),
+                    base::UTF8ToUTF16(*affiliated_profile.plus_address)));
+  }
+  service().OnAcceptedInlineSuggestion(
+      url::Origin::Create(GURL("https://foo.com")), current_suggestions,
+      /*current_suggestion_index=*/0, update_callback.Get(),
+      hide_callback.Get(), /*fill_field_callback=*/base::DoNothing(),
+      show_affiliation_error_callback.Get(),
+      /*show_error_dialog=*/base::DoNothing());
+  check.Call();
+
+  url_loader_factory().SimulateResponseForPendingRequest(
+      kCreatePlusAddressEndpoint,
+      test::MakeCreationResponse(affiliated_profile));
+}
+
+// Tests that when the server call to create a plus address from an inline
+// suggestion returns with a TOO_MANY_REQUESTS error, a call is made to show an
+// error dialog that the quota is exhausted.
+TEST_F(PlusAddressServiceRequestsTest, OnAcceptedInlineSuggestionQuotaError) {
+  base::test::ScopedFeatureList feature_list{
+      features::kPlusAddressInlineCreation};
+  base::MockCallback<PlusAddressService::UpdateSuggestionsCallback>
+      update_callback;
+  base::MockCallback<PlusAddressService::HideSuggestionsCallback> hide_callback;
+  base::MockCallback<PlusAddressService::ShowErrorDialogCallback>
+      show_error_callback;
+
+  PlusProfile profile = test::CreatePlusProfile();
+  PlusProfile affiliated_profile = test::CreatePlusProfile2();
+
+  Suggestion inline_suggestion(SuggestionType::kCreateNewPlusAddressInline);
+  inline_suggestion.payload =
+      Suggestion::PlusAddressPayload(base::UTF8ToUTF16(*profile.plus_address));
+  std::vector<Suggestion> current_suggestions = {std::move(inline_suggestion)};
+
+  MockFunction<void()> check;
+  {
+    InSequence s;
+
+    EXPECT_CALL(update_callback, Run(ElementsAre(IsCreateInlineSuggestion(
+                                         /*has_proposed_address=*/true)),
+                                     AutofillSuggestionTriggerSource::
+                                         kPlusAddressUpdatedInBrowserProcess));
+    EXPECT_CALL(check, Call);
+    EXPECT_CALL(hide_callback,
+                Run(autofill::SuggestionHidingReason::kAcceptSuggestion));
+    EXPECT_CALL(
+        show_error_callback,
+        Run(PlusAddressService::PlusAddressErrorDialogType::kQuotaExhausted,
+            _));
+  }
+  service().OnAcceptedInlineSuggestion(
+      url::Origin::Create(GURL("https://foo.com")), current_suggestions,
+      /*current_suggestion_index=*/0, update_callback.Get(),
+      hide_callback.Get(), /*fill_field_callback=*/base::DoNothing(),
+      /*show_affiliation_error_dialog=*/base::DoNothing(),
+      show_error_callback.Get());
+  check.Call();
+
+  url_loader_factory().SimulateResponseForPendingRequest(
+      kCreatePlusAddressEndpoint, "", net::HTTP_TOO_MANY_REQUESTS);
+}
 #endif  // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
 
 class PlusAddressServicePreAllocationTest
diff --git a/components/plus_addresses/plus_address_suggestion_generator.cc b/components/plus_addresses/plus_address_suggestion_generator.cc
index 7823abd..eb921708 100644
--- a/components/plus_addresses/plus_address_suggestion_generator.cc
+++ b/components/plus_addresses/plus_address_suggestion_generator.cc
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "base/check_deref.h"
+#include "base/feature_list.h"
 #include "base/strings/utf_string_conversions.h"
 #include "components/autofill/core/browser/data_model/borrowed_transliterator.h"
 #include "components/autofill/core/browser/ui/suggestion.h"
@@ -74,6 +75,21 @@
   return suggestion;
 }
 
+std::vector<std::vector<Suggestion::Text>> CreateLabelsForCreateSuggestion(
+    bool has_accepted_notice) {
+  // On Android, there are no labels since the Keyboard Accessory only allows
+  // for single line chips.
+  if constexpr (BUILDFLAG(IS_ANDROID)) {
+    return {};
+  }
+  if (!has_accepted_notice &&
+      base::FeatureList::IsEnabled(features::kPlusAddressSuggestionRedesign)) {
+    return {};
+  }
+  return {{Suggestion::Text(l10n_util::GetStringUTF16(
+      IDS_PLUS_ADDRESS_CREATE_SUGGESTION_SECONDARY_TEXT))}};
+}
+
 }  // namespace
 
 PlusAddressSuggestionGenerator::PlusAddressSuggestionGenerator(
@@ -176,10 +192,10 @@
       l10n_util::GetStringUTF16(IDS_PLUS_ADDRESS_CREATE_SUGGESTION_MAIN_TEXT),
       SuggestionType::kCreateNewPlusAddress);
 
-  if constexpr (!BUILDFLAG(IS_ANDROID)) {
-    suggestion.labels = {{Suggestion::Text(l10n_util::GetStringUTF16(
-        IDS_PLUS_ADDRESS_CREATE_SUGGESTION_SECONDARY_TEXT))}};
-  }
+  suggestion.labels = CreateLabelsForCreateSuggestion(
+      !base::FeatureList::IsEnabled(
+          features::kPlusAddressUserOnboardingEnabled) ||
+      setting_service_->GetHasAcceptedNotice());
   suggestion.icon = Suggestion::Icon::kPlusAddress;
   suggestion.feature_for_new_badge = &features::kPlusAddressesEnabled;
   suggestion.feature_for_iph =
diff --git a/components/plus_addresses/plus_address_suggestion_generator_unittest.cc b/components/plus_addresses/plus_address_suggestion_generator_unittest.cc
index 9738728..25ccde841 100644
--- a/components/plus_addresses/plus_address_suggestion_generator_unittest.cc
+++ b/components/plus_addresses/plus_address_suggestion_generator_unittest.cc
@@ -34,6 +34,7 @@
 using ::testing::AllOf;
 using ::testing::ElementsAre;
 using ::testing::Field;
+using ::testing::IsEmpty;
 using ::testing::Property;
 using PasswordFormClassification =
     autofill::AutofillClient::PasswordFormClassification;
@@ -177,5 +178,25 @@
 
 #endif  // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
 
+// Tests that the creation suggestion contains no labels if the notice has not
+// been accepted.
+TEST_F(PlusAddressSuggestionGeneratorTest, FirstTimeCreateSuggestion) {
+  base::test::ScopedFeatureList feature_list{
+      features::kPlusAddressSuggestionRedesign};
+  setting_service().set_has_accepted_notice(false);
+
+  PlusAddressSuggestionGenerator generator(
+      &setting_service(), &allocator(),
+      url::Origin::Create(GURL("https://foo.bar")));
+  EXPECT_THAT(
+      generator.GetSuggestions(
+          /*is_creation_enabled=*/true, PasswordFormClassification(),
+          FormFieldData(),
+          AutofillSuggestionTriggerSource::kFormControlElementClicked,
+          /*affiliated_profiles=*/{}),
+      ElementsAre(AllOf(EqualsSuggestion(SuggestionType::kCreateNewPlusAddress),
+                        Field(&Suggestion::labels, IsEmpty()))));
+}
+
 }  // namespace
 }  // namespace plus_addresses
diff --git a/components/plus_addresses/plus_address_ui_utils.cc b/components/plus_addresses/plus_address_ui_utils.cc
index 98c6c00..2480b300 100644
--- a/components/plus_addresses/plus_address_ui_utils.cc
+++ b/components/plus_addresses/plus_address_ui_utils.cc
@@ -6,6 +6,7 @@
 
 #include <string>
 
+#include "base/strings/utf_string_conversions.h"
 #include "components/affiliations/core/browser/affiliation_utils.h"
 #include "components/plus_addresses/plus_address_types.h"
 #include "components/url_formatter/elide_url.h"
@@ -13,20 +14,20 @@
 
 namespace plus_addresses {
 
-std::string GetOriginForDisplay(const PlusProfile& plus_address) {
+std::u16string GetOriginForDisplay(const PlusProfile& plus_address) {
   if (!plus_address.facet.is_valid()) {
-    return std::string();
+    return std::u16string();
   }
 
   if (plus_address.facet.IsValidAndroidFacetURI()) {
-    return plus_address.facet.GetAndroidPackageDisplayName();
+    return base::UTF8ToUTF16(plus_address.facet.GetAndroidPackageDisplayName());
   }
 
   // TODO: crbug.com/327838324 - Revisit the `OMIT_CRYPTOGRAPHIC` parameter once
   // the plus address creation support for http domains is launched.
-  return base::UTF16ToUTF8(url_formatter::FormatUrlForSecurityDisplay(
+  return url_formatter::FormatUrlForSecurityDisplay(
       GURL(plus_address.facet.canonical_spec()),
-      url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC));
+      url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC);
 }
 
 }  // namespace plus_addresses
diff --git a/components/plus_addresses/plus_address_ui_utils.h b/components/plus_addresses/plus_address_ui_utils.h
index a33c23d7..b5ce1c2 100644
--- a/components/plus_addresses/plus_address_ui_utils.h
+++ b/components/plus_addresses/plus_address_ui_utils.h
@@ -14,7 +14,7 @@
 // Returns a string for UI display computed from the `plus_address` facet URI.
 // For Android origins, the package name is returned. For web origins, the
 // formatted URL without the cryptographic scheme is returned.
-std::string GetOriginForDisplay(const PlusProfile& plus_address);
+std::u16string GetOriginForDisplay(const PlusProfile& plus_address);
 
 }  // namespace plus_addresses
 
diff --git a/components/plus_addresses_strings.grdp b/components/plus_addresses_strings.grdp
index eb376c7..e62c5f6 100644
--- a/components/plus_addresses_strings.grdp
+++ b/components/plus_addresses_strings.grdp
@@ -109,6 +109,9 @@
    <message name="IDS_SELECT_PLUS_ADDRESS_TITLE_IOS" desc="The title shown in the sheet listing all plus addresses for selections" translateable="false">
         Select Plus Address
     </message>
+    <message name="IDS_SELECT_PLUS_ADDRESS_HEADER_TEXT_IOS" desc="The header text shown in the sheet listing all plus addresses for selection" translateable="false">
+        Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua
+    </message>
 
     <!-- Desktop strings -->
     <message name="IDS_PLUS_ADDRESS_MODAL_TITLE" desc="Title for the experimental enterprise plus addresses feature modal" translateable="false">
diff --git a/components/policy/resources/templates/policy_definitions/Miscellaneous/DataControlsRules.yaml b/components/policy/resources/templates/policy_definitions/Miscellaneous/DataControlsRules.yaml
index a29f156..b25b078f7 100644
--- a/components/policy/resources/templates/policy_definitions/Miscellaneous/DataControlsRules.yaml
+++ b/components/policy/resources/templates/policy_definitions/Miscellaneous/DataControlsRules.yaml
@@ -21,6 +21,8 @@
         - For data leak prevention rules specific to <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph>, see also the <ph name="DATA_LEAK_PREVENTION_RULES_LIST">DataLeakPreventionRulesList</ph> policy.
 
         If the policy is left not set, no restrictions will be applied.
+
+        This policy is available only to users who have an assigned Chrome Enterprise Premium license.
 example_value:
 - description: Block copying from internal sites to the OS clipboard
   name: Block copying from corp sites to OS
diff --git a/components/privacy_sandbox/privacy_sandbox_notice_storage.cc b/components/privacy_sandbox/privacy_sandbox_notice_storage.cc
index b658b61d..549c0b7 100644
--- a/components/privacy_sandbox/privacy_sandbox_notice_storage.cc
+++ b/components/privacy_sandbox/privacy_sandbox_notice_storage.cc
@@ -328,6 +328,8 @@
 
   SetSchemaVersion(pref_service, notice);
 
+  // We are only setting the new prefs and emitting histograms if the new prefs
+  // haven't been set already.
   auto existing_notice_data = ReadNoticeData(pref_service, notice);
   if (input.notice_action_taken != NoticeActionTaken::kNotSet &&
       (!existing_notice_data.has_value() ||
diff --git a/components/search_engines/android/java/src/org/chromium/components/search_engines/FakeSearchEngineCountryDelegate.java b/components/search_engines/android/java/src/org/chromium/components/search_engines/FakeSearchEngineCountryDelegate.java
index a3e5a8a..d5a6808 100644
--- a/components/search_engines/android/java/src/org/chromium/components/search_engines/FakeSearchEngineCountryDelegate.java
+++ b/components/search_engines/android/java/src/org/chromium/components/search_engines/FakeSearchEngineCountryDelegate.java
@@ -4,8 +4,6 @@
 
 package org.chromium.components.search_engines;
 
-import android.content.Context;
-
 import androidx.annotation.MainThread;
 
 import org.chromium.base.Log;
@@ -24,8 +22,8 @@
             new ObservableSupplierImpl<>(true);
 
     @MainThread
-    public FakeSearchEngineCountryDelegate(Context context, boolean enableLogging) {
-        super(context);
+    public FakeSearchEngineCountryDelegate(boolean enableLogging) {
+        super(/* context= */ null);
         ThreadUtils.assertOnUiThread();
 
         mEnableLogging = enableLogging;
@@ -100,7 +98,7 @@
         if (mEnableLogging) {
             Log.i(TAG, "launchDeviceChoiceScreens() -> updating supplier");
         }
-        mIsChoiceRequired.set(true);
+        mIsChoiceRequired.set(false);
     }
 
     @Override
diff --git a/components/search_engines/android/java/src/org/chromium/components/search_engines/SearchEngineChoiceService.java b/components/search_engines/android/java/src/org/chromium/components/search_engines/SearchEngineChoiceService.java
index 8d87a29c..5ab330b 100644
--- a/components/search_engines/android/java/src/org/chromium/components/search_engines/SearchEngineChoiceService.java
+++ b/components/search_engines/android/java/src/org/chromium/components/search_engines/SearchEngineChoiceService.java
@@ -68,8 +68,7 @@
             var delegate =
                     SearchEnginesFeatures.isEnabled(SearchEnginesFeatures.CLAY_BLOCKING)
                                     && SearchEnginesFeatureUtils.clayBlockingUseFakeBackend()
-                            ? new FakeSearchEngineCountryDelegate(
-                                    context, /* enableLogging= */ true)
+                            ? new FakeSearchEngineCountryDelegate(/* enableLogging= */ true)
                             : new SearchEngineCountryDelegateImpl(context);
             sInstance = new SearchEngineChoiceService(delegate);
         }
diff --git a/components/search_engines/android/java/src/org/chromium/components/search_engines/SearchEngineChoiceServiceUnitTest.java b/components/search_engines/android/java/src/org/chromium/components/search_engines/SearchEngineChoiceServiceUnitTest.java
index 5ac631a..c60508e 100644
--- a/components/search_engines/android/java/src/org/chromium/components/search_engines/SearchEngineChoiceServiceUnitTest.java
+++ b/components/search_engines/android/java/src/org/chromium/components/search_engines/SearchEngineChoiceServiceUnitTest.java
@@ -91,7 +91,7 @@
     public void testFakeDelegate() {
         var service =
                 new SearchEngineChoiceService(
-                        new FakeSearchEngineCountryDelegate(mContext, /* enableLogging= */ true));
+                        new FakeSearchEngineCountryDelegate(/* enableLogging= */ true));
 
         if (mIsClayBlockingEnabled) {
             // It should have generally sensible values and make the dialog be shown.
diff --git a/components/sharing_message/sharing_service.cc b/components/sharing_message/sharing_service.cc
index 02cb2ae..6f15258 100644
--- a/components/sharing_message/sharing_service.cc
+++ b/components/sharing_message/sharing_service.cc
@@ -33,6 +33,10 @@
 #include "ui/base/l10n/l10n_util.h"
 #include "url/gurl.h"
 
+namespace {
+constexpr int kMinimumFaviconSize = 32;
+}  // namespace
+
 SharingService::SharingService(
     std::unique_ptr<SharingSyncPreference> sync_prefs,
     std::unique_ptr<VapidKeyManager> vapid_key_manager,
@@ -186,9 +190,15 @@
     return;
   }
 
+  auto large_icon_types = std::vector<favicon_base::IconTypeSet>(
+      {{favicon_base::IconType::kWebManifestIcon},
+       {favicon_base::IconType::kFavicon},
+       {favicon_base::IconType::kTouchIcon},
+       {favicon_base::IconType::kTouchPrecomposedIcon}});
+
   // Retrieve favicon to issue notification.
-  favicon_service_->GetFaviconImageForPageURL(
-      entry->GetURL(),
+  favicon_service_->GetLargestRawFaviconForPageURL(
+      entry->GetURL(), large_icon_types, kMinimumFaviconSize,
       base::BindOnce(&SharingService::SendNotificationForSendTabToSelfPush,
                      weak_ptr_factory_.GetWeakPtr(),
                      send_tab_to_self::SendTabToSelfEntry(*entry)),
@@ -317,7 +327,7 @@
 
 void SharingService::SendNotificationForSendTabToSelfPush(
     const send_tab_to_self::SendTabToSelfEntry& entry,
-    const favicon_base::FaviconImageResult& result) {
+    const favicon_base::FaviconRawBitmapResult& result) {
   std::optional<SharingTargetDeviceInfo> target_device_info =
       GetDeviceByGuid(entry.GetTargetDeviceSyncCacheGuid());
 
diff --git a/components/sharing_message/sharing_service.h b/components/sharing_message/sharing_service.h
index 34714316..64d78d72 100644
--- a/components/sharing_message/sharing_service.h
+++ b/components/sharing_message/sharing_service.h
@@ -33,7 +33,7 @@
 }  // namespace favicon
 
 namespace favicon_base {
-struct FaviconImageResult;
+struct FaviconRawBitmapResult;
 }  // namespace favicon_base
 
 namespace send_tab_to_self {
@@ -191,7 +191,7 @@
   // iOS devices.
   void SendNotificationForSendTabToSelfPush(
       const send_tab_to_self::SendTabToSelfEntry& entry,
-      const favicon_base::FaviconImageResult& result);
+      const favicon_base::FaviconRawBitmapResult& result);
 
   std::unique_ptr<SharingSyncPreference> sync_prefs_;
   std::unique_ptr<VapidKeyManager> vapid_key_manager_;
diff --git a/components/sharing_message/sharing_service_unittest.cc b/components/sharing_message/sharing_service_unittest.cc
index f7a281e..a0c6493 100644
--- a/components/sharing_message/sharing_service_unittest.cc
+++ b/components/sharing_message/sharing_service_unittest.cc
@@ -354,15 +354,16 @@
                                        /*last_updated_timestamp=*/base::Time());
       });
 
-  ON_CALL(favicon_service_, GetFaviconImageForPageURL)
-      .WillByDefault(
-          [icon_url](auto, favicon_base::FaviconImageCallback callback, auto) {
-            favicon_base::FaviconImageResult result;
-            result.icon_url = GURL(icon_url);
-            std::move(callback).Run(result);
-            base::CancelableTaskTracker::TaskId kTaskId = 1;
-            return kTaskId;
-          });
+  ON_CALL(favicon_service_, GetLargestRawFaviconForPageURL)
+      .WillByDefault([icon_url](auto, auto, auto,
+                                favicon_base::FaviconRawBitmapCallback callback,
+                                auto) {
+        favicon_base::FaviconRawBitmapResult result;
+        result.icon_url = GURL(icon_url);
+        std::move(callback).Run(result);
+        base::CancelableTaskTracker::TaskId kTaskId = 1;
+        return kTaskId;
+      });
 
   // Create the expected proto.
   sync_pb::UnencryptedSharingMessage message;
@@ -401,13 +402,13 @@
   std::string guid = base::Uuid::GenerateRandomV4().AsLowercaseString();
   EXPECT_CALL(*device_source_, GetDeviceByGuid(guid)).Times(0);
 
-  ON_CALL(favicon_service_, GetFaviconImageForPageURL)
-      .WillByDefault(
-          [](auto, favicon_base::FaviconImageCallback callback, auto) {
-            std::move(callback).Run(favicon_base::FaviconImageResult());
-            base::CancelableTaskTracker::TaskId kTaskId = 1;
-            return kTaskId;
-          });
+  ON_CALL(favicon_service_, GetLargestRawFaviconForPageURL)
+      .WillByDefault([](auto, auto, auto,
+                        favicon_base::FaviconRawBitmapCallback callback, auto) {
+        std::move(callback).Run(favicon_base::FaviconRawBitmapResult());
+        base::CancelableTaskTracker::TaskId kTaskId = 1;
+        return kTaskId;
+      });
 
   EXPECT_CALL(*sharing_message_sender_, SendUnencryptedMessageToDevice)
       .Times(0);
diff --git a/components/signin/public/base/signin_metrics.cc b/components/signin/public/base/signin_metrics.cc
index 68a6234..5726fca 100644
--- a/components/signin/public/base/signin_metrics.cc
+++ b/components/signin/public/base/signin_metrics.cc
@@ -510,6 +510,10 @@
       base::RecordAction(
           base::UserMetricsAction("Signin_Signin_FromProductSpecifications"));
       break;
+    case AccessPoint::ACCESS_POINT_ACCOUNT_MENU_FAILED_SWITCH:
+      base::RecordAction(
+          base::UserMetricsAction("Signin_Signin_FromAccountMenuFailedSwitch"));
+      break;
     case AccessPoint::ACCESS_POINT_MAX:
       NOTREACHED_IN_MIGRATION();
       break;
@@ -679,6 +683,7 @@
     case AccessPoint::ACCESS_POINT_WEBAUTHN_MODAL_DIALOG:
     case AccessPoint::ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN_WITH_SYNC_PROMO:
     case AccessPoint::ACCESS_POINT_ACCOUNT_MENU:
+    case AccessPoint::ACCESS_POINT_ACCOUNT_MENU_FAILED_SWITCH:
     case AccessPoint::ACCESS_POINT_MAX:
       NOTREACHED_IN_MIGRATION() << "Signin_Impression_From* user actions"
                                 << " are not recorded for access point "
diff --git a/components/signin/public/base/signin_metrics.h b/components/signin/public/base/signin_metrics.h
index cb3a73b1..267711b 100644
--- a/components/signin/public/base/signin_metrics.h
+++ b/components/signin/public/base/signin_metrics.h
@@ -239,6 +239,9 @@
   ACCESS_POINT_ACCOUNT_MENU = 67,
   // Signin via Product Specifications.
   ACCESS_POINT_PRODUCT_SPECIFICATIONS = 68,
+  // The user is signed-back into their previous account after failing to switch
+  // to a new one.
+  ACCESS_POINT_ACCOUNT_MENU_FAILED_SWITCH = 69,
 
   // Add values above this line with a corresponding label to the
   // "SigninAccessPoint" enum in
diff --git a/components/signin/public/base/signin_metrics_unittest.cc b/components/signin/public/base/signin_metrics_unittest.cc
index dcc5031..6e1f10b6 100644
--- a/components/signin/public/base/signin_metrics_unittest.cc
+++ b/components/signin/public/base/signin_metrics_unittest.cc
@@ -202,6 +202,8 @@
         return "AvatarBubbleSigninWithSyncPromo";
       case AccessPoint::ACCESS_POINT_ACCOUNT_MENU:
         return "AccountMenu";
+      case AccessPoint::ACCESS_POINT_ACCOUNT_MENU_FAILED_SWITCH:
+        return "AccountMenuFailedSwitch";
       case AccessPoint::ACCESS_POINT_PRODUCT_SPECIFICATIONS:
         return "ProductSpecifications";
       case AccessPoint::ACCESS_POINT_MAX:
diff --git a/components/sync/protocol/contact_info_specifics.proto b/components/sync/protocol/contact_info_specifics.proto
index 03ded844..ae65545 100644
--- a/components/sync/protocol/contact_info_specifics.proto
+++ b/components/sync/protocol/contact_info_specifics.proto
@@ -15,6 +15,15 @@
 package sync_pb;
 
 message ContactInfoSpecifics {
+  // Used to distinguish whether the address is the dedicated Home or Work
+  // address of the user's account.
+  // This translates into `AutofillProfile::RecordType::kAccount*`.
+  enum AddressType {
+    REGULAR = 0;
+    HOME = 1;
+    WORK = 2;
+  }
+
   // Represents the validation status of a stored value.
   enum VerificationStatus {
     // No verification status assigned.
@@ -71,6 +80,8 @@
   optional string guid = 1;
   reserved 2;
   reserved "source";
+  optional AddressType address_type = 56 [default = REGULAR];
+
   // The number of time this profile has been used.
   optional int64 use_count = 3;
 
diff --git a/components/sync/protocol/proto_enum_conversions.cc b/components/sync/protocol/proto_enum_conversions.cc
index 4374319..ba035b97 100644
--- a/components/sync/protocol/proto_enum_conversions.cc
+++ b/components/sync/protocol/proto_enum_conversions.cc
@@ -124,6 +124,17 @@
 }
 
 const char* ProtoEnumToString(
+    sync_pb::ContactInfoSpecifics::AddressType address_type) {
+  ASSERT_ENUM_BOUNDS(sync_pb::ContactInfoSpecifics, AddressType, REGULAR, WORK);
+  switch (address_type) {
+    ENUM_CASE(sync_pb::ContactInfoSpecifics, REGULAR);
+    ENUM_CASE(sync_pb::ContactInfoSpecifics, HOME);
+    ENUM_CASE(sync_pb::ContactInfoSpecifics, WORK);
+  }
+  NOTREACHED();
+}
+
+const char* ProtoEnumToString(
     sync_pb::ContactInfoSpecifics::VerificationStatus verification_status) {
   ASSERT_ENUM_BOUNDS(sync_pb::ContactInfoSpecifics, VerificationStatus,
                      VERIFICATION_STATUS_UNSPECIFIED, SERVER_PARSED);
diff --git a/components/sync/protocol/proto_enum_conversions.h b/components/sync/protocol/proto_enum_conversions.h
index 7e5711e..132c988b 100644
--- a/components/sync/protocol/proto_enum_conversions.h
+++ b/components/sync/protocol/proto_enum_conversions.h
@@ -58,6 +58,9 @@
     sync_pb::CommitResponse::ResponseType response_type);
 
 const char* ProtoEnumToString(
+    sync_pb::ContactInfoSpecifics::AddressType address_type);
+
+const char* ProtoEnumToString(
     sync_pb::ContactInfoSpecifics::VerificationStatus verification_status);
 
 const char* ProtoEnumToString(
diff --git a/components/sync/protocol/proto_enum_conversions_unittest.cc b/components/sync/protocol/proto_enum_conversions_unittest.cc
index 4beabed43..bbcb4402 100644
--- a/components/sync/protocol/proto_enum_conversions_unittest.cc
+++ b/components/sync/protocol/proto_enum_conversions_unittest.cc
@@ -135,5 +135,9 @@
   TestEnumStringsNonEmpty(sync_pb::ThemeSpecifics::BrowserColorScheme);
 }
 
+TEST(ProtoEnumConversionsTest, GetContactInfoAddressType) {
+  TestEnumStringsNonEmpty(sync_pb::ContactInfoSpecifics::AddressType);
+}
+
 }  // namespace
 }  // namespace syncer
diff --git a/components/sync/protocol/proto_visitors.h b/components/sync/protocol/proto_visitors.h
index a47cc74..22c1daac 100644
--- a/components/sync/protocol/proto_visitors.h
+++ b/components/sync/protocol/proto_visitors.h
@@ -375,6 +375,7 @@
 
 VISIT_PROTO_FIELDS(const sync_pb::ContactInfoSpecifics& proto) {
   VISIT(guid);
+  VISIT_ENUM(address_type);
   VISIT(use_count);
   VISIT(use_date_unix_epoch_seconds);
   VISIT(use_date2_unix_epoch_seconds);
diff --git a/components/viz/demo/demo_main.cc b/components/viz/demo/demo_main.cc
index c587f54e..dc70376 100644
--- a/components/viz/demo/demo_main.cc
+++ b/components/viz/demo/demo_main.cc
@@ -209,20 +209,22 @@
   ui::OzonePlatform::InitializeForGPU(params);
   done->Signal();
 }
-#endif
 
-}  // namespace
-
-int main(int argc, char** argv) {
-#if BUILDFLAG(IS_OZONE)
+void InitFeatureList(int argc, char** argv) {
   base::CommandLine command_line(argc, argv);
   auto feature_list = std::make_unique<base::FeatureList>();
   feature_list->InitFromCommandLine(
       command_line.GetSwitchValueASCII(switches::kEnableFeatures),
       command_line.GetSwitchValueASCII(switches::kDisableFeatures));
   base::FeatureList::SetInstance(std::move(feature_list));
+}
+#endif
 
-  base::Thread rendering_thread("GLRenderingVEAClientThread");
+}  // namespace
+
+int main(int argc, char** argv) {
+#if BUILDFLAG(IS_OZONE)
+  InitFeatureList(argc, argv);
 #endif
 
   InitBase base(argc, argv);
@@ -234,14 +236,15 @@
   params.single_process = true;
   ui::OzonePlatform::InitializeForUI(params);
 
+  base::Thread rendering_thread("GLRenderingVEAClientThread");
   base::Thread::Options options;
   options.message_pump_type = base::MessagePumpType::UI;
   CHECK(rendering_thread.StartWithOptions(std::move(options)));
 
-  const bool use_gpu = command_line.HasSwitch(switches::kVizDemoUseGPU);
+  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+  const bool use_gpu = command_line->HasSwitch(switches::kVizDemoUseGPU);
   if (use_gpu) {
-    command_line.AppendSwitchASCII(switches::kUseGL,
-                                   gl::kGLImplementationEGLName);
+    command_line->AppendSwitchASCII(switches::kUseGL, gl::kGLImplementationEGLName);
     base::WaitableEvent done(base::WaitableEvent::ResetPolicy::AUTOMATIC,
                              base::WaitableEvent::InitialState::NOT_SIGNALED);
     rendering_thread.task_runner()->PostTask(
diff --git a/components/viz/test/test_gpu_service_holder.cc b/components/viz/test/test_gpu_service_holder.cc
index b91d0dfde..c44d02a 100644
--- a/components/viz/test/test_gpu_service_holder.cc
+++ b/components/viz/test/test_gpu_service_holder.cc
@@ -318,7 +318,7 @@
   if (gpu_preferences.gr_context_type == gpu::GrContextType::kGraphiteDawn) {
 #if BUILDFLAG(SKIA_USE_DAWN)
     init_params.dawn_context_provider = gpu::DawnContextProvider::Create(
-        gpu_preferences,
+        gpu_preferences, gpu::DawnContextProvider::DefaultValidateAdapterFn,
         gpu::GpuDriverBugWorkarounds(
             gpu_feature_info.enabled_gpu_driver_bug_workarounds));
     CHECK(init_params.dawn_context_provider);
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 9fb0577..8cae82e 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -106,7 +106,6 @@
     "//components/link_header_util",
     "//components/metrics",
     "//components/metrics:single_sample_metrics",
-    "//components/miracle_parameter/common",
     "//components/network_session_configurator/browser",
     "//components/offline_pages/buildflags",
     "//components/offline_pages/core/request_header",
diff --git a/content/browser/DEPS b/content/browser/DEPS
index 760f1c4..659af98 100644
--- a/content/browser/DEPS
+++ b/content/browser/DEPS
@@ -26,7 +26,6 @@
   "+components/link_header_util",
   "+components/metrics",
   "+components/metrics:single_sample_metrics",
-  "+components/miracle_parameter",
   "+components/network_session_configurator/common",
   "+components/offline_pages/buildflags/buildflags.h",
   "+components/offline_pages/core/request_header",
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
index 697062e..92a4a63 100644
--- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -124,8 +124,6 @@
   // everywhere.
   enabled_features->emplace_back(
       features::kEnableAccessibilityAriaVirtualContent);
-  // crbug.com/330686628 - temporary until enabled everywhere
-  enabled_features->emplace_back(blink::features::kPasswordStrongLabel);
   // crbug.com/339418716 - temporary until enabled by default
   enabled_features->emplace_back(blink::features::kPermissionElement);
   DumpAccessibilityTestBase::ChooseFeatures(enabled_features,
diff --git a/content/browser/browser_interface_binders.cc b/content/browser/browser_interface_binders.cc
index 644d23d..9a5404b7 100644
--- a/content/browser/browser_interface_binders.cc
+++ b/content/browser/browser_interface_binders.cc
@@ -1243,11 +1243,8 @@
       base::BindRepeating(&ClipboardHostImpl::Create));
   map->Add<blink::mojom::SpeculationHost>(
       base::BindRepeating(&SpeculationHostImpl::Bind));
-  if (base::FeatureList::IsEnabled(
-          blink::features::kAnchorElementInteraction)) {
-    map->Add<blink::mojom::AnchorElementInteractionHost>(
-        base::BindRepeating(&AnchorElementInteractionHostImpl::Create));
-  }
+  map->Add<blink::mojom::AnchorElementInteractionHost>(
+      base::BindRepeating(&AnchorElementInteractionHostImpl::Create));
   GetContentClient()->browser()->RegisterBrowserInterfaceBindersForFrame(host,
                                                                          map);
 
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc
index d8b5414..1a22ac9 100644
--- a/content/browser/download/download_manager_impl.cc
+++ b/content/browser/download/download_manager_impl.cc
@@ -763,6 +763,10 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   download::DownloadItemImpl* download = CreateActiveItem(id, *info);
+  if (delegate_ && info->save_info) {
+    info->save_info->needs_obfuscation =
+        delegate_->ShouldObfuscateDownload(download);
+  }
   content::devtools_instrumentation::WillBeginDownload(info.get(), download);
   std::move(callback).Run(
       std::move(info), download,
@@ -1505,6 +1509,17 @@
 
   auto* rfh = RenderFrameHost::FromID(params->render_process_host_id(),
                                       params->render_frame_host_routing_id());
+
+  // Untrusted network access is revoked, download request is interrupted.
+  if (rfh && rfh->IsUntrustedNetworkDisabled()) {
+    // TODO(crbug.com/365033308): Create a new download interrupt reason for
+    // fenced frame network revocation.
+    CreateInterruptedDownload(
+        std::move(params), download::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED,
+        weak_factory_.GetWeakPtr());
+    return;
+  }
+
   StoragePartitionConfig storage_partition_config;
   if (rfh && serialized_embedder_download_data.empty()) {
     storage_partition_config =
diff --git a/content/browser/preloading/prerender/prerender_browsertest.cc b/content/browser/preloading/prerender/prerender_browsertest.cc
index dc1e1564..4c1896d7 100644
--- a/content/browser/preloading/prerender/prerender_browsertest.cc
+++ b/content/browser/preloading/prerender/prerender_browsertest.cc
@@ -9833,8 +9833,7 @@
  public:
   PrerenderEagernessBrowserTest() {
     feature_list_.InitWithFeatures(
-        {{blink::features::kAnchorElementInteraction},
-         {blink::features::kSpeculationRulesPointerDownHeuristics},
+        {{blink::features::kSpeculationRulesPointerDownHeuristics},
          {blink::features::kSpeculationRulesPointerHoverHeuristics}},
         {});
   }
diff --git a/content/browser/startup_helper.cc b/content/browser/startup_helper.cc
index ea054fe..1e5eaed 100644
--- a/content/browser/startup_helper.cc
+++ b/content/browser/startup_helper.cc
@@ -15,7 +15,6 @@
 #include "base/task/thread_pool/initialization_util.h"
 #include "base/task/thread_pool/thread_pool_instance.h"
 #include "build/build_config.h"
-#include "components/miracle_parameter/common/public/miracle_parameter.h"
 #include "content/common/thread_pool_util.h"
 #include "content/public/common/content_switch_dependent_feature_overrides.h"
 #include "content/public/common/content_switches.h"
diff --git a/content/public/browser/download_manager_delegate.cc b/content/public/browser/download_manager_delegate.cc
index 45abb30..412f4db 100644
--- a/content/public/browser/download_manager_delegate.cc
+++ b/content/public/browser/download_manager_delegate.cc
@@ -59,6 +59,11 @@
   return true;
 }
 
+bool DownloadManagerDelegate::ShouldObfuscateDownload(
+    download::DownloadItem* item) {
+  return false;
+}
+
 bool DownloadManagerDelegate::InterceptDownloadIfApplicable(
     const GURL& url,
     const std::string& user_agent,
diff --git a/content/public/browser/download_manager_delegate.h b/content/public/browser/download_manager_delegate.h
index de4f99b..5a4538f 100644
--- a/content/public/browser/download_manager_delegate.h
+++ b/content/public/browser/download_manager_delegate.h
@@ -135,6 +135,10 @@
   virtual bool ShouldOpenDownload(download::DownloadItem* item,
                                   DownloadOpenDelayedCallback callback);
 
+  // Returns whether the download contents should be temporarily obfuscated for
+  // access prevention.
+  virtual bool ShouldObfuscateDownload(download::DownloadItem* item);
+
   // Checks and hands off the downloading to be handled by another system based
   // on mime type. Returns true if the download was intercepted.
   virtual bool InterceptDownloadIfApplicable(
diff --git a/content/shell/browser/shell_platform_delegate_views.cc b/content/shell/browser/shell_platform_delegate_views.cc
index 2671778..ff331b2 100644
--- a/content/shell/browser/shell_platform_delegate_views.cc
+++ b/content/shell/browser/shell_platform_delegate_views.cc
@@ -215,6 +215,7 @@
                       .SetProperty(
                           views::kFlexBehaviorKey,
                           views::FlexSpecification(
+                              views::LayoutOrientation::kHorizontal,
                               views::MinimumFlexSizeRule::kScaleToMinimum,
                               views::MaximumFlexSizeRule::kUnbounded))
                       // Left padding  = 2, Right padding = 2
diff --git a/content/test/data/accessibility/html/input-password-expected-blink.txt b/content/test/data/accessibility/html/input-password-expected-blink.txt
index 15bbcaf..250e7d4 100644
--- a/content/test/data/accessibility/html/input-password-expected-blink.txt
+++ b/content/test/data/accessibility/html/input-password-expected-blink.txt
@@ -2,8 +2,6 @@
 ++genericContainer ignored
 ++++genericContainer
 ++++++textField protected inputType='password' value='%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2' textSelStart=6 textSelEnd=6
-++++++++genericContainer ignored
-++++++++++genericContainer ignored
-++++++++++++genericContainer
-++++++++++++++staticText name='%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2'
-++++++++++++++++inlineTextBox name='%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2'
+++++++++genericContainer
+++++++++++staticText name='%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2'
+++++++++++++inlineTextBox name='%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2'
diff --git a/content/test/data/accessibility/html/input-password-expected-fuchsia.txt b/content/test/data/accessibility/html/input-password-expected-fuchsia.txt
index f0fa6ac..026369bc 100644
--- a/content/test/data/accessibility/html/input-password-expected-fuchsia.txt
+++ b/content/test/data/accessibility/html/input-password-expected-fuchsia.txt
@@ -2,8 +2,6 @@
 ++UNKNOWN hidden
 ++++UNKNOWN
 ++++++TEXT_FIELD focusable has_input_focus actions='{DEFAULT, SET_VALUE}' value='%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2'
-++++++++UNKNOWN hidden
-++++++++++UNKNOWN hidden
-++++++++++++UNKNOWN
-++++++++++++++STATIC_TEXT label='%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2'
-++++++++++++++++UNKNOWN label='%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2'
+++++++++UNKNOWN
+++++++++++STATIC_TEXT label='%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2'
+++++++++++++UNKNOWN label='%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2'
diff --git a/content/test/data/accessibility/html/input-password-obscured-expected-blink.txt b/content/test/data/accessibility/html/input-password-obscured-expected-blink.txt
index 392f91c..e8a397c 100644
--- a/content/test/data/accessibility/html/input-password-obscured-expected-blink.txt
+++ b/content/test/data/accessibility/html/input-password-obscured-expected-blink.txt
@@ -2,8 +2,6 @@
 ++genericContainer ignored
 ++++genericContainer
 ++++++textField protected value='%E2%80%A2%E2%80%A2%E2%80%A2'
-++++++++genericContainer ignored
-++++++++++genericContainer ignored
-++++++++++++genericContainer
-++++++++++++++staticText name='%E2%80%A2%E2%80%A2%E2%80%A2'
-++++++++++++++++inlineTextBox name='%E2%80%A2%E2%80%A2%E2%80%A2'
+++++++++genericContainer
+++++++++++staticText name='%E2%80%A2%E2%80%A2%E2%80%A2'
+++++++++++++inlineTextBox name='%E2%80%A2%E2%80%A2%E2%80%A2'
diff --git a/content/test/data/accessibility/html/input-types-with-placeholder-expected-blink.txt b/content/test/data/accessibility/html/input-types-with-placeholder-expected-blink.txt
index 121e036..29399e8 100644
--- a/content/test/data/accessibility/html/input-types-with-placeholder-expected-blink.txt
+++ b/content/test/data/accessibility/html/input-types-with-placeholder-expected-blink.txt
@@ -19,11 +19,7 @@
 ++++++++++inlineTextBox name='Password: '
 ++++++++textField editable protected name='Password:' placeholder='pwd'
 ++++++++++genericContainer ignored
-++++++++++genericContainer ignored
-++++++++++++genericContainer ignored
-++++++++++++++genericContainer editable
-++++++++++++genericContainer ignored invisible
-++++++++++++++staticText ignored invisible
+++++++++++genericContainer editable
 ++++++labelText
 ++++++++staticText name='Search: '
 ++++++++++inlineTextBox name='Search: '
diff --git a/content/test/data/accessibility/html/input-types-with-value-and-placeholder-expected-blink.txt b/content/test/data/accessibility/html/input-types-with-value-and-placeholder-expected-blink.txt
index 190559e0..b6b72f9 100644
--- a/content/test/data/accessibility/html/input-types-with-value-and-placeholder-expected-blink.txt
+++ b/content/test/data/accessibility/html/input-types-with-value-and-placeholder-expected-blink.txt
@@ -23,13 +23,9 @@
 ++++++++++inlineTextBox name='Password: '
 ++++++++textField editable protected name='Password:' placeholder='placeholder' value='%E2%80%A2%E2%80%A2%E2%80%A2'
 ++++++++++genericContainer ignored invisible
-++++++++++genericContainer ignored
-++++++++++++genericContainer ignored
-++++++++++++++genericContainer editable
-++++++++++++++++staticText editable name='%E2%80%A2%E2%80%A2%E2%80%A2'
-++++++++++++++++++inlineTextBox editable name='%E2%80%A2%E2%80%A2%E2%80%A2'
-++++++++++++genericContainer ignored invisible
-++++++++++++++staticText ignored invisible
+++++++++++genericContainer editable
+++++++++++++staticText editable name='%E2%80%A2%E2%80%A2%E2%80%A2'
+++++++++++++++inlineTextBox editable name='%E2%80%A2%E2%80%A2%E2%80%A2'
 ++++++labelText
 ++++++++staticText name='Search: '
 ++++++++++inlineTextBox name='Search: '
diff --git a/content/test/data/accessibility/html/input-types-with-value-expected-blink.txt b/content/test/data/accessibility/html/input-types-with-value-expected-blink.txt
index d984fda..babd33b 100644
--- a/content/test/data/accessibility/html/input-types-with-value-expected-blink.txt
+++ b/content/test/data/accessibility/html/input-types-with-value-expected-blink.txt
@@ -20,13 +20,9 @@
 ++++++++staticText name='Password: '
 ++++++++++inlineTextBox name='Password: '
 ++++++++textField editable protected name='Password:' value='%E2%80%A2%E2%80%A2%E2%80%A2'
-++++++++++genericContainer ignored
-++++++++++++genericContainer ignored
-++++++++++++++genericContainer editable
-++++++++++++++++staticText editable name='%E2%80%A2%E2%80%A2%E2%80%A2'
-++++++++++++++++++inlineTextBox editable name='%E2%80%A2%E2%80%A2%E2%80%A2'
-++++++++++++genericContainer ignored invisible
-++++++++++++++staticText ignored invisible
+++++++++++genericContainer editable
+++++++++++++staticText editable name='%E2%80%A2%E2%80%A2%E2%80%A2'
+++++++++++++++inlineTextBox editable name='%E2%80%A2%E2%80%A2%E2%80%A2'
 ++++++labelText
 ++++++++staticText name='Search: '
 ++++++++++inlineTextBox name='Search: '
diff --git a/google_apis/gaia/gaia_urls.cc b/google_apis/gaia/gaia_urls.cc
index 1e64cf0..d3db7fd4 100644
--- a/google_apis/gaia/gaia_urls.cc
+++ b/google_apis/gaia/gaia_urls.cc
@@ -269,11 +269,11 @@
 }
 
 const std::string& GaiaUrls::oauth2_chrome_client_id() const {
-  return oauth2_chrome_client_id_;
+  return google_apis::GetOAuth2ClientID(google_apis::CLIENT_MAIN);
 }
 
 const std::string& GaiaUrls::oauth2_chrome_client_secret() const {
-  return oauth2_chrome_client_secret_;
+  return google_apis::GetOAuth2ClientSecret(google_apis::CLIENT_MAIN);
 }
 
 const GURL& GaiaUrls::oauth2_token_url() const {
@@ -373,11 +373,6 @@
     tasks_api_origin_url_ = GURL(kDefaultTasksApiBaseUrl);
   }
 
-  oauth2_chrome_client_id_ =
-      google_apis::GetOAuth2ClientID(google_apis::CLIENT_MAIN);
-  oauth2_chrome_client_secret_ =
-      google_apis::GetOAuth2ClientSecret(google_apis::CLIENT_MAIN);
-
   CHECK(!gaia_origin_.opaque());
   const GURL gaia_url = gaia_origin_.GetURL();
   CHECK(gaia_url.SchemeIsHTTPOrHTTPS());
diff --git a/google_apis/gaia/gaia_urls.h b/google_apis/gaia/gaia_urls.h
index 78d0f21b..fd71309 100644
--- a/google_apis/gaia/gaia_urls.h
+++ b/google_apis/gaia/gaia_urls.h
@@ -116,9 +116,6 @@
   GURL account_capabilities_url_;
   GURL get_check_connection_info_url_;
 
-  std::string oauth2_chrome_client_id_;
-  std::string oauth2_chrome_client_secret_;
-
   GURL oauth2_token_url_;
   GURL oauth2_issue_token_url_;
   GURL oauth2_token_info_url_;
diff --git a/google_apis/google_api_keys-inc.cc b/google_apis/google_api_keys-inc.cc
index 7a58dd9..9c0f7ea 100644
--- a/google_apis/google_api_keys-inc.cc
+++ b/google_apis/google_api_keys-inc.cc
@@ -231,7 +231,7 @@
   }
   ~MetricsKeyCache() = default;
 
-  std::string metrics_key() const { return metrics_key_; }
+  const std::string& metrics_key() const { return metrics_key_; }
 
  private:
   std::string metrics_key_;
@@ -266,11 +266,11 @@
 
   ~MainApiKeyCache() = default;
 
-  std::string api_key() const { return api_key_; }
+  const std::string& api_key() const { return api_key_; }
 #if BUILDFLAG(SUPPORT_EXTERNAL_GOOGLE_API_KEY)
   void set_api_key(const std::string& api_key) { api_key_ = api_key; }
 #endif
-  std::string api_key_non_stable() const { return api_key_non_stable_; }
+  const std::string& api_key_non_stable() const { return api_key_non_stable_; }
 
  private:
   std::string api_key_;
@@ -319,15 +319,15 @@
   }
   ~PerFeatureApiKeysCache() = default;
 
-  std::string api_key_remoting() const { return api_key_remoting_; }
-  std::string api_key_soda() const { return api_key_soda_; }
+  const std::string& api_key_remoting() const { return api_key_remoting_; }
+  const std::string& api_key_soda() const { return api_key_soda_; }
 #if !BUILDFLAG(IS_ANDROID)
-  std::string api_key_hats() const { return api_key_hats_; }
+  const std::string& api_key_hats() const { return api_key_hats_; }
 #endif
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-  std::string api_key_sharing() const { return api_key_sharing_; }
-  std::string api_key_read_aloud() const { return api_key_read_aloud_; }
-  std::string api_key_fresnel() const { return api_key_fresnel_; }
+  const std::string& api_key_sharing() const { return api_key_sharing_; }
+  const std::string& api_key_read_aloud() const { return api_key_read_aloud_; }
+  const std::string& api_key_fresnel() const { return api_key_fresnel_; }
 #endif
 
  private:
@@ -400,7 +400,7 @@
   }
   ~OAuthClientInfoCache() = default;
 
-  std::string GetClientID(OAuth2Client client) const {
+  const std::string& GetClientID(OAuth2Client client) const {
     DCHECK_LT(client, CLIENT_NUM_ITEMS);
     return client_ids_[client];
   }
@@ -411,7 +411,7 @@
   }
 #endif
 
-  std::string GetClientSecret(OAuth2Client client) const {
+  const std::string& GetClientSecret(OAuth2Client client) const {
     DCHECK_LT(client, CLIENT_NUM_ITEMS);
     return client_secrets_[client];
   }
@@ -440,40 +440,40 @@
   return GetAPIKey() != DUMMY_API_TOKEN;
 }
 
-std::string GetAPIKey(::version_info::Channel channel) {
+const std::string& GetAPIKey(::version_info::Channel channel) {
   return channel == ::version_info::Channel::STABLE
              ? GetAPIKey()
              : g_main_api_key_cache.Get().api_key_non_stable();
 }
 
-std::string GetAPIKey() {
+const std::string& GetAPIKey() {
   return g_main_api_key_cache.Get().api_key();
 }
 
-std::string GetRemotingAPIKey() {
+const std::string& GetRemotingAPIKey() {
   return g_per_feature_api_key_cache.Get().api_key_remoting();
 }
 
-std::string GetSodaAPIKey() {
+const std::string& GetSodaAPIKey() {
   return g_per_feature_api_key_cache.Get().api_key_soda();
 }
 
 #if !BUILDFLAG(IS_ANDROID)
-std::string GetHatsAPIKey() {
+const std::string& GetHatsAPIKey() {
   return g_per_feature_api_key_cache.Get().api_key_hats();
 }
 #endif
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-std::string GetSharingAPIKey() {
+const std::string& GetSharingAPIKey() {
   return g_per_feature_api_key_cache.Get().api_key_sharing();
 }
 
-std::string GetReadAloudAPIKey() {
+const std::string& GetReadAloudAPIKey() {
   return g_per_feature_api_key_cache.Get().api_key_read_aloud();
 }
 
-std::string GetFresnelAPIKey() {
+const std::string& GetFresnelAPIKey() {
   return g_per_feature_api_key_cache.Get().api_key_fresnel();
 }
 #endif
@@ -488,7 +488,7 @@
 }
 #endif
 
-std::string GetMetricsKey() {
+const std::string& GetMetricsKey() {
   return g_metrics_key_cache.Get().metrics_key();
 }
 
@@ -504,11 +504,11 @@
   return true;
 }
 
-std::string GetOAuth2ClientID(OAuth2Client client) {
+const std::string& GetOAuth2ClientID(OAuth2Client client) {
   return g_oauth_client_info_cache.Get().GetClientID(client);
 }
 
-std::string GetOAuth2ClientSecret(OAuth2Client client) {
+const std::string& GetOAuth2ClientSecret(OAuth2Client client) {
   return g_oauth_client_info_cache.Get().GetClientSecret(client);
 }
 
diff --git a/google_apis/google_api_keys.h b/google_apis/google_api_keys.h
index 7097fd9..9a06ea31 100644
--- a/google_apis/google_api_keys.h
+++ b/google_apis/google_api_keys.h
@@ -81,35 +81,35 @@
 // `AddDefaultAPIKeyToRequest()` rather than calling this method and manually
 // adding the key.
 COMPONENT_EXPORT(GOOGLE_APIS)
-std::string GetAPIKey(version_info::Channel channel);
+const std::string& GetAPIKey(version_info::Channel channel);
 
 // Retrieves the API key, for the stable channel.
 //
 // DEPRECATED: Use `GetAPIKey(channel)` to get the right key for your
 // distribution channel instead of calling this function directly.
-COMPONENT_EXPORT(GOOGLE_APIS) std::string GetAPIKey();
+COMPONENT_EXPORT(GOOGLE_APIS) const std::string& GetAPIKey();
 
 // Retrieves the Chrome Remote Desktop API key.
-COMPONENT_EXPORT(GOOGLE_APIS) std::string GetRemotingAPIKey();
+COMPONENT_EXPORT(GOOGLE_APIS) const std::string& GetRemotingAPIKey();
 
 // Retrieves the Speech On-Device API (SODA) API Key.
-COMPONENT_EXPORT(GOOGLE_APIS) std::string GetSodaAPIKey();
+COMPONENT_EXPORT(GOOGLE_APIS) const std::string& GetSodaAPIKey();
 
 #if !BUILDFLAG(IS_ANDROID)
 // Retrieves the HaTS API Key. This key is only used for desktop HaTS
 // and the internal API Key is only defined in non-Android builds.
-COMPONENT_EXPORT(GOOGLE_APIS) std::string GetHatsAPIKey();
+COMPONENT_EXPORT(GOOGLE_APIS) const std::string& GetHatsAPIKey();
 #endif
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 // Retrieves the Sharing API Key.
-COMPONENT_EXPORT(GOOGLE_APIS) std::string GetSharingAPIKey();
+COMPONENT_EXPORT(GOOGLE_APIS) const std::string& GetSharingAPIKey();
 
 // Retrieves the ReadAloud API Key.
-COMPONENT_EXPORT(GOOGLE_APIS) std::string GetReadAloudAPIKey();
+COMPONENT_EXPORT(GOOGLE_APIS) const std::string& GetReadAloudAPIKey();
 
 // Retrieves the Fresnel API Key.
-COMPONENT_EXPORT(GOOGLE_APIS) std::string GetFresnelAPIKey();
+COMPONENT_EXPORT(GOOGLE_APIS) const std::string& GetFresnelAPIKey();
 #endif
 
 #if BUILDFLAG(SUPPORT_EXTERNAL_GOOGLE_API_KEY)
@@ -121,7 +121,7 @@
 #endif
 
 // Retrieves the key used to sign metrics (UMA/UKM) uploads.
-COMPONENT_EXPORT(GOOGLE_APIS) std::string GetMetricsKey();
+COMPONENT_EXPORT(GOOGLE_APIS) const std::string& GetMetricsKey();
 
 // Represents the different sets of client IDs and secrets in use.
 enum OAuth2Client {
@@ -141,7 +141,7 @@
 // Note that the ID should be escaped for the context you use it in,
 // e.g. URL-escaped if you use it in a URL.
 COMPONENT_EXPORT(GOOGLE_APIS)
-std::string GetOAuth2ClientID(OAuth2Client client);
+const std::string& GetOAuth2ClientID(OAuth2Client client);
 
 // Retrieves the OAuth2 client secret for the specified client, or the
 // empty string if not set.
@@ -149,7 +149,7 @@
 // Note that the secret should be escaped for the context you use it
 // in, e.g. URL-escaped if you use it in a URL.
 COMPONENT_EXPORT(GOOGLE_APIS)
-std::string GetOAuth2ClientSecret(OAuth2Client client);
+const std::string& GetOAuth2ClientSecret(OAuth2Client client);
 
 #if BUILDFLAG(IS_IOS)
 // Sets the client id for the specified client. Should be called as early as
diff --git a/gpu/command_buffer/service/dawn_context_provider.cc b/gpu/command_buffer/service/dawn_context_provider.cc
index a305711..a39334e5 100644
--- a/gpu/command_buffer/service/dawn_context_provider.cc
+++ b/gpu/command_buffer/service/dawn_context_provider.cc
@@ -325,6 +325,12 @@
          gl::GetANGLEImplementation() == gl::ANGLEImplementation::kSwiftShader;
 }
 
+// static
+bool DawnContextProvider::DefaultValidateAdapterFn(wgpu::BackendType,
+                                                   wgpu::Adapter) {
+  return true;
+}
+
 // Owns the dawn instance/adapter/device so that it's lifetime is not linked to
 // a specific DawnContextProvider.
 class DawnSharedContext : public base::RefCountedThreadSafe<DawnSharedContext>,
@@ -335,6 +341,7 @@
   bool Initialize(wgpu::BackendType backend_type,
                   bool force_fallback_adapter,
                   const GpuPreferences& gpu_preferences,
+                  DawnContextProvider::ValidateAdapterFn validate_adapter_fn,
                   const GpuDriverBugWorkarounds& gpu_driver_workarounds);
   void SetCachingInterface(
       std::unique_ptr<webgpu::DawnCachingInterface> caching_interface);
@@ -449,6 +456,7 @@
     wgpu::BackendType backend_type,
     bool force_fallback_adapter,
     const GpuPreferences& gpu_preferences,
+    DawnContextProvider::ValidateAdapterFn validate_adapter_fn,
     const GpuDriverBugWorkarounds& gpu_driver_workarounds) {
   // Make Dawn experimental API and WGSL features available since access to this
   // instance doesn't exit the GPU process.
@@ -539,6 +547,10 @@
   }
   adapter_ = wgpu::Adapter(adapters[0].Get());
 
+  if (!validate_adapter_fn(backend_type, adapter_)) {
+    return false;
+  }
+
   // Start initializing dawn device here.
   wgpu::DawnCacheDeviceDescriptor cache_desc;
   cache_desc.loadDataFunction = &DawnSharedContext::LoadCachedData;
@@ -760,20 +772,22 @@
 
 std::unique_ptr<DawnContextProvider> DawnContextProvider::Create(
     const GpuPreferences& gpu_preferences,
+    ValidateAdapterFn validate_adapter_fn,
     const GpuDriverBugWorkarounds& gpu_driver_workarounds) {
   return DawnContextProvider::CreateWithBackend(
       GetDefaultBackendType(), DefaultForceFallbackAdapter(), gpu_preferences,
-      gpu_driver_workarounds);
+      validate_adapter_fn, gpu_driver_workarounds);
 }
 
 std::unique_ptr<DawnContextProvider> DawnContextProvider::CreateWithBackend(
     wgpu::BackendType backend_type,
     bool force_fallback_adapter,
     const GpuPreferences& gpu_preferences,
+    ValidateAdapterFn validate_adapter_fn,
     const GpuDriverBugWorkarounds& gpu_driver_workarounds) {
   auto dawn_shared_context = base::MakeRefCounted<DawnSharedContext>();
   if (!dawn_shared_context->Initialize(backend_type, force_fallback_adapter,
-                                       gpu_preferences,
+                                       gpu_preferences, validate_adapter_fn,
                                        gpu_driver_workarounds)) {
     return nullptr;
   }
diff --git a/gpu/command_buffer/service/dawn_context_provider.h b/gpu/command_buffer/service/dawn_context_provider.h
index 9469381..64fbb1d 100644
--- a/gpu/command_buffer/service/dawn_context_provider.h
+++ b/gpu/command_buffer/service/dawn_context_provider.h
@@ -10,6 +10,7 @@
 #include <memory>
 #include <optional>
 
+#include "base/functional/function_ref.h"
 #include "base/memory/raw_ptr.h"
 #include "build/build_config.h"
 #include "gpu/command_buffer/common/constants.h"
@@ -36,14 +37,22 @@
 
 class GPU_GLES2_EXPORT DawnContextProvider {
  public:
+  using ValidateAdapterFn =
+      base::FunctionRef<bool(wgpu::BackendType, wgpu::Adapter)>;
+
+  // `validate_adapter_fn` will be called after the wgpu::Adapter is available
+  // to check if it should be used. If the function returns false creation will
+  // fail.
   static std::unique_ptr<DawnContextProvider> Create(
-      const GpuPreferences& gpu_preferences = GpuPreferences(),
+      const GpuPreferences& gpu_preferences,
+      ValidateAdapterFn validate_adapter_fn = DefaultValidateAdapterFn,
       const GpuDriverBugWorkarounds& gpu_driver_workarounds =
           GpuDriverBugWorkarounds());
   static std::unique_ptr<DawnContextProvider> CreateWithBackend(
       wgpu::BackendType backend_type,
-      bool force_fallback_adapter = false,
-      const GpuPreferences& gpu_preferences = GpuPreferences(),
+      bool force_fallback_adapter,
+      const GpuPreferences& gpu_preferences,
+      ValidateAdapterFn validate_adapter_fn = DefaultValidateAdapterFn,
       const GpuDriverBugWorkarounds& gpu_driver_workarounds =
           GpuDriverBugWorkarounds());
 
@@ -55,6 +64,9 @@
   static wgpu::BackendType GetDefaultBackendType();
   static bool DefaultForceFallbackAdapter();
 
+  // Default function that will say adapter is supported.
+  static bool DefaultValidateAdapterFn(wgpu::BackendType, wgpu::Adapter);
+
   DawnContextProvider(const DawnContextProvider&) = delete;
   DawnContextProvider& operator=(const DawnContextProvider&) = delete;
   ~DawnContextProvider();
diff --git a/gpu/command_buffer/service/shared_image/shared_image_test_base.cc b/gpu/command_buffer/service/shared_image/shared_image_test_base.cc
index 5b1dcee..b6d9487 100644
--- a/gpu/command_buffer/service/shared_image/shared_image_test_base.cc
+++ b/gpu/command_buffer/service/shared_image/shared_image_test_base.cc
@@ -168,7 +168,8 @@
   if (context_type == GrContextType::kGraphiteDawn) {
 #if BUILDFLAG(SKIA_USE_DAWN)
     dawn_context_provider_ = DawnContextProvider::CreateWithBackend(
-        GetDawnBackendType(), DawnForceFallbackAdapter(), gpu_preferences_);
+        GetDawnBackendType(), DawnForceFallbackAdapter(), gpu_preferences_,
+        DawnContextProvider::DefaultValidateAdapterFn);
     ASSERT_TRUE(dawn_context_provider_);
 #else
     FAIL() << "Graphite-Dawn not available";
diff --git a/gpu/command_buffer/service/webgpu_decoder_impl.cc b/gpu/command_buffer/service/webgpu_decoder_impl.cc
index d9740a2f..de9f5f7 100644
--- a/gpu/command_buffer/service/webgpu_decoder_impl.cc
+++ b/gpu/command_buffer/service/webgpu_decoder_impl.cc
@@ -1466,10 +1466,9 @@
   std::vector<const char*> require_device_disabled_toggles;
 
   // Disallows usage of SPIR-V by default for security (we only ensure that WGSL
-  // is secure), unless --enable-unsafe-webgpu is used.
-  if (safety_level_ != webgpu::SafetyLevel::kUnsafe) {
-    require_device_enabled_toggles.push_back("disallow_spirv");
-  }
+  // is secure).
+  require_device_enabled_toggles.push_back("disallow_spirv");
+
   // Enable timestamp quantization by default for privacy, unless
   // --enable-webgpu-developer-features is used.
   if (safety_level_ == webgpu::SafetyLevel::kSafe) {
diff --git a/gpu/config/gpu_info_collector.cc b/gpu/config/gpu_info_collector.cc
index e49e97e..0a25b2c 100644
--- a/gpu/config/gpu_info_collector.cc
+++ b/gpu/config/gpu_info_collector.cc
@@ -266,10 +266,8 @@
     std::vector<const char*>* force_enabled_toggles,
     std::vector<const char*>* force_disabled_toggles) {
   // Disallows usage of SPIR-V by default for security (we only ensure that WGSL
-  // is secure), unless --enable-unsafe-webgpu is used.
-  if (!enable_unsafe_webgpu) {
-    force_enabled_toggles->push_back("disallow_spirv");
-  }
+  // is secure).
+  force_enabled_toggles->push_back("disallow_spirv");
   // Enable timestamp quantization by default for privacy, unless
   // --enable-webgpu-developer-features is used.
   if (!enable_webgpu_developer_features) {
diff --git a/gpu/ipc/service/gpu_init.cc b/gpu/ipc/service/gpu_init.cc
index 0f567da..c6a9a91 100644
--- a/gpu/ipc/service/gpu_init.cc
+++ b/gpu/ipc/service/gpu_init.cc
@@ -1142,19 +1142,16 @@
     return false;
   }
 
-  dawn_context_provider_ = gpu::DawnContextProvider::Create(
-      gpu_preferences_,
-      GpuDriverBugWorkarounds(
-          gpu_feature_info_.enabled_gpu_driver_bug_workarounds));
-  if (dawn_context_provider_) {
-    if (dawn_context_provider_->backend_type() == wgpu::BackendType::Vulkan) {
-#if BUILDFLAG(ENABLE_VULKAN)
-      // Even though Dawn successfully initialized Vulkan we still have to check
-      // if the Vulkan driver is problematic and shouldn't be used.
+#if BUILDFLAG(IS_ANDROID)
+  auto validate_adapter_fn = [this](wgpu::BackendType backend_type,
+                                    wgpu::Adapter adapter) {
+    if (backend_type == wgpu::BackendType::Vulkan) {
+      // Check if the GPU and driver version are suitable for using Vulkan
+      // based hardware acceleration.
       wgpu::AdapterInfo adapter_info;
       wgpu::AdapterPropertiesVk adapter_properties_vk;
       adapter_info.nextInChain = &adapter_properties_vk;
-      dawn_context_provider_->GetAdapter().GetInfo(&adapter_info);
+      adapter.GetInfo(&adapter_info);
 
       VulkanPhysicalDeviceProperties device_properties;
       device_properties.device_name = adapter_info.device;
@@ -1162,16 +1159,21 @@
       device_properties.device_id = adapter_info.deviceID;
       device_properties.driver_version = adapter_properties_vk.driverVersion;
 
-#if BUILDFLAG(IS_ANDROID)
       if (!CheckVulkanCompatibilities(device_properties, gpu_info_)) {
-        // The device is not compatible with Vulkan.
-        dawn_context_provider_.reset();
         return false;
       }
-#endif
-#endif
     }
+    return true;
+  };
+#else
+  auto validate_adapter_fn = DawnContextProvider::DefaultValidateAdapterFn;
+#endif
 
+  dawn_context_provider_ = gpu::DawnContextProvider::Create(
+      gpu_preferences_, validate_adapter_fn,
+      GpuDriverBugWorkarounds(
+          gpu_feature_info_.enabled_gpu_driver_bug_workarounds));
+  if (dawn_context_provider_) {
     return true;
   }
 #endif
diff --git a/internal b/internal
index a8d0d66..ca63fca 160000
--- a/internal
+++ b/internal
@@ -1 +1 @@
-Subproject commit a8d0d660e4e573f811962bfaeb3437067efd8d24
+Subproject commit ca63fcaf7e7371805b35b08795cf529fae9fad80
diff --git a/ios/chrome/browser/autofill/model/form_structure_browsertest.mm b/ios/chrome/browser/autofill/model/form_structure_browsertest.mm
index 490ba3ef..8ba33d9 100644
--- a/ios/chrome/browser/autofill/model/form_structure_browsertest.mm
+++ b/ios/chrome/browser/autofill/model/form_structure_browsertest.mm
@@ -378,7 +378,7 @@
 // DISABLED_DataDrivenHeuristics.
 TEST_P(FormStructureBrowserTest, DataDrivenHeuristics) {
 #if !BUILDFLAG(USE_INTERNAL_AUTOFILL_PATTERNS)
-  if (GetActiveHeuristicSource() != HeuristicSource::kLegacy) {
+  if (GetActiveHeuristicSource() != HeuristicSource::kLegacyRegexes) {
     GTEST_SKIP() << "DataDrivenHeuristics tests are only supported with legacy "
                     "parsing patterns";
   }
diff --git a/ios/chrome/browser/autofill/ui_bundled/manual_fill/DEPS b/ios/chrome/browser/autofill/ui_bundled/manual_fill/DEPS
index 9bec02d..c6c6cef 100644
--- a/ios/chrome/browser/autofill/ui_bundled/manual_fill/DEPS
+++ b/ios/chrome/browser/autofill/ui_bundled/manual_fill/DEPS
@@ -1,11 +1,3 @@
-specific_include_rules = {
-  # web::HttpServer is deprecated in favor of net::EmbeddedTestServer.
-  # TODO:(crbug.com/891834) Remove this exception.
-  "keyboard_observer_egtest\.mm": [
-    "+ios/web/public/test/http_server",
-  ],
-}
-
 include_rules = [
   "+ios/chrome/browser/affiliations/model",
   "+ios/chrome/browser/favicon/model",
diff --git a/ios/chrome/browser/autofill/ui_bundled/manual_fill/card_coordinator.mm b/ios/chrome/browser/autofill/ui_bundled/manual_fill/card_coordinator.mm
index 480f629..9b886b5 100644
--- a/ios/chrome/browser/autofill/ui_bundled/manual_fill/card_coordinator.mm
+++ b/ios/chrome/browser/autofill/ui_bundled/manual_fill/card_coordinator.mm
@@ -9,6 +9,7 @@
 #import "components/autofill/core/browser/data_model/credit_card.h"
 #import "components/autofill/core/browser/personal_data_manager.h"
 #import "components/autofill/ios/browser/autofill_driver_ios.h"
+#import "components/strings/grit/components_strings.h"
 #import "ios/chrome/browser/autofill/model/personal_data_manager_factory.h"
 #import "ios/chrome/browser/autofill/ui_bundled/manual_fill/card_list_delegate.h"
 #import "ios/chrome/browser/autofill/ui_bundled/manual_fill/card_view_controller.h"
@@ -131,7 +132,8 @@
       _personalDataManager->payments_data_manager()
           .IsPaymentMethodsMandatoryReauthEnabled() &&
       [_reauthenticationModule canAttemptReauth]) {
-    NSString* reason = l10n_util::GetNSString(IDS_IOS_AUTOFILL_REAUTH_REASON);
+    NSString* reason = l10n_util::GetNSString(
+        IDS_PAYMENTS_AUTOFILL_SETTINGS_EDIT_MANDATORY_REAUTH);
     auto completionHandler = ^(ReauthenticationResult result) {
       if (result != ReauthenticationResult::kFailure) {
         [self didTriggerOpenCardDetails:card inEditMode:editMode];
diff --git a/ios/chrome/browser/autofill/ui_bundled/manual_fill/manual_fill_all_plus_address_view_controller.mm b/ios/chrome/browser/autofill/ui_bundled/manual_fill/manual_fill_all_plus_address_view_controller.mm
index 66cc80c..397523e 100644
--- a/ios/chrome/browser/autofill/ui_bundled/manual_fill/manual_fill_all_plus_address_view_controller.mm
+++ b/ios/chrome/browser/autofill/ui_bundled/manual_fill/manual_fill_all_plus_address_view_controller.mm
@@ -12,13 +12,17 @@
 #import "ios/chrome/browser/autofill/ui_bundled/manual_fill/manual_fill_plus_address_cell.h"
 #import "ios/chrome/browser/net/model/crurl.h"
 #import "ios/chrome/browser/shared/ui/list_model/list_item+Controller.h"
+#import "ios/chrome/browser/shared/ui/table_view/cells/table_view_link_header_footer_item.h"
 #import "ios/chrome/browser/shared/ui/table_view/table_view_favicon_data_source.h"
 #import "ios/chrome/common/ui/favicon/favicon_attributes.h"
 #import "ui/base/l10n/l10n_util_mac.h"
 
 namespace manual_fill {
 
-enum ManualFallbackItemType : NSInteger { kPlusAddress = kItemTypeEnumZero };
+enum ManualFallbackItemType : NSInteger {
+  kHeader = kItemTypeEnumZero,
+  kPlusAddress
+};
 
 }  // namespace manual_fill
 
@@ -56,6 +60,8 @@
   doneButton.accessibilityIdentifier =
       manual_fill::kPlusAddressDoneButtonAccessibilityIdentifier;
   self.navigationItem.rightBarButtonItem = doneButton;
+
+  [self addHeaderItem];
 }
 
 #pragma mark - UITableViewDataSource
@@ -124,4 +130,16 @@
              }];
 }
 
+// Adds a header containing text.
+- (void)addHeaderItem {
+  TableViewLinkHeaderFooterItem* headerItem =
+      [[TableViewLinkHeaderFooterItem alloc]
+          initWithType:manual_fill::ManualFallbackItemType::kHeader];
+
+  headerItem.text =
+      l10n_util::GetNSString(IDS_SELECT_PLUS_ADDRESS_HEADER_TEXT_IOS);
+
+  [self presentHeaderItem:headerItem];
+}
+
 @end
diff --git a/ios/chrome/browser/browsing_data/model/tabs_closure_util.mm b/ios/chrome/browser/browsing_data/model/tabs_closure_util.mm
index 85ead45..f9964b6 100644
--- a/ios/chrome/browser/browsing_data/model/tabs_closure_util.mm
+++ b/ios/chrome/browser/browsing_data/model/tabs_closure_util.mm
@@ -164,7 +164,7 @@
 
   auto lock = web_state_list->StartBatchOperation();
   web_state_list->CloseWebStatesAtIndices(
-      WebStateList::CLOSE_NO_FLAGS,
+      WebStateList::CLOSE_TABS_CLEANUP,
       RemovingIndexes(std::move(indices_to_close)));
 }
 }  // namespace tabs_closure_util
diff --git a/ios/chrome/browser/context_menu/ui_bundled/context_menu_configuration_provider.h b/ios/chrome/browser/context_menu/ui_bundled/context_menu_configuration_provider.h
index 37346e18..563f55a 100644
--- a/ios/chrome/browser/context_menu/ui_bundled/context_menu_configuration_provider.h
+++ b/ios/chrome/browser/context_menu/ui_bundled/context_menu_configuration_provider.h
@@ -18,10 +18,22 @@
 // Object creating the configuration (action items...) for the context menu.
 @interface ContextMenuConfigurationProvider : NSObject
 
-// Instantiates with a `browser`.
+// Instantiates with a `browser`. The context menu will be presented for the
+// active webState.
+// TODO(crbug.com/365698103): Remove the browser dependency.
 - (instancetype)initWithBrowser:(Browser*)browser
              baseViewController:(UIViewController*)baseViewController;
 
+// Instantiates with a `browser` and a base `webState`. The context menu will
+// only be presented for this webState.
+// `isLensOverlay`: Whether the context menu is presented in the LensOverlay.
+// LensOverlay presents the webState in a modal sheet.
+// TODO(crbug.com/365698103): Remove the browser dependency.
+- (instancetype)initWithBrowser:(Browser*)browser
+             baseViewController:(UIViewController*)baseViewController
+                   baseWebState:(web::WebState*)webState
+                  isLensOverlay:(BOOL)isLensOverlay;
+
 // Returns a configuration for a context menu, based on its associated
 // `webState`, `params` and `baseViewController`.
 // `params` is copied in order to be used in blocks.
diff --git a/ios/chrome/browser/context_menu/ui_bundled/context_menu_configuration_provider.mm b/ios/chrome/browser/context_menu/ui_bundled/context_menu_configuration_provider.mm
index 49f91c3..fdc036c 100644
--- a/ios/chrome/browser/context_menu/ui_bundled/context_menu_configuration_provider.mm
+++ b/ios/chrome/browser/context_menu/ui_bundled/context_menu_configuration_provider.mm
@@ -5,6 +5,7 @@
 #import "ios/chrome/browser/context_menu/ui_bundled/context_menu_configuration_provider.h"
 
 #import "base/ios/ios_util.h"
+#import "base/memory/weak_ptr.h"
 #import "base/metrics/histogram_functions.h"
 #import "base/metrics/user_metrics.h"
 #import "base/strings/sys_string_conversions.h"
@@ -92,24 +93,43 @@
 
 @property(nonatomic, weak) UIViewController* baseViewController;
 
-@property(nonatomic, assign, readonly) web::WebState* currentWebState;
+@property(nonatomic, assign, readonly) web::WebState* webState;
 
 @end
 
-@implementation ContextMenuConfigurationProvider
+@implementation ContextMenuConfigurationProvider {
+  /// Override the `webState` when the context menu is not triggered by the
+  /// `currentWebState`.
+  base::WeakPtr<web::WebState> _baseWebState;
+
+  // Whether the context menu is presented in the lens overlay.
+  BOOL _isLensOverlay;
+}
 
 - (instancetype)initWithBrowser:(Browser*)browser
-             baseViewController:(UIViewController*)baseViewController {
+             baseViewController:(UIViewController*)baseViewController
+                   baseWebState:(web::WebState*)webState
+                  isLensOverlay:(BOOL)isLensOverlay {
   self = [super init];
   if (self) {
     _browser = browser;
     _baseViewController = baseViewController;
     _imageSaver = [[ImageSaver alloc] initWithBrowser:self.browser];
     _imageCopier = [[ImageCopier alloc] initWithBrowser:self.browser];
+    _baseWebState = webState ? webState->GetWeakPtr() : nullptr;
+    _isLensOverlay = isLensOverlay;
   }
   return self;
 }
 
+- (instancetype)initWithBrowser:(Browser*)browser
+             baseViewController:(UIViewController*)baseViewController {
+  return [self initWithBrowser:browser
+            baseViewController:baseViewController
+                  baseWebState:nullptr
+                 isLensOverlay:NO];
+}
+
 - (void)stop {
   _browser = nil;
   _baseViewController = nil;
@@ -117,6 +137,7 @@
   _imageSaver = nil;
   [_imageCopier stop];
   _imageCopier = nil;
+  _baseWebState = nullptr;
 }
 
 - (void)dealloc {
@@ -143,7 +164,10 @@
 
 #pragma mark - Properties
 
-- (web::WebState*)currentWebState {
+- (web::WebState*)webState {
+  if (base::FeatureList::IsEnabled(kEnableLensOverlay) && _baseWebState) {
+    return _baseWebState.get();
+  }
   return self.browser ? self.browser->GetWebStateList()->GetActiveWebState()
                       : nullptr;
 }
@@ -181,7 +205,7 @@
 
   // Prevent context menu from displaying for a tab which is no longer the
   // current one.
-  if (webState != self.currentWebState) {
+  if (webState != self.webState) {
     return nil;
   }
 
@@ -402,10 +426,13 @@
   [linkMenuElements addObject:copyLink];
 
   // Share Link.
-  if (base::FeatureList::IsEnabled(kShareInWebContextMenuIOS)) {
+  // TODO(crbug.com/351817704): Disable the share menu with lens overlay as the
+  // share sheet is not presented in `baseViewController`.
+  if (!_isLensOverlay &&
+      base::FeatureList::IsEnabled(kShareInWebContextMenuIOS)) {
     UIAction* shareLink = [actionFactory actionToShareWithBlock:^{
       [weakSelf shareURLFromContextMenu:linkURL
-                               URLTitle:params.text
+                               URLTitle:params.text ? params.text : @""
                                  params:params];
     }];
     [linkMenuElements addObject:shareLink];
@@ -450,7 +477,7 @@
     }
     [strongSelf.imageCopier copyImageAtURL:imageURL
                                   referrer:referrer
-                                  webState:strongSelf.currentWebState
+                                  webState:strongSelf.webState
                         baseViewController:strongSelf.baseViewController];
   }];
   [imageMenuElements addObject:copyImage];
@@ -476,7 +503,10 @@
   // Shares the URL of the image and not the image itself.
   // This avoids doing in process image processing by working as the share sheet
   // fetches the image to share it.
-  if (base::FeatureList::IsEnabled(kShareInWebContextMenuIOS) && !isLink) {
+  // TODO(crbug.com/351817704): Disable the share menu with lens overlay as the
+  // share sheet is not presented in `baseViewController`.
+  if (!_isLensOverlay &&
+      base::FeatureList::IsEnabled(kShareInWebContextMenuIOS) && !isLink) {
     UIAction* shareImage = [actionFactory actionToShareWithBlock:^{
       [weakSelf shareURLFromContextMenu:imageURL
                                URLTitle:params.title_attribute
@@ -495,7 +525,7 @@
                  usingLens:(BOOL)usingLens
                   referrer:(web::Referrer)referrer {
   ImageFetchTabHelper* imageFetcher =
-      ImageFetchTabHelper::FromWebState(self.currentWebState);
+      ImageFetchTabHelper::FromWebState(self.webState);
   DCHECK(imageFetcher);
   __weak ContextMenuConfigurationProvider* weakSelf = self;
   imageFetcher->GetImageData(imageURL, referrer, ^(NSData* data) {
@@ -595,9 +625,12 @@
       [[NSMutableArray alloc] init];
 
   // Open Image.
-  UIAction* openImage = [actionFactory actionOpenImageWithURL:imageURL
-                                                   completion:nil];
-  [imageOpeningMenuElements addObject:openImage];
+  // TODO(crbug.com/351817704): Add open image suport for lens overlay.
+  if (!_isLensOverlay) {
+    UIAction* openImage = [actionFactory actionOpenImageWithURL:imageURL
+                                                     completion:nil];
+    [imageOpeningMenuElements addObject:openImage];
+  }
 
   // Open Image in new tab.
   UrlLoadParams loadParams = UrlLoadParams::InNewTab(imageURL);
@@ -650,7 +683,10 @@
                       scenario:(MenuScenarioHistogram)scenario
                       referrer:(web::Referrer)referrer
                       webState:(web::WebState*)webState {
+  // TODO(crbug.com/351817704): Save to photo is not presented in the
+  // baseViewController.
   const bool saveToPhotosAvailable =
+      !_isLensOverlay &&
       IsSaveToPhotosAvailable(self.browser->GetBrowserState());
 
   BrowserActionFactory* actionFactory =
@@ -670,7 +706,7 @@
     }
     [strongSelf.imageSaver saveImageAtURL:imageURL
                                  referrer:referrer
-                                 webState:strongSelf.currentWebState
+                                 webState:strongSelf.webState
                        baseViewController:strongSelf.baseViewController];
     base::UmaHistogramEnumeration(
         kSaveToPhotosContextMenuActionsHistogram,
@@ -716,6 +752,9 @@
     imageSearchingElementsWithURL:(GURL)imageURL
                          scenario:(MenuScenarioHistogram)scenario
                          referrer:(web::Referrer)referrer {
+  if (_isLensOverlay) {
+    return @[];
+  }
   BrowserActionFactory* actionFactory =
       [[BrowserActionFactory alloc] initWithBrowser:self.browser
                                            scenario:scenario];
diff --git a/ios/chrome/browser/lens_overlay/coordinator/BUILD.gn b/ios/chrome/browser/lens_overlay/coordinator/BUILD.gn
index 08e8692f..90d8669 100644
--- a/ios/chrome/browser/lens_overlay/coordinator/BUILD.gn
+++ b/ios/chrome/browser/lens_overlay/coordinator/BUILD.gn
@@ -43,6 +43,7 @@
     "//ios/chrome/browser/autocomplete/model",
     "//ios/chrome/browser/bookmarks/model",
     "//ios/chrome/browser/bookmarks/model:model_utils",
+    "//ios/chrome/browser/context_menu/ui_bundled:coordinator",
     "//ios/chrome/browser/default_browser/model:default_browser_interest_signals",
     "//ios/chrome/browser/feature_engagement/model",
     "//ios/chrome/browser/https_upgrades/model",
diff --git a/ios/chrome/browser/lens_overlay/coordinator/DEPS b/ios/chrome/browser/lens_overlay/coordinator/DEPS
index 889878d0..01dd204 100644
--- a/ios/chrome/browser/lens_overlay/coordinator/DEPS
+++ b/ios/chrome/browser/lens_overlay/coordinator/DEPS
@@ -13,5 +13,6 @@
   "+ios/chrome/browser/ui/lens/lens_entrypoint.h",
   "+ios/chrome/browser/signin/model/authentication_service.h",
   "+ios/chrome/browser/signin/model/authentication_service_factory.h",
+  "+ios/chrome/browser/context_menu/ui_bundled/context_menu_configuration_provider.h",
   "+components/lens",
 ]
diff --git a/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_coordinator.mm b/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_coordinator.mm
index a8c0df1..c32d3150 100644
--- a/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_coordinator.mm
+++ b/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_coordinator.mm
@@ -7,6 +7,7 @@
 #import "base/apple/foundation_util.h"
 #import "base/check.h"
 #import "components/prefs/pref_service.h"
+#import "ios/chrome/browser/context_menu/ui_bundled/context_menu_configuration_provider.h"
 #import "ios/chrome/browser/feature_engagement/model/tracker_factory.h"
 #import "ios/chrome/browser/lens_overlay/coordinator/lens_omnibox_client.h"
 #import "ios/chrome/browser/lens_overlay/coordinator/lens_omnibox_client_delegate.h"
@@ -92,6 +93,8 @@
   LensResultPageViewController* _resultViewController;
   /// The mediator for lens results.
   LensResultPageMediator* _resultMediator;
+  /// The context menu configuration provider for the result page.
+  ContextMenuConfigurationProvider* _resultContextMenuProvider;
 
   /// The tab helper associated with the current UI.
   LensOverlayTabHelper* _associatedTabHelper;
@@ -361,7 +364,7 @@
   return YES;
 }
 
-- (void)presentationControllerWillDismiss:
+- (void)presentationControllerDidDismiss:
     (UIPresentationController*)presentationController {
   UIViewController* presentedViewController =
       presentationController.presentedViewController;
@@ -519,8 +522,15 @@
 
   _resultViewController = [[LensResultPageViewController alloc] init];
 
+  _resultContextMenuProvider = [[ContextMenuConfigurationProvider alloc]
+         initWithBrowser:browser
+      baseViewController:_resultViewController
+            baseWebState:_resultMediator.webState
+           isLensOverlay:YES];
+
   _resultMediator.consumer = _resultViewController;
   _resultMediator.webViewContainer = _resultViewController.webViewContainer;
+  _resultMediator.contextMenuProvider = _resultContextMenuProvider;
 
   [self showResultsBottomSheet];
 
@@ -576,6 +586,8 @@
 
 - (void)stopResultPage {
   [_selectionViewController removeSelectionWithClearText:YES];
+  [_resultContextMenuProvider stop];
+  _resultContextMenuProvider = nil;
   [_resultViewController.presentingViewController
       dismissViewControllerAnimated:YES
                          completion:nil];
diff --git a/ios/chrome/browser/lens_overlay/coordinator/lens_result_page_mediator.h b/ios/chrome/browser/lens_overlay/coordinator/lens_result_page_mediator.h
index 1a30d311..3714c45f 100644
--- a/ios/chrome/browser/lens_overlay/coordinator/lens_result_page_mediator.h
+++ b/ios/chrome/browser/lens_overlay/coordinator/lens_result_page_mediator.h
@@ -13,6 +13,7 @@
 #import "ios/web/public/web_state.h"
 
 @protocol ApplicationCommands;
+@class ContextMenuConfigurationProvider;
 @protocol LensResultPageConsumer;
 @protocol LensResultPageWebStateDelegate;
 
@@ -35,6 +36,10 @@
 @property(nonatomic, weak) id<LensOverlayBottomSheetPresentationDelegate>
     presentationDelegate;
 
+/// WebState context menu configuration provider.
+@property(nonatomic, weak)
+    ContextMenuConfigurationProvider* contextMenuProvider;
+
 - (instancetype)
      initWithWebStateParams:(const web::WebState::CreateParams&)params
     browserWebStateDelegate:(web::WebStateDelegate*)browserWebStateDelegate
diff --git a/ios/chrome/browser/lens_overlay/coordinator/lens_result_page_mediator.mm b/ios/chrome/browser/lens_overlay/coordinator/lens_result_page_mediator.mm
index b96c57d..34e0021 100644
--- a/ios/chrome/browser/lens_overlay/coordinator/lens_result_page_mediator.mm
+++ b/ios/chrome/browser/lens_overlay/coordinator/lens_result_page_mediator.mm
@@ -9,6 +9,7 @@
 #import "base/functional/bind.h"
 #import "base/strings/string_util.h"
 #import "base/strings/sys_string_conversions.h"
+#import "ios/chrome/browser/context_menu/ui_bundled/context_menu_configuration_provider.h"
 #import "ios/chrome/browser/lens_overlay/coordinator/lens_result_page_web_state_delegate.h"
 #import "ios/chrome/browser/lens_overlay/ui/lens_result_page_consumer.h"
 #import "ios/chrome/browser/shared/public/commands/application_commands.h"
@@ -17,6 +18,7 @@
 #import "ios/chrome/browser/tabs/model/tab_helper_util.h"
 #import "ios/web/public/navigation/web_state_policy_decider.h"
 #import "ios/web/public/navigation/web_state_policy_decider_bridge.h"
+#import "ios/web/public/ui/context_menu_params.h"
 #import "ios/web/public/ui/crw_web_view_proxy.h"
 #import "ios/web/public/web_state.h"
 #import "ios/web/public/web_state_delegate.h"
@@ -225,13 +227,26 @@
     contextMenuConfigurationForParams:(const web::ContextMenuParams&)params
                     completionHandler:(void (^)(UIContextMenuConfiguration*))
                                           completionHandler {
-  completionHandler(nil);
-  // TODO(crbug.com/349100642): Add context menu configuration.
+  UIContextMenuConfiguration* configuration =
+      [self.contextMenuProvider contextMenuConfigurationForWebState:webState
+                                                             params:params];
+  completionHandler(configuration);
 }
 
 - (void)webState:(web::WebState*)webState
     contextMenuWillCommitWithAnimator:
         (id<UIContextMenuInteractionCommitAnimating>)animator {
+  GURL URLToLoad = [self.contextMenuProvider URLToLoad];
+  if (!URLToLoad.is_valid()) {
+    return;
+  }
+  if (_webState) {
+    web::Referrer referrer(_webState->GetLastCommittedURL(),
+                           web::ReferrerPolicyDefault);
+    _webState->OpenURL(web::WebState::OpenURLParams(
+        URLToLoad, referrer, WindowOpenDisposition::CURRENT_TAB,
+        ui::PAGE_TRANSITION_LINK, false));
+  }
 }
 
 - (UIView*)webViewContainerForWebState:(web::WebState*)webState {
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_mediator.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_mediator.mm
index 5f4dbf3..0a473f5 100644
--- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_mediator.mm
+++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_mediator.mm
@@ -265,8 +265,12 @@
 - (void)onPrimaryAccountChanged:
     (const signin::PrimaryAccountChangeEvent&)event {
   switch (event.GetEventTypeFor(signin::ConsentLevel::kSignin)) {
-    case signin::PrimaryAccountChangeEvent::Type::kSet:
     case signin::PrimaryAccountChangeEvent::Type::kCleared:
+      if (self.authService->IsAccountSwitchInProgress()) {
+        break;
+      }
+      [[fallthrough]];
+    case signin::PrimaryAccountChangeEvent::Type::kSet:
       [self updateAccountImage];
       [self updateAccountErrorBadge];
       break;
diff --git a/ios/chrome/browser/profile/model/BUILD.gn b/ios/chrome/browser/profile/model/BUILD.gn
index 221b19a..e8a14a1 100644
--- a/ios/chrome/browser/profile/model/BUILD.gn
+++ b/ios/chrome/browser/profile/model/BUILD.gn
@@ -25,12 +25,10 @@
     "//base",
     "//components/bookmarks/browser",
     "//components/content_settings/core/browser",
-    "//components/content_settings/core/browser:cookie_settings",
-    "//components/content_settings/core/common",
     "//components/keyed_service/ios",
-    "//components/metrics:metrics_pref_names",
     "//components/net_log",
     "//components/policy/core/common",
+    "//components/pref_registry",
     "//components/prefs",
     "//components/profile_metrics",
     "//components/proxy_config",
@@ -53,17 +51,15 @@
     "//ios/chrome/browser/shared/model/prefs:browser_prefs",
     "//ios/chrome/browser/shared/model/prefs:pref_names",
     "//ios/chrome/browser/shared/model/profile",
-    "//ios/chrome/browser/shared/model/url:constants",
+    "//ios/chrome/browser/shared/model/profile:forward",
     "//ios/chrome/browser/shared/public/features:system_flags",
     "//ios/chrome/browser/signin/model",
     "//ios/chrome/browser/supervised_user/model",
     "//ios/chrome/browser/supervised_user/model:sync_settings_factory",
     "//ios/components/cookie_util",
     "//ios/net",
-    "//ios/web/public/browsing_data",
     "//ios/web/public/thread",
     "//net",
-    "//net/traffic_annotation",
   ]
 }
 
diff --git a/ios/chrome/browser/profile/model/DEPS b/ios/chrome/browser/profile/model/DEPS
index 7f4fd3e2..89d11d8 100644
--- a/ios/chrome/browser/profile/model/DEPS
+++ b/ios/chrome/browser/profile/model/DEPS
@@ -1,20 +1,11 @@
 include_rules = [
-  # TODO(crbug.com/358267438): Remove once forwarding headers are removed.
-  "+ios/chrome/browser/browser_state/model",
-
   "+ios/chrome/browser/content_settings/model",
   "+ios/chrome/browser/net/model",
-  "+ios/chrome/browser/optimization_guide/model",
-  "+ios/chrome/browser/page_info",
-  "+ios/chrome/browser/plus_addresses/model",
   "+ios/chrome/browser/policy/model",
   "+ios/chrome/browser/prefs/model",
   "+ios/chrome/browser/profile_metrics/model",
-  "+ios/chrome/browser/push_notification/model",
-  "+ios/chrome/browser/segmentation_platform/model",
   "+ios/chrome/browser/signin/model",
   "+ios/chrome/browser/supervised_user/model",
-  "+ios/chrome/browser/unified_consent/model",
 ]
 
 specific_include_rules = {
@@ -28,6 +19,7 @@
     "+ios/chrome/browser/commerce/model",
     "+ios/chrome/browser/consent_auditor/model",
     "+ios/chrome/browser/content_notification/model",
+    "+ios/chrome/browser/content_settings/model",
     "+ios/chrome/browser/contextual_panel/model",
     "+ios/chrome/browser/contextual_panel/sample/model",
     "+ios/chrome/browser/crash_report/model",
@@ -52,22 +44,26 @@
     "+ios/chrome/browser/language/model",
     "+ios/chrome/browser/mailto_handler/model",
     "+ios/chrome/browser/metrics/model",
+    "+ios/chrome/browser/optimization_guide/model",
     "+ios/chrome/browser/page_content_annotations/model",
     "+ios/chrome/browser/page_image/model",
+    "+ios/chrome/browser/page_info",
     "+ios/chrome/browser/passwords/model",
     "+ios/chrome/browser/photos/model",
-    "+ios/chrome/browser/policy/model",
+    "+ios/chrome/browser/plus_addresses/model",
     "+ios/chrome/browser/policy_url_blocking/model",
     "+ios/chrome/browser/power_bookmarks/model",
     "+ios/chrome/browser/prerender/model",
     "+ios/chrome/browser/price_insights/model",
     "+ios/chrome/browser/promos_manager/model",
+    "+ios/chrome/browser/push_notification/model",
     "+ios/chrome/browser/reading_list/model",
     "+ios/chrome/browser/safe_browsing/model",
     "+ios/chrome/browser/safety_check/model",
     "+ios/chrome/browser/saved_tab_groups/model",
     "+ios/chrome/browser/screen_time/model",
     "+ios/chrome/browser/search_engines/model",
+    "+ios/chrome/browser/segmentation_platform/model",
     "+ios/chrome/browser/sessions/model",
     "+ios/chrome/browser/share_extension/model",
     "+ios/chrome/browser/sharing_message/model",
@@ -76,11 +72,15 @@
     "+ios/chrome/browser/text_selection/model",
     "+ios/chrome/browser/translate/model",
     "+ios/chrome/browser/trusted_vault/model",
+    "+ios/chrome/browser/unified_consent/model",
     "+ios/chrome/browser/unit_conversion",
     "+ios/chrome/browser/visited_url_ranking/model",
     "+ios/chrome/browser/voice/ui_bundled",
     "+ios/chrome/browser/web/model",
     "+ios/chrome/browser/webauthn/model",
     "+ios/chrome/browser/webdata_services/model",
-  ]
+  ],
+  'profile_manager_ios_impl_unittest.mm': [
+    "+ios/chrome/browser/optimization_guide/model",
+  ],
 }
diff --git a/ios/chrome/browser/profile/model/off_the_record_profile_ios_impl.h b/ios/chrome/browser/profile/model/off_the_record_profile_ios_impl.h
index 68e5f06..6bd5556 100644
--- a/ios/chrome/browser/profile/model/off_the_record_profile_ios_impl.h
+++ b/ios/chrome/browser/profile/model/off_the_record_profile_ios_impl.h
@@ -32,10 +32,17 @@
   ~OffTheRecordChromeBrowserStateImpl() override;
 
   // ChromeBrowserState:
+  // TODO(crbug.com/358299863): Remove these functions once fully migrated.
   ChromeBrowserState* GetOriginalChromeBrowserState() override;
   bool HasOffTheRecordChromeBrowserState() const override;
   ChromeBrowserState* GetOffTheRecordChromeBrowserState() override;
   void DestroyOffTheRecordChromeBrowserState() override;
+
+  // ProfileIOS:
+  ProfileIOS* GetOriginalProfile() override;
+  bool HasOffTheRecordProfile() const override;
+  ProfileIOS* GetOffTheRecordProfile() override;
+  void DestroyOffTheRecordProfile() override;
   PrefProxyConfigTracker* GetProxyConfigTracker() override;
   BrowserStatePolicyConnector* GetPolicyConnector() override;
   policy::UserCloudPolicyManager* GetUserCloudPolicyManager() override;
diff --git a/ios/chrome/browser/profile/model/off_the_record_profile_ios_impl.mm b/ios/chrome/browser/profile/model/off_the_record_profile_ios_impl.mm
index b372a07..3d016eb 100644
--- a/ios/chrome/browser/profile/model/off_the_record_profile_ios_impl.mm
+++ b/ios/chrome/browser/profile/model/off_the_record_profile_ios_impl.mm
@@ -65,21 +65,37 @@
 
 ChromeBrowserState*
 OffTheRecordChromeBrowserStateImpl::GetOriginalChromeBrowserState() {
-  return original_chrome_browser_state_;
+  return GetOriginalProfile();
 }
 
 bool OffTheRecordChromeBrowserStateImpl::HasOffTheRecordChromeBrowserState()
     const {
-  return true;
+  return HasOffTheRecordProfile();
 }
 
 ChromeBrowserState*
 OffTheRecordChromeBrowserStateImpl::GetOffTheRecordChromeBrowserState() {
-  return this;
+  return GetOffTheRecordProfile();
 }
 
 void OffTheRecordChromeBrowserStateImpl::
     DestroyOffTheRecordChromeBrowserState() {
+  return DestroyOffTheRecordProfile();
+}
+
+ProfileIOS* OffTheRecordProfileIOSImpl::GetOriginalProfile() {
+  return original_chrome_browser_state_;
+}
+
+bool OffTheRecordProfileIOSImpl::HasOffTheRecordProfile() const {
+  return true;
+}
+
+ProfileIOS* OffTheRecordProfileIOSImpl::GetOffTheRecordProfile() {
+  return this;
+}
+
+void OffTheRecordProfileIOSImpl::DestroyOffTheRecordProfile() {
   NOTREACHED_IN_MIGRATION();
 }
 
diff --git a/ios/chrome/browser/profile/model/profile_ios_impl.h b/ios/chrome/browser/profile/model/profile_ios_impl.h
index 817e3ba3..5eccedf 100644
--- a/ios/chrome/browser/profile/model/profile_ios_impl.h
+++ b/ios/chrome/browser/profile/model/profile_ios_impl.h
@@ -27,8 +27,8 @@
 
 class PrefProxyConfigTracker;
 
-// This class is the implementation of ChromeBrowserState used for
-// non-incognito browsing.
+// This class is the implementation of ProfileIOS used for non-incognito
+// browsing.
 class ChromeBrowserStateImpl final : public ChromeBrowserState {
  public:
   ChromeBrowserStateImpl(const ChromeBrowserStateImpl&) = delete;
@@ -37,10 +37,17 @@
   ~ChromeBrowserStateImpl() override;
 
   // ChromeBrowserState:
+  // TODO(crbug.com/358299863): Remove these functions once fully migrated.
   ChromeBrowserState* GetOriginalChromeBrowserState() override;
   bool HasOffTheRecordChromeBrowserState() const override;
   ChromeBrowserState* GetOffTheRecordChromeBrowserState() override;
   void DestroyOffTheRecordChromeBrowserState() override;
+
+  // ProfileIOS:
+  ProfileIOS* GetOriginalProfile() override;
+  bool HasOffTheRecordProfile() const override;
+  ProfileIOS* GetOffTheRecordProfile() override;
+  void DestroyOffTheRecordProfile() override;
   PrefProxyConfigTracker* GetProxyConfigTracker() override;
   BrowserStatePolicyConnector* GetPolicyConnector() override;
   policy::UserCloudPolicyManager* GetUserCloudPolicyManager() override;
@@ -66,9 +73,8 @@
       CreationMode creation_mode,
       Delegate* delegate);
 
-  // Sets the OffTheRecordChromeBrowserState.
-  void SetOffTheRecordChromeBrowserState(
-      std::unique_ptr<ChromeBrowserState> otr_state);
+  // Sets the OffTheRecordProfileIOS.
+  void SetOffTheRecordProfileIOS(std::unique_ptr<ProfileIOS> otr_state);
 
   // Called when the PrefService is done loading (may be called synchronously
   // if the creation is done with `CreationMode::kSynchronous`).
@@ -76,15 +82,14 @@
                      bool is_new_profile,
                      bool success);
 
-  // The ChromeBrowserState::Delegate that will be notified of the progress
+  // The ProfileIOS::Delegate that will be notified of the progress
   // of the initialisation if not null.
   raw_ptr<Delegate> delegate_;
 
-  // The incognito ChromeBrowserState instance that is associated with this
-  // ChromeBrowserState instance. NULL if `GetOffTheRecordChromeBrowserState()`
-  // has never been called or has not been called since
-  // `DestroyOffTheRecordChromeBrowserState()`.
-  std::unique_ptr<ChromeBrowserState> otr_state_;
+  // The incognito ProfileIOS instance that is associated with this ProfileIOS
+  // instance. NULL if `GetOffTheRecordProfile()` has never been called or has
+  // not been called since `DestroyOffTheRecordProfile()`.
+  std::unique_ptr<ProfileIOS> otr_state_;
 
   // !!! BIG HONKING WARNING !!!
   //  The order of the members below is important. Do not change it unless
diff --git a/ios/chrome/browser/profile/model/profile_ios_impl.mm b/ios/chrome/browser/profile/model/profile_ios_impl.mm
index 676c37a..06df9151 100644
--- a/ios/chrome/browser/profile/model/profile_ios_impl.mm
+++ b/ios/chrome/browser/profile/model/profile_ios_impl.mm
@@ -279,13 +279,21 @@
 }
 
 ChromeBrowserState* ChromeBrowserStateImpl::GetOriginalChromeBrowserState() {
+  return GetOriginalProfile();
+}
+
+ProfileIOS* ProfileIOSImpl::GetOriginalProfile() {
   return this;
 }
 
 ChromeBrowserState*
 ChromeBrowserStateImpl::GetOffTheRecordChromeBrowserState() {
+  return GetOffTheRecordProfile();
+}
+
+ProfileIOS* ProfileIOSImpl::GetOffTheRecordProfile() {
   if (!otr_state_) {
-    otr_state_.reset(new OffTheRecordChromeBrowserStateImpl(
+    otr_state_.reset(new OffTheRecordProfileIOSImpl(
         GetIOTaskRunner(), this, GetOffTheRecordStatePath()));
   }
 
@@ -293,10 +301,18 @@
 }
 
 bool ChromeBrowserStateImpl::HasOffTheRecordChromeBrowserState() const {
+  return HasOffTheRecordProfile();
+}
+
+bool ProfileIOSImpl::HasOffTheRecordProfile() const {
   return !!otr_state_;
 }
 
 void ChromeBrowserStateImpl::DestroyOffTheRecordChromeBrowserState() {
+  return DestroyOffTheRecordProfile();
+}
+
+void ProfileIOSImpl::DestroyOffTheRecordProfile() {
   // Tear down both the OTR ChromeBrowserState and the OTR Profile with which
   // it is associated.
   otr_state_.reset();
@@ -325,8 +341,8 @@
   return storage_uuid_;
 }
 
-void ChromeBrowserStateImpl::SetOffTheRecordChromeBrowserState(
-    std::unique_ptr<ChromeBrowserState> otr_state) {
+void ChromeBrowserStateImpl::SetOffTheRecordProfileIOS(
+    std::unique_ptr<ProfileIOS> otr_state) {
   DCHECK(!otr_state_);
   otr_state_ = std::move(otr_state);
 }
diff --git a/ios/chrome/browser/shared/model/profile/profile_ios.h b/ios/chrome/browser/shared/model/profile/profile_ios.h
index bb47505..02249866 100644
--- a/ios/chrome/browser/shared/model/profile/profile_ios.h
+++ b/ios/chrome/browser/shared/model/profile/profile_ios.h
@@ -13,6 +13,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "ios/chrome/browser/net/model/net_types.h"
+#include "ios/chrome/browser/shared/model/profile/profile_ios_forward.h"
 #include "ios/web/public/browser_state.h"
 #include "net/url_request/url_request_job_factory.h"
 
@@ -97,24 +98,46 @@
 
   // Returns the original "recording" ChromeBrowserState. This method returns
   // `this` if the ChromeBrowserState is not incognito.
+  // TODO(crbug.com/358299863): Remove this function once fully migrated.
   virtual ChromeBrowserState* GetOriginalChromeBrowserState() = 0;
 
+  // Returns the original "recording" Profile. This method returns `this` if the
+  // Profile is not incognito.
+  virtual ProfileIOS* GetOriginalProfile() = 0;
+
   // Returns true if the ChromeBrowserState is off-the-record or if the
   // associated off-the-record browser state has been created.
   // Calling this method does not create the off-the-record browser state if it
   // does not already exist.
+  // TODO(crbug.com/358299863): Remove this function once fully migrated.
   virtual bool HasOffTheRecordChromeBrowserState() const = 0;
 
+  // Returns true if the Profile is off-the-record or if the associated
+  // off-the-record browser state has been created. Calling this method does not
+  // create the off-the-record profile if it does not already exist.
+  virtual bool HasOffTheRecordProfile() const = 0;
+
   // Returns the incognito version of this ChromeBrowserState. The returned
   // ChromeBrowserState instance is owned by this ChromeBrowserState instance.
   // WARNING: This will create the OffTheRecord ChromeBrowserState if it
   // doesn't already exist.
+  // TODO(crbug.com/358299863): Remove this function once fully migrated.
   virtual ChromeBrowserState* GetOffTheRecordChromeBrowserState() = 0;
 
+  // Returns the incognito version of this Profile. The returned Profile
+  // instance is owned by this Profile instance. WARNING: This will create the
+  // OffTheRecord Profile if it doesn't already exist.
+  virtual ProfileIOS* GetOffTheRecordProfile() = 0;
+
   // Destroys the OffTheRecord ChromeBrowserState that is associated with this
   // ChromeBrowserState, if one exists.
+  // TODO(crbug.com/358299863): Remove this function once fully migrated.
   virtual void DestroyOffTheRecordChromeBrowserState() = 0;
 
+  // Destroys the OffTheRecord Profile that is associated with this Profile, if
+  // one exists.
+  virtual void DestroyOffTheRecordProfile() = 0;
+
   // Retrieves a pointer to the BrowserStatePolicyConnector that manages policy
   // for this BrowserState. May return nullptr if policy is disabled.
   virtual BrowserStatePolicyConnector* GetPolicyConnector() = 0;
diff --git a/ios/chrome/browser/shared/model/profile/test/test_profile_ios.h b/ios/chrome/browser/shared/model/profile/test/test_profile_ios.h
index 6a442ff..4c7f174 100644
--- a/ios/chrome/browser/shared/model/profile/test/test_profile_ios.h
+++ b/ios/chrome/browser/shared/model/profile/test/test_profile_ios.h
@@ -33,6 +33,10 @@
 class EnterprisePolicyTestHelper;
 class TestProfileManagerIOS;
 
+// TODO(crbug.com/358053899): Remove once the renaming is finished.
+class TestChromeBrowserState;
+using TestProfileIOS = TestChromeBrowserState;
+
 // This class is the implementation of ChromeBrowserState used for testing.
 class TestChromeBrowserState final : public ChromeBrowserState {
  public:
@@ -99,10 +103,18 @@
   bool IsOffTheRecord() const override;
 
   // ChromeBrowserState:
-  scoped_refptr<base::SequencedTaskRunner> GetIOTaskRunner() override;
+  // TODO(crbug.com/358299863): Remove these functions once fully migrated.
   ChromeBrowserState* GetOriginalChromeBrowserState() override;
   bool HasOffTheRecordChromeBrowserState() const override;
   ChromeBrowserState* GetOffTheRecordChromeBrowserState() override;
+  void DestroyOffTheRecordChromeBrowserState() override;
+
+  // ProfileIOS:
+  ProfileIOS* GetOriginalProfile() override;
+  bool HasOffTheRecordProfile() const override;
+  ProfileIOS* GetOffTheRecordProfile() override;
+  void DestroyOffTheRecordProfile() override;
+  scoped_refptr<base::SequencedTaskRunner> GetIOTaskRunner() override;
   PrefProxyConfigTracker* GetProxyConfigTracker() override;
   BrowserStatePolicyConnector* GetPolicyConnector() override;
   sync_preferences::PrefServiceSyncable* GetSyncablePrefs() override;
@@ -115,7 +127,6 @@
   scoped_refptr<network::SharedURLLoaderFactory> GetSharedURLLoaderFactory()
       override;
   policy::UserCloudPolicyManager* GetUserCloudPolicyManager() override;
-  void DestroyOffTheRecordChromeBrowserState() override;
 
   // Creates an off-the-record TestChromeBrowserState for
   // the current object, installing `testing_factories`
@@ -128,9 +139,24 @@
   // This method will be called without factories if the
   // method `GetOffTheRecordBrowserState()` is called on
   // this object.
+  // TODO(crbug.com/358299863): Remove this function once fully migrated.
   TestChromeBrowserState* CreateOffTheRecordBrowserStateWithTestingFactories(
       TestingFactories testing_factories = {});
 
+  // Creates an off-the-record TestProfileIOS for
+  // the current object, installing `testing_factories`
+  // first.
+  //
+  // This is an error to call this method if the current
+  // TestProfileIOS already has a off-the-record
+  // object, or is itself off-the-record.
+  //
+  // This method will be called without factories if the
+  // method `GetOffTheRecordProfile()` is called on
+  // this object.
+  TestProfileIOS* CreateOffTheRecordProfileWithTestingFactories(
+      TestingFactories testing_factories = {});
+
   // Returns the preferences as a TestingPrefServiceSyncable if possible or
   // null. Returns null for off-the-record TestChromeBrowserState and also
   // for TestChromeBrowserState initialized with a custom pref service.
@@ -261,6 +287,4 @@
   base::WeakPtrFactory<TestChromeBrowserState> weak_ptr_factory_{this};
 };
 
-using TestProfileIOS = TestChromeBrowserState;
-
 #endif  // IOS_CHROME_BROWSER_SHARED_MODEL_PROFILE_TEST_TEST_PROFILE_IOS_H_
diff --git a/ios/chrome/browser/shared/model/profile/test/test_profile_ios.mm b/ios/chrome/browser/shared/model/profile/test/test_profile_ios.mm
index b510598a..30a4cfc 100644
--- a/ios/chrome/browser/shared/model/profile/test/test_profile_ios.mm
+++ b/ios/chrome/browser/shared/model/profile/test/test_profile_ios.mm
@@ -216,18 +216,41 @@
 }
 
 ChromeBrowserState* TestChromeBrowserState::GetOriginalChromeBrowserState() {
+  return GetOriginalProfile();
+}
+
+bool TestChromeBrowserState::HasOffTheRecordChromeBrowserState() const {
+  return HasOffTheRecordProfile();
+}
+
+ChromeBrowserState*
+TestChromeBrowserState::GetOffTheRecordChromeBrowserState() {
+  return GetOffTheRecordProfile();
+}
+
+void TestChromeBrowserState::DestroyOffTheRecordChromeBrowserState() {
+  return DestroyOffTheRecordProfile();
+}
+
+TestChromeBrowserState*
+TestChromeBrowserState::CreateOffTheRecordBrowserStateWithTestingFactories(
+    TestingFactories testing_factories) {
+  return CreateOffTheRecordProfileWithTestingFactories(
+      std::move(testing_factories));
+}
+
+ProfileIOS* TestProfileIOS::GetOriginalProfile() {
   if (IsOffTheRecord()) {
     return original_browser_state_;
   }
   return this;
 }
 
-bool TestChromeBrowserState::HasOffTheRecordChromeBrowserState() const {
+bool TestProfileIOS::HasOffTheRecordProfile() const {
   return otr_browser_state_ != nullptr;
 }
 
-ChromeBrowserState*
-TestChromeBrowserState::GetOffTheRecordChromeBrowserState() {
+ProfileIOS* TestProfileIOS::GetOffTheRecordProfile() {
   if (IsOffTheRecord()) {
     return this;
   }
@@ -239,8 +262,12 @@
   return CreateOffTheRecordBrowserStateWithTestingFactories();
 }
 
-TestChromeBrowserState*
-TestChromeBrowserState::CreateOffTheRecordBrowserStateWithTestingFactories(
+void TestProfileIOS::DestroyOffTheRecordProfile() {
+  DCHECK(!IsOffTheRecord());
+  otr_browser_state_.reset();
+}
+
+TestProfileIOS* TestProfileIOS::CreateOffTheRecordProfileWithTestingFactories(
     TestingFactories testing_factories) {
   DCHECK(!IsOffTheRecord());
   DCHECK(!otr_browser_state_);
@@ -296,11 +323,6 @@
   return user_cloud_policy_manager_.get();
 }
 
-void TestChromeBrowserState::DestroyOffTheRecordChromeBrowserState() {
-  DCHECK(!IsOffTheRecord());
-  otr_browser_state_.reset();
-}
-
 scoped_refptr<network::SharedURLLoaderFactory>
 TestChromeBrowserState::GetSharedURLLoaderFactory() {
   return test_shared_url_loader_factory_
diff --git a/ios/chrome/browser/shared/model/web_state_list/web_state_list.h b/ios/chrome/browser/shared/model/web_state_list/web_state_list.h
index 9a66386..389af2f 100644
--- a/ios/chrome/browser/shared/model/web_state_list/web_state_list.h
+++ b/ios/chrome/browser/shared/model/web_state_list/web_state_list.h
@@ -128,6 +128,8 @@
     InsertionParams();
   };
 
+  // TODO(crbug.com/365701685): Refactor WebStateList::ClosingFlags to use an
+  // enum for the reason why a WebState is being closed.
   // Constants used when closing WebStates.
   enum ClosingFlags {
     // Used to indicate that nothing special should happen to the closed
@@ -136,6 +138,9 @@
 
     // Used to indicate that the WebState was closed due to user action.
     CLOSE_USER_ACTION = 1 << 0,
+
+    // Used tp indicate that the WebState was closed in a tabs clean-up.
+    CLOSE_TABS_CLEANUP = 1 << 1,
   };
 
   // Scoped type representing a batch operation in progress.
diff --git a/ios/chrome/browser/shared/model/web_state_list/web_state_list.mm b/ios/chrome/browser/shared/model/web_state_list/web_state_list.mm
index ee22a34..43efcb5171 100644
--- a/ios/chrome/browser/shared/model/web_state_list/web_state_list.mm
+++ b/ios/chrome/browser/shared/model/web_state_list/web_state_list.mm
@@ -58,14 +58,19 @@
 // 1. a WebState is detached.
 // 2. a WebState is detached and closed.
 // 3. a WebState is detached and closed due to an user action.
+// 4. a WebState is detached and closed in a tabs clean-up.
 // The static helper method helps construct a object that represents
 // a valid state.
 struct WebStateList::DetachParams {
   static DetachParams Detaching();
-  static DetachParams Closing(bool is_user_action);
+  // TODO(crbug.com/365701685): Refactor DetachParams::Closing to use an enum
+  // for the reason why a WebState is being closed.
+  static DetachParams Closing(bool is_user_action,
+                              bool by_browsing_data_remover);
 
   const bool is_closing;
   const bool is_user_action;
+  const bool by_browsing_data_remover;
 };
 
 WebStateList::DetachParams WebStateList::DetachParams::Detaching() {
@@ -73,8 +78,11 @@
 }
 
 WebStateList::DetachParams WebStateList::DetachParams::Closing(
-    bool is_user_action) {
-  return {.is_closing = true, .is_user_action = is_user_action};
+    bool is_user_action,
+    bool by_browsing_data_remover) {
+  return {.is_closing = true,
+          .is_user_action = is_user_action,
+          .by_browsing_data_remover = by_browsing_data_remover};
 }
 
 // Wrapper around a WebState stored in a WebStateList.
@@ -329,7 +337,8 @@
       order_controller.DetermineNewActiveIndex(active_index_, {index});
 
   const DetachParams detach_params =
-      DetachParams::Closing(IsClosingFlagSet(close_flags, CLOSE_USER_ACTION));
+      DetachParams::Closing(IsClosingFlagSet(close_flags, CLOSE_USER_ACTION),
+                            IsClosingFlagSet(close_flags, CLOSE_TABS_CLEANUP));
 
   std::unique_ptr<web::WebState> detached_web_state =
       DetachWebStateAtImpl(index, new_active_index, detach_params);
@@ -350,7 +359,8 @@
   auto lock = LockForMutation();
 
   const DetachParams detach_params =
-      DetachParams::Closing(IsClosingFlagSet(close_flags, CLOSE_USER_ACTION));
+      DetachParams::Closing(IsClosingFlagSet(close_flags, CLOSE_USER_ACTION),
+                            IsClosingFlagSet(close_flags, CLOSE_TABS_CLEANUP));
 
   // Detach all web states in a first pass, before destroying them at once
   // later. This avoids odd side effects as a result of WebStateImpl's
@@ -643,7 +653,8 @@
   web::WebState* web_state = web_state_wrappers_[index]->web_state();
   const TabGroup* group = web_state_wrappers_[index]->group();
   const WebStateListChangeDetach detach_change(
-      web_state, index, params.is_closing, params.is_user_action, group);
+      web_state, index, params.is_closing, params.is_user_action,
+      params.by_browsing_data_remover, group);
 
   // `new_active_index` may be invalid e.g. when closing all the WebStates,
   // so use `ContainsIndex(...)` to avoid crashing in `GetWebStateAt(...)`.
diff --git a/ios/chrome/browser/shared/model/web_state_list/web_state_list_observer.h b/ios/chrome/browser/shared/model/web_state_list/web_state_list_observer.h
index 85318c5e..de289441 100644
--- a/ios/chrome/browser/shared/model/web_state_list/web_state_list_observer.h
+++ b/ios/chrome/browser/shared/model/web_state_list/web_state_list_observer.h
@@ -120,10 +120,13 @@
  public:
   static constexpr Type kType = Type::kDetach;
 
+  // TODO(crbug.com/365701685): Refactor WebStateListChangeDetach to use an
+  // enum for the reason why a WebState is being detached.
   WebStateListChangeDetach(raw_ptr<web::WebState> detached_web_state,
                            int detached_from_index,
                            bool is_closing,
                            bool is_user_action,
+                           bool is_tabs_cleanup,
                            raw_ptr<const TabGroup> group);
   ~WebStateListChangeDetach() final = default;
 
@@ -146,6 +149,11 @@
   // Returns true when a detached WebState will be closed by the user action.
   bool is_user_action() const { return is_user_action_; }
 
+  // TODO(crbug.com/365701685): Refactor WebStateListChangeDetach to use an
+  // enum for the reason why a WebState is being detached.
+  // Returns true when a detached WebState will be closed in a tabs clean-up.
+  bool is_tabs_cleanup() const { return is_tabs_cleanup_; }
+
   // The group the WebState was in prior to the change.
   raw_ptr<const TabGroup> group() const { return group_; }
 
@@ -154,6 +162,7 @@
   const int detached_from_index_;
   const bool is_closing_;
   const bool is_user_action_;
+  const bool is_tabs_cleanup_;
   raw_ptr<const TabGroup> group_;
 };
 
diff --git a/ios/chrome/browser/shared/model/web_state_list/web_state_list_observer.mm b/ios/chrome/browser/shared/model/web_state_list/web_state_list_observer.mm
index f395658..2b0f96c 100644
--- a/ios/chrome/browser/shared/model/web_state_list/web_state_list_observer.mm
+++ b/ios/chrome/browser/shared/model/web_state_list/web_state_list_observer.mm
@@ -29,11 +29,13 @@
     int detached_from_index,
     bool is_closing,
     bool is_user_action,
+    bool is_tabs_cleanup,
     raw_ptr<const TabGroup> group)
     : detached_web_state_(detached_web_state),
       detached_from_index_(detached_from_index),
       is_closing_(is_closing),
       is_user_action_(is_user_action),
+      is_tabs_cleanup_(is_tabs_cleanup),
       group_(group) {}
 
 WebStateListChange::Type WebStateListChangeDetach::type() const {
diff --git a/ios/chrome/browser/shared/ui/symbols/resources/Assets.xcassets/enterprise.symbolset/Contents.json b/ios/chrome/browser/shared/ui/symbols/resources/Assets.xcassets/enterprise.symbolset/Contents.json
new file mode 100644
index 0000000..1fed292
--- /dev/null
+++ b/ios/chrome/browser/shared/ui/symbols/resources/Assets.xcassets/enterprise.symbolset/Contents.json
@@ -0,0 +1,12 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  },
+  "symbols" : [
+    {
+      "filename" : "enterprise.cr.svg",
+      "idiom" : "universal"
+    }
+  ]
+}
diff --git a/ios/chrome/browser/shared/ui/symbols/resources/Assets.xcassets/enterprise.symbolset/enterprise.cr.svg b/ios/chrome/browser/shared/ui/symbols/resources/Assets.xcassets/enterprise.symbolset/enterprise.cr.svg
new file mode 100644
index 0000000..f12fe57
--- /dev/null
+++ b/ios/chrome/browser/shared/ui/symbols/resources/Assets.xcassets/enterprise.symbolset/enterprise.cr.svg
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--Generator: Apple Native CoreSVG 232.5-->
+<!DOCTYPE svg
+PUBLIC "-//W3C//DTD SVG 1.1//EN"
+       "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="3300" height="2200">
+ <!--glyph: "", point size: 100.0, font version: "19.2d2e1", template writer version: "128"-->
+ <style>.SFSymbolsPreviewWireframe {fill:none;opacity:1.0;stroke:black;stroke-width:0.5}
+</style>
+ <g id="Notes">
+  <rect height="2200" id="artboard" style="fill:white;opacity:1" width="3300" x="0" y="0"/>
+  <line style="fill:none;stroke:black;opacity:1;stroke-width:0.5;" x1="263" x2="3036" y1="292" y2="292"/>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;font-weight:bold;" transform="matrix(1 0 0 1 263 322)">Weight/Scale Variations</text>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:middle;" transform="matrix(1 0 0 1 559.711 322)">Ultralight</text>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:middle;" transform="matrix(1 0 0 1 856.422 322)">Thin</text>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:middle;" transform="matrix(1 0 0 1 1153.13 322)">Light</text>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:middle;" transform="matrix(1 0 0 1 1449.84 322)">Regular</text>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:middle;" transform="matrix(1 0 0 1 1746.56 322)">Medium</text>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:middle;" transform="matrix(1 0 0 1 2043.27 322)">Semibold</text>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:middle;" transform="matrix(1 0 0 1 2339.98 322)">Bold</text>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:middle;" transform="matrix(1 0 0 1 2636.69 322)">Heavy</text>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:middle;" transform="matrix(1 0 0 1 2933.4 322)">Black</text>
+  <line style="fill:none;stroke:black;opacity:1;stroke-width:0.5;" x1="263" x2="3036" y1="1903" y2="1903"/>
+  <g transform="matrix(0.2 0 0 0.2 263 1933)">
+   <path d="m46.2402 4.15039c21.5332 0 39.4531-17.8711 39.4531-39.4043s-17.9688-39.4043-39.502-39.4043c-21.4844 0-39.3555 17.8711-39.3555 39.4043s17.9199 39.4043 39.4043 39.4043Zm0-7.42188c-17.7246 0-31.8848-14.209-31.8848-31.9824s14.1113-31.9824 31.8359-31.9824c17.7734 0 32.0312 14.209 32.0312 31.9824s-14.209 31.9824-31.9824 31.9824Zm-17.9688-31.9824c0 2.14844 1.51367 3.61328 3.75977 3.61328h10.498v10.5957c0 2.19727 1.46484 3.71094 3.61328 3.71094 2.24609 0 3.71094-1.51367 3.71094-3.71094v-10.5957h10.5957c2.19727 0 3.71094-1.46484 3.71094-3.61328 0-2.19727-1.51367-3.71094-3.71094-3.71094h-10.5957v-10.5469c0-2.24609-1.46484-3.75977-3.71094-3.75977-2.14844 0-3.61328 1.51367-3.61328 3.75977v10.5469h-10.498c-2.24609 0-3.75977 1.51367-3.75977 3.71094Z"/>
+  </g>
+  <g transform="matrix(0.2 0 0 0.2 281.506 1933)">
+   <path d="m58.5449 14.5508c27.2461 0 49.8047-22.6074 49.8047-49.8047 0-27.2461-22.6074-49.8047-49.8535-49.8047-27.1973 0-49.7559 22.5586-49.7559 49.8047 0 27.1973 22.6074 49.8047 49.8047 49.8047Zm0-8.30078c-23.0469 0-41.4551-18.457-41.4551-41.5039s18.3594-41.5039 41.4062-41.5039 41.5527 18.457 41.5527 41.5039-18.457 41.5039-41.5039 41.5039Zm-22.6562-41.5039c0 2.39258 1.66016 4.00391 4.15039 4.00391h14.3555v14.4043c0 2.44141 1.66016 4.15039 4.05273 4.15039 2.44141 0 4.15039-1.66016 4.15039-4.15039v-14.4043h14.4043c2.44141 0 4.15039-1.61133 4.15039-4.00391 0-2.44141-1.70898-4.15039-4.15039-4.15039h-14.4043v-14.3555c0-2.49023-1.70898-4.19922-4.15039-4.19922-2.39258 0-4.05273 1.70898-4.05273 4.19922v14.3555h-14.3555c-2.49023 0-4.15039 1.70898-4.15039 4.15039Z"/>
+  </g>
+  <g transform="matrix(0.2 0 0 0.2 304.924 1933)">
+   <path d="m74.8535 28.3203c34.8145 0 63.623-28.8086 63.623-63.5742 0-34.8145-28.8574-63.623-63.6719-63.623-34.7656 0-63.5254 28.8086-63.5254 63.623 0 34.7656 28.8086 63.5742 63.5742 63.5742Zm0-9.08203c-30.1758 0-54.4434-24.3164-54.4434-54.4922 0-30.2246 24.2188-54.4922 54.3945-54.4922 30.2246 0 54.541 24.2676 54.541 54.4922 0 30.1758-24.2676 54.4922-54.4922 54.4922Zm-28.8574-54.4922c0 2.58789 1.85547 4.39453 4.58984 4.39453h19.7266v19.7754c0 2.68555 1.85547 4.58984 4.44336 4.58984 2.68555 0 4.54102-1.85547 4.54102-4.58984v-19.7754h19.7754c2.68555 0 4.58984-1.80664 4.58984-4.39453 0-2.73438-1.85547-4.58984-4.58984-4.58984h-19.7754v-19.7266c0-2.73438-1.85547-4.63867-4.54102-4.63867-2.58789 0-4.44336 1.9043-4.44336 4.63867v19.7266h-19.7266c-2.73438 0-4.58984 1.85547-4.58984 4.58984Z"/>
+  </g>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;font-weight:bold;" transform="matrix(1 0 0 1 263 1953)">Design Variations</text>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 263 1971)">Symbols are supported in up to nine weights and three scales.</text>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 263 1989)">For optimal layout with text and other symbols, vertically align</text>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 263 2007)">symbols with the adjacent text.</text>
+  <line style="fill:none;stroke:#00AEEF;stroke-width:0.5;opacity:1.0;" x1="776" x2="776" y1="1919" y2="1933"/>
+  <g transform="matrix(0.2 0 0 0.2 776 1933)">
+   <path d="m16.5527 0.78125c2.58789 0 3.85742-0.976562 4.78516-3.71094l6.29883-17.2363h28.8086l6.29883 17.2363c0.927734 2.73438 2.19727 3.71094 4.73633 3.71094 2.58789 0 4.24805-1.5625 4.24805-4.00391 0-0.830078-0.146484-1.61133-0.537109-2.63672l-22.9004-60.9863c-1.12305-2.97852-3.125-4.49219-6.25-4.49219-3.02734 0-5.07812 1.46484-6.15234 4.44336l-22.9004 61.084c-0.390625 1.02539-0.537109 1.80664-0.537109 2.63672 0 2.44141 1.5625 3.95508 4.10156 3.95508Zm13.4766-28.3691 11.8652-32.8613h0.244141l11.8652 32.8613Z"/>
+  </g>
+  <line style="fill:none;stroke:#00AEEF;stroke-width:0.5;opacity:1.0;" x1="792.836" x2="792.836" y1="1919" y2="1933"/>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;font-weight:bold;" transform="matrix(1 0 0 1 776 1953)">Margins</text>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 776 1971)">Leading and trailing margins on the left and right side of each symbol</text>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 776 1989)">can be adjusted by modifying the x-location of the margin guidelines.</text>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 776 2007)">Modifications are automatically applied proportionally to all</text>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 776 2025)">scales and weights.</text>
+  <g transform="matrix(0.2 0 0 0.2 1289 1933)">
+   <path d="m14.209 9.32617 8.49609 8.54492c4.29688 4.3457 9.22852 4.05273 13.8672-1.07422l53.4668-58.9355-4.83398-4.88281-53.0762 58.3984c-1.75781 2.00195-3.41797 2.49023-5.76172 0.146484l-5.85938-5.81055c-2.34375-2.29492-1.80664-4.00391 0.195312-5.81055l57.373-54.0039-4.88281-4.83398-57.959 54.4434c-4.93164 4.58984-5.32227 9.47266-1.02539 13.8184Zm32.0801-90.9668c-2.09961 2.05078-2.24609 4.93164-1.07422 6.88477 1.17188 1.80664 3.4668 2.97852 6.68945 2.14844 7.32422-1.70898 14.9414-2.00195 22.0703 2.68555l-2.92969 7.27539c-1.70898 4.15039-0.830078 7.08008 1.85547 9.81445l11.4746 11.5723c2.44141 2.44141 4.49219 2.53906 7.32422 2.05078l5.32227-0.976562 3.32031 3.36914-0.195312 2.7832c-0.195312 2.49023 0.439453 4.39453 2.88086 6.78711l3.80859 3.71094c2.39258 2.39258 5.46875 2.53906 7.8125 0.195312l14.5508-14.5996c2.34375-2.34375 2.24609-5.32227-0.146484-7.71484l-3.85742-3.80859c-2.39258-2.39258-4.24805-3.17383-6.64062-2.97852l-2.88086 0.244141-3.22266-3.17383 1.2207-5.61523c0.634766-2.83203-0.146484-5.0293-3.07617-7.95898l-10.9863-10.9375c-16.6992-16.6016-38.8672-16.2109-53.3203-1.75781Zm7.4707 1.85547c12.1582-8.88672 28.6133-7.37305 39.7461 3.75977l12.1582 12.0605c1.17188 1.17188 1.36719 2.09961 1.02539 3.80859l-1.61133 7.42188 7.51953 7.42188 4.93164-0.292969c1.26953-0.0488281 1.66016 0.0488281 2.63672 1.02539l2.88086 2.88086-12.207 12.207-2.88086-2.88086c-0.976562-0.976562-1.12305-1.36719-1.07422-2.68555l0.341797-4.88281-7.4707-7.42188-7.61719 1.26953c-1.61133 0.341797-2.34375 0.195312-3.56445-0.976562l-10.0098-10.0098c-1.26953-1.17188-1.41602-2.00195-0.634766-3.85742l4.39453-10.4492c-7.8125-7.27539-17.9688-10.4004-28.125-7.42188-0.78125 0.195312-1.07422-0.439453-0.439453-0.976562Z"/>
+  </g>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;font-weight:bold;" transform="matrix(1 0 0 1 1289 1953)">Exporting</text>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 1289 1971)">Symbols should be outlined when exporting to ensure the</text>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 1289 1989)">design is preserved when submitting to Xcode.</text>
+  <text id="template-version" style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:end;" transform="matrix(1 0 0 1 3036 1933)">Template v.5.0</text>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:end;" transform="matrix(1 0 0 1 3036 1951)">Requires Xcode 15 or greater</text>
+  <text id="descriptive-name" style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:end;" transform="matrix(1 0 0 1 3036 1969)">Generated from enterprise.cr</text>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:end;" transform="matrix(1 0 0 1 3036 1987)">Typeset at 100.0 points</text>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 263 726)">Small</text>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 263 1156)">Medium</text>
+  <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 263 1586)">Large</text>
+ </g>
+ <g id="Guides">
+  <g id="H-reference" style="fill:#27AAE1;stroke:none;" transform="matrix(1 0 0 1 339 696)">
+   <path d="M0.993654 0L3.63775 0L29.3281-67.1323L30.0303-67.1323L30.0303-70.459L28.1226-70.459ZM11.6885-24.4799L46.9815-24.4799L46.2315-26.7285L12.4385-26.7285ZM55.1196 0L57.7637 0L30.6382-70.459L29.4326-70.459L29.4326-67.1323Z"/>
+  </g>
+  <line id="Baseline-S" style="fill:none;stroke:#27AAE1;opacity:1;stroke-width:0.5;" x1="263" x2="3036" y1="696" y2="696"/>
+  <line id="Capline-S" style="fill:none;stroke:#27AAE1;opacity:1;stroke-width:0.5;" x1="263" x2="3036" y1="625.541" y2="625.541"/>
+  <g id="H-reference" style="fill:#27AAE1;stroke:none;" transform="matrix(1 0 0 1 339 1126)">
+   <path d="M0.993654 0L3.63775 0L29.3281-67.1323L30.0303-67.1323L30.0303-70.459L28.1226-70.459ZM11.6885-24.4799L46.9815-24.4799L46.2315-26.7285L12.4385-26.7285ZM55.1196 0L57.7637 0L30.6382-70.459L29.4326-70.459L29.4326-67.1323Z"/>
+  </g>
+  <line id="Baseline-M" style="fill:none;stroke:#27AAE1;opacity:1;stroke-width:0.5;" x1="263" x2="3036" y1="1126" y2="1126"/>
+  <line id="Capline-M" style="fill:none;stroke:#27AAE1;opacity:1;stroke-width:0.5;" x1="263" x2="3036" y1="1055.54" y2="1055.54"/>
+  <g id="H-reference" style="fill:#27AAE1;stroke:none;" transform="matrix(1 0 0 1 339 1556)">
+   <path d="M0.993654 0L3.63775 0L29.3281-67.1323L30.0303-67.1323L30.0303-70.459L28.1226-70.459ZM11.6885-24.4799L46.9815-24.4799L46.2315-26.7285L12.4385-26.7285ZM55.1196 0L57.7637 0L30.6382-70.459L29.4326-70.459L29.4326-67.1323Z"/>
+  </g>
+  <line id="Baseline-L" style="fill:none;stroke:#27AAE1;opacity:1;stroke-width:0.5;" x1="263" x2="3036" y1="1556" y2="1556"/>
+  <line id="Capline-L" style="fill:none;stroke:#27AAE1;opacity:1;stroke-width:0.5;" x1="263" x2="3036" y1="1485.54" y2="1485.54"/>
+  <line id="left-margin-Regular-M" style="fill:none;stroke:#00AEEF;stroke-width:0.5;opacity:1.0;" x1="1379.43" x2="1379.43" y1="1030.79" y2="1150.12"/>
+  <line id="right-margin-Regular-M" style="fill:none;stroke:#00AEEF;stroke-width:0.5;opacity:1.0;" x1="1520.26" x2="1520.26" y1="1030.79" y2="1150.12"/>
+ </g>
+ <g id="Symbols">
+  <g id="Black-L" transform="matrix(1 0 0 1 2841.03 1556)">
+   <path class="SFSymbolsPreviewWireframe" d="M38.7399-104.5C37.6199-104.5 36.2103-104.501 34.8903-104.301C27.8303-103.181 22.2896-97.6401 21.1696-90.5801C20.9596-89.2601 20.9704-87.8505 20.9704-86.7305L20.9704-86.4004L20.9704 9.40039L20.9704 9.73047C20.9704 10.8505 20.9596 12.2601 21.1696 13.5801C22.2896 20.6401 27.8303 26.1808 34.8903 27.3008C36.2103 27.5108 37.6199 27.5 38.7399 27.5L39.07 27.5L80.4704 27.5L145.271 27.5L145.601 27.5C146.701 27.5 148.241 27.5093 149.691 27.2793C157.391 26.0593 163.43 20.0203 164.65 12.3203C164.88 10.8703 164.871 9.33047 164.871 8.23047L164.871 8.10938L164.871 7.90039L164.871-57.4004L164.871-57.7305C164.871-58.8305 164.88-60.3705 164.65-61.8105C163.43-69.5205 157.391-75.5593 149.691-76.7793C148.241-77.0093 146.701-77 145.601-77L145.271-77L96.7712-77L96.7712-86.4004L96.7712-86.7305C96.7712-87.8505 96.78-89.2601 96.57-90.5801C95.45-97.6401 89.9112-103.181 82.8512-104.301C81.5312-104.501 80.1197-104.5 78.9997-104.5L78.6696-104.5L39.07-104.5ZM39.07-87.5898L50.6696-87.5898C50.8596-87.5898 50.9509-87.5901 51.0309-87.58C51.4509-87.51 51.791-87.18 51.861-86.75C51.871-86.67 51.8708-86.5806 51.8708-86.3906L51.8708-74.789C51.8708-74.609 51.871-74.5194 51.861-74.4394C51.791-74.0094 51.4509-73.6693 51.0309-73.6093C50.9509-73.5893 50.8596-73.5898 50.6696-73.5898L39.07-73.5898C38.88-73.5898 38.7906-73.5893 38.7106-73.6093C38.2906-73.6693 37.9505-74.0094 37.8805-74.4394C37.8705-74.5194 37.8707-74.609 37.8707-74.789L37.8707-86.3906C37.8707-86.5806 37.8705-86.67 37.8805-86.75C37.9505-87.18 38.2906-87.51 38.7106-87.58C38.7906-87.59 38.88-87.5898 39.07-87.5898ZM67.07-87.5898L78.6696-87.5898C78.8596-87.5898 78.9509-87.5901 79.0309-87.58C79.4509-87.51 79.791-87.18 79.861-86.75C79.871-86.67 79.8708-86.5806 79.8708-86.3906L79.8708-74.789C79.8708-74.609 79.871-74.5194 79.861-74.4394C79.791-74.0094 79.4509-73.6693 79.0309-73.6093C78.9509-73.5893 78.8596-73.5898 78.6696-73.5898L67.07-73.5898C66.88-73.5898 66.7906-73.5893 66.7106-73.6093C66.2906-73.6693 65.9505-74.0094 65.8805-74.4394C65.8705-74.5194 65.8707-74.609 65.8707-74.789L65.8707-86.3906C65.8707-86.5806 65.8705-86.67 65.8805-86.75C65.9505-87.18 66.2906-87.51 66.7106-87.58C66.7906-87.59 66.88-87.5898 67.07-87.5898ZM39.07-59.5898L50.6696-59.5898C50.8596-59.5898 50.9509-59.5901 51.0309-59.58C51.4509-59.51 51.791-59.18 51.861-58.75C51.871-58.67 51.8708-58.5806 51.8708-58.3906L51.8708-46.789C51.8708-46.609 51.871-46.5194 51.861-46.4394C51.791-46.0094 51.4509-45.6693 51.0309-45.6093C50.9509-45.5893 50.8596-45.5898 50.6696-45.5898L39.07-45.5898C38.88-45.5898 38.7906-45.5893 38.7106-45.6093C38.2906-45.6693 37.9505-46.0094 37.8805-46.4394C37.8705-46.5194 37.8707-46.609 37.8707-46.789L37.8707-58.3906C37.8707-58.5806 37.8705-58.67 37.8805-58.75C37.9505-59.18 38.2906-59.51 38.7106-59.58C38.7906-59.59 38.88-59.5898 39.07-59.5898ZM67.07-59.5898L78.6696-59.5898C78.8596-59.5898 78.9509-59.5901 79.0309-59.58C79.4509-59.51 79.791-59.18 79.861-58.75C79.871-58.67 79.8708-58.5806 79.8708-58.3906L79.8708-46.789C79.8708-46.609 79.871-46.5194 79.861-46.4394C79.791-46.0094 79.4509-45.6693 79.0309-45.6093C78.9509-45.5893 78.8596-45.5898 78.6696-45.5898L67.07-45.5898C66.88-45.5898 66.7906-45.5893 66.7106-45.6093C66.2906-45.6693 65.9505-46.0094 65.8805-46.4394C65.8705-46.5194 65.8707-46.609 65.8707-46.789L65.8707-58.3906C65.8707-58.5806 65.8705-58.67 65.8805-58.75C65.9505-59.18 66.2906-59.51 66.7106-59.58C66.7906-59.59 66.88-59.5898 67.07-59.5898ZM96.7712-57L144.871-57L144.871 7.5L96.7712 7.5L96.7712-3.59961L105.271-3.59961C105.461-3.59961 105.551-3.59938 105.631-3.60938C106.051-3.67938 106.391-4.01946 106.461-4.43946C106.471-4.51946 106.471-4.61079 106.471-4.80079L106.471-16.4004C106.471-16.5904 106.471-16.6798 106.461-16.7598C106.391-17.1798 106.051-17.5198 105.631-17.5898C105.551-17.5998 105.461-17.5996 105.271-17.5996L96.7712-17.5996L96.7712-31.5996L105.271-31.5996C105.461-31.5996 105.551-31.5994 105.631-31.6094C106.051-31.6794 106.391-32.0195 106.461-32.4395C106.471-32.5195 106.471-32.6109 106.471-32.8009L106.471-44.4005C106.471-44.5905 106.471-44.6798 106.461-44.7598C106.391-45.1798 106.051-45.5199 105.631-45.5899C105.551-45.5999 105.461-45.5997 105.271-45.5997L96.7712-45.5997ZM121.67-45.5996C121.48-45.5996 121.39-45.5998 121.31-45.5898C120.89-45.5198 120.55-45.1797 120.48-44.7597C120.47-44.6797 120.47-44.5904 120.47-44.4004L120.47-32.8007C120.47-32.6107 120.47-32.5194 120.48-32.4394C120.55-32.0194 120.89-31.6793 121.31-31.6093C121.39-31.5993 121.48-31.5995 121.67-31.5995L133.271-31.5995C133.461-31.5995 133.551-31.5993 133.631-31.6093C134.051-31.6793 134.391-32.0194 134.461-32.4394C134.471-32.5194 134.471-32.6107 134.471-32.8007L134.471-44.4004C134.471-44.5904 134.471-44.6797 134.461-44.7597C134.391-45.1797 134.051-45.5198 133.631-45.5898C133.551-45.5998 133.461-45.5996 133.271-45.5996ZM39.07-31.5898L50.6696-31.5898C50.8596-31.5898 50.9509-31.5901 51.0309-31.58C51.4509-31.51 51.791-31.18 51.861-30.75C51.871-30.67 51.8708-30.5806 51.8708-30.3906L51.8708-18.789C51.8708-18.609 51.871-18.5194 51.861-18.4394C51.791-18.0094 51.4509-17.6693 51.0309-17.6093C50.9509-17.5893 50.8596-17.5898 50.6696-17.5898L39.07-17.5898C38.88-17.5898 38.7906-17.5893 38.7106-17.6093C38.2906-17.6693 37.9505-18.0094 37.8805-18.4394C37.8705-18.5194 37.8707-18.609 37.8707-18.789L37.8707-30.3906C37.8707-30.5806 37.8705-30.67 37.8805-30.75C37.9505-31.18 38.2906-31.51 38.7106-31.58C38.7906-31.59 38.88-31.5898 39.07-31.5898ZM67.07-31.5898L78.6696-31.5898C78.8596-31.5898 78.9509-31.5901 79.0309-31.58C79.4509-31.51 79.791-31.18 79.861-30.75C79.871-30.67 79.8708-30.5806 79.8708-30.3906L79.8708-18.789C79.8708-18.609 79.871-18.5194 79.861-18.4394C79.791-18.0094 79.4509-17.6693 79.0309-17.6093C78.9509-17.5893 78.8596-17.5898 78.6696-17.5898L67.07-17.5898C66.88-17.5898 66.7906-17.5893 66.7106-17.6093C66.2906-17.6693 65.9505-18.0094 65.8805-18.4394C65.8705-18.5194 65.8707-18.609 65.8707-18.789L65.8707-30.3906C65.8707-30.5806 65.8705-30.67 65.8805-30.75C65.9505-31.18 66.2906-31.51 66.7106-31.58C66.7906-31.59 66.88-31.5898 67.07-31.5898ZM121.67-17.5996C121.48-17.5996 121.39-17.5998 121.31-17.5898C120.89-17.5198 120.55-17.1797 120.48-16.7597C120.47-16.6797 120.47-16.5904 120.47-16.4004L120.47-4.80075C120.47-4.61075 120.47-4.51942 120.48-4.43942C120.55-4.01942 120.89-3.67934 121.31-3.60934C121.39-3.59934 121.48-3.59957 121.67-3.59957L133.271-3.59957C133.461-3.59957 133.551-3.59934 133.631-3.60934C134.051-3.67934 134.391-4.01942 134.461-4.43942C134.471-4.51942 134.471-4.61075 134.471-4.80075L134.471-16.4004C134.471-16.5904 134.471-16.6798 134.461-16.7598C134.391-17.1798 134.051-17.5198 133.631-17.5898C133.551-17.5998 133.461-17.5996 133.271-17.5996ZM39.07-3.58984L50.6696-3.58984C50.8596-3.58984 50.9509-3.59008 51.0309-3.58007C51.4509-3.51007 51.791-3.17999 51.861-2.75C51.871-2.67 51.8708-2.58062 51.8708-2.39062L51.8708 9.21094C51.8708 9.39094 51.871 9.48055 51.861 9.56055C51.791 9.99055 51.4509 10.3306 51.0309 10.3906C50.9509 10.4106 50.8596 10.4102 50.6696 10.4102L39.07 10.4102C38.88 10.4102 38.7906 10.4106 38.7106 10.3906C38.2906 10.3306 37.9505 9.99055 37.8805 9.56055C37.8705 9.48055 37.8707 9.39094 37.8707 9.21094L37.8707-2.39062C37.8707-2.58062 37.8705-2.67 37.8805-2.75C37.9505-3.18 38.2906-3.51008 38.7106-3.58008C38.7906-3.59008 38.88-3.58985 39.07-3.58985ZM67.07-3.58984L78.6696-3.58984C78.8596-3.58984 78.9509-3.59008 79.0309-3.58007C79.4509-3.51007 79.791-3.17999 79.861-2.75C79.871-2.67 79.8708-2.58062 79.8708-2.39062L79.8708 9.21094C79.8708 9.39094 79.871 9.48055 79.861 9.56055C79.791 9.99055 79.4509 10.3306 79.0309 10.3906C78.9509 10.4106 78.8596 10.4102 78.6696 10.4102L67.07 10.4102C66.88 10.4102 66.7906 10.4106 66.7106 10.3906C66.2906 10.3306 65.9505 9.99055 65.8805 9.56055C65.8705 9.48055 65.8707 9.39094 65.8707 9.21094L65.8707-2.39062C65.8707-2.58062 65.8705-2.67 65.8805-2.75C65.9505-3.18 66.2906-3.51008 66.7106-3.58008C66.7906-3.59008 66.88-3.58985 67.07-3.58985Z"/>
+  </g>
+  <g id="Heavy-L" transform="matrix(1 0 0 1 2545.82 1556)">
+   <path class="SFSymbolsPreviewWireframe" d="M37.2515-102C36.1115-102 34.8107-102.001 33.6207-101.811C27.2107-100.801 22.1719-95.7596 21.1519-89.3496C20.9719-88.1496 20.9703-86.8607 20.9703-85.7207L20.9703-85.4004L20.9703 10.4004L20.9703 10.7207C20.9703 11.8607 20.9719 13.1596 21.1519 14.3496C22.1719 20.7696 27.2107 25.8003 33.6207 26.8203C34.8107 27.0003 36.1115 27 37.2515 27L37.2808 27L37.5719 27L80.4703 27L143.771 27L144.101 27C145.221 27 146.631 27.0108 147.951 26.8008C155.011 25.6808 160.551 20.1401 161.671 13.0801C161.881 11.7601 161.871 10.3505 161.871 9.23047L161.871 9.19922L161.871 9.18945L161.871 8.90039L161.871-56.4004L161.871-56.7305C161.871-57.8505 161.881-59.2601 161.671-60.5801C160.551-67.6401 155.011-73.1808 147.951-74.3008C146.631-74.5008 145.221-74.5 144.101-74.5L144.091-74.5L143.771-74.5L93.7708-74.5L93.7708-85.4004L93.7708-85.7109L93.7708-85.7207C93.7708-86.8607 93.7711-88.1497 93.5911-89.3496C92.5714-95.7596 87.5307-100.801 81.1207-101.811C79.9307-102.001 78.6318-102 77.4918-102L77.1715-102L37.5719-102ZM37.5719-86.5996L49.1715-86.5996C49.3615-86.5996 49.4508-86.5998 49.5308-86.5898C49.9508-86.5198 50.2909-86.1897 50.3609-85.7597C50.3709-85.6797 50.3707-85.5904 50.3707-85.4004L50.3707-73.8007C50.3707-73.6207 50.3709-73.5192 50.3609-73.4492C50.2909-73.0192 49.9508-72.6793 49.5308-72.6093C49.4508-72.5993 49.3615-72.5995 49.1715-72.5995L37.5719-72.5995C37.3819-72.5995 37.2905-72.5993 37.2105-72.6093C36.7905-72.6793 36.4504-73.0192 36.3804-73.4492C36.3704-73.5192 36.3706-73.6207 36.3706-73.8007L36.3706-85.4004C36.3706-85.5904 36.3704-85.6797 36.3804-85.7597C36.4504-86.1897 36.7905-86.5198 37.2105-86.5898C37.2905-86.5998 37.3819-86.5996 37.5719-86.5996ZM65.5719-86.5996L77.1715-86.5996C77.3615-86.5996 77.4508-86.5998 77.5308-86.5898C77.9508-86.5198 78.2909-86.1897 78.3609-85.7597C78.3709-85.6797 78.3707-85.5904 78.3707-85.4004L78.3707-73.8007C78.3707-73.6207 78.3709-73.5192 78.3609-73.4492C78.2909-73.0192 77.9508-72.6793 77.5308-72.6093C77.4508-72.5993 77.3615-72.5995 77.1715-72.5995L65.5719-72.5995C65.3819-72.5995 65.2905-72.5993 65.2105-72.6093C64.7905-72.6793 64.4504-73.0192 64.3804-73.4492C64.3704-73.5192 64.3706-73.6207 64.3706-73.8007L64.3706-85.4004C64.3706-85.5904 64.3704-85.6797 64.3804-85.7597C64.4504-86.1897 64.7905-86.5198 65.2105-86.5898C65.2905-86.5998 65.3819-86.5996 65.5719-86.5996ZM37.5719-58.5996L49.1715-58.5996C49.3615-58.5996 49.4508-58.5998 49.5308-58.5898C49.9508-58.5198 50.2909-58.1897 50.3609-57.7597C50.3709-57.6797 50.3707-57.5904 50.3707-57.4004L50.3707-45.8007C50.3707-45.6207 50.3709-45.5192 50.3609-45.4492C50.2909-45.0192 49.9508-44.6793 49.5308-44.6093C49.4508-44.5993 49.3615-44.5995 49.1715-44.5995L37.5719-44.5995C37.3819-44.5995 37.2905-44.5993 37.2105-44.6093C36.7905-44.6793 36.4504-45.0192 36.3804-45.4492C36.3704-45.5192 36.3706-45.6207 36.3706-45.8007L36.3706-57.4004C36.3706-57.5904 36.3704-57.6797 36.3804-57.7597C36.4504-58.1897 36.7905-58.5198 37.2105-58.5898C37.2905-58.5998 37.3819-58.5996 37.5719-58.5996ZM65.5719-58.5996L77.1715-58.5996C77.3615-58.5996 77.4508-58.5998 77.5308-58.5898C77.9508-58.5198 78.2909-58.1897 78.3609-57.7597C78.3709-57.6797 78.3707-57.5904 78.3707-57.4004L78.3707-45.8007C78.3707-45.6207 78.3709-45.5192 78.3609-45.4492C78.2909-45.0192 77.9508-44.6793 77.5308-44.6093C77.4508-44.5993 77.3615-44.5995 77.1715-44.5995L65.5719-44.5995C65.3819-44.5995 65.2905-44.5993 65.2105-44.6093C64.7905-44.6793 64.4504-45.0192 64.3804-45.4492C64.3704-45.5192 64.3706-45.6207 64.3706-45.8007L64.3706-57.4004C64.3706-57.5904 64.3704-57.6797 64.3804-57.7597C64.4504-58.1897 64.7905-58.5198 65.2105-58.5898C65.2905-58.5998 65.3819-58.5996 65.5719-58.5996ZM93.7711-57.5L143.771-57.5L144.871-57.5L144.871-56.4004L144.871 8.90039L144.871 10L143.771 10L93.7711 10L93.7711-2.59961L103.771-2.59961C103.961-2.59961 104.05-2.59938 104.13-2.60938C104.55-2.67938 104.891-3.00946 104.961-3.43946C104.971-3.51946 104.971-3.61079 104.971-3.80079L104.971-15.4004C104.971-15.5804 104.971-15.68 104.961-15.75C104.891-16.18 104.55-16.5201 104.13-16.5801C104.05-16.6001 103.961-16.5996 103.771-16.5996L93.7711-16.5996L93.7711-30.5996L103.771-30.5996C103.961-30.5996 104.05-30.5994 104.13-30.6094C104.55-30.6794 104.891-31.0095 104.961-31.4395C104.971-31.5195 104.971-31.6108 104.971-31.8008L104.971-43.4004C104.971-43.5804 104.971-43.68 104.961-43.75C104.891-44.18 104.55-44.5201 104.13-44.5801C104.05-44.6001 103.961-44.5996 103.771-44.5996L93.7711-44.5996ZM120.171-44.5996C119.981-44.5996 119.892-44.6001 119.812-44.5801C119.392-44.5201 119.052-44.18 118.982-43.75C118.972-43.68 118.97-43.5804 118.97-43.4004L118.97-31.8008C118.97-31.6108 118.972-31.5195 118.982-31.4395C119.052-31.0095 119.392-30.6794 119.812-30.6094C119.892-30.5994 119.981-30.5996 120.171-30.5996L131.771-30.5996C131.961-30.5996 132.05-30.5993 132.13-30.6094C132.55-30.6794 132.891-31.0095 132.961-31.4395C132.971-31.5195 132.971-31.6108 132.971-31.8008L132.971-43.4004C132.971-43.5804 132.971-43.68 132.961-43.75C132.891-44.18 132.55-44.5201 132.13-44.5801C132.05-44.6001 131.961-44.5996 131.771-44.5996ZM37.5719-30.5996L49.1715-30.5996C49.3615-30.5996 49.4508-30.5998 49.5308-30.5898C49.9508-30.5198 50.2909-30.1897 50.3609-29.7597C50.3709-29.6797 50.3707-29.5904 50.3707-29.4004L50.3707-17.8007C50.3707-17.6207 50.3709-17.5192 50.3609-17.4492C50.2909-17.0192 49.9508-16.6793 49.5308-16.6093C49.4508-16.5993 49.3615-16.5995 49.1715-16.5995L37.5719-16.5995C37.3819-16.5995 37.2905-16.5993 37.2105-16.6093C36.7905-16.6793 36.4504-17.0192 36.3804-17.4492C36.3704-17.5192 36.3706-17.6207 36.3706-17.8007L36.3706-29.4004C36.3706-29.5904 36.3704-29.6797 36.3804-29.7597C36.4504-30.1897 36.7905-30.5198 37.2105-30.5898C37.2905-30.5998 37.3819-30.5996 37.5719-30.5996ZM65.5719-30.5996L77.1715-30.5996C77.3615-30.5996 77.4508-30.5998 77.5308-30.5898C77.9508-30.5198 78.2909-30.1897 78.3609-29.7597C78.3709-29.6797 78.3707-29.5904 78.3707-29.4004L78.3707-17.8007C78.3707-17.6207 78.3709-17.5192 78.3609-17.4492C78.2909-17.0192 77.9508-16.6793 77.5308-16.6093C77.4508-16.5993 77.3615-16.5995 77.1715-16.5995L65.5719-16.5995C65.3819-16.5995 65.2905-16.5993 65.2105-16.6093C64.7905-16.6793 64.4504-17.0192 64.3804-17.4492C64.3704-17.5192 64.3706-17.6207 64.3706-17.8007L64.3706-29.4004C64.3706-29.5904 64.3704-29.6797 64.3804-29.7597C64.4504-30.1897 64.7905-30.5198 65.2105-30.5898C65.2905-30.5998 65.3819-30.5996 65.5719-30.5996ZM120.171-16.5996C119.981-16.5996 119.892-16.6001 119.812-16.5801C119.392-16.5201 119.052-16.18 118.982-15.75C118.972-15.68 118.97-15.5804 118.97-15.4004L118.97-3.80078C118.97-3.61078 118.972-3.51945 118.982-3.43945C119.052-3.00945 119.392-2.67938 119.812-2.60938C119.892-2.59938 119.981-2.59961 120.171-2.59961L131.771-2.59961C131.961-2.59961 132.05-2.59937 132.13-2.60938C132.55-2.67938 132.891-3.00945 132.961-3.43945C132.971-3.51945 132.971-3.61078 132.971-3.80078L132.971-15.4004C132.971-15.5804 132.971-15.68 132.961-15.75C132.891-16.18 132.55-16.5201 132.13-16.5801C132.05-16.6001 131.961-16.5996 131.771-16.5996ZM37.5719-2.59961L49.1715-2.59961C49.3615-2.59961 49.4508-2.59984 49.5308-2.58984C49.9508-2.51984 50.2909-2.18976 50.3609-1.75976C50.3709-1.67976 50.3707-1.59039 50.3707-1.40039L50.3707 10.1992C50.3707 10.3792 50.3709 10.4808 50.3609 10.5508C50.2909 10.9808 49.9508 11.3206 49.5308 11.3906C49.4508 11.4006 49.3615 11.4004 49.1715 11.4004L37.5719 11.4004C37.3819 11.4004 37.2905 11.4007 37.2105 11.3906C36.7905 11.3206 36.4504 10.9808 36.3804 10.5508C36.3704 10.4808 36.3706 10.3792 36.3706 10.1992L36.3706-1.40039C36.3706-1.59039 36.3704-1.67977 36.3804-1.75977C36.4504-2.18976 36.7905-2.51984 37.2105-2.58984C37.2905-2.59984 37.3819-2.59961 37.5719-2.59961ZM65.5719-2.59961L77.1715-2.59961C77.3615-2.59961 77.4508-2.59984 77.5308-2.58984C77.9508-2.51984 78.2909-2.18976 78.3609-1.75976C78.3709-1.67976 78.3707-1.59039 78.3707-1.40039L78.3707 10.1992C78.3707 10.3792 78.3709 10.4808 78.3609 10.5508C78.2909 10.9808 77.9508 11.3206 77.5308 11.3906C77.4508 11.4006 77.3615 11.4004 77.1715 11.4004L65.5719 11.4004C65.3819 11.4004 65.2905 11.4007 65.2105 11.3906C64.7905 11.3206 64.4504 10.9808 64.3804 10.5508C64.3704 10.4808 64.3706 10.3792 64.3706 10.1992L64.3706-1.40039C64.3706-1.59039 64.3704-1.67977 64.3804-1.75977C64.4504-2.18976 64.7905-2.51984 65.2105-2.58984C65.2905-2.59984 65.3819-2.59961 65.5719-2.59961Z"/>
+  </g>
+  <g id="Bold-L" transform="matrix(1 0 0 1 2250.11 1556)">
+   <path class="SFSymbolsPreviewWireframe" d="M36.2594-102.99C35.0994-102.99 33.8908-102.99 32.7808-102.82C26.7908-101.87 22.0902-97.1697 21.1402-91.1797C20.9702-90.0697 20.9703-88.8592 20.9703-87.6992L20.9703-87.3906L20.9703 8.41016L20.9703 8.7207C20.9703 9.8807 20.9702 11.0892 21.1402 12.1992C22.0902 18.1892 26.7908 22.8898 32.7808 23.8398C33.8908 24.0098 35.0994 24.0098 36.2594 24.0098L36.5699 24.0098L77.9703 24.0098L142.771 24.0098L143.089 24.0098C144.229 24.0098 145.561 24.0103 146.791 23.8203C153.431 22.7703 158.629 17.5697 159.679 10.9297C159.869 9.69969 159.871 8.37047 159.871 7.23047L159.871 6.91016L159.871-58.3906L159.871-58.5508L159.871-58.7109C159.871-59.8509 159.87-61.1799 159.679-62.4199C158.629-69.0499 153.431-74.2508 146.791-75.3008C145.561-75.5008 144.229-75.4902 143.089-75.4902L142.771-75.4902L91.7711-75.4902L91.7711-87.3906L91.7711-87.6992C91.7711-88.8592 91.7711-90.0697 91.6011-91.1797C90.6512-97.1697 85.9505-101.87 79.9605-102.82C78.8505-102.99 77.6401-102.99 76.4801-102.99L76.1695-102.99L36.5699-102.99ZM36.5699-88.5898L48.1695-88.5898C48.3595-88.5898 48.4508-88.5901 48.5308-88.58C48.9508-88.51 49.2909-88.18 49.3609-87.75C49.3709-87.67 49.3707-87.5806 49.3707-87.3906L49.3707-75.789C49.3707-75.609 49.3709-75.5194 49.3609-75.4394C49.2909-75.0094 48.9508-74.6693 48.5308-74.6093C48.4508-74.5893 48.3595-74.5898 48.1695-74.5898L36.5699-74.5898C36.3799-74.5898 36.2905-74.5893 36.2105-74.6093C35.7905-74.6693 35.4504-75.0094 35.3804-75.4394C35.3704-75.5194 35.3706-75.609 35.3706-75.789L35.3706-87.3906C35.3706-87.5806 35.3704-87.67 35.3804-87.75C35.4504-88.18 35.7905-88.51 36.2105-88.58C36.2905-88.59 36.3799-88.5898 36.5699-88.5898ZM64.5699-88.5898L76.1695-88.5898C76.3595-88.5898 76.4508-88.5901 76.5308-88.58C76.9508-88.51 77.2909-88.18 77.3609-87.75C77.3709-87.67 77.3707-87.5806 77.3707-87.3906L77.3707-75.789C77.3707-75.609 77.3709-75.5194 77.3609-75.4394C77.2909-75.0094 76.9508-74.6693 76.5308-74.6093C76.4508-74.5893 76.3595-74.5898 76.1695-74.5898L64.5699-74.5898C64.3799-74.5898 64.2905-74.5893 64.2105-74.6093C63.7905-74.6693 63.4504-75.0094 63.3804-75.4394C63.3704-75.5194 63.3706-75.609 63.3706-75.789L63.3706-87.3906C63.3706-87.5806 63.3704-87.67 63.3804-87.75C63.4504-88.18 63.7905-88.51 64.2105-88.58C64.2905-88.59 64.3799-88.5898 64.5699-88.5898ZM36.5699-60.5898L48.1695-60.5898C48.3595-60.5898 48.4508-60.5901 48.5308-60.58C48.9508-60.51 49.2909-60.18 49.3609-59.75C49.3709-59.67 49.3707-59.5806 49.3707-59.3906L49.3707-47.789C49.3707-47.609 49.3709-47.5194 49.3609-47.4394C49.2909-47.0094 48.9508-46.6693 48.5308-46.6093C48.4508-46.5893 48.3595-46.5898 48.1695-46.5898L36.5699-46.5898C36.3799-46.5898 36.2905-46.5893 36.2105-46.6093C35.7905-46.6693 35.4504-47.0094 35.3804-47.4394C35.3704-47.5194 35.3706-47.609 35.3706-47.789L35.3706-59.3906C35.3706-59.5806 35.3704-59.67 35.3804-59.75C35.4504-60.18 35.7905-60.51 36.2105-60.58C36.2905-60.59 36.3799-60.5898 36.5699-60.5898ZM64.5699-60.5898L76.1695-60.5898C76.3595-60.5898 76.4508-60.5901 76.5308-60.58C76.9508-60.51 77.2909-60.18 77.3609-59.75C77.3709-59.67 77.3707-59.5806 77.3707-59.3906L77.3707-47.789C77.3707-47.609 77.3709-47.5194 77.3609-47.4394C77.2909-47.0094 76.9508-46.6693 76.5308-46.6093C76.4508-46.5893 76.3595-46.5898 76.1695-46.5898L64.5699-46.5898C64.3799-46.5898 64.2905-46.5893 64.2105-46.6093C63.7905-46.6693 63.4504-47.0094 63.3804-47.4394C63.3704-47.5194 63.3706-47.609 63.3706-47.789L63.3706-59.3906C63.3706-59.5806 63.3704-59.67 63.3804-59.75C63.4504-60.18 63.7905-60.51 64.2105-60.58C64.2905-60.59 64.3799-60.5898 64.5699-60.5898ZM91.7711-60.4902L142.771-60.4902C143.551-60.4902 143.99-60.4905 144.31-60.4804L144.5-60.4804C144.67-60.4304 144.811-60.2891 144.851-60.1191C144.861-60.0791 144.861-60.0194 144.861-59.9394C144.871-59.6094 144.871-59.1806 144.871-58.3906L144.871 6.91016C144.871 7.69015 144.871 8.12922 144.861 8.44922C144.861 8.53922 144.861 8.60063 144.851 8.64062C144.811 8.81062 144.67 8.95023 144.5 8.99023C144.46 8.99023 144.4 9 144.31 9C143.99 9.01 143.551 9.00977 142.771 9.00977L91.7711 9.00977L91.7711-4.58984L102.771-4.58984C102.961-4.58984 103.05-4.58961 103.13-4.59961C103.55-4.66961 103.891-5.00946 103.961-5.43946C103.971-5.50946 103.971-5.60907 103.971-5.78907L103.971-17.3906C103.971-17.5806 103.971-17.67 103.961-17.75C103.891-18.18 103.55-18.5101 103.13-18.5801C103.05-18.5901 102.961-18.5899 102.771-18.5899L91.7711-18.5899L91.7711-32.5899L102.771-32.5899C102.961-32.5899 103.05-32.5896 103.13-32.5997C103.55-32.6697 103.891-33.0095 103.961-33.4395C103.971-33.5095 103.971-33.6091 103.971-33.7891L103.971-45.3907C103.971-45.5807 103.971-45.6701 103.961-45.7501C103.891-46.1801 103.55-46.5101 103.13-46.5801C103.05-46.5901 102.961-46.5899 102.771-46.5899L91.7711-46.5899ZM119.17-46.5898C118.98-46.5898 118.89-46.5901 118.81-46.58C118.39-46.51 118.05-46.18 117.98-45.75C117.97-45.67 117.97-45.5806 117.97-45.3906L117.97-33.789C117.97-33.609 117.97-33.5094 117.98-33.4394C118.05-33.0094 118.39-32.6696 118.81-32.5996C118.89-32.5896 118.98-32.5898 119.17-32.5898L130.771-32.5898C130.961-32.5898 131.05-32.5895 131.13-32.5996C131.55-32.6696 131.891-33.0094 131.961-33.4394C131.971-33.5094 131.971-33.609 131.971-33.789L131.971-45.3906C131.971-45.5806 131.971-45.67 131.961-45.75C131.891-46.18 131.55-46.51 131.13-46.58C131.05-46.59 130.961-46.5898 130.771-46.5898ZM36.5699-32.5898L48.1695-32.5898C48.3595-32.5898 48.4508-32.5901 48.5308-32.58C48.9508-32.51 49.2909-32.18 49.3609-31.75C49.3709-31.67 49.3707-31.5806 49.3707-31.3906L49.3707-19.789C49.3707-19.609 49.3709-19.5194 49.3609-19.4394C49.2909-19.0094 48.9508-18.6693 48.5308-18.6093C48.4508-18.5893 48.3595-18.5898 48.1695-18.5898L36.5699-18.5898C36.3799-18.5898 36.2905-18.5893 36.2105-18.6093C35.7905-18.6693 35.4504-19.0094 35.3804-19.4394C35.3704-19.5194 35.3706-19.609 35.3706-19.789L35.3706-31.3906C35.3706-31.5806 35.3704-31.67 35.3804-31.75C35.4504-32.18 35.7905-32.51 36.2105-32.58C36.2905-32.59 36.3799-32.5898 36.5699-32.5898ZM64.5699-32.5898L76.1695-32.5898C76.3595-32.5898 76.4508-32.5901 76.5308-32.58C76.9508-32.51 77.2909-32.18 77.3609-31.75C77.3709-31.67 77.3707-31.5806 77.3707-31.3906L77.3707-19.789C77.3707-19.609 77.3709-19.5194 77.3609-19.4394C77.2909-19.0094 76.9508-18.6693 76.5308-18.6093C76.4508-18.5893 76.3595-18.5898 76.1695-18.5898L64.5699-18.5898C64.3799-18.5898 64.2905-18.5893 64.2105-18.6093C63.7905-18.6693 63.4504-19.0094 63.3804-19.4394C63.3704-19.5194 63.3706-19.609 63.3706-19.789L63.3706-31.3906C63.3706-31.5806 63.3704-31.67 63.3804-31.75C63.4504-32.18 63.7905-32.51 64.2105-32.58C64.2905-32.59 64.3799-32.5898 64.5699-32.5898ZM119.17-18.5898C118.98-18.5898 118.89-18.5901 118.81-18.58C118.39-18.51 118.05-18.18 117.98-17.75C117.97-17.67 117.97-17.5806 117.97-17.3906L117.97-5.78903C117.97-5.60903 117.97-5.50942 117.98-5.43942C118.05-5.00942 118.39-4.66958 118.81-4.59958C118.89-4.58958 118.98-4.58981 119.17-4.58981L130.771-4.58981C130.961-4.58981 131.05-4.58957 131.13-4.59958C131.55-4.66958 131.891-5.00942 131.961-5.43942C131.971-5.50942 131.971-5.60903 131.971-5.78903L131.971-17.3906C131.971-17.5806 131.971-17.67 131.961-17.75C131.891-18.18 131.55-18.5101 131.13-18.5801C131.05-18.5901 130.961-18.5899 130.771-18.5899ZM36.5699-4.58984L48.1695-4.58984C48.3595-4.58984 48.4508-4.59008 48.5308-4.58007C48.9508-4.51007 49.2909-4.17999 49.3609-3.75C49.3709-3.67 49.3707-3.58062 49.3707-3.39062L49.3707 8.21094C49.3707 8.39094 49.3709 8.48055 49.3609 8.56055C49.2909 8.99055 48.9508 9.33063 48.5308 9.39062C48.4508 9.41062 48.3595 9.41016 48.1695 9.41016L36.5699 9.41016C36.3799 9.41016 36.2905 9.41062 36.2105 9.39062C35.7905 9.33063 35.4504 8.99055 35.3804 8.56055C35.3704 8.48055 35.3706 8.39094 35.3706 8.21094L35.3706-3.39062C35.3706-3.58062 35.3704-3.67 35.3804-3.75C35.4504-4.18 35.7905-4.51008 36.2105-4.58008C36.2905-4.59008 36.3799-4.58985 36.5699-4.58985ZM64.5699-4.58984L76.1695-4.58984C76.3595-4.58984 76.4508-4.59008 76.5308-4.58007C76.9508-4.51007 77.2909-4.17999 77.3609-3.75C77.3709-3.67 77.3707-3.58062 77.3707-3.39062L77.3707 8.21094C77.3707 8.39094 77.3709 8.48055 77.3609 8.56055C77.2909 8.99055 76.9508 9.33063 76.5308 9.39062C76.4508 9.41062 76.3595 9.41016 76.1695 9.41016L64.5699 9.41016C64.3799 9.41016 64.2905 9.41062 64.2105 9.39062C63.7905 9.33063 63.4504 8.99055 63.3804 8.56055C63.3704 8.48055 63.3706 8.39094 63.3706 8.21094L63.3706-3.39062C63.3706-3.58062 63.3704-3.67 63.3804-3.75C63.4504-4.18 63.7905-4.51008 64.2105-4.58008C64.2905-4.59008 64.3799-4.58985 64.5699-4.58985Z"/>
+  </g>
+  <g id="Semibold-L" transform="matrix(1 0 0 1 1953.9 1556)">
+   <path class="SFSymbolsPreviewWireframe" d="M35.7711-103.5C34.5911-103.5 33.4209-103.5 32.3609-103.33C26.5809-102.42 22.0502-97.8894 21.1402-92.1094C20.9702-91.0494 20.9703-89.8792 20.9703-88.6992L20.9703-88.4004L20.9703 7.40039L20.9703 7.69922C20.9703 8.87922 20.9702 10.0494 21.1402 11.1094C22.0502 16.8894 26.5809 21.4201 32.3609 22.3301C33.4209 22.5001 34.5911 22.5 35.7711 22.5L36.0719 22.5L77.9703 22.5L142.271 22.5L142.582 22.5L142.592 22.5C143.732 22.5 145.031 22.5003 146.221 22.3203C152.641 21.3003 157.671 16.2696 158.691 9.84961C158.871 8.65961 158.871 7.3607 158.871 6.2207L158.871 6.05078L158.871 5.90039L158.871-59.4004L158.871-59.5195L158.871-59.7207C158.871-60.8607 158.871-62.1496 158.691-63.3496C157.671-69.7596 152.641-74.8005 146.221-75.8105C145.031-76.0005 143.732-76 142.592-76L142.271-76L90.7713-76L90.7713-88.4004L90.7713-88.6992C90.7713-89.8792 90.7714-91.0494 90.6014-92.1094C89.6914-97.8894 85.1607-102.42 79.3807-103.33C78.3207-103.5 77.1505-103.5 75.9705-103.5L75.6715-103.5L36.0719-103.5ZM36.0719-89.5996L47.6715-89.5996C47.8615-89.5996 47.9508-89.5998 48.0308-89.5898C48.4508-89.5198 48.7909-89.1897 48.8609-88.7597C48.8709-88.6797 48.8707-88.5904 48.8707-88.4004L48.8707-76.8007C48.8707-76.6207 48.871-76.5192 48.8609-76.4492C48.7909-76.0192 48.4508-75.6793 48.0308-75.6093C47.9508-75.5993 47.8615-75.5995 47.6715-75.5995L36.0719-75.5995C35.8819-75.5995 35.7905-75.5993 35.7105-75.6093C35.2905-75.6793 34.9504-76.0192 34.8804-76.4492C34.8704-76.5192 34.8706-76.6207 34.8706-76.8007L34.8706-88.4004C34.8706-88.5904 34.8704-88.6797 34.8804-88.7597C34.9504-89.1897 35.2905-89.5198 35.7105-89.5898C35.7905-89.5998 35.8819-89.5996 36.0719-89.5996ZM64.0719-89.5996L75.6715-89.5996C75.8615-89.5996 75.9508-89.5998 76.0308-89.5898C76.4508-89.5198 76.7909-89.1897 76.8609-88.7597C76.8709-88.6797 76.8707-88.5904 76.8707-88.4004L76.8707-76.8007C76.8707-76.6207 76.871-76.5192 76.8609-76.4492C76.7909-76.0192 76.4508-75.6793 76.0308-75.6093C75.9508-75.5993 75.8615-75.5995 75.6715-75.5995L64.0719-75.5995C63.8819-75.5995 63.7905-75.5993 63.7105-75.6093C63.2905-75.6793 62.9504-76.0192 62.8804-76.4492C62.8704-76.5192 62.8706-76.6207 62.8706-76.8007L62.8706-88.4004C62.8706-88.5904 62.8704-88.6797 62.8804-88.7597C62.9504-89.1897 63.2905-89.5198 63.7105-89.5898C63.7905-89.5998 63.8819-89.5996 64.0719-89.5996ZM90.7711-62L142.271-62C143.051-62 143.502-62.0002 143.832-61.9902C143.962-61.9902 144.032-61.9804 144.072-61.9804C144.462-61.9004 144.771-61.5891 144.851-61.1991C144.851-61.1591 144.861-61.0809 144.861-60.9609C144.871-60.6309 144.871-60.1803 144.871-59.4003L144.871 5.90039C144.871 6.68039 144.871 7.13094 144.861 7.46094C144.861 7.53094 144.861 7.59086 144.851 7.63086L144.851 7.69922C144.771 8.08922 144.462 8.40047 144.072 8.48047C144.032 8.48047 143.962 8.49024 143.832 8.49024C143.502 8.50024 143.051 8.50001 142.271 8.50001L90.7711 8.50001L90.7711-5.59961L102.271-5.59961C102.461-5.59961 102.55-5.59938 102.63-5.60938C103.05-5.67938 103.391-6.01922 103.461-6.44922C103.471-6.51922 103.471-6.62079 103.471-6.80079L103.471-18.4004C103.471-18.5904 103.471-18.6798 103.461-18.7598C103.391-19.1898 103.05-19.5198 102.63-19.5898C102.55-19.5998 102.461-19.5996 102.271-19.5996L90.7711-19.5996L90.7711-33.5996L102.271-33.5996C102.461-33.5996 102.55-33.5994 102.63-33.6094C103.05-33.6794 103.391-34.0193 103.461-34.4493C103.471-34.5193 103.471-34.6209 103.471-34.8009L103.471-46.4005C103.471-46.5905 103.471-46.6798 103.461-46.7598C103.391-47.1898 103.05-47.5199 102.63-47.5899C102.55-47.5999 102.461-47.5997 102.271-47.5997L90.7711-47.5997ZM36.0719-61.5996L47.6715-61.5996C47.8615-61.5996 47.9508-61.5998 48.0308-61.5898C48.4508-61.5198 48.7909-61.1897 48.8609-60.7597C48.8709-60.6797 48.8707-60.5904 48.8707-60.4004L48.8707-48.8007C48.8707-48.6207 48.871-48.5192 48.8609-48.4492C48.7909-48.0192 48.4508-47.6793 48.0308-47.6093C47.9508-47.5993 47.8615-47.5995 47.6715-47.5995L36.0719-47.5995C35.8819-47.5995 35.7905-47.5993 35.7105-47.6093C35.2905-47.6793 34.9504-48.0192 34.8804-48.4492C34.8704-48.5192 34.8706-48.6207 34.8706-48.8007L34.8706-60.4004C34.8706-60.5904 34.8704-60.6797 34.8804-60.7597C34.9504-61.1897 35.2905-61.5198 35.7105-61.5898C35.7905-61.5998 35.8819-61.5996 36.0719-61.5996ZM64.0719-61.5996L75.6715-61.5996C75.8615-61.5996 75.9508-61.5998 76.0308-61.5898C76.4508-61.5198 76.7909-61.1897 76.8609-60.7597C76.8709-60.6797 76.8707-60.5904 76.8707-60.4004L76.8707-48.8007C76.8707-48.6207 76.871-48.5192 76.8609-48.4492C76.7909-48.0192 76.4508-47.6793 76.0308-47.6093C75.9508-47.5993 75.8615-47.5995 75.6715-47.5995L64.0719-47.5995C63.8819-47.5995 63.7905-47.5993 63.7105-47.6093C63.2905-47.6793 62.9504-48.0192 62.8804-48.4492C62.8704-48.5192 62.8706-48.6207 62.8706-48.8007L62.8706-60.4004C62.8706-60.5904 62.8704-60.6797 62.8804-60.7597C62.9504-61.1897 63.2905-61.5198 63.7105-61.5898C63.7905-61.5998 63.8819-61.5996 64.0719-61.5996ZM118.671-47.5996C118.481-47.5996 118.392-47.5998 118.312-47.5898C117.892-47.5198 117.552-47.1897 117.482-46.7597C117.472-46.6797 117.47-46.5904 117.47-46.4004L117.47-34.8007C117.47-34.6207 117.472-34.5192 117.482-34.4492C117.552-34.0192 117.892-33.6793 118.312-33.6093C118.392-33.5993 118.481-33.5995 118.671-33.5995L130.271-33.5995C130.461-33.5995 130.55-33.5993 130.63-33.6093C131.05-33.6793 131.391-34.0192 131.461-34.4492C131.471-34.5192 131.471-34.6207 131.471-34.8007L131.471-46.4004C131.471-46.5904 131.471-46.6797 131.461-46.7597C131.391-47.1897 131.05-47.5198 130.63-47.5898C130.55-47.5998 130.461-47.5996 130.271-47.5996ZM36.0719-33.5996L47.6715-33.5996C47.8615-33.5996 47.9508-33.5998 48.0308-33.5898C48.4508-33.5198 48.7909-33.1897 48.8609-32.7597C48.8709-32.6797 48.8707-32.5904 48.8707-32.4004L48.8707-20.8007C48.8707-20.6207 48.871-20.5192 48.8609-20.4492C48.7909-20.0192 48.4508-19.6793 48.0308-19.6093C47.9508-19.5993 47.8615-19.5995 47.6715-19.5995L36.0719-19.5995C35.8819-19.5995 35.7905-19.5993 35.7105-19.6093C35.2905-19.6793 34.9504-20.0192 34.8804-20.4492C34.8704-20.5192 34.8706-20.6207 34.8706-20.8007L34.8706-32.4004C34.8706-32.5904 34.8704-32.6797 34.8804-32.7597C34.9504-33.1897 35.2905-33.5198 35.7105-33.5898C35.7905-33.5998 35.8819-33.5996 36.0719-33.5996ZM64.0719-33.5996L75.6715-33.5996C75.8615-33.5996 75.9508-33.5998 76.0308-33.5898C76.4508-33.5198 76.7909-33.1897 76.8609-32.7597C76.8709-32.6797 76.8707-32.5904 76.8707-32.4004L76.8707-20.8007C76.8707-20.6207 76.871-20.5192 76.8609-20.4492C76.7909-20.0192 76.4508-19.6793 76.0308-19.6093C75.9508-19.5993 75.8615-19.5995 75.6715-19.5995L64.0719-19.5995C63.8819-19.5995 63.7905-19.5993 63.7105-19.6093C63.2905-19.6793 62.9504-20.0192 62.8804-20.4492C62.8704-20.5192 62.8706-20.6207 62.8706-20.8007L62.8706-32.4004C62.8706-32.5904 62.8704-32.6797 62.8804-32.7597C62.9504-33.1897 63.2905-33.5198 63.7105-33.5898C63.7905-33.5998 63.8819-33.5996 64.0719-33.5996ZM118.671-19.5996C118.481-19.5996 118.392-19.5998 118.312-19.5898C117.892-19.5198 117.552-19.1897 117.482-18.7597C117.472-18.6797 117.47-18.5904 117.47-18.4004L117.47-6.80075C117.47-6.62075 117.472-6.51918 117.482-6.44918C117.552-6.01918 117.892-5.67934 118.312-5.60934C118.392-5.59934 118.481-5.59957 118.671-5.59957L130.271-5.59957C130.461-5.59957 130.55-5.59934 130.63-5.60934C131.05-5.67934 131.391-6.01918 131.461-6.44918C131.471-6.51918 131.471-6.62075 131.471-6.80075L131.471-18.4004C131.471-18.5904 131.471-18.6798 131.461-18.7598C131.391-19.1898 131.05-19.5198 130.63-19.5898C130.55-19.5998 130.461-19.5996 130.271-19.5996ZM36.0719-5.59961L47.6715-5.59961C47.8615-5.59961 47.9508-5.59984 48.0308-5.58984C48.4508-5.51984 48.7909-5.18976 48.8609-4.75976C48.8709-4.67976 48.8707-4.59039 48.8707-4.40039L48.8707 7.19922C48.8707 7.37922 48.871 7.48078 48.8609 7.55078C48.7909 7.98078 48.4508 8.32063 48.0308 8.39062C47.9508 8.40062 47.8615 8.40039 47.6715 8.40039L36.0719 8.40039C35.8819 8.40039 35.7905 8.40063 35.7105 8.39062C35.2905 8.32063 34.9504 7.98078 34.8804 7.55078C34.8704 7.48078 34.8706 7.37922 34.8706 7.19922L34.8706-4.40039C34.8706-4.59039 34.8704-4.67977 34.8804-4.75977C34.9504-5.18976 35.2905-5.51984 35.7105-5.58984C35.7905-5.59984 35.8819-5.59961 36.0719-5.59961ZM64.0719-5.59961L75.6715-5.59961C75.8615-5.59961 75.9508-5.59984 76.0308-5.58984C76.4508-5.51984 76.7909-5.18976 76.8609-4.75976C76.8709-4.67976 76.8707-4.59039 76.8707-4.40039L76.8707 7.19922C76.8707 7.37922 76.871 7.48078 76.8609 7.55078C76.7909 7.98078 76.4508 8.32063 76.0308 8.39062C75.9508 8.40062 75.8615 8.40039 75.6715 8.40039L64.0719 8.40039C63.8819 8.40039 63.7905 8.40063 63.7105 8.39062C63.2905 8.32063 62.9504 7.98078 62.8804 7.55078C62.8704 7.48078 62.8706 7.37922 62.8706 7.19922L62.8706-4.40039C62.8706-4.59039 62.8704-4.67977 62.8804-4.75977C62.9504-5.18976 63.2905-5.51984 63.7105-5.58984C63.7905-5.59984 63.8819-5.59961 64.0719-5.59961Z"/>
+  </g>
+  <g id="Medium-L" transform="matrix(1 0 0 1 1657.69 1556)">
+   <path class="SFSymbolsPreviewWireframe" d="M35.2808-102C34.0908-102 32.961-102 31.941-101.84C26.371-100.96 22.0104-96.5993 21.1304-91.0293C20.9704-90.0093 20.9703-88.8795 20.9703-87.6895L20.9703-87.4004L20.9703 8.40039L20.9703 8.68945C20.9703 9.87945 20.9704 11.0093 21.1304 12.0293C22.0104 17.5993 26.371 21.9598 31.941 22.8398C32.961 22.9998 34.0908 23 35.2808 23L35.5699 23L76.4703 23L141.771 23L142.08 23C143.24 23 144.49 23.0003 145.64 22.8203C151.84 21.8403 156.711 16.9695 157.691 10.7695C157.871 9.61953 157.871 8.37094 157.871 7.21094L157.871 6.90039L157.871-58.4004L157.871-58.7109C157.871-59.8709 157.871-61.1195 157.691-62.2695C156.711-68.4695 151.84-73.3403 145.64-74.3203C144.49-74.5003 143.24-74.5 142.08-74.5L141.771-74.5L89.7711-74.5L89.7711-87.4004L89.7711-87.6895C89.7711-88.8795 89.7709-90.0093 89.6109-91.0293C88.7309-96.5993 84.3704-100.96 78.8004-101.84C77.7804-102 76.6505-102 75.4605-102L75.1695-102L35.5699-102ZM35.5699-88.5996L47.1695-88.5996C47.3595-88.5996 47.4508-88.5998 47.5308-88.5898C47.9508-88.5198 48.2909-88.1897 48.3609-87.7597C48.3709-87.6797 48.3707-87.5904 48.3707-87.4004L48.3707-75.8007C48.3707-75.6207 48.3709-75.5192 48.3609-75.4492C48.2909-75.0192 47.9508-74.6793 47.5308-74.6093C47.4508-74.5993 47.3595-74.5995 47.1695-74.5995L35.5699-74.5995C35.3799-74.5995 35.2905-74.5993 35.2105-74.6093C34.7905-74.6793 34.4504-75.0192 34.3804-75.4492C34.3704-75.5192 34.3706-75.6207 34.3706-75.8007L34.3706-87.4004C34.3706-87.5904 34.3704-87.6797 34.3804-87.7597C34.4504-88.1897 34.7905-88.5198 35.2105-88.5898C35.2905-88.5998 35.3799-88.5996 35.5699-88.5996ZM63.5699-88.5996L75.1695-88.5996C75.3595-88.5996 75.4508-88.5998 75.5308-88.5898C75.9508-88.5198 76.2909-88.1897 76.3609-87.7597C76.3709-87.6797 76.3707-87.5904 76.3707-87.4004L76.3707-75.8007C76.3707-75.6207 76.3709-75.5192 76.3609-75.4492C76.2909-75.0192 75.9508-74.6793 75.5308-74.6093C75.4508-74.5993 75.3595-74.5995 75.1695-74.5995L63.5699-74.5995C63.3799-74.5995 63.2905-74.5993 63.2105-74.6093C62.7905-74.6793 62.4504-75.0192 62.3804-75.4492C62.3704-75.5192 62.3706-75.6207 62.3706-75.8007L62.3706-87.4004C62.3706-87.5904 62.3704-87.6797 62.3804-87.7597C62.4504-88.1897 62.7905-88.5198 63.2105-88.5898C63.2905-88.5998 63.3799-88.5996 63.5699-88.5996ZM89.7711-61.5L141.771-61.5C142.551-61.5 142.999-61.5002 143.339-61.4902C143.509-61.4802 143.6-61.4804 143.63-61.4804C144.25-61.3704 144.739-60.8797 144.849-60.2597C144.849-60.2297 144.861-60.1406 144.861-59.9706C144.871-59.6306 144.871-59.1803 144.871-58.4003L144.871 6.90039C144.871 7.68039 144.871 8.1307 144.861 8.4707C144.861 8.6407 144.849 8.72977 144.849 8.75977C144.739 9.37976 144.25 9.87047 143.63 9.98047C143.6 9.98047 143.509 9.99024 143.339 9.99024C142.999 10.0002 142.551 10 141.771 10L89.7711 10L89.7711-4.59961L101.771-4.59961C101.961-4.59961 102.05-4.59938 102.13-4.60938C102.55-4.67938 102.891-5.01922 102.961-5.44922C102.971-5.51922 102.971-5.62079 102.971-5.80079L102.971-17.4004C102.971-17.5904 102.971-17.6798 102.961-17.7598C102.891-18.1898 102.55-18.5198 102.13-18.5898C102.05-18.5998 101.961-18.5996 101.771-18.5996L89.7711-18.5996L89.7711-32.5996L101.771-32.5996C101.961-32.5996 102.05-32.5994 102.13-32.6094C102.55-32.6794 102.891-33.0193 102.961-33.4493C102.971-33.5193 102.971-33.6209 102.971-33.8009L102.971-45.4005C102.971-45.5905 102.971-45.6798 102.961-45.7598C102.891-46.1898 102.55-46.5199 102.13-46.5899C102.05-46.5999 101.961-46.5997 101.771-46.5997L89.7711-46.5997ZM35.5699-60.5996L47.1695-60.5996C47.3595-60.5996 47.4508-60.5998 47.5308-60.5898C47.9508-60.5198 48.2909-60.1897 48.3609-59.7597C48.3709-59.6797 48.3707-59.5904 48.3707-59.4004L48.3707-47.8007C48.3707-47.6207 48.3709-47.5192 48.3609-47.4492C48.2909-47.0192 47.9508-46.6793 47.5308-46.6093C47.4508-46.5993 47.3595-46.5995 47.1695-46.5995L35.5699-46.5995C35.3799-46.5995 35.2905-46.5993 35.2105-46.6093C34.7905-46.6793 34.4504-47.0192 34.3804-47.4492C34.3704-47.5192 34.3706-47.6207 34.3706-47.8007L34.3706-59.4004C34.3706-59.5904 34.3704-59.6797 34.3804-59.7597C34.4504-60.1897 34.7905-60.5198 35.2105-60.5898C35.2905-60.5998 35.3799-60.5996 35.5699-60.5996ZM63.5699-60.5996L75.1695-60.5996C75.3595-60.5996 75.4508-60.5998 75.5308-60.5898C75.9508-60.5198 76.2909-60.1897 76.3609-59.7597C76.3709-59.6797 76.3707-59.5904 76.3707-59.4004L76.3707-47.8007C76.3707-47.6207 76.3709-47.5192 76.3609-47.4492C76.2909-47.0192 75.9508-46.6793 75.5308-46.6093C75.4508-46.5993 75.3595-46.5995 75.1695-46.5995L63.5699-46.5995C63.3799-46.5995 63.2905-46.5993 63.2105-46.6093C62.7905-46.6793 62.4504-47.0192 62.3804-47.4492C62.3704-47.5192 62.3706-47.6207 62.3706-47.8007L62.3706-59.4004C62.3706-59.5904 62.3704-59.6797 62.3804-59.7597C62.4504-60.1897 62.7905-60.5198 63.2105-60.5898C63.2905-60.5998 63.3799-60.5996 63.5699-60.5996ZM118.17-46.5996C117.98-46.5996 117.89-46.5998 117.81-46.5898C117.39-46.5198 117.05-46.1897 116.98-45.7597C116.97-45.6797 116.97-45.5904 116.97-45.4004L116.97-33.8007C116.97-33.6207 116.97-33.5192 116.98-33.4492C117.05-33.0192 117.39-32.6793 117.81-32.6093C117.89-32.5993 117.98-32.5995 118.17-32.5995L129.771-32.5995C129.961-32.5995 130.05-32.5993 130.13-32.6093C130.55-32.6793 130.891-33.0192 130.961-33.4492C130.971-33.5192 130.971-33.6207 130.971-33.8007L130.971-45.4004C130.971-45.5904 130.971-45.6797 130.961-45.7597C130.891-46.1897 130.55-46.5198 130.13-46.5898C130.05-46.5998 129.961-46.5996 129.771-46.5996ZM35.5699-32.5996L47.1695-32.5996C47.3595-32.5996 47.4508-32.5998 47.5308-32.5898C47.9508-32.5198 48.2909-32.1897 48.3609-31.7597C48.3709-31.6797 48.3707-31.5904 48.3707-31.4004L48.3707-19.8007C48.3707-19.6207 48.3709-19.5192 48.3609-19.4492C48.2909-19.0192 47.9508-18.6793 47.5308-18.6093C47.4508-18.5993 47.3595-18.5995 47.1695-18.5995L35.5699-18.5995C35.3799-18.5995 35.2905-18.5993 35.2105-18.6093C34.7905-18.6793 34.4504-19.0192 34.3804-19.4492C34.3704-19.5192 34.3706-19.6207 34.3706-19.8007L34.3706-31.4004C34.3706-31.5904 34.3704-31.6797 34.3804-31.7597C34.4504-32.1897 34.7905-32.5198 35.2105-32.5898C35.2905-32.5998 35.3799-32.5996 35.5699-32.5996ZM63.5699-32.5996L75.1695-32.5996C75.3595-32.5996 75.4508-32.5998 75.5308-32.5898C75.9508-32.5198 76.2909-32.1897 76.3609-31.7597C76.3709-31.6797 76.3707-31.5904 76.3707-31.4004L76.3707-19.8007C76.3707-19.6207 76.3709-19.5192 76.3609-19.4492C76.2909-19.0192 75.9508-18.6793 75.5308-18.6093C75.4508-18.5993 75.3595-18.5995 75.1695-18.5995L63.5699-18.5995C63.3799-18.5995 63.2905-18.5993 63.2105-18.6093C62.7905-18.6793 62.4504-19.0192 62.3804-19.4492C62.3704-19.5192 62.3706-19.6207 62.3706-19.8007L62.3706-31.4004C62.3706-31.5904 62.3704-31.6797 62.3804-31.7597C62.4504-32.1897 62.7905-32.5198 63.2105-32.5898C63.2905-32.5998 63.3799-32.5996 63.5699-32.5996ZM118.17-18.5996C117.98-18.5996 117.89-18.5998 117.81-18.5898C117.39-18.5198 117.05-18.1897 116.98-17.7597C116.97-17.6797 116.97-17.5904 116.97-17.4004L116.97-5.80075C116.97-5.62075 116.97-5.51918 116.98-5.44918C117.05-5.01918 117.39-4.67934 117.81-4.60934C117.89-4.59934 117.98-4.59957 118.17-4.59957L129.771-4.59957C129.961-4.59957 130.05-4.59934 130.13-4.60934C130.55-4.67934 130.891-5.01918 130.961-5.44918C130.971-5.51918 130.971-5.62075 130.971-5.80075L130.971-17.4004C130.971-17.5904 130.971-17.6798 130.961-17.7598C130.891-18.1898 130.55-18.5198 130.13-18.5898C130.05-18.5998 129.961-18.5996 129.771-18.5996ZM35.5699-4.59961L47.1695-4.59961C47.3595-4.59961 47.4508-4.59984 47.5308-4.58984C47.9508-4.51984 48.2909-4.18976 48.3609-3.75976C48.3709-3.67976 48.3707-3.59039 48.3707-3.40039L48.3707 8.19922C48.3707 8.37922 48.3709 8.48078 48.3609 8.55078C48.2909 8.98078 47.9508 9.32063 47.5308 9.39062C47.4508 9.40062 47.3595 9.40039 47.1695 9.40039L35.5699 9.40039C35.3799 9.40039 35.2905 9.40063 35.2105 9.39062C34.7905 9.32063 34.4504 8.98078 34.3804 8.55078C34.3704 8.48078 34.3706 8.37922 34.3706 8.19922L34.3706-3.40039C34.3706-3.59039 34.3704-3.67977 34.3804-3.75977C34.4504-4.18976 34.7905-4.51984 35.2105-4.58984C35.2905-4.59984 35.3799-4.59961 35.5699-4.59961ZM63.5699-4.59961L75.1695-4.59961C75.3595-4.59961 75.4508-4.59984 75.5308-4.58984C75.9508-4.51984 76.2909-4.18976 76.3609-3.75976C76.3709-3.67976 76.3707-3.59039 76.3707-3.40039L76.3707 8.19922C76.3707 8.37922 76.3709 8.48078 76.3609 8.55078C76.2909 8.98078 75.9508 9.32063 75.5308 9.39062C75.4508 9.40062 75.3595 9.40039 75.1695 9.40039L63.5699 9.40039C63.3799 9.40039 63.2905 9.40063 63.2105 9.39062C62.7905 9.32063 62.4504 8.98078 62.3804 8.55078C62.3704 8.48078 62.3706 8.37922 62.3706 8.19922L62.3706-3.40039C62.3706-3.59039 62.3704-3.67977 62.3804-3.75977C62.4504-4.18976 62.7905-4.51984 63.2105-4.58984C63.2905-4.59984 63.3799-4.59961 63.5699-4.59961Z"/>
+  </g>
+  <g id="Regular-L" transform="matrix(1 0 0 1 1361.48 1556)">
+   <path class="SFSymbolsPreviewWireframe" d="M34.7906-105.5C33.5906-105.5 32.5013-105.5 31.5113-105.35C26.1713-104.5 21.9707-100.301 21.1207-94.9609C20.9707-93.9709 20.9703-92.8797 20.9703-91.6797L20.9703-91.4004L20.9703 4.40039L20.9703 4.67969C20.9703 5.87969 20.9707 6.97094 21.1207 7.96094C21.9707 13.3009 26.1713 17.4996 31.5113 18.3496C32.5013 18.4996 33.5906 18.5 34.7906 18.5L35.0719 18.5L76.4703 18.5L141.271 18.5L141.582 18.5C142.742 18.5 143.95 18.5001 145.06 18.3301C151.05 17.3801 155.751 12.6794 156.701 6.68945C156.871 5.57946 156.871 4.37094 156.871 3.21094L156.871 2.90039L156.871-62.4004L156.871-62.7109C156.871-63.8709 156.871-65.0795 156.701-66.1895C155.751-72.1794 151.05-76.8801 145.06-77.8301C143.95-78.0001 142.742-78 141.582-78L141.271-78L88.7711-78L88.7711-91.4004L88.7711-91.6797C88.7711-92.8797 88.7707-93.9709 88.6207-94.9609C87.7707-100.301 83.572-104.5 78.232-105.35C77.242-105.5 76.1508-105.5 74.9508-105.5L74.6715-105.5L35.0719-105.5ZM35.0719-92.5996L46.6715-92.5996C46.8615-92.5996 46.9508-92.5998 47.0308-92.5898C47.4508-92.5198 47.7909-92.1897 47.8609-91.7597C47.8709-91.6797 47.8707-91.5904 47.8707-91.4004L47.8707-79.8007C47.8707-79.6207 47.871-79.5192 47.8609-79.4492C47.7909-79.0192 47.4508-78.6793 47.0308-78.6093C46.9508-78.5993 46.8615-78.5995 46.6715-78.5995L35.0719-78.5995C34.8819-78.5995 34.7905-78.5993 34.7105-78.6093C34.2905-78.6793 33.9504-79.0192 33.8804-79.4492C33.8704-79.5192 33.8706-79.6207 33.8706-79.8007L33.8706-91.4004C33.8706-91.5904 33.8704-91.6797 33.8804-91.7597C33.9504-92.1897 34.2905-92.5198 34.7105-92.5898C34.7905-92.5998 34.8819-92.5996 35.0719-92.5996ZM63.0719-92.5996L74.6715-92.5996C74.8615-92.5996 74.9508-92.5998 75.0308-92.5898C75.4508-92.5198 75.7909-92.1897 75.8609-91.7597C75.8709-91.6797 75.8707-91.5904 75.8707-91.4004L75.8707-79.8007C75.8707-79.6207 75.871-79.5192 75.8609-79.4492C75.7909-79.0192 75.4508-78.6793 75.0308-78.6093C74.9508-78.5993 74.8615-78.5995 74.6715-78.5995L63.0719-78.5995C62.8819-78.5995 62.7905-78.5993 62.7105-78.6093C62.2905-78.6793 61.9504-79.0192 61.8804-79.4492C61.8704-79.5192 61.8706-79.6207 61.8706-79.8007L61.8706-91.4004C61.8706-91.5904 61.8704-91.6797 61.8804-91.7597C61.9504-92.1897 62.2905-92.5198 62.7105-92.5898C62.7905-92.5998 62.8819-92.5996 63.0719-92.5996ZM88.7711-66L141.271-66C142.051-66 142.511-66.0002 142.861-65.9902C143.081-65.9802 143.171-65.9807 143.201-65.9707C144.041-65.8307 144.701-65.17 144.841-64.33C144.851-64.3 144.851-64.2102 144.861-63.9902C144.871-63.6402 144.871-63.1804 144.871-62.4004L144.871 2.90039C144.871 3.68039 144.871 4.14024 144.861 4.49023C144.851 4.71023 144.851 4.80008 144.841 4.83008C144.701 5.67008 144.041 6.3307 143.201 6.4707C143.171 6.4807 143.081 6.48023 142.861 6.49023C142.511 6.50023 142.051 6.5 141.271 6.5L88.7711 6.5L88.7711-8.59961L101.271-8.59961C101.461-8.59961 101.55-8.59938 101.63-8.60938C102.05-8.67938 102.391-9.01922 102.461-9.44922C102.471-9.51922 102.471-9.62079 102.471-9.80079L102.471-21.4004C102.471-21.5904 102.471-21.6798 102.461-21.7598C102.391-22.1898 102.05-22.5198 101.63-22.5898C101.55-22.5998 101.461-22.5996 101.271-22.5996L88.7711-22.5996L88.7711-36.5996L101.271-36.5996C101.461-36.5996 101.55-36.5994 101.63-36.6094C102.05-36.6794 102.391-37.0193 102.461-37.4493C102.471-37.5193 102.471-37.6209 102.471-37.8009L102.471-49.4005C102.471-49.5905 102.471-49.6798 102.461-49.7598C102.391-50.1898 102.05-50.5199 101.63-50.5899C101.55-50.5999 101.461-50.5997 101.271-50.5997L88.7711-50.5997ZM35.0719-64.5996L46.6715-64.5996C46.8615-64.5996 46.9508-64.5998 47.0308-64.5898C47.4508-64.5198 47.7909-64.1897 47.8609-63.7597C47.8709-63.6797 47.8707-63.5904 47.8707-63.4004L47.8707-51.8007C47.8707-51.6207 47.871-51.5192 47.8609-51.4492C47.7909-51.0192 47.4508-50.6793 47.0308-50.6093C46.9508-50.5993 46.8615-50.5995 46.6715-50.5995L35.0719-50.5995C34.8819-50.5995 34.7905-50.5993 34.7105-50.6093C34.2905-50.6793 33.9504-51.0192 33.8804-51.4492C33.8704-51.5192 33.8706-51.6207 33.8706-51.8007L33.8706-63.4004C33.8706-63.5904 33.8704-63.6797 33.8804-63.7597C33.9504-64.1897 34.2905-64.5198 34.7105-64.5898C34.7905-64.5998 34.8819-64.5996 35.0719-64.5996ZM63.0719-64.5996L74.6715-64.5996C74.8615-64.5996 74.9508-64.5998 75.0308-64.5898C75.4508-64.5198 75.7909-64.1897 75.8609-63.7597C75.8709-63.6797 75.8707-63.5904 75.8707-63.4004L75.8707-51.8007C75.8707-51.6207 75.871-51.5192 75.8609-51.4492C75.7909-51.0192 75.4508-50.6793 75.0308-50.6093C74.9508-50.5993 74.8615-50.5995 74.6715-50.5995L63.0719-50.5995C62.8819-50.5995 62.7905-50.5993 62.7105-50.6093C62.2905-50.6793 61.9504-51.0192 61.8804-51.4492C61.8704-51.5192 61.8706-51.6207 61.8706-51.8007L61.8706-63.4004C61.8706-63.5904 61.8704-63.6797 61.8804-63.7597C61.9504-64.1897 62.2905-64.5198 62.7105-64.5898C62.7905-64.5998 62.8819-64.5996 63.0719-64.5996ZM117.671-50.5996C117.481-50.5996 117.39-50.5998 117.31-50.5898C116.89-50.5198 116.552-50.1897 116.482-49.7597C116.472-49.6797 116.47-49.5904 116.47-49.4004L116.47-37.8007C116.47-37.6207 116.472-37.5192 116.482-37.4492C116.552-37.0192 116.89-36.6793 117.31-36.6093C117.39-36.5993 117.481-36.5995 117.671-36.5995L129.271-36.5995C129.461-36.5995 129.55-36.5993 129.63-36.6093C130.05-36.6793 130.391-37.0192 130.461-37.4492C130.471-37.5192 130.471-37.6207 130.471-37.8007L130.471-49.4004C130.471-49.5904 130.471-49.6797 130.461-49.7597C130.391-50.1897 130.05-50.5198 129.63-50.5898C129.55-50.5998 129.461-50.5996 129.271-50.5996ZM35.0719-36.5996L46.6715-36.5996C46.8615-36.5996 46.9508-36.5998 47.0308-36.5898C47.4508-36.5198 47.7909-36.1897 47.8609-35.7597C47.8709-35.6797 47.8707-35.5904 47.8707-35.4004L47.8707-23.8007C47.8707-23.6207 47.871-23.5192 47.8609-23.4492C47.7909-23.0192 47.4508-22.6793 47.0308-22.6093C46.9508-22.5993 46.8615-22.5995 46.6715-22.5995L35.0719-22.5995C34.8819-22.5995 34.7905-22.5993 34.7105-22.6093C34.2905-22.6793 33.9504-23.0192 33.8804-23.4492C33.8704-23.5192 33.8706-23.6207 33.8706-23.8007L33.8706-35.4004C33.8706-35.5904 33.8704-35.6797 33.8804-35.7597C33.9504-36.1897 34.2905-36.5198 34.7105-36.5898C34.7905-36.5998 34.8819-36.5996 35.0719-36.5996ZM63.0719-36.5996L74.6715-36.5996C74.8615-36.5996 74.9508-36.5998 75.0308-36.5898C75.4508-36.5198 75.7909-36.1897 75.8609-35.7597C75.8709-35.6797 75.8707-35.5904 75.8707-35.4004L75.8707-23.8007C75.8707-23.6207 75.871-23.5192 75.8609-23.4492C75.7909-23.0192 75.4508-22.6793 75.0308-22.6093C74.9508-22.5993 74.8615-22.5995 74.6715-22.5995L63.0719-22.5995C62.8819-22.5995 62.7905-22.5993 62.7105-22.6093C62.2905-22.6793 61.9504-23.0192 61.8804-23.4492C61.8704-23.5192 61.8706-23.6207 61.8706-23.8007L61.8706-35.4004C61.8706-35.5904 61.8704-35.6797 61.8804-35.7597C61.9504-36.1897 62.2905-36.5198 62.7105-36.5898C62.7905-36.5998 62.8819-36.5996 63.0719-36.5996ZM117.671-22.5996C117.481-22.5996 117.39-22.5998 117.31-22.5898C116.89-22.5198 116.552-22.1897 116.482-21.7597C116.472-21.6797 116.47-21.5904 116.47-21.4004L116.47-9.80075C116.47-9.62075 116.472-9.51918 116.482-9.44918C116.552-9.01918 116.89-8.67934 117.31-8.60934C117.39-8.59934 117.481-8.59957 117.671-8.59957L129.271-8.59957C129.461-8.59957 129.55-8.59934 129.63-8.60934C130.05-8.67934 130.391-9.01918 130.461-9.44918C130.471-9.51918 130.471-9.62075 130.471-9.80075L130.471-21.4004C130.471-21.5904 130.471-21.6798 130.461-21.7598C130.391-22.1898 130.05-22.5198 129.63-22.5898C129.55-22.5998 129.461-22.5996 129.271-22.5996ZM35.0719-8.59961L46.6715-8.59961C46.8615-8.59961 46.9508-8.59984 47.0308-8.58984C47.4508-8.51984 47.7909-8.18976 47.8609-7.75976C47.8709-7.67976 47.8707-7.59039 47.8707-7.40039L47.8707 4.19922C47.8707 4.37922 47.871 4.48078 47.8609 4.55078C47.7909 4.98078 47.4508 5.32063 47.0308 5.39062C46.9508 5.40062 46.8615 5.40039 46.6715 5.40039L35.0719 5.40039C34.8819 5.40039 34.7905 5.40063 34.7105 5.39062C34.2905 5.32063 33.9504 4.98078 33.8804 4.55078C33.8704 4.48078 33.8706 4.37922 33.8706 4.19922L33.8706-7.40039C33.8706-7.59039 33.8704-7.67977 33.8804-7.75977C33.9504-8.18976 34.2905-8.51984 34.7105-8.58984C34.7905-8.59984 34.8819-8.59961 35.0719-8.59961ZM63.0719-8.59961L74.6715-8.59961C74.8615-8.59961 74.9508-8.59984 75.0308-8.58984C75.4508-8.51984 75.7909-8.18976 75.8609-7.75976C75.8709-7.67976 75.8707-7.59039 75.8707-7.40039L75.8707 4.19922C75.8707 4.37922 75.871 4.48078 75.8609 4.55078C75.7909 4.98078 75.4508 5.32063 75.0308 5.39062C74.9508 5.40062 74.8615 5.40039 74.6715 5.40039L63.0719 5.40039C62.8819 5.40039 62.7905 5.40063 62.7105 5.39062C62.2905 5.32063 61.9504 4.98078 61.8804 4.55078C61.8704 4.48078 61.8706 4.37922 61.8706 4.19922L61.8706-7.40039C61.8706-7.59039 61.8704-7.67977 61.8804-7.75977C61.9504-8.18976 62.2905-8.51984 62.7105-8.58984C62.7905-8.59984 62.8819-8.59961 63.0719-8.59961Z"/>
+  </g>
+  <g id="Light-L" transform="matrix(1 0 0 1 1066.77 1556)">
+   <path class="SFSymbolsPreviewWireframe" d="M33.8199-96.5C32.5799-96.5 31.5695-96.4994 30.6695-96.3594C25.7495-95.5794 21.8909-91.7208 21.1109-86.8008C20.9709-85.9008 20.9703-84.8904 20.9703-83.6504L20.9703-83.4004L20.9703 12.4004L20.9703 12.6504C20.9703 13.8904 20.9709 14.9008 21.1109 15.8008C21.8909 20.7208 25.7495 24.5794 30.6695 25.3594C31.5695 25.4994 32.5799 25.5 33.8199 25.5L34.0699 25.5L76.4703 25.5L138.269 25.5L138.56 25.5C139.75 25.5 140.88 25.4998 141.9 25.3398C147.47 24.4598 151.831 20.0993 152.711 14.5293C152.871 13.5093 152.871 12.3795 152.871 11.1895L152.871 10.9004L152.871-54.4004L152.871-54.6895C152.871-55.8795 152.871-57.0093 152.711-58.0293C151.831-63.5993 147.47-67.9598 141.9-68.8398C140.88-68.9998 139.75-69 138.56-69L138.269-69L86.7691-69L86.7691-83.4004L86.7691-83.6504C86.7691-84.8904 86.7704-85.9008 86.6304-86.8008C85.8504-91.7208 81.9899-95.5794 77.0699-96.3594C76.1699-96.4994 75.1595-96.5 73.9195-96.5L73.6695-96.5L34.0699-96.5ZM34.0699-84.5996L45.6695-84.5996C45.8595-84.5996 45.9508-84.5998 46.0308-84.5898C46.4508-84.5198 46.7909-84.1897 46.8609-83.7597C46.8709-83.6797 46.8707-83.5904 46.8707-83.4004L46.8707-71.8007C46.8707-71.6207 46.8709-71.5192 46.8609-71.4492C46.7909-71.0192 46.4508-70.6793 46.0308-70.6093C45.9508-70.5993 45.8595-70.5995 45.6695-70.5995L34.0699-70.5995C33.8799-70.5995 33.7905-70.5993 33.7105-70.6093C33.2905-70.6793 32.9504-71.0192 32.8804-71.4492C32.8704-71.5192 32.8706-71.6207 32.8706-71.8007L32.8706-83.4004C32.8706-83.5904 32.8704-83.6797 32.8804-83.7597C32.9504-84.1897 33.2905-84.5198 33.7105-84.5898C33.7905-84.5998 33.8799-84.5996 34.0699-84.5996ZM62.0699-84.5996L73.6695-84.5996C73.8595-84.5996 73.9508-84.5998 74.0308-84.5898C74.4508-84.5198 74.7909-84.1897 74.8609-83.7597C74.8709-83.6797 74.8707-83.5904 74.8707-83.4004L74.8707-71.8007C74.8707-71.6207 74.8709-71.5192 74.8609-71.4492C74.7909-71.0192 74.4508-70.6793 74.0308-70.6093C73.9508-70.5993 73.8595-70.5995 73.6695-70.5995L62.0699-70.5995C61.8799-70.5995 61.7905-70.5993 61.7105-70.6093C61.2905-70.6793 60.9504-71.0192 60.8804-71.4492C60.8704-71.5192 60.8706-71.6207 60.8706-71.8007L60.8706-83.4004C60.8706-83.5904 60.8704-83.6797 60.8804-83.7597C60.9504-84.1897 61.2905-84.5198 61.7105-84.5898C61.7905-84.5998 61.8799-84.5996 62.0699-84.5996ZM86.7691-59L138.269-59C139.949-59 140.199-58.9809 140.339-58.9609C141.619-58.7609 142.63-57.7507 142.83-56.4707C142.85-56.3307 142.871-56.0804 142.871-54.4004L142.871 10.9004C142.871 12.5804 142.85 12.8307 142.83 12.9707C142.63 14.2507 141.619 15.2609 140.339 15.4609C140.199 15.4809 139.949 15.5 138.269 15.5L86.7691 15.5L86.7691-0.599609L99.2691-0.599609C99.4591-0.599609 99.5504-0.599375 99.6304-0.609375C100.05-0.679375 100.391-1.01922 100.461-1.44922C100.471-1.51922 100.471-1.62078 100.471-1.80078L100.471-13.4004C100.471-13.5904 100.471-13.6798 100.461-13.7598C100.391-14.1898 100.05-14.5198 99.6304-14.5898C99.5504-14.5998 99.4591-14.5996 99.2691-14.5996L86.7691-14.5996L86.7691-28.5996L99.2691-28.5996C99.4591-28.5996 99.5504-28.5994 99.6304-28.6094C100.05-28.6794 100.391-29.0193 100.461-29.4493C100.471-29.5193 100.471-29.6209 100.471-29.8009L100.471-41.4005C100.471-41.5905 100.471-41.6798 100.461-41.7598C100.391-42.1898 100.05-42.5199 99.6304-42.5899C99.5504-42.5999 99.4591-42.5997 99.2691-42.5997L86.7691-42.5997ZM34.0699-56.5996L45.6695-56.5996C45.8595-56.5996 45.9508-56.5998 46.0308-56.5898C46.4508-56.5198 46.7909-56.1897 46.8609-55.7597C46.8709-55.6797 46.8707-55.5904 46.8707-55.4004L46.8707-43.8007C46.8707-43.6207 46.8709-43.5192 46.8609-43.4492C46.7909-43.0192 46.4508-42.6793 46.0308-42.6093C45.9508-42.5993 45.8595-42.5995 45.6695-42.5995L34.0699-42.5995C33.8799-42.5995 33.7905-42.5993 33.7105-42.6093C33.2905-42.6793 32.9504-43.0192 32.8804-43.4492C32.8704-43.5192 32.8706-43.6207 32.8706-43.8007L32.8706-55.4004C32.8706-55.5904 32.8704-55.6797 32.8804-55.7597C32.9504-56.1897 33.2905-56.5198 33.7105-56.5898C33.7905-56.5998 33.8799-56.5996 34.0699-56.5996ZM62.0699-56.5996L73.6695-56.5996C73.8595-56.5996 73.9508-56.5998 74.0308-56.5898C74.4508-56.5198 74.7909-56.1897 74.8609-55.7597C74.8709-55.6797 74.8707-55.5904 74.8707-55.4004L74.8707-43.8007C74.8707-43.6207 74.8709-43.5192 74.8609-43.4492C74.7909-43.0192 74.4508-42.6793 74.0308-42.6093C73.9508-42.5993 73.8595-42.5995 73.6695-42.5995L62.0699-42.5995C61.8799-42.5995 61.7905-42.5993 61.7105-42.6093C61.2905-42.6793 60.9504-43.0192 60.8804-43.4492C60.8704-43.5192 60.8706-43.6207 60.8706-43.8007L60.8706-55.4004C60.8706-55.5904 60.8704-55.6797 60.8804-55.7597C60.9504-56.1897 61.2905-56.5198 61.7105-56.5898C61.7905-56.5998 61.8799-56.5996 62.0699-56.5996ZM115.67-42.5996C115.48-42.5996 115.39-42.5998 115.31-42.5898C114.89-42.5198 114.55-42.1897 114.48-41.7597C114.47-41.6797 114.47-41.5904 114.47-41.4004L114.47-29.8007C114.47-29.6207 114.47-29.5192 114.48-29.4492C114.55-29.0192 114.89-28.6793 115.31-28.6093C115.39-28.5993 115.48-28.5995 115.67-28.5995L127.269-28.5995C127.459-28.5995 127.55-28.5993 127.63-28.6093C128.05-28.6793 128.391-29.0192 128.461-29.4492C128.471-29.5192 128.471-29.6207 128.471-29.8007L128.471-41.4004C128.471-41.5904 128.471-41.6797 128.461-41.7597C128.391-42.1897 128.05-42.5198 127.63-42.5898C127.55-42.5998 127.459-42.5996 127.269-42.5996ZM34.0699-28.5996L45.6695-28.5996C45.8595-28.5996 45.9508-28.5998 46.0308-28.5898C46.4508-28.5198 46.7909-28.1897 46.8609-27.7597C46.8709-27.6797 46.8707-27.5904 46.8707-27.4004L46.8707-15.8007C46.8707-15.6207 46.8709-15.5192 46.8609-15.4492C46.7909-15.0192 46.4508-14.6793 46.0308-14.6093C45.9508-14.5993 45.8595-14.5995 45.6695-14.5995L34.0699-14.5995C33.8799-14.5995 33.7905-14.5993 33.7105-14.6093C33.2905-14.6793 32.9504-15.0192 32.8804-15.4492C32.8704-15.5192 32.8706-15.6207 32.8706-15.8007L32.8706-27.4004C32.8706-27.5904 32.8704-27.6797 32.8804-27.7597C32.9504-28.1897 33.2905-28.5198 33.7105-28.5898C33.7905-28.5998 33.8799-28.5996 34.0699-28.5996ZM62.0699-28.5996L73.6695-28.5996C73.8595-28.5996 73.9508-28.5998 74.0308-28.5898C74.4508-28.5198 74.7909-28.1897 74.8609-27.7597C74.8709-27.6797 74.8707-27.5904 74.8707-27.4004L74.8707-15.8007C74.8707-15.6207 74.8709-15.5192 74.8609-15.4492C74.7909-15.0192 74.4508-14.6793 74.0308-14.6093C73.9508-14.5993 73.8595-14.5995 73.6695-14.5995L62.0699-14.5995C61.8799-14.5995 61.7905-14.5993 61.7105-14.6093C61.2905-14.6793 60.9504-15.0192 60.8804-15.4492C60.8704-15.5192 60.8706-15.6207 60.8706-15.8007L60.8706-27.4004C60.8706-27.5904 60.8704-27.6797 60.8804-27.7597C60.9504-28.1897 61.2905-28.5198 61.7105-28.5898C61.7905-28.5998 61.8799-28.5996 62.0699-28.5996ZM115.67-14.5996C115.48-14.5996 115.39-14.5998 115.31-14.5898C114.89-14.5198 114.55-14.1897 114.48-13.7597C114.47-13.6797 114.47-13.5904 114.47-13.4004L114.47-1.80075C114.47-1.62075 114.47-1.51918 114.48-1.44918C114.55-1.01918 114.89-0.67934 115.31-0.60934C115.39-0.59934 115.48-0.599574 115.67-0.599574L127.269-0.599574C127.459-0.599574 127.55-0.59934 127.63-0.60934C128.05-0.67934 128.391-1.01918 128.461-1.44918C128.471-1.51918 128.471-1.62075 128.471-1.80075L128.471-13.4004C128.471-13.5904 128.471-13.6798 128.461-13.7598C128.391-14.1898 128.05-14.5198 127.63-14.5898C127.55-14.5998 127.459-14.5996 127.269-14.5996ZM34.0699-0.599609L45.6695-0.599609C45.8595-0.599609 45.9508-0.599844 46.0308-0.589843C46.4508-0.519843 46.7909-0.189764 46.8609 0.240235C46.8709 0.320235 46.8707 0.40961 46.8707 0.59961L46.8707 12.1992C46.8707 12.3792 46.8709 12.4808 46.8609 12.5508C46.7909 12.9808 46.4508 13.3206 46.0308 13.3906C45.9508 13.4006 45.8595 13.4004 45.6695 13.4004L34.0699 13.4004C33.8799 13.4004 33.7905 13.4007 33.7105 13.3906C33.2905 13.3206 32.9504 12.9808 32.8804 12.5508C32.8704 12.4808 32.8706 12.3792 32.8706 12.1992L32.8706 0.599609C32.8706 0.40961 32.8704 0.320234 32.8804 0.240234C32.9504-0.189765 33.2905-0.519844 33.7105-0.589844C33.7905-0.599844 33.8799-0.59961 34.0699-0.59961ZM62.0699-0.599609L73.6695-0.599609C73.8595-0.599609 73.9508-0.599844 74.0308-0.589843C74.4508-0.519843 74.7909-0.189764 74.8609 0.240235C74.8709 0.320235 74.8707 0.40961 74.8707 0.59961L74.8707 12.1992C74.8707 12.3792 74.8709 12.4808 74.8609 12.5508C74.7909 12.9808 74.4508 13.3206 74.0308 13.3906C73.9508 13.4006 73.8595 13.4004 73.6695 13.4004L62.0699 13.4004C61.8799 13.4004 61.7905 13.4007 61.7105 13.3906C61.2905 13.3206 60.9504 12.9808 60.8804 12.5508C60.8704 12.4808 60.8706 12.3792 60.8706 12.1992L60.8706 0.599609C60.8706 0.40961 60.8704 0.320234 60.8804 0.240234C60.9504-0.189765 61.2905-0.519844 61.7105-0.589844C61.7905-0.599844 61.8799-0.59961 62.0699-0.59961Z"/>
+  </g>
+  <g id="Thin-L" transform="matrix(1 0 0 1 772.057 1556)">
+   <path class="SFSymbolsPreviewWireframe" d="M32.3844-96C31.0764-96 30.1858-96.0009 29.4058-95.8809C25.1268-95.2009 21.7713-91.8405 21.0933-87.5605C20.9703-86.7805 20.9703-85.8898 20.9703-84.5898L20.9703-84.4004L20.9703 11.5898C20.9703 12.8898 20.9703 13.7805 21.0933 14.5605C21.7713 18.8405 25.1268 22.2009 29.4058 22.8809C30.1858 23.0009 31.0764 23 32.3844 23L74.4703 23L135.769 23L136.023 23C137.259 23 138.268 22.9994 139.17 22.8594C144.091 22.0794 147.948 18.2208 148.728 13.3008C148.87 12.4008 148.872 11.3904 148.871 10.1504L148.871 9.90039L148.871-55.4004L148.871-55.6504C148.872-56.8904 148.87-57.9008 148.728-58.8008C147.948-63.7208 144.091-67.5794 139.17-68.3594C138.268-68.4994 137.259-68.5 136.023-68.5L135.769-68.5L83.7691-68.5L83.7691-84.4004L83.7691-84.5898C83.7691-85.8898 83.7701-86.7805 83.6461-87.5605C82.9681-91.8405 79.6126-95.2009 75.3336-95.8809C74.5536-96.0009 73.6631-96 72.3551-96L72.1695-96L32.5699-96ZM32.5699-85.5996L44.1695-85.5996C44.3555-85.5996 44.448-85.5998 44.525-85.5898C44.953-85.5198 45.289-85.1897 45.357-84.7597C45.369-84.6797 45.3707-84.5904 45.3707-84.4004L45.3707-72.8007C45.3707-72.6207 45.369-72.5192 45.357-72.4492C45.289-72.0192 44.953-71.6793 44.525-71.6093C44.448-71.5993 44.3555-71.5995 44.1695-71.5995L32.5699-71.5995C32.3839-71.5995 32.2905-71.5993 32.2125-71.6093C31.7855-71.6793 31.4504-72.0192 31.3824-72.4492C31.3704-72.5192 31.3707-72.6207 31.3707-72.8007L31.3707-84.4004C31.3707-84.5904 31.3704-84.6797 31.3824-84.7597C31.4504-85.1897 31.7855-85.5198 32.2125-85.5898C32.2905-85.5998 32.3839-85.5996 32.5699-85.5996ZM60.5699-85.5996L72.1695-85.5996C72.3555-85.5996 72.448-85.5998 72.525-85.5898C72.953-85.5198 73.289-85.1897 73.357-84.7597C73.369-84.6797 73.3707-84.5904 73.3707-84.4004L73.3707-72.8007C73.3707-72.6207 73.369-72.5192 73.357-72.4492C73.289-72.0192 72.953-71.6793 72.525-71.6093C72.448-71.5993 72.3555-71.5995 72.1695-71.5995L60.5699-71.5995C60.3839-71.5995 60.2905-71.5993 60.2125-71.6093C59.7855-71.6793 59.4504-72.0192 59.3824-72.4492C59.3704-72.5192 59.3707-72.6207 59.3707-72.8007L59.3707-84.4004C59.3707-84.5904 59.3704-84.6797 59.3824-84.7597C59.4504-85.1897 59.7855-85.5198 60.2125-85.5898C60.2905-85.5998 60.3839-85.5996 60.5699-85.5996ZM83.7691-61.5L135.769-61.5C137.389-61.5 137.793-61.4895 138.074-61.4395C140-61.1394 141.509-59.6292 141.814-57.6992C141.858-57.4192 141.871-57.0204 141.871-55.4004L141.871 9.90039C141.871 11.5204 141.858 11.9192 141.814 12.1992C141.509 14.1292 140 15.6395 138.074 15.9395C137.793 15.9895 137.389 16 135.769 16L83.7691 16L83.7691-1.59961L96.5699-1.59961C96.7559-1.59961 96.8484-1.59938 96.9254-1.60938C97.3534-1.67938 97.6904-2.01922 97.7574-2.44922C97.7704-2.51922 97.7691-2.62079 97.7691-2.80079L97.7691-14.4004C97.7691-14.5904 97.7704-14.6798 97.7574-14.7598C97.6904-15.1898 97.3534-15.5198 96.9254-15.5898C96.8484-15.5998 96.7559-15.5996 96.5699-15.5996L83.7691-15.5996L83.7691-29.5996L96.5699-29.5996C96.7559-29.5996 96.8484-29.5994 96.9254-29.6094C97.3534-29.6794 97.6904-30.0193 97.7574-30.4493C97.7704-30.5193 97.7691-30.6209 97.7691-30.8009L97.7691-42.4005C97.7691-42.5905 97.7704-42.6798 97.7574-42.7598C97.6904-43.1898 97.3534-43.5199 96.9254-43.5899C96.8484-43.5999 96.7559-43.5997 96.5699-43.5997L83.7691-43.5997ZM32.5699-57.5996L44.1695-57.5996C44.3555-57.5996 44.448-57.5998 44.525-57.5898C44.953-57.5198 45.289-57.1897 45.357-56.7597C45.369-56.6797 45.3707-56.5904 45.3707-56.4004L45.3707-44.8007C45.3707-44.6207 45.369-44.5192 45.357-44.4492C45.289-44.0192 44.953-43.6793 44.525-43.6093C44.448-43.5993 44.3555-43.5995 44.1695-43.5995L32.5699-43.5995C32.3839-43.5995 32.2905-43.5993 32.2125-43.6093C31.7855-43.6793 31.4504-44.0192 31.3824-44.4492C31.3704-44.5192 31.3707-44.6207 31.3707-44.8007L31.3707-56.4004C31.3707-56.5904 31.3704-56.6797 31.3824-56.7597C31.4504-57.1897 31.7855-57.5198 32.2125-57.5898C32.2905-57.5998 32.3839-57.5996 32.5699-57.5996ZM60.5699-57.5996L72.1695-57.5996C72.3555-57.5996 72.448-57.5998 72.525-57.5898C72.953-57.5198 73.289-57.1897 73.357-56.7597C73.369-56.6797 73.3707-56.5904 73.3707-56.4004L73.3707-44.8007C73.3707-44.6207 73.369-44.5192 73.357-44.4492C73.289-44.0192 72.953-43.6793 72.525-43.6093C72.448-43.5993 72.3555-43.5995 72.1695-43.5995L60.5699-43.5995C60.3839-43.5995 60.2905-43.5993 60.2125-43.6093C59.7855-43.6793 59.4504-44.0192 59.3824-44.4492C59.3704-44.5192 59.3707-44.6207 59.3707-44.8007L59.3707-56.4004C59.3707-56.5904 59.3704-56.6797 59.3824-56.7597C59.4504-57.1897 59.7855-57.5198 60.2125-57.5898C60.2905-57.5998 60.3839-57.5996 60.5699-57.5996ZM112.97-43.5996C112.784-43.5996 112.691-43.5998 112.613-43.5898C112.185-43.5198 111.851-43.1897 111.783-42.7597C111.771-42.6797 111.769-42.5904 111.769-42.4004L111.769-30.8007C111.769-30.6207 111.771-30.5192 111.783-30.4492C111.851-30.0192 112.185-29.6793 112.613-29.6093C112.691-29.5993 112.784-29.5995 112.97-29.5995L124.57-29.5995C124.756-29.5995 124.848-29.5993 124.925-29.6093C125.353-29.6793 125.69-30.0192 125.757-30.4492C125.77-30.5192 125.769-30.6207 125.769-30.8007L125.769-42.4004C125.769-42.5904 125.77-42.6797 125.757-42.7597C125.69-43.1897 125.353-43.5198 124.925-43.5898C124.848-43.5998 124.756-43.5996 124.57-43.5996ZM32.5699-29.5996L44.1695-29.5996C44.3555-29.5996 44.448-29.5998 44.525-29.5898C44.953-29.5198 45.289-29.1897 45.357-28.7597C45.369-28.6797 45.3707-28.5904 45.3707-28.4004L45.3707-16.8007C45.3707-16.6207 45.369-16.5192 45.357-16.4492C45.289-16.0192 44.953-15.6793 44.525-15.6093C44.448-15.5993 44.3555-15.5995 44.1695-15.5995L32.5699-15.5995C32.3839-15.5995 32.2905-15.5993 32.2125-15.6093C31.7855-15.6793 31.4504-16.0192 31.3824-16.4492C31.3704-16.5192 31.3707-16.6207 31.3707-16.8007L31.3707-28.4004C31.3707-28.5904 31.3704-28.6797 31.3824-28.7597C31.4504-29.1897 31.7855-29.5198 32.2125-29.5898C32.2905-29.5998 32.3839-29.5996 32.5699-29.5996ZM60.5699-29.5996L72.1695-29.5996C72.3555-29.5996 72.448-29.5998 72.525-29.5898C72.953-29.5198 73.289-29.1897 73.357-28.7597C73.369-28.6797 73.3707-28.5904 73.3707-28.4004L73.3707-16.8007C73.3707-16.6207 73.369-16.5192 73.357-16.4492C73.289-16.0192 72.953-15.6793 72.525-15.6093C72.448-15.5993 72.3555-15.5995 72.1695-15.5995L60.5699-15.5995C60.3839-15.5995 60.2905-15.5993 60.2125-15.6093C59.7855-15.6793 59.4504-16.0192 59.3824-16.4492C59.3704-16.5192 59.3707-16.6207 59.3707-16.8007L59.3707-28.4004C59.3707-28.5904 59.3704-28.6797 59.3824-28.7597C59.4504-29.1897 59.7855-29.5198 60.2125-29.5898C60.2905-29.5998 60.3839-29.5996 60.5699-29.5996ZM112.97-15.5996C112.784-15.5996 112.691-15.5998 112.613-15.5898C112.185-15.5198 111.851-15.1897 111.783-14.7597C111.771-14.6797 111.769-14.5904 111.769-14.4004L111.769-2.80075C111.769-2.62075 111.771-2.51918 111.783-2.44918C111.851-2.01918 112.185-1.67934 112.613-1.60934C112.691-1.59934 112.784-1.59957 112.97-1.59957L124.57-1.59957C124.756-1.59957 124.848-1.59934 124.925-1.60934C125.353-1.67934 125.69-2.01918 125.757-2.44918C125.77-2.51918 125.769-2.62075 125.769-2.80075L125.769-14.4004C125.769-14.5904 125.77-14.6798 125.757-14.7598C125.69-15.1898 125.353-15.5198 124.925-15.5898C124.848-15.5998 124.756-15.5996 124.57-15.5996ZM32.5699-1.59961L44.1695-1.59961C44.3555-1.59961 44.448-1.59984 44.525-1.58984C44.953-1.51984 45.289-1.18976 45.357-0.759761C45.369-0.679761 45.3707-0.590386 45.3707-0.400386L45.3707 11.1992C45.3707 11.3792 45.369 11.4808 45.357 11.5508C45.289 11.9808 44.953 12.3206 44.525 12.3906C44.448 12.4006 44.3555 12.4004 44.1695 12.4004L32.5699 12.4004C32.3839 12.4004 32.2905 12.4007 32.2125 12.3906C31.7855 12.3206 31.4504 11.9808 31.3824 11.5508C31.3704 11.4808 31.3707 11.3792 31.3707 11.1992L31.3707-0.400391C31.3707-0.59039 31.3704-0.679766 31.3824-0.759766C31.4504-1.18976 31.7855-1.51984 32.2125-1.58984C32.2905-1.59984 32.3839-1.59961 32.5699-1.59961ZM60.5699-1.59961L72.1695-1.59961C72.3555-1.59961 72.448-1.59984 72.525-1.58984C72.953-1.51984 73.289-1.18976 73.357-0.759761C73.369-0.679761 73.3707-0.590386 73.3707-0.400386L73.3707 11.1992C73.3707 11.3792 73.369 11.4808 73.357 11.5508C73.289 11.9808 72.953 12.3206 72.525 12.3906C72.448 12.4006 72.3555 12.4004 72.1695 12.4004L60.5699 12.4004C60.3839 12.4004 60.2905 12.4007 60.2125 12.3906C59.7855 12.3206 59.4504 11.9808 59.3824 11.5508C59.3704 11.4808 59.3707 11.3792 59.3707 11.1992L59.3707-0.400391C59.3707-0.59039 59.3704-0.679766 59.3824-0.759766C59.4504-1.18976 59.7855-1.51984 60.2125-1.58984C60.2905-1.59984 60.3839-1.59961 60.5699-1.59961Z"/>
+  </g>
+  <g id="Ultralight-L" transform="matrix(1 0 0 1 475.846 1556)">
+   <path class="SFSymbolsPreviewWireframe" d="M32.3844-97C31.0764-97 30.1858-97.0009 29.4058-96.8809C25.1268-96.2009 21.7713-92.8405 21.0933-88.5605C20.9703-87.7805 20.9703-86.8898 20.9703-85.5898L20.9703-85.4004L20.9703 9.58984C20.9703 10.8898 20.9703 11.7805 21.0933 12.5605C21.7713 16.8405 25.1268 20.2009 29.4058 20.8809C30.1858 21.0009 31.0764 21 32.3844 21L78.4703 21L135.769 21L135.982 21C137.262 21 138.191 20.9991 139.011 20.8691C143.504 20.1591 147.03 16.6406 147.742 12.1406C147.872 11.3206 147.871 10.3894 147.871 9.10938L147.871 8.90039L147.871-56.4004L147.871-56.6094C147.871-57.8894 147.872-58.8206 147.742-59.6406C147.03-64.1406 143.504-67.6591 139.011-68.3691C138.191-68.4991 137.262-68.5 135.982-68.5L135.769-68.5L83.7691-68.5L83.7691-85.4004L83.7691-85.5898C83.7691-86.8898 83.7701-87.7805 83.6461-88.5605C82.9681-92.8405 79.6126-96.2009 75.3336-96.8809C74.5536-97.0009 73.6631-97 72.3551-97L72.1695-97L32.5699-97ZM32.5699-86.5996L44.1695-86.5996C44.3555-86.5996 44.448-86.5998 44.525-86.5898C44.953-86.5198 45.289-86.1897 45.357-85.7597C45.369-85.6797 45.3707-85.5904 45.3707-85.4004L45.3707-73.8007C45.3707-73.6207 45.369-73.5192 45.357-73.4492C45.289-73.0192 44.953-72.6793 44.525-72.6093C44.448-72.5993 44.3555-72.5995 44.1695-72.5995L32.5699-72.5995C32.3839-72.5995 32.2905-72.5993 32.2125-72.6093C31.7855-72.6793 31.4504-73.0192 31.3824-73.4492C31.3704-73.5192 31.3707-73.6207 31.3707-73.8007L31.3707-85.4004C31.3707-85.5904 31.3704-85.6797 31.3824-85.7597C31.4504-86.1897 31.7855-86.5198 32.2125-86.5898C32.2905-86.5998 32.3839-86.5996 32.5699-86.5996ZM60.5699-86.5996L72.1695-86.5996C72.3555-86.5996 72.448-86.5998 72.525-86.5898C72.953-86.5198 73.289-86.1897 73.357-85.7597C73.369-85.6797 73.3707-85.5904 73.3707-85.4004L73.3707-73.8007C73.3707-73.6207 73.369-73.5192 73.357-73.4492C73.289-73.0192 72.953-72.6793 72.525-72.6093C72.448-72.5993 72.3555-72.5995 72.1695-72.5995L60.5699-72.5995C60.3839-72.5995 60.2905-72.5993 60.2125-72.6093C59.7855-72.6793 59.4504-73.0192 59.3824-73.4492C59.3704-73.5192 59.3707-73.6207 59.3707-73.8007L59.3707-85.4004C59.3707-85.5904 59.3704-85.6797 59.3824-85.7597C59.4504-86.1897 59.7855-86.5198 60.2125-86.5898C60.2905-86.5998 60.3839-86.5996 60.5699-86.5996ZM83.7691-63.5L135.769-63.5C137.351-63.5 137.852-63.4897 138.23-63.4297C140.584-63.0597 142.429-61.2094 142.802-58.8594C142.862-58.4794 142.871-57.9804 142.871-56.4004L142.871 8.90039C142.871 10.4804 142.863 10.9794 142.802 11.3594C142.429 13.7094 140.584 15.5597 138.23 15.9297C137.852 15.9897 137.351 16 135.769 16L83.7691 16L83.7691-2.59961L96.5699-2.59961C96.7559-2.59961 96.8484-2.59938 96.9254-2.60938C97.3534-2.67938 97.6904-3.01922 97.7574-3.44922C97.7704-3.51922 97.7691-3.62079 97.7691-3.80079L97.7691-15.4004C97.7691-15.5904 97.7704-15.6798 97.7574-15.7598C97.6904-16.1898 97.3534-16.5198 96.9254-16.5898C96.8484-16.5998 96.7559-16.5996 96.5699-16.5996L83.7691-16.5996L83.7691-30.5996L96.5699-30.5996C96.7559-30.5996 96.8484-30.5994 96.9254-30.6094C97.3534-30.6794 97.6904-31.0193 97.7574-31.4493C97.7704-31.5193 97.7691-31.6209 97.7691-31.8009L97.7691-43.4005C97.7691-43.5905 97.7704-43.6798 97.7574-43.7598C97.6904-44.1898 97.3534-44.5199 96.9254-44.5899C96.8484-44.5999 96.7559-44.5997 96.5699-44.5997L83.7691-44.5997ZM32.5699-58.5996L44.1695-58.5996C44.3555-58.5996 44.448-58.5998 44.525-58.5898C44.953-58.5198 45.289-58.1897 45.357-57.7597C45.369-57.6797 45.3707-57.5904 45.3707-57.4004L45.3707-45.8007C45.3707-45.6207 45.369-45.5192 45.357-45.4492C45.289-45.0192 44.953-44.6793 44.525-44.6093C44.448-44.5993 44.3555-44.5995 44.1695-44.5995L32.5699-44.5995C32.3839-44.5995 32.2905-44.5993 32.2125-44.6093C31.7855-44.6793 31.4504-45.0192 31.3824-45.4492C31.3704-45.5192 31.3707-45.6207 31.3707-45.8007L31.3707-57.4004C31.3707-57.5904 31.3704-57.6797 31.3824-57.7597C31.4504-58.1897 31.7855-58.5198 32.2125-58.5898C32.2905-58.5998 32.3839-58.5996 32.5699-58.5996ZM60.5699-58.5996L72.1695-58.5996C72.3555-58.5996 72.448-58.5998 72.525-58.5898C72.953-58.5198 73.289-58.1897 73.357-57.7597C73.369-57.6797 73.3707-57.5904 73.3707-57.4004L73.3707-45.8007C73.3707-45.6207 73.369-45.5192 73.357-45.4492C73.289-45.0192 72.953-44.6793 72.525-44.6093C72.448-44.5993 72.3555-44.5995 72.1695-44.5995L60.5699-44.5995C60.3839-44.5995 60.2905-44.5993 60.2125-44.6093C59.7855-44.6793 59.4504-45.0192 59.3824-45.4492C59.3704-45.5192 59.3707-45.6207 59.3707-45.8007L59.3707-57.4004C59.3707-57.5904 59.3704-57.6797 59.3824-57.7597C59.4504-58.1897 59.7855-58.5198 60.2125-58.5898C60.2905-58.5998 60.3839-58.5996 60.5699-58.5996ZM112.97-44.5996C112.784-44.5996 112.691-44.5998 112.613-44.5898C112.185-44.5198 111.851-44.1897 111.783-43.7597C111.771-43.6797 111.769-43.5904 111.769-43.4004L111.769-31.8007C111.769-31.6207 111.771-31.5192 111.783-31.4492C111.851-31.0192 112.185-30.6793 112.613-30.6093C112.691-30.5993 112.784-30.5995 112.97-30.5995L124.57-30.5995C124.756-30.5995 124.848-30.5993 124.925-30.6093C125.353-30.6793 125.69-31.0192 125.757-31.4492C125.77-31.5192 125.769-31.6207 125.769-31.8007L125.769-43.4004C125.769-43.5904 125.77-43.6797 125.757-43.7597C125.69-44.1897 125.353-44.5198 124.925-44.5898C124.848-44.5998 124.756-44.5996 124.57-44.5996ZM32.5699-30.5996L44.1695-30.5996C44.3555-30.5996 44.448-30.5998 44.525-30.5898C44.953-30.5198 45.289-30.1897 45.357-29.7597C45.369-29.6797 45.3707-29.5904 45.3707-29.4004L45.3707-17.8007C45.3707-17.6207 45.369-17.5192 45.357-17.4492C45.289-17.0192 44.953-16.6793 44.525-16.6093C44.448-16.5993 44.3555-16.5995 44.1695-16.5995L32.5699-16.5995C32.3839-16.5995 32.2905-16.5993 32.2125-16.6093C31.7855-16.6793 31.4504-17.0192 31.3824-17.4492C31.3704-17.5192 31.3707-17.6207 31.3707-17.8007L31.3707-29.4004C31.3707-29.5904 31.3704-29.6797 31.3824-29.7597C31.4504-30.1897 31.7855-30.5198 32.2125-30.5898C32.2905-30.5998 32.3839-30.5996 32.5699-30.5996ZM60.5699-30.5996L72.1695-30.5996C72.3555-30.5996 72.448-30.5998 72.525-30.5898C72.953-30.5198 73.289-30.1897 73.357-29.7597C73.369-29.6797 73.3707-29.5904 73.3707-29.4004L73.3707-17.8007C73.3707-17.6207 73.369-17.5192 73.357-17.4492C73.289-17.0192 72.953-16.6793 72.525-16.6093C72.448-16.5993 72.3555-16.5995 72.1695-16.5995L60.5699-16.5995C60.3839-16.5995 60.2905-16.5993 60.2125-16.6093C59.7855-16.6793 59.4504-17.0192 59.3824-17.4492C59.3704-17.5192 59.3707-17.6207 59.3707-17.8007L59.3707-29.4004C59.3707-29.5904 59.3704-29.6797 59.3824-29.7597C59.4504-30.1897 59.7855-30.5198 60.2125-30.5898C60.2905-30.5998 60.3839-30.5996 60.5699-30.5996ZM112.97-16.5996C112.784-16.5996 112.691-16.5998 112.613-16.5898C112.185-16.5198 111.851-16.1897 111.783-15.7597C111.771-15.6797 111.769-15.5904 111.769-15.4004L111.769-3.80075C111.769-3.62075 111.771-3.51918 111.783-3.44918C111.851-3.01918 112.185-2.67934 112.613-2.60934C112.691-2.59934 112.784-2.59957 112.97-2.59957L124.57-2.59957C124.756-2.59957 124.848-2.59934 124.925-2.60934C125.353-2.67934 125.69-3.01918 125.757-3.44918C125.77-3.51918 125.769-3.62075 125.769-3.80075L125.769-15.4004C125.769-15.5904 125.77-15.6798 125.757-15.7598C125.69-16.1898 125.353-16.5198 124.925-16.5898C124.848-16.5998 124.756-16.5996 124.57-16.5996ZM32.5699-2.59961L44.1695-2.59961C44.3555-2.59961 44.448-2.59984 44.525-2.58984C44.953-2.51984 45.289-2.18976 45.357-1.75976C45.369-1.67976 45.3707-1.59039 45.3707-1.40039L45.3707 10.1992C45.3707 10.3792 45.369 10.4808 45.357 10.5508C45.289 10.9808 44.953 11.3206 44.525 11.3906C44.448 11.4006 44.3555 11.4004 44.1695 11.4004L32.5699 11.4004C32.3839 11.4004 32.2905 11.4007 32.2125 11.3906C31.7855 11.3206 31.4504 10.9808 31.3824 10.5508C31.3704 10.4808 31.3707 10.3792 31.3707 10.1992L31.3707-1.40039C31.3707-1.59039 31.3704-1.67977 31.3824-1.75977C31.4504-2.18976 31.7855-2.51984 32.2125-2.58984C32.2905-2.59984 32.3839-2.59961 32.5699-2.59961ZM60.5699-2.59961L72.1695-2.59961C72.3555-2.59961 72.448-2.59984 72.525-2.58984C72.953-2.51984 73.289-2.18976 73.357-1.75976C73.369-1.67976 73.3707-1.59039 73.3707-1.40039L73.3707 10.1992C73.3707 10.3792 73.369 10.4808 73.357 10.5508C73.289 10.9808 72.953 11.3206 72.525 11.3906C72.448 11.4006 72.3555 11.4004 72.1695 11.4004L60.5699 11.4004C60.3839 11.4004 60.2905 11.4007 60.2125 11.3906C59.7855 11.3206 59.4504 10.9808 59.3824 10.5508C59.3704 10.4808 59.3707 10.3792 59.3707 10.1992L59.3707-1.40039C59.3707-1.59039 59.3704-1.67977 59.3824-1.75977C59.4504-2.18976 59.7855-2.51984 60.2125-2.58984C60.2905-2.59984 60.3839-2.59961 60.5699-2.59961Z"/>
+  </g>
+  <g id="Black-M" transform="matrix(1 0 0 1 2858.98 1126)">
+   <path class="SFSymbolsPreviewWireframe" d="M35.4216-86.4902C34.6016-86.4902 33.441-86.5 32.361-86.3301C26.581-85.4101 22.0503-80.8796 21.1403-75.0996C20.9603-74.0196 20.9704-72.8591 20.9704-72.0391L20.9704-71.7891L20.9704-4.18945L20.9704-3.94922C20.9704-3.11922 20.9603-1.96086 21.1403-0.880859C22.0503 4.89913 26.581 9.42985 32.361 10.3398C33.441 10.5098 34.6016 10.5098 35.4216 10.5098L35.5309 10.5098L35.6716 10.5098L64.4704 10.5098L113.271 10.5098L113.511 10.5098C114.331 10.5098 115.572 10.5201 116.742 10.3301C122.942 9.35008 127.811 4.47928 128.791-1.7207C128.981-2.8907 128.97-4.13922 128.97-4.94922L128.97-5.18945L128.97-50.7891L128.97-51.0391C128.97-51.8491 128.981-53.0898 128.791-54.2598C127.811-60.4598 122.942-65.3305 116.742-66.3105C115.572-66.5005 114.331-66.4902 113.511-66.4902L113.271-66.4902L77.9704-66.4902L77.9704-71.7891L77.9704-72.0391C77.9704-72.8591 77.9805-74.0196 77.8005-75.0996C76.8905-80.8796 72.3617-85.4101 66.5817-86.3301C65.5017-86.5001 64.3412-86.4902 63.5212-86.4902L63.2712-86.4902L35.6716-86.4902ZM35.6716-72.9902L43.2712-72.9902C43.4612-72.9902 43.5505-72.9905 43.6305-72.9804C44.0505-72.9104 44.3906-72.5804 44.4606-72.1504C44.4706-72.0704 44.4704-71.979 44.4704-71.789L44.4704-64.1894C44.4704-64.0094 44.4707-63.9098 44.4606-63.8398C44.3906-63.4098 44.0505-63.07 43.6305-63C43.5505-62.99 43.4612-62.9902 43.2712-62.9902L35.6716-62.9902C35.4816-62.9902 35.3922-62.9899 35.3122-63C34.8922-63.07 34.5521-63.4098 34.4821-63.8398C34.4721-63.9098 34.4704-64.0094 34.4704-64.1894L34.4704-71.789C34.4704-71.979 34.4721-72.0704 34.4821-72.1504C34.5521-72.5804 34.8922-72.9104 35.3122-72.9804C35.3922-72.9904 35.4816-72.9902 35.6716-72.9902ZM55.6716-72.9902L63.2712-72.9902C63.4612-72.9902 63.5505-72.9905 63.6305-72.9804C64.0505-72.9104 64.3906-72.5804 64.4606-72.1504C64.4706-72.0704 64.4704-71.979 64.4704-71.789L64.4704-64.1894C64.4704-64.0094 64.4707-63.9098 64.4606-63.8398C64.3906-63.4098 64.0505-63.07 63.6305-63C63.5505-62.99 63.4612-62.9902 63.2712-62.9902L55.6716-62.9902C55.4816-62.9902 55.3922-62.9899 55.3122-63C54.8922-63.07 54.5521-63.4098 54.4821-63.8398C54.4721-63.9098 54.4704-64.0094 54.4704-64.1894L54.4704-71.789C54.4704-71.979 54.4721-72.0704 54.4821-72.1504C54.5521-72.5804 54.8922-72.9104 55.3122-72.9804C55.3922-72.9904 55.4816-72.9902 55.6716-72.9902ZM35.6716-52.9902L43.2712-52.9902C43.4612-52.9902 43.5505-52.9905 43.6305-52.9804C44.0505-52.9104 44.3906-52.5804 44.4606-52.1504C44.4706-52.0704 44.4704-51.979 44.4704-51.789L44.4704-44.1894C44.4704-44.0094 44.4707-43.9098 44.4606-43.8398C44.3906-43.4098 44.0505-43.07 43.6305-43C43.5505-42.99 43.4612-42.9902 43.2712-42.9902L35.6716-42.9902C35.4816-42.9902 35.3922-42.9899 35.3122-43C34.8922-43.07 34.5521-43.4098 34.4821-43.8398C34.4721-43.9098 34.4704-44.0094 34.4704-44.1894L34.4704-51.789C34.4704-51.979 34.4721-52.0704 34.4821-52.1504C34.5521-52.5804 34.8922-52.9104 35.3122-52.9804C35.3922-52.9904 35.4816-52.9902 35.6716-52.9902ZM55.6716-52.9902L63.2712-52.9902C63.4612-52.9902 63.5505-52.9905 63.6305-52.9804C64.0505-52.9104 64.3906-52.5804 64.4606-52.1504C64.4706-52.0704 64.4704-51.979 64.4704-51.789L64.4704-44.1894C64.4704-44.0094 64.4707-43.9098 64.4606-43.8398C64.3906-43.4098 64.0505-43.07 63.6305-43C63.5505-42.99 63.4612-42.9902 63.2712-42.9902L55.6716-42.9902C55.4816-42.9902 55.3922-42.9899 55.3122-43C54.8922-43.07 54.5521-43.4098 54.4821-43.8398C54.4721-43.9098 54.4704-44.0094 54.4704-44.1894L54.4704-51.789C54.4704-51.979 54.4721-52.0704 54.4821-52.1504C54.5521-52.5804 54.8922-52.9104 55.3122-52.9804C55.3922-52.9904 55.4816-52.9902 55.6716-52.9902ZM77.9704-49.4902L111.97-49.4902L111.97-6.49023L77.9704-6.49023L77.9704-12.9902L83.2712-12.9902C83.4612-12.9902 83.5505-12.99 83.6305-13C84.0505-13.07 84.3906-13.4099 84.4606-13.8399C84.4706-13.9099 84.4704-14.0095 84.4704-14.1895L84.4704-21.7891C84.4704-21.9791 84.4707-22.0704 84.4606-22.1504C84.3906-22.5804 84.0505-22.9105 83.6305-22.9805C83.5505-22.9905 83.4612-22.9903 83.2712-22.9903L77.9704-22.9903L77.9704-32.9903L83.2712-32.9903C83.4612-32.9903 83.5505-32.9901 83.6305-33.0001C84.0505-33.0701 84.3906-33.4099 84.4606-33.8399C84.4706-33.9099 84.4704-34.0096 84.4704-34.1896L84.4704-41.7892C84.4704-41.9792 84.4707-42.0705 84.4606-42.1505C84.3906-42.5805 84.0505-42.9106 83.6305-42.9806C83.5505-42.9906 83.4612-42.9904 83.2712-42.9904L77.9704-42.9904ZM95.6716-42.9902C95.4816-42.9902 95.3922-42.9905 95.3122-42.9804C94.8922-42.9104 94.5521-42.5804 94.4821-42.1504C94.4721-42.0704 94.4704-41.979 94.4704-41.789L94.4704-34.1894C94.4704-34.0094 94.4721-33.9098 94.4821-33.8398C94.5521-33.4098 94.8922-33.07 95.3122-33C95.3922-32.99 95.4816-32.9902 95.6716-32.9902L103.271-32.9902C103.461-32.9902 103.551-32.9899 103.631-33C104.051-33.07 104.391-33.4098 104.461-33.8398C104.471-33.9098 104.471-34.0094 104.471-34.1894L104.471-41.789C104.471-41.979 104.471-42.0704 104.461-42.1504C104.391-42.5804 104.051-42.9104 103.631-42.9804C103.551-42.9904 103.461-42.9902 103.271-42.9902ZM35.6716-32.9902L43.2712-32.9902C43.4612-32.9902 43.5505-32.9905 43.6305-32.9804C44.0505-32.9104 44.3906-32.5804 44.4606-32.1504C44.4706-32.0704 44.4704-31.979 44.4704-31.789L44.4704-24.1894C44.4704-24.0094 44.4707-23.9098 44.4606-23.8398C44.3906-23.4098 44.0505-23.07 43.6305-23C43.5505-22.99 43.4612-22.9902 43.2712-22.9902L35.6716-22.9902C35.4816-22.9902 35.3922-22.9899 35.3122-23C34.8922-23.07 34.5521-23.4098 34.4821-23.8398C34.4721-23.9098 34.4704-24.0094 34.4704-24.1894L34.4704-31.789C34.4704-31.979 34.4721-32.0704 34.4821-32.1504C34.5521-32.5804 34.8922-32.9104 35.3122-32.9804C35.3922-32.9904 35.4816-32.9902 35.6716-32.9902ZM55.6716-32.9902L63.2712-32.9902C63.4612-32.9902 63.5505-32.9905 63.6305-32.9804C64.0505-32.9104 64.3906-32.5804 64.4606-32.1504C64.4706-32.0704 64.4704-31.979 64.4704-31.789L64.4704-24.1894C64.4704-24.0094 64.4707-23.9098 64.4606-23.8398C64.3906-23.4098 64.0505-23.07 63.6305-23C63.5505-22.99 63.4612-22.9902 63.2712-22.9902L55.6716-22.9902C55.4816-22.9902 55.3922-22.9899 55.3122-23C54.8922-23.07 54.5521-23.4098 54.4821-23.8398C54.4721-23.9098 54.4704-24.0094 54.4704-24.1894L54.4704-31.789C54.4704-31.979 54.4721-32.0704 54.4821-32.1504C54.5521-32.5804 54.8922-32.9104 55.3122-32.9804C55.3922-32.9904 55.4816-32.9902 55.6716-32.9902ZM95.6716-22.9902C95.4816-22.9902 95.3922-22.9905 95.3122-22.9804C94.8922-22.9104 94.5521-22.5804 94.4821-22.1504C94.4721-22.0704 94.4704-21.979 94.4704-21.789L94.4704-14.1894C94.4704-14.0094 94.4721-13.9098 94.4821-13.8398C94.5521-13.4098 94.8922-13.07 95.3122-13C95.3922-12.99 95.4816-12.9902 95.6716-12.9902L103.271-12.9902C103.461-12.9902 103.551-12.9899 103.631-13C104.051-13.07 104.391-13.4098 104.461-13.8398C104.471-13.9098 104.471-14.0094 104.471-14.1894L104.471-21.789C104.471-21.979 104.471-22.0704 104.461-22.1504C104.391-22.5804 104.051-22.9104 103.631-22.9804C103.551-22.9904 103.461-22.9902 103.271-22.9902ZM35.6716-12.9902L43.2712-12.9902C43.4612-12.9902 43.5505-12.9905 43.6305-12.9804C44.0505-12.9104 44.3906-12.5804 44.4606-12.1504C44.4706-12.0704 44.4704-11.979 44.4704-11.789L44.4704-4.18942C44.4704-4.00942 44.4707-3.90981 44.4606-3.83981C44.3906-3.40981 44.0505-3.06996 43.6305-2.99996C43.5505-2.98996 43.4612-2.9902 43.2712-2.9902L35.6716-2.9902C35.4816-2.9902 35.3922-2.98996 35.3122-2.99996C34.8922-3.06996 34.5521-3.40981 34.4821-3.83981C34.4721-3.90981 34.4704-4.00942 34.4704-4.18942L34.4704-11.789C34.4704-11.979 34.4721-12.0704 34.4821-12.1504C34.5521-12.5804 34.8922-12.9104 35.3122-12.9804C35.3922-12.9904 35.4816-12.9902 35.6716-12.9902ZM55.6716-12.9902L63.2712-12.9902C63.4612-12.9902 63.5505-12.9905 63.6305-12.9804C64.0505-12.9104 64.3906-12.5804 64.4606-12.1504C64.4706-12.0704 64.4704-11.979 64.4704-11.789L64.4704-4.18942C64.4704-4.00942 64.4707-3.90981 64.4606-3.83981C64.3906-3.40981 64.0505-3.06996 63.6305-2.99996C63.5505-2.98996 63.4612-2.9902 63.2712-2.9902L55.6716-2.9902C55.4816-2.9902 55.3922-2.98996 55.3122-2.99996C54.8922-3.06996 54.5521-3.40981 54.4821-3.83981C54.4721-3.90981 54.4704-4.00942 54.4704-4.18942L54.4704-11.789C54.4704-11.979 54.4721-12.0704 54.4821-12.1504C54.5521-12.5804 54.8922-12.9104 55.3122-12.9804C55.3922-12.9904 55.4816-12.9902 55.6716-12.9902Z"/>
+  </g>
+  <g id="Heavy-M" transform="matrix(1 0 0 1 2562.77 1126)">
+   <path class="SFSymbolsPreviewWireframe" d="M35.4196-86.4902C34.5996-86.4902 33.441-86.5 32.361-86.3301C26.581-85.4101 22.0503-80.8796 21.1403-75.0996C20.9603-74.0196 20.9704-72.8591 20.9704-72.0391L20.9704-71.7891L20.9704-4.18945L20.9704-3.94922C20.9704-3.11922 20.9603-1.96086 21.1403-0.880859C22.0503 4.89913 26.581 9.42985 32.361 10.3398C33.441 10.5098 34.5996 10.5098 35.4196 10.5098L35.5309 10.5098L35.6696 10.5098L64.9704 10.5098L77.9704 10.5098L113.269 10.5098L113.509 10.5098L113.519 10.5098C114.339 10.5098 115.5 10.5098 116.58 10.3398C122.36 9.42985 126.891 4.89913 127.801-0.880859C127.981-1.96086 127.971-3.11922 127.971-3.94922L127.971-4.18945L127.971-51.7891L127.971-51.9395L127.971-52.0391C127.971-52.8591 127.981-54.0196 127.801-55.0996C126.891-60.8796 122.36-65.4101 116.58-66.3301C115.5-66.5001 114.339-66.4902 113.519-66.4902L113.269-66.4902L77.9706-66.4902L77.9706-71.7891L77.9706-72.0391C77.9706-72.8591 77.9807-74.0196 77.8007-75.0996C76.8907-80.8796 72.36-85.4101 66.58-86.3301C65.5-86.5001 64.3414-86.4902 63.5214-86.4902L63.2714-86.4902L35.6699-86.4902ZM35.6696-72.9902L43.2712-72.9902C43.4612-72.9902 43.5506-72.9905 43.6306-72.9804C44.0505-72.9104 44.3906-72.5804 44.4606-72.1504C44.4706-72.0704 44.4704-71.979 44.4704-71.789L44.4704-64.1894C44.4704-64.0094 44.4707-63.9098 44.4606-63.8398C44.3906-63.4098 44.0505-63.07 43.6306-63C43.5506-62.99 43.4612-62.9902 43.2712-62.9902L35.6696-62.9902C35.4796-62.9902 35.3902-62.9899 35.3102-63C34.8902-63.07 34.5502-63.4098 34.4802-63.8398C34.4702-63.9098 34.4704-64.0095 34.4704-64.1895L34.4704-71.7891C34.4704-71.9791 34.4701-72.0704 34.4802-72.1504C34.5502-72.5804 34.8902-72.9105 35.3102-72.9805C35.3902-72.9905 35.4796-72.9903 35.6696-72.9903ZM55.6696-72.9902L63.2712-72.9902C63.4612-72.9902 63.5506-72.9905 63.6306-72.9804C64.0505-72.9104 64.3906-72.5804 64.4606-72.1504C64.4706-72.0704 64.4704-71.979 64.4704-71.789L64.4704-64.1894C64.4704-64.0094 64.4707-63.9098 64.4606-63.8398C64.3906-63.4098 64.0505-63.07 63.6306-63C63.5506-62.99 63.4612-62.9902 63.2712-62.9902L55.6696-62.9902C55.4796-62.9902 55.3902-62.9899 55.3102-63C54.8902-63.07 54.5502-63.4098 54.4802-63.8398C54.4702-63.9098 54.4704-64.0095 54.4704-64.1895L54.4704-71.7891C54.4704-71.9791 54.4701-72.0704 54.4802-72.1504C54.5502-72.5804 54.8902-72.9105 55.3102-72.9805C55.3902-72.9905 55.4796-72.9903 55.6696-72.9903ZM35.6696-52.9902L43.2712-52.9902C43.4612-52.9902 43.5506-52.9905 43.6306-52.9804C44.0505-52.9104 44.3906-52.5804 44.4606-52.1504C44.4706-52.0704 44.4704-51.979 44.4704-51.789L44.4704-44.1894C44.4704-44.0094 44.4707-43.9098 44.4606-43.8398C44.3906-43.4098 44.0505-43.07 43.6306-43C43.5506-42.99 43.4612-42.9902 43.2712-42.9902L35.6696-42.9902C35.4796-42.9902 35.3902-42.9899 35.3102-43C34.8902-43.07 34.5502-43.4098 34.4802-43.8398C34.4702-43.9098 34.4704-44.0095 34.4704-44.1895L34.4704-51.7891C34.4704-51.9791 34.4701-52.0704 34.4802-52.1504C34.5502-52.5804 34.8902-52.9105 35.3102-52.9805C35.3902-52.9905 35.4796-52.9903 35.6696-52.9903ZM55.6696-52.9902L63.2712-52.9902C63.4612-52.9902 63.5506-52.9905 63.6306-52.9804C64.0505-52.9104 64.3906-52.5804 64.4606-52.1504C64.4706-52.0704 64.4704-51.979 64.4704-51.789L64.4704-44.1894C64.4704-44.0094 64.4707-43.9098 64.4606-43.8398C64.3906-43.4098 64.0505-43.07 63.6306-43C63.5506-42.99 63.4612-42.9902 63.2712-42.9902L55.6696-42.9902C55.4796-42.9902 55.3902-42.9899 55.3102-43C54.8902-43.07 54.5502-43.4098 54.4802-43.8398C54.4702-43.9098 54.4704-44.0095 54.4704-44.1895L54.4704-51.7891C54.4704-51.9791 54.4701-52.0704 54.4802-52.1504C54.5502-52.5804 54.8902-52.9105 55.3102-52.9805C55.3902-52.9905 55.4796-52.9903 55.6696-52.9903ZM77.9704-51.4902L112.97-51.4902L112.97-4.49023L77.9704-4.49023L77.9704-12.9902L83.2712-12.9902C83.4612-12.9902 83.5506-12.99 83.6306-13C84.0505-13.07 84.3906-13.4001 84.4606-13.8301C84.4706-13.9101 84.4704-13.9995 84.4704-14.1895L84.4704-21.7891C84.4704-21.9691 84.4707-22.0707 84.4606-22.1407C84.3906-22.5707 84.0505-22.9105 83.6306-22.9805C83.5506-22.9905 83.4612-22.9903 83.2712-22.9903L77.9704-22.9903L77.9704-32.9903L83.2712-32.9903C83.4612-32.9903 83.5506-32.9901 83.6306-33.0001C84.0505-33.0701 84.3906-33.4002 84.4606-33.8302C84.4706-33.9102 84.4704-33.9996 84.4704-34.1896L84.4704-41.7892C84.4704-41.9692 84.4707-42.0707 84.4606-42.1407C84.3906-42.5707 84.0505-42.9106 83.6306-42.9806C83.5506-42.9906 83.4612-42.9904 83.2712-42.9904L77.9704-42.9904ZM95.6696-42.9902C95.4796-42.9902 95.3902-42.9905 95.3102-42.9804C94.8902-42.9104 94.5502-42.5706 94.4802-42.1406C94.4702-42.0706 94.4704-41.969 94.4704-41.789L94.4704-34.1894C94.4704-33.9994 94.4701-33.91 94.4802-33.83C94.5502-33.4 94.8902-33.07 95.3102-33C95.3902-32.99 95.4796-32.9902 95.6696-32.9902L103.269-32.9902C103.459-32.9902 103.551-32.9899 103.631-33C104.051-33.07 104.391-33.4 104.461-33.83C104.471-33.91 104.471-33.9994 104.471-34.1894L104.471-41.789C104.471-41.969 104.471-42.0706 104.461-42.1406C104.391-42.5706 104.051-42.9104 103.631-42.9804C103.551-42.9904 103.459-42.9902 103.269-42.9902ZM35.6696-32.9902L43.2712-32.9902C43.4612-32.9902 43.5506-32.9905 43.6306-32.9804C44.0505-32.9104 44.3906-32.5804 44.4606-32.1504C44.4706-32.0704 44.4704-31.979 44.4704-31.789L44.4704-24.1894C44.4704-24.0094 44.4707-23.9098 44.4606-23.8398C44.3906-23.4098 44.0505-23.07 43.6306-23C43.5506-22.99 43.4612-22.9902 43.2712-22.9902L35.6696-22.9902C35.4796-22.9902 35.3902-22.9899 35.3102-23C34.8902-23.07 34.5502-23.4098 34.4802-23.8398C34.4702-23.9098 34.4704-24.0095 34.4704-24.1895L34.4704-31.7891C34.4704-31.9791 34.4701-32.0704 34.4802-32.1504C34.5502-32.5804 34.8902-32.9105 35.3102-32.9805C35.3902-32.9905 35.4796-32.9903 35.6696-32.9903ZM55.6696-32.9902L63.2712-32.9902C63.4612-32.9902 63.5506-32.9905 63.6306-32.9804C64.0505-32.9104 64.3906-32.5804 64.4606-32.1504C64.4706-32.0704 64.4704-31.979 64.4704-31.789L64.4704-24.1894C64.4704-24.0094 64.4707-23.9098 64.4606-23.8398C64.3906-23.4098 64.0505-23.07 63.6306-23C63.5506-22.99 63.4612-22.9902 63.2712-22.9902L55.6696-22.9902C55.4796-22.9902 55.3902-22.9899 55.3102-23C54.8902-23.07 54.5502-23.4098 54.4802-23.8398C54.4702-23.9098 54.4704-24.0095 54.4704-24.1895L54.4704-31.7891C54.4704-31.9791 54.4701-32.0704 54.4802-32.1504C54.5502-32.5804 54.8902-32.9105 55.3102-32.9805C55.3902-32.9905 55.4796-32.9903 55.6696-32.9903ZM95.6696-22.9902C95.4796-22.9902 95.3902-22.9905 95.3102-22.9804C94.8902-22.9104 94.5502-22.5706 94.4802-22.1406C94.4702-22.0706 94.4704-21.969 94.4704-21.789L94.4704-14.1894C94.4704-13.9994 94.4701-13.91 94.4802-13.83C94.5502-13.4 94.8902-13.07 95.3102-13C95.3902-12.99 95.4796-12.9902 95.6696-12.9902L103.269-12.9902C103.459-12.9902 103.551-12.9899 103.631-13C104.051-13.07 104.391-13.4 104.461-13.83C104.471-13.91 104.471-13.9994 104.471-14.1894L104.471-21.789C104.471-21.969 104.471-22.0706 104.461-22.1406C104.391-22.5706 104.051-22.9104 103.631-22.9804C103.551-22.9904 103.459-22.9902 103.269-22.9902ZM35.6696-12.9902L43.2712-12.9902C43.4612-12.9902 43.5506-12.9905 43.6306-12.9804C44.0505-12.9104 44.3906-12.5804 44.4606-12.1504C44.4706-12.0704 44.4704-11.979 44.4704-11.789L44.4704-4.18942C44.4704-4.00942 44.4707-3.90981 44.4606-3.83981C44.3906-3.40981 44.0505-3.06996 43.6306-2.99996C43.5506-2.98996 43.4612-2.9902 43.2712-2.9902L35.6696-2.9902C35.4796-2.9902 35.3902-2.98996 35.3102-2.99996C34.8902-3.06996 34.5502-3.40981 34.4802-3.83981C34.4702-3.90981 34.4704-4.00942 34.4704-4.18942L34.4704-11.789C34.4704-11.979 34.4701-12.0704 34.4802-12.1504C34.5502-12.5804 34.8902-12.9104 35.3102-12.9804C35.3902-12.9904 35.4796-12.9902 35.6696-12.9902ZM55.6696-12.9902L63.2712-12.9902C63.4612-12.9902 63.5506-12.9905 63.6306-12.9804C64.0505-12.9104 64.3906-12.5804 64.4606-12.1504C64.4706-12.0704 64.4704-11.979 64.4704-11.789L64.4704-4.18942C64.4704-4.00942 64.4707-3.90981 64.4606-3.83981C64.3906-3.40981 64.0505-3.06996 63.6306-2.99996C63.5506-2.98996 63.4612-2.9902 63.2712-2.9902L55.6696-2.9902C55.4796-2.9902 55.3902-2.98996 55.3102-2.99996C54.8902-3.06996 54.5502-3.40981 54.4802-3.83981C54.4702-3.90981 54.4704-4.00942 54.4704-4.18942L54.4704-11.789C54.4704-11.979 54.4701-12.0704 54.4802-12.1504C54.5502-12.5804 54.8902-12.9104 55.3102-12.9804C55.3902-12.9904 55.4796-12.9902 55.6696-12.9902Z"/>
+  </g>
+  <g id="Bold-M" transform="matrix(1 0 0 1 2267.06 1126)">
+   <path class="SFSymbolsPreviewWireframe" d="M34.4312-85.5C33.5912-85.5 32.5113-85.4996 31.5113-85.3496C26.1713-84.4996 21.9707-80.2992 21.1207-74.9492C20.9707-73.9592 20.9703-72.8791 20.9703-72.0391L20.9703-71.8008L20.9703-4.19922L20.9703-3.94922C20.9703-3.11922 20.9707-2.03906 21.1207-1.03906C21.9707 4.30093 26.1713 8.49961 31.5113 9.34961C32.5113 9.49961 33.5912 9.5 34.4312 9.5L34.6715 9.5L64.9703 9.5L75.9703 9.5L112.271 9.5L112.351 9.5L112.521 9.5C113.351 9.5 114.431 9.49961 115.431 9.34961C120.771 8.49961 124.972 4.30093 125.822-1.03906C125.972-2.03906 125.97-3.11922 125.97-3.94922L125.97-4.19922L125.97-51.8008L125.97-52.0391C125.97-52.8791 125.972-53.9592 125.822-54.9492C124.972-60.2992 120.771-64.4996 115.431-65.3496C114.431-65.4996 113.351-65.5 112.521-65.5L112.271-65.5L75.9703-65.5L75.9703-71.8008L75.9703-72.0391C75.9703-72.8791 75.9719-73.9592 75.8219-74.9492C74.9719-80.2992 70.7712-84.4996 65.4312-85.3496C64.4312-85.4996 63.3511-85.5 62.5211-85.5L62.2711-85.5L34.6715-85.5ZM34.6715-73L42.2711-73C42.4611-73 42.5504-73.0002 42.6304-72.9902C43.0504-72.9202 43.3905-72.5801 43.4605-72.1601C43.4705-72.0801 43.4703-71.9907 43.4703-71.8007L43.4703-64.1992C43.4703-64.0092 43.4706-63.9198 43.4605-63.8398C43.3905-63.4198 43.0504-63.0797 42.6304-63.0097C42.5504-62.9997 42.4611-62.9999 42.2711-62.9999L34.6715-62.9999C34.4815-62.9999 34.3901-62.9997 34.3101-63.0097C33.8901-63.0797 33.5501-63.4198 33.4801-63.8398C33.4701-63.9198 33.4703-64.0092 33.4703-64.1992L33.4703-71.8007C33.4703-71.9907 33.47-72.0801 33.4801-72.1601C33.5501-72.5801 33.8901-72.9202 34.3101-72.9902C34.3901-73.0002 34.4815-73 34.6715-73ZM54.6715-73L62.2711-73C62.4611-73 62.5504-73.0002 62.6304-72.9902C63.0504-72.9202 63.3905-72.5801 63.4605-72.1601C63.4705-72.0801 63.4703-71.9907 63.4703-71.8007L63.4703-64.1992C63.4703-64.0092 63.4706-63.9198 63.4605-63.8398C63.3905-63.4198 63.0504-63.0797 62.6304-63.0097C62.5504-62.9997 62.4611-62.9999 62.2711-62.9999L54.6715-62.9999C54.4815-62.9999 54.3901-62.9997 54.3101-63.0097C53.8901-63.0797 53.5501-63.4198 53.4801-63.8398C53.4701-63.9198 53.4703-64.0092 53.4703-64.1992L53.4703-71.8007C53.4703-71.9907 53.47-72.0801 53.4801-72.1601C53.5501-72.5801 53.8901-72.9202 54.3101-72.9902C54.3901-73.0002 54.4815-73 54.6715-73ZM34.6715-53L42.2711-53C42.4611-53 42.5504-53.0002 42.6304-52.9902C43.0504-52.9202 43.3905-52.5801 43.4605-52.1601C43.4705-52.0801 43.4703-51.9907 43.4703-51.8007L43.4703-44.1992C43.4703-44.0092 43.4706-43.9198 43.4605-43.8398C43.3905-43.4198 43.0504-43.0797 42.6304-43.0097C42.5504-42.9997 42.4611-42.9999 42.2711-42.9999L34.6715-42.9999C34.4815-42.9999 34.3901-42.9997 34.3101-43.0097C33.8901-43.0797 33.5501-43.4198 33.4801-43.8398C33.4701-43.9198 33.4703-44.0092 33.4703-44.1992L33.4703-51.8007C33.4703-51.9907 33.47-52.0801 33.4801-52.1601C33.5501-52.5801 33.8901-52.9202 34.3101-52.9902C34.3901-53.0002 34.4815-53 34.6715-53ZM54.6715-53L62.2711-53C62.4611-53 62.5504-53.0002 62.6304-52.9902C63.0504-52.9202 63.3905-52.5801 63.4605-52.1601C63.4705-52.0801 63.4703-51.9907 63.4703-51.8007L63.4703-44.1992C63.4703-44.0092 63.4706-43.9198 63.4605-43.8398C63.3905-43.4198 63.0504-43.0797 62.6304-43.0097C62.5504-42.9997 62.4611-42.9999 62.2711-42.9999L54.6715-42.9999C54.4815-42.9999 54.3901-42.9997 54.3101-43.0097C53.8901-43.0797 53.5501-43.4198 53.4801-43.8398C53.4701-43.9198 53.4703-44.0092 53.4703-44.1992L53.4703-51.8007C53.4703-51.9907 53.47-52.0801 53.4801-52.1601C53.5501-52.5801 53.8901-52.9202 54.3101-52.9902C54.3901-53.0002 54.4815-53 54.6715-53ZM75.9703-52.5L112.271-52.5L112.97-52.5L112.97-51.8008L112.97-4.19922L112.97-3.5L112.652-3.5L112.271-3.5L75.9703-3.5L75.9703-13L82.2711-13C82.4611-13 82.5504-12.9998 82.6304-13.0098C83.0504-13.0798 83.3905-13.4199 83.4605-13.8399C83.4705-13.9199 83.4703-14.0093 83.4703-14.1993L83.4703-21.8008C83.4703-21.9908 83.4706-22.0802 83.4605-22.1602C83.3905-22.5802 83.0504-22.9203 82.6304-22.9903C82.5504-23.0003 82.4611-23.0001 82.2711-23.0001L75.9703-23.0001L75.9703-33.0001L82.2711-33.0001C82.4611-33.0001 82.5504-32.9998 82.6304-33.0099C83.0504-33.0799 83.3905-33.4199 83.4605-33.8399C83.4705-33.9199 83.4703-34.0093 83.4703-34.1993L83.4703-41.8009C83.4703-41.9909 83.4706-42.0803 83.4605-42.1603C83.3905-42.5803 83.0504-42.9203 82.6304-42.9903C82.5504-43.0003 82.4611-43.0001 82.2711-43.0001L75.9703-43.0001ZM94.6715-43C94.4815-43 94.3901-43.0002 94.3101-42.9902C93.8901-42.9202 93.5501-42.5801 93.4801-42.1601C93.4701-42.0801 93.4703-41.9907 93.4703-41.8007L93.4703-34.1992C93.4703-34.0092 93.47-33.9198 93.4801-33.8398C93.5501-33.4198 93.8901-33.0797 94.3101-33.0097C94.3901-32.9997 94.4815-32.9999 94.6715-32.9999L102.271-32.9999C102.461-32.9999 102.55-32.9997 102.63-33.0097C103.05-33.0797 103.391-33.4198 103.461-33.8398C103.471-33.9198 103.471-34.0092 103.471-34.1992L103.471-41.8007C103.471-41.9907 103.471-42.0801 103.461-42.1601C103.391-42.5801 103.05-42.9202 102.63-42.9902C102.55-43.0002 102.461-43 102.271-43ZM34.6715-33L42.2711-33C42.4611-33 42.5504-33.0002 42.6304-32.9902C43.0504-32.9202 43.3905-32.5801 43.4605-32.1601C43.4705-32.0801 43.4703-31.9907 43.4703-31.8007L43.4703-24.1992C43.4703-24.0092 43.4706-23.9198 43.4605-23.8398C43.3905-23.4198 43.0504-23.0797 42.6304-23.0097C42.5504-22.9997 42.4611-22.9999 42.2711-22.9999L34.6715-22.9999C34.4815-22.9999 34.3901-22.9997 34.3101-23.0097C33.8901-23.0797 33.5501-23.4198 33.4801-23.8398C33.4701-23.9198 33.4703-24.0092 33.4703-24.1992L33.4703-31.8007C33.4703-31.9907 33.47-32.0801 33.4801-32.1601C33.5501-32.5801 33.8901-32.9202 34.3101-32.9902C34.3901-33.0002 34.4815-33 34.6715-33ZM54.6715-33L62.2711-33C62.4611-33 62.5504-33.0002 62.6304-32.9902C63.0504-32.9202 63.3905-32.5801 63.4605-32.1601C63.4705-32.0801 63.4703-31.9907 63.4703-31.8007L63.4703-24.1992C63.4703-24.0092 63.4706-23.9198 63.4605-23.8398C63.3905-23.4198 63.0504-23.0797 62.6304-23.0097C62.5504-22.9997 62.4611-22.9999 62.2711-22.9999L54.6715-22.9999C54.4815-22.9999 54.3901-22.9997 54.3101-23.0097C53.8901-23.0797 53.5501-23.4198 53.4801-23.8398C53.4701-23.9198 53.4703-24.0092 53.4703-24.1992L53.4703-31.8007C53.4703-31.9907 53.47-32.0801 53.4801-32.1601C53.5501-32.5801 53.8901-32.9202 54.3101-32.9902C54.3901-33.0002 54.4815-33 54.6715-33ZM94.6715-23C94.4815-23 94.3901-23.0002 94.3101-22.9902C93.8901-22.9202 93.5501-22.5801 93.4801-22.1601C93.4701-22.0801 93.4703-21.9907 93.4703-21.8007L93.4703-14.1992C93.4703-14.0092 93.47-13.9198 93.4801-13.8398C93.5501-13.4198 93.8901-13.0797 94.3101-13.0097C94.3901-12.9997 94.4815-12.9999 94.6715-12.9999L102.271-12.9999C102.461-12.9999 102.55-12.9997 102.63-13.0097C103.05-13.0797 103.391-13.4198 103.461-13.8398C103.471-13.9198 103.471-14.0092 103.471-14.1992L103.471-21.8007C103.471-21.9907 103.471-22.0801 103.461-22.1601C103.391-22.5801 103.05-22.9202 102.63-22.9902C102.55-23.0002 102.461-23 102.271-23ZM34.6715-13L42.2711-13C42.4611-13 42.5504-13.0002 42.6304-12.9902C43.0504-12.9202 43.3905-12.5801 43.4605-12.1601C43.4705-12.0801 43.4703-11.9907 43.4703-11.8007L43.4703-4.19918C43.4703-4.00918 43.4706-3.91981 43.4605-3.83981C43.3905-3.41981 43.0504-3.07973 42.6304-3.00973C42.5504-2.99973 42.4611-2.99996 42.2711-2.99996L34.6715-2.99996C34.4815-2.99996 34.3901-2.99973 34.3101-3.00973C33.8901-3.07973 33.5501-3.41981 33.4801-3.83981C33.4701-3.91981 33.4703-4.00918 33.4703-4.19918L33.4703-11.8007C33.4703-11.9907 33.47-12.0801 33.4801-12.1601C33.5501-12.5801 33.8901-12.9202 34.3101-12.9902C34.3901-13.0002 34.4815-13 34.6715-13ZM54.6715-13L62.2711-13C62.4611-13 62.5504-13.0002 62.6304-12.9902C63.0504-12.9202 63.3905-12.5801 63.4605-12.1601C63.4705-12.0801 63.4703-11.9907 63.4703-11.8007L63.4703-4.19918C63.4703-4.00918 63.4706-3.91981 63.4605-3.83981C63.3905-3.41981 63.0504-3.07973 62.6304-3.00973C62.5504-2.99973 62.4611-2.99996 62.2711-2.99996L54.6715-2.99996C54.4815-2.99996 54.3901-2.99973 54.3101-3.00973C53.8901-3.07973 53.5501-3.41981 53.4801-3.83981C53.4701-3.91981 53.4703-4.00918 53.4703-4.19918L53.4703-11.8007C53.4703-11.9907 53.47-12.0801 53.4801-12.1601C53.5501-12.5801 53.8901-12.9202 54.3101-12.9902C54.3901-13.0002 54.4815-13 54.6715-13Z"/>
+  </g>
+  <g id="Semibold-M" transform="matrix(1 0 0 1 1971.35 1126)">
+   <path class="SFSymbolsPreviewWireframe" d="M33.4293-84.5C32.5793-84.5 31.5895-84.4994 30.6695-84.3594C25.7495-83.5794 21.8909-79.7208 21.1109-74.8008C20.9709-73.8808 20.9703-72.8891 20.9703-72.0391L20.9703-71.8008L20.9703-4.19922L20.9703-3.96094C20.9703-3.11094 20.9709-2.10922 21.1109-1.19922C21.8909 3.72077 25.7495 7.57938 30.6695 8.35938C31.5895 8.49937 32.5793 8.5 33.4293 8.5L33.6695 8.5L62.9703 8.5L73.9703 8.5L111.269 8.5L111.509 8.5C112.359 8.5 113.349 8.49937 114.269 8.35938C119.189 7.57938 123.05 3.72077 123.83-1.19922C123.97-2.10922 123.97-3.11094 123.97-3.96094L123.97-4.19922L123.97-51.8008L123.97-52.0391C123.97-52.8891 123.97-53.8808 123.83-54.8008C123.05-59.7208 119.189-63.5794 114.269-64.3594C113.349-64.4994 112.359-64.5 111.509-64.5L111.269-64.5L73.9703-64.5L73.9703-71.8008L73.9703-72.0391C73.9703-72.8891 73.9697-73.8808 73.8297-74.8008C73.0497-79.7208 69.1891-83.5794 64.2691-84.3594C63.3491-84.4994 62.3594-84.5 61.5094-84.5L61.2691-84.5L33.6695-84.5ZM33.6695-73L41.2691-73C41.4591-73 41.5504-73.0002 41.6304-72.9902C42.0504-72.9202 42.3905-72.5801 42.4605-72.1601C42.4705-72.0801 42.4703-71.9907 42.4703-71.8007L42.4703-64.1992C42.4703-64.0092 42.4706-63.9198 42.4605-63.8398C42.3905-63.4198 42.0504-63.0797 41.6304-63.0097C41.5504-62.9997 41.4591-62.9999 41.2691-62.9999L33.6695-62.9999C33.4795-62.9999 33.3901-62.9997 33.3101-63.0097C32.8901-63.0797 32.5501-63.4198 32.4801-63.8398C32.4701-63.9198 32.4703-64.0092 32.4703-64.1992L32.4703-71.8007C32.4703-71.9907 32.47-72.0801 32.4801-72.1601C32.5501-72.5801 32.8901-72.9202 33.3101-72.9902C33.3901-73.0002 33.4795-73 33.6695-73ZM53.6695-73L61.2691-73C61.4591-73 61.5504-73.0002 61.6304-72.9902C62.0504-72.9202 62.3905-72.5801 62.4605-72.1601C62.4705-72.0801 62.4703-71.9907 62.4703-71.8007L62.4703-64.1992C62.4703-64.0092 62.4706-63.9198 62.4605-63.8398C62.3905-63.4198 62.0504-63.0797 61.6304-63.0097C61.5504-62.9997 61.4591-62.9999 61.2691-62.9999L53.6695-62.9999C53.4795-62.9999 53.3901-62.9997 53.3101-63.0097C52.8901-63.0797 52.5501-63.4198 52.4801-63.8398C52.4701-63.9198 52.4703-64.0092 52.4703-64.1992L52.4703-71.8007C52.4703-71.9907 52.47-72.0801 52.4801-72.1601C52.5501-72.5801 52.8901-72.9202 53.3101-72.9902C53.3901-73.0002 53.4795-73 53.6695-73ZM73.9703-53.5L111.269-53.5C111.859-53.5 112.189-53.5002 112.429-53.4902L112.58-53.4902C112.77-53.4402 112.911-53.2993 112.961-53.1093L112.961-53.0995L112.961-52.9609C112.971-52.7209 112.971-52.3907 112.971-51.8007L112.971-4.19915C112.971-3.60915 112.971-3.27899 112.961-3.03899L112.961-2.89056C112.911-2.70056 112.77-2.5597 112.58-2.5097L112.509-2.5097L112.429-2.5097C112.189-2.4997 111.859-2.49993 111.269-2.49993L73.9703-2.49993L73.9703-13L81.2691-13C81.4591-13 81.5504-12.9998 81.6304-13.0098C82.0504-13.0798 82.3905-13.4199 82.4605-13.8399C82.4705-13.9199 82.4703-14.0093 82.4703-14.1993L82.4703-21.8008C82.4703-21.9908 82.4706-22.0802 82.4605-22.1602C82.3905-22.5802 82.0504-22.9203 81.6304-22.9903C81.5504-23.0003 81.4591-23.0001 81.2691-23.0001L73.9703-23.0001L73.9703-33.0001L81.2691-33.0001C81.4591-33.0001 81.5504-32.9998 81.6304-33.0099C82.0504-33.0799 82.3905-33.4199 82.4605-33.8399C82.4705-33.9199 82.4703-34.0093 82.4703-34.1993L82.4703-41.8009C82.4703-41.9909 82.4706-42.0803 82.4605-42.1603C82.3905-42.5803 82.0504-42.9203 81.6304-42.9903C81.5504-43.0003 81.4591-43.0001 81.2691-43.0001L73.9703-43.0001ZM33.6695-53L41.2691-53C41.4591-53 41.5504-53.0002 41.6304-52.9902C42.0504-52.9202 42.3905-52.5801 42.4605-52.1601C42.4705-52.0801 42.4703-51.9907 42.4703-51.8007L42.4703-44.1992C42.4703-44.0092 42.4706-43.9198 42.4605-43.8398C42.3905-43.4198 42.0504-43.0797 41.6304-43.0097C41.5504-42.9997 41.4591-42.9999 41.2691-42.9999L33.6695-42.9999C33.4795-42.9999 33.3901-42.9997 33.3101-43.0097C32.8901-43.0797 32.5501-43.4198 32.4801-43.8398C32.4701-43.9198 32.4703-44.0092 32.4703-44.1992L32.4703-51.8007C32.4703-51.9907 32.47-52.0801 32.4801-52.1601C32.5501-52.5801 32.8901-52.9202 33.3101-52.9902C33.3901-53.0002 33.4795-53 33.6695-53ZM53.6695-53L61.2691-53C61.4591-53 61.5504-53.0002 61.6304-52.9902C62.0504-52.9202 62.3905-52.5801 62.4605-52.1601C62.4705-52.0801 62.4703-51.9907 62.4703-51.8007L62.4703-44.1992C62.4703-44.0092 62.4706-43.9198 62.4605-43.8398C62.3905-43.4198 62.0504-43.0797 61.6304-43.0097C61.5504-42.9997 61.4591-42.9999 61.2691-42.9999L53.6695-42.9999C53.4795-42.9999 53.3901-42.9997 53.3101-43.0097C52.8901-43.0797 52.5501-43.4198 52.4801-43.8398C52.4701-43.9198 52.4703-44.0092 52.4703-44.1992L52.4703-51.8007C52.4703-51.9907 52.47-52.0801 52.4801-52.1601C52.5501-52.5801 52.8901-52.9202 53.3101-52.9902C53.3901-53.0002 53.4795-53 53.6695-53ZM93.6695-43C93.4795-43 93.3901-43.0002 93.3101-42.9902C92.8901-42.9202 92.5501-42.5801 92.4801-42.1601C92.4701-42.0801 92.4703-41.9907 92.4703-41.8007L92.4703-34.1992C92.4703-34.0092 92.47-33.9198 92.4801-33.8398C92.5501-33.4198 92.8901-33.0797 93.3101-33.0097C93.3901-32.9997 93.4795-32.9999 93.6695-32.9999L101.269-32.9999C101.459-32.9999 101.55-32.9997 101.63-33.0097C102.05-33.0797 102.391-33.4198 102.461-33.8398C102.471-33.9198 102.471-34.0092 102.471-34.1992L102.471-41.8007C102.471-41.9907 102.471-42.0801 102.461-42.1601C102.391-42.5801 102.05-42.9202 101.63-42.9902C101.55-43.0002 101.459-43 101.269-43ZM33.6695-33L41.2691-33C41.4591-33 41.5504-33.0002 41.6304-32.9902C42.0504-32.9202 42.3905-32.5801 42.4605-32.1601C42.4705-32.0801 42.4703-31.9907 42.4703-31.8007L42.4703-24.1992C42.4703-24.0092 42.4706-23.9198 42.4605-23.8398C42.3905-23.4198 42.0504-23.0797 41.6304-23.0097C41.5504-22.9997 41.4591-22.9999 41.2691-22.9999L33.6695-22.9999C33.4795-22.9999 33.3901-22.9997 33.3101-23.0097C32.8901-23.0797 32.5501-23.4198 32.4801-23.8398C32.4701-23.9198 32.4703-24.0092 32.4703-24.1992L32.4703-31.8007C32.4703-31.9907 32.47-32.0801 32.4801-32.1601C32.5501-32.5801 32.8901-32.9202 33.3101-32.9902C33.3901-33.0002 33.4795-33 33.6695-33ZM53.6695-33L61.2691-33C61.4591-33 61.5504-33.0002 61.6304-32.9902C62.0504-32.9202 62.3905-32.5801 62.4605-32.1601C62.4705-32.0801 62.4703-31.9907 62.4703-31.8007L62.4703-24.1992C62.4703-24.0092 62.4706-23.9198 62.4605-23.8398C62.3905-23.4198 62.0504-23.0797 61.6304-23.0097C61.5504-22.9997 61.4591-22.9999 61.2691-22.9999L53.6695-22.9999C53.4795-22.9999 53.3901-22.9997 53.3101-23.0097C52.8901-23.0797 52.5501-23.4198 52.4801-23.8398C52.4701-23.9198 52.4703-24.0092 52.4703-24.1992L52.4703-31.8007C52.4703-31.9907 52.47-32.0801 52.4801-32.1601C52.5501-32.5801 52.8901-32.9202 53.3101-32.9902C53.3901-33.0002 53.4795-33 53.6695-33ZM93.6695-23C93.4795-23 93.3901-23.0002 93.3101-22.9902C92.8901-22.9202 92.5501-22.5801 92.4801-22.1601C92.4701-22.0801 92.4703-21.9907 92.4703-21.8007L92.4703-14.1992C92.4703-14.0092 92.47-13.9198 92.4801-13.8398C92.5501-13.4198 92.8901-13.0797 93.3101-13.0097C93.3901-12.9997 93.4795-12.9999 93.6695-12.9999L101.269-12.9999C101.459-12.9999 101.55-12.9997 101.63-13.0097C102.05-13.0797 102.391-13.4198 102.461-13.8398C102.471-13.9198 102.471-14.0092 102.471-14.1992L102.471-21.8007C102.471-21.9907 102.471-22.0801 102.461-22.1601C102.391-22.5801 102.05-22.9202 101.63-22.9902C101.55-23.0002 101.459-23 101.269-23ZM33.6695-13L41.2691-13C41.4591-13 41.5504-13.0002 41.6304-12.9902C42.0504-12.9202 42.3905-12.5801 42.4605-12.1601C42.4705-12.0801 42.4703-11.9907 42.4703-11.8007L42.4703-4.19918C42.4703-4.00918 42.4706-3.91981 42.4605-3.83981C42.3905-3.41981 42.0504-3.07973 41.6304-3.00973C41.5504-2.99973 41.4591-2.99996 41.2691-2.99996L33.6695-2.99996C33.4795-2.99996 33.3901-2.99973 33.3101-3.00973C32.8901-3.07973 32.5501-3.41981 32.4801-3.83981C32.4701-3.91981 32.4703-4.00918 32.4703-4.19918L32.4703-11.8007C32.4703-11.9907 32.47-12.0801 32.4801-12.1601C32.5501-12.5801 32.8901-12.9202 33.3101-12.9902C33.3901-13.0002 33.4795-13 33.6695-13ZM53.6695-13L61.2691-13C61.4591-13 61.5504-13.0002 61.6304-12.9902C62.0504-12.9202 62.3905-12.5801 62.4605-12.1601C62.4705-12.0801 62.4703-11.9907 62.4703-11.8007L62.4703-4.19918C62.4703-4.00918 62.4706-3.91981 62.4605-3.83981C62.3905-3.41981 62.0504-3.07973 61.6304-3.00973C61.5504-2.99973 61.4591-2.99996 61.2691-2.99996L53.6695-2.99996C53.4795-2.99996 53.3901-2.99973 53.3101-3.00973C52.8901-3.07973 52.5501-3.41981 52.4801-3.83981C52.4701-3.91981 52.4703-4.00918 52.4703-4.19918L52.4703-11.8007C52.4703-11.9907 52.47-12.0801 52.4801-12.1601C52.5501-12.5801 52.8901-12.9202 53.3101-12.9902C53.3901-13.0002 53.4795-13 53.6695-13Z"/>
+  </g>
+  <g id="Medium-M" transform="matrix(1 0 0 1 1674.64 1126)">
+   <path class="SFSymbolsPreviewWireframe" d="M33.4312-84.5C32.5812-84.5 31.5915-84.4994 30.6715-84.3594C25.7515-83.5794 21.8909-79.7208 21.1109-74.8008C20.9709-73.8808 20.9703-72.8891 20.9703-72.0391L20.9703-71.8008L20.9703-4.19922L20.9703-3.96094C20.9703-3.11094 20.9709-2.10922 21.1109-1.19922C21.8909 3.72077 25.7515 7.57938 30.6715 8.35938C31.5915 8.49937 32.5812 8.5 33.4312 8.5L33.6715 8.5L62.9703 8.5L73.9703 8.5L111.271 8.5L111.511 8.5C112.361 8.5 113.351 8.49937 114.271 8.35938C119.191 7.57938 123.052 3.72077 123.832-1.19922C123.972-2.10922 123.97-3.11094 123.97-3.96094L123.97-4.19922L123.97-51.8008L123.97-52.0391C123.97-52.8891 123.971-53.8808 123.832-54.8008C123.052-59.7208 119.191-63.5794 114.271-64.3594C113.351-64.4994 112.361-64.5 111.511-64.5L111.271-64.5L73.9703-64.5L73.9703-71.8008L73.9703-72.0391C73.9703-72.8891 73.9716-73.8808 73.8316-74.8008C73.0516-79.7208 69.1911-83.5794 64.2711-84.3594C63.3511-84.4994 62.3613-84.5 61.5113-84.5L61.2711-84.5L33.6715-84.5ZM33.6715-73L41.2711-73C41.4611-73 41.5504-73.0002 41.6304-72.9902C42.0504-72.9202 42.3905-72.5801 42.4605-72.1601C42.4705-72.0801 42.4703-71.9907 42.4703-71.8007L42.4703-64.1992C42.4703-64.0092 42.4706-63.9198 42.4605-63.8398C42.3905-63.4198 42.0504-63.0797 41.6304-63.0097C41.5504-62.9997 41.4611-62.9999 41.2711-62.9999L33.6715-62.9999C33.4815-62.9999 33.3901-62.9997 33.3101-63.0097C32.8901-63.0797 32.5501-63.4198 32.4801-63.8398C32.4701-63.9198 32.4703-64.0092 32.4703-64.1992L32.4703-71.8007C32.4703-71.9907 32.47-72.0801 32.4801-72.1601C32.5501-72.5801 32.8901-72.9202 33.3101-72.9902C33.3901-73.0002 33.4815-73 33.6715-73ZM53.6715-73L61.2711-73C61.4611-73 61.5504-73.0002 61.6304-72.9902C62.0504-72.9202 62.3905-72.5801 62.4605-72.1601C62.4705-72.0801 62.4703-71.9907 62.4703-71.8007L62.4703-64.1992C62.4703-64.0092 62.4706-63.9198 62.4605-63.8398C62.3905-63.4198 62.0504-63.0797 61.6304-63.0097C61.5504-62.9997 61.4611-62.9999 61.2711-62.9999L53.6715-62.9999C53.4815-62.9999 53.3901-62.9997 53.3101-63.0097C52.8901-63.0797 52.5501-63.4198 52.4801-63.8398C52.4701-63.9198 52.4703-64.0092 52.4703-64.1992L52.4703-71.8007C52.4703-71.9907 52.47-72.0801 52.4801-72.1601C52.5501-72.5801 52.8901-72.9202 53.3101-72.9902C53.3901-73.0002 53.4815-73 53.6715-73ZM73.9703-53.5L111.271-53.5C111.861-53.5 112.191-53.5002 112.431-53.4902L112.582-53.4902C112.772-53.4402 112.911-53.2993 112.961-53.1093L112.961-53.0995L112.961-52.9609C112.971-52.7209 112.971-52.3907 112.971-51.8007L112.971-4.19915C112.971-3.60915 112.971-3.27899 112.961-3.03899L112.961-2.94915L112.961-2.89056C112.911-2.70056 112.772-2.5597 112.582-2.5097L112.431-2.5097C112.191-2.4997 111.861-2.49993 111.271-2.49993L73.9703-2.49993L73.9703-13L82.2711-13C82.4611-13 82.5504-12.9998 82.6304-13.0098C83.0504-13.0798 83.3905-13.4099 83.4605-13.8399C83.4705-13.9199 83.4703-14.0093 83.4703-14.1993L83.4703-21.8008C83.4703-21.9808 83.4706-22.0802 83.4605-22.1602C83.3905-22.5802 83.0504-22.9203 82.6304-22.9903C82.5504-23.0003 82.4611-23.0001 82.2711-23.0001L73.9703-23.0001L73.9703-33.0001L82.2711-33.0001C82.4611-33.0001 82.5504-32.9998 82.6304-33.0099C83.0504-33.0799 83.3905-33.4099 83.4605-33.8399C83.4705-33.9199 83.4703-34.0093 83.4703-34.1993L83.4703-41.8009C83.4703-41.9809 83.4706-42.0803 83.4605-42.1603C83.3905-42.5803 83.0504-42.9203 82.6304-42.9903C82.5504-43.0003 82.4611-43.0001 82.2711-43.0001L73.9703-43.0001ZM33.6715-53L41.2711-53C41.4611-53 41.5504-53.0002 41.6304-52.9902C42.0504-52.9202 42.3905-52.5801 42.4605-52.1601C42.4705-52.0801 42.4703-51.9907 42.4703-51.8007L42.4703-44.1992C42.4703-44.0092 42.4706-43.9198 42.4605-43.8398C42.3905-43.4198 42.0504-43.0797 41.6304-43.0097C41.5504-42.9997 41.4611-42.9999 41.2711-42.9999L33.6715-42.9999C33.4815-42.9999 33.3901-42.9997 33.3101-43.0097C32.8901-43.0797 32.5501-43.4198 32.4801-43.8398C32.4701-43.9198 32.4703-44.0092 32.4703-44.1992L32.4703-51.8007C32.4703-51.9907 32.47-52.0801 32.4801-52.1601C32.5501-52.5801 32.8901-52.9202 33.3101-52.9902C33.3901-53.0002 33.4815-53 33.6715-53ZM53.6715-53L61.2711-53C61.4611-53 61.5504-53.0002 61.6304-52.9902C62.0504-52.9202 62.3905-52.5801 62.4605-52.1601C62.4705-52.0801 62.4703-51.9907 62.4703-51.8007L62.4703-44.1992C62.4703-44.0092 62.4706-43.9198 62.4605-43.8398C62.3905-43.4198 62.0504-43.0797 61.6304-43.0097C61.5504-42.9997 61.4611-42.9999 61.2711-42.9999L53.6715-42.9999C53.4815-42.9999 53.3901-42.9997 53.3101-43.0097C52.8901-43.0797 52.5501-43.4198 52.4801-43.8398C52.4701-43.9198 52.4703-44.0092 52.4703-44.1992L52.4703-51.8007C52.4703-51.9907 52.47-52.0801 52.4801-52.1601C52.5501-52.5801 52.8901-52.9202 53.3101-52.9902C53.3901-53.0002 53.4815-53 53.6715-53ZM94.6715-43C94.4815-43 94.3901-43.0002 94.3101-42.9902C93.8901-42.9202 93.5501-42.5801 93.4801-42.1601C93.4701-42.0801 93.4703-41.9807 93.4703-41.8007L93.4703-34.1992C93.4703-34.0092 93.47-33.9198 93.4801-33.8398C93.5501-33.4098 93.8901-33.0797 94.3101-33.0097C94.3901-32.9997 94.4815-32.9999 94.6715-32.9999L102.271-32.9999C102.461-32.9999 102.55-32.9997 102.63-33.0097C103.05-33.0797 103.391-33.4098 103.461-33.8398C103.471-33.9198 103.471-34.0092 103.471-34.1992L103.471-41.8007C103.471-41.9807 103.471-42.0801 103.461-42.1601C103.391-42.5801 103.05-42.9202 102.63-42.9902C102.55-43.0002 102.461-43 102.271-43ZM33.6715-33L41.2711-33C41.4611-33 41.5504-33.0002 41.6304-32.9902C42.0504-32.9202 42.3905-32.5801 42.4605-32.1601C42.4705-32.0801 42.4703-31.9907 42.4703-31.8007L42.4703-24.1992C42.4703-24.0092 42.4706-23.9198 42.4605-23.8398C42.3905-23.4198 42.0504-23.0797 41.6304-23.0097C41.5504-22.9997 41.4611-22.9999 41.2711-22.9999L33.6715-22.9999C33.4815-22.9999 33.3901-22.9997 33.3101-23.0097C32.8901-23.0797 32.5501-23.4198 32.4801-23.8398C32.4701-23.9198 32.4703-24.0092 32.4703-24.1992L32.4703-31.8007C32.4703-31.9907 32.47-32.0801 32.4801-32.1601C32.5501-32.5801 32.8901-32.9202 33.3101-32.9902C33.3901-33.0002 33.4815-33 33.6715-33ZM53.6715-33L61.2711-33C61.4611-33 61.5504-33.0002 61.6304-32.9902C62.0504-32.9202 62.3905-32.5801 62.4605-32.1601C62.4705-32.0801 62.4703-31.9907 62.4703-31.8007L62.4703-24.1992C62.4703-24.0092 62.4706-23.9198 62.4605-23.8398C62.3905-23.4198 62.0504-23.0797 61.6304-23.0097C61.5504-22.9997 61.4611-22.9999 61.2711-22.9999L53.6715-22.9999C53.4815-22.9999 53.3901-22.9997 53.3101-23.0097C52.8901-23.0797 52.5501-23.4198 52.4801-23.8398C52.4701-23.9198 52.4703-24.0092 52.4703-24.1992L52.4703-31.8007C52.4703-31.9907 52.47-32.0801 52.4801-32.1601C52.5501-32.5801 52.8901-32.9202 53.3101-32.9902C53.3901-33.0002 53.4815-33 53.6715-33ZM94.6715-23C94.4815-23 94.3901-23.0002 94.3101-22.9902C93.8901-22.9202 93.5501-22.5801 93.4801-22.1601C93.4701-22.0801 93.4703-21.9807 93.4703-21.8007L93.4703-14.1992C93.4703-14.0092 93.47-13.9198 93.4801-13.8398C93.5501-13.4098 93.8901-13.0797 94.3101-13.0097C94.3901-12.9997 94.4815-12.9999 94.6715-12.9999L102.271-12.9999C102.461-12.9999 102.55-12.9997 102.63-13.0097C103.05-13.0797 103.391-13.4098 103.461-13.8398C103.471-13.9198 103.471-14.0092 103.471-14.1992L103.471-21.8007C103.471-21.9807 103.471-22.0801 103.461-22.1601C103.391-22.5801 103.05-22.9202 102.63-22.9902C102.55-23.0002 102.461-23 102.271-23ZM33.6715-13L41.2711-13C41.4611-13 41.5504-13.0002 41.6304-12.9902C42.0504-12.9202 42.3905-12.5801 42.4605-12.1601C42.4705-12.0801 42.4703-11.9907 42.4703-11.8007L42.4703-4.19918C42.4703-4.00918 42.4706-3.91981 42.4605-3.83981C42.3905-3.41981 42.0504-3.07973 41.6304-3.00973C41.5504-2.99973 41.4611-2.99996 41.2711-2.99996L33.6715-2.99996C33.4815-2.99996 33.3901-2.99973 33.3101-3.00973C32.8901-3.07973 32.5501-3.41981 32.4801-3.83981C32.4701-3.91981 32.4703-4.00918 32.4703-4.19918L32.4703-11.8007C32.4703-11.9907 32.47-12.0801 32.4801-12.1601C32.5501-12.5801 32.8901-12.9202 33.3101-12.9902C33.3901-13.0002 33.4815-13 33.6715-13ZM53.6715-13L61.2711-13C61.4611-13 61.5504-13.0002 61.6304-12.9902C62.0504-12.9202 62.3905-12.5801 62.4605-12.1601C62.4705-12.0801 62.4703-11.9907 62.4703-11.8007L62.4703-4.19918C62.4703-4.00918 62.4706-3.91981 62.4605-3.83981C62.3905-3.41981 62.0504-3.07973 61.6304-3.00973C61.5504-2.99973 61.4611-2.99996 61.2711-2.99996L53.6715-2.99996C53.4815-2.99996 53.3901-2.99973 53.3101-3.00973C52.8901-3.07973 52.5501-3.41981 52.4801-3.83981C52.4701-3.91981 52.4703-4.00918 52.4703-4.19918L52.4703-11.8007C52.4703-11.9907 52.47-12.0801 52.4801-12.1601C52.5501-12.5801 52.8901-12.9202 53.3101-12.9902C53.3901-13.0002 53.4815-13 53.6715-13Z"/>
+  </g>
+  <g id="Regular-M" transform="matrix(1 0 0 1 1379.43 1126)">
+   <path class="SFSymbolsPreviewWireframe" d="M31.9508-81C31.0608-81 30.1997-81.0009 29.4097-80.8809C25.1298-80.2009 21.7694-76.8405 21.0894-72.5605C20.9694-71.7705 20.9703-70.9095 20.9703-70.0195L20.9703-69.8008L20.9703-2.19922L20.9703-1.98047C20.9703-1.09047 20.9694-0.219452 21.0894 0.560547C21.7694 4.84054 25.1298 8.20086 29.4097 8.88086C30.1997 9.00086 31.0608 9 31.9508 9L32.1695 9L61.0699 9L108.769 9L109.009 9C109.869 9 110.819 8.99914 111.689 8.86914C116.399 8.11914 120.09 4.43069 120.83-0.279297C120.97-1.1493 120.97-2.10094 120.97-2.96094L120.97-3.19922L120.97-48.8008L120.97-49.0391C120.97-49.8991 120.97-50.8507 120.83-51.7207C120.09-56.4307 116.399-60.1194 111.689-60.8594C110.819-60.9994 109.869-61 109.009-61L108.769-61L70.9703-61L70.9703-69.8008L70.9703-70.0195C70.9703-70.9095 70.9692-71.7705 70.8492-72.5605C70.1692-76.8405 66.8108-80.2009 62.5308-80.8809C61.7508-81.0009 60.8798-81 59.9898-81L59.7691-81L32.1695-81ZM32.1695-71L39.7691-71C39.9591-71 40.0504-71.0002 40.1304-70.9902C40.5504-70.9202 40.8905-70.5801 40.9605-70.1601C40.9705-70.0801 40.9703-69.9907 40.9703-69.8007L40.9703-62.1992C40.9703-62.0092 40.9706-61.9198 40.9605-61.8398C40.8905-61.4198 40.5504-61.0797 40.1304-61.0097C40.0504-60.9997 39.9591-60.9999 39.7691-60.9999L32.1695-60.9999C31.9795-60.9999 31.8901-60.9997 31.8101-61.0097C31.3901-61.0797 31.0501-61.4198 30.9801-61.8398C30.9701-61.9198 30.9703-62.0092 30.9703-62.1992L30.9703-69.8007C30.9703-69.9907 30.97-70.0801 30.9801-70.1601C31.0501-70.5801 31.3901-70.9202 31.8101-70.9902C31.8901-71.0002 31.9795-71 32.1695-71ZM52.1695-71L59.7691-71C59.9591-71 60.0504-71.0002 60.1304-70.9902C60.5504-70.9202 60.8905-70.5801 60.9605-70.1601C60.9705-70.0801 60.9703-69.9907 60.9703-69.8007L60.9703-62.1992C60.9703-62.0092 60.9706-61.9198 60.9605-61.8398C60.8905-61.4198 60.5504-61.0797 60.1304-61.0097C60.0504-60.9997 59.9591-60.9999 59.7691-60.9999L52.1695-60.9999C51.9795-60.9999 51.8901-60.9997 51.8101-61.0097C51.3901-61.0797 51.0501-61.4198 50.9801-61.8398C50.9701-61.9198 50.9703-62.0092 50.9703-62.1992L50.9703-69.8007C50.9703-69.9907 50.97-70.0801 50.9801-70.1601C51.0501-70.5801 51.3901-70.9202 51.8101-70.9902C51.8901-71.0002 51.9795-71 52.1695-71ZM32.1695-51L39.7691-51C39.9591-51 40.0504-51.0002 40.1304-50.9902C40.5504-50.9202 40.8905-50.5801 40.9605-50.1601C40.9705-50.0801 40.9703-49.9907 40.9703-49.8007L40.9703-42.1992C40.9703-42.0092 40.9706-41.9198 40.9605-41.8398C40.8905-41.4198 40.5504-41.0797 40.1304-41.0097C40.0504-40.9997 39.9591-40.9999 39.7691-40.9999L32.1695-40.9999C31.9795-40.9999 31.8901-40.9997 31.8101-41.0097C31.3901-41.0797 31.0501-41.4198 30.9801-41.8398C30.9701-41.9198 30.9703-42.0092 30.9703-42.1992L30.9703-49.8007C30.9703-49.9907 30.97-50.0801 30.9801-50.1601C31.0501-50.5801 31.3901-50.9202 31.8101-50.9902C31.8901-51.0002 31.9795-51 32.1695-51ZM52.1695-51L59.7691-51C59.9591-51 60.0504-51.0002 60.1304-50.9902C60.5504-50.9202 60.8905-50.5801 60.9605-50.1601C60.9705-50.0801 60.9703-49.9907 60.9703-49.8007L60.9703-42.1992C60.9703-42.0092 60.9706-41.9198 60.9605-41.8398C60.8905-41.4198 60.5504-41.0797 60.1304-41.0097C60.0504-40.9997 59.9591-40.9999 59.7691-40.9999L52.1695-40.9999C51.9795-40.9999 51.8901-40.9997 51.8101-41.0097C51.3901-41.0797 51.0501-41.4198 50.9801-41.8398C50.9701-41.9198 50.9703-42.0092 50.9703-42.1992L50.9703-49.8007C50.9703-49.9907 50.97-50.0801 50.9801-50.1601C51.0501-50.5801 51.3901-50.9202 51.8101-50.9902C51.8901-51.0002 51.9795-51 52.1695-51ZM71.0699-51L108.769-51C109.349-51 109.691-51.0002 109.951-50.9902C110.061-50.9902 110.13-50.9904 110.15-50.9804C110.56-50.9104 110.881-50.5896 110.951-50.1796C110.961-50.1496 110.961-50.0904 110.961-49.9804C110.971-49.7204 110.971-49.3807 110.971-48.8007L110.971-3.19915C110.971-2.61915 110.971-2.27946 110.961-2.01946C110.961-1.90946 110.961-1.84024 110.951-1.82024C110.881-1.41024 110.56-1.08946 110.15-1.01946C110.13-1.00946 110.061-1.00969 109.951-1.00969C109.691-0.999692 109.349-0.999922 108.769-0.999922L71.0699-0.999922L71.0699-10.9999L79.7691-10.9999C79.9591-10.9999 80.0504-10.9997 80.1304-11.0097C80.5504-11.0797 80.8905-11.4198 80.9605-11.8398C80.9705-11.9198 80.9703-12.0092 80.9703-12.1992L80.9703-19.8007C80.9703-19.9907 80.9706-20.0801 80.9605-20.1601C80.8905-20.5801 80.5504-20.9202 80.1304-20.9902C80.0504-21.0002 79.9591-21 79.7691-21L71.0699-21L71.0699-31L79.7691-31C79.9591-31 80.0504-30.9998 80.1304-31.0098C80.5504-31.0798 80.8905-31.4199 80.9605-31.8399C80.9705-31.9199 80.9703-32.0092 80.9703-32.1992L80.9703-39.8008C80.9703-39.9908 80.9706-40.0802 80.9605-40.1602C80.8905-40.5802 80.5504-40.9203 80.1304-40.9903C80.0504-41.0003 79.9591-41.0001 79.7691-41.0001L71.0699-41.0001ZM92.1695-41C91.9795-41 91.8901-41.0002 91.8101-40.9902C91.3901-40.9202 91.0501-40.5801 90.9801-40.1601C90.9701-40.0801 90.9703-39.9907 90.9703-39.8007L90.9703-32.1992C90.9703-32.0092 90.97-31.9198 90.9801-31.8398C91.0501-31.4198 91.3901-31.0797 91.8101-31.0097C91.8901-30.9997 91.9795-30.9999 92.1695-30.9999L99.7691-30.9999C99.9591-30.9999 100.05-30.9997 100.13-31.0097C100.55-31.0797 100.891-31.4198 100.961-31.8398C100.971-31.9198 100.971-32.0092 100.971-32.1992L100.971-39.8007C100.971-39.9907 100.971-40.0801 100.961-40.1601C100.891-40.5801 100.55-40.9202 100.13-40.9902C100.05-41.0002 99.9591-41 99.7691-41ZM32.1695-31L39.7691-31C39.9591-31 40.0504-31.0002 40.1304-30.9902C40.5504-30.9202 40.8905-30.5801 40.9605-30.1601C40.9705-30.0801 40.9703-29.9907 40.9703-29.8007L40.9703-22.1992C40.9703-22.0092 40.9706-21.9198 40.9605-21.8398C40.8905-21.4198 40.5504-21.0797 40.1304-21.0097C40.0504-20.9997 39.9591-20.9999 39.7691-20.9999L32.1695-20.9999C31.9795-20.9999 31.8901-20.9997 31.8101-21.0097C31.3901-21.0797 31.0501-21.4198 30.9801-21.8398C30.9701-21.9198 30.9703-22.0092 30.9703-22.1992L30.9703-29.8007C30.9703-29.9907 30.97-30.0801 30.9801-30.1601C31.0501-30.5801 31.3901-30.9202 31.8101-30.9902C31.8901-31.0002 31.9795-31 32.1695-31ZM52.1695-31L59.7691-31C59.9591-31 60.0504-31.0002 60.1304-30.9902C60.5504-30.9202 60.8905-30.5801 60.9605-30.1601C60.9705-30.0801 60.9703-29.9907 60.9703-29.8007L60.9703-22.1992C60.9703-22.0092 60.9706-21.9198 60.9605-21.8398C60.8905-21.4198 60.5504-21.0797 60.1304-21.0097C60.0504-20.9997 59.9591-20.9999 59.7691-20.9999L52.1695-20.9999C51.9795-20.9999 51.8901-20.9997 51.8101-21.0097C51.3901-21.0797 51.0501-21.4198 50.9801-21.8398C50.9701-21.9198 50.9703-22.0092 50.9703-22.1992L50.9703-29.8007C50.9703-29.9907 50.97-30.0801 50.9801-30.1601C51.0501-30.5801 51.3901-30.9202 51.8101-30.9902C51.8901-31.0002 51.9795-31 52.1695-31ZM92.1695-21C91.9795-21 91.8901-21.0002 91.8101-20.9902C91.3901-20.9202 91.0501-20.5801 90.9801-20.1601C90.9701-20.0801 90.9703-19.9907 90.9703-19.8007L90.9703-12.1992C90.9703-12.0092 90.97-11.9198 90.9801-11.8398C91.0501-11.4198 91.3901-11.0797 91.8101-11.0097C91.8901-10.9997 91.9795-10.9999 92.1695-10.9999L99.7691-10.9999C99.9591-10.9999 100.05-10.9997 100.13-11.0097C100.55-11.0797 100.891-11.4198 100.961-11.8398C100.971-11.9198 100.971-12.0092 100.971-12.1992L100.971-19.8007C100.971-19.9907 100.971-20.0801 100.961-20.1601C100.891-20.5801 100.55-20.9202 100.13-20.9902C100.05-21.0002 99.9591-21 99.7691-21ZM32.1695-11L39.7691-11C39.9591-11 40.0504-11.0002 40.1304-10.9902C40.5504-10.9202 40.8905-10.5801 40.9605-10.1601C40.9705-10.0801 40.9703-9.99075 40.9703-9.80075L40.9703-2.19918C40.9703-2.00918 40.9706-1.91981 40.9605-1.83981C40.8905-1.41981 40.5504-1.07973 40.1304-1.00973C40.0504-0.999732 39.9591-0.999962 39.7691-0.999962L32.1695-0.999962C31.9795-0.999962 31.8901-0.999727 31.8101-1.00973C31.3901-1.07973 31.0501-1.41981 30.9801-1.83981C30.9701-1.91981 30.9703-2.00918 30.9703-2.19918L30.9703-9.80075C30.9703-9.99075 30.97-10.0801 30.9801-10.1601C31.0501-10.5801 31.3901-10.9202 31.8101-10.9902C31.8901-11.0002 31.9795-11 32.1695-11ZM52.1695-11L59.7691-11C59.9591-11 60.0504-11.0002 60.1304-10.9902C60.5504-10.9202 60.8905-10.5801 60.9605-10.1601C60.9705-10.0801 60.9703-9.99075 60.9703-9.80075L60.9703-2.19918C60.9703-2.00918 60.9706-1.91981 60.9605-1.83981C60.8905-1.41981 60.5504-1.07973 60.1304-1.00973C60.0504-0.999732 59.9591-0.999962 59.7691-0.999962L52.1695-0.999962C51.9795-0.999962 51.8901-0.999727 51.8101-1.00973C51.3901-1.07973 51.0501-1.41981 50.9801-1.83981C50.9701-1.91981 50.9703-2.00918 50.9703-2.19918L50.9703-9.80075C50.9703-9.99075 50.97-10.0801 50.9801-10.1601C51.0501-10.5801 51.3901-10.9202 51.8101-10.9902C51.8901-11.0002 51.9795-11 52.1695-11Z"/>
+  </g>
+  <g id="Light-M" transform="matrix(1 0 0 1 1084.22 1126)">
+   <path class="SFSymbolsPreviewWireframe" d="M30.9703-80C30.0603-80 29.2701-80.0006 28.5601-79.8906C24.7101-79.2806 21.6916-76.2601 21.0816-72.4102C20.9716-71.7002 20.9703-70.91 20.9703-70L20.9703-69.8008L20.9703-2.19922L20.9703-2C20.9703-1.08 20.9716-0.299842 21.0816 0.410156C21.6916 4.26015 24.7101 7.28063 28.5601 7.89062C29.2701 8.00062 30.0603 8 30.9703 8L31.1715 8L55.9703 8L106.771 8L106.992 8C107.882 8 108.751 8.00086 109.531 7.88086C113.811 7.20086 117.171 3.84054 117.851-0.439453C117.971-1.21945 117.97-2.09047 117.97-2.98047L117.97-3.19922L117.97-48.8008L117.97-49.0195C117.97-49.9095 117.971-50.7705 117.851-51.5605C117.171-55.8405 113.811-59.2009 109.531-59.8809C108.751-60.0009 107.882-60 106.992-60L106.771-60L68.9703-60L68.9703-69.8008L68.9703-70C68.9703-70.91 68.9709-71.7002 68.8609-72.4102C68.2509-76.2601 65.2304-79.2806 61.3804-79.8906C60.6704-80.0006 59.8903-80 58.9703-80L58.7711-80L31.1715-80ZM31.1715-71L38.7711-71C38.9611-71 39.0504-71.0002 39.1304-70.9902C39.5504-70.9202 39.8905-70.5801 39.9605-70.1601C39.9705-70.0801 39.9703-69.9907 39.9703-69.8007L39.9703-62.1992C39.9703-62.0092 39.9706-61.9198 39.9605-61.8398C39.8905-61.4198 39.5504-61.0797 39.1304-61.0097C39.0504-60.9997 38.9611-60.9999 38.7711-60.9999L31.1715-60.9999C30.9815-60.9999 30.8901-60.9997 30.8101-61.0097C30.3901-61.0797 30.0501-61.4198 29.9801-61.8398C29.9701-61.9198 29.9703-62.0092 29.9703-62.1992L29.9703-69.8007C29.9703-69.9907 29.97-70.0801 29.9801-70.1601C30.0501-70.5801 30.3901-70.9202 30.8101-70.9902C30.8901-71.0002 30.9815-71 31.1715-71ZM51.1715-71L58.7711-71C58.9611-71 59.0504-71.0002 59.1304-70.9902C59.5504-70.9202 59.8905-70.5801 59.9605-70.1601C59.9705-70.0801 59.9703-69.9907 59.9703-69.8007L59.9703-62.1992C59.9703-62.0092 59.9706-61.9198 59.9605-61.8398C59.8905-61.4198 59.5504-61.0797 59.1304-61.0097C59.0504-60.9997 58.9611-60.9999 58.7711-60.9999L51.1715-60.9999C50.9815-60.9999 50.8901-60.9997 50.8101-61.0097C50.3901-61.0797 50.0501-61.4198 49.9801-61.8398C49.9701-61.9198 49.9703-62.0092 49.9703-62.1992L49.9703-69.8007C49.9703-69.9907 49.97-70.0801 49.9801-70.1601C50.0501-70.5801 50.3901-70.9202 50.8101-70.9902C50.8901-71.0002 50.9815-71 51.1715-71ZM68.9703-52L106.771-52C107.351-52 107.7-52.0002 107.97-51.9902C108.2-51.9902 108.271-51.9804 108.281-51.9804C109.141-51.8404 109.811-51.1705 109.951-50.3105C109.951-50.3005 109.961-50.2299 109.961-49.9999C109.971-49.7299 109.971-49.3807 109.971-48.8007L109.971-3.19915C109.971-2.61915 109.971-2.26993 109.961-1.99993C109.961-1.73993 109.941-1.67938 109.951-1.68938C109.811-0.829386 109.141-0.159462 108.281-0.0194623C108.291-0.0294623 108.23-0.00969663 107.97-0.00969663C107.7 0.000234355 107.351 0 106.771 0L68.9703 0L68.9703-11L77.7711-11C77.9611-11 78.0504-10.9998 78.1304-11.0098C78.5504-11.0798 78.8905-11.4199 78.9605-11.8399C78.9705-11.9199 78.9703-12.0093 78.9703-12.1993L78.9703-19.8008C78.9703-19.9908 78.9706-20.0802 78.9605-20.1602C78.8905-20.5802 78.5504-20.9203 78.1304-20.9903C78.0504-21.0003 77.9611-21.0001 77.7711-21.0001L68.9703-21.0001L68.9703-31.0001L77.7711-31.0001C77.9611-31.0001 78.0504-30.9998 78.1304-31.0099C78.5504-31.0799 78.8905-31.4199 78.9605-31.8399C78.9705-31.9199 78.9703-32.0093 78.9703-32.1993L78.9703-39.8009C78.9703-39.9909 78.9706-40.0803 78.9605-40.1603C78.8905-40.5803 78.5504-40.9203 78.1304-40.9903C78.0504-41.0003 77.9611-41.0001 77.7711-41.0001L68.9703-41.0001ZM31.1715-51L38.7711-51C38.9611-51 39.0504-51.0002 39.1304-50.9902C39.5504-50.9202 39.8905-50.5801 39.9605-50.1601C39.9705-50.0801 39.9703-49.9907 39.9703-49.8007L39.9703-42.1992C39.9703-42.0092 39.9706-41.9198 39.9605-41.8398C39.8905-41.4198 39.5504-41.0797 39.1304-41.0097C39.0504-40.9997 38.9611-40.9999 38.7711-40.9999L31.1715-40.9999C30.9815-40.9999 30.8901-40.9997 30.8101-41.0097C30.3901-41.0797 30.0501-41.4198 29.9801-41.8398C29.9701-41.9198 29.9703-42.0092 29.9703-42.1992L29.9703-49.8007C29.9703-49.9907 29.97-50.0801 29.9801-50.1601C30.0501-50.5801 30.3901-50.9202 30.8101-50.9902C30.8901-51.0002 30.9815-51 31.1715-51ZM51.1715-51L58.7711-51C58.9611-51 59.0504-51.0002 59.1304-50.9902C59.5504-50.9202 59.8905-50.5801 59.9605-50.1601C59.9705-50.0801 59.9703-49.9907 59.9703-49.8007L59.9703-42.1992C59.9703-42.0092 59.9706-41.9198 59.9605-41.8398C59.8905-41.4198 59.5504-41.0797 59.1304-41.0097C59.0504-40.9997 58.9611-40.9999 58.7711-40.9999L51.1715-40.9999C50.9815-40.9999 50.8901-40.9997 50.8101-41.0097C50.3901-41.0797 50.0501-41.4198 49.9801-41.8398C49.9701-41.9198 49.9703-42.0092 49.9703-42.1992L49.9703-49.8007C49.9703-49.9907 49.97-50.0801 49.9801-50.1601C50.0501-50.5801 50.3901-50.9202 50.8101-50.9902C50.8901-51.0002 50.9815-51 51.1715-51ZM90.1715-41C89.9815-41 89.8901-41.0002 89.8101-40.9902C89.3901-40.9202 89.0501-40.5801 88.9801-40.1601C88.9701-40.0801 88.9703-39.9907 88.9703-39.8007L88.9703-32.1992C88.9703-32.0092 88.97-31.9198 88.9801-31.8398C89.0501-31.4198 89.3901-31.0797 89.8101-31.0097C89.8901-30.9997 89.9815-30.9999 90.1715-30.9999L97.7711-30.9999C97.9611-30.9999 98.0504-30.9997 98.1304-31.0097C98.5504-31.0797 98.8905-31.4198 98.9605-31.8398C98.9705-31.9198 98.9703-32.0092 98.9703-32.1992L98.9703-39.8007C98.9703-39.9907 98.9706-40.0801 98.9605-40.1601C98.8905-40.5801 98.5504-40.9202 98.1304-40.9902C98.0504-41.0002 97.9611-41 97.7711-41ZM31.1715-31L38.7711-31C38.9611-31 39.0504-31.0002 39.1304-30.9902C39.5504-30.9202 39.8905-30.5801 39.9605-30.1601C39.9705-30.0801 39.9703-29.9907 39.9703-29.8007L39.9703-22.1992C39.9703-22.0092 39.9706-21.9198 39.9605-21.8398C39.8905-21.4198 39.5504-21.0797 39.1304-21.0097C39.0504-20.9997 38.9611-20.9999 38.7711-20.9999L31.1715-20.9999C30.9815-20.9999 30.8901-20.9997 30.8101-21.0097C30.3901-21.0797 30.0501-21.4198 29.9801-21.8398C29.9701-21.9198 29.9703-22.0092 29.9703-22.1992L29.9703-29.8007C29.9703-29.9907 29.97-30.0801 29.9801-30.1601C30.0501-30.5801 30.3901-30.9202 30.8101-30.9902C30.8901-31.0002 30.9815-31 31.1715-31ZM51.1715-31L58.7711-31C58.9611-31 59.0504-31.0002 59.1304-30.9902C59.5504-30.9202 59.8905-30.5801 59.9605-30.1601C59.9705-30.0801 59.9703-29.9907 59.9703-29.8007L59.9703-22.1992C59.9703-22.0092 59.9706-21.9198 59.9605-21.8398C59.8905-21.4198 59.5504-21.0797 59.1304-21.0097C59.0504-20.9997 58.9611-20.9999 58.7711-20.9999L51.1715-20.9999C50.9815-20.9999 50.8901-20.9997 50.8101-21.0097C50.3901-21.0797 50.0501-21.4198 49.9801-21.8398C49.9701-21.9198 49.9703-22.0092 49.9703-22.1992L49.9703-29.8007C49.9703-29.9907 49.97-30.0801 49.9801-30.1601C50.0501-30.5801 50.3901-30.9202 50.8101-30.9902C50.8901-31.0002 50.9815-31 51.1715-31ZM90.1715-21C89.9815-21 89.8901-21.0002 89.8101-20.9902C89.3901-20.9202 89.0501-20.5801 88.9801-20.1601C88.9701-20.0801 88.9703-19.9907 88.9703-19.8007L88.9703-12.1992C88.9703-12.0092 88.97-11.9198 88.9801-11.8398C89.0501-11.4198 89.3901-11.0797 89.8101-11.0097C89.8901-10.9997 89.9815-10.9999 90.1715-10.9999L97.7711-10.9999C97.9611-10.9999 98.0504-10.9997 98.1304-11.0097C98.5504-11.0797 98.8905-11.4198 98.9605-11.8398C98.9705-11.9198 98.9703-12.0092 98.9703-12.1992L98.9703-19.8007C98.9703-19.9907 98.9706-20.0801 98.9605-20.1601C98.8905-20.5801 98.5504-20.9202 98.1304-20.9902C98.0504-21.0002 97.9611-21 97.7711-21ZM31.1715-11L38.7711-11C38.9611-11 39.0504-11.0002 39.1304-10.9902C39.5504-10.9202 39.8905-10.5801 39.9605-10.1601C39.9705-10.0801 39.9703-9.99075 39.9703-9.80075L39.9703-2.19918C39.9703-2.00918 39.9706-1.91981 39.9605-1.83981C39.8905-1.41981 39.5504-1.07973 39.1304-1.00973C39.0504-0.999732 38.9611-0.999962 38.7711-0.999962L31.1715-0.999962C30.9815-0.999962 30.8901-0.999727 30.8101-1.00973C30.3901-1.07973 30.0501-1.41981 29.9801-1.83981C29.9701-1.91981 29.9703-2.00918 29.9703-2.19918L29.9703-9.80075C29.9703-9.99075 29.97-10.0801 29.9801-10.1601C30.0501-10.5801 30.3901-10.9202 30.8101-10.9902C30.8901-11.0002 30.9815-11 31.1715-11ZM51.1715-11L58.7711-11C58.9611-11 59.0504-11.0002 59.1304-10.9902C59.5504-10.9202 59.8905-10.5801 59.9605-10.1601C59.9705-10.0801 59.9703-9.99075 59.9703-9.80075L59.9703-2.19918C59.9703-2.00918 59.9706-1.91981 59.9605-1.83981C59.8905-1.41981 59.5504-1.07973 59.1304-1.00973C59.0504-0.999732 58.9611-0.999962 58.7711-0.999962L51.1715-0.999962C50.9815-0.999962 50.8901-0.999727 50.8101-1.00973C50.3901-1.07973 50.0501-1.41981 49.9801-1.83981C49.9701-1.91981 49.9703-2.00918 49.9703-2.19918L49.9703-9.80075C49.9703-9.99075 49.97-10.0801 49.9801-10.1601C50.0501-10.5801 50.3901-10.9202 50.8101-10.9902C50.8901-11.0002 50.9815-11 51.1715-11Z"/>
+  </g>
+  <g id="Thin-M" transform="matrix(1 0 0 1 789.507 1126)">
+   <path class="SFSymbolsPreviewWireframe" d="M29.066-81C28.051-81 27.4215-81.0002 26.8765-80.9102C23.8815-80.4402 21.5312-78.0896 21.0562-75.0996C20.9702-74.5496 20.9703-73.9204 20.9703-72.9004L20.9703-72.8008L20.9703-2.09961C20.9703-1.07962 20.9702-0.450394 21.0562 0.0996054C21.5312 3.0896 23.8815 5.44015 26.8765 5.91015C27.4215 6.00016 28.051 6 29.066 6L64.9703 6L104.771 6L104.935 6C105.889 6 106.597 6.00039 107.222 5.90039C110.646 5.36039 113.331 2.67999 113.873-0.75C113.973-1.37 113.97-2.0793 113.97-3.0293L113.97-3.19922L113.97-48.8008L113.97-48.9609C113.97-49.9209 113.972-50.63 113.873-51.25C113.331-54.67 110.646-57.3604 107.222-57.9004C106.597-58.0004 105.889-58 104.935-58L104.771-58L68.9703-58L68.9703-72.9004C68.9703-73.9204 68.9704-74.5496 68.8844-75.0996C68.4094-78.0896 66.061-80.4402 63.066-80.9102C62.521-81.0002 61.8915-81 60.8765-81L29.1715-81ZM31.1715-72L38.7711-72C38.9571-72 39.0495-72.0002 39.1265-71.9902C39.5545-71.9202 39.8906-71.5801 39.9586-71.1601C39.9706-71.0801 39.9703-70.9907 39.9703-70.8007L39.9703-63.1992C39.9703-63.0092 39.9706-62.9198 39.9586-62.8398C39.8906-62.4198 39.5545-62.0797 39.1265-62.0097C39.0495-61.9997 38.9571-61.9999 38.7711-61.9999L31.1715-61.9999C30.9855-61.9999 30.891-61.9997 30.814-62.0097C30.386-62.0797 30.05-62.4198 29.982-62.8398C29.97-62.9198 29.9703-63.0092 29.9703-63.1992L29.9703-70.8007C29.9703-70.9907 29.97-71.0801 29.982-71.1601C30.05-71.5801 30.386-71.9202 30.814-71.9902C30.891-72.0002 30.9855-72 31.1715-72ZM51.1715-72L58.7711-72C58.9571-72 59.0495-72.0002 59.1265-71.9902C59.5545-71.9202 59.8906-71.5801 59.9586-71.1601C59.9706-71.0801 59.9703-70.9907 59.9703-70.8007L59.9703-63.1992C59.9703-63.0092 59.9706-62.9198 59.9586-62.8398C59.8906-62.4198 59.5545-62.0797 59.1265-62.0097C59.0495-61.9997 58.9571-61.9999 58.7711-61.9999L51.1715-61.9999C50.9855-61.9999 50.891-61.9997 50.814-62.0097C50.386-62.0797 50.05-62.4198 49.982-62.8398C49.97-62.9198 49.9703-63.0092 49.9703-63.1992L49.9703-70.8007C49.9703-70.9907 49.97-71.0801 49.982-71.1601C50.05-71.5801 50.386-71.9202 50.814-71.9902C50.891-72.0002 50.9855-72 51.1715-72ZM68.9703-54L104.771-54C105.962-54 106.325-53.9892 106.597-53.9492C108.308-53.6792 109.65-52.3391 109.921-50.6191C109.964-50.3491 109.97-49.9908 109.97-48.8008L109.97-3.19922C109.97-2.00922 109.964-1.64914 109.921-1.36914C109.65 0.340855 108.308 1.67922 106.597 1.94922C106.325 1.98922 105.962 2 104.771 2L68.9703 2L68.9703-11L76.7711-11C76.9571-11 77.0505-10.9998 77.1285-11.0098C77.5555-11.0798 77.8906-11.4199 77.9586-11.8399C77.9706-11.9199 77.9703-12.0093 77.9703-12.1993L77.9703-19.8008C77.9703-19.9908 77.9706-20.0802 77.9586-20.1602C77.8906-20.5802 77.5555-20.9203 77.1285-20.9903C77.0505-21.0003 76.9571-21.0001 76.7711-21.0001L68.9703-21.0001L68.9703-31.0001L76.7711-31.0001C76.9571-31.0001 77.0505-30.9998 77.1285-31.0099C77.5555-31.0799 77.8906-31.4199 77.9586-31.8399C77.9706-31.9199 77.9703-32.0093 77.9703-32.1993L77.9703-39.8009C77.9703-39.9909 77.9706-40.0803 77.9586-40.1603C77.8906-40.5803 77.5555-40.9203 77.1285-40.9903C77.0505-41.0003 76.9571-41.0001 76.7711-41.0001L68.9703-41.0001ZM31.1715-52L38.7711-52C38.9571-52 39.0495-52.0002 39.1265-51.9902C39.5545-51.9202 39.8906-51.5801 39.9586-51.1601C39.9706-51.0801 39.9703-50.9907 39.9703-50.8007L39.9703-43.1992C39.9703-43.0092 39.9706-42.9198 39.9586-42.8398C39.8906-42.4198 39.5545-42.0797 39.1265-42.0097C39.0495-41.9997 38.9571-41.9999 38.7711-41.9999L31.1715-41.9999C30.9855-41.9999 30.891-41.9997 30.814-42.0097C30.386-42.0797 30.05-42.4198 29.982-42.8398C29.97-42.9198 29.9703-43.0092 29.9703-43.1992L29.9703-50.8007C29.9703-50.9907 29.97-51.0801 29.982-51.1601C30.05-51.5801 30.386-51.9202 30.814-51.9902C30.891-52.0002 30.9855-52 31.1715-52ZM51.1715-52L58.7711-52C58.9571-52 59.0495-52.0002 59.1265-51.9902C59.5545-51.9202 59.8906-51.5801 59.9586-51.1601C59.9706-51.0801 59.9703-50.9907 59.9703-50.8007L59.9703-43.1992C59.9703-43.0092 59.9706-42.9198 59.9586-42.8398C59.8906-42.4198 59.5545-42.0797 59.1265-42.0097C59.0495-41.9997 58.9571-41.9999 58.7711-41.9999L51.1715-41.9999C50.9855-41.9999 50.891-41.9997 50.814-42.0097C50.386-42.0797 50.05-42.4198 49.982-42.8398C49.97-42.9198 49.9703-43.0092 49.9703-43.1992L49.9703-50.8007C49.9703-50.9907 49.97-51.0801 49.982-51.1601C50.05-51.5801 50.386-51.9202 50.814-51.9902C50.891-52.0002 50.9855-52 51.1715-52ZM89.1715-41C88.9855-41 88.891-41.0002 88.814-40.9902C88.386-40.9202 88.05-40.5801 87.982-40.1601C87.97-40.0801 87.9703-39.9907 87.9703-39.8007L87.9703-32.1992C87.9703-32.0092 87.97-31.9198 87.982-31.8398C88.05-31.4198 88.386-31.0797 88.814-31.0097C88.891-30.9997 88.9855-30.9999 89.1715-30.9999L96.7711-30.9999C96.9571-30.9999 97.0505-30.9997 97.1285-31.0097C97.5555-31.0797 97.8906-31.4198 97.9586-31.8398C97.9706-31.9198 97.9703-32.0092 97.9703-32.1992L97.9703-39.8007C97.9703-39.9907 97.9706-40.0801 97.9586-40.1601C97.8906-40.5801 97.5555-40.9202 97.1285-40.9902C97.0505-41.0002 96.9571-41 96.7711-41ZM31.1715-32L38.7711-32C38.9571-32 39.0495-32.0002 39.1265-31.9902C39.5545-31.9202 39.8906-31.5801 39.9586-31.1601C39.9706-31.0801 39.9703-30.9907 39.9703-30.8007L39.9703-23.1992C39.9703-23.0092 39.9706-22.9198 39.9586-22.8398C39.8906-22.4198 39.5545-22.0797 39.1265-22.0097C39.0495-21.9997 38.9571-21.9999 38.7711-21.9999L31.1715-21.9999C30.9855-21.9999 30.891-21.9997 30.814-22.0097C30.386-22.0797 30.05-22.4198 29.982-22.8398C29.97-22.9198 29.9703-23.0092 29.9703-23.1992L29.9703-30.8007C29.9703-30.9907 29.97-31.0801 29.982-31.1601C30.05-31.5801 30.386-31.9202 30.814-31.9902C30.891-32.0002 30.9855-32 31.1715-32ZM51.1715-32L58.7711-32C58.9571-32 59.0495-32.0002 59.1265-31.9902C59.5545-31.9202 59.8906-31.5801 59.9586-31.1601C59.9706-31.0801 59.9703-30.9907 59.9703-30.8007L59.9703-23.1992C59.9703-23.0092 59.9706-22.9198 59.9586-22.8398C59.8906-22.4198 59.5545-22.0797 59.1265-22.0097C59.0495-21.9997 58.9571-21.9999 58.7711-21.9999L51.1715-21.9999C50.9855-21.9999 50.891-21.9997 50.814-22.0097C50.386-22.0797 50.05-22.4198 49.982-22.8398C49.97-22.9198 49.9703-23.0092 49.9703-23.1992L49.9703-30.8007C49.9703-30.9907 49.97-31.0801 49.982-31.1601C50.05-31.5801 50.386-31.9202 50.814-31.9902C50.891-32.0002 50.9855-32 51.1715-32ZM89.1715-21C88.9855-21 88.891-21.0002 88.814-20.9902C88.386-20.9202 88.05-20.5801 87.982-20.1601C87.97-20.0801 87.9703-19.9907 87.9703-19.8007L87.9703-12.1992C87.9703-12.0092 87.97-11.9198 87.982-11.8398C88.05-11.4198 88.386-11.0797 88.814-11.0097C88.891-10.9997 88.9855-10.9999 89.1715-10.9999L96.7711-10.9999C96.9571-10.9999 97.0505-10.9997 97.1285-11.0097C97.5555-11.0797 97.8906-11.4198 97.9586-11.8398C97.9706-11.9198 97.9703-12.0092 97.9703-12.1992L97.9703-19.8007C97.9703-19.9907 97.9706-20.0801 97.9586-20.1601C97.8906-20.5801 97.5555-20.9202 97.1285-20.9902C97.0505-21.0002 96.9571-21 96.7711-21ZM31.1715-12L38.7711-12C38.9571-12 39.0495-12.0002 39.1265-11.9902C39.5545-11.9202 39.8906-11.5801 39.9586-11.1601C39.9706-11.0801 39.9703-10.9907 39.9703-10.8007L39.9703-3.19918C39.9703-3.00918 39.9706-2.91981 39.9586-2.83981C39.8906-2.41981 39.5545-2.07973 39.1265-2.00973C39.0495-1.99973 38.9571-1.99996 38.7711-1.99996L31.1715-1.99996C30.9855-1.99996 30.891-1.99973 30.814-2.00973C30.386-2.07973 30.05-2.41981 29.982-2.83981C29.97-2.91981 29.9703-3.00918 29.9703-3.19918L29.9703-10.8007C29.9703-10.9907 29.97-11.0801 29.982-11.1601C30.05-11.5801 30.386-11.9202 30.814-11.9902C30.891-12.0002 30.9855-12 31.1715-12ZM51.1715-12L58.7711-12C58.9571-12 59.0495-12.0002 59.1265-11.9902C59.5545-11.9202 59.8906-11.5801 59.9586-11.1601C59.9706-11.0801 59.9703-10.9907 59.9703-10.8007L59.9703-3.19918C59.9703-3.00918 59.9706-2.91981 59.9586-2.83981C59.8906-2.41981 59.5545-2.07973 59.1265-2.00973C59.0495-1.99973 58.9571-1.99996 58.7711-1.99996L51.1715-1.99996C50.9855-1.99996 50.891-1.99973 50.814-2.00973C50.386-2.07973 50.05-2.41981 49.982-2.83981C49.97-2.91981 49.9703-3.00918 49.9703-3.19918L49.9703-10.8007C49.9703-10.9907 49.97-11.0801 49.982-11.1601C50.05-11.5801 50.386-11.9202 50.814-11.9902C50.891-12.0002 50.9855-12 51.1715-12Z"/>
+  </g>
+  <g id="Ultralight-M" transform="matrix(1 0 0 1 493.046 1126)">
+   <path class="SFSymbolsPreviewWireframe" d="M29.066-79.9902C28.051-79.9902 27.4215-79.9902 26.8765-79.9102C23.8815-79.4302 21.5312-77.0798 21.0562-74.0898C20.9702-73.5398 20.9703-72.9104 20.9703-71.9004L20.9703-71.7891L20.9703-1.58984C20.9703-0.569844 20.9702 0.0596125 21.0562 0.599611C21.5312 3.59961 23.8815 5.94992 26.8765 6.41992C27.4215 6.50992 28.051 6.50977 29.066 6.50977L65.4703 6.50977L104.91 6.50977C105.891 6.50977 106.559 6.50992 107.144 6.41992C110.353 5.90992 112.869 3.38968 113.378 0.179689C113.47-0.400309 113.47-1.07078 113.47-2.05078L113.47-47.7891L113.47-47.9297C113.47-48.9097 113.47-49.5799 113.378-50.1699C112.869-53.3699 110.353-55.8904 107.144-56.4004C106.559-56.4904 105.891-56.4902 104.91-56.4902L104.771-56.4902L68.9703-56.4902L68.9703-71.9004C68.9703-72.9104 68.9704-73.5398 68.8844-74.0898C68.4094-77.0798 66.061-79.4302 63.066-79.9102C62.521-79.9902 61.8915-79.9902 60.8765-79.9902L29.1715-79.9902ZM31.1715-70.9902L38.7711-70.9902C38.9571-70.9902 39.0495-70.9905 39.1265-70.9804C39.5545-70.9104 39.8906-70.5804 39.9586-70.1504C39.9706-70.0704 39.9703-69.979 39.9703-69.789L39.9703-62.1894C39.9703-62.0094 39.9706-61.9098 39.9586-61.8398C39.8906-61.4098 39.5545-61.07 39.1265-61C39.0495-60.99 38.9571-60.9902 38.7711-60.9902L31.1715-60.9902C30.9855-60.9902 30.891-60.9899 30.814-61C30.386-61.07 30.05-61.4098 29.982-61.8398C29.97-61.9098 29.9703-62.0094 29.9703-62.1894L29.9703-69.789C29.9703-69.979 29.97-70.0704 29.982-70.1504C30.05-70.5804 30.386-70.9104 30.814-70.9804C30.891-70.9904 30.9855-70.9902 31.1715-70.9902ZM51.1715-70.9902L58.7711-70.9902C58.9571-70.9902 59.0495-70.9905 59.1265-70.9804C59.5545-70.9104 59.8906-70.5804 59.9586-70.1504C59.9706-70.0704 59.9703-69.979 59.9703-69.789L59.9703-62.1894C59.9703-62.0094 59.9706-61.9098 59.9586-61.8398C59.8906-61.4098 59.5545-61.07 59.1265-61C59.0495-60.99 58.9571-60.9902 58.7711-60.9902L51.1715-60.9902C50.9855-60.9902 50.891-60.9899 50.814-61C50.386-61.07 50.05-61.4098 49.982-61.8398C49.97-61.9098 49.9703-62.0094 49.9703-62.1894L49.9703-69.789C49.9703-69.979 49.97-70.0704 49.982-70.1504C50.05-70.5804 50.386-70.9104 50.814-70.9804C50.891-70.9904 50.9855-70.9902 51.1715-70.9902ZM68.9703-53.4902L104.771-53.4902C105.943-53.4902 106.355-53.4895 106.675-53.4395C108.6-53.1295 110.111-51.6192 110.416-49.6992C110.466-49.3792 110.47-48.9591 110.47-47.7891L110.47-2.18945C110.47-1.01946 110.465-0.609063 110.416-0.289064C110.111 1.64093 108.6 3.14922 106.675 3.44922C106.355 3.49922 105.943 3.50976 104.771 3.50976L68.9703 3.50976L68.9703-9.99024L76.7711-9.99024C76.9571-9.99024 77.0495-9.99 77.1265-10C77.5545-10.07 77.8906-10.4098 77.9586-10.8398C77.9706-10.9098 77.9703-11.0095 77.9703-11.1895L77.9703-18.7891C77.9703-18.9791 77.9706-19.0704 77.9586-19.1504C77.8906-19.5804 77.5545-19.9105 77.1265-19.9805C77.0495-19.9905 76.9571-19.9903 76.7711-19.9903L68.9703-19.9903L68.9703-29.9903L76.7711-29.9903C76.9571-29.9903 77.0495-29.99 77.1265-30.0001C77.5545-30.0701 77.8906-30.4099 77.9586-30.8399C77.9706-30.9099 77.9703-31.0095 77.9703-31.1895L77.9703-38.7891C77.9703-38.9791 77.9706-39.0705 77.9586-39.1505C77.8906-39.5805 77.5545-39.9105 77.1265-39.9805C77.0495-39.9905 76.9571-39.9903 76.7711-39.9903L68.9703-39.9903ZM31.1715-50.9902L38.7711-50.9902C38.9571-50.9902 39.0495-50.9905 39.1265-50.9804C39.5545-50.9104 39.8906-50.5804 39.9586-50.1504C39.9706-50.0704 39.9703-49.979 39.9703-49.789L39.9703-42.1894C39.9703-42.0094 39.9706-41.9098 39.9586-41.8398C39.8906-41.4098 39.5545-41.07 39.1265-41C39.0495-40.99 38.9571-40.9902 38.7711-40.9902L31.1715-40.9902C30.9855-40.9902 30.891-40.9899 30.814-41C30.386-41.07 30.05-41.4098 29.982-41.8398C29.97-41.9098 29.9703-42.0094 29.9703-42.1894L29.9703-49.789C29.9703-49.979 29.97-50.0704 29.982-50.1504C30.05-50.5804 30.386-50.9104 30.814-50.9804C30.891-50.9904 30.9855-50.9902 31.1715-50.9902ZM51.1715-50.9902L58.7711-50.9902C58.9571-50.9902 59.0495-50.9905 59.1265-50.9804C59.5545-50.9104 59.8906-50.5804 59.9586-50.1504C59.9706-50.0704 59.9703-49.979 59.9703-49.789L59.9703-42.1894C59.9703-42.0094 59.9706-41.9098 59.9586-41.8398C59.8906-41.4098 59.5545-41.07 59.1265-41C59.0495-40.99 58.9571-40.9902 58.7711-40.9902L51.1715-40.9902C50.9855-40.9902 50.891-40.9899 50.814-41C50.386-41.07 50.05-41.4098 49.982-41.8398C49.97-41.9098 49.9703-42.0094 49.9703-42.1894L49.9703-49.789C49.9703-49.979 49.97-50.0704 49.982-50.1504C50.05-50.5804 50.386-50.9104 50.814-50.9804C50.891-50.9904 50.9855-50.9902 51.1715-50.9902ZM89.1715-39.9902C88.9855-39.9902 88.891-39.9905 88.814-39.9804C88.386-39.9104 88.05-39.5804 87.982-39.1504C87.97-39.0704 87.9703-38.979 87.9703-38.789L87.9703-31.1894C87.9703-31.0094 87.97-30.9098 87.982-30.8398C88.05-30.4098 88.386-30.07 88.814-30C88.891-29.99 88.9855-29.9902 89.1715-29.9902L96.7711-29.9902C96.9571-29.9902 97.0495-29.9899 97.1265-30C97.5545-30.07 97.8906-30.4098 97.9586-30.8398C97.9706-30.9098 97.9703-31.0094 97.9703-31.1894L97.9703-38.789C97.9703-38.979 97.9706-39.0704 97.9586-39.1504C97.8906-39.5804 97.5545-39.9104 97.1265-39.9804C97.0495-39.9904 96.9571-39.9902 96.7711-39.9902ZM31.1715-30.9902L38.7711-30.9902C38.9571-30.9902 39.0495-30.9905 39.1265-30.9804C39.5545-30.9104 39.8906-30.5804 39.9586-30.1504C39.9706-30.0704 39.9703-29.979 39.9703-29.789L39.9703-22.1894C39.9703-22.0094 39.9706-21.9098 39.9586-21.8398C39.8906-21.4098 39.5545-21.07 39.1265-21C39.0495-20.99 38.9571-20.9902 38.7711-20.9902L31.1715-20.9902C30.9855-20.9902 30.891-20.9899 30.814-21C30.386-21.07 30.05-21.4098 29.982-21.8398C29.97-21.9098 29.9703-22.0094 29.9703-22.1894L29.9703-29.789C29.9703-29.979 29.97-30.0704 29.982-30.1504C30.05-30.5804 30.386-30.9104 30.814-30.9804C30.891-30.9904 30.9855-30.9902 31.1715-30.9902ZM51.1715-30.9902L58.7711-30.9902C58.9571-30.9902 59.0495-30.9905 59.1265-30.9804C59.5545-30.9104 59.8906-30.5804 59.9586-30.1504C59.9706-30.0704 59.9703-29.979 59.9703-29.789L59.9703-22.1894C59.9703-22.0094 59.9706-21.9098 59.9586-21.8398C59.8906-21.4098 59.5545-21.07 59.1265-21C59.0495-20.99 58.9571-20.9902 58.7711-20.9902L51.1715-20.9902C50.9855-20.9902 50.891-20.9899 50.814-21C50.386-21.07 50.05-21.4098 49.982-21.8398C49.97-21.9098 49.9703-22.0094 49.9703-22.1894L49.9703-29.789C49.9703-29.979 49.97-30.0704 49.982-30.1504C50.05-30.5804 50.386-30.9104 50.814-30.9804C50.891-30.9904 50.9855-30.9902 51.1715-30.9902ZM89.1715-19.9902C88.9855-19.9902 88.891-19.9905 88.814-19.9804C88.386-19.9104 88.05-19.5804 87.982-19.1504C87.97-19.0704 87.9703-18.979 87.9703-18.789L87.9703-11.1894C87.9703-11.0094 87.97-10.9098 87.982-10.8398C88.05-10.4098 88.386-10.07 88.814-9.99996C88.891-9.98996 88.9855-9.9902 89.1715-9.9902L96.7711-9.9902C96.9571-9.9902 97.0495-9.98996 97.1265-9.99996C97.5545-10.07 97.8906-10.4098 97.9586-10.8398C97.9706-10.9098 97.9703-11.0094 97.9703-11.1894L97.9703-18.789C97.9703-18.979 97.9706-19.0704 97.9586-19.1504C97.8906-19.5804 97.5545-19.9104 97.1265-19.9804C97.0495-19.9904 96.9571-19.9902 96.7711-19.9902ZM31.1715-10.9902L38.7711-10.9902C38.9571-10.9902 39.0495-10.9905 39.1265-10.9804C39.5545-10.9104 39.8906-10.5804 39.9586-10.1504C39.9706-10.0704 39.9703-9.97903 39.9703-9.78903L39.9703-2.18942C39.9703-2.00942 39.9706-1.90981 39.9586-1.83981C39.8906-1.40981 39.5545-1.06996 39.1265-0.999965C39.0495-0.989965 38.9571-0.990199 38.7711-0.990199L31.1715-0.990199C30.9855-0.990199 30.891-0.989965 30.814-0.999965C30.386-1.06996 30.05-1.40981 29.982-1.83981C29.97-1.90981 29.9703-2.00942 29.9703-2.18942L29.9703-9.78903C29.9703-9.97903 29.97-10.0704 29.982-10.1504C30.05-10.5804 30.386-10.9104 30.814-10.9804C30.891-10.9904 30.9855-10.9902 31.1715-10.9902ZM51.1715-10.9902L58.7711-10.9902C58.9571-10.9902 59.0495-10.9905 59.1265-10.9804C59.5545-10.9104 59.8906-10.5804 59.9586-10.1504C59.9706-10.0704 59.9703-9.97903 59.9703-9.78903L59.9703-2.18942C59.9703-2.00942 59.9706-1.90981 59.9586-1.83981C59.8906-1.40981 59.5545-1.06996 59.1265-0.999965C59.0495-0.989965 58.9571-0.990199 58.7711-0.990199L51.1715-0.990199C50.9855-0.990199 50.891-0.989965 50.814-0.999965C50.386-1.06996 50.05-1.40981 49.982-1.83981C49.97-1.90981 49.9703-2.00942 49.9703-2.18942L49.9703-9.78903C49.9703-9.97903 49.97-10.0704 49.982-10.1504C50.05-10.5804 50.386-10.9104 50.814-10.9804C50.891-10.9904 50.9855-10.9902 51.1715-10.9902Z"/>
+  </g>
+  <g id="Black-S" transform="matrix(1 0 0 1 2869.18 696)">
+   <path class="SFSymbolsPreviewWireframe" d="M33.5797-77.6484C32.7297-77.6504 31.7204-77.6509 30.8004-77.5039C25.8104-76.7149 21.899-72.8053 21.109-67.8203C20.969-66.8933 20.9703-65.8901 20.9703-65.0391L20.9703-64.7988L20.9703-11.1973L20.9703-10.9551C20.9703-10.1041 20.969-9.10278 21.109-8.17578C21.899-3.19079 25.8104 0.719767 30.8004 1.50977C31.7204 1.65677 32.7297 1.65434 33.5797 1.65234L33.8199 1.65234L56.6207 1.65234L56.6207 1.67187L94.8804 1.67187L94.9703 1.67187L95.1304 1.67187C95.9704 1.67387 97.0406 1.67557 98.0406 1.51758C103.391 0.67058 107.579-3.52406 108.429-8.87305C108.589-9.87105 108.59-10.9452 108.58-11.7832L108.58-12.0293L108.58-47.3848L108.58-47.6309C108.59-48.4689 108.59-49.542 108.429-50.541C107.579-55.889 103.391-60.0846 98.0406-60.9316C97.0406-61.0896 95.9704-61.0869 95.1304-61.0859C95.0404-61.0849 94.9604-61.0859 94.8804-61.0859L67.0992-61.0859L67.0992-64.7988L67.0992-65.0391C67.0992-65.8911 67.1005-66.8933 66.9605-67.8203C66.1705-72.8053 62.2591-76.7149 57.2691-77.5039C56.3391-77.6509 55.3398-77.6504 54.4898-77.6484L54.2496-77.6484L33.8199-77.6484ZM32.8004-67.0234L38.689-67.0234C38.869-67.0234 38.9706-67.0237 39.0406-67.0117C39.4706-66.9437 39.8104-66.6077 39.8804-66.1797C39.8904-66.1017 39.8902-66.0083 39.8902-65.8223L39.8902-59.9316C39.8902-59.7456 39.8905-59.6522 39.8804-59.5742C39.8104-59.1462 39.4706-58.8102 39.0406-58.7422C38.9706-58.7302 38.869-58.7305 38.689-58.7305L32.8004-58.7305C32.6104-58.7305 32.519-58.7302 32.439-58.7422C32.009-58.8102 31.679-59.1462 31.609-59.5742C31.599-59.6522 31.5992-59.7456 31.5992-59.9316L31.5992-65.8223C31.5992-66.0083 31.5989-66.1017 31.609-66.1797C31.679-66.6077 32.009-66.9437 32.439-67.0117C32.519-67.0237 32.6104-67.0234 32.8004-67.0234ZM49.3804-67.0234L55.2691-67.0234C55.4591-67.0234 55.5504-67.0237 55.6304-67.0117C56.0604-66.9437 56.3905-66.6077 56.4605-66.1797C56.4705-66.1017 56.4703-66.0083 56.4703-65.8223L56.4703-59.9316C56.4703-59.7456 56.4706-59.6522 56.4605-59.5742C56.3905-59.1462 56.0604-58.8102 55.6304-58.7422C55.5504-58.7302 55.4591-58.7305 55.2691-58.7305L49.3804-58.7305C49.2004-58.7305 49.0991-58.7302 49.0191-58.7422C48.5991-58.8102 48.259-59.1462 48.189-59.5742C48.179-59.6522 48.1792-59.7456 48.1792-59.9316L48.1792-65.8223C48.1792-66.0083 48.179-66.1017 48.189-66.1797C48.259-66.6077 48.5991-66.9437 49.0191-67.0117C49.0991-67.0237 49.2004-67.0234 49.3804-67.0234ZM32.8004-50.4375L38.689-50.4375C38.869-50.4375 38.9706-50.4378 39.0406-50.4258C39.4706-50.3578 39.8104-50.0227 39.8804-49.5957C39.8904-49.5177 39.8902-49.4243 39.8902-49.2383L39.8902-43.3457C39.8902-43.1607 39.8905-43.0663 39.8804-42.9883C39.8104-42.5603 39.4706-42.2252 39.0406-42.1582C38.9706-42.1452 38.869-42.1445 38.689-42.1445L32.8004-42.1445C32.6104-42.1445 32.519-42.1452 32.439-42.1582C32.009-42.2252 31.679-42.5603 31.609-42.9883C31.599-43.0663 31.5992-43.1607 31.5992-43.3457L31.5992-49.2383C31.5992-49.4243 31.5989-49.5177 31.609-49.5957C31.679-50.0227 32.009-50.3578 32.439-50.4258C32.519-50.4378 32.6104-50.4375 32.8004-50.4375ZM49.3804-50.4375L55.2691-50.4375C55.4591-50.4375 55.5504-50.4378 55.6304-50.4258C56.0604-50.3578 56.3905-50.0227 56.4605-49.5957C56.4705-49.5177 56.4703-49.4243 56.4703-49.2383L56.4703-43.3457C56.4703-43.1607 56.4706-43.0663 56.4605-42.9883C56.3905-42.5603 56.0604-42.2252 55.6304-42.1582C55.5504-42.1452 55.4591-42.1445 55.2691-42.1445L49.3804-42.1445C49.2004-42.1445 49.0991-42.1452 49.0191-42.1582C48.5991-42.2252 48.259-42.5603 48.189-42.9883C48.179-43.0663 48.1792-43.1607 48.1792-43.3457L48.1792-49.2383C48.1792-49.4243 48.179-49.5177 48.189-49.5957C48.259-50.0227 48.5991-50.3578 49.0191-50.4258C49.0991-50.4378 49.2004-50.4375 49.3804-50.4375ZM67.1207-48.0859L94.8804-48.0859C95.1804-48.0859 95.3997-48.085 95.5797-48.0839L95.5797-47.3847L95.5797-12.0293L95.5797-11.33C95.3997-11.329 95.1804-11.328 94.8804-11.328L67.1207-11.328L67.1207-17.2636L71.859-17.2597C72.039-17.2597 72.1403-17.2604 72.2203-17.2733C72.6403-17.3403 72.9804-17.6754 73.0504-18.1034C73.0604-18.1814 73.0602-18.2748 73.0602-18.4608L73.0602-24.3534C73.0602-24.5394 73.0604-24.6319 73.0504-24.7089C72.9804-25.1369 72.6403-25.4729 72.2203-25.5409C72.1403-25.5529 72.039-25.5526 71.859-25.5526L67.1207-25.5546L67.1207-33.8476L71.859-33.8456C72.039-33.8456 72.1403-33.8453 72.2203-33.8573C72.6403-33.9253 72.9804-34.2614 73.0504-34.6894C73.0604-34.7674 73.0602-34.8608 73.0602-35.0468L73.0602-40.9375C73.0602-41.1235 73.0604-41.2169 73.0504-41.2949C72.9804-41.7229 72.6403-42.059 72.2203-42.127C72.1403-42.139 72.039-42.1387 71.859-42.1387L67.1207-42.1407ZM82.5504-42.1387C82.3704-42.1387 82.2708-42.139 82.2008-42.127C81.7708-42.059 81.429-41.7229 81.359-41.2949C81.349-41.2169 81.3492-41.1235 81.3492-40.9375L81.3492-35.0469C81.3492-34.8609 81.3489-34.7675 81.359-34.6895C81.429-34.2615 81.7708-33.9254 82.2008-33.8574C82.2708-33.8454 82.3704-33.8457 82.5504-33.8457L88.439-33.8457C88.629-33.8457 88.7204-33.8454 88.8004-33.8574C89.2304-33.9254 89.5604-34.2615 89.6304-34.6895C89.6404-34.7675 89.6402-34.8609 89.6402-35.0469L89.6402-40.9375C89.6402-41.1235 89.6405-41.2169 89.6304-41.2949C89.5604-41.7229 89.2304-42.059 88.8004-42.127C88.7204-42.139 88.629-42.1387 88.439-42.1387ZM32.8004-33.8535L38.689-33.8535C38.869-33.8535 38.9706-33.8528 39.0406-33.8398C39.4706-33.7728 39.8104-33.4378 39.8804-33.0098C39.8904-32.9318 39.8902-32.8383 39.8902-32.6523L39.8902-26.7598C39.8902-26.5738 39.8905-26.4813 39.8804-26.4043C39.8104-25.9763 39.4706-25.6403 39.0406-25.5723C38.9706-25.5603 38.869-25.5605 38.689-25.5605L32.8004-25.5605C32.6104-25.5605 32.519-25.5603 32.439-25.5723C32.009-25.6403 31.679-25.9763 31.609-26.4043C31.599-26.4813 31.5992-26.5738 31.5992-26.7598L31.5992-32.6523C31.5992-32.8383 31.5989-32.9318 31.609-33.0098C31.679-33.4378 32.009-33.7728 32.439-33.8398C32.519-33.8528 32.6104-33.8535 32.8004-33.8535ZM49.3804-33.8535L55.2691-33.8535C55.4591-33.8535 55.5504-33.8528 55.6304-33.8398C56.0604-33.7728 56.3905-33.4378 56.4605-33.0098C56.4705-32.9318 56.4703-32.8383 56.4703-32.6523L56.4703-26.7598C56.4703-26.5738 56.4706-26.4813 56.4605-26.4043C56.3905-25.9763 56.0604-25.6403 55.6304-25.5723C55.5504-25.5603 55.4591-25.5605 55.2691-25.5605L49.3804-25.5605C49.2004-25.5605 49.0991-25.5603 49.0191-25.5723C48.5991-25.6403 48.259-25.9763 48.189-26.4043C48.179-26.4813 48.1792-26.5738 48.1792-26.7598L48.1792-32.6523C48.1792-32.8383 48.179-32.9318 48.189-33.0098C48.259-33.4378 48.5991-33.7728 49.0191-33.8398C49.0991-33.8528 49.2004-33.8535 49.3804-33.8535ZM82.5504-25.5527C82.3704-25.5527 82.2708-25.553 82.2008-25.541C81.7708-25.473 81.429-25.137 81.359-24.709C81.349-24.632 81.3492-24.5395 81.3492-24.3535L81.3492-18.4609C81.3492-18.2749 81.3489-18.1815 81.359-18.1035C81.429-17.6755 81.7708-17.3404 82.2008-17.2734C82.2708-17.2604 82.3704-17.2598 82.5504-17.2598L88.439-17.2598C88.629-17.2598 88.7204-17.2604 88.8004-17.2734C89.2304-17.3404 89.5604-17.6755 89.6304-18.1035C89.6404-18.1815 89.6402-18.2749 89.6402-18.4609L89.6402-24.3535C89.6402-24.5395 89.6405-24.632 89.6304-24.709C89.5604-25.137 89.2304-25.473 88.8004-25.541C88.7204-25.553 88.629-25.5527 88.439-25.5527ZM32.8004-17.2676L38.689-17.2676C38.869-17.2676 38.9706-17.2679 39.0406-17.2559C39.4706-17.1879 39.8104-16.8518 39.8804-16.4238C39.8904-16.3458 39.8902-16.2524 39.8902-16.0664L39.8902-10.1758C39.8902-9.98978 39.8905-9.89636 39.8804-9.81836C39.8104-9.39036 39.4706-9.05433 39.0406-8.98633C38.9706-8.97433 38.869-8.97461 38.689-8.97461L32.8004-8.97461C32.6104-8.97461 32.519-8.97433 32.439-8.98633C32.009-9.05433 31.679-9.39036 31.609-9.81836C31.599-9.89636 31.5992-9.98978 31.5992-10.1758L31.5992-16.0664C31.5992-16.2524 31.5989-16.3458 31.609-16.4238C31.679-16.8518 32.009-17.1879 32.439-17.2559C32.519-17.2679 32.6104-17.2676 32.8004-17.2676ZM49.3804-17.2676L55.2691-17.2676C55.4591-17.2676 55.5504-17.2679 55.6304-17.2559C56.0604-17.1879 56.3905-16.8518 56.4605-16.4238C56.4705-16.3458 56.4703-16.2524 56.4703-16.0664L56.4703-10.1758C56.4703-9.98978 56.4706-9.89636 56.4605-9.81836C56.3905-9.39036 56.0604-9.05433 55.6304-8.98633C55.5504-8.97433 55.4591-8.97461 55.2691-8.97461L49.3804-8.97461C49.2004-8.97461 49.0991-8.97433 49.0191-8.98633C48.5991-9.05433 48.259-9.39036 48.189-9.81836C48.179-9.89636 48.1792-9.98978 48.1792-10.1758L48.1792-16.0664C48.1792-16.2524 48.179-16.3458 48.189-16.4238C48.259-16.8518 48.5991-17.1879 49.0191-17.2559C49.0991-17.2679 49.2004-17.2676 49.3804-17.2676Z"/>
+  </g>
+  <g id="Heavy-S" transform="matrix(1 0 0 1 2572.97 696)">
+   <path class="SFSymbolsPreviewWireframe" d="M33.0816-77.1484C32.2216-77.1494 31.2604-77.1517 30.3804-77.0117C25.6005-76.2557 21.8609-72.5132 21.1109-67.7422C20.9709-66.8572 20.9703-65.8952 20.9703-65.0352L20.9703-64.7988L20.9703-11.1973L20.9703-10.9609C20.9703-10.1009 20.9709-9.1389 21.1109-8.25391C21.8609-3.48292 25.6005 0.259627 30.3804 1.01562C31.2604 1.15562 32.2216 1.15434 33.0816 1.15234L33.3199 1.15234L56.6207 1.15234L56.6207 1.17187L94.3804 1.17187L94.6304 1.17187C95.4704 1.17387 96.5005 1.17543 97.4605 1.02344C102.601 0.210439 106.621-3.81618 107.441-8.95117C107.591-9.90717 107.592-10.9392 107.582-11.7852L107.582-12.0293L107.582-47.3848L107.582-47.6289C107.592-48.4739 107.591-49.5059 107.441-50.4629C106.621-55.5969 102.601-59.6235 97.4605-60.4375C96.5005-60.5885 95.4704-60.5869 94.6304-60.5859L94.3804-60.5859L66.1012-60.5859L66.1012-64.7988L66.1012-65.0352C66.1011-65.8952 66.1005-66.8572 65.9605-67.7422C65.2105-72.5132 61.461-76.2557 56.691-77.0117C55.811-77.1517 54.8518-77.1494 53.9918-77.1484L53.7515-77.1484L33.3199-77.1484ZM32.3004-67.0234L38.191-67.0234C38.371-67.0234 38.4706-67.0237 38.5406-67.0117C38.9706-66.9437 39.3104-66.6077 39.3804-66.1797C39.3904-66.1017 39.3902-66.0083 39.3902-65.8223L39.3902-59.9316C39.3902-59.7456 39.3905-59.6522 39.3804-59.5742C39.3104-59.1462 38.9706-58.8102 38.5406-58.7422C38.4706-58.7302 38.371-58.7305 38.191-58.7305L32.3004-58.7305C32.1104-58.7305 32.021-58.7302 31.941-58.7422C31.511-58.8102 31.1809-59.1462 31.1109-59.5742C31.1009-59.6522 31.1011-59.7456 31.1011-59.9316L31.1011-65.8223C31.1011-66.0083 31.1009-66.1017 31.1109-66.1797C31.1809-66.6077 31.511-66.9437 31.941-67.0117C32.021-67.0237 32.1104-67.0234 32.3004-67.0234ZM48.8804-67.0234L54.7711-67.0234C54.9611-67.0234 55.0504-67.0237 55.1304-67.0117C55.5604-66.9437 55.8905-66.6077 55.9605-66.1797C55.9705-66.1017 55.9703-66.0083 55.9703-65.8223L55.9703-59.9316C55.9703-59.7456 55.9706-59.6522 55.9605-59.5742C55.8905-59.1462 55.5604-58.8102 55.1304-58.7422C55.0504-58.7302 54.9611-58.7305 54.7711-58.7305L48.8804-58.7305C48.7004-58.7305 48.6011-58.7302 48.5211-58.7422C48.1011-58.8102 47.761-59.1462 47.691-59.5742C47.681-59.6522 47.6812-59.7456 47.6812-59.9316L47.6812-65.8223C47.6812-66.0083 47.681-66.1017 47.691-66.1797C47.761-66.6077 48.1011-66.9437 48.5211-67.0117C48.6011-67.0237 48.7004-67.0234 48.8804-67.0234ZM32.3004-50.4375L38.191-50.4375C38.371-50.4375 38.4706-50.4378 38.5406-50.4258C38.9706-50.3578 39.3104-50.0227 39.3804-49.5957C39.3904-49.5177 39.3902-49.4243 39.3902-49.2383L39.3902-43.3457C39.3902-43.1607 39.3905-43.0663 39.3804-42.9883C39.3104-42.5603 38.9706-42.2252 38.5406-42.1582C38.4706-42.1452 38.371-42.1445 38.191-42.1445L32.3004-42.1445C32.1104-42.1445 32.021-42.1452 31.941-42.1582C31.511-42.2252 31.1809-42.5603 31.1109-42.9883C31.1009-43.0663 31.1011-43.1607 31.1011-43.3457L31.1011-49.2383C31.1011-49.4243 31.1009-49.5177 31.1109-49.5957C31.1809-50.0227 31.511-50.3578 31.941-50.4258C32.021-50.4378 32.1104-50.4375 32.3004-50.4375ZM48.8804-50.4375L54.7711-50.4375C54.9611-50.4375 55.0504-50.4378 55.1304-50.4258C55.5604-50.3578 55.8905-50.0227 55.9605-49.5957C55.9705-49.5177 55.9703-49.4243 55.9703-49.2383L55.9703-43.3457C55.9703-43.1607 55.9706-43.0663 55.9605-42.9883C55.8905-42.5603 55.5604-42.2252 55.1304-42.1582C55.0504-42.1452 54.9611-42.1445 54.7711-42.1445L48.8804-42.1445C48.7004-42.1445 48.6011-42.1452 48.5211-42.1582C48.1011-42.2252 47.761-42.5603 47.691-42.9883C47.681-43.0663 47.6812-43.1607 47.6812-43.3457L47.6812-49.2383C47.6812-49.4243 47.681-49.5177 47.691-49.5957C47.761-50.0227 48.1011-50.3578 48.5211-50.4258C48.6011-50.4378 48.7004-50.4375 48.8804-50.4375ZM66.1207-48.5859L94.3804-48.5859C94.9704-48.5859 95.3008-48.5851 95.5308-48.5781L95.5816-48.5761L95.5816-48.5332L95.5816-47.3847L95.5816-12.0293L95.5816-10.8808L95.5816-10.8379L95.5308-10.8359C95.3008-10.8299 94.9704-10.8281 94.3804-10.8281L66.1207-10.8281L66.1207-17.2636L71.3609-17.2616C71.5409-17.2616 71.6403-17.2603 71.7203-17.2733C72.1403-17.3403 72.4804-17.6774 72.5504-18.1054C72.5604-18.1834 72.5602-18.2758 72.5602-18.4608L72.5602-24.3534C72.5602-24.5394 72.5604-24.6328 72.5504-24.7108C72.4804-25.1378 72.1403-25.4749 71.7203-25.5429C71.6403-25.5549 71.5409-25.5546 71.3609-25.5546L66.1207-25.5546L66.1207-33.8475L71.3609-33.8475C71.5409-33.8475 71.6403-33.8473 71.7203-33.8593C72.1403-33.9273 72.4804-34.2613 72.5504-34.6893C72.5604-34.7673 72.5602-34.8608 72.5602-35.0468L72.5602-40.9393C72.5602-41.1253 72.5604-41.2188 72.5504-41.2968C72.4804-41.7248 72.1403-42.0588 71.7203-42.1268C71.6403-42.1388 71.5409-42.1386 71.3609-42.1386L66.1207-42.1406ZM82.0504-42.1387C81.8704-42.1387 81.7708-42.139 81.7008-42.127C81.2708-42.059 80.9309-41.7249 80.8609-41.2969C80.8509-41.2189 80.8511-41.1255 80.8511-40.9395L80.8511-35.0469C80.8511-34.8609 80.8509-34.7675 80.8609-34.6895C80.9309-34.2615 81.2708-33.9274 81.7008-33.8594C81.7708-33.8474 81.8704-33.8477 82.0504-33.8477L87.941-33.8477C88.131-33.8477 88.2204-33.8474 88.3004-33.8594C88.7304-33.9274 89.0604-34.2615 89.1304-34.6895C89.1404-34.7675 89.1402-34.8609 89.1402-35.0469L89.1402-40.9395C89.1402-41.1255 89.1405-41.2189 89.1304-41.2969C89.0604-41.7249 88.7304-42.059 88.3004-42.127C88.2204-42.139 88.131-42.1387 87.941-42.1387ZM32.3004-33.8535L38.191-33.8535C38.371-33.8535 38.4706-33.8528 38.5406-33.8398C38.9706-33.7728 39.3104-33.4378 39.3804-33.0098C39.3904-32.9318 39.3902-32.8383 39.3902-32.6523L39.3902-26.7598C39.3902-26.5738 39.3905-26.4813 39.3804-26.4043C39.3104-25.9763 38.9706-25.6403 38.5406-25.5723C38.4706-25.5603 38.371-25.5605 38.191-25.5605L32.3004-25.5605C32.1104-25.5605 32.021-25.5603 31.941-25.5723C31.511-25.6403 31.1809-25.9763 31.1109-26.4043C31.1009-26.4813 31.1011-26.5738 31.1011-26.7598L31.1011-32.6523C31.1011-32.8383 31.1009-32.9318 31.1109-33.0098C31.1809-33.4378 31.511-33.7728 31.941-33.8398C32.021-33.8528 32.1104-33.8535 32.3004-33.8535ZM48.8804-33.8535L54.7711-33.8535C54.9611-33.8535 55.0504-33.8528 55.1304-33.8398C55.5604-33.7728 55.8905-33.4378 55.9605-33.0098C55.9705-32.9318 55.9703-32.8383 55.9703-32.6523L55.9703-26.7598C55.9703-26.5738 55.9706-26.4813 55.9605-26.4043C55.8905-25.9763 55.5604-25.6403 55.1304-25.5723C55.0504-25.5603 54.9611-25.5605 54.7711-25.5605L48.8804-25.5605C48.7004-25.5605 48.6011-25.5603 48.5211-25.5723C48.1011-25.6403 47.761-25.9763 47.691-26.4043C47.681-26.4813 47.6812-26.5738 47.6812-26.7598L47.6812-32.6523C47.6812-32.8383 47.681-32.9318 47.691-33.0098C47.761-33.4378 48.1011-33.7728 48.5211-33.8398C48.6011-33.8528 48.7004-33.8535 48.8804-33.8535ZM82.0504-25.5547C81.8704-25.5547 81.7708-25.555 81.7008-25.543C81.2708-25.475 80.9309-25.1379 80.8609-24.7109C80.8509-24.6329 80.8511-24.5395 80.8511-24.3535L80.8511-18.4609C80.8511-18.2759 80.8509-18.1835 80.8609-18.1055C80.9309-17.6775 81.2708-17.3404 81.7008-17.2734C81.7708-17.2604 81.8704-17.2617 82.0504-17.2617L87.941-17.2617C88.131-17.2617 88.2204-17.2604 88.3004-17.2734C88.7304-17.3404 89.0604-17.6775 89.1304-18.1055C89.1404-18.1835 89.1402-18.2759 89.1402-18.4609L89.1402-24.3535C89.1402-24.5395 89.1405-24.6329 89.1304-24.7109C89.0604-25.1379 88.7304-25.475 88.3004-25.543C88.2204-25.555 88.131-25.5547 87.941-25.5547ZM32.3004-17.2676L38.191-17.2676C38.371-17.2676 38.4706-17.2679 38.5406-17.2559C38.9706-17.1879 39.3104-16.8518 39.3804-16.4238C39.3904-16.3458 39.3902-16.2524 39.3902-16.0664L39.3902-10.1758C39.3902-9.98978 39.3905-9.89636 39.3804-9.81836C39.3104-9.39036 38.9706-9.05433 38.5406-8.98633C38.4706-8.97433 38.371-8.97461 38.191-8.97461L32.3004-8.97461C32.1104-8.97461 32.021-8.97433 31.941-8.98633C31.511-9.05433 31.1809-9.39036 31.1109-9.81836C31.1009-9.89636 31.1011-9.98978 31.1011-10.1758L31.1011-16.0664C31.1011-16.2524 31.1009-16.3458 31.1109-16.4238C31.1809-16.8518 31.511-17.1879 31.941-17.2559C32.021-17.2679 32.1104-17.2676 32.3004-17.2676ZM48.8804-17.2676L54.7711-17.2676C54.9611-17.2676 55.0504-17.2679 55.1304-17.2559C55.5604-17.1879 55.8905-16.8518 55.9605-16.4238C55.9705-16.3458 55.9703-16.2524 55.9703-16.0664L55.9703-10.1758C55.9703-9.98978 55.9706-9.89636 55.9605-9.81836C55.8905-9.39036 55.5604-9.05433 55.1304-8.98633C55.0504-8.97433 54.9611-8.97461 54.7711-8.97461L48.8804-8.97461C48.7004-8.97461 48.6011-8.97433 48.5211-8.98633C48.1011-9.05433 47.761-9.39036 47.691-9.81836C47.681-9.89636 47.6812-9.98978 47.6812-10.1758L47.6812-16.0664C47.6812-16.2524 47.681-16.3458 47.691-16.4238C47.761-16.8518 48.1011-17.1879 48.5211-17.2559C48.6011-17.2679 48.7004-17.2676 48.8804-17.2676Z"/>
+  </g>
+  <g id="Bold-S" transform="matrix(1 0 0 1 2276.26 696)">
+   <path class="SFSymbolsPreviewWireframe" d="M33.0797-76.1484C32.2197-76.1494 31.2604-76.1517 30.3804-76.0117C25.6005-75.2557 21.859-71.5132 21.109-66.7422C20.969-65.8572 20.9703-64.8952 20.9703-64.0352L20.9703-63.7988L20.9703-10.1973L20.9703-9.96094C20.9703-9.10094 20.969-8.13891 21.109-7.25391C21.859-2.48291 25.6005 1.25963 30.3804 2.01562C31.2604 2.15562 32.2197 2.15434 33.0797 2.15234L33.3199 2.15234L56.6207 2.15234L56.6207 2.17187L94.3804 2.17187L94.6304 2.17187C95.4704 2.17387 96.5005 2.17543 97.4605 2.02344C102.601 1.21044 106.619-2.81618 107.439-7.95117C107.589-8.90717 107.59-9.93916 107.58-10.7852L107.58-11.0293L107.58-46.3848L107.58-46.6289C107.59-47.4739 107.589-48.5059 107.439-49.4629C106.619-54.5969 102.601-58.6235 97.4605-59.4375C96.5005-59.5885 95.4704-59.5869 94.6304-59.5859L94.3804-59.5859L66.0992-59.5859L66.0992-63.7988L66.0992-64.0352C66.0992-64.8952 66.1005-65.8572 65.9605-66.7422C65.2105-71.5132 61.459-75.2557 56.689-76.0117C55.809-76.1517 54.8498-76.1494 53.9898-76.1484L53.7496-76.1484L33.3199-76.1484ZM32.3004-66.0234L38.189-66.0234C38.369-66.0234 38.4706-66.0237 38.5406-66.0117C38.9706-65.9437 39.3104-65.6077 39.3804-65.1797C39.3904-65.1017 39.3902-65.0083 39.3902-64.8223L39.3902-58.9316C39.3902-58.7456 39.3905-58.6522 39.3804-58.5742C39.3104-58.1462 38.9706-57.8102 38.5406-57.7422C38.4706-57.7302 38.369-57.7305 38.189-57.7305L32.3004-57.7305C32.1104-57.7305 32.019-57.7302 31.939-57.7422C31.509-57.8102 31.179-58.1462 31.109-58.5742C31.099-58.6522 31.0992-58.7456 31.0992-58.9316L31.0992-64.8223C31.0992-65.0083 31.0989-65.1017 31.109-65.1797C31.179-65.6077 31.509-65.9437 31.939-66.0117C32.019-66.0237 32.1104-66.0234 32.3004-66.0234ZM48.8804-66.0234L54.7691-66.0234C54.9591-66.0234 55.0504-66.0237 55.1304-66.0117C55.5604-65.9437 55.8905-65.6077 55.9605-65.1797C55.9705-65.1017 55.9703-65.0083 55.9703-64.8223L55.9703-58.9316C55.9703-58.7456 55.9706-58.6522 55.9605-58.5742C55.8905-58.1462 55.5604-57.8102 55.1304-57.7422C55.0504-57.7302 54.9591-57.7305 54.7691-57.7305L48.8804-57.7305C48.6904-57.7305 48.5991-57.7302 48.5191-57.7422C48.0991-57.8102 47.759-58.1462 47.689-58.5742C47.679-58.6522 47.6792-58.7456 47.6792-58.9316L47.6792-64.8223C47.6792-65.0083 47.679-65.1017 47.689-65.1797C47.759-65.6077 48.0991-65.9437 48.5191-66.0117C48.5991-66.0237 48.6904-66.0234 48.8804-66.0234ZM32.3004-49.4375L38.189-49.4375C38.369-49.4375 38.4706-49.4378 38.5406-49.4258C38.9706-49.3578 39.3104-49.0227 39.3804-48.5957C39.3904-48.5177 39.3902-48.4243 39.3902-48.2383L39.3902-42.3457C39.3902-42.1607 39.3905-42.0663 39.3804-41.9883C39.3104-41.5603 38.9706-41.2252 38.5406-41.1582C38.4706-41.1452 38.369-41.1445 38.189-41.1445L32.3004-41.1445C32.1104-41.1445 32.019-41.1452 31.939-41.1582C31.509-41.2252 31.179-41.5603 31.109-41.9883C31.099-42.0663 31.0992-42.1607 31.0992-42.3457L31.0992-48.2383C31.0992-48.4243 31.0989-48.5177 31.109-48.5957C31.179-49.0227 31.509-49.3578 31.939-49.4258C32.019-49.4378 32.1104-49.4375 32.3004-49.4375ZM48.8804-49.4375L54.7691-49.4375C54.9591-49.4375 55.0504-49.4378 55.1304-49.4258C55.5604-49.3578 55.8905-49.0227 55.9605-48.5957C55.9705-48.5177 55.9703-48.4243 55.9703-48.2383L55.9703-42.3457C55.9703-42.1607 55.9706-42.0663 55.9605-41.9883C55.8905-41.5603 55.5604-41.2252 55.1304-41.1582C55.0504-41.1452 54.9591-41.1445 54.7691-41.1445L48.8804-41.1445C48.6904-41.1445 48.5991-41.1452 48.5191-41.1582C48.0991-41.2252 47.759-41.5603 47.689-41.9883C47.679-42.0663 47.6792-42.1607 47.6792-42.3457L47.6792-48.2383C47.6792-48.4243 47.679-48.5177 47.689-48.5957C47.759-49.0227 48.0991-49.3578 48.5191-49.4258C48.5991-49.4378 48.6904-49.4375 48.8804-49.4375ZM66.1207-47.5859L94.3804-47.5859C94.9704-47.5859 95.2989-47.5851 95.5289-47.5781L95.5699-47.5761L95.5797-47.5332L95.5797-46.3847L95.5797-11.0293L95.5797-9.88082L95.5699-9.83786L95.5289-9.83591C95.2989-9.82991 94.9704-9.8281 94.3804-9.8281L66.1207-9.8281ZM32.3004-32.8535L38.189-32.8535C38.369-32.8535 38.4706-32.8528 38.5406-32.8398C38.9706-32.7728 39.3104-32.4378 39.3804-32.0098C39.3904-31.9318 39.3902-31.8383 39.3902-31.6523L39.3902-25.7598C39.3902-25.5738 39.3905-25.4813 39.3804-25.4043C39.3104-24.9763 38.9706-24.6403 38.5406-24.5723C38.4706-24.5603 38.369-24.5605 38.189-24.5605L32.3004-24.5605C32.1104-24.5605 32.019-24.5603 31.939-24.5723C31.509-24.6403 31.179-24.9763 31.109-25.4043C31.099-25.4813 31.0992-25.5738 31.0992-25.7598L31.0992-31.6523C31.0992-31.8383 31.0989-31.9318 31.109-32.0098C31.179-32.4378 31.509-32.7728 31.939-32.8398C32.019-32.8528 32.1104-32.8535 32.3004-32.8535ZM48.8804-32.8535L54.7691-32.8535C54.9591-32.8535 55.0504-32.8528 55.1304-32.8398C55.5604-32.7728 55.8905-32.4378 55.9605-32.0098C55.9705-31.9318 55.9703-31.8383 55.9703-31.6523L55.9703-25.7598C55.9703-25.5738 55.9706-25.4813 55.9605-25.4043C55.8905-24.9763 55.5604-24.6403 55.1304-24.5723C55.0504-24.5603 54.9591-24.5605 54.7691-24.5605L48.8804-24.5605C48.6904-24.5605 48.5991-24.5603 48.5191-24.5723C48.0991-24.6403 47.759-24.9763 47.689-25.4043C47.679-25.4813 47.6792-25.5738 47.6792-25.7598L47.6792-31.6523C47.6792-31.8383 47.679-31.9318 47.689-32.0098C47.759-32.4378 48.0991-32.7728 48.5191-32.8398C48.5991-32.8528 48.6904-32.8535 48.8804-32.8535ZM32.3004-16.2676L38.189-16.2676C38.369-16.2676 38.4706-16.2679 38.5406-16.2559C38.9706-16.1879 39.3104-15.8518 39.3804-15.4238C39.3904-15.3458 39.3902-15.2524 39.3902-15.0664L39.3902-9.17578C39.3902-8.98978 39.3905-8.89636 39.3804-8.81836C39.3104-8.39036 38.9706-8.05433 38.5406-7.98633C38.4706-7.97433 38.369-7.97461 38.189-7.97461L32.3004-7.97461C32.1104-7.97461 32.019-7.97433 31.939-7.98633C31.509-8.05433 31.179-8.39036 31.109-8.81836C31.099-8.89636 31.0992-8.98978 31.0992-9.17578L31.0992-15.0664C31.0992-15.2524 31.0989-15.3458 31.109-15.4238C31.179-15.8518 31.509-16.1879 31.939-16.2559C32.019-16.2679 32.1104-16.2676 32.3004-16.2676ZM48.8804-16.2676L54.7691-16.2676C54.9591-16.2676 55.0504-16.2679 55.1304-16.2559C55.5604-16.1879 55.8905-15.8518 55.9605-15.4238C55.9705-15.3458 55.9703-15.2524 55.9703-15.0664L55.9703-9.17578C55.9703-8.98978 55.9706-8.89636 55.9605-8.81836C55.8905-8.39036 55.5604-8.05433 55.1304-7.98633C55.0504-7.97433 54.9591-7.97461 54.7691-7.97461L48.8804-7.97461C48.6904-7.97461 48.5991-7.97433 48.5191-7.98633C48.0991-8.05433 47.759-8.39036 47.689-8.81836C47.679-8.89636 47.6792-8.98978 47.6792-9.17578L47.6792-15.0664C47.6792-15.2524 47.679-15.3458 47.689-15.4238C47.759-15.8518 48.0991-16.1879 48.5191-16.2559C48.5991-16.2679 48.6904-16.2676 48.8804-16.2676ZM80.8598-23.712C80.8498-23.634 80.8498-23.541 80.8498-23.355L80.8498-17.463C80.8498-17.277 80.8498-17.184 80.8598-17.106C80.9298-16.678 81.2698-16.343 81.6998-16.275C81.7698-16.263 81.8698-16.263 82.0498-16.263L87.9398-16.263C88.1298-16.263 88.2198-16.263 88.2998-16.275C88.7298-16.343 89.0598-16.678 89.1298-17.106C89.1398-17.184 89.1398-17.277 89.1398-17.463L89.1398-23.355C89.1398-23.541 89.1398-23.634 89.1298-23.712C89.0598-24.14 88.7298-24.475 88.2998-24.543C88.2198-24.555 88.1298-24.555 87.9398-24.555L82.0498-24.555C81.8698-24.555 81.7698-24.555 81.6998-24.543C81.2698-24.475 80.9298-24.14 80.8598-23.712ZM80.8498-39.941C80.8498-40.126 80.8498-40.219 80.8598-40.297C80.9298-40.725 81.2698-41.061 81.6998-41.128C81.7698-41.141 81.8698-41.141 82.0498-41.141L87.9398-41.141C88.1298-41.141 88.2198-41.141 88.2998-41.128C88.7298-41.061 89.0598-40.725 89.1298-40.297C89.1398-40.219 89.1398-40.126 89.1398-39.941L89.1398-34.048C89.1398-33.862 89.1398-33.769 89.1298-33.692C89.0598-33.264 88.7298-32.928 88.2998-32.86C88.2198-32.848 88.1298-32.848 87.9398-32.848L82.0498-32.848C81.8698-32.848 81.7698-32.848 81.6998-32.86C81.2698-32.928 80.9298-33.264 80.8598-33.692C80.8498-33.769 80.8498-33.862 80.8498-34.048ZM71.3598-41.141L66.1198-41.141L66.1198-32.848L71.3598-32.848C71.5398-32.848 71.6398-32.848 71.7198-32.86C72.1398-32.928 72.4798-33.264 72.5498-33.692C72.5598-33.769 72.5598-33.862 72.5598-34.048L72.5598-39.941C72.5598-40.126 72.5598-40.219 72.5498-40.297C72.4798-40.725 72.1398-41.061 71.7198-41.128C71.6398-41.141 71.5398-41.141 71.3598-41.141ZM71.3598-24.555L66.1198-24.555L66.1198-16.263L71.3598-16.263C71.5398-16.263 71.6398-16.263 71.7198-16.275C72.1398-16.343 72.4798-16.678 72.5498-17.106C72.5598-17.184 72.5598-17.277 72.5598-17.463L72.5598-23.355C72.5598-23.541 72.5598-23.634 72.5498-23.712C72.4798-24.14 72.1398-24.475 71.7198-24.543C71.6398-24.555 71.5398-24.555 71.3598-24.555Z"/>
+  </g>
+  <g id="Semibold-S" transform="matrix(1 0 0 1 1980 696)">
+   <path class="SFSymbolsPreviewWireframe" d="M32.689-74.7422C31.819-74.7432 30.8887-74.7444 30.0387-74.6094C25.4387-73.8814 21.8292-70.2738 21.0992-65.6738C20.9692-64.8228 20.9703-63.8934 20.9703-63.0254L20.9703-62.793L20.9703-9.19141L20.9703-8.95703C20.9703-8.08903 20.9692-7.16255 21.0992-6.31055C21.8292-1.71056 25.4387 1.89795 30.0387 2.62695C30.8887 2.76195 31.819 2.75981 32.689 2.75781L32.9195 2.75781L65.3004 2.75781L65.3004 2.67969L93.9801 2.67969L94.2203 2.67969C95.0803 2.68069 96.0701 2.68211 96.9801 2.53711C101.9 1.75811 105.759-2.10149 106.539-7.02148C106.689-7.93648 106.679-8.92725 106.679-9.78125L106.679-10.0215L106.679-45.3789L106.679-45.6172C106.679-46.4712 106.688-47.462 106.539-48.377C105.759-53.2969 101.9-57.1565 96.9801-57.9355C96.0701-58.0805 95.0803-58.0791 94.2203-58.0781L93.9801-58.0781L65.3004-58.0781L65.3004-62.793L65.3004-63.0254C65.3004-63.8934 65.2995-64.8228 65.1695-65.6738C64.4395-70.2738 60.83-73.8814 56.2301-74.6094C55.3801-74.7444 54.4497-74.7432 53.5797-74.7422L53.3492-74.7422L32.9195-74.7422ZM31.9-65.0156L37.7887-65.0156C37.9687-65.0156 38.0702-65.0169 38.1402-65.0039C38.5702-64.9369 38.9101-64.5999 38.9801-64.1719C38.9901-64.0939 38.9899-64.0014 38.9899-63.8164L38.9899-57.9238C38.9899-57.7378 38.9901-57.6434 38.9801-57.5664C38.9101-57.1384 38.5702-56.8024 38.1402-56.7344C38.0702-56.7224 37.9687-56.7227 37.7887-56.7227L31.9-56.7227C31.71-56.7227 31.6187-56.7224 31.5387-56.7344C31.1087-56.8024 30.7805-57.1384 30.7105-57.5664C30.7005-57.6434 30.6988-57.7378 30.6988-57.9238L30.6988-63.8164C30.6988-64.0014 30.7005-64.0939 30.7105-64.1719C30.7805-64.5999 31.1087-64.9369 31.5387-65.0039C31.6187-65.0169 31.71-65.0156 31.9-65.0156ZM48.4801-65.0156L54.3687-65.0156C54.5587-65.0156 54.6501-65.0169 54.7301-65.0039C55.1601-64.9369 55.4901-64.5999 55.5601-64.1719C55.5701-64.0939 55.5699-64.0014 55.5699-63.8164L55.5699-57.9238C55.5699-57.7378 55.5702-57.6434 55.5601-57.5664C55.4901-57.1384 55.1601-56.8024 54.7301-56.7344C54.6501-56.7224 54.5587-56.7227 54.3687-56.7227L48.4801-56.7227C48.3001-56.7227 48.1987-56.7224 48.1187-56.7344C47.6987-56.8024 47.3587-57.1384 47.2887-57.5664C47.2787-57.6434 47.2789-57.7378 47.2789-57.9238L47.2789-63.8164C47.2789-64.0014 47.2786-64.0939 47.2887-64.1719C47.3587-64.5999 47.6987-64.9369 48.1187-65.0039C48.1987-65.0169 48.3001-65.0156 48.4801-65.0156ZM31.9-48.4297L37.7887-48.4297C37.9687-48.4297 38.0702-48.43 38.1402-48.418C38.5702-48.35 38.9101-48.0159 38.9801-47.5879C38.9901-47.5099 38.9899-47.4165 38.9899-47.2305L38.9899-41.3379C38.9899-41.1519 38.9901-41.0585 38.9801-40.9805C38.9101-40.5525 38.5702-40.2184 38.1402-40.1504C38.0702-40.1384 37.9687-40.1387 37.7887-40.1387L31.9-40.1387C31.71-40.1387 31.6187-40.1384 31.5387-40.1504C31.1087-40.2184 30.7805-40.5525 30.7105-40.9805C30.7005-41.0585 30.6988-41.1519 30.6988-41.3379L30.6988-47.2305C30.6988-47.4165 30.7005-47.5099 30.7105-47.5879C30.7805-48.0159 31.1087-48.35 31.5387-48.418C31.6187-48.43 31.71-48.4297 31.9-48.4297ZM48.4801-48.4297L54.3687-48.4297C54.5587-48.4297 54.6501-48.43 54.7301-48.418C55.1601-48.35 55.4901-48.0159 55.5601-47.5879C55.5701-47.5099 55.5699-47.4165 55.5699-47.2305L55.5699-41.3379C55.5699-41.1519 55.5702-41.0585 55.5601-40.9805C55.4901-40.5525 55.1601-40.2184 54.7301-40.1504C54.6501-40.1384 54.5587-40.1387 54.3687-40.1387L48.4801-40.1387C48.3001-40.1387 48.1987-40.1384 48.1187-40.1504C47.6987-40.2184 47.3587-40.5525 47.2887-40.9805C47.2787-41.0585 47.2789-41.1519 47.2789-41.3379L47.2789-47.2305C47.2789-47.4165 47.2786-47.5099 47.2887-47.5879C47.3587-48.0159 47.6987-48.35 48.1187-48.418C48.1987-48.43 48.3001-48.4297 48.4801-48.4297ZM65.3004-47.0781L93.9801-47.0781C94.5701-47.0781 94.9-47.0773 95.15-47.0703C95.22-47.0683 95.2704-47.0664 95.3004-47.0644C95.4804-47.0214 95.6295-46.8754 95.6695-46.6914C95.6695-46.6624 95.6693-46.614 95.6793-46.539L95.6793-45.3789L95.6793-10.0215L95.6793-8.85935C95.6693-8.78435 95.6695-8.735 95.6695-8.707C95.6295-8.522 95.4804-8.37891 95.3004-8.33591C95.2704-8.33391 95.22-8.3301 95.15-8.3281C94.9-8.3211 94.5701-8.32029 93.9801-8.32029L65.3004-8.32029L65.3004-15.2558L70.9605-15.2558C71.1405-15.2558 71.2399-15.2556 71.3199-15.2676C71.7399-15.3356 72.08-15.6696 72.15-16.0976C72.16-16.1756 72.1598-16.2691 72.1598-16.4551L72.1598-22.3476C72.1598-22.5336 72.16-22.6251 72.15-22.7031C72.08-23.1311 71.7399-23.4671 71.3199-23.5351C71.2399-23.5471 71.1405-23.5469 70.9605-23.5469L65.3004-23.5469L65.3004-31.8398L70.9605-31.8398C71.1405-31.8398 71.2399-31.8395 71.3199-31.8515C71.7399-31.9195 72.08-32.2556 72.15-32.6836C72.16-32.7606 72.1598-32.853 72.1598-33.039L72.1598-38.9336C72.1598-39.1196 72.16-39.212 72.15-39.289C72.08-39.717 71.7399-40.0531 71.3199-40.1211C71.2399-40.1331 71.1405-40.1328 70.9605-40.1328L65.3004-40.1328ZM81.65-40.1328C81.47-40.1328 81.3704-40.1331 81.3004-40.1211C80.8704-40.0531 80.5305-39.7171 80.4605-39.2891C80.4505-39.2121 80.4488-39.1196 80.4488-38.9336L80.4488-33.0391C80.4488-32.8531 80.4505-32.7606 80.4605-32.6836C80.5305-32.2556 80.8704-31.9196 81.3004-31.8516C81.3704-31.8396 81.47-31.8398 81.65-31.8398L87.5387-31.8398C87.7287-31.8398 87.82-31.8396 87.9-31.8516C88.33-31.9196 88.6601-32.2556 88.7301-32.6836C88.7401-32.7606 88.7399-32.8531 88.7399-33.0391L88.7399-38.9336C88.7399-39.1196 88.7401-39.2121 88.7301-39.2891C88.6601-39.7171 88.33-40.0531 87.9-40.1211C87.82-40.1331 87.7287-40.1328 87.5387-40.1328ZM31.9-31.8457L37.7887-31.8457C37.9687-31.8457 38.0702-31.844 38.1402-31.832C38.5702-31.764 38.9101-31.43 38.9801-31.002C38.9901-30.925 38.9899-30.8305 38.9899-30.6445L38.9899-24.752C38.9899-24.566 38.9901-24.4745 38.9801-24.3965C38.9101-23.9685 38.5702-23.6315 38.1402-23.5645C38.0702-23.5515 37.9687-23.5527 37.7887-23.5527L31.9-23.5527C31.71-23.5527 31.6187-23.5514 31.5387-23.5645C31.1087-23.6315 30.7805-23.9685 30.7105-24.3965C30.7005-24.4745 30.6988-24.566 30.6988-24.752L30.6988-30.6445C30.6988-30.8305 30.7005-30.925 30.7105-31.002C30.7805-31.43 31.1087-31.764 31.5387-31.832C31.6187-31.844 31.71-31.8457 31.9-31.8457ZM48.4801-31.8457L54.3687-31.8457C54.5587-31.8457 54.6501-31.844 54.7301-31.832C55.1601-31.764 55.4901-31.43 55.5601-31.002C55.5701-30.925 55.5699-30.8305 55.5699-30.6445L55.5699-24.752C55.5699-24.566 55.5702-24.4745 55.5601-24.3965C55.4901-23.9685 55.1601-23.6315 54.7301-23.5645C54.6501-23.5515 54.5587-23.5527 54.3687-23.5527L48.4801-23.5527C48.3001-23.5527 48.1987-23.5514 48.1187-23.5645C47.6987-23.6315 47.3587-23.9685 47.2887-24.3965C47.2787-24.4745 47.2789-24.566 47.2789-24.752L47.2789-30.6445C47.2789-30.8305 47.2786-30.925 47.2887-31.002C47.3587-31.43 47.6987-31.764 48.1187-31.832C48.1987-31.844 48.3001-31.8457 48.4801-31.8457ZM81.65-23.5469C81.47-23.5469 81.3704-23.5472 81.3004-23.5352C80.8704-23.4672 80.5305-23.1311 80.4605-22.7031C80.4505-22.6251 80.4488-22.5337 80.4488-22.3477L80.4488-16.4551C80.4488-16.2691 80.4505-16.1757 80.4605-16.0977C80.5305-15.6697 80.8704-15.3356 81.3004-15.2676C81.3704-15.2556 81.47-15.2559 81.65-15.2559L87.5387-15.2559C87.7287-15.2559 87.82-15.2556 87.9-15.2676C88.33-15.3356 88.6601-15.6697 88.7301-16.0977C88.7401-16.1757 88.7399-16.2691 88.7399-16.4551L88.7399-22.3477C88.7399-22.5337 88.7401-22.6251 88.7301-22.7031C88.6601-23.1311 88.33-23.4672 87.9-23.5352C87.82-23.5472 87.7287-23.5469 87.5387-23.5469ZM31.9-15.2598L37.7887-15.2598C37.9687-15.2598 38.0702-15.2591 38.1402-15.2461C38.5702-15.1781 38.9101-14.844 38.9801-14.416C38.9901-14.338 38.9899-14.2455 38.9899-14.0605L38.9899-8.16797C38.9899-7.98197 38.9901-7.88855 38.9801-7.81055C38.9101-7.38355 38.5702-7.04652 38.1402-6.97852C38.0702-6.96652 37.9687-6.9668 37.7887-6.9668L31.9-6.9668C31.71-6.9668 31.6187-6.96652 31.5387-6.97852C31.1087-7.04652 30.7805-7.38355 30.7105-7.81055C30.7005-7.88855 30.6988-7.98197 30.6988-8.16797L30.6988-14.0605C30.6988-14.2455 30.7005-14.338 30.7105-14.416C30.7805-14.844 31.1087-15.1781 31.5387-15.2461C31.6187-15.2591 31.71-15.2598 31.9-15.2598ZM48.4801-15.2598L54.3687-15.2598C54.5587-15.2598 54.6501-15.2591 54.7301-15.2461C55.1601-15.1781 55.4901-14.844 55.5601-14.416C55.5701-14.338 55.5699-14.2455 55.5699-14.0605L55.5699-8.16797C55.5699-7.98197 55.5702-7.88855 55.5601-7.81055C55.4901-7.38355 55.1601-7.04652 54.7301-6.97852C54.6501-6.96652 54.5587-6.9668 54.3687-6.9668L48.4801-6.9668C48.3001-6.9668 48.1987-6.96652 48.1187-6.97852C47.6987-7.04652 47.3587-7.38355 47.2887-7.81055C47.2787-7.88855 47.2789-7.98197 47.2789-8.16797L47.2789-14.0605C47.2789-14.2455 47.2786-14.338 47.2887-14.416C47.3587-14.844 47.6987-15.1781 48.1187-15.2461C48.1987-15.2591 48.3001-15.2598 48.4801-15.2598Z"/>
+  </g>
+  <g id="Medium-S" transform="matrix(1 0 0 1 1683.91 696)">
+   <path class="SFSymbolsPreviewWireframe" d="M31.9488-73.9922C31.0588-73.9932 30.1997-73.9942 29.4097-73.8691C25.1298-73.1911 21.7694-69.8356 21.0894-65.5566C20.9694-64.7676 20.9703-63.9006 20.9703-63.0156L20.9703-62.793L20.9703-9.19141L20.9703-8.96875C20.9703-8.08475 20.9694-7.21673 21.0894-6.42773C21.7694-2.14874 25.1298 1.20677 29.4097 1.88477C30.1997 2.00977 31.0588 2.00881 31.9488 2.00781L32.1695 2.00781L55.4703 2.00781L55.4703 2.17773L93.2301 2.17773L93.4703 2.17968C94.3303 2.18068 95.28 2.18096 96.15 2.04297C100.86 1.29797 104.55-2.39458 105.3-7.10157C105.44-7.97356 105.429-8.92216 105.429-9.78516L105.429-10.0215L105.429-45.3789L105.429-45.6133C105.429-46.4763 105.44-47.4268 105.3-48.2988C104.55-53.0058 100.86-56.6964 96.15-57.4414C95.28-57.5794 94.3303-57.5791 93.4703-57.5781L93.2301-57.5781L63.8004-57.5781L63.8004-62.793L63.8004-63.0156C63.8004-63.9006 63.7993-64.7676 63.6793-65.5566C62.9993-69.8356 59.639-73.1911 55.359-73.8691C54.569-73.9941 53.7099-73.9932 52.8199-73.9922L52.5992-73.9922L32.1695-73.9922ZM31.15-65.0156L37.0387-65.0156C37.2187-65.0156 37.3202-65.0169 37.3902-65.0039C37.8202-64.9369 38.1601-64.5999 38.2301-64.1719C38.2401-64.0939 38.2399-64.0014 38.2399-63.8164L38.2399-57.9238C38.2399-57.7378 38.2401-57.6434 38.2301-57.5664C38.1601-57.1384 37.8202-56.8024 37.3902-56.7344C37.3202-56.7224 37.2187-56.7227 37.0387-56.7227L31.15-56.7227C30.96-56.7227 30.8687-56.7224 30.7887-56.7344C30.3587-56.8024 30.0286-57.1384 29.9586-57.5664C29.9486-57.6434 29.9488-57.7378 29.9488-57.9238L29.9488-63.8164C29.9488-64.0014 29.9485-64.0939 29.9586-64.1719C30.0286-64.5999 30.3587-64.9369 30.7887-65.0039C30.8687-65.0169 30.96-65.0156 31.15-65.0156ZM47.7301-65.0156L53.6187-65.0156C53.8087-65.0156 53.9001-65.0169 53.9801-65.0039C54.4101-64.9369 54.7401-64.5999 54.8101-64.1719C54.8201-64.0939 54.8199-64.0014 54.8199-63.8164L54.8199-57.9238C54.8199-57.7378 54.8202-57.6434 54.8101-57.5664C54.7401-57.1384 54.4101-56.8024 53.9801-56.7344C53.9001-56.7224 53.8087-56.7227 53.6187-56.7227L47.7301-56.7227C47.5501-56.7227 47.4487-56.7224 47.3687-56.7344C46.9487-56.8024 46.6087-57.1384 46.5387-57.5664C46.5287-57.6434 46.5289-57.7378 46.5289-57.9238L46.5289-63.8164C46.5289-64.0014 46.5286-64.0939 46.5387-64.1719C46.6087-64.5999 46.9487-64.9369 47.3687-65.0039C47.4487-65.0169 47.5501-65.0156 47.7301-65.0156ZM31.15-48.4297L37.0387-48.4297C37.2187-48.4297 37.3202-48.43 37.3902-48.418C37.8202-48.35 38.1601-48.0159 38.2301-47.5879C38.2401-47.5099 38.2399-47.4165 38.2399-47.2305L38.2399-41.3379C38.2399-41.1519 38.2401-41.0585 38.2301-40.9805C38.1601-40.5525 37.8202-40.2184 37.3902-40.1504C37.3202-40.1384 37.2187-40.1387 37.0387-40.1387L31.15-40.1387C30.96-40.1387 30.8687-40.1384 30.7887-40.1504C30.3587-40.2184 30.0286-40.5525 29.9586-40.9805C29.9486-41.0585 29.9488-41.1519 29.9488-41.3379L29.9488-47.2305C29.9488-47.4165 29.9485-47.5099 29.9586-47.5879C30.0286-48.0159 30.3587-48.35 30.7887-48.418C30.8687-48.43 30.96-48.4297 31.15-48.4297ZM47.7301-48.4297L53.6187-48.4297C53.8087-48.4297 53.9001-48.43 53.9801-48.418C54.4101-48.35 54.7401-48.0159 54.8101-47.5879C54.8201-47.5099 54.8199-47.4165 54.8199-47.2305L54.8199-41.3379C54.8199-41.1519 54.8202-41.0585 54.8101-40.9805C54.7401-40.5525 54.4101-40.2184 53.9801-40.1504C53.9001-40.1384 53.8087-40.1387 53.6187-40.1387L47.7301-40.1387C47.5501-40.1387 47.4487-40.1384 47.3687-40.1504C46.9487-40.2184 46.6087-40.5525 46.5387-40.9805C46.5287-41.0585 46.5289-41.1519 46.5289-41.3379L46.5289-47.2305C46.5289-47.4165 46.5286-47.5099 46.5387-47.5879C46.6087-48.0159 46.9487-48.35 47.3687-48.418C47.4487-48.43 47.5501-48.4297 47.7301-48.4297ZM63.9703-47.5781L93.2301-47.5781C93.8201-47.5781 94.1597-47.5773 94.4097-47.5703C94.5297-47.5673 94.589-47.5625 94.609-47.5605C95.019-47.4855 95.3395-47.1668 95.4195-46.7578C95.4195-46.7328 95.4193-46.6697 95.4293-46.5527L95.4293-45.3789L95.4293-10.0215L95.4293-8.84568C95.4193-8.72868 95.4195-8.6666 95.4195-8.6406C95.3395-8.2326 95.019-7.91287 94.609-7.83787C94.589-7.83587 94.5297-7.8311 94.4097-7.8281C94.1597-7.8211 93.8201-7.82224 93.2301-7.82224L63.9703-7.82224L63.9703-15.2558L70.2086-15.2558C70.3886-15.2558 70.4899-15.2556 70.5699-15.2676C70.9899-15.3356 71.33-15.6696 71.4-16.0976C71.41-16.1756 71.4098-16.2691 71.4098-16.4551L71.4098-22.3476C71.4098-22.5336 71.41-22.6251 71.4-22.7031C71.33-23.1311 70.9899-23.4671 70.5699-23.5351C70.4899-23.5471 70.3886-23.5468 70.2086-23.5468L63.9703-23.5468L63.9703-31.8398L70.2086-31.8398C70.3886-31.8398 70.4899-31.8395 70.5699-31.8515C70.9899-31.9195 71.33-32.2556 71.4-32.6836C71.41-32.7606 71.4098-32.853 71.4098-33.039L71.4098-38.9336C71.4098-39.1196 71.41-39.212 71.4-39.289C71.33-39.717 70.9899-40.0531 70.5699-40.1211C70.4899-40.1331 70.3886-40.1328 70.2086-40.1328L63.9703-40.1328ZM80.9-40.1328C80.72-40.1328 80.6204-40.1331 80.5504-40.1211C80.1204-40.0531 79.7786-39.7171 79.7086-39.2891C79.6986-39.2121 79.6988-39.1196 79.6988-38.9336L79.6988-33.0391C79.6988-32.8531 79.6985-32.7606 79.7086-32.6836C79.7786-32.2556 80.1204-31.9196 80.5504-31.8516C80.6204-31.8396 80.72-31.8398 80.9-31.8398L86.7887-31.8398C86.9787-31.8398 87.07-31.8396 87.15-31.8516C87.58-31.9196 87.9101-32.2556 87.9801-32.6836C87.9901-32.7606 87.9899-32.8531 87.9899-33.0391L87.9899-38.9336C87.9899-39.1196 87.9901-39.2121 87.9801-39.2891C87.9101-39.7171 87.58-40.0531 87.15-40.1211C87.07-40.1331 86.9787-40.1328 86.7887-40.1328ZM31.15-31.8457L37.0387-31.8457C37.2187-31.8457 37.3202-31.844 37.3902-31.832C37.8202-31.764 38.1601-31.43 38.2301-31.002C38.2401-30.925 38.2399-30.8305 38.2399-30.6445L38.2399-24.752C38.2399-24.566 38.2401-24.4745 38.2301-24.3965C38.1601-23.9685 37.8202-23.6315 37.3902-23.5645C37.3202-23.5515 37.2187-23.5527 37.0387-23.5527L31.15-23.5527C30.96-23.5527 30.8687-23.5514 30.7887-23.5645C30.3587-23.6315 30.0286-23.9685 29.9586-24.3965C29.9486-24.4745 29.9488-24.566 29.9488-24.752L29.9488-30.6445C29.9488-30.8305 29.9485-30.925 29.9586-31.002C30.0286-31.43 30.3587-31.764 30.7887-31.832C30.8687-31.844 30.96-31.8457 31.15-31.8457ZM47.7301-31.8457L53.6187-31.8457C53.8087-31.8457 53.9001-31.844 53.9801-31.832C54.4101-31.764 54.7401-31.43 54.8101-31.002C54.8201-30.925 54.8199-30.8305 54.8199-30.6445L54.8199-24.752C54.8199-24.566 54.8202-24.4745 54.8101-24.3965C54.7401-23.9685 54.4101-23.6315 53.9801-23.5645C53.9001-23.5515 53.8087-23.5527 53.6187-23.5527L47.7301-23.5527C47.5501-23.5527 47.4487-23.5514 47.3687-23.5645C46.9487-23.6315 46.6087-23.9685 46.5387-24.3965C46.5287-24.4745 46.5289-24.566 46.5289-24.752L46.5289-30.6445C46.5289-30.8305 46.5286-30.925 46.5387-31.002C46.6087-31.43 46.9487-31.764 47.3687-31.832C47.4487-31.844 47.5501-31.8457 47.7301-31.8457ZM80.9-23.5469C80.72-23.5469 80.6204-23.5472 80.5504-23.5352C80.1204-23.4672 79.7786-23.1311 79.7086-22.7031C79.6986-22.6251 79.6988-22.5337 79.6988-22.3477L79.6988-16.4551C79.6988-16.2691 79.6985-16.1757 79.7086-16.0977C79.7786-15.6697 80.1204-15.3356 80.5504-15.2676C80.6204-15.2556 80.72-15.2559 80.9-15.2559L86.7887-15.2559C86.9787-15.2559 87.07-15.2556 87.15-15.2676C87.58-15.3356 87.9101-15.6697 87.9801-16.0977C87.9901-16.1757 87.9899-16.2691 87.9899-16.4551L87.9899-22.3477C87.9899-22.5337 87.9901-22.6251 87.9801-22.7031C87.9101-23.1311 87.58-23.4672 87.15-23.5352C87.07-23.5472 86.9787-23.5469 86.7887-23.5469ZM31.15-15.2598L37.0387-15.2598C37.2187-15.2598 37.3202-15.2591 37.3902-15.2461C37.8202-15.1781 38.1601-14.844 38.2301-14.416C38.2401-14.338 38.2399-14.2455 38.2399-14.0605L38.2399-8.16797C38.2399-7.98197 38.2401-7.88855 38.2301-7.81055C38.1601-7.38355 37.8202-7.04652 37.3902-6.97852C37.3202-6.96652 37.2187-6.9668 37.0387-6.9668L31.15-6.9668C30.96-6.9668 30.8687-6.96652 30.7887-6.97852C30.3587-7.04652 30.0286-7.38355 29.9586-7.81055C29.9486-7.88855 29.9488-7.98197 29.9488-8.16797L29.9488-14.0605C29.9488-14.2455 29.9485-14.338 29.9586-14.416C30.0286-14.844 30.3587-15.1781 30.7887-15.2461C30.8687-15.2591 30.96-15.2598 31.15-15.2598ZM47.7301-15.2598L53.6187-15.2598C53.8087-15.2598 53.9001-15.2591 53.9801-15.2461C54.4101-15.1781 54.7401-14.844 54.8101-14.416C54.8201-14.338 54.8199-14.2455 54.8199-14.0605L54.8199-8.16797C54.8199-7.98197 54.8202-7.88855 54.8101-7.81055C54.7401-7.38355 54.4101-7.04652 53.9801-6.97852C53.9001-6.96652 53.8087-6.9668 53.6187-6.9668L47.7301-6.9668C47.5501-6.9668 47.4487-6.96652 47.3687-6.97852C46.9487-7.04652 46.6087-7.38355 46.5387-7.81055C46.5287-7.88855 46.5289-7.98197 46.5289-8.16797L46.5289-14.0605C46.5289-14.2455 46.5286-14.338 46.5387-14.416C46.6087-14.844 46.9487-15.1781 47.3687-15.2461C47.4487-15.2591 47.5501-15.2598 47.7301-15.2598Z"/>
+  </g>
+  <g id="Regular-S" transform="matrix(1 0 0 1 1387.01 696)">
+   <path class="SFSymbolsPreviewWireframe" d="M32.439-74.5C31.559-74.501 30.6597-74.5011 29.8297-74.3691C25.3297-73.6581 21.8092-70.1356 21.0992-65.6426C20.9692-64.8116 20.9703-63.9042 20.9703-63.0312L20.9703-62.8008L20.9703-10.1992L20.9703-9.96875C20.9703-9.09575 20.9692-8.18842 21.0992-7.35742C21.8092-2.86443 25.3297 0.660095 29.8297 1.37109C30.6597 1.50309 31.559 1.50295 32.439 1.50195L32.6695 1.5L55.8004 1.5L64.8004 1.5L94.0992 1.5L94.3297 1.50195C95.1997 1.50295 96.109 1.50309 96.939 1.37109C101.439 0.660092 104.96-2.86443 105.67-7.35743C105.8-8.18842 105.8-9.09475 105.8-9.96875L105.8-10.1992L105.8-45.8008L105.8-46.0313C105.8-46.9043 105.8-47.8116 105.67-48.6426C104.96-53.1356 101.439-56.6581 96.939-57.3691C96.109-57.5011 95.1997-57.501 94.3297-57.5L94.0992-57.5L64.8004-57.5L64.8004-62.8008L64.8004-63.0312C64.8004-63.9042 64.7995-64.8116 64.6695-65.6426C63.9595-70.1356 60.429-73.6581 55.939-74.3691C55.109-74.5011 54.1997-74.501 53.3297-74.5L53.0992-74.5L32.6695-74.5ZM31.6402-65.0234L37.5406-65.0234C37.7206-65.0234 37.8202-65.0237 37.8902-65.0117C38.3202-64.9437 38.6603-64.6077 38.7203-64.1797C38.7403-64.1017 38.7398-64.0083 38.7398-63.8223L38.7398-57.9316C38.7398-57.7456 38.7403-57.6522 38.7203-57.5742C38.6603-57.1462 38.3202-56.8102 37.8902-56.7422C37.8202-56.7302 37.7206-56.7305 37.5406-56.7305L31.6402-56.7305C31.4602-56.7305 31.3706-56.7302 31.2906-56.7422C30.8606-56.8102 30.5205-57.1462 30.4605-57.5742C30.4405-57.6522 30.439-57.7456 30.439-57.9316L30.439-63.8223C30.439-64.0083 30.4405-64.1017 30.4605-64.1797C30.5205-64.6077 30.8606-64.9437 31.2906-65.0117C31.3706-65.0237 31.4602-65.0234 31.6402-65.0234ZM48.2301-65.0234L54.1207-65.0234C54.3107-65.0234 54.4001-65.0237 54.4801-65.0117C54.9101-64.9437 55.2401-64.6077 55.3101-64.1797C55.3201-64.1017 55.3199-64.0083 55.3199-63.8223L55.3199-57.9316C55.3199-57.7456 55.3202-57.6522 55.3101-57.5742C55.2401-57.1462 54.9101-56.8102 54.4801-56.7422C54.4001-56.7302 54.3107-56.7305 54.1207-56.7305L48.2301-56.7305C48.0401-56.7305 47.9507-56.7302 47.8707-56.7422C47.4507-56.8102 47.1106-57.1462 47.0406-57.5742C47.0306-57.6522 47.0289-57.7456 47.0289-57.9316L47.0289-63.8223C47.0289-64.0083 47.0306-64.1017 47.0406-64.1797C47.1106-64.6077 47.4507-64.9437 47.8707-65.0117C47.9507-65.0237 48.0401-65.0234 48.2301-65.0234ZM64.8004-48.5L94.0992-48.5C94.6792-48.5 95.0306-48.4992 95.2906-48.4922C95.4606-48.4882 95.5306-48.4815 95.5406-48.4805C96.1806-48.3755 96.6789-47.8782 96.7789-47.2442C96.7789-47.2272 96.7906-47.1543 96.7906-46.9883C96.8006-46.7273 96.8004-46.3818 96.8004-45.8008L96.8004-10.1992C96.8004-9.61723 96.8006-9.27078 96.7906-9.00978C96.7906-8.84478 96.7789-8.77387 96.7789-8.75587C96.6789-8.12187 96.1806-7.62354 95.5406-7.51954C95.5306-7.51754 95.4606-7.51282 95.2906-7.50782C95.0306-7.50082 94.6792-7.50001 94.0992-7.50001L64.8004-7.50001L64.8004-15.2637L70.7105-15.2637C70.8905-15.2637 70.9901-15.2634 71.0601-15.2754C71.4901-15.3434 71.83-15.6775 71.9-16.1055C71.91-16.1835 71.9098-16.2769 71.9098-16.4629L71.9098-22.3555C71.9098-22.5415 71.91-22.6349 71.9-22.7129C71.83-23.1409 71.4901-23.475 71.0601-23.543C70.9901-23.555 70.8905-23.5547 70.7105-23.5547L64.8004-23.5547L64.8004-31.8477L70.7105-31.8477C70.8905-31.8477 70.9901-31.8474 71.0601-31.8594C71.4901-31.9274 71.83-32.2634 71.9-32.6914C71.91-32.7684 71.9098-32.8628 71.9098-33.0488L71.9098-38.9414C71.9098-39.1264 71.91-39.2189 71.9-39.2969C71.83-39.7249 71.4901-40.0619 71.0601-40.1289C70.9901-40.1419 70.8905-40.1406 70.7105-40.1406L64.8004-40.1406ZM31.6402-48.4375L37.5406-48.4375C37.7206-48.4375 37.8202-48.4378 37.8902-48.4258C38.3202-48.3578 38.6603-48.0227 38.7203-47.5957C38.7403-47.5177 38.7398-47.4243 38.7398-47.2383L38.7398-41.3457C38.7398-41.1607 38.7403-41.0663 38.7203-40.9883C38.6603-40.5603 38.3202-40.2252 37.8902-40.1582C37.8202-40.1452 37.7206-40.1445 37.5406-40.1445L31.6402-40.1445C31.4602-40.1445 31.3706-40.1452 31.2906-40.1582C30.8606-40.2252 30.5205-40.5603 30.4605-40.9883C30.4405-41.0663 30.439-41.1607 30.439-41.3457L30.439-47.2383C30.439-47.4243 30.4405-47.5177 30.4605-47.5957C30.5205-48.0227 30.8606-48.3578 31.2906-48.4258C31.3706-48.4378 31.4602-48.4375 31.6402-48.4375ZM48.2301-48.4375L54.1207-48.4375C54.3107-48.4375 54.4001-48.4378 54.4801-48.4258C54.9101-48.3578 55.2401-48.0227 55.3101-47.5957C55.3201-47.5177 55.3199-47.4243 55.3199-47.2383L55.3199-41.3457C55.3199-41.1607 55.3202-41.0663 55.3101-40.9883C55.2401-40.5603 54.9101-40.2252 54.4801-40.1582C54.4001-40.1452 54.3107-40.1445 54.1207-40.1445L48.2301-40.1445C48.0401-40.1445 47.9507-40.1452 47.8707-40.1582C47.4507-40.2252 47.1106-40.5603 47.0406-40.9883C47.0306-41.0663 47.0289-41.1607 47.0289-41.3457L47.0289-47.2383C47.0289-47.4243 47.0306-47.5177 47.0406-47.5957C47.1106-48.0227 47.4507-48.3578 47.8707-48.4258C47.9507-48.4378 48.0401-48.4375 48.2301-48.4375ZM81.4-40.1406C81.21-40.1406 81.1206-40.1419 81.0406-40.1289C80.6206-40.0619 80.2805-39.7249 80.2105-39.2969C80.2005-39.2189 80.2007-39.1264 80.2007-38.9414L80.2007-33.0488C80.2007-32.8628 80.2005-32.7684 80.2105-32.6914C80.2805-32.2634 80.6206-31.9274 81.0406-31.8594C81.1206-31.8474 81.21-31.8477 81.4-31.8477L87.2906-31.8477C87.4806-31.8477 87.57-31.8474 87.65-31.8594C88.08-31.9274 88.4101-32.2634 88.4801-32.6914C88.4901-32.7684 88.4899-32.8628 88.4899-33.0488L88.4899-38.9414C88.4899-39.1264 88.4901-39.2189 88.4801-39.2969C88.4101-39.7249 88.08-40.0619 87.65-40.1289C87.57-40.1419 87.4806-40.1406 87.2906-40.1406ZM31.6402-31.8535L37.5406-31.8535C37.7206-31.8535 37.8202-31.8528 37.8902-31.8398C38.3202-31.7728 38.6603-31.4378 38.7203-31.0098C38.7403-30.9318 38.7398-30.8383 38.7398-30.6523L38.7398-24.7598C38.7398-24.5738 38.7403-24.4813 38.7203-24.4043C38.6603-23.9763 38.3202-23.6403 37.8902-23.5723C37.8202-23.5603 37.7206-23.5605 37.5406-23.5605L31.6402-23.5605C31.4602-23.5605 31.3706-23.5603 31.2906-23.5723C30.8606-23.6403 30.5205-23.9763 30.4605-24.4043C30.4405-24.4813 30.439-24.5738 30.439-24.7598L30.439-30.6523C30.439-30.8383 30.4405-30.9318 30.4605-31.0098C30.5205-31.4378 30.8606-31.7728 31.2906-31.8398C31.3706-31.8528 31.4602-31.8535 31.6402-31.8535ZM48.2301-31.8535L54.1207-31.8535C54.3107-31.8535 54.4001-31.8528 54.4801-31.8398C54.9101-31.7728 55.2401-31.4378 55.3101-31.0098C55.3201-30.9318 55.3199-30.8383 55.3199-30.6523L55.3199-24.7598C55.3199-24.5738 55.3202-24.4813 55.3101-24.4043C55.2401-23.9763 54.9101-23.6403 54.4801-23.5723C54.4001-23.5603 54.3107-23.5605 54.1207-23.5605L48.2301-23.5605C48.0401-23.5605 47.9507-23.5603 47.8707-23.5723C47.4507-23.6403 47.1106-23.9763 47.0406-24.4043C47.0306-24.4813 47.0289-24.5738 47.0289-24.7598L47.0289-30.6523C47.0289-30.8383 47.0306-30.9318 47.0406-31.0098C47.1106-31.4378 47.4507-31.7728 47.8707-31.8398C47.9507-31.8528 48.0401-31.8535 48.2301-31.8535ZM81.4-23.5547C81.21-23.5547 81.1206-23.555 81.0406-23.543C80.6206-23.475 80.2805-23.1409 80.2105-22.7129C80.2005-22.6349 80.2007-22.5415 80.2007-22.3555L80.2007-16.4629C80.2007-16.2769 80.2005-16.1835 80.2105-16.1055C80.2805-15.6775 80.6206-15.3434 81.0406-15.2754C81.1206-15.2634 81.21-15.2637 81.4-15.2637L87.2906-15.2637C87.4806-15.2637 87.57-15.2634 87.65-15.2754C88.08-15.3434 88.4101-15.6775 88.4801-16.1055C88.4901-16.1835 88.4899-16.2769 88.4899-16.4629L88.4899-22.3555C88.4899-22.5415 88.4901-22.6349 88.4801-22.7129C88.4101-23.1409 88.08-23.475 87.65-23.543C87.57-23.555 87.4806-23.5547 87.2906-23.5547ZM31.6402-15.2676L37.5406-15.2676C37.7206-15.2676 37.8202-15.2679 37.8902-15.2559C38.3202-15.1879 38.6603-14.8518 38.7203-14.4238C38.7403-14.3458 38.7398-14.2524 38.7398-14.0664L38.7398-8.17578C38.7398-7.98978 38.7403-7.89636 38.7203-7.81836C38.6603-7.39036 38.3202-7.05433 37.8902-6.98633C37.8202-6.97433 37.7206-6.97461 37.5406-6.97461L31.6402-6.97461C31.4602-6.97461 31.3706-6.97433 31.2906-6.98633C30.8606-7.05433 30.5205-7.39036 30.4605-7.81836C30.4405-7.89636 30.439-7.98978 30.439-8.17578L30.439-14.0664C30.439-14.2524 30.4405-14.3458 30.4605-14.4238C30.5205-14.8518 30.8606-15.1879 31.2906-15.2559C31.3706-15.2679 31.4602-15.2676 31.6402-15.2676ZM48.2301-15.2676L54.1207-15.2676C54.3107-15.2676 54.4001-15.2679 54.4801-15.2559C54.9101-15.1879 55.2401-14.8518 55.3101-14.4238C55.3201-14.3458 55.3199-14.2524 55.3199-14.0664L55.3199-8.17578C55.3199-7.98978 55.3202-7.89636 55.3101-7.81836C55.2401-7.39036 54.9101-7.05433 54.4801-6.98633C54.4001-6.97433 54.3107-6.97461 54.1207-6.97461L48.2301-6.97461C48.0401-6.97461 47.9507-6.97433 47.8707-6.98633C47.4507-7.05433 47.1106-7.39036 47.0406-7.81836C47.0306-7.89636 47.0289-7.98978 47.0289-8.17578L47.0289-14.0664C47.0289-14.2524 47.0306-14.3458 47.0406-14.4238C47.1106-14.8518 47.4507-15.1879 47.8707-15.2559C47.9507-15.2679 48.0401-15.2676 48.2301-15.2676Z"/>
+  </g>
+  <g id="Light-S" transform="matrix(1 0 0 1 1090.55 696)">
+   <path class="SFSymbolsPreviewWireframe" d="M32.441-74.5C31.571-74.501 30.6616-74.5011 29.8316-74.3691C25.3316-73.6581 21.8111-70.1356 21.1012-65.6426C20.9712-64.8116 20.9703-63.9042 20.9703-63.0312L20.9703-62.8008L20.9703-10.1992L20.9703-9.96875C20.9703-9.09575 20.9712-8.18842 21.1012-7.35742C21.8111-2.86443 25.3316 0.660095 29.8316 1.37109C30.6616 1.50309 31.571 1.50295 32.441 1.50195L32.6715 1.5L64.8004 1.5L94.1012 1.5L94.3316 1.5C95.2116 1.501 96.0807 1.50195 96.8707 1.37695C101.151 0.698955 104.501-2.65656 105.181-6.93555C105.301-7.72555 105.3-8.59156 105.3-9.47656L105.3-9.69922L105.3-45.3008L105.3-45.5234C105.3-46.4084 105.301-47.2755 105.181-48.0645C104.501-52.3434 101.151-55.699 96.8707-56.377C96.0807-56.502 95.2116-56.501 94.3316-56.5L94.1012-56.5L64.8004-56.5L64.8004-62.8008L64.8004-63.0312C64.8004-63.9042 64.8015-64.8116 64.6715-65.6426C63.9615-70.1356 60.431-73.6581 55.941-74.3691C55.111-74.5011 54.2016-74.501 53.3316-74.5L53.1012-74.5L32.6715-74.5ZM31.65-65.0234L37.5406-65.0234C37.7206-65.0234 37.8202-65.0237 37.8902-65.0117C38.3202-64.9437 38.6601-64.6077 38.7301-64.1797C38.7401-64.1017 38.7399-64.0083 38.7399-63.8223L38.7399-57.9316C38.7399-57.7456 38.7401-57.6522 38.7301-57.5742C38.6601-57.1462 38.3202-56.8102 37.8902-56.7422C37.8202-56.7302 37.7206-56.7305 37.5406-56.7305L31.65-56.7305C31.46-56.7305 31.3706-56.7302 31.2906-56.7422C30.8606-56.8102 30.5305-57.1462 30.4605-57.5742C30.4505-57.6522 30.4507-57.7456 30.4507-57.9316L30.4507-63.8223C30.4507-64.0083 30.4505-64.1017 30.4605-64.1797C30.5305-64.6077 30.8606-64.9437 31.2906-65.0117C31.3706-65.0237 31.46-65.0234 31.65-65.0234ZM48.2301-65.0234L54.1207-65.0234C54.3107-65.0234 54.4001-65.0237 54.4801-65.0117C54.9101-64.9437 55.2401-64.6077 55.3101-64.1797C55.3201-64.1017 55.3199-64.0083 55.3199-63.8223L55.3199-57.9316C55.3199-57.7456 55.3202-57.6522 55.3101-57.5742C55.2401-57.1462 54.9101-56.8102 54.4801-56.7422C54.4001-56.7302 54.3107-56.7305 54.1207-56.7305L48.2301-56.7305C48.0501-56.7305 47.9507-56.7302 47.8707-56.7422C47.4507-56.8102 47.1106-57.1462 47.0406-57.5742C47.0306-57.6522 47.0308-57.7456 47.0308-57.9316L47.0308-63.8223C47.0308-64.0083 47.0306-64.1017 47.0406-64.1797C47.1106-64.6077 47.4507-64.9437 47.8707-65.0117C47.9507-65.0237 48.0501-65.0234 48.2301-65.0234ZM64.8004-48.5L94.1012-48.5C94.6811-48.5 95.0404-48.4992 95.3004-48.4922C95.5304-48.4862 95.6109-48.4756 95.6109-48.4746C96.4709-48.3386 97.1408-47.6695 97.2808-46.8145L97.2808-46.8125C97.2808-46.8035 97.2906-46.7289 97.2906-46.5039C97.3006-46.2339 97.3004-45.8797 97.3004-45.3007L97.3004-9.69918C97.3004-9.12018 97.3007-8.76506 97.2906-8.49606C97.2906-8.27006 97.2808-8.19546 97.2808-8.18746C97.1408-7.33147 96.4709-6.6594 95.6109-6.5234C95.6109-6.5224 95.5304-6.51477 95.3004-6.50778C95.0404-6.50078 94.6811-6.49997 94.1012-6.49997L64.8004-6.49997L64.8004-15.2636L70.7105-15.2636C70.8905-15.2636 70.9899-15.2634 71.0699-15.2754C71.4899-15.3434 71.83-15.6774 71.9-16.1054C71.91-16.1834 71.9117-16.2769 71.9117-16.4629L71.9117-22.3554C71.9117-22.5414 71.91-22.6349 71.9-22.7129C71.83-23.1409 71.4899-23.4749 71.0699-23.5429C70.9899-23.5549 70.8905-23.5547 70.7105-23.5547L64.8004-23.5547L64.8004-31.8476L70.7105-31.8476C70.8905-31.8476 70.9899-31.8473 71.0699-31.8593C71.4899-31.9273 71.83-32.2634 71.9-32.6914C71.91-32.7684 71.9117-32.8628 71.9117-33.0488L71.9117-38.9414C71.9117-39.1264 71.91-39.2188 71.9-39.2968C71.83-39.7248 71.4899-40.0619 71.0699-40.1289C70.9899-40.1419 70.8905-40.1406 70.7105-40.1406L64.8004-40.1406ZM31.65-48.4375L37.5406-48.4375C37.7206-48.4375 37.8202-48.4378 37.8902-48.4258C38.3202-48.3578 38.6601-48.0227 38.7301-47.5957C38.7401-47.5177 38.7399-47.4243 38.7399-47.2383L38.7399-41.3457C38.7399-41.1607 38.7401-41.0663 38.7301-40.9883C38.6601-40.5603 38.3202-40.2252 37.8902-40.1582C37.8202-40.1452 37.7206-40.1445 37.5406-40.1445L31.65-40.1445C31.46-40.1445 31.3706-40.1452 31.2906-40.1582C30.8606-40.2252 30.5305-40.5603 30.4605-40.9883C30.4505-41.0663 30.4507-41.1607 30.4507-41.3457L30.4507-47.2383C30.4507-47.4243 30.4505-47.5177 30.4605-47.5957C30.5305-48.0227 30.8606-48.3578 31.2906-48.4258C31.3706-48.4378 31.46-48.4375 31.65-48.4375ZM48.2301-48.4375L54.1207-48.4375C54.3107-48.4375 54.4001-48.4378 54.4801-48.4258C54.9101-48.3578 55.2401-48.0227 55.3101-47.5957C55.3201-47.5177 55.3199-47.4243 55.3199-47.2383L55.3199-41.3457C55.3199-41.1607 55.3202-41.0663 55.3101-40.9883C55.2401-40.5603 54.9101-40.2252 54.4801-40.1582C54.4001-40.1452 54.3107-40.1445 54.1207-40.1445L48.2301-40.1445C48.0501-40.1445 47.9507-40.1452 47.8707-40.1582C47.4507-40.2252 47.1106-40.5603 47.0406-40.9883C47.0306-41.0663 47.0308-41.1607 47.0308-41.3457L47.0308-47.2383C47.0308-47.4243 47.0306-47.5177 47.0406-47.5957C47.1106-48.0227 47.4507-48.3578 47.8707-48.4258C47.9507-48.4378 48.0501-48.4375 48.2301-48.4375ZM81.4-40.1406C81.22-40.1406 81.1204-40.1419 81.0504-40.1289C80.6204-40.0619 80.2805-39.7249 80.2105-39.2969C80.2005-39.2189 80.2007-39.1264 80.2007-38.9414L80.2007-33.0488C80.2007-32.8628 80.2005-32.7684 80.2105-32.6914C80.2805-32.2634 80.6204-31.9274 81.0504-31.8594C81.1204-31.8474 81.22-31.8477 81.4-31.8477L87.2906-31.8477C87.4806-31.8477 87.57-31.8474 87.65-31.8594C88.08-31.9274 88.4101-32.2634 88.4801-32.6914C88.4901-32.7684 88.4899-32.8628 88.4899-33.0488L88.4899-38.9414C88.4899-39.1264 88.4901-39.2189 88.4801-39.2969C88.4101-39.7249 88.08-40.0619 87.65-40.1289C87.57-40.1419 87.4806-40.1406 87.2906-40.1406ZM31.65-31.8535L37.5406-31.8535C37.7206-31.8535 37.8202-31.8528 37.8902-31.8398C38.3202-31.7728 38.6601-31.4378 38.7301-31.0098C38.7401-30.9318 38.7399-30.8383 38.7399-30.6523L38.7399-24.7598C38.7399-24.5738 38.7401-24.4813 38.7301-24.4043C38.6601-23.9763 38.3202-23.6403 37.8902-23.5723C37.8202-23.5603 37.7206-23.5605 37.5406-23.5605L31.65-23.5605C31.46-23.5605 31.3706-23.5603 31.2906-23.5723C30.8606-23.6403 30.5305-23.9763 30.4605-24.4043C30.4505-24.4813 30.4507-24.5738 30.4507-24.7598L30.4507-30.6523C30.4507-30.8383 30.4505-30.9318 30.4605-31.0098C30.5305-31.4378 30.8606-31.7728 31.2906-31.8398C31.3706-31.8528 31.46-31.8535 31.65-31.8535ZM48.2301-31.8535L54.1207-31.8535C54.3107-31.8535 54.4001-31.8528 54.4801-31.8398C54.9101-31.7728 55.2401-31.4378 55.3101-31.0098C55.3201-30.9318 55.3199-30.8383 55.3199-30.6523L55.3199-24.7598C55.3199-24.5738 55.3202-24.4813 55.3101-24.4043C55.2401-23.9763 54.9101-23.6403 54.4801-23.5723C54.4001-23.5603 54.3107-23.5605 54.1207-23.5605L48.2301-23.5605C48.0501-23.5605 47.9507-23.5603 47.8707-23.5723C47.4507-23.6403 47.1106-23.9763 47.0406-24.4043C47.0306-24.4813 47.0308-24.5738 47.0308-24.7598L47.0308-30.6523C47.0308-30.8383 47.0306-30.9318 47.0406-31.0098C47.1106-31.4378 47.4507-31.7728 47.8707-31.8398C47.9507-31.8528 48.0501-31.8535 48.2301-31.8535ZM81.4-23.5547C81.22-23.5547 81.1204-23.555 81.0504-23.543C80.6204-23.475 80.2805-23.1409 80.2105-22.7129C80.2005-22.6349 80.2007-22.5415 80.2007-22.3555L80.2007-16.4629C80.2007-16.2769 80.2005-16.1835 80.2105-16.1055C80.2805-15.6775 80.6204-15.3434 81.0504-15.2754C81.1204-15.2634 81.22-15.2637 81.4-15.2637L87.2906-15.2637C87.4806-15.2637 87.57-15.2634 87.65-15.2754C88.08-15.3434 88.4101-15.6775 88.4801-16.1055C88.4901-16.1835 88.4899-16.2769 88.4899-16.4629L88.4899-22.3555C88.4899-22.5415 88.4901-22.6349 88.4801-22.7129C88.4101-23.1409 88.08-23.475 87.65-23.543C87.57-23.555 87.4806-23.5547 87.2906-23.5547ZM31.65-15.2676L37.5406-15.2676C37.7206-15.2676 37.8202-15.2679 37.8902-15.2559C38.3202-15.1879 38.6601-14.8518 38.7301-14.4238C38.7401-14.3458 38.7399-14.2524 38.7399-14.0664L38.7399-8.17578C38.7399-7.98978 38.7401-7.89636 38.7301-7.81836C38.6601-7.39036 38.3202-7.05433 37.8902-6.98633C37.8202-6.97433 37.7206-6.97461 37.5406-6.97461L31.65-6.97461C31.46-6.97461 31.3706-6.97433 31.2906-6.98633C30.8606-7.05433 30.5305-7.39036 30.4605-7.81836C30.4505-7.89636 30.4507-7.98978 30.4507-8.17578L30.4507-14.0664C30.4507-14.2524 30.4505-14.3458 30.4605-14.4238C30.5305-14.8518 30.8606-15.1879 31.2906-15.2559C31.3706-15.2679 31.46-15.2676 31.65-15.2676ZM48.2301-15.2676L54.1207-15.2676C54.3107-15.2676 54.4001-15.2679 54.4801-15.2559C54.9101-15.1879 55.2401-14.8518 55.3101-14.4238C55.3201-14.3458 55.3199-14.2524 55.3199-14.0664L55.3199-8.17578C55.3199-7.98978 55.3202-7.89636 55.3101-7.81836C55.2401-7.39036 54.9101-7.05433 54.4801-6.98633C54.4001-6.97433 54.3107-6.97461 54.1207-6.97461L48.2301-6.97461C48.0501-6.97461 47.9507-6.97433 47.8707-6.98633C47.4507-7.05433 47.1106-7.39036 47.0406-7.81836C47.0306-7.89636 47.0308-7.98978 47.0308-8.17578L47.0308-14.0664C47.0308-14.2524 47.0306-14.3458 47.0406-14.4238C47.1106-14.8518 47.4507-15.1879 47.8707-15.2559C47.9507-15.2679 48.0501-15.2676 48.2301-15.2676Z"/>
+  </g>
+  <g id="Thin-S" transform="matrix(1 0 0 1 795.007 696)">
+   <path class="SFSymbolsPreviewWireframe" d="M32.4392-75.4922C31.5662-75.4932 30.6589-75.4943 29.8279-75.3633C25.3349-74.6513 21.8114-71.1278 21.0994-66.6348C20.9684-65.8048 20.9695-64.8964 20.9705-64.0234L20.9705-63.793L20.9705-11.1914L20.9705-10.9609C20.9695-10.0879 20.9684-9.18061 21.0994-8.34961C21.8114-3.85662 25.3349-0.333092 29.8279 0.378906C30.6589 0.510906 31.5662 0.508812 32.4392 0.507812L32.6716 0.507812L64.8005 0.507812L93.2712 0.507812L93.4568 0.507812C94.3878 0.507812 95.1345 0.508344 95.8005 0.402344C99.4375-0.173655 102.289-3.02512 102.865-6.66211C102.971-7.32811 102.97-8.07581 102.97-9.00781L102.97-9.19141L102.97-46.793L102.97-46.9766L102.97-46.9786C102.97-47.9106 102.971-48.6563 102.865-49.3223C102.289-52.9593 99.4375-55.8108 95.8005-56.3868C95.1335-56.4928 94.3888-56.4932 93.4568-56.4922L93.2712-56.4922L64.8005-56.4922L64.8005-63.793L64.8005-64.0235C64.8015-64.8965 64.8026-65.8048 64.6716-66.6348C63.9596-71.1278 60.4361-74.6513 55.9431-75.3633C55.1121-75.4943 54.2048-75.4932 53.3318-75.4922L53.0994-75.4922L32.6716-75.4922ZM31.6462-66.0156L37.5388-66.0156C37.7248-66.0156 37.8182-66.0169 37.8962-66.0039C38.3242-65.9369 38.6583-65.5999 38.7263-65.1719C38.7383-65.0939 38.74-65.0014 38.74-64.8164L38.74-58.9238C38.74-58.7378 38.7383-58.6434 38.7263-58.5664C38.6583-58.1384 38.3242-57.8024 37.8962-57.7344C37.8182-57.7224 37.7248-57.7227 37.5388-57.7227L31.6462-57.7227C31.4602-57.7227 31.3688-57.7224 31.2908-57.7344C30.8628-57.8024 30.5267-58.1384 30.4587-58.5664C30.4467-58.6434 30.447-58.7378 30.447-58.9238L30.447-64.8164C30.447-65.0014 30.4467-65.0939 30.4587-65.1719C30.5267-65.5999 30.8628-65.9369 31.2908-66.0039C31.3688-66.0169 31.4602-66.0156 31.6462-66.0156ZM48.2322-66.0156L54.1248-66.0156C54.3098-66.0156 54.4022-66.0169 54.4802-66.0039C54.9082-65.9369 55.2453-65.5999 55.3123-65.1719C55.3253-65.0939 55.3259-65.0014 55.3259-64.8164L55.3259-58.9238C55.3259-58.7378 55.3253-58.6434 55.3123-58.5664C55.2453-58.1384 54.9082-57.8024 54.4802-57.7344C54.4022-57.7224 54.3098-57.7227 54.1248-57.7227L48.2322-57.7227C48.0462-57.7227 47.9537-57.7224 47.8767-57.7344C47.4487-57.8024 47.1127-58.1384 47.0447-58.5664C47.0327-58.6434 47.033-58.7378 47.033-58.9238L47.033-64.8164C47.033-65.0014 47.0327-65.0939 47.0447-65.1719C47.1127-65.5999 47.4487-65.9369 47.8767-66.0039C47.9537-66.0169 48.0462-66.0156 48.2322-66.0156ZM64.8005-51.4922L93.2712-51.4922C94.4812-51.4922 94.7943-51.4842 95.0173-51.4492C96.5153-51.2122 97.6905-50.0361 97.9275-48.5391C97.9625-48.3161 97.9705-48.003 97.9705-46.793L97.9705-9.19141C97.9705-7.98141 97.9625-7.66831 97.9275-7.44531C97.6905-5.94731 96.5153-4.77215 95.0173-4.53516C94.7943-4.50016 94.4812-4.49219 93.2712-4.49219L64.8005-4.49219L64.8005-16.2559L70.7107-16.2559C70.8967-16.2559 70.9892-16.2556 71.0662-16.2676C71.4942-16.3356 71.8302-16.6697 71.8982-17.0977C71.9102-17.1757 71.9099-17.2691 71.9099-17.4551L71.9099-23.3477C71.9099-23.5337 71.9102-23.6251 71.8982-23.7031C71.8302-24.1311 71.4942-24.4672 71.0662-24.5352C70.9892-24.5472 70.8967-24.5469 70.7107-24.5469L64.8005-24.5469L64.8005-32.8398L70.7107-32.8398C70.8967-32.8398 70.9892-32.8396 71.0662-32.8516C71.4942-32.9196 71.8302-33.2556 71.8982-33.6836C71.9102-33.7606 71.9099-33.8531 71.9099-34.0391L71.9099-39.9336C71.9099-40.1196 71.9102-40.2121 71.8982-40.2891C71.8302-40.7171 71.4942-41.0531 71.0662-41.1211C70.9892-41.1331 70.8967-41.1328 70.7107-41.1328L64.8005-41.1328ZM31.6462-49.4297L37.5388-49.4297C37.7248-49.4297 37.8182-49.43 37.8962-49.418C38.3242-49.35 38.6583-49.0159 38.7263-48.5879C38.7383-48.5099 38.74-48.4165 38.74-48.2305L38.74-42.3379C38.74-42.1519 38.7383-42.0585 38.7263-41.9805C38.6583-41.5525 38.3242-41.2184 37.8962-41.1504C37.8182-41.1384 37.7248-41.1387 37.5388-41.1387L31.6462-41.1387C31.4602-41.1387 31.3688-41.1384 31.2908-41.1504C30.8628-41.2184 30.5267-41.5525 30.4587-41.9805C30.4467-42.0585 30.447-42.1519 30.447-42.3379L30.447-48.2305C30.447-48.4165 30.4467-48.5099 30.4587-48.5879C30.5267-49.0159 30.8628-49.35 31.2908-49.418C31.3688-49.43 31.4602-49.4297 31.6462-49.4297ZM48.2322-49.4297L54.1248-49.4297C54.3098-49.4297 54.4022-49.43 54.4802-49.418C54.9082-49.35 55.2453-49.0159 55.3123-48.5879C55.3253-48.5099 55.3259-48.4165 55.3259-48.2305L55.3259-42.3379C55.3259-42.1519 55.3253-42.0585 55.3123-41.9805C55.2453-41.5525 54.9082-41.2184 54.4802-41.1504C54.4022-41.1384 54.3098-41.1387 54.1248-41.1387L48.2322-41.1387C48.0462-41.1387 47.9537-41.1384 47.8767-41.1504C47.4487-41.2184 47.1127-41.5525 47.0447-41.9805C47.0327-42.0585 47.033-42.1519 47.033-42.3379L47.033-48.2305C47.033-48.4165 47.0327-48.5099 47.0447-48.5879C47.1127-49.0159 47.4487-49.35 47.8767-49.418C47.9537-49.43 48.0462-49.4297 48.2322-49.4297ZM81.4041-41.1328C81.2181-41.1328 81.1246-41.1331 81.0466-41.1211C80.6186-41.0531 80.2826-40.7171 80.2146-40.2891C80.2026-40.2121 80.2029-40.1196 80.2029-39.9336L80.2029-34.0391C80.2029-33.8531 80.2026-33.7606 80.2146-33.6836C80.2826-33.2556 80.6186-32.9196 81.0466-32.8516C81.1246-32.8396 81.2181-32.8398 81.4041-32.8398L87.2947-32.8398C87.4807-32.8398 87.5741-32.8396 87.6521-32.8516C88.0801-32.9196 88.4142-33.2556 88.4822-33.6836C88.4942-33.7606 88.4959-33.8531 88.4959-34.0391L88.4959-39.9336C88.4959-40.1196 88.4942-40.2121 88.4822-40.2891C88.4142-40.7171 88.0801-41.0531 87.6521-41.1211C87.5741-41.1331 87.4807-41.1328 87.2947-41.1328ZM31.6462-32.8457L37.5388-32.8457C37.7248-32.8457 37.8182-32.844 37.8962-32.832C38.3242-32.764 38.6583-32.43 38.7263-32.002C38.7383-31.925 38.74-31.8305 38.74-31.6445L38.74-25.752C38.74-25.566 38.7383-25.4745 38.7263-25.3965C38.6583-24.9685 38.3242-24.6315 37.8962-24.5645C37.8182-24.5515 37.7248-24.5527 37.5388-24.5527L31.6462-24.5527C31.4602-24.5527 31.3688-24.5514 31.2908-24.5645C30.8628-24.6315 30.5267-24.9685 30.4587-25.3965C30.4467-25.4745 30.447-25.566 30.447-25.752L30.447-31.6445C30.447-31.8305 30.4467-31.925 30.4587-32.002C30.5267-32.43 30.8628-32.764 31.2908-32.832C31.3688-32.844 31.4602-32.8457 31.6462-32.8457ZM48.2322-32.8457L54.1248-32.8457C54.3098-32.8457 54.4022-32.844 54.4802-32.832C54.9082-32.764 55.2453-32.43 55.3123-32.002C55.3253-31.925 55.3259-31.8305 55.3259-31.6445L55.3259-25.752C55.3259-25.566 55.3253-25.4745 55.3123-25.3965C55.2453-24.9685 54.9082-24.6315 54.4802-24.5645C54.4022-24.5515 54.3098-24.5527 54.1248-24.5527L48.2322-24.5527C48.0462-24.5527 47.9537-24.5514 47.8767-24.5645C47.4487-24.6315 47.1127-24.9685 47.0447-25.3965C47.0327-25.4745 47.033-25.566 47.033-25.752L47.033-31.6445C47.033-31.8305 47.0327-31.925 47.0447-32.002C47.1127-32.43 47.4487-32.764 47.8767-32.832C47.9537-32.844 48.0462-32.8457 48.2322-32.8457ZM81.4041-24.5469C81.2181-24.5469 81.1246-24.5472 81.0466-24.5352C80.6186-24.4672 80.2826-24.1311 80.2146-23.7031C80.2026-23.6251 80.2029-23.5337 80.2029-23.3477L80.2029-17.4551C80.2029-17.2691 80.2026-17.1757 80.2146-17.0977C80.2826-16.6697 80.6186-16.3356 81.0466-16.2676C81.1246-16.2556 81.2181-16.2559 81.4041-16.2559L87.2947-16.2559C87.4807-16.2559 87.5741-16.2556 87.6521-16.2676C88.0801-16.3356 88.4142-16.6697 88.4822-17.0977C88.4942-17.1757 88.4959-17.2691 88.4959-17.4551L88.4959-23.3477C88.4959-23.5337 88.4942-23.6251 88.4822-23.7031C88.4142-24.1311 88.0801-24.4672 87.6521-24.5352C87.5741-24.5472 87.4807-24.5469 87.2947-24.5469ZM31.6462-16.2598L37.5388-16.2598C37.7248-16.2598 37.8182-16.2591 37.8962-16.2461C38.3242-16.1781 38.6583-15.844 38.7263-15.416C38.7383-15.338 38.74-15.2455 38.74-15.0605L38.74-9.16797C38.74-8.98197 38.7383-8.88855 38.7263-8.81055C38.6583-8.38355 38.3242-8.04652 37.8962-7.97852C37.8182-7.96652 37.7248-7.9668 37.5388-7.9668L31.6462-7.9668C31.4602-7.9668 31.3688-7.96652 31.2908-7.97852C30.8628-8.04652 30.5267-8.38355 30.4587-8.81055C30.4467-8.88855 30.447-8.98197 30.447-9.16797L30.447-15.0605C30.447-15.2455 30.4467-15.338 30.4587-15.416C30.5267-15.844 30.8628-16.1781 31.2908-16.2461C31.3688-16.2591 31.4602-16.2598 31.6462-16.2598ZM48.2322-16.2598L54.1248-16.2598C54.3098-16.2598 54.4022-16.2591 54.4802-16.2461C54.9082-16.1781 55.2453-15.844 55.3123-15.416C55.3253-15.338 55.3259-15.2455 55.3259-15.0605L55.3259-9.16797C55.3259-8.98197 55.3253-8.88855 55.3123-8.81055C55.2453-8.38355 54.9082-8.04652 54.4802-7.97852C54.4022-7.96652 54.3098-7.9668 54.1248-7.9668L48.2322-7.9668C48.0462-7.9668 47.9537-7.96652 47.8767-7.97852C47.4487-8.04652 47.1127-8.38355 47.0447-8.81055C47.0327-8.88855 47.033-8.98197 47.033-9.16797L47.033-15.0605C47.033-15.2455 47.0327-15.338 47.0447-15.416C47.1127-15.844 47.4487-16.1781 47.8767-16.2461C47.9537-16.2591 48.0462-16.2598 48.2322-16.2598Z"/>
+  </g>
+  <g id="Ultralight-S" transform="matrix(1 0 0 1 498.796 696)">
+   <path class="SFSymbolsPreviewWireframe" d="M32.4392-75.5C31.5662-75.501 30.6589-75.5011 29.8279-75.3691C25.3349-74.6581 21.8114-71.1356 21.0994-66.6426C20.9684-65.8116 20.9695-64.9042 20.9705-64.0312L20.9705-63.8008L20.9705-50.5098L20.9705-11.1992L20.9705-10.9688C20.9695-10.0958 20.9684-9.18842 21.0994-8.35742C21.8114-3.86443 25.3349-0.339905 29.8279 0.371094C30.6589 0.503093 31.5662 0.502953 32.4392 0.501953L32.6716 0.5L64.8005 0.5L93.4099 0.5C94.3909 0.501 95.0593 0.501203 95.6443 0.408203C98.8533-0.0997959 101.37-2.61718 101.879-5.82617C101.971-6.41217 101.97-7.07955 101.97-8.06055L101.97-8.19922L101.97-45.8008L101.97-45.9395C101.97-46.9205 101.971-47.5888 101.879-48.1738C101.37-51.3828 98.8533-53.8983 95.6443-54.4062C95.0593-54.4992 94.3909-54.5 93.4099-54.5L93.2712-54.5L64.8005-54.5L64.8005-63.8008L64.8005-64.0312C64.8015-64.9042 64.8026-65.8116 64.6716-66.6426C63.9596-71.1356 60.4361-74.6581 55.9431-75.3691C55.1121-75.5011 54.2048-75.501 53.3318-75.5L53.0994-75.5L32.6716-75.5ZM31.6462-66.0234L37.5388-66.0234C37.7248-66.0234 37.8182-66.0237 37.8962-66.0117C38.3242-65.9437 38.6583-65.6077 38.7263-65.1797C38.7383-65.1017 38.74-65.0083 38.74-64.8223L38.74-58.9316C38.74-58.7456 38.7383-58.6522 38.7263-58.5742C38.6583-58.1462 38.3242-57.8102 37.8962-57.7422C37.8182-57.7302 37.7248-57.7305 37.5388-57.7305L31.6462-57.7305C31.4602-57.7305 31.3688-57.7302 31.2908-57.7422C30.8628-57.8102 30.5267-58.1462 30.4587-58.5742C30.4467-58.6522 30.447-58.7456 30.447-58.9316L30.447-64.8223C30.447-65.0083 30.4467-65.1017 30.4587-65.1797C30.5267-65.6077 30.8628-65.9437 31.2908-66.0117C31.3688-66.0237 31.4602-66.0234 31.6462-66.0234ZM48.2322-66.0234L54.1248-66.0234C54.3098-66.0234 54.4022-66.0237 54.4802-66.0117C54.9082-65.9437 55.2453-65.6077 55.3123-65.1797C55.3253-65.1017 55.3259-65.0083 55.3259-64.8223L55.3259-58.9316C55.3259-58.7456 55.3253-58.6522 55.3123-58.5742C55.2453-58.1462 54.9082-57.8102 54.4802-57.7422C54.4022-57.7302 54.3098-57.7305 54.1248-57.7305L48.2322-57.7305C48.0462-57.7305 47.9537-57.7302 47.8767-57.7422C47.4487-57.8102 47.1127-58.1462 47.0447-58.5742C47.0327-58.6522 47.033-58.7456 47.033-58.9316L47.033-64.8223C47.033-65.0083 47.0327-65.1017 47.0447-65.1797C47.1127-65.6077 47.4487-65.9437 47.8767-66.0117C47.9537-66.0237 48.0462-66.0234 48.2322-66.0234ZM64.8005-51.5L93.2712-51.5C94.4432-51.5 94.8555-51.4944 95.1755-51.4434C97.1005-51.1384 98.6108-49.6281 98.9158-47.7031C98.9658-47.3821 98.9705-46.9728 98.9705-45.8008L98.9705-8.19922C98.9705-7.02722 98.9658-6.61688 98.9158-6.29688C98.6108-4.37088 97.1005-2.85969 95.1755-2.55469C94.8555-2.50369 94.4432-2.5 93.2712-2.5L64.8005-2.5L64.8005-16.2637L71.5642-16.2637C71.7492-16.2637 71.8417-16.2634 71.9197-16.2754C72.3477-16.3434 72.6847-16.6775 72.7517-17.1055C72.7647-17.1835 72.7634-17.2769 72.7634-17.4629L72.7634-23.3555C72.7634-23.5415 72.7647-23.6349 72.7517-23.7129C72.6847-24.1409 72.3477-24.475 71.9197-24.543C71.8417-24.555 71.7492-24.5547 71.5642-24.5547L64.8005-24.5547L64.8005-32.8477L71.5642-32.8477C71.7492-32.8477 71.8417-32.8474 71.9197-32.8594C72.3477-32.9274 72.6847-33.2634 72.7517-33.6914C72.7647-33.7684 72.7634-33.8628 72.7634-34.0488L72.7634-39.9414C72.7634-40.1264 72.7647-40.2189 72.7517-40.2969C72.6847-40.7249 72.3477-41.0619 71.9197-41.1289C71.8417-41.1419 71.7492-41.1406 71.5642-41.1406L64.8005-41.1406ZM31.6462-49.4375L37.5388-49.4375C37.7248-49.4375 37.8182-49.4378 37.8962-49.4258C38.3242-49.3578 38.6583-49.0227 38.7263-48.5957C38.7383-48.5177 38.74-48.4243 38.74-48.2383L38.74-42.3457C38.74-42.1607 38.7383-42.0663 38.7263-41.9883C38.6583-41.5603 38.3242-41.2252 37.8962-41.1582C37.8182-41.1452 37.7248-41.1445 37.5388-41.1445L31.6462-41.1445C31.4602-41.1445 31.3688-41.1452 31.2908-41.1582C30.8628-41.2252 30.5267-41.5603 30.4587-41.9883C30.4467-42.0663 30.447-42.1607 30.447-42.3457L30.447-48.2383C30.447-48.4243 30.4467-48.5177 30.4587-48.5957C30.5267-49.0227 30.8628-49.3578 31.2908-49.4258C31.3688-49.4378 31.4602-49.4375 31.6462-49.4375ZM48.2322-49.4375L54.1248-49.4375C54.3098-49.4375 54.4022-49.4378 54.4802-49.4258C54.9082-49.3578 55.2453-49.0227 55.3123-48.5957C55.3253-48.5177 55.3259-48.4243 55.3259-48.2383L55.3259-42.3457C55.3259-42.1607 55.3253-42.0663 55.3123-41.9883C55.2453-41.5603 54.9082-41.2252 54.4802-41.1582C54.4022-41.1452 54.3098-41.1445 54.1248-41.1445L48.2322-41.1445C48.0462-41.1445 47.9537-41.1452 47.8767-41.1582C47.4487-41.2252 47.1127-41.5603 47.0447-41.9883C47.0327-42.0663 47.033-42.1607 47.033-42.3457L47.033-48.2383C47.033-48.4243 47.0327-48.5177 47.0447-48.5957C47.1127-49.0227 47.4487-49.3578 47.8767-49.4258C47.9537-49.4378 48.0462-49.4375 48.2322-49.4375ZM82.2556-41.1406C82.0706-41.1406 81.9782-41.1419 81.9002-41.1289C81.4722-41.0619 81.1351-40.7249 81.0681-40.2969C81.0551-40.2189 81.0564-40.1264 81.0564-39.9414L81.0564-34.0488C81.0564-33.8628 81.0551-33.7684 81.0681-33.6914C81.1351-33.2634 81.4722-32.9274 81.9002-32.8594C81.9782-32.8474 82.0706-32.8477 82.2556-32.8477L88.1482-32.8477C88.3342-32.8477 88.4286-32.8474 88.5056-32.8594C88.9336-32.9274 89.2697-33.2634 89.3377-33.6914C89.3497-33.7684 89.3494-33.8628 89.3494-34.0488L89.3494-39.9414C89.3494-40.1264 89.3497-40.2189 89.3377-40.2969C89.2697-40.7249 88.9336-41.0619 88.5056-41.1289C88.4286-41.1419 88.3342-41.1406 88.1482-41.1406ZM31.6462-32.8535L37.5388-32.8535C37.7248-32.8535 37.8182-32.8528 37.8962-32.8398C38.3242-32.7728 38.6583-32.4378 38.7263-32.0098C38.7383-31.9318 38.74-31.8383 38.74-31.6523L38.74-25.7598C38.74-25.5738 38.7383-25.4813 38.7263-25.4043C38.6583-24.9763 38.3242-24.6403 37.8962-24.5723C37.8182-24.5603 37.7248-24.5605 37.5388-24.5605L31.6462-24.5605C31.4602-24.5605 31.3688-24.5603 31.2908-24.5723C30.8628-24.6403 30.5267-24.9763 30.4587-25.4043C30.4467-25.4813 30.447-25.5738 30.447-25.7598L30.447-31.6523C30.447-31.8383 30.4467-31.9318 30.4587-32.0098C30.5267-32.4378 30.8628-32.7728 31.2908-32.8398C31.3688-32.8528 31.4602-32.8535 31.6462-32.8535ZM48.2322-32.8535L54.1248-32.8535C54.3098-32.8535 54.4022-32.8528 54.4802-32.8398C54.9082-32.7728 55.2453-32.4378 55.3123-32.0098C55.3253-31.9318 55.3259-31.8383 55.3259-31.6523L55.3259-25.7598C55.3259-25.5738 55.3253-25.4813 55.3123-25.4043C55.2453-24.9763 54.9082-24.6403 54.4802-24.5723C54.4022-24.5603 54.3098-24.5605 54.1248-24.5605L48.2322-24.5605C48.0462-24.5605 47.9537-24.5603 47.8767-24.5723C47.4487-24.6403 47.1127-24.9763 47.0447-25.4043C47.0327-25.4813 47.033-25.5738 47.033-25.7598L47.033-31.6523C47.033-31.8383 47.0327-31.9318 47.0447-32.0098C47.1127-32.4378 47.4487-32.7728 47.8767-32.8398C47.9537-32.8528 48.0462-32.8535 48.2322-32.8535ZM82.2556-24.5547C82.0706-24.5547 81.9782-24.555 81.9002-24.543C81.4722-24.475 81.1351-24.1409 81.0681-23.7129C81.0551-23.6349 81.0564-23.5415 81.0564-23.3555L81.0564-17.4629C81.0564-17.2769 81.0551-17.1835 81.0681-17.1055C81.1351-16.6775 81.4722-16.3434 81.9002-16.2754C81.9782-16.2634 82.0706-16.2637 82.2556-16.2637L88.1482-16.2637C88.3342-16.2637 88.4286-16.2634 88.5056-16.2754C88.9336-16.3434 89.2697-16.6775 89.3377-17.1055C89.3497-17.1835 89.3494-17.2769 89.3494-17.4629L89.3494-23.3555C89.3494-23.5415 89.3497-23.6349 89.3377-23.7129C89.2697-24.1409 88.9336-24.475 88.5056-24.543C88.4286-24.555 88.3342-24.5547 88.1482-24.5547ZM31.6462-16.2676L37.5388-16.2676C37.7248-16.2676 37.8182-16.2679 37.8962-16.2559C38.3242-16.1879 38.6583-15.8518 38.7263-15.4238C38.7383-15.3458 38.74-15.2524 38.74-15.0664L38.74-9.17578C38.74-8.98978 38.7383-8.89636 38.7263-8.81836C38.6583-8.39036 38.3242-8.05433 37.8962-7.98633C37.8182-7.97433 37.7248-7.97461 37.5388-7.97461L31.6462-7.97461C31.4602-7.97461 31.3688-7.97433 31.2908-7.98633C30.8628-8.05433 30.5267-8.39036 30.4587-8.81836C30.4467-8.89636 30.447-8.98978 30.447-9.17578L30.447-15.0664C30.447-15.2524 30.4467-15.3458 30.4587-15.4238C30.5267-15.8518 30.8628-16.1879 31.2908-16.2559C31.3688-16.2679 31.4602-16.2676 31.6462-16.2676ZM48.2322-16.2676L54.1248-16.2676C54.3098-16.2676 54.4022-16.2679 54.4802-16.2559C54.9082-16.1879 55.2453-15.8518 55.3123-15.4238C55.3253-15.3458 55.3259-15.2524 55.3259-15.0664L55.3259-9.17578C55.3259-8.98978 55.3253-8.89636 55.3123-8.81836C55.2453-8.39036 54.9082-8.05433 54.4802-7.98633C54.4022-7.97433 54.3098-7.97461 54.1248-7.97461L48.2322-7.97461C48.0462-7.97461 47.9537-7.97433 47.8767-7.98633C47.4487-8.05433 47.1127-8.39036 47.0447-8.81836C47.0327-8.89636 47.033-8.98978 47.033-9.17578L47.033-15.0664C47.033-15.2524 47.0327-15.3458 47.0447-15.4238C47.1127-15.8518 47.4487-16.1879 47.8767-16.2559C47.9537-16.2679 48.0462-16.2676 48.2322-16.2676Z"/>
+  </g>
+ </g>
+</svg>
diff --git a/ios/chrome/browser/shared/ui/symbols/resources/BUILD.gn b/ios/chrome/browser/shared/ui/symbols/resources/BUILD.gn
index 33e98a1..5f14a56 100644
--- a/ios/chrome/browser/shared/ui/symbols/resources/BUILD.gn
+++ b/ios/chrome/browser/shared/ui/symbols/resources/BUILD.gn
@@ -40,6 +40,8 @@
     "Assets.xcassets/dino.symbolset/dino.cr.svg",
     "Assets.xcassets/ellipsis_square_fill.symbolset/Contents.json",
     "Assets.xcassets/ellipsis_square_fill.symbolset/ellipsis.square.fill.cr.svg",
+    "Assets.xcassets/enterprise.symbolset/Contents.json",
+    "Assets.xcassets/enterprise.symbolset/enterprise.cr.svg",
     "Assets.xcassets/familylink.symbolset/Contents.json",
     "Assets.xcassets/familylink.symbolset/familylink.cr.svg",
     "Assets.xcassets/folder_badge_arrow_forward.symbolset/Contents.json",
diff --git a/ios/chrome/browser/shared/ui/symbols/symbol_names.h b/ios/chrome/browser/shared/ui/symbols/symbol_names.h
index 6d76694..74ecb9b 100644
--- a/ios/chrome/browser/shared/ui/symbols/symbol_names.h
+++ b/ios/chrome/browser/shared/ui/symbols/symbol_names.h
@@ -62,6 +62,7 @@
 extern NSString* const kSquareNumberSymbol;
 extern NSString* const kTranslateSymbol;
 extern NSString* const kPasswordManagerSymbol;
+extern NSString* const kEnterpriseSymbol;
 extern NSString* const kPopupBadgeMinusSymbol;
 extern NSString* const kPhotoBadgeArrowDownSymbol;
 extern NSString* const kPhotoBadgePlusSymbol;
diff --git a/ios/chrome/browser/shared/ui/symbols/symbol_names.mm b/ios/chrome/browser/shared/ui/symbols/symbol_names.mm
index a108f17..dfdf5c1 100644
--- a/ios/chrome/browser/shared/ui/symbols/symbol_names.mm
+++ b/ios/chrome/browser/shared/ui/symbols/symbol_names.mm
@@ -66,6 +66,7 @@
 NSString* const kIncognitoSymbol = @"incognito";
 NSString* const kSquareNumberSymbol = @"square_number";
 NSString* const kTranslateSymbol = @"translate";
+NSString* const kEnterpriseSymbol = @"enterprise";
 NSString* const kPasswordManagerSymbol = @"password_manager";
 NSString* const kPopupBadgeMinusSymbol = @"popup_badge_minus";
 NSString* const kPhotoBadgeArrowDownSymbol = @"photo.badge.arrow.down";
diff --git a/ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_message_view.mm b/ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_message_view.mm
index 408bafa..79a535cc 100644
--- a/ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_message_view.mm
+++ b/ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_message_view.mm
@@ -13,24 +13,28 @@
 #import "ui/base/l10n/l10n_util.h"
 
 namespace {
+
+// Point size for the icons.
+constexpr CGFloat kSymbolsPointSize = 24.;
+
 // Returns the branded version of the Google Services symbol.
 UIImage* GetBrandedGoogleServicesSymbol() {
 #if BUILDFLAG(IOS_USE_BRANDED_SYMBOLS)
   return MakeSymbolMulticolor(
-      CustomSymbolWithPointSize(kGoogleIconSymbol, 24.));
+      CustomSymbolWithPointSize(kGoogleIconSymbol, kSymbolsPointSize));
 #else
-  return MakeSymbolMulticolor(DefaultSymbolWithPointSize(@"gearshape.2", 24.));
+  return MakeSymbolMulticolor(
+      DefaultSymbolWithPointSize(@"gearshape.2", kSymbolsPointSize));
 #endif
 }
 
-NSString* const kEnterpriseIconName = @"enterprise_icon";
-
 // Returns a tinted version of the enterprise building icon.
 UIImage* GetEnterpriseIcon() {
-  // TODO(crbug.com/349071774): This icon has a lot of built-in padding, so it
-  // looks a bit smaller than intended.
   UIColor* color = [UIColor colorNamed:kInvertedTextSecondaryColor];
-  return [[UIImage imageNamed:kEnterpriseIconName] imageWithTintColor:color];
+  // Actual size does not matter, the image is resized.
+  return SymbolWithPalette(
+      CustomSymbolWithPointSize(kEnterpriseSymbol, kSymbolsPointSize),
+      @[ color ]);
 }
 
 // Returns the text for `_emailView`.
diff --git a/ios/chrome/browser/signin/model/authentication_service.h b/ios/chrome/browser/signin/model/authentication_service.h
index aa43cc7..8b88027 100644
--- a/ios/chrome/browser/signin/model/authentication_service.h
+++ b/ios/chrome/browser/signin/model/authentication_service.h
@@ -5,18 +5,19 @@
 #ifndef IOS_CHROME_BROWSER_SIGNIN_MODEL_AUTHENTICATION_SERVICE_H_
 #define IOS_CHROME_BROWSER_SIGNIN_MODEL_AUTHENTICATION_SERVICE_H_
 
-#include <string>
-#include <vector>
+#import <string>
+#import <vector>
 
+#import "base/functional/callback_helpers.h"
 #import "base/ios/block_types.h"
 #import "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "base/scoped_observation.h"
-#include "components/keyed_service/core/keyed_service.h"
-#include "components/pref_registry/pref_registry_syncable.h"
-#include "components/signin/public/base/consent_level.h"
-#include "components/signin/public/base/signin_metrics.h"
-#include "components/signin/public/identity_manager/identity_manager.h"
+#import "base/memory/weak_ptr.h"
+#import "base/scoped_observation.h"
+#import "components/keyed_service/core/keyed_service.h"
+#import "components/pref_registry/pref_registry_syncable.h"
+#import "components/signin/public/base/consent_level.h"
+#import "components/signin/public/base/signin_metrics.h"
+#import "components/signin/public/identity_manager/identity_manager.h"
 #import "ios/chrome/browser/signin/model/chrome_account_manager_service.h"
 
 namespace syncer {
@@ -154,6 +155,13 @@
   // sync the accounts between the IdentityManager and the SSO library.
   void OnApplicationWillEnterForeground();
 
+  // Returns whether an account switch is in progress.
+  bool IsAccountSwitchInProgress();
+
+  // The account switch is considered to be in progress while the returned
+  // object exists. Can only be called when no switch is in progress.
+  base::ScopedClosureRunner DeclareAccountSwitchInProgress();
+
  private:
   friend class FakeAuthenticationService;
   friend class AuthenticationServiceTest;
@@ -223,6 +231,9 @@
   // is null.
   std::unique_ptr<AuthenticationServiceDelegate> delegate_;
 
+  // Whether an account is currently switching.
+  bool accountSwitchInProgress_ = false;
+
   // Pointer to the KeyedServices used by AuthenticationService.
   raw_ptr<PrefService> pref_service_ = nullptr;
   raw_ptr<ChromeAccountManagerService> account_manager_service_ = nullptr;
diff --git a/ios/chrome/browser/signin/model/authentication_service.mm b/ios/chrome/browser/signin/model/authentication_service.mm
index c86f9d3..2ec84ad2 100644
--- a/ios/chrome/browser/signin/model/authentication_service.mm
+++ b/ios/chrome/browser/signin/model/authentication_service.mm
@@ -233,6 +233,21 @@
   }
 }
 
+bool AuthenticationService::IsAccountSwitchInProgress() {
+  return accountSwitchInProgress_;
+}
+
+base::ScopedClosureRunner
+AuthenticationService::DeclareAccountSwitchInProgress() {
+  CHECK(!accountSwitchInProgress_);
+  accountSwitchInProgress_ = true;
+  return base::ScopedClosureRunner(base::BindOnce(
+      [](AuthenticationService* service) {
+        service->accountSwitchInProgress_ = false;
+      },
+      this));
+}
+
 void AuthenticationService::SetReauthPromptForSignInAndSync() {
   pref_service_->SetBoolean(prefs::kSigninShouldPromptForSigninAgain, true);
 }
diff --git a/ios/chrome/browser/sync/model/ios_chrome_sync_client.h b/ios/chrome/browser/sync/model/ios_chrome_sync_client.h
index 22bedc4..2fd778a 100644
--- a/ios/chrome/browser/sync/model/ios_chrome_sync_client.h
+++ b/ios/chrome/browser/sync/model/ios_chrome_sync_client.h
@@ -10,7 +10,6 @@
 #import "base/files/file_path.h"
 #import "base/memory/raw_ptr.h"
 #import "base/memory/weak_ptr.h"
-#import "components/sync/service/data_type_controller.h"
 #import "components/sync/service/sync_client.h"
 #import "components/trusted_vault/trusted_vault_client.h"
 #import "ios/chrome/browser/shared/model/profile/profile_ios_forward.h"
@@ -25,10 +24,6 @@
 class PasswordStoreInterface;
 }  // namespace password_manager
 
-namespace syncer {
-class SyncService;
-}  // namespace syncer
-
 class IOSChromeSyncClient : public syncer::SyncClient {
  public:
   explicit IOSChromeSyncClient(ChromeBrowserState* browser_state);
@@ -38,10 +33,6 @@
 
   ~IOSChromeSyncClient() override;
 
-  // TODO(crbug.com/335688372): Inline this in the sync_service_factory.mm.
-  syncer::DataTypeController::TypeVector CreateDataTypeControllers(
-      syncer::SyncService* sync_service);
-
   // SyncClient implementation.
   PrefService* GetPrefService() override;
   signin::IdentityManager* GetIdentityManager() override;
diff --git a/ios/chrome/browser/sync/model/ios_chrome_sync_client.mm b/ios/chrome/browser/sync/model/ios_chrome_sync_client.mm
index 85ba5de..dfff80c 100644
--- a/ios/chrome/browser/sync/model/ios_chrome_sync_client.mm
+++ b/ios/chrome/browser/sync/model/ios_chrome_sync_client.mm
@@ -9,80 +9,35 @@
 #import "base/feature_list.h"
 #import "base/functional/bind.h"
 #import "base/logging.h"
-#import "components/autofill/core/browser/webdata/addresses/autofill_profile_sync_bridge.h"
-#import "components/autofill/core/browser/webdata/autocomplete/autocomplete_sync_bridge.h"
-#import "components/autofill/core/browser/webdata/autofill_webdata_service.h"
-#import "components/autofill/core/browser/webdata/payments/autofill_wallet_metadata_sync_bridge.h"
-#import "components/autofill/core/browser/webdata/payments/autofill_wallet_sync_bridge.h"
-#import "components/autofill/core/common/autofill_features.h"
 #import "components/browser_sync/browser_sync_switches.h"
-#import "components/browser_sync/common_controller_builder.h"
 #import "components/browser_sync/sync_client_utils.h"
 #import "components/browser_sync/sync_engine_factory_impl.h"
-#import "components/consent_auditor/consent_auditor.h"
-#import "components/dom_distiller/core/dom_distiller_service.h"
-#import "components/history/core/browser/history_service.h"
 #import "components/keyed_service/core/service_access_type.h"
 #import "components/password_manager/core/browser/password_store/password_store_interface.h"
-#import "components/password_manager/core/browser/sharing/password_receiver_service.h"
-#import "components/password_manager/core/browser/sharing/password_sender_service.h"
-#import "components/plus_addresses/settings/plus_address_setting_service.h"
-#import "components/plus_addresses/webdata/plus_address_webdata_service.h"
-#import "components/reading_list/core/dual_reading_list_model.h"
-#import "components/reading_list/core/reading_list_model.h"
-#import "components/send_tab_to_self/features.h"
 #import "components/supervised_user/core/browser/supervised_user_settings_service.h"
 #import "components/sync/base/features.h"
-#import "components/sync/base/report_unrecoverable_error.h"
 #import "components/sync/base/sync_util.h"
 #import "components/sync/model/data_type_store_service.h"
-#import "components/sync/model/forwarding_data_type_controller_delegate.h"
 #import "components/sync/service/sync_engine_factory.h"
-#import "components/sync/service/sync_service.h"
 #import "components/sync/service/trusted_vault_synthetic_field_trial.h"
 #import "components/sync_device_info/device_info_sync_service.h"
-#import "components/sync_sessions/session_sync_service.h"
-#import "components/sync_user_events/user_event_service.h"
 #import "components/trusted_vault/trusted_vault_service.h"
-#import "components/webauthn/core/browser/passkey_model.h"
-#import "ios/chrome/browser/bookmarks/model/account_bookmark_sync_service_factory.h"
 #import "ios/chrome/browser/bookmarks/model/bookmark_model_factory.h"
-#import "ios/chrome/browser/bookmarks/model/local_or_syncable_bookmark_sync_service_factory.h"
-#import "ios/chrome/browser/consent_auditor/model/consent_auditor_factory.h"
-#import "ios/chrome/browser/data_sharing/model/data_sharing_service_factory.h"
-#import "ios/chrome/browser/dom_distiller/model/dom_distiller_service_factory.h"
-#import "ios/chrome/browser/favicon/model/favicon_service_factory.h"
-#import "ios/chrome/browser/history/model/history_service_factory.h"
-#import "ios/chrome/browser/metrics/model/google_groups_manager_factory.h"
 #import "ios/chrome/browser/metrics/model/ios_chrome_metrics_service_accessor.h"
 #import "ios/chrome/browser/passwords/model/ios_chrome_account_password_store_factory.h"
-#import "ios/chrome/browser/passwords/model/ios_chrome_password_receiver_service_factory.h"
-#import "ios/chrome/browser/passwords/model/ios_chrome_password_sender_service_factory.h"
 #import "ios/chrome/browser/passwords/model/ios_chrome_profile_password_store_factory.h"
-#import "ios/chrome/browser/plus_addresses/model/plus_address_setting_service_factory.h"
-#import "ios/chrome/browser/power_bookmarks/model/power_bookmark_service_factory.h"
 #import "ios/chrome/browser/reading_list/model/reading_list_model_factory.h"
-#import "ios/chrome/browser/saved_tab_groups/model/tab_group_sync_service_factory.h"
 #import "ios/chrome/browser/shared/model/prefs/pref_names.h"
 #import "ios/chrome/browser/shared/model/profile/profile_ios.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
-#import "ios/chrome/browser/sharing_message/model/ios_sharing_message_bridge_factory.h"
-#import "ios/chrome/browser/signin/model/chrome_account_manager_service_factory.h"
 #import "ios/chrome/browser/signin/model/identity_manager_factory.h"
 #import "ios/chrome/browser/supervised_user/model/supervised_user_settings_service_factory.h"
 #import "ios/chrome/browser/sync/model/data_type_store_service_factory.h"
 #import "ios/chrome/browser/sync/model/device_info_sync_service_factory.h"
-#import "ios/chrome/browser/sync/model/ios_user_event_service_factory.h"
-#import "ios/chrome/browser/sync/model/send_tab_to_self_sync_service_factory.h"
-#import "ios/chrome/browser/sync/model/session_sync_service_factory.h"
 #import "ios/chrome/browser/sync/model/sync_invalidations_service_factory.h"
 #import "ios/chrome/browser/trusted_vault/model/ios_trusted_vault_service_factory.h"
-#import "ios/chrome/browser/webauthn/model/ios_passkey_model_factory.h"
-#import "ios/chrome/browser/webdata_services/model/web_data_service_factory.h"
-#import "ios/chrome/common/channel_info.h"
 #import "ios/web/public/thread/web_task_traits.h"
 #import "ios/web/public/thread/web_thread.h"
-#import "services/network/public/cpp/shared_url_loader_factory.h"
 
 namespace {
 
@@ -139,96 +94,6 @@
   return base::FilePath();
 }
 
-syncer::DataTypeController::TypeVector
-IOSChromeSyncClient::CreateDataTypeControllers(
-    syncer::SyncService* sync_service) {
-  scoped_refptr<autofill::AutofillWebDataService> profile_web_data_service =
-      ios::WebDataServiceFactory::GetAutofillWebDataForBrowserState(
-          browser_state_, ServiceAccessType::IMPLICIT_ACCESS);
-
-  browser_sync::CommonControllerBuilder builder;
-  builder.SetAutofillWebDataService(
-      web::GetUIThreadTaskRunner({}),
-      profile_web_data_service,
-      ios::WebDataServiceFactory::GetAutofillWebDataForAccount(
-          browser_state_, ServiceAccessType::IMPLICIT_ACCESS));
-  builder.SetBookmarkModel(
-      ios::BookmarkModelFactory::GetForBrowserState(browser_state_));
-  builder.SetBookmarkSyncService(
-      ios::LocalOrSyncableBookmarkSyncServiceFactory::GetForBrowserState(
-          browser_state_),
-      ios::AccountBookmarkSyncServiceFactory::GetForBrowserState(
-          browser_state_));
-  builder.SetConsentAuditor(
-      ConsentAuditorFactory::GetForBrowserState(browser_state_));
-  builder.SetDataSharingService(
-      data_sharing::DataSharingServiceFactory::GetForBrowserState(
-          browser_state_));
-  builder.SetDeviceInfoSyncService(
-      DeviceInfoSyncServiceFactory::GetForBrowserState(browser_state_));
-  builder.SetDualReadingListModel(
-      ReadingListModelFactory::GetAsDualReadingListModelForBrowserState(
-          browser_state_));
-  builder.SetFaviconService(ios::FaviconServiceFactory::GetForBrowserState(
-      browser_state_, ServiceAccessType::IMPLICIT_ACCESS));
-  builder.SetGoogleGroupsManager(
-      GoogleGroupsManagerFactory::GetForBrowserState(browser_state_));
-  builder.SetHistoryService(ios::HistoryServiceFactory::GetForBrowserState(
-      browser_state_, ServiceAccessType::EXPLICIT_ACCESS));
-  builder.SetIdentityManager(GetIdentityManager());
-  builder.SetDataTypeStoreService(
-      DataTypeStoreServiceFactory::GetForBrowserState(browser_state_));
-#if !BUILDFLAG(IS_ANDROID)
-  builder.SetPasskeyModel(
-      base::FeatureList::IsEnabled(syncer::kSyncWebauthnCredentials)
-          ? IOSPasskeyModelFactory::GetForBrowserState(browser_state_)
-          : nullptr);
-#endif  // !BUILDFLAG(IS_ANDROID)
-  builder.SetPasswordReceiverService(
-      IOSChromePasswordReceiverServiceFactory::GetForBrowserState(
-          browser_state_));
-  builder.SetPasswordSenderService(
-      IOSChromePasswordSenderServiceFactory::GetForBrowserState(
-          browser_state_));
-  builder.SetPasswordStore(profile_password_store_, account_password_store_);
-  builder.SetPlusAddressServices(
-      PlusAddressSettingServiceFactory::GetForProfile(browser_state_),
-      ios::WebDataServiceFactory::GetPlusAddressWebDataForBrowserState(
-          browser_state_, ServiceAccessType::IMPLICIT_ACCESS));
-  builder.SetPowerBookmarkService(
-      PowerBookmarkServiceFactory::GetForBrowserState(browser_state_));
-  builder.SetPrefService(browser_state_->GetPrefs());
-  builder.SetPrefServiceSyncable(browser_state_->GetSyncablePrefs());
-  // TODO(crbug.com/330201909) implement for iOS.
-  builder.SetProductSpecificationsService(nullptr);
-  builder.SetSendTabToSelfSyncService(
-      SendTabToSelfSyncServiceFactory::GetForBrowserState(browser_state_));
-  builder.SetSessionSyncService(
-      SessionSyncServiceFactory::GetForBrowserState(browser_state_));
-  builder.SetSharingMessageBridge(
-      base::FeatureList::IsEnabled(
-          send_tab_to_self::kSendTabToSelfIOSPushNotifications)
-          ? IOSSharingMessageBridgeFactory::GetForBrowserState(browser_state_)
-          : nullptr);
-#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
-  builder.SetSupervisedUserSettingsService(
-      SupervisedUserSettingsServiceFactory::GetForBrowserState(browser_state_));
-#endif  // BUILDFLAG(ENABLE_SUPERVISED_USERS)
-  builder.SetTabGroupSyncService(
-      IsTabGroupSyncEnabled()
-          ? tab_groups::TabGroupSyncServiceFactory::GetForBrowserState(
-                browser_state_)
-          : nullptr);
-  builder.SetTemplateURLService(nullptr);
-  builder.SetUserEventService(
-      IOSUserEventServiceFactory::GetForBrowserState(browser_state_));
-
-  syncer::DataTypeController::TypeVector controllers = builder.Build(
-      /*disabled_types=*/{}, sync_service, ::GetChannel());
-
-  return controllers;
-}
-
 syncer::SyncInvalidationsService*
 IOSChromeSyncClient::GetSyncInvalidationsService() {
   return SyncInvalidationsServiceFactory::GetForBrowserState(browser_state_);
diff --git a/ios/chrome/browser/sync/model/sync_service_factory.mm b/ios/chrome/browser/sync/model/sync_service_factory.mm
index 15e186b..98506f4e 100644
--- a/ios/chrome/browser/sync/model/sync_service_factory.mm
+++ b/ios/chrome/browser/sync/model/sync_service_factory.mm
@@ -6,18 +6,24 @@
 
 #import <utility>
 
+#import "base/feature_list.h"
 #import "base/functional/bind.h"
 #import "base/no_destructor.h"
 #import "base/time/time.h"
 #import "components/autofill/core/browser/personal_data_manager.h"
+#import "components/browser_sync/common_controller_builder.h"
 #import "components/history/core/browser/features.h"
 #import "components/keyed_service/core/service_access_type.h"
 #import "components/keyed_service/ios/browser_state_dependency_manager.h"
 #import "components/network_time/network_time_tracker.h"
+#import "components/password_manager/core/browser/password_store/password_store_interface.h"
 #import "components/password_manager/core/browser/sharing/password_receiver_service.h"
+#import "components/plus_addresses/webdata/plus_address_webdata_service.h"
 #import "components/prefs/pref_service.h"
+#import "components/send_tab_to_self/features.h"
 #import "components/send_tab_to_self/send_tab_to_self_sync_service.h"
 #import "components/sync/base/command_line_switches.h"
+#import "components/sync/base/features.h"
 #import "components/sync/base/sync_util.h"
 #import "components/sync/service/sync_service.h"
 #import "components/sync/service/sync_service_impl.h"
@@ -42,12 +48,15 @@
 #import "ios/chrome/browser/passwords/model/ios_chrome_password_sender_service_factory.h"
 #import "ios/chrome/browser/passwords/model/ios_chrome_profile_password_store_factory.h"
 #import "ios/chrome/browser/plus_addresses/model/plus_address_setting_service_factory.h"
+#import "ios/chrome/browser/power_bookmarks/model/power_bookmark_service_factory.h"
 #import "ios/chrome/browser/reading_list/model/reading_list_model_factory.h"
 #import "ios/chrome/browser/saved_tab_groups/model/tab_group_sync_service_factory.h"
 #import "ios/chrome/browser/search_engines/model/template_url_service_factory.h"
 #import "ios/chrome/browser/shared/model/application_context/application_context.h"
 #import "ios/chrome/browser/shared/model/prefs/pref_names.h"
 #import "ios/chrome/browser/shared/model/profile/profile_ios.h"
+#import "ios/chrome/browser/shared/public/features/features.h"
+#import "ios/chrome/browser/sharing_message/model/ios_sharing_message_bridge_factory.h"
 #import "ios/chrome/browser/signin/model/about_signin_internals_factory.h"
 #import "ios/chrome/browser/signin/model/chrome_account_manager_service_factory.h"
 #import "ios/chrome/browser/signin/model/identity_manager_factory.h"
@@ -60,14 +69,107 @@
 #import "ios/chrome/browser/sync/model/session_sync_service_factory.h"
 #import "ios/chrome/browser/sync/model/sync_invalidations_service_factory.h"
 #import "ios/chrome/browser/trusted_vault/model/ios_trusted_vault_service_factory.h"
+#import "ios/chrome/browser/webauthn/model/ios_passkey_model_factory.h"
 #import "ios/chrome/browser/webdata_services/model/web_data_service_factory.h"
 #import "ios/chrome/common/channel_info.h"
 #import "ios/web/public/thread/web_task_traits.h"
 #import "ios/web/public/thread/web_thread.h"
 #import "services/network/public/cpp/shared_url_loader_factory.h"
 #import "url/gurl.h"
+
 namespace {
 
+syncer::DataTypeController::TypeVector CreateControllers(
+    ChromeBrowserState* browser_state,
+    syncer::SyncService* sync_service) {
+  scoped_refptr<autofill::AutofillWebDataService> profile_web_data_service =
+      ios::WebDataServiceFactory::GetAutofillWebDataForBrowserState(
+          browser_state, ServiceAccessType::IMPLICIT_ACCESS);
+
+  browser_sync::CommonControllerBuilder builder;
+  builder.SetAutofillWebDataService(
+      web::GetUIThreadTaskRunner({}), profile_web_data_service,
+      ios::WebDataServiceFactory::GetAutofillWebDataForAccount(
+          browser_state, ServiceAccessType::IMPLICIT_ACCESS));
+  builder.SetBookmarkModel(
+      ios::BookmarkModelFactory::GetForBrowserState(browser_state));
+  builder.SetBookmarkSyncService(
+      ios::LocalOrSyncableBookmarkSyncServiceFactory::GetForBrowserState(
+          browser_state),
+      ios::AccountBookmarkSyncServiceFactory::GetForBrowserState(
+          browser_state));
+  builder.SetConsentAuditor(
+      ConsentAuditorFactory::GetForBrowserState(browser_state));
+  builder.SetDataSharingService(
+      data_sharing::DataSharingServiceFactory::GetForBrowserState(
+          browser_state));
+  builder.SetDeviceInfoSyncService(
+      DeviceInfoSyncServiceFactory::GetForBrowserState(browser_state));
+  builder.SetDualReadingListModel(
+      ReadingListModelFactory::GetAsDualReadingListModelForBrowserState(
+          browser_state));
+  builder.SetFaviconService(ios::FaviconServiceFactory::GetForBrowserState(
+      browser_state, ServiceAccessType::IMPLICIT_ACCESS));
+  builder.SetGoogleGroupsManager(
+      GoogleGroupsManagerFactory::GetForBrowserState(browser_state));
+  builder.SetHistoryService(ios::HistoryServiceFactory::GetForBrowserState(
+      browser_state, ServiceAccessType::EXPLICIT_ACCESS));
+  builder.SetIdentityManager(
+      IdentityManagerFactory::GetForProfile(browser_state));
+  builder.SetDataTypeStoreService(
+      DataTypeStoreServiceFactory::GetForBrowserState(browser_state));
+  builder.SetPasskeyModel(
+      base::FeatureList::IsEnabled(syncer::kSyncWebauthnCredentials)
+          ? IOSPasskeyModelFactory::GetForBrowserState(browser_state)
+          : nullptr);
+  builder.SetPasswordReceiverService(
+      IOSChromePasswordReceiverServiceFactory::GetForBrowserState(
+          browser_state));
+  builder.SetPasswordSenderService(
+      IOSChromePasswordSenderServiceFactory::GetForBrowserState(browser_state));
+  builder.SetPasswordStore(
+      IOSChromeProfilePasswordStoreFactory::GetForBrowserState(
+          browser_state, ServiceAccessType::IMPLICIT_ACCESS),
+      IOSChromeAccountPasswordStoreFactory::GetForBrowserState(
+          browser_state, ServiceAccessType::IMPLICIT_ACCESS));
+  builder.SetPlusAddressServices(
+      PlusAddressSettingServiceFactory::GetForProfile(browser_state),
+      ios::WebDataServiceFactory::GetPlusAddressWebDataForBrowserState(
+          browser_state, ServiceAccessType::IMPLICIT_ACCESS));
+  builder.SetPowerBookmarkService(
+      PowerBookmarkServiceFactory::GetForBrowserState(browser_state));
+  builder.SetPrefService(browser_state->GetPrefs());
+  builder.SetPrefServiceSyncable(browser_state->GetSyncablePrefs());
+  // TODO(crbug.com/330201909) implement for iOS.
+  builder.SetProductSpecificationsService(nullptr);
+  builder.SetSendTabToSelfSyncService(
+      SendTabToSelfSyncServiceFactory::GetForBrowserState(browser_state));
+  builder.SetSessionSyncService(
+      SessionSyncServiceFactory::GetForBrowserState(browser_state));
+  builder.SetSharingMessageBridge(
+      base::FeatureList::IsEnabled(
+          send_tab_to_self::kSendTabToSelfIOSPushNotifications)
+          ? IOSSharingMessageBridgeFactory::GetForBrowserState(browser_state)
+          : nullptr);
+#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
+  builder.SetSupervisedUserSettingsService(
+      SupervisedUserSettingsServiceFactory::GetForBrowserState(browser_state));
+#endif  // BUILDFLAG(ENABLE_SUPERVISED_USERS)
+  builder.SetTabGroupSyncService(
+      IsTabGroupSyncEnabled()
+          ? tab_groups::TabGroupSyncServiceFactory::GetForBrowserState(
+                browser_state)
+          : nullptr);
+  builder.SetTemplateURLService(nullptr);
+  builder.SetUserEventService(
+      IOSUserEventServiceFactory::GetForBrowserState(browser_state));
+
+  syncer::DataTypeController::TypeVector controllers = builder.Build(
+      /*disabled_types=*/{}, sync_service, ::GetChannel());
+
+  return controllers;
+}
+
 // The maximum number of New Tab Page displays to show with synced segments
 // data.
 constexpr int kMaxSyncedNewTabPageDisplays = 5;
@@ -96,13 +198,10 @@
   init_params.channel = ::GetChannel();
   init_params.debug_identifier = browser_state->GetProfileName();
 
-  IOSChromeSyncClient* client_ptr =
-      static_cast<IOSChromeSyncClient*>(init_params.sync_client.get());
-
   auto sync_service =
       std::make_unique<syncer::SyncServiceImpl>(std::move(init_params));
   sync_service->Initialize(
-      client_ptr->CreateDataTypeControllers(sync_service.get()));
+      CreateControllers(browser_state, sync_service.get()));
 
   // TODO(crbug.com/40250371): Remove the workaround below once
   // PrivacySandboxSettingsFactory correctly declares its KeyedServices
@@ -223,9 +322,17 @@
   DependsOn(IOSChromePasswordSenderServiceFactory::GetInstance());
   DependsOn(IOSChromeProfilePasswordStoreFactory::GetInstance());
   DependsOn(IOSChromeAccountPasswordStoreFactory::GetInstance());
+  if (base::FeatureList::IsEnabled(syncer::kSyncWebauthnCredentials)) {
+    DependsOn(IOSPasskeyModelFactory::GetInstance());
+  }
+  if (base::FeatureList::IsEnabled(
+          send_tab_to_self::kSendTabToSelfIOSPushNotifications)) {
+    DependsOn(IOSSharingMessageBridgeFactory::GetInstance());
+  }
   DependsOn(IOSTrustedVaultServiceFactory::GetInstance());
   DependsOn(IOSUserEventServiceFactory::GetInstance());
   DependsOn(PlusAddressSettingServiceFactory::GetInstance());
+  DependsOn(PowerBookmarkServiceFactory::GetInstance());
   DependsOn(ReadingListModelFactory::GetInstance());
   DependsOn(SessionSyncServiceFactory::GetInstance());
   DependsOn(SupervisedUserSettingsServiceFactory::GetInstance());
diff --git a/ios/chrome/browser/tabs/model/closing_web_state_observer_browser_agent.mm b/ios/chrome/browser/tabs/model/closing_web_state_observer_browser_agent.mm
index 58dcdf4..5593fcb 100644
--- a/ios/chrome/browser/tabs/model/closing_web_state_observer_browser_agent.mm
+++ b/ios/chrome/browser/tabs/model/closing_web_state_observer_browser_agent.mm
@@ -102,9 +102,11 @@
   }
 
   web::WebState* detached_web_state = detach_change.detached_web_state();
-  RecordHistoryForWebStateAtIndex(detached_web_state,
-                                  detach_change.detached_from_index());
-  if (detach_change.is_user_action()) {
+  if (!detach_change.is_tabs_cleanup()) {
+    RecordHistoryForWebStateAtIndex(detached_web_state,
+                                    detach_change.detached_from_index());
+  }
+  if (detach_change.is_user_action() || detach_change.is_tabs_cleanup()) {
     SnapshotTabHelper::FromWebState(detached_web_state)->RemoveSnapshot();
   }
 }
diff --git a/ios/chrome/browser/ui/authentication/account_menu/account_menu_coordinator.mm b/ios/chrome/browser/ui/authentication/account_menu/account_menu_coordinator.mm
index 07ae007..a4524c7 100644
--- a/ios/chrome/browser/ui/authentication/account_menu/account_menu_coordinator.mm
+++ b/ios/chrome/browser/ui/authentication/account_menu/account_menu_coordinator.mm
@@ -283,9 +283,7 @@
 }
 
 - (void)triggerSigninWithSystemIdentity:(id<SystemIdentity>)identity
-                             completion:
-                                 (void (^)(id<SystemIdentity> systemIdentity))
-                                     completion {
+                             completion:(void (^)(BOOL success))completion {
   AuthenticationFlow* authenticationFlow = [[AuthenticationFlow alloc]
                initWithBrowser:self.browser
                       identity:identity
@@ -294,9 +292,7 @@
              postSignInActions:PostSignInActionSet({PostSignInAction::kNone})
       presentingViewController:_navigationController];
 
-  [authenticationFlow startSignInWithCompletion:^(BOOL success) {
-    completion(identity);
-  }];
+  [authenticationFlow startSignInWithCompletion:completion];
 }
 
 - (void)triggerAccountSwitchSnackbarWithIdentity:
diff --git a/ios/chrome/browser/ui/authentication/account_menu/account_menu_coordinator_unittests.mm b/ios/chrome/browser/ui/authentication/account_menu/account_menu_coordinator_unittests.mm
index 7708133..d5a0392 100644
--- a/ios/chrome/browser/ui/authentication/account_menu/account_menu_coordinator_unittests.mm
+++ b/ios/chrome/browser/ui/authentication/account_menu/account_menu_coordinator_unittests.mm
@@ -280,12 +280,11 @@
 TEST_F(AccountMenuCoordinatorNonManagedTest, testSignin) {
   base::RunLoop run_loop;
   base::RepeatingClosure closure = run_loop.QuitClosure();
-  [coordinator_
-      triggerSigninWithSystemIdentity:kSecondaryIdentity
-                           completion:^(id<SystemIdentity> systemIdentity) {
-                             EXPECT_EQ(systemIdentity, kSecondaryIdentity);
-                             closure.Run();
-                           }];
+  [coordinator_ triggerSigninWithSystemIdentity:kSecondaryIdentity
+                                     completion:^(BOOL success) {
+                                       EXPECT_TRUE(success);
+                                       closure.Run();
+                                     }];
 
   run_loop.Run();
 }
diff --git a/ios/chrome/browser/ui/authentication/account_menu/account_menu_mediator.mm b/ios/chrome/browser/ui/authentication/account_menu/account_menu_mediator.mm
index e8041e44..06df31a 100644
--- a/ios/chrome/browser/ui/authentication/account_menu/account_menu_mediator.mm
+++ b/ios/chrome/browser/ui/authentication/account_menu/account_menu_mediator.mm
@@ -7,6 +7,7 @@
 #import <optional>
 #import <string>
 
+#import "base/functional/callback_helpers.h"
 #import "base/strings/sys_string_conversions.h"
 #import "components/prefs/pref_service.h"
 #import "components/signin/public/base/consent_level.h"
@@ -52,6 +53,8 @@
   // Whether the account menu operations requires the user interacitons to be
   // ignored.
   BOOL _blockUserInteractions;
+  // This object is set iff an account switch is in progress.
+  base::ScopedClosureRunner _accountSwitchInProgress;
 
   // The list of identities to display and their index in the table view’s
   // identities section
@@ -60,9 +63,6 @@
   // The type of account error that is being displayed in the error section for
   // signed in accounts. Is set to kNone when there is no error section.
   syncer::SyncService::UserActionableError _diplayedAccountErrorType;
-
-  // Whether an account switching is in progress.
-  BOOL _accountSwitchingInProgress;
 }
 
 - (instancetype)initWithSyncService:(syncer::SyncService*)syncService
@@ -104,6 +104,7 @@
 }
 
 - (void)disconnect {
+  _accountSwitchInProgress.RunAndReset();
   _blockUpdates = YES;
   _accountManagerService = nullptr;
   _accountManagerServiceObserver.reset();
@@ -200,7 +201,7 @@
       [self updateIdentities];
       break;
     case signin::PrimaryAccountChangeEvent::Type::kCleared:
-      if (_accountSwitchingInProgress) {
+      if (_authenticationService->IsAccountSwitchInProgress()) {
         return;
       }
       [self.delegate mediatorWantsToBeDismissed:self];
@@ -242,8 +243,8 @@
   __weak __typeof(self) weakSelf = self;
   [self.delegate signOutFromTargetRect:targetRect
                               callback:^(BOOL success) {
-                                [weakSelf signoutDoneWithSuccess:success
-                                                        callback:callback];
+                                [weakSelf signoutEndedWithSuccess:success
+                                                         callback:callback];
                               }];
 }
 
@@ -262,13 +263,16 @@
     }
   }
   CHECK(newIdentity);
-  _accountSwitchingInProgress = YES;
+  _accountSwitchInProgress =
+      _authenticationService->DeclareAccountSwitchInProgress();
   __weak __typeof(self) weakSelf = self;
+  id<SystemIdentity> fromIdentity = _primaryIdentity;
   [self.delegate triggerSignoutWithTargetRect:targetRect
                                    completion:^(BOOL success) {
                                      [weakSelf
-                                         signoutDoneWithSuccess:success
-                                                 systemIdentity:newIdentity];
+                                         signoutEndedWithSuccess:success
+                                                    fromIdentity:fromIdentity
+                                                      toIdentity:newIdentity];
                                    }];
 }
 
@@ -383,7 +387,8 @@
 }
 
 // Callback for signout.
-- (void)signoutDoneWithSuccess:(BOOL)success callback:(void (^)(BOOL))callback {
+- (void)signoutEndedWithSuccess:(BOOL)success
+                       callback:(void (^)(BOOL))callback {
   if (!success) {
     // User had not signed-out. Allow to interact with the UI.
     _blockUserInteractions = NO;
@@ -393,25 +398,45 @@
 }
 
 // Callback for the first part of the switch, which is a sign-out.
-- (void)signoutDoneWithSuccess:(BOOL)success
-                systemIdentity:(id<SystemIdentity>)systemIdentity {
-  if (!success) {
-    [self restartUpdates];
+- (void)signoutEndedWithSuccess:(BOOL)signoutSuccess
+                   fromIdentity:(id<SystemIdentity>)previousIdentity
+                     toIdentity:(id<SystemIdentity>)newIdentity {
+  if (!signoutSuccess) {
+    // User had not signed-out. Allow to interact with the UI.
     _blockUserInteractions = NO;
+    _accountSwitchInProgress.RunAndReset();
+    [self restartUpdates];
     return;
   }
   __weak __typeof(self) weakSelf = self;
   [self.delegate
-      triggerSigninWithSystemIdentity:systemIdentity
-                           completion:^(id<SystemIdentity> signedInIdentity) {
-                             [weakSelf signinDone:signedInIdentity];
+      triggerSigninWithSystemIdentity:newIdentity
+                           completion:^(BOOL signInSuccess) {
+                             [weakSelf signinEndedWithSuccess:signInSuccess
+                                                 fromIdentity:previousIdentity
+                                                   toIdentity:newIdentity];
                            }];
 }
 
-- (void)signinDone:(id<SystemIdentity>)systemIdentity {
-  _accountSwitchingInProgress = NO;
-  [_delegate triggerAccountSwitchSnackbarWithIdentity:systemIdentity];
-  [_delegate mediatorWantsToBeDismissed:self];
+- (void)signinEndedWithSuccess:(BOOL)success
+                  fromIdentity:(id<SystemIdentity>)previousIdentity
+                    toIdentity:(id<SystemIdentity>)newIdentity {
+  _accountSwitchInProgress.RunAndReset();
+  if (success) {
+    [_delegate triggerAccountSwitchSnackbarWithIdentity:newIdentity];
+    [_delegate mediatorWantsToBeDismissed:self];
+  } else if (_accountManagerService->IsValidIdentity(previousIdentity)) {
+    // Sign-in failed, we sign the user back in their previous account.
+    _authenticationService->SignIn(
+        previousIdentity,
+        signin_metrics::AccessPoint::ACCESS_POINT_ACCOUNT_MENU_FAILED_SWITCH);
+    [self restartUpdates];
+    _blockUserInteractions = NO;
+  } else {
+    // That should be extremely are. MDM invalidated the previous account
+    // during the switch.
+    [self.delegate mediatorWantsToBeDismissed:self];
+  }
 }
 
 // Refresh everything and update the UI according to the change in the state.
diff --git a/ios/chrome/browser/ui/authentication/account_menu/account_menu_mediator_delegate.h b/ios/chrome/browser/ui/authentication/account_menu/account_menu_mediator_delegate.h
index 591ac78..77d792e 100644
--- a/ios/chrome/browser/ui/authentication/account_menu/account_menu_mediator_delegate.h
+++ b/ios/chrome/browser/ui/authentication/account_menu/account_menu_mediator_delegate.h
@@ -15,16 +15,20 @@
 
 @protocol AccountMenuMediatorDelegate <SyncErrorSettingsCommandHandler>
 
+// Requests to dismiss the account menu.
 - (void)mediatorWantsToBeDismissed:(AccountMenuMediator*)mediator;
 
+// Starts the sign-out flow. Then call `completion`, with a parameter stating
+// whether the the sign-out was done.
 - (void)triggerSignoutWithTargetRect:(CGRect)targetRect
                           completion:(void (^)(BOOL success))completion;
 
+// Starts the sign-in flow. Then call `completion`, with a parameter stating
+// whether the the sign-out was done.
 - (void)triggerSigninWithSystemIdentity:(id<SystemIdentity>)identity
-                             completion:
-                                 (void (^)(id<SystemIdentity> systemIdentity))
-                                     completion;
+                             completion:(void (^)(BOOL success))completion;
 
+// Displays the identity snackbar with `systemIdentity`.
 - (void)triggerAccountSwitchSnackbarWithIdentity:
     (id<SystemIdentity>)systemIdentity;
 
diff --git a/ios/chrome/browser/ui/authentication/account_menu/account_menu_mediator_unittests.mm b/ios/chrome/browser/ui/authentication/account_menu/account_menu_mediator_unittests.mm
index e981f14..62d3c5a 100644
--- a/ios/chrome/browser/ui/authentication/account_menu/account_menu_mediator_unittests.mm
+++ b/ios/chrome/browser/ui/authentication/account_menu/account_menu_mediator_unittests.mm
@@ -128,6 +128,16 @@
         GetApplicationContext()->GetSystemIdentityManager());
   }
 
+  void SignOut() {
+    base::RunLoop run_loop;
+    base::RepeatingClosure closure = run_loop.QuitClosure();
+    authentication_service_->SignOut(signin_metrics::ProfileSignout::kTest,
+                                     /*force_clear_browsing_data=*/false, ^() {
+                                       closure.Run();
+                                     });
+    run_loop.Run();
+  }
+
   id<AccountMenuMediatorDelegate> delegate_;
   id<AccountMenuConsumer> consumer_;
   AccountMenuMediator* mediator_;
@@ -281,36 +291,108 @@
 #pragma mark - AccountMenuMutator
 
 // Tests the result of accountTappedWithGaiaID:targetRect:
-TEST_F(AccountMenuMediatorTest, TestAccountTaped) {
+// when sign-out fail.
+TEST_F(AccountMenuMediatorTest, TestAccountTapedSignoutFailed) {
   // Given that the method  `triggerSignoutWithTargetRect:completion` create a
   // callback in a callback, this tests has three parts.  One part by callback,
   // and one part for the initial part of the run.
 
   // Testing the part before the callback.
-  auto target = CGRect();
   // This variable will contain the callback that should be executed once
-  // sign-out is done.
+  // sign-out ends.
   __block void (^onSignoutSuccess)(BOOL) = nil;
-  {
-    base::RunLoop run_loop;
-    base::RepeatingClosure closure = run_loop.QuitClosure();
-    OCMExpect([delegate_
-        triggerSignoutWithTargetRect:target
-                          completion:[OCMArg checkWithBlock:^BOOL(id value) {
-                            onSignoutSuccess = value;
-                            closure.Run();
-                            return true;
-                          }]]);
-    [mediator_ accountTappedWithGaiaID:kSecondaryIdentity.gaiaID
-                            targetRect:target];
-    run_loop.Run();
-  }
+  auto target = CGRect();
+  OCMExpect([delegate_
+      triggerSignoutWithTargetRect:target
+                        completion:[OCMArg checkWithBlock:^BOOL(id value) {
+                          onSignoutSuccess = value;
+                          return true;
+                        }]]);
+  [mediator_ accountTappedWithGaiaID:kSecondaryIdentity.gaiaID
+                          targetRect:target];
   VerifyMock();
 
-  // Testing the sign-out callback.
+  OCMExpect([consumer_ updateAccountListWithGaiaIDsToAdd:@[]
+                                         gaiaIDsToRemove:@[]]);
+  OCMExpect([consumer_ updatePrimaryAccount]);
+  // Simulate a sign-out failure
+  onSignoutSuccess(false);
+}
+
+// Tests the result of accountTappedWithGaiaID:targetRect:
+// when sign-in fail.
+TEST_F(AccountMenuMediatorTest, TestAccountTapedSignInFailed) {
+  // Given that the method  `triggerSignoutWithTargetRect:completion` create a
+  // callback in a callback, this tests has three parts.  One part by callback,
+  // and one part for the initial part of the run.
+
+  // Testing the part before the callback.
   // This variable will contain the callback that should be executed once
-  // sign-in is done.
-  __block void (^onSigninSuccess)(id<SystemIdentity>) = nil;
+  // sign-out ends.
+  __block void (^onSignoutSuccess)(BOOL) = nil;
+  auto target = CGRect();
+  OCMExpect([delegate_
+      triggerSignoutWithTargetRect:target
+                        completion:[OCMArg checkWithBlock:^BOOL(id value) {
+                          onSignoutSuccess = value;
+                          // Actually sign-out, in order to test next step.
+                          SignOut();
+                          return true;
+                        }]]);
+  [mediator_ accountTappedWithGaiaID:kSecondaryIdentity.gaiaID
+                          targetRect:target];
+  VerifyMock();
+
+  // Simulate a sign-out success.
+  // This variable will contain the callback that should be executed once
+  // sign-in ended.
+  __block void (^onSigninSuccess)(bool) = nil;
+  OCMExpect([delegate_
+      triggerSigninWithSystemIdentity:kSecondaryIdentity
+                           completion:[OCMArg checkWithBlock:^BOOL(id value) {
+                             onSigninSuccess = value;
+                             return true;
+                           }]]);
+  onSignoutSuccess(true);
+
+  // Testing the sign-in callback.
+  // The delegate should not receive any message. The mediator directly sign the
+  // user back in the previous account.
+  OCMExpect([consumer_ updateAccountListWithGaiaIDsToAdd:@[]
+                                         gaiaIDsToRemove:@[]]);
+  OCMExpect([consumer_ updatePrimaryAccount]);
+  onSigninSuccess(NO);
+
+  // Checks the user is signed-back in.
+  ASSERT_EQ(kPrimaryIdentity, authentication_service_->GetPrimaryIdentity(
+                                  signin::ConsentLevel::kSignin));
+}
+// Tests the result of accountTappedWithGaiaID:targetRect:
+// when switch is succesful.
+TEST_F(AccountMenuMediatorTest, TestAccountTapedWithSuccesfulSwitch) {
+  // Given that the method  `triggerSignoutWithTargetRect:completion` create a
+  // callback in a callback, this tests has three parts.  One part by callback,
+  // and one part for the initial part of the run.
+
+  // Testing the part before the callback.
+  // This variable will contain the callback that should be executed once
+  // sign-out ends.
+  __block void (^onSignoutSuccess)(BOOL) = nil;
+  auto target = CGRect();
+  OCMExpect([delegate_
+      triggerSignoutWithTargetRect:target
+                        completion:[OCMArg checkWithBlock:^BOOL(id value) {
+                          onSignoutSuccess = value;
+                          return true;
+                        }]]);
+  [mediator_ accountTappedWithGaiaID:kSecondaryIdentity.gaiaID
+                          targetRect:target];
+  VerifyMock();
+
+  // Simulate a sign-out success.
+  // This variable will contain the callback that should be executed once
+  // sign-in ends.
+  __block void (^onSigninSuccess)(bool) = nil;
   {
     base::RunLoop run_loop;
     base::RepeatingClosure closure = run_loop.QuitClosure();
diff --git a/ios/chrome/browser/ui/authentication/account_menu/account_menu_view_controller.mm b/ios/chrome/browser/ui/authentication/account_menu/account_menu_view_controller.mm
index 953da72..8814a95f 100644
--- a/ios/chrome/browser/ui/authentication/account_menu/account_menu_view_controller.mm
+++ b/ios/chrome/browser/ui/authentication/account_menu/account_menu_view_controller.mm
@@ -131,7 +131,7 @@
   UIUserInterfaceIdiom idiom = [[UIDevice currentDevice] userInterfaceIdiom];
   if (idiom != UIUserInterfaceIdiomPad) {
     UIImage* closeImage =
-        SymbolWithPalette(DefaultSymbolWithConfiguration(@"xmark.circle.fill",
+        SymbolWithPalette(DefaultSymbolWithConfiguration(kXMarkCircleFillSymbol,
                                                          symbolConfiguration),
                           colors);
     UIBarButtonItem* closeButton =
@@ -174,8 +174,8 @@
   UIMenu* ellipsisMenu = [UIMenu
       menuWithChildren:@[ manageYourAccountAction, editAccountListAction ]];
   UIImage* ellipsisImage =
-      SymbolWithPalette(DefaultSymbolWithConfiguration(@"ellipsis.circle.fill",
-                                                       symbolConfiguration),
+      SymbolWithPalette(DefaultSymbolWithConfiguration(
+                            kEllipsisCircleFillSymbol, symbolConfiguration),
                         colors);
   UIBarButtonItem* ellipsisButton =
       [[UIBarButtonItem alloc] initWithImage:ellipsisImage menu:ellipsisMenu];
diff --git a/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_mediator.mm b/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_mediator.mm
index 52069572..f0cd448 100644
--- a/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_mediator.mm
+++ b/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_mediator.mm
@@ -151,6 +151,7 @@
         ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN_WITH_SYNC_PROMO:
     case signin_metrics::AccessPoint::ACCESS_POINT_PRODUCT_SPECIFICATIONS:
     case signin_metrics::AccessPoint::ACCESS_POINT_ACCOUNT_MENU:
+    case signin_metrics::AccessPoint::ACCESS_POINT_ACCOUNT_MENU_FAILED_SWITCH:
       // Nothing prevents instantiating ConsistencyDefaultAccountViewController
       // with an arbitrary entry point, API-wise. In doubt, no label is a good,
       // generic default that fits all entry points.
diff --git a/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm b/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm
index e6b220d..853c006 100644
--- a/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm
+++ b/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm
@@ -128,6 +128,7 @@
     case signin_metrics::AccessPoint::
         ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN_WITH_SYNC_PROMO:
     case signin_metrics::AccessPoint::ACCESS_POINT_ACCOUNT_MENU:
+    case signin_metrics::AccessPoint::ACCESS_POINT_ACCOUNT_MENU_FAILED_SWITCH:
     case signin_metrics::AccessPoint::ACCESS_POINT_PRODUCT_SPECIFICATIONS:
     case signin_metrics::AccessPoint::ACCESS_POINT_MAX:
       return false;
@@ -225,6 +226,7 @@
     case signin_metrics::AccessPoint::
         ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN_WITH_SYNC_PROMO:
     case signin_metrics::AccessPoint::ACCESS_POINT_ACCOUNT_MENU:
+    case signin_metrics::AccessPoint::ACCESS_POINT_ACCOUNT_MENU_FAILED_SWITCH:
     case signin_metrics::AccessPoint::ACCESS_POINT_PRODUCT_SPECIFICATIONS:
     case signin_metrics::AccessPoint::ACCESS_POINT_MAX:
       NOTREACHED_IN_MIGRATION() << "Unexpected value for access point "
@@ -324,6 +326,7 @@
     case signin_metrics::AccessPoint::
         ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN_WITH_SYNC_PROMO:
     case signin_metrics::AccessPoint::ACCESS_POINT_ACCOUNT_MENU:
+    case signin_metrics::AccessPoint::ACCESS_POINT_ACCOUNT_MENU_FAILED_SWITCH:
     case signin_metrics::AccessPoint::ACCESS_POINT_PRODUCT_SPECIFICATIONS:
     case signin_metrics::AccessPoint::ACCESS_POINT_MAX:
       NOTREACHED_IN_MIGRATION() << "Unexpected value for access point "
@@ -423,6 +426,7 @@
     case signin_metrics::AccessPoint::
         ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN_WITH_SYNC_PROMO:
     case signin_metrics::AccessPoint::ACCESS_POINT_ACCOUNT_MENU:
+    case signin_metrics::AccessPoint::ACCESS_POINT_ACCOUNT_MENU_FAILED_SWITCH:
     case signin_metrics::AccessPoint::ACCESS_POINT_PRODUCT_SPECIFICATIONS:
     case signin_metrics::AccessPoint::ACCESS_POINT_MAX:
       NOTREACHED_IN_MIGRATION() << "Unexpected value for access point "
@@ -511,6 +515,7 @@
     case signin_metrics::AccessPoint::
         ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN_WITH_SYNC_PROMO:
     case signin_metrics::AccessPoint::ACCESS_POINT_ACCOUNT_MENU:
+    case signin_metrics::AccessPoint::ACCESS_POINT_ACCOUNT_MENU_FAILED_SWITCH:
     case signin_metrics::AccessPoint::ACCESS_POINT_PRODUCT_SPECIFICATIONS:
     case signin_metrics::AccessPoint::ACCESS_POINT_MAX:
       return nullptr;
@@ -597,6 +602,7 @@
     case signin_metrics::AccessPoint::
         ACCESS_POINT_AVATAR_BUBBLE_SIGN_IN_WITH_SYNC_PROMO:
     case signin_metrics::AccessPoint::ACCESS_POINT_ACCOUNT_MENU:
+    case signin_metrics::AccessPoint::ACCESS_POINT_ACCOUNT_MENU_FAILED_SWITCH:
     case signin_metrics::AccessPoint::ACCESS_POINT_PRODUCT_SPECIFICATIONS:
     case signin_metrics::AccessPoint::ACCESS_POINT_MAX:
       return nullptr;
diff --git a/ios/chrome/browser/ui/content_suggestions/magic_stack/BUILD.gn b/ios/chrome/browser/ui/content_suggestions/magic_stack/BUILD.gn
index b23c44f..108f598d 100644
--- a/ios/chrome/browser/ui/content_suggestions/magic_stack/BUILD.gn
+++ b/ios/chrome/browser/ui/content_suggestions/magic_stack/BUILD.gn
@@ -131,6 +131,7 @@
     ":constants",
     ":public",
     "//base",
+    "//components/segmentation_platform/public",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/ntp/shared/metrics:home_metrics",
     "//ios/chrome/browser/shared/public/features",
diff --git a/ios/chrome/browser/ui/content_suggestions/magic_stack/magic_stack_collection_view.mm b/ios/chrome/browser/ui/content_suggestions/magic_stack/magic_stack_collection_view.mm
index 218c40da..4e24c7a 100644
--- a/ios/chrome/browser/ui/content_suggestions/magic_stack/magic_stack_collection_view.mm
+++ b/ios/chrome/browser/ui/content_suggestions/magic_stack/magic_stack_collection_view.mm
@@ -6,9 +6,11 @@
 
 #import "base/check.h"
 #import "base/debug/dump_without_crashing.h"
+#import "base/feature_list.h"
 #import "base/ios/block_types.h"
 #import "base/metrics/histogram_macros.h"
 #import "base/numerics/safe_conversions.h"
+#import "components/segmentation_platform/public/features.h"
 #import "ios/chrome/browser/ntp/shared/metrics/home_metrics.h"
 #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
 #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_tile_layout_util.h"
@@ -357,7 +359,6 @@
 
   // Find closest page to the current scroll offset.
   CGFloat closestPage = roundf(offset / moduleWidth);
-  closestPage = fminf(closestPage, moduleCount);
 
   if (velocity <= -kMagicStackMinimumPaginationScrollVelocity) {
     closestPage--;
@@ -369,12 +370,17 @@
     UMA_HISTOGRAM_EXACT_LINEAR(kMagicStackScrollToIndexHistogram, closestPage,
                                kMaxModuleHistogramIndex);
   }
+  closestPage = std::clamp<CGFloat>(closestPage, 0, moduleCount);
   _magicStackPage = closestPage;
-  NSArray<MagicStackModule*>* items =
-      [self.diffableDataSource.snapshot itemIdentifiers];
-  if ([items count] > 0 && !_hasSeenEphemeralCard &&
-      [self isCardEphemeral:items[_magicStackPage]]) {
-    [self.audience logEphemeralCardVisibility:items[_magicStackPage].type];
+  if (base::FeatureList::IsEnabled(
+          segmentation_platform::features::
+              kSegmentationPlatformEphemeralCardRanker)) {
+    NSArray<MagicStackModule*>* items =
+        [self.diffableDataSource.snapshot itemIdentifiers];
+    if ([items count] > 0 && !_hasSeenEphemeralCard &&
+        [self isCardEphemeral:items[_magicStackPage]]) {
+      [self.audience logEphemeralCardVisibility:items[_magicStackPage].type];
+    }
   }
   return _magicStackPage * (moduleWidth + kMagicStackSpacing) -
          [self peekOffsetForMagicStackPage:_magicStackPage];
diff --git a/ios/chrome/browser/ui/content_suggestions/magic_stack/magic_stack_collection_view_unittest.mm b/ios/chrome/browser/ui/content_suggestions/magic_stack/magic_stack_collection_view_unittest.mm
index f4662b456..625249b 100644
--- a/ios/chrome/browser/ui/content_suggestions/magic_stack/magic_stack_collection_view_unittest.mm
+++ b/ios/chrome/browser/ui/content_suggestions/magic_stack/magic_stack_collection_view_unittest.mm
@@ -4,6 +4,8 @@
 
 #import "ios/chrome/browser/ui/content_suggestions/magic_stack/magic_stack_collection_view.h"
 
+#import "base/test/scoped_feature_list.h"
+#import "components/segmentation_platform/public/features.h"
 #import "components/sync_preferences/testing_pref_service_syncable.h"
 #import "ios/chrome/browser/shared/model/prefs/pref_names.h"
 #import "ios/chrome/browser/ui/content_suggestions/cells/shortcuts_config.h"
@@ -56,6 +58,7 @@
 
  protected:
   web::WebTaskEnvironment task_environment_;
+  base::test::ScopedFeatureList scoped_feature_list_;
   sync_preferences::TestingPrefServiceSyncable pref_service_;
   UIWindow* _window;
   UIView* _superview;
@@ -68,6 +71,10 @@
 // Tests that bringing an ephemeral card into view triggers the expected
 // audience signal.
 TEST_F(MagicStackCollectionViewControllerTest, TestEphemeralCardAudienceCall) {
+  scoped_feature_list_.InitWithFeatures(
+      {segmentation_platform::features::
+           kSegmentationPlatformEphemeralCardRanker},
+      {});
   OCMExpect([audience_ logEphemeralCardVisibility:ContentSuggestionsModuleType::
                                                       kPriceTrackingPromo]);
   // Test that populating the Magic Stack triggers audience call
diff --git a/ios/chrome/browser/ui/content_suggestions/price_tracking_promo/price_tracking_promo_view_egtest.mm b/ios/chrome/browser/ui/content_suggestions/price_tracking_promo/price_tracking_promo_view_egtest.mm
index cbca0383..b675ff2 100644
--- a/ios/chrome/browser/ui/content_suggestions/price_tracking_promo/price_tracking_promo_view_egtest.mm
+++ b/ios/chrome/browser/ui/content_suggestions/price_tracking_promo/price_tracking_promo_view_egtest.mm
@@ -62,7 +62,13 @@
 
 // Tests the first opt in flow of the price tracking promo card in the magic
 // stack whereby the user has not opted into notifications in the app at all.
-- (void)testFirstOptInFlow {
+// TODO(crbug.com/365725410): Test is flaky on iPhone device.
+#if TARGET_OS_SIMULATOR
+#define MAYBE_testFirstOptInFlow testFirstOptInFlow
+#else
+#define MAYBE_testFirstOptInFlow DISABLED_testFirstOptInFlow
+#endif
+- (void)MAYBE_testFirstOptInFlow {
   [[EarlGrey selectElementWithMatcher:
                  chrome_test_util::ButtonWithAccessibilityLabelId(
                      IDS_IOS_CONTENT_SUGGESTIONS_PRICE_TRACKING_PROMO_ALLOW)]
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn b/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn
index b2d57c7..cb824f58 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn
@@ -205,6 +205,7 @@
     "//ios/chrome/browser/tabs/model/inactive_tabs:features",
     "//ios/chrome/browser/ui/authentication:eg_test_support+eg2",
     "//ios/chrome/browser/ui/popup_menu:constants",
+    "//ios/chrome/browser/ui/recent_tabs:recent_tabs_ui_constants",
     "//ios/chrome/browser/ui/settings/cells:clear_browsing_data_constants",
     "//ios/chrome/browser/ui/settings/password:eg_test_support+eg2",
     "//ios/chrome/browser/ui/tab_switcher/tab_grid/grid:grid_ui_constants",
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/quick_delete_egtest.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/quick_delete_egtest.mm
index b74cb81..fa746dc 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/quick_delete_egtest.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/quick_delete_egtest.mm
@@ -18,6 +18,7 @@
 #import "ios/chrome/browser/tabs/model/inactive_tabs/features.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/recent_tabs/recent_tabs_constants.h"
 #import "ios/chrome/browser/ui/settings/cells/clear_browsing_data_constants.h"
 #import "ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_ui_constants.h"
 #import "ios/chrome/browser/ui/settings/clear_browsing_data/features.h"
@@ -43,6 +44,7 @@
 using chrome_test_util::ContainsPartialText;
 using chrome_test_util::ContextMenuItemWithAccessibilityLabel;
 using chrome_test_util::CreateTabGroupCreateButton;
+using chrome_test_util::RecentTabsDestinationButton;
 using chrome_test_util::SettingsMenuPrivacyButton;
 using chrome_test_util::TabGridCellAtIndex;
 using chrome_test_util::TabGridGroupCellAtIndex;
@@ -642,6 +644,23 @@
   // be visible by the end.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::TabGridNewTabButton()]
       performAction:grey_tap()];
+
+  // Go to Recent Tabs.
+  [ChromeEarlGrey loadURL:self.testServer->GetURL("/echo")];
+  [ChromeEarlGrey waitForWebStateContainingText:"Echo"];
+  [ChromeEarlGreyUI openToolsMenu];
+  [ChromeEarlGreyUI tapToolsMenuButton:RecentTabsDestinationButton()];
+
+  // Check that the tabs closed through Quick Delete are not shown in Recent
+  // Tabs.
+  id<GREYMatcher> recentTabsTable = grey_accessibilityID(
+      kRecentTabsTableViewControllerAccessibilityIdentifier);
+  id<GREYMatcher> titleOfPage =
+      grey_allOf(grey_ancestor(recentTabsTable),
+                 chrome_test_util::StaticTextWithAccessibilityLabel(@"Echo"),
+                 grey_sufficientlyVisible(), nil);
+  [[EarlGrey selectElementWithMatcher:titleOfPage]
+      assertWithMatcher:grey_nil()];
 }
 
 // Tests that when Quick Delete is opened from Privacy Settings and tabs are
diff --git a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_egtest.mm b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_egtest.mm
index cf4ef93..d0ff16e6 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_egtest.mm
+++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_egtest.mm
@@ -411,7 +411,15 @@
 
 // Check the button visibility of the toolbar when the omnibox is focused from a
 // different orientation than the default one.
-- (void)testFocusOmniboxFromOtherOrientation {
+// TODO(crbug.com/365474269): The test is flaky on simulator.
+#if TARGET_OS_SIMULATOR
+#define MAYBE_testFocusOmniboxFromOtherOrientation \
+  FLAKY_testFocusOmniboxFromOtherOrientation
+#else
+#define MAYBE_testFocusOmniboxFromOtherOrientation \
+  testFocusOmniboxFromOtherOrientation
+#endif
+- (void)MAYBE_testFocusOmniboxFromOtherOrientation {
   // Load a page to have the toolbar visible (hidden on NTP).
   [ChromeEarlGrey loadURL:GURL("chrome://version")];
 
@@ -447,7 +455,13 @@
 
 // Check the button visibility of the toolbar when the omnibox is focused from
 // the default orientation.
-- (void)testFocusOmniboxFromPortrait {
+// TODO(crbug.com/364160530): The test is flaky on simulator.
+#if TARGET_OS_SIMULATOR
+#define MAYBE_testFocusOmniboxFromPortrait FLAKY_testFocusOmniboxFromPortrait
+#else
+#define MAYBE_testFocusOmniboxFromPortrait testFocusOmniboxFromPortrait
+#endif
+- (void)FLAKY_testFocusOmniboxFromPortrait {
   // Load a page to have the toolbar visible (hidden on NTP).
   [ChromeEarlGrey loadURL:GURL("chrome://version")];
 
diff --git a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1
index d1cca43..4a41ffab 100644
--- a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-d71f04b7a234158e6e97514e4680c16db2bf1909
\ No newline at end of file
+b7b40c4e5d41aa3b8624bf653e9a35bd4f7f5b2f
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
index 6b8c593b..8778925 100644
--- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-6ada6da53ce3f2e0b640a5d0367f4a6253d77685
\ No newline at end of file
+be0e96001503998b65155e5ff5daa1f9f52bb929
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
index 33716a95..f7696645 100644
--- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-0402e8abb2dc5694ae9111166cb4566a2d2664e0
\ No newline at end of file
+64251310a19ad64ef82f35373c868d3250b722dd
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1
index d5cd20b..45b4f97 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-4caf2377e1e579c7cb3ca2aec0c8e0994ef4d680
\ No newline at end of file
+5b67552fc46ca3ac8ff9c73e4ee5d51f835f3989
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1
index 831ac73..3464710 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-d40b790720631609451cdecbfd4073ec90098b26
\ No newline at end of file
+7b969ac886269b238121839a17169ecb02687fa1
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
index 00533d8f..966f024 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-c13a863aa3770699b709292809c0c696bd752d02
\ No newline at end of file
+9522cc30a2afad8a6bc902d29b8d10beff3e26ef
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
index c2938f45..6b5694c 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-eb4faf6c0794648feaf765ec220a7f8e81b876fd
\ No newline at end of file
+07053345fa9b82239bb2270e0974a362ab0eb54b
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
index d47752e..a82c770a 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-670f77ab983e644e9d8569b7669729dcdcaa836e
\ No newline at end of file
+5c7b30a7b49c3abd9eb0308c956046c3fccbe8d6
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
index 9024810..475de3b 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-69e86ff0247ac4d6166deabf65e3d8c69de39572
\ No newline at end of file
+3db0ef3114dc54e4c0052847b1c26dfb069edb6b
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
index 74792fe..116f893a 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-85a99ea449732c34b2f35fefcacdc3d4970912ab
\ No newline at end of file
+bf97281d250c47122d58c3134f24cf3d0007384c
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
index 0c5a938..d76cb6d0 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-2e852b4fbe46e40a01d6de54c1f1ade5b60d7170
\ No newline at end of file
+785fea6937a3d94dfb853003339b03374f07861b
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
index 290dec5..a0b2d11 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-b4fc6ffe819c0c571ec4eee90beef4603c150022
\ No newline at end of file
+65635d15714d494531577a12d027f0d844f5d958
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
index 5dcf50e..f4036fa 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-ffa1aefcfacc4a96f9e72526695a0cb64377f773
\ No newline at end of file
+c77f7c1c9334e440b951d30401d3450a62cc972f
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
index 44318c1..1d8a8df 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-e355ca4ce9ce61182b2dc544bff3eebce0e7a022
\ No newline at end of file
+7305d40340698258daa30971d1694ce83c92b4e3
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
index 1b99711..a26a18b 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-c9feb368b9dfe31f3cfc948b601d7839f77680d9
\ No newline at end of file
+30aee42fc5d308731545e65848e927cfe88f37fd
\ No newline at end of file
diff --git a/ios_internal b/ios_internal
index 0b65641..2091388 160000
--- a/ios_internal
+++ b/ios_internal
@@ -1 +1 @@
-Subproject commit 0b6564166940fa48dc3a219f6d4eda6e3188f8e3
+Subproject commit 2091388e503d97e226e4033bd616b11f5c2e19c8
diff --git a/media/capture/capture_switches.cc b/media/capture/capture_switches.cc
index fa35824..35ea9b6b 100644
--- a/media/capture/capture_switches.cc
+++ b/media/capture/capture_switches.cc
@@ -33,7 +33,7 @@
 #if BUILDFLAG(IS_WIN)
 BASE_FEATURE(kMediaFoundationCameraUsageMonitoring,
              "MediaFoundationCameraUsageMonitoring",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 bool IsMediaFoundationCameraUsageMonitoringEnabled() {
   return base::FeatureList::IsEnabled(kMediaFoundationCameraUsageMonitoring);
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins
index fc68e928..7b97b5a 100644
--- a/net/http/transport_security_state_static.pins
+++ b/net/http/transport_security_state_static.pins
@@ -43,9 +43,9 @@
 #   hash function for preloaded entries again (we have already done so once).
 #
 
-# Last updated: 2024-09-05 12:55 UTC
+# Last updated: 2024-09-10 12:56 UTC
 PinsListTimestamp
-1725540942
+1725972974
 
 TestSPKI
 sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/net/http/transport_security_state_static_pins.json b/net/http/transport_security_state_static_pins.json
index 069fc57..b7a8fcf 100644
--- a/net/http/transport_security_state_static_pins.json
+++ b/net/http/transport_security_state_static_pins.json
@@ -31,7 +31,7 @@
 // the 'static_spki_hashes' and 'bad_static_spki_hashes' fields in 'pinsets'
 // refer to, and the timestamp at which the pins list was last updated.
 //
-// Last updated: 2024-09-05 12:55 UTC
+// Last updated: 2024-09-10 12:56 UTC
 //
 {
   "pinsets": [
diff --git a/net/quic/quic_context.h b/net/quic/quic_context.h
index 9da93d8..4c7cdb6 100644
--- a/net/quic/quic_context.h
+++ b/net/quic/quic_context.h
@@ -238,6 +238,10 @@
   // If true, skip DNS resolution for a hostname if the ORIGIN frame received
   // during an ongoing session encompasses that hostname.
   bool skip_dns_with_origin_frame = false;
+
+  // If true, a request will be sent on the existing session iff the hostname
+  // matches the certificate presented during the handshake.
+  bool ignore_ip_matching_when_finding_existing_sessions = false;
 };
 
 // QuicContext contains QUIC-related variables that are shared across all of the
diff --git a/net/quic/quic_session_pool.cc b/net/quic/quic_session_pool.cc
index 412b2cf..9c1fe38 100644
--- a/net/quic/quic_session_pool.cc
+++ b/net/quic/quic_session_pool.cc
@@ -195,17 +195,6 @@
   }
 }
 
-// Checks if `destination` matches the alias key of `session`. If
-// `match_received_origins` is true, also checks if `destination` matches any of
-// its received origins. Returns true on any match.
-bool DestinationInAliasOrReceivedOrigins(QuicChromiumClientSession* session,
-                                         const url::SchemeHostPort& destination,
-                                         bool match_received_origins) {
-  return destination == session->session_alias_key().destination() ||
-         (match_received_origins &&
-          session->received_origins().contains(destination));
-}
-
 // An implementation of quic::QuicCryptoClientConfig::ServerIdFilter that wraps
 // an |origin_filter|.
 class ServerIdOriginFilter
@@ -541,7 +530,10 @@
           NetworkAnonymizationKey::IsPartitioningEnabled()),
       report_ecn_(quic_context->params()->report_ecn),
       skip_dns_with_origin_frame_(
-          quic_context->params()->skip_dns_with_origin_frame) {
+          quic_context->params()->skip_dns_with_origin_frame),
+      ignore_ip_matching_when_finding_existing_sessions_(
+          quic_context->params()
+              ->ignore_ip_matching_when_finding_existing_sessions) {
   DCHECK(transport_security_state_);
   DCHECK(http_server_properties_);
   if (params_.disable_tls_zero_rtt) {
@@ -592,10 +584,7 @@
 
   for (const auto& key_value : active_sessions_) {
     QuicChromiumClientSession* session = key_value.second;
-    // Check received origins and "remote" (alternative service and origin have
-    // different hostnames) alt-svc for this active session.
-    if (DestinationInAliasOrReceivedOrigins(session, destination,
-                                            skip_dns_with_origin_frame_) &&
+    if (CanWaiveIpMatching(destination, session) &&
         session->CanPool(session_key.host(), session_key)) {
       return session;
     }
@@ -956,6 +945,29 @@
                      std::move(callback), rv));
 }
 
+bool QuicSessionPool::CanWaiveIpMatching(
+    const url::SchemeHostPort& destination,
+    QuicChromiumClientSession* session) const {
+  // Checks if `destination` matches the alias key of `session`.
+  if (destination == session->session_alias_key().destination()) {
+    return true;
+  }
+
+  if (ignore_ip_matching_when_finding_existing_sessions_ &&
+      session->config()->HasReceivedConnectionOptions() &&
+      quic::ContainsQuicTag(session->config()->ReceivedConnectionOptions(),
+                            quic::kNOIP)) {
+    return true;
+  }
+
+  // Check received origins.
+  if (skip_dns_with_origin_frame_ &&
+      session->received_origins().contains(destination)) {
+    return true;
+  }
+  return false;
+}
+
 void QuicSessionPool::OnFinishConnectAndConfigureSocketError(
     CompletionOnceCallback callback,
     enum CreateSessionFailure error,
@@ -1365,7 +1377,12 @@
       continue;
     }
     can_pool = true;
-    if (session->received_origins().contains(key.destination())) {
+    // TODO(fayang): consider to use CanWaiveIpMatching().
+    if (session->received_origins().contains(key.destination()) ||
+        (ignore_ip_matching_when_finding_existing_sessions_ &&
+         session->config()->HasReceivedConnectionOptions() &&
+         quic::ContainsQuicTag(session->config()->ReceivedConnectionOptions(),
+                               quic::kNOIP))) {
       std::set<std::string> dns_aliases;
       if (use_dns_aliases) {
         dns_aliases = aliases;
diff --git a/net/quic/quic_session_pool.h b/net/quic/quic_session_pool.h
index 60d10f4..6580fe3 100644
--- a/net/quic/quic_session_pool.h
+++ b/net/quic/quic_session_pool.h
@@ -563,6 +563,10 @@
                             const std::vector<IPEndPoint>& ip_endpoints,
                             const std::set<std::string>& aliases,
                             bool use_dns_aliases);
+  // Returns true if IP matching can be waived when trying to send requests to
+  // |destination| on |session|.
+  bool CanWaiveIpMatching(const url::SchemeHostPort& destination,
+                          QuicChromiumClientSession* session) const;
   void OnJobComplete(Job* job, int rv);
   bool HasActiveSession(const QuicSessionKey& session_key) const;
   bool HasActiveJob(const QuicSessionKey& session_key) const;
@@ -852,6 +856,10 @@
   // an active session encompasses that hostname.
   const bool skip_dns_with_origin_frame_;
 
+  // If true, a request will be sent on the existing session iff the hostname
+  // matches the certificate presented during the handshake.
+  const bool ignore_ip_matching_when_finding_existing_sessions_;
+
   quic::DeterministicConnectionIdGenerator connection_id_generator_{
       quic::kQuicDefaultConnectionIdLength};
 
diff --git a/net/quic/quic_session_pool_test.cc b/net/quic/quic_session_pool_test.cc
index 1584ec8..15b5b4b 100644
--- a/net/quic/quic_session_pool_test.cc
+++ b/net/quic/quic_session_pool_test.cc
@@ -1535,6 +1535,53 @@
   socket_data.ExpectAllWriteDataConsumed();
 }
 
+TEST_P(QuicSessionPoolTest,
+       IgnoreIpMatchingWhenFindingExistingSessionsAndSkipDns) {
+  quic_params_->ignore_ip_matching_when_finding_existing_sessions = true;
+  Initialize();
+  ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
+  crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+
+  MockQuicData socket_data(version_);
+  socket_data.AddReadPauseForever();
+  socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
+  socket_data.AddSocketDataToFactory(socket_factory_.get());
+
+  url::SchemeHostPort server2(url::kHttpsScheme, kServer2HostName,
+                              kDefaultServerPort);
+  host_resolver_->set_synchronous_mode(true);
+  host_resolver_->rules()->AddIPLiteralRule(kDefaultServerHostName,
+                                            "192.168.0.1", "");
+
+  // Establish a QUIC session to pool against.
+  RequestBuilder builder(this);
+  EXPECT_EQ(ERR_IO_PENDING, builder.CallRequest());
+  EXPECT_THAT(callback_.WaitForResult(), IsOk());
+  std::unique_ptr<HttpStream> stream = CreateStream(&builder.request);
+  EXPECT_TRUE(stream.get());
+
+  // Receive NOIP connection option.
+  quic::QuicTagVector initial_received_options;
+  initial_received_options.push_back(quic::kNOIP);
+  EXPECT_TRUE(
+      GetActiveSession(kDefaultDestination)
+          ->config()
+          ->SetInitialReceivedConnectionOptions(initial_received_options));
+
+  // `server2` can pool with the existing session and DNS gets skipped.
+  TestCompletionCallback callback;
+  RequestBuilder builder2(this);
+  builder2.destination = server2;
+  builder2.url = GURL(kServer2Url);
+  ASSERT_EQ(OK, builder2.CallRequest());
+  std::unique_ptr<HttpStream> stream2 = CreateStream(&builder2.request);
+  EXPECT_TRUE(stream2.get());
+  EXPECT_EQ(GetActiveSession(kDefaultDestination), GetActiveSession(server2));
+
+  socket_data.ExpectAllReadDataConsumed();
+  socket_data.ExpectAllWriteDataConsumed();
+}
+
 TEST_P(QuicSessionPoolTest, Pooling) {
   quic_params_->supported_versions = {version_};
   Initialize();
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 62b55fb..59349cbd 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -5937,6 +5937,31 @@
             ]
         }
     ],
+    "Compare": [
+        {
+            "platforms": [
+                "chromeos",
+                "chromeos_lacros",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled_Dogfood",
+                    "enable_features": [
+                        "ProductSpecifications"
+                    ]
+                },
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "ProductSpecifications"
+                    ]
+                }
+            ]
+        }
+    ],
     "ComposeModelQualityLogging": [
         {
             "platforms": [
@@ -12044,6 +12069,21 @@
             ]
         }
     ],
+    "IOSNewSyncOptInIllustration": [
+        {
+            "platforms": [
+                "ios"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "NewSyncOptInIllustration"
+                    ]
+                }
+            ]
+        }
+    ],
     "IOSOverflowMenuCustomization": [
         {
             "platforms": [
@@ -25574,10 +25614,10 @@
             ]
         }
     ],
-    "WebGPUUseTintIR_V2": [
+    "WebGPUUseTintIR": [
         {
             "platforms": [
-                "chromeos"
+                "mac"
             ],
             "experiments": [
                 {
@@ -26283,6 +26323,22 @@
             ]
         }
     ],
+    "WebViewAutoGrantStorageAccessAPI": [
+        {
+            "platforms": [
+                "android_webview"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "WebViewAutoSAA",
+                        "WebViewDigitalAssetLinksLoadIncludes"
+                    ]
+                }
+            ]
+        }
+    ],
     "WebViewExitReasonMetric": [
         {
             "platforms": [
diff --git a/third_party/angle b/third_party/angle
index 20b6689..d40d1a6 160000
--- a/third_party/angle
+++ b/third_party/angle
@@ -1 +1 @@
-Subproject commit 20b66890c9dbfbc17b31f62dde687ab104220e2e
+Subproject commit d40d1a678bf857004273430b0b2137fd79921d86
diff --git a/third_party/bidimapper/README.chromium b/third_party/bidimapper/README.chromium
index a221bc5..3934c4b 100644
--- a/third_party/bidimapper/README.chromium
+++ b/third_party/bidimapper/README.chromium
@@ -1,10 +1,10 @@
 Name: Implementation of WebDriver BiDi standard
 Short Name: chromium-bidi
-URL: https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.6.4.tgz
-Version: 0.6.4
-Date: 2024-08-05
-Revision: 54dab6c913ef15cd1a12594e97d716ca3f7ca9e6
-SHA-512: a0bece1b2306539dbdcc03dc5ae7131461499cfb68191c8d0556fb18ae388843c336b1ab094b4b0af8dc7625152a6de777ce59b1d96e93e1c958cd957c1ba904
+URL: https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.7.0.tgz
+Version: 0.7.0
+Date: 2024-09-05
+Revision: 46546defe5111fe4a33ebc947e0c684202e86222
+SHA-512: 13d55192a5beaaeadb187bff8cd10ee7e31f20a2f53508b8dfd3e732c5a146fb6ace63457e4ff371082cab24d0b837b01def74277e2af8b94ae30d7554132029
 License: Apache 2.0
 License File: LICENSE
 Shipped: yes
@@ -32,7 +32,7 @@
 The upstream is maintained by the Chromium developers.
 All the changes must be done there.
 
-The source code of the current revision can be found at the following url: https://github.com/GoogleChromeLabs/chromium-bidi/archive/54dab6c913ef15cd1a12594e97d716ca3f7ca9e6.zip
+The source code of the current revision can be found at the following url: https://github.com/GoogleChromeLabs/chromium-bidi/archive/46546defe5111fe4a33ebc947e0c684202e86222.zip
 
 -------------------- DEPENDENCY DIVIDER --------------------
 
@@ -47,17 +47,6 @@
 
 -------------------- DEPENDENCY DIVIDER --------------------
 
-Name: urlpattern-polyfill
-URL: https://github.com/kenchris/urlpattern-polyfill
-Version: 10.0.0
-License: MIT
-Revision: 039357b28b68e3d68f59d7c6af0138cd25a91914
-Security Critical: no
-Shipped: yes
-License File: licenses/LICENSE.urlpattern_polyfill
-
--------------------- DEPENDENCY DIVIDER --------------------
-
 Name: zod
 URL: https://zod.dev
 Version: 3.23.8
diff --git a/third_party/bidimapper/licenses/LICENSE.urlpattern_polyfill b/third_party/bidimapper/licenses/LICENSE.urlpattern_polyfill
deleted file mode 100644
index 6e95fa3c..0000000
--- a/third_party/bidimapper/licenses/LICENSE.urlpattern_polyfill
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright 2020 Intel Corporation
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/third_party/bidimapper/mapper.js b/third_party/bidimapper/mapper.js
index 866819b..ead596e7 100644
--- a/third_party/bidimapper/mapper.js
+++ b/third_party/bidimapper/mapper.js
@@ -2358,6 +2358,12 @@
 	                        break;
 	                    case "pen" /* Input.PointerType.Pen */:
 	                        if (source.pressed.size !== 0) {
+	                            // Empty `source.pressed.size` means the pen is not detected by digitizer.
+	                            // Dispatch a mouse event for the pen only if either:
+	                            // 1. the pen is hovering over the digitizer (0);
+	                            // 2. the pen is in contact with the digitizer (1);
+	                            // 3. the pen has at least one button pressed (2, 4, etc).
+	                            // https://www.w3.org/TR/pointerevents/#the-buttons-property
 	                            // TODO: Implement width and height when available.
 	                            await this.#context.cdpTarget.cdpClient.sendCommand('Input.dispatchMouseEvent', {
 	                                type: 'mouseMoved',
@@ -2372,7 +2378,7 @@
 	                                tiltX,
 	                                tiltY,
 	                                twist,
-	                                force: pressure,
+	                                force: pressure ?? 0.5,
 	                            });
 	                        }
 	                        break;
@@ -2708,6 +2714,7 @@
 	    return;
 	};
 	function getCdpButton(button) {
+	    // https://www.w3.org/TR/pointerevents/#the-button-property
 	    switch (button) {
 	        case 0:
 	            return 'left';
@@ -2725,7 +2732,7 @@
 	}
 	function getTilt(action) {
 	    // https://w3c.github.io/pointerevents/#converting-between-tiltx-tilty-and-altitudeangle-azimuthangle
-	    const altitudeAngle = action.altitudeAngle ?? 0;
+	    const altitudeAngle = action.altitudeAngle ?? Math.PI / 2;
 	    const azimuthAngle = action.azimuthAngle ?? 0;
 	    let tiltXRadians = 0;
 	    let tiltYRadians = 0;
@@ -3004,11 +3011,9 @@
 	const InputStateManager_js_1 = InputStateManager$1;
 	class InputProcessor {
 	    #browsingContextStorage;
-	    #realmStorage;
 	    #inputStateManager = new InputStateManager_js_1.InputStateManager();
-	    constructor(browsingContextStorage, realmStorage) {
+	    constructor(browsingContextStorage) {
 	        this.#browsingContextStorage = browsingContextStorage;
-	        this.#realmStorage = realmStorage;
 	    }
 	    async performActions(params) {
 	        const context = this.#browsingContextStorage.getContext(params.context);
@@ -3175,6 +3180,33 @@
 
 	var NetworkProcessor$1 = {};
 
+	var UrlPatternBrowser = {};
+
+	/**
+	 * Copyright 2024 Google LLC.
+	 * Copyright (c) Microsoft Corporation.
+	 *
+	 * Licensed under the Apache License, Version 2.0 (the "License");
+	 * you may not use this file except in compliance with the License.
+	 * You may obtain a copy of the License at
+	 *
+	 *     http://www.apache.org/licenses/LICENSE-2.0
+	 *
+	 * Unless required by applicable law or agreed to in writing, software
+	 * distributed under the License is distributed on an "AS IS" BASIS,
+	 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+	 * See the License for the specific language governing permissions and
+	 * limitations under the License.
+	 */
+	Object.defineProperty(UrlPatternBrowser, "__esModule", { value: true });
+	UrlPatternBrowser.URLPattern = void 0;
+	const URLPattern = globalThis
+	    .URLPattern;
+	UrlPatternBrowser.URLPattern = URLPattern;
+	if (!URLPattern) {
+	    throw new Error('Unable to find URLPattern');
+	}
+
 	/**
 	 * Copyright 2023 Google LLC.
 	 * Copyright (c) Microsoft Corporation.
@@ -3194,6 +3226,7 @@
 	Object.defineProperty(NetworkProcessor$1, "__esModule", { value: true });
 	NetworkProcessor$1.NetworkProcessor = void 0;
 	const protocol_js_1$i = protocol;
+	const UrlPattern_js_1$1 = UrlPatternBrowser;
 	/** Dispatches Network domain commands. */
 	class NetworkProcessor {
 	    #browsingContextStorage;
@@ -3420,7 +3453,7 @@
 	                        throw new protocol_js_1$i.InvalidArgumentException(`URL pattern must specify a port`);
 	                    }
 	                    try {
-	                        new URLPattern(urlPattern);
+	                        new UrlPattern_js_1$1.URLPattern(urlPattern);
 	                    }
 	                    catch (error) {
 	                        throw new protocol_js_1$i.InvalidArgumentException(`${error}`);
@@ -3967,15 +4000,42 @@
 	const protocol_js_1$f = protocol;
 	const PreloadScript_js_1 = PreloadScript$1;
 	class ScriptProcessor {
+	    #eventManager;
 	    #browsingContextStorage;
 	    #realmStorage;
 	    #preloadScriptStorage;
 	    #logger;
-	    constructor(browsingContextStorage, realmStorage, preloadScriptStorage, logger) {
+	    constructor(eventManager, browsingContextStorage, realmStorage, preloadScriptStorage, logger) {
 	        this.#browsingContextStorage = browsingContextStorage;
 	        this.#realmStorage = realmStorage;
 	        this.#preloadScriptStorage = preloadScriptStorage;
 	        this.#logger = logger;
+	        this.#eventManager = eventManager;
+	        this.#eventManager.addSubscribeHook(protocol_js_1$f.ChromiumBidi.Script.EventNames.RealmCreated, this.#onRealmCreatedSubscribeHook.bind(this));
+	    }
+	    #onRealmCreatedSubscribeHook(contextId) {
+	        const context = this.#browsingContextStorage.getContext(contextId);
+	        const contextsToReport = [
+	            context,
+	            ...this.#browsingContextStorage.getContext(contextId).allChildren,
+	        ];
+	        const realms = new Set();
+	        for (const reportContext of contextsToReport) {
+	            const realmsForContext = this.#realmStorage.findRealms({
+	                browsingContextId: reportContext.id,
+	            });
+	            for (const realm of realmsForContext) {
+	                realms.add(realm);
+	            }
+	        }
+	        for (const realm of realms) {
+	            this.#eventManager.registerEvent({
+	                type: 'event',
+	                method: protocol_js_1$f.ChromiumBidi.Script.EventNames.RealmCreated,
+	                params: realm.realmInfo,
+	            }, context.id);
+	        }
+	        return Promise.resolve();
 	    }
 	    async addPreloadScript(params) {
 	        const contexts = this.#browsingContextStorage.verifyTopLevelContextsList(params.contexts);
@@ -4192,45 +4252,6 @@
 	    return Buffer.from(base64Str, 'base64').toString('ascii');
 	}
 
-	var UrlPattern = {};
-
-	var M=Object.defineProperty;var Pe=Object.getOwnPropertyDescriptor;var Re=Object.getOwnPropertyNames;var Ee=Object.prototype.hasOwnProperty;var Oe=(e,t)=>{for(var r in t)M(e,r,{get:t[r],enumerable:!0});},ke=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of Re(t))!Ee.call(e,a)&&a!==r&&M(e,a,{get:()=>t[a],enumerable:!(n=Pe(t,a))||n.enumerable});return e};var Te=e=>ke(M({},"__esModule",{value:!0}),e);var Ne={};Oe(Ne,{URLPattern:()=>Y});var urlpattern=Te(Ne);var R=class{type=3;name="";prefix="";value="";suffix="";modifier=3;constructor(t,r,n,a,c,l){this.type=t,this.name=r,this.prefix=n,this.value=a,this.suffix=c,this.modifier=l;}hasCustomName(){return this.name!==""&&typeof this.name!="number"}},Ae=/[$_\p{ID_Start}]/u,ye=/[$_\u200C\u200D\p{ID_Continue}]/u,v=".*";function we(e,t){return (/^[\x00-\x7F]*$/).test(e)}function D(e,t=!1){let r=[],n=0;for(;n<e.length;){let a=e[n],c=function(l){if(!t)throw new TypeError(l);r.push({type:"INVALID_CHAR",index:n,value:e[n++]});};if(a==="*"){r.push({type:"ASTERISK",index:n,value:e[n++]});continue}if(a==="+"||a==="?"){r.push({type:"OTHER_MODIFIER",index:n,value:e[n++]});continue}if(a==="\\"){r.push({type:"ESCAPED_CHAR",index:n++,value:e[n++]});continue}if(a==="{"){r.push({type:"OPEN",index:n,value:e[n++]});continue}if(a==="}"){r.push({type:"CLOSE",index:n,value:e[n++]});continue}if(a===":"){let l="",s=n+1;for(;s<e.length;){let i=e.substr(s,1);if(s===n+1&&Ae.test(i)||s!==n+1&&ye.test(i)){l+=e[s++];continue}break}if(!l){c(`Missing parameter name at ${n}`);continue}r.push({type:"NAME",index:n,value:l}),n=s;continue}if(a==="("){let l=1,s="",i=n+1,o=!1;if(e[i]==="?"){c(`Pattern cannot start with "?" at ${i}`);continue}for(;i<e.length;){if(!we(e[i])){c(`Invalid character '${e[i]}' at ${i}.`),o=!0;break}if(e[i]==="\\"){s+=e[i++]+e[i++];continue}if(e[i]===")"){if(l--,l===0){i++;break}}else if(e[i]==="("&&(l++,e[i+1]!=="?")){c(`Capturing groups are not allowed at ${i}`),o=!0;break}s+=e[i++];}if(o)continue;if(l){c(`Unbalanced pattern at ${n}`);continue}if(!s){c(`Missing pattern at ${n}`);continue}r.push({type:"REGEX",index:n,value:s}),n=i;continue}r.push({type:"CHAR",index:n,value:e[n++]});}return r.push({type:"END",index:n,value:""}),r}function F(e,t={}){let r=D(e);t.delimiter??="/#?",t.prefixes??="./";let n=`[^${S(t.delimiter)}]+?`,a=[],c=0,l=0,i=new Set,o=h=>{if(l<r.length&&r[l].type===h)return r[l++].value},f=()=>o("OTHER_MODIFIER")??o("ASTERISK"),d=h=>{let u=o(h);if(u!==void 0)return u;let{type:p,index:A}=r[l];throw new TypeError(`Unexpected ${p} at ${A}, expected ${h}`)},T=()=>{let h="",u;for(;u=o("CHAR")??o("ESCAPED_CHAR");)h+=u;return h},xe=h=>h,L=t.encodePart||xe,I="",U=h=>{I+=h;},$=()=>{I.length&&(a.push(new R(3,"","",L(I),"",3)),I="");},X=(h,u,p,A,Z)=>{let g=3;switch(Z){case"?":g=1;break;case"*":g=0;break;case"+":g=2;break}if(!u&&!p&&g===3){U(h);return}if($(),!u&&!p){if(!h)return;a.push(new R(3,"","",L(h),"",g));return}let m;p?p==="*"?m=v:m=p:m=n;let O=2;m===n?(O=1,m=""):m===v&&(O=0,m="");let P;if(u?P=u:p&&(P=c++),i.has(P))throw new TypeError(`Duplicate name '${P}'.`);i.add(P),a.push(new R(O,P,L(h),m,L(A),g));};for(;l<r.length;){let h=o("CHAR"),u=o("NAME"),p=o("REGEX");if(!u&&!p&&(p=o("ASTERISK")),u||p){let g=h??"";t.prefixes.indexOf(g)===-1&&(U(g),g=""),$();let m=f();X(g,u,p,"",m);continue}let A=h??o("ESCAPED_CHAR");if(A){U(A);continue}if(o("OPEN")){let g=T(),m=o("NAME"),O=o("REGEX");!m&&!O&&(O=o("ASTERISK"));let P=T();d("CLOSE");let be=f();X(g,m,O,P,be);continue}$(),d("END");}return a}function S(e){return e.replace(/([.+*?^${}()[\]|/\\])/g,"\\$1")}function B(e){return e&&e.ignoreCase?"ui":"u"}function q(e,t,r){return W(F(e,r),t,r)}function k(e){switch(e){case 0:return "*";case 1:return "?";case 2:return "+";case 3:return ""}}function W(e,t,r={}){r.delimiter??="/#?",r.prefixes??="./",r.sensitive??=!1,r.strict??=!1,r.end??=!0,r.start??=!0,r.endsWith="";let n=r.start?"^":"";for(let s of e){if(s.type===3){s.modifier===3?n+=S(s.value):n+=`(?:${S(s.value)})${k(s.modifier)}`;continue}t&&t.push(s.name);let i=`[^${S(r.delimiter)}]+?`,o=s.value;if(s.type===1?o=i:s.type===0&&(o=v),!s.prefix.length&&!s.suffix.length){s.modifier===3||s.modifier===1?n+=`(${o})${k(s.modifier)}`:n+=`((?:${o})${k(s.modifier)})`;continue}if(s.modifier===3||s.modifier===1){n+=`(?:${S(s.prefix)}(${o})${S(s.suffix)})`,n+=k(s.modifier);continue}n+=`(?:${S(s.prefix)}`,n+=`((?:${o})(?:`,n+=S(s.suffix),n+=S(s.prefix),n+=`(?:${o}))*)${S(s.suffix)})`,s.modifier===0&&(n+="?");}let a=`[${S(r.endsWith)}]|$`,c=`[${S(r.delimiter)}]`;if(r.end)return r.strict||(n+=`${c}?`),r.endsWith.length?n+=`(?=${a})`:n+="$",new RegExp(n,B(r));r.strict||(n+=`(?:${c}(?=${a}))?`);let l=!1;if(e.length){let s=e[e.length-1];s.type===3&&s.modifier===3&&(l=r.delimiter.indexOf(s)>-1);}return l||(n+=`(?=${c}|${a})`),new RegExp(n,B(r))}var x={delimiter:"",prefixes:"",sensitive:!0,strict:!0},J={delimiter:".",prefixes:"",sensitive:!0,strict:!0},Q={delimiter:"/",prefixes:"/",sensitive:!0,strict:!0};function ee(e,t){return e.length?e[0]==="/"?!0:!t||e.length<2?!1:(e[0]=="\\"||e[0]=="{")&&e[1]=="/":!1}function te(e,t){return e.startsWith(t)?e.substring(t.length,e.length):e}function Ce(e,t){return e.endsWith(t)?e.substr(0,e.length-t.length):e}function _(e){return !e||e.length<2?!1:e[0]==="["||(e[0]==="\\"||e[0]==="{")&&e[1]==="["}var re=["ftp","file","http","https","ws","wss"];function N(e){if(!e)return !0;for(let t of re)if(e.test(t))return !0;return !1}function ne(e,t){if(e=te(e,"#"),t||e==="")return e;let r=new URL("https://example.com");return r.hash=e,r.hash?r.hash.substring(1,r.hash.length):""}function se(e,t){if(e=te(e,"?"),t||e==="")return e;let r=new URL("https://example.com");return r.search=e,r.search?r.search.substring(1,r.search.length):""}function ie(e,t){return t||e===""?e:_(e)?K(e):j(e)}function ae(e,t){if(t||e==="")return e;let r=new URL("https://example.com");return r.password=e,r.password}function oe(e,t){if(t||e==="")return e;let r=new URL("https://example.com");return r.username=e,r.username}function ce(e,t,r){if(r||e==="")return e;if(t&&!re.includes(t))return new URL(`${t}:${e}`).pathname;let n=e[0]=="/";return e=new URL(n?e:"/-"+e,"https://example.com").pathname,n||(e=e.substring(2,e.length)),e}function le(e,t,r){return z(t)===e&&(e=""),r||e===""?e:G(e)}function fe(e,t){return e=Ce(e,":"),t||e===""?e:y(e)}function z(e){switch(e){case"ws":case"http":return "80";case"wws":case"https":return "443";case"ftp":return "21";default:return ""}}function y(e){if(e==="")return e;if(/^[-+.A-Za-z0-9]*$/.test(e))return e.toLowerCase();throw new TypeError(`Invalid protocol '${e}'.`)}function he(e){if(e==="")return e;let t=new URL("https://example.com");return t.username=e,t.username}function ue(e){if(e==="")return e;let t=new URL("https://example.com");return t.password=e,t.password}function j(e){if(e==="")return e;if(/[\t\n\r #%/:<>?@[\]^\\|]/g.test(e))throw new TypeError(`Invalid hostname '${e}'`);let t=new URL("https://example.com");return t.hostname=e,t.hostname}function K(e){if(e==="")return e;if(/[^0-9a-fA-F[\]:]/g.test(e))throw new TypeError(`Invalid IPv6 hostname '${e}'`);return e.toLowerCase()}function G(e){if(e===""||/^[0-9]*$/.test(e)&&parseInt(e)<=65535)return e;throw new TypeError(`Invalid port '${e}'.`)}function de(e){if(e==="")return e;let t=new URL("https://example.com");return t.pathname=e[0]!=="/"?"/-"+e:e,e[0]!=="/"?t.pathname.substring(2,t.pathname.length):t.pathname}function pe(e){return e===""?e:new URL(`data:${e}`).pathname}function ge(e){if(e==="")return e;let t=new URL("https://example.com");return t.search=e,t.search.substring(1,t.search.length)}function me(e){if(e==="")return e;let t=new URL("https://example.com");return t.hash=e,t.hash.substring(1,t.hash.length)}var H=class{#i;#n=[];#t={};#e=0;#s=1;#l=0;#o=0;#d=0;#p=0;#g=!1;constructor(t){this.#i=t;}get result(){return this.#t}parse(){for(this.#n=D(this.#i,!0);this.#e<this.#n.length;this.#e+=this.#s){if(this.#s=1,this.#n[this.#e].type==="END"){if(this.#o===0){this.#b(),this.#f()?this.#r(9,1):this.#h()?this.#r(8,1):this.#r(7,0);continue}else if(this.#o===2){this.#u(5);continue}this.#r(10,0);break}if(this.#d>0)if(this.#A())this.#d-=1;else continue;if(this.#T()){this.#d+=1;continue}switch(this.#o){case 0:this.#P()&&this.#u(1);break;case 1:if(this.#P()){this.#C();let t=7,r=1;this.#E()?(t=2,r=3):this.#g&&(t=2),this.#r(t,r);}break;case 2:this.#S()?this.#u(3):(this.#x()||this.#h()||this.#f())&&this.#u(5);break;case 3:this.#O()?this.#r(4,1):this.#S()&&this.#r(5,1);break;case 4:this.#S()&&this.#r(5,1);break;case 5:this.#y()?this.#p+=1:this.#w()&&(this.#p-=1),this.#k()&&!this.#p?this.#r(6,1):this.#x()?this.#r(7,0):this.#h()?this.#r(8,1):this.#f()&&this.#r(9,1);break;case 6:this.#x()?this.#r(7,0):this.#h()?this.#r(8,1):this.#f()&&this.#r(9,1);break;case 7:this.#h()?this.#r(8,1):this.#f()&&this.#r(9,1);break;case 8:this.#f()&&this.#r(9,1);break;}}this.#t.hostname!==void 0&&this.#t.port===void 0&&(this.#t.port="");}#r(t,r){switch(this.#o){case 0:break;case 1:this.#t.protocol=this.#c();break;case 2:break;case 3:this.#t.username=this.#c();break;case 4:this.#t.password=this.#c();break;case 5:this.#t.hostname=this.#c();break;case 6:this.#t.port=this.#c();break;case 7:this.#t.pathname=this.#c();break;case 8:this.#t.search=this.#c();break;case 9:this.#t.hash=this.#c();break;}this.#o!==0&&t!==10&&([1,2,3,4].includes(this.#o)&&[6,7,8,9].includes(t)&&(this.#t.hostname??=""),[1,2,3,4,5,6].includes(this.#o)&&[8,9].includes(t)&&(this.#t.pathname??=this.#g?"/":""),[1,2,3,4,5,6,7].includes(this.#o)&&t===9&&(this.#t.search??="")),this.#R(t,r);}#R(t,r){this.#o=t,this.#l=this.#e+r,this.#e+=r,this.#s=0;}#b(){this.#e=this.#l,this.#s=0;}#u(t){this.#b(),this.#o=t;}#m(t){return t<0&&(t=this.#n.length-t),t<this.#n.length?this.#n[t]:this.#n[this.#n.length-1]}#a(t,r){let n=this.#m(t);return n.value===r&&(n.type==="CHAR"||n.type==="ESCAPED_CHAR"||n.type==="INVALID_CHAR")}#P(){return this.#a(this.#e,":")}#E(){return this.#a(this.#e+1,"/")&&this.#a(this.#e+2,"/")}#S(){return this.#a(this.#e,"@")}#O(){return this.#a(this.#e,":")}#k(){return this.#a(this.#e,":")}#x(){return this.#a(this.#e,"/")}#h(){if(this.#a(this.#e,"?"))return !0;if(this.#n[this.#e].value!=="?")return !1;let t=this.#m(this.#e-1);return t.type!=="NAME"&&t.type!=="REGEX"&&t.type!=="CLOSE"&&t.type!=="ASTERISK"}#f(){return this.#a(this.#e,"#")}#T(){return this.#n[this.#e].type=="OPEN"}#A(){return this.#n[this.#e].type=="CLOSE"}#y(){return this.#a(this.#e,"[")}#w(){return this.#a(this.#e,"]")}#c(){let t=this.#n[this.#e],r=this.#m(this.#l).index;return this.#i.substring(r,t.index)}#C(){let t={};Object.assign(t,x),t.encodePart=y;let r=q(this.#c(),void 0,t);this.#g=N(r);}};var V=["protocol","username","password","hostname","port","pathname","search","hash"],E="*";function Se(e,t){if(typeof e!="string")throw new TypeError("parameter 1 is not of type 'string'.");let r=new URL(e,t);return {protocol:r.protocol.substring(0,r.protocol.length-1),username:r.username,password:r.password,hostname:r.hostname,port:r.port,pathname:r.pathname,search:r.search!==""?r.search.substring(1,r.search.length):void 0,hash:r.hash!==""?r.hash.substring(1,r.hash.length):void 0}}function b(e,t){return t?C(e):e}function w(e,t,r){let n;if(typeof t.baseURL=="string")try{n=new URL(t.baseURL),t.protocol===void 0&&(e.protocol=b(n.protocol.substring(0,n.protocol.length-1),r)),!r&&t.protocol===void 0&&t.hostname===void 0&&t.port===void 0&&t.username===void 0&&(e.username=b(n.username,r)),!r&&t.protocol===void 0&&t.hostname===void 0&&t.port===void 0&&t.username===void 0&&t.password===void 0&&(e.password=b(n.password,r)),t.protocol===void 0&&t.hostname===void 0&&(e.hostname=b(n.hostname,r)),t.protocol===void 0&&t.hostname===void 0&&t.port===void 0&&(e.port=b(n.port,r)),t.protocol===void 0&&t.hostname===void 0&&t.port===void 0&&t.pathname===void 0&&(e.pathname=b(n.pathname,r)),t.protocol===void 0&&t.hostname===void 0&&t.port===void 0&&t.pathname===void 0&&t.search===void 0&&(e.search=b(n.search.substring(1,n.search.length),r)),t.protocol===void 0&&t.hostname===void 0&&t.port===void 0&&t.pathname===void 0&&t.search===void 0&&t.hash===void 0&&(e.hash=b(n.hash.substring(1,n.hash.length),r));}catch{throw new TypeError(`invalid baseURL '${t.baseURL}'.`)}if(typeof t.protocol=="string"&&(e.protocol=fe(t.protocol,r)),typeof t.username=="string"&&(e.username=oe(t.username,r)),typeof t.password=="string"&&(e.password=ae(t.password,r)),typeof t.hostname=="string"&&(e.hostname=ie(t.hostname,r)),typeof t.port=="string"&&(e.port=le(t.port,e.protocol,r)),typeof t.pathname=="string"){if(e.pathname=t.pathname,n&&!ee(e.pathname,r)){let a=n.pathname.lastIndexOf("/");a>=0&&(e.pathname=b(n.pathname.substring(0,a+1),r)+e.pathname);}e.pathname=ce(e.pathname,e.protocol,r);}return typeof t.search=="string"&&(e.search=se(t.search,r)),typeof t.hash=="string"&&(e.hash=ne(t.hash,r)),e}function C(e){return e.replace(/([+*?:{}()\\])/g,"\\$1")}function Le(e){return e.replace(/([.+*?^${}()[\]|/\\])/g,"\\$1")}function Ie(e,t){t.delimiter??="/#?",t.prefixes??="./",t.sensitive??=!1,t.strict??=!1,t.end??=!0,t.start??=!0,t.endsWith="";let r=".*",n=`[^${Le(t.delimiter)}]+?`,a=/[$_\u200C\u200D\p{ID_Continue}]/u,c="";for(let l=0;l<e.length;++l){let s=e[l];if(s.type===3){if(s.modifier===3){c+=C(s.value);continue}c+=`{${C(s.value)}}${k(s.modifier)}`;continue}let i=s.hasCustomName(),o=!!s.suffix.length||!!s.prefix.length&&(s.prefix.length!==1||!t.prefixes.includes(s.prefix)),f=l>0?e[l-1]:null,d=l<e.length-1?e[l+1]:null;if(!o&&i&&s.type===1&&s.modifier===3&&d&&!d.prefix.length&&!d.suffix.length)if(d.type===3){let T=d.value.length>0?d.value[0]:"";o=a.test(T);}else o=!d.hasCustomName();if(!o&&!s.prefix.length&&f&&f.type===3){let T=f.value[f.value.length-1];o=t.prefixes.includes(T);}o&&(c+="{"),c+=C(s.prefix),i&&(c+=`:${s.name}`),s.type===2?c+=`(${s.value})`:s.type===1?i||(c+=`(${n})`):s.type===0&&(!i&&(!f||f.type===3||f.modifier!==3||o||s.prefix!=="")?c+="*":c+=`(${r})`),s.type===1&&i&&s.suffix.length&&a.test(s.suffix[0])&&(c+="\\"),c+=C(s.suffix),o&&(c+="}"),s.modifier!==3&&(c+=k(s.modifier));}return c}var Y=class{#i;#n={};#t={};#e={};#s={};#l=!1;constructor(t={},r,n){try{let a;if(typeof r=="string"?a=r:n=r,typeof t=="string"){let i=new H(t);if(i.parse(),t=i.result,a===void 0&&typeof t.protocol!="string")throw new TypeError("A base URL must be provided for a relative constructor string.");t.baseURL=a;}else {if(!t||typeof t!="object")throw new TypeError("parameter 1 is not of type 'string' and cannot convert to dictionary.");if(a)throw new TypeError("parameter 1 is not of type 'string'.")}typeof n>"u"&&(n={ignoreCase:!1});let c={ignoreCase:n.ignoreCase===!0},l={pathname:E,protocol:E,username:E,password:E,hostname:E,port:E,search:E,hash:E};this.#i=w(l,t,!0),z(this.#i.protocol)===this.#i.port&&(this.#i.port="");let s;for(s of V){if(!(s in this.#i))continue;let i={},o=this.#i[s];switch(this.#t[s]=[],s){case"protocol":Object.assign(i,x),i.encodePart=y;break;case"username":Object.assign(i,x),i.encodePart=he;break;case"password":Object.assign(i,x),i.encodePart=ue;break;case"hostname":Object.assign(i,J),_(o)?i.encodePart=K:i.encodePart=j;break;case"port":Object.assign(i,x),i.encodePart=G;break;case"pathname":N(this.#n.protocol)?(Object.assign(i,Q,c),i.encodePart=de):(Object.assign(i,x,c),i.encodePart=pe);break;case"search":Object.assign(i,x,c),i.encodePart=ge;break;case"hash":Object.assign(i,x,c),i.encodePart=me;break}try{this.#s[s]=F(o,i),this.#n[s]=W(this.#s[s],this.#t[s],i),this.#e[s]=Ie(this.#s[s],i),this.#l=this.#l||this.#s[s].some(f=>f.type===2);}catch{throw new TypeError(`invalid ${s} pattern '${this.#i[s]}'.`)}}}catch(a){throw new TypeError(`Failed to construct 'URLPattern': ${a.message}`)}}test(t={},r){let n={pathname:"",protocol:"",username:"",password:"",hostname:"",port:"",search:"",hash:""};if(typeof t!="string"&&r)throw new TypeError("parameter 1 is not of type 'string'.");if(typeof t>"u")return !1;try{typeof t=="object"?n=w(n,t,!1):n=w(n,Se(t,r),!1);}catch{return !1}let a;for(a of V)if(!this.#n[a].exec(n[a]))return !1;return !0}exec(t={},r){let n={pathname:"",protocol:"",username:"",password:"",hostname:"",port:"",search:"",hash:""};if(typeof t!="string"&&r)throw new TypeError("parameter 1 is not of type 'string'.");if(typeof t>"u")return;try{typeof t=="object"?n=w(n,t,!1):n=w(n,Se(t,r),!1);}catch{return null}let a={};r?a.inputs=[t,r]:a.inputs=[t];let c;for(c of V){let l=this.#n[c].exec(n[c]);if(!l)return null;let s={};for(let[i,o]of this.#t[c].entries())if(typeof o=="string"||typeof o=="number"){let f=l[i+1];s[o]=f;}a[c]={input:n[c]??"",groups:s};}return a}static compareComponent(t,r,n){let a=(i,o)=>{for(let f of ["type","modifier","prefix","value","suffix"]){if(i[f]<o[f])return -1;if(i[f]===o[f])continue;return 1}return 0},c=new R(3,"","","","",3),l=new R(0,"","","","",3),s=(i,o)=>{let f=0;for(;f<Math.min(i.length,o.length);++f){let d=a(i[f],o[f]);if(d)return d}return i.length===o.length?0:a(i[f]??c,o[f]??c)};return !r.#e[t]&&!n.#e[t]?0:r.#e[t]&&!n.#e[t]?s(r.#s[t],[l]):!r.#e[t]&&n.#e[t]?s([l],n.#s[t]):s(r.#s[t],n.#s[t])}get protocol(){return this.#e.protocol}get username(){return this.#e.username}get password(){return this.#e.password}get hostname(){return this.#e.hostname}get port(){return this.#e.port}get pathname(){return this.#e.pathname}get search(){return this.#e.search}get hash(){return this.#e.hash}get hasRegExpGroups(){return this.#l}};
-
-	const { URLPattern: URLPattern$2 } = urlpattern;
-
-	var urlpatternPolyfill = { URLPattern: URLPattern$2 };
-
-	if (!globalThis.URLPattern) {
-	  globalThis.URLPattern = URLPattern$2;
-	}
-
-	Object.defineProperty(UrlPattern, "__esModule", { value: true });
-	UrlPattern.URLPattern = void 0;
-	/**
-	 * Copyright 2023 Google LLC.
-	 * Copyright (c) Microsoft Corporation.
-	 *
-	 * Licensed under the Apache License, Version 2.0 (the "License");
-	 * you may not use this file except in compliance with the License.
-	 * You may obtain a copy of the License at
-	 *
-	 *     http://www.apache.org/licenses/LICENSE-2.0
-	 *
-	 * Unless required by applicable law or agreed to in writing, software
-	 * distributed under the License is distributed on an "AS IS" BASIS,
-	 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-	 * See the License for the specific language governing permissions and
-	 * limitations under the License.
-	 */
-	const urlpattern_polyfill_1 = urlpatternPolyfill;
-	// XXX: Switch to native URLPattern when available.
-	// https://github.com/nodejs/node/issues/40844
-	let URLPattern$1 = urlpattern_polyfill_1.URLPattern;
-	UrlPattern.URLPattern = URLPattern$1;
-	if ('URLPattern' in globalThis) {
-	    UrlPattern.URLPattern = URLPattern$1 = globalThis.URLPattern;
-	}
-
 	/*
 	 * Copyright 2023 Google LLC.
 	 * Copyright (c) Microsoft Corporation.
@@ -4267,7 +4288,7 @@
 	NetworkUtils.getTiming = getTiming;
 	const ErrorResponse_js_1 = ErrorResponse;
 	const Base64_js_1 = Base64;
-	const UrlPattern_js_1 = UrlPattern;
+	const UrlPattern_js_1 = UrlPatternBrowser;
 	function computeHeadersSize(headers) {
 	    const requestHeaders = headers.reduce((acc, header) => {
 	        return `${acc}${header.name}: ${header.value.value}\r\n`;
@@ -4828,10 +4849,10 @@
 	        this.#browserProcessor = new BrowserProcessor_js_1.BrowserProcessor(browserCdpClient);
 	        this.#browsingContextProcessor = new BrowsingContextProcessor_js_1.BrowsingContextProcessor(browserCdpClient, browsingContextStorage, eventManager);
 	        this.#cdpProcessor = new CdpProcessor_js_1.CdpProcessor(browsingContextStorage, realmStorage, cdpConnection, browserCdpClient);
-	        this.#inputProcessor = new InputProcessor_js_1.InputProcessor(browsingContextStorage, realmStorage);
+	        this.#inputProcessor = new InputProcessor_js_1.InputProcessor(browsingContextStorage);
 	        this.#networkProcessor = new NetworkProcessor_js_1.NetworkProcessor(browsingContextStorage, networkStorage);
 	        this.#permissionsProcessor = new PermissionsProcessor_js_1.PermissionsProcessor(browserCdpClient);
-	        this.#scriptProcessor = new ScriptProcessor_js_1.ScriptProcessor(browsingContextStorage, realmStorage, preloadScriptStorage, logger);
+	        this.#scriptProcessor = new ScriptProcessor_js_1.ScriptProcessor(eventManager, browsingContextStorage, realmStorage, preloadScriptStorage, logger);
 	        this.#sessionProcessor = new SessionProcessor_js_1.SessionProcessor(eventManager, browserCdpClient, initConnection);
 	        this.#storageProcessor = new StorageProcessor_js_1.StorageProcessor(browserCdpClient, browsingContextStorage, logger);
 	        // keep-sorted end
@@ -5263,6 +5284,7 @@
 	     * target's `globalThis`.
 	     */
 	    async serializeCdpObject(cdpRemoteObject, resultOwnership) {
+	        // TODO: if the object is a primitive, return it directly without CDP roundtrip.
 	        const argument = Realm.#cdpRemoteObjectToCallArgument(cdpRemoteObject);
 	        const cdpValue = await this.cdpClient.sendCommand('Runtime.callFunctionOn', {
 	            functionDeclaration: String((remoteObject) => remoteObject),
@@ -5854,10 +5876,21 @@
 	    #previousViewport = { width: 0, height: 0 };
 	    // The URL of the navigation that is currently in progress. A workaround of the CDP
 	    // lacking URL for the pending navigation events, e.g. `Page.frameStartedLoading`.
-	    // Set on `Page.navigate`, `Page.reload` commands and on deprecated CDP event
-	    // `Page.frameScheduledNavigation`.
+	    // Set on `Page.navigate`, `Page.reload` commands, on `Page.frameRequestedNavigation` or
+	    // on a deprecated `Page.frameScheduledNavigation` event. The latest is required as the
+	    // `Page.frameRequestedNavigation` event is not emitted for same-document navigations.
 	    #pendingNavigationUrl;
-	    #virtualNavigationId = (0, uuid_1.uuidv4)();
+	    // Navigation ID is required, as CDP `loaderId` cannot be mapped 1:1 to all the
+	    // navigations (e.g. same document navigations). Updated after each navigation,
+	    // including same-document ones.
+	    #navigationId = (0, uuid_1.uuidv4)();
+	    // When a new navigation is started via `BrowsingContext.navigate` with `wait` set to
+	    // `None`, the command result should have `navigation` value, but mapper does not have
+	    // it yet. This value will be set to `navigationId` after next .
+	    #pendingNavigationId;
+	    // Set if there is a pending navigation initiated by `BrowsingContext.navigate` command.
+	    // The promise is resolved when the navigation is finished or rejected when canceled.
+	    #pendingCommandNavigation;
 	    #originalOpener;
 	    // Set when the user prompt is opened. Required to provide the type in closing event.
 	    #lastUserPromptType;
@@ -5915,30 +5948,28 @@
 	    get navigableId() {
 	        return this.#loaderId;
 	    }
-	    /**
-	     * Virtual navigation ID. Required, as CDP `loaderId` cannot be mapped 1:1 to all the
-	     * navigations (e.g. same document navigations). Updated after each navigation,
-	     * including same-document ones.
-	     */
-	    get virtualNavigationId() {
-	        return this.#virtualNavigationId;
+	    get navigationId() {
+	        return this.#navigationId;
 	    }
-	    dispose() {
+	    dispose(emitContextDestroyed) {
+	        this.#pendingCommandNavigation?.reject(new protocol_js_1$9.UnknownErrorException('navigation canceled by context disposal'));
 	        this.#deleteAllChildren();
 	        this.#realmStorage.deleteRealms({
 	            browsingContextId: this.id,
 	        });
-	        // Remove context from the parent.
+	        // Delete context from the parent.
 	        if (!this.isTopLevelContext()) {
 	            this.parent.#children.delete(this.id);
 	        }
 	        // Fail all ongoing navigations.
 	        this.#failLifecycleIfNotFinished();
-	        this.#eventManager.registerEvent({
-	            type: 'event',
-	            method: protocol_js_1$9.ChromiumBidi.BrowsingContext.EventNames.ContextDestroyed,
-	            params: this.serializeToBidiValue(),
-	        }, this.id);
+	        if (emitContextDestroyed) {
+	            this.#eventManager.registerEvent({
+	                type: 'event',
+	                method: protocol_js_1$9.ChromiumBidi.BrowsingContext.EventNames.ContextDestroyed,
+	                params: this.serializeToBidiValue(),
+	            }, this.id);
+	        }
 	        this.#browsingContextStorage.deleteContextById(this.id);
 	    }
 	    /** Returns the ID of this context. */
@@ -5998,8 +6029,8 @@
 	    addChild(childId) {
 	        this.#children.add(childId);
 	    }
-	    #deleteAllChildren() {
-	        this.directChildren.map((child) => child.dispose());
+	    #deleteAllChildren(emitContextDestroyed = false) {
+	        this.directChildren.map((child) => child.dispose(emitContextDestroyed));
 	    }
 	    get cdpTarget() {
 	        return this.#cdpTarget;
@@ -6072,7 +6103,7 @@
 	            this.#pendingNavigationUrl = undefined;
 	            // At the point the page is initialized, all the nested iframes from the
 	            // previous page are detached and realms are destroyed.
-	            // Remove children from context.
+	            // Delete children from context.
 	            this.#deleteAllChildren();
 	        });
 	        this.#cdpTarget.cdpClient.on('Page.navigatedWithinDocument', (params) => {
@@ -6088,7 +6119,7 @@
 	                method: protocol_js_1$9.ChromiumBidi.BrowsingContext.EventNames.FragmentNavigated,
 	                params: {
 	                    context: this.id,
-	                    navigation: this.#virtualNavigationId,
+	                    navigation: this.#navigationId,
 	                    timestamp,
 	                    url: this.#url,
 	                },
@@ -6098,14 +6129,16 @@
 	            if (this.id !== params.frameId) {
 	                return;
 	            }
-	            // Generate a new virtual navigation id.
-	            this.#virtualNavigationId = (0, uuid_1.uuidv4)();
+	            // Use `pendingNavigationId` if navigation initiated by BiDi
+	            // `BrowsingContext.navigate` or generate a new navigation id.
+	            this.#navigationId = this.#pendingNavigationId ?? (0, uuid_1.uuidv4)();
+	            this.#pendingNavigationId = undefined;
 	            this.#eventManager.registerEvent({
 	                type: 'event',
 	                method: protocol_js_1$9.ChromiumBidi.BrowsingContext.EventNames.NavigationStarted,
 	                params: {
 	                    context: this.id,
-	                    navigation: this.#virtualNavigationId,
+	                    navigation: this.#navigationId,
 	                    timestamp: BrowsingContextImpl.getTimestamp(),
 	                    // The URL of the navigation that is currently in progress. Although the URL
 	                    // is not yet known in case of user-initiated navigations, it is possible to
@@ -6122,6 +6155,14 @@
 	            }
 	            this.#pendingNavigationUrl = params.url;
 	        });
+	        this.#cdpTarget.cdpClient.on('Page.frameRequestedNavigation', (params) => {
+	            if (this.id !== params.frameId) {
+	                return;
+	            }
+	            // If there is a pending navigation, reject it.
+	            this.#pendingCommandNavigation?.reject(new protocol_js_1$9.UnknownErrorException(`navigation canceled, as new navigation is requested by ${params.reason}`));
+	            this.#pendingNavigationUrl = params.url;
+	        });
 	        this.#cdpTarget.cdpClient.on('Page.lifecycleEvent', (params) => {
 	            if (this.id !== params.frameId) {
 	                return;
@@ -6152,7 +6193,7 @@
 	                        method: protocol_js_1$9.ChromiumBidi.BrowsingContext.EventNames.DomContentLoaded,
 	                        params: {
 	                            context: this.id,
-	                            navigation: this.#virtualNavigationId,
+	                            navigation: this.#navigationId,
 	                            timestamp,
 	                            url: this.#url,
 	                        },
@@ -6165,7 +6206,7 @@
 	                        method: protocol_js_1$9.ChromiumBidi.BrowsingContext.EventNames.Load,
 	                        params: {
 	                            context: this.id,
-	                            navigation: this.#virtualNavigationId,
+	                            navigation: this.#navigationId,
 	                            timestamp,
 	                            url: this.#url,
 	                        },
@@ -6318,8 +6359,8 @@
 	        }
 	    }
 	    #documentChanged(loaderId) {
-	        // Same document navigation.
 	        if (loaderId === undefined || this.#loaderId === loaderId) {
+	            // Same document navigation. Document didn't change.
 	            if (this.#navigation.withinDocument.isFinished) {
 	                this.#navigation.withinDocument = new Deferred_js_1$2.Deferred();
 	            }
@@ -6328,8 +6369,11 @@
 	            }
 	            return;
 	        }
+	        // Document changed.
 	        this.#resetLifecycleIfFinished();
 	        this.#loaderId = loaderId;
+	        // Delete all child iframes and notify about top level destruction.
+	        this.#deleteAllChildren(true);
 	    }
 	    #resetLifecycleIfFinished() {
 	        if (this.#lifecycle.DOMContentLoaded.isFinished) {
@@ -6360,61 +6404,83 @@
 	        catch {
 	            throw new protocol_js_1$9.InvalidArgumentException(`Invalid URL: ${url}`);
 	        }
+	        this.#pendingCommandNavigation?.reject(new protocol_js_1$9.UnknownErrorException('navigation canceled by concurrent navigation'));
 	        await this.targetUnblockedOrThrow();
 	        // Set the pending navigation URL to provide it in `browsingContext.navigationStarted`
 	        // event.
 	        // TODO: detect navigation start not from CDP. Check if
 	        //  `Page.frameRequestedNavigation` can be used for this purpose.
 	        this.#pendingNavigationUrl = url;
-	        // TODO: handle loading errors.
-	        const cdpNavigateResult = await this.#cdpTarget.cdpClient.sendCommand('Page.navigate', {
-	            url,
-	            frameId: this.id,
-	        });
-	        if (cdpNavigateResult.errorText) {
-	            // If navigation failed, no pending navigation is left.
-	            this.#pendingNavigationUrl = undefined;
-	            this.#eventManager.registerEvent({
-	                type: 'event',
-	                method: protocol_js_1$9.ChromiumBidi.BrowsingContext.EventNames.NavigationFailed,
-	                params: {
-	                    context: this.id,
-	                    navigation: this.#virtualNavigationId,
-	                    timestamp: BrowsingContextImpl.getTimestamp(),
-	                    url,
-	                },
-	            }, this.id);
-	            throw new protocol_js_1$9.UnknownErrorException(cdpNavigateResult.errorText);
+	        const navigationId = (0, uuid_1.uuidv4)();
+	        this.#pendingNavigationId = navigationId;
+	        this.#pendingCommandNavigation = new Deferred_js_1$2.Deferred();
+	        // Navigate and wait for the result. If the navigation fails, the error event is
+	        // emitted and the promise is rejected.
+	        const cdpNavigatePromise = (async () => {
+	            const cdpNavigateResult = await this.#cdpTarget.cdpClient.sendCommand('Page.navigate', {
+	                url,
+	                frameId: this.id,
+	            });
+	            if (cdpNavigateResult.errorText) {
+	                // If navigation failed, no pending navigation is left.
+	                this.#pendingNavigationUrl = undefined;
+	                this.#eventManager.registerEvent({
+	                    type: 'event',
+	                    method: protocol_js_1$9.ChromiumBidi.BrowsingContext.EventNames.NavigationFailed,
+	                    params: {
+	                        context: this.id,
+	                        navigation: navigationId,
+	                        timestamp: BrowsingContextImpl.getTimestamp(),
+	                        url,
+	                    },
+	                }, this.id);
+	                throw new protocol_js_1$9.UnknownErrorException(cdpNavigateResult.errorText);
+	            }
+	            this.#documentChanged(cdpNavigateResult.loaderId);
+	            return cdpNavigateResult;
+	        })();
+	        if (wait === "none" /* BrowsingContext.ReadinessState.None */) {
+	            // Do not wait for the result of the navigation promise.
+	            this.#pendingCommandNavigation.resolve();
+	            this.#pendingCommandNavigation = undefined;
+	            return {
+	                navigation: navigationId,
+	                url,
+	            };
 	        }
-	        this.#documentChanged(cdpNavigateResult.loaderId);
-	        switch (wait) {
-	            case "none" /* BrowsingContext.ReadinessState.None */:
-	                break;
-	            case "interactive" /* BrowsingContext.ReadinessState.Interactive */:
-	                // No `loaderId` means same-document navigation.
-	                if (cdpNavigateResult.loaderId === undefined) {
-	                    await this.#navigation.withinDocument;
-	                }
-	                else {
-	                    await this.#lifecycle.DOMContentLoaded;
-	                }
-	                break;
-	            case "complete" /* BrowsingContext.ReadinessState.Complete */:
-	                // No `loaderId` means same-document navigation.
-	                if (cdpNavigateResult.loaderId === undefined) {
-	                    await this.#navigation.withinDocument;
-	                }
-	                else {
-	                    await this.#lifecycle.load;
-	                }
-	                break;
-	        }
+	        const cdpNavigateResult = await cdpNavigatePromise;
+	        // Wait for either the navigation is finished or canceled by another navigation.
+	        await Promise.race([
+	            // No `loaderId` means same-document navigation.
+	            this.#waitNavigation(wait, cdpNavigateResult.loaderId === undefined),
+	            // Throw an error if the navigation is canceled.
+	            this.#pendingCommandNavigation,
+	        ]);
+	        this.#pendingCommandNavigation.resolve();
+	        this.#pendingCommandNavigation = undefined;
 	        return {
-	            navigation: this.#virtualNavigationId,
+	            navigation: navigationId,
 	            // Url can change due to redirect get the latest one.
-	            url: wait === "none" /* BrowsingContext.ReadinessState.None */ ? url : this.#url,
+	            url: this.#url,
 	        };
 	    }
+	    async #waitNavigation(wait, withinDocument) {
+	        if (withinDocument) {
+	            await this.#navigation.withinDocument;
+	            return;
+	        }
+	        switch (wait) {
+	            case "none" /* BrowsingContext.ReadinessState.None */:
+	                return;
+	            case "interactive" /* BrowsingContext.ReadinessState.Interactive */:
+	                await this.#lifecycle.DOMContentLoaded;
+	                return;
+	            case "complete" /* BrowsingContext.ReadinessState.Complete */:
+	                await this.#lifecycle.load;
+	                return;
+	        }
+	    }
+	    // TODO: support concurrent navigations analogous to `navigate`.
 	    async reload(ignoreCache, wait) {
 	        await this.targetUnblockedOrThrow();
 	        this.#resetLifecycleIfFinished();
@@ -6432,7 +6498,7 @@
 	                break;
 	        }
 	        return {
-	            navigation: this.#virtualNavigationId,
+	            navigation: this.#navigationId,
 	            url: this.url,
 	        };
 	    }
@@ -6705,7 +6771,7 @@
 	                            }
 	                            return [...element.querySelectorAll(cssSelector)];
 	                        };
-	                        startNodes = startNodes.length > 0 ? startNodes : [document.body];
+	                        startNodes = startNodes.length > 0 ? startNodes : [document];
 	                        const returnedNodes = startNodes
 	                            .map((startNode) => 
 	                        // TODO: stop search early if `maxNodeCount` is reached.
@@ -6738,7 +6804,7 @@
 	                            }
 	                            return returnedNodes;
 	                        };
-	                        startNodes = startNodes.length > 0 ? startNodes : [document.body];
+	                        startNodes = startNodes.length > 0 ? startNodes : [document];
 	                        const returnedNodes = startNodes
 	                            .map((startNode) => 
 	                        // TODO: stop search early if `maxNodeCount` is reached.
@@ -6916,7 +6982,10 @@
 	                                collect(childNodes, selector);
 	                            }
 	                        }
-	                        startNodes = startNodes.length > 0 ? startNodes : [document.body];
+	                        startNodes =
+	                            startNodes.length > 0
+	                                ? startNodes
+	                                : Array.from(document.documentElement.children).filter((c) => c instanceof HTMLElement);
 	                        collect(startNodes, {
 	                            role,
 	                            name,
@@ -7375,6 +7444,43 @@
 	        logManager.#initializeEntryAddedEventListener();
 	        return logManager;
 	    }
+	    /**
+	     * Heuristic serialization of CDP remote object. If possible, return the BiDi value
+	     * without deep serialization.
+	     */
+	    async #heuristicSerializeArg(arg, realm) {
+	        switch (arg.type) {
+	            // TODO: Implement regexp, array, object, map and set heuristics base on
+	            //  preview.
+	            case 'undefined':
+	                return { type: 'undefined' };
+	            case 'boolean':
+	                return { type: 'boolean', value: arg.value };
+	            case 'string':
+	                return { type: 'string', value: arg.value };
+	            case 'number':
+	                // The value can be either a number or a string like `Infinity` or `-0`.
+	                return { type: 'number', value: arg.unserializableValue ?? arg.value };
+	            case 'bigint':
+	                if (arg.unserializableValue !== undefined &&
+	                    arg.unserializableValue[arg.unserializableValue.length - 1] === 'n') {
+	                    return {
+	                        type: arg.type,
+	                        value: arg.unserializableValue.slice(0, -1),
+	                    };
+	                }
+	                // Unexpected bigint value, fall back to CDP deep serialization.
+	                break;
+	            case 'object':
+	                if (arg.subtype === 'null') {
+	                    return { type: 'null' };
+	                }
+	                // Fall back to CDP deep serialization.
+	                break;
+	        }
+	        // Fall back to CDP deep serialization.
+	        return await realm.serializeCdpObject(arg, "none" /* Script.ResultOwnership.None */);
+	    }
 	    #initializeEntryAddedEventListener() {
 	        this.#cdpTarget.cdpClient.on('Runtime.consoleAPICalled', (params) => {
 	            // Try to find realm by `cdpSessionId` and `executionContextId`,
@@ -7388,12 +7494,7 @@
 	                this.#logger?.(log_js_1$8.LogType.cdp, params);
 	                return;
 	            }
-	            const argsPromise = realm === undefined
-	                ? Promise.resolve(params.args)
-	                : // Properly serialize arguments if possible.
-	                    Promise.all(params.args.map((arg) => {
-	                        return realm.serializeCdpObject(arg, "none" /* Script.ResultOwnership.None */);
-	                    }));
+	            const argsPromise = Promise.all(params.args.map((arg) => this.#heuristicSerializeArg(arg, realm)));
 	            for (const browsingContext of realm.associatedBrowsingContexts) {
 	                this.#eventManager.registerPromiseEvent(argsPromise.then((args) => ({
 	                    kind: 'success',
@@ -7756,6 +7857,7 @@
 	        });
 	        cdpClient.on('Page.frameAttached', this.#handleFrameAttachedEvent.bind(this));
 	        cdpClient.on('Page.frameDetached', this.#handleFrameDetachedEvent.bind(this));
+	        cdpClient.on('Page.frameSubtreeWillBeDetached', this.#handleFrameSubtreeWillBeDetached.bind(this));
 	    }
 	    #handleFrameAttachedEvent(params) {
 	        const parentBrowsingContext = this.#browsingContextStorage.findContext(params.parentFrameId);
@@ -7771,7 +7873,10 @@
 	        if (params.reason === 'swap') {
 	            return;
 	        }
-	        this.#browsingContextStorage.findContext(params.frameId)?.dispose();
+	        this.#browsingContextStorage.findContext(params.frameId)?.dispose(true);
+	    }
+	    #handleFrameSubtreeWillBeDetached(params) {
+	        this.#browsingContextStorage.findContext(params.frameId)?.dispose(true);
 	    }
 	    #handleAttachedToTargetEvent(params, parentSessionCdpClient) {
 	        const { sessionId, targetInfo } = params;
@@ -7883,7 +7988,7 @@
 	        }
 	        const context = this.#browsingContextStorage.findContextBySession(sessionId);
 	        if (context) {
-	            context.dispose();
+	            context.dispose(true);
 	            return;
 	        }
 	        const worker = this.#workers.get(sessionId);
@@ -8142,7 +8247,7 @@
 	            return null;
 	        }
 	        // Get virtual navigation ID from the browsing context.
-	        return this.#networkStorage.getVirtualNavigationId(this.#context ?? undefined);
+	        return this.#networkStorage.getNavigationId(this.#context ?? undefined);
 	    }
 	    get #cookies() {
 	        let cookies = [];
@@ -8923,12 +9028,11 @@
 	    /**
 	     * Gets the virtual navigation ID for the given navigable ID.
 	     */
-	    getVirtualNavigationId(contextId) {
+	    getNavigationId(contextId) {
 	        if (contextId === undefined) {
 	            return null;
 	        }
-	        return (this.#browsingContextStorage.findContext(contextId)
-	            ?.virtualNavigationId ?? null);
+	        return (this.#browsingContextStorage.findContext(contextId)?.navigationId ?? null);
 	    }
 	}
 	NetworkStorage$1.NetworkStorage = NetworkStorage;
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index 726d699..bb821dcd 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -138,11 +138,6 @@
              "AnchorElementInteraction",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
-// Enable anchor element mouse motion estimator.
-BASE_FEATURE(kAnchorElementMouseMotionEstimator,
-             "AnchorElementMouseMotionEstimator",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 BASE_FEATURE(kAndroidExtendedKeyboardShortcuts,
              "AndroidExtendedKeyboardShortcuts",
              base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h
index 94abb57..5eebc32 100644
--- a/third_party/blink/public/common/features.h
+++ b/third_party/blink/public/common/features.h
@@ -99,8 +99,6 @@
 
 BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kAnchorElementInteraction);
 
-BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kAnchorElementMouseMotionEstimator);
-
 // Extended physical keyboard shortcuts for Android.
 BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kAndroidExtendedKeyboardShortcuts);
 
diff --git a/third_party/blink/public/strings/blink_strings.grd b/third_party/blink/public/strings/blink_strings.grd
index 81d5d8e..b090da29 100644
--- a/third_party/blink/public/strings/blink_strings.grd
+++ b/third_party/blink/public/strings/blink_strings.grd
@@ -404,10 +404,6 @@
         Sharing location allowed
       </message>
 
-      <message name="IDS_STRONG_PASSWORD_LABEL" desc="Label displayed in the password input form in the sign-up flow when it is generated">
-        Strong password
-      </message>
-
 <!-- The following IDS_FORM_VALIDATION_* messages were taken from Mozilla's dom.properties file.
 
 # ***** BEGIN LICENSE BLOCK *****
diff --git a/third_party/blink/public/strings/blink_strings_grd/IDS_STRONG_PASSWORD_LABEL.png.sha1 b/third_party/blink/public/strings/blink_strings_grd/IDS_STRONG_PASSWORD_LABEL.png.sha1
deleted file mode 100644
index 355f0759..0000000
--- a/third_party/blink/public/strings/blink_strings_grd/IDS_STRONG_PASSWORD_LABEL.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-41d0fbbd4cf82b8a717138913dfae48a47984cbf
\ No newline at end of file
diff --git a/third_party/blink/public/web/web_input_element.h b/third_party/blink/public/web/web_input_element.h
index bb82555..2f7c8dc 100644
--- a/third_party/blink/public/web/web_input_element.h
+++ b/third_party/blink/public/web/web_input_element.h
@@ -81,12 +81,6 @@
   // Returns true if the text of the element should be visible.
   bool ShouldRevealPassword() const;
 
-  // If true, forces "Strong Password" label to be visible in the field.
-  void SetShouldShowStrongPasswordLabel(bool value);
-
-  // Returns whether "Strong Password" label should be visible in the field.
-  bool ShouldShowStrongPasswordLabel() const;
-
 #if BUILDFLAG(IS_ANDROID)
   // Returns whether this is the last element within its form.
   bool IsLastInputElementInForm();
diff --git a/third_party/blink/renderer/bindings/generated_in_core.gni b/third_party/blink/renderer/bindings/generated_in_core.gni
index 139ae45..fadad57f 100644
--- a/third_party/blink/renderer/bindings/generated_in_core.gni
+++ b/third_party/blink/renderer/bindings/generated_in_core.gni
@@ -1940,8 +1940,6 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_union_urlpattern_urlpatterninit_usvstring.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_union_urlpatterninit_usvstring.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_union_urlpatterninit_usvstring.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_union_usvstring_uint32array.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_union_usvstring_uint32array.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_union_usvstring_usvstringsequence.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_union_usvstring_usvstringsequence.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_union_usvstring_usvstringsequencesequence_usvstringusvstringrecord.cc",
diff --git a/third_party/blink/renderer/core/animation/css_font_style_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_font_style_interpolation_type.cc
index 894fbecc..f7c0d48 100644
--- a/third_party/blink/renderer/core/animation/css_font_style_interpolation_type.cc
+++ b/third_party/blink/renderer/core/animation/css_font_style_interpolation_type.cc
@@ -66,8 +66,10 @@
       identifier_value->GetValueID() == CSSValueID::kItalic) {
     return nullptr;
   }
-  return CreateFontStyleValue(
-      StyleBuilderConverterBase::ConvertFontStyle(value));
+  // TODO(40946458): Don't resolve angle here, use unresolved version instead.
+  return CreateFontStyleValue(StyleBuilderConverterBase::ConvertFontStyle(
+      state ? state->CssToLengthConversionData() : CSSToLengthConversionData(),
+      value));
 }
 
 InterpolationValue
@@ -80,9 +82,10 @@
     const InterpolableValue& interpolable_value,
     const NonInterpolableValue*,
     StyleResolverState& state) const {
-  state.GetFontBuilder().SetStyle(FontSelectionValue(
-      ClampTo(To<InterpolableNumber>(interpolable_value).Value(),
-              kMinObliqueValue, kMaxObliqueValue)));
+  state.GetFontBuilder().SetStyle(
+      FontSelectionValue(ClampTo(To<InterpolableNumber>(interpolable_value)
+                                     .Value(state.CssToLengthConversionData()),
+                                 kMinObliqueValue, kMaxObliqueValue)));
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/css/css_variable_data.cc b/third_party/blink/renderer/core/css/css_variable_data.cc
index effcdc4a..299296b 100644
--- a/third_party/blink/renderer/core/css/css_variable_data.cc
+++ b/third_party/blink/renderer/core/css/css_variable_data.cc
@@ -15,6 +15,7 @@
 #include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
 #include "third_party/blink/renderer/core/css/parser/css_parser_token_stream.h"
 #include "third_party/blink/renderer/core/css/parser/css_tokenizer.h"
+#include "third_party/blink/renderer/core/html/parser/input_stream_preprocessor.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_view.h"
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_token_stream.h b/third_party/blink/renderer/core/css/parser/css_parser_token_stream.h
index 9b55af89..4e7808e 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_token_stream.h
+++ b/third_party/blink/renderer/core/css/parser/css_parser_token_stream.h
@@ -60,7 +60,7 @@
 // EnsureLookAhead(), or AtEnd() with no subsequent modifications to the stream
 // such as a consume.
 class CORE_EXPORT CSSParserTokenStream {
-  DISALLOW_NEW();
+  STACK_ALLOCATED();
 
  public:
   // Instantiate this to start reading from a block. When the guard is out of
@@ -148,14 +148,6 @@
     const bool old_unicode_ranges_allowed_;
   };
 
-  // We found that this value works well empirically by printing out the
-  // maximum buffer size for a few top alexa websites. It should be slightly
-  // above the expected number of tokens in the prelude of an at rule and
-  // the number of tokens in a declaration.
-  // TODO(crbug.com/661854): Can we streamify at rule parsing so that this is
-  // only needed for declarations which are easier to think about?
-  static constexpr int kInitialBufferSize = 128;
-
   explicit CSSParserTokenStream(const String& text, wtf_size_t offset = 0)
       : tokenizer_(text, offset), next_(kEOFToken) {}
   explicit CSSParserTokenStream(StringView text)
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_token_stream_test.cc b/third_party/blink/renderer/core/css/parser/css_parser_token_stream_test.cc
index 0a5666e..013da69 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_token_stream_test.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser_token_stream_test.cc
@@ -365,7 +365,15 @@
 
 Vector<CSSParserToken, 32> TokenizeAll(String string) {
   CSSTokenizer tokenizer(string);
-  return tokenizer.TokenizeToEOF();
+  Vector<CSSParserToken, 32> tokens;
+  while (true) {
+    const CSSParserToken token = tokenizer.TokenizeSingle();
+    if (token.GetType() == kEOFToken) {
+      return tokens;
+    } else {
+      tokens.push_back(token);
+    }
+  }
 }
 
 // See struct RestartData.
@@ -676,8 +684,11 @@
 
   bool ConsumeTokens(String expected) {
     CSSTokenizer tokenizer(expected);
-    Vector<CSSParserToken, 32> expected_tokens = tokenizer.TokenizeToEOF();
-    for (CSSParserToken expected_token : expected_tokens) {
+    while (true) {
+      CSSParserToken expected_token = tokenizer.TokenizeSingle();
+      if (expected_token.GetType() == kEOFToken) {
+        break;
+      }
       if (stream_.Consume() != expected_token) {
         return false;
       }
diff --git a/third_party/blink/renderer/core/css/parser/css_supports_parser_test.cc b/third_party/blink/renderer/core/css/parser/css_supports_parser_test.cc
index d2a6cefc..1787244 100644
--- a/third_party/blink/renderer/core/css/parser/css_supports_parser_test.cc
+++ b/third_party/blink/renderer/core/css/parser/css_supports_parser_test.cc
@@ -23,7 +23,16 @@
   }
 
   Vector<CSSParserToken, 32> Tokenize(const String& string) {
-    return CSSTokenizer(string).TokenizeToEOF();
+    CSSTokenizer tokenizer(string);
+    Vector<CSSParserToken, 32> tokens;
+    while (true) {
+      const CSSParserToken token = tokenizer.TokenizeSingle();
+      if (token.GetType() == kEOFToken) {
+        return tokens;
+      } else {
+        tokens.push_back(token);
+      }
+    }
   }
 
   Result StaticConsumeSupportsCondition(String string) {
diff --git a/third_party/blink/renderer/core/css/parser/css_tokenizer.cc b/third_party/blink/renderer/core/css/parser/css_tokenizer.cc
index a18ae78..c99b149 100644
--- a/third_party/blink/renderer/core/css/parser/css_tokenizer.cc
+++ b/third_party/blink/renderer/core/css/parser/css_tokenizer.cc
@@ -8,8 +8,10 @@
 #endif
 
 #include "third_party/blink/renderer/core/css/parser/css_tokenizer.h"
+
 #include "third_party/blink/renderer/core/css/parser/css_parser_idioms.h"
 #include "third_party/blink/renderer/core/html/parser/html_parser_idioms.h"
+#include "third_party/blink/renderer/core/html/parser/input_stream_preprocessor.h"
 #include "third_party/blink/renderer/platform/wtf/text/character_names.h"
 
 #ifdef __SSE2__
@@ -19,13 +21,6 @@
 #endif
 
 namespace blink {
-namespace {
-
-// To avoid resizing we err on the side of reserving too much space.
-// Most strings we tokenize have about 3.5 to 5 characters per token.
-constexpr wtf_size_t kEstimatedCharactersPerToken = 3;
-
-}  // namespace
 
 CSSTokenizer::CSSTokenizer(const String& string, wtf_size_t offset)
     : input_(string) {
@@ -45,22 +40,6 @@
   input_.Advance(offset);
 }
 
-Vector<CSSParserToken, 32> CSSTokenizer::TokenizeToEOF() {
-  Vector<CSSParserToken, 32> tokens;
-  tokens.ReserveInitialCapacity((input_.length() - Offset()) /
-                                kEstimatedCharactersPerToken);
-
-  while (true) {
-    const CSSParserToken token =
-        NextToken</*SkipComments=*/true, /*StoreOffset=*/false>();
-    if (token.GetType() == kEOFToken) {
-      return tokens;
-    } else {
-      tokens.push_back(token);
-    }
-  }
-}
-
 StringView CSSTokenizer::StringRangeFrom(wtf_size_t start) const {
   return input_.RangeFrom(start);
 }
@@ -71,11 +50,11 @@
 }
 
 CSSParserToken CSSTokenizer::TokenizeSingle() {
-  return NextToken</*SkipComments=*/true, /*StoreOffset=*/true>();
+  return NextToken</*SkipComments=*/true>();
 }
 
 CSSParserToken CSSTokenizer::TokenizeSingleWithComments() {
-  return NextToken</*SkipComments=*/false, /*StoreOffset=*/true>();
+  return NextToken</*SkipComments=*/false>();
 }
 
 wtf_size_t CSSTokenizer::TokenCount() const {
@@ -153,12 +132,10 @@
   return ConsumeIdentLikeToken();
 }
 
-template <bool SkipComments, bool StoreOffset>
+template <bool SkipComments>
 CSSParserToken CSSTokenizer::NextToken() {
   do {
-    if (StoreOffset) {
-      prev_offset_ = input_.Offset();
-    }
+    prev_offset_ = input_.Offset();
     // Unlike the HTMLTokenizer, the CSS Syntax spec is written
     // as a stateless, (fixed-size) look-ahead tokenizer.
     // We could move to the stateful model and instead create
diff --git a/third_party/blink/renderer/core/css/parser/css_tokenizer.h b/third_party/blink/renderer/core/css/parser/css_tokenizer.h
index aa8f992d..4fdcb68 100644
--- a/third_party/blink/renderer/core/css/parser/css_tokenizer.h
+++ b/third_party/blink/renderer/core/css/parser/css_tokenizer.h
@@ -8,19 +8,16 @@
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/css/parser/css_parser_token.h"
 #include "third_party/blink/renderer/core/css/parser/css_tokenizer_input_stream.h"
-#include "third_party/blink/renderer/core/html/parser/input_stream_preprocessor.h"
-#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_view.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
-
-#include <climits>
+#include "third_party/blink/renderer/platform/wtf/vector.h"
 
 namespace blink {
 
 class CSSTokenizerInputStream;
 
 class CORE_EXPORT CSSTokenizer {
-  DISALLOW_NEW();
+  STACK_ALLOCATED();
 
  public:
   // The overload with const String& holds on to a reference to the string.
@@ -31,10 +28,6 @@
   CSSTokenizer(const CSSTokenizer&) = delete;
   CSSTokenizer& operator=(const CSSTokenizer&) = delete;
 
-  // The CSSParserTokens in the result may hold references to the CSSTokenizer
-  // object, or the string data referenced by the CSSTokenizer. Do not use the
-  // tokens after the CSSTokenizer or its underlying String goes out of scope.
-  Vector<CSSParserToken, 32> TokenizeToEOF();
   wtf_size_t TokenCount() const;
 
   wtf_size_t Offset() const { return input_.Offset(); }
@@ -94,7 +87,7 @@
   }
 
  private:
-  template <bool SkipComments, bool StoreOffset>
+  template <bool SkipComments>
   ALWAYS_INLINE CSSParserToken NextToken();
 
   UChar Consume();
diff --git a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
index f4dc23a..26619a5 100644
--- a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
+++ b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
@@ -1443,11 +1443,13 @@
     }
   }
   if (CSSMathFunctionValue* result = math_parser.ConsumeValue()) {
-    if (result->ComputeDegrees() < minimum_value) {
+    auto* numeric_result =
+        DynamicTo<CSSMathExpressionNumericLiteral>(result->ExpressionNode());
+    if (numeric_result && numeric_result->DoubleValue() < minimum_value) {
       return CSSNumericLiteralValue::Create(
           minimum_value, CSSPrimitiveValue::UnitType::kDegrees);
     }
-    if (result->ComputeDegrees() > maximum_value) {
+    if (numeric_result && numeric_result->DoubleValue() > maximum_value) {
       return CSSNumericLiteralValue::Create(
           maximum_value, CSSPrimitiveValue::UnitType::kDegrees);
     }
@@ -5416,8 +5418,13 @@
 
 bool IsAngleWithinLimits(CSSPrimitiveValue* angle) {
   constexpr float kMaxAngle = 90.0f;
-  return angle->GetFloatValue() >= -kMaxAngle &&
-         angle->GetFloatValue() <= kMaxAngle;
+  auto* numeric_angle = DynamicTo<CSSNumericLiteralValue>(angle);
+  if (!numeric_angle) {
+    // Can't resolve math function here without length resolver.
+    return true;
+  }
+  return numeric_angle->DoubleValue() >= -kMaxAngle &&
+         numeric_angle->DoubleValue() <= kMaxAngle;
 }
 
 CSSValue* ConsumeFontStyle(CSSParserTokenStream& stream,
diff --git a/third_party/blink/renderer/core/css/resolver/font_style_resolver.cc b/third_party/blink/renderer/core/css/resolver/font_style_resolver.cc
index 4b38bb64d..84b51b9b 100644
--- a/third_party/blink/renderer/core/css/resolver/font_style_resolver.cc
+++ b/third_party/blink/renderer/core/css/resolver/font_style_resolver.cc
@@ -61,6 +61,7 @@
   // CSSPropertyID::kFontStyle
   if (property_set.HasProperty(CSSPropertyID::kFontStyle)) {
     builder.SetStyle(StyleBuilderConverterBase::ConvertFontStyle(
+        conversion_data,
         *property_set.GetPropertyCSSValue(CSSPropertyID::kFontStyle)));
   }
 
diff --git a/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc b/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
index 220432c..3f31866b 100644
--- a/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
@@ -949,6 +949,7 @@
 }
 
 FontSelectionValue StyleBuilderConverterBase::ConvertFontStyle(
+    const CSSLengthResolver& length_resolver,
     const CSSValue& value) {
   DCHECK(!value.IsPrimitiveValue());
 
@@ -970,8 +971,8 @@
     const CSSValueList* values = style_range_value->GetObliqueValues();
     CHECK_LT(values->length(), 2u);
     if (values->length()) {
-      return FontSelectionValue(
-          To<CSSPrimitiveValue>(values->Item(0)).ComputeDegrees());
+      return FontSelectionValue(To<CSSPrimitiveValue>(values->Item(0))
+                                    .ComputeDegrees(length_resolver));
     } else {
       identifier_value = style_range_value->GetFontStyleValue();
       if (identifier_value->GetValueID() == CSSValueID::kNormal) {
@@ -991,7 +992,8 @@
 FontSelectionValue StyleBuilderConverter::ConvertFontStyle(
     StyleResolverState& state,
     const CSSValue& value) {
-  return StyleBuilderConverterBase::ConvertFontStyle(value);
+  return StyleBuilderConverterBase::ConvertFontStyle(
+      state.CssToLengthConversionData(), value);
 }
 
 FontSelectionValue StyleBuilderConverterBase::ConvertFontWeight(
@@ -3093,15 +3095,16 @@
 }
 
 namespace {
-gfx::SizeF GetRatioFromList(const CSSValueList& list) {
+gfx::SizeF GetRatioFromList(const CSSLengthResolver& length_resolver,
+                            const CSSValueList& list) {
   auto* ratio = DynamicTo<cssvalue::CSSRatioValue>(list.Item(0));
   if (!ratio) {
     DCHECK_EQ(list.length(), 2u);
     ratio = DynamicTo<cssvalue::CSSRatioValue>(list.Item(1));
   }
   DCHECK(ratio);
-  return gfx::SizeF(ratio->First().GetFloatValue(),
-                    ratio->Second().GetFloatValue());
+  return gfx::SizeF(ratio->First().ComputeNumber(length_resolver),
+                    ratio->Second().ComputeNumber(length_resolver));
 }
 
 bool ListHasAuto(const CSSValueList& list) {
@@ -3136,7 +3139,7 @@
   bool has_auto = ListHasAuto(list);
   EAspectRatioType type =
       has_auto ? EAspectRatioType::kAutoAndRatio : EAspectRatioType::kRatio;
-  gfx::SizeF ratio = GetRatioFromList(list);
+  gfx::SizeF ratio = GetRatioFromList(state.CssToLengthConversionData(), list);
   return StyleAspectRatio(type, ratio);
 }
 
diff --git a/third_party/blink/renderer/core/css/resolver/style_builder_converter.h b/third_party/blink/renderer/core/css/resolver/style_builder_converter.h
index f9c4adb1..3f9704e 100644
--- a/third_party/blink/renderer/core/css/resolver/style_builder_converter.h
+++ b/third_party/blink/renderer/core/css/resolver/style_builder_converter.h
@@ -90,7 +90,8 @@
  public:
   static FontSelectionValue ConvertFontStretch(const CSSLengthResolver&,
                                                const CSSValue&);
-  static FontSelectionValue ConvertFontStyle(const CSSValue&);
+  static FontSelectionValue ConvertFontStyle(const CSSLengthResolver&,
+                                             const CSSValue&);
   static FontSelectionValue ConvertFontWeight(const CSSValue&,
                                               FontSelectionValue);
   static FontDescription::FontVariantCaps ConvertFontVariantCaps(
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index 2f03a6a0..33285a6 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -3645,8 +3645,7 @@
     parser->SetDecoder(
         BuildTextResourceDecoder(GetFrame(), Url(), mime_type, encoding));
   }
-  if (AnchorElementInteractionTracker::IsFeatureEnabled() &&
-      !GetFrame()->IsProvisional()) {
+  if (!GetFrame()->IsProvisional()) {
     anchor_element_interaction_tracker_ =
         MakeGarbageCollected<AnchorElementInteractionTracker>(*this);
   }
diff --git a/third_party/blink/renderer/core/exported/web_input_element.cc b/third_party/blink/renderer/core/exported/web_input_element.cc
index 7c867f5..405d1bd 100644
--- a/third_party/blink/renderer/core/exported/web_input_element.cc
+++ b/third_party/blink/renderer/core/exported/web_input_element.cc
@@ -103,14 +103,6 @@
   return ConstUnwrap<HTMLInputElement>()->ShouldRevealPassword();
 }
 
-void WebInputElement::SetShouldShowStrongPasswordLabel(bool value) {
-  Unwrap<HTMLInputElement>()->SetShouldShowStrongPasswordLabel(value);
-}
-
-bool WebInputElement::ShouldShowStrongPasswordLabel() const {
-  return ConstUnwrap<HTMLInputElement>()->ShouldShowStrongPasswordLabel();
-}
-
 #if BUILDFLAG(IS_ANDROID)
 bool WebInputElement::IsLastInputElementInForm() {
   return Unwrap<HTMLInputElement>()->IsLastInputElementInForm();
diff --git a/third_party/blink/renderer/core/html/anchor_element_metrics_sender_test.cc b/third_party/blink/renderer/core/html/anchor_element_metrics_sender_test.cc
index 45ea679b..34eecd19 100644
--- a/third_party/blink/renderer/core/html/anchor_element_metrics_sender_test.cc
+++ b/third_party/blink/renderer/core/html/anchor_element_metrics_sender_test.cc
@@ -796,11 +796,9 @@
 
 TEST_F(AnchorElementMetricsSenderTest,
        AnchorElementInteractionTrackerSendsPointerEvents) {
-  base::test::ScopedFeatureList anchor_element_interaction;
-  anchor_element_interaction.InitWithFeatures(
-      {features::kAnchorElementInteraction,
-       features::kSpeculationRulesPointerHoverHeuristics},
-      {});
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitWithFeatures(
+      {features::kSpeculationRulesPointerHoverHeuristics}, {});
 
   String source("https://example.com/p1");
 
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.cc b/third_party/blink/renderer/core/html/forms/html_input_element.cc
index 77373ee..9ef63c8 100644
--- a/third_party/blink/renderer/core/html/forms/html_input_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_input_element.cc
@@ -62,7 +62,6 @@
 #include "third_party/blink/renderer/core/fileapi/file_list.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/frame/local_frame_view.h"
-#include "third_party/blink/renderer/core/geometry/dom_rect.h"
 #include "third_party/blink/renderer/core/html/forms/color_chooser.h"
 #include "third_party/blink/renderer/core/html/forms/date_time_chooser.h"
 #include "third_party/blink/renderer/core/html/forms/email_input_type.h"
@@ -109,8 +108,6 @@
 
 const unsigned kMaxEmailFieldLength = 254;
 
-const unsigned kMinStrongPasswordLabelWidth = 220;
-
 static bool is_default_font_prewarmed_ = false;
 
 }  // namespace
@@ -1243,17 +1240,6 @@
     } else {
       placeholder->classList().Remove(reveal);
     }
-
-    // Prevent fade out and displaying strong password label in narrow forms.
-    if (GetBoundingClientRect()->width() < kMinStrongPasswordLabelWidth) {
-      should_show_strong_password_label_ = false;
-    }
-    const AtomicString fade_out("fade-out-password");
-    if (should_show_strong_password_label_) {
-      placeholder->classList().Add(fade_out);
-    } else {
-      placeholder->classList().Remove(fade_out);
-    }
   }
 
   SetNeedsStyleRecalc(
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.h b/third_party/blink/renderer/core/html/forms/html_input_element.h
index 1f30f69..7e98051 100644
--- a/third_party/blink/renderer/core/html/forms/html_input_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_input_element.h
@@ -344,12 +344,6 @@
   bool ShouldDrawCapsLockIndicator() const;
   void SetShouldRevealPassword(bool value);
   bool ShouldRevealPassword() const { return should_reveal_password_; }
-  void SetShouldShowStrongPasswordLabel(bool value) {
-    should_show_strong_password_label_ = value;
-  }
-  bool ShouldShowStrongPasswordLabel() const {
-    return should_show_strong_password_label_;
-  }
 #if BUILDFLAG(IS_ANDROID)
   bool IsLastInputElementInForm();
   void DispatchSimulatedEnter();
@@ -517,7 +511,6 @@
   unsigned needs_to_update_view_value_ : 1;
   unsigned is_placeholder_visible_ : 1;
   unsigned has_been_password_field_ : 1;
-  unsigned should_show_strong_password_label_ : 1;
   unsigned scheduled_create_shadow_tree_ : 1;
   Member<InputType> input_type_;
   Member<InputTypeView> input_type_view_;
diff --git a/third_party/blink/renderer/core/html/forms/html_opt_group_element.cc b/third_party/blink/renderer/core/html/forms/html_opt_group_element.cc
index 3c53e8e8..59f3f2d 100644
--- a/third_party/blink/renderer/core/html/forms/html_opt_group_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_opt_group_element.cc
@@ -119,10 +119,19 @@
 
 Node::InsertionNotificationRequest HTMLOptGroupElement::InsertedInto(
     ContainerNode& insertion_point) {
+  stylable_select_rendering_ = false;
   HTMLElement::InsertedInto(insertion_point);
   if (HTMLSelectElement* select = OwnerSelectElement()) {
     if (&insertion_point == select)
       select->OptGroupInsertedOrRemoved(*this);
+    // TODO(crbug.com/1511354): This UsesMenuList check doesn't account for
+    // the case when the select's rendering is changed after insertion.
+    stylable_select_rendering_ =
+        RuntimeEnabledFeatures::StylableSelectEnabled() &&
+        select->UsesMenuList();
+  }
+  if (RuntimeEnabledFeatures::StylableSelectEnabled()) {
+    UpdateGroupLabel();
   }
   return kInsertionDone;
 }
@@ -148,7 +157,19 @@
 }
 
 HTMLSelectElement* HTMLOptGroupElement::OwnerSelectElement() const {
-  return DynamicTo<HTMLSelectElement>(parentNode());
+  if (RuntimeEnabledFeatures::SelectParserRelaxationEnabled()) {
+    // TODO(crbug.com/351990825): Cache the owner select ancestor on insertion
+    // rather than doing a tree traversal here every time OwnerSelectElement is
+    // called, which may be a lot.
+    for (Node& ancestor : NodeTraversal::AncestorsOf(*this)) {
+      if (auto* select = DynamicTo<HTMLSelectElement>(ancestor)) {
+        return select;
+      }
+    }
+    return nullptr;
+  } else {
+    return DynamicTo<HTMLSelectElement>(parentNode());
+  }
 }
 
 String HTMLOptGroupElement::DefaultToolTip() const {
@@ -185,8 +206,9 @@
   for (Node& child : NodeTraversal::ChildrenOf(*this)) {
     if (!child.IsSlotable())
       continue;
-    if (CanAssignToOptGroupSlot(child))
+    if (stylable_select_rendering_ || CanAssignToOptGroupSlot(child)) {
       opt_group_nodes.push_back(child);
+    }
   }
   opt_group_slot_->Assign(opt_group_nodes);
 }
@@ -196,6 +218,16 @@
   HTMLDivElement& label = OptGroupLabelElement();
   label.setTextContent(label_text);
   label.setAttribute(html_names::kAriaLabelAttr, AtomicString(label_text));
+  if (label_text.ContainsOnlyWhitespaceOrEmpty()) {
+    if (stylable_select_rendering_) {
+      // If the author uses <legend> to label the <optgroup> instead of the
+      // label attribute, then we don't want extra space being taken up for the
+      // unused label attribute.
+      label.SetInlineStyleProperty(CSSPropertyID::kDisplay, "none");
+    }
+  } else {
+    label.RemoveInlineStyleProperty(CSSPropertyID::kDisplay);
+  }
 }
 
 HTMLDivElement& HTMLOptGroupElement::OptGroupLabelElement() const {
diff --git a/third_party/blink/renderer/core/html/forms/html_opt_group_element.h b/third_party/blink/renderer/core/html/forms/html_opt_group_element.h
index 3e80d107..7e72e0c 100644
--- a/third_party/blink/renderer/core/html/forms/html_opt_group_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_opt_group_element.h
@@ -65,6 +65,11 @@
   void UpdateGroupLabel();
 
   Member<HTMLSlotElement> opt_group_slot_;
+
+  // stylable_select_rendering_ is set to true when the StylableSelect flag is
+  // enabled and this element is in the DOM subtree of a <select> which
+  // UsesMenuList.
+  bool stylable_select_rendering_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/forms/html_option_element.cc b/third_party/blink/renderer/core/html/forms/html_option_element.cc
index 1d40bb7..252b819b 100644
--- a/third_party/blink/renderer/core/html/forms/html_option_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_option_element.cc
@@ -518,6 +518,8 @@
     // remove the code in HTMLSelectElement::ChildrenChanged and
     // HTMLOptGroupElement::ChildrenChanged which handles this case as well as
     // the code here which avoids handling it.
+    // TODO(crbug.com/1511354): This UsesMenuList check doesn't account for
+    // the case when the select's rendering is changed after insertion.
     SetTextOnlyRendering(!parent_select->UsesMenuList());
     return return_value;
   }
@@ -533,6 +535,8 @@
     }
     if (auto* select = DynamicTo<HTMLSelectElement>(ancestor)) {
       if (passed_insertion_point) {
+        // TODO(crbug.com/1511354): This UsesMenuList check doesn't account for
+        // the case when the select's rendering is changed after insertion.
         SetTextOnlyRendering(!select->UsesMenuList());
         select->OptionInserted(*this, Selected());
       }
diff --git a/third_party/blink/renderer/core/html/forms/password_input_type.cc b/third_party/blink/renderer/core/html/forms/password_input_type.cc
index 812349a8..a948800d 100644
--- a/third_party/blink/renderer/core/html/forms/password_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/password_input_type.cc
@@ -46,7 +46,6 @@
 #include "third_party/blink/renderer/core/html/shadow/shadow_element_names.h"
 #include "third_party/blink/renderer/core/input/keyboard_event_manager.h"
 #include "third_party/blink/renderer/core/input_type_names.h"
-#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 
 namespace blink {
 
@@ -76,8 +75,7 @@
 }
 
 bool PasswordInputType::NeedsContainer() const {
-  return RuntimeEnabledFeatures::PasswordRevealEnabled() ||
-         RuntimeEnabledFeatures::PasswordStrongLabelEnabled();
+  return RuntimeEnabledFeatures::PasswordRevealEnabled();
 }
 
 void PasswordInputType::CreateShadowSubtree() {
@@ -93,17 +91,6 @@
                                 GetElement().GetDocument()),
                             view_port->nextSibling());
   }
-
-  if (RuntimeEnabledFeatures::PasswordStrongLabelEnabled()) {
-    Element* container = ContainerElement();
-    Element* view_port = GetElement().UserAgentShadowRoot()->getElementById(
-        shadow_element_names::kIdEditingViewPort);
-    DCHECK(container);
-    DCHECK(view_port);
-    container->InsertBefore(MakeGarbageCollected<PasswordStrongLabelElement>(
-                                GetElement().GetDocument()),
-                            view_port->nextSibling());
-  }
 }
 
 void PasswordInputType::DidSetValueByUserEdit() {
@@ -114,11 +101,6 @@
     }
     UpdatePasswordRevealButton();
   }
-  if (RuntimeEnabledFeatures::PasswordStrongLabelEnabled()) {
-    // If any character is edited by the user, we no longer display the label.
-    GetElement().SetShouldShowStrongPasswordLabel(false);
-    UpdateStrongPasswordLabel();
-  }
 
   BaseTextInputType::DidSetValueByUserEdit();
 }
@@ -131,9 +113,6 @@
       UpdatePasswordRevealButton();
     }
   }
-  if (RuntimeEnabledFeatures::PasswordStrongLabelEnabled() && value_changed) {
-    UpdateStrongPasswordLabel();
-  }
 
   BaseTextInputType::DidSetValue(string, value_changed);
 }
@@ -143,10 +122,6 @@
 
   if (RuntimeEnabledFeatures::PasswordRevealEnabled())
     UpdatePasswordRevealButton();
-
-  if (RuntimeEnabledFeatures::PasswordStrongLabelEnabled()) {
-    UpdateStrongPasswordLabel();
-  }
 }
 
 void PasswordInputType::CapsLockStateMayHaveChanged() {
@@ -210,16 +185,6 @@
   }
 }
 
-void PasswordInputType::UpdateStrongPasswordLabel() {
-  Element* label = GetElement().EnsureShadowSubtree()->getElementById(
-      shadow_element_names::kIdPasswordStrongLabel);
-  if (GetElement().ShouldShowStrongPasswordLabel()) {
-    label->RemoveInlineStyleProperty(CSSPropertyID::kDisplay);
-  } else {
-    label->SetInlineStyleProperty(CSSPropertyID::kDisplay, CSSValueID::kNone);
-  }
-}
-
 void PasswordInputType::ForwardEvent(Event& event) {
   BaseTextInputType::ForwardEvent(event);
 
@@ -236,10 +201,6 @@
     UpdatePasswordRevealButton();
   }
 
-  if (RuntimeEnabledFeatures::PasswordStrongLabelEnabled()) {
-    UpdateStrongPasswordLabel();
-  }
-
   BaseTextInputType::HandleBlurEvent();
 }
 
diff --git a/third_party/blink/renderer/core/html/forms/password_input_type.h b/third_party/blink/renderer/core/html/forms/password_input_type.h
index 2484ae2..fa1856ec 100644
--- a/third_party/blink/renderer/core/html/forms/password_input_type.h
+++ b/third_party/blink/renderer/core/html/forms/password_input_type.h
@@ -56,7 +56,6 @@
   void CapsLockStateMayHaveChanged() override;
   bool ShouldDrawCapsLockIndicator() const override;
   void UpdatePasswordRevealButton();
-  void UpdateStrongPasswordLabel();
   void DidSetValueByUserEdit() override;
   void DidSetValue(const String&, bool value_changed) override;
 
diff --git a/third_party/blink/renderer/core/html/forms/text_control_inner_elements.cc b/third_party/blink/renderer/core/html/forms/text_control_inner_elements.cc
index 15fe6b7f..23c379e 100644
--- a/third_party/blink/renderer/core/html/forms/text_control_inner_elements.cc
+++ b/third_party/blink/renderer/core/html/forms/text_control_inner_elements.cc
@@ -27,7 +27,6 @@
 #include "third_party/blink/renderer/core/html/forms/text_control_inner_elements.h"
 
 #include "third_party/blink/public/common/input/web_pointer_properties.h"
-#include "third_party/blink/public/strings/grit/blink_strings.h"
 #include "third_party/blink/renderer/core/css/resolver/style_adjuster.h"
 #include "third_party/blink/renderer/core/css/resolver/style_resolver.h"
 #include "third_party/blink/renderer/core/css/style_change_reason.h"
@@ -40,7 +39,6 @@
 #include "third_party/blink/renderer/core/html/shadow/shadow_element_names.h"
 #include "third_party/blink/renderer/core/html_names.h"
 #include "third_party/blink/renderer/core/layout/forms/layout_text_control_inner_editor.h"
-#include "third_party/blink/renderer/platform/text/platform_locale.h"
 
 namespace blink {
 
@@ -290,14 +288,4 @@
   return HTMLDivElement::WillRespondToMouseClickEvents();
 }
 
-// ----------------------------
-
-PasswordStrongLabelElement::PasswordStrongLabelElement(Document& document)
-    : HTMLDivElement(document) {
-  SetShadowPseudoId(AtomicString("-internal-strong"));
-  setAttribute(html_names::kIdAttr,
-               shadow_element_names::kIdPasswordStrongLabel);
-  setTextContent(
-      Locale::DefaultLocale().QueryString(IDS_STRONG_PASSWORD_LABEL));
-}
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/forms/text_control_inner_elements.h b/third_party/blink/renderer/core/html/forms/text_control_inner_elements.h
index 6395a06e..a35bf1b 100644
--- a/third_party/blink/renderer/core/html/forms/text_control_inner_elements.h
+++ b/third_party/blink/renderer/core/html/forms/text_control_inner_elements.h
@@ -91,16 +91,6 @@
   }
 };
 
-class PasswordStrongLabelElement final : public HTMLDivElement {
- public:
-  explicit PasswordStrongLabelElement(Document&);
-
- private:
-  FocusableState SupportsFocus(UpdateBehavior) const override {
-    return FocusableState::kNotFocusable;
-  }
-};
-
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_CORE_HTML_FORMS_TEXT_CONTROL_INNER_ELEMENTS_H_
diff --git a/third_party/blink/renderer/core/html/html_element.cc b/third_party/blink/renderer/core/html/html_element.cc
index 61e4961..8ecbe3c 100644
--- a/third_party/blink/renderer/core/html/html_element.cc
+++ b/third_party/blink/renderer/core/html/html_element.cc
@@ -1752,7 +1752,10 @@
 
   // Now check the auto stack.
   auto& auto_stack = document.PopoverAutoStack();
-  CHECK(auto_stack.Contains(endpoint));
+  if (!auto_stack.Contains(endpoint)) {
+    // Event handlers from hint popovers could have closed our endpoint.
+    return;
+  }
   hide_stack_until(endpoint, auto_stack);
 }
 
diff --git a/third_party/blink/renderer/core/html/resources/html.css b/third_party/blink/renderer/core/html/resources/html.css
index 0c05e1c..4f53128 100644
--- a/third_party/blink/renderer/core/html/resources/html.css
+++ b/third_party/blink/renderer/core/html/resources/html.css
@@ -603,12 +603,6 @@
     -webkit-text-security: none;
 }
 
-input[type="password" i]::-internal-input-suggested.fade-out-password {
-    width: fit-content;
-    -webkit-mask: linear-gradient(to right, #000 50%, #0000);
-    mask: linear-gradient(to right, #000 50%, #0000);
-}
-
 input[type="password" i]::-internal-reveal {
   width: 1.3em;
   height: 1.3em;
@@ -632,12 +626,6 @@
   cursor: pointer;
 }
 
-input[type="password" i]::-internal-strong {
-  color: light-dark(#0B57D0, #A8C7FA);
-  font-family: roboto;
-  -webkit-text-security: none;
-}
-
 input[type="hidden" i], input[type="image" i], input[type="file" i] {
     appearance: none;
     padding: initial;
diff --git a/third_party/blink/renderer/core/html/resources/stylable_select.css b/third_party/blink/renderer/core/html/resources/stylable_select.css
index 6d1c2ba..f30317b0 100644
--- a/third_party/blink/renderer/core/html/resources/stylable_select.css
+++ b/third_party/blink/renderer/core/html/resources/stylable_select.css
@@ -163,3 +163,11 @@
 select:not(:open)::select-fallback-button::after {
   content: counter(fake-counter-name, disclosure-closed);
 }
+
+select:not(:-internal-list-box) optgroup {
+  padding-inline: 2px;
+}
+/* This can be merged with the :-internal-list-box rule in html.css */
+select:not(:-internal-list-box) optgroup option {
+  padding-inline-start: 20px;
+}
diff --git a/third_party/blink/renderer/core/html/shadow/shadow_element_names.json5 b/third_party/blink/renderer/core/html/shadow/shadow_element_names.json5
index f4ca232..8ff362b 100644
--- a/third_party/blink/renderer/core/html/shadow/shadow_element_names.json5
+++ b/third_party/blink/renderer/core/html/shadow/shadow_element_names.json5
@@ -58,10 +58,6 @@
       Symbol: "kIdPasswordRevealButton",
     },
     {
-      name: "password-strong-label",
-      Symbol: "kIdPasswordStrongLabel",
-    },
-    {
       name: "thumb",
       Symbol: "kIdSliderThumb",
     },
diff --git a/third_party/blink/renderer/core/loader/anchor_element_interaction_test.cc b/third_party/blink/renderer/core/loader/anchor_element_interaction_test.cc
index 4cb53f1..091721b1a 100644
--- a/third_party/blink/renderer/core/loader/anchor_element_interaction_test.cc
+++ b/third_party/blink/renderer/core/loader/anchor_element_interaction_test.cc
@@ -84,9 +84,7 @@
 
   virtual void SetFeatureList() {
     feature_list_.InitWithFeatures(
-        {features::kAnchorElementInteraction,
-         features::kSpeculationRulesPointerHoverHeuristics},
-        {});
+        {features::kSpeculationRulesPointerHoverHeuristics}, {});
   }
 
   void TearDown() override {
@@ -518,33 +516,7 @@
   }
 }
 
-class AnchorElementInteractionMouseMotionEstimatorFeatureFlagTest
-    : public AnchorElementInteractionTest,
-      public ::testing::WithParamInterface<std::string_view> {
- public:
-  bool IsMouseMotionEstimatorFeatureEnabled() {
-    return GetParam() == "enabled";
-  }
-
- protected:
-  void SetFeatureList() override {
-    std::vector<base::test::FeatureRef> enabled_features{
-        features::kAnchorElementInteraction,
-        features::kSpeculationRulesPointerHoverHeuristics};
-    std::vector<base::test::FeatureRef> disabled_features{};
-
-    if (IsMouseMotionEstimatorFeatureEnabled()) {
-      enabled_features.push_back(features::kAnchorElementMouseMotionEstimator);
-    } else {
-      disabled_features.push_back(features::kAnchorElementMouseMotionEstimator);
-    }
-
-    feature_list_.InitWithFeatures(enabled_features, disabled_features);
-  }
-};
-
-TEST_P(AnchorElementInteractionMouseMotionEstimatorFeatureFlagTest,
-       FeatureFlagIsEffective) {
+TEST_F(AnchorElementInteractionTest, MouseVelocitySent) {
   String source("https://example.com/p1");
   SimRequest main_resource(source, "text/html");
   LoadURL(source);
@@ -584,17 +556,8 @@
   EXPECT_EQ(expected_url, url_received);
   EXPECT_EQ(PointerEventType::kOnPointerHover, hosts_[0]->event_type_);
   EXPECT_TRUE(hosts_[0]->is_mouse_pointer_);
-  if (IsMouseMotionEstimatorFeatureEnabled()) {
-    EXPECT_NEAR(50.0, hosts_[0]->mouse_velocity_, 0.5);
-  } else {
-    EXPECT_EQ(0.0, hosts_[0]->mouse_velocity_);
-  }
+  EXPECT_NEAR(50.0, hosts_[0]->mouse_velocity_, 0.5);
 }
 
-INSTANTIATE_TEST_SUITE_P(
-    MouseMotionEstimatorFeatureFlagTest,
-    AnchorElementInteractionMouseMotionEstimatorFeatureFlagTest,
-    ::testing::Values("enabled", "disabled"));
-
 }  // namespace
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/loader/anchor_element_interaction_tracker.cc b/third_party/blink/renderer/core/loader/anchor_element_interaction_tracker.cc
index 5d5114bb..ae572ac1 100644
--- a/third_party/blink/renderer/core/loader/anchor_element_interaction_tracker.cc
+++ b/third_party/blink/renderer/core/loader/anchor_element_interaction_tracker.cc
@@ -177,9 +177,6 @@
 
 void AnchorElementInteractionTracker::MouseMotionEstimator::OnMouseMoveEvent(
     gfx::PointF position) {
-  if (!IsMouseMotionEstimatorEnabled()) {
-    return;
-  }
   AddDataPoint(clock_->NowTicks(), position);
   if (update_timer_.IsActive()) {
     update_timer_.Stop();
@@ -221,17 +218,6 @@
 }
 
 // static
-bool AnchorElementInteractionTracker::IsFeatureEnabled() {
-  return base::FeatureList::IsEnabled(features::kAnchorElementInteraction);
-}
-
-// static
-bool AnchorElementInteractionTracker::IsMouseMotionEstimatorEnabled() {
-  return base::FeatureList::IsEnabled(
-      features::kAnchorElementMouseMotionEstimator);
-}
-
-// static
 base::TimeDelta AnchorElementInteractionTracker::GetHoverDwellTime() {
   static base::FeatureParam<base::TimeDelta> hover_dwell_time{
       &blink::features::kSpeculationRulesPointerHoverHeuristics,
diff --git a/third_party/blink/renderer/core/loader/anchor_element_interaction_tracker.h b/third_party/blink/renderer/core/loader/anchor_element_interaction_tracker.h
index 7b7ed8e33..36beb0c4 100644
--- a/third_party/blink/renderer/core/loader/anchor_element_interaction_tracker.h
+++ b/third_party/blink/renderer/core/loader/anchor_element_interaction_tracker.h
@@ -79,8 +79,6 @@
   explicit AnchorElementInteractionTracker(Document& document);
   ~AnchorElementInteractionTracker();
 
-  static bool IsFeatureEnabled();
-  static bool IsMouseMotionEstimatorEnabled();
   static base::TimeDelta GetHoverDwellTime();
 
   void OnMouseMoveEvent(const WebMouseEvent& mouse_event);
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context.cc b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
index afaf6b8..60c95ea 100644
--- a/third_party/blink/renderer/core/loader/frame_fetch_context.cc
+++ b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
@@ -418,14 +418,15 @@
   request.SetStorageAccessApiStatus(
       document_->GetExecutionContext()->GetStorageAccessApiStatus());
 
-  if (!minimal_prep && document_loader_->ForceFetchCacheMode()) {
-    request.SetCacheMode(*document_loader_->ForceFetchCacheMode());
-  }
-
-  if (const AttributionSrcLoader* attribution_src_loader =
-          GetFrame()->GetAttributionSrcLoader()) {
-    request.SetAttributionReportingSupport(
-        attribution_src_loader->GetSupport());
+  if (!minimal_prep) {
+    if (document_loader_->ForceFetchCacheMode()) {
+      request.SetCacheMode(*document_loader_->ForceFetchCacheMode());
+    }
+    if (const AttributionSrcLoader* attribution_src_loader =
+            GetFrame()->GetAttributionSrcLoader()) {
+      request.SetAttributionReportingSupport(
+          attribution_src_loader->GetSupport());
+    }
   }
 
   // If the original request included the attribute to opt-in to shared storage,
@@ -849,6 +850,13 @@
   if (document_loader_->ForceFetchCacheMode()) {
     request.SetCacheMode(*document_loader_->ForceFetchCacheMode());
   }
+  // ResourceFetcher::DidLoadResourceFromMemoryCache() may call out in such a
+  // way that the AttributionSupport is needed.
+  if (const AttributionSrcLoader* attribution_src_loader =
+          GetFrame()->GetAttributionSrcLoader()) {
+    request.SetAttributionReportingSupport(
+        attribution_src_loader->GetSupport());
+  }
 }
 
 void FrameFetchContext::UpgradeResourceRequestForLoader(
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
index 41a35fe1..8177d2b 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
@@ -490,6 +490,50 @@
   return sdp.Find("stereo=1") != kNotFound;
 }
 
+// Keep in sync with tools/metrics/histograms/metadata/web_rtc/enums.xml
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class GenerateCertificateAlgorithms {
+  kEcDsaP256 = 0,
+  kRsa1024,
+  kRsa2048,
+  kRsa4096,
+  kRsa8192,
+  kRsaOther,
+  kMaxValue = kRsaOther,
+};
+
+void MeasureGenerateCertificateKeyType(
+    const std::optional<rtc::KeyParams>& key_params) {
+  if (!key_params.has_value()) {
+    return;
+  }
+  GenerateCertificateAlgorithms bucket =
+      GenerateCertificateAlgorithms::kEcDsaP256;
+  if (key_params->type() == rtc::KT_RSA) {
+    switch (key_params->rsa_params().mod_size) {
+      case 1024:
+        bucket = GenerateCertificateAlgorithms::kRsa1024;
+        break;
+      case 2048:
+        bucket = GenerateCertificateAlgorithms::kRsa2048;
+        break;
+      case 4096:
+        bucket = GenerateCertificateAlgorithms::kRsa4096;
+        break;
+      case 8192:
+        bucket = GenerateCertificateAlgorithms::kRsa8192;
+        break;
+      default:
+        bucket = GenerateCertificateAlgorithms::kRsaOther;
+        break;
+    }
+  }
+  UMA_HISTOGRAM_ENUMERATION(
+      "WebRTC.PeerConnection.GenerateCertificate.Algorithms", bucket,
+      GenerateCertificateAlgorithms::kMaxValue);
+}
+
 }  // namespace
 
 RTCPeerConnection::EventWrapper::EventWrapper(Event* event,
@@ -1360,6 +1404,7 @@
           crypto_algorithm.RsaHashedKeyGenParams()->ModulusLengthBits();
       // Parameters must fit in int to be passed to rtc::KeyParams::RSA. The
       // only recognized "hash" is "SHA-256".
+      // TODO(bugs.webrtc.org/364338811): deprecate 1024 bit keys.
       if (public_exponent &&
           base::IsValueInRangeForNumericType<int>(*public_exponent) &&
           base::IsValueInRangeForNumericType<int>(modulus_length) &&
@@ -1395,6 +1440,7 @@
       return EmptyPromise();
   }
   DCHECK(key_params.has_value());
+  MeasureGenerateCertificateKeyType(key_params);
 
   auto certificate_generator = std::make_unique<RTCCertificateGenerator>();
 
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_device.cc b/third_party/blink/renderer/modules/webgpu/gpu_device.cc
index 4df3d4e..7ef938de 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_device.cc
+++ b/third_party/blink/renderer/modules/webgpu/gpu_device.cc
@@ -565,9 +565,8 @@
 }
 
 GPUShaderModule* GPUDevice::createShaderModule(
-    const GPUShaderModuleDescriptor* descriptor,
-    ExceptionState& exception_state) {
-  return GPUShaderModule::Create(this, descriptor, exception_state);
+    const GPUShaderModuleDescriptor* descriptor) {
+  return GPUShaderModule::Create(this, descriptor);
 }
 
 GPURenderPipeline* GPUDevice::createRenderPipeline(
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_device.h b/third_party/blink/renderer/modules/webgpu/gpu_device.h
index 9ca1347f..4bb10327 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_device.h
+++ b/third_party/blink/renderer/modules/webgpu/gpu_device.h
@@ -120,8 +120,7 @@
       const GPUPipelineLayoutDescriptor* descriptor);
 
   GPUShaderModule* createShaderModule(
-      const GPUShaderModuleDescriptor* descriptor,
-      ExceptionState& exception_state);
+      const GPUShaderModuleDescriptor* descriptor);
   GPURenderPipeline* createRenderPipeline(
       ScriptState* script_state,
       const GPURenderPipelineDescriptor* descriptor);
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_device.idl b/third_party/blink/renderer/modules/webgpu/gpu_device.idl
index 9ff322ab..93bb0e2 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_device.idl
+++ b/third_party/blink/renderer/modules/webgpu/gpu_device.idl
@@ -26,7 +26,7 @@
     [RaisesException] GPUBindGroupLayout createBindGroupLayout(GPUBindGroupLayoutDescriptor descriptor);
     GPUPipelineLayout createPipelineLayout(GPUPipelineLayoutDescriptor descriptor);
 
-    [RaisesException] GPUShaderModule createShaderModule(GPUShaderModuleDescriptor descriptor);
+    GPUShaderModule createShaderModule(GPUShaderModuleDescriptor descriptor);
     [CallWith=ScriptState] GPURenderPipeline createRenderPipeline(GPURenderPipelineDescriptor descriptor);
     [RaisesException] GPUComputePipeline createComputePipeline(GPUComputePipelineDescriptor descriptor);
 
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_shader_module.cc b/third_party/blink/renderer/modules/webgpu/gpu_shader_module.cc
index 2ddbf9e..31e7880 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_shader_module.cc
+++ b/third_party/blink/renderer/modules/webgpu/gpu_shader_module.cc
@@ -9,19 +9,15 @@
 
 #include "third_party/blink/renderer/modules/webgpu/gpu_shader_module.h"
 
-#include "base/command_line.h"
 #include "base/numerics/clamped_math.h"
 #include "gpu/command_buffer/client/webgpu_interface.h"
-#include "gpu/config/gpu_switches.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_union_usvstring_uint32array.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_shader_module_descriptor.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/modules/webgpu/gpu_compilation_info.h"
 #include "third_party/blink/renderer/modules/webgpu/gpu_compilation_message.h"
 #include "third_party/blink/renderer/modules/webgpu/gpu_device.h"
 #include "third_party/blink/renderer/modules/webgpu/string_utils.h"
-#include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/graphics/gpu/webgpu_callback.h"
 #include "third_party/blink/renderer/platform/graphics/gpu/webgpu_cpp.h"
@@ -31,53 +27,17 @@
 // static
 GPUShaderModule* GPUShaderModule::Create(
     GPUDevice* device,
-    const GPUShaderModuleDescriptor* webgpu_desc,
-    ExceptionState& exception_state) {
+    const GPUShaderModuleDescriptor* webgpu_desc) {
   DCHECK(device);
   DCHECK(webgpu_desc);
 
-  std::string wgsl_code;
   wgpu::ShaderSourceWGSL wgsl_desc = {};
-  wgpu::ShaderSourceSPIRV spirv_desc = {};
+  const WTF::String& wtf_wgsl_code = webgpu_desc->code();
+  std::string wgsl_code = wtf_wgsl_code.Utf8();
+  wgsl_desc.code = wgsl_code.c_str();
+
   wgpu::ShaderModuleDescriptor dawn_desc = {};
-
-  const auto* wgsl_or_spirv = webgpu_desc->code();
-  bool has_null_character = false;
-  switch (wgsl_or_spirv->GetContentType()) {
-    case V8UnionUSVStringOrUint32Array::ContentType::kUSVString: {
-      const WTF::String& wtf_wgsl_code = wgsl_or_spirv->GetAsUSVString();
-      wgsl_code = wtf_wgsl_code.Utf8();
-      wgsl_desc.code = wgsl_code.c_str();
-      dawn_desc.nextInChain = &wgsl_desc;
-      if (wtf_wgsl_code.find('\0') != WTF::kNotFound) {
-        has_null_character = true;
-      }
-
-      break;
-    }
-    case V8UnionUSVStringOrUint32Array::ContentType::kUint32Array: {
-      if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
-              switches::kEnableUnsafeWebGPU)) {
-        exception_state.ThrowTypeError(
-            "SPIR-V shader module creation is disallowed. This feature "
-            "requires --enable-unsafe-webgpu");
-        return nullptr;
-      }
-      NotShared<DOMUint32Array> code = wgsl_or_spirv->GetAsUint32Array();
-      uint32_t length_words = 0;
-      if (!base::CheckedNumeric<uint32_t>(code->length())
-               .AssignIfValid(&length_words)) {
-        exception_state.ThrowRangeError(
-            "The provided ArrayBuffer exceeds the maximum supported size "
-            "(4294967295)");
-        return nullptr;
-      }
-      spirv_desc.code = code->Data();
-      spirv_desc.codeSize = length_words;
-      dawn_desc.nextInChain = &spirv_desc;
-      break;
-    }
-  }
+  dawn_desc.nextInChain = &wgsl_desc;
 
   std::string label = webgpu_desc->label().Utf8();
   if (!label.empty()) {
@@ -85,6 +45,7 @@
   }
 
   wgpu::ShaderModule shader_module;
+  bool has_null_character = (wtf_wgsl_code.find('\0') != WTF::kNotFound);
   if (has_null_character) {
     shader_module = device->GetHandle().CreateErrorShaderModule(
         &dawn_desc, "The WGSL shader contains an illegal character '\\0'");
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_shader_module.h b/third_party/blink/renderer/modules/webgpu/gpu_shader_module.h
index ac56bed..f9d8b98 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_shader_module.h
+++ b/third_party/blink/renderer/modules/webgpu/gpu_shader_module.h
@@ -13,15 +13,13 @@
 namespace blink {
 class GPUCompilationInfo;
 class GPUShaderModuleDescriptor;
-class ExceptionState;
 
 class GPUShaderModule : public DawnObject<wgpu::ShaderModule> {
   DEFINE_WRAPPERTYPEINFO();
 
  public:
   static GPUShaderModule* Create(GPUDevice* device,
-                                 const GPUShaderModuleDescriptor* webgpu_desc,
-                                 ExceptionState& exception_state);
+                                 const GPUShaderModuleDescriptor* webgpu_desc);
   explicit GPUShaderModule(GPUDevice* device,
                            wgpu::ShaderModule shader_module,
                            const String& label);
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_shader_module_compilation_hint.idl b/third_party/blink/renderer/modules/webgpu/gpu_shader_module_compilation_hint.idl
index 00f6f2e..c8e80938 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_shader_module_compilation_hint.idl
+++ b/third_party/blink/renderer/modules/webgpu/gpu_shader_module_compilation_hint.idl
@@ -5,5 +5,6 @@
 // https://gpuweb.github.io/gpuweb/
 
 dictionary GPUShaderModuleCompilationHint {
+    required USVString entryPoint;
     (GPUPipelineLayout or GPUAutoLayoutMode) layout;
 };
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_shader_module_descriptor.idl b/third_party/blink/renderer/modules/webgpu/gpu_shader_module_descriptor.idl
index 492f1364..1501edd 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_shader_module_descriptor.idl
+++ b/third_party/blink/renderer/modules/webgpu/gpu_shader_module_descriptor.idl
@@ -5,6 +5,6 @@
 // https://gpuweb.github.io/gpuweb/
 
 dictionary GPUShaderModuleDescriptor : GPUObjectDescriptorBase {
-    required (USVString or Uint32Array) code;
-    record<USVString, GPUShaderModuleCompilationHint> hints;
+    required USVString code;
+    sequence<GPUShaderModuleCompilationHint> compilationHints = [];
 };
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 22ad712..3b259ca 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -3079,10 +3079,6 @@
       name: "PasswordReveal",
     },
     {
-      name: "PasswordStrongLabel",
-      status: "experimental",
-    },
-    {
       name: "PaymentApp",
       depends_on: ["PaymentRequest"],
       public: true,
diff --git a/third_party/blink/web_tests/FlagExpectations/force-renderer-accessibility b/third_party/blink/web_tests/FlagExpectations/force-renderer-accessibility
index 3aef248e..bf54bf9 100644
--- a/third_party/blink/web_tests/FlagExpectations/force-renderer-accessibility
+++ b/third_party/blink/web_tests/FlagExpectations/force-renderer-accessibility
@@ -53,6 +53,7 @@
 # Times out
 http/tests/inspector-protocol/runtime/serialization-options.js [ Skip ]
 external/wpt/html/select/options-length-too-large.html [ Skip ]
+crbug.com/353392059 fast/forms/select-popup/select-many-options-hang.html [ Skip ]
 
 # This test is skipped because it currently times out. This is due to the fact
 # that inline-block elements are now included in the accessibility tree and
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index ea08cd7..db6fc916 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -7861,9 +7861,6 @@
 crbug.com/352455679 [ Linux ] virtual/threaded/external/wpt/css/css-scroll-snap/snap-after-relayout/multiple-aligned-targets/prefer-focused-nested-containers.html [ Failure Pass Timeout ]
 crbug.com/41490706 [ Linux ] external/wpt/touch-events/multi-touch-interfaces.html [ Failure Pass ]
 
-# Flaky on Linux and Windows
-crbug.com/353392059 fast/forms/select-popup/select-many-options-hang.html [ Pass Timeout ]
-
 # Flaky on Linux
 crbug.com/352481804 [ Linux ] external/wpt/html/semantics/embedded-content/the-object-element/object-image-only-for-print.html [ Failure Pass ]
 
@@ -7976,6 +7973,8 @@
 crbug.com/361491550 [ Release Win11-arm64 ] virtual/threaded/external/wpt/css/css-backgrounds/parsing/background-clip-valid.html [ Failure ]
 crbug.com/361491550 [ Release Win11-arm64 ] virtual/threaded/external/wpt/css/css-backgrounds/parsing/background-computed.html [ Failure ]
 
+crbug.com/352651673 http/tests/devtools/copy-network-request.js [ Failure Pass ]
+
 # Gardener 2024-08-23
 crbug.com/361671577 [ Linux ] fast/forms/validationMessage.html [ Failure Pass ]
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-style-sign-function.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-style-sign-function.html
new file mode 100644
index 0000000..977991e3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-style-sign-function.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Fonts test: font-style with CSS sign() function</title>
+<link rel="help" href="https://drafts.csswg.org/css-fonts/#font-style-prop">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<style>
+:root {
+  font-size: 16px;
+}
+</style>
+<div id="target"></div>
+<script>
+  test_computed_value("font-style", "oblique calc(sign(1rem - 1px) * 10deg)", "oblique 10deg");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/sign-function-aspect-ratio.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/sign-function-aspect-ratio.html
new file mode 100644
index 0000000..e5ba1a8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/sign-function-aspect-ratio.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Sizing test: aspect-ratio with CSS sign() function</title>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<style>
+:root {
+  font-size: 16px;
+}
+</style>
+<div id="target"></div>
+<script>
+  test_computed_value("aspect-ratio", "sign(1rem - 1px) / sign(1rem - 1px)", "1 / 1");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/tools/gentestutilsunion.py b/third_party/blink/web_tests/external/wpt/html/canvas/tools/gentestutilsunion.py
index 84315af..183a6f6 100644
--- a/third_party/blink/web_tests/external/wpt/html/canvas/tools/gentestutilsunion.py
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/tools/gentestutilsunion.py
@@ -715,9 +715,16 @@
             _render(jinja_env, f'testharness_worker{grid}.js', self.params,
                     f'{output_files.offscreen}.worker.js')
 
+    def _generate_cairo_images(self, output_dirs: _OutputPaths) -> None:
+        """Generates the pycairo images found in the YAML test definition."""
+        for variant in self.variants:
+            variant.generate_expected_image(output_dirs)
+
     def generate_test(self, jinja_env: jinja2.Environment,
                       output_dirs: _OutputPaths) -> None:
         """Generate the test files to the specified output dirs."""
+        self._generate_cairo_images(output_dirs)
+
         output_files = output_dirs.sub_path(self.file_name)
 
         if self.template_type in (_TemplateType.REFERENCE,
@@ -854,9 +861,6 @@
             if test['name'] != grid.file_name:
                 print(f'  {grid.file_name}')
 
-            sub_dir = _get_test_sub_dir(grid.file_name, name_to_sub_dir)
-            output_sub_dirs = output_dirs.sub_path(sub_dir)
-
             _check_uniqueness(used_filenames, grid.file_name,
                               grid.canvas_types)
             for variant in grid.variants:
@@ -866,8 +870,7 @@
                              variant.params['grid_variant_names']),
                     grid.canvas_types)
 
-            for variant in grid.variants:
-                variant.generate_expected_image(output_sub_dirs)
-            grid.generate_test(jinja_env, output_sub_dirs)
+            sub_dir = _get_test_sub_dir(grid.file_name, name_to_sub_dir)
+            grid.generate_test(jinja_env, output_dirs.sub_path(sub_dir))
 
     print()
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-hint-crash.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-hint-crash.tentative.html
new file mode 100644
index 0000000..3de26995
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-hint-crash.tentative.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+
+<div popover id=p>Popover</div>
+<div popover=hint id=h>Hint</div>
+<script>
+  p.showPopover();
+  h.showPopover();
+  h.addEventListener('beforetoggle',() => {
+    p.hidePopover();
+  });
+  p.hidePopover();
+  // This test passes if it does not crash.
+</script>
diff --git a/third_party/blink/web_tests/fast/forms/select-popup/select-many-options-hang.html b/third_party/blink/web_tests/fast/forms/select-popup/select-many-options-hang.html
index 89aec22..04f0d48 100644
--- a/third_party/blink/web_tests/fast/forms/select-popup/select-many-options-hang.html
+++ b/third_party/blink/web_tests/fast/forms/select-popup/select-many-options-hang.html
@@ -7,7 +7,7 @@
 <body>
 <script>
 const select = document.createElement('select');
-for (let i = 0; i < 10000; i++) {
+for (let i = 0; i < 6000; i++) {
   const option = document.createElement('option');
   option.textContent = i;
   select.appendChild(option);
@@ -22,5 +22,5 @@
   eventSender.keyDown('ArrowDown');
   eventSender.keyDown('Enter');
   assert_equals(select.value, '1', 'select.value after ArrowDown.');
-}, 'Selects with 10000+ options should be usable.');
+}, 'Selects with thousands of options should be usable.');
 </script>
diff --git a/third_party/blink/web_tests/fast/forms/suggested-value-password-reveal-expected.txt b/third_party/blink/web_tests/fast/forms/suggested-value-password-reveal-expected.txt
index 8845fb24..426fb2f 100644
--- a/third_party/blink/web_tests/fast/forms/suggested-value-password-reveal-expected.txt
+++ b/third_party/blink/web_tests/fast/forms/suggested-value-password-reveal-expected.txt
@@ -13,20 +13,7 @@
 |       shadow:pseudoId="-internal-input-suggested"
 |       "suggested value"
 |     <div>
-|       id="text-field-container"
-|       pseudo="-webkit-textfield-decoration-container"
-|       style="unicode-bidi: normal;"
-|       shadow:pseudoId="-webkit-textfield-decoration-container"
-|       <div>
-|         id="editing-view-port"
-|         <div>
-|           "initial value"
-|       <div>
-|         id="password-strong-label"
-|         pseudo="-internal-strong"
-|         style="display: none;"
-|         shadow:pseudoId="-internal-strong"
-|         "Strong password"
+|       "initial value"
 | <input>
 |   id="password2"
 |   type="password"
@@ -41,20 +28,7 @@
 |       shadow:pseudoId="-internal-input-suggested"
 |       "suggested value"
 |     <div>
-|       id="text-field-container"
-|       pseudo="-webkit-textfield-decoration-container"
-|       style="unicode-bidi: normal;"
-|       shadow:pseudoId="-webkit-textfield-decoration-container"
-|       <div>
-|         id="editing-view-port"
-|         <div>
-|           "initial value"
-|       <div>
-|         id="password-strong-label"
-|         pseudo="-internal-strong"
-|         style="display: none;"
-|         shadow:pseudoId="-internal-strong"
-|         "Strong password"
+|       "initial value"
 | "password_with_masked_suggestion.value: initial value"
 | "internals.suggestedValue(password_with_masked_suggestion): suggested value"
 | "password_with_revealed_suggestion.value: initial value"
diff --git a/third_party/blink/web_tests/fast/parser/inselect-tokenization.html b/third_party/blink/web_tests/fast/parser/inselect-tokenization.html
index 997cfbd..bb7a492 100644
--- a/third_party/blink/web_tests/fast/parser/inselect-tokenization.html
+++ b/third_party/blink/web_tests/fast/parser/inselect-tokenization.html
@@ -3,6 +3,10 @@
 <script src="../../resources/testharnessreport.js"></script>
 <body>
 <script>
+  if (testRunner) {
+    testRunner.setDumpConsoleMessages(false);
+  }
+
   /************************************************************************
    *   Helper functions!
    */
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/webdriver/tests/bidi/browsing_context/navigate/error-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/webdriver/tests/bidi/browsing_context/navigate/error-expected.txt
deleted file mode 100644
index b5ffae80..0000000
--- a/third_party/blink/web_tests/platform/linux/external/wpt/webdriver/tests/bidi/browsing_context/navigate/error-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a wdspec test.
-[FAIL] test_with_new_navigation_inside_page
-  Failed: DID NOT RAISE <class 'webdriver.bidi.error.UnknownErrorException'>
-Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/webdriver/tests/bidi/input/perform_actions/pointer_pen-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/webdriver/tests/bidi/input/perform_actions/pointer_pen-expected.txt
deleted file mode 100644
index 09bbc231..0000000
--- a/third_party/blink/web_tests/platform/linux/external/wpt/webdriver/tests/bidi/input/perform_actions/pointer_pen-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a wdspec test.
-[FAIL] test_pen_pointer_properties
-  assert 0 == 0.5
-Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/virtual/stylable-select-disabled/fast/parser/inselect-tokenization-expected.txt b/third_party/blink/web_tests/virtual/stylable-select-disabled/fast/parser/inselect-tokenization-expected.txt
index 172db7e..d2490db 100644
--- a/third_party/blink/web_tests/virtual/stylable-select-disabled/fast/parser/inselect-tokenization-expected.txt
+++ b/third_party/blink/web_tests/virtual/stylable-select-disabled/fast/parser/inselect-tokenization-expected.txt
@@ -1,63 +1,3 @@
-CONSOLE WARNING: A iframe tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A element tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A iframe tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A element tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A iframe tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A element tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A noembed tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A element tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A noembed tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A element tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A noembed tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A element tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A input tag was parsed inside of a <select> which caused a </select> to be inserted before this tag. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A keygen tag was parsed inside of a <select> which caused a </select> to be inserted before this tag. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A textarea tag was parsed inside of a <select> which caused a </select> to be inserted before this tag. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A noframes tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A element tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A noframes tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A element tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A noframes tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A element tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A input tag was parsed inside of a <select> which caused a </select> to be inserted before this tag. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A keygen tag was parsed inside of a <select> which caused a </select> to be inserted before this tag. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A textarea tag was parsed inside of a <select> which caused a </select> to be inserted before this tag. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A noscript tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A element tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A noscript tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A element tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A noscript tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A element tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A input tag was parsed inside of a <select> which caused a </select> to be inserted before this tag. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A keygen tag was parsed inside of a <select> which caused a </select> to be inserted before this tag. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A textarea tag was parsed inside of a <select> which caused a </select> to be inserted before this tag. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A plaintext tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A element tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A plaintext tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A element tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A plaintext tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A element tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A input tag was parsed inside of a <select> which caused a </select> to be inserted before this tag. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A keygen tag was parsed inside of a <select> which caused a </select> to be inserted before this tag. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A textarea tag was parsed inside of a <select> which caused a </select> to be inserted before this tag. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A style tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A element tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A style tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A element tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A style tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A element tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A input tag was parsed inside of a <select> which caused a </select> to be inserted before this tag. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A keygen tag was parsed inside of a <select> which caused a </select> to be inserted before this tag. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A textarea tag was parsed inside of a <select> which caused a </select> to be inserted before this tag. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A xmp tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A element tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A xmp tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A element tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A xmp tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A element tag was parsed inside of a <select> which was not inserted into the document. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A input tag was parsed inside of a <select> which caused a </select> to be inserted before this tag. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A keygen tag was parsed inside of a <select> which caused a </select> to be inserted before this tag. This is not valid HTML and the behavior may be changed in future versions of chrome.
-CONSOLE WARNING: A textarea tag was parsed inside of a <select> which caused a </select> to be inserted before this tag. This is not valid HTML and the behavior may be changed in future versions of chrome.
 This is a testharness.js-based test.
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/wpt_internal/html/semantics/forms/the-select-element/stylable-select/select-appearance-optgroup-rendering-ref.html b/third_party/blink/web_tests/wpt_internal/html/semantics/forms/the-select-element/stylable-select/select-appearance-optgroup-rendering-ref.html
new file mode 100644
index 0000000..f9c2077
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/html/semantics/forms/the-select-element/stylable-select/select-appearance-optgroup-rendering-ref.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<link rel=stylesheet href="resources/stylable-select-styles.css">
+
+<style>
+.border {
+  border: 2px solid green;
+}
+.optgroup {
+  padding-inline: 2px;
+}
+.optgroup-label {
+  padding: 0 2px 1px;
+  min-height: 1.2em;
+  font-weight: bolder;
+}
+.optgroup .stylable-select-option {
+  padding-inline-start: 20px;
+}
+</style>
+
+<div id=container class=stylable-select-container>
+  <button class="stylable-select-button open" popovertarget=popover id=button>
+    <span class=stylable-select-selectedoption>one</span>
+    <div class=stylable-select-button-icon></div>
+  </button>
+  <div id=popover popover=auto anchor=container class=stylable-select-datalist>
+    <div class="stylable-select-option selected">one</div>
+    <div class=optgroup>
+      <div class=optgroup-label>labelattribute</div>
+      <div class=stylable-select-option>two</div>
+      <div class=border>
+        <div class=stylable-select-option>three</div>
+      </div>
+    </div>
+    <div class=stylable-select-option>four</div>
+  </div>
+</div>
+
+<script>
+document.getElementById('popover').showPopover();
+</script>
+
diff --git a/third_party/blink/web_tests/wpt_internal/html/semantics/forms/the-select-element/stylable-select/select-appearance-optgroup-rendering.tentative.html b/third_party/blink/web_tests/wpt_internal/html/semantics/forms/the-select-element/stylable-select/select-appearance-optgroup-rendering.tentative.html
new file mode 100644
index 0000000..a05bfeda
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/html/semantics/forms/the-select-element/stylable-select/select-appearance-optgroup-rendering.tentative.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://github.com/whatwg/html/issues/9799">
+<link rel=match href="select-appearance-optgroup-rendering-ref.html">
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+
+<style>
+select, select::picker(select) {
+  appearance: base-select;
+}
+div {
+  border: 2px solid green;
+}
+</style>
+
+<select>
+  <option>one</option>
+  <optgroup label=labelattribute>
+    <option>two</option>
+    <div>
+      <option>three</option>
+    </div>
+  </optgroup>
+  <option>four</option>
+</select>
+
+<script>
+(async () => {
+  await test_driver.bless();
+  document.querySelector('select').showPicker();
+  document.documentElement.classList.remove('reftest-wait');
+})();
+</script>
diff --git a/third_party/crossbench b/third_party/crossbench
index 2dd4d69..4759a97 160000
--- a/third_party/crossbench
+++ b/third_party/crossbench
@@ -1 +1 @@
-Subproject commit 2dd4d6981c433ab7492612bdd9ce1ca7e8020692
+Subproject commit 4759a97e9e355f2272bbc0a23c0e898605cfee71
diff --git a/third_party/dawn b/third_party/dawn
index fc3f2e6..bda245a 160000
--- a/third_party/dawn
+++ b/third_party/dawn
@@ -1 +1 @@
-Subproject commit fc3f2e6f80bc245a8777d5b7dd6ff7f99761283d
+Subproject commit bda245ad94fff1d511f0e3425501e1f5e811918a
diff --git a/third_party/devtools-frontend-internal b/third_party/devtools-frontend-internal
index a09d12b..4b9aa18 160000
--- a/third_party/devtools-frontend-internal
+++ b/third_party/devtools-frontend-internal
@@ -1 +1 @@
-Subproject commit a09d12b0b37bd89cb583a7b9ae09f74a0a234669
+Subproject commit 4b9aa182a530cecd10387e6feb4e0e00c66b9b12
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index 3f7ce19..d48cc94 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit 3f7ce199f9933cd833d540816cbbd2d18f7ee82e
+Subproject commit d48cc94a9390f071930395fa2821dfbab8346c92
diff --git a/third_party/dom_distiller_js/BUILD.gn b/third_party/dom_distiller_js/BUILD.gn
index 81b46bc..3239d5b8 100644
--- a/third_party/dom_distiller_js/BUILD.gn
+++ b/third_party/dom_distiller_js/BUILD.gn
@@ -10,6 +10,62 @@
 }
 
 protoc_plugin_files = [
+  "//third_party/protobuf/python/google/protobuf/__init__.py",
+  "//third_party/protobuf/python/google/protobuf/compiler/__init__.py",
+  "//third_party/protobuf/python/google/protobuf/compiler/plugin_pb2.py",
+  "//third_party/protobuf/python/google/protobuf/descriptor_database.py",
+  "//third_party/protobuf/python/google/protobuf/descriptor_pb2.py",
+  "//third_party/protobuf/python/google/protobuf/descriptor_pool.py",
+  "//third_party/protobuf/python/google/protobuf/descriptor.py",
+  "//third_party/protobuf/python/google/protobuf/internal/__init__.py",
+  "//third_party/protobuf/python/google/protobuf/internal/_parameterized.py",
+  "//third_party/protobuf/python/google/protobuf/internal/api_implementation.py",
+  "//third_party/protobuf/python/google/protobuf/internal/builder.py",
+  "//third_party/protobuf/python/google/protobuf/internal/containers.py",
+  "//third_party/protobuf/python/google/protobuf/internal/decoder.py",
+  "//third_party/protobuf/python/google/protobuf/internal/descriptor_database_test.py",
+  "//third_party/protobuf/python/google/protobuf/internal/descriptor_pool_test.py",
+  "//third_party/protobuf/python/google/protobuf/internal/descriptor_test.py",
+  "//third_party/protobuf/python/google/protobuf/internal/encoder.py",
+  "//third_party/protobuf/python/google/protobuf/internal/enum_type_wrapper.py",
+  "//third_party/protobuf/python/google/protobuf/internal/extension_dict.py",
+  "//third_party/protobuf/python/google/protobuf/internal/generator_test.py",
+  "//third_party/protobuf/python/google/protobuf/internal/import_test_package/__init__.py",
+  "//third_party/protobuf/python/google/protobuf/internal/import_test.py",
+  "//third_party/protobuf/python/google/protobuf/internal/json_format_test.py",
+  "//third_party/protobuf/python/google/protobuf/internal/keywords_test.py",
+  "//third_party/protobuf/python/google/protobuf/internal/message_factory_test.py",
+  "//third_party/protobuf/python/google/protobuf/internal/message_listener.py",
+  "//third_party/protobuf/python/google/protobuf/internal/message_test.py",
+  "//third_party/protobuf/python/google/protobuf/internal/proto_builder_test.py",
+  "//third_party/protobuf/python/google/protobuf/internal/python_message.py",
+  "//third_party/protobuf/python/google/protobuf/internal/reflection_test.py",
+  "//third_party/protobuf/python/google/protobuf/internal/service_reflection_test.py",
+  "//third_party/protobuf/python/google/protobuf/internal/symbol_database_test.py",
+  "//third_party/protobuf/python/google/protobuf/internal/test_util.py",
+  "//third_party/protobuf/python/google/protobuf/internal/testing_refleaks.py",
+  "//third_party/protobuf/python/google/protobuf/internal/text_encoding_test.py",
+  "//third_party/protobuf/python/google/protobuf/internal/text_format_test.py",
+  "//third_party/protobuf/python/google/protobuf/internal/type_checkers.py",
+  "//third_party/protobuf/python/google/protobuf/internal/unknown_fields_test.py",
+  "//third_party/protobuf/python/google/protobuf/internal/well_known_types_test.py",
+  "//third_party/protobuf/python/google/protobuf/internal/well_known_types.py",
+  "//third_party/protobuf/python/google/protobuf/internal/wire_format_test.py",
+  "//third_party/protobuf/python/google/protobuf/internal/wire_format.py",
+  "//third_party/protobuf/python/google/protobuf/json_format.py",
+  "//third_party/protobuf/python/google/protobuf/message_factory.py",
+  "//third_party/protobuf/python/google/protobuf/message.py",
+  "//third_party/protobuf/python/google/protobuf/proto_builder.py",
+  "//third_party/protobuf/python/google/protobuf/pyext/__init__.py",
+  "//third_party/protobuf/python/google/protobuf/pyext/cpp_message.py",
+  "//third_party/protobuf/python/google/protobuf/reflection.py",
+  "//third_party/protobuf/python/google/protobuf/service_reflection.py",
+  "//third_party/protobuf/python/google/protobuf/service.py",
+  "//third_party/protobuf/python/google/protobuf/symbol_database.py",
+  "//third_party/protobuf/python/google/protobuf/text_encoding.py",
+  "//third_party/protobuf/python/google/protobuf/text_format.py",
+  "//third_party/protobuf/python/google/protobuf/unknown_fields.py",
+  "//third_party/protobuf/python/google/protobuf/util/__init__.py",
   "protoc_plugins/json_values_converter.bat",
   "protoc_plugins/json_values_converter.py",
   "protoc_plugins/util/__init__.py",
diff --git a/third_party/jni_zero/codegen/proxy_impl_java.py b/third_party/jni_zero/codegen/proxy_impl_java.py
index 26bf783b..bead1a3 100644
--- a/third_party/jni_zero/codegen/proxy_impl_java.py
+++ b/third_party/jni_zero/codegen/proxy_impl_java.py
@@ -84,7 +84,7 @@
 
 public static final JniStaticTestMocker<{ctx.interface_name}> TEST_HOOKS =
     new JniStaticTestMocker<{ctx.interface_name}>()""")
-  with sb.block(end='};\n'):
+  with sb.block(after=';'):
     sb(f"""\
 @Override
 public void setInstanceForTesting({ctx.interface_name} instance)""")
diff --git a/third_party/jni_zero/codegen/register_natives.py b/third_party/jni_zero/codegen/register_natives.py
new file mode 100644
index 0000000..02c93973
--- /dev/null
+++ b/third_party/jni_zero/codegen/register_natives.py
@@ -0,0 +1,37 @@
+# Copyright 2024 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""Codegen for RegisterNatives() methods."""
+
+import common
+
+
+def gen_jni_register_natives_helper(sb, name, gen_jni_class, kmethod_entries):
+  escaped_gen_jni = common.escape_class_name(
+      gen_jni_class.full_name_with_slashes)
+  sb(f"""
+static const JNINativeMethod kMethods_{escaped_gen_jni}[] = {{
+{kmethod_entries}
+}};
+
+namespace {{
+
+bool {name}(JNIEnv* env) {{
+  const int number_of_methods = std::size(kMethods_{escaped_gen_jni});
+
+  jni_zero::ScopedJavaLocalRef<jclass> native_clazz =
+      jni_zero::GetClass(env, "{gen_jni_class.full_name_with_slashes}");
+  if (env->RegisterNatives(
+      native_clazz.obj(),
+      kMethods_{escaped_gen_jni},
+      number_of_methods) < 0) {{
+
+    jni_zero::internal::HandleRegistrationError(env, native_clazz.obj(), __FILE__);
+    return false;
+  }}
+
+  return true;
+}}
+
+}}  // namespace
+""")
diff --git a/third_party/jni_zero/common.py b/third_party/jni_zero/common.py
index 90ae0277..564afac 100644
--- a/third_party/jni_zero/common.py
+++ b/third_party/jni_zero/common.py
@@ -62,17 +62,33 @@
           self(',\n'.join(values))
     self(')')
 
+  def line(self, value=None):
+    self(value)
+    self('\n')
+
   @contextlib.contextmanager
   def statement(self):
     yield
     self(';\n')
 
   @contextlib.contextmanager
-  def block(self, start=' {\n', end='}\n'):
-    self(start)
+  def namespace(self, namespace_name):
+    value = f' {namespace_name}' if namespace_name else ''
+    self(f'namespace{value} {{\n\n')
+    yield
+    self(f'\n}}  // namespace{value}\n')
+
+  @contextlib.contextmanager
+  def block(self, after=None):
+    self(' {\n')
     with self.indent(2):
       yield
-    self(end)
+    if after:
+      self('}')
+      self(after)
+      self('\n')
+    else:
+      self('}\n')
 
   @contextlib.contextmanager
   def indent(self, amount):
diff --git a/third_party/jni_zero/jni_registration_generator.py b/third_party/jni_zero/jni_registration_generator.py
index 3b1e74b1..f27e418 100644
--- a/third_party/jni_zero/jni_registration_generator.py
+++ b/third_party/jni_zero/jni_registration_generator.py
@@ -19,6 +19,7 @@
 
 from codegen import header_common
 from codegen import natives_header
+from codegen import register_natives
 import common
 import java_types
 import jni_generator
@@ -26,12 +27,11 @@
 import proxy
 
 
+_THIS_DIR = os.path.dirname(__file__)
+
 _SWITCH_NUM_TO_BE_INERSERTED_LATER_TOKEN = "<INSERT HERE>"
 
-# All but FULL_CLASS_NAME, which is used only for sorting.
 MERGEABLE_KEYS = [
-    'CLASS_ACCESSORS',
-    'FORWARD_DECLARATIONS',
     'JNI_NATIVE_METHOD',
     'JNI_NATIVE_METHOD_ARRAY',
     'PROXY_NATIVE_SIGNATURES',
@@ -111,24 +111,24 @@
                                   options)
   _FilterJniObjs(jni_objs_by_path, options)
 
-  dicts = []
-  for jni_obj in _Flatten(jni_objs_by_path,
-                          native_sources_set & java_sources_set):
-    dicts.append(DictionaryGenerator(jni_obj, options).Generate())
+  jni_objs = list(
+      _Flatten(jni_objs_by_path, native_sources_set & java_sources_set))
 
-  priority_java_sources = set(
-      priority_java_sources) if priority_java_sources else {}
-  # Sort to make output deterministic, and to put priority_java_sources at the
-  # top.
-  dicts.sort(key=lambda d: (d['FILE_PATH'] not in priority_java_sources, d[
-      'FULL_CLASS_NAME']))
+  priority_set = set(priority_java_sources) if priority_java_sources else set()
+  # Sort for determinism and to put priority_java_sources first.
+  jni_objs.sort(key=lambda o: (o.filename not in priority_set, o.java_class))
 
   whole_hash = None
   priority_hash = None
   if options.enable_jni_multiplexing:
-    whole_hash, priority_hash = _GenerateHashes(dicts, priority_java_sources)
+    whole_hash, priority_hash = _GenerateHashes(jni_objs, len(priority_set))
+
   stubs = _GenerateStubsAndAssert(options, jni_objs_by_path, native_sources_set,
                                   java_sources_set)
+  dicts = []
+  for jni_obj in jni_objs:
+    dicts.append(DictionaryGenerator(jni_obj, options).Generate())
+
   combined_dict = {}
   for key in MERGEABLE_KEYS:
     combined_dict[key] = ''.join(d.get(key, '') for d in dicts)
@@ -172,9 +172,8 @@
         signature_to_cpp_calls, short_gen_jni_class)
 
   if options.header_path:
-    combined_dict['NAMESPACE'] = options.namespace or ''
-    header_content = CreateHeaderFromDict(gen_jni_class, options, combined_dict,
-                                          whole_hash, priority_hash)
+    header_content = _CreateHeader(jni_objs, gen_jni_class, options,
+                                   combined_dict, whole_hash, priority_hash)
     with common.atomic_output(options.header_path, mode='w') as f:
       f.write(header_content)
 
@@ -250,22 +249,24 @@
   return [_GenerateStubs(o.proxy_natives) for o in java_only_jni_objs]
 
 
-def _GenerateHashes(dicts, priority_java_sources):
+def _GenerateHashes(jni_objs, num_priority_objs):
   # We assume that if we have identical files and they are in the same order, we
   # will have switch number alignment. We do this, instead of directly
   # inspecting the switch numbers, because differentiating the priority sources
   # is a big pain.
   whole_hash = hashlib.md5()
-  if priority_java_sources:
+  if num_priority_objs:
     priority_hash = hashlib.md5()
   else:
     priority_hash = whole_hash
-  for d in dicts:
-    path = os.path.relpath(d['FILE_PATH'], start=os.path.dirname(__file__))
+
+  for i, jni_obj in enumerate(jni_objs):
+    path = os.path.relpath(jni_obj.filename, start=_THIS_DIR)
     encoded = path.encode('utf-8')
     whole_hash.update(encoded)
-    if path in priority_java_sources:
+    if i < num_priority_objs:
       priority_hash.update(encoded)
+
   uint64_t_max = (1 << 64) - 1
   int64_t_min = -(1 << 63)
   whole_hash_uint = int(whole_hash.hexdigest(), 16) % uint64_t_max
@@ -374,92 +375,6 @@
   return ''.join(s for s in forwarding_function_definitons)
 
 
-def _SetProxyRegistrationFields(options, gen_jni_class, registration_dict):
-  registration_template = string.Template("""\
-
-static const JNINativeMethod kMethods_${ESCAPED_PROXY_CLASS}[] = {
-${KMETHODS}
-};
-
-namespace {
-
-JNI_ZERO_COMPONENT_BUILD_EXPORT bool ${REGISTRATION_NAME}(JNIEnv* env) {
-  const int number_of_methods = std::size(kMethods_${ESCAPED_PROXY_CLASS});
-
-  jni_zero::ScopedJavaLocalRef<jclass> native_clazz =
-      jni_zero::GetClass(env, "${PROXY_CLASS}");
-  if (env->RegisterNatives(
-      native_clazz.obj(),
-      kMethods_${ESCAPED_PROXY_CLASS},
-      number_of_methods) < 0) {
-
-    jni_zero::internal::HandleRegistrationError(env, native_clazz.obj(), __FILE__);
-    return false;
-  }
-
-  return true;
-}
-
-}  // namespace
-""")
-
-  registration_call = string.Template("""\
-
-  // Register natives in a proxy.
-  if (!${REGISTRATION_NAME}(env)) {
-    return false;
-  }
-""")
-
-  manual_registration = string.Template("""\
-// Method declarations.
-
-${JNI_NATIVE_METHOD_ARRAY}\
-${PROXY_NATIVE_METHOD_ARRAY}\
-
-${JNI_NATIVE_METHOD}
-// Registration function.
-
-namespace ${NAMESPACE} {
-
-bool RegisterNatives(JNIEnv* env) {\
-${REGISTER_PROXY_NATIVES}
-${REGISTER_NATIVES}
-  return true;
-}
-
-}  // namespace ${NAMESPACE}
-""")
-
-  short_name = options.use_proxy_hash or options.enable_jni_multiplexing
-  sub_dict = {
-      'ESCAPED_PROXY_CLASS':
-      common.escape_class_name(gen_jni_class.full_name_with_slashes),
-      'PROXY_CLASS':
-      gen_jni_class.full_name_with_slashes,
-      'KMETHODS':
-      registration_dict['PROXY_NATIVE_METHOD_ARRAY'],
-      'REGISTRATION_NAME':
-      _GetRegistrationFunctionName(gen_jni_class.full_name_with_slashes),
-  }
-
-  if registration_dict['PROXY_NATIVE_METHOD_ARRAY']:
-    proxy_native_array = registration_template.substitute(sub_dict)
-    proxy_natives_registration = registration_call.substitute(sub_dict)
-  else:
-    proxy_native_array = ''
-    proxy_natives_registration = ''
-
-  registration_dict['PROXY_NATIVE_METHOD_ARRAY'] = proxy_native_array
-  registration_dict['REGISTER_PROXY_NATIVES'] = proxy_natives_registration
-
-  if options.manual_jni_registration:
-    registration_dict['MANUAL_REGISTRATION'] = manual_registration.substitute(
-        registration_dict)
-  else:
-    registration_dict['MANUAL_REGISTRATION'] = ''
-
-
 def CreateProxyJavaFromDict(options,
                             gen_jni_class,
                             registration_dict,
@@ -516,8 +431,8 @@
   })
 
 
-def CreateHeaderFromDict(gen_jni_class, options, registration_dict, whole_hash,
-                         priority_hash):
+def _CreateHeader(jni_objs, gen_jni_class, options, registration_dict,
+                  whole_hash, priority_hash):
   """Returns the content of the header file."""
   header_guard = os.path.splitext(options.header_path)[0].upper() + '_'
   header_guard = re.sub(r'[/.-]', '_', header_guard)
@@ -528,34 +443,62 @@
       system_includes=['iterator'],  # For std::size().
       user_includes=['third_party/jni_zero/jni_zero_internal.h'],
       header_guard=header_guard)
-  registration_dict['PREAMBLE'] = preamble
-  registration_dict['EPILOGUE'] = epilogue
-  template = string.Template("""\
-${PREAMBLE}
-${POSSIBLE_MULTIPLEXING_HASHES}
-${CLASS_ACCESSORS}
-// Forward declarations (methods).
 
-${FORWARD_DECLARATIONS}
-${FORWARDING_CALLS}
-${MANUAL_REGISTRATION}
-${EPILOGUE}
-""")
-  _SetProxyRegistrationFields(options, gen_jni_class, registration_dict)
-  if not options.enable_jni_multiplexing:
-    registration_dict['FORWARDING_CALLS'] = ''
-    registration_dict['POSSIBLE_MULTIPLEXING_HASHES'] = ''
-  else:
-    module_name = ''
-    if options.module_name:
-      module_name = options.module_name
-    registration_dict['POSSIBLE_MULTIPLEXING_HASHES'] = f'''\
+  module_name = options.module_name or ''
+
+  sb = common.StringBuilder()
+  sb.line(preamble)
+  if options.enable_jni_multiplexing:
+    sb(f"""\
 extern const int64_t kJniZeroHash{module_name}Whole = {whole_hash}LL;
-extern const int64_t kJniZeroHash{module_name}Priority = {priority_hash}LL;'''
-  if len(registration_dict['FORWARD_DECLARATIONS']) == 0:
-    return ''
+extern const int64_t kJniZeroHash{module_name}Priority = {priority_hash}LL;
+""")
 
-  return template.substitute(registration_dict)
+  java_classes_with_natives = set()
+  for jni_obj in jni_objs:
+    java_classes_with_natives.update(n.java_class
+                                     for n in jni_obj.non_proxy_natives)
+  java_classes_with_natives = sorted(java_classes_with_natives)
+
+  sb(header_common.class_accessors(java_classes_with_natives, module_name))
+
+  sb('// Forward declarations (methods).\n\n')
+  for jni_obj in jni_objs:
+    for native in jni_obj.natives:
+      with sb.statement():
+        natives_header.proxy_declaration(sb, jni_obj, native)
+
+  if options.enable_jni_multiplexing:
+    sb.line(registration_dict['FORWARDING_CALLS'])
+
+  if options.manual_jni_registration:
+    has_gen_jni = bool(registration_dict['PROXY_NATIVE_METHOD_ARRAY'])
+    registration_function_name = _GetRegistrationFunctionName(
+        gen_jni_class.full_name_with_slashes)
+
+    sb('// Method declarations.\n\n')
+    sb(registration_dict['JNI_NATIVE_METHOD_ARRAY'])
+    if has_gen_jni:
+      register_natives.gen_jni_register_natives_helper(
+          sb, registration_function_name, gen_jni_class,
+          registration_dict['PROXY_NATIVE_METHOD_ARRAY'])
+    sb('\n')
+    sb(registration_dict['JNI_NATIVE_METHOD'])
+    sb('\n')
+    sb('// Registration function.\n\n')
+    with sb.namespace(options.namespace or ''):
+      sb('bool RegisterNatives(JNIEnv* env)')
+      with sb.block():
+        if has_gen_jni:
+          sb(f"""// Register natives in a proxy.
+if (!{registration_function_name}(env)) {{
+  return false;
+}}
+""")
+        sb.line(registration_dict['REGISTER_NATIVES'])
+        sb('return true;\n')
+  sb(epilogue)
+  return sb.to_string()
 
 
 def _GetMultiplexingParamsList(param_types, java_types=False):
@@ -593,15 +536,11 @@
   """Generates an inline header file for JNI registration."""
   def __init__(self, jni_obj, options):
     self.options = options
-    self.file_path = jni_obj.filename
     self.content_namespace = jni_obj.jni_namespace
-    self.natives = jni_obj.natives
     self.proxy_natives = jni_obj.proxy_natives
     self.non_proxy_natives = jni_obj.non_proxy_natives
     self.fully_qualified_class = jni_obj.java_class.full_name_with_slashes
-    self.type_resolver = jni_obj.type_resolver
-    self.class_name = jni_obj.java_class.name
-    self.registration_dict = None
+    self.registration_dict = {}
     self.jni_obj = jni_obj
     self.gen_jni_class = proxy.get_gen_jni_class(
         short=options.use_proxy_hash or options.enable_jni_multiplexing,
@@ -614,14 +553,6 @@
     java_classes_with_natives = sorted(
         set(n.java_class for n in self.jni_obj.non_proxy_natives))
 
-    self.registration_dict = {
-        'FULL_CLASS_NAME': self.fully_qualified_class,
-        'FILE_PATH': self.file_path,
-    }
-    self.registration_dict['CLASS_ACCESSORS'] = (header_common.class_accessors(
-        java_classes_with_natives, self.jni_obj.module_name))
-
-    self._AddForwardDeclaration()
     self._AddJNINativeMethodsArrays(java_classes_with_natives)
     self._AddProxyNativeMethodKStrings()
     self._AddRegisterNativesCalls()
@@ -644,14 +575,6 @@
   def _SetDictValue(self, key, value):
     self.registration_dict[key] = jni_generator.WrapOutput(value)
 
-  def _AddForwardDeclaration(self):
-    """Add the content of the forward declaration to the dictionary."""
-    sb = common.StringBuilder()
-    for native in self.natives:
-      with sb.statement():
-        natives_header.proxy_declaration(sb, self.jni_obj, native)
-    self._SetDictValue('FORWARD_DECLARATIONS', sb.to_string())
-
   def _AddRegisterNativesCalls(self):
     """Add the body of the RegisterNativesImpl method to the dictionary."""
 
@@ -659,16 +582,11 @@
     if len(self.non_proxy_natives) == 0:
       return ''
 
-    template = string.Template("""\
-  if (!${REGISTER_NAME}(env))
-    return false;
+    register_name = _GetRegistrationFunctionName(self.fully_qualified_class)
+    self._SetDictValue('REGISTER_NATIVES', f"""\
+if (!{register_name}(env))
+  return false;
 """)
-    value = {
-        'REGISTER_NAME':
-        _GetRegistrationFunctionName(self.fully_qualified_class)
-    }
-    register_body = template.substitute(value)
-    self._SetDictValue('REGISTER_NATIVES', register_body)
 
   def _AddJNINativeMethodsArrays(self, java_classes_with_natives):
     """Returns the implementation of the array of native methods."""
@@ -694,7 +612,7 @@
           (open_namespace, body, close_namespace)))
 
   def _GetKMethodsString(self, clazz):
-    if clazz != self.class_name:
+    if clazz != self.jni_obj.java_class.name:
       return ''
     ret = [self._GetKMethodArrayEntry(n) for n in self.non_proxy_natives]
     return '\n'.join(ret)
@@ -767,21 +685,17 @@
   def _AddRegisterNativesFunctions(self, java_classes_with_natives):
     """Returns the code for RegisterNatives."""
     if not java_classes_with_natives:
-      return ''
+      return
     natives = self._GetRegisterNativesImplString(java_classes_with_natives)
-    template = string.Template("""\
-JNI_ZERO_COMPONENT_BUILD_EXPORT bool ${REGISTER_NAME}(JNIEnv* env) {
-${NATIVES}\
+    register_name = _GetRegistrationFunctionName(self.fully_qualified_class)
+    self._SetDictValue(
+        'JNI_NATIVE_METHOD', f"""\
+JNI_ZERO_COMPONENT_BUILD_EXPORT bool {register_name}(JNIEnv* env) {{
+{natives}\
   return true;
-}
+}}
 
 """)
-    values = {
-        'REGISTER_NAME':
-        _GetRegistrationFunctionName(self.fully_qualified_class),
-        'NATIVES': natives
-    }
-    self._SetDictValue('JNI_NATIVE_METHOD', template.substitute(values))
 
   def _GetRegisterNativesImplString(self, java_classes_with_natives):
     """Returns the shared implementation for RegisterNatives."""
diff --git a/third_party/jni_zero/jni_zero.gni b/third_party/jni_zero/jni_zero.gni
index b787bdc..56729fdee 100644
--- a/third_party/jni_zero/jni_zero.gni
+++ b/third_party/jni_zero/jni_zero.gni
@@ -76,6 +76,7 @@
                             "codegen/placeholder_gen_jni_java.py",
                             "codegen/placeholder_java_type.py",
                             "codegen/proxy_impl_java.py",
+                            "codegen/register_natives.py",
                             "common.py",
                             "java_lang_classes.py",
                             "java_types.py",
diff --git a/third_party/jni_zero/test/golden/testEndToEndManualRegistration-Registration.h.golden b/third_party/jni_zero/test/golden/testEndToEndManualRegistration-Registration.h.golden
index d8b23627..c63bd9b 100644
--- a/third_party/jni_zero/test/golden/testEndToEndManualRegistration-Registration.h.golden
+++ b/third_party/jni_zero/test/golden/testEndToEndManualRegistration-Registration.h.golden
@@ -10,97 +10,74 @@
 
 #include "third_party/jni_zero/jni_zero_internal.h"
 
-
-
 // Forward declarations (methods).
 
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1bar(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1bar(
     JNIEnv* env,
     jclass jcaller,
     jobject sample);
-JNI_POSSIBLE_BOUNDARY_EXPORT void
-    Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1foo(
+JNI_POSSIBLE_BOUNDARY_EXPORT void Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1foo(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jboolean
-    Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1hasPhalange(
+JNI_POSSIBLE_BOUNDARY_EXPORT jboolean Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1hasPhalange(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnClass(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnClass(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnClasses(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnClasses(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedAppObjects(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedAppObjects(
     JNIEnv* env,
     jclass jcaller,
     jclass __arrayClazz);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedInts(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedInts(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedString(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedString(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedStrings(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedStrings(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnObject(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnObject(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnObjects(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnObjects(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnString(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnString(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnStrings(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnStrings(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnStruct(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnStruct(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnStructs(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnStructs(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnThrowable(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnThrowable(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnThrowables(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1returnThrowables(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1revString(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1revString(
     JNIEnv* env,
     jclass jcaller,
     jobject stringToReverse);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1sendSamplesToNative(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1sendSamplesToNative(
     JNIEnv* env,
     jclass jcaller,
     jobject strs);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1sendToNative(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1sendToNative(
     JNIEnv* env,
     jclass jcaller,
     jobject strs);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1testAllPrimitives(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1testAllPrimitives(
     JNIEnv* env,
     jclass jcaller,
     jint zint,
@@ -119,8 +96,7 @@
     jobject floats,
     jboolean zbool,
     jobject bools);
-JNI_POSSIBLE_BOUNDARY_EXPORT void
-    Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1testSpecialTypes(
+JNI_POSSIBLE_BOUNDARY_EXPORT void Java_org_jni_1zero_GEN_1JNI_org_1jni_11zero_1SampleForAnnotationProcessor_1testSpecialTypes(
     JNIEnv* env,
     jclass jcaller,
     jobject clazz,
@@ -141,8 +117,6 @@
     jobject view,
     jobject context,
     jobject convertedObjects);
-
-
 // Method declarations.
 
 
@@ -224,7 +198,7 @@
 
 namespace {
 
-JNI_ZERO_COMPONENT_BUILD_EXPORT bool RegisterNative_org_jni_1zero_GEN_1JNI(JNIEnv* env) {
+bool RegisterNative_org_jni_1zero_GEN_1JNI(JNIEnv* env) {
   const int number_of_methods = std::size(kMethods_org_jni_1zero_GEN_1JNI);
 
   jni_zero::ScopedJavaLocalRef<jclass> native_clazz =
@@ -246,7 +220,7 @@
 
 // Registration function.
 
-namespace  {
+namespace {
 
 bool RegisterNatives(JNIEnv* env) {
   // Register natives in a proxy.
@@ -254,12 +228,9 @@
     return false;
   }
 
-
   return true;
 }
 
-}  // namespace 
-
+}  // namespace
 
 #endif  // TEMP_DIR_HEADER_
-
diff --git a/third_party/jni_zero/test/golden/testEndToEndManualRegistration_NonProxy-Registration.h.golden b/third_party/jni_zero/test/golden/testEndToEndManualRegistration_NonProxy-Registration.h.golden
index 95b20762..d6f21e59 100644
--- a/third_party/jni_zero/test/golden/testEndToEndManualRegistration_NonProxy-Registration.h.golden
+++ b/third_party/jni_zero/test/golden/testEndToEndManualRegistration_NonProxy-Registration.h.golden
@@ -10,7 +10,6 @@
 
 #include "third_party/jni_zero/jni_zero_internal.h"
 
-
 // Class Accessors.
 #ifndef org_jni_1zero_SampleNonProxy_clazz_defined
 #define org_jni_1zero_SampleNonProxy_clazz_defined
@@ -21,7 +20,6 @@
 }
 #endif
 
-
 // Forward declarations (methods).
 
 JNI_POSSIBLE_BOUNDARY_EXPORT jlong Java_org_jni_1zero_SampleNonProxy_nativeAddBookmark(
@@ -43,8 +41,7 @@
     jbyteArray favicon,
     jstring title,
     jobject visits);
-JNI_POSSIBLE_BOUNDARY_EXPORT void
-    Java_org_jni_1zero_SampleNonProxy_nativeCreateHistoricalTabFromState(
+JNI_POSSIBLE_BOUNDARY_EXPORT void Java_org_jni_1zero_SampleNonProxy_nativeCreateHistoricalTabFromState(
     JNIEnv* env,
     jclass jcaller,
     jbyteArray state,
@@ -57,8 +54,7 @@
     JNIEnv* env,
     jobject jcaller,
     jstring find);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobjectArray
-    Java_org_jni_1zero_SampleNonProxy_nativeGetAutofillProfileGUIDs(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobjectArray Java_org_jni_1zero_SampleNonProxy_nativeGetAutofillProfileGUIDs(
     JNIEnv* env,
     jclass jcaller);
 JNI_POSSIBLE_BOUNDARY_EXPORT jstring Java_org_jni_1zero_SampleNonProxy_nativeGetDomainAndRegistry(
@@ -85,8 +81,7 @@
 JNI_POSSIBLE_BOUNDARY_EXPORT jint Java_org_jni_1zero_SampleNonProxy_nativeInit(
     JNIEnv* env,
     jobject jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jthrowable
-    Java_org_jni_1zero_SampleNonProxy_nativeMessWithJavaException(
+JNI_POSSIBLE_BOUNDARY_EXPORT jthrowable Java_org_jni_1zero_SampleNonProxy_nativeMessWithJavaException(
     JNIEnv* env,
     jclass jcaller,
     jthrowable e);
@@ -103,8 +98,6 @@
     jobject jcaller,
     jint sessionId,
     jobjectArray results);
-
-
 // Method declarations.
 
 static const JNINativeMethod kMethods_org_jni_1zero_SampleNonProxy[] = {
@@ -161,7 +154,7 @@
 
 // Registration function.
 
-namespace  {
+namespace {
 
 bool RegisterNatives(JNIEnv* env) {
   if (!RegisterNative_org_jni_1zero_SampleNonProxy(env))
@@ -170,8 +163,6 @@
   return true;
 }
 
-}  // namespace 
-
+}  // namespace
 
 #endif  // TEMP_DIR_HEADER_
-
diff --git a/third_party/jni_zero/test/golden/testEndToEndProxyHashed-Registration.h.golden b/third_party/jni_zero/test/golden/testEndToEndProxyHashed-Registration.h.golden
index 1d55803..fa702da 100644
--- a/third_party/jni_zero/test/golden/testEndToEndProxyHashed-Registration.h.golden
+++ b/third_party/jni_zero/test/golden/testEndToEndProxyHashed-Registration.h.golden
@@ -10,8 +10,6 @@
 
 #include "third_party/jni_zero/jni_zero_internal.h"
 
-
-
 // Forward declarations (methods).
 
 JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_J_N_M_00024zHpGqF(
@@ -120,8 +118,4 @@
     jobject context,
     jobject convertedObjects);
 
-
-
-
 #endif  // TEMP_DIR_HEADER_
-
diff --git a/third_party/jni_zero/test/golden/testEndToEndProxyJniWithModules-Registration.h.golden b/third_party/jni_zero/test/golden/testEndToEndProxyJniWithModules-Registration.h.golden
index a88bbc6e..18dc5f0 100644
--- a/third_party/jni_zero/test/golden/testEndToEndProxyJniWithModules-Registration.h.golden
+++ b/third_party/jni_zero/test/golden/testEndToEndProxyJniWithModules-Registration.h.golden
@@ -10,8 +10,6 @@
 
 #include "third_party/jni_zero/jni_zero_internal.h"
 
-
-
 // Forward declarations (methods).
 
 JNI_POSSIBLE_BOUNDARY_EXPORT jboolean Java_J_module_1N_MejItBT4(
@@ -21,8 +19,6 @@
 JNI_POSSIBLE_BOUNDARY_EXPORT void Java_J_module_1N_MqDgXQiH(
     JNIEnv* env,
     jclass jcaller);
-
-
 // Method declarations.
 
 
@@ -34,7 +30,7 @@
 
 namespace {
 
-JNI_ZERO_COMPONENT_BUILD_EXPORT bool RegisterNative_J_module_1N(JNIEnv* env) {
+bool RegisterNative_J_module_1N(JNIEnv* env) {
   const int number_of_methods = std::size(kMethods_J_module_1N);
 
   jni_zero::ScopedJavaLocalRef<jclass> native_clazz =
@@ -56,7 +52,7 @@
 
 // Registration function.
 
-namespace  {
+namespace {
 
 bool RegisterNatives(JNIEnv* env) {
   // Register natives in a proxy.
@@ -64,12 +60,9 @@
     return false;
   }
 
-
   return true;
 }
 
-}  // namespace 
-
+}  // namespace
 
 #endif  // TEMP_DIR_HEADER_
-
diff --git a/third_party/jni_zero/test/golden/testForTestingKeptHash-Registration.h.golden b/third_party/jni_zero/test/golden/testForTestingKeptHash-Registration.h.golden
index 2ace1c5..f0e175e 100644
--- a/third_party/jni_zero/test/golden/testForTestingKeptHash-Registration.h.golden
+++ b/third_party/jni_zero/test/golden/testForTestingKeptHash-Registration.h.golden
@@ -10,7 +10,6 @@
 
 #include "third_party/jni_zero/jni_zero_internal.h"
 
-
 // Class Accessors.
 #ifndef org_jni_1zero_SampleProxyEdgeCases_clazz_defined
 #define org_jni_1zero_SampleProxyEdgeCases_clazz_defined
@@ -21,7 +20,6 @@
 }
 #endif
 
-
 // Forward declarations (methods).
 
 JNI_POSSIBLE_BOUNDARY_EXPORT jint Java_J_N_MYplquli(
@@ -76,8 +74,4 @@
     JNIEnv* env,
     jclass jcaller);
 
-
-
-
 #endif  // TEMP_DIR_HEADER_
-
diff --git a/third_party/jni_zero/test/golden/testForTestingKeptMultiplexing-Registration.h.golden b/third_party/jni_zero/test/golden/testForTestingKeptMultiplexing-Registration.h.golden
index 040dd790..6b6bc6a 100644
--- a/third_party/jni_zero/test/golden/testForTestingKeptMultiplexing-Registration.h.golden
+++ b/third_party/jni_zero/test/golden/testForTestingKeptMultiplexing-Registration.h.golden
@@ -22,7 +22,6 @@
 }
 #endif
 
-
 // Forward declarations (methods).
 
 JNI_POSSIBLE_BOUNDARY_EXPORT jint Java_org_1jni_11zero_1SampleProxyEdgeCases_1addStructB(
@@ -49,12 +48,10 @@
 JNI_POSSIBLE_BOUNDARY_EXPORT void Java_org_1jni_11zero_1SampleProxyEdgeCases_1fooForTests(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT void
-    Java_org_1jni_11zero_1SampleProxyEdgeCases_1foo_11_11weirdly_11_11escaped_11name1(
+JNI_POSSIBLE_BOUNDARY_EXPORT void Java_org_1jni_11zero_1SampleProxyEdgeCases_1foo_11_11weirdly_11_11escaped_11name1(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_1jni_11zero_1SampleProxyEdgeCases_1genericsWithNestedClassArray(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_1jni_11zero_1SampleProxyEdgeCases_1genericsWithNestedClassArray(
     JNIEnv* env,
     jclass jcaller,
     jobject arg);
@@ -79,7 +76,6 @@
     JNIEnv* env,
     jclass jcaller);
 
-
 JNI_BOUNDARY_EXPORT jboolean Java_J_N__1Z_1O(
     JNIEnv* env,
     jclass jcaller,
@@ -145,6 +141,4 @@
         }
 }
 
-
 #endif  // TEMP_DIR_HEADER_
-
diff --git a/third_party/jni_zero/test/golden/testForTestingRemovedHash-Registration.h.golden b/third_party/jni_zero/test/golden/testForTestingRemovedHash-Registration.h.golden
index 19264aa7..09b148e 100644
--- a/third_party/jni_zero/test/golden/testForTestingRemovedHash-Registration.h.golden
+++ b/third_party/jni_zero/test/golden/testForTestingRemovedHash-Registration.h.golden
@@ -10,7 +10,6 @@
 
 #include "third_party/jni_zero/jni_zero_internal.h"
 
-
 // Class Accessors.
 #ifndef org_jni_1zero_SampleProxyEdgeCases_clazz_defined
 #define org_jni_1zero_SampleProxyEdgeCases_clazz_defined
@@ -21,7 +20,6 @@
 }
 #endif
 
-
 // Forward declarations (methods).
 
 JNI_POSSIBLE_BOUNDARY_EXPORT jint Java_J_N_MYplquli(
@@ -67,8 +65,4 @@
     JNIEnv* env,
     jclass jcaller);
 
-
-
-
 #endif  // TEMP_DIR_HEADER_
-
diff --git a/third_party/jni_zero/test/golden/testForTestingRemovedMultiplexing-Registration.h.golden b/third_party/jni_zero/test/golden/testForTestingRemovedMultiplexing-Registration.h.golden
index 91d8596..4ea6648 100644
--- a/third_party/jni_zero/test/golden/testForTestingRemovedMultiplexing-Registration.h.golden
+++ b/third_party/jni_zero/test/golden/testForTestingRemovedMultiplexing-Registration.h.golden
@@ -22,7 +22,6 @@
 }
 #endif
 
-
 // Forward declarations (methods).
 
 JNI_POSSIBLE_BOUNDARY_EXPORT jint Java_org_1jni_11zero_1SampleProxyEdgeCases_1addStructB(
@@ -40,12 +39,10 @@
     jclass jcaller,
     jobject a,
     jobject b);
-JNI_POSSIBLE_BOUNDARY_EXPORT void
-    Java_org_1jni_11zero_1SampleProxyEdgeCases_1foo_11_11weirdly_11_11escaped_11name1(
+JNI_POSSIBLE_BOUNDARY_EXPORT void Java_org_1jni_11zero_1SampleProxyEdgeCases_1foo_11_11weirdly_11_11escaped_11name1(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_1jni_11zero_1SampleProxyEdgeCases_1genericsWithNestedClassArray(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_1jni_11zero_1SampleProxyEdgeCases_1genericsWithNestedClassArray(
     JNIEnv* env,
     jclass jcaller,
     jobject arg);
@@ -70,7 +67,6 @@
     JNIEnv* env,
     jclass jcaller);
 
-
 JNI_BOUNDARY_EXPORT jboolean Java_J_N__1Z_1O(
     JNIEnv* env,
     jclass jcaller,
@@ -123,6 +119,4 @@
         }
 }
 
-
 #endif  // TEMP_DIR_HEADER_
-
diff --git a/third_party/jni_zero/test/golden/testModulesWithMultiplexing-Registration.h.golden b/third_party/jni_zero/test/golden/testModulesWithMultiplexing-Registration.h.golden
index cc8216b..fe5eb6a 100644
--- a/third_party/jni_zero/test/golden/testModulesWithMultiplexing-Registration.h.golden
+++ b/third_party/jni_zero/test/golden/testModulesWithMultiplexing-Registration.h.golden
@@ -12,7 +12,6 @@
 
 extern const int64_t kJniZeroHashmoduleWhole = -7714383706413312501LL;
 extern const int64_t kJniZeroHashmodulePriority = -7714383706413312501LL;
-
 // Forward declarations (methods).
 
 JNI_POSSIBLE_BOUNDARY_EXPORT jboolean Java_org_1jni_11zero_1SampleModule_1bar(
@@ -23,7 +22,6 @@
     JNIEnv* env,
     jclass jcaller);
 
-
 JNI_BOUNDARY_EXPORT jboolean Java_J_module_1N__1Z_1Z(
     JNIEnv* env,
     jclass jcaller,
@@ -46,7 +44,7 @@
 
 namespace {
 
-JNI_ZERO_COMPONENT_BUILD_EXPORT bool RegisterNative_J_module_1N(JNIEnv* env) {
+bool RegisterNative_J_module_1N(JNIEnv* env) {
   const int number_of_methods = std::size(kMethods_J_module_1N);
 
   jni_zero::ScopedJavaLocalRef<jclass> native_clazz =
@@ -68,7 +66,7 @@
 
 // Registration function.
 
-namespace  {
+namespace {
 
 bool RegisterNatives(JNIEnv* env) {
   // Register natives in a proxy.
@@ -76,12 +74,9 @@
     return false;
   }
 
-
   return true;
 }
 
-}  // namespace 
-
+}  // namespace
 
 #endif  // TEMP_DIR_HEADER_
-
diff --git a/third_party/jni_zero/test/golden/testMultiplexing-Registration.h.golden b/third_party/jni_zero/test/golden/testMultiplexing-Registration.h.golden
index 0a1b451..4eddeeea 100644
--- a/third_party/jni_zero/test/golden/testMultiplexing-Registration.h.golden
+++ b/third_party/jni_zero/test/golden/testMultiplexing-Registration.h.golden
@@ -12,7 +12,6 @@
 
 extern const int64_t kJniZeroHashWhole = 3865356290363738592LL;
 extern const int64_t kJniZeroHashPriority = 3865356290363738592LL;
-
 // Forward declarations (methods).
 
 JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_1jni_11zero_1SampleForAnnotationProcessor_1bar(
@@ -22,83 +21,65 @@
 JNI_POSSIBLE_BOUNDARY_EXPORT void Java_org_1jni_11zero_1SampleForAnnotationProcessor_1foo(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jboolean
-    Java_org_1jni_11zero_1SampleForAnnotationProcessor_1hasPhalange(
+JNI_POSSIBLE_BOUNDARY_EXPORT jboolean Java_org_1jni_11zero_1SampleForAnnotationProcessor_1hasPhalange(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnClass(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnClass(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnClasses(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnClasses(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedAppObjects(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedAppObjects(
     JNIEnv* env,
     jclass jcaller,
     jclass __arrayClazz);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedInts(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedInts(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedString(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedString(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedStrings(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedStrings(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnObject(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnObject(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnObjects(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnObjects(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnString(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnString(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnStrings(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnStrings(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnStruct(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnStruct(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnStructs(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnStructs(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnThrowable(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnThrowable(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnThrowables(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_1jni_11zero_1SampleForAnnotationProcessor_1returnThrowables(
     JNIEnv* env,
     jclass jcaller);
 JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_1jni_11zero_1SampleForAnnotationProcessor_1revString(
     JNIEnv* env,
     jclass jcaller,
     jobject stringToReverse);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_1jni_11zero_1SampleForAnnotationProcessor_1sendSamplesToNative(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_1jni_11zero_1SampleForAnnotationProcessor_1sendSamplesToNative(
     JNIEnv* env,
     jclass jcaller,
     jobject strs);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_1jni_11zero_1SampleForAnnotationProcessor_1sendToNative(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_1jni_11zero_1SampleForAnnotationProcessor_1sendToNative(
     JNIEnv* env,
     jclass jcaller,
     jobject strs);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_1jni_11zero_1SampleForAnnotationProcessor_1testAllPrimitives(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_1jni_11zero_1SampleForAnnotationProcessor_1testAllPrimitives(
     JNIEnv* env,
     jclass jcaller,
     jint zint,
@@ -117,8 +98,7 @@
     jobject floats,
     jboolean zbool,
     jobject bools);
-JNI_POSSIBLE_BOUNDARY_EXPORT void
-    Java_org_1jni_11zero_1SampleForAnnotationProcessor_1testSpecialTypes(
+JNI_POSSIBLE_BOUNDARY_EXPORT void Java_org_1jni_11zero_1SampleForAnnotationProcessor_1testSpecialTypes(
     JNIEnv* env,
     jclass jcaller,
     jobject clazz,
@@ -140,7 +120,6 @@
     jobject context,
     jobject convertedObjects);
 
-
 JNI_BOUNDARY_EXPORT jboolean Java_J_N__1Z(
     JNIEnv* env,
     jclass jcaller,
@@ -246,7 +225,7 @@
 
 namespace {
 
-JNI_ZERO_COMPONENT_BUILD_EXPORT bool RegisterNative_J_N(JNIEnv* env) {
+bool RegisterNative_J_N(JNIEnv* env) {
   const int number_of_methods = std::size(kMethods_J_N);
 
   jni_zero::ScopedJavaLocalRef<jclass> native_clazz =
@@ -268,7 +247,7 @@
 
 // Registration function.
 
-namespace  {
+namespace {
 
 bool RegisterNatives(JNIEnv* env) {
   // Register natives in a proxy.
@@ -276,12 +255,9 @@
     return false;
   }
 
-
   return true;
 }
 
-}  // namespace 
-
+}  // namespace
 
 #endif  // TEMP_DIR_HEADER_
-
diff --git a/third_party/jni_zero/test/golden/testPackagePrefixWithManualRegistration-Registration.h.golden b/third_party/jni_zero/test/golden/testPackagePrefixWithManualRegistration-Registration.h.golden
index ab75431..7a8e6185 100644
--- a/third_party/jni_zero/test/golden/testPackagePrefixWithManualRegistration-Registration.h.golden
+++ b/third_party/jni_zero/test/golden/testPackagePrefixWithManualRegistration-Registration.h.golden
@@ -10,97 +10,74 @@
 
 #include "third_party/jni_zero/jni_zero_internal.h"
 
-
-
 // Forward declarations (methods).
 
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1bar(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1bar(
     JNIEnv* env,
     jclass jcaller,
     jobject sample);
-JNI_POSSIBLE_BOUNDARY_EXPORT void
-    Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1foo(
+JNI_POSSIBLE_BOUNDARY_EXPORT void Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1foo(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jboolean
-    Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1hasPhalange(
+JNI_POSSIBLE_BOUNDARY_EXPORT jboolean Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1hasPhalange(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnClass(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnClass(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnClasses(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnClasses(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedAppObjects(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedAppObjects(
     JNIEnv* env,
     jclass jcaller,
     jclass __arrayClazz);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedInts(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedInts(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedString(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedString(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedStrings(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedStrings(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnObject(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnObject(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnObjects(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnObjects(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnString(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnString(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnStrings(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnStrings(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnStruct(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnStruct(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnStructs(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnStructs(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnThrowable(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnThrowable(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnThrowables(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnThrowables(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1revString(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1revString(
     JNIEnv* env,
     jclass jcaller,
     jobject stringToReverse);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1sendSamplesToNative(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1sendSamplesToNative(
     JNIEnv* env,
     jclass jcaller,
     jobject strs);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1sendToNative(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1sendToNative(
     JNIEnv* env,
     jclass jcaller,
     jobject strs);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1testAllPrimitives(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1testAllPrimitives(
     JNIEnv* env,
     jclass jcaller,
     jint zint,
@@ -119,8 +96,7 @@
     jobject floats,
     jboolean zbool,
     jobject bools);
-JNI_POSSIBLE_BOUNDARY_EXPORT void
-    Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1testSpecialTypes(
+JNI_POSSIBLE_BOUNDARY_EXPORT void Java_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1testSpecialTypes(
     JNIEnv* env,
     jclass jcaller,
     jobject clazz,
@@ -141,8 +117,6 @@
     jobject view,
     jobject context,
     jobject convertedObjects);
-
-
 // Method declarations.
 
 
@@ -239,7 +213,7 @@
 
 namespace {
 
-JNI_ZERO_COMPONENT_BUILD_EXPORT bool RegisterNative_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI(JNIEnv* env) {
+bool RegisterNative_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI(JNIEnv* env) {
   const int number_of_methods = std::size(kMethods_this_is_a_package_prefix_org_jni_1zero_GEN_1JNI);
 
   jni_zero::ScopedJavaLocalRef<jclass> native_clazz =
@@ -261,7 +235,7 @@
 
 // Registration function.
 
-namespace  {
+namespace {
 
 bool RegisterNatives(JNIEnv* env) {
   // Register natives in a proxy.
@@ -269,12 +243,9 @@
     return false;
   }
 
-
   return true;
 }
 
-}  // namespace 
-
+}  // namespace
 
 #endif  // TEMP_DIR_HEADER_
-
diff --git a/third_party/jni_zero/test/golden/testPackagePrefixWithManualRegistrationWithMultiplexing-Registration.h.golden b/third_party/jni_zero/test/golden/testPackagePrefixWithManualRegistrationWithMultiplexing-Registration.h.golden
index b2f10e0..ab80a20 100644
--- a/third_party/jni_zero/test/golden/testPackagePrefixWithManualRegistrationWithMultiplexing-Registration.h.golden
+++ b/third_party/jni_zero/test/golden/testPackagePrefixWithManualRegistrationWithMultiplexing-Registration.h.golden
@@ -12,96 +12,74 @@
 
 extern const int64_t kJniZeroHashWhole = 3865356290363738592LL;
 extern const int64_t kJniZeroHashPriority = 3865356290363738592LL;
-
 // Forward declarations (methods).
 
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1bar(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1bar(
     JNIEnv* env,
     jclass jcaller,
     jobject sample);
-JNI_POSSIBLE_BOUNDARY_EXPORT void
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1foo(
+JNI_POSSIBLE_BOUNDARY_EXPORT void Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1foo(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jboolean
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1hasPhalange(
+JNI_POSSIBLE_BOUNDARY_EXPORT jboolean Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1hasPhalange(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnClass(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnClass(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnClasses(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnClasses(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedAppObjects(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedAppObjects(
     JNIEnv* env,
     jclass jcaller,
     jclass __arrayClazz);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedInts(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedInts(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedString(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedString(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedStrings(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedStrings(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnObject(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnObject(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnObjects(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnObjects(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnString(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnString(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnStrings(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnStrings(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnStruct(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnStruct(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnStructs(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnStructs(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnThrowable(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnThrowable(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnThrowables(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnThrowables(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1revString(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1revString(
     JNIEnv* env,
     jclass jcaller,
     jobject stringToReverse);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1sendSamplesToNative(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1sendSamplesToNative(
     JNIEnv* env,
     jclass jcaller,
     jobject strs);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1sendToNative(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1sendToNative(
     JNIEnv* env,
     jclass jcaller,
     jobject strs);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1testAllPrimitives(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1testAllPrimitives(
     JNIEnv* env,
     jclass jcaller,
     jint zint,
@@ -120,8 +98,7 @@
     jobject floats,
     jboolean zbool,
     jobject bools);
-JNI_POSSIBLE_BOUNDARY_EXPORT void
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1testSpecialTypes(
+JNI_POSSIBLE_BOUNDARY_EXPORT void Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1testSpecialTypes(
     JNIEnv* env,
     jclass jcaller,
     jobject clazz,
@@ -143,7 +120,6 @@
     jobject context,
     jobject convertedObjects);
 
-
 JNI_BOUNDARY_EXPORT jboolean Java_this_is_a_package_prefix_J_N__1Z(
     JNIEnv* env,
     jclass jcaller,
@@ -252,7 +228,7 @@
 
 namespace {
 
-JNI_ZERO_COMPONENT_BUILD_EXPORT bool RegisterNative_this_is_a_package_prefix_J_N(JNIEnv* env) {
+bool RegisterNative_this_is_a_package_prefix_J_N(JNIEnv* env) {
   const int number_of_methods = std::size(kMethods_this_is_a_package_prefix_J_N);
 
   jni_zero::ScopedJavaLocalRef<jclass> native_clazz =
@@ -274,7 +250,7 @@
 
 // Registration function.
 
-namespace  {
+namespace {
 
 bool RegisterNatives(JNIEnv* env) {
   // Register natives in a proxy.
@@ -282,12 +258,9 @@
     return false;
   }
 
-
   return true;
 }
 
-}  // namespace 
-
+}  // namespace
 
 #endif  // TEMP_DIR_HEADER_
-
diff --git a/third_party/jni_zero/test/golden/testPackagePrefixWithMultiplexing-Registration.h.golden b/third_party/jni_zero/test/golden/testPackagePrefixWithMultiplexing-Registration.h.golden
index 22431d33..cd592ba 100644
--- a/third_party/jni_zero/test/golden/testPackagePrefixWithMultiplexing-Registration.h.golden
+++ b/third_party/jni_zero/test/golden/testPackagePrefixWithMultiplexing-Registration.h.golden
@@ -12,96 +12,74 @@
 
 extern const int64_t kJniZeroHashWhole = 3865356290363738592LL;
 extern const int64_t kJniZeroHashPriority = 3865356290363738592LL;
-
 // Forward declarations (methods).
 
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1bar(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1bar(
     JNIEnv* env,
     jclass jcaller,
     jobject sample);
-JNI_POSSIBLE_BOUNDARY_EXPORT void
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1foo(
+JNI_POSSIBLE_BOUNDARY_EXPORT void Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1foo(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jboolean
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1hasPhalange(
+JNI_POSSIBLE_BOUNDARY_EXPORT jboolean Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1hasPhalange(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnClass(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnClass(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnClasses(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnClasses(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedAppObjects(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedAppObjects(
     JNIEnv* env,
     jclass jcaller,
     jclass __arrayClazz);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedInts(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedInts(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedString(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedString(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedStrings(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnConvertedStrings(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnObject(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnObject(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnObjects(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnObjects(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnString(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnString(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnStrings(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnStrings(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnStruct(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnStruct(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnStructs(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnStructs(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnThrowable(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnThrowable(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnThrowables(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1returnThrowables(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1revString(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1revString(
     JNIEnv* env,
     jclass jcaller,
     jobject stringToReverse);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1sendSamplesToNative(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1sendSamplesToNative(
     JNIEnv* env,
     jclass jcaller,
     jobject strs);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1sendToNative(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1sendToNative(
     JNIEnv* env,
     jclass jcaller,
     jobject strs);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1testAllPrimitives(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1testAllPrimitives(
     JNIEnv* env,
     jclass jcaller,
     jint zint,
@@ -120,8 +98,7 @@
     jobject floats,
     jboolean zbool,
     jobject bools);
-JNI_POSSIBLE_BOUNDARY_EXPORT void
-    Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1testSpecialTypes(
+JNI_POSSIBLE_BOUNDARY_EXPORT void Java_this_1is_1a_1package_1prefix_1org_1jni_11zero_1SampleForAnnotationProcessor_1testSpecialTypes(
     JNIEnv* env,
     jclass jcaller,
     jobject clazz,
@@ -143,7 +120,6 @@
     jobject context,
     jobject convertedObjects);
 
-
 JNI_BOUNDARY_EXPORT jboolean Java_this_is_a_package_prefix_J_N__1Z(
     JNIEnv* env,
     jclass jcaller,
@@ -231,6 +207,4 @@
         }
 }
 
-
 #endif  // TEMP_DIR_HEADER_
-
diff --git a/third_party/jni_zero/test/golden/testPriorityRegistration-Final-N.java.golden b/third_party/jni_zero/test/golden/testPriorityRegistration-Final-N.java.golden
index 54104c1..5abc346 100644
--- a/third_party/jni_zero/test/golden/testPriorityRegistration-Final-N.java.golden
+++ b/third_party/jni_zero/test/golden/testPriorityRegistration-Final-N.java.golden
@@ -10,7 +10,7 @@
 
 public class N {
     public static final long WHOLE_HASH = -7874644414477415950L;
-    public static final long PRIORITY_HASH = 4439870226107528323L;
+    public static final long PRIORITY_HASH = 4128442159926458845L;
 
 
     public static native Object _O_O(int switch_num, Object object_param1);
diff --git a/third_party/jni_zero/test/golden/testPriorityRegistration-Registration.h.golden b/third_party/jni_zero/test/golden/testPriorityRegistration-Registration.h.golden
index c67761e..6efa9b3 100644
--- a/third_party/jni_zero/test/golden/testPriorityRegistration-Registration.h.golden
+++ b/third_party/jni_zero/test/golden/testPriorityRegistration-Registration.h.golden
@@ -11,7 +11,7 @@
 #include "third_party/jni_zero/jni_zero_internal.h"
 
 extern const int64_t kJniZeroHashWhole = -7874644414477415950LL;
-extern const int64_t kJniZeroHashPriority = 4439870226107528323LL;
+extern const int64_t kJniZeroHashPriority = 4128442159926458845LL;
 // Class Accessors.
 #ifndef org_jni_1zero_SampleProxyEdgeCases_clazz_defined
 #define org_jni_1zero_SampleProxyEdgeCases_clazz_defined
@@ -22,7 +22,6 @@
 }
 #endif
 
-
 // Forward declarations (methods).
 
 JNI_POSSIBLE_BOUNDARY_EXPORT void Java_org_1jni_11zero_1TinySample2_1test(
@@ -50,12 +49,10 @@
     jclass jcaller,
     jobject a,
     jobject b);
-JNI_POSSIBLE_BOUNDARY_EXPORT void
-    Java_org_1jni_11zero_1SampleProxyEdgeCases_1foo_11_11weirdly_11_11escaped_11name1(
+JNI_POSSIBLE_BOUNDARY_EXPORT void Java_org_1jni_11zero_1SampleProxyEdgeCases_1foo_11_11weirdly_11_11escaped_11name1(
     JNIEnv* env,
     jclass jcaller);
-JNI_POSSIBLE_BOUNDARY_EXPORT jobject
-    Java_org_1jni_11zero_1SampleProxyEdgeCases_1genericsWithNestedClassArray(
+JNI_POSSIBLE_BOUNDARY_EXPORT jobject Java_org_1jni_11zero_1SampleProxyEdgeCases_1genericsWithNestedClassArray(
     JNIEnv* env,
     jclass jcaller,
     jobject arg);
@@ -90,7 +87,6 @@
     jobject a,
     jint b);
 
-
 JNI_BOUNDARY_EXPORT jboolean Java_J_N__1Z_1IO(
     JNIEnv* env,
     jclass jcaller,
@@ -166,6 +162,4 @@
         }
 }
 
-
 #endif  // TEMP_DIR_HEADER_
-
diff --git a/third_party/lit/v3_0/BUILD.gn b/third_party/lit/v3_0/BUILD.gn
index bc672c84..fe174a32 100644
--- a/third_party/lit/v3_0/BUILD.gn
+++ b/third_party/lit/v3_0/BUILD.gn
@@ -49,6 +49,7 @@
     "//chrome/browser/resources/side_panel/reading_list:build_ts",
     "//chrome/browser/resources/side_panel/shared:build_ts",
     "//chrome/browser/resources/signin:build_ts",
+    "//chrome/browser/resources/signin/batch_upload:build_ts",
     "//chrome/browser/resources/signin/profile_picker:build_ts",
     "//chrome/browser/resources/tab_search:build_ts",
     "//chrome/browser/resources/webui_gallery:build_ts",
diff --git a/third_party/perfetto b/third_party/perfetto
index bea7f2f..7eb1a22 160000
--- a/third_party/perfetto
+++ b/third_party/perfetto
@@ -1 +1 @@
-Subproject commit bea7f2f92cb9ecf6923ecea52120c312840494a0
+Subproject commit 7eb1a22d053b93c127020cf373d14d4e2ad8b805
diff --git a/third_party/skia b/third_party/skia
index c623804..4815ec8 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit c62380453c7269b528f6965e75d86b06b3418b86
+Subproject commit 4815ec808aa5a80da74feafa651c262cfdf7e5b9
diff --git a/tools/gritsettings/resource_ids.spec b/tools/gritsettings/resource_ids.spec
index 075d8c10..5c7532e 100644
--- a/tools/gritsettings/resource_ids.spec
+++ b/tools/gritsettings/resource_ids.spec
@@ -445,6 +445,10 @@
     "META": {"sizes": {"includes": [50],}},
     "includes": [4060],
   },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/signin/batch_upload/resources.grd": {
+    "META": {"sizes": {"includes": [10]}},
+    "includes": [4070],
+  },
   "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/signin/profile_picker/resources.grd": {
     "META": {"sizes": {"includes": [50],}},
     "includes": [4080],
diff --git a/tools/mb/mb.py b/tools/mb/mb.py
index 812aaeb..4598ab1 100755
--- a/tools/mb/mb.py
+++ b/tools/mb/mb.py
@@ -918,6 +918,9 @@
     """Format a dict of GN args into a single string."""
 
     def convert_value(v):
+      if isinstance(v, dict):
+        return '{' + ' '.join(f'{k1}={convert_value(v1)}'
+                              for k1, v1 in v.items()) + '}'
       if isinstance(v, list):
         return f'[{",".join(convert_value(e) for e in v)}]'
       if isinstance(v, str):
diff --git a/tools/mb/mb_unittest.py b/tools/mb/mb_unittest.py
index 01fb5b98..4677204b 100755
--- a/tools/mb/mb_unittest.py
+++ b/tools/mb/mb_unittest.py
@@ -229,7 +229,12 @@
   "gn_args": {
     "string_arg": "has double quotes",
     "bool_arg_lower_case": true,
-    "string_list_arg": ["foo", "bar", "baz"]
+    "string_list_arg": ["foo", "bar", "baz"],
+    "dict_arg": {
+      "string": "foo",
+      "bool": true,
+      "list": ["foo", "bar", "baz"]
+    }
   }
 }
 """
@@ -1022,6 +1027,9 @@
     expected_out = ('\n'
                     'Writing """\\\n'
                     'bool_arg_lower_case = true\n'
+                    'dict_arg = { bool = true\n'
+                    'list = [ "foo", "bar", "baz" ]\n'
+                    'string = "foo" }\n'
                     'string_arg = "has double quotes"\n'
                     'string_list_arg = [ "foo", "bar", "baz" ]\n'
                     '""" to _path_/args.gn.\n\n')
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index a3734cb..c71e026 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -37296,12 +37296,22 @@
 
 <action name="Signin_Signin_FromAccountMenu">
   <owner>arthurmilchior@chromium.org</owner>
+  <owner>chrome-signin-team@chromium.org</owner>
   <description>
     Recorded on sign in start from access point
     signin_metrics::AccessPoint::ACCESS_POINT_ACCOUNT_MENU.
   </description>
 </action>
 
+<action name="Signin_Signin_FromAccountMenuFailedSwitch">
+  <owner>arthurmilchior@chromium.org</owner>
+  <owner>chrome-signin-team@chromium.org</owner>
+  <description>
+    Recorded on sign in start from access point
+    signin_metrics::AccessPoint::ACCESS_POINT_ACCOUNT_MENU_FAILED_SWITCH.
+  </description>
+</action>
+
 <action name="Signin_Signin_FromAppsPageLink">
   <obsolete>
     Deprecated as the apps page no longer has a sign-in link/promo.
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index f6e479a..8db7a65 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -34653,6 +34653,7 @@
   <int value="-207369615" label="chrome://location-internals/"/>
   <int value="-206925255" label="chrome://popular-sites-internals/"/>
   <int value="-176639700" label="chrome://omnibox/"/>
+  <int value="-108234722" label="chrome://batch-upload/"/>
   <int value="-106823253" label="chrome://conflicts/"/>
   <int value="-103805443" label="chrome://nearby-internals/"/>
   <int value="-90956977" label="chrome://dns/"/>
diff --git a/tools/metrics/histograms/metadata/oobe/histograms.xml b/tools/metrics/histograms/metadata/oobe/histograms.xml
index ae06cc4..9173987 100644
--- a/tools/metrics/histograms/metadata/oobe/histograms.xml
+++ b/tools/metrics/histograms/metadata/oobe/histograms.xml
@@ -164,6 +164,7 @@
   <variant name="Parental-handoff"/>
   <variant name="Password-selection"/>
   <variant name="Perks-discovery"/>
+  <variant name="Personalized-apps"/>
   <variant name="Pin-setup"/>
   <variant name="Quick-start"/>
   <variant name="Recommend-apps"/>
diff --git a/tools/metrics/histograms/metadata/signin/enums.xml b/tools/metrics/histograms/metadata/signin/enums.xml
index 8187cda..c084cff 100644
--- a/tools/metrics/histograms/metadata/signin/enums.xml
+++ b/tools/metrics/histograms/metadata/signin/enums.xml
@@ -522,6 +522,7 @@
   <int value="66" label="Avatar bubble sign in with sync promo"/>
   <int value="67" label="Account menu"/>
   <int value="68" label="Product Specifications"/>
+  <int value="69" label="Account menu failed switch"/>
 </enum>
 
 <enum name="SigninAccountReconcilorState">
diff --git a/tools/metrics/histograms/metadata/web_rtc/enums.xml b/tools/metrics/histograms/metadata/web_rtc/enums.xml
index 64115f2..51273c7c 100644
--- a/tools/metrics/histograms/metadata/web_rtc/enums.xml
+++ b/tools/metrics/histograms/metadata/web_rtc/enums.xml
@@ -102,6 +102,15 @@
   <int value="1" label="Unknown error"/>
 </enum>
 
+<enum name="GenerateCertificateAlgorithms">
+  <int value="0" label="ECDSA-P256"/>
+  <int value="1" label="RSA-1024"/>
+  <int value="2" label="RSA-2048"/>
+  <int value="3" label="RSA-4096"/>
+  <int value="4" label="RSA-8192"/>
+  <int value="5" label="RSA-other"/>
+</enum>
+
 <enum name="IceCandidatePairTypes">
   <int value="0" label="host_host"/>
   <int value="1" label="host_srflx"/>
diff --git a/tools/metrics/histograms/metadata/web_rtc/histograms.xml b/tools/metrics/histograms/metadata/web_rtc/histograms.xml
index 0fead2f..7798fc1 100644
--- a/tools/metrics/histograms/metadata/web_rtc/histograms.xml
+++ b/tools/metrics/histograms/metadata/web_rtc/histograms.xml
@@ -1279,6 +1279,18 @@
   </summary>
 </histogram>
 
+<histogram name="WebRTC.PeerConnection.GenerateCertificate.Algorithm"
+    enum="GenerateCertificateAlgorithms" expires_after="2025-06-01">
+  <owner>hta@chromium.org</owner>
+  <owner>philipp.hancke@googlemail.com</owner>
+  <owner>webrtc-dev@chromium.org</owner>
+  <summary>
+    Counts the different algorithms used in
+    RTCPeerConnection.generateCertificate. Measured when generateCertificate is
+    called.
+  </summary>
+</histogram>
+
 <histogram name="WebRTC.PeerConnection.IPMetrics" enum="PeerConnectionCounters"
     expires_after="2024-06-15">
   <owner>hta@chromium.org</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 199347f..50e44591 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -6,7 +6,7 @@
         },
         "win": {
             "hash": "e19231631901165200a0413711e003fc90b50219",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/bea7f2f92cb9ecf6923ecea52120c312840494a0/trace_processor_shell.exe"
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/7b0ba33d4956e9d050984a1b523a2b342ecc7b0b/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "53f993fc3201982cd949c5b8de884682bb56de83",
@@ -21,8 +21,8 @@
             "full_remote_path": "perfetto-luci-artifacts/baf3dcdc408c406ec523e3fde052e2672a3c37d2/mac-arm64/trace_processor_shell"
         },
         "linux": {
-            "hash": "e55fb237f68c9dff2fcaca25a9ca96d4ce6528a4",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/bea7f2f92cb9ecf6923ecea52120c312840494a0/trace_processor_shell"
+            "hash": "69c4112543442298896da720b1089d378323e10d",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/64c5bcef544f0365449129ef2d3f401d83c01a69/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/ui/gfx/color_space_win.cc b/ui/gfx/color_space_win.cc
index 60f9341..52c2c1f 100644
--- a/ui/gfx/color_space_win.cc
+++ b/ui/gfx/color_space_win.cc
@@ -245,92 +245,112 @@
     const ColorSpace& color_space,
     bool force_yuv) {
   // Treat invalid color space as sRGB.
-  if (!color_space.IsValid())
+  if (!color_space.IsValid()) {
     return DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709;
+  }
 
   if (color_space.GetMatrixID() == gfx::ColorSpace::MatrixID::RGB &&
       !force_yuv) {
     // For RGB, we default to FULL
     if (color_space.GetRangeID() == gfx::ColorSpace::RangeID::LIMITED) {
       if (color_space.GetPrimaryID() == gfx::ColorSpace::PrimaryID::BT2020) {
-        if (color_space.GetTransferID() == gfx::ColorSpace::TransferID::PQ) {
-          return DXGI_COLOR_SPACE_RGB_STUDIO_G2084_NONE_P2020;
-        } else {
-          return DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P2020;
+        switch (color_space.GetTransferID()) {
+          case gfx::ColorSpace::TransferID::PQ:
+            return DXGI_COLOR_SPACE_RGB_STUDIO_G2084_NONE_P2020;
+
+          default:
+            return DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P2020;
         }
       } else {
         return DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P709;
       }
     } else {
       if (color_space.GetPrimaryID() == gfx::ColorSpace::PrimaryID::BT2020) {
-        if (color_space.GetTransferID() == gfx::ColorSpace::TransferID::PQ) {
-          return DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020;
-        } else {
-          return DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P2020;
+        switch (color_space.GetTransferID()) {
+          case gfx::ColorSpace::TransferID::PQ:
+            return DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020;
+
+          default:
+            return DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P2020;
         }
       } else {
-        if (color_space.GetTransferID() ==
-                gfx::ColorSpace::TransferID::LINEAR ||
-            color_space.GetTransferID() ==
-                gfx::ColorSpace::TransferID::LINEAR_HDR ||
-            color_space.GetTransferID() ==
-                gfx::ColorSpace::TransferID::SCRGB_LINEAR_80_NITS) {
-          return DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709;
-        } else if (color_space.GetTransferID() ==
-                   gfx::ColorSpace::TransferID::CUSTOM_HDR) {
-          skcms_TransferFunction fn;
-          color_space.GetTransferFunction(&fn);
-          if (fn.g == 1.f)
+        switch (color_space.GetTransferID()) {
+          case gfx::ColorSpace::TransferID::LINEAR:
+          case gfx::ColorSpace::TransferID::LINEAR_HDR:
+          case gfx::ColorSpace::TransferID::SCRGB_LINEAR_80_NITS:
             return DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709;
-          else
-            DLOG(ERROR) << "Windows HDR only supports gamma=1.0.";
+
+          case gfx::ColorSpace::TransferID::CUSTOM_HDR: {
+            skcms_TransferFunction fn;
+            color_space.GetTransferFunction(&fn);
+            if (fn.g == 1.f) {
+              return DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709;
+            } else {
+              DLOG(ERROR) << "Windows HDR only supports gamma=1.0.";
+              return DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709;
+            }
+          }
+
+          default:
+            return DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709;
         }
-        return DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709;
       }
     }
   } else {
     if (color_space.GetPrimaryID() == gfx::ColorSpace::PrimaryID::BT2020) {
-      if (color_space.GetTransferID() == gfx::ColorSpace::TransferID::PQ) {
-        return DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_LEFT_P2020;
-        // Could also be:
-        // DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_TOPLEFT_P2020
-      } else if (color_space.GetTransferID() ==
-                 gfx::ColorSpace::TransferID::HLG) {
-        // Note: This may not always work. See https://crbug.com/1144260#c6.
-        return DXGI_COLOR_SPACE_YCBCR_STUDIO_GHLG_TOPLEFT_P2020;
-      } else {
-        // For YUV, we default to LIMITED
-        if (color_space.GetRangeID() == gfx::ColorSpace::RangeID::FULL) {
-          return DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P2020;
-        } else {
-          return DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P2020;
-          // Could also be:
-          // DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_TOPLEFT_P2020
+      // For YUV, we default to LIMITED
+      if (color_space.GetRangeID() == gfx::ColorSpace::RangeID::FULL) {
+        switch (color_space.GetTransferID()) {
+          case gfx::ColorSpace::TransferID::PQ:
+            // Could also be DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_TOPLEFT_P2020
+            return DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_LEFT_P2020;
+
+          case gfx::ColorSpace::TransferID::HLG:
+            return DXGI_COLOR_SPACE_YCBCR_FULL_GHLG_TOPLEFT_P2020;
+
+          default:
+            return DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P2020;
         }
       }
+      // RangeID::LIMITED handling.
+      switch (color_space.GetTransferID()) {
+        case gfx::ColorSpace::TransferID::PQ:
+          // Could also be DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_TOPLEFT_P2020
+          return DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_LEFT_P2020;
+
+        case gfx::ColorSpace::TransferID::HLG:
+          // Note: This may not always work. See https://crbug.com/1144260#c6.
+          return DXGI_COLOR_SPACE_YCBCR_STUDIO_GHLG_TOPLEFT_P2020;
+
+        default:
+          // Could also be DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_TOPLEFT_P2020.
+          return DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P2020;
+      }
     } else if (color_space.GetPrimaryID() ==
                    gfx::ColorSpace::PrimaryID::BT470BG ||
                color_space.GetPrimaryID() ==
                    gfx::ColorSpace::PrimaryID::SMPTE170M) {
       // For YUV, we default to LIMITED
-      if (color_space.GetRangeID() == gfx::ColorSpace::RangeID::FULL) {
-        return DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P601;
-      } else {
-        return DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P601;
+      switch (color_space.GetRangeID()) {
+        case gfx::ColorSpace::RangeID::FULL:
+          return DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P601;
+
+        default:
+          return DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P601;
       }
     } else {
       // For YUV, we default to LIMITED
       if (color_space.GetRangeID() == gfx::ColorSpace::RangeID::FULL) {
-        // TODO(hubbe): Check if this is correct.
-        if (color_space.GetTransferID() ==
-            gfx::ColorSpace::TransferID::SMPTE170M) {
-          return DXGI_COLOR_SPACE_YCBCR_FULL_G22_NONE_P709_X601;
-        } else {
-          return DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P709;
+        switch (color_space.GetTransferID()) {
+          // TODO(hubbe): Check if this is correct.
+          case gfx::ColorSpace::TransferID::SMPTE170M:
+            return DXGI_COLOR_SPACE_YCBCR_FULL_G22_NONE_P709_X601;
+
+          default:
+            return DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P709;
         }
-      } else {
-        return DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709;
       }
+      return DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709;
     }
   }
 }
diff --git a/v8 b/v8
index 00eda72..5172b5d 160000
--- a/v8
+++ b/v8
@@ -1 +1 @@
-Subproject commit 00eda7279f265f2a645ef0256059b583209075af
+Subproject commit 5172b5da4316bd2e96fa1d3b962c6cf6782109be